summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2020-11-13 12:51:53 +0100
committerMichaël Zasso <targos@protonmail.com>2020-11-15 16:46:54 +0100
commit48db20f6f53060e38b2272566b014741eb4f519f (patch)
treee2f9b4c7f69d2e4597b73b4c3c09f4371d5cc963
parent79916428a48df937aa5b2b69c061d2d42181a76b (diff)
downloadnode-new-48db20f6f53060e38b2272566b014741eb4f519f.tar.gz
deps: update V8 to 8.7.220
PR-URL: https://github.com/nodejs/node/pull/35700 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Shelley Vohr <codebytere@gmail.com>
-rw-r--r--deps/v8/AUTHORS6
-rw-r--r--deps/v8/BUILD.gn183
-rw-r--r--deps/v8/COMMON_OWNERS1
-rw-r--r--deps/v8/DEPS32
-rw-r--r--deps/v8/LICENSE.valgrind45
-rw-r--r--deps/v8/PPC_OWNERS6
-rw-r--r--deps/v8/S390_OWNERS6
-rw-r--r--deps/v8/gni/v8.gni5
-rw-r--r--deps/v8/include/cppgc/OWNERS2
-rw-r--r--deps/v8/include/cppgc/default-platform.h14
-rw-r--r--deps/v8/include/cppgc/heap.h2
-rw-r--r--deps/v8/include/cppgc/internal/prefinalizer-handler.h2
-rw-r--r--deps/v8/include/cppgc/member.h34
-rw-r--r--deps/v8/include/js_protocol.pdl26
-rw-r--r--deps/v8/include/v8-internal.h3
-rw-r--r--deps/v8/include/v8-metrics.h8
-rw-r--r--deps/v8/include/v8-platform.h43
-rw-r--r--deps/v8/include/v8-profiler.h28
-rw-r--r--deps/v8/include/v8-version.h6
-rw-r--r--deps/v8/include/v8.h121
-rw-r--r--deps/v8/include/v8config.h12
-rw-r--r--deps/v8/infra/mb/mb_config.pyl32
-rw-r--r--deps/v8/infra/testing/PRESUBMIT.py5
-rw-r--r--deps/v8/infra/testing/builders.pyl141
-rw-r--r--deps/v8/samples/process.cc2
-rw-r--r--deps/v8/src/DEPS5
-rw-r--r--deps/v8/src/api/api.cc130
-rw-r--r--deps/v8/src/asmjs/asm-js.cc2
-rw-r--r--deps/v8/src/asmjs/asm-parser.cc36
-rw-r--r--deps/v8/src/ast/ast-function-literal-id-reindexer.cc9
-rw-r--r--deps/v8/src/ast/scopes.cc1
-rw-r--r--deps/v8/src/base/atomicops.h23
-rw-r--r--deps/v8/src/base/cpu.cc59
-rw-r--r--deps/v8/src/base/macros.h4
-rw-r--r--deps/v8/src/base/once.cc4
-rw-r--r--deps/v8/src/base/page-allocator.cc14
-rw-r--r--deps/v8/src/base/platform/condition-variable.cc32
-rw-r--r--deps/v8/src/base/platform/condition-variable.h6
-rw-r--r--deps/v8/src/base/platform/mutex.cc37
-rw-r--r--deps/v8/src/base/platform/mutex.h12
-rw-r--r--deps/v8/src/base/platform/platform-cygwin.cc1
-rw-r--r--deps/v8/src/base/platform/platform-fuchsia.cc1
-rw-r--r--deps/v8/src/base/platform/platform-posix.cc40
-rw-r--r--deps/v8/src/base/platform/platform-starboard.cc499
-rw-r--r--deps/v8/src/base/platform/platform-win32.cc10
-rw-r--r--deps/v8/src/base/platform/platform.h14
-rw-r--r--deps/v8/src/base/platform/semaphore.cc15
-rw-r--r--deps/v8/src/base/platform/semaphore.h6
-rw-r--r--deps/v8/src/base/platform/time.cc36
-rw-r--r--deps/v8/src/base/platform/time.h3
-rw-r--r--deps/v8/src/builtins/accessors.cc10
-rw-r--r--deps/v8/src/builtins/arm/builtins-arm.cc101
-rw-r--r--deps/v8/src/builtins/arm64/builtins-arm64.cc74
-rw-r--r--deps/v8/src/builtins/array-reverse.tq2
-rw-r--r--deps/v8/src/builtins/arraybuffer.tq66
-rw-r--r--deps/v8/src/builtins/base.tq14
-rw-r--r--deps/v8/src/builtins/builtins-arraybuffer.cc29
-rw-r--r--deps/v8/src/builtins/builtins-async-module.cc6
-rw-r--r--deps/v8/src/builtins/builtins-call-gen.cc26
-rw-r--r--deps/v8/src/builtins/builtins-call.cc39
-rw-r--r--deps/v8/src/builtins/builtins-collections-gen.cc14
-rw-r--r--deps/v8/src/builtins/builtins-constructor-gen.cc65
-rw-r--r--deps/v8/src/builtins/builtins-constructor-gen.h4
-rw-r--r--deps/v8/src/builtins/builtins-conversion-gen.cc11
-rw-r--r--deps/v8/src/builtins/builtins-definitions.h7
-rw-r--r--deps/v8/src/builtins/builtins-handler-gen.cc123
-rw-r--r--deps/v8/src/builtins/builtins-ic-gen.cc1
-rw-r--r--deps/v8/src/builtins/builtins-internal-gen.cc36
-rw-r--r--deps/v8/src/builtins/builtins-intl.cc4
-rw-r--r--deps/v8/src/builtins/builtins-object-gen.cc23
-rw-r--r--deps/v8/src/builtins/builtins-object-gen.h14
-rw-r--r--deps/v8/src/builtins/builtins-proxy-gen.cc5
-rw-r--r--deps/v8/src/builtins/builtins-regexp-gen.cc38
-rw-r--r--deps/v8/src/builtins/builtins-string.tq7
-rw-r--r--deps/v8/src/builtins/builtins.cc24
-rw-r--r--deps/v8/src/builtins/conversion.tq4
-rw-r--r--deps/v8/src/builtins/frame-arguments.tq38
-rw-r--r--deps/v8/src/builtins/frames.tq9
-rw-r--r--deps/v8/src/builtins/ia32/builtins-ia32.cc141
-rw-r--r--deps/v8/src/builtins/ic-callable.tq18
-rw-r--r--deps/v8/src/builtins/internal.tq8
-rw-r--r--deps/v8/src/builtins/iterator.tq13
-rw-r--r--deps/v8/src/builtins/mips/builtins-mips.cc556
-rw-r--r--deps/v8/src/builtins/mips64/builtins-mips64.cc591
-rw-r--r--deps/v8/src/builtins/ppc/builtins-ppc.cc728
-rw-r--r--deps/v8/src/builtins/s390/builtins-s390.cc736
-rw-r--r--deps/v8/src/builtins/torque-csa-header-includes.h4
-rw-r--r--deps/v8/src/builtins/typed-array-from.tq64
-rw-r--r--deps/v8/src/builtins/wasm.tq4
-rw-r--r--deps/v8/src/builtins/x64/builtins-x64.cc814
-rw-r--r--deps/v8/src/codegen/arm/assembler-arm-inl.h2
-rw-r--r--deps/v8/src/codegen/arm/interface-descriptors-arm.cc5
-rw-r--r--deps/v8/src/codegen/arm/macro-assembler-arm.cc15
-rw-r--r--deps/v8/src/codegen/arm/register-arm.h5
-rw-r--r--deps/v8/src/codegen/arm64/instructions-arm64.h2
-rw-r--r--deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc5
-rw-r--r--deps/v8/src/codegen/arm64/macro-assembler-arm64.cc6
-rw-r--r--deps/v8/src/codegen/arm64/macro-assembler-arm64.h8
-rw-r--r--deps/v8/src/codegen/arm64/register-arm64.cc4
-rw-r--r--deps/v8/src/codegen/arm64/register-arm64.h7
-rw-r--r--deps/v8/src/codegen/bailout-reason.h1
-rw-r--r--deps/v8/src/codegen/code-stub-assembler.cc604
-rw-r--r--deps/v8/src/codegen/code-stub-assembler.h292
-rw-r--r--deps/v8/src/codegen/compiler.cc140
-rw-r--r--deps/v8/src/codegen/compiler.h4
-rw-r--r--deps/v8/src/codegen/external-reference.h3
-rw-r--r--deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc5
-rw-r--r--deps/v8/src/codegen/ia32/macro-assembler-ia32.cc5
-rw-r--r--deps/v8/src/codegen/ia32/macro-assembler-ia32.h5
-rw-r--r--deps/v8/src/codegen/interface-descriptors.cc16
-rw-r--r--deps/v8/src/codegen/interface-descriptors.h49
-rw-r--r--deps/v8/src/codegen/macro-assembler.h8
-rw-r--r--deps/v8/src/codegen/mips/interface-descriptors-mips.cc5
-rw-r--r--deps/v8/src/codegen/mips/macro-assembler-mips.cc43
-rw-r--r--deps/v8/src/codegen/mips/macro-assembler-mips.h26
-rw-r--r--deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc5
-rw-r--r--deps/v8/src/codegen/mips64/macro-assembler-mips64.cc86
-rw-r--r--deps/v8/src/codegen/mips64/macro-assembler-mips64.h29
-rw-r--r--deps/v8/src/codegen/optimized-compilation-info.cc6
-rw-r--r--deps/v8/src/codegen/optimized-compilation-info.h44
-rw-r--r--deps/v8/src/codegen/ppc/constants-ppc.h48
-rw-r--r--deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc5
-rw-r--r--deps/v8/src/codegen/ppc/macro-assembler-ppc.cc36
-rw-r--r--deps/v8/src/codegen/ppc/macro-assembler-ppc.h26
-rw-r--r--deps/v8/src/codegen/s390/interface-descriptors-s390.cc5
-rw-r--r--deps/v8/src/codegen/s390/macro-assembler-s390.cc35
-rw-r--r--deps/v8/src/codegen/s390/macro-assembler-s390.h26
-rw-r--r--deps/v8/src/codegen/signature.h12
-rw-r--r--deps/v8/src/codegen/x64/interface-descriptors-x64.cc5
-rw-r--r--deps/v8/src/codegen/x64/macro-assembler-x64.cc52
-rw-r--r--deps/v8/src/common/assert-scope.cc2
-rw-r--r--deps/v8/src/common/assert-scope.h13
-rw-r--r--deps/v8/src/common/globals.h34
-rw-r--r--deps/v8/src/common/message-template.h2
-rw-r--r--deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc2
-rw-r--r--deps/v8/src/compiler/access-builder.cc21
-rw-r--r--deps/v8/src/compiler/access-builder.h2
-rw-r--r--deps/v8/src/compiler/access-info.cc16
-rw-r--r--deps/v8/src/compiler/allocation-builder-inl.h4
-rw-r--r--deps/v8/src/compiler/backend/arm/code-generator-arm.cc13
-rw-r--r--deps/v8/src/compiler/backend/arm/instruction-codes-arm.h4
-rw-r--r--deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc4
-rw-r--r--deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc8
-rw-r--r--deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc59
-rw-r--r--deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h20
-rw-r--r--deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc16
-rw-r--r--deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc60
-rw-r--r--deps/v8/src/compiler/backend/code-generator-impl.h6
-rw-r--r--deps/v8/src/compiler/backend/code-generator.cc12
-rw-r--r--deps/v8/src/compiler/backend/code-generator.h8
-rw-r--r--deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc35
-rw-r--r--deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h4
-rw-r--r--deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc4
-rw-r--r--deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc23
-rw-r--r--deps/v8/src/compiler/backend/instruction-codes.h2
-rw-r--r--deps/v8/src/compiler/backend/instruction-selector.cc125
-rw-r--r--deps/v8/src/compiler/backend/instruction-selector.h18
-rw-r--r--deps/v8/src/compiler/backend/live-range-separator.cc199
-rw-r--r--deps/v8/src/compiler/backend/live-range-separator.h61
-rw-r--r--deps/v8/src/compiler/backend/mips/code-generator-mips.cc29
-rw-r--r--deps/v8/src/compiler/backend/mips/instruction-codes-mips.h4
-rw-r--r--deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc4
-rw-r--r--deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc21
-rw-r--r--deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc90
-rw-r--r--deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h4
-rw-r--r--deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc4
-rw-r--r--deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc58
-rw-r--r--deps/v8/src/compiler/backend/ppc/OWNERS6
-rw-r--r--deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc172
-rw-r--r--deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h19
-rw-r--r--deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc19
-rw-r--r--deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc45
-rw-r--r--deps/v8/src/compiler/backend/register-allocator.cc688
-rw-r--r--deps/v8/src/compiler/backend/register-allocator.h69
-rw-r--r--deps/v8/src/compiler/backend/s390/code-generator-s390.cc361
-rw-r--r--deps/v8/src/compiler/backend/s390/instruction-codes-s390.h4
-rw-r--r--deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc4
-rw-r--r--deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc12
-rw-r--r--deps/v8/src/compiler/backend/x64/code-generator-x64.cc326
-rw-r--r--deps/v8/src/compiler/backend/x64/instruction-codes-x64.h4
-rw-r--r--deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc4
-rw-r--r--deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc47
-rw-r--r--deps/v8/src/compiler/bytecode-graph-builder.cc148
-rw-r--r--deps/v8/src/compiler/bytecode-graph-builder.h7
-rw-r--r--deps/v8/src/compiler/c-linkage.cc131
-rw-r--r--deps/v8/src/compiler/code-assembler.cc7
-rw-r--r--deps/v8/src/compiler/common-operator.h73
-rw-r--r--deps/v8/src/compiler/compilation-dependencies.cc8
-rw-r--r--deps/v8/src/compiler/compilation-dependency.h4
-rw-r--r--deps/v8/src/compiler/effect-control-linearizer.cc283
-rw-r--r--deps/v8/src/compiler/escape-analysis-reducer.cc9
-rw-r--r--deps/v8/src/compiler/graph-assembler.cc76
-rw-r--r--deps/v8/src/compiler/graph-assembler.h50
-rw-r--r--deps/v8/src/compiler/graph-reducer.cc15
-rw-r--r--deps/v8/src/compiler/graph-reducer.h5
-rw-r--r--deps/v8/src/compiler/graph-visualizer.cc3
-rw-r--r--deps/v8/src/compiler/heap-refs.h128
-rw-r--r--deps/v8/src/compiler/js-call-reducer.cc81
-rw-r--r--deps/v8/src/compiler/js-call-reducer.h5
-rw-r--r--deps/v8/src/compiler/js-create-lowering.cc7
-rw-r--r--deps/v8/src/compiler/js-generic-lowering.cc101
-rw-r--r--deps/v8/src/compiler/js-graph.cc3
-rw-r--r--deps/v8/src/compiler/js-graph.h1
-rw-r--r--deps/v8/src/compiler/js-heap-broker.cc1344
-rw-r--r--deps/v8/src/compiler/js-heap-broker.h31
-rw-r--r--deps/v8/src/compiler/js-heap-copy-reducer.cc7
-rw-r--r--deps/v8/src/compiler/js-inlining.cc4
-rw-r--r--deps/v8/src/compiler/js-intrinsic-lowering.cc2
-rw-r--r--deps/v8/src/compiler/js-native-context-specialization.cc11
-rw-r--r--deps/v8/src/compiler/js-operator.cc14
-rw-r--r--deps/v8/src/compiler/js-operator.h17
-rw-r--r--deps/v8/src/compiler/js-typed-lowering.cc34
-rw-r--r--deps/v8/src/compiler/linkage.cc11
-rw-r--r--deps/v8/src/compiler/linkage.h44
-rw-r--r--deps/v8/src/compiler/machine-operator-reducer.cc2
-rw-r--r--deps/v8/src/compiler/machine-operator.cc8
-rw-r--r--deps/v8/src/compiler/machine-operator.h6
-rw-r--r--deps/v8/src/compiler/opcodes.h55
-rw-r--r--deps/v8/src/compiler/operator-properties.cc2
-rw-r--r--deps/v8/src/compiler/pipeline.cc137
-rw-r--r--deps/v8/src/compiler/processed-feedback.h7
-rw-r--r--deps/v8/src/compiler/property-access-builder.cc54
-rw-r--r--deps/v8/src/compiler/scheduled-machine-lowering.cc2
-rw-r--r--deps/v8/src/compiler/serializer-for-background-compilation.cc8
-rw-r--r--deps/v8/src/compiler/simd-scalar-lowering.cc569
-rw-r--r--deps/v8/src/compiler/simd-scalar-lowering.h8
-rw-r--r--deps/v8/src/compiler/simplified-lowering.cc1
-rw-r--r--deps/v8/src/compiler/simplified-operator-reducer.cc35
-rw-r--r--deps/v8/src/compiler/simplified-operator.cc32
-rw-r--r--deps/v8/src/compiler/simplified-operator.h39
-rw-r--r--deps/v8/src/compiler/store-store-elimination.cc3
-rw-r--r--deps/v8/src/compiler/typer.cc9
-rw-r--r--deps/v8/src/compiler/verifier.cc4
-rw-r--r--deps/v8/src/compiler/wasm-compiler.cc441
-rw-r--r--deps/v8/src/compiler/wasm-compiler.h17
-rw-r--r--deps/v8/src/d8/async-hooks-wrapper.cc6
-rw-r--r--deps/v8/src/d8/d8-platforms.cc4
-rw-r--r--deps/v8/src/d8/d8-posix.cc10
-rw-r--r--deps/v8/src/d8/d8.cc332
-rw-r--r--deps/v8/src/d8/d8.h141
-rw-r--r--deps/v8/src/debug/debug-evaluate.cc2
-rw-r--r--deps/v8/src/debug/debug-interface.h7
-rw-r--r--deps/v8/src/debug/debug.cc23
-rw-r--r--deps/v8/src/debug/liveedit.cc2
-rw-r--r--deps/v8/src/debug/ppc/OWNERS6
-rw-r--r--deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc15
-rw-r--r--deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc47
-rw-r--r--deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc14
-rw-r--r--deps/v8/src/deoptimizer/deoptimizer.cc460
-rw-r--r--deps/v8/src/deoptimizer/deoptimizer.h47
-rw-r--r--deps/v8/src/diagnostics/basic-block-profiler.cc2
-rw-r--r--deps/v8/src/diagnostics/basic-block-profiler.h2
-rw-r--r--deps/v8/src/diagnostics/ia32/disasm-ia32.cc4
-rw-r--r--deps/v8/src/diagnostics/objects-debug.cc87
-rw-r--r--deps/v8/src/diagnostics/objects-printer.cc15
-rw-r--r--deps/v8/src/diagnostics/unwinder.cc103
-rw-r--r--deps/v8/src/diagnostics/unwinding-info-win64.cc31
-rw-r--r--deps/v8/src/execution/arm/frame-constants-arm.h36
-rw-r--r--deps/v8/src/execution/arm/simulator-arm.cc22
-rw-r--r--deps/v8/src/execution/arm64/frame-constants-arm64.cc7
-rw-r--r--deps/v8/src/execution/arm64/frame-constants-arm64.h4
-rw-r--r--deps/v8/src/execution/arm64/pointer-authentication-arm64.h68
-rw-r--r--deps/v8/src/execution/frame-constants.h127
-rw-r--r--deps/v8/src/execution/frames-inl.h13
-rw-r--r--deps/v8/src/execution/frames.cc79
-rw-r--r--deps/v8/src/execution/frames.h5
-rw-r--r--deps/v8/src/execution/isolate.cc60
-rw-r--r--deps/v8/src/execution/isolate.h24
-rw-r--r--deps/v8/src/execution/mips/frame-constants-mips.h8
-rw-r--r--deps/v8/src/execution/mips64/frame-constants-mips64.h8
-rw-r--r--deps/v8/src/execution/pointer-authentication-dummy.h18
-rw-r--r--deps/v8/src/execution/pointer-authentication.h15
-rw-r--r--deps/v8/src/execution/ppc/frame-constants-ppc.h4
-rw-r--r--deps/v8/src/execution/ppc/simulator-ppc.cc8
-rw-r--r--deps/v8/src/execution/runtime-profiler.cc156
-rw-r--r--deps/v8/src/execution/runtime-profiler.h19
-rw-r--r--deps/v8/src/execution/s390/frame-constants-s390.h4
-rw-r--r--deps/v8/src/execution/s390/simulator-s390.cc9
-rw-r--r--deps/v8/src/execution/thread-local-top.cc4
-rw-r--r--deps/v8/src/execution/thread-local-top.h12
-rw-r--r--deps/v8/src/execution/v8threads.cc6
-rw-r--r--deps/v8/src/execution/v8threads.h3
-rw-r--r--deps/v8/src/flags/flag-definitions.h196
-rw-r--r--deps/v8/src/flags/flags.cc353
-rw-r--r--deps/v8/src/handles/handles.cc2
-rw-r--r--deps/v8/src/handles/handles.h9
-rw-r--r--deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc4
-rw-r--r--deps/v8/src/heap/base/worklist.cc19
-rw-r--r--deps/v8/src/heap/base/worklist.h451
-rw-r--r--deps/v8/src/heap/concurrent-allocator.cc24
-rw-r--r--deps/v8/src/heap/concurrent-allocator.h3
-rw-r--r--deps/v8/src/heap/conservative-stack-visitor.cc78
-rw-r--r--deps/v8/src/heap/conservative-stack-visitor.h32
-rw-r--r--deps/v8/src/heap/cppgc-js/cpp-heap.cc32
-rw-r--r--deps/v8/src/heap/cppgc-js/cpp-heap.h6
-rw-r--r--deps/v8/src/heap/cppgc/default-job.h186
-rw-r--r--deps/v8/src/heap/cppgc/default-platform.cc78
-rw-r--r--deps/v8/src/heap/cppgc/garbage-collector.h13
-rw-r--r--deps/v8/src/heap/cppgc/gc-invoker.cc28
-rw-r--r--deps/v8/src/heap/cppgc/gc-invoker.h1
-rw-r--r--deps/v8/src/heap/cppgc/heap-base.cc9
-rw-r--r--deps/v8/src/heap/cppgc/heap-base.h17
-rw-r--r--deps/v8/src/heap/cppgc/heap-growing.cc68
-rw-r--r--deps/v8/src/heap/cppgc/heap-growing.h5
-rw-r--r--deps/v8/src/heap/cppgc/heap.cc71
-rw-r--r--deps/v8/src/heap/cppgc/heap.h16
-rw-r--r--deps/v8/src/heap/cppgc/incremental-marking-schedule.cc74
-rw-r--r--deps/v8/src/heap/cppgc/incremental-marking-schedule.h53
-rw-r--r--deps/v8/src/heap/cppgc/marker.cc278
-rw-r--r--deps/v8/src/heap/cppgc/marker.h115
-rw-r--r--deps/v8/src/heap/cppgc/marking-state.cc20
-rw-r--r--deps/v8/src/heap/cppgc/marking-state.h59
-rw-r--r--deps/v8/src/heap/cppgc/marking-verifier.cc17
-rw-r--r--deps/v8/src/heap/cppgc/marking-verifier.h7
-rw-r--r--deps/v8/src/heap/cppgc/marking-visitor.h2
-rw-r--r--deps/v8/src/heap/cppgc/marking-worklists.cc10
-rw-r--r--deps/v8/src/heap/cppgc/marking-worklists.h17
-rw-r--r--deps/v8/src/heap/cppgc/object-allocator.cc3
-rw-r--r--deps/v8/src/heap/cppgc/prefinalizer-handler.cc2
-rw-r--r--deps/v8/src/heap/cppgc/stats-collector.cc14
-rw-r--r--deps/v8/src/heap/cppgc/stats-collector.h4
-rw-r--r--deps/v8/src/heap/cppgc/sweeper.cc26
-rw-r--r--deps/v8/src/heap/cppgc/sweeper.h2
-rw-r--r--deps/v8/src/heap/cppgc/worklist.h473
-rw-r--r--deps/v8/src/heap/factory-base.cc3
-rw-r--r--deps/v8/src/heap/factory.cc9
-rw-r--r--deps/v8/src/heap/factory.h2
-rw-r--r--deps/v8/src/heap/heap-inl.h25
-rw-r--r--deps/v8/src/heap/heap-write-barrier-inl.h6
-rw-r--r--deps/v8/src/heap/heap-write-barrier.cc38
-rw-r--r--deps/v8/src/heap/heap-write-barrier.h9
-rw-r--r--deps/v8/src/heap/heap.cc175
-rw-r--r--deps/v8/src/heap/heap.h39
-rw-r--r--deps/v8/src/heap/incremental-marking.cc8
-rw-r--r--deps/v8/src/heap/incremental-marking.h2
-rw-r--r--deps/v8/src/heap/index-generator.cc48
-rw-r--r--deps/v8/src/heap/index-generator.h43
-rw-r--r--deps/v8/src/heap/local-heap-inl.h7
-rw-r--r--deps/v8/src/heap/local-heap.cc15
-rw-r--r--deps/v8/src/heap/local-heap.h7
-rw-r--r--deps/v8/src/heap/mark-compact-inl.h5
-rw-r--r--deps/v8/src/heap/mark-compact.cc38
-rw-r--r--deps/v8/src/heap/mark-compact.h6
-rw-r--r--deps/v8/src/heap/marking-barrier-inl.h6
-rw-r--r--deps/v8/src/heap/marking-barrier.cc171
-rw-r--r--deps/v8/src/heap/marking-barrier.h30
-rw-r--r--deps/v8/src/heap/marking-visitor-inl.h4
-rw-r--r--deps/v8/src/heap/marking-visitor.h3
-rw-r--r--deps/v8/src/heap/marking-worklist-inl.h269
-rw-r--r--deps/v8/src/heap/marking-worklist.h117
-rw-r--r--deps/v8/src/heap/marking.h3
-rw-r--r--deps/v8/src/heap/memory-chunk-layout.h7
-rw-r--r--deps/v8/src/heap/memory-chunk.cc4
-rw-r--r--deps/v8/src/heap/memory-chunk.h8
-rw-r--r--deps/v8/src/heap/new-spaces.cc2
-rw-r--r--deps/v8/src/heap/object-start-bitmap.h188
-rw-r--r--deps/v8/src/heap/object-stats.cc2
-rw-r--r--deps/v8/src/heap/objects-visiting.h3
-rw-r--r--deps/v8/src/heap/paged-spaces.cc18
-rw-r--r--deps/v8/src/heap/paged-spaces.h8
-rw-r--r--deps/v8/src/heap/safepoint.cc4
-rw-r--r--deps/v8/src/heap/safepoint.h4
-rw-r--r--deps/v8/src/heap/scavenger.cc2
-rw-r--r--deps/v8/src/heap/setup-heap-internal.cc6
-rw-r--r--deps/v8/src/heap/sweeper.cc8
-rw-r--r--deps/v8/src/ic/accessor-assembler.cc492
-rw-r--r--deps/v8/src/ic/accessor-assembler.h122
-rw-r--r--deps/v8/src/ic/handler-configuration.cc322
-rw-r--r--deps/v8/src/ic/handler-configuration.h64
-rw-r--r--deps/v8/src/ic/ic-inl.h9
-rw-r--r--deps/v8/src/ic/ic.cc211
-rw-r--r--deps/v8/src/ic/ic.h22
-rw-r--r--deps/v8/src/init/bootstrapper.cc8
-rw-r--r--deps/v8/src/inspector/DEPS1
-rw-r--r--deps/v8/src/inspector/string-16.cc8
-rw-r--r--deps/v8/src/inspector/string-16.h1
-rw-r--r--deps/v8/src/inspector/v8-profiler-agent-impl.cc158
-rw-r--r--deps/v8/src/inspector/v8-profiler-agent-impl.h10
-rw-r--r--deps/v8/src/inspector/value-mirror.cc26
-rw-r--r--deps/v8/src/interpreter/OWNERS1
-rw-r--r--deps/v8/src/interpreter/bytecode-array-builder.cc9
-rw-r--r--deps/v8/src/interpreter/bytecode-array-builder.h4
-rw-r--r--deps/v8/src/interpreter/bytecode-generator.cc69
-rw-r--r--deps/v8/src/interpreter/bytecode-generator.h1
-rw-r--r--deps/v8/src/interpreter/bytecode-register.cc2
-rw-r--r--deps/v8/src/interpreter/bytecodes.h2
-rw-r--r--deps/v8/src/interpreter/interpreter-generator.cc32
-rw-r--r--deps/v8/src/interpreter/interpreter-intrinsics-generator.cc2
-rw-r--r--deps/v8/src/interpreter/interpreter-intrinsics.h2
-rw-r--r--deps/v8/src/interpreter/interpreter.cc4
-rw-r--r--deps/v8/src/libplatform/OWNERS1
-rw-r--r--deps/v8/src/libplatform/default-job.cc106
-rw-r--r--deps/v8/src/libplatform/default-job.h53
-rw-r--r--deps/v8/src/libsampler/sampler.cc2
-rw-r--r--deps/v8/src/logging/code-events.h6
-rw-r--r--deps/v8/src/logging/counters.cc11
-rw-r--r--deps/v8/src/logging/counters.h6
-rw-r--r--deps/v8/src/logging/log-utils.cc106
-rw-r--r--deps/v8/src/logging/log-utils.h59
-rw-r--r--deps/v8/src/logging/log.cc299
-rw-r--r--deps/v8/src/logging/log.h21
-rw-r--r--deps/v8/src/numbers/conversions.cc73
-rw-r--r--deps/v8/src/numbers/hash-seed-inl.h1
-rw-r--r--deps/v8/src/objects/allocation-site-scopes.h4
-rw-r--r--deps/v8/src/objects/api-callbacks-inl.h2
-rw-r--r--deps/v8/src/objects/api-callbacks.h4
-rw-r--r--deps/v8/src/objects/arguments.h2
-rw-r--r--deps/v8/src/objects/arguments.tq59
-rw-r--r--deps/v8/src/objects/backing-store.cc8
-rw-r--r--deps/v8/src/objects/bigint.cc37
-rw-r--r--deps/v8/src/objects/bigint.h14
-rw-r--r--deps/v8/src/objects/cell.h2
-rw-r--r--deps/v8/src/objects/class-definitions-tq-deps-inl.h2
-rw-r--r--deps/v8/src/objects/code-inl.h47
-rw-r--r--deps/v8/src/objects/code-kind.h16
-rw-r--r--deps/v8/src/objects/code.cc50
-rw-r--r--deps/v8/src/objects/code.h18
-rw-r--r--deps/v8/src/objects/compressed-slots-inl.h10
-rw-r--r--deps/v8/src/objects/compressed-slots.h2
-rw-r--r--deps/v8/src/objects/contexts-inl.h1
-rw-r--r--deps/v8/src/objects/contexts.h2
-rw-r--r--deps/v8/src/objects/debug-objects.h2
-rw-r--r--deps/v8/src/objects/descriptor-array-inl.h2
-rw-r--r--deps/v8/src/objects/descriptor-array.h2
-rw-r--r--deps/v8/src/objects/elements-kind.cc7
-rw-r--r--deps/v8/src/objects/elements-kind.h4
-rw-r--r--deps/v8/src/objects/elements.cc7
-rw-r--r--deps/v8/src/objects/embedder-data-array.h2
-rw-r--r--deps/v8/src/objects/embedder-data-slot-inl.h4
-rw-r--r--deps/v8/src/objects/embedder-data-slot.h4
-rw-r--r--deps/v8/src/objects/feedback-vector-inl.h64
-rw-r--r--deps/v8/src/objects/feedback-vector.cc27
-rw-r--r--deps/v8/src/objects/feedback-vector.h69
-rw-r--r--deps/v8/src/objects/feedback-vector.tq11
-rw-r--r--deps/v8/src/objects/fixed-array-inl.h15
-rw-r--r--deps/v8/src/objects/fixed-array.h14
-rw-r--r--deps/v8/src/objects/fixed-array.tq2
-rw-r--r--deps/v8/src/objects/foreign.h2
-rw-r--r--deps/v8/src/objects/free-space.h2
-rw-r--r--deps/v8/src/objects/heap-object.h4
-rw-r--r--deps/v8/src/objects/instance-type.h3
-rw-r--r--deps/v8/src/objects/internal-index.h3
-rw-r--r--deps/v8/src/objects/intl-objects.tq2
-rw-r--r--deps/v8/src/objects/js-array-buffer.h2
-rw-r--r--deps/v8/src/objects/js-array.h2
-rw-r--r--deps/v8/src/objects/js-break-iterator.h2
-rw-r--r--deps/v8/src/objects/js-collator.cc29
-rw-r--r--deps/v8/src/objects/js-date-time-format.cc85
-rw-r--r--deps/v8/src/objects/js-date-time-format.h2
-rw-r--r--deps/v8/src/objects/js-function-inl.h304
-rw-r--r--deps/v8/src/objects/js-function.cc295
-rw-r--r--deps/v8/src/objects/js-function.h96
-rw-r--r--deps/v8/src/objects/js-objects.cc33
-rw-r--r--deps/v8/src/objects/js-objects.h4
-rw-r--r--deps/v8/src/objects/js-promise.h2
-rw-r--r--deps/v8/src/objects/js-proxy.h2
-rw-r--r--deps/v8/src/objects/js-regexp-inl.h10
-rw-r--r--deps/v8/src/objects/js-regexp-string-iterator.h2
-rw-r--r--deps/v8/src/objects/js-regexp.h20
-rw-r--r--deps/v8/src/objects/js-segment-iterator-inl.h2
-rw-r--r--deps/v8/src/objects/js-segment-iterator.cc8
-rw-r--r--deps/v8/src/objects/js-segment-iterator.h1
-rw-r--r--deps/v8/src/objects/js-segments.cc5
-rw-r--r--deps/v8/src/objects/js-segments.h2
-rw-r--r--deps/v8/src/objects/js-weak-refs.h2
-rw-r--r--deps/v8/src/objects/literal-objects.cc2
-rw-r--r--deps/v8/src/objects/lookup-inl.h54
-rw-r--r--deps/v8/src/objects/lookup.cc45
-rw-r--r--deps/v8/src/objects/lookup.h18
-rw-r--r--deps/v8/src/objects/map-inl.h3
-rw-r--r--deps/v8/src/objects/map-updater.cc13
-rw-r--r--deps/v8/src/objects/map.cc18
-rw-r--r--deps/v8/src/objects/map.h5
-rw-r--r--deps/v8/src/objects/maybe-object-inl.h13
-rw-r--r--deps/v8/src/objects/maybe-object.h3
-rw-r--r--deps/v8/src/objects/module.cc155
-rw-r--r--deps/v8/src/objects/module.h13
-rw-r--r--deps/v8/src/objects/name-inl.h6
-rw-r--r--deps/v8/src/objects/name.h10
-rw-r--r--deps/v8/src/objects/object-list-macros.h2
-rw-r--r--deps/v8/src/objects/object-macros-undef.h7
-rw-r--r--deps/v8/src/objects/object-macros.h47
-rw-r--r--deps/v8/src/objects/objects-body-descriptors-inl.h34
-rw-r--r--deps/v8/src/objects/objects-definitions.h3
-rw-r--r--deps/v8/src/objects/objects-inl.h2
-rw-r--r--deps/v8/src/objects/objects.cc50
-rw-r--r--deps/v8/src/objects/primitive-heap-object-inl.h2
-rw-r--r--deps/v8/src/objects/primitive-heap-object.h2
-rw-r--r--deps/v8/src/objects/property-array.h2
-rw-r--r--deps/v8/src/objects/property-cell.h2
-rw-r--r--deps/v8/src/objects/property-descriptor-object.h2
-rw-r--r--deps/v8/src/objects/prototype-info.h2
-rw-r--r--deps/v8/src/objects/scope-info.h2
-rw-r--r--deps/v8/src/objects/script.h2
-rw-r--r--deps/v8/src/objects/shared-function-info-inl.h3
-rw-r--r--deps/v8/src/objects/shared-function-info.h8
-rw-r--r--deps/v8/src/objects/shared-function-info.tq1
-rw-r--r--deps/v8/src/objects/slots-inl.h4
-rw-r--r--deps/v8/src/objects/slots.h1
-rw-r--r--deps/v8/src/objects/source-text-module.cc11
-rw-r--r--deps/v8/src/objects/source-text-module.h2
-rw-r--r--deps/v8/src/objects/stack-frame-info.h2
-rw-r--r--deps/v8/src/objects/stack-frame-info.tq1
-rw-r--r--deps/v8/src/objects/string-table.cc106
-rw-r--r--deps/v8/src/objects/string-table.h16
-rw-r--r--deps/v8/src/objects/string.cc2
-rw-r--r--deps/v8/src/objects/struct-inl.h2
-rw-r--r--deps/v8/src/objects/struct.h2
-rw-r--r--deps/v8/src/objects/synthetic-module.cc21
-rw-r--r--deps/v8/src/objects/tagged-field.h6
-rw-r--r--deps/v8/src/objects/templates.h2
-rw-r--r--deps/v8/src/objects/transitions-inl.h8
-rw-r--r--deps/v8/src/objects/transitions.cc4
-rw-r--r--deps/v8/src/objects/transitions.h13
-rw-r--r--deps/v8/src/objects/value-serializer.cc1
-rw-r--r--deps/v8/src/parsing/expression-scope.h4
-rw-r--r--deps/v8/src/parsing/parser-base.h25
-rw-r--r--deps/v8/src/parsing/parser.cc2
-rw-r--r--deps/v8/src/parsing/parser.h2
-rw-r--r--deps/v8/src/parsing/preparser.cc4
-rw-r--r--deps/v8/src/profiler/cpu-profiler-inl.h22
-rw-r--r--deps/v8/src/profiler/cpu-profiler.cc36
-rw-r--r--deps/v8/src/profiler/cpu-profiler.h16
-rw-r--r--deps/v8/src/profiler/heap-profiler.cc12
-rw-r--r--deps/v8/src/profiler/heap-profiler.h4
-rw-r--r--deps/v8/src/profiler/heap-snapshot-generator.cc128
-rw-r--r--deps/v8/src/profiler/heap-snapshot-generator.h14
-rw-r--r--deps/v8/src/profiler/profile-generator.cc86
-rw-r--r--deps/v8/src/profiler/profile-generator.h41
-rw-r--r--deps/v8/src/profiler/profiler-listener.cc7
-rw-r--r--deps/v8/src/profiler/profiler-listener.h1
-rw-r--r--deps/v8/src/profiler/profiler-stats.cc55
-rw-r--r--deps/v8/src/profiler/profiler-stats.h49
-rw-r--r--deps/v8/src/profiler/tick-sample.cc69
-rw-r--r--deps/v8/src/profiler/tick-sample.h5
-rw-r--r--deps/v8/src/regexp/experimental/experimental-bytecode.cc107
-rw-r--r--deps/v8/src/regexp/experimental/experimental-bytecode.h210
-rw-r--r--deps/v8/src/regexp/experimental/experimental-compiler.cc616
-rw-r--r--deps/v8/src/regexp/experimental/experimental-compiler.h34
-rw-r--r--deps/v8/src/regexp/experimental/experimental-interpreter.cc454
-rw-r--r--deps/v8/src/regexp/experimental/experimental-interpreter.h38
-rw-r--r--deps/v8/src/regexp/experimental/experimental.cc213
-rw-r--r--deps/v8/src/regexp/experimental/experimental.h19
-rw-r--r--deps/v8/src/regexp/ppc/OWNERS6
-rw-r--r--deps/v8/src/regexp/regexp-ast.h9
-rw-r--r--deps/v8/src/regexp/regexp-compiler-tonode.cc47
-rw-r--r--deps/v8/src/regexp/regexp.cc146
-rw-r--r--deps/v8/src/regexp/regexp.h25
-rw-r--r--deps/v8/src/runtime/runtime-bigint.cc13
-rw-r--r--deps/v8/src/runtime/runtime-compiler.cc30
-rw-r--r--deps/v8/src/runtime/runtime-interpreter.cc2
-rw-r--r--deps/v8/src/runtime/runtime-object.cc58
-rw-r--r--deps/v8/src/runtime/runtime-regexp.cc19
-rw-r--r--deps/v8/src/runtime/runtime-scopes.cc8
-rw-r--r--deps/v8/src/runtime/runtime-test.cc29
-rw-r--r--deps/v8/src/runtime/runtime-wasm.cc36
-rw-r--r--deps/v8/src/runtime/runtime.h16
-rw-r--r--deps/v8/src/snapshot/OWNERS2
-rw-r--r--deps/v8/src/snapshot/code-serializer.cc10
-rw-r--r--deps/v8/src/snapshot/context-deserializer.cc11
-rw-r--r--deps/v8/src/snapshot/context-serializer.cc6
-rw-r--r--deps/v8/src/snapshot/context-serializer.h2
-rw-r--r--deps/v8/src/snapshot/deserializer-allocator.cc32
-rw-r--r--deps/v8/src/snapshot/deserializer-allocator.h21
-rw-r--r--deps/v8/src/snapshot/deserializer.cc751
-rw-r--r--deps/v8/src/snapshot/deserializer.h60
-rw-r--r--deps/v8/src/snapshot/embedded/embedded-file-writer.cc48
-rw-r--r--deps/v8/src/snapshot/embedded/embedded-file-writer.h15
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.cc12
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.h4
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-base.h3
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc7
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.h4
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.cc4
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.h4
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc6
-rw-r--r--deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.h2
-rw-r--r--deps/v8/src/snapshot/object-deserializer.cc4
-rw-r--r--deps/v8/src/snapshot/read-only-deserializer.cc2
-rw-r--r--deps/v8/src/snapshot/read-only-serializer.cc9
-rw-r--r--deps/v8/src/snapshot/references.h3
-rw-r--r--deps/v8/src/snapshot/serializer-deserializer.cc15
-rw-r--r--deps/v8/src/snapshot/serializer-deserializer.h163
-rw-r--r--deps/v8/src/snapshot/serializer.cc240
-rw-r--r--deps/v8/src/snapshot/serializer.h45
-rw-r--r--deps/v8/src/snapshot/snapshot-data.cc2
-rw-r--r--deps/v8/src/snapshot/snapshot-source-sink.cc9
-rw-r--r--deps/v8/src/snapshot/snapshot-source-sink.h13
-rw-r--r--deps/v8/src/snapshot/snapshot.cc15
-rw-r--r--deps/v8/src/snapshot/snapshot.h4
-rw-r--r--deps/v8/src/snapshot/startup-deserializer.cc2
-rw-r--r--deps/v8/src/snapshot/startup-serializer.cc4
-rw-r--r--deps/v8/src/snapshot/startup-serializer.h2
-rw-r--r--deps/v8/src/strings/char-predicates-inl.h10
-rw-r--r--deps/v8/src/strings/char-predicates.h1
-rw-r--r--deps/v8/src/strings/string-builder-inl.h4
-rw-r--r--deps/v8/src/strings/string-search.h9
-rw-r--r--deps/v8/src/torque/class-debug-reader-generator.cc2
-rw-r--r--deps/v8/src/torque/implementation-visitor.cc71
-rw-r--r--deps/v8/src/torque/instance-type-generator.cc2
-rw-r--r--deps/v8/src/torque/torque-parser.cc13
-rw-r--r--deps/v8/src/torque/types.cc5
-rw-r--r--deps/v8/src/utils/allocation.cc10
-rw-r--r--deps/v8/src/utils/allocation.h6
-rw-r--r--deps/v8/src/utils/identity-map.cc15
-rw-r--r--deps/v8/src/utils/identity-map.h3
-rw-r--r--deps/v8/src/utils/utils.h4
-rw-r--r--deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h221
-rw-r--r--deps/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h158
-rw-r--r--deps/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h167
-rw-r--r--deps/v8/src/wasm/baseline/liftoff-assembler.cc53
-rw-r--r--deps/v8/src/wasm/baseline/liftoff-assembler.h31
-rw-r--r--deps/v8/src/wasm/baseline/liftoff-compiler.cc359
-rw-r--r--deps/v8/src/wasm/baseline/liftoff-compiler.h3
-rw-r--r--deps/v8/src/wasm/baseline/liftoff-register.h3
-rw-r--r--deps/v8/src/wasm/baseline/mips/liftoff-assembler-mips.h89
-rw-r--r--deps/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h202
-rw-r--r--deps/v8/src/wasm/baseline/ppc/OWNERS6
-rw-r--r--deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h91
-rw-r--r--deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h91
-rw-r--r--deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h136
-rw-r--r--deps/v8/src/wasm/c-api.cc17
-rw-r--r--deps/v8/src/wasm/compilation-environment.h29
-rw-r--r--deps/v8/src/wasm/decoder.h7
-rw-r--r--deps/v8/src/wasm/function-body-decoder-impl.h272
-rw-r--r--deps/v8/src/wasm/function-body-decoder.cc2
-rw-r--r--deps/v8/src/wasm/function-compiler.cc35
-rw-r--r--deps/v8/src/wasm/function-compiler.h4
-rw-r--r--deps/v8/src/wasm/graph-builder-interface.cc3
-rw-r--r--deps/v8/src/wasm/module-compiler.cc594
-rw-r--r--deps/v8/src/wasm/module-compiler.h7
-rw-r--r--deps/v8/src/wasm/module-decoder.cc309
-rw-r--r--deps/v8/src/wasm/module-instantiate.cc125
-rw-r--r--deps/v8/src/wasm/struct-types.h17
-rw-r--r--deps/v8/src/wasm/value-type.h115
-rw-r--r--deps/v8/src/wasm/wasm-code-manager.cc92
-rw-r--r--deps/v8/src/wasm/wasm-code-manager.h17
-rw-r--r--deps/v8/src/wasm/wasm-constants.h49
-rw-r--r--deps/v8/src/wasm/wasm-debug-evaluate.cc4
-rw-r--r--deps/v8/src/wasm/wasm-debug.cc115
-rw-r--r--deps/v8/src/wasm/wasm-engine.cc35
-rw-r--r--deps/v8/src/wasm/wasm-feature-flags.h29
-rw-r--r--deps/v8/src/wasm/wasm-js.cc26
-rw-r--r--deps/v8/src/wasm/wasm-limits.h13
-rw-r--r--deps/v8/src/wasm/wasm-module-builder.cc9
-rw-r--r--deps/v8/src/wasm/wasm-module.cc17
-rw-r--r--deps/v8/src/wasm/wasm-module.h71
-rw-r--r--deps/v8/src/wasm/wasm-objects-inl.h7
-rw-r--r--deps/v8/src/wasm/wasm-objects.cc304
-rw-r--r--deps/v8/src/wasm/wasm-objects.h48
-rw-r--r--deps/v8/src/wasm/wasm-objects.tq22
-rw-r--r--deps/v8/src/wasm/wasm-opcodes-inl.h26
-rw-r--r--deps/v8/src/wasm/wasm-opcodes.cc29
-rw-r--r--deps/v8/src/wasm/wasm-opcodes.h62
-rw-r--r--deps/v8/src/wasm/wasm-subtyping.cc362
-rw-r--r--deps/v8/src/wasm/wasm-subtyping.h59
-rw-r--r--deps/v8/src/wasm/wasm-value.h8
-rw-r--r--deps/v8/src/zone/accounting-allocator.cc1
-rw-r--r--deps/v8/src/zone/zone.h3
-rw-r--r--deps/v8/test/benchmarks/benchmarks.status12
-rw-r--r--deps/v8/test/cctest/BUILD.gn10
-rw-r--r--deps/v8/test/cctest/OWNERS2
-rw-r--r--deps/v8/test/cctest/cctest.cc40
-rw-r--r--deps/v8/test/cctest/cctest.h12
-rw-r--r--deps/v8/test/cctest/cctest.status42
-rw-r--r--deps/v8/test/cctest/compiler/serializer-tester.cc5
-rw-r--r--deps/v8/test/cctest/compiler/test-js-context-specialization.cc2
-rw-r--r--deps/v8/test/cctest/compiler/test-js-typed-lowering.cc4
-rw-r--r--deps/v8/test/cctest/compiler/test-machine-operator-reducer.cc3
-rw-r--r--deps/v8/test/cctest/compiler/test-run-calls-to-external-references.cc560
-rw-r--r--deps/v8/test/cctest/heap/heap-tester.h4
-rw-r--r--deps/v8/test/cctest/heap/heap-utils.cc43
-rw-r--r--deps/v8/test/cctest/heap/heap-utils.h10
-rw-r--r--deps/v8/test/cctest/heap/test-alloc.cc4
-rw-r--r--deps/v8/test/cctest/heap/test-concurrent-allocation.cc142
-rw-r--r--deps/v8/test/cctest/heap/test-embedder-tracing.cc12
-rw-r--r--deps/v8/test/cctest/heap/test-heap.cc187
-rw-r--r--deps/v8/test/cctest/heap/test-incremental-marking.cc1
-rw-r--r--deps/v8/test/cctest/heap/test-invalidated-slots.cc4
-rw-r--r--deps/v8/test/cctest/heap/test-mark-compact.cc41
-rw-r--r--deps/v8/test/cctest/heap/test-page-promotion.cc2
-rw-r--r--deps/v8/test/cctest/heap/test-spaces.cc15
-rw-r--r--deps/v8/test/cctest/heap/test-unmapper.cc1
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/ArrayLiterals.golden6
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/CallAndSpread.golden2
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden8
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/NewAndSpread.golden2
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateAccessorAccess.golden8
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateMethodAccess.golden4
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden20
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/SuperCallAndSpread.golden2
-rw-r--r--deps/v8/test/cctest/interpreter/bytecode_expectations/WideRegisters.golden28
-rw-r--r--deps/v8/test/cctest/libplatform/test-tracing.cc7
-rw-r--r--deps/v8/test/cctest/test-api-interceptors.cc12
-rw-r--r--deps/v8/test/cctest/test-api-stack-traces.cc10
-rw-r--r--deps/v8/test/cctest/test-api.cc246
-rw-r--r--deps/v8/test/cctest/test-assembler-x64.cc2
-rw-r--r--deps/v8/test/cctest/test-code-stub-assembler.cc23
-rw-r--r--deps/v8/test/cctest/test-compiler.cc3
-rw-r--r--deps/v8/test/cctest/test-concurrent-descriptor-array.cc4
-rw-r--r--deps/v8/test/cctest/test-concurrent-prototype.cc6
-rw-r--r--deps/v8/test/cctest/test-cpu-profiler.cc327
-rw-r--r--deps/v8/test/cctest/test-debug-helper.cc42
-rw-r--r--deps/v8/test/cctest/test-debug.cc113
-rw-r--r--deps/v8/test/cctest/test-descriptor-array.cc424
-rw-r--r--deps/v8/test/cctest/test-dictionary.cc2
-rw-r--r--deps/v8/test/cctest/test-disasm-ia32.cc2
-rw-r--r--deps/v8/test/cctest/test-field-type-tracking.cc67
-rw-r--r--deps/v8/test/cctest/test-heap-profiler.cc62
-rw-r--r--deps/v8/test/cctest/test-local-handles.cc6
-rw-r--r--deps/v8/test/cctest/test-log.cc51
-rw-r--r--deps/v8/test/cctest/test-persistent-handles.cc4
-rw-r--r--deps/v8/test/cctest/test-platform.cc2
-rw-r--r--deps/v8/test/cctest/test-profile-generator.cc4
-rw-r--r--deps/v8/test/cctest/test-regexp.cc27
-rw-r--r--deps/v8/test/cctest/test-sampler-api.cc2
-rw-r--r--deps/v8/test/cctest/test-serialize.cc91
-rw-r--r--deps/v8/test/cctest/test-strings.cc1
-rw-r--r--deps/v8/test/cctest/test-transitions.h2
-rw-r--r--deps/v8/test/cctest/test-unwinder-code-pages.cc110
-rw-r--r--deps/v8/test/cctest/test-unwinder.cc634
-rw-r--r--deps/v8/test/cctest/test-weakmaps.cc2
-rw-r--r--deps/v8/test/cctest/test-weaksets.cc2
-rw-r--r--deps/v8/test/cctest/torque/test-torque.cc8
-rw-r--r--deps/v8/test/cctest/wasm/test-c-wasm-entry.cc3
-rw-r--r--deps/v8/test/cctest/wasm/test-gc.cc102
-rw-r--r--deps/v8/test/cctest/wasm/test-jump-table-assembler.cc24
-rw-r--r--deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc20
-rw-r--r--deps/v8/test/cctest/wasm/test-run-wasm-module.cc8
-rw-r--r--deps/v8/test/cctest/wasm/test-run-wasm-simd-liftoff.cc14
-rw-r--r--deps/v8/test/cctest/wasm/test-run-wasm-simd-scalar-lowering.cc231
-rw-r--r--deps/v8/test/cctest/wasm/test-run-wasm-simd.cc184
-rw-r--r--deps/v8/test/cctest/wasm/test-run-wasm.cc28
-rw-r--r--deps/v8/test/cctest/wasm/test-streaming-compilation.cc525
-rw-r--r--deps/v8/test/cctest/wasm/test-wasm-breakpoints.cc7
-rw-r--r--deps/v8/test/cctest/wasm/test-wasm-metrics.cc330
-rw-r--r--deps/v8/test/cctest/wasm/test-wasm-shared-engine.cc4
-rw-r--r--deps/v8/test/cctest/wasm/wasm-run-utils.cc7
-rw-r--r--deps/v8/test/common/wasm/test-signatures.h8
-rw-r--r--deps/v8/test/common/wasm/wasm-interpreter.cc34
-rw-r--r--deps/v8/test/common/wasm/wasm-macro-gen.h104
-rw-r--r--deps/v8/test/common/wasm/wasm-module-runner.cc46
-rw-r--r--deps/v8/test/common/wasm/wasm-module-runner.h14
-rw-r--r--deps/v8/test/debugger/debugger.status4
-rw-r--r--deps/v8/test/fuzzer/fuzzer-support.cc8
-rw-r--r--deps/v8/test/fuzzer/wasm-async.cc8
-rw-r--r--deps/v8/test/fuzzer/wasm-compile.cc61
-rw-r--r--deps/v8/test/fuzzer/wasm-fuzzer-common.cc29
-rw-r--r--deps/v8/test/fuzzer/wasm.cc2
-rw-r--r--deps/v8/test/fuzzer/wasm/regress-1127717.wasmbin0 -> 128 bytes
-rw-r--r--deps/v8/test/fuzzilli/libreprl.c527
-rw-r--r--deps/v8/test/fuzzilli/libreprl.h123
-rw-r--r--deps/v8/test/fuzzilli/main.cc62
-rw-r--r--deps/v8/test/inspector/BUILD.gn1
-rw-r--r--deps/v8/test/inspector/counters/collection-expected.txt2
-rw-r--r--deps/v8/test/inspector/counters/collection.js83
-rw-r--r--deps/v8/test/inspector/counters/enable-disable-expected.txt6
-rw-r--r--deps/v8/test/inspector/counters/enable-disable.js51
-rw-r--r--deps/v8/test/inspector/debugger/wasm-get-breakable-locations-byte-offsets.js2
-rw-r--r--deps/v8/test/inspector/debugger/wasm-scope-info-expected.txt190
-rw-r--r--deps/v8/test/inspector/debugger/wasm-scope-info-liftoff-expected.txt54
-rw-r--r--deps/v8/test/inspector/debugger/wasm-scope-info-liftoff.js20
-rw-r--r--deps/v8/test/inspector/debugger/wasm-scope-info.js75
-rw-r--r--deps/v8/test/inspector/debugger/wasm-set-breakpoint-breaks-on-first-breakable-location.js2
-rw-r--r--deps/v8/test/inspector/debugger/wasm-step-after-trap.js5
-rw-r--r--deps/v8/test/inspector/debugger/wasm-stepping-liftoff.js2
-rw-r--r--deps/v8/test/inspector/heap-profiler/console-retaining-path.js2
-rw-r--r--deps/v8/test/inspector/inspector-test.cc75
-rw-r--r--deps/v8/test/inspector/inspector.status12
-rw-r--r--deps/v8/test/inspector/runtime-call-stats/collection.js2
-rw-r--r--deps/v8/test/inspector/runtime-call-stats/enable-disable-expected.txt9
-rw-r--r--deps/v8/test/inspector/runtime-call-stats/enable-disable.js68
-rw-r--r--deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache-expected.txt24
-rw-r--r--deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache.js23
-rw-r--r--deps/v8/test/intl/intl.status5
-rw-r--r--deps/v8/test/intl/regress-10438.js4
-rw-r--r--deps/v8/test/intl/regress-10613.js5
-rw-r--r--deps/v8/test/intl/regress-10836.js45
-rw-r--r--deps/v8/test/intl/regress-1121156.js11
-rw-r--r--deps/v8/test/intl/regress-1130489.js30
-rw-r--r--deps/v8/test/intl/regress-1132641.js8
-rw-r--r--deps/v8/test/intl/regress-9084.js10
-rw-r--r--deps/v8/test/js-perf-test/SuperIC.json364
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin-getter.js43
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin.js40
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/monomorphic-getter.js35
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers-getter.js57
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers.js55
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/monomorphic.js32
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-getter.js44
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers-getter.js63
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers.js59
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin.js41
-rw-r--r--deps/v8/test/js-perf-test/SuperIC/run.js24
-rw-r--r--deps/v8/test/message/mjsunit/fail/assert-in-promise-fail-recursive.out1
-rw-r--r--deps/v8/test/message/wasm-trace-memory-liftoff.js2
-rw-r--r--deps/v8/test/message/wasm-trace-memory.js2
-rw-r--r--deps/v8/test/mjsunit/BUILD.gn24
-rw-r--r--deps/v8/test/mjsunit/asm/regress-1069173.js18
-rw-r--r--deps/v8/test/mjsunit/call-lhs-web-compat-early-errors.js69
-rw-r--r--deps/v8/test/mjsunit/check-bounds-array-index.js1
-rw-r--r--deps/v8/test/mjsunit/check-bounds-string-from-char-code-at.js1
-rw-r--r--deps/v8/test/mjsunit/compiler/consecutive-addition.js30
-rw-r--r--deps/v8/test/mjsunit/compiler/native-context-specialization-hole-check.js2
-rw-r--r--deps/v8/test/mjsunit/compiler/regress-1126771.js45
-rw-r--r--deps/v8/test/mjsunit/compiler/regress-1127405.js18
-rw-r--r--deps/v8/test/mjsunit/compiler/serializer-dead-after-jump.js1
-rw-r--r--deps/v8/test/mjsunit/compiler/serializer-dead-after-return.js1
-rw-r--r--deps/v8/test/mjsunit/constant-folding-2.js1
-rw-r--r--deps/v8/test/mjsunit/destruct-array-spread-done.js26
-rw-r--r--deps/v8/test/mjsunit/ensure-growing-store-learns.js9
-rw-r--r--deps/v8/test/mjsunit/es6/object-assign.js17
-rw-r--r--deps/v8/test/mjsunit/es6/super-ic.js456
-rw-r--r--deps/v8/test/mjsunit/es6/unicode-regexp-ignore-case-noi18n.js26
-rw-r--r--deps/v8/test/mjsunit/es8/object-values.js6
-rw-r--r--deps/v8/test/mjsunit/harmony/modules-import-15-top-level-await.mjs2
-rw-r--r--deps/v8/test/mjsunit/harmony/modules-import-15.mjs2
-rw-r--r--deps/v8/test/mjsunit/harmony/to-string.js52
-rw-r--r--deps/v8/test/mjsunit/harmony/typedarray-set-length-detach.js19
-rw-r--r--deps/v8/test/mjsunit/math-floor-of-div-nosudiv.js1
-rw-r--r--deps/v8/test/mjsunit/math-floor-of-div.js2
-rw-r--r--deps/v8/test/mjsunit/mjsunit.status93
-rw-r--r--deps/v8/test/mjsunit/parallel-optimize-disabled.js54
-rw-r--r--deps/v8/test/mjsunit/random-bit-correlations.js6
-rw-r--r--deps/v8/test/mjsunit/regexp-backtrack-limit.js2
-rw-r--r--deps/v8/test/mjsunit/regexp-experimental.js98
-rw-r--r--deps/v8/test/mjsunit/regexp-tier-up-multiple.js1
-rw-r--r--deps/v8/test/mjsunit/regexp-tier-up.js1
-rw-r--r--deps/v8/test/mjsunit/regress-1120905.js30
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1034449.js1
-rw-r--r--deps/v8/test/mjsunit/regress/regress-10802.js12
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1112155.js32
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1123379.js16
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1125871.js25
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1132111.js23
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1143772.js71
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1156.js49
-rw-r--r--deps/v8/test/mjsunit/regress/regress-356053.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-411210.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-487981.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-6288.js4
-rw-r--r--deps/v8/test/mjsunit/regress/regress-740694.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-8265.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-863810.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-883059.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-9832.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-1027025.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-664506.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-882233-2.js2
-rw-r--r--deps/v8/test/mjsunit/regress/regress-v8-9656.js3
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-02256.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-02256b.js5
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-02862.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1014798.js6
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1026680.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1027410.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1054466.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1070078.js8
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1074586.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1075953.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1079449.js8
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-10831.js47
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-10898.js44
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1116019.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1125951.js20
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1137608.js46
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1140549.js25
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-666741.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-7508.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-7565.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-7579.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-763697.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-7785.js4
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-808848.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-819869.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-854050.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-864509.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-9017.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-905815.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-910824.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-917588.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-918284.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-918917.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-919308.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-922432.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-922670.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-922933.js2
-rw-r--r--deps/v8/test/mjsunit/sloppy-arguments-property-access.js67
-rw-r--r--deps/v8/test/mjsunit/string-case.js3
-rw-r--r--deps/v8/test/mjsunit/tools/codemap.mjs (renamed from deps/v8/test/mjsunit/tools/codemap.js)4
-rw-r--r--deps/v8/test/mjsunit/tools/consarray.mjs (renamed from deps/v8/test/mjsunit/tools/consarray.js)4
-rw-r--r--deps/v8/test/mjsunit/tools/csvparser.mjs (renamed from deps/v8/test/mjsunit/tools/csvparser.js)3
-rw-r--r--deps/v8/test/mjsunit/tools/dumpcpp.mjs (renamed from deps/v8/test/mjsunit/tools/dumpcpp.js)9
-rw-r--r--deps/v8/test/mjsunit/tools/foozzie.js5
-rw-r--r--deps/v8/test/mjsunit/tools/log.js25
-rw-r--r--deps/v8/test/mjsunit/tools/log_two_byte.js39
-rw-r--r--deps/v8/test/mjsunit/tools/profile.mjs (renamed from deps/v8/test/mjsunit/tools/profile.js)4
-rw-r--r--deps/v8/test/mjsunit/tools/profile_view.mjs (renamed from deps/v8/test/mjsunit/tools/profile_view.js)4
-rw-r--r--deps/v8/test/mjsunit/tools/profviz-test.default1566
-rw-r--r--deps/v8/test/mjsunit/tools/profviz-test.log2613
-rw-r--r--deps/v8/test/mjsunit/tools/profviz.js84
-rw-r--r--deps/v8/test/mjsunit/tools/splaytree.mjs (renamed from deps/v8/test/mjsunit/tools/splaytree.js)3
-rw-r--r--deps/v8/test/mjsunit/tools/tickprocessor.mjs (renamed from deps/v8/test/mjsunit/tools/tickprocessor.js)9
-rw-r--r--deps/v8/test/mjsunit/tools/timeline.mjs31
-rw-r--r--deps/v8/test/mjsunit/wasm/anyfunc.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/atomics.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/call-ref.js98
-rw-r--r--deps/v8/test/mjsunit/wasm/compare-exchange-stress.js8
-rw-r--r--deps/v8/test/mjsunit/wasm/compare-exchange64-stress.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/errors.js3
-rw-r--r--deps/v8/test/mjsunit/wasm/exceptions-externref.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/exceptions-rethrow.js6
-rw-r--r--deps/v8/test/mjsunit/wasm/exceptions-simd.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/exceptions.js8
-rw-r--r--deps/v8/test/mjsunit/wasm/externref-globals-liftoff.js8
-rw-r--r--deps/v8/test/mjsunit/wasm/externref-globals.js22
-rw-r--r--deps/v8/test/mjsunit/wasm/externref-liftoff.js8
-rw-r--r--deps/v8/test/mjsunit/wasm/externref.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/futex.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/generic-wrapper.js651
-rw-r--r--deps/v8/test/mjsunit/wasm/liftoff-simd-params.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/multi-value-simd.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/reference-globals.js105
-rw-r--r--deps/v8/test/mjsunit/wasm/reference-tables.js91
-rw-r--r--deps/v8/test/mjsunit/wasm/simd-errors.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/simd-globals.js14
-rw-r--r--deps/v8/test/mjsunit/wasm/test-wasm-module-builder.js11
-rw-r--r--deps/v8/test/mjsunit/wasm/tier-up-testing-flag.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/wasm-dynamic-tiering.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/wasm-module-builder.js171
-rw-r--r--deps/v8/test/test262/test262.status133
-rw-r--r--deps/v8/test/unittests/BUILD.gn45
-rw-r--r--deps/v8/test/unittests/api/isolate-unittest.cc2
-rw-r--r--deps/v8/test/unittests/compiler/branch-elimination-unittest.cc3
-rw-r--r--deps/v8/test/unittests/compiler/constant-folding-reducer-unittest.cc3
-rw-r--r--deps/v8/test/unittests/compiler/graph-reducer-unittest.cc22
-rw-r--r--deps/v8/test/unittests/compiler/js-call-reducer-unittest.cc4
-rw-r--r--deps/v8/test/unittests/compiler/js-create-lowering-unittest.cc3
-rw-r--r--deps/v8/test/unittests/compiler/js-intrinsic-lowering-unittest.cc3
-rw-r--r--deps/v8/test/unittests/compiler/js-typed-lowering-unittest.cc3
-rw-r--r--deps/v8/test/unittests/compiler/machine-operator-reducer-unittest.cc13
-rw-r--r--deps/v8/test/unittests/compiler/ppc/OWNERS6
-rw-r--r--deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc191
-rw-r--r--deps/v8/test/unittests/compiler/regalloc/register-allocator-unittest.cc56
-rw-r--r--deps/v8/test/unittests/compiler/simplified-operator-reducer-unittest.cc62
-rw-r--r--deps/v8/test/unittests/compiler/typed-optimization-unittest.cc3
-rw-r--r--deps/v8/test/unittests/heap/base/run-all-unittests.cc17
-rw-r--r--deps/v8/test/unittests/heap/base/worklist-unittest.cc311
-rw-r--r--deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc159
-rw-r--r--deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc2
-rw-r--r--deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc43
-rw-r--r--deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc39
-rw-r--r--deps/v8/test/unittests/heap/cppgc/incremental-marking-schedule-unittest.cc95
-rw-r--r--deps/v8/test/unittests/heap/cppgc/marker-unittest.cc173
-rw-r--r--deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc22
-rw-r--r--deps/v8/test/unittests/heap/cppgc/marking-visitor-unittest.cc4
-rw-r--r--deps/v8/test/unittests/heap/cppgc/member-unittest.cc35
-rw-r--r--deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc2
-rw-r--r--deps/v8/test/unittests/heap/cppgc/test-platform.cc85
-rw-r--r--deps/v8/test/unittests/heap/cppgc/test-platform.h66
-rw-r--r--deps/v8/test/unittests/heap/cppgc/worklist-unittest.cc346
-rw-r--r--deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc54
-rw-r--r--deps/v8/test/unittests/heap/heap-unittest.cc2
-rw-r--r--deps/v8/test/unittests/heap/index-generator-unittest.cc50
-rw-r--r--deps/v8/test/unittests/heap/object-start-bitmap-unittest.cc174
-rw-r--r--deps/v8/test/unittests/heap/safepoint-unittest.cc14
-rw-r--r--deps/v8/test/unittests/heap/unmapper-unittest.cc1
-rw-r--r--deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc1
-rw-r--r--deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc8
-rw-r--r--deps/v8/test/unittests/libplatform/default-job-unittest.cc76
-rw-r--r--deps/v8/test/unittests/wasm/control-transfer-unittest.cc106
-rw-r--r--deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc205
-rw-r--r--deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc8
-rw-r--r--deps/v8/test/unittests/wasm/module-decoder-memory64-unittest.cc80
-rw-r--r--deps/v8/test/unittests/wasm/module-decoder-unittest.cc877
-rw-r--r--deps/v8/test/unittests/wasm/subtyping-unittest.cc157
-rw-r--r--deps/v8/test/wasm-js/testcfg.py5
-rw-r--r--deps/v8/test/wasm-js/tests.tar.gz.sha12
-rw-r--r--deps/v8/test/wasm-js/wasm-js.status4
-rw-r--r--deps/v8/test/wasm-spec-tests/testcfg.py5
-rw-r--r--deps/v8/test/wasm-spec-tests/tests.tar.gz.sha12
-rw-r--r--deps/v8/test/wasm-spec-tests/wasm-spec-tests.status22
-rw-r--r--deps/v8/third_party/jinja2/OWNERS2
-rw-r--r--deps/v8/third_party/v8/builtins/array-sort.tq2
-rw-r--r--deps/v8/third_party/zlib/BUILD.gn26
-rw-r--r--deps/v8/third_party/zlib/DEPS3
-rw-r--r--deps/v8/third_party/zlib/deflate.c40
-rw-r--r--deps/v8/third_party/zlib/patches/0006-fix-check_match.patch42
-rwxr-xr-xdeps/v8/tools/android-sync.sh1
-rw-r--r--deps/v8/tools/arguments.mjs78
-rw-r--r--deps/v8/tools/clusterfuzz/v8_mock.js7
-rw-r--r--deps/v8/tools/codemap.mjs321
-rw-r--r--deps/v8/tools/consarray.mjs92
-rw-r--r--deps/v8/tools/csvparser.mjs105
-rw-r--r--deps/v8/tools/debug_helper/BUILD.gn11
-rw-r--r--deps/v8/tools/debug_helper/OWNERS1
-rw-r--r--deps/v8/tools/debug_helper/debug-helper-internal.cc2
-rw-r--r--deps/v8/tools/debug_helper/debug-helper-internal.h31
-rw-r--r--deps/v8/tools/debug_helper/debug-helper.h26
-rw-r--r--deps/v8/tools/debug_helper/get-object-properties.cc79
-rw-r--r--deps/v8/tools/debug_helper/list-object-classes.cc2
-rw-r--r--deps/v8/tools/dump-cpp.py6
-rw-r--r--deps/v8/tools/dumpcpp-driver.mjs (renamed from deps/v8/tools/dumpcpp-driver.js)6
-rw-r--r--deps/v8/tools/dumpcpp.mjs (renamed from deps/v8/tools/dumpcpp.js)11
-rw-r--r--deps/v8/tools/gcmole/gcmole-tools.tar.gz.sha12
-rw-r--r--deps/v8/tools/gcmole/gcmole.cc18
-rwxr-xr-xdeps/v8/tools/gcmole/run-gcmole.py2
-rw-r--r--deps/v8/tools/gen-postmortem-metadata.py3
-rw-r--r--deps/v8/tools/ic-explorer.html11
-rwxr-xr-xdeps/v8/tools/ic-processor8
-rw-r--r--deps/v8/tools/ic-processor-driver.mjs (renamed from deps/v8/tools/ic-processor-driver.js)3
-rw-r--r--deps/v8/tools/ic-processor.mjs (renamed from deps/v8/tools/ic-processor.js)10
-rwxr-xr-xdeps/v8/tools/linux-tick-processor7
-rw-r--r--deps/v8/tools/logreader.mjs248
-rwxr-xr-xdeps/v8/tools/map-processor8
-rw-r--r--deps/v8/tools/map-processor-driver.mjs (renamed from deps/v8/tools/map-processor-driver.js)5
-rw-r--r--deps/v8/tools/map-processor.html11
-rw-r--r--deps/v8/tools/map-processor.mjs (renamed from deps/v8/tools/map-processor.js)21
-rwxr-xr-xdeps/v8/tools/parse-processor7
-rw-r--r--deps/v8/tools/parse-processor-driver.mjs (renamed from deps/v8/tools/parse-processor-driver.js)5
-rw-r--r--deps/v8/tools/parse-processor.html28
-rw-r--r--deps/v8/tools/parse-processor.mjs (renamed from deps/v8/tools/parse-processor.js)12
-rwxr-xr-xdeps/v8/tools/plot-timer-events93
-rw-r--r--deps/v8/tools/profile.js321
-rw-r--r--deps/v8/tools/profile.mjs1175
-rw-r--r--deps/v8/tools/profile_view.mjs202
-rw-r--r--deps/v8/tools/profviz/composer.js557
-rw-r--r--deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js4658
-rw-r--r--deps/v8/tools/profviz/profviz.css138
-rw-r--r--deps/v8/tools/profviz/profviz.html158
-rw-r--r--deps/v8/tools/profviz/profviz.js286
-rw-r--r--deps/v8/tools/profviz/stdio.js56
-rw-r--r--deps/v8/tools/profviz/worker.js171
-rw-r--r--deps/v8/tools/sourcemap.mjs382
-rw-r--r--deps/v8/tools/splaytree.mjs327
-rw-r--r--deps/v8/tools/system-analyzer/app-model.mjs7
-rw-r--r--deps/v8/tools/system-analyzer/events.mjs15
-rw-r--r--deps/v8/tools/system-analyzer/helper.mjs28
-rw-r--r--deps/v8/tools/system-analyzer/ic-model.mjs8
-rw-r--r--deps/v8/tools/system-analyzer/ic-panel-template.html109
-rw-r--r--deps/v8/tools/system-analyzer/ic-panel.mjs62
-rw-r--r--deps/v8/tools/system-analyzer/ic-processor.mjs282
-rw-r--r--deps/v8/tools/system-analyzer/index.css16
-rw-r--r--deps/v8/tools/system-analyzer/index.html75
-rw-r--r--deps/v8/tools/system-analyzer/index.mjs100
-rw-r--r--deps/v8/tools/system-analyzer/log-file-reader-template.html42
-rw-r--r--deps/v8/tools/system-analyzer/log-file-reader.mjs127
-rw-r--r--deps/v8/tools/system-analyzer/log/ic.mjs60
-rw-r--r--deps/v8/tools/system-analyzer/log/log.mjs (renamed from deps/v8/tools/system-analyzer/event.mjs)7
-rw-r--r--deps/v8/tools/system-analyzer/log/map.mjs296
-rw-r--r--deps/v8/tools/system-analyzer/map-panel-template.html9
-rw-r--r--deps/v8/tools/system-analyzer/map-panel.mjs7
-rw-r--r--deps/v8/tools/system-analyzer/map-panel/map-details-template.html4
-rw-r--r--deps/v8/tools/system-analyzer/map-panel/map-details.mjs19
-rw-r--r--deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs4
-rw-r--r--deps/v8/tools/system-analyzer/map-processor.mjs538
-rw-r--r--deps/v8/tools/system-analyzer/processor.mjs347
-rw-r--r--deps/v8/tools/system-analyzer/source-panel-template.html52
-rw-r--r--deps/v8/tools/system-analyzer/source-panel.mjs189
-rw-r--r--deps/v8/tools/system-analyzer/stats-panel-template.html6
-rw-r--r--deps/v8/tools/system-analyzer/stats-panel.mjs5
-rw-r--r--deps/v8/tools/system-analyzer/timeline-panel-template.html72
-rw-r--r--deps/v8/tools/system-analyzer/timeline-panel.mjs141
-rw-r--r--deps/v8/tools/system-analyzer/timeline.mjs45
-rw-r--r--deps/v8/tools/system-analyzer/timeline/timeline-track-template.html57
-rw-r--r--deps/v8/tools/system-analyzer/timeline/timeline-track.mjs253
-rw-r--r--deps/v8/tools/testrunner/base_runner.py19
-rw-r--r--deps/v8/tools/testrunner/local/junit_output.py49
-rw-r--r--deps/v8/tools/testrunner/local/statusfile.py1
-rw-r--r--deps/v8/tools/testrunner/local/variants.py58
-rwxr-xr-xdeps/v8/tools/testrunner/num_fuzzer.py4
-rw-r--r--deps/v8/tools/testrunner/objects/testcase.py68
-rwxr-xr-xdeps/v8/tools/testrunner/standard_runner.py16
-rw-r--r--deps/v8/tools/testrunner/testproc/expectation.py9
-rw-r--r--deps/v8/tools/testrunner/testproc/progress.py44
-rw-r--r--deps/v8/tools/tick-processor.html32
-rw-r--r--deps/v8/tools/tickprocessor-driver.mjs88
-rw-r--r--deps/v8/tools/tickprocessor.mjs983
-rwxr-xr-xdeps/v8/tools/trace-maps-processor.py175
-rwxr-xr-xdeps/v8/tools/unittests/run_tests_test.py24
-rw-r--r--deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json1
-rw-r--r--deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json1
-rw-r--r--deps/v8/tools/v8heapconst.py312
-rw-r--r--deps/v8/tools/v8windbg/OWNERS1
-rw-r--r--deps/v8/tools/v8windbg/src/local-variables.cc12
-rw-r--r--deps/v8/tools/v8windbg/src/object-inspection.cc51
-rw-r--r--deps/v8/tools/v8windbg/src/object-inspection.h4
-rw-r--r--deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc59
-rw-r--r--deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h3
-rwxr-xr-xdeps/v8/tools/wasm/update-wasm-spec-tests.sh7
-rw-r--r--deps/v8/tools/whitespace.txt2
-rwxr-xr-xdeps/v8/tools/windows-tick-processor.bat2
-rw-r--r--deps/v8/tools/zone-stats/details-selection.js12
-rw-r--r--deps/v8/tools/zone-stats/global-timeline.js3
1094 files changed, 40456 insertions, 27853 deletions
diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS
index 32268da1cb..36abcfba77 100644
--- a/deps/v8/AUTHORS
+++ b/deps/v8/AUTHORS
@@ -25,6 +25,7 @@ Code Aurora Forum <*@codeaurora.org>
Home Jinni Inc. <*@homejinni.com>
IBM Inc. <*@*.ibm.com>
IBM Inc. <*@ibm.com>
+Red Hat Inc. <*@redhat.com>
Samsung <*@*.samsung.com>
Samsung <*@samsung.com>
Joyent, Inc <*@joyent.com>
@@ -40,6 +41,7 @@ Groupon <*@groupon.com>
Meteor Development Group <*@meteor.com>
Cloudflare, Inc. <*@cloudflare.com>
Julia Computing, Inc. <*@juliacomputing.com>
+CodeWeavers, Inc. <*@codeweavers.com>
Aaron Bieber <deftly@gmail.com>
Aaron O'Mullan <aaron.omullan@gmail.com>
@@ -75,6 +77,7 @@ Choongwoo Han <cwhan.tunz@gmail.com>
Chris Nardi <hichris123@gmail.com>
Christopher A. Taylor <chris@gameclosure.com>
Colin Ihrig <cjihrig@gmail.com>
+Cong Zuo <zckevinzc@gmail.com>
Daniel Andersson <kodandersson@gmail.com>
Daniel Bevenius <daniel.bevenius@gmail.com>
Daniel James <dnljms@gmail.com>
@@ -102,6 +105,7 @@ Henrique Ferreiro <henrique.ferreiro@gmail.com>
Hirofumi Mako <mkhrfm@gmail.com>
Honggyu Kim <honggyu.kp@gmail.com>
Huáng Jùnliàng <jlhwung@gmail.com>
+HyeockJin Kim <kherootz@gmail.com>
Iain Ireland <iireland@mozilla.com>
Ingvar Stepanyan <me@rreverser.com>
Ioseb Dzmanashvili <ioseb.dzmanashvili@gmail.com>
@@ -132,6 +136,7 @@ Loo Rong Jie <loorongjie@gmail.com>
Luis Reis <luis.m.reis@gmail.com>
Luke Zarko <lukezarko@gmail.com>
Maciej Małecki <me@mmalecki.com>
+Marcel Laverdet <marcel@laverdet.com>
Marcin Cieślak <saper@marcincieslak.com>
Marcin Wiącek <marcin@mwiacek.com>
Martin Bidlingmaier <martin.bidlingmaier@gmail.com>
@@ -219,3 +224,4 @@ Zeynep Cankara <zeynepcankara402@gmail.com>
Zhao Jiazhong <kyslie3100@gmail.com>
Zhongping Wang <kewpie.w.zp@gmail.com>
柳荣一 <admin@web-tinker.com>
+Tianping Yang <yangtianping@oppo.com>
diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn
index 219837ff45..94b598bc9a 100644
--- a/deps/v8/BUILD.gn
+++ b/deps/v8/BUILD.gn
@@ -109,8 +109,11 @@ declare_args() {
v8_enable_pointer_compression = ""
v8_enable_31bit_smis_on_64bit_arch = false
+ # Disable arguments adaptor frame (sets -dV8_NO_ARGUMENTS_ADAPTOR).
+ v8_disable_arguments_adaptor = false
+
# Reverse JS arguments order in the stack (sets -dV8_REVERSE_JSARGS).
- v8_enable_reverse_jsargs = false
+ v8_enable_reverse_jsargs = true
# Sets -dOBJECT_PRINT.
v8_enable_object_print = ""
@@ -183,9 +186,9 @@ declare_args() {
# Controls the threshold for on-heap/off-heap Typed Arrays.
v8_typed_array_max_size_in_heap = 64
- v8_enable_gdbjit =
- ((v8_current_cpu == "x86" || v8_current_cpu == "x64") &&
- (is_linux || is_mac)) || (v8_current_cpu == "ppc64" && is_linux)
+ v8_enable_gdbjit = ((v8_current_cpu == "x86" || v8_current_cpu == "x64") &&
+ (is_linux || is_chromeos || is_mac)) ||
+ (v8_current_cpu == "ppc64" && (is_linux || is_chromeos))
# Temporary flag to allow embedders to update their microtasks scopes
# while rolling in a new version of V8.
@@ -338,13 +341,24 @@ assert(v8_current_cpu == "arm64" || !v8_control_flow_integrity,
if (v8_enable_shared_ro_heap && v8_enable_pointer_compression) {
assert(
- is_linux || is_android,
+ is_linux || is_chromeos || is_android,
"Sharing read-only heap with pointer compression is only supported on Linux or Android")
}
+assert(!v8_use_multi_snapshots || !v8_control_flow_integrity,
+ "Control-flow integrity does not support multisnapshots")
+
+assert(
+ !v8_enable_pointer_compression || !v8_enable_shared_ro_heap,
+ "Pointer compression is not supported with shared read-only heap enabled")
+
assert(!v8_enable_heap_sandbox || v8_enable_pointer_compression,
"V8 Heap Sandbox requires pointer compression")
+assert(
+ !v8_disable_arguments_adaptor || v8_enable_reverse_jsargs,
+ "Disabling the arguments adaptor frame requires reversing the JS arguments stack")
+
assert(!v8_enable_unconditional_write_barriers || !v8_disable_write_barriers,
"Write barriers can't be both enabled and disabled")
@@ -361,6 +375,9 @@ if (v8_enable_single_generation == true) {
"Requires unconditional write barriers or none (which disables incremental marking)")
}
+assert(!v8_enable_conservative_stack_scanning || v8_enable_single_generation,
+ "Conservative stack scanning requires single generation")
+
v8_random_seed = "314159265"
v8_toolset_for_shell = "host"
@@ -369,7 +386,7 @@ v8_toolset_for_shell = "host"
#
config("internal_config_base") {
- # Only targets in this file and its subdirs can depend on this.
+ # Only targets in this file and its subdirs can depend on this.
visibility = [ "./*" ]
configs = [ ":v8_tracing_config" ]
@@ -383,6 +400,7 @@ config("internal_config_base") {
config("internal_config") {
defines = []
+
# Only targets in this file and its subdirs can depend on this.
visibility = [ "./*" ]
@@ -496,6 +514,9 @@ config("v8_header_features") {
if (v8_imminent_deprecation_warnings) {
defines += [ "V8_IMMINENT_DEPRECATION_WARNINGS" ]
}
+ if (v8_disable_arguments_adaptor) {
+ defines += [ "V8_NO_ARGUMENTS_ADAPTOR" ]
+ }
if (v8_enable_reverse_jsargs) {
defines += [ "V8_REVERSE_JSARGS" ]
}
@@ -581,6 +602,9 @@ config("features") {
if (v8_enable_single_generation) {
defines += [ "V8_ENABLE_SINGLE_GENERATION" ]
}
+ if (v8_enable_conservative_stack_scanning) {
+ defines += [ "V8_ENABLE_CONSERVATIVE_STACK_SCANNING" ]
+ }
if (v8_disable_write_barriers) {
defines += [ "V8_DISABLE_WRITE_BARRIERS" ]
}
@@ -836,7 +860,7 @@ config("toolchain") {
# TODO(jochen): Add support for compiling with simulators.
if (v8_enable_debugging_features) {
- if (is_linux && v8_enable_backtrace) {
+ if ((is_linux || is_chromeos) && v8_enable_backtrace) {
ldflags += [ "-rdynamic" ]
}
@@ -1014,7 +1038,7 @@ action("postmortem-metadata") {
# NOSORT
sources = [
- "$target_gen_dir/torque-generated/instance-types-tq.h",
+ "$target_gen_dir/torque-generated/instance-types.h",
"src/objects/allocation-site.h",
"src/objects/allocation-site-inl.h",
"src/objects/cell.h",
@@ -1038,6 +1062,7 @@ action("postmortem-metadata") {
"src/objects/js-array-buffer-inl.h",
"src/objects/js-array.h",
"src/objects/js-array-inl.h",
+ "src/objects/js-function-inl.h",
"src/objects/js-function.cc",
"src/objects/js-function.h",
"src/objects/js-objects.cc",
@@ -1107,6 +1132,7 @@ torque_files = [
"src/builtins/array-splice.tq",
"src/builtins/array-unshift.tq",
"src/builtins/array.tq",
+ "src/builtins/arraybuffer.tq",
"src/builtins/base.tq",
"src/builtins/bigint.tq",
"src/builtins/boolean.tq",
@@ -1277,9 +1303,9 @@ template("run_torque") {
action("run_torque" + suffix) {
visibility = [
":*",
+ "test/cctest/:*",
"tools/debug_helper/:*",
"tools/gcmole/:*",
- "test/cctest/:*",
]
deps = [ ":torque($toolchain)" ]
@@ -1291,35 +1317,37 @@ template("run_torque") {
destination_folder = "$target_gen_dir/torque-generated$suffix"
files = [
- "bit-fields-tq.h",
- "builtin-definitions-tq.h",
- "interface-descriptors-tq.inc",
- "factory-tq.cc",
- "factory-tq.inc",
- "field-offsets-tq.h",
- "class-verifiers-tq.cc",
- "class-verifiers-tq.h",
- "enum-verifiers-tq.cc",
- "objects-printer-tq.cc",
- "objects-body-descriptors-tq-inl.inc",
- "class-definitions-tq.cc",
- "class-definitions-tq-inl.h",
- "class-definitions-tq.h",
- "class-debug-readers-tq.cc",
- "class-debug-readers-tq.h",
- "exported-macros-assembler-tq.cc",
- "exported-macros-assembler-tq.h",
- "csa-types-tq.h",
- "instance-types-tq.h",
- "internal-class-definitions-tq.h",
- "internal-class-definitions-tq-inl.h",
- "exported-class-definitions-tq.h",
- "exported-class-definitions-tq-inl.h",
+ "$target_gen_dir/torque-generated/bit-fields.h",
+ "$target_gen_dir/torque-generated/builtin-definitions.h",
+ "$target_gen_dir/torque-generated/interface-descriptors.inc",
+ "$target_gen_dir/torque-generated/factory.cc",
+ "$target_gen_dir/torque-generated/factory.inc",
+ "$target_gen_dir/torque-generated/field-offsets.h",
+ "$target_gen_dir/torque-generated/class-verifiers.cc",
+ "$target_gen_dir/torque-generated/class-verifiers.h",
+ "$target_gen_dir/torque-generated/enum-verifiers.cc",
+ "$target_gen_dir/torque-generated/objects-printer.cc",
+ "$target_gen_dir/torque-generated/objects-body-descriptors-inl.inc",
+ "$target_gen_dir/torque-generated/class-definitions.cc",
+ "$target_gen_dir/torque-generated/class-definitions-inl.h",
+ "$target_gen_dir/torque-generated/class-definitions.h",
+ "$target_gen_dir/torque-generated/class-debug-readers.cc",
+ "$target_gen_dir/torque-generated/class-debug-readers.h",
+ "$target_gen_dir/torque-generated/exported-macros-assembler.cc",
+ "$target_gen_dir/torque-generated/exported-macros-assembler.h",
+ "$target_gen_dir/torque-generated/csa-types.h",
+ "$target_gen_dir/torque-generated/instance-types.h",
+ "$target_gen_dir/torque-generated/internal-class-definitions.h",
+ "$target_gen_dir/torque-generated/internal-class-definitions-inl.h",
+ "$target_gen_dir/torque-generated/exported-class-definitions.h",
+ "$target_gen_dir/torque-generated/exported-class-definitions-inl.h",
]
outputs = []
foreach(file, files) {
- outputs += [ "$destination_folder/$file" ]
+ outputs += [ string_replace(file,
+ "$target_gen_dir/torque-generated",
+ destination_folder) ]
}
foreach(file, torque_files) {
@@ -1395,10 +1423,10 @@ v8_source_set("torque_generated_initializers") {
public_deps = [ ":v8_maybe_icu" ]
sources = [
- "$target_gen_dir/torque-generated/csa-types-tq.h",
- "$target_gen_dir/torque-generated/enum-verifiers-tq.cc",
- "$target_gen_dir/torque-generated/exported-macros-assembler-tq.cc",
- "$target_gen_dir/torque-generated/exported-macros-assembler-tq.h",
+ "$target_gen_dir/torque-generated/csa-types.h",
+ "$target_gen_dir/torque-generated/enum-verifiers.cc",
+ "$target_gen_dir/torque-generated/exported-macros-assembler.cc",
+ "$target_gen_dir/torque-generated/exported-macros-assembler.h",
"src/torque/runtime-support.h",
]
foreach(file, torque_files) {
@@ -1424,11 +1452,11 @@ v8_source_set("torque_generated_definitions") {
public_deps = [ ":v8_maybe_icu" ]
sources = [
- "$target_gen_dir/torque-generated/class-definitions-tq.cc",
- "$target_gen_dir/torque-generated/class-verifiers-tq.cc",
- "$target_gen_dir/torque-generated/class-verifiers-tq.h",
- "$target_gen_dir/torque-generated/factory-tq.cc",
- "$target_gen_dir/torque-generated/objects-printer-tq.cc",
+ "$target_gen_dir/torque-generated/class-definitions.cc",
+ "$target_gen_dir/torque-generated/class-verifiers.cc",
+ "$target_gen_dir/torque-generated/class-verifiers.h",
+ "$target_gen_dir/torque-generated/factory.cc",
+ "$target_gen_dir/torque-generated/objects-printer.cc",
]
configs = [ ":internal_config" ]
@@ -1467,7 +1495,11 @@ template("run_mksnapshot") {
suffix = "_$name"
}
action("run_mksnapshot_" + name) {
- visibility = [ ":*" ] # Only targets in this file can depend on this.
+ # Only targets in this file and running mkgrokdump can depend on this.
+ visibility = [
+ ":*",
+ "tools/debug_helper:run_mkgrokdump",
+ ]
deps = [ ":mksnapshot($v8_snapshot_toolchain)" ]
@@ -1633,12 +1665,13 @@ action("v8_dump_build_config") {
"is_ubsan_vptr=$is_ubsan_vptr",
"target_cpu=\"$target_cpu\"",
"v8_current_cpu=\"$v8_current_cpu\"",
+ "v8_enable_concurrent_marking=$v8_enable_concurrent_marking",
"v8_enable_i18n_support=$v8_enable_i18n_support",
"v8_enable_verify_predictable=$v8_enable_verify_predictable",
- "v8_target_cpu=\"$v8_target_cpu\"",
"v8_enable_verify_csa=$v8_enable_verify_csa",
"v8_enable_lite_mode=$v8_enable_lite_mode",
"v8_enable_pointer_compression=$v8_enable_pointer_compression",
+ "v8_target_cpu=\"$v8_target_cpu\"",
]
if (v8_current_cpu == "mips" || v8_current_cpu == "mipsel" ||
@@ -1668,6 +1701,9 @@ v8_source_set("v8_snapshot") {
public = []
sources = [ "src/init/setup-isolate-deserialize.cc" ]
+ if (v8_control_flow_integrity) {
+ sources += [ "src/deoptimizer/deoptimizer-cfi-builtins.cc" ]
+ }
if (emit_builtins_as_inline_asm) {
deps += [ ":asm_to_inline_asm_default" ]
sources += [ "$target_gen_dir/embedded.cc" ]
@@ -1935,8 +1971,6 @@ v8_compiler_sources = [
"src/compiler/backend/instruction.h",
"src/compiler/backend/jump-threading.cc",
"src/compiler/backend/jump-threading.h",
- "src/compiler/backend/live-range-separator.cc",
- "src/compiler/backend/live-range-separator.h",
"src/compiler/backend/mid-tier-register-allocator.cc",
"src/compiler/backend/mid-tier-register-allocator.h",
"src/compiler/backend/move-optimizer.cc",
@@ -2274,7 +2308,6 @@ v8_source_set("v8_base_without_compiler") {
"src/builtins/builtins-arraybuffer.cc",
"src/builtins/builtins-async-module.cc",
"src/builtins/builtins-bigint.cc",
- "src/builtins/builtins-call.cc",
"src/builtins/builtins-callsite.cc",
"src/builtins/builtins-collections.cc",
"src/builtins/builtins-console.cc",
@@ -2562,6 +2595,8 @@ v8_source_set("v8_base_without_compiler") {
"src/heap/incremental-marking-job.h",
"src/heap/incremental-marking.cc",
"src/heap/incremental-marking.h",
+ "src/heap/index-generator.cc",
+ "src/heap/index-generator.h",
"src/heap/invalidated-slots-inl.h",
"src/heap/invalidated-slots.cc",
"src/heap/invalidated-slots.h",
@@ -2839,6 +2874,7 @@ v8_source_set("v8_base_without_compiler") {
"src/objects/js-display-names-inl.h",
"src/objects/js-display-names.cc",
"src/objects/js-display-names.h",
+ "src/objects/js-function-inl.h",
"src/objects/js-function.cc",
"src/objects/js-function.h",
"src/objects/js-generator-inl.h",
@@ -3042,6 +3078,8 @@ v8_source_set("v8_base_without_compiler") {
"src/profiler/profile-generator.h",
"src/profiler/profiler-listener.cc",
"src/profiler/profiler-listener.h",
+ "src/profiler/profiler-stats.cc",
+ "src/profiler/profiler-stats.h",
"src/profiler/sampling-heap-profiler.cc",
"src/profiler/sampling-heap-profiler.h",
"src/profiler/strings-storage.cc",
@@ -3050,6 +3088,12 @@ v8_source_set("v8_base_without_compiler") {
"src/profiler/tick-sample.h",
"src/profiler/tracing-cpu-profiler.cc",
"src/profiler/tracing-cpu-profiler.h",
+ "src/regexp/experimental/experimental-bytecode.cc",
+ "src/regexp/experimental/experimental-bytecode.h",
+ "src/regexp/experimental/experimental-compiler.cc",
+ "src/regexp/experimental/experimental-compiler.h",
+ "src/regexp/experimental/experimental-interpreter.cc",
+ "src/regexp/experimental/experimental-interpreter.h",
"src/regexp/experimental/experimental.cc",
"src/regexp/experimental/experimental.h",
"src/regexp/property-sequences.cc",
@@ -3340,6 +3384,14 @@ v8_source_set("v8_base_without_compiler") {
sources += [ "src/heap/third-party/heap-api-stub.cc" ]
}
+ if (v8_enable_conservative_stack_scanning) {
+ sources += [
+ "src/heap/conservative-stack-visitor.cc",
+ "src/heap/conservative-stack-visitor.h",
+ "src/heap/object-start-bitmap.h",
+ ]
+ }
+
if (v8_enable_wasm_gdb_remote_debugging) {
sources += [
"src/debug/wasm/gdb-server/gdb-remote-util.cc",
@@ -3426,7 +3478,7 @@ v8_source_set("v8_base_without_compiler") {
# iOS Xcode simulator builds run on an x64 target. iOS and macOS are both
# based on Darwin and thus POSIX-compliant to a similar degree.
- if (is_linux || is_mac || is_ios || target_os == "freebsd") {
+ if (is_linux || is_chromeos || is_mac || is_ios || target_os == "freebsd") {
sources += [
"src/trap-handler/handler-inside-posix.cc",
"src/trap-handler/handler-inside-posix.h",
@@ -3678,6 +3730,7 @@ v8_source_set("v8_base_without_compiler") {
deps = [
":cppgc_base",
":torque_generated_definitions",
+ ":v8_cppgc_shared",
":v8_headers",
":v8_libbase",
":v8_libsampler",
@@ -3770,7 +3823,7 @@ v8_source_set("v8_base_without_compiler") {
libs += [ "atomic" ]
}
- if (v8_enable_vtunetracemark && (is_linux || is_win)) {
+ if (v8_enable_vtunetracemark && (is_linux || is_chromeos || is_win)) {
sources += [
"src/extensions/vtunedomain-support-extension.cc",
"src/extensions/vtunedomain-support-extension.h",
@@ -4015,7 +4068,7 @@ v8_component("v8_libbase") {
}
}
- if (is_linux) {
+ if (is_linux || is_chromeos) {
sources += [
"src/base/debug/stack_trace_posix.cc",
"src/base/platform/platform-linux.cc",
@@ -4206,6 +4259,8 @@ v8_source_set("v8_cppgc_shared") {
sources = [
"src/heap/base/stack.cc",
"src/heap/base/stack.h",
+ "src/heap/base/worklist.cc",
+ "src/heap/base/worklist.h",
]
if (is_clang || !is_win) {
@@ -4273,6 +4328,7 @@ v8_source_set("cppgc_base") {
"include/cppgc/visitor.h",
"include/v8config.h",
"src/heap/cppgc/allocation.cc",
+ "src/heap/cppgc/default-job.h",
"src/heap/cppgc/default-platform.cc",
"src/heap/cppgc/free-list.cc",
"src/heap/cppgc/free-list.h",
@@ -4295,11 +4351,14 @@ v8_source_set("cppgc_base") {
"src/heap/cppgc/heap-visitor.h",
"src/heap/cppgc/heap.cc",
"src/heap/cppgc/heap.h",
+ "src/heap/cppgc/incremental-marking-schedule.cc",
+ "src/heap/cppgc/incremental-marking-schedule.h",
"src/heap/cppgc/liveness-broker.cc",
"src/heap/cppgc/liveness-broker.h",
"src/heap/cppgc/logging.cc",
"src/heap/cppgc/marker.cc",
"src/heap/cppgc/marker.h",
+ "src/heap/cppgc/marking-state.cc",
"src/heap/cppgc/marking-state.h",
"src/heap/cppgc/marking-verifier.cc",
"src/heap/cppgc/marking-verifier.h",
@@ -4331,7 +4390,6 @@ v8_source_set("cppgc_base") {
"src/heap/cppgc/virtual-memory.cc",
"src/heap/cppgc/virtual-memory.h",
"src/heap/cppgc/visitor.cc",
- "src/heap/cppgc/worklist.h",
"src/heap/cppgc/write-barrier.cc",
]
@@ -4450,6 +4508,10 @@ if (current_toolchain == v8_snapshot_toolchain) {
"src/snapshot/snapshot-empty.cc",
]
+ if (v8_control_flow_integrity) {
+ sources += [ "src/deoptimizer/deoptimizer-cfi-empty.cc" ]
+ }
+
configs = [ ":internal_config" ]
deps = [
@@ -4710,6 +4772,15 @@ if (is_component_build) {
configs = [ ":internal_config" ]
public_configs = [ ":external_config" ]
}
+
+ v8_component("v8_cppgc_shared_for_testing") {
+ testonly = true
+
+ public_deps = [ ":v8_cppgc_shared" ]
+
+ configs = [ ":internal_config" ]
+ public_configs = [ ":external_config" ]
+ }
} else {
group("v8") {
public_deps = [
@@ -4747,6 +4818,14 @@ if (is_component_build) {
public_configs = [ ":external_config" ]
}
+
+ group("v8_cppgc_shared_for_testing") {
+ testonly = true
+
+ public_deps = [ ":v8_cppgc_shared" ]
+
+ public_configs = [ ":external_config" ]
+ }
}
v8_executable("d8") {
diff --git a/deps/v8/COMMON_OWNERS b/deps/v8/COMMON_OWNERS
index bfd539fb42..74026eaeff 100644
--- a/deps/v8/COMMON_OWNERS
+++ b/deps/v8/COMMON_OWNERS
@@ -37,6 +37,7 @@ szuend@chromium.org
tebbi@chromium.org
thibaudm@chromium.org
ulan@chromium.org
+vahl@chromium.org
verwaest@chromium.org
victorgomes@chromium.org
yangguo@chromium.org
diff --git a/deps/v8/DEPS b/deps/v8/DEPS
index 7726a6973e..6bddd2cc9f 100644
--- a/deps/v8/DEPS
+++ b/deps/v8/DEPS
@@ -41,10 +41,10 @@ vars = {
'mac_xcode_version': 'default',
# GN CIPD package version.
- 'gn_version': 'git_revision:e327ffdc503815916db2543ec000226a8df45163',
+ 'gn_version': 'git_revision:e002e68a48d1c82648eadde2f6aafa20d08c36f2',
# luci-go CIPD package version.
- 'luci_go': 'git_revision:b022173f8069cf8001d4cf2a87ce7c5f0eae220f',
+ 'luci_go': 'git_revision:83c3df996b224edf5061840744395707a0e513e7',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling android_sdk_build-tools_version
@@ -82,15 +82,15 @@ vars = {
deps = {
'build':
- Var('chromium_url') + '/chromium/src/build.git' + '@' + '78b2991b0494c775e437770def455fe40061038f',
+ Var('chromium_url') + '/chromium/src/build.git' + '@' + '38a49c12ded01dd8c4628b432cb7eebfb29e77f1',
'third_party/depot_tools':
- Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '5cff4e3b5cf3116071761cbca363d416b413a064',
+ Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '1099c11d5d12255458303c1ba4e5584cfde90477',
'third_party/icu':
- Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '79326efe26e5440f530963704c3c0ff965b3a4ac',
+ Var('chromium_url') + '/chromium/deps/icu.git' + '@' + 'aef20f06d47ba76fdf13abcdb033e2a408b5a94d',
'third_party/instrumented_libraries':
Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + '3c52ccdd3b9edf8fb7b3bd8ba945cce47d887ea8',
'buildtools':
- Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + 'b00ad0af636401e5eb4b5d0ab01b65164dca1914',
+ Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '3ff4f5027b4b81a6c9c36d64d71444f2709a4896',
'buildtools/clang_format/script':
Var('chromium_url') + '/chromium/llvm-project/cfe/tools/clang-format.git' + '@' + '96636aa0e9f047f17447f2d45a094d0b59ed7917',
'buildtools/linux64': {
@@ -178,7 +178,7 @@ deps = {
'dep_type': 'cipd',
},
'third_party/catapult': {
- 'url': Var('chromium_url') + '/catapult.git' + '@' + 'abfdfbb6683802d3a46ed515246573729ea147ff',
+ 'url': Var('chromium_url') + '/catapult.git' + '@' + '18d69fb4e7b2225974dfc306ca0c11a58fe4e917',
'condition': 'checkout_android',
},
'third_party/colorama/src': {
@@ -196,17 +196,17 @@ deps = {
'condition': 'checkout_google_benchmark',
},
'third_party/jinja2':
- Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + '61cfe2ac6c9108534c43b4039a95a0980251f266',
+ Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + 'a82a4944a7f2496639f34a89c9923be5908b80aa',
'third_party/markupsafe':
Var('chromium_url') + '/chromium/src/third_party/markupsafe.git' + '@' + 'f2fb0f21ef1e1d4ffd43be8c63fc3d4928dea7ab',
'tools/swarming_client':
- Var('chromium_url') + '/infra/luci/client-py.git' + '@' + '4c095d04179dc725a300085ae21fe3b79900d072',
+ Var('chromium_url') + '/infra/luci/client-py.git' + '@' + '44c13d73156581ea09b9389001e58c23a4b8d70a',
'test/benchmarks/data':
Var('chromium_url') + '/v8/deps/third_party/benchmarks.git' + '@' + '05d7188267b4560491ff9155c5ee13e207ecd65f',
'test/mozilla/data':
Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be',
'test/test262/data':
- Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + 'e73054f75e08e329e73e0f77bf92503ad5b83d0f',
+ Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '63976020376c8c2b0ebabf37c364f25288d4b93b',
'test/test262/harness':
Var('chromium_url') + '/external/github.com/test262-utils/test262-harness-py.git' + '@' + '4555345a943d0c99a9461182705543fb171dda4b',
'third_party/qemu-linux-x64': {
@@ -233,7 +233,7 @@ deps = {
'packages': [
{
'package': 'fuchsia/third_party/aemu/linux-amd64',
- 'version': 'cG1zzefbD24rFmPDujqP0rrEG0uXUhH8axBOrD619hoC'
+ 'version': 'FfxmX7LQ9OID3pVAmcemr6u9lK3xjXzAXxvqzEcclMwC'
},
],
'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -250,7 +250,7 @@ deps = {
'dep_type': 'cipd',
},
'tools/clang':
- Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '299e8a233942b1978a4c0dbc301f363a6729c4e2',
+ Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '3017edade60658a699be776d9e282509a902ffe9',
'tools/luci-go': {
'packages': [
{
@@ -284,15 +284,19 @@ deps = {
'third_party/protobuf':
Var('chromium_url') + '/external/github.com/google/protobuf'+ '@' + 'b68a347f56137b4b1a746e8c7438495a6ac1bd91',
'third_party/zlib':
- Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'd53accfbd0382a98ad7378045631866449b5f92e',
+ Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '4668feaaa47973a6f9d9f9caeb14cd03731854f1',
'third_party/jsoncpp/source':
- Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '645250b6690785be60ab6780ce4b58698d884d11',
+ Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '9059f5cad030ba11d37818847443a53918c327b1',
'third_party/ittapi': {
# Force checkout ittapi libraries to pass v8 header includes check on
# bots that has check_v8_header_includes enabled.
'url': Var('chromium_url') + '/external/github.com/intel/ittapi' + '@' + 'b4ae0122ba749163096058b4f1bb065bf4a7de94',
'condition': "checkout_ittapi or check_v8_header_includes",
},
+ 'third_party/requests': {
+ 'url': Var('chromium_url') + '/external/github.com/kennethreitz/requests.git' + '@' + 'bfb93d4b7d269a8735f1b216093e7e9a9fdc4517',
+ 'condition': 'checkout_android',
+ },
}
include_rules = [
diff --git a/deps/v8/LICENSE.valgrind b/deps/v8/LICENSE.valgrind
deleted file mode 100644
index fd8ebaf509..0000000000
--- a/deps/v8/LICENSE.valgrind
+++ /dev/null
@@ -1,45 +0,0 @@
-----------------------------------------------------------------
-
-Notice that the following BSD-style license applies to this one
-file (valgrind.h) only. The rest of Valgrind is licensed under the
-terms of the GNU General Public License, version 2, unless
-otherwise indicated. See the COPYING file in the source
-distribution for details.
-
-----------------------------------------------------------------
-
-This file is part of Valgrind, a dynamic binary instrumentation
-framework.
-
-Copyright (C) 2000-2007 Julian Seward. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. The origin of this software must not be misrepresented; you must
- not claim that you wrote the original software. If you use this
- software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
-
-3. Altered source versions must be plainly marked as such, and must
- not be misrepresented as being the original software.
-
-4. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/deps/v8/PPC_OWNERS b/deps/v8/PPC_OWNERS
index 6d1a8fc472..6edd45a6ef 100644
--- a/deps/v8/PPC_OWNERS
+++ b/deps/v8/PPC_OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com \ No newline at end of file
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/S390_OWNERS b/deps/v8/S390_OWNERS
index 6d1a8fc472..6edd45a6ef 100644
--- a/deps/v8/S390_OWNERS
+++ b/deps/v8/S390_OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com \ No newline at end of file
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/gni/v8.gni b/deps/v8/gni/v8.gni
index 413b0d3810..edc944ef0c 100644
--- a/deps/v8/gni/v8.gni
+++ b/deps/v8/gni/v8.gni
@@ -67,6 +67,9 @@ declare_args() {
# Add fuzzilli fuzzer support.
v8_fuzzilli = false
+ # Scan the call stack conservatively during garbage collection.
+ v8_enable_conservative_stack_scanning = false
+
v8_enable_google_benchmark = checkout_google_benchmark
}
@@ -218,7 +221,7 @@ template("v8_executable") {
configs -= invoker.remove_configs
}
configs += invoker.configs
- if (is_linux) {
+ if (is_linux || is_chromeos) {
# For enabling ASLR.
ldflags = [ "-pie" ]
}
diff --git a/deps/v8/include/cppgc/OWNERS b/deps/v8/include/cppgc/OWNERS
new file mode 100644
index 0000000000..6ccabf60b1
--- /dev/null
+++ b/deps/v8/include/cppgc/OWNERS
@@ -0,0 +1,2 @@
+bikineev@chromium.org
+omerkatz@chromium.org \ No newline at end of file
diff --git a/deps/v8/include/cppgc/default-platform.h b/deps/v8/include/cppgc/default-platform.h
index 24b1cd1498..da8129a81b 100644
--- a/deps/v8/include/cppgc/default-platform.h
+++ b/deps/v8/include/cppgc/default-platform.h
@@ -6,7 +6,6 @@
#define INCLUDE_CPPGC_DEFAULT_PLATFORM_H_
#include <memory>
-#include <thread> // NOLINT(build/c++11)
#include <vector>
#include "cppgc/platform.h"
@@ -14,6 +13,10 @@
namespace cppgc {
+namespace internal {
+class DefaultJob;
+} // namespace internal
+
/**
* Default task runner implementation. Keep posted tasks in a list that can be
* processed by calling RunSingleTask() or RunUntilIdle().
@@ -26,8 +29,11 @@ class V8_EXPORT DefaultTaskRunner final : public cppgc::TaskRunner {
DefaultTaskRunner& operator=(const DefaultTaskRunner&) = delete;
void PostTask(std::unique_ptr<cppgc::Task> task) override;
- void PostNonNestableTask(std::unique_ptr<cppgc::Task> task) override;
void PostDelayedTask(std::unique_ptr<cppgc::Task> task, double) override;
+
+ bool NonNestableTasksEnabled() const final { return false; }
+ bool NonNestableDelayedTasksEnabled() const final { return false; }
+ void PostNonNestableTask(std::unique_ptr<cppgc::Task> task) override;
void PostNonNestableDelayedTask(std::unique_ptr<cppgc::Task> task,
double) override;
@@ -58,6 +64,8 @@ class V8_EXPORT DefaultPlatform final : public Platform {
std::shared_ptr<cppgc::TaskRunner> GetForegroundTaskRunner() final;
+ // DefaultPlatform does not support job priorities. All jobs would be
+ // assigned the same priority regardless of the cppgc::TaskPriority parameter.
std::unique_ptr<cppgc::JobHandle> PostJob(
cppgc::TaskPriority priority,
std::unique_ptr<cppgc::JobTask> job_task) final;
@@ -68,7 +76,7 @@ class V8_EXPORT DefaultPlatform final : public Platform {
private:
std::unique_ptr<PageAllocator> page_allocator_;
std::shared_ptr<DefaultTaskRunner> foreground_task_runner_;
- std::vector<std::shared_ptr<std::thread>> job_threads_;
+ std::vector<std::shared_ptr<internal::DefaultJob>> jobs_;
};
} // namespace cppgc
diff --git a/deps/v8/include/cppgc/heap.h b/deps/v8/include/cppgc/heap.h
index ca0dbeca7f..029158f4a5 100644
--- a/deps/v8/include/cppgc/heap.h
+++ b/deps/v8/include/cppgc/heap.h
@@ -84,7 +84,7 @@ class V8_EXPORT Heap {
std::vector<std::unique_ptr<CustomSpaceBase>> custom_spaces;
/**
- * Specifies whether conserative stack scan is supported. When conservative
+ * Specifies whether conservative stack scan is supported. When conservative
* stack scan is not supported, the collector may try to invoke
* garbage collections using non-nestable task, which are guaranteed to have
* no interesting stack, through the provided Platform. If such tasks are
diff --git a/deps/v8/include/cppgc/internal/prefinalizer-handler.h b/deps/v8/include/cppgc/internal/prefinalizer-handler.h
index ea0eca02a0..64b07ec911 100644
--- a/deps/v8/include/cppgc/internal/prefinalizer-handler.h
+++ b/deps/v8/include/cppgc/internal/prefinalizer-handler.h
@@ -18,7 +18,7 @@ class V8_EXPORT PreFinalizerRegistrationDispatcher final {
void* object;
PreFinalizerCallback callback;
- bool operator==(const PreFinalizer& other);
+ bool operator==(const PreFinalizer& other) const;
};
static void RegisterPrefinalizer(PreFinalizer pre_finalizer);
diff --git a/deps/v8/include/cppgc/member.h b/deps/v8/include/cppgc/member.h
index 22c1adc0af..116a2c7e54 100644
--- a/deps/v8/include/cppgc/member.h
+++ b/deps/v8/include/cppgc/member.h
@@ -58,6 +58,7 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
this->CheckPointer(Get());
}
BasicMember(T& raw) : BasicMember(&raw) {} // NOLINT
+ // Copy ctor.
BasicMember(const BasicMember& other) : BasicMember(other.Get()) {}
// Allow heterogeneous construction.
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
@@ -67,6 +68,20 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
OtherCheckingPolicy>& other)
: BasicMember(other.Get()) {}
+ // Move ctor.
+ BasicMember(BasicMember&& other) noexcept : BasicMember(other.Get()) {
+ other.Clear();
+ }
+ // Allow heterogeneous move construction.
+ template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
+ typename OtherCheckingPolicy,
+ typename = std::enable_if_t<std::is_base_of<T, U>::value>>
+ BasicMember( // NOLINT
+ BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
+ OtherCheckingPolicy>&& other) noexcept
+ : BasicMember(other.Get()) {
+ other.Clear();
+ }
// Construction from Persistent.
template <typename U, typename PersistentWeaknessPolicy,
typename PersistentLocationPolicy,
@@ -78,10 +93,11 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
p)
: BasicMember(p.Get()) {}
+ // Copy assignment.
BasicMember& operator=(const BasicMember& other) {
return operator=(other.Get());
}
- // Allow heterogeneous assignment.
+ // Allow heterogeneous copy assignment.
template <typename U, typename OtherWeaknessTag, typename OtherBarrierPolicy,
typename OtherCheckingPolicy,
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
@@ -90,6 +106,22 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
OtherCheckingPolicy>& other) {
return operator=(other.Get());
}
+ // Move assignment.
+ BasicMember& operator=(BasicMember&& other) noexcept {
+ operator=(other.Get());
+ other.Clear();
+ return *this;
+ }
+ // Heterogeneous move assignment.
+ template <typename U, typename OtherWeaknessTag, typename OtherBarrierPolicy,
+ typename OtherCheckingPolicy,
+ typename = std::enable_if_t<std::is_base_of<T, U>::value>>
+ BasicMember& operator=(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
+ OtherCheckingPolicy>&& other) noexcept {
+ operator=(other.Get());
+ other.Clear();
+ return *this;
+ }
// Assignment from Persistent.
template <typename U, typename PersistentWeaknessPolicy,
typename PersistentLocationPolicy,
diff --git a/deps/v8/include/js_protocol.pdl b/deps/v8/include/js_protocol.pdl
index 24a957f7fb..4c1b567404 100644
--- a/deps/v8/include/js_protocol.pdl
+++ b/deps/v8/include/js_protocol.pdl
@@ -863,6 +863,16 @@ domain Profiler
# Counter value.
integer value
+ # Runtime call counter information.
+ experimental type RuntimeCallCounterInfo extends object
+ properties
+ # Counter name.
+ string name
+ # Counter value.
+ number value
+ # Counter time in seconds.
+ number time
+
command disable
command enable
@@ -927,6 +937,18 @@ domain Profiler
# Type profile for all scripts since startTypeProfile() was turned on.
array of ScriptTypeProfile result
+ # Enable counters collection.
+ experimental command enableCounters
+
+ # Disable counters collection.
+ experimental command disableCounters
+
+ # Retrieve counters.
+ experimental command getCounters
+ returns
+ # Collected counters information.
+ array of CounterInfo result
+
# Enable run time call stats collection.
experimental command enableRuntimeCallStats
@@ -936,8 +958,8 @@ domain Profiler
# Retrieve run time call stats.
experimental command getRuntimeCallStats
returns
- # Collected counter information.
- array of CounterInfo result
+ # Collected runtime call counter information.
+ array of RuntimeCallCounterInfo result
event consoleProfileFinished
parameters
diff --git a/deps/v8/include/v8-internal.h b/deps/v8/include/v8-internal.h
index fcc36595ba..0d9cce82b4 100644
--- a/deps/v8/include/v8-internal.h
+++ b/deps/v8/include/v8-internal.h
@@ -414,7 +414,8 @@ void CastCheck<false>::Perform(T* data) {}
template <class T>
V8_INLINE void PerformCastCheck(T* data) {
- CastCheck<std::is_base_of<Data, T>::value>::Perform(data);
+ CastCheck<std::is_base_of<Data, T>::value &&
+ !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
}
// A base class for backing stores, which is needed due to vagaries of
diff --git a/deps/v8/include/v8-metrics.h b/deps/v8/include/v8-metrics.h
index a511c01e5a..9734ac1b36 100644
--- a/deps/v8/include/v8-metrics.h
+++ b/deps/v8/include/v8-metrics.h
@@ -16,7 +16,7 @@ struct WasmModuleDecoded {
bool success = false;
size_t module_size_in_bytes = 0;
size_t function_count = 0;
- int64_t wall_clock_time_in_us = 0;
+ int64_t wall_clock_time_in_us = -1;
};
struct WasmModuleCompiled {
@@ -28,20 +28,20 @@ struct WasmModuleCompiled {
bool success = false;
size_t code_size_in_bytes = 0;
size_t liftoff_bailout_count = 0;
- int64_t wall_clock_time_in_us = 0;
+ int64_t wall_clock_time_in_us = -1;
};
struct WasmModuleInstantiated {
bool async = false;
bool success = false;
size_t imported_function_count = 0;
- int64_t wall_clock_time_in_us = 0;
+ int64_t wall_clock_time_in_us = -1;
};
struct WasmModuleTieredUp {
bool lazy = false;
size_t code_size_in_bytes = 0;
- int64_t wall_clock_time_in_us = 0;
+ int64_t wall_clock_time_in_us = -1;
};
struct WasmModulesPerIsolate {
diff --git a/deps/v8/include/v8-platform.h b/deps/v8/include/v8-platform.h
index 1bf75a1d42..7bb79a1841 100644
--- a/deps/v8/include/v8-platform.h
+++ b/deps/v8/include/v8-platform.h
@@ -175,9 +175,15 @@ class JobDelegate {
* Returns a task_id unique among threads currently running this job, such
* that GetTaskId() < worker count. To achieve this, the same task_id may be
* reused by a different thread after a worker_task returns.
+ */
+ virtual uint8_t GetTaskId() = 0;
+
+ /**
+ * Returns true if the current task is called from the thread currently
+ * running JobHandle::Join().
* TODO(etiennep): Make pure virtual once custom embedders implement it.
*/
- virtual uint8_t GetTaskId() { return 0; }
+ virtual bool IsJoiningThread() const { return false; }
};
/**
@@ -212,9 +218,8 @@ class JobHandle {
/**
* Returns true if there's no work pending and no worker running.
- * TODO(etiennep): Make pure virtual once custom embedders implement it.
*/
- virtual bool IsCompleted() { return true; }
+ virtual bool IsCompleted() = 0;
/**
* Returns true if associated with a Job and other methods may be called.
@@ -233,23 +238,17 @@ class JobTask {
virtual void Run(JobDelegate* delegate) = 0;
/**
- * Controls the maximum number of threads calling Run() concurrently. Run() is
- * only invoked if the number of threads previously running Run() was less
- * than the value returned. Since GetMaxConcurrency() is a leaf function, it
- * must not call back any JobHandle methods.
+ * Controls the maximum number of threads calling Run() concurrently, given
+ * the number of threads currently assigned to this job and executing Run().
+ * Run() is only invoked if the number of threads previously running Run() was
+ * less than the value returned. Since GetMaxConcurrency() is a leaf function,
+ * it must not call back any JobHandle methods.
*/
- virtual size_t GetMaxConcurrency() const = 0;
+ virtual size_t GetMaxConcurrency(size_t worker_count) const = 0;
- /*
- * Meant to replace the version above, given the number of threads currently
- * assigned to this job and executing Run(). This is useful when the result
- * must include local work items not visible globaly by other workers.
- * TODO(etiennep): Replace the version above by this once custom embedders are
- * migrated.
- */
- size_t GetMaxConcurrency(size_t worker_count) const {
- return GetMaxConcurrency();
- }
+ // TODO(1114823): Clean up once all overrides are removed.
+ V8_DEPRECATED("Use the version that takes |worker_count|.")
+ virtual size_t GetMaxConcurrency() const { return 0; }
};
/**
@@ -384,13 +383,7 @@ class PageAllocator {
kReadWrite,
// TODO(hpayer): Remove this flag. Memory should never be rwx.
kReadWriteExecute,
- kReadExecute,
- // Set this when reserving memory that will later require kReadWriteExecute
- // permissions. The resulting behavior is platform-specific, currently
- // this is used to set the MAP_JIT flag on Apple Silicon.
- // TODO(jkummerow): Remove this when Wasm has a platform-independent
- // w^x implementation.
- kNoAccessWillJitLater
+ kReadExecute
};
/**
diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h
index c3b25e8d6a..7ec1993734 100644
--- a/deps/v8/include/v8-profiler.h
+++ b/deps/v8/include/v8-profiler.h
@@ -6,6 +6,7 @@
#define V8_V8_PROFILER_H_
#include <limits.h>
+
#include <memory>
#include <unordered_set>
#include <vector>
@@ -268,6 +269,8 @@ class V8_EXPORT CpuProfilingOptions {
* interval, set via SetSamplingInterval(). If
* zero, the sampling interval will be equal to
* the profiler's sampling interval.
+ * \param filter_context Deprecated option to filter by context, currently a
+ * no-op.
*/
CpuProfilingOptions(
CpuProfilingMode mode = kLeafNodeLineNumbers,
@@ -281,13 +284,9 @@ class V8_EXPORT CpuProfilingOptions {
private:
friend class internal::CpuProfile;
- bool has_filter_context() const { return !filter_context_.IsEmpty(); }
- void* raw_filter_context() const;
-
CpuProfilingMode mode_;
unsigned max_samples_;
int sampling_interval_us_;
- CopyablePersistentTraits<Context>::CopyablePersistent filter_context_;
};
/**
@@ -712,6 +711,19 @@ class V8_EXPORT EmbedderGraph {
public:
class Node {
public:
+ /**
+ * Detachedness specifies whether an object is attached or detached from the
+ * main application state. While unkown in general, there may be objects
+ * that specifically know their state. V8 passes this information along in
+ * the snapshot. Users of the snapshot may use it to annotate the object
+ * graph.
+ */
+ enum class Detachedness : uint8_t {
+ kUnknown = 0,
+ kAttached = 1,
+ kDetached = 2,
+ };
+
Node() = default;
virtual ~Node() = default;
virtual const char* Name() = 0;
@@ -736,6 +748,14 @@ class V8_EXPORT EmbedderGraph {
*/
virtual NativeObject GetNativeObject() { return nullptr; }
+ /**
+ * Detachedness state of a given object. While unkown in general, there may
+ * be objects that specifically know their state. V8 passes this information
+ * along in the snapshot. Users of the snapshot may use it to annotate the
+ * object graph.
+ */
+ virtual Detachedness GetDetachedness() { return Detachedness::kUnknown; }
+
Node(const Node&) = delete;
Node& operator=(const Node&) = delete;
};
diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h
index 8060900855..46810a77ce 100644
--- a/deps/v8/include/v8-version.h
+++ b/deps/v8/include/v8-version.h
@@ -9,9 +9,9 @@
// NOTE these macros are used by some of the tool scripts and the build
// system so their names cannot be changed without changing the scripts.
#define V8_MAJOR_VERSION 8
-#define V8_MINOR_VERSION 6
-#define V8_BUILD_NUMBER 395
-#define V8_PATCH_LEVEL 17
+#define V8_MINOR_VERSION 7
+#define V8_BUILD_NUMBER 220
+#define V8_PATCH_LEVEL 24
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h
index 261d3b3f06..32687d90b5 100644
--- a/deps/v8/include/v8.h
+++ b/deps/v8/include/v8.h
@@ -19,6 +19,7 @@
#include <stdint.h>
#include <stdio.h>
+#include <atomic>
#include <memory>
#include <string>
#include <type_traits>
@@ -1318,6 +1319,32 @@ class V8_EXPORT SealHandleScope {
* The superclass of objects that can reside on V8's heap.
*/
class V8_EXPORT Data {
+ public:
+ /**
+ * Returns true if this data is a |v8::Value|.
+ */
+ bool IsValue() const;
+
+ /**
+ * Returns true if this data is a |v8::Module|.
+ */
+ bool IsModule() const;
+
+ /**
+ * Returns true if this data is a |v8::Private|.
+ */
+ bool IsPrivate() const;
+
+ /**
+ * Returns true if this data is a |v8::ObjectTemplate|.
+ */
+ bool IsObjectTemplate() const;
+
+ /**
+ * Returns true if this data is a |v8::FunctionTemplate|.
+ */
+ bool IsFunctionTemplate() const;
+
private:
Data();
};
@@ -1629,6 +1656,11 @@ class V8_EXPORT Module : public Data {
"the latter will crash with a failed CHECK().")
void SetSyntheticModuleExport(Local<String> export_name,
Local<Value> export_value);
+
+ V8_INLINE static Module* Cast(Data* data);
+
+ private:
+ static void CheckCast(Data* obj);
};
/**
@@ -1802,11 +1834,9 @@ class V8_EXPORT ScriptCompiler {
public:
enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 };
-#if defined(_MSC_VER) && _MSC_VER >= 1910 /* Disable on VS2015 */
V8_DEPRECATE_SOON(
"This class takes ownership of source_stream, so use the constructor "
"taking a unique_ptr to make these semantics clearer")
-#endif
StreamedSource(ExternalSourceStream* source_stream, Encoding encoding);
StreamedSource(std::unique_ptr<ExternalSourceStream> source_stream,
Encoding encoding);
@@ -2262,14 +2292,6 @@ struct JSEntryStub {
MemoryRange code;
};
-struct UnwindState {
- MemoryRange code_range;
- MemoryRange embedded_code_range;
- JSEntryStub js_entry_stub;
- JSEntryStub js_construct_entry_stub;
- JSEntryStub js_run_microtasks_entry_stub;
-};
-
struct JSEntryStubs {
JSEntryStub js_entry_stub;
JSEntryStub js_construct_entry_stub;
@@ -2934,6 +2956,8 @@ class V8_EXPORT Value : public Data {
bool FullIsUndefined() const;
bool FullIsNull() const;
bool FullIsString() const;
+
+ static void CheckCast(Data* that);
};
@@ -3089,11 +3113,19 @@ class V8_EXPORT String : public Name {
V8_INLINE static Local<String> Empty(Isolate* isolate);
/**
- * Returns true if the string is external
+ * Returns true if the string is external two-byte.
+ *
*/
+ V8_DEPRECATE_SOON(
+ "Use String::IsExternalTwoByte() or String::IsExternalOneByte()")
bool IsExternal() const;
/**
+ * Returns true if the string is both external and two-byte.
+ */
+ bool IsExternalTwoByte() const;
+
+ /**
* Returns true if the string is both external and one-byte.
*/
bool IsExternalOneByte() const;
@@ -5021,13 +5053,6 @@ class V8_EXPORT BackingStore : public v8::internal::BackingStoreBase {
bool IsShared() const;
/**
- * Prevent implicit instantiation of operator delete with size_t argument.
- * The size_t argument would be incorrect because ptr points to the
- * internal BackingStore object.
- */
- void operator delete(void* ptr) { ::operator delete(ptr); }
-
- /**
* Wrapper around ArrayBuffer::Allocator::Reallocate that preserves IsShared.
* Assumes that the backing_store was allocated by the ArrayBuffer allocator
* of the given isolate.
@@ -7348,6 +7373,7 @@ class PromiseRejectMessage {
typedef void (*PromiseRejectCallback)(PromiseRejectMessage message);
// --- Microtasks Callbacks ---
+V8_DEPRECATE_SOON("Use *WithData version.")
typedef void (*MicrotasksCompletedCallback)(Isolate*);
typedef void (*MicrotasksCompletedCallbackWithData)(Isolate*, void*);
typedef void (*MicrotaskCallback)(void* data);
@@ -9334,13 +9360,6 @@ class V8_EXPORT Isolate {
void GetCodeRange(void** start, size_t* length_in_bytes);
/**
- * Returns the UnwindState necessary for use with the Unwinder API.
- */
- // TODO(petermarshall): Remove this API.
- V8_DEPRECATED("Use entry_stubs + code_pages version.")
- UnwindState GetUnwindState();
-
- /**
* Returns the JSEntryStubs necessary for use with the Unwinder API.
*/
JSEntryStubs GetJSEntryStubs();
@@ -10697,12 +10716,14 @@ class V8_EXPORT Unwinder {
*
* The unwinder also needs the virtual memory range of all possible V8 code
* objects. There are two ranges required - the heap code range and the range
- * for code embedded in the binary. The V8 API provides all required inputs
- * via an UnwindState object through the Isolate::GetUnwindState() API. These
- * values will not change after Isolate initialization, so the same
- * |unwind_state| can be used for multiple calls.
+ * for code embedded in the binary.
+ *
+ * Available on x64, ARM64 and ARM32.
*
- * \param unwind_state Input state for the Isolate that the stack comes from.
+ * \param code_pages A list of all of the ranges in which V8 has allocated
+ * executable code. The caller should obtain this list by calling
+ * Isolate::CopyCodePages() during the same interrupt/thread suspension that
+ * captures the stack.
* \param register_state The current registers. This is an in-out param that
* will be overwritten with the register values after unwinding, on success.
* \param stack_base The resulting stack pointer and frame pointer values are
@@ -10713,20 +10734,6 @@ class V8_EXPORT Unwinder {
*
* \return True on success.
*/
- // TODO(petermarshall): Remove this API
- V8_DEPRECATED("Use entry_stubs + code_pages version.")
- static bool TryUnwindV8Frames(const UnwindState& unwind_state,
- RegisterState* register_state,
- const void* stack_base);
-
- /**
- * The same as above, but is available on x64, ARM64 and ARM32.
- *
- * \param code_pages A list of all of the ranges in which V8 has allocated
- * executable code. The caller should obtain this list by calling
- * Isolate::CopyCodePages() during the same interrupt/thread suspension that
- * captures the stack.
- */
static bool TryUnwindV8Frames(const JSEntryStubs& entry_stubs,
size_t code_pages_length,
const MemoryRange* code_pages,
@@ -10734,20 +10741,13 @@ class V8_EXPORT Unwinder {
const void* stack_base);
/**
- * Whether the PC is within the V8 code range represented by code_range or
- * embedded_code_range in |unwind_state|.
+ * Whether the PC is within the V8 code range represented by code_pages.
*
* If this returns false, then calling UnwindV8Frames() with the same PC
* and unwind_state will always fail. If it returns true, then unwinding may
* (but not necessarily) be successful.
- */
- // TODO(petermarshall): Remove this API
- V8_DEPRECATED("Use code_pages version.")
- static bool PCIsInV8(const UnwindState& unwind_state, void* pc);
-
- /**
- * The same as above, but is available on x64, ARM64 and ARM32. See the
- * comment on TryUnwindV8Frames.
+ *
+ * Available on x64, ARM64 and ARM32
*/
static bool PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages,
void* pc);
@@ -11586,6 +11586,13 @@ template <class T> Value* Value::Cast(T* value) {
return static_cast<Value*>(value);
}
+template <>
+V8_INLINE Value* Value::Cast(Data* value) {
+#ifdef V8_ENABLE_CHECKS
+ CheckCast(value);
+#endif
+ return static_cast<Value*>(value);
+}
Boolean* Boolean::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
@@ -11618,6 +11625,12 @@ Private* Private::Cast(Data* data) {
return reinterpret_cast<Private*>(data);
}
+Module* Module::Cast(Data* data) {
+#ifdef V8_ENABLE_CHECKS
+ CheckCast(data);
+#endif
+ return reinterpret_cast<Module*>(data);
+}
Number* Number::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h
index bbd1d6ce97..a047874c40 100644
--- a/deps/v8/include/v8config.h
+++ b/deps/v8/include/v8config.h
@@ -70,6 +70,7 @@
// V8_OS_POSIX - POSIX compatible (mostly everything except Windows)
// V8_OS_QNX - QNX Neutrino
// V8_OS_SOLARIS - Sun Solaris and OpenSolaris
+// V8_OS_STARBOARD - Starboard (platform abstraction for Cobalt)
// V8_OS_AIX - AIX
// V8_OS_WIN - Microsoft Windows
@@ -93,6 +94,8 @@
#elif defined(__sun)
# define V8_OS_POSIX 1
# define V8_OS_SOLARIS 1
+#elif defined(STARBOARD)
+# define V8_OS_STARBOARD 1
#elif defined(_AIX)
#define V8_OS_POSIX 1
#define V8_OS_AIX 1
@@ -479,6 +482,15 @@ V8 shared library set USING_V8_SHARED.
#endif // V8_OS_WIN
+// Support for floating point parameters in calls to C.
+// It's currently enabled only for the platforms listed below. We don't plan
+// to add support for IA32, because it has a totally different approach
+// (using FP stack). As support is added to more platforms, please make sure
+// to list them here in order to enable tests of this functionality.
+#if defined(V8_TARGET_ARCH_X64)
+#define V8_ENABLE_FP_PARAMS_IN_C_LINKAGE
+#endif
+
// clang-format on
#endif // V8CONFIG_H_
diff --git a/deps/v8/infra/mb/mb_config.pyl b/deps/v8/infra/mb/mb_config.pyl
index e385083aef..7d5cc73026 100644
--- a/deps/v8/infra/mb/mb_config.pyl
+++ b/deps/v8/infra/mb/mb_config.pyl
@@ -75,9 +75,13 @@
'V8 Mac64 - debug': 'debug_x64',
'V8 Mac64 GC Stress': 'debug_x64',
'V8 Mac64 ASAN': 'release_x64_asan_no_lsan',
+ 'V8 Mac - arm64 - release builder': 'release_arm64',
+ 'V8 Mac - arm64 - sim - debug builder': 'debug_simulate_arm64',
+ 'V8 Mac - arm64 - sim - release builder': 'release_simulate_arm64',
# Sanitizers.
'V8 Linux64 ASAN': 'release_x64_asan',
'V8 Linux64 TSAN - builder': 'release_x64_tsan',
+ 'V8 Linux64 TSAN - no-concurrent-marking - builder': 'release_x64_tsan_no_cm',
'V8 Linux - arm64 - sim - CFI': 'release_simulate_arm64_cfi',
'V8 Linux - arm64 - sim - MSAN': 'release_simulate_arm64_msan',
# Misc.
@@ -236,6 +240,7 @@
'v8_linux64_fuzzilli_ng': 'release_x64_fuzzilli',
'v8_linux64_msan_rel_ng': 'release_simulate_arm64_msan_minimal_symbols',
'v8_linux64_tsan_rel_ng': 'release_x64_tsan_minimal_symbols',
+ 'v8_linux64_tsan_no_cm_rel_ng': 'release_x64_tsan_no_cm',
'v8_linux64_tsan_isolates_rel_ng':
'release_x64_tsan_minimal_symbols',
'v8_linux64_ubsan_rel_ng': 'release_x64_ubsan_minimal_symbols',
@@ -253,6 +258,9 @@
'v8_mac_arm64_rel_ng': 'release_arm64',
'v8_mac_arm64_dbg_ng': 'debug_arm64',
'v8_mac_arm64_full_dbg_ng': 'full_debug_arm64',
+ 'v8_mac_arm64_sim_rel_ng': 'release_simulate_arm64_trybot',
+ 'v8_mac_arm64_sim_dbg_ng': 'debug_simulate_arm64',
+ 'v8_mac_arm64_sim_nodcheck_rel_ng': 'release_simulate_arm64',
'v8_mac64_gc_stress_dbg_ng': 'debug_x64_trybot',
'v8_mac64_rel_ng': 'release_x64_trybot',
'v8_mac64_dbg': 'debug_x64',
@@ -424,15 +432,15 @@
# Official configs for arm
'official_arm': [
- 'release_bot', 'arm', 'hard_float', 'official'],
+ 'release_bot', 'arm', 'hard_float', 'official', 'disable_pgo'],
'official_arm64': [
- 'release_bot', 'arm64', 'hard_float', 'official'],
+ 'release_bot', 'arm64', 'hard_float', 'official', 'disable_pgo'],
'official_android_arm': [
'release_bot', 'arm', 'android', 'minimal_symbols',
- 'android_strip_outputs', 'official'],
+ 'android_strip_outputs', 'official', 'disable_pgo'],
'official_android_arm64': [
'release_bot', 'arm64', 'android', 'minimal_symbols',
- 'android_strip_outputs', 'official'],
+ 'android_strip_outputs', 'official', 'disable_pgo'],
# Release configs for x64.
'release_x64': [
@@ -488,6 +496,8 @@
'release_trybot', 'x64', 'v8_enable_test_features'],
'release_x64_tsan': [
'release_bot', 'x64', 'tsan'],
+ 'release_x64_tsan_no_cm': [
+ 'release_bot', 'x64', 'tsan', 'disable_concurrent_marking'],
'release_x64_tsan_minimal_symbols': [
'release_bot', 'x64', 'tsan', 'minimal_symbols'],
'release_x64_ubsan': [
@@ -504,7 +514,7 @@
# Official configs for x64.
'official_x64': [
- 'release_bot', 'x64', 'official'],
+ 'release_bot', 'x64', 'official', 'disable_pgo'],
# Debug configs for x64.
'debug_x64': [
@@ -577,7 +587,7 @@
# Official configs for x86.
'official_x86': [
- 'release_bot', 'x86', 'official'],
+ 'release_bot', 'x86', 'official', 'disable_pgo'],
# Torque compare test
'torque_compare': [
@@ -586,7 +596,7 @@
'mixins': {
'android': {
- 'gn_args': 'target_os="android" v8_android_log_stdout=true',
+ 'gn_args': 'target_os="android" v8_android_log_stdout=true default_min_sdk_version=19',
},
'android_strip_outputs': {
@@ -650,6 +660,14 @@
'mixins': ['debug_bot', 'minimal_symbols'],
},
+ 'disable_concurrent_marking': {
+ 'gn_args': 'v8_enable_concurrent_marking=false',
+ },
+
+ 'disable_pgo': {
+ 'gn_args': 'chrome_pgo_phase=0',
+ },
+
'fuchsia': {
'gn_args': 'target_os="fuchsia"',
},
diff --git a/deps/v8/infra/testing/PRESUBMIT.py b/deps/v8/infra/testing/PRESUBMIT.py
index c701f02e56..178ba9f707 100644
--- a/deps/v8/infra/testing/PRESUBMIT.py
+++ b/deps/v8/infra/testing/PRESUBMIT.py
@@ -30,6 +30,7 @@ SUPPORTED_SWARMING_DIMENSIONS = [
'device_os',
'device_type',
'os',
+ 'pool',
]
# This is not an exhaustive list. It only reflects what we currently use. If
@@ -121,9 +122,9 @@ def _check_test(error_msg, test):
if not all(isinstance(x, basestring) for x in test_args):
errors += error_msg('If specified, all test_args must be strings')
- # Limit shards to 12 to avoid erroneous resource exhaustion.
+ # Limit shards to 14 to avoid erroneous resource exhaustion.
errors += _check_int_range(
- error_msg, test, 'shards', lower_bound=1, upper_bound=12)
+ error_msg, test, 'shards', lower_bound=1, upper_bound=14)
variant = test.get('variant', 'default')
if not variant or not isinstance(variant, basestring):
diff --git a/deps/v8/infra/testing/builders.pyl b/deps/v8/infra/testing/builders.pyl
index d652fdbdbf..c5ee5e496f 100644
--- a/deps/v8/infra/testing/builders.pyl
+++ b/deps/v8/infra/testing/builders.pyl
@@ -258,6 +258,7 @@
{'name': 'test262', 'shards': 7},
{'name': 'v8testing', 'shards': 3},
{'name': 'v8testing', 'variant': 'extra', 'shards': 3},
+ {'name': 'v8testing', 'variant': 'no_local_heaps'},
{'name': 'v8testing', 'variant': 'slow_path'},
],
},
@@ -330,7 +331,7 @@
{'name': 'v8testing', 'variant': 'infra_staging', 'shards': 2},
# Native context independent code.
{'name': 'v8testing', 'variant': 'nci'},
- {'name': 'v8testing', 'variant': 'nci_as_highest_tier'},
+ {'name': 'v8testing', 'variant': 'nci_as_midtier'},
# Stress sampling.
{'name': 'mjsunit', 'variant': 'stress_sampling'},
{'name': 'webkit', 'variant': 'stress_sampling'},
@@ -420,9 +421,27 @@
{'name': 'test262', 'variant': 'default', 'shards': 3},
{'name': 'v8testing', 'shards': 5},
{'name': 'v8testing', 'variant': 'extra', 'shards': 3},
+ {'name': 'v8testing', 'variant': 'no_local_heaps'},
{'name': 'v8testing', 'variant': 'slow_path'},
],
},
+ 'v8_linux64_tsan_no_cm_rel_ng_triggered': {
+ 'swarming_dimensions' : {
+ 'os': 'Ubuntu-16.04',
+ },
+ 'tests': [
+ {
+ 'name': 'v8testing',
+ 'shards': 6,
+ },
+ {
+ 'name': 'v8testing',
+ 'suffix': 'future',
+ 'test_args': ['--extra-flags=--future'],
+ 'shards': 6,
+ },
+ ],
+ },
'v8_linux64_tsan_isolates_rel_ng_triggered': {
'swarming_dimensions' : {
'os': 'Ubuntu-16.04',
@@ -457,8 +476,8 @@
{'name': 'mjsunit_sp_frame_access'},
{'name': 'mozilla', 'shards': 4},
{'name': 'test262', 'variant': 'default', 'shards': 4},
- {'name': 'v8testing', 'shards': 12},
- {'name': 'v8testing', 'variant': 'extra', 'shards': 8},
+ {'name': 'v8testing', 'shards': 14},
+ {'name': 'v8testing', 'variant': 'extra', 'shards': 10},
{'name': 'v8testing', 'variant': 'trusted', 'shards': 5},
],
},
@@ -478,7 +497,7 @@
{'name': 'mjsunit_sp_frame_access', 'shards': 4},
{'name': 'mozilla', 'shards': 4},
{'name': 'test262', 'variant': 'default', 'shards': 4},
- {'name': 'v8testing', 'shards': 12},
+ {'name': 'v8testing', 'shards': 14},
{'name': 'v8testing', 'variant': 'extra', 'shards': 10},
{'name': 'v8testing', 'variant': 'trusted', 'shards': 5},
],
@@ -632,32 +651,59 @@
},
'v8_mac_arm64_rel_ng_triggered': {
'swarming_dimensions' : {
- 'cpu': 'x86-64',
- 'os': 'Mac-10.13',
+ 'cpu': 'arm64',
+ 'os': 'Mac-11',
+ 'pool': 'chromium.tests.mac-arm64',
},
'tests': [
{'name': 'v8testing'},
- {'name': 'test262'},
],
},
'v8_mac_arm64_dbg_ng_triggered': {
'swarming_dimensions' : {
- 'cpu': 'x86-64',
- 'os': 'Mac-10.13',
+ 'cpu': 'arm64',
+ 'os': 'Mac-11',
+ 'pool': 'chromium.tests.mac-arm64',
},
'tests': [
{'name': 'v8testing'},
- {'name': 'test262'},
],
},
'v8_mac_arm64_full_dbg_ng_triggered': {
'swarming_dimensions' : {
+ 'cpu': 'arm64',
+ 'os': 'Mac-11',
+ 'pool': 'chromium.tests.mac-arm64',
+ },
+ 'tests': [
+ {'name': 'v8testing'},
+ ],
+ },
+ 'v8_mac_arm64_sim_rel_ng_triggered': {
+ 'swarming_dimensions' : {
'cpu': 'x86-64',
'os': 'Mac-10.13',
},
'tests': [
- {'name': 'v8testing'},
- {'name': 'test262'},
+ {'name': 'v8testing', 'shards': 8},
+ ],
+ },
+ 'v8_mac_arm64_sim_dbg_ng_triggered': {
+ 'swarming_dimensions' : {
+ 'cpu': 'x86-64',
+ 'os': 'Mac-10.13',
+ },
+ 'tests': [
+ {'name': 'v8testing', 'shards': 8},
+ ],
+ },
+ 'v8_mac_arm64_sim_nodcheck_rel_ng_triggered': {
+ 'swarming_dimensions' : {
+ 'cpu': 'x86-64',
+ 'os': 'Mac-10.13',
+ },
+ 'tests': [
+ {'name': 'v8testing', 'shards': 8},
],
},
##############################################################################
@@ -993,7 +1039,7 @@
{'name': 'v8testing', 'variant': 'infra_staging', 'shards': 2},
# Native context independent code.
{'name': 'v8testing', 'variant': 'nci'},
- {'name': 'v8testing', 'variant': 'nci_as_highest_tier'},
+ {'name': 'v8testing', 'variant': 'nci_as_midtier'},
# Stress sampling.
{'name': 'mjsunit', 'variant': 'stress_sampling'},
{'name': 'webkit', 'variant': 'stress_sampling'},
@@ -1025,7 +1071,7 @@
{'name': 'v8testing', 'variant': 'infra_staging'},
# Native context independent code.
{'name': 'v8testing', 'variant': 'nci'},
- {'name': 'v8testing', 'variant': 'nci_as_highest_tier'},
+ {'name': 'v8testing', 'variant': 'nci_as_midtier'},
# Stress sampling.
{'name': 'mjsunit', 'variant': 'stress_sampling'},
{'name': 'webkit', 'variant': 'stress_sampling'},
@@ -1094,6 +1140,7 @@
{'name': 'test262', 'shards': 5},
{'name': 'v8testing', 'shards': 2},
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
+ {'name': 'v8testing', 'variant': 'no_local_heaps', 'shards': 1},
{'name': 'v8testing', 'variant': 'slow_path', 'shards': 1},
],
},
@@ -1119,6 +1166,7 @@
{'name': 'test262', 'variant': 'default', 'shards': 3},
{'name': 'v8testing', 'shards': 5},
{'name': 'v8testing', 'variant': 'extra', 'shards': 3},
+ {'name': 'v8testing', 'variant': 'no_local_heaps', 'shards': 1},
{'name': 'v8testing', 'variant': 'slow_path', 'shards': 1},
],
},
@@ -1161,6 +1209,23 @@
{'name': 'v8testing', 'test_args': ['--isolates'], 'shards': 7},
],
},
+ 'V8 Linux64 TSAN - no-concurrent-marking': {
+ 'swarming_dimensions' : {
+ 'os': 'Ubuntu-16.04',
+ },
+ 'tests': [
+ {
+ 'name': 'v8testing',
+ 'shards': 6,
+ },
+ {
+ 'name': 'v8testing',
+ 'suffix': 'future',
+ 'test_args': ['--extra-flags=--future'],
+ 'shards': 6,
+ },
+ ],
+ },
'V8 Linux64 UBSan': {
'swarming_dimensions' : {
'os': 'Ubuntu-16.04',
@@ -1214,6 +1279,50 @@
{'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 4},
],
},
+ 'V8 Mac - arm64 - release': {
+ 'swarming_dimensions' : {
+ 'os': 'Mac-11',
+ 'cpu': 'arm64',
+ 'pool': 'chromium.tests.mac-arm64',
+ },
+ 'swarming_task_attrs': {
+ 'expiration': 14400,
+ 'hard_timeout': 3600,
+ 'priority': 35,
+ },
+ 'tests': [
+ {'name': 'd8testing'},
+ {'name': 'd8testing', 'variant': 'extra'},
+ ],
+ },
+ 'V8 Mac - arm64 - sim - debug': {
+ 'swarming_dimensions' : {
+ 'cpu': 'x86-64',
+ 'os': 'Mac-10.13',
+ },
+ 'swarming_task_attrs': {
+ 'expiration': 14400,
+ 'hard_timeout': 3600,
+ 'priority': 35,
+ },
+ 'tests': [
+ {'name': 'v8testing', 'shards': 8},
+ ],
+ },
+ 'V8 Mac - arm64 - sim - release': {
+ 'swarming_dimensions' : {
+ 'cpu': 'x86-64',
+ 'os': 'Mac-10.13',
+ },
+ 'swarming_task_attrs': {
+ 'expiration': 14400,
+ 'hard_timeout': 3600,
+ 'priority': 35,
+ },
+ 'tests': [
+ {'name': 'v8testing', 'shards': 8},
+ ],
+ },
'V8 Win32': {
'swarming_dimensions': {
'cpu': 'x86-64',
@@ -1511,8 +1620,8 @@
{'name': 'mjsunit_sp_frame_access'},
{'name': 'mozilla', 'shards': 2},
{'name': 'test262', 'variant': 'default', 'shards': 2},
- {'name': 'v8testing', 'shards': 10},
- {'name': 'v8testing', 'variant': 'extra', 'shards': 6},
+ {'name': 'v8testing', 'shards': 12},
+ {'name': 'v8testing', 'variant': 'extra', 'shards': 9},
{'name': 'v8testing', 'variant': 'trusted', 'shards': 2},
],
},
diff --git a/deps/v8/samples/process.cc b/deps/v8/samples/process.cc
index b23329dc10..dec0d57031 100644
--- a/deps/v8/samples/process.cc
+++ b/deps/v8/samples/process.cc
@@ -183,7 +183,7 @@ bool JsHttpRequestProcessor::Initialize(map<string, string>* opts,
// Create a template for the global object where we set the
// built-in global functions.
Local<ObjectTemplate> global = ObjectTemplate::New(GetIsolate());
- global->Set(String::NewFromUtf8Literal(GetIsolate(), "log"),
+ global->Set(GetIsolate(), "log",
FunctionTemplate::New(GetIsolate(), LogCallback));
// Each processor gets its own context so different processors don't
diff --git a/deps/v8/src/DEPS b/deps/v8/src/DEPS
index 6b4b6661bd..e10d171f26 100644
--- a/deps/v8/src/DEPS
+++ b/deps/v8/src/DEPS
@@ -28,6 +28,8 @@ include_rules = [
"+src/heap/read-only-heap-inl.h",
"+src/heap/read-only-heap.h",
"+src/heap/safepoint.h",
+ "+src/heap/base/stack.h",
+ "+src/heap/conservative-stack-visitor.h",
"-src/inspector",
"-src/interpreter",
"+src/interpreter/bytecode-array-accessor.h",
@@ -52,7 +54,8 @@ include_rules = [
"-src/libplatform",
"-include/libplatform",
"+builtins-generated",
- "+torque-generated"
+ "+torque-generated",
+ "+starboard",
]
specific_include_rules = {
diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc
index 9f0f6673d6..b49ad728a8 100644
--- a/deps/v8/src/api/api.cc
+++ b/deps/v8/src/api/api.cc
@@ -786,7 +786,7 @@ StartupData SnapshotCreator::CreateBlob(
i::Snapshot::ClearReconstructableDataForSerialization(
isolate, function_code_handling == FunctionCodeHandling::kClear);
- i::DisallowHeapAllocation no_gc_from_here_on;
+ i::DisallowGarbageCollection no_gc_from_here_on;
// Create a vector with all contexts and clear associated Persistent fields.
// Note these contexts may be dead after calling Clear(), but will not be
@@ -1192,6 +1192,34 @@ void* SealHandleScope::operator new[](size_t) { base::OS::Abort(); }
void SealHandleScope::operator delete(void*, size_t) { base::OS::Abort(); }
void SealHandleScope::operator delete[](void*, size_t) { base::OS::Abort(); }
+bool Data::IsModule() const { return Utils::OpenHandle(this)->IsModule(); }
+
+bool Data::IsValue() const {
+ i::DisallowHeapAllocation no_gc;
+ i::Handle<i::Object> self = Utils::OpenHandle(this);
+ if (self->IsSmi()) {
+ return true;
+ }
+ i::HeapObject heap_object = i::HeapObject::cast(*self);
+ DCHECK(!heap_object.IsTheHole());
+ if (heap_object.IsSymbol()) {
+ return !i::Symbol::cast(heap_object).is_private();
+ }
+ return heap_object.IsPrimitiveHeapObject() || heap_object.IsJSReceiver();
+}
+
+bool Data::IsPrivate() const {
+ return Utils::OpenHandle(this)->IsPrivateSymbol();
+}
+
+bool Data::IsObjectTemplate() const {
+ return Utils::OpenHandle(this)->IsObjectTemplateInfo();
+}
+
+bool Data::IsFunctionTemplate() const {
+ return Utils::OpenHandle(this)->IsFunctionTemplateInfo();
+}
+
void Context::Enter() {
i::Handle<i::Context> env = Utils::OpenHandle(this);
i::Isolate* isolate = env->GetIsolate();
@@ -3394,7 +3422,9 @@ bool Value::FullIsString() const {
return result;
}
-bool Value::IsSymbol() const { return Utils::OpenHandle(this)->IsSymbol(); }
+bool Value::IsSymbol() const {
+ return Utils::OpenHandle(this)->IsPublicSymbol();
+}
bool Value::IsArray() const { return Utils::OpenHandle(this)->IsJSArray(); }
@@ -3649,6 +3679,10 @@ void i::Internals::CheckInitializedImpl(v8::Isolate* external_isolate) {
"Isolate is not initialized or V8 has died");
}
+void v8::Value::CheckCast(Data* that) {
+ Utils::ApiCheck(that->IsValue(), "v8::Value::Cast", "Data is not a Value");
+}
+
void External::CheckCast(v8::Value* that) {
Utils::ApiCheck(that->IsExternal(), "v8::External::Cast",
"Value is not an External");
@@ -3694,6 +3728,11 @@ void v8::Private::CheckCast(v8::Data* that) {
"v8::Private::Cast", "Value is not a Private");
}
+void v8::Module::CheckCast(v8::Data* that) {
+ i::Handle<i::Object> obj = Utils::OpenHandle(that);
+ Utils::ApiCheck(obj->IsModule(), "v8::Module::Cast", "Value is not a Module");
+}
+
void v8::Number::CheckCast(v8::Value* that) {
i::Handle<i::Object> obj = Utils::OpenHandle(that);
Utils::ApiCheck(obj->IsNumber(), "v8::Number::Cast()",
@@ -5421,6 +5460,10 @@ int String::Write(Isolate* isolate, uint16_t* buffer, int start, int length,
}
bool v8::String::IsExternal() const {
+ return IsExternalTwoByte();
+}
+
+bool v8::String::IsExternalTwoByte() const {
i::Handle<i::String> str = Utils::OpenHandle(this);
return i::StringShape(*str).IsExternalTwoByte();
}
@@ -8500,21 +8543,34 @@ void Isolate::GetHeapStatistics(HeapStatistics* heap_statistics) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
i::Heap* heap = isolate->heap();
- heap_statistics->total_heap_size_ = heap->CommittedMemory();
+ // The order of acquiring memory statistics is important here. We query in
+ // this order because of concurrent allocation: 1) used memory 2) comitted
+ // physical memory 3) committed memory. Therefore the condition used <=
+ // committed physical <= committed should hold.
+ heap_statistics->used_global_handles_size_ = heap->UsedGlobalHandlesSize();
+ heap_statistics->total_global_handles_size_ = heap->TotalGlobalHandlesSize();
+ DCHECK_LE(heap_statistics->used_global_handles_size_,
+ heap_statistics->total_global_handles_size_);
+
+ heap_statistics->used_heap_size_ = heap->SizeOfObjects();
heap_statistics->total_physical_size_ = heap->CommittedPhysicalMemory();
+ heap_statistics->total_heap_size_ = heap->CommittedMemory();
+
heap_statistics->total_available_size_ = heap->Available();
- heap_statistics->used_heap_size_ = heap->SizeOfObjects();
- heap_statistics->total_global_handles_size_ = heap->TotalGlobalHandlesSize();
- heap_statistics->used_global_handles_size_ = heap->UsedGlobalHandlesSize();
if (!i::ReadOnlyHeap::IsReadOnlySpaceShared()) {
i::ReadOnlySpace* ro_space = heap->read_only_space();
- heap_statistics->total_heap_size_ += ro_space->CommittedMemory();
+ heap_statistics->used_heap_size_ += ro_space->Size();
heap_statistics->total_physical_size_ +=
ro_space->CommittedPhysicalMemory();
- heap_statistics->used_heap_size_ += ro_space->Size();
+ heap_statistics->total_heap_size_ += ro_space->CommittedMemory();
}
+ // TODO(dinfuehr): Right now used <= committed physical does not hold. Fix
+ // this and add DCHECK.
+ DCHECK_LE(heap_statistics->used_heap_size_,
+ heap_statistics->total_heap_size_);
+
heap_statistics->total_heap_size_executable_ =
heap->CommittedMemoryExecutable();
heap_statistics->heap_size_limit_ = heap->MaxReserved();
@@ -8933,33 +8989,6 @@ void Isolate::GetCodeRange(void** start, size_t* length_in_bytes) {
*length_in_bytes = code_range.size();
}
-UnwindState Isolate::GetUnwindState() {
- UnwindState unwind_state;
- void* code_range_start;
- GetCodeRange(&code_range_start, &unwind_state.code_range.length_in_bytes);
- unwind_state.code_range.start = code_range_start;
-
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
- unwind_state.embedded_code_range.start =
- reinterpret_cast<const void*>(isolate->embedded_blob_code());
- unwind_state.embedded_code_range.length_in_bytes =
- isolate->embedded_blob_code_size();
-
- std::array<std::pair<i::Builtins::Name, JSEntryStub*>, 3> entry_stubs = {
- {{i::Builtins::kJSEntry, &unwind_state.js_entry_stub},
- {i::Builtins::kJSConstructEntry, &unwind_state.js_construct_entry_stub},
- {i::Builtins::kJSRunMicrotasksEntry,
- &unwind_state.js_run_microtasks_entry_stub}}};
- for (auto& pair : entry_stubs) {
- i::Code js_entry = isolate->heap()->builtin(pair.first);
- pair.second->code.start =
- reinterpret_cast<const void*>(js_entry.InstructionStart());
- pair.second->code.length_in_bytes = js_entry.InstructionSize();
- }
-
- return unwind_state;
-}
-
JSEntryStubs Isolate::GetJSEntryStubs() {
JSEntryStubs entry_stubs;
@@ -10103,9 +10132,8 @@ debug::ConsoleCallArguments::ConsoleCallArguments(
args.length() > 1 ? args.address_of_first_argument() : nullptr,
args.length() - 1) {}
-int debug::GetStackFrameId(v8::Local<v8::StackFrame> frame) {
- return Utils::OpenHandle(*frame)->id();
-}
+// Marked V8_DEPRECATED.
+int debug::GetStackFrameId(v8::Local<v8::StackFrame> frame) { return 0; }
v8::Local<v8::StackTrace> debug::GetDetailedStackTrace(
Isolate* v8_isolate, v8::Local<v8::Object> v8_error) {
@@ -10216,6 +10244,14 @@ int64_t debug::GetNextRandomInt64(v8::Isolate* v8_isolate) {
->NextInt64();
}
+void debug::EnumerateRuntimeCallCounters(v8::Isolate* v8_isolate,
+ RuntimeCallCounterCallback callback) {
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
+ if (isolate->counters()) {
+ isolate->counters()->runtime_call_stats()->EnumerateCounters(callback);
+ }
+}
+
int debug::GetDebuggingId(v8::Local<v8::Function> function) {
i::Handle<i::JSReceiver> callable = v8::Utils::OpenHandle(*function);
if (!callable->IsJSFunction()) return i::DebugInfo::kNoDebuggingId;
@@ -10633,20 +10669,7 @@ CpuProfilingOptions::CpuProfilingOptions(CpuProfilingMode mode,
MaybeLocal<Context> filter_context)
: mode_(mode),
max_samples_(max_samples),
- sampling_interval_us_(sampling_interval_us) {
- if (!filter_context.IsEmpty()) {
- Local<Context> local_filter_context = filter_context.ToLocalChecked();
- filter_context_.Reset(local_filter_context->GetIsolate(),
- local_filter_context);
- }
-}
-
-void* CpuProfilingOptions::raw_filter_context() const {
- return reinterpret_cast<void*>(
- i::Context::cast(*Utils::OpenPersistent(filter_context_))
- .native_context()
- .address());
-}
+ sampling_interval_us_(sampling_interval_us) {}
void CpuProfiler::Dispose() { delete reinterpret_cast<i::CpuProfiler*>(this); }
@@ -10847,8 +10870,7 @@ static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) {
void HeapSnapshot::Delete() {
i::Isolate* isolate = ToInternal(this)->profiler()->isolate();
- if (isolate->heap_profiler()->GetSnapshotsCount() > 1 ||
- isolate->heap_profiler()->IsTakingSnapshot()) {
+ if (isolate->heap_profiler()->GetSnapshotsCount() > 1) {
ToInternal(this)->Delete();
} else {
// If this is the last snapshot, clean up all accessory data as well.
diff --git a/deps/v8/src/asmjs/asm-js.cc b/deps/v8/src/asmjs/asm-js.cc
index ce9f653ee3..2553ecb919 100644
--- a/deps/v8/src/asmjs/asm-js.cc
+++ b/deps/v8/src/asmjs/asm-js.cc
@@ -297,7 +297,7 @@ inline bool IsValidAsmjsMemorySize(size_t size) {
// Enforce asm.js spec minimum size.
if (size < (1u << 12u)) return false;
// Enforce engine-limited and flag-limited maximum allocation size.
- if (size > wasm::max_initial_mem_pages() * uint64_t{wasm::kWasmPageSize}) {
+ if (size > wasm::max_mem_pages() * uint64_t{wasm::kWasmPageSize}) {
return false;
}
// Enforce power-of-2 sizes for 2^12 - 2^24.
diff --git a/deps/v8/src/asmjs/asm-parser.cc b/deps/v8/src/asmjs/asm-parser.cc
index 559c6b12d0..42179bace1 100644
--- a/deps/v8/src/asmjs/asm-parser.cc
+++ b/deps/v8/src/asmjs/asm-parser.cc
@@ -273,14 +273,14 @@ void AsmJsParser::SkipSemicolon() {
void AsmJsParser::Begin(AsmJsScanner::token_t label) {
BareBegin(BlockKind::kRegular, label);
- current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprBlock, kVoidCode);
}
void AsmJsParser::Loop(AsmJsScanner::token_t label) {
BareBegin(BlockKind::kLoop, label);
size_t position = scanner_.Position();
current_function_builder_->AddAsmWasmOffset(position, position);
- current_function_builder_->EmitWithU8(kExprLoop, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprLoop, kVoidCode);
}
void AsmJsParser::End() {
@@ -459,9 +459,15 @@ void AsmJsParser::ValidateModuleVar(bool mutable_variable) {
if (uvalue > 0x7FFFFFFF) {
FAIL("Numeric literal out of range");
}
- DeclareGlobal(info, mutable_variable,
- mutable_variable ? AsmType::Int() : AsmType::Signed(),
- kWasmI32, WasmInitExpr(-static_cast<int32_t>(uvalue)));
+ if (uvalue == 0) {
+ // '-0' is treated as float.
+ DeclareGlobal(info, mutable_variable, AsmType::Float(), kWasmF32,
+ WasmInitExpr(-0.f));
+ } else {
+ DeclareGlobal(info, mutable_variable,
+ mutable_variable ? AsmType::Int() : AsmType::Signed(),
+ kWasmI32, WasmInitExpr(-static_cast<int32_t>(uvalue)));
+ }
} else {
FAIL("Expected numeric literal");
}
@@ -1049,7 +1055,7 @@ void AsmJsParser::Block() {
bool can_break_to_block = pending_label_ != 0;
if (can_break_to_block) {
BareBegin(BlockKind::kNamed, pending_label_);
- current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprBlock, kVoidCode);
}
pending_label_ = 0;
EXPECT_TOKEN('{');
@@ -1092,7 +1098,7 @@ void AsmJsParser::IfStatement() {
RECURSE(Expression(AsmType::Int()));
EXPECT_TOKEN(')');
BareBegin(BlockKind::kOther);
- current_function_builder_->EmitWithU8(kExprIf, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprIf, kVoidCode);
RECURSE(ValidateStatement());
if (Check(TOK(else))) {
current_function_builder_->Emit(kExprElse);
@@ -1175,7 +1181,7 @@ void AsmJsParser::DoStatement() {
Loop();
// c: block { // but treated like loop so continue works
BareBegin(BlockKind::kLoop, pending_label_);
- current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprBlock, kVoidCode);
pending_label_ = 0;
EXPECT_TOKEN(TOK(do));
// BODY
@@ -1216,7 +1222,7 @@ void AsmJsParser::ForStatement() {
Loop();
// c: block { // but treated like loop so continue works
BareBegin(BlockKind::kLoop, pending_label_);
- current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprBlock, kVoidCode);
pending_label_ = 0;
if (!Peek(';')) {
// if (!CONDITION) break a;
@@ -1316,7 +1322,7 @@ void AsmJsParser::SwitchStatement() {
size_t count = cases.size() + 1;
for (size_t i = 0; i < count; ++i) {
BareBegin(BlockKind::kOther);
- current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid);
+ current_function_builder_->EmitWithU8(kExprBlock, kVoidCode);
}
int table_pos = 0;
for (auto c : cases) {
@@ -2057,7 +2063,7 @@ AsmType* AsmJsParser::ConditionalExpression() {
if (!test->IsA(AsmType::Int())) {
FAILn("Expected int in condition of ternary operator.");
}
- current_function_builder_->EmitWithU8(kExprIf, kLocalI32);
+ current_function_builder_->EmitWithU8(kExprIf, kI32Code);
size_t fixup = current_function_builder_->GetPosition() -
1; // Assumes encoding knowledge.
AsmType* cons = nullptr;
@@ -2068,13 +2074,13 @@ AsmType* AsmJsParser::ConditionalExpression() {
RECURSEn(alt = AssignmentExpression());
current_function_builder_->Emit(kExprEnd);
if (cons->IsA(AsmType::Int()) && alt->IsA(AsmType::Int())) {
- current_function_builder_->FixupByte(fixup, kLocalI32);
+ current_function_builder_->FixupByte(fixup, kI32Code);
return AsmType::Int();
} else if (cons->IsA(AsmType::Double()) && alt->IsA(AsmType::Double())) {
- current_function_builder_->FixupByte(fixup, kLocalF64);
+ current_function_builder_->FixupByte(fixup, kF64Code);
return AsmType::Double();
} else if (cons->IsA(AsmType::Float()) && alt->IsA(AsmType::Float())) {
- current_function_builder_->FixupByte(fixup, kLocalF32);
+ current_function_builder_->FixupByte(fixup, kF32Code);
return AsmType::Float();
} else {
FAILn("Type mismatch in ternary operator.");
@@ -2331,7 +2337,7 @@ AsmType* AsmJsParser::ValidateCall() {
} else {
current_function_builder_->Emit(kExprI32LeS);
}
- current_function_builder_->EmitWithU8(kExprIf, kLocalI32);
+ current_function_builder_->EmitWithU8(kExprIf, kI32Code);
current_function_builder_->EmitGetLocal(tmp_x.get());
current_function_builder_->Emit(kExprElse);
current_function_builder_->EmitGetLocal(tmp_y.get());
diff --git a/deps/v8/src/ast/ast-function-literal-id-reindexer.cc b/deps/v8/src/ast/ast-function-literal-id-reindexer.cc
index 8c9318bfe7..b583b5e421 100644
--- a/deps/v8/src/ast/ast-function-literal-id-reindexer.cc
+++ b/deps/v8/src/ast/ast-function-literal-id-reindexer.cc
@@ -54,10 +54,10 @@ void AstFunctionLiteralIdReindexer::VisitClassLiteral(ClassLiteral* expr) {
// Private fields have their key and value present in
// instance_members_initializer_function, so they will
// already have been visited.
- if (prop->kind() == ClassLiteralProperty::Kind::FIELD) {
- CheckVisited(prop->value());
- } else {
+ if (prop->value()->IsFunctionLiteral()) {
Visit(prop->value());
+ } else {
+ CheckVisited(prop->value());
}
}
ZonePtrList<ClassLiteral::Property>* props = expr->public_members();
@@ -67,8 +67,7 @@ void AstFunctionLiteralIdReindexer::VisitClassLiteral(ClassLiteral* expr) {
// Public fields with computed names have their key
// and value present in instance_members_initializer_function, so they will
// already have been visited.
- if (prop->is_computed_name() &&
- prop->kind() == ClassLiteralProperty::Kind::FIELD) {
+ if (prop->is_computed_name() && !prop->value()->IsFunctionLiteral()) {
if (!prop->key()->IsLiteral()) {
CheckVisited(prop->key());
}
diff --git a/deps/v8/src/ast/scopes.cc b/deps/v8/src/ast/scopes.cc
index 6e0e238d33..c9a3b400a7 100644
--- a/deps/v8/src/ast/scopes.cc
+++ b/deps/v8/src/ast/scopes.cc
@@ -1629,7 +1629,6 @@ const char* Header(ScopeType scope_type, FunctionKind function_kind,
bool is_declaration_scope) {
switch (scope_type) {
case EVAL_SCOPE: return "eval";
- // TODO(adamk): Should we print concise method scopes specially?
case FUNCTION_SCOPE:
if (IsGeneratorFunction(function_kind)) return "function*";
if (IsAsyncFunction(function_kind)) return "async function";
diff --git a/deps/v8/src/base/atomicops.h b/deps/v8/src/base/atomicops.h
index 01a01c5ff4..5d6422be52 100644
--- a/deps/v8/src/base/atomicops.h
+++ b/deps/v8/src/base/atomicops.h
@@ -36,9 +36,25 @@
#include "src/base/base-export.h"
#include "src/base/build_config.h"
+#if defined(V8_OS_STARBOARD)
+#include "starboard/atomic.h"
+
+#if SB_API_VERSION < 10
+#error Your version of Starboard must support SbAtomic8 in order to use V8.
+#endif // SB_API_VERSION < 10
+#endif // V8_OS_STARBOARD
+
namespace v8 {
namespace base {
+#ifdef V8_OS_STARBOARD
+using Atomic8 = SbAtomic8;
+using Atomic16 = int16_t;
+using Atomic32 = SbAtomic32;
+#if SB_IS_64_BIT
+using Atomic64 = SbAtomic64;
+#endif
+#else
using Atomic8 = char;
using Atomic16 = int16_t;
using Atomic32 = int32_t;
@@ -51,10 +67,15 @@ using Atomic64 = int64_t;
using Atomic64 = intptr_t;
#endif // defined(__ILP32__)
#endif // defined(V8_HOST_ARCH_64_BIT)
+#endif // V8_OS_STARBOARD
// Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or
// Atomic64 routines below, depending on your architecture.
+#if defined(V8_OS_STARBOARD)
+using AtomicWord = SbAtomicPtr;
+#else
using AtomicWord = intptr_t;
+#endif
// Atomically execute:
// result = *ptr;
@@ -126,7 +147,7 @@ Atomic64 Acquire_Load(volatile const Atomic64* ptr);
} // namespace base
} // namespace v8
-#if defined(V8_OS_WIN)
+#if defined(V8_OS_WIN) || defined(V8_OS_STARBOARD)
#include "src/base/atomicops_internals_std.h"
#else
// TODO(ulan): Switch to std version after performance regression with Wheezy
diff --git a/deps/v8/src/base/cpu.cc b/deps/v8/src/base/cpu.cc
index bae1afe7d1..c0e9e707aa 100644
--- a/deps/v8/src/base/cpu.cc
+++ b/deps/v8/src/base/cpu.cc
@@ -4,6 +4,10 @@
#include "src/base/cpu.h"
+#if defined(STARBOARD)
+#include "starboard/cpu_features.h"
+#endif
+
#if V8_LIBC_MSVCRT
#include <intrin.h> // __cpuid()
#endif
@@ -347,6 +351,54 @@ static bool HasListItem(const char* list, const char* item) {
#endif // V8_HOST_ARCH_ARM || V8_HOST_ARCH_ARM64 ||
// V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64
+#if defined(STARBOARD)
+
+bool CPU::StarboardDetectCPU() {
+#if (SB_API_VERSION >= 11)
+ SbCPUFeatures features;
+ if (!SbCPUFeaturesGet(&features)) {
+ return false;
+ }
+ architecture_ = features.arm.architecture_generation;
+ switch (features.architecture) {
+ case kSbCPUFeaturesArchitectureArm:
+ case kSbCPUFeaturesArchitectureArm64:
+ has_neon_ = features.arm.has_neon;
+ has_thumb2_ = features.arm.has_thumb2;
+ has_vfp_ = features.arm.has_vfp;
+ has_vfp3_ = features.arm.has_vfp3;
+ has_vfp3_d32_ = features.arm.has_vfp3_d32;
+ has_idiva_ = features.arm.has_idiva;
+ break;
+ case kSbCPUFeaturesArchitectureX86:
+ case kSbCPUFeaturesArchitectureX86_64:
+ // Following flags are mandatory for V8
+ has_cmov_ = features.x86.has_cmov;
+ has_sse2_ = features.x86.has_sse2;
+ // These flags are optional
+ has_sse3_ = features.x86.has_sse3;
+ has_ssse3_ = features.x86.has_ssse3;
+ has_sse41_ = features.x86.has_sse41;
+ has_sahf_ = features.x86.has_sahf;
+ has_avx_ = features.x86.has_avx;
+ has_fma3_ = features.x86.has_fma3;
+ has_bmi1_ = features.x86.has_bmi1;
+ has_bmi2_ = features.x86.has_bmi2;
+ has_lzcnt_ = features.x86.has_lzcnt;
+ has_popcnt_ = features.x86.has_popcnt;
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+#else // SB_API_VERSION >= 11
+ return false;
+#endif
+}
+
+#endif
+
CPU::CPU()
: stepping_(0),
model_(0),
@@ -389,6 +441,13 @@ CPU::CPU()
has_non_stop_time_stamp_counter_(false),
has_msa_(false) {
memcpy(vendor_, "Unknown", 8);
+
+#if defined(STARBOARD)
+ if (StarboardDetectCPU()) {
+ return;
+ }
+#endif
+
#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64
int cpu_info[4];
diff --git a/deps/v8/src/base/macros.h b/deps/v8/src/base/macros.h
index cea15280a4..37cab78f08 100644
--- a/deps/v8/src/base/macros.h
+++ b/deps/v8/src/base/macros.h
@@ -336,14 +336,14 @@ inline T RoundDown(T x, intptr_t m) {
STATIC_ASSERT(std::is_integral<T>::value);
// m must be a power of two.
DCHECK(m != 0 && ((m & (m - 1)) == 0));
- return x & -m;
+ return x & static_cast<T>(-m);
}
template <intptr_t m, typename T>
constexpr inline T RoundDown(T x) {
STATIC_ASSERT(std::is_integral<T>::value);
// m must be a power of two.
STATIC_ASSERT(m != 0 && ((m & (m - 1)) == 0));
- return x & -m;
+ return x & static_cast<T>(-m);
}
// Return the smallest multiple of m which is >= x.
diff --git a/deps/v8/src/base/once.cc b/deps/v8/src/base/once.cc
index dbf6500746..ad0acbaab0 100644
--- a/deps/v8/src/base/once.cc
+++ b/deps/v8/src/base/once.cc
@@ -6,6 +6,8 @@
#ifdef _WIN32
#include <windows.h>
+#elif defined(V8_OS_STARBOARD)
+#include "starboard/thread.h"
#else
#include <sched.h>
#endif
@@ -40,6 +42,8 @@ void CallOnceImpl(OnceType* once, std::function<void()> init_func) {
ONCE_STATE_EXECUTING_FUNCTION) {
#ifdef _WIN32
::Sleep(0);
+#elif defined(V8_OS_STARBOARD)
+ SbThreadYield();
#else
sched_yield();
#endif
diff --git a/deps/v8/src/base/page-allocator.cc b/deps/v8/src/base/page-allocator.cc
index 9f48ee79fe..98b2c69096 100644
--- a/deps/v8/src/base/page-allocator.cc
+++ b/deps/v8/src/base/page-allocator.cc
@@ -6,10 +6,6 @@
#include "src/base/platform/platform.h"
-#if V8_OS_MACOSX
-#include <sys/mman.h> // For MAP_JIT.
-#endif
-
namespace v8 {
namespace base {
@@ -25,8 +21,6 @@ STATIC_ASSERT_ENUM(PageAllocator::kReadWriteExecute,
base::OS::MemoryPermission::kReadWriteExecute);
STATIC_ASSERT_ENUM(PageAllocator::kReadExecute,
base::OS::MemoryPermission::kReadExecute);
-STATIC_ASSERT_ENUM(PageAllocator::kNoAccessWillJitLater,
- base::OS::MemoryPermission::kNoAccessWillJitLater);
#undef STATIC_ASSERT_ENUM
@@ -44,14 +38,6 @@ void* PageAllocator::GetRandomMmapAddr() {
void* PageAllocator::AllocatePages(void* hint, size_t size, size_t alignment,
PageAllocator::Permission access) {
-#if !(V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT))
- // kNoAccessWillJitLater is only used on Apple Silicon. Map it to regular
- // kNoAccess on other platforms, so code doesn't have to handle both enum
- // values.
- if (access == PageAllocator::kNoAccessWillJitLater) {
- access = PageAllocator::kNoAccess;
- }
-#endif
return base::OS::Allocate(hint, size, alignment,
static_cast<base::OS::MemoryPermission>(access));
}
diff --git a/deps/v8/src/base/platform/condition-variable.cc b/deps/v8/src/base/platform/condition-variable.cc
index 5ea70835ee..04ea29181b 100644
--- a/deps/v8/src/base/platform/condition-variable.cc
+++ b/deps/v8/src/base/platform/condition-variable.cc
@@ -159,7 +159,37 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
return result != 0;
}
-#endif // V8_OS_POSIX
+#elif V8_OS_STARBOARD
+
+ConditionVariable::ConditionVariable() {
+ SbConditionVariableCreate(&native_handle_, nullptr);
+}
+
+ConditionVariable::~ConditionVariable() {
+ SbConditionVariableDestroy(&native_handle_);
+}
+
+void ConditionVariable::NotifyOne() {
+ SbConditionVariableSignal(&native_handle_);
+}
+
+void ConditionVariable::NotifyAll() {
+ SbConditionVariableBroadcast(&native_handle_);
+}
+
+void ConditionVariable::Wait(Mutex* mutex) {
+ SbConditionVariableWait(&native_handle_, &mutex->native_handle());
+}
+
+bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
+ SbTime microseconds = static_cast<SbTime>(rel_time.InMicroseconds());
+ SbConditionVariableResult result = SbConditionVariableWaitTimed(
+ &native_handle_, &mutex->native_handle(), microseconds);
+ DCHECK(result != kSbConditionVariableFailed);
+ return result == kSbConditionVariableSignaled;
+}
+
+#endif // V8_OS_STARBOARD
} // namespace base
} // namespace v8
diff --git a/deps/v8/src/base/platform/condition-variable.h b/deps/v8/src/base/platform/condition-variable.h
index e864f32872..8b5c7cf569 100644
--- a/deps/v8/src/base/platform/condition-variable.h
+++ b/deps/v8/src/base/platform/condition-variable.h
@@ -9,6 +9,10 @@
#include "src/base/lazy-instance.h"
#include "src/base/platform/mutex.h"
+#if V8_OS_STARBOARD
+#include "starboard/common/condition_variable.h"
+#endif
+
namespace v8 {
namespace base {
@@ -64,6 +68,8 @@ class V8_BASE_EXPORT ConditionVariable final {
using NativeHandle = pthread_cond_t;
#elif V8_OS_WIN
using NativeHandle = CONDITION_VARIABLE;
+#elif V8_OS_STARBOARD
+ using NativeHandle = SbConditionVariable;
#endif
NativeHandle& native_handle() {
diff --git a/deps/v8/src/base/platform/mutex.cc b/deps/v8/src/base/platform/mutex.cc
index 2e2f7f9320..40702f493e 100644
--- a/deps/v8/src/base/platform/mutex.cc
+++ b/deps/v8/src/base/platform/mutex.cc
@@ -294,7 +294,42 @@ bool SharedMutex::TryLockExclusive() {
return TryAcquireSRWLockExclusive(&native_handle_);
}
-#endif // V8_OS_POSIX
+#elif V8_OS_STARBOARD
+
+Mutex::Mutex() { SbMutexCreate(&native_handle_); }
+
+Mutex::~Mutex() { SbMutexDestroy(&native_handle_); }
+
+void Mutex::Lock() { SbMutexAcquire(&native_handle_); }
+
+void Mutex::Unlock() { SbMutexRelease(&native_handle_); }
+
+RecursiveMutex::RecursiveMutex() {}
+
+RecursiveMutex::~RecursiveMutex() {}
+
+void RecursiveMutex::Lock() { native_handle_.Acquire(); }
+
+void RecursiveMutex::Unlock() { native_handle_.Release(); }
+
+bool RecursiveMutex::TryLock() { return native_handle_.AcquireTry(); }
+
+SharedMutex::SharedMutex() = default;
+
+SharedMutex::~SharedMutex() = default;
+
+void SharedMutex::LockShared() { native_handle_.AcquireReadLock(); }
+
+void SharedMutex::LockExclusive() { native_handle_.AcquireWriteLock(); }
+
+void SharedMutex::UnlockShared() { native_handle_.ReleaseReadLock(); }
+
+void SharedMutex::UnlockExclusive() { native_handle_.ReleaseWriteLock(); }
+
+bool SharedMutex::TryLockShared() { return false; }
+
+bool SharedMutex::TryLockExclusive() { return false; }
+#endif // V8_OS_STARBOARD
} // namespace base
} // namespace v8
diff --git a/deps/v8/src/base/platform/mutex.h b/deps/v8/src/base/platform/mutex.h
index c3144f7ceb..7a19b2f4aa 100644
--- a/deps/v8/src/base/platform/mutex.h
+++ b/deps/v8/src/base/platform/mutex.h
@@ -16,6 +16,12 @@
#include <pthread.h> // NOLINT
#endif
+#if V8_OS_STARBOARD
+#include "starboard/common/mutex.h"
+#include "starboard/common/recursive_mutex.h"
+#include "starboard/common/rwlock.h"
+#endif
+
namespace v8 {
namespace base {
@@ -58,6 +64,8 @@ class V8_BASE_EXPORT Mutex final {
using NativeHandle = pthread_mutex_t;
#elif V8_OS_WIN
using NativeHandle = SRWLOCK;
+#elif V8_OS_STARBOARD
+ using NativeHandle = SbMutex;
#endif
NativeHandle& native_handle() {
@@ -159,6 +167,8 @@ class V8_BASE_EXPORT RecursiveMutex final {
using NativeHandle = pthread_mutex_t;
#elif V8_OS_WIN
using NativeHandle = CRITICAL_SECTION;
+#elif V8_OS_STARBOARD
+ using NativeHandle = starboard::RecursiveMutex;
#endif
NativeHandle native_handle_;
@@ -247,6 +257,8 @@ class V8_BASE_EXPORT SharedMutex final {
using NativeHandle = pthread_rwlock_t;
#elif V8_OS_WIN
using NativeHandle = SRWLOCK;
+#elif V8_OS_STARBOARD
+ using NativeHandle = starboard::RWLock;
#endif
NativeHandle native_handle_;
diff --git a/deps/v8/src/base/platform/platform-cygwin.cc b/deps/v8/src/base/platform/platform-cygwin.cc
index b9da2f1cd5..92a5fbe490 100644
--- a/deps/v8/src/base/platform/platform-cygwin.cc
+++ b/deps/v8/src/base/platform/platform-cygwin.cc
@@ -33,7 +33,6 @@ namespace {
DWORD GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
- case OS::MemoryPermission::kNoAccessWillJitLater:
return PAGE_NOACCESS;
case OS::MemoryPermission::kRead:
return PAGE_READONLY;
diff --git a/deps/v8/src/base/platform/platform-fuchsia.cc b/deps/v8/src/base/platform/platform-fuchsia.cc
index 35a508a140..fa175c3917 100644
--- a/deps/v8/src/base/platform/platform-fuchsia.cc
+++ b/deps/v8/src/base/platform/platform-fuchsia.cc
@@ -18,7 +18,6 @@ namespace {
uint32_t GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
- case OS::MemoryPermission::kNoAccessWillJitLater:
return 0; // no permissions
case OS::MemoryPermission::kRead:
return ZX_VM_PERM_READ;
diff --git a/deps/v8/src/base/platform/platform-posix.cc b/deps/v8/src/base/platform/platform-posix.cc
index 4b49968baa..89173b593a 100644
--- a/deps/v8/src/base/platform/platform-posix.cc
+++ b/deps/v8/src/base/platform/platform-posix.cc
@@ -111,7 +111,7 @@ const int kMmapFd = VM_MAKE_TAG(255);
const int kMmapFd = -1;
#endif // !V8_OS_MACOSX
-#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64
+#if defined(V8_TARGET_OS_MACOSX) && V8_HOST_ARCH_ARM64
// During snapshot generation in cross builds, sysconf() runs on the Intel
// host and returns host page size, while the snapshot needs to use the
// target page size.
@@ -125,7 +125,6 @@ const int kMmapFdOffset = 0;
int GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
- case OS::MemoryPermission::kNoAccessWillJitLater:
return PROT_NONE;
case OS::MemoryPermission::kRead:
return PROT_READ;
@@ -152,12 +151,15 @@ int GetFlagsForMemoryPermission(OS::MemoryPermission access,
#if V8_OS_QNX
flags |= MAP_LAZY;
#endif // V8_OS_QNX
- }
-#if V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT)
- if (access == OS::MemoryPermission::kNoAccessWillJitLater) {
+#if V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT) && \
+ !defined(V8_OS_IOS)
+ // TODO(jkummerow): using the V8_OS_IOS define is a crude approximation
+ // of the fact that we don't want to set the MAP_JIT flag when
+ // FLAG_jitless == true, as src/base/ doesn't know any flags.
+ // TODO(crbug.com/1117591): This is only needed for code spaces.
flags |= MAP_JIT;
- }
#endif
+ }
return flags;
}
@@ -244,21 +246,18 @@ int OS::ActivationFrameAlignment() {
// static
size_t OS::AllocatePageSize() {
-#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64
+#if defined(V8_TARGET_OS_MACOSX) && V8_HOST_ARCH_ARM64
return kAppleArmPageSize;
#else
- return static_cast<size_t>(sysconf(_SC_PAGESIZE));
+ static size_t page_size = static_cast<size_t>(sysconf(_SC_PAGESIZE));
+ return page_size;
#endif
}
// static
size_t OS::CommitPageSize() {
-#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64
- static size_t page_size = kAppleArmPageSize;
-#else
- static size_t page_size = getpagesize();
-#endif
- return page_size;
+ // Commit and allocate page size are the same on posix.
+ return OS::AllocatePageSize();
}
// static
@@ -276,9 +275,13 @@ void* OS::GetRandomMmapAddr() {
MutexGuard guard(rng_mutex.Pointer());
GetPlatformRandomNumberGenerator()->NextBytes(&raw_addr, sizeof(raw_addr));
}
-#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64
+#if V8_HOST_ARCH_ARM64
+#if defined(V8_TARGET_OS_MACOSX)
DCHECK_EQ(1 << 14, AllocatePageSize());
- raw_addr = RoundDown(raw_addr, 1 << 14);
+#endif
+ // Keep the address page-aligned, AArch64 supports 4K, 16K and 64K
+ // configurations.
+ raw_addr = RoundDown(raw_addr, AllocatePageSize());
#endif
#if defined(V8_USE_ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \
defined(THREAD_SANITIZER) || defined(LEAK_SANITIZER)
@@ -681,9 +684,7 @@ FILE* OS::OpenTemporaryFile() {
return tmpfile();
}
-
-const char* const OS::LogFileOpenMode = "w";
-
+const char* const OS::LogFileOpenMode = "w+";
void OS::Print(const char* format, ...) {
va_list args;
@@ -1015,7 +1016,6 @@ void* Stack::GetStackStart() {
pthread_attr_destroy(&attr);
return reinterpret_cast<uint8_t*>(base) + size;
}
- pthread_attr_destroy(&attr);
#if defined(V8_LIBC_GLIBC)
// pthread_getattr_np can fail for the main thread. In this case
diff --git a/deps/v8/src/base/platform/platform-starboard.cc b/deps/v8/src/base/platform/platform-starboard.cc
new file mode 100644
index 0000000000..16bb2d494b
--- /dev/null
+++ b/deps/v8/src/base/platform/platform-starboard.cc
@@ -0,0 +1,499 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Platform-specific code for Starboard goes here. Starboard is the platform
+// abstraction layer for Cobalt, an HTML5 container used mainly by YouTube
+// apps in the livingroom.
+
+#include "src/base/lazy-instance.h"
+#include "src/base/macros.h"
+#include "src/base/platform/platform.h"
+#include "src/base/platform/time.h"
+#include "src/base/timezone-cache.h"
+#include "src/base/utils/random-number-generator.h"
+#include "starboard/common/condition_variable.h"
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/memory.h"
+#include "starboard/time.h"
+#include "starboard/time_zone.h"
+
+namespace v8 {
+namespace base {
+
+#ifdef __arm__
+bool OS::ArmUsingHardFloat() {
+ // GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
+ // the Floating Point ABI used (PCS stands for Procedure Call Standard).
+ // We use these as well as a couple of other defines to statically determine
+ // what FP ABI used.
+ // GCC versions 4.4 and below don't support hard-fp.
+ // GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
+ // __ARM_PCS_VFP.
+
+#define GCC_VERSION \
+ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#if GCC_VERSION >= 40600 && !defined(__clang__)
+#if defined(__ARM_PCS_VFP)
+ return true;
+#else
+ return false;
+#endif
+
+#elif GCC_VERSION < 40500 && !defined(__clang__)
+ return false;
+
+#else
+#if defined(__ARM_PCS_VFP)
+ return true;
+#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
+ !defined(__VFP_FP__)
+ return false;
+#else
+#error \
+ "Your version of compiler does not report the FP ABI compiled for." \
+ "Please report it on this issue" \
+ "http://code.google.com/p/v8/issues/detail?id=2140"
+
+#endif
+#endif
+#undef GCC_VERSION
+}
+#endif // def __arm__
+
+namespace {
+
+static LazyInstance<RandomNumberGenerator>::type
+ platform_random_number_generator = LAZY_INSTANCE_INITIALIZER;
+static LazyMutex rng_mutex = LAZY_MUTEX_INITIALIZER;
+
+bool g_hard_abort = false;
+
+} // namespace
+
+void OS::Initialize(bool hard_abort, const char* const gc_fake_mmap) {
+ g_hard_abort = hard_abort;
+ // This is only used on Posix, we don't need to use it for anything.
+}
+
+int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) {
+#if SB_API_VERSION >= 12
+ if (!SbTimeIsTimeThreadNowSupported()) return -1;
+#endif
+
+#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
+ SbTimeMonotonic thread_now = SbTimeGetMonotonicThreadNow();
+ *secs = thread_now / kSbTimeSecond;
+ *usecs = thread_now % kSbTimeSecond;
+ return 0;
+#else
+ return -1;
+#endif
+}
+
+double OS::TimeCurrentMillis() { return Time::Now().ToJsTime(); }
+
+int OS::ActivationFrameAlignment() {
+#if V8_TARGET_ARCH_ARM
+ // On EABI ARM targets this is required for fp correctness in the
+ // runtime system.
+ return 8;
+#elif V8_TARGET_ARCH_MIPS
+ return 8;
+#elif V8_TARGET_ARCH_S390
+ return 8;
+#else
+ // Otherwise we just assume 16 byte alignment, i.e.:
+ // - With gcc 4.4 the tree vectorization optimizer can generate code
+ // that requires 16 byte alignment such as movdqa on x86.
+ // - Mac OS X, PPC and Solaris (64-bit) activation frames must
+ // be 16 byte-aligned; see "Mac OS X ABI Function Call Guide"
+ return 16;
+#endif
+}
+
+// static
+size_t OS::AllocatePageSize() { return kSbMemoryPageSize; }
+
+// static
+size_t OS::CommitPageSize() { return kSbMemoryPageSize; }
+
+// static
+void OS::SetRandomMmapSeed(int64_t seed) { SB_NOTIMPLEMENTED(); }
+
+// static
+void* OS::GetRandomMmapAddr() { return nullptr; }
+
+void* Allocate(void* address, size_t size, OS::MemoryPermission access) {
+ SbMemoryMapFlags sb_flags;
+ switch (access) {
+ case OS::MemoryPermission::kNoAccess:
+ sb_flags = SbMemoryMapFlags(0);
+ break;
+ case OS::MemoryPermission::kReadWrite:
+ sb_flags = SbMemoryMapFlags(kSbMemoryMapProtectReadWrite);
+ break;
+ default:
+ SB_LOG(ERROR) << "The requested memory allocation access is not"
+ " implemented for Starboard: "
+ << static_cast<int>(access);
+ return nullptr;
+ }
+ void* result = SbMemoryMap(size, sb_flags, "v8::Base::Allocate");
+ if (result == SB_MEMORY_MAP_FAILED) {
+ return nullptr;
+ }
+ return result;
+}
+
+// The following code was taken from old v8 to deal with rounding up pointers.
+namespace {
+// Compute the 0-relative offset of some absolute value x of type T.
+// This allows conversion of Addresses and integral types into
+// 0-relative int offsets.
+template <typename T>
+constexpr inline intptr_t OffsetFrom(T x) {
+ return x - static_cast<T>(0);
+}
+
+// Compute the absolute value of type T for some 0-relative offset x.
+// This allows conversion of 0-relative int offsets into Addresses and
+// integral types.
+template <typename T>
+constexpr inline T AddressFrom(intptr_t x) {
+ return static_cast<T>(static_cast<T>(0) + x);
+}
+
+template <typename T>
+inline T RoundDown(T x, intptr_t m) {
+ // m must be a power of two.
+ DCHECK(m != 0 && ((m & (m - 1)) == 0));
+ return AddressFrom<T>(OffsetFrom(x) & -m);
+}
+
+template <typename T>
+inline T RoundUpOld(T x, intptr_t m) {
+ return RoundDown<T>(static_cast<T>(x + m - 1), m);
+}
+} // namespace
+
+// static
+void* OS::Allocate(void* address, size_t size, size_t alignment,
+ MemoryPermission access) {
+ size_t page_size = AllocatePageSize();
+ DCHECK_EQ(0, size % page_size);
+ DCHECK_EQ(0, alignment % page_size);
+ address = AlignedAddress(address, alignment);
+ // Add the maximum misalignment so we are guaranteed an aligned base address.
+ size_t request_size = size + (alignment - page_size);
+ request_size = RoundUp(request_size, OS::AllocatePageSize());
+ void* result = base::Allocate(address, request_size, access);
+ if (result == nullptr) return nullptr;
+
+ // Unmap memory allocated before the aligned base address.
+ uint8_t* base = static_cast<uint8_t*>(result);
+ uint8_t* aligned_base = RoundUpOld(base, alignment);
+ if (aligned_base != base) {
+ DCHECK_LT(base, aligned_base);
+ size_t prefix_size = static_cast<size_t>(aligned_base - base);
+ CHECK(Free(base, prefix_size));
+ request_size -= prefix_size;
+ }
+ // Unmap memory allocated after the potentially unaligned end.
+ if (size != request_size) {
+ DCHECK_LT(size, request_size);
+ size_t suffix_size = request_size - size;
+ CHECK(Free(aligned_base + size, suffix_size));
+ request_size -= suffix_size;
+ }
+
+ DCHECK_EQ(size, request_size);
+ return static_cast<void*>(aligned_base);
+}
+
+// static
+bool OS::Free(void* address, const size_t size) {
+ return SbMemoryUnmap(address, size);
+}
+
+// static
+bool OS::Release(void* address, size_t size) {
+ return SbMemoryUnmap(address, size);
+}
+
+// static
+bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
+ SbMemoryMapFlags new_protection;
+ switch (access) {
+ case OS::MemoryPermission::kNoAccess:
+ new_protection = SbMemoryMapFlags(0);
+ break;
+ case OS::MemoryPermission::kRead:
+ new_protection = SbMemoryMapFlags(kSbMemoryMapProtectRead);
+ case OS::MemoryPermission::kReadWrite:
+ new_protection = SbMemoryMapFlags(kSbMemoryMapProtectReadWrite);
+ break;
+ case OS::MemoryPermission::kReadExecute:
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
+ new_protection =
+ SbMemoryMapFlags(kSbMemoryMapProtectRead | kSbMemoryMapProtectExec);
+#else
+ UNREACHABLE();
+#endif
+ break;
+ default:
+ // All other types are not supported by Starboard.
+ return false;
+ }
+ return SbMemoryProtect(address, size, new_protection);
+}
+
+// static
+bool OS::HasLazyCommits() {
+ SB_NOTIMPLEMENTED();
+ return false;
+}
+
+void OS::Sleep(TimeDelta interval) { SbThreadSleep(interval.InMicroseconds()); }
+
+void OS::Abort() { SbSystemBreakIntoDebugger(); }
+
+void OS::DebugBreak() { SbSystemBreakIntoDebugger(); }
+
+class StarboardMemoryMappedFile final : public OS::MemoryMappedFile {
+ public:
+ ~StarboardMemoryMappedFile() final;
+ void* memory() const final {
+ SB_NOTIMPLEMENTED();
+ return nullptr;
+ }
+ size_t size() const final {
+ SB_NOTIMPLEMENTED();
+ return 0u;
+ }
+};
+
+// static
+OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name,
+ FileMode mode) {
+ SB_NOTIMPLEMENTED();
+ return nullptr;
+}
+
+// static
+OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name,
+ size_t size, void* initial) {
+ SB_NOTIMPLEMENTED();
+ return nullptr;
+}
+
+StarboardMemoryMappedFile::~StarboardMemoryMappedFile() { SB_NOTIMPLEMENTED(); }
+
+int OS::GetCurrentProcessId() {
+ SB_NOTIMPLEMENTED();
+ return 0;
+}
+
+int OS::GetCurrentThreadId() { return SbThreadGetId(); }
+
+int OS::GetLastError() { return SbSystemGetLastError(); }
+
+// ----------------------------------------------------------------------------
+// POSIX stdio support.
+//
+
+FILE* OS::FOpen(const char* path, const char* mode) {
+ SB_NOTIMPLEMENTED();
+ return nullptr;
+}
+
+bool OS::Remove(const char* path) {
+ SB_NOTIMPLEMENTED();
+ return false;
+}
+
+char OS::DirectorySeparator() { return kSbFileSepChar; }
+
+bool OS::isDirectorySeparator(const char ch) {
+ return ch == DirectorySeparator();
+}
+
+FILE* OS::OpenTemporaryFile() {
+ SB_NOTIMPLEMENTED();
+ return nullptr;
+}
+
+const char* const OS::LogFileOpenMode = "\0";
+
+void OS::Print(const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ VPrint(format, args);
+ va_end(args);
+}
+
+void OS::VPrint(const char* format, va_list args) {
+ SbLogRawFormat(format, args);
+}
+
+void OS::FPrint(FILE* out, const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ VPrintError(format, args);
+ va_end(args);
+}
+
+void OS::VFPrint(FILE* out, const char* format, va_list args) {
+ SbLogRawFormat(format, args);
+}
+
+void OS::PrintError(const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ VPrintError(format, args);
+ va_end(args);
+}
+
+void OS::VPrintError(const char* format, va_list args) {
+ // Starboard has no concept of stderr vs stdout.
+ SbLogRawFormat(format, args);
+}
+
+int OS::SNPrintF(char* str, int length, const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ int result = VSNPrintF(str, length, format, args);
+ va_end(args);
+ return result;
+}
+
+int OS::VSNPrintF(char* str, int length, const char* format, va_list args) {
+ int n = SbStringFormat(str, length, format, args);
+ if (n < 0 || n >= length) {
+ // If the length is zero, the assignment fails.
+ if (length > 0) str[length - 1] = '\0';
+ return -1;
+ } else {
+ return n;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// POSIX string support.
+//
+
+void OS::StrNCpy(char* dest, int length, const char* src, size_t n) {
+ SbStringCopy(dest, src, n);
+}
+
+// ----------------------------------------------------------------------------
+// POSIX thread support.
+//
+
+class Thread::PlatformData {
+ public:
+ PlatformData() : thread_(kSbThreadInvalid) {}
+ SbThread thread_; // Thread handle for pthread.
+ // Synchronizes thread creation
+ Mutex thread_creation_mutex_;
+};
+
+Thread::Thread(const Options& options)
+ : data_(new PlatformData),
+ stack_size_(options.stack_size()),
+ start_semaphore_(nullptr) {
+ set_name(options.name());
+}
+
+Thread::~Thread() { delete data_; }
+
+static void SetThreadName(const char* name) { SbThreadSetName(name); }
+
+static void* ThreadEntry(void* arg) {
+ Thread* thread = reinterpret_cast<Thread*>(arg);
+ // We take the lock here to make sure that pthread_create finished first since
+ // we don't know which thread will run first (the original thread or the new
+ // one).
+ { LockGuard<Mutex> lock_guard(&thread->data()->thread_creation_mutex_); }
+ SetThreadName(thread->name());
+ // DCHECK_NE(thread->data()->thread_, kNoThread);
+ thread->NotifyStartedAndRun();
+
+ return nullptr;
+}
+
+void Thread::set_name(const char* name) {
+ strncpy(name_, name, sizeof(name_));
+ name_[sizeof(name_) - 1] = '\0';
+}
+
+void Thread::Start() {
+ data_->thread_ =
+ SbThreadCreate(stack_size_, kSbThreadNoPriority, kSbThreadNoAffinity,
+ true, name_, ThreadEntry, this);
+}
+
+void Thread::Join() { SbThreadJoin(data_->thread_, nullptr); }
+
+Thread::LocalStorageKey Thread::CreateThreadLocalKey() {
+ return SbThreadCreateLocalKey(nullptr);
+}
+
+void Thread::DeleteThreadLocalKey(LocalStorageKey key) {
+ SbThreadDestroyLocalKey(key);
+}
+
+void* Thread::GetThreadLocal(LocalStorageKey key) {
+ return SbThreadGetLocalValue(key);
+}
+
+void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
+ bool result = SbThreadSetLocalValue(key, value);
+ DCHECK(result);
+}
+
+class StarboardTimezoneCache : public TimezoneCache {
+ public:
+ double DaylightSavingsOffset(double time_ms) override { return 0.0; }
+ void Clear(TimeZoneDetection time_zone_detection) override {}
+ ~StarboardTimezoneCache() override {}
+
+ protected:
+ static const int msPerSecond = 1000;
+};
+
+class StarboardDefaultTimezoneCache : public StarboardTimezoneCache {
+ public:
+ const char* LocalTimezone(double time_ms) override {
+ return SbTimeZoneGetName();
+ }
+ double LocalTimeOffset(double time_ms, bool is_utc) override {
+ return SbTimeZoneGetCurrent() * 60000.0;
+ }
+
+ ~StarboardDefaultTimezoneCache() override {}
+};
+
+TimezoneCache* OS::CreateTimezoneCache() {
+ return new StarboardDefaultTimezoneCache();
+}
+
+std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() {
+ SB_NOTIMPLEMENTED();
+ return {};
+}
+
+void OS::SignalCodeMovingGC() { SB_NOTIMPLEMENTED(); }
+
+void OS::AdjustSchedulingParams() {}
+
+bool OS::DiscardSystemPages(void* address, size_t size) {
+ // Starboard API does not support this function yet.
+ return true;
+}
+
+} // namespace base
+} // namespace v8
diff --git a/deps/v8/src/base/platform/platform-win32.cc b/deps/v8/src/base/platform/platform-win32.cc
index 6be63dee13..3eb11d88f5 100644
--- a/deps/v8/src/base/platform/platform-win32.cc
+++ b/deps/v8/src/base/platform/platform-win32.cc
@@ -603,8 +603,7 @@ FILE* OS::OpenTemporaryFile() {
// Open log file in binary mode to avoid /n -> /r/n conversion.
-const char* const OS::LogFileOpenMode = "wb";
-
+const char* const OS::LogFileOpenMode = "wb+";
// Print (debug) message to console.
void OS::Print(const char* format, ...) {
@@ -753,7 +752,6 @@ namespace {
DWORD GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
- case OS::MemoryPermission::kNoAccessWillJitLater:
return PAGE_NOACCESS;
case OS::MemoryPermission::kRead:
return PAGE_READONLY;
@@ -1398,9 +1396,11 @@ void OS::AdjustSchedulingParams() {}
// static
void* Stack::GetStackStart() {
#if defined(V8_TARGET_ARCH_X64)
- return reinterpret_cast<void*>(__readgsqword(offsetof(NT_TIB64, StackBase)));
+ return reinterpret_cast<void*>(
+ reinterpret_cast<NT_TIB64*>(NtCurrentTeb())->StackBase);
#elif defined(V8_TARGET_ARCH_32_BIT)
- return reinterpret_cast<void*>(__readfsdword(offsetof(NT_TIB, StackBase)));
+ return reinterpret_cast<void*>(
+ reinterpret_cast<NT_TIB*>(NtCurrentTeb())->StackBase);
#elif defined(V8_TARGET_ARCH_ARM64)
// Windows 8 and later, see
// https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits
diff --git a/deps/v8/src/base/platform/platform.h b/deps/v8/src/base/platform/platform.h
index c4895a5b27..caa063944e 100644
--- a/deps/v8/src/base/platform/platform.h
+++ b/deps/v8/src/base/platform/platform.h
@@ -74,6 +74,9 @@ inline intptr_t InternalGetExistingThreadLocal(intptr_t index) {
#elif defined(__APPLE__) && (V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64)
+// tvOS simulator does not use intptr_t as TLS key.
+#if !defined(V8_OS_STARBOARD) || !defined(TARGET_OS_SIMULATOR)
+
#define V8_FAST_TLS_SUPPORTED 1
extern V8_BASE_EXPORT intptr_t kMacTlsBaseOffset;
@@ -94,6 +97,8 @@ inline intptr_t InternalGetExistingThreadLocal(intptr_t index) {
return result;
}
+#endif // !defined(V8_OS_STARBOARD) || !defined(TARGET_OS_SIMULATOR)
+
#endif
#endif // V8_NO_FAST_TLS
@@ -167,10 +172,7 @@ class V8_BASE_EXPORT OS {
kReadWrite,
// TODO(hpayer): Remove this flag. Memory should never be rwx.
kReadWriteExecute,
- kReadExecute,
- // TODO(jkummerow): Remove this when Wasm has a platform-independent
- // w^x implementation.
- kNoAccessWillJitLater
+ kReadExecute
};
static bool HasLazyCommits();
@@ -326,7 +328,11 @@ inline void EnsureConsoleOutput() {
class V8_BASE_EXPORT Thread {
public:
// Opaque data type for thread-local storage keys.
+#if V8_OS_STARBOARD
+ using LocalStorageKey = SbThreadLocalKey;
+#else
using LocalStorageKey = int32_t;
+#endif
class Options {
public:
diff --git a/deps/v8/src/base/platform/semaphore.cc b/deps/v8/src/base/platform/semaphore.cc
index 66464d8258..0cd04634ba 100644
--- a/deps/v8/src/base/platform/semaphore.cc
+++ b/deps/v8/src/base/platform/semaphore.cc
@@ -157,6 +157,21 @@ bool Semaphore::WaitFor(const TimeDelta& rel_time) {
}
}
+#elif V8_OS_STARBOARD
+
+Semaphore::Semaphore(int count) : native_handle_(count) { DCHECK_GE(count, 0); }
+
+Semaphore::~Semaphore() {}
+
+void Semaphore::Signal() { native_handle_.Put(); }
+
+void Semaphore::Wait() { native_handle_.Take(); }
+
+bool Semaphore::WaitFor(const TimeDelta& rel_time) {
+ SbTime microseconds = rel_time.InMicroseconds();
+ return native_handle_.TakeWait(microseconds);
+}
+
#endif // V8_OS_MACOSX
} // namespace base
diff --git a/deps/v8/src/base/platform/semaphore.h b/deps/v8/src/base/platform/semaphore.h
index c4937acadd..0c0b877da2 100644
--- a/deps/v8/src/base/platform/semaphore.h
+++ b/deps/v8/src/base/platform/semaphore.h
@@ -17,6 +17,10 @@
#include <semaphore.h> // NOLINT
#endif
+#if V8_OS_STARBOARD
+#include "starboard/common/semaphore.h"
+#endif
+
namespace v8 {
namespace base {
@@ -55,6 +59,8 @@ class V8_BASE_EXPORT Semaphore final {
using NativeHandle = sem_t;
#elif V8_OS_WIN
using NativeHandle = HANDLE;
+#elif V8_OS_STARBOARD
+ using NativeHandle = starboard::Semaphore;
#endif
NativeHandle& native_handle() {
diff --git a/deps/v8/src/base/platform/time.cc b/deps/v8/src/base/platform/time.cc
index e72f90d214..78574b776d 100644
--- a/deps/v8/src/base/platform/time.cc
+++ b/deps/v8/src/base/platform/time.cc
@@ -26,6 +26,10 @@
#include "src/base/logging.h"
#include "src/base/platform/platform.h"
+#if V8_OS_STARBOARD
+#include "starboard/time.h"
+#endif
+
namespace {
#if V8_OS_MACOSX
@@ -449,7 +453,13 @@ struct timeval Time::ToTimeval() const {
return tv;
}
-#endif // V8_OS_WIN
+#elif V8_OS_STARBOARD
+
+Time Time::Now() { return Time(SbTimeToPosix(SbTimeGetNow())); }
+
+Time Time::NowFromSystemTime() { return Now(); }
+
+#endif // V8_OS_STARBOARD
// static
TimeTicks TimeTicks::HighResolutionNow() {
@@ -717,6 +727,8 @@ TimeTicks TimeTicks::Now() {
ticks = (gethrtime() / Time::kNanosecondsPerMicrosecond);
#elif V8_OS_POSIX
ticks = ClockNow(CLOCK_MONOTONIC);
+#elif V8_OS_STARBOARD
+ ticks = SbTimeGetMonotonicNow();
#else
#error platform does not implement TimeTicks::HighResolutionNow.
#endif // V8_OS_MACOSX
@@ -740,7 +752,15 @@ bool TimeTicks::IsHighResolution() {
bool ThreadTicks::IsSupported() {
-#if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
+#if V8_OS_STARBOARD
+#if SB_API_VERSION >= 12
+ return SbTimeIsTimeThreadNowSupported();
+#elif SB_HAS(TIME_THREAD_NOW)
+ return true;
+#else
+ return false;
+#endif
+#elif(defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
defined(V8_OS_MACOSX) || defined(V8_OS_ANDROID) || defined(V8_OS_SOLARIS)
return true;
#elif defined(V8_OS_WIN)
@@ -752,7 +772,17 @@ bool ThreadTicks::IsSupported() {
ThreadTicks ThreadTicks::Now() {
-#if V8_OS_MACOSX
+#if V8_OS_STARBOARD
+#if SB_API_VERSION >= 12
+ if (SbTimeIsTimeThreadNowSupported())
+ return ThreadTicks(SbTimeGetMonotonicThreadNow());
+ UNREACHABLE();
+#elif SB_HAS(TIME_THREAD_NOW)
+ return ThreadTicks(SbTimeGetMonotonicThreadNow());
+#else
+ UNREACHABLE();
+#endif
+#elif V8_OS_MACOSX
return ThreadTicks(ComputeThreadTicks());
#elif(defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
defined(V8_OS_ANDROID)
diff --git a/deps/v8/src/base/platform/time.h b/deps/v8/src/base/platform/time.h
index 7f1fe9d632..2fc7859dd7 100644
--- a/deps/v8/src/base/platform/time.h
+++ b/deps/v8/src/base/platform/time.h
@@ -91,6 +91,9 @@ class V8_BASE_EXPORT TimeDelta final {
return TimeDelta(nanoseconds / TimeConstants::kNanosecondsPerMicrosecond);
}
+ static TimeDelta FromSecondsD(double seconds) {
+ return FromDouble(seconds * TimeConstants::kMicrosecondsPerSecond);
+ }
static TimeDelta FromMillisecondsD(double milliseconds) {
return FromDouble(milliseconds *
TimeConstants::kMicrosecondsPerMillisecond);
diff --git a/deps/v8/src/builtins/accessors.cc b/deps/v8/src/builtins/accessors.cc
index cc99b1e6c4..4258b07a7b 100644
--- a/deps/v8/src/builtins/accessors.cc
+++ b/deps/v8/src/builtins/accessors.cc
@@ -462,16 +462,20 @@ Handle<JSObject> GetFrameArguments(Isolate* isolate,
return ArgumentsForInlinedFunction(frame, function_index);
}
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ const int length = frame->GetActualArgumentCount();
+#else
// Find the frame that holds the actual arguments passed to the function.
if (it->frame()->has_adapted_arguments()) {
it->AdvanceOneFrame();
DCHECK(it->frame()->is_arguments_adaptor());
}
frame = it->frame();
-
- // Get the number of arguments and construct an arguments object
- // mirror for the right frame and the underlying function.
const int length = frame->ComputeParametersCount();
+#endif
+
+ // Construct an arguments object mirror for the right frame and the underlying
+ // function.
Handle<JSFunction> function(frame->function(), isolate);
Handle<JSObject> arguments =
isolate->factory()->NewArgumentsObject(function, length);
diff --git a/deps/v8/src/builtins/arm/builtins-arm.cc b/deps/v8/src/builtins/arm/builtins-arm.cc
index 982c1abbd0..e0a6ee1611 100644
--- a/deps/v8/src/builtins/arm/builtins-arm.cc
+++ b/deps/v8/src/builtins/arm/builtins-arm.cc
@@ -45,20 +45,26 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- r0 : actual argument count
// -- r1 : target function (preserved for callee)
// -- r3 : new target (preserved for callee)
// -----------------------------------
{
FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
// Push function as parameter to the runtime call.
- __ Push(r1, r3, r1);
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
__ mov(r2, r0);
- // Restore target function and new target.
- __ Pop(r1, r3);
+ // Restore target function, new target and actual argument count.
+ __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == r2, "ABI mismatch");
__ JumpCodeObject(r2);
@@ -532,6 +538,13 @@ constexpr int kPushedStackSpace = kNumCalleeSaved * kPointerSize +
4 * kPointerSize /* r5, r6, r7, scratch */ +
EntryFrameConstants::kCallerFPOffset;
+// Assert that the EntryFrameConstants are in sync with the builtin.
+static_assert(kPushedStackSpace == EntryFrameConstants::kDirectCallerSPOffset +
+ 3 * kPointerSize /* r5, r6, r7*/ +
+ EntryFrameConstants::kCallerFPOffset,
+ "Pushed stack space and frame constants do not match. See "
+ "frame-constants-arm.h");
+
// Called with the native C calling convention. The corresponding function
// signature is either:
//
@@ -896,6 +909,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch) {
// ----------- S t a t e -------------
+ // -- r0 : actual argument count
// -- r3 : new target (preserved for callee if needed, and caller)
// -- r1 : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -929,6 +943,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- r0 : actual argument count
// -- r3 : new target (preserved for callee if needed, and caller)
// -- r1 : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -1040,10 +1055,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o r0: actual argument count (not including the receiver)
// o r1: the JS function object being called.
// o r3: the incoming new target or generator object
// o cp: our context
@@ -1059,15 +1074,15 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
- __ ldr(r0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ __ ldr(r4, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
__ ldr(kInterpreterBytecodeArrayRegister,
- FieldMemOperand(r0, SharedFunctionInfo::kFunctionDataOffset));
- GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r4);
+ FieldMemOperand(r4, SharedFunctionInfo::kFunctionDataOffset));
+ GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r8);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ CompareObjectType(kInterpreterBytecodeArrayRegister, r0, no_reg,
+ __ CompareObjectType(kInterpreterBytecodeArrayRegister, r4, no_reg,
BYTECODE_ARRAY_TYPE);
__ b(ne, &compile_lazy);
@@ -1129,8 +1144,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
Operand(BytecodeArray::kHeaderSize - kHeapObjectTag));
// Push bytecode array and Smi tagged bytecode array offset.
- __ SmiTag(r0, kInterpreterBytecodeOffsetRegister);
- __ Push(kInterpreterBytecodeArrayRegister, r0);
+ __ SmiTag(r4, kInterpreterBytecodeOffsetRegister);
+ __ Push(kInterpreterBytecodeArrayRegister, r4);
// Allocate the local and temporary register file on the stack.
Label stack_overflow;
@@ -2105,31 +2120,69 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ sub(r5, r5, r2, SetCC);
__ b(le, &stack_done);
{
+ // ----------- S t a t e -------------
+ // -- r0 : the number of arguments already in the stack (not including the
+ // receiver)
+ // -- r1 : the target to call (can be any Object)
+ // -- r2 : start index (to support rest parameters)
+ // -- r3 : the new.target (for [[Construct]] calls)
+ // -- r4 : point to the caller stack frame
+ // -- r5 : number of arguments to copy, i.e. arguments count - start index
+ // -----------------------------------
+
// Check for stack overflow.
- Generate_StackOverflowCheck(masm, r5, r2, &stack_overflow);
+ Generate_StackOverflowCheck(masm, r5, scratch, &stack_overflow);
// Forward the arguments from the caller frame.
+#ifdef V8_REVERSE_JSARGS
+ // Point to the first argument to copy (skipping the receiver).
+ __ add(r4, r4,
+ Operand(CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ add(r4, r4, Operand(r2, LSL, kSystemPointerSizeLog2));
+
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy, check;
+ Register num = r8, src = r9,
+ dest = r2; // r7 and r10 are context and root.
+ __ mov(src, sp);
+ // Update stack pointer.
+ __ lsl(scratch, r5, Operand(kSystemPointerSizeLog2));
+ __ AllocateStackSpace(scratch);
+ __ mov(dest, sp);
+ __ mov(num, r0);
+ __ b(&check);
+ __ bind(&copy);
+ __ ldr(scratch, MemOperand(src, kSystemPointerSize, PostIndex));
+ __ str(scratch, MemOperand(dest, kSystemPointerSize, PostIndex));
+ __ sub(num, num, Operand(1), SetCC);
+ __ bind(&check);
+ __ b(ge, &copy);
+ }
+#endif
+ // Copy arguments from the caller frame.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
{
Label loop;
-#ifdef V8_REVERSE_JSARGS
- // Skips frame pointer and old receiver.
- __ add(r4, r4, Operand(2 * kPointerSize));
- __ pop(r8); // Save new receiver.
-#else
+#ifndef V8_REVERSE_JSARGS
// Skips frame pointer.
- __ add(r4, r4, Operand(kPointerSize));
+ __ add(r4, r4, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp));
#endif
__ add(r0, r0, r5);
__ bind(&loop);
{
- __ ldr(scratch, MemOperand(r4, r5, LSL, kPointerSizeLog2));
- __ push(scratch);
__ sub(r5, r5, Operand(1), SetCC);
- __ b(ne, &loop);
- }
+ __ ldr(scratch, MemOperand(r4, r5, LSL, kSystemPointerSizeLog2));
#ifdef V8_REVERSE_JSARGS
- __ push(r8); // Recover new receiver.
+ __ str(scratch, MemOperand(r2, r5, LSL, kSystemPointerSizeLog2));
+#else
+ __ push(scratch);
#endif
+ __ b(ne, &loop);
+ }
}
}
__ b(&stack_done);
diff --git a/deps/v8/src/builtins/arm64/builtins-arm64.cc b/deps/v8/src/builtins/arm64/builtins-arm64.cc
index e34b07908b..be6d70eb08 100644
--- a/deps/v8/src/builtins/arm64/builtins-arm64.cc
+++ b/deps/v8/src/builtins/arm64/builtins-arm64.cc
@@ -45,21 +45,27 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- x0 : actual argument count
// -- x1 : target function (preserved for callee)
// -- x3 : new target (preserved for callee)
// -----------------------------------
{
FrameScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister, padreg);
// Push another copy as a parameter to the runtime call.
- __ Push(x1, x3);
- __ PushArgument(x1);
+ __ PushArgument(kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
__ Mov(x2, x0);
- // Restore target function and new target.
- __ Pop(x3, x1);
+ // Restore target function, new target and actual argument count.
+ __ Pop(padreg, kJavaScriptCallArgCountRegister,
+ kJavaScriptCallNewTargetRegister, kJavaScriptCallTargetRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == x2, "ABI mismatch");
@@ -1041,6 +1047,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch) {
// ----------- S t a t e -------------
+ // -- x0 : actual argument count
// -- x3 : new target (preserved for callee if needed, and caller)
// -- x1 : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -1081,6 +1088,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- x0 : actual argument count
// -- x3 : new target (preserved for callee if needed, and caller)
// -- x1 : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -1189,10 +1197,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// - x0: actual argument count (not including the receiver)
// - x1: the JS function object being called.
// - x3: the incoming new target or generator object
// - cp: our context.
@@ -1208,16 +1216,16 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
__ LoadTaggedPointerField(
- x0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ x4, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
__ LoadTaggedPointerField(
kInterpreterBytecodeArrayRegister,
- FieldMemOperand(x0, SharedFunctionInfo::kFunctionDataOffset));
+ FieldMemOperand(x4, SharedFunctionInfo::kFunctionDataOffset));
GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, x11);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ CompareObjectType(kInterpreterBytecodeArrayRegister, x0, x0,
+ __ CompareObjectType(kInterpreterBytecodeArrayRegister, x4, x4,
BYTECODE_ARRAY_TYPE);
__ B(ne, &compile_lazy);
@@ -1266,8 +1274,9 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// the frame (that is done below).
__ Bind(&push_stack_frame);
FrameScope frame_scope(masm, StackFrame::MANUAL);
- __ Push<TurboAssembler::kSignLR>(lr, fp, cp, closure);
- __ Add(fp, sp, StandardFrameConstants::kFixedFrameSizeFromFp);
+ __ Push<TurboAssembler::kSignLR>(lr, fp);
+ __ mov(fp, sp);
+ __ Push(cp, closure);
// Reset code age.
// Reset code age and the OSR arming. The OSR field and BytecodeAgeOffset are
@@ -1283,9 +1292,13 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
__ Mov(kInterpreterBytecodeOffsetRegister,
Operand(BytecodeArray::kHeaderSize - kHeapObjectTag));
- // Push bytecode array and Smi tagged bytecode array offset.
- __ SmiTag(x0, kInterpreterBytecodeOffsetRegister);
- __ Push(kInterpreterBytecodeArrayRegister, x0);
+ // Push actual argument count, bytecode array, Smi tagged bytecode array
+ // offset and an undefined (to properly align the stack pointer).
+ STATIC_ASSERT(TurboAssembler::kExtraSlotClaimedByPrologue == 1);
+ __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
+ __ SmiTag(x6, kInterpreterBytecodeOffsetRegister);
+ __ Push(kJavaScriptCallArgCountRegister, kInterpreterBytecodeArrayRegister,
+ x6, kInterpreterAccumulatorRegister);
// Allocate the local and temporary register file on the stack.
Label stack_overflow;
@@ -1308,11 +1321,9 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Note: there should always be at least one stack slot for the return
// register in the register file.
Label loop_header;
- __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
__ Lsr(x11, x11, kSystemPointerSizeLog2);
- // Round up the number of registers to a multiple of 2, to align the stack
- // to 16 bytes.
- __ Add(x11, x11, 1);
+ // Round down (since we already have an undefined in the stack) the number
+ // of registers to a multiple of 2, to align the stack to 16 bytes.
__ Bic(x11, x11, 1);
__ PushMultipleTimes(kInterpreterAccumulatorRegister, x11);
__ Bind(&loop_header);
@@ -2308,6 +2319,7 @@ void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
// one slot up or one slot down, as needed.
void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc,
Register len) {
+ Label exit;
#ifdef V8_REVERSE_JSARGS
Label even;
Register slots_to_copy = x10;
@@ -2330,6 +2342,7 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc,
}
__ Bind(&even);
+ __ Cbz(slots_to_claim, &exit);
__ Claim(slots_to_claim);
// Move the arguments already in the stack including the receiver.
@@ -2341,7 +2354,7 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc,
__ CopyDoubleWords(dst, src, slots_to_copy);
}
#else // !V8_REVERSE_JSARGS
- Label len_odd, exit;
+ Label len_odd;
Register slots_to_copy = x10; // If needed.
__ Add(slots_to_copy, argc, 1);
__ Add(argc, argc, len);
@@ -2393,8 +2406,8 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc,
Operand(scratch, LSL, kSystemPointerSizeLog2)); // Store padding.
}
- __ Bind(&exit);
#endif // !V8_REVERSE_JSARGS
+ __ Bind(&exit);
}
} // namespace
@@ -2562,8 +2575,21 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
// Push varargs.
{
Register dst = x13;
- __ Add(args_fp, args_fp, 2 * kSystemPointerSize);
+#ifdef V8_REVERSE_JSARGS
+ // Point to the fist argument to copy from (skipping receiver).
+ __ Add(args_fp, args_fp,
+ CommonFrameConstants::kFixedFrameSizeAboveFp + kSystemPointerSize);
+ __ lsl(start_index, start_index, kSystemPointerSizeLog2);
+ __ Add(args_fp, args_fp, start_index);
+ // Point to the position to copy to.
+ __ Add(x10, argc, 1);
+ __ SlotAddress(dst, x10);
+ // Update total number of arguments.
+ __ Add(argc, argc, len);
+#else
+ __ Add(args_fp, args_fp, CommonFrameConstants::kFixedFrameSizeAboveFp);
__ SlotAddress(dst, 0);
+#endif
__ CopyDoubleWords(dst, args_fp, len);
}
__ B(&stack_done);
@@ -3438,7 +3464,7 @@ void Builtins::Generate_WasmDebugBreak(MacroAssembler* masm) {
// Save all parameter registers. They might hold live values, we restore
// them after the runtime call.
__ PushXRegList(WasmDebugBreakFrameConstants::kPushedGpRegs);
- __ PushDRegList(WasmDebugBreakFrameConstants::kPushedFpRegs);
+ __ PushQRegList(WasmDebugBreakFrameConstants::kPushedFpRegs);
// Initialize the JavaScript context with 0. CEntry will use it to
// set the current context on the isolate.
@@ -3446,7 +3472,7 @@ void Builtins::Generate_WasmDebugBreak(MacroAssembler* masm) {
__ CallRuntime(Runtime::kWasmDebugBreak, 0);
// Restore registers.
- __ PopDRegList(WasmDebugBreakFrameConstants::kPushedFpRegs);
+ __ PopQRegList(WasmDebugBreakFrameConstants::kPushedFpRegs);
__ PopXRegList(WasmDebugBreakFrameConstants::kPushedGpRegs);
}
__ Ret();
diff --git a/deps/v8/src/builtins/array-reverse.tq b/deps/v8/src/builtins/array-reverse.tq
index 11c325140e..fe9df2b9b5 100644
--- a/deps/v8/src/builtins/array-reverse.tq
+++ b/deps/v8/src/builtins/array-reverse.tq
@@ -45,7 +45,7 @@ StoreElement<array::FastPackedDoubleElements, float64>(
implicit context: Context)(
elements: FixedArrayBase, index: Smi, value: float64) {
const elems: FixedDoubleArray = UnsafeCast<FixedDoubleArray>(elements);
- StoreFixedDoubleArrayElementSmi(elems, index, value);
+ StoreFixedDoubleArrayElement(elems, index, value);
}
// Fast-path for all PACKED_* elements kinds. These do not need to check
diff --git a/deps/v8/src/builtins/arraybuffer.tq b/deps/v8/src/builtins/arraybuffer.tq
new file mode 100644
index 0000000000..179c4b38fd
--- /dev/null
+++ b/deps/v8/src/builtins/arraybuffer.tq
@@ -0,0 +1,66 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+namespace arraybuffer {
+
+// #sec-get-arraybuffer.prototype.bytelength
+transitioning javascript builtin ArrayBufferPrototypeGetByteLength(
+ js-implicit context: NativeContext, receiver: JSAny)(): Number {
+ // 1. Let O be the this value.
+ // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
+ const o = Cast<JSArrayBuffer>(receiver) otherwise
+ ThrowTypeError(
+ MessageTemplate::kIncompatibleMethodReceiver,
+ 'get ArrayBuffer.prototype.byteLength', receiver);
+ // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
+ if (IsSharedArrayBuffer(o)) {
+ ThrowTypeError(
+ MessageTemplate::kIncompatibleMethodReceiver,
+ 'get ArrayBuffer.prototype.byteLength', receiver);
+ }
+ // 4. If IsDetachedBuffer(O) is true, throw a TypeError exception.
+ // TODO(v8:4895): We don't actually throw here.
+ // 5. Let length be O.[[ArrayBufferByteLength]].
+ const length = o.byte_length;
+ // 6. Return length.
+ return Convert<Number>(length);
+}
+
+// #sec-get-sharedarraybuffer.prototype.bytelength
+transitioning javascript builtin SharedArrayBufferPrototypeGetByteLength(
+ js-implicit context: NativeContext, receiver: JSAny)(): Number {
+ // 1. Let O be the this value.
+ // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
+ const o = Cast<JSArrayBuffer>(receiver) otherwise
+ ThrowTypeError(
+ MessageTemplate::kIncompatibleMethodReceiver,
+ 'get SharedArrayBuffer.prototype.byteLength', receiver);
+ // 3. If IsSharedArrayBuffer(O) is false, throw a TypeError exception.
+ if (!IsSharedArrayBuffer(o)) {
+ ThrowTypeError(
+ MessageTemplate::kIncompatibleMethodReceiver,
+ 'get SharedArrayBuffer.prototype.byteLength', receiver);
+ }
+ // 4. Let length be O.[[ArrayBufferByteLength]].
+ const length = o.byte_length;
+ // 5. Return length.
+ return Convert<Number>(length);
+}
+
+// #sec-arraybuffer.isview
+transitioning javascript builtin ArrayBufferIsView(arg: JSAny): Boolean {
+ // 1. If Type(arg) is not Object, return false.
+ // 2. If arg has a [[ViewedArrayBuffer]] internal slot, return true.
+ // 3. Return false.
+ typeswitch (arg) {
+ case (JSArrayBufferView): {
+ return True;
+ }
+ case (JSAny): {
+ return False;
+ }
+ }
+}
+
+} // namespace arraybuffer
diff --git a/deps/v8/src/builtins/base.tq b/deps/v8/src/builtins/base.tq
index fc35c2a457..eed7bc6e97 100644
--- a/deps/v8/src/builtins/base.tq
+++ b/deps/v8/src/builtins/base.tq
@@ -330,6 +330,7 @@ extern enum MessageTemplate {
kWasmTrapNullDereference,
kWasmTrapIllegalCast,
kWasmTrapArrayOutOfBounds,
+ kWasmTrapWasmJSFunction,
kWeakRefsRegisterTargetAndHoldingsMustNotBeSame,
kWeakRefsRegisterTargetMustBeObject,
kWeakRefsUnregisterTokenMustBeObject,
@@ -608,6 +609,7 @@ extern macro CodeStubAssembler::AllocateNameDictionary(constexpr int32):
extern builtin ToObject(Context, JSAny): JSReceiver;
extern macro ToObject_Inline(Context, JSAny): JSReceiver;
+extern macro IsUndefined(Object): bool;
extern macro IsNullOrUndefined(Object): bool;
extern macro IsString(HeapObject): bool;
extern macro IsSeqOneByteString(HeapObject): bool;
@@ -635,6 +637,7 @@ extern transitioning runtime TransitionElementsKindWithKind(
extern macro LoadBufferObject(RawPtr, constexpr int32): Object;
extern macro LoadBufferPointer(RawPtr, constexpr int32): RawPtr;
extern macro LoadBufferSmi(RawPtr, constexpr int32): Smi;
+extern macro LoadBufferIntptr(RawPtr, constexpr int32): intptr;
extern runtime StringEqual(Context, String, String): Oddball;
extern builtin StringLessThan(Context, String, String): Boolean;
@@ -1036,6 +1039,12 @@ const kOneByteStringMap: Map = OneByteStringMapConstant();
// The map of a non-internalized internal SeqTwoByteString.
const kStringMap: Map = StringMapConstant();
+macro OutOfBounds<T: type, X: type>(index: T, length: X): bool {
+ return UintPtrGreaterThanOrEqual(
+ Convert<uintptr>(Convert<intptr>(index)),
+ Convert<uintptr>(Convert<intptr>(length)));
+}
+
extern macro IsPrototypeInitialArrayPrototype(implicit context: Context)(Map):
bool;
extern macro IsNoElementsProtectorCellInvalid(): bool;
@@ -1632,14 +1641,15 @@ macro IsIntegerOrSomeInfinity(o: Object): bool {
}
builtin CheckNumberInRange(implicit context: Context)(
- value: Number, min: Number, max: Number): Undefined {
+ value: Number, min: Number, max: Number, nodeId: Smi): Undefined {
if (IsIntegerOrSomeInfinity(value) && min <= value && value <= max) {
return Undefined;
} else {
- Print('Range type assertion failed! (value/min/max)');
+ Print('Range type assertion failed! (value/min/max/nodeId)');
Print(value);
Print(min);
Print(max);
+ Print(nodeId);
unreachable;
}
}
diff --git a/deps/v8/src/builtins/builtins-arraybuffer.cc b/deps/v8/src/builtins/builtins-arraybuffer.cc
index b062b9ca3c..62d7d820c0 100644
--- a/deps/v8/src/builtins/builtins-arraybuffer.cc
+++ b/deps/v8/src/builtins/builtins-arraybuffer.cc
@@ -105,35 +105,6 @@ BUILTIN(ArrayBufferConstructor_DoNotInitialize) {
InitializedFlag::kUninitialized);
}
-// ES6 section 24.1.4.1 get ArrayBuffer.prototype.byteLength
-BUILTIN(ArrayBufferPrototypeGetByteLength) {
- const char* const kMethodName = "get ArrayBuffer.prototype.byteLength";
- HandleScope scope(isolate);
- CHECK_RECEIVER(JSArrayBuffer, array_buffer, kMethodName);
- CHECK_SHARED(false, array_buffer, kMethodName);
- // TODO(franzih): According to the ES6 spec, we should throw a TypeError
- // here if the JSArrayBuffer is detached.
- return *isolate->factory()->NewNumberFromSize(array_buffer->byte_length());
-}
-
-// ES7 sharedmem 6.3.4.1 get SharedArrayBuffer.prototype.byteLength
-BUILTIN(SharedArrayBufferPrototypeGetByteLength) {
- const char* const kMethodName = "get SharedArrayBuffer.prototype.byteLength";
- HandleScope scope(isolate);
- CHECK_RECEIVER(JSArrayBuffer, array_buffer,
- "get SharedArrayBuffer.prototype.byteLength");
- CHECK_SHARED(true, array_buffer, kMethodName);
- return *isolate->factory()->NewNumberFromSize(array_buffer->byte_length());
-}
-
-// ES6 section 24.1.3.1 ArrayBuffer.isView ( arg )
-BUILTIN(ArrayBufferIsView) {
- SealHandleScope shs(isolate);
- DCHECK_EQ(2, args.length());
- Object arg = args[1];
- return isolate->heap()->ToBoolean(arg.IsJSArrayBufferView());
-}
-
static Object SliceHelper(BuiltinArguments args, Isolate* isolate,
const char* kMethodName, bool is_shared) {
HandleScope scope(isolate);
diff --git a/deps/v8/src/builtins/builtins-async-module.cc b/deps/v8/src/builtins/builtins-async-module.cc
index fecdb31cf3..7128ad7e9d 100644
--- a/deps/v8/src/builtins/builtins-async-module.cc
+++ b/deps/v8/src/builtins/builtins-async-module.cc
@@ -11,8 +11,7 @@ namespace internal {
BUILTIN(CallAsyncModuleFulfilled) {
HandleScope handle_scope(isolate);
- Handle<SourceTextModule> module(
- isolate->global_handles()->Create(*args.at<SourceTextModule>(0)));
+ Handle<SourceTextModule> module(args.at<SourceTextModule>(0));
SourceTextModule::AsyncModuleExecutionFulfilled(isolate, module);
return ReadOnlyRoots(isolate).undefined_value();
}
@@ -22,8 +21,7 @@ BUILTIN(CallAsyncModuleRejected) {
// Arguments should be a SourceTextModule and an exception object.
DCHECK_EQ(args.length(), 2);
- Handle<SourceTextModule> module(
- isolate->global_handles()->Create(*args.at<SourceTextModule>(0)));
+ Handle<SourceTextModule> module(args.at<SourceTextModule>(0));
Handle<Object> exception(args.at(1));
SourceTextModule::AsyncModuleExecutionRejected(isolate, module, exception);
return ReadOnlyRoots(isolate).undefined_value();
diff --git a/deps/v8/src/builtins/builtins-call-gen.cc b/deps/v8/src/builtins/builtins-call-gen.cc
index f7919b78f4..61ae06bf9e 100644
--- a/deps/v8/src/builtins/builtins-call-gen.cc
+++ b/deps/v8/src/builtins/builtins-call-gen.cc
@@ -176,6 +176,11 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithArrayLike(
TVARIABLE(Int32T, var_length);
BIND(&if_array);
{
+ TNode<Int32T> kind = LoadMapElementsKind(arguments_list_map);
+ GotoIf(
+ IsElementsKindGreaterThan(kind, LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND),
+ &if_runtime);
+
TNode<JSObject> js_object = CAST(arguments_list);
// Try to extract the elements from a JSArray object.
var_elements = LoadElements(js_object);
@@ -191,11 +196,6 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithArrayLike(
STATIC_ASSERT(HOLEY_DOUBLE_ELEMENTS == 5);
STATIC_ASSERT(LAST_FAST_ELEMENTS_KIND == HOLEY_DOUBLE_ELEMENTS);
- TNode<Int32T> kind = LoadMapElementsKind(arguments_list_map);
-
- GotoIf(
- IsElementsKindGreaterThan(kind, LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND),
- &if_runtime);
Branch(Word32And(kind, Int32Constant(1)), &if_holey_array, &if_done);
}
@@ -317,7 +317,7 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread(
Label if_smiorobject(this), if_double(this),
if_generic(this, Label::kDeferred);
- TVARIABLE(Int32T, var_length);
+ TVARIABLE(JSArray, var_js_array);
TVARIABLE(FixedArrayBase, var_elements);
TVARIABLE(Int32T, var_elements_kind);
@@ -342,9 +342,8 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread(
{
// The fast-path accesses the {spread} elements directly.
TNode<Int32T> spread_kind = LoadMapElementsKind(spread_map);
+ var_js_array = spread_array;
var_elements_kind = spread_kind;
- var_length =
- LoadAndUntagToWord32ObjectField(spread_array, JSArray::kLengthOffset);
var_elements = LoadElements(spread_array);
// Check elements kind of {spread}.
@@ -372,8 +371,8 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread(
TNode<JSArray> list =
CAST(CallBuiltin(Builtins::kIterableToListMayPreserveHoles, context,
spread, iterator_fn));
- var_length = LoadAndUntagToWord32ObjectField(list, JSArray::kLengthOffset);
+ var_js_array = list;
var_elements = LoadElements(list);
var_elements_kind = LoadElementsKind(list);
Branch(Int32LessThan(var_elements_kind.value(),
@@ -398,8 +397,9 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread(
BIND(&if_smiorobject);
{
+ TNode<Int32T> length = LoadAndUntagToWord32ObjectField(
+ var_js_array.value(), JSArray::kLengthOffset);
TNode<FixedArrayBase> elements = var_elements.value();
- TNode<Int32T> length = var_length.value();
CSA_ASSERT(this, Int32LessThanOrEqual(
length, Int32Constant(FixedArray::kMaxLength)));
@@ -415,9 +415,11 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread(
BIND(&if_double);
{
- GotoIf(Word32Equal(var_length.value(), Int32Constant(0)), &if_smiorobject);
+ TNode<Int32T> length = LoadAndUntagToWord32ObjectField(
+ var_js_array.value(), JSArray::kLengthOffset);
+ GotoIf(Word32Equal(length, Int32Constant(0)), &if_smiorobject);
CallOrConstructDoubleVarargs(target, new_target, CAST(var_elements.value()),
- var_length.value(), args_count, context,
+ length, args_count, context,
var_elements_kind.value());
}
}
diff --git a/deps/v8/src/builtins/builtins-call.cc b/deps/v8/src/builtins/builtins-call.cc
deleted file mode 100644
index 36732ba398..0000000000
--- a/deps/v8/src/builtins/builtins-call.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/builtins/builtins-utils.h"
-#include "src/builtins/builtins.h"
-#include "src/execution/isolate.h"
-#include "src/handles/handles-inl.h"
-#include "src/objects/objects-inl.h"
-
-namespace v8 {
-namespace internal {
-
-Handle<Code> Builtins::CallFunction(ConvertReceiverMode mode) {
- switch (mode) {
- case ConvertReceiverMode::kNullOrUndefined:
- return builtin_handle(kCallFunction_ReceiverIsNullOrUndefined);
- case ConvertReceiverMode::kNotNullOrUndefined:
- return builtin_handle(kCallFunction_ReceiverIsNotNullOrUndefined);
- case ConvertReceiverMode::kAny:
- return builtin_handle(kCallFunction_ReceiverIsAny);
- }
- UNREACHABLE();
-}
-
-Handle<Code> Builtins::Call(ConvertReceiverMode mode) {
- switch (mode) {
- case ConvertReceiverMode::kNullOrUndefined:
- return builtin_handle(kCall_ReceiverIsNullOrUndefined);
- case ConvertReceiverMode::kNotNullOrUndefined:
- return builtin_handle(kCall_ReceiverIsNotNullOrUndefined);
- case ConvertReceiverMode::kAny:
- return builtin_handle(kCall_ReceiverIsAny);
- }
- UNREACHABLE();
-}
-
-} // namespace internal
-} // namespace v8
diff --git a/deps/v8/src/builtins/builtins-collections-gen.cc b/deps/v8/src/builtins/builtins-collections-gen.cc
index db708c633c..9769d785b5 100644
--- a/deps/v8/src/builtins/builtins-collections-gen.cc
+++ b/deps/v8/src/builtins/builtins-collections-gen.cc
@@ -1728,13 +1728,13 @@ void CollectionsBuiltinsAssembler::StoreOrderedHashMapNewEntry(
kTaggedSize * (OrderedHashMap::HashTableStartIndex() +
OrderedHashMap::kValueOffset));
UnsafeStoreFixedArrayElement(
- table, entry_start, bucket_entry, SKIP_WRITE_BARRIER,
+ table, entry_start, bucket_entry,
kTaggedSize * (OrderedHashMap::HashTableStartIndex() +
OrderedHashMap::kChainOffset));
// Update the bucket head.
UnsafeStoreFixedArrayElement(
- table, bucket, SmiTag(occupancy), SKIP_WRITE_BARRIER,
+ table, bucket, SmiTag(occupancy),
OrderedHashMap::HashTableStartIndex() * kTaggedSize);
// Bump the elements count.
@@ -1896,13 +1896,13 @@ void CollectionsBuiltinsAssembler::StoreOrderedHashSetNewEntry(
table, entry_start, key, UPDATE_WRITE_BARRIER,
kTaggedSize * OrderedHashSet::HashTableStartIndex());
UnsafeStoreFixedArrayElement(
- table, entry_start, bucket_entry, SKIP_WRITE_BARRIER,
+ table, entry_start, bucket_entry,
kTaggedSize * (OrderedHashSet::HashTableStartIndex() +
OrderedHashSet::kChainOffset));
// Update the bucket head.
UnsafeStoreFixedArrayElement(
- table, bucket, SmiTag(occupancy), SKIP_WRITE_BARRIER,
+ table, bucket, SmiTag(occupancy),
OrderedHashSet::HashTableStartIndex() * kTaggedSize);
// Bump the elements count.
@@ -2491,9 +2491,9 @@ void WeakCollectionsBuiltinsAssembler::AddEntry(
UnsafeStoreFixedArrayElement(table, value_index, value);
// See HashTableBase::ElementAdded().
- UnsafeStoreFixedArrayElement(
- table, EphemeronHashTable::kNumberOfElementsIndex,
- SmiFromIntPtr(number_of_elements), SKIP_WRITE_BARRIER);
+ UnsafeStoreFixedArrayElement(table,
+ EphemeronHashTable::kNumberOfElementsIndex,
+ SmiFromIntPtr(number_of_elements));
}
TNode<HeapObject> WeakCollectionsBuiltinsAssembler::AllocateTable(
diff --git a/deps/v8/src/builtins/builtins-constructor-gen.cc b/deps/v8/src/builtins/builtins-constructor-gen.cc
index c313d773f3..ecab531e2c 100644
--- a/deps/v8/src/builtins/builtins-constructor-gen.cc
+++ b/deps/v8/src/builtins/builtins-constructor-gen.cc
@@ -352,7 +352,7 @@ TNode<JSRegExp> ConstructorBuiltinsAssembler::CreateRegExpLiteral(
TNode<FeedbackVector> feedback_vector = CAST(maybe_feedback_vector);
TNode<Object> literal_site =
CAST(LoadFeedbackVectorSlot(feedback_vector, slot));
- GotoIf(NotHasBoilerplate(literal_site), &call_runtime);
+ GotoIfNot(HasBoilerplate(literal_site), &call_runtime);
{
TNode<JSRegExp> boilerplate = CAST(literal_site);
int size =
@@ -386,7 +386,7 @@ TNode<JSArray> ConstructorBuiltinsAssembler::CreateShallowArrayLiteral(
TNode<Object> maybe_allocation_site =
CAST(LoadFeedbackVectorSlot(feedback_vector, slot));
- GotoIf(NotHasBoilerplate(maybe_allocation_site), call_runtime);
+ GotoIfNot(HasBoilerplate(maybe_allocation_site), call_runtime);
TNode<AllocationSite> allocation_site = CAST(maybe_allocation_site);
TNode<JSArray> boilerplate = CAST(LoadBoilerplate(allocation_site));
@@ -447,7 +447,7 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
Label* call_runtime) {
TNode<Object> maybe_allocation_site =
CAST(LoadFeedbackVectorSlot(feedback_vector, slot));
- GotoIf(NotHasBoilerplate(maybe_allocation_site), call_runtime);
+ GotoIfNot(HasBoilerplate(maybe_allocation_site), call_runtime);
TNode<AllocationSite> allocation_site = CAST(maybe_allocation_site);
TNode<JSObject> boilerplate = LoadBoilerplate(allocation_site);
@@ -589,29 +589,7 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
StoreObjectFieldNoWriteBarrier(copy, offset, field);
},
kTaggedSize, IndexAdvanceMode::kPost);
- Comment("Copy mutable HeapNumber values");
- BuildFastLoop<IntPtrT>(
- offset.value(), instance_size,
- [=](TNode<IntPtrT> offset) {
- TNode<Object> field = LoadObjectField(copy, offset);
- Label copy_heap_number(this, Label::kDeferred), continue_loop(this);
- // We only have to clone complex field values.
- GotoIf(TaggedIsSmi(field), &continue_loop);
- // TODO(leszeks): Read the field descriptor to decide if this heap
- // number is mutable or not.
- Branch(IsHeapNumber(CAST(field)), &copy_heap_number,
- &continue_loop);
- BIND(&copy_heap_number);
- {
- TNode<Float64T> double_value = LoadHeapNumberValue(CAST(field));
- TNode<HeapNumber> heap_number =
- AllocateHeapNumberWithValue(double_value);
- StoreObjectField(copy, offset, heap_number);
- Goto(&continue_loop);
- }
- BIND(&continue_loop);
- },
- kTaggedSize, IndexAdvanceMode::kPost);
+ CopyMutableHeapNumbersInObject(copy, offset.value(), instance_size);
Goto(&done_init);
}
BIND(&done_init);
@@ -623,10 +601,7 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
TNode<JSObject> ConstructorBuiltinsAssembler::CreateEmptyObjectLiteral(
TNode<Context> context) {
TNode<NativeContext> native_context = LoadNativeContext(context);
- TNode<JSFunction> object_function =
- CAST(LoadContextElement(native_context, Context::OBJECT_FUNCTION_INDEX));
- TNode<Map> map = LoadObjectField<Map>(
- object_function, JSFunction::kPrototypeOrInitialMapOffset);
+ TNode<Map> map = LoadObjectFunctionInitialMap(native_context);
// Ensure that slack tracking is disabled for the map.
STATIC_ASSERT(Map::kNoSlackTracking == 0);
CSA_ASSERT(this, IsClearWord32<Map::Bits3::ConstructionCounterBits>(
@@ -637,5 +612,35 @@ TNode<JSObject> ConstructorBuiltinsAssembler::CreateEmptyObjectLiteral(
return result;
}
+void ConstructorBuiltinsAssembler::CopyMutableHeapNumbersInObject(
+ TNode<HeapObject> copy, TNode<IntPtrT> start_offset,
+ TNode<IntPtrT> end_offset) {
+ // Iterate over all object properties of a freshly copied object and
+ // duplicate mutable heap numbers.
+ if (FLAG_unbox_double_fields) return;
+ Comment("Copy mutable HeapNumber values");
+ BuildFastLoop<IntPtrT>(
+ start_offset, end_offset,
+ [=](TNode<IntPtrT> offset) {
+ TNode<Object> field = LoadObjectField(copy, offset);
+ Label copy_heap_number(this, Label::kDeferred), continue_loop(this);
+ // We only have to clone complex field values.
+ GotoIf(TaggedIsSmi(field), &continue_loop);
+ // TODO(leszeks): Read the field descriptor to decide if this heap
+ // number is mutable or not.
+ Branch(IsHeapNumber(CAST(field)), &copy_heap_number, &continue_loop);
+ BIND(&copy_heap_number);
+ {
+ TNode<Float64T> double_value = LoadHeapNumberValue(CAST(field));
+ TNode<HeapNumber> heap_number =
+ AllocateHeapNumberWithValue(double_value);
+ StoreObjectField(copy, offset, heap_number);
+ Goto(&continue_loop);
+ }
+ BIND(&continue_loop);
+ },
+ kTaggedSize, IndexAdvanceMode::kPost);
+}
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/builtins/builtins-constructor-gen.h b/deps/v8/src/builtins/builtins-constructor-gen.h
index 2ed83229eb..6599e17ca0 100644
--- a/deps/v8/src/builtins/builtins-constructor-gen.h
+++ b/deps/v8/src/builtins/builtins-constructor-gen.h
@@ -47,6 +47,10 @@ class ConstructorBuiltinsAssembler : public CodeStubAssembler {
TNode<JSFunction> target,
TNode<JSReceiver> new_target,
Label* call_runtime);
+
+ void CopyMutableHeapNumbersInObject(TNode<HeapObject> copy,
+ TNode<IntPtrT> start_offset,
+ TNode<IntPtrT> instance_size);
};
} // namespace internal
diff --git a/deps/v8/src/builtins/builtins-conversion-gen.cc b/deps/v8/src/builtins/builtins-conversion-gen.cc
index 54fa752969..cf56c5366c 100644
--- a/deps/v8/src/builtins/builtins-conversion-gen.cc
+++ b/deps/v8/src/builtins/builtins-conversion-gen.cc
@@ -14,15 +14,18 @@ namespace internal {
// ES6 section 7.1.3 ToNumber ( argument )
TF_BUILTIN(ToNumber, CodeStubAssembler) {
- // TODO(solanes, v8:6949): Changing this to a TNode<Context> crashes with the
- // empty context. Context might not be needed, but it is propagated all over
- // the place and hard to pull out.
- Node* context = Parameter(Descriptor::kContext);
+ TNode<Context> context = CAST(Parameter(Descriptor::kContext));
TNode<Object> input = CAST(Parameter(Descriptor::kArgument));
Return(ToNumber(context, input));
}
+TF_BUILTIN(PlainPrimitiveToNumber, CodeStubAssembler) {
+ TNode<Object> input = CAST(Parameter(Descriptor::kArgument));
+
+ Return(PlainPrimitiveToNumber(input));
+}
+
// Like ToNumber, but also converts BigInts.
TF_BUILTIN(ToNumberConvertBigInt, CodeStubAssembler) {
TNode<Context> context = CAST(Parameter(Descriptor::kContext));
diff --git a/deps/v8/src/builtins/builtins-definitions.h b/deps/v8/src/builtins/builtins-definitions.h
index a6e020ada3..511e748acd 100644
--- a/deps/v8/src/builtins/builtins-definitions.h
+++ b/deps/v8/src/builtins/builtins-definitions.h
@@ -8,7 +8,7 @@
#include "builtins-generated/bytecodes-builtins-list.h"
// include generated header
-#include "torque-generated/builtin-definitions-tq.h"
+#include "torque-generated/builtin-definitions.h"
namespace v8 {
namespace internal {
@@ -189,6 +189,7 @@ namespace internal {
\
/* Type conversions */ \
TFC(ToNumber, TypeConversion) \
+ TFC(PlainPrimitiveToNumber, TypeConversionNoContext) \
TFC(ToNumberConvertBigInt, TypeConversion) \
TFC(Typeof, Typeof) \
TFC(GetSuperConstructor, Typeof) \
@@ -341,8 +342,6 @@ namespace internal {
/* ES #sec-arraybuffer-constructor */ \
CPP(ArrayBufferConstructor) \
CPP(ArrayBufferConstructor_DoNotInitialize) \
- CPP(ArrayBufferPrototypeGetByteLength) \
- CPP(ArrayBufferIsView) \
CPP(ArrayBufferPrototypeSlice) \
\
/* AsyncFunction */ \
@@ -536,6 +535,7 @@ namespace internal {
TFH(LoadIC_Noninlined, LoadWithVector) \
TFH(LoadICTrampoline, Load) \
TFH(LoadICTrampoline_Megamorphic, Load) \
+ TFH(LoadSuperIC, LoadWithReceiverAndVector) \
TFH(KeyedLoadIC, LoadWithVector) \
TFH(KeyedLoadIC_Megamorphic, LoadWithVector) \
TFH(KeyedLoadICTrampoline, Load) \
@@ -721,7 +721,6 @@ namespace internal {
TFS(SetOrSetIteratorToList, kSource) \
\
/* SharedArrayBuffer */ \
- CPP(SharedArrayBufferPrototypeGetByteLength) \
CPP(SharedArrayBufferPrototypeSlice) \
TFJ(AtomicsLoad, 2, kReceiver, kArray, kIndex) \
TFJ(AtomicsStore, 3, kReceiver, kArray, kIndex, kValue) \
diff --git a/deps/v8/src/builtins/builtins-handler-gen.cc b/deps/v8/src/builtins/builtins-handler-gen.cc
index 3f4a53a346..8075a597e8 100644
--- a/deps/v8/src/builtins/builtins-handler-gen.cc
+++ b/deps/v8/src/builtins/builtins-handler-gen.cc
@@ -9,7 +9,7 @@
#include "src/ic/ic.h"
#include "src/ic/keyed-store-generic.h"
#include "src/objects/objects-inl.h"
-#include "torque-generated/exported-macros-assembler-tq.h"
+#include "torque-generated/exported-macros-assembler.h"
namespace v8 {
namespace internal {
@@ -40,123 +40,8 @@ class HandlerBuiltinsAssembler : public CodeStubAssembler {
void Generate_ElementsTransitionAndStore(KeyedAccessStoreMode store_mode);
void Generate_StoreFastElementIC(KeyedAccessStoreMode store_mode);
-
- enum class ArgumentsAccessMode { kLoad, kStore, kHas };
-
- // Emits keyed sloppy arguments has. Returns whether the key is in the
- // arguments.
- TNode<Object> HasKeyedSloppyArguments(TNode<JSObject> receiver,
- TNode<Object> key, Label* bailout) {
- return EmitKeyedSloppyArguments(receiver, key, base::nullopt, bailout,
- ArgumentsAccessMode::kHas);
- }
-
- // Emits keyed sloppy arguments load. Returns either the loaded value.
- TNode<Object> LoadKeyedSloppyArguments(TNode<JSObject> receiver,
- TNode<Object> key, Label* bailout) {
- return EmitKeyedSloppyArguments(receiver, key, base::nullopt, bailout,
- ArgumentsAccessMode::kLoad);
- }
-
- // Emits keyed sloppy arguments store.
- void StoreKeyedSloppyArguments(TNode<JSObject> receiver, TNode<Object> key,
- TNode<Object> value, Label* bailout) {
- EmitKeyedSloppyArguments(receiver, key, value, bailout,
- ArgumentsAccessMode::kStore);
- }
-
- private:
- // Emits keyed sloppy arguments load if the |value| is nullopt or store
- // otherwise. Returns either the loaded value or |value|.
- TNode<Object> EmitKeyedSloppyArguments(TNode<JSObject> receiver,
- TNode<Object> key,
- base::Optional<TNode<Object>> value,
- Label* bailout,
- ArgumentsAccessMode access_mode);
};
-TNode<Object> HandlerBuiltinsAssembler::EmitKeyedSloppyArguments(
- TNode<JSObject> receiver, TNode<Object> tagged_key,
- base::Optional<TNode<Object>> value, Label* bailout,
- ArgumentsAccessMode access_mode) {
- GotoIfNot(TaggedIsSmi(tagged_key), bailout);
- TNode<IntPtrT> key = SmiUntag(CAST(tagged_key));
- GotoIf(IntPtrLessThan(key, IntPtrConstant(0)), bailout);
-
- TNode<SloppyArgumentsElements> elements = CAST(LoadElements(receiver));
- TNode<IntPtrT> elements_length = LoadAndUntagFixedArrayBaseLength(elements);
-
- TVARIABLE(Object, var_result);
- if (access_mode == ArgumentsAccessMode::kStore) {
- var_result = *value;
- } else {
- DCHECK(access_mode == ArgumentsAccessMode::kLoad ||
- access_mode == ArgumentsAccessMode::kHas);
- }
- Label if_mapped(this), if_unmapped(this), end(this, &var_result);
-
- GotoIf(UintPtrGreaterThanOrEqual(key, elements_length), &if_unmapped);
-
- TNode<Object> mapped_index =
- LoadSloppyArgumentsElementsMappedEntries(elements, key);
- Branch(TaggedEqual(mapped_index, TheHoleConstant()), &if_unmapped,
- &if_mapped);
-
- BIND(&if_mapped);
- {
- TNode<IntPtrT> mapped_index_intptr = SmiUntag(CAST(mapped_index));
- TNode<Context> the_context = LoadSloppyArgumentsElementsContext(elements);
- if (access_mode == ArgumentsAccessMode::kLoad) {
- TNode<Object> result =
- LoadContextElement(the_context, mapped_index_intptr);
- CSA_ASSERT(this, TaggedNotEqual(result, TheHoleConstant()));
- var_result = result;
- } else if (access_mode == ArgumentsAccessMode::kHas) {
- CSA_ASSERT(this, Word32BinaryNot(IsTheHole(LoadContextElement(
- the_context, mapped_index_intptr))));
- var_result = TrueConstant();
- } else {
- StoreContextElement(the_context, mapped_index_intptr, *value);
- }
- Goto(&end);
- }
-
- BIND(&if_unmapped);
- {
- TNode<HeapObject> backing_store_ho =
- LoadSloppyArgumentsElementsArguments(elements);
- GotoIf(TaggedNotEqual(LoadMap(backing_store_ho), FixedArrayMapConstant()),
- bailout);
- TNode<FixedArray> backing_store = CAST(backing_store_ho);
-
- TNode<IntPtrT> backing_store_length =
- LoadAndUntagFixedArrayBaseLength(backing_store);
-
- // Out-of-bounds access may involve prototype chain walk and is handled
- // in runtime.
- GotoIf(UintPtrGreaterThanOrEqual(key, backing_store_length), bailout);
-
- // The key falls into unmapped range.
- if (access_mode == ArgumentsAccessMode::kStore) {
- StoreFixedArrayElement(backing_store, key, *value);
- } else {
- TNode<Object> value = LoadFixedArrayElement(backing_store, key);
- GotoIf(TaggedEqual(value, TheHoleConstant()), bailout);
-
- if (access_mode == ArgumentsAccessMode::kHas) {
- var_result = TrueConstant();
- } else {
- DCHECK_EQ(access_mode, ArgumentsAccessMode::kLoad);
- var_result = value;
- }
- }
- Goto(&end);
- }
-
- BIND(&end);
- return var_result.value();
-}
-
TF_BUILTIN(LoadIC_StringLength, CodeStubAssembler) {
TNode<String> string = CAST(Parameter(Descriptor::kReceiver));
Return(LoadStringLengthAsSmi(string));
@@ -463,7 +348,7 @@ TF_BUILTIN(KeyedLoadIC_SloppyArguments, HandlerBuiltinsAssembler) {
Label miss(this);
- TNode<Object> result = LoadKeyedSloppyArguments(receiver, key, &miss);
+ TNode<Object> result = SloppyArgumentsLoad(receiver, key, &miss);
Return(result);
BIND(&miss);
@@ -485,7 +370,7 @@ void HandlerBuiltinsAssembler::Generate_KeyedStoreIC_SloppyArguments() {
Label miss(this);
- StoreKeyedSloppyArguments(receiver, key, value, &miss);
+ SloppyArgumentsStore(receiver, key, value, &miss);
Return(value);
BIND(&miss);
@@ -538,7 +423,7 @@ TF_BUILTIN(KeyedHasIC_SloppyArguments, HandlerBuiltinsAssembler) {
Label miss(this);
- TNode<Object> result = HasKeyedSloppyArguments(receiver, key, &miss);
+ TNode<Object> result = SloppyArgumentsHas(receiver, key, &miss);
Return(result);
BIND(&miss);
diff --git a/deps/v8/src/builtins/builtins-ic-gen.cc b/deps/v8/src/builtins/builtins-ic-gen.cc
index 723b506309..c4de83929c 100644
--- a/deps/v8/src/builtins/builtins-ic-gen.cc
+++ b/deps/v8/src/builtins/builtins-ic-gen.cc
@@ -26,6 +26,7 @@ IC_BUILTIN(LoadIC_Noninlined)
IC_BUILTIN(LoadIC_NoFeedback)
IC_BUILTIN(LoadICTrampoline)
IC_BUILTIN(LoadICTrampoline_Megamorphic)
+IC_BUILTIN(LoadSuperIC)
IC_BUILTIN(KeyedLoadIC)
IC_BUILTIN(KeyedLoadIC_Megamorphic)
IC_BUILTIN(KeyedLoadIC_PolymorphicName)
diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc
index d8a5463288..13698758e6 100644
--- a/deps/v8/src/builtins/builtins-internal-gen.cc
+++ b/deps/v8/src/builtins/builtins-internal-gen.cc
@@ -738,15 +738,39 @@ TF_BUILTIN(AdaptorWithBuiltinExitFrame, CodeStubAssembler) {
// ConstructStubs implemented in C++ will be run in the context of the caller
// instead of the callee, due to the way that [[Construct]] is defined for
// ordinary functions).
- TNode<Context> context =
- CAST(LoadObjectField(target, JSFunction::kContextOffset));
+ TNode<Context> context = LoadJSFunctionContext(target);
+
+ TNode<Int32T> actual_argc =
+ UncheckedCast<Int32T>(Parameter(Descriptor::kActualArgumentsCount));
+
+ TVARIABLE(Int32T, pushed_argc, actual_argc);
+
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ TNode<SharedFunctionInfo> shared = LoadJSFunctionSharedFunctionInfo(target);
+
+ TNode<Int32T> formal_count =
+ UncheckedCast<Int32T>(LoadSharedFunctionInfoFormalParameterCount(shared));
+
+ // The number of arguments pushed is the maximum of actual arguments count
+ // and formal parameters count. Except when the formal parameters count is
+ // the sentinel.
+ Label check_argc(this), update_argc(this), done_argc(this);
+
+ Branch(Word32Equal(formal_count, Int32Constant(kDontAdaptArgumentsSentinel)),
+ &done_argc, &check_argc);
+ BIND(&check_argc);
+ Branch(Int32GreaterThan(formal_count, pushed_argc.value()), &update_argc,
+ &done_argc);
+ BIND(&update_argc);
+ pushed_argc = formal_count;
+ Goto(&done_argc);
+ BIND(&done_argc);
+#endif
// Update arguments count for CEntry to contain the number of arguments
// including the receiver and the extra arguments.
- TNode<Int32T> argc =
- UncheckedCast<Int32T>(Parameter(Descriptor::kActualArgumentsCount));
- argc = Int32Add(
- argc,
+ TNode<Int32T> argc = Int32Add(
+ pushed_argc.value(),
Int32Constant(BuiltinExitFrameConstants::kNumExtraArgsWithReceiver));
const bool builtin_exit_frame = true;
diff --git a/deps/v8/src/builtins/builtins-intl.cc b/deps/v8/src/builtins/builtins-intl.cc
index d5cdc16db3..58b09aeaee 100644
--- a/deps/v8/src/builtins/builtins-intl.cc
+++ b/deps/v8/src/builtins/builtins-intl.cc
@@ -1034,8 +1034,8 @@ BUILTIN(SegmentsPrototypeContaining) {
Object::ToInteger(isolate, index));
double const n = index->Number();
- RETURN_RESULT_OR_FAILURE(
- isolate, JSSegments::Containing(isolate, segments, static_cast<int>(n)));
+ RETURN_RESULT_OR_FAILURE(isolate,
+ JSSegments::Containing(isolate, segments, n));
}
// ecma402 #sec-%segmentsprototype%-@@iterator
diff --git a/deps/v8/src/builtins/builtins-object-gen.cc b/deps/v8/src/builtins/builtins-object-gen.cc
index 60cc12ee17..bcc2f8ea64 100644
--- a/deps/v8/src/builtins/builtins-object-gen.cc
+++ b/deps/v8/src/builtins/builtins-object-gen.cc
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "src/builtins/builtins-object-gen.h"
-
#include "src/builtins/builtins-utils-gen.h"
#include "src/builtins/builtins.h"
#include "src/codegen/code-stub-assembler.h"
@@ -1031,7 +1029,7 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) {
TNode<Object> prototype = args.GetOptionalArgumentValue(kPrototypeArg);
TNode<Object> properties = args.GetOptionalArgumentValue(kPropertiesArg);
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
+ TNode<NativeContext> native_context = CAST(Parameter(Descriptor::kContext));
Label call_runtime(this, Label::kDeferred), prototype_valid(this),
no_properties(this);
@@ -1067,14 +1065,13 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) {
{
TVARIABLE(Map, map);
TVARIABLE(HeapObject, properties);
- Label non_null_proto(this), instantiate_map(this), good(this);
+ Label null_proto(this), non_null_proto(this), instantiate_map(this);
- Branch(IsNull(prototype), &good, &non_null_proto);
+ Branch(IsNull(prototype), &null_proto, &non_null_proto);
- BIND(&good);
+ BIND(&null_proto);
{
- map = CAST(LoadContextElement(
- context, Context::SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP));
+ map = LoadSlowObjectWithNullPrototypeMap(native_context);
properties = AllocateNameDictionary(NameDictionary::kInitialCapacity);
Goto(&instantiate_map);
}
@@ -1082,11 +1079,7 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) {
BIND(&non_null_proto);
{
properties = EmptyFixedArrayConstant();
- TNode<HeapObject> object_function =
- CAST(LoadContextElement(context, Context::OBJECT_FUNCTION_INDEX));
- TNode<Map> object_function_map = LoadObjectField<Map>(
- object_function, JSFunction::kPrototypeOrInitialMapOffset);
- map = object_function_map;
+ map = LoadObjectFunctionInitialMap(native_context);
GotoIf(TaggedEqual(prototype, LoadMapPrototype(map.value())),
&instantiate_map);
// Try loading the prototype info.
@@ -1110,8 +1103,8 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) {
BIND(&call_runtime);
{
- TNode<Object> result =
- CallRuntime(Runtime::kObjectCreate, context, prototype, properties);
+ TNode<Object> result = CallRuntime(Runtime::kObjectCreate, native_context,
+ prototype, properties);
args.PopAndReturn(result);
}
}
diff --git a/deps/v8/src/builtins/builtins-object-gen.h b/deps/v8/src/builtins/builtins-object-gen.h
deleted file mode 100644
index fa0024cde2..0000000000
--- a/deps/v8/src/builtins/builtins-object-gen.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_BUILTINS_BUILTINS_OBJECT_GEN_H_
-#define V8_BUILTINS_BUILTINS_OBJECT_GEN_H_
-
-#include "src/codegen/code-stub-assembler.h"
-
-namespace v8 {
-namespace internal {} // namespace internal
-} // namespace v8
-
-#endif // V8_BUILTINS_BUILTINS_OBJECT_GEN_H_
diff --git a/deps/v8/src/builtins/builtins-proxy-gen.cc b/deps/v8/src/builtins/builtins-proxy-gen.cc
index 1e7b9c7057..5b4b9d2536 100644
--- a/deps/v8/src/builtins/builtins-proxy-gen.cc
+++ b/deps/v8/src/builtins/builtins-proxy-gen.cc
@@ -3,15 +3,14 @@
// found in the LICENSE file.
#include "src/builtins/builtins-proxy-gen.h"
+
#include "src/builtins/builtins-utils-gen.h"
#include "src/builtins/builtins-utils.h"
#include "src/builtins/builtins.h"
-
#include "src/logging/counters.h"
#include "src/objects/js-proxy.h"
#include "src/objects/objects-inl.h"
-
-#include "torque-generated/exported-macros-assembler-tq.h"
+#include "torque-generated/exported-macros-assembler.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/builtins/builtins-regexp-gen.cc b/deps/v8/src/builtins/builtins-regexp-gen.cc
index dace357d56..8be87180eb 100644
--- a/deps/v8/src/builtins/builtins-regexp-gen.cc
+++ b/deps/v8/src/builtins/builtins-regexp-gen.cc
@@ -257,11 +257,15 @@ TNode<JSRegExpResult> RegExpBuiltinsAssembler::ConstructNewResultFromMatchInfo(
TNode<FixedArray> data =
CAST(LoadObjectField(regexp, JSRegExp::kDataOffset));
- // We reach this point only if captures exist, implying that this is an
- // IRREGEXP JSRegExp.
- CSA_ASSERT(this,
- SmiEqual(CAST(LoadFixedArrayElement(data, JSRegExp::kTagIndex)),
- SmiConstant(JSRegExp::IRREGEXP)));
+ // We reach this point only if captures exist, implying that the assigned
+ // regexp engine must be able to handle captures.
+ CSA_ASSERT(
+ this,
+ Word32Or(
+ SmiEqual(CAST(LoadFixedArrayElement(data, JSRegExp::kTagIndex)),
+ SmiConstant(JSRegExp::IRREGEXP)),
+ SmiEqual(CAST(LoadFixedArrayElement(data, JSRegExp::kTagIndex)),
+ SmiConstant(JSRegExp::EXPERIMENTAL))));
// The names fixed array associates names at even indices with a capture
// index at odd indices.
@@ -284,8 +288,7 @@ TNode<JSRegExpResult> RegExpBuiltinsAssembler::ConstructNewResultFromMatchInfo(
TNode<IntPtrT> num_properties = WordSar(names_length, 1);
TNode<NativeContext> native_context = LoadNativeContext(context);
- TNode<Map> map = CAST(LoadContextElement(
- native_context, Context::SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP));
+ TNode<Map> map = LoadSlowObjectWithNullPrototypeMap(native_context);
TNode<NameDictionary> properties =
AllocateNameDictionary(num_properties, kAllowLargeObjectAllocation);
@@ -614,9 +617,8 @@ TNode<HeapObject> RegExpBuiltinsAssembler::RegExpExecInternal(
GotoIf(SmiGreaterThan(register_count, available_slots), &runtime);
// Fill match_info.
- UnsafeStoreFixedArrayElement(match_info,
- RegExpMatchInfo::kNumberOfCapturesIndex,
- register_count, SKIP_WRITE_BARRIER);
+ UnsafeStoreFixedArrayElement(
+ match_info, RegExpMatchInfo::kNumberOfCapturesIndex, register_count);
UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastSubjectIndex,
string);
UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastInputIndex,
@@ -852,19 +854,17 @@ TF_BUILTIN(RegExpExecAtom, RegExpBuiltinsAssembler) {
const TNode<Smi> match_to =
SmiAdd(match_from, LoadStringLengthAsSmi(needle_string));
- UnsafeStoreFixedArrayElement(
- match_info, RegExpMatchInfo::kNumberOfCapturesIndex,
- SmiConstant(kNumRegisters), SKIP_WRITE_BARRIER);
+ UnsafeStoreFixedArrayElement(match_info,
+ RegExpMatchInfo::kNumberOfCapturesIndex,
+ SmiConstant(kNumRegisters));
UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastSubjectIndex,
subject_string);
UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastInputIndex,
subject_string);
- UnsafeStoreFixedArrayElement(match_info,
- RegExpMatchInfo::kFirstCaptureIndex,
- match_from, SKIP_WRITE_BARRIER);
- UnsafeStoreFixedArrayElement(match_info,
- RegExpMatchInfo::kFirstCaptureIndex + 1,
- match_to, SKIP_WRITE_BARRIER);
+ UnsafeStoreFixedArrayElement(
+ match_info, RegExpMatchInfo::kFirstCaptureIndex, match_from);
+ UnsafeStoreFixedArrayElement(
+ match_info, RegExpMatchInfo::kFirstCaptureIndex + 1, match_to);
Return(match_info);
}
diff --git a/deps/v8/src/builtins/builtins-string.tq b/deps/v8/src/builtins/builtins-string.tq
index 816cbb4c11..6c1eec1b2d 100644
--- a/deps/v8/src/builtins/builtins-string.tq
+++ b/deps/v8/src/builtins/builtins-string.tq
@@ -6,8 +6,9 @@
namespace string {
-// TODO(bbudge) Remove the 'RT' suffix on this runtime function.
-extern transitioning runtime ToStringRT(Context, JSAny): String;
+namespace runtime {
+extern transitioning runtime ToString(Context, JSAny): String;
+}
@export
transitioning macro ToStringImpl(context: Context, o: JSAny): String {
@@ -31,7 +32,7 @@ transitioning macro ToStringImpl(context: Context, o: JSAny): String {
ThrowTypeError(MessageTemplate::kSymbolToString);
}
case (JSAny): {
- return ToStringRT(context, o);
+ return runtime::ToString(context, o);
}
}
}
diff --git a/deps/v8/src/builtins/builtins.cc b/deps/v8/src/builtins/builtins.cc
index f79ddaa5e4..31682f3974 100644
--- a/deps/v8/src/builtins/builtins.cc
+++ b/deps/v8/src/builtins/builtins.cc
@@ -118,6 +118,30 @@ const char* Builtins::Lookup(Address pc) {
return nullptr;
}
+Handle<Code> Builtins::CallFunction(ConvertReceiverMode mode) {
+ switch (mode) {
+ case ConvertReceiverMode::kNullOrUndefined:
+ return builtin_handle(kCallFunction_ReceiverIsNullOrUndefined);
+ case ConvertReceiverMode::kNotNullOrUndefined:
+ return builtin_handle(kCallFunction_ReceiverIsNotNullOrUndefined);
+ case ConvertReceiverMode::kAny:
+ return builtin_handle(kCallFunction_ReceiverIsAny);
+ }
+ UNREACHABLE();
+}
+
+Handle<Code> Builtins::Call(ConvertReceiverMode mode) {
+ switch (mode) {
+ case ConvertReceiverMode::kNullOrUndefined:
+ return builtin_handle(kCall_ReceiverIsNullOrUndefined);
+ case ConvertReceiverMode::kNotNullOrUndefined:
+ return builtin_handle(kCall_ReceiverIsNotNullOrUndefined);
+ case ConvertReceiverMode::kAny:
+ return builtin_handle(kCall_ReceiverIsAny);
+ }
+ UNREACHABLE();
+}
+
Handle<Code> Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) {
switch (hint) {
case ToPrimitiveHint::kDefault:
diff --git a/deps/v8/src/builtins/conversion.tq b/deps/v8/src/builtins/conversion.tq
index 14b953f416..5a2dccd068 100644
--- a/deps/v8/src/builtins/conversion.tq
+++ b/deps/v8/src/builtins/conversion.tq
@@ -3,7 +3,7 @@
// found in the LICENSE file.
namespace runtime {
-extern transitioning runtime ToStringRT(Context, BigInt): String;
+extern transitioning runtime ToString(Context, BigInt): String;
}
extern enum OrdinaryToPrimitiveHint { kString, kNumber }
@@ -90,7 +90,7 @@ transitioning builtin ToName(implicit context: Context)(input: JSAny): Name {
case (b: BigInt): {
// We don't have a fast-path for BigInt currently, so just
// tail call to the %ToString runtime function here for now.
- tail runtime::ToStringRT(context, b);
+ tail runtime::ToString(context, b);
}
case (o: Oddball): {
return o.to_string;
diff --git a/deps/v8/src/builtins/frame-arguments.tq b/deps/v8/src/builtins/frame-arguments.tq
index d57b2f4f01..27f3266e2d 100644
--- a/deps/v8/src/builtins/frame-arguments.tq
+++ b/deps/v8/src/builtins/frame-arguments.tq
@@ -11,6 +11,8 @@ struct Arguments {
extern operator '[]' macro GetArgumentValue(Arguments, intptr): JSAny;
extern macro GetFrameArguments(FrameWithArguments, intptr): Arguments;
+const kNoArgumentsAdaptor:
+ constexpr bool generates 'kNoArgumentsAdaptor';
struct ArgumentsIterator {
macro Next(): Object labels NoMore {
@@ -47,18 +49,30 @@ macro GetFrameWithArgumentsInfo(implicit context: Context)():
const shared: SharedFunctionInfo = f.shared_function_info;
const formalParameterCount: bint =
Convert<bint>(Convert<int32>(shared.formal_parameter_count));
- const argumentCount: bint = formalParameterCount;
+ if constexpr (kNoArgumentsAdaptor) {
+ // TODO(victorgomes): When removing the v8_disable_arguments_adaptor flag,
+ // FrameWithArgumentsInfo can be simplified, since the frame field already
+ // contains the argument count.
+ const argumentCount: bint = Convert<bint>(frame.argument_count);
+ return FrameWithArgumentsInfo{
+ frame,
+ argument_count: argumentCount,
+ formal_parameter_count: formalParameterCount
+ };
+ } else {
+ const argumentCount: bint = formalParameterCount;
- const adaptor = Cast<ArgumentsAdaptorFrame>(frame.caller)
- otherwise return FrameWithArgumentsInfo{
- frame,
- argument_count: argumentCount,
- formal_parameter_count: formalParameterCount
- };
+ const adaptor = Cast<ArgumentsAdaptorFrame>(frame.caller)
+ otherwise return FrameWithArgumentsInfo{
+ frame,
+ argument_count: argumentCount,
+ formal_parameter_count: formalParameterCount
+ };
- return FrameWithArgumentsInfo{
- frame: adaptor,
- argument_count: Convert<bint>(adaptor.length),
- formal_parameter_count: formalParameterCount
- };
+ return FrameWithArgumentsInfo{
+ frame: adaptor,
+ argument_count: Convert<bint>(adaptor.length),
+ formal_parameter_count: formalParameterCount
+ };
+ }
}
diff --git a/deps/v8/src/builtins/frames.tq b/deps/v8/src/builtins/frames.tq
index ef01b67b76..3b716b7a64 100644
--- a/deps/v8/src/builtins/frames.tq
+++ b/deps/v8/src/builtins/frames.tq
@@ -49,6 +49,9 @@ macro LoadPointerFromFrame(f: Frame, o: constexpr int32): RawPtr {
macro LoadSmiFromFrame(f: Frame, o: constexpr int32): Smi {
return LoadBufferSmi(f, o);
}
+macro LoadIntptrFromFrame(f: Frame, o: constexpr int32): intptr {
+ return LoadBufferIntptr(f, o);
+}
const kStandardFrameFunctionOffset: constexpr int31
generates 'StandardFrameConstants::kFunctionOffset';
@@ -67,6 +70,12 @@ operator '.caller' macro LoadCallerFromFrame(f: Frame): Frame {
return %RawDownCast<Frame>(result);
}
+const kStandardFrameArgCOffset: constexpr int31
+ generates 'StandardFrameConstants::kArgCOffset';
+operator '.argument_count' macro LoadArgCFromFrame(f: Frame): intptr {
+ return LoadIntptrFromFrame(f, kStandardFrameArgCOffset);
+}
+
type ContextOrFrameType = Context|FrameType;
Cast<ContextOrFrameType>(implicit context: Context)(o: Object):
ContextOrFrameType
diff --git a/deps/v8/src/builtins/ia32/builtins-ia32.cc b/deps/v8/src/builtins/ia32/builtins-ia32.cc
index 10b9a9e308..41181410b5 100644
--- a/deps/v8/src/builtins/ia32/builtins-ia32.cc
+++ b/deps/v8/src/builtins/ia32/builtins-ia32.cc
@@ -41,23 +41,29 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- eax : actual argument count
// -- edx : new target (preserved for callee)
// -- edi : target function (preserved for callee)
// -----------------------------------
{
FrameScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
- __ push(edi);
- __ push(edx);
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
+ __ push(kJavaScriptCallTargetRegister);
+ __ push(kJavaScriptCallNewTargetRegister);
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ push(kJavaScriptCallArgCountRegister);
// Function is also the parameter to the runtime call.
- __ push(edi);
+ __ push(kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
__ mov(ecx, eax);
- // Restore target function and new target.
- __ pop(edx);
- __ pop(edi);
+ // Restore target function, new target and actual argument count.
+ __ pop(kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
+ __ pop(kJavaScriptCallNewTargetRegister);
+ __ pop(kJavaScriptCallTargetRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == ecx, "ABI mismatch");
@@ -831,6 +837,7 @@ static void TailCallRuntimeIfMarkerEquals(MacroAssembler* masm,
static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry) {
// ----------- S t a t e -------------
+ // -- eax : actual argument count
// -- edx : new target (preserved for callee if needed, and caller)
// -- edi : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -868,6 +875,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- eax : actual argument count
// -- edx : new target (preserved for callee if needed, and caller)
// -- edi : target function (preserved for callee if needed, and caller)
// -- optimization_marker : a Smi containing a non-zero optimization marker.
@@ -985,10 +993,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o eax: actual argument count (not including the receiver)
// o edi: the JS function object being called
// o edx: the incoming new target or generator object
// o esi: our context
@@ -1000,6 +1008,8 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
Register closure = edi;
+ __ movd(xmm0, eax); // Spill actual argument count.
+
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
@@ -1050,8 +1060,10 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
FrameScope frame_scope(masm, StackFrame::MANUAL);
__ push(ebp); // Caller's frame pointer.
__ mov(ebp, esp);
- __ push(esi); // Callee's context.
- __ push(edi); // Callee's JS function.
+ __ push(kContextRegister); // Callee's context.
+ __ push(kJavaScriptCallTargetRegister); // Callee's JS function.
+ __ movd(kJavaScriptCallArgCountRegister, xmm0);
+ __ push(kJavaScriptCallArgCountRegister); // Actual argument count.
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
@@ -1204,6 +1216,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
__ bind(&optimized_code_slot_not_empty);
Label maybe_has_optimized_code;
+ // Restore actual argument count.
+ __ movd(eax, xmm0);
// Check if optimized code marker is actually a weak reference to the
// optimized code as opposed to an optimization marker.
__ JumpIfNotSmi(optimized_code_entry, &maybe_has_optimized_code);
@@ -1218,6 +1232,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
TailCallOptimizedCodeSlot(masm, optimized_code_entry);
__ bind(&compile_lazy);
+ // Restore actual argument count.
+ __ movd(eax, xmm0);
GenerateTailCallToReturnedCode(masm, Runtime::kCompileLazy);
__ bind(&stack_overflow);
@@ -2266,38 +2282,88 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ sub(edx, ecx);
__ j(less_equal, &stack_done);
{
- Generate_StackOverflowCheck(masm, edx, ecx, &stack_overflow);
+ // ----------- S t a t e -------------
+ // -- eax : the number of arguments already in the stack (not including the
+ // receiver)
+ // -- ecx : start index (to support rest parameters)
+ // -- edx : number of arguments to copy, i.e. arguments count - start index
+ // -- edi : the target to call (can be any Object)
+ // -- esi : point to the caller stack frame
+ // -- xmm0 : context for the Call / Construct builtin
+ // -- xmm1 : the new target (for [[Construct]] calls)
+ // -----------------------------------
// Forward the arguments from the caller frame.
+#ifdef V8_REVERSE_JSARGS
+ __ movd(xmm2, edi); // Preserve the target to call.
+ Generate_StackOverflowCheck(masm, edx, edi, &stack_overflow);
+ __ movd(xmm3, ebx); // Preserve root register.
+
+ Register scratch = ebx;
+
+ // Point to the first argument to copy (skipping receiver).
+ __ lea(ecx, Operand(ecx, times_system_pointer_size,
+ CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ add(esi, ecx);
+
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
{
+ Label copy, check;
+ Register src = ecx, current = edi;
+ // Update stack pointer.
+ __ mov(src, esp);
+ __ lea(scratch, Operand(edx, times_system_pointer_size, 0));
+ __ AllocateStackSpace(scratch);
+ // Include return address and receiver.
+ __ add(eax, Immediate(2));
+ __ Set(current, 0);
+ __ jmp(&check);
+ // Loop.
+ __ bind(&copy);
+ __ mov(scratch, Operand(src, current, times_system_pointer_size, 0));
+ __ mov(Operand(esp, current, times_system_pointer_size, 0), scratch);
+ __ inc(current);
+ __ bind(&check);
+ __ cmp(current, eax);
+ __ j(less, &copy);
+ __ lea(ecx, Operand(esp, eax, times_system_pointer_size, 0));
+ }
+
+ // Update total number of arguments.
+ __ sub(eax, Immediate(2));
+ __ add(eax, edx);
+
+ // Copy the additional caller arguments onto the stack.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
+ {
+ Register src = esi, dest = ecx, num = edx;
Label loop;
- __ add(eax, edx);
- __ PopReturnAddressTo(ecx);
-#ifdef V8_REVERSE_JSARGS
- // TODO(victor): When we remove the arguments adaptor machinery above,
- // we can free the scratch register and avoid this move.
- __ movd(xmm2, ebx); // Save root register.
- __ Pop(ebx); // Save new receiver.
-#endif
__ bind(&loop);
- {
- __ dec(edx);
-#ifdef V8_REVERSE_JSARGS
- // Skips old receiver.
- __ Push(Operand(scratch, edx, times_system_pointer_size,
- kFPOnStackSize + kPCOnStackSize + kSystemPointerSize));
+ __ dec(num);
+ __ mov(scratch, Operand(src, num, times_system_pointer_size, 0));
+ __ mov(Operand(dest, num, times_system_pointer_size, 0), scratch);
+ __ j(not_zero, &loop);
+ }
+
+ __ movd(ebx, xmm3); // Restore root register.
+ __ movd(edi, xmm2); // Restore the target to call.
#else
- __ Push(Operand(scratch, edx, times_system_pointer_size,
- kFPOnStackSize + kPCOnStackSize));
-#endif
- __ j(not_zero, &loop);
- }
-#ifdef V8_REVERSE_JSARGS
- __ Push(ebx); // Push new receiver.
- __ movd(ebx, xmm2); // Recover root register.
-#endif
- __ PushReturnAddressFrom(ecx);
+ Generate_StackOverflowCheck(masm, edx, ecx, &stack_overflow);
+ Label loop;
+ __ add(eax, edx);
+ __ PopReturnAddressTo(ecx);
+ __ bind(&loop);
+ {
+ __ dec(edx);
+ __ Push(Operand(scratch, edx, times_system_pointer_size,
+ kFPOnStackSize + kPCOnStackSize));
+ __ j(not_zero, &loop);
}
+ __ PushReturnAddressFrom(ecx);
+#endif
}
__ bind(&stack_done);
@@ -2308,6 +2374,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ Jump(code, RelocInfo::CODE_TARGET);
__ bind(&stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ __ movd(edi, xmm2); // Restore the target to call.
+#endif
__ movd(esi, xmm0); // Restore the context.
__ TailCallRuntime(Runtime::kThrowStackOverflow);
}
diff --git a/deps/v8/src/builtins/ic-callable.tq b/deps/v8/src/builtins/ic-callable.tq
index 95e107a9a6..8ee7fab17a 100644
--- a/deps/v8/src/builtins/ic-callable.tq
+++ b/deps/v8/src/builtins/ic-callable.tq
@@ -53,6 +53,12 @@ macro TransitionToMegamorphic(implicit context: Context)(
macro CollectCallFeedback(
maybeTarget: JSAny, context: Context,
maybeFeedbackVector: Undefined|FeedbackVector, slotId: uintptr): void {
+ // TODO(v8:9891): Remove this assert once all callers are ported to Torque.
+ // This assert ensures correctness of maybeFeedbackVector's type which can
+ // be easily broken for calls from CSA.
+ assert(
+ IsUndefined(maybeFeedbackVector) ||
+ Is<FeedbackVector>(maybeFeedbackVector));
const feedbackVector =
Cast<FeedbackVector>(maybeFeedbackVector) otherwise return;
IncrementCallCount(feedbackVector, slotId);
@@ -97,6 +103,12 @@ macro CollectCallFeedback(
macro CollectInstanceOfFeedback(
maybeTarget: JSAny, context: Context,
maybeFeedbackVector: Undefined|FeedbackVector, slotId: uintptr): void {
+ // TODO(v8:9891): Remove this assert once all callers are ported to Torque.
+ // This assert ensures correctness of maybeFeedbackVector's type which can
+ // be easily broken for calls from CSA.
+ assert(
+ IsUndefined(maybeFeedbackVector) ||
+ Is<FeedbackVector>(maybeFeedbackVector));
const feedbackVector =
Cast<FeedbackVector>(maybeFeedbackVector) otherwise return;
// Note: The call count is not incremented.
@@ -134,6 +146,12 @@ macro CollectConstructFeedback(implicit context: Context)(
maybeFeedbackVector: Undefined|FeedbackVector,
slotId: uintptr): never labels ConstructGeneric,
ConstructArray(AllocationSite) {
+ // TODO(v8:9891): Remove this assert once all callers are ported to Torque.
+ // This assert ensures correctness of maybeFeedbackVector's type which can
+ // be easily broken for calls from CSA.
+ assert(
+ IsUndefined(maybeFeedbackVector) ||
+ Is<FeedbackVector>(maybeFeedbackVector));
const feedbackVector = Cast<FeedbackVector>(maybeFeedbackVector)
otherwise goto ConstructGeneric;
IncrementCallCount(feedbackVector, slotId);
diff --git a/deps/v8/src/builtins/internal.tq b/deps/v8/src/builtins/internal.tq
index b6512da471..c377a2a179 100644
--- a/deps/v8/src/builtins/internal.tq
+++ b/deps/v8/src/builtins/internal.tq
@@ -14,11 +14,17 @@ extern runtime BytecodeBudgetInterruptFromCode(implicit context: Context)(
builtin GetTemplateObject(
context: Context, shared: SharedFunctionInfo,
description: TemplateObjectDescription, slot: uintptr,
- maybeFeedbackVector: FeedbackVector|Undefined): JSArray {
+ maybeFeedbackVector: Undefined|FeedbackVector): JSArray {
// TODO(jgruber): Consider merging with the GetTemplateObject bytecode
// handler; the current advantage of the split implementation is that the
// bytecode can skip most work if feedback exists.
+ // TODO(v8:9891): Remove this assert once all callers are ported to Torque.
+ // This assert ensures correctness of maybeFeedbackVector's type which can
+ // be easily broken for calls from CSA.
+ assert(
+ IsUndefined(maybeFeedbackVector) ||
+ Is<FeedbackVector>(maybeFeedbackVector));
try {
const vector =
Cast<FeedbackVector>(maybeFeedbackVector) otherwise CallRuntime;
diff --git a/deps/v8/src/builtins/iterator.tq b/deps/v8/src/builtins/iterator.tq
index 1354c434e7..5d65db0957 100644
--- a/deps/v8/src/builtins/iterator.tq
+++ b/deps/v8/src/builtins/iterator.tq
@@ -50,9 +50,16 @@ extern builtin IterableToFixedArrayWithSymbolLookupSlow(
transitioning builtin GetIteratorWithFeedback(
context: Context, receiver: JSAny, loadSlot: TaggedIndex,
- callSlot: TaggedIndex, feedback: Undefined|FeedbackVector): JSAny {
+ callSlot: TaggedIndex,
+ maybeFeedbackVector: Undefined|FeedbackVector): JSAny {
+ // TODO(v8:9891): Remove this assert once all callers are ported to Torque.
+ // This assert ensures correctness of maybeFeedbackVector's type which can
+ // be easily broken for calls from CSA.
+ assert(
+ IsUndefined(maybeFeedbackVector) ||
+ Is<FeedbackVector>(maybeFeedbackVector));
let iteratorMethod: JSAny;
- typeswitch (feedback) {
+ typeswitch (maybeFeedbackVector) {
case (Undefined): {
iteratorMethod = GetProperty(receiver, IteratorSymbolConstant());
}
@@ -64,7 +71,7 @@ transitioning builtin GetIteratorWithFeedback(
// TODO(v8:10047): Use TaggedIndex here once TurboFan supports it.
const callSlotSmi: Smi = TaggedIndexToSmi(callSlot);
return CallIteratorWithFeedback(
- context, receiver, iteratorMethod, callSlotSmi, feedback);
+ context, receiver, iteratorMethod, callSlotSmi, maybeFeedbackVector);
}
transitioning builtin CallIteratorWithFeedback(
diff --git a/deps/v8/src/builtins/mips/builtins-mips.cc b/deps/v8/src/builtins/mips/builtins-mips.cc
index cefa88401d..66700a7119 100644
--- a/deps/v8/src/builtins/mips/builtins-mips.cc
+++ b/deps/v8/src/builtins/mips/builtins-mips.cc
@@ -40,19 +40,25 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- a0 : actual argument count
// -- a1 : target function (preserved for callee)
// -- a3 : new target (preserved for callee)
// -----------------------------------
{
FrameScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
// Push function as parameter to the runtime call.
- __ Push(a1, a3, a1);
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
- // Restore target function and new target.
- __ Pop(a1, a3);
+ // Restore target function, new target and actual argument count.
+ __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == a2, "ABI mismatch");
@@ -97,33 +103,24 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
__ SmiTag(a0);
__ Push(cp, a0);
__ SmiUntag(a0);
-
+#ifdef V8_REVERSE_JSARGS
+ // Set up pointer to last argument (skip receiver).
+ __ Addu(
+ t2, fp,
+ Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize));
+ // Copy arguments and receiver to the expression stack.
+ __ PushArray(t2, a0, t3, t0);
+ // The receiver for the builtin/api call.
+ __ PushRoot(RootIndex::kTheHoleValue);
+#else
// The receiver for the builtin/api call.
__ PushRoot(RootIndex::kTheHoleValue);
-
// Set up pointer to last argument.
__ Addu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset));
// Copy arguments and receiver to the expression stack.
- Label loop, entry;
- __ mov(t3, a0);
- // ----------- S t a t e -------------
- // -- a0: number of arguments (untagged)
- // -- a3: new target
- // -- t2: pointer to last argument
- // -- t3: counter
- // -- sp[0*kPointerSize]: the hole (receiver)
- // -- sp[1*kPointerSize]: number of arguments (tagged)
- // -- sp[2*kPointerSize]: context
- // -----------------------------------
- __ jmp(&entry);
- __ bind(&loop);
- __ Lsa(t0, t2, t3, kPointerSizeLog2);
- __ lw(t1, MemOperand(t0));
- __ push(t1);
- __ bind(&entry);
- __ Addu(t3, t3, Operand(-1));
- __ Branch(&loop, greater_equal, t3, Operand(zero_reg));
+ __ PushArray(t2, a0, t3, t0);
+#endif
// Call the function.
// a0: number of arguments (untagged)
@@ -134,12 +131,12 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
// Restore context from the frame.
__ lw(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset));
// Restore smi-tagged arguments count from the frame.
- __ lw(a1, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
+ __ lw(t3, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
// Leave construct frame.
}
// Remove caller arguments from the stack and return.
- __ Lsa(sp, sp, a1, kPointerSizeLog2 - 1);
+ __ Lsa(sp, sp, t3, kPointerSizeLog2 - 1);
__ Addu(sp, sp, kPointerSize);
__ Ret();
}
@@ -224,11 +221,30 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
// Restore new target.
__ Pop(a3);
+
+#ifdef V8_REVERSE_JSARGS
+ // Push the allocated receiver to the stack.
+ __ Push(v0);
+ // We need two copies because we may have to return the original one
+ // and the calling conventions dictate that the called function pops the
+ // receiver. The second copy is pushed after the arguments, we saved in s0
+ // since v0 will store the return value of callRuntime.
+ __ mov(s0, v0);
+
+ // Set up pointer to last argument.
+ __ Addu(
+ t2, fp,
+ Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize));
+#else
// Push the allocated receiver to the stack. We need two copies
// because we may have to return the original one and the calling
// conventions dictate that the called function pops the receiver.
__ Push(v0, v0);
+ // Set up pointer to last argument.
+ __ Addu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset));
+#endif
+
// ----------- S t a t e -------------
// -- r3: new target
// -- sp[0*kPointerSize]: implicit receiver
@@ -244,9 +260,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ lw(a0, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
__ SmiUntag(a0);
- // Set up pointer to last argument.
- __ Addu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset));
-
Label enough_stack_space, stack_overflow;
Generate_StackOverflowCheck(masm, a0, t0, t1, &stack_overflow);
__ Branch(&enough_stack_space);
@@ -261,28 +274,13 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ bind(&enough_stack_space);
// Copy arguments and receiver to the expression stack.
- Label loop, entry;
- __ mov(t3, a0);
- // ----------- S t a t e -------------
- // -- a0: number of arguments (untagged)
- // -- a3: new target
- // -- t2: pointer to last argument
- // -- t3: counter
- // -- sp[0*kPointerSize]: implicit receiver
- // -- sp[1*kPointerSize]: implicit receiver
- // -- sp[2*kPointerSize]: padding
- // -- a1 and sp[3*kPointerSize]: constructor function
- // -- sp[4*kPointerSize]: number of arguments (tagged)
- // -- sp[5*kPointerSize]: context
- // -----------------------------------
- __ jmp(&entry);
- __ bind(&loop);
- __ Lsa(t0, t2, t3, kPointerSizeLog2);
- __ lw(t1, MemOperand(t0));
- __ push(t1);
- __ bind(&entry);
- __ Addu(t3, t3, Operand(-1));
- __ Branch(&loop, greater_equal, t3, Operand(zero_reg));
+ __ PushArray(t2, a0, t0, t1);
+#ifdef V8_REVERSE_JSARGS
+ // We need two copies because we may have to return the original one
+ // and the calling conventions dictate that the called function pops the
+ // receiver. The second copy is pushed after the arguments.
+ __ Push(s0);
+#endif
// Call the function.
__ InvokeFunctionWithNewTarget(a1, a3, a0, CALL_FUNCTION);
@@ -577,11 +575,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ li(cp, context_address);
__ lw(cp, MemOperand(cp));
- // Push the function and the receiver onto the stack.
- __ Push(a2, a3);
-
- __ mov(a3, a1);
- __ mov(a1, a2);
+ // Push the function onto the stack.
+ __ Push(a2);
__ lw(s0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
__ lw(a0,
@@ -589,18 +584,34 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ lw(s0,
MemOperand(s0, kPushedStackSpace + EntryFrameConstants::kArgvOffset));
- // a0: argc
- // a1: function
- // a3: new.target
- // s0: argv
-
// Check if we have enough stack space to push all arguments.
// Clobbers a2 and t0.
- Generate_CheckStackOverflow(masm, a0, a2, t0);
+ __ addiu(t1, a0, 1);
+ Generate_CheckStackOverflow(masm, t1, t0, t2);
// Copy arguments to the stack in a loop.
// a0: argc
// s0: argv, i.e. points to first arg
+#ifdef V8_REVERSE_JSARGS
+ Label loop, entry;
+ __ Lsa(t2, s0, a0, kPointerSizeLog2);
+ __ b(&entry);
+ __ nop(); // Branch delay slot nop.
+ // t2 points past last arg.
+ __ bind(&loop);
+ __ addiu(t2, t2, -kPointerSize);
+ __ lw(t0, MemOperand(t2)); // Read next parameter.
+ __ lw(t0, MemOperand(t0)); // Dereference handle.
+ __ push(t0); // Push parameter.
+ __ bind(&entry);
+ __ Branch(&loop, ne, s0, Operand(t2));
+
+ // Push the receiver.
+ __ Push(a3);
+#else
+ // Push the receiver.
+ __ Push(a3);
+
Label loop, entry;
__ Lsa(t2, s0, a0, kPointerSizeLog2);
__ b(&entry);
@@ -613,10 +624,13 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ push(t0); // Push parameter.
__ bind(&entry);
__ Branch(&loop, ne, s0, Operand(t2));
+#endif
// a0: argc
// a1: function
// a3: new.target
+ __ mov(a3, a1);
+ __ mov(a1, a2);
// Initialize all JavaScript callee-saved registers, since they will be seen
// by the garbage collector as part of handlers.
@@ -711,9 +725,11 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit);
__ Branch(&stack_overflow, lo, sp, Operand(kScratchReg));
+#ifndef V8_REVERSE_JSARGS
// Push receiver.
__ lw(t1, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset));
__ Push(t1);
+#endif
// ----------- S t a t e -------------
// -- a1 : the JSGeneratorObject to resume
@@ -731,6 +747,20 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ lw(t1,
FieldMemOperand(a1, JSGeneratorObject::kParametersAndRegistersOffset));
{
+#ifdef V8_REVERSE_JSARGS
+ Label done_loop, loop;
+ __ bind(&loop);
+ __ Subu(a3, a3, Operand(1));
+ __ Branch(&done_loop, lt, a3, Operand(zero_reg));
+ __ Lsa(kScratchReg, t1, a3, kPointerSizeLog2);
+ __ Lw(kScratchReg, FieldMemOperand(kScratchReg, FixedArray::kHeaderSize));
+ __ Push(kScratchReg);
+ __ Branch(&loop);
+ __ bind(&done_loop);
+ // Push receiver.
+ __ Lw(kScratchReg, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset));
+ __ Push(kScratchReg);
+#else
Label done_loop, loop;
__ Move(t2, zero_reg);
__ bind(&loop);
@@ -742,6 +772,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ Addu(t2, t2, Operand(1));
__ Branch(&loop);
__ bind(&done_loop);
+#endif
}
// Underlying function needs to have bytecode available.
@@ -844,6 +875,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch1, Register scratch2) {
// ----------- S t a t e -------------
+ // -- a0 : actual argument count
// -- a3 : new target (preserved for callee if needed, and caller)
// -- a1 : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -880,6 +912,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- a0 : actual argument count
// -- a3 : new target (preserved for callee if needed, and caller)
// -- a1 : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -989,10 +1022,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o a0 : actual argument count (not including the receiver)
// o a1: the JS function object being called.
// o a3: the incoming new target or generator object
// o cp: our context
@@ -1008,16 +1041,18 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
- __ lw(a0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ __ lw(kScratchReg,
+ FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
__ lw(kInterpreterBytecodeArrayRegister,
- FieldMemOperand(a0, SharedFunctionInfo::kFunctionDataOffset));
- GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, t0);
+ FieldMemOperand(kScratchReg, SharedFunctionInfo::kFunctionDataOffset));
+ GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister,
+ kScratchReg);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ GetObjectType(kInterpreterBytecodeArrayRegister, a0, a0);
- __ Branch(&compile_lazy, ne, a0, Operand(BYTECODE_ARRAY_TYPE));
+ __ GetObjectType(kInterpreterBytecodeArrayRegister, kScratchReg, kScratchReg);
+ __ Branch(&compile_lazy, ne, kScratchReg, Operand(BYTECODE_ARRAY_TYPE));
// Load the feedback vector from the closure.
__ lw(feedback_vector,
@@ -1215,22 +1250,21 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
}
static void Generate_InterpreterPushArgs(MacroAssembler* masm,
- Register num_args, Register index,
+ Register num_args,
+ Register start_address,
Register scratch, Register scratch2) {
// Find the address of the last argument.
- __ mov(scratch2, num_args);
- __ sll(scratch2, scratch2, kPointerSizeLog2);
- __ Subu(scratch2, index, Operand(scratch2));
+ __ Subu(scratch, num_args, Operand(1));
+ __ sll(scratch, scratch, kPointerSizeLog2);
+ __ Subu(start_address, start_address, scratch);
// Push the arguments.
- Label loop_header, loop_check;
- __ Branch(&loop_check);
- __ bind(&loop_header);
- __ lw(scratch, MemOperand(index));
- __ Addu(index, index, Operand(-kPointerSize));
- __ push(scratch);
- __ bind(&loop_check);
- __ Branch(&loop_header, hi, index, Operand(scratch2));
+#ifdef V8_REVERSE_JSARGS
+ __ PushArray(start_address, num_args, scratch, scratch2,
+ TurboAssembler::PushArrayOrder::kReverse);
+#else
+ __ PushArray(start_address, num_args, scratch, scratch2);
+#endif
}
// static
@@ -1247,10 +1281,37 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
// -----------------------------------
Label stack_overflow;
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ Subu(a0, a0, Operand(1));
+ }
+#endif
+
__ Addu(t0, a0, Operand(1)); // Add one for receiver.
Generate_StackOverflowCheck(masm, t0, t4, t1, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ // Don't copy receiver.
+ __ mov(t0, a0);
+ }
+
+ // This function modifies a2, t4 and t1.
+ Generate_InterpreterPushArgs(masm, t0, a2, t4, t1);
+
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ __ PushRoot(RootIndex::kUndefinedValue);
+ }
+
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register a2.
+ // a2 already points to the penultime argument, the spread
+ // is below that.
+ __ Lw(a2, MemOperand(a2, -kSystemPointerSize));
+ }
+#else
// Push "undefined" as the receiver arg if we need to.
if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
__ PushRoot(RootIndex::kUndefinedValue);
@@ -1264,6 +1325,7 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
__ Pop(a2); // Pass the spread in a register
__ Subu(a0, a0, Operand(1)); // Subtract one for spread
}
+#endif
// Call the target.
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
@@ -1293,11 +1355,32 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
// -- t4 : address of the first argument
// -----------------------------------
Label stack_overflow;
+ __ addiu(t2, a0, 1);
+ Generate_StackOverflowCheck(masm, t2, t1, t0, &stack_overflow);
+
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ Subu(a0, a0, Operand(1));
+ }
+
+ Generate_InterpreterPushArgs(masm, a0, t4, t1, t0);
// Push a slot for the receiver.
__ push(zero_reg);
- Generate_StackOverflowCheck(masm, a0, t1, t0, &stack_overflow);
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register a2.
+ // t4 already points to the penultimate argument, the spread
+ // lies in the next interpreter register.
+ // __ Subu(t4, t4, Operand(kSystemPointerSize));
+ __ Lw(a2, MemOperand(t4, -kSystemPointerSize));
+ } else {
+ __ AssertUndefinedOrAllocationSite(a2, t0);
+ }
+#else
+ // Push a slot for the receiver.
+ __ push(zero_reg);
// This function modified t4, t1 and t0.
Generate_InterpreterPushArgs(masm, a0, t4, t1, t0);
@@ -1308,6 +1391,7 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
} else {
__ AssertUndefinedOrAllocationSite(a2, t0);
}
+#endif
if (mode == InterpreterPushArgsMode::kArrayFunction) {
__ AssertFunction(a1);
@@ -1467,13 +1551,30 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
bool with_result) {
const RegisterConfiguration* config(RegisterConfiguration::Default());
int allocatable_register_count = config->num_allocatable_general_registers();
+ UseScratchRegisterScope temps(masm);
+ Register scratch = temps.Acquire(); // Temp register is not allocatable.
+ // Register scratch = t3;
if (with_result) {
+#ifdef V8_REVERSE_JSARGS
+ if (java_script_builtin) {
+ __ mov(scratch, v0);
+ } else {
+ // Overwrite the hole inserted by the deoptimizer with the return value
+ // from the LAZY deopt point.
+ __ sw(v0,
+ MemOperand(
+ sp, config->num_allocatable_general_registers() * kPointerSize +
+ BuiltinContinuationFrameConstants::kFixedFrameSize));
+ }
+#else
// Overwrite the hole inserted by the deoptimizer with the return value from
// the LAZY deopt point.
__ sw(v0,
MemOperand(
sp, config->num_allocatable_general_registers() * kPointerSize +
BuiltinContinuationFrameConstants::kFixedFrameSize));
+ USE(scratch);
+#endif
}
for (int i = allocatable_register_count - 1; i >= 0; --i) {
int code = config->GetAllocatableGeneralCode(i);
@@ -1482,6 +1583,22 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
__ SmiUntag(Register::from_code(code));
}
}
+
+#ifdef V8_REVERSE_JSARGS
+ if (with_result && java_script_builtin) {
+ // Overwrite the hole inserted by the deoptimizer with the return value from
+ // the LAZY deopt point. t0 contains the arguments count, the return value
+ // from LAZY is always the last argument.
+ __ Addu(a0, a0,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ __ Lsa(t0, sp, a0, kSystemPointerSizeLog2);
+ __ Sw(scratch, MemOperand(t0));
+ // Recover arguments count.
+ __ Subu(a0, a0,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ }
+#endif
+
__ lw(fp, MemOperand(
sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp));
// Load builtin index (stored as a Smi) and use it to get the builtin start
@@ -1568,15 +1685,25 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// -- sp[8] : receiver
// -----------------------------------
- // 1. Load receiver into a1, argArray into a0 (if present), remove all
+ // 1. Load receiver into a1, argArray into a2 (if present), remove all
// arguments from the stack (including the receiver), and push thisArg (if
// present) instead.
{
Label no_arg;
- Register scratch = t0;
__ LoadRoot(a2, RootIndex::kUndefinedValue);
__ mov(a3, a2);
// Lsa() cannot be used hare as scratch value used later.
+#ifdef V8_REVERSE_JSARGS
+ __ lw(a1, MemOperand(sp)); // receiver
+ __ Branch(&no_arg, eq, a0, Operand(zero_reg));
+ __ lw(a3, MemOperand(sp, kSystemPointerSize)); // thisArg
+ __ Branch(&no_arg, eq, a0, Operand(1));
+ __ lw(a2, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+ __ bind(&no_arg);
+ __ Lsa(sp, sp, a0, kPointerSizeLog2);
+ __ sw(a3, MemOperand(sp));
+#else
+ Register scratch = t0;
__ sll(scratch, a0, kPointerSizeLog2);
__ Addu(a0, sp, Operand(scratch));
__ lw(a1, MemOperand(a0)); // receiver
@@ -1590,6 +1717,7 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
__ Addu(sp, sp, Operand(scratch));
__ sw(a2, MemOperand(sp));
__ mov(a2, a3);
+#endif
}
// ----------- S t a t e -------------
@@ -1622,6 +1750,23 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// static
void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
+#ifdef V8_REVERSE_JSARGS
+ // 1. Get the callable to call (passed as receiver) from the stack.
+ __ Pop(a1);
+
+ // 2. Make sure we have at least one argument.
+ // a0: actual number of arguments
+ {
+ Label done;
+ __ Branch(&done, ne, a0, Operand(zero_reg));
+ __ PushRoot(RootIndex::kUndefinedValue);
+ __ Addu(a0, a0, Operand(1));
+ __ bind(&done);
+ }
+
+ // 3. Adjust the actual number of arguments.
+ __ addiu(a0, a0, -1);
+#else
// 1. Make sure we have at least one argument.
// a0: actual number of arguments
{
@@ -1634,8 +1779,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
// 2. Get the function to call (passed as receiver) from the stack.
// a0: actual number of arguments
- __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ lw(a1, MemOperand(kScratchReg));
+ __ LoadReceiver(a1, a0);
// 3. Shift arguments and return address one slot down on the stack
// (overwriting the original receiver). Adjust argument count to make
@@ -1657,6 +1801,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
__ Subu(a0, a0, Operand(1));
__ Pop();
}
+#endif
// 4. Call the callable.
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
@@ -1676,10 +1821,21 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
// thisArgument (if present) instead.
{
Label no_arg;
- Register scratch = t0;
__ LoadRoot(a1, RootIndex::kUndefinedValue);
__ mov(a2, a1);
__ mov(a3, a1);
+#ifdef V8_REVERSE_JSARGS
+ __ Branch(&no_arg, eq, a0, Operand(zero_reg));
+ __ lw(a1, MemOperand(sp, kSystemPointerSize)); // target
+ __ Branch(&no_arg, eq, a0, Operand(1));
+ __ lw(a3, MemOperand(sp, 2 * kSystemPointerSize)); // thisArgument
+ __ Branch(&no_arg, eq, a0, Operand(2));
+ __ lw(a2, MemOperand(sp, 3 * kSystemPointerSize)); // argumentsList
+ __ bind(&no_arg);
+ __ Lsa(sp, sp, a0, kPointerSizeLog2);
+ __ sw(a3, MemOperand(sp));
+#else
+ Register scratch = t0;
__ sll(scratch, a0, kPointerSizeLog2);
__ mov(a0, scratch);
__ Subu(a0, a0, Operand(kPointerSize));
@@ -1696,6 +1852,7 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
__ Addu(sp, sp, Operand(scratch));
__ sw(a2, MemOperand(sp));
__ mov(a2, a3);
+#endif
}
// ----------- S t a t e -------------
@@ -1721,16 +1878,30 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
// -- sp[8] : target
// -- sp[12] : receiver
// -----------------------------------
+ // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS
- // 1. Load target into a1 (if present), argumentsList into a0 (if present),
+ // 1. Load target into a1 (if present), argumentsList into a2 (if present),
// new.target into a3 (if present, otherwise use target), remove all
// arguments from the stack (including the receiver), and push thisArgument
// (if present) instead.
{
Label no_arg;
- Register scratch = t0;
__ LoadRoot(a1, RootIndex::kUndefinedValue);
__ mov(a2, a1);
+#ifdef V8_REVERSE_JSARGS
+ __ mov(t0, a1);
+ __ Branch(&no_arg, eq, a0, Operand(zero_reg));
+ __ lw(a1, MemOperand(sp, kSystemPointerSize)); // target
+ __ mov(a3, a1); // new.target defaults to target
+ __ Branch(&no_arg, eq, a0, Operand(1));
+ __ lw(a2, MemOperand(sp, 2 * kSystemPointerSize)); // argumentsList
+ __ Branch(&no_arg, eq, a0, Operand(2));
+ __ lw(a3, MemOperand(sp, 3 * kSystemPointerSize)); // new.target
+ __ bind(&no_arg);
+ __ Lsa(sp, sp, a0, kPointerSizeLog2);
+ __ sw(t0, MemOperand(sp)); // set undefined to the receiver
+#else
+ Register scratch = t0;
// Lsa() cannot be used hare as scratch value used later.
__ sll(scratch, a0, kPointerSizeLog2);
__ Addu(a0, sp, Operand(scratch));
@@ -1747,6 +1918,7 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
__ lw(a3, MemOperand(a0)); // new.target
__ bind(&no_arg);
__ Addu(sp, sp, Operand(scratch));
+#endif
}
// ----------- S t a t e -------------
@@ -1821,6 +1993,29 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
Label stack_overflow;
Generate_StackOverflowCheck(masm, t0, kScratchReg, t1, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy;
+ Register src = t3, dest = t4;
+ __ mov(src, sp);
+ __ sll(t1, t0, kSystemPointerSizeLog2);
+ __ Subu(sp, sp, Operand(t1));
+ // Update stack pointer.
+ __ mov(dest, sp);
+ __ Addu(t1, a0, Operand(zero_reg));
+
+ __ bind(&copy);
+ __ Lw(t2, MemOperand(src, 0));
+ __ Sw(t2, MemOperand(dest, 0));
+ __ Subu(t1, t1, Operand(1));
+ __ Addu(src, src, Operand(kSystemPointerSize));
+ __ Addu(dest, dest, Operand(kSystemPointerSize));
+ __ Branch(&copy, ge, t1, Operand(zero_reg));
+ }
+#endif
+
// Push arguments onto the stack (thisArgument is already on the stack).
{
__ mov(t2, zero_reg);
@@ -1830,11 +2025,16 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
__ Branch(&done, eq, t2, Operand(t0));
__ Lsa(kScratchReg, a2, t2, kPointerSizeLog2);
__ lw(kScratchReg, FieldMemOperand(kScratchReg, FixedArray::kHeaderSize));
+ __ Addu(t2, t2, Operand(1));
__ Branch(&push, ne, t1, Operand(kScratchReg));
__ LoadRoot(kScratchReg, RootIndex::kUndefinedValue);
__ bind(&push);
+#ifdef V8_REVERSE_JSARGS
+ __ Sw(kScratchReg, MemOperand(t4, 0));
+ __ Addu(t4, t4, Operand(kSystemPointerSize));
+#else
__ Push(kScratchReg);
- __ Addu(t2, t2, Operand(1));
+#endif
__ Branch(&loop);
__ bind(&done);
__ Addu(a0, a0, t2);
@@ -1906,15 +2106,56 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Generate_StackOverflowCheck(masm, t2, t0, t1, &stack_overflow);
// Forward the arguments from the caller frame.
+
+#ifdef V8_REVERSE_JSARGS
+ // Point to the first argument to copy (skipping the receiver).
+ __ Addu(t3, t3,
+ Operand(CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ Lsa(t3, t3, a2, kSystemPointerSizeLog2);
+
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy;
+ Register src = t5, dest = a2;
+ __ mov(src, sp);
+ // Update stack pointer.
+ __ sll(t6, t2, kSystemPointerSizeLog2);
+ __ Subu(sp, sp, Operand(t6));
+ __ mov(dest, sp);
+ __ Addu(t7, a0, Operand(zero_reg));
+
+ __ bind(&copy);
+ __ Lw(t6, MemOperand(src, 0));
+ __ Sw(t6, MemOperand(dest, 0));
+ __ Subu(t7, t7, Operand(1));
+ __ Addu(src, src, Operand(kSystemPointerSize));
+ __ Addu(dest, dest, Operand(kSystemPointerSize));
+ __ Branch(&copy, ge, t7, Operand(zero_reg));
+ }
+#endif
+
+ // Copy arguments from the caller frame.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
{
Label loop;
+#ifndef V8_REVERSE_JSARGS
+ __ Addu(t3, t3, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp));
+#endif
__ Addu(a0, a0, t2);
__ bind(&loop);
{
+ __ Subu(t2, t2, Operand(1));
__ Lsa(kScratchReg, t3, t2, kPointerSizeLog2);
- __ lw(kScratchReg, MemOperand(kScratchReg, 1 * kPointerSize));
+ __ lw(kScratchReg, MemOperand(kScratchReg));
+#ifdef V8_REVERSE_JSARGS
+ __ Lsa(t0, a2, t2, kPointerSizeLog2);
+ __ Sw(kScratchReg, MemOperand(t0));
+#else
__ push(kScratchReg);
- __ Subu(t2, t2, Operand(1));
+#endif
__ Branch(&loop, ne, t2, Operand(zero_reg));
}
}
@@ -1970,8 +2211,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
__ LoadGlobalProxy(a3);
} else {
Label convert_to_object, convert_receiver;
- __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ lw(a3, MemOperand(kScratchReg));
+ __ LoadReceiver(a3, a0);
__ JumpIfSmi(a3, &convert_to_object);
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
__ GetObjectType(a3, t0, t0);
@@ -2007,8 +2247,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
__ lw(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
__ bind(&convert_receiver);
}
- __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ sw(a3, MemOperand(kScratchReg));
+ __ StoreReceiver(a3, a0, kScratchReg);
}
__ bind(&done_convert);
@@ -2042,9 +2281,8 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
// Patch the receiver to [[BoundThis]].
{
- __ lw(kScratchReg, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset));
- __ Lsa(t0, sp, a0, kPointerSizeLog2);
- __ sw(kScratchReg, MemOperand(t0));
+ __ lw(t0, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset));
+ __ StoreReceiver(t0, a0, kScratchReg);
}
// Load [[BoundArguments]] into a2 and length of that into t0.
@@ -2063,13 +2301,11 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
{
Label done;
__ sll(t1, t0, kPointerSizeLog2);
- __ Subu(sp, sp, Operand(t1));
+ __ Subu(t1, sp, Operand(t1));
// Check the stack for overflow. We are not trying to catch interruptions
// (i.e. debug break and preemption) here, so check the "real stack limit".
LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit);
- __ Branch(&done, hs, sp, Operand(kScratchReg));
- // Restore the stack pointer.
- __ Addu(sp, sp, Operand(t1));
+ __ Branch(&done, hs, t1, Operand(kScratchReg));
{
FrameScope scope(masm, StackFrame::MANUAL);
__ EnterFrame(StackFrame::INTERNAL);
@@ -2078,6 +2314,29 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
__ bind(&done);
}
+#ifdef V8_REVERSE_JSARGS
+ // Pop receiver.
+ __ Pop(t1);
+
+ // Push [[BoundArguments]].
+ {
+ Label loop, done_loop;
+ __ Addu(a0, a0, Operand(t0));
+ __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
+ __ bind(&loop);
+ __ Subu(t0, t0, Operand(1));
+ __ Branch(&done_loop, lt, t0, Operand(zero_reg));
+ __ Lsa(kScratchReg, a2, t0, kPointerSizeLog2);
+ __ Lw(kScratchReg, MemOperand(kScratchReg));
+ __ Push(kScratchReg);
+ __ Branch(&loop);
+ __ bind(&done_loop);
+ }
+
+ // Push receiver.
+ __ Push(t1);
+#else
+ __ mov(sp, t1);
// Relocate arguments down the stack.
{
Label loop, done_loop;
@@ -2111,6 +2370,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
__ Branch(&loop);
__ bind(&done_loop);
}
+#endif
// Call the [[BoundTargetFunction]] via the Call builtin.
__ lw(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset));
@@ -2146,8 +2406,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
// 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception).
// Overwrite the original receiver with the (original) target.
- __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ sw(a1, MemOperand(kScratchReg));
+ __ StoreReceiver(a1, a0, kScratchReg);
// Let the "call_as_function_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1);
__ Jump(masm->isolate()->builtins()->CallFunction(
@@ -2220,13 +2479,11 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
{
Label done;
__ sll(t1, t0, kPointerSizeLog2);
- __ Subu(sp, sp, Operand(t1));
+ __ Subu(t1, sp, Operand(t1));
// Check the stack for overflow. We are not trying to catch interruptions
// (i.e. debug break and preemption) here, so check the "real stack limit".
LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit);
- __ Branch(&done, hs, sp, Operand(kScratchReg));
- // Restore the stack pointer.
- __ Addu(sp, sp, Operand(t1));
+ __ Branch(&done, hs, t1, Operand(kScratchReg));
{
FrameScope scope(masm, StackFrame::MANUAL);
__ EnterFrame(StackFrame::INTERNAL);
@@ -2235,6 +2492,29 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
__ bind(&done);
}
+#ifdef V8_REVERSE_JSARGS
+ // Pop receiver
+ __ Pop(t1);
+
+ // Push [[BoundArguments]].
+ {
+ Label loop, done_loop;
+ __ Addu(a0, a0, Operand(t0));
+ __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
+ __ bind(&loop);
+ __ Subu(t0, t0, Operand(1));
+ __ Branch(&done_loop, lt, t0, Operand(zero_reg));
+ __ Lsa(kScratchReg, a2, t0, kPointerSizeLog2);
+ __ Lw(kScratchReg, MemOperand(kScratchReg));
+ __ Push(kScratchReg);
+ __ Branch(&loop);
+ __ bind(&done_loop);
+ }
+
+ // Push receiver.
+ __ Push(t1);
+#else
+ __ mov(sp, t1);
// Relocate arguments down the stack.
{
Label loop, done_loop;
@@ -2268,6 +2548,7 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
__ Branch(&loop);
__ bind(&done_loop);
}
+#endif
// Patch new.target to [[BoundTargetFunction]] if new.target equals target.
{
@@ -2320,8 +2601,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ bind(&non_proxy);
{
// Overwrite the original receiver with the (original) target.
- __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ sw(a1, MemOperand(kScratchReg));
+ __ StoreReceiver(a1, a0, kScratchReg);
// Let the "call_as_constructor_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1);
__ Jump(masm->isolate()->builtins()->CallFunction(),
@@ -2362,7 +2642,11 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
Generate_StackOverflowCheck(masm, a2, t1, kScratchReg, &stack_overflow);
// Calculate copy start address into a0 and copy end address into t1.
+#ifdef V8_REVERSE_JSARGS
+ __ Lsa(a0, fp, a2, kPointerSizeLog2);
+#else
__ Lsa(a0, fp, a0, kPointerSizeLog2 - kSmiTagSize);
+#endif
// Adjust for return address and receiver.
__ Addu(a0, a0, Operand(2 * kPointerSize));
// Compute copy end address.
@@ -2391,6 +2675,37 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
EnterArgumentsAdaptorFrame(masm);
Generate_StackOverflowCheck(masm, a2, t1, kScratchReg, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Fill the remaining expected arguments with undefined.
+ __ LoadRoot(t0, RootIndex::kUndefinedValue);
+ __ SmiUntag(t2, a0);
+ __ Subu(t2, a2, Operand(t2));
+ __ sll(t1, t2, kSystemPointerSizeLog2);
+ __ Subu(t1, fp, t1);
+ // Adjust for frame.
+ __ Subu(t1, t1,
+ Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp +
+ kSystemPointerSize));
+
+ Label fill;
+ __ bind(&fill);
+ __ push(t0);
+ __ Branch(&fill, ne, sp, Operand(t1));
+
+ // Calculate copy start address into a0 and copy end address is fp.
+ __ Lsa(a0, fp, a0, kPointerSizeLog2 - kSmiTagSize);
+
+ // Copy the arguments (including the receiver) to the new stack frame.
+ Label copy;
+ __ bind(&copy);
+
+ // Adjust load for return address and receiver.
+ __ Lw(t0, MemOperand(a0, 2 * kSystemPointerSize));
+ __ push(t0);
+
+ __ Branch(USE_DELAY_SLOT, &copy, ne, a0, Operand(fp));
+ __ Subu(a0, a0, Operand(kSystemPointerSize));
+#else
// Calculate copy start address into a0 and copy end address into t3.
// a0: actual number of arguments as a smi
// a1: function
@@ -2433,6 +2748,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
__ Subu(sp, sp, kPointerSize);
__ Branch(USE_DELAY_SLOT, &fill, ne, sp, Operand(t1));
__ sw(t0, MemOperand(sp));
+#endif
}
// Call the entry point.
@@ -2484,6 +2800,12 @@ void Builtins::Generate_WasmCompileLazy(MacroAssembler* masm) {
constexpr RegList gp_regs = Register::ListOf(a0, a2, a3);
constexpr RegList fp_regs =
DoubleRegister::ListOf(f2, f4, f6, f8, f10, f12, f14);
+ constexpr int16_t num_to_push = base::bits::CountPopulation(gp_regs) +
+ base::bits::CountPopulation(fp_regs);
+ // The number of regs to be pushed before kWasmInstanceRegister should be
+ // equal to kNumberOfSavedAllParamRegs.
+ STATIC_ASSERT(num_to_push ==
+ WasmCompileLazyFrameConstants::kNumberOfSavedAllParamRegs);
__ MultiPush(gp_regs);
__ MultiPushFPU(fp_regs);
@@ -3000,7 +3322,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
// FunctionCallbackInfo::values_ (points at the first varargs argument passed
// on the stack).
- __ Subu(scratch, base, Operand(1 * kPointerSize));
+#ifdef V8_REVERSE_JSARGS
+ __ Addu(scratch, scratch,
+ Operand((FCA::kArgsLength + 1) * kSystemPointerSize));
+#else
+ __ Addu(scratch, scratch,
+ Operand((FCA::kArgsLength - 1) * kSystemPointerSize));
+ __ sll(t2, argc, kSystemPointerSizeLog2);
+ __ Addu(scratch, scratch, t2);
+#endif
__ sw(scratch, MemOperand(sp, 2 * kPointerSize));
// FunctionCallbackInfo::length_.
diff --git a/deps/v8/src/builtins/mips64/builtins-mips64.cc b/deps/v8/src/builtins/mips64/builtins-mips64.cc
index 8093d10211..04fce6b2a1 100644
--- a/deps/v8/src/builtins/mips64/builtins-mips64.cc
+++ b/deps/v8/src/builtins/mips64/builtins-mips64.cc
@@ -40,18 +40,24 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- a0 : actual argument count
// -- a1 : target function (preserved for callee)
// -- a3 : new target (preserved for callee)
// -----------------------------------
{
FrameScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the function onto the stack.
- // Push a copy of the target function and the new target.
- __ Push(a1, a3, a1);
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
+ // Push function as parameter to the runtime call.
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
- // Restore target function and new target.
- __ Pop(a1, a3);
+ // Restore target function, new target and actual argument count.
+ __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == a2, "ABI mismatch");
@@ -98,32 +104,24 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
__ Push(cp, a0);
__ SmiUntag(a0);
+#ifdef V8_REVERSE_JSARGS
+ // Set up pointer to last argument (skip receiver).
+ __ Daddu(
+ t2, fp,
+ Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize));
+ // Copy arguments and receiver to the expression stack.
+ __ PushArray(t2, a0, t3, t0);
+ // The receiver for the builtin/api call.
+ __ PushRoot(RootIndex::kTheHoleValue);
+#else
// The receiver for the builtin/api call.
__ PushRoot(RootIndex::kTheHoleValue);
-
// Set up pointer to last argument.
__ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset));
// Copy arguments and receiver to the expression stack.
- Label loop, entry;
- __ mov(t3, a0);
- // ----------- S t a t e -------------
- // -- a0: number of arguments (untagged)
- // -- a3: new target
- // -- t2: pointer to last argument
- // -- t3: counter
- // -- sp[0*kPointerSize]: the hole (receiver)
- // -- sp[1*kPointerSize]: number of arguments (tagged)
- // -- sp[2*kPointerSize]: context
- // -----------------------------------
- __ jmp(&entry);
- __ bind(&loop);
- __ Dlsa(t0, t2, t3, kPointerSizeLog2);
- __ Ld(t1, MemOperand(t0));
- __ push(t1);
- __ bind(&entry);
- __ Daddu(t3, t3, Operand(-1));
- __ Branch(&loop, greater_equal, t3, Operand(zero_reg));
+ __ PushArray(t2, a0, t3, t0);
+#endif
// Call the function.
// a0: number of arguments (untagged)
@@ -134,13 +132,13 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
// Restore context from the frame.
__ Ld(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset));
// Restore smi-tagged arguments count from the frame.
- __ Ld(a1, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
+ __ Ld(t3, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
// Leave construct frame.
}
// Remove caller arguments from the stack and return.
- __ SmiScale(a4, a1, kPointerSizeLog2);
- __ Daddu(sp, sp, a4);
+ __ SmiScale(t3, t3, kPointerSizeLog2);
+ __ Daddu(sp, sp, t3);
__ Daddu(sp, sp, kPointerSize);
__ Ret();
}
@@ -182,7 +180,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
// Preserve the incoming parameters on the stack.
__ SmiTag(a0);
__ Push(cp, a0, a1);
- __ PushRoot(RootIndex::kTheHoleValue);
+ __ PushRoot(RootIndex::kUndefinedValue);
__ Push(a3);
// ----------- S t a t e -------------
@@ -225,11 +223,30 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
// Restore new target.
__ Pop(a3);
+
+#ifdef V8_REVERSE_JSARGS
+ // Push the allocated receiver to the stack.
+ __ Push(v0);
+
+ // We need two copies because we may have to return the original one
+ // and the calling conventions dictate that the called function pops the
+ // receiver. The second copy is pushed after the arguments, we saved in a6
+ // since v0 will store the return value of callRuntime.
+ __ mov(a6, v0);
+
+ // Set up pointer to last argument.
+ __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset +
+ kSystemPointerSize));
+#else
// Push the allocated receiver to the stack. We need two copies
// because we may have to return the original one and the calling
// conventions dictate that the called function pops the receiver.
__ Push(v0, v0);
+ // Set up pointer to last argument.
+ __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset));
+#endif
+
// ----------- S t a t e -------------
// -- r3: new target
// -- sp[0*kPointerSize]: implicit receiver
@@ -245,9 +262,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ Ld(a0, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
__ SmiUntag(a0);
- // Set up pointer to last argument.
- __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset));
-
Label enough_stack_space, stack_overflow;
Generate_StackOverflowCheck(masm, a0, t0, t1, &stack_overflow);
__ Branch(&enough_stack_space);
@@ -262,28 +276,13 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ bind(&enough_stack_space);
// Copy arguments and receiver to the expression stack.
- Label loop, entry;
- __ mov(t3, a0);
- // ----------- S t a t e -------------
- // -- a0: number of arguments (untagged)
- // -- a3: new target
- // -- t2: pointer to last argument
- // -- t3: counter
- // -- sp[0*kPointerSize]: implicit receiver
- // -- sp[1*kPointerSize]: implicit receiver
- // -- sp[2*kPointerSize]: padding
- // -- a1 and sp[3*kPointerSize]: constructor function
- // -- sp[4*kPointerSize]: number of arguments (tagged)
- // -- sp[5*kPointerSize]: context
- // -----------------------------------
- __ jmp(&entry);
- __ bind(&loop);
- __ Dlsa(t0, t2, t3, kPointerSizeLog2);
- __ Ld(t1, MemOperand(t0));
- __ push(t1);
- __ bind(&entry);
- __ Daddu(t3, t3, Operand(-1));
- __ Branch(&loop, greater_equal, t3, Operand(zero_reg));
+ __ PushArray(t2, a0, t0, t1);
+#ifdef V8_REVERSE_JSARGS
+ // We need two copies because we may have to return the original one
+ // and the calling conventions dictate that the called function pops the
+ // receiver. The second copy is pushed after the arguments,
+ __ Push(a6);
+#endif
// Call the function.
__ InvokeFunctionWithNewTarget(a1, a3, a0, CALL_FUNCTION);
@@ -404,9 +403,11 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit);
__ Branch(&stack_overflow, lo, sp, Operand(kScratchReg));
+#ifndef V8_REVERSE_JSARGS
// Push receiver.
__ Ld(a5, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset));
__ Push(a5);
+#endif
// ----------- S t a t e -------------
// -- a1 : the JSGeneratorObject to resume
@@ -426,6 +427,20 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ Ld(t1,
FieldMemOperand(a1, JSGeneratorObject::kParametersAndRegistersOffset));
{
+#ifdef V8_REVERSE_JSARGS
+ Label done_loop, loop;
+ __ bind(&loop);
+ __ Dsubu(a3, a3, Operand(1));
+ __ Branch(&done_loop, lt, a3, Operand(zero_reg));
+ __ Dlsa(kScratchReg, t1, a3, kPointerSizeLog2);
+ __ Ld(kScratchReg, FieldMemOperand(kScratchReg, FixedArray::kHeaderSize));
+ __ Push(kScratchReg);
+ __ Branch(&loop);
+ __ bind(&done_loop);
+ // Push receiver.
+ __ Ld(kScratchReg, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset));
+ __ Push(kScratchReg);
+#else
Label done_loop, loop;
__ Move(t2, zero_reg);
__ bind(&loop);
@@ -437,6 +452,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ Daddu(t2, t2, Operand(1));
__ Branch(&loop);
__ bind(&done_loop);
+#endif
}
// Underlying function needs to have bytecode available.
@@ -745,26 +761,36 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ li(cp, context_address);
__ Ld(cp, MemOperand(cp));
- // Push the function and the receiver onto the stack.
- __ Push(a2, a3);
+ // Push the function onto the stack.
+ __ Push(a2);
// Check if we have enough stack space to push all arguments.
- // Clobbers a0 and a3.
- Generate_CheckStackOverflow(masm, a4, a0, a3);
-
- // Setup new.target, function and argc.
- __ mov(a3, a1);
- __ mov(a1, a2);
- __ mov(a0, a4);
-
- // a0: argc
- // a1: function
- // a3: new.target
- // a5: argv
+ __ daddiu(a6, a4, 1);
+ Generate_CheckStackOverflow(masm, a6, a0, s2);
// Copy arguments to the stack in a loop.
- // a3: argc
+ // a4: argc
// a5: argv, i.e. points to first arg
+#ifdef V8_REVERSE_JSARGS
+ Label loop, entry;
+ __ Dlsa(s1, a5, a4, kPointerSizeLog2);
+ __ b(&entry);
+ __ nop(); // Branch delay slot nop.
+ // s1 points past last arg.
+ __ bind(&loop);
+ __ daddiu(s1, s1, -kPointerSize);
+ __ Ld(s2, MemOperand(s1)); // Read next parameter.
+ __ Ld(s2, MemOperand(s2)); // Dereference handle.
+ __ push(s2); // Push parameter.
+ __ bind(&entry);
+ __ Branch(&loop, ne, a5, Operand(s1));
+
+ // Push the receive.
+ __ Push(a3);
+#else
+ // Push the receive.
+ __ Push(a3);
+
Label loop, entry;
__ Dlsa(s1, a5, a4, kPointerSizeLog2);
__ b(&entry);
@@ -778,9 +804,14 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ bind(&entry);
__ Branch(&loop, ne, a5, Operand(s1));
+#endif
+
// a0: argc
// a1: function
// a3: new.target
+ __ mov(a3, a1);
+ __ mov(a1, a2);
+ __ mov(a0, a4);
// Initialize all JavaScript callee-saved registers, since they will be seen
// by the garbage collector as part of handlers.
@@ -862,6 +893,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch1, Register scratch2) {
// ----------- S t a t e -------------
+ // -- a0 : actual argument count
// -- a3 : new target (preserved for callee if needed, and caller)
// -- a1 : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -899,6 +931,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- a0 : actual argument count
// -- a3 : new target (preserved for callee if needed, and caller)
// -- a1 : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -1008,10 +1041,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o a0 : actual argument count (not including the receiver)
// o a1: the JS function object being called.
// o a3: the incoming new target or generator object
// o cp: our context
@@ -1027,16 +1060,18 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
- __ Ld(a0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ __ Ld(kScratchReg,
+ FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
__ Ld(kInterpreterBytecodeArrayRegister,
- FieldMemOperand(a0, SharedFunctionInfo::kFunctionDataOffset));
- GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, a4);
+ FieldMemOperand(kScratchReg, SharedFunctionInfo::kFunctionDataOffset));
+ GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister,
+ kScratchReg);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ GetObjectType(kInterpreterBytecodeArrayRegister, a0, a0);
- __ Branch(&compile_lazy, ne, a0, Operand(BYTECODE_ARRAY_TYPE));
+ __ GetObjectType(kInterpreterBytecodeArrayRegister, kScratchReg, kScratchReg);
+ __ Branch(&compile_lazy, ne, kScratchReg, Operand(BYTECODE_ARRAY_TYPE));
// Load the feedback vector from the closure.
__ Ld(feedback_vector,
@@ -1235,22 +1270,22 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
}
static void Generate_InterpreterPushArgs(MacroAssembler* masm,
- Register num_args, Register index,
- Register scratch, Register scratch2) {
+ Register num_args,
+ Register start_address,
+ Register scratch,
+ Register scratch2) {
// Find the address of the last argument.
- __ mov(scratch2, num_args);
- __ dsll(scratch2, scratch2, kPointerSizeLog2);
- __ Dsubu(scratch2, index, Operand(scratch2));
+ __ Dsubu(scratch, num_args, Operand(1));
+ __ dsll(scratch, scratch, kPointerSizeLog2);
+ __ Dsubu(start_address, start_address, scratch);
// Push the arguments.
- Label loop_header, loop_check;
- __ Branch(&loop_check);
- __ bind(&loop_header);
- __ Ld(scratch, MemOperand(index));
- __ Daddu(index, index, Operand(-kPointerSize));
- __ push(scratch);
- __ bind(&loop_check);
- __ Branch(&loop_header, hi, index, Operand(scratch2));
+#ifdef V8_REVERSE_JSARGS
+ __ PushArray(start_address, num_args, scratch, scratch2,
+ TurboAssembler::PushArrayOrder::kReverse);
+#else
+ __ PushArray(start_address, num_args, scratch, scratch2);
+#endif
}
// static
@@ -1267,15 +1302,42 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
// -----------------------------------
Label stack_overflow;
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ Dsubu(a0, a0, Operand(1));
+ }
+#endif
+
__ Daddu(a3, a0, Operand(1)); // Add one for receiver.
- // Push "undefined" as the receiver arg if we need to.
+ Generate_StackOverflowCheck(masm, a3, a4, t0, &stack_overflow);
+
+#ifdef V8_REVERSE_JSARGS
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ // Don't copy receiver.
+ __ mov(a3, a0);
+ }
+
+ // This function modifies a2, t0 and a4.
+ Generate_InterpreterPushArgs(masm, a3, a2, a4, t0);
+
if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
__ PushRoot(RootIndex::kUndefinedValue);
- __ Dsubu(a3, a3, Operand(1)); // Subtract one for receiver.
}
- Generate_StackOverflowCheck(masm, a3, a4, t0, &stack_overflow);
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register a2.
+ // a2 already points to the penultime argument, the spread
+ // is below that.
+ __ Ld(a2, MemOperand(a2, -kSystemPointerSize));
+ }
+#else
+ // Push "undefined" as the receiver arg if we need to.
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ __ PushRoot(RootIndex::kUndefinedValue);
+ __ mov(a3, a0);
+ }
// This function modifies a2, t0 and a4.
Generate_InterpreterPushArgs(masm, a3, a2, a4, t0);
@@ -1284,6 +1346,7 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
__ Pop(a2); // Pass the spread in a register
__ Dsubu(a0, a0, Operand(1)); // Subtract one for spread
}
+#endif
// Call the target.
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
@@ -1313,11 +1376,32 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
// -- a4 : address of the first argument
// -----------------------------------
Label stack_overflow;
+ __ daddiu(a6, a0, 1);
+ Generate_StackOverflowCheck(masm, a6, a5, t0, &stack_overflow);
+
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ Dsubu(a0, a0, Operand(1));
+ }
+
+ // Push the arguments, This function modifies t0, a4 and a5.
+ Generate_InterpreterPushArgs(masm, a0, a4, a5, t0);
// Push a slot for the receiver.
__ push(zero_reg);
- Generate_StackOverflowCheck(masm, a0, a5, t0, &stack_overflow);
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register a2.
+ // a4 already points to the penultimate argument, the spread
+ // lies in the next interpreter register.
+ __ Ld(a2, MemOperand(a4, -kSystemPointerSize));
+ } else {
+ __ AssertUndefinedOrAllocationSite(a2, t0);
+ }
+#else
+ // Push a slot for the receiver.
+ __ push(zero_reg);
// This function modifies t0, a4 and a5.
Generate_InterpreterPushArgs(masm, a0, a4, a5, t0);
@@ -1328,6 +1412,7 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
} else {
__ AssertUndefinedOrAllocationSite(a2, t0);
}
+#endif
if (mode == InterpreterPushArgsMode::kArrayFunction) {
__ AssertFunction(a1);
@@ -1486,7 +1571,12 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
bool with_result) {
const RegisterConfiguration* config(RegisterConfiguration::Default());
int allocatable_register_count = config->num_allocatable_general_registers();
+ Register scratch = t3;
if (with_result) {
+#ifdef V8_REVERSE_JSARGS
+ if (java_script_builtin) {
+ __ mov(scratch, v0);
+ } else {
// Overwrite the hole inserted by the deoptimizer with the return value from
// the LAZY deopt point.
__ Sd(v0,
@@ -1494,6 +1584,16 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
sp, config->num_allocatable_general_registers() * kPointerSize +
BuiltinContinuationFrameConstants::kFixedFrameSize));
}
+#else
+ // Overwrite the hole inserted by the deoptimizer with the return value from
+ // the LAZY deopt point.
+ __ Sd(v0,
+ MemOperand(
+ sp, config->num_allocatable_general_registers() * kPointerSize +
+ BuiltinContinuationFrameConstants::kFixedFrameSize));
+ USE(scratch);
+#endif
+ }
for (int i = allocatable_register_count - 1; i >= 0; --i) {
int code = config->GetAllocatableGeneralCode(i);
__ Pop(Register::from_code(code));
@@ -1501,6 +1601,22 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
__ SmiUntag(Register::from_code(code));
}
}
+
+#ifdef V8_REVERSE_JSARGS
+ if (with_result && java_script_builtin) {
+ // Overwrite the hole inserted by the deoptimizer with the return value from
+ // the LAZY deopt point. t0 contains the arguments count, the return value
+ // from LAZY is always the last argument.
+ __ Daddu(a0, a0,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ __ Dlsa(t0, sp, a0, kSystemPointerSizeLog2);
+ __ Sd(scratch, MemOperand(t0));
+ // Recover arguments count.
+ __ Dsubu(a0, a0,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ }
+#endif
+
__ Ld(fp, MemOperand(
sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp));
// Load builtin index (stored as a Smi) and use it to get the builtin start
@@ -1602,6 +1718,18 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// Claim (2 - argc) dummy arguments form the stack, to put the stack in a
// consistent state for a simple pop operation.
+#ifdef V8_REVERSE_JSARGS
+ __ mov(scratch, argc);
+ __ Ld(this_arg, MemOperand(sp, kPointerSize));
+ __ Ld(arg_array, MemOperand(sp, 2 * kPointerSize));
+ __ Movz(arg_array, undefined_value, scratch); // if argc == 0
+ __ Movz(this_arg, undefined_value, scratch); // if argc == 0
+ __ Dsubu(scratch, scratch, Operand(1));
+ __ Movz(arg_array, undefined_value, scratch); // if argc == 1
+ __ Ld(receiver, MemOperand(sp));
+ __ Dlsa(sp, sp, argc, kSystemPointerSizeLog2);
+ __ Sd(this_arg, MemOperand(sp));
+#else
__ Dsubu(sp, sp, Operand(2 * kPointerSize));
__ Dlsa(sp, sp, argc, kPointerSizeLog2);
__ mov(scratch, argc);
@@ -1612,6 +1740,7 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
__ Movz(arg_array, undefined_value, scratch); // if argc == 1
__ Ld(receiver, MemOperand(sp));
__ Sd(this_arg, MemOperand(sp));
+#endif
}
// ----------- S t a t e -------------
@@ -1646,6 +1775,25 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// static
void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
+#ifdef V8_REVERSE_JSARGS
+ // 1. Get the callable to call (passed as receiver) from the stack.
+ {
+ __ Pop(a1);
+ }
+
+ // 2. Make sure we have at least one argument.
+ // a0: actual number of arguments
+ {
+ Label done;
+ __ Branch(&done, ne, a0, Operand(zero_reg));
+ __ PushRoot(RootIndex::kUndefinedValue);
+ __ Daddu(a0, a0, Operand(1));
+ __ bind(&done);
+ }
+
+ // 3. Adjust the actual number of arguments.
+ __ daddiu(a0, a0, -1);
+#else
// 1. Make sure we have at least one argument.
// a0: actual number of arguments
{
@@ -1658,8 +1806,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
// 2. Get the function to call (passed as receiver) from the stack.
// a0: actual number of arguments
- __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ Ld(a1, MemOperand(kScratchReg));
+ __ LoadReceiver(a1, a0);
// 3. Shift arguments and return address one slot down on the stack
// (overwriting the original receiver). Adjust argument count to make
@@ -1681,6 +1828,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
__ Dsubu(a0, a0, Operand(1));
__ Pop();
}
+#endif
// 4. Call the callable.
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
@@ -1711,6 +1859,23 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
// Claim (3 - argc) dummy arguments form the stack, to put the stack in a
// consistent state for a simple pop operation.
+#ifdef V8_REVERSE_JSARGS
+ __ mov(scratch, argc);
+ __ Ld(target, MemOperand(sp, kPointerSize));
+ __ Ld(this_argument, MemOperand(sp, 2 * kPointerSize));
+ __ Ld(arguments_list, MemOperand(sp, 3 * kPointerSize));
+ __ Movz(arguments_list, undefined_value, scratch); // if argc == 0
+ __ Movz(this_argument, undefined_value, scratch); // if argc == 0
+ __ Movz(target, undefined_value, scratch); // if argc == 0
+ __ Dsubu(scratch, scratch, Operand(1));
+ __ Movz(arguments_list, undefined_value, scratch); // if argc == 1
+ __ Movz(this_argument, undefined_value, scratch); // if argc == 1
+ __ Dsubu(scratch, scratch, Operand(1));
+ __ Movz(arguments_list, undefined_value, scratch); // if argc == 2
+
+ __ Dlsa(sp, sp, argc, kSystemPointerSizeLog2);
+ __ Sd(this_argument, MemOperand(sp, 0)); // Overwrite receiver
+#else
__ Dsubu(sp, sp, Operand(3 * kPointerSize));
__ Dlsa(sp, sp, argc, kPointerSizeLog2);
__ mov(scratch, argc);
@@ -1725,6 +1890,7 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
__ Movz(arguments_list, undefined_value, scratch); // if argc == 2
__ Sd(this_argument, MemOperand(sp, 0)); // Overwrite receiver
+#endif
}
// ----------- S t a t e -------------
@@ -1751,6 +1917,8 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
// -- sp[8] : target (dummy value if argc == 0)
// -- sp[12] : receiver
// -----------------------------------
+ // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS
+
Register argc = a0;
Register arguments_list = a2;
Register target = a1;
@@ -1768,6 +1936,23 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
// Claim (3 - argc) dummy arguments form the stack, to put the stack in a
// consistent state for a simple pop operation.
+#ifdef V8_REVERSE_JSARGS
+ __ mov(scratch, argc);
+ __ Ld(target, MemOperand(sp, kPointerSize));
+ __ Ld(arguments_list, MemOperand(sp, 2 * kPointerSize));
+ __ Ld(new_target, MemOperand(sp, 3 * kPointerSize));
+ __ Movz(arguments_list, undefined_value, scratch); // if argc == 0
+ __ Movz(new_target, undefined_value, scratch); // if argc == 0
+ __ Movz(target, undefined_value, scratch); // if argc == 0
+ __ Dsubu(scratch, scratch, Operand(1));
+ __ Movz(arguments_list, undefined_value, scratch); // if argc == 1
+ __ Movz(new_target, target, scratch); // if argc == 1
+ __ Dsubu(scratch, scratch, Operand(1));
+ __ Movz(new_target, target, scratch); // if argc == 2
+
+ __ Dlsa(sp, sp, argc, kSystemPointerSizeLog2);
+ __ Sd(undefined_value, MemOperand(sp, 0)); // Overwrite receiver
+#else
__ Dsubu(sp, sp, Operand(3 * kPointerSize));
__ Dlsa(sp, sp, argc, kPointerSizeLog2);
__ mov(scratch, argc);
@@ -1779,9 +1964,10 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
__ Movz(arguments_list, undefined_value, scratch); // if argc == 1
__ Movz(new_target, target, scratch); // if argc == 1
__ Dsubu(scratch, scratch, Operand(1));
- __ Movz(new_target, target, scratch); // if argc == 2
+ __ Movz(new_target, target, scratch); // if argc == 2
__ Sd(undefined_value, MemOperand(sp, 0)); // Overwrite receiver
+#endif
}
// ----------- S t a t e -------------
@@ -1860,6 +2046,29 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
Label stack_overflow;
Generate_StackOverflowCheck(masm, len, kScratchReg, a5, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy;
+ Register src = a6, dest = a7;
+ __ mov(src, sp);
+ __ dsll(t0, a4, kSystemPointerSizeLog2);
+ __ Dsubu(sp, sp, Operand(t0));
+ // Update stack pointer.
+ __ mov(dest, sp);
+ __ Daddu(t0, a0, Operand(zero_reg));
+
+ __ bind(&copy);
+ __ Ld(t1, MemOperand(src, 0));
+ __ Sd(t1, MemOperand(dest, 0));
+ __ Dsubu(t0, t0, Operand(1));
+ __ Daddu(src, src, Operand(kSystemPointerSize));
+ __ Daddu(dest, dest, Operand(kSystemPointerSize));
+ __ Branch(&copy, ge, t0, Operand(zero_reg));
+ }
+#endif
+
// Push arguments onto the stack (thisArgument is already on the stack).
{
Label done, push, loop;
@@ -1874,11 +2083,17 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
__ LoadRoot(t1, RootIndex::kTheHoleValue);
__ bind(&loop);
__ Ld(a5, MemOperand(src));
+ __ daddiu(src, src, kPointerSize);
__ Branch(&push, ne, a5, Operand(t1));
__ LoadRoot(a5, RootIndex::kUndefinedValue);
__ bind(&push);
- __ daddiu(src, src, kPointerSize);
+#ifdef V8_REVERSE_JSARGS
+ __ Sd(a5, MemOperand(a7, 0));
+ __ Daddu(a7, a7, Operand(kSystemPointerSize));
+ __ Daddu(scratch, scratch, Operand(kSystemPointerSize));
+#else
__ Push(a5);
+#endif
__ Branch(&loop, ne, scratch, Operand(sp));
__ bind(&done);
}
@@ -1949,15 +2164,56 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Generate_StackOverflowCheck(masm, a7, a4, a5, &stack_overflow);
// Forward the arguments from the caller frame.
+
+#ifdef V8_REVERSE_JSARGS
+ // Point to the first argument to copy (skipping the receiver).
+ __ Daddu(a6, a6,
+ Operand(CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ Dlsa(a6, a6, a2, kSystemPointerSizeLog2);
+
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy;
+ Register src = t0, dest = a2;
+ __ mov(src, sp);
+ // Update stack pointer.
+ __ dsll(t1, a7, kSystemPointerSizeLog2);
+ __ Dsubu(sp, sp, Operand(t1));
+ __ mov(dest, sp);
+ __ Daddu(t2, a0, Operand(zero_reg));
+
+ __ bind(&copy);
+ __ Ld(t1, MemOperand(src, 0));
+ __ Sd(t1, MemOperand(dest, 0));
+ __ Dsubu(t2, t2, Operand(1));
+ __ Daddu(src, src, Operand(kSystemPointerSize));
+ __ Daddu(dest, dest, Operand(kSystemPointerSize));
+ __ Branch(&copy, ge, t2, Operand(zero_reg));
+ }
+#endif
+
+ // Copy arguments from the caller frame.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
{
Label loop;
+#ifndef V8_REVERSE_JSARGS
+ __ Daddu(a6, a6, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp));
+#endif
__ Daddu(a0, a0, a7);
__ bind(&loop);
{
- __ Dlsa(kScratchReg, a6, a7, kPointerSizeLog2);
- __ Ld(kScratchReg, MemOperand(kScratchReg, 1 * kPointerSize));
- __ push(kScratchReg);
__ Subu(a7, a7, Operand(1));
+ __ Dlsa(t0, a6, a7, kPointerSizeLog2);
+ __ Ld(kScratchReg, MemOperand(t0));
+#ifdef V8_REVERSE_JSARGS
+ __ Dlsa(t0, a2, a7, kPointerSizeLog2);
+ __ Sd(kScratchReg, MemOperand(t0));
+#else
+ __ push(kScratchReg);
+#endif
__ Branch(&loop, ne, a7, Operand(zero_reg));
}
}
@@ -2013,8 +2269,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
__ LoadGlobalProxy(a3);
} else {
Label convert_to_object, convert_receiver;
- __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ Ld(a3, MemOperand(kScratchReg));
+ __ LoadReceiver(a3, a0);
__ JumpIfSmi(a3, &convert_to_object);
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
__ GetObjectType(a3, a4, a4);
@@ -2050,8 +2305,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
__ Ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
__ bind(&convert_receiver);
}
- __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ Sd(a3, MemOperand(kScratchReg));
+ __ StoreReceiver(a3, a0, kScratchReg);
}
__ bind(&done_convert);
@@ -2085,9 +2339,8 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
// Patch the receiver to [[BoundThis]].
{
- __ Ld(kScratchReg, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset));
- __ Dlsa(a4, sp, a0, kPointerSizeLog2);
- __ Sd(kScratchReg, MemOperand(a4));
+ __ Ld(t0, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset));
+ __ StoreReceiver(t0, a0, kScratchReg);
}
// Load [[BoundArguments]] into a2 and length of that into a4.
@@ -2105,13 +2358,11 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
{
Label done;
__ dsll(a5, a4, kPointerSizeLog2);
- __ Dsubu(sp, sp, Operand(a5));
+ __ Dsubu(t0, sp, Operand(a5));
// Check the stack for overflow. We are not trying to catch interruptions
// (i.e. debug break and preemption) here, so check the "real stack limit".
LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit);
- __ Branch(&done, hs, sp, Operand(kScratchReg));
- // Restore the stack pointer.
- __ Daddu(sp, sp, Operand(a5));
+ __ Branch(&done, hs, t0, Operand(kScratchReg));
{
FrameScope scope(masm, StackFrame::MANUAL);
__ EnterFrame(StackFrame::INTERNAL);
@@ -2120,6 +2371,30 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
__ bind(&done);
}
+#ifdef V8_REVERSE_JSARGS
+ // Pop receiver.
+ __ Pop(t0);
+
+ // Push [[BoundArguments]].
+ {
+ Label loop, done_loop;
+ __ SmiUntag(a4, FieldMemOperand(a2, FixedArray::kLengthOffset));
+ __ Daddu(a0, a0, Operand(a4));
+ __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
+ __ bind(&loop);
+ __ Dsubu(a4, a4, Operand(1));
+ __ Branch(&done_loop, lt, a4, Operand(zero_reg));
+ __ Dlsa(a5, a2, a4, kPointerSizeLog2);
+ __ Ld(kScratchReg, MemOperand(a5));
+ __ Push(kScratchReg);
+ __ Branch(&loop);
+ __ bind(&done_loop);
+ }
+
+ // Push receiver.
+ __ Push(t0);
+#else
+ __ mov(sp, t0);
// Relocate arguments down the stack.
{
Label loop, done_loop;
@@ -2152,6 +2427,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
__ Branch(&loop);
__ bind(&done_loop);
}
+#endif
// Call the [[BoundTargetFunction]] via the Call builtin.
__ Ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset));
@@ -2186,8 +2462,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
// 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception).
// Overwrite the original receiver with the (original) target.
- __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ Sd(a1, MemOperand(kScratchReg));
+ __ StoreReceiver(a1, a0, kScratchReg);
// Let the "call_as_function_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1);
__ Jump(masm->isolate()->builtins()->CallFunction(
@@ -2258,13 +2533,11 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
{
Label done;
__ dsll(a5, a4, kPointerSizeLog2);
- __ Dsubu(sp, sp, Operand(a5));
+ __ Dsubu(t0, sp, Operand(a5));
// Check the stack for overflow. We are not trying to catch interruptions
// (i.e. debug break and preemption) here, so check the "real stack limit".
LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit);
- __ Branch(&done, hs, sp, Operand(kScratchReg));
- // Restore the stack pointer.
- __ Daddu(sp, sp, Operand(a5));
+ __ Branch(&done, hs, t0, Operand(kScratchReg));
{
FrameScope scope(masm, StackFrame::MANUAL);
__ EnterFrame(StackFrame::INTERNAL);
@@ -2273,6 +2546,30 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
__ bind(&done);
}
+#ifdef V8_REVERSE_JSARGS
+ // Pop receiver.
+ __ Pop(t0);
+
+ // Push [[BoundArguments]].
+ {
+ Label loop, done_loop;
+ __ SmiUntag(a4, FieldMemOperand(a2, FixedArray::kLengthOffset));
+ __ Daddu(a0, a0, Operand(a4));
+ __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
+ __ bind(&loop);
+ __ Dsubu(a4, a4, Operand(1));
+ __ Branch(&done_loop, lt, a4, Operand(zero_reg));
+ __ Dlsa(a5, a2, a4, kPointerSizeLog2);
+ __ Ld(kScratchReg, MemOperand(a5));
+ __ Push(kScratchReg);
+ __ Branch(&loop);
+ __ bind(&done_loop);
+ }
+
+ // Push receiver.
+ __ Push(t0);
+#else
+ __ mov(sp, t0);
// Relocate arguments down the stack.
{
Label loop, done_loop;
@@ -2305,6 +2602,7 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
__ Branch(&loop);
__ bind(&done_loop);
}
+#endif
// Patch new.target to [[BoundTargetFunction]] if new.target equals target.
{
@@ -2357,8 +2655,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ bind(&non_proxy);
{
// Overwrite the original receiver with the (original) target.
- __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2);
- __ Sd(a1, MemOperand(kScratchReg));
+ __ StoreReceiver(a1, a0, kScratchReg);
// Let the "call_as_constructor_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1);
__ Jump(masm->isolate()->builtins()->CallFunction(),
@@ -2399,8 +2696,14 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
Generate_StackOverflowCheck(masm, a2, a5, kScratchReg, &stack_overflow);
// Calculate copy start address into a0 and copy end address into a4.
+#ifdef V8_REVERSE_JSARGS
+ __ dsll(a0, a2, kPointerSizeLog2);
+ __ Daddu(a0, fp, a0);
+#else
__ SmiScale(a0, a0, kPointerSizeLog2);
__ Daddu(a0, fp, a0);
+#endif
+
// Adjust for return address and receiver.
__ Daddu(a0, a0, Operand(2 * kPointerSize));
// Compute copy end address.
@@ -2429,6 +2732,38 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
EnterArgumentsAdaptorFrame(masm);
Generate_StackOverflowCheck(masm, a2, a5, kScratchReg, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Fill the remaining expected arguments with undefined.
+ __ LoadRoot(t0, RootIndex::kUndefinedValue);
+ __ SmiUntag(t1, a0);
+ __ Dsubu(t2, a2, Operand(t1));
+ __ dsll(a4, t2, kSystemPointerSizeLog2);
+ __ Dsubu(a4, fp, a4);
+ // Adjust for frame.
+ __ Dsubu(a4, a4,
+ Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp +
+ kSystemPointerSize));
+
+ Label fill;
+ __ bind(&fill);
+ __ push(t0);
+ __ Branch(&fill, ne, sp, Operand(a4));
+
+ // Calculate copy start address into r0 and copy end address is fp.
+ __ SmiScale(a0, a0, kPointerSizeLog2);
+ __ Daddu(a0, fp, a0);
+
+ // Copy the arguments (including the receiver) to the new stack frame.
+ Label copy;
+ __ bind(&copy);
+
+ // Adjust load for return address and receiver.
+ __ Ld(t0, MemOperand(a0, 2 * kSystemPointerSize));
+ __ push(t0);
+
+ __ Branch(USE_DELAY_SLOT, &copy, ne, a0, Operand(fp));
+ __ Dsubu(a0, a0, Operand(kSystemPointerSize));
+#else
// Calculate copy start address into a0 and copy end address into a7.
// a0: actual number of arguments as a smi
// a1: function
@@ -2472,6 +2807,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
__ Dsubu(sp, sp, kPointerSize);
__ Branch(USE_DELAY_SLOT, &fill, ne, sp, Operand(a4));
__ Sd(a5, MemOperand(sp));
+#endif
}
// Call the entry point.
@@ -2524,6 +2860,12 @@ void Builtins::Generate_WasmCompileLazy(MacroAssembler* masm) {
Register::ListOf(a0, a2, a3, a4, a5, a6, a7);
constexpr RegList fp_regs =
DoubleRegister::ListOf(f2, f4, f6, f8, f10, f12, f14);
+ constexpr int16_t num_to_push = base::bits::CountPopulation(gp_regs) +
+ base::bits::CountPopulation(fp_regs);
+ // The number of regs to be pushed before kWasmInstanceRegister should be
+ // equal to kNumberOfSavedAllParamRegs.
+ STATIC_ASSERT(num_to_push ==
+ WasmCompileLazyFrameConstants::kNumberOfSavedAllParamRegs);
__ MultiPush(gp_regs);
__ MultiPushFPU(fp_regs);
@@ -3043,7 +3385,16 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
// FunctionCallbackInfo::values_ (points at the first varargs argument passed
// on the stack).
- __ Dsubu(scratch, base, Operand(1 * kPointerSize));
+#ifdef V8_REVERSE_JSARGS
+ __ Daddu(scratch, scratch,
+ Operand((FCA::kArgsLength + 1) * kSystemPointerSize));
+#else
+ __ Daddu(scratch, scratch,
+ Operand((FCA::kArgsLength - 1) * kSystemPointerSize));
+ __ dsll(t2, argc, kSystemPointerSizeLog2);
+ __ Daddu(scratch, scratch, t2);
+#endif
+
__ Sd(scratch, MemOperand(sp, 2 * kPointerSize));
// FunctionCallbackInfo::length_.
diff --git a/deps/v8/src/builtins/ppc/builtins-ppc.cc b/deps/v8/src/builtins/ppc/builtins-ppc.cc
index 8b3bc95699..8f262818ab 100644
--- a/deps/v8/src/builtins/ppc/builtins-ppc.cc
+++ b/deps/v8/src/builtins/ppc/builtins-ppc.cc
@@ -38,20 +38,26 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- r3 : actual argument count
// -- r4 : target function (preserved for callee)
// -- r6 : new target (preserved for callee)
// -----------------------------------
{
FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
// Push function as parameter to the runtime call.
- __ Push(r4, r6, r4);
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
__ mr(r5, r3);
- // Restore target function and new target.
- __ Pop(r4, r6);
+ // Restore target function, new target and actual argument count.
+ __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == r5, "ABI mismatch");
__ JumpCodeObject(r5);
@@ -116,34 +122,25 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
__ SmiTag(r3);
__ Push(cp, r3);
__ SmiUntag(r3, SetRC);
+
+#ifdef V8_REVERSE_JSARGS
+ // Set up pointer to last argument (skip receiver).
+ __ addi(
+ r7, fp,
+ Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize));
+ // Copy arguments and receiver to the expression stack.
+ __ PushArray(r7, r3, r8, r0);
+ // The receiver for the builtin/api call.
+ __ PushRoot(RootIndex::kTheHoleValue);
+#else
// The receiver for the builtin/api call.
__ PushRoot(RootIndex::kTheHoleValue);
// Set up pointer to last argument.
__ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset));
// Copy arguments and receiver to the expression stack.
-
- Label loop, no_args;
- // ----------- S t a t e -------------
- // -- r3: number of arguments (untagged)
- // -- r4: constructor function
- // -- r6: new target
- // -- r7: pointer to last argument
- // -- cr0: condition indicating whether r3 is zero
- // -- sp[0*kSystemPointerSize]: the hole (receiver)
- // -- sp[1*kSystemPointerSize]: number of arguments (tagged)
- // -- sp[2*kSystemPointerSize]: context
- // -----------------------------------
- __ beq(&no_args, cr0);
- __ ShiftLeftImm(scratch, r3, Operand(kSystemPointerSizeLog2));
- __ sub(sp, sp, scratch);
- __ mtctr(r3);
- __ bind(&loop);
- __ subi(scratch, scratch, Operand(kSystemPointerSize));
- __ LoadPX(r0, MemOperand(r7, scratch));
- __ StorePX(r0, MemOperand(sp, scratch));
- __ bdnz(&loop);
- __ bind(&no_args);
+ __ PushArray(r7, r3, r8, r0);
+#endif
// Call the function.
// r3: number of arguments (untagged)
@@ -157,15 +154,15 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
// Restore context from the frame.
__ LoadP(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset));
// Restore smi-tagged arguments count from the frame.
- __ LoadP(r4, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
+ __ LoadP(scratch, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
// Leave construct frame.
}
// Remove caller arguments from the stack and return.
STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
- __ SmiToPtrArrayOffset(r4, r4);
- __ add(sp, sp, r4);
+ __ SmiToPtrArrayOffset(scratch, scratch);
+ __ add(sp, sp, scratch);
__ addi(sp, sp, Operand(kSystemPointerSize));
__ blr();
@@ -242,11 +239,31 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
// Restore new target.
__ Pop(r6);
+
+#ifdef V8_REVERSE_JSARGS
+ // Push the allocated receiver to the stack.
+ __ Push(r3);
+ // We need two copies because we may have to return the original one
+ // and the calling conventions dictate that the called function pops the
+ // receiver. The second copy is pushed after the arguments, we saved in r6
+ // since r0 needs to store the number of arguments before
+ // InvokingFunction.
+ __ mr(r9, r3);
+
+ // Set up pointer to first argument (skip receiver).
+ __ addi(
+ r7, fp,
+ Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize));
+#else
// Push the allocated receiver to the stack. We need two copies
// because we may have to return the original one and the calling
// conventions dictate that the called function pops the receiver.
__ Push(r3, r3);
+ // Set up pointer to last argument.
+ __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset));
+#endif
+
// ----------- S t a t e -------------
// -- r6: new target
// -- sp[0*kSystemPointerSize]: implicit receiver
@@ -262,9 +279,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ LoadP(r3, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
__ SmiUntag(r3);
- // Set up pointer to last argument.
- __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset));
-
Label enough_stack_space, stack_overflow;
Generate_StackOverflowCheck(masm, r3, r8, &stack_overflow);
__ b(&enough_stack_space);
@@ -279,30 +293,12 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ bind(&enough_stack_space);
// Copy arguments and receiver to the expression stack.
- Label loop, no_args;
- // ----------- S t a t e -------------
- // -- r3: number of arguments (untagged)
- // -- r6: new target
- // -- r7: pointer to last argument
- // -- cr0: condition indicating whether r3 is zero
- // -- sp[0*kSystemPointerSize]: implicit receiver
- // -- sp[1*kSystemPointerSize]: implicit receiver
- // -- sp[2*kSystemPointerSize]: padding
- // -- r4 and sp[3*kSystemPointerSize]: constructor function
- // -- sp[4*kSystemPointerSize]: number of arguments (tagged)
- // -- sp[5*kSystemPointerSize]: context
- // -----------------------------------
- __ cmpi(r3, Operand::Zero());
- __ beq(&no_args);
- __ ShiftLeftImm(r9, r3, Operand(kSystemPointerSizeLog2));
- __ sub(sp, sp, r9);
- __ mtctr(r3);
- __ bind(&loop);
- __ subi(r9, r9, Operand(kSystemPointerSize));
- __ LoadPX(r0, MemOperand(r7, r9));
- __ StorePX(r0, MemOperand(sp, r9));
- __ bdnz(&loop);
- __ bind(&no_args);
+ __ PushArray(r7, r3, r8, r0);
+
+#ifdef V8_REVERSE_JSARGS
+ // Push implicit receiver.
+ __ Push(r9);
+#endif
// Call the function.
{
@@ -439,10 +435,12 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ cmpl(sp, scratch);
__ blt(&stack_overflow);
+#ifndef V8_REVERSE_JSARGS
// Push receiver.
__ LoadTaggedPointerField(
scratch, FieldMemOperand(r4, JSGeneratorObject::kReceiverOffset));
__ Push(scratch);
+#endif
// ----------- S t a t e -------------
// -- r4 : the JSGeneratorObject to resume
@@ -461,6 +459,29 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
r5,
FieldMemOperand(r4, JSGeneratorObject::kParametersAndRegistersOffset));
{
+#ifdef V8_REVERSE_JSARGS
+ Label done_loop, loop;
+
+ __ mr(r9, r6);
+
+ __ bind(&loop);
+ __ subi(r9, r9, Operand(1));
+ __ cmpi(r9, Operand::Zero());
+ __ blt(&done_loop);
+ __ ShiftLeftImm(r10, r9, Operand(kTaggedSizeLog2));
+ __ add(scratch, r5, r10);
+ __ LoadAnyTaggedField(scratch,
+ FieldMemOperand(scratch, FixedArray::kHeaderSize));
+ __ Push(scratch);
+ __ b(&loop);
+
+ __ bind(&done_loop);
+
+ // Push receiver.
+ __ LoadAnyTaggedField(
+ scratch, FieldMemOperand(r4, JSGeneratorObject::kReceiverOffset));
+ __ Push(scratch);
+#else
Label loop, done_loop;
__ cmpi(r6, Operand::Zero());
__ ble(&done_loop);
@@ -477,6 +498,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ bdnz(&loop);
__ bind(&done_loop);
+#endif
}
// Underlying function needs to have bytecode available.
@@ -771,50 +793,60 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ Move(cp, context_address);
__ LoadP(cp, MemOperand(cp));
- // Push the function and the receiver onto the stack.
- __ Push(r5, r6);
+ // Push the function.
+ __ Push(r5);
// Check if we have enough stack space to push all arguments.
- // Clobbers r3 and r6.
- Generate_CheckStackOverflow(masm, r7, r3, r6);
+ __ addi(r3, r7, Operand(1));
+ Generate_CheckStackOverflow(masm, r3, r9, r0);
- // r4: new.target
- // r5: function
+ // Copy arguments to the stack in a loop.
+ // r4: function
// r7: argc
- // r8: argv
- // r0,r3,r6,r9, cp may be clobbered
+ // r8: argv, i.e. points to first arg
+#ifdef V8_REVERSE_JSARGS
+ Label loop, done;
+ __ cmpi(r7, Operand::Zero());
+ __ beq(&done);
- // Setup new.target, argc and function.
- __ mr(r3, r7);
- __ mr(r6, r4);
- __ mr(r4, r5);
+ __ ShiftLeftImm(r9, r7, Operand(kSystemPointerSizeLog2));
+ __ add(r8, r8, r9); // point to last arg
- // r3: argc
- // r4: function
- // r6: new.target
- // r8: argv
+ __ mtctr(r7);
+ __ bind(&loop);
+ __ LoadPU(r9, MemOperand(r8, -kSystemPointerSize)); // read next parameter
+ __ LoadP(r0, MemOperand(r9)); // dereference handle
+ __ push(r0); // push parameter
+ __ bdnz(&loop);
+ __ bind(&done);
- // Copy arguments to the stack in a loop.
- // r4: function
- // r3: argc
- // r8: argv, i.e. points to first arg
- Label loop, entry;
- __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2));
- __ add(r5, r8, r0);
- // r5 points past last arg.
- __ b(&entry);
+ // Push the receiver.
+ __ Push(r6);
+
+#else
+ // Push the receiver.
+ __ Push(r6);
+
+ Label loop, done;
+ __ cmpi(r7, Operand::Zero());
+ __ beq(&done);
+
+ __ mtctr(r7);
+ __ subi(r8, r8, Operand(kSystemPointerSize));
__ bind(&loop);
- __ LoadP(r9, MemOperand(r8)); // read next parameter
- __ addi(r8, r8, Operand(kSystemPointerSize));
+ __ LoadPU(r9, MemOperand(r8, kSystemPointerSize)); // read next parameter
__ LoadP(r0, MemOperand(r9)); // dereference handle
__ push(r0); // push parameter
- __ bind(&entry);
- __ cmp(r8, r5);
- __ bne(&loop);
+ __ bdnz(&loop);
+ __ bind(&done);
+#endif
// r3: argc
// r4: function
// r6: new.target
+ __ mr(r3, r7);
+ __ mr(r6, r4);
+ __ mr(r4, r5);
// Initialize all JavaScript callee-saved registers, since they will be seen
// by the garbage collector as part of handlers.
@@ -902,6 +934,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch) {
// ----------- S t a t e -------------
+ // -- r3 : actual argument count
// -- r6 : new target (preserved for callee if needed, and caller)
// -- r4 : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -938,6 +971,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- r3 : actual argument count
// -- r6 : new target (preserved for callee if needed, and caller)
// -- r4 : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -1050,10 +1084,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
}
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o r3: actual argument count (not including the receiver)
// o r4: the JS function object being called.
// o r6: the incoming new target or generator object
// o cp: our context
@@ -1071,17 +1105,17 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
__ LoadTaggedPointerField(
- r3, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ r7, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
// Load original bytecode array or the debug copy.
__ LoadTaggedPointerField(
kInterpreterBytecodeArrayRegister,
- FieldMemOperand(r3, SharedFunctionInfo::kFunctionDataOffset));
- GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r7);
+ FieldMemOperand(r7, SharedFunctionInfo::kFunctionDataOffset));
+ GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, ip);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ CompareObjectType(kInterpreterBytecodeArrayRegister, r3, no_reg,
+ __ CompareObjectType(kInterpreterBytecodeArrayRegister, r7, no_reg,
BYTECODE_ARRAY_TYPE);
__ bne(&compile_lazy);
@@ -1154,8 +1188,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
Operand(BytecodeArray::kHeaderSize - kHeapObjectTag));
// Push bytecode array and Smi tagged bytecode array offset.
- __ SmiTag(r3, kInterpreterBytecodeOffsetRegister);
- __ Push(kInterpreterBytecodeArrayRegister, r3);
+ __ SmiTag(r7, kInterpreterBytecodeOffsetRegister);
+ __ Push(kInterpreterBytecodeArrayRegister, r7);
// Allocate the local and temporary register file on the stack.
Label stack_overflow;
@@ -1295,18 +1329,19 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
}
static void Generate_InterpreterPushArgs(MacroAssembler* masm,
- Register num_args, Register index,
- Register count, Register scratch) {
- Label loop, skip;
- __ cmpi(count, Operand::Zero());
- __ beq(&skip);
- __ addi(index, index, Operand(kSystemPointerSize)); // Bias up for LoadPU
- __ mtctr(count);
- __ bind(&loop);
- __ LoadPU(scratch, MemOperand(index, -kSystemPointerSize));
- __ push(scratch);
- __ bdnz(&loop);
- __ bind(&skip);
+ Register num_args,
+ Register start_address,
+ Register scratch) {
+ __ subi(scratch, num_args, Operand(1));
+ __ ShiftLeftImm(scratch, scratch, Operand(kSystemPointerSizeLog2));
+ __ sub(start_address, start_address, scratch);
+ // Push the arguments.
+#ifdef V8_REVERSE_JSARGS
+ __ PushArray(start_address, num_args, scratch, r0,
+ TurboAssembler::PushArrayOrder::kReverse);
+#else
+ __ PushArray(start_address, num_args, scratch, r0);
+#endif
}
// static
@@ -1323,11 +1358,38 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
// -----------------------------------
Label stack_overflow;
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ subi(r3, r3, Operand(1));
+ }
+#endif
+
// Calculate number of arguments (add one for receiver).
__ addi(r6, r3, Operand(1));
Generate_StackOverflowCheck(masm, r6, ip, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ // Don't copy receiver. Argument count is correct.
+ __ mr(r6, r3);
+ }
+
+ // Push the arguments.
+ Generate_InterpreterPushArgs(masm, r6, r5, r7);
+
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ __ PushRoot(RootIndex::kUndefinedValue);
+ }
+
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register r3.
+ // r2 already points to the penultimate argument, the spread
+ // lies in the next interpreter register.
+ __ LoadP(r5, MemOperand(r5, -kSystemPointerSize));
+ }
+#else
// Push "undefined" as the receiver arg if we need to.
if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
__ PushRoot(RootIndex::kUndefinedValue);
@@ -1335,12 +1397,13 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
}
// Push the arguments. r5, r6, r7 will be modified.
- Generate_InterpreterPushArgs(masm, r6, r5, r6, r7);
+ Generate_InterpreterPushArgs(masm, r6, r5, r7);
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
__ Pop(r5); // Pass the spread in a register
__ subi(r3, r3, Operand(1)); // Subtract one for spread
}
+#endif
// Call the target.
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
@@ -1370,25 +1433,48 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
// -- r7 : address of the first argument
// -----------------------------------
Label stack_overflow;
+ __ addi(r8, r3, Operand(1));
+ Generate_StackOverflowCheck(masm, r8, ip, &stack_overflow);
+
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ subi(r3, r3, Operand(1));
+ }
+
+ // Push the arguments.
+ Generate_InterpreterPushArgs(masm, r3, r7, r8);
+
+ // Push a slot for the receiver to be constructed.
+ __ li(r0, Operand::Zero());
+ __ push(r0);
+
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register r2.
+ // r4 already points to the penultimate argument, the spread
+ // lies in the next interpreter register.
+ __ subi(r7, r7, Operand(kSystemPointerSize));
+ __ LoadP(r5, MemOperand(r7));
+ } else {
+ __ AssertUndefinedOrAllocationSite(r5, r8);
+ }
+#else
// Push a slot for the receiver to be constructed.
__ li(r0, Operand::Zero());
__ push(r0);
// Push the arguments (skip if none).
- Label skip;
- __ cmpi(r3, Operand::Zero());
- __ beq(&skip);
- Generate_StackOverflowCheck(masm, r3, ip, &stack_overflow);
- // Push the arguments. r8, r7, r9 will be modified.
- Generate_InterpreterPushArgs(masm, r3, r7, r3, r9);
- __ bind(&skip);
+ Generate_InterpreterPushArgs(masm, r3, r7, r8);
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
__ Pop(r5); // Pass the spread in a register
__ subi(r3, r3, Operand(1)); // Subtract one for spread
} else {
__ AssertUndefinedOrAllocationSite(r5, r8);
}
+
+#endif
+
if (mode == InterpreterPushArgsMode::kArrayFunction) {
__ AssertFunction(r4);
@@ -1554,7 +1640,21 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
bool with_result) {
const RegisterConfiguration* config(RegisterConfiguration::Default());
int allocatable_register_count = config->num_allocatable_general_registers();
+ Register scratch = ip;
if (with_result) {
+#ifdef V8_REVERSE_JSARGS
+ if (java_script_builtin) {
+ __ mr(scratch, r3);
+ } else {
+ // Overwrite the hole inserted by the deoptimizer with the return value
+ // from the LAZY deopt point.
+ __ StoreP(
+ r3, MemOperand(
+ sp, config->num_allocatable_general_registers() *
+ kSystemPointerSize +
+ BuiltinContinuationFrameConstants::kFixedFrameSize));
+ }
+#else
// Overwrite the hole inserted by the deoptimizer with the return value from
// the LAZY deopt point.
__ StoreP(
@@ -1562,6 +1662,8 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
MemOperand(sp, config->num_allocatable_general_registers() *
kSystemPointerSize +
BuiltinContinuationFrameConstants::kFixedFrameSize));
+ USE(scratch);
+#endif
}
for (int i = allocatable_register_count - 1; i >= 0; --i) {
int code = config->GetAllocatableGeneralCode(i);
@@ -1570,6 +1672,20 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
__ SmiUntag(Register::from_code(code));
}
}
+#ifdef V8_REVERSE_JSARGS
+ if (java_script_builtin && with_result) {
+ // Overwrite the hole inserted by the deoptimizer with the return value from
+ // the LAZY deopt point. r0 contains the arguments count, the return value
+ // from LAZY is always the last argument.
+ __ addi(r3, r3,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2));
+ __ StorePX(scratch, MemOperand(sp, r0));
+ // Recover arguments count.
+ __ subi(r3, r3,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ }
+#endif
__ LoadP(
fp,
MemOperand(sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp));
@@ -1676,23 +1792,42 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// arguments from the stack (including the receiver), and push thisArg (if
// present) instead.
{
- Label skip;
- Register arg_size = r8;
- Register new_sp = r6;
- Register scratch = r7;
- __ ShiftLeftImm(arg_size, r3, Operand(kSystemPointerSizeLog2));
- __ add(new_sp, sp, arg_size);
- __ LoadRoot(scratch, RootIndex::kUndefinedValue);
- __ mr(r5, scratch);
- __ LoadP(r4, MemOperand(new_sp, 0)); // receiver
- __ cmpi(arg_size, Operand(kSystemPointerSize));
- __ blt(&skip);
- __ LoadP(scratch, MemOperand(new_sp, 1 * -kSystemPointerSize)); // thisArg
- __ beq(&skip);
- __ LoadP(r5, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argArray
- __ bind(&skip);
- __ mr(sp, new_sp);
- __ StoreP(scratch, MemOperand(sp, 0));
+ __ LoadRoot(r8, RootIndex::kUndefinedValue);
+ __ mr(r5, r8);
+
+#ifdef V8_REVERSE_JSARGS
+ Label done;
+
+ __ LoadP(r4, MemOperand(sp)); // receiver
+ __ cmpi(r3, Operand(1));
+ __ blt(&done);
+ __ LoadP(r8, MemOperand(sp, kSystemPointerSize)); // thisArg
+ __ cmpi(r3, Operand(2));
+ __ blt(&done);
+ __ LoadP(r5, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+
+ __ bind(&done);
+#else
+ Label done;
+ __ ShiftLeftImm(r4, r3, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r4, MemOperand(sp, r4)); // receiver
+
+ __ li(r0, Operand(1));
+ __ sub(r7, r3, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r8, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r8, MemOperand(sp, r8));
+
+ __ sub(r7, r7, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r5, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r5, MemOperand(sp, r5));
+
+ __ bind(&done);
+#endif
+ __ ShiftLeftImm(ip, r3, Operand(kSystemPointerSizeLog2));
+ __ add(sp, sp, ip);
+ __ StoreP(r8, MemOperand(sp));
}
// ----------- S t a t e -------------
@@ -1725,6 +1860,24 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// static
void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
+#ifdef V8_REVERSE_JSARGS
+ // 1. Get the callable to call (passed as receiver) from the stack.
+ __ Pop(r4);
+
+ // 2. Make sure we have at least one argument.
+ // r3: actual number of arguments
+ {
+ Label done;
+ __ cmpi(r3, Operand::Zero());
+ __ bne(&done);
+ __ PushRoot(RootIndex::kUndefinedValue);
+ __ addi(r3, r3, Operand(1));
+ __ bind(&done);
+ }
+
+ // 3. Adjust the actual number of arguments.
+ __ subi(r3, r3, Operand(1));
+#else
// 1. Make sure we have at least one argument.
// r3: actual number of arguments
{
@@ -1738,8 +1891,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
// 2. Get the callable to call (passed as receiver) from the stack.
// r3: actual number of arguments
- __ ShiftLeftImm(r5, r3, Operand(kSystemPointerSizeLog2));
- __ LoadPX(r4, MemOperand(sp, r5));
+ __ LoadReceiver(r4, r3);
// 3. Shift arguments and return address one slot down on the stack
// (overwriting the original receiver). Adjust argument count to make
@@ -1750,6 +1902,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
Register scratch = r6;
Label loop;
// Calculate the copy start address (destination). Copy end address is sp.
+ __ ShiftLeftImm(r5, r3, Operand(kSystemPointerSizeLog2));
__ add(r5, sp, r5);
__ mtctr(r3);
@@ -1763,6 +1916,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
__ subi(r3, r3, Operand(1));
__ pop();
}
+#endif
// 4. Call the callable.
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
@@ -1781,27 +1935,47 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
// remove all arguments from the stack (including the receiver), and push
// thisArgument (if present) instead.
{
- Label skip;
- Register arg_size = r8;
- Register new_sp = r6;
- Register scratch = r7;
- __ ShiftLeftImm(arg_size, r3, Operand(kSystemPointerSizeLog2));
- __ add(new_sp, sp, arg_size);
__ LoadRoot(r4, RootIndex::kUndefinedValue);
- __ mr(scratch, r4);
+ __ mr(r8, r4);
__ mr(r5, r4);
- __ cmpi(arg_size, Operand(kSystemPointerSize));
- __ blt(&skip);
- __ LoadP(r4, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target
- __ beq(&skip);
- __ LoadP(scratch,
- MemOperand(new_sp, 2 * -kSystemPointerSize)); // thisArgument
- __ cmpi(arg_size, Operand(2 * kSystemPointerSize));
- __ beq(&skip);
- __ LoadP(r5, MemOperand(new_sp, 3 * -kSystemPointerSize)); // argumentsList
- __ bind(&skip);
- __ mr(sp, new_sp);
- __ StoreP(scratch, MemOperand(sp, 0));
+
+#ifdef V8_REVERSE_JSARGS
+ Label done;
+
+ __ cmpi(r3, Operand(1));
+ __ blt(&done);
+ __ LoadP(r4, MemOperand(sp, kSystemPointerSize)); // thisArg
+ __ cmpi(r3, Operand(2));
+ __ blt(&done);
+ __ LoadP(r8, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+ __ cmpi(r3, Operand(3));
+ __ blt(&done);
+ __ LoadP(r5, MemOperand(sp, 3 * kSystemPointerSize)); // argArray
+
+ __ bind(&done);
+#else
+ Label done;
+ __ li(r0, Operand(1));
+ __ sub(r7, r3, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r4, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r4, MemOperand(sp, r4)); // receiver
+
+ __ sub(r7, r7, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r8, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r8, MemOperand(sp, r8));
+
+ __ sub(r7, r7, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r5, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r5, MemOperand(sp, r5));
+
+ __ bind(&done);
+#endif
+ __ ShiftLeftImm(ip, r3, Operand(kSystemPointerSizeLog2));
+ __ add(sp, sp, ip);
+ __ StoreP(r8, MemOperand(sp));
}
// ----------- S t a t e -------------
@@ -1827,32 +2001,59 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
// -- sp[8] : target
// -- sp[12] : receiver
// -----------------------------------
+ // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS
// 1. Load target into r4 (if present), argumentsList into r5 (if present),
// new.target into r6 (if present, otherwise use target), remove all
// arguments from the stack (including the receiver), and push thisArgument
// (if present) instead.
{
- Label skip;
- Register arg_size = r8;
- Register new_sp = r7;
- __ ShiftLeftImm(arg_size, r3, Operand(kSystemPointerSizeLog2));
- __ add(new_sp, sp, arg_size);
__ LoadRoot(r4, RootIndex::kUndefinedValue);
__ mr(r5, r4);
+
+#ifdef V8_REVERSE_JSARGS
+ Label done;
+
+ __ mr(r7, r4);
+ __ cmpi(r3, Operand(1));
+ __ blt(&done);
+ __ LoadP(r4, MemOperand(sp, kSystemPointerSize)); // thisArg
__ mr(r6, r4);
- __ StoreP(r4, MemOperand(new_sp, 0)); // receiver (undefined)
- __ cmpi(arg_size, Operand(kSystemPointerSize));
- __ blt(&skip);
- __ LoadP(r4, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target
- __ mr(r6, r4); // new.target defaults to target
- __ beq(&skip);
- __ LoadP(r5, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argumentsList
- __ cmpi(arg_size, Operand(2 * kSystemPointerSize));
- __ beq(&skip);
- __ LoadP(r6, MemOperand(new_sp, 3 * -kSystemPointerSize)); // new.target
- __ bind(&skip);
- __ mr(sp, new_sp);
+ __ cmpi(r3, Operand(2));
+ __ blt(&done);
+ __ LoadP(r5, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+ __ cmpi(r3, Operand(3));
+ __ blt(&done);
+ __ LoadP(r6, MemOperand(sp, 3 * kSystemPointerSize)); // argArray
+ __ bind(&done);
+ __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2));
+ __ add(sp, sp, r0);
+ __ StoreP(r7, MemOperand(sp));
+#else
+ Label done;
+ __ ShiftLeftImm(ip, r3, Operand(kSystemPointerSizeLog2));
+ __ StorePX(r5, MemOperand(sp, ip));
+ __ li(r0, Operand(1));
+ __ sub(r7, r3, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r4, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r4, MemOperand(sp, r4)); // receiver
+
+ __ mr(r6, r4);
+ __ sub(r7, r7, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r5, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r5, MemOperand(sp, r5));
+
+ __ sub(r7, r7, r0, LeaveOE, SetRC);
+ __ blt(&done, cr0);
+ __ ShiftLeftImm(r6, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r6, MemOperand(sp, r6));
+
+ __ bind(&done);
+ __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2));
+ __ add(sp, sp, r0);
+#endif
}
// ----------- S t a t e -------------
@@ -1941,6 +2142,27 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
Label stack_overflow;
Generate_StackOverflowCheck(masm, r7, scratch, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy;
+ Register src = r9, dest = r8;
+ __ addi(src, sp, Operand(-kSystemPointerSize));
+ __ ShiftLeftImm(r0, r7, Operand(kSystemPointerSizeLog2));
+ __ sub(sp, sp, r0);
+ // Update stack pointer.
+ __ addi(dest, sp, Operand(-kSystemPointerSize));
+ __ addi(r0, r3, Operand(1));
+ __ mtctr(r0);
+
+ __ bind(&copy);
+ __ LoadPU(r0, MemOperand(src, kSystemPointerSize));
+ __ StorePU(r0, MemOperand(dest, kSystemPointerSize));
+ __ bdnz(&copy);
+ }
+#endif
+
// Push arguments onto the stack (thisArgument is already on the stack).
{
Label loop, no_args, skip;
@@ -1956,7 +2178,11 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
__ bne(&skip);
__ LoadRoot(scratch, RootIndex::kUndefinedValue);
__ bind(&skip);
+#ifdef V8_REVERSE_JSARGS
+ __ StorePU(scratch, MemOperand(r8, kSystemPointerSize));
+#else
__ push(scratch);
+#endif
__ bdnz(&loop);
__ bind(&no_args);
__ add(r3, r3, r7);
@@ -2027,24 +2253,70 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ bind(&arguments_done);
Label stack_done, stack_overflow;
- __ sub(r8, r8, r5);
- __ cmpi(r8, Operand::Zero());
- __ ble(&stack_done);
+ __ sub(r8, r8, r5, LeaveOE, SetRC);
+ __ ble(&stack_done, cr0);
{
+ // ----------- S t a t e -------------
+ // -- r3 : the number of arguments already in the stack (not including the
+ // receiver)
+ // -- r4 : the target to call (can be any Object)
+ // -- r5 : start index (to support rest parameters)
+ // -- r6 : the new.target (for [[Construct]] calls)
+ // -- r7 : point to the caller stack frame
+ // -- r8 : number of arguments to copy, i.e. arguments count - start index
+ // -----------------------------------
+
// Check for stack overflow.
- Generate_StackOverflowCheck(masm, r8, r5, &stack_overflow);
+ Generate_StackOverflowCheck(masm, r8, scratch, &stack_overflow);
// Forward the arguments from the caller frame.
+#ifdef V8_REVERSE_JSARGS
+ // Point to the first argument to copy (skipping the receiver).
+ __ addi(r7, r7,
+ Operand(CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ ShiftLeftImm(scratch, r5, Operand(kSystemPointerSizeLog2));
+ __ add(r7, r7, scratch);
+
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy;
+ Register src = ip, dest = r5; // r7 and r10 are context and root.
+ __ addi(src, sp, Operand(-kSystemPointerSize));
+ // Update stack pointer.
+ __ ShiftLeftImm(scratch, r8, Operand(kSystemPointerSizeLog2));
+ __ sub(sp, sp, scratch);
+ __ addi(dest, sp, Operand(-kSystemPointerSize));
+ __ addi(r0, r3, Operand(1));
+ __ mtctr(r0);
+
+ __ bind(&copy);
+ __ LoadPU(r0, MemOperand(src, kSystemPointerSize));
+ __ StorePU(r0, MemOperand(dest, kSystemPointerSize));
+ __ bdnz(&copy);
+ }
+#endif
+ // Copy arguments from the caller frame.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
{
Label loop;
- __ addi(r7, r7, Operand(kSystemPointerSize));
+#ifndef V8_REVERSE_JSARGS
+ __ addi(r7, r7, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp));
+#endif
__ add(r3, r3, r8);
+ __ addi(r5, r5, Operand(kSystemPointerSize));
__ bind(&loop);
{
- __ ShiftLeftImm(scratch, r8, Operand(kSystemPointerSizeLog2));
- __ LoadPX(scratch, MemOperand(r7, scratch));
- __ push(scratch);
__ subi(r8, r8, Operand(1));
+ __ ShiftLeftImm(scratch, r8, Operand(kSystemPointerSizeLog2));
+ __ LoadPX(r0, MemOperand(r7, scratch));
+#ifdef V8_REVERSE_JSARGS
+ __ StorePX(r0, MemOperand(r5, scratch));
+#else
+ __ push(r0);
+#endif
__ cmpi(r8, Operand::Zero());
__ bne(&loop);
}
@@ -2101,8 +2373,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
__ LoadGlobalProxy(r6);
} else {
Label convert_to_object, convert_receiver;
- __ ShiftLeftImm(r6, r3, Operand(kSystemPointerSizeLog2));
- __ LoadPX(r6, MemOperand(sp, r6));
+ __ LoadReceiver(r6, r3);
__ JumpIfSmi(r6, &convert_to_object);
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
__ CompareObjectType(r6, r7, r7, FIRST_JS_RECEIVER_TYPE);
@@ -2139,8 +2410,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
r5, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
__ bind(&convert_receiver);
}
- __ ShiftLeftImm(r7, r3, Operand(kSystemPointerSizeLog2));
- __ StorePX(r6, MemOperand(sp, r7));
+ __ StoreReceiver(r6, r3, r7);
}
__ bind(&done_convert);
@@ -2198,8 +2468,6 @@ void Generate_PushBoundArguments(MacroAssembler* masm) {
// (i.e. debug break and preemption) here, so check the "real stack
// limit".
{
- UseScratchRegisterScope temps(masm);
- Register scratch = temps.Acquire();
LoadStackLimit(masm, scratch, StackLimitKind::kRealStackLimit);
__ cmpl(r0, scratch);
}
@@ -2212,6 +2480,30 @@ void Generate_PushBoundArguments(MacroAssembler* masm) {
__ bind(&done);
}
+#ifdef V8_REVERSE_JSARGS
+ // Pop receiver.
+ __ Pop(r8);
+
+ // Push [[BoundArguments]].
+ {
+ Label loop, done;
+ __ add(r3, r3, r7); // Adjust effective number of arguments.
+ __ addi(r5, r5, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
+ __ mtctr(r7);
+
+ __ bind(&loop);
+ __ subi(r7, r7, Operand(1));
+ __ ShiftLeftImm(scratch, r7, Operand(kTaggedSizeLog2));
+ __ add(scratch, scratch, r5);
+ __ LoadAnyTaggedField(scratch, MemOperand(scratch));
+ __ Push(scratch);
+ __ bdnz(&loop);
+ __ bind(&done);
+ }
+
+ // Push receiver.
+ __ Push(r8);
+#else
__ mr(scratch, sp);
__ mr(sp, r0);
@@ -2248,6 +2540,7 @@ void Generate_PushBoundArguments(MacroAssembler* masm) {
__ bdnz(&loop);
__ add(r3, r3, r7);
}
+#endif
}
__ bind(&no_bound_arguments);
}
@@ -2265,8 +2558,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
// Patch the receiver to [[BoundThis]].
__ LoadAnyTaggedField(r6,
FieldMemOperand(r4, JSBoundFunction::kBoundThisOffset));
- __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2));
- __ StorePX(r6, MemOperand(sp, r0));
+ __ StoreReceiver(r6, r3, ip);
// Push the [[BoundArguments]] onto the stack.
Generate_PushBoundArguments(masm);
@@ -2307,8 +2599,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
// 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception).
// Overwrite the original receiver the (original) target.
- __ ShiftLeftImm(r8, r3, Operand(kSystemPointerSizeLog2));
- __ StorePX(r4, MemOperand(sp, r8));
+ __ StoreReceiver(r4, r3, r8);
// Let the "call_as_function_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, r4);
__ Jump(masm->isolate()->builtins()->CallFunction(
@@ -2423,8 +2714,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ bind(&non_proxy);
{
// Overwrite the original receiver with the (original) target.
- __ ShiftLeftImm(r8, r3, Operand(kSystemPointerSizeLog2));
- __ StorePX(r4, MemOperand(sp, r8));
+ __ StoreReceiver(r4, r3, r8);
// Let the "call_as_constructor_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, r4);
__ Jump(masm->isolate()->builtins()->CallFunction(),
@@ -2452,9 +2742,11 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
__ LoadTaggedPointerField(
r7, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
__ lwz(r7, FieldMemOperand(r7, SharedFunctionInfo::kFlagsOffset));
+#ifndef V8_REVERSE_JSARGS
__ TestBitMask(r7, SharedFunctionInfo::IsSafeToSkipArgumentsAdaptorBit::kMask,
r0);
__ bne(&skip_adapt_arguments, cr0);
+#endif
// -------------------------------------------
// Adapt arguments.
@@ -2475,8 +2767,13 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
// r4: function
// r5: expected number of arguments
// r6: new target (passed through to callee)
+#ifdef V8_REVERSE_JSARGS
+ __ ShiftLeftImm(r3, r5, Operand(kSystemPointerSizeLog2));
+ __ add(r3, r3, fp);
+#else
__ SmiToPtrArrayOffset(r3, r3);
__ add(r3, r3, fp);
+#endif
// adjust for return address and receiver
__ addi(r3, r3, Operand(2 * kSystemPointerSize));
__ ShiftLeftImm(r7, r5, Operand(kSystemPointerSizeLog2));
@@ -2506,6 +2803,52 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
EnterArgumentsAdaptorFrame(masm);
Generate_StackOverflowCheck(masm, r5, r8, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Fill the remaining expected arguments with undefined.
+ // r0: actual number of arguments as a smi
+ // r1: function
+ // r2: expected number of arguments
+ // r3: new target (passed through to callee)
+ __ LoadRoot(r8, RootIndex::kUndefinedValue);
+ __ SmiUntag(r0, r3);
+ __ sub(r9, r5, r0);
+ __ ShiftLeftImm(r7, r9, Operand(kSystemPointerSizeLog2));
+ __ sub(r7, fp, r7);
+ // Adjust for frame.
+ __ subi(r7, r7,
+ Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp +
+ kSystemPointerSize));
+
+ Label fill;
+ __ bind(&fill);
+ __ push(r8);
+ __ cmp(sp, r7);
+ __ b(ne, &fill);
+
+ // Calculate copy start address into r0 and copy end address is fp.
+ // r0: actual number of arguments as a smi
+ // r1: function
+ // r2: expected number of arguments
+ // r3: new target (passed through to callee)
+ __ SmiToPtrArrayOffset(r3, r3);
+ __ add(r3, r3, fp);
+
+ // Copy the arguments (including the receiver) to the new stack frame.
+ // r0: copy start address
+ // r1: function
+ // r2: expected number of arguments
+ // r3: new target (passed through to callee)
+ Label copy;
+ __ bind(&copy);
+
+ // Adjust load for return address and receiver.
+ __ LoadP(r8, MemOperand(r3, 2 * kSystemPointerSize));
+ __ push(r8);
+
+ __ cmp(r3, fp); // Compare before moving to next argument.
+ __ subi(r3, r3, Operand(kSystemPointerSize));
+ __ b(ne, &copy);
+#else
// Calculate copy start address into r0 and copy end address is fp.
// r3: actual number of arguments as a smi
// r4: function
@@ -2545,6 +2888,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
__ push(r0);
__ cmp(sp, r7);
__ bne(&fill);
+#endif
}
// Call the entry point.
@@ -3112,6 +3456,7 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
// -- sp[(argc - 1)* 4] : first argument
// -- sp[(argc + 0) * 4] : receiver
// -----------------------------------
+ // NOTE: The order of args are reversed if V8_REVERSE_JSARGS
Register api_function_address = r4;
Register argc = r5;
@@ -3186,10 +3531,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
// FunctionCallbackInfo::values_ (points at the first varargs argument passed
// on the stack).
+#ifdef V8_REVERSE_JSARGS
+ __ addi(scratch, scratch,
+ Operand((FCA::kArgsLength + 1) * kSystemPointerSize));
+#else
__ addi(scratch, scratch,
Operand((FCA::kArgsLength - 1) * kSystemPointerSize));
__ ShiftLeftImm(ip, argc, Operand(kSystemPointerSizeLog2));
__ add(scratch, scratch, ip);
+#endif
__ StoreP(scratch, MemOperand(sp, (kStackFrameExtraParamSlot + 2) *
kSystemPointerSize));
diff --git a/deps/v8/src/builtins/s390/builtins-s390.cc b/deps/v8/src/builtins/s390/builtins-s390.cc
index b0c1582544..3743df4ddb 100644
--- a/deps/v8/src/builtins/s390/builtins-s390.cc
+++ b/deps/v8/src/builtins/s390/builtins-s390.cc
@@ -38,20 +38,26 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- r2 : actual argument count
// -- r3 : target function (preserved for callee)
// -- r5 : new target (preserved for callee)
// -----------------------------------
{
FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
// Push function as parameter to the runtime call.
- __ Push(r3, r5, r3);
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
__ LoadRR(r4, r2);
- // Restore target function and new target.
- __ Pop(r3, r5);
+ // Restore target function, new target and actual argument count.
+ __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister,
+ kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == r4, "ABI mismatch");
__ JumpCodeObject(r4);
@@ -115,31 +121,24 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
__ SmiTag(r2);
__ Push(cp, r2);
__ SmiUntag(r2);
+
+#ifdef V8_REVERSE_JSARGS
+ // Set up pointer to last argument (skip receiver).
+ __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset +
+ kSystemPointerSize));
+ // Copy arguments and receiver to the expression stack.
+ __ PushArray(r6, r2, r1, r0);
+ // The receiver for the builtin/api call.
+ __ PushRoot(RootIndex::kTheHoleValue);
+#else
// The receiver for the builtin/api call.
__ PushRoot(RootIndex::kTheHoleValue);
// Set up pointer to last argument.
__ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset));
// Copy arguments and receiver to the expression stack.
- // r2: number of arguments
- // r3: constructor function
- // r4: address of last argument (caller sp)
- // r5: new target
- // cr0: condition indicating whether r2 is zero
- // sp[0]: receiver
- // sp[1]: receiver
- // sp[2]: number of arguments (smi-tagged)
- Label loop, no_args;
- __ beq(&no_args);
- __ ShiftLeftP(scratch, r2, Operand(kSystemPointerSizeLog2));
- __ SubP(sp, sp, scratch);
- __ LoadRR(r1, r2);
- __ bind(&loop);
- __ lay(scratch, MemOperand(scratch, -kSystemPointerSize));
- __ LoadP(r0, MemOperand(scratch, r6));
- __ StoreP(r0, MemOperand(scratch, sp));
- __ BranchOnCount(r1, &loop);
- __ bind(&no_args);
+ __ PushArray(r6, r2, r1, r0);
+#endif
// Call the function.
// r2: number of arguments
@@ -236,11 +235,30 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
// Restore new target.
__ Pop(r5);
+
+#ifdef V8_REVERSE_JSARGS
+ // Push the allocated receiver to the stack.
+ __ Push(r2);
+ // We need two copies because we may have to return the original one
+ // and the calling conventions dictate that the called function pops the
+ // receiver. The second copy is pushed after the arguments, we saved in r6
+ // since r0 needs to store the number of arguments before
+ // InvokingFunction.
+ __ LoadRR(r8, r2);
+
+ // Set up pointer to first argument (skip receiver).
+ __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset +
+ kSystemPointerSize));
+#else
// Push the allocated receiver to the stack. We need two copies
// because we may have to return the original one and the calling
// conventions dictate that the called function pops the receiver.
__ Push(r2, r2);
+ // Set up pointer to last argument.
+ __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset));
+#endif
+
// ----------- S t a t e -------------
// -- r5: new target
// -- sp[0*kSystemPointerSize]: implicit receiver
@@ -256,9 +274,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ LoadP(r2, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
__ SmiUntag(r2);
- // Set up pointer to last argument.
- __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset));
-
Label enough_stack_space, stack_overflow;
Generate_StackOverflowCheck(masm, r2, r7, &stack_overflow);
__ b(&enough_stack_space);
@@ -273,31 +288,12 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ bind(&enough_stack_space);
// Copy arguments and receiver to the expression stack.
- Label loop, no_args;
- // ----------- S t a t e -------------
- // -- r2: number of arguments (untagged)
- // -- r5: new target
- // -- r6: pointer to last argument
- // -- cr0: condition indicating whether r2 is zero
- // -- sp[0*kSystemPointerSize]: implicit receiver
- // -- sp[1*kSystemPointerSize]: implicit receiver
- // -- sp[2*kSystemPointerSize]: padding
- // -- r3 and sp[3*kSystemPointerSize]: constructor function
- // -- sp[4*kSystemPointerSize]: number of arguments (tagged)
- // -- sp[5*kSystemPointerSize]: context
- // -----------------------------------
+ __ PushArray(r6, r2, r1, r0);
- __ ltgr(r2, r2);
- __ beq(&no_args);
- __ ShiftLeftP(r8, r2, Operand(kSystemPointerSizeLog2));
- __ SubP(sp, sp, r8);
- __ LoadRR(r1, r2);
- __ bind(&loop);
- __ lay(r8, MemOperand(r8, -kSystemPointerSize));
- __ LoadP(r0, MemOperand(r8, r6));
- __ StoreP(r0, MemOperand(r8, sp));
- __ BranchOnCount(r1, &loop);
- __ bind(&no_args);
+#ifdef V8_REVERSE_JSARGS
+ // Push implicit receiver.
+ __ Push(r8);
+#endif
// Call the function.
__ InvokeFunctionWithNewTarget(r3, r5, r2, CALL_FUNCTION);
@@ -432,10 +428,12 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ CmpLogicalP(sp, scratch);
__ blt(&stack_overflow);
+#ifndef V8_REVERSE_JSARGS
// Push receiver.
__ LoadTaggedPointerField(
scratch, FieldMemOperand(r3, JSGeneratorObject::kReceiverOffset));
__ Push(scratch);
+#endif
// ----------- S t a t e -------------
// -- r3 : the JSGeneratorObject to resume
@@ -454,6 +452,27 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
r4,
FieldMemOperand(r3, JSGeneratorObject::kParametersAndRegistersOffset));
{
+#ifdef V8_REVERSE_JSARGS
+ Label done_loop, loop;
+ __ LoadRR(r8, r5);
+
+ __ bind(&loop);
+ __ SubP(r8, r8, Operand(1));
+ __ blt(&done_loop);
+ __ ShiftLeftP(r1, r8, Operand(kTaggedSizeLog2));
+ __ la(scratch, MemOperand(r4, r1));
+ __ LoadAnyTaggedField(scratch,
+ FieldMemOperand(scratch, FixedArray::kHeaderSize));
+ __ Push(scratch);
+ __ b(&loop);
+
+ __ bind(&done_loop);
+
+ // Push receiver.
+ __ LoadAnyTaggedField(
+ scratch, FieldMemOperand(r3, JSGeneratorObject::kReceiverOffset));
+ __ Push(scratch);
+#else
Label loop, done_loop;
__ ShiftLeftP(r1, r5, Operand(kSystemPointerSizeLog2));
__ SubP(sp, r1);
@@ -480,6 +499,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ BranchRelativeOnIdxHighP(r5, r1, &loop);
__ bind(&done_loop);
+#endif
}
// Underlying function needs to have bytecode available.
@@ -808,6 +828,17 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
// [fp + kPushedStackSpace + 20 * kSystemPointerSize]: argv
// r0,r2,r7-r9, cp may be clobbered
+ __ LoadRR(r2, r6);
+ // Load argv from the stack.
+ __ LoadP(
+ r6, MemOperand(fp, kPushedStackSpace + EntryFrameConstants::kArgvOffset));
+
+ // r2: argc
+ // r3: new.target
+ // r4: function
+ // r5: receiver
+ // r6: argv
+
// Enter an internal frame.
{
// FrameScope ends up calling MacroAssembler::EnterFrame here
@@ -819,34 +850,12 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
__ Move(cp, context_address);
__ LoadP(cp, MemOperand(cp));
- // Push the function and the receiver onto the stack.
- __ Push(r4, r5);
+ // Push the function
+ __ Push(r4);
// Check if we have enough stack space to push all arguments.
- // Clobbers r5 and r0.
- Generate_CheckStackOverflow(masm, r6, r5, r0);
-
- // r3: new.target
- // r4: function
- // r6: argc
- // [fp + kPushedStackSpace + 20 * kSystemPointerSize]: argv
- // r0,r2,r5,r7-r9, cp may be clobbered
-
- // Setup new.target, argc and function.
- __ LoadRR(r2, r6);
- __ LoadRR(r5, r3);
- __ LoadRR(r3, r4);
-
- // Load argv from the stack.
- __ LoadP(r6, MemOperand(fp));
- __ LoadP(r6, MemOperand(
- r6, kPushedStackSpace + EntryFrameConstants::kArgvOffset));
-
- // r2: argc
- // r3: function
- // r5: new.target
- // r6: argv
- // r0,r4,r7-r9, cp may be clobbered
+ __ AddP(r7, r2, Operand(1));
+ Generate_CheckStackOverflow(masm, r7, r1, r0);
// Copy arguments to the stack in a loop from argv to sp.
// The arguments are actually placed in reverse order on sp
@@ -858,22 +867,55 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
// r7: scratch reg to hold scaled argc
// r8: scratch reg to hold arg handle
// r9: scratch reg to hold index into argv
+
+#ifdef V8_REVERSE_JSARGS
Label argLoop, argExit;
- intptr_t zero = 0;
- __ ShiftLeftP(r7, r2, Operand(kSystemPointerSizeLog2));
- __ SubRR(sp, r7); // Buy the stack frame to fit args
- __ LoadImmP(r9, Operand(zero)); // Initialize argv index
+
+ __ ShiftLeftP(r9, r2, Operand(kSystemPointerSizeLog2));
+ __ lay(r9, MemOperand(r6, r9, -kSystemPointerSize)); // point to last arg
+
+ __ ltgr(r7, r2);
+
+ __ beq(&argExit, Label::kNear);
__ bind(&argLoop);
- __ CmpPH(r7, Operand(zero));
+
+ __ LoadP(r8, MemOperand(r9)); // read next parameter
+ __ LoadP(r0, MemOperand(r8)); // dereference handle
+ __ Push(r0);
+ __ lay(r9, MemOperand(r9, -kSystemPointerSize)); // r9++;
+ __ SubP(r7, r7, Operand(1));
+ __ bgt(&argLoop);
+
+ __ bind(&argExit);
+
+ // Push the receiver.
+ __ Push(r5);
+
+#else
+ // Push the receiver.
+ __ Push(r5);
+
+ Label argLoop, argExit;
+
+ __ LoadRR(r9, r6);
+ __ ltgr(r7, r2);
__ beq(&argExit, Label::kNear);
- __ lay(r7, MemOperand(r7, -kSystemPointerSize));
- __ LoadP(r8, MemOperand(r9, r6)); // read next parameter
- __ la(r9, MemOperand(r9, kSystemPointerSize)); // r9++;
+ __ bind(&argLoop);
+
+ __ LoadP(r8, MemOperand(r9)); // read next parameter
__ LoadP(r0, MemOperand(r8)); // dereference handle
- __ StoreP(r0, MemOperand(r7, sp)); // push parameter
- __ b(&argLoop);
+ __ Push(r0);
+ __ la(r9, MemOperand(r9, kSystemPointerSize)); // r9++;
+ // __ lay(r7, MemOperand(r7, -kSystemPointerSize));
+ __ SubP(r7, r7, Operand(1));
+ __ bgt(&argLoop);
+
__ bind(&argExit);
+#endif
+ // Setup new.target, argc and function.
+ __ LoadRR(r5, r3);
+ __ LoadRR(r3, r4);
// r2: argc
// r3: function
// r5: new.target
@@ -964,6 +1006,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch) {
// ----------- S t a t e -------------
+ // -- r2 : actual argument count
// -- r5 : new target (preserved for callee if needed, and caller)
// -- r3 : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -999,6 +1042,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- r2 : actual argument count
// -- r5 : new target (preserved for callee if needed, and caller)
// -- r3 : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -1112,10 +1156,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o r2: actual argument count (not including the receiver)
// o r3: the JS function object being called.
// o r5: the incoming new target or generator object
// o cp: our context
@@ -1133,17 +1177,17 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
__ LoadTaggedPointerField(
- r2, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ r6, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
// Load original bytecode array or the debug copy.
__ LoadTaggedPointerField(
kInterpreterBytecodeArrayRegister,
- FieldMemOperand(r2, SharedFunctionInfo::kFunctionDataOffset));
- GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r6);
+ FieldMemOperand(r6, SharedFunctionInfo::kFunctionDataOffset));
+ GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, ip);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ CompareObjectType(kInterpreterBytecodeArrayRegister, r2, no_reg,
+ __ CompareObjectType(kInterpreterBytecodeArrayRegister, r6, no_reg,
BYTECODE_ARRAY_TYPE);
__ bne(&compile_lazy);
@@ -1355,20 +1399,19 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
}
static void Generate_InterpreterPushArgs(MacroAssembler* masm,
- Register num_args, Register index,
- Register count, Register scratch) {
- Label loop, skip;
- __ CmpP(count, Operand::Zero());
- __ beq(&skip);
- __ AddP(index, index, Operand(kSystemPointerSize)); // Bias up for LoadPU
- __ LoadRR(r0, count);
- __ bind(&loop);
- __ LoadP(scratch, MemOperand(index, -kSystemPointerSize));
- __ lay(index, MemOperand(index, -kSystemPointerSize));
- __ push(scratch);
- __ SubP(r0, Operand(1));
- __ bne(&loop);
- __ bind(&skip);
+ Register num_args,
+ Register start_address,
+ Register scratch) {
+ __ SubP(scratch, num_args, Operand(1));
+ __ ShiftLeftP(scratch, scratch, Operand(kSystemPointerSizeLog2));
+ __ SubP(start_address, start_address, scratch);
+ // Push the arguments.
+#ifdef V8_REVERSE_JSARGS
+ __ PushArray(start_address, num_args, r1, scratch,
+ TurboAssembler::PushArrayOrder::kReverse);
+#else
+ __ PushArray(start_address, num_args, r1, scratch);
+#endif
}
// static
@@ -1385,10 +1428,37 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
// -----------------------------------
Label stack_overflow;
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ SubP(r2, r2, Operand(1));
+ }
+#endif
+
// Calculate number of arguments (AddP one for receiver).
__ AddP(r5, r2, Operand(1));
Generate_StackOverflowCheck(masm, r5, ip, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ // Don't copy receiver. Argument count is correct.
+ __ LoadRR(r5, r2);
+ }
+
+ // Push the arguments.
+ Generate_InterpreterPushArgs(masm, r5, r4, r6);
+
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
+ __ PushRoot(RootIndex::kUndefinedValue);
+ }
+
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register r2.
+ // r2 already points to the penultimate argument, the spread
+ // lies in the next interpreter register.
+ __ LoadP(r4, MemOperand(r4, -kSystemPointerSize));
+ }
+#else
// Push "undefined" as the receiver arg if we need to.
if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) {
__ PushRoot(RootIndex::kUndefinedValue);
@@ -1396,11 +1466,12 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl(
}
// Push the arguments.
- Generate_InterpreterPushArgs(masm, r5, r4, r5, r6);
+ Generate_InterpreterPushArgs(masm, r5, r4, r6);
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
__ Pop(r4); // Pass the spread in a register
__ SubP(r2, r2, Operand(1)); // Subtract one for spread
}
+#endif
// Call the target.
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
@@ -1430,18 +1501,38 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
// -- r6 : address of the first argument
// -----------------------------------
Label stack_overflow;
+ __ AddP(r7, r2, Operand(1));
+ Generate_StackOverflowCheck(masm, r7, ip, &stack_overflow);
+
+#ifdef V8_REVERSE_JSARGS
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // The spread argument should not be pushed.
+ __ SubP(r2, r2, Operand(1));
+ }
+
+ // Push the arguments. r4 and r5 will be modified.
+ Generate_InterpreterPushArgs(masm, r2, r6, r7);
// Push a slot for the receiver to be constructed.
+ __ mov(r0, Operand::Zero());
+ __ push(r0);
+
+ if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
+ // Pass the spread in the register r2.
+ // r4 already points to the penultimate argument, the spread
+ // lies in the next interpreter register.
+ __ lay(r6, MemOperand(r6, -kSystemPointerSize));
+ __ LoadP(r4, MemOperand(r6));
+ } else {
+ __ AssertUndefinedOrAllocationSite(r4, r7);
+ }
+#else
+ // Push a slot for the receiver to be constructed.
__ LoadImmP(r0, Operand::Zero());
__ push(r0);
// Push the arguments (skip if none).
- Label skip;
- __ CmpP(r2, Operand::Zero());
- __ beq(&skip);
- Generate_StackOverflowCheck(masm, r2, ip, &stack_overflow);
- Generate_InterpreterPushArgs(masm, r2, r6, r2, r7);
- __ bind(&skip);
+ Generate_InterpreterPushArgs(masm, r2, r6, r7);
if (mode == InterpreterPushArgsMode::kWithFinalSpread) {
__ Pop(r4); // Pass the spread in a register
@@ -1449,6 +1540,9 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl(
} else {
__ AssertUndefinedOrAllocationSite(r4, r7);
}
+
+#endif
+
if (mode == InterpreterPushArgsMode::kArrayFunction) {
__ AssertFunction(r3);
@@ -1611,7 +1705,21 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
bool with_result) {
const RegisterConfiguration* config(RegisterConfiguration::Default());
int allocatable_register_count = config->num_allocatable_general_registers();
+ Register scratch = ip;
if (with_result) {
+#ifdef V8_REVERSE_JSARGS
+ if (java_script_builtin) {
+ __ LoadRR(scratch, r2);
+ } else {
+ // Overwrite the hole inserted by the deoptimizer with the return value
+ // from the LAZY deopt point.
+ __ StoreP(
+ r2, MemOperand(
+ sp, config->num_allocatable_general_registers() *
+ kSystemPointerSize +
+ BuiltinContinuationFrameConstants::kFixedFrameSize));
+ }
+#else
// Overwrite the hole inserted by the deoptimizer with the return value from
// the LAZY deopt point.
__ StoreP(
@@ -1619,6 +1727,8 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
MemOperand(sp, config->num_allocatable_general_registers() *
kSystemPointerSize +
BuiltinContinuationFrameConstants::kFixedFrameSize));
+ USE(scratch);
+#endif
}
for (int i = allocatable_register_count - 1; i >= 0; --i) {
int code = config->GetAllocatableGeneralCode(i);
@@ -1627,6 +1737,20 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm,
__ SmiUntag(Register::from_code(code));
}
}
+#ifdef V8_REVERSE_JSARGS
+ if (java_script_builtin && with_result) {
+ // Overwrite the hole inserted by the deoptimizer with the return value from
+ // the LAZY deopt point. r0 contains the arguments count, the return value
+ // from LAZY is always the last argument.
+ __ AddP(r2, r2,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ StoreP(scratch, MemOperand(sp, r1));
+ // Recover arguments count.
+ __ SubP(r2, r2,
+ Operand(BuiltinContinuationFrameConstants::kFixedSlotCount));
+ }
+#endif
__ LoadP(
fp,
MemOperand(sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp));
@@ -1725,23 +1849,41 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// arguments from the stack (including the receiver), and push thisArg (if
// present) instead.
{
- Label skip;
- Register arg_size = r7;
- Register new_sp = r5;
- Register scratch = r6;
- __ ShiftLeftP(arg_size, r2, Operand(kSystemPointerSizeLog2));
- __ AddP(new_sp, sp, arg_size);
- __ LoadRoot(scratch, RootIndex::kUndefinedValue);
- __ LoadRR(r4, scratch);
- __ LoadP(r3, MemOperand(new_sp, 0)); // receiver
- __ CmpP(arg_size, Operand(kSystemPointerSize));
- __ blt(&skip);
- __ LoadP(scratch, MemOperand(new_sp, 1 * -kSystemPointerSize)); // thisArg
- __ beq(&skip);
- __ LoadP(r4, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argArray
- __ bind(&skip);
- __ LoadRR(sp, new_sp);
- __ StoreP(scratch, MemOperand(sp, 0));
+ __ LoadRoot(r7, RootIndex::kUndefinedValue);
+ __ LoadRR(r4, r7);
+
+#ifdef V8_REVERSE_JSARGS
+ Label done;
+
+ __ LoadP(r3, MemOperand(sp)); // receiver
+ __ cghi(r2, Operand(1));
+ __ blt(&done);
+ __ LoadP(r7, MemOperand(sp, kSystemPointerSize)); // thisArg
+ __ cghi(r2, Operand(2));
+ __ blt(&done);
+ __ LoadP(r4, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+
+ __ bind(&done);
+#else
+ Label done;
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r3, MemOperand(sp, r1)); // receiver
+
+ __ SubP(r6, r2, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r7, MemOperand(sp, r1));
+
+ __ SubP(r6, r6, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r4, MemOperand(sp, r1));
+
+ __ bind(&done);
+#endif
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ lay(sp, MemOperand(sp, r1));
+ __ StoreP(r7, MemOperand(sp));
}
// ----------- S t a t e -------------
@@ -1774,6 +1916,24 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
// static
void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
+#ifdef V8_REVERSE_JSARGS
+ // 1. Get the callable to call (passed as receiver) from the stack.
+ __ Pop(r3);
+
+ // 2. Make sure we have at least one argument.
+ // r2: actual number of arguments
+ {
+ Label done;
+ __ cghi(r2, Operand::Zero());
+ __ b(ne, &done);
+ __ PushRoot(RootIndex::kUndefinedValue);
+ __ AddP(r2, r2, Operand(1));
+ __ bind(&done);
+ }
+
+ // 3. Adjust the actual number of arguments.
+ __ SubP(r2, r2, Operand(1));
+#else
// 1. Make sure we have at least one argument.
// r2: actual number of arguments
{
@@ -1787,8 +1947,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
// r2: actual number of arguments
// 2. Get the callable to call (passed as receiver) from the stack.
- __ ShiftLeftP(r4, r2, Operand(kSystemPointerSizeLog2));
- __ LoadP(r3, MemOperand(sp, r4));
+ __ LoadReceiver(r3, r2);
// 3. Shift arguments and return address one slot down on the stack
// (overwriting the original receiver). Adjust argument count to make
@@ -1799,7 +1958,8 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
Register scratch = r5;
Label loop;
// Calculate the copy start address (destination). Copy end address is sp.
- __ AddP(r4, sp, r4);
+ __ ShiftLeftP(r4, r2, Operand(kSystemPointerSizeLog2));
+ __ lay(r4, MemOperand(sp, r4));
__ bind(&loop);
__ LoadP(scratch, MemOperand(r4, -kSystemPointerSize));
@@ -1812,6 +1972,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
__ SubP(r2, Operand(1));
__ pop();
}
+#endif
// 4. Call the callable.
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
@@ -1830,27 +1991,46 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
// remove all arguments from the stack (including the receiver), and push
// thisArgument (if present) instead.
{
- Label skip;
- Register arg_size = r7;
- Register new_sp = r5;
- Register scratch = r6;
- __ ShiftLeftP(arg_size, r2, Operand(kSystemPointerSizeLog2));
- __ AddP(new_sp, sp, arg_size);
__ LoadRoot(r3, RootIndex::kUndefinedValue);
- __ LoadRR(scratch, r3);
+ __ LoadRR(r7, r3);
__ LoadRR(r4, r3);
- __ CmpP(arg_size, Operand(kSystemPointerSize));
- __ blt(&skip);
- __ LoadP(r3, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target
- __ beq(&skip);
- __ LoadP(scratch,
- MemOperand(new_sp, 2 * -kSystemPointerSize)); // thisArgument
- __ CmpP(arg_size, Operand(2 * kSystemPointerSize));
- __ beq(&skip);
- __ LoadP(r4, MemOperand(new_sp, 3 * -kSystemPointerSize)); // argumentsList
- __ bind(&skip);
- __ LoadRR(sp, new_sp);
- __ StoreP(scratch, MemOperand(sp, 0));
+
+#ifdef V8_REVERSE_JSARGS
+ Label done;
+
+ __ cghi(r2, Operand(1));
+ __ blt(&done);
+ __ LoadP(r3, MemOperand(sp, kSystemPointerSize)); // thisArg
+ __ cghi(r2, Operand(2));
+ __ blt(&done);
+ __ LoadP(r7, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+ __ cghi(r2, Operand(3));
+ __ blt(&done);
+ __ LoadP(r4, MemOperand(sp, 3 * kSystemPointerSize)); // argArray
+
+ __ bind(&done);
+#else
+ Label done;
+ __ SubP(r6, r2, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r3, MemOperand(sp, r1)); // receiver
+
+ __ SubP(r6, r6, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r7, MemOperand(sp, r1));
+
+ __ SubP(r6, r6, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r4, MemOperand(sp, r1));
+
+ __ bind(&done);
+#endif
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ lay(sp, MemOperand(sp, r1));
+ __ StoreP(r7, MemOperand(sp));
}
// ----------- S t a t e -------------
@@ -1876,32 +2056,58 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
// -- sp[8] : target
// -- sp[12] : receiver
// -----------------------------------
+ // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS
// 1. Load target into r3 (if present), argumentsList into r4 (if present),
// new.target into r5 (if present, otherwise use target), remove all
// arguments from the stack (including the receiver), and push thisArgument
// (if present) instead.
{
- Label skip;
- Register arg_size = r7;
- Register new_sp = r6;
- __ ShiftLeftP(arg_size, r2, Operand(kSystemPointerSizeLog2));
- __ AddP(new_sp, sp, arg_size);
__ LoadRoot(r3, RootIndex::kUndefinedValue);
__ LoadRR(r4, r3);
+
+#ifdef V8_REVERSE_JSARGS
+ Label done;
+
+ __ LoadRR(r6, r3);
+ __ cghi(r2, Operand(1));
+ __ blt(&done);
+ __ LoadP(r3, MemOperand(sp, kSystemPointerSize)); // thisArg
__ LoadRR(r5, r3);
- __ StoreP(r3, MemOperand(new_sp, 0)); // receiver (undefined)
- __ CmpP(arg_size, Operand(kSystemPointerSize));
- __ blt(&skip);
- __ LoadP(r3, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target
- __ LoadRR(r5, r3); // new.target defaults to target
- __ beq(&skip);
- __ LoadP(r4, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argumentsList
- __ CmpP(arg_size, Operand(2 * kSystemPointerSize));
- __ beq(&skip);
- __ LoadP(r5, MemOperand(new_sp, 3 * -kSystemPointerSize)); // new.target
- __ bind(&skip);
- __ LoadRR(sp, new_sp);
+ __ cghi(r2, Operand(2));
+ __ blt(&done);
+ __ LoadP(r4, MemOperand(sp, 2 * kSystemPointerSize)); // argArray
+ __ cghi(r2, Operand(3));
+ __ blt(&done);
+ __ LoadP(r5, MemOperand(sp, 3 * kSystemPointerSize)); // argArray
+ __ bind(&done);
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ lay(sp, MemOperand(sp, r1));
+ __ StoreP(r6, MemOperand(sp));
+#else
+ Label done;
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ StoreP(r4, MemOperand(sp, r1));
+ __ SubP(r6, r2, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r3, MemOperand(sp, r1)); // receiver
+
+ __ LoadRR(r5, r3);
+ __ SubP(r6, r6, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r4, MemOperand(sp, r1));
+
+ __ SubP(r6, r6, Operand(1));
+ __ blt(&done);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ LoadP(r5, MemOperand(sp, r1));
+
+ __ bind(&done);
+ __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
+ __ lay(sp, MemOperand(sp, r1));
+#endif
}
// ----------- S t a t e -------------
@@ -2000,6 +2206,30 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
Label stack_overflow;
Generate_StackOverflowCheck(masm, r6, scratch, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy, check;
+ Register num = ip, src = r8, dest = r7;
+ __ LoadRR(src, sp);
+ __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2));
+ __ SubP(sp, sp, r1);
+ // Update stack pointer.
+ __ LoadRR(dest, sp);
+ __ ltgr(num, r2);
+ __ b(&check);
+ __ bind(&copy);
+ __ LoadP(r0, MemOperand(src));
+ __ lay(src, MemOperand(src, kSystemPointerSize));
+ __ StoreP(r0, MemOperand(dest));
+ __ lay(dest, MemOperand(dest, kSystemPointerSize));
+ __ SubP(num, num, Operand(1));
+ __ bind(&check);
+ __ b(ge, &copy);
+ }
+#endif
+
// Push arguments onto the stack (thisArgument is already on the stack).
{
Label loop, no_args, skip;
@@ -2015,7 +2245,12 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
__ bne(&skip, Label::kNear);
__ LoadRoot(scratch, RootIndex::kUndefinedValue);
__ bind(&skip);
- __ push(scratch);
+#ifdef V8_REVERSE_JSARGS
+ __ StoreP(scratch, MemOperand(r7));
+ __ lay(r7, MemOperand(r7, kSystemPointerSize));
+#else
+ __ Push(scratch);
+#endif
__ BranchOnCount(r1, &loop);
__ bind(&no_args);
__ AddP(r2, r2, r6);
@@ -2087,23 +2322,73 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Label stack_done, stack_overflow;
__ SubP(r7, r7, r4);
- __ CmpP(r7, Operand::Zero());
__ ble(&stack_done);
{
+ // ----------- S t a t e -------------
+ // -- r2 : the number of arguments already in the stack (not including the
+ // receiver)
+ // -- r3 : the target to call (can be any Object)
+ // -- r4 : start index (to support rest parameters)
+ // -- r5 : the new.target (for [[Construct]] calls)
+ // -- r6 : point to the caller stack frame
+ // -- r7 : number of arguments to copy, i.e. arguments count - start index
+ // -----------------------------------
+
// Check for stack overflow.
- Generate_StackOverflowCheck(masm, r7, r4, &stack_overflow);
+ Generate_StackOverflowCheck(masm, r7, scratch, &stack_overflow);
// Forward the arguments from the caller frame.
+#ifdef V8_REVERSE_JSARGS
+ __ LoadRR(r5, r5);
+ // Point to the first argument to copy (skipping the receiver).
+ __ AddP(r6, r6,
+ Operand(CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ ShiftLeftP(scratch, r4, Operand(kSystemPointerSizeLog2));
+ __ AddP(r6, r6, scratch);
+
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy, check;
+ Register num = r1, src = ip,
+ dest = r4; // r7 and r10 are context and root.
+ __ LoadRR(src, sp);
+ // Update stack pointer.
+ __ ShiftLeftP(scratch, r7, Operand(kSystemPointerSizeLog2));
+ __ SubP(sp, sp, scratch);
+ __ LoadRR(dest, sp);
+ __ ltgr(num, r2);
+ __ b(&check);
+ __ bind(&copy);
+ __ LoadP(r0, MemOperand(src));
+ __ lay(src, MemOperand(src, kSystemPointerSize));
+ __ StoreP(r0, MemOperand(dest));
+ __ lay(dest, MemOperand(dest, kSystemPointerSize));
+ __ SubP(num, num, Operand(1));
+ __ bind(&check);
+ __ b(ge, &copy);
+ }
+#endif
+ // Copy arguments from the caller frame.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
{
Label loop;
- __ AddP(r6, r6, Operand(kSystemPointerSize));
+#ifndef V8_REVERSE_JSARGS
+ __ AddP(r6, r6, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp));
+#endif
__ AddP(r2, r2, r7);
__ bind(&loop);
{
- __ ShiftLeftP(scratch, r7, Operand(kSystemPointerSizeLog2));
- __ LoadP(scratch, MemOperand(r6, scratch));
- __ push(scratch);
__ SubP(r7, r7, Operand(1));
+ __ ShiftLeftP(r1, r7, Operand(kSystemPointerSizeLog2));
+ __ LoadP(scratch, MemOperand(r6, r1));
+#ifdef V8_REVERSE_JSARGS
+ __ StoreP(scratch, MemOperand(r4, r1));
+#else
+ __ push(scratch);
+#endif
__ CmpP(r7, Operand::Zero());
__ bne(&loop);
}
@@ -2160,8 +2445,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
__ LoadGlobalProxy(r5);
} else {
Label convert_to_object, convert_receiver;
- __ ShiftLeftP(r5, r2, Operand(kSystemPointerSizeLog2));
- __ LoadP(r5, MemOperand(sp, r5));
+ __ LoadReceiver(r5, r2);
__ JumpIfSmi(r5, &convert_to_object);
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
__ CompareObjectType(r5, r6, r6, FIRST_JS_RECEIVER_TYPE);
@@ -2198,8 +2482,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
r4, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
__ bind(&convert_receiver);
}
- __ ShiftLeftP(r6, r2, Operand(kSystemPointerSizeLog2));
- __ StoreP(r5, MemOperand(sp, r6));
+ __ StoreReceiver(r5, r2, r6);
}
__ bind(&done_convert);
@@ -2269,6 +2552,29 @@ void Generate_PushBoundArguments(MacroAssembler* masm) {
__ bind(&done);
}
+#ifdef V8_REVERSE_JSARGS
+ // Pop receiver.
+ __ Pop(r7);
+
+ // Push [[BoundArguments]].
+ {
+ Label loop, done;
+ __ AddP(r2, r2, r6); // Adjust effective number of arguments.
+ __ AddP(r4, r4, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
+
+ __ bind(&loop);
+ __ SubP(r1, r6, Operand(1));
+ __ ShiftLeftP(r1, r1, Operand(kTaggedSizeLog2));
+ __ LoadAnyTaggedField(scratch, MemOperand(r4, r1), r0);
+ __ Push(scratch);
+ __ SubP(r6, r6, Operand(1));
+ __ bgt(&loop);
+ __ bind(&done);
+ }
+
+ // Push receiver.
+ __ Push(r7);
+#else
__ LoadRR(scratch, sp);
__ LoadRR(sp, r1);
@@ -2303,6 +2609,7 @@ void Generate_PushBoundArguments(MacroAssembler* masm) {
__ BranchOnCount(r1, &loop);
__ AddP(r2, r2, r6);
}
+#endif
}
__ bind(&no_bound_arguments);
}
@@ -2320,8 +2627,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) {
// Patch the receiver to [[BoundThis]].
__ LoadAnyTaggedField(r5,
FieldMemOperand(r3, JSBoundFunction::kBoundThisOffset));
- __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2));
- __ StoreP(r5, MemOperand(sp, r1));
+ __ StoreReceiver(r5, r2, r1);
// Push the [[BoundArguments]] onto the stack.
Generate_PushBoundArguments(masm);
@@ -2362,8 +2668,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
// 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception).
// Overwrite the original receiver the (original) target.
- __ ShiftLeftP(r7, r2, Operand(kSystemPointerSizeLog2));
- __ StoreP(r3, MemOperand(sp, r7));
+ __ StoreReceiver(r3, r2, r7);
// Let the "call_as_function_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, r3);
__ Jump(masm->isolate()->builtins()->CallFunction(
@@ -2477,8 +2782,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ bind(&non_proxy);
{
// Overwrite the original receiver with the (original) target.
- __ ShiftLeftP(r7, r2, Operand(kSystemPointerSizeLog2));
- __ StoreP(r3, MemOperand(sp, r7));
+ __ StoreReceiver(r3, r2, r7);
// Let the "call_as_constructor_delegate" take care of the rest.
__ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, r3);
__ Jump(masm->isolate()->builtins()->CallFunction(),
@@ -2506,10 +2810,12 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
__ LoadTaggedPointerField(
r6, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
__ LoadlW(r6, FieldMemOperand(r6, SharedFunctionInfo::kFlagsOffset));
+#ifndef V8_REVERSE_JSARGS
__ tmlh(r6,
Operand(SharedFunctionInfo::IsSafeToSkipArgumentsAdaptorBit::kMask >>
16));
__ bne(&skip_adapt_arguments);
+#endif
// -------------------------------------------
// Adapt arguments.
@@ -2530,8 +2836,13 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
// r3: function
// r4: expected number of arguments
// r5: new target (passed through to callee)
+#ifdef V8_REVERSE_JSARGS
+ __ ShiftLeftP(r2, r4, Operand(kSystemPointerSizeLog2));
+ __ AddP(r2, fp);
+#else
__ SmiToPtrArrayOffset(r2, r2);
__ AddP(r2, fp);
+#endif
// adjust for return address and receiver
__ AddP(r2, r2, Operand(2 * kSystemPointerSize));
__ ShiftLeftP(r6, r4, Operand(kSystemPointerSizeLog2));
@@ -2561,6 +2872,52 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
EnterArgumentsAdaptorFrame(masm);
Generate_StackOverflowCheck(masm, r4, r7, &stack_overflow);
+#ifdef V8_REVERSE_JSARGS
+ // Fill the remaining expected arguments with undefined.
+ // r0: actual number of arguments as a smi
+ // r1: function
+ // r2: expected number of arguments
+ // r3: new target (passed through to callee)
+ __ LoadRoot(r7, RootIndex::kUndefinedValue);
+ __ SmiUntag(r1, r2);
+ __ SubP(r8, r4, r1);
+ __ ShiftLeftP(r1, r8, Operand(kSystemPointerSizeLog2));
+ __ SubP(r6, fp, r1);
+ // Adjust for frame.
+ __ SubP(r6, r6,
+ Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp +
+ kSystemPointerSize));
+
+ Label fill;
+ __ bind(&fill);
+ __ push(r7);
+ __ CmpP(sp, r6);
+ __ b(ne, &fill);
+
+ // Calculate copy start address into r0 and copy end address is fp.
+ // r0: actual number of arguments as a smi
+ // r1: function
+ // r2: expected number of arguments
+ // r3: new target (passed through to callee)
+ __ SmiToPtrArrayOffset(r2, r2);
+ __ lay(r2, MemOperand(r2, fp));
+
+ // Copy the arguments (including the receiver) to the new stack frame.
+ // r0: copy start address
+ // r1: function
+ // r2: expected number of arguments
+ // r3: new target (passed through to callee)
+ Label copy;
+ __ bind(&copy);
+
+ // Adjust load for return address and receiver.
+ __ LoadP(r7, MemOperand(r2, 2 * kSystemPointerSize));
+ __ push(r7);
+
+ __ CmpP(r2, fp); // Compare before moving to next argument.
+ __ lay(r2, MemOperand(r2, -kSystemPointerSize));
+ __ b(ne, &copy);
+#else
// Calculate copy start address into r0 and copy end address is fp.
// r2: actual number of arguments as a smi
// r3: function
@@ -2599,6 +2956,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
__ push(r0);
__ CmpP(sp, r6);
__ bne(&fill);
+#endif
}
// Call the entry point.
@@ -3154,6 +3512,7 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
// -- sp[(argc - 1) * 4] : first argument
// -- sp[(argc + 0) * 4] : receiver
// -----------------------------------
+ // NOTE: The order of args are reversed if V8_REVERSE_JSARGS
Register api_function_address = r3;
Register argc = r4;
@@ -3228,10 +3587,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
// FunctionCallbackInfo::values_ (points at the first varargs argument passed
// on the stack).
+#ifdef V8_REVERSE_JSARGS
+ __ AddP(scratch, scratch,
+ Operand((FCA::kArgsLength + 1) * kSystemPointerSize));
+#else
__ AddP(scratch, scratch,
Operand((FCA::kArgsLength - 1) * kSystemPointerSize));
__ ShiftLeftP(r1, argc, Operand(kSystemPointerSizeLog2));
__ AddP(scratch, scratch, r1);
+#endif
__ StoreP(scratch, MemOperand(sp, (kStackFrameExtraParamSlot + 2) *
kSystemPointerSize));
diff --git a/deps/v8/src/builtins/torque-csa-header-includes.h b/deps/v8/src/builtins/torque-csa-header-includes.h
index 560f704d66..879fda5bbe 100644
--- a/deps/v8/src/builtins/torque-csa-header-includes.h
+++ b/deps/v8/src/builtins/torque-csa-header-includes.h
@@ -13,7 +13,7 @@
#include "src/codegen/code-stub-assembler.h"
#include "src/compiler/code-assembler.h"
#include "src/utils/utils.h"
-#include "torque-generated/csa-types-tq.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/csa-types.h"
+#include "torque-generated/field-offsets.h"
#endif // V8_BUILTINS_TORQUE_CSA_HEADER_INCLUDES_H_
diff --git a/deps/v8/src/builtins/typed-array-from.tq b/deps/v8/src/builtins/typed-array-from.tq
index 56d4d1d6cf..df9ebbf3b4 100644
--- a/deps/v8/src/builtins/typed-array-from.tq
+++ b/deps/v8/src/builtins/typed-array-from.tq
@@ -10,6 +10,8 @@ const kBuiltinNameFrom: constexpr string = '%TypedArray%.from';
type BuiltinsName extends int31 constexpr 'Builtins::Name';
const kTypedArrayPrototypeValues: constexpr BuiltinsName
generates 'Builtins::kTypedArrayPrototypeValues';
+const kArrayPrototypeValues: constexpr BuiltinsName
+ generates 'Builtins::kArrayPrototypeValues';
extern builtin IterableToList(implicit context: Context)(JSAny, JSAny): JSArray;
@@ -56,9 +58,9 @@ TypedArrayFrom(js-implicit context: NativeContext, receiver: JSAny)(
otherwise IteratorIsUndefined, IteratorNotCallable;
try {
- // TypedArrays have iterators, so normally we would go through the
- // IterableToList case below, which would convert the TypedArray to a
- // JSArray (boxing the values if they won't fit in a Smi).
+ // TypedArrays and JSArrays have iterators, so normally we would go
+ // through the IterableToList case below, which would convert the
+ // source to a JSArray (boxing the values if they won't fit in a Smi).
//
// However, if we can guarantee that the source object has the
// built-in iterator and that the %ArrayIteratorPrototype%.next method
@@ -73,29 +75,55 @@ TypedArrayFrom(js-implicit context: NativeContext, receiver: JSAny)(
//
// Drop through to the default check_iterator behavior if any of these
// checks fail.
- const sourceTypedArray =
- Cast<JSTypedArray>(source) otherwise UseUserProvidedIterator;
- const sourceBuffer = sourceTypedArray.buffer;
- if (IsDetachedBuffer(sourceBuffer)) goto UseUserProvidedIterator;
- // Check that the iterator function is exactly
- // Builtins::kTypedArrayPrototypeValues.
+ // If there is a mapping, we need to gather the values from the
+ // iterables before applying the mapping.
+ if (mapping) goto UseUserProvidedIterator;
+
const iteratorFn =
Cast<JSFunction>(usingIterator) otherwise UseUserProvidedIterator;
- if (!TaggedEqual(
- iteratorFn.shared_function_info.function_data,
- SmiConstant(kTypedArrayPrototypeValues)))
- goto UseUserProvidedIterator;
// Check that the ArrayIterator prototype's "next" method hasn't been
// overridden.
if (IsArrayIteratorProtectorCellInvalid()) goto UseUserProvidedIterator;
- // Source is a TypedArray with unmodified iterator behavior. Use the
- // source object directly, taking advantage of the special-case code
- // in TypedArrayCopyElements
- finalLength = sourceTypedArray.length;
- finalSource = source;
+ typeswitch (source) {
+ case (sourceArray: JSArray): {
+ // Check that the iterator function is exactly
+ // Builtins::kArrayPrototypeValues.
+ if (!TaggedEqual(
+ iteratorFn.shared_function_info.function_data,
+ SmiConstant(kArrayPrototypeValues))) {
+ goto UseUserProvidedIterator;
+ }
+
+ // Source is a JSArray with unmodified iterator behavior. Use the
+ // source object directly, taking advantage of the special-case code
+ // in TypedArrayCopyElements
+ finalLength = Convert<uintptr>(sourceArray.length);
+ finalSource = source;
+ }
+ case (sourceTypedArray: JSTypedArray): {
+ const sourceBuffer = sourceTypedArray.buffer;
+ if (IsDetachedBuffer(sourceBuffer)) goto UseUserProvidedIterator;
+
+ // Check that the iterator function is exactly
+ // Builtins::kTypedArrayPrototypeValues.
+ if (!TaggedEqual(
+ iteratorFn.shared_function_info.function_data,
+ SmiConstant(kTypedArrayPrototypeValues)))
+ goto UseUserProvidedIterator;
+
+ // Source is a TypedArray with unmodified iterator behavior. Use the
+ // source object directly, taking advantage of the special-case code
+ // in TypedArrayCopyElements
+ finalLength = sourceTypedArray.length;
+ finalSource = source;
+ }
+ case (Object): {
+ goto UseUserProvidedIterator;
+ }
+ }
} label UseUserProvidedIterator {
// 6. If usingIterator is not undefined, then
// a. Let values be ? IterableToList(source, usingIterator).
diff --git a/deps/v8/src/builtins/wasm.tq b/deps/v8/src/builtins/wasm.tq
index 1ebc610b2a..fda048518a 100644
--- a/deps/v8/src/builtins/wasm.tq
+++ b/deps/v8/src/builtins/wasm.tq
@@ -424,4 +424,8 @@ builtin ThrowWasmTrapIllegalCast(): JSAny {
builtin ThrowWasmTrapArrayOutOfBounds(): JSAny {
tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapArrayOutOfBounds));
}
+
+builtin ThrowWasmTrapWasmJSFunction(): JSAny {
+ tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapWasmJSFunction));
+}
}
diff --git a/deps/v8/src/builtins/x64/builtins-x64.cc b/deps/v8/src/builtins/x64/builtins-x64.cc
index e12ff0bcbe..b94817f6f5 100644
--- a/deps/v8/src/builtins/x64/builtins-x64.cc
+++ b/deps/v8/src/builtins/x64/builtins-x64.cc
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "src/codegen/x64/register-x64.h"
#if V8_TARGET_ARCH_X64
#include "src/api/api-arguments.h"
@@ -45,23 +44,29 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) {
static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
Runtime::FunctionId function_id) {
// ----------- S t a t e -------------
+ // -- rax : actual argument count
// -- rdx : new target (preserved for callee)
// -- rdi : target function (preserved for callee)
// -----------------------------------
{
FrameScope scope(masm, StackFrame::INTERNAL);
- // Push a copy of the target function and the new target.
- __ Push(rdi);
- __ Push(rdx);
+ // Push a copy of the target function, the new target and the actual
+ // argument count.
+ __ Push(kJavaScriptCallTargetRegister);
+ __ Push(kJavaScriptCallNewTargetRegister);
+ __ SmiTag(kJavaScriptCallArgCountRegister);
+ __ Push(kJavaScriptCallArgCountRegister);
// Function is also the parameter to the runtime call.
- __ Push(rdi);
+ __ Push(kJavaScriptCallTargetRegister);
__ CallRuntime(function_id, 1);
__ movq(rcx, rax);
- // Restore target function and new target.
- __ Pop(rdx);
- __ Pop(rdi);
+ // Restore target function, new target and actual argument count.
+ __ Pop(kJavaScriptCallArgCountRegister);
+ __ SmiUntag(kJavaScriptCallArgCountRegister);
+ __ Pop(kJavaScriptCallNewTargetRegister);
+ __ Pop(kJavaScriptCallTargetRegister);
}
static_assert(kJavaScriptCallCodeStartRegister == rcx, "ABI mismatch");
__ JumpCodeObject(rcx);
@@ -126,6 +131,11 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
__ Push(rsi);
__ Push(rcx);
+ // TODO(victorgomes): When the arguments adaptor is completely removed, we
+ // should get the formal parameter count and copy the arguments in its
+ // correct position (including any undefined), instead of delaying this to
+ // InvokeFunction.
+
#ifdef V8_REVERSE_JSARGS
// Set up pointer to first argument (skip receiver).
__ leaq(rbx, Operand(rbp, StandardFrameConstants::kCallerSPOffset +
@@ -282,6 +292,11 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
__ bind(&enough_stack_space);
+ // TODO(victorgomes): When the arguments adaptor is completely removed, we
+ // should get the formal parameter count and copy the arguments in its
+ // correct position (including any undefined), instead of delaying this to
+ // InvokeFunction.
+
// Copy arguments to the expression stack.
__ PushArray(rbx, rax, rcx);
@@ -907,21 +922,38 @@ static void ReplaceClosureCodeWithOptimizedCode(MacroAssembler* masm,
static void LeaveInterpreterFrame(MacroAssembler* masm, Register scratch1,
Register scratch2) {
- Register args_count = scratch1;
- Register return_pc = scratch2;
-
- // Get the arguments + receiver count.
- __ movq(args_count,
+ Register params_size = scratch1;
+ // Get the size of the formal parameters + receiver (in bytes).
+ __ movq(params_size,
Operand(rbp, InterpreterFrameConstants::kBytecodeArrayFromFp));
- __ movl(args_count,
- FieldOperand(args_count, BytecodeArray::kParameterSizeOffset));
+ __ movl(params_size,
+ FieldOperand(params_size, BytecodeArray::kParameterSizeOffset));
+
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ Register actual_params_size = scratch2;
+ // Compute the size of the actual parameters + receiver (in bytes).
+ __ movq(actual_params_size,
+ Operand(rbp, StandardFrameConstants::kArgCOffset));
+ __ leaq(actual_params_size,
+ Operand(actual_params_size, times_system_pointer_size,
+ kSystemPointerSize));
+
+ // If actual is bigger than formal, then we should use it to free up the stack
+ // arguments.
+ Label corrected_args_count;
+ __ cmpq(params_size, actual_params_size);
+ __ j(greater_equal, &corrected_args_count, Label::kNear);
+ __ movq(params_size, actual_params_size);
+ __ bind(&corrected_args_count);
+#endif
// Leave the frame (also dropping the register file).
__ leave();
// Drop receiver + arguments.
+ Register return_pc = scratch2;
__ PopReturnAddressTo(return_pc);
- __ addq(rsp, args_count);
+ __ addq(rsp, params_size);
__ PushReturnAddressFrom(return_pc);
}
@@ -940,6 +972,7 @@ static void TailCallRuntimeIfMarkerEquals(MacroAssembler* masm,
static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector,
Register optimization_marker) {
// ----------- S t a t e -------------
+ // -- rax : actual argument count
// -- rdx : new target (preserved for callee if needed, and caller)
// -- rdi : target function (preserved for callee if needed, and caller)
// -- feedback vector (preserved for caller if needed)
@@ -974,6 +1007,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
Register optimized_code_entry,
Register scratch1, Register scratch2) {
// ----------- S t a t e -------------
+ // -- rax : actual argument count
// -- rdx : new target (preserved for callee if needed, and caller)
// -- rdi : target function (preserved for callee if needed, and caller)
// -----------------------------------
@@ -1087,10 +1121,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm,
// Generate code for entering a JS function with the interpreter.
// On entry to the function the receiver and arguments have been pushed on the
-// stack left to right. The actual argument count matches the formal parameter
-// count expected by the function.
+// stack left to right.
//
// The live registers are:
+// o rax: actual argument count (not including the receiver)
// o rdi: the JS function object being called
// o rdx: the incoming new target or generator object
// o rsi: our context
@@ -1106,17 +1140,19 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Get the bytecode array from the function object and load it into
// kInterpreterBytecodeArrayRegister.
__ LoadTaggedPointerField(
- rax, FieldOperand(closure, JSFunction::kSharedFunctionInfoOffset));
+ kScratchRegister,
+ FieldOperand(closure, JSFunction::kSharedFunctionInfoOffset));
__ LoadTaggedPointerField(
kInterpreterBytecodeArrayRegister,
- FieldOperand(rax, SharedFunctionInfo::kFunctionDataOffset));
+ FieldOperand(kScratchRegister, SharedFunctionInfo::kFunctionDataOffset));
GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister,
kScratchRegister);
// The bytecode array could have been flushed from the shared function info,
// if so, call into CompileLazy.
Label compile_lazy;
- __ CmpObjectType(kInterpreterBytecodeArrayRegister, BYTECODE_ARRAY_TYPE, rax);
+ __ CmpObjectType(kInterpreterBytecodeArrayRegister, BYTECODE_ARRAY_TYPE,
+ kScratchRegister);
__ j(not_equal, &compile_lazy);
// Load the feedback vector from the closure.
@@ -1162,8 +1198,9 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
FrameScope frame_scope(masm, StackFrame::MANUAL);
__ pushq(rbp); // Caller's frame pointer.
__ movq(rbp, rsp);
- __ Push(rsi); // Callee's context.
- __ Push(rdi); // Callee's JS function.
+ __ Push(kContextRegister); // Callee's context.
+ __ Push(kJavaScriptCallTargetRegister); // Callee's JS function.
+ __ Push(kJavaScriptCallArgCountRegister); // Actual argument count.
// Reset code age and the OSR arming. The OSR field and BytecodeAgeOffset are
// 8-bit fields next to each other, so we could just optimize by writing a
@@ -2345,6 +2382,12 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ bind(&new_target_constructor);
}
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ // TODO(victorgomes): Remove this copy when all the arguments adaptor frame
+ // code is erased.
+ __ movq(rbx, rbp);
+ __ movq(r8, Operand(rbp, StandardFrameConstants::kArgCOffset));
+#else
// Check if we have an arguments adaptor frame below the function frame.
Label arguments_adaptor, arguments_done;
__ movq(rbx, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
@@ -2366,42 +2409,88 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Operand(rbx, ArgumentsAdaptorFrameConstants::kLengthOffset));
}
__ bind(&arguments_done);
+#endif
Label stack_done, stack_overflow;
__ subl(r8, rcx);
__ j(less_equal, &stack_done);
{
+ // ----------- S t a t e -------------
+ // -- rax : the number of arguments already in the stack (not including the
+ // receiver)
+ // -- rbx : point to the caller stack frame
+ // -- rcx : start index (to support rest parameters)
+ // -- rdx : the new target (for [[Construct]] calls)
+ // -- rdi : the target to call (can be any Object)
+ // -- r8 : number of arguments to copy, i.e. arguments count - start index
+ // -----------------------------------
+
// Check for stack overflow.
- Generate_StackOverflowCheck(masm, r8, rcx, &stack_overflow, Label::kNear);
+ Generate_StackOverflowCheck(masm, r8, r12, &stack_overflow, Label::kNear);
// Forward the arguments from the caller frame.
+#ifdef V8_REVERSE_JSARGS
+ // Move the arguments already in the stack,
+ // including the receiver and the return address.
+ {
+ Label copy, check;
+ Register src = r9, dest = rsp, num = r12, current = r11;
+ __ movq(src, rsp);
+ __ leaq(kScratchRegister, Operand(r8, times_system_pointer_size, 0));
+ __ AllocateStackSpace(kScratchRegister);
+ __ leaq(num, Operand(rax, 2)); // Number of words to copy.
+ // +2 for receiver and return address.
+ __ Set(current, 0);
+ __ jmp(&check);
+ __ bind(&copy);
+ __ movq(kScratchRegister,
+ Operand(src, current, times_system_pointer_size, 0));
+ __ movq(Operand(dest, current, times_system_pointer_size, 0),
+ kScratchRegister);
+ __ incq(current);
+ __ bind(&check);
+ __ cmpq(current, num);
+ __ j(less, &copy);
+ __ leaq(r9, Operand(rsp, num, times_system_pointer_size, 0));
+ }
+
+ __ addl(rax, r8); // Update total number of arguments.
+
+ // Point to the first argument to copy (skipping receiver).
+ __ leaq(rcx, Operand(rcx, times_system_pointer_size,
+ CommonFrameConstants::kFixedFrameSizeAboveFp +
+ kSystemPointerSize));
+ __ addq(rbx, rcx);
+
+ // Copy the additional caller arguments onto the stack.
+ // TODO(victorgomes): Consider using forward order as potentially more cache
+ // friendly.
+ {
+ Register src = rbx, dest = r9, num = r8;
+ Label loop;
+ __ bind(&loop);
+ __ decq(num);
+ __ movq(kScratchRegister,
+ Operand(src, num, times_system_pointer_size, 0));
+ __ movq(Operand(dest, num, times_system_pointer_size, 0),
+ kScratchRegister);
+ __ j(not_zero, &loop);
+ }
+#else
{
Label loop;
__ addl(rax, r8);
__ PopReturnAddressTo(rcx);
-#ifdef V8_REVERSE_JSARGS
- // The new receiver is already on the stack. Save it to push it later.
- __ Pop(kScratchRegister);
-#endif
__ bind(&loop);
{
__ decl(r8);
-#ifdef V8_REVERSE_JSARGS
- // Skips the old receiver.
- __ Push(Operand(rbx, r8, times_system_pointer_size,
- kFPOnStackSize + kPCOnStackSize + kSystemPointerSize));
-#else
__ Push(Operand(rbx, r8, times_system_pointer_size,
kFPOnStackSize + kPCOnStackSize));
-#endif
__ j(not_zero, &loop);
}
-#ifdef V8_REVERSE_JSARGS
- // Recover the new receiver.
- __ Push(kScratchRegister);
-#endif
__ PushReturnAddressFrom(rcx);
}
+#endif
}
__ jmp(&stack_done, Label::kNear);
__ bind(&stack_overflow);
@@ -3200,19 +3289,66 @@ void Builtins::Generate_DoubleToI(MacroAssembler* masm) {
__ ret(0);
}
+namespace {
+// Helper functions for the GenericJSToWasmWrapper.
+void PrepareForBuiltinCall(MacroAssembler* masm, MemOperand GCScanSlotPlace,
+ const int GCScanSlotCount, Register current_param,
+ Register param_limit,
+ Register current_int_param_slot,
+ Register current_float_param_slot,
+ Register valuetypes_array_ptr,
+ Register wasm_instance, Register function_data) {
+ // Pushes and puts the values in order onto the stack before builtin calls for
+ // the GenericJSToWasmWrapper.
+ __ movq(GCScanSlotPlace, Immediate(GCScanSlotCount));
+ __ pushq(current_param);
+ __ pushq(param_limit);
+ __ pushq(current_int_param_slot);
+ __ pushq(current_float_param_slot);
+ __ pushq(valuetypes_array_ptr);
+ __ pushq(wasm_instance);
+ __ pushq(function_data);
+ // We had to prepare the parameters for the Call: we have to put the context
+ // into rsi.
+ __ LoadAnyTaggedField(
+ rsi,
+ MemOperand(wasm_instance, wasm::ObjectAccess::ToTagged(
+ WasmInstanceObject::kNativeContextOffset)));
+}
+
+void RestoreAfterBuiltinCall(MacroAssembler* masm, Register function_data,
+ Register wasm_instance,
+ Register valuetypes_array_ptr,
+ Register current_float_param_slot,
+ Register current_int_param_slot,
+ Register param_limit, Register current_param) {
+ // Pop and load values from the stack in order into the registers after
+ // builtin calls for the GenericJSToWasmWrapper.
+ __ popq(function_data);
+ __ popq(wasm_instance);
+ __ popq(valuetypes_array_ptr);
+ __ popq(current_float_param_slot);
+ __ popq(current_int_param_slot);
+ __ popq(param_limit);
+ __ popq(current_param);
+}
+} // namespace
+
void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) {
// Set up the stackframe.
__ EnterFrame(StackFrame::JS_TO_WASM);
+ // -------------------------------------------
+ // Load the Wasm exported function data and the Wasm instance.
+ // -------------------------------------------
Register closure = rdi;
- Register shared_function_info = rbx;
+ Register shared_function_info = closure;
__ LoadAnyTaggedField(
shared_function_info,
MemOperand(
closure,
wasm::ObjectAccess::SharedFunctionInfoOffsetInTaggedJSFunction()));
closure = no_reg;
-
Register function_data = shared_function_info;
__ LoadAnyTaggedField(
function_data,
@@ -3226,34 +3362,373 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) {
MemOperand(function_data,
WasmExportedFunctionData::kInstanceOffset - kHeapObjectTag));
- // Int signature_type gives the number of int32 params (can be only 0 or 1).
- Register signature_type = r9;
- __ SmiUntagField(
- signature_type,
- MemOperand(function_data, WasmExportedFunctionData::kSignatureTypeOffset -
- kHeapObjectTag));
+ // -------------------------------------------
+ // Load values from the signature.
+ // -------------------------------------------
+ Register foreign_signature = r11;
+ __ LoadAnyTaggedField(
+ foreign_signature,
+ MemOperand(function_data,
+ WasmExportedFunctionData::kSignatureOffset - kHeapObjectTag));
+ Register signature = foreign_signature;
+ __ movq(signature,
+ MemOperand(foreign_signature, wasm::ObjectAccess::ToTagged(
+ Foreign::kForeignAddressOffset)));
+ foreign_signature = no_reg;
+ Register return_count = r8;
+ __ movq(return_count,
+ MemOperand(signature, wasm::FunctionSig::kReturnCountOffset));
+ Register param_count = rcx;
+ __ movq(param_count,
+ MemOperand(signature, wasm::FunctionSig::kParameterCountOffset));
+ Register valuetypes_array_ptr = signature;
+ __ movq(valuetypes_array_ptr,
+ MemOperand(signature, wasm::FunctionSig::kRepsOffset));
+ signature = no_reg;
- __ cmpl(signature_type, Immediate(0));
+ // -------------------------------------------
+ // Set up the stack.
+ // -------------------------------------------
+ // We store values on the stack to restore them after function calls.
+ // We cannot push values onto the stack right before the wasm call. The wasm
+ // function expects the parameters, that didn't fit into the registers, on the
+ // top of the stack.
+ // We will have to save a value indicating the GC the number
+ // of values on the top of the stack that have to be scanned before calling
+ // the Wasm function.
+ constexpr int kFrameMarkerOffset = -kSystemPointerSize;
+ constexpr int kGCScanSlotCountOffset =
+ kFrameMarkerOffset - kSystemPointerSize;
+ constexpr int kParamCountOffset = kGCScanSlotCountOffset - kSystemPointerSize;
+ constexpr int kReturnCountOffset = kParamCountOffset - kSystemPointerSize;
+ constexpr int kValueTypesArrayStartOffset =
+ kReturnCountOffset - kSystemPointerSize;
+ // We set and use this slot only when moving parameters into the parameter
+ // registers (so no GC scan is needed).
+ constexpr int kFunctionDataOffset =
+ kValueTypesArrayStartOffset - kSystemPointerSize;
+ constexpr int kLastSpillOffset = kFunctionDataOffset;
+ constexpr int kNumSpillSlots = 5;
+ __ subq(rsp, Immediate(kNumSpillSlots * kSystemPointerSize));
+ __ movq(MemOperand(rbp, kParamCountOffset), param_count);
+ __ movq(MemOperand(rbp, kReturnCountOffset), return_count);
+ __ movq(MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr);
- // In 0 param case jump through parameter handling.
- Label params_done;
- __ j(equal, &params_done);
+ // -------------------------------------------
+ // Parameter handling.
+ // -------------------------------------------
+ Label prepare_for_wasm_call;
+ __ cmpl(param_count, Immediate(0));
+
+ // IF we have 0 params: jump through parameter handling.
+ __ j(equal, &prepare_for_wasm_call);
+
+ // ELSE:
+ // Make sure we have the same number of arguments in order to be able to load
+ // the arguments using static offsets below.
+ __ cmpl(kJavaScriptCallArgCountRegister, param_count);
+ __ Check(equal, AbortReason::kInvalidNumberOfJsArgs);
- // Param handling.
+ // -------------------------------------------
+ // Create 2 sections for integer and float params.
+ // -------------------------------------------
+ // We will create 2 sections on the stack for the evaluated parameters:
+ // Integer and Float section, both with parameter count size. We will place
+ // the parameters into these sections depending on their valuetype. This way
+ // we can easily fill the general purpose and floating point parameter
+ // registers and place the remaining parameters onto the stack in proper order
+ // for the Wasm function. These remaining params are the final stack
+ // parameters for the call to WebAssembly. Example of the stack layout after
+ // processing 2 int and 1 float parameters when param_count is 4.
+ // +-----------------+
+ // | rbp |
+ // |-----------------|-------------------------------
+ // | | Slots we defined
+ // | Saved values | when setting up
+ // | | the stack
+ // | |
+ // +-Integer section-+--- <--- start_int_section ----
+ // | 1st int param |
+ // |- - - - - - - - -|
+ // | 2nd int param |
+ // |- - - - - - - - -| <----- current_int_param_slot
+ // | | (points to the stackslot
+ // |- - - - - - - - -| where the next int param should be placed)
+ // | |
+ // +--Float section--+--- <--- start_float_section --
+ // | 1st float param |
+ // |- - - - - - - - -| <---- current_float_param_slot
+ // | | (points to the stackslot
+ // |- - - - - - - - -| where the next float param should be placed)
+ // | |
+ // |- - - - - - - - -|
+ // | |
+ // +---Final stack---+------------------------------
+ // +-parameters for--+------------------------------
+ // +-the Wasm call---+------------------------------
+ // | . . . |
+
+ constexpr int kIntegerSectionStartOffset =
+ kLastSpillOffset - kSystemPointerSize;
+ // For Integer section.
+ // Set the current_int_param_slot to point to the start of the section.
+ Register current_int_param_slot = r14;
+ __ leaq(current_int_param_slot, MemOperand(rsp, -kSystemPointerSize));
+ Register params_size = param_count;
+ param_count = no_reg;
+ __ shlq(params_size, Immediate(kSystemPointerSizeLog2));
+ __ subq(rsp, params_size);
+
+ // For Float section.
+ // Set the current_float_param_slot to point to the start of the section.
+ Register current_float_param_slot = r15;
+ __ leaq(current_float_param_slot, MemOperand(rsp, -kSystemPointerSize));
+ __ subq(rsp, params_size);
+ params_size = no_reg;
+ param_count = rcx;
+ __ movq(param_count, MemOperand(rbp, kParamCountOffset));
+
+ // -------------------------------------------
+ // Set up for the param evaluation loop.
+ // -------------------------------------------
+ // We will loop through the params starting with the 1st param.
+ // The order of processing the params is important. We have to evaluate them
+ // in an increasing order.
+ // Not reversed Reversed
+ // +-----------------+------+-----------------+---------------
+ // | receiver | | param n |
+ // |- - - - - - - - -| |- - - - - - - - -|
+ // | param 1 | | param n-1 | Caller
+ // | ... | | ... | frame slots
+ // | param n-1 | | param 1 |
+ // |- - - - - - - - -| |- - - - - - - - -|
+ // | param n | | receiver |
+ // -+-----------------+------+-----------------+---------------
+ // | return addr | | return addr |
+ // |- - - - - - - - -|<-FP->|- - - - - - - - -|
+ // | rbp | | rbp | Spill slots
+ // |- - - - - - - - -| |- - - - - - - - -|
+ //
+ // [rbp + current_param] gives us the parameter we are processing.
+ // We iterate through half-open interval <1st param, [rbp + param_limit]).
+
+ Register current_param = rbx;
+ Register param_limit = rdx;
+#ifdef V8_REVERSE_JSARGS
+ constexpr int kReceiverOnStackSize = kSystemPointerSize;
+ __ movq(current_param,
+ Immediate(kFPOnStackSize + kPCOnStackSize + kReceiverOnStackSize));
+ __ movq(param_limit, param_count);
+ __ shlq(param_limit, Immediate(kSystemPointerSizeLog2));
+ __ addq(param_limit,
+ Immediate(kFPOnStackSize + kPCOnStackSize + kReceiverOnStackSize));
+ const int increment = kSystemPointerSize;
+#else
+ __ movq(current_param, param_count);
+ __ shlq(current_param, Immediate(kSystemPointerSizeLog2));
+ __ addq(current_param, Immediate(kFPOnStackSize));
+ __ movq(param_limit, Immediate(kFPOnStackSize));
+ const int increment = -kSystemPointerSize;
+#endif
Register param = rax;
- const int firstParamOffset = 16;
- __ movq(param, MemOperand(rbp, firstParamOffset));
+ // We have to check the types of the params. The ValueType array contains
+ // first the return then the param types.
+ constexpr int kValueTypeSize = sizeof(wasm::ValueType);
+ STATIC_ASSERT(kValueTypeSize == 4);
+ const int32_t kValueTypeSizeLog2 = log2(kValueTypeSize);
+ // Set the ValueType array pointer to point to the first parameter.
+ Register returns_size = return_count;
+ return_count = no_reg;
+ __ shlq(returns_size, Immediate(kValueTypeSizeLog2));
+ __ addq(valuetypes_array_ptr, returns_size);
+ returns_size = no_reg;
+ Register valuetype = r12;
+
+ // -------------------------------------------
+ // Param evaluation loop.
+ // -------------------------------------------
+ Label loop_through_params;
+ __ bind(&loop_through_params);
- Label not_smi;
- __ JumpIfNotSmi(param, &not_smi);
+ __ movq(param, MemOperand(rbp, current_param, times_1, 0));
+ __ movl(valuetype,
+ Operand(valuetypes_array_ptr, wasm::ValueType::bit_field_offset()));
- // Change from smi to int32.
+ // -------------------------------------------
+ // Param conversion.
+ // -------------------------------------------
+ // If param is a Smi we can easily convert it. Otherwise we'll call a builtin
+ // for conversion.
+ Label convert_param;
+ __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field()));
+ __ j(not_equal, &convert_param);
+ __ JumpIfNotSmi(param, &convert_param);
+ // Change the paramfrom Smi to int32.
__ SmiUntag(param);
+ // Zero extend.
+ __ movl(param, param);
+ // Place the param into the proper slot in Integer section.
+ __ movq(MemOperand(current_int_param_slot, 0), param);
+ __ subq(current_int_param_slot, Immediate(kSystemPointerSize));
+
+ // -------------------------------------------
+ // Param conversion done.
+ // -------------------------------------------
+ Label param_conversion_done;
+ __ bind(&param_conversion_done);
+
+ __ addq(current_param, Immediate(increment));
+ __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize));
+
+ __ cmpq(current_param, param_limit);
+ __ j(not_equal, &loop_through_params);
+
+ // -------------------------------------------
+ // Move the parameters into the proper param registers.
+ // -------------------------------------------
+ // The Wasm function expects that the params can be popped from the top of the
+ // stack in an increasing order.
+ // We can always move the values on the beginning of the sections into the GP
+ // or FP parameter registers. If the parameter count is less than the number
+ // of parameter registers, we may move values into the registers that are not
+ // in the section.
+ // ----------- S t a t e -------------
+ // -- r8 : start_int_section
+ // -- rdi : start_float_section
+ // -- r14 : current_int_param_slot
+ // -- r15 : current_float_param_slot
+ // -- r11 : valuetypes_array_ptr
+ // -- r12 : valuetype
+ // -- rsi : wasm_instance
+ // -- GpParamRegisters = rax, rdx, rcx, rbx, r9
+ // -----------------------------------
+
+ Register temp_params_size = rax;
+ __ movq(temp_params_size, MemOperand(rbp, kParamCountOffset));
+ __ shlq(temp_params_size, Immediate(kSystemPointerSizeLog2));
+ // We want to use the register of the function_data = rdi.
+ __ movq(MemOperand(rbp, kFunctionDataOffset), function_data);
+ Register start_float_section = function_data;
+ function_data = no_reg;
+ __ movq(start_float_section, rbp);
+ __ addq(start_float_section, Immediate(kIntegerSectionStartOffset));
+ __ subq(start_float_section, temp_params_size);
+ temp_params_size = no_reg;
+ // Fill the FP param registers.
+ __ Movsd(xmm1, MemOperand(start_float_section, 0));
+ __ Movsd(xmm2, MemOperand(start_float_section, -kSystemPointerSize));
+ __ Movsd(xmm3, MemOperand(start_float_section, -2 * kSystemPointerSize));
+ __ Movsd(xmm4, MemOperand(start_float_section, -3 * kSystemPointerSize));
+ __ Movsd(xmm5, MemOperand(start_float_section, -4 * kSystemPointerSize));
+ __ Movsd(xmm6, MemOperand(start_float_section, -5 * kSystemPointerSize));
+ // We want the start to point to the last properly placed param.
+ __ subq(start_float_section, Immediate(5 * kSystemPointerSize));
+
+ Register start_int_section = r8;
+ __ movq(start_int_section, rbp);
+ __ addq(start_int_section, Immediate(kIntegerSectionStartOffset));
+ // Fill the GP param registers.
+ __ movq(rax, MemOperand(start_int_section, 0));
+ __ movq(rdx, MemOperand(start_int_section, -kSystemPointerSize));
+ __ movq(rcx, MemOperand(start_int_section, -2 * kSystemPointerSize));
+ __ movq(rbx, MemOperand(start_int_section, -3 * kSystemPointerSize));
+ __ movq(r9, MemOperand(start_int_section, -4 * kSystemPointerSize));
+ // We want the start to point to the last properly placed param.
+ __ subq(start_int_section, Immediate(4 * kSystemPointerSize));
+
+ // -------------------------------------------
+ // Place the final stack parameters to the proper place.
+ // -------------------------------------------
+ // We want the current_param_slot (insertion) pointers to point at the last
+ // param of the section instead of the next free slot.
+ __ addq(current_int_param_slot, Immediate(kSystemPointerSize));
+ __ addq(current_float_param_slot, Immediate(kSystemPointerSize));
+
+ // -------------------------------------------
+ // Final stack parameters loop.
+ // -------------------------------------------
+ // The parameters that didn't fit into the registers should be placed on the
+ // top of the stack contiguously. The interval of parameters between the
+ // start_section and the current_param_slot pointers define the remaining
+ // parameters of the section.
+ // We can iterate through the valuetypes array to decide from which section we
+ // need to push the parameter onto the top of the stack. By iterating in a
+ // reversed order we can easily pick the last parameter of the proper section.
+ // The parameter of the section is pushed on the top of the stack only if the
+ // interval of remaining params is not empty. This way we ensure that only
+ // params that didn't fit into param registers are pushed again.
+
+ Label loop_through_valuetypes;
+ __ bind(&loop_through_valuetypes);
+
+ // We iterated through the valuetypes array, we are one field over the end in
+ // the beginning. Also, we have to decrement it in each iteration.
+ __ subq(valuetypes_array_ptr, Immediate(kValueTypeSize));
+
+ // Check if there are still remaining integer params.
+ Label continue_loop;
+ __ cmpq(start_int_section, current_int_param_slot);
+ // If there are remaining integer params.
+ __ j(greater, &continue_loop);
+
+ // Check if there are still remaining float params.
+ __ cmpq(start_float_section, current_float_param_slot);
+ // If there aren't any params remaining.
+ Label params_done;
+ __ j(less_equal, &params_done);
+
+ __ bind(&continue_loop);
+ __ movl(valuetype,
+ Operand(valuetypes_array_ptr, wasm::ValueType::bit_field_offset()));
+ Label place_integer_param;
+ Label place_float_param;
+ __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field()));
+ __ j(equal, &place_integer_param);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmI64.raw_bit_field()));
+ __ j(equal, &place_integer_param);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmF32.raw_bit_field()));
+ __ j(equal, &place_float_param);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field()));
+ __ j(equal, &place_float_param);
+
+ __ int3();
+
+ __ bind(&place_integer_param);
+ __ cmpq(start_int_section, current_int_param_slot);
+ // If there aren't any integer params remaining, just floats, then go to the
+ // next valuetype.
+ __ j(less_equal, &loop_through_valuetypes);
+
+ // Copy the param from the integer section to the actual parameter area.
+ __ pushq(MemOperand(current_int_param_slot, 0));
+ __ addq(current_int_param_slot, Immediate(kSystemPointerSize));
+ __ jmp(&loop_through_valuetypes);
+
+ __ bind(&place_float_param);
+ __ cmpq(start_float_section, current_float_param_slot);
+ // If there aren't any float params remaining, just integers, then go to the
+ // next valuetype.
+ __ j(less_equal, &loop_through_valuetypes);
+
+ // Copy the param from the float section to the actual parameter area.
+ __ pushq(MemOperand(current_float_param_slot, 0));
+ __ addq(current_float_param_slot, Immediate(kSystemPointerSize));
+ __ jmp(&loop_through_valuetypes);
__ bind(&params_done);
+ // Restore function_data after we are done with parameter placement.
+ function_data = rdi;
+ __ movq(function_data, MemOperand(rbp, kFunctionDataOffset));
+ __ bind(&prepare_for_wasm_call);
+ // -------------------------------------------
+ // Prepare for the Wasm call.
+ // -------------------------------------------
// Set thread_in_wasm_flag.
- Register thread_in_wasm_flag_addr = rdx;
+ Register thread_in_wasm_flag_addr = r12;
__ movq(
thread_in_wasm_flag_addr,
MemOperand(kRootRegister, Isolate::thread_in_wasm_flag_address_offset()));
@@ -3267,7 +3742,7 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) {
thread_in_wasm_flag_addr = no_reg;
Register jump_table_offset = function_data;
- __ DecompressTaggedSigned(
+ __ LoadAnyTaggedField(
jump_table_offset,
MemOperand(
function_data,
@@ -3281,12 +3756,22 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) {
jump_table_offset = no_reg;
jump_table_start = no_reg;
- __ pushq(signature_type);
+ // We set the indicating value for the GC to the proper one for Wasm call.
+ constexpr int kWasmCallGCScanSlotCount = 0;
+ __ movq(MemOperand(rbp, kGCScanSlotCountOffset),
+ Immediate(kWasmCallGCScanSlotCount));
+ // -------------------------------------------
+ // Call the Wasm function.
+ // -------------------------------------------
__ call(function_entry);
function_entry = no_reg;
- __ popq(signature_type);
+ // -------------------------------------------
+ // Resetting after the Wasm call.
+ // -------------------------------------------
+ // Restore rsp to free the reserved stack slots for the sections.
+ __ leaq(rsp, MemOperand(rbp, kLastSpillOffset));
// Unset thread_in_wasm_flag.
thread_in_wasm_flag_addr = r8;
@@ -3294,45 +3779,208 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) {
thread_in_wasm_flag_addr,
MemOperand(kRootRegister, Isolate::thread_in_wasm_flag_address_offset()));
__ movl(MemOperand(thread_in_wasm_flag_addr, 0), Immediate(0));
+ thread_in_wasm_flag_addr = no_reg;
+ // -------------------------------------------
+ // Return handling.
+ // -------------------------------------------
+ return_count = r8;
+ __ movq(return_count, MemOperand(rbp, kReturnCountOffset));
Register return_reg = rax;
+
+ // If we have 1 return value, then jump to conversion.
+ __ cmpl(return_count, Immediate(1));
+ Label convert_return;
+ __ j(equal, &convert_return);
+
+ // Otherwise load undefined.
__ LoadRoot(return_reg, RootIndex::kUndefinedValue);
+ Label return_done;
+ __ bind(&return_done);
+ __ movq(param_count, MemOperand(rbp, kParamCountOffset));
+
+ // -------------------------------------------
// Deconstrunct the stack frame.
+ // -------------------------------------------
__ LeaveFrame(StackFrame::JS_TO_WASM);
- __ cmpl(signature_type, Immediate(0));
+ // We have to remove the caller frame slots:
+ // - JS arguments
+ // - the receiver
+ // and transfer the control to the return address (the return address is
+ // expected to be on the top of the stack).
+ // We cannot use just the ret instruction for this, because we cannot pass the
+ // number of slots to remove in a Register as an argument.
+ Register return_addr = rbx;
+ __ popq(return_addr);
+ Register caller_frame_slots_count = param_count;
+ __ addq(caller_frame_slots_count, Immediate(1));
+ __ shlq(caller_frame_slots_count, Immediate(kSystemPointerSizeLog2));
+ __ addq(rsp, caller_frame_slots_count);
+ __ pushq(return_addr);
+ __ ret(0);
- Label ret_0_param;
- __ j(equal, &ret_0_param);
+ // --------------------------------------------------------------------------
+ // Deferred code.
+ // --------------------------------------------------------------------------
- __ ret(16);
+ // -------------------------------------------
+ // Param conversion builtins.
+ // -------------------------------------------
+ __ bind(&convert_param);
+ // The order of pushes is important. We want the heap objects, that should be
+ // scanned by GC, to be on the top of the stack.
+ // We have to set the indicating value for the GC to the number of values on
+ // the top of the stack that have to be scanned before calling the builtin
+ // function.
+ // The builtin expects the parameter to be in register param = rax.
- __ bind(&ret_0_param);
- __ ret(8);
+ constexpr int kBuiltinCallGCScanSlotCount = 2;
+ PrepareForBuiltinCall(masm, MemOperand(rbp, kGCScanSlotCountOffset),
+ kBuiltinCallGCScanSlotCount, current_param, param_limit,
+ current_int_param_slot, current_float_param_slot,
+ valuetypes_array_ptr, wasm_instance, function_data);
- // Handle the conversion to int32 when the param is not a smi.
- __ bind(&not_smi);
+ Label param_kWasmI32_not_smi;
+ Label param_kWasmI64;
+ Label param_kWasmF32;
+ Label param_kWasmF64;
- // The order of pushes is important. We want the heap objects, that should be
- // scanned by GC, to be on the top of the stack.
- __ pushq(signature_type);
- __ pushq(wasm_instance);
- __ pushq(function_data);
- __ LoadAnyTaggedField(
- rsi,
- MemOperand(wasm_instance, wasm::ObjectAccess::ToTagged(
- WasmInstanceObject::kNativeContextOffset)));
- // We had to prepare the parameters for the Call:
- // put the value into rax, and the context to rsi.
+ __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field()));
+ __ j(equal, &param_kWasmI32_not_smi);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmI64.raw_bit_field()));
+ __ j(equal, &param_kWasmI64);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmF32.raw_bit_field()));
+ __ j(equal, &param_kWasmF32);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field()));
+ __ j(equal, &param_kWasmF64);
+
+ __ int3();
+
+ __ bind(&param_kWasmI32_not_smi);
__ Call(BUILTIN_CODE(masm->isolate(), WasmTaggedNonSmiToInt32),
RelocInfo::CODE_TARGET);
+ // Param is the result of the builtin.
+ __ AssertZeroExtended(param);
+ RestoreAfterBuiltinCall(masm, function_data, wasm_instance,
+ valuetypes_array_ptr, current_float_param_slot,
+ current_int_param_slot, param_limit, current_param);
+ __ movq(MemOperand(current_int_param_slot, 0), param);
+ __ subq(current_int_param_slot, Immediate(kSystemPointerSize));
+ __ jmp(&param_conversion_done);
+
+ __ bind(&param_kWasmI64);
+ __ Call(BUILTIN_CODE(masm->isolate(), BigIntToI64), RelocInfo::CODE_TARGET);
+ RestoreAfterBuiltinCall(masm, function_data, wasm_instance,
+ valuetypes_array_ptr, current_float_param_slot,
+ current_int_param_slot, param_limit, current_param);
+ __ movq(MemOperand(current_int_param_slot, 0), param);
+ __ subq(current_int_param_slot, Immediate(kSystemPointerSize));
+ __ jmp(&param_conversion_done);
+
+ __ bind(&param_kWasmF32);
+ __ Call(BUILTIN_CODE(masm->isolate(), WasmTaggedToFloat64),
+ RelocInfo::CODE_TARGET);
+ RestoreAfterBuiltinCall(masm, function_data, wasm_instance,
+ valuetypes_array_ptr, current_float_param_slot,
+ current_int_param_slot, param_limit, current_param);
+ // Clear higher bits.
+ __ Xorpd(xmm1, xmm1);
+ // Truncate float64 to float32.
+ __ Cvtsd2ss(xmm1, xmm0);
+ __ Movsd(MemOperand(current_float_param_slot, 0), xmm1);
+ __ subq(current_float_param_slot, Immediate(kSystemPointerSize));
+ __ jmp(&param_conversion_done);
+
+ __ bind(&param_kWasmF64);
+ __ Call(BUILTIN_CODE(masm->isolate(), WasmTaggedToFloat64),
+ RelocInfo::CODE_TARGET);
+ RestoreAfterBuiltinCall(masm, function_data, wasm_instance,
+ valuetypes_array_ptr, current_float_param_slot,
+ current_int_param_slot, param_limit, current_param);
+ __ Movsd(MemOperand(current_float_param_slot, 0), xmm0);
+ __ subq(current_float_param_slot, Immediate(kSystemPointerSize));
+ __ jmp(&param_conversion_done);
- __ popq(function_data);
- __ popq(wasm_instance);
- __ popq(signature_type);
+ // -------------------------------------------
+ // Return conversions.
+ // -------------------------------------------
+ __ bind(&convert_return);
+ // We have to make sure that the kGCScanSlotCount is set correctly when we
+ // call the builtins for conversion. For these builtins it's the same as for
+ // the Wasm call, that is, kGCScanSlotCount = 0, so we don't have to reset it.
+ // We don't need the JS context for these builtin calls.
+
+ __ movq(valuetypes_array_ptr, MemOperand(rbp, kValueTypesArrayStartOffset));
+ // The first valuetype of the array is the return's valuetype.
+ __ movl(valuetype,
+ Operand(valuetypes_array_ptr, wasm::ValueType::bit_field_offset()));
+
+ Label return_kWasmI32;
+ Label return_kWasmI64;
+ Label return_kWasmF32;
+ Label return_kWasmF64;
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field()));
+ __ j(equal, &return_kWasmI32);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmI64.raw_bit_field()));
+ __ j(equal, &return_kWasmI64);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmF32.raw_bit_field()));
+ __ j(equal, &return_kWasmF32);
+
+ __ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field()));
+ __ j(equal, &return_kWasmF64);
- __ jmp(&params_done);
+ __ int3();
+
+ __ bind(&return_kWasmI32);
+ Label to_heapnumber;
+ // If pointer compression is disabled, we can convert the return to a smi.
+ if (SmiValuesAre32Bits()) {
+ __ SmiTag(return_reg);
+ } else {
+ Register temp = rbx;
+ __ movq(temp, return_reg);
+ // Double the return value to test if it can be a Smi.
+ __ addl(temp, return_reg);
+ temp = no_reg;
+ // If there was overflow, convert the return value to a HeapNumber.
+ __ j(overflow, &to_heapnumber);
+ // If there was no overflow, we can convert to Smi.
+ __ SmiTag(return_reg);
+ }
+ __ jmp(&return_done);
+
+ // Handle the conversion of the I32 return value to HeapNumber when it cannot
+ // be a smi.
+ __ bind(&to_heapnumber);
+ __ Call(BUILTIN_CODE(masm->isolate(), WasmInt32ToHeapNumber),
+ RelocInfo::CODE_TARGET);
+ __ jmp(&return_done);
+
+ __ bind(&return_kWasmI64);
+ __ Call(BUILTIN_CODE(masm->isolate(), I64ToBigInt), RelocInfo::CODE_TARGET);
+ __ jmp(&return_done);
+
+ __ bind(&return_kWasmF32);
+ // The builtin expects the value to be in xmm0.
+ __ Movss(xmm0, xmm1);
+ __ Call(BUILTIN_CODE(masm->isolate(), WasmFloat32ToNumber),
+ RelocInfo::CODE_TARGET);
+ __ jmp(&return_done);
+
+ __ bind(&return_kWasmF64);
+ // The builtin expects the value to be in xmm0.
+ __ Movsd(xmm0, xmm1);
+ __ Call(BUILTIN_CODE(masm->isolate(), WasmFloat64ToNumber),
+ RelocInfo::CODE_TARGET);
+ __ jmp(&return_done);
}
namespace {
diff --git a/deps/v8/src/codegen/arm/assembler-arm-inl.h b/deps/v8/src/codegen/arm/assembler-arm-inl.h
index 45ec07a382..b5f8b9609b 100644
--- a/deps/v8/src/codegen/arm/assembler-arm-inl.h
+++ b/deps/v8/src/codegen/arm/assembler-arm-inl.h
@@ -51,7 +51,7 @@ bool CpuFeatures::SupportsOptimizer() { return true; }
bool CpuFeatures::SupportsWasmSimd128() { return IsSupported(NEON); }
-int DoubleRegister::NumRegisters() {
+int DoubleRegister::SupportedRegisterCount() {
return CpuFeatures::IsSupported(VFP32DREGS) ? 32 : 16;
}
diff --git a/deps/v8/src/codegen/arm/interface-descriptors-arm.cc b/deps/v8/src/codegen/arm/interface-descriptors-arm.cc
index b457376610..731d175393 100644
--- a/deps/v8/src/codegen/arm/interface-descriptors-arm.cc
+++ b/deps/v8/src/codegen/arm/interface-descriptors-arm.cc
@@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return r0; }
const Register LoadWithVectorDescriptor::VectorRegister() { return r3; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return r4;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return r1; }
const Register StoreDescriptor::NameRegister() { return r2; }
const Register StoreDescriptor::ValueRegister() { return r0; }
diff --git a/deps/v8/src/codegen/arm/macro-assembler-arm.cc b/deps/v8/src/codegen/arm/macro-assembler-arm.cc
index 7b9e73e1d9..319ee39ef7 100644
--- a/deps/v8/src/codegen/arm/macro-assembler-arm.cc
+++ b/deps/v8/src/codegen/arm/macro-assembler-arm.cc
@@ -57,7 +57,7 @@ int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
bytes += NumRegs(list) * kPointerSize;
if (fp_mode == kSaveFPRegs) {
- bytes += DwVfpRegister::NumRegisters() * DwVfpRegister::kSizeInBytes;
+ bytes += DwVfpRegister::kNumRegisters * DwVfpRegister::kSizeInBytes;
}
return bytes;
@@ -84,7 +84,7 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1,
if (fp_mode == kSaveFPRegs) {
SaveFPRegs(sp, lr);
- bytes += DwVfpRegister::NumRegisters() * DwVfpRegister::kSizeInBytes;
+ bytes += DwVfpRegister::kNumRegisters * DwVfpRegister::kSizeInBytes;
}
return bytes;
@@ -95,7 +95,7 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1,
int bytes = 0;
if (fp_mode == kSaveFPRegs) {
RestoreFPRegs(sp, lr);
- bytes += DwVfpRegister::NumRegisters() * DwVfpRegister::kSizeInBytes;
+ bytes += DwVfpRegister::kNumRegisters * DwVfpRegister::kSizeInBytes;
}
RegList exclusions = 0;
@@ -879,6 +879,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) {
int offset = -StandardFrameConstants::kContextOffset;
offset += function_reg.is_valid() ? kPointerSize : 0;
add(fp, sp, Operand(offset));
+ Push(kJavaScriptCallArgCountRegister);
}
void TurboAssembler::VFPCanonicalizeNaN(const DwVfpRegister dst,
@@ -2284,11 +2285,11 @@ int TurboAssembler::CalculateStackPassedWords(int num_reg_arguments,
int num_double_arguments) {
int stack_passed_words = 0;
if (use_eabi_hardfloat()) {
- // In the hard floating point calling convention, we can use
- // all double registers to pass doubles.
- if (num_double_arguments > DoubleRegister::NumRegisters()) {
+ // In the hard floating point calling convention, we can use all double
+ // registers to pass doubles.
+ if (num_double_arguments > DoubleRegister::SupportedRegisterCount()) {
stack_passed_words +=
- 2 * (num_double_arguments - DoubleRegister::NumRegisters());
+ 2 * (num_double_arguments - DoubleRegister::SupportedRegisterCount());
}
} else {
// In the soft floating point calling convention, every double
diff --git a/deps/v8/src/codegen/arm/register-arm.h b/deps/v8/src/codegen/arm/register-arm.h
index 77ae14f98c..6cb6c602c2 100644
--- a/deps/v8/src/codegen/arm/register-arm.h
+++ b/deps/v8/src/codegen/arm/register-arm.h
@@ -181,7 +181,10 @@ class DwVfpRegister : public RegisterBase<DwVfpRegister, kDoubleAfterLast> {
public:
static constexpr int kSizeInBytes = 8;
- inline static int NumRegisters();
+ // This function differs from kNumRegisters by returning the number of double
+ // registers supported by the current CPU, while kNumRegisters always returns
+ // 32.
+ inline static int SupportedRegisterCount();
static void split_code(int reg_code, int* vm, int* m) {
DCHECK(from_code(reg_code).is_valid());
diff --git a/deps/v8/src/codegen/arm64/instructions-arm64.h b/deps/v8/src/codegen/arm64/instructions-arm64.h
index c115fb6924..b8335e0741 100644
--- a/deps/v8/src/codegen/arm64/instructions-arm64.h
+++ b/deps/v8/src/codegen/arm64/instructions-arm64.h
@@ -460,7 +460,7 @@ class Instruction {
static const int ImmPCRelRangeBitwidth = 21;
static bool IsValidPCRelOffset(ptrdiff_t offset) { return is_int21(offset); }
void SetPCRelImmTarget(const AssemblerOptions& options, Instruction* target);
- void SetBranchImmTarget(Instruction* target);
+ V8_EXPORT_PRIVATE void SetBranchImmTarget(Instruction* target);
};
// Simulator/Debugger debug instructions ---------------------------------------
diff --git a/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc b/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc
index 61c8947bd4..0c9beba776 100644
--- a/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc
+++ b/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc
@@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return x0; }
const Register LoadWithVectorDescriptor::VectorRegister() { return x3; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return x4;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return x1; }
const Register StoreDescriptor::NameRegister() { return x2; }
const Register StoreDescriptor::ValueRegister() { return x0; }
diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc b/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc
index 2d3e27e530..fef1758aaa 100644
--- a/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc
+++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc
@@ -2312,8 +2312,10 @@ void TurboAssembler::TruncateDoubleToI(Isolate* isolate, Zone* zone,
}
void TurboAssembler::Prologue() {
- Push<TurboAssembler::kSignLR>(lr, fp, cp, x1);
- Add(fp, sp, StandardFrameConstants::kFixedFrameSizeFromFp);
+ Push<TurboAssembler::kSignLR>(lr, fp);
+ mov(fp, sp);
+ STATIC_ASSERT(kExtraSlotClaimedByPrologue == 1);
+ Push(cp, kJSFunctionRegister, kJavaScriptCallArgCountRegister, padreg);
}
void TurboAssembler::EnterFrame(StackFrame::Type type) {
diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64.h b/deps/v8/src/codegen/arm64/macro-assembler-arm64.h
index 0cb9e82319..655c44f819 100644
--- a/deps/v8/src/codegen/arm64/macro-assembler-arm64.h
+++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64.h
@@ -1276,6 +1276,8 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
inline void Mrs(const Register& rt, SystemRegister sysreg);
inline void Msr(SystemRegister sysreg, const Register& rt);
+ // Prologue claims an extra slot due to arm64's alignement constraints.
+ static constexpr int kExtraSlotClaimedByPrologue = 1;
// Generates function prologue code.
void Prologue();
@@ -1712,6 +1714,12 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
inline void PopWRegList(RegList regs) {
PopSizeRegList(regs, kWRegSizeInBits);
}
+ inline void PushQRegList(RegList regs) {
+ PushSizeRegList(regs, kQRegSizeInBits, CPURegister::kVRegister);
+ }
+ inline void PopQRegList(RegList regs) {
+ PopSizeRegList(regs, kQRegSizeInBits, CPURegister::kVRegister);
+ }
inline void PushDRegList(RegList regs) {
PushSizeRegList(regs, kDRegSizeInBits, CPURegister::kVRegister);
}
diff --git a/deps/v8/src/codegen/arm64/register-arm64.cc b/deps/v8/src/codegen/arm64/register-arm64.cc
index 6a56ce18f6..9144884550 100644
--- a/deps/v8/src/codegen/arm64/register-arm64.cc
+++ b/deps/v8/src/codegen/arm64/register-arm64.cc
@@ -136,6 +136,10 @@ VectorFormat ScalarFormatFromLaneSize(int laneSize) {
}
}
+VectorFormat VectorFormatFillQ(int laneSize) {
+ return VectorFormatFillQ(ScalarFormatFromLaneSize(laneSize));
+}
+
VectorFormat ScalarFormatFromFormat(VectorFormat vform) {
return ScalarFormatFromLaneSize(LaneSizeInBitsFromFormat(vform));
}
diff --git a/deps/v8/src/codegen/arm64/register-arm64.h b/deps/v8/src/codegen/arm64/register-arm64.h
index 28bbed9ee0..fbbb0a18da 100644
--- a/deps/v8/src/codegen/arm64/register-arm64.h
+++ b/deps/v8/src/codegen/arm64/register-arm64.h
@@ -281,6 +281,7 @@ VectorFormat VectorFormatDoubleLanes(VectorFormat vform);
VectorFormat VectorFormatHalfLanes(VectorFormat vform);
VectorFormat ScalarFormatFromLaneSize(int lanesize);
VectorFormat VectorFormatHalfWidthDoubleLanes(VectorFormat vform);
+VectorFormat VectorFormatFillQ(int laneSize);
VectorFormat VectorFormatFillQ(VectorFormat vform);
VectorFormat ScalarFormatFromFormat(VectorFormat vform);
V8_EXPORT_PRIVATE unsigned RegisterSizeInBitsFromFormat(VectorFormat vform);
@@ -345,6 +346,10 @@ class VRegister : public CPURegister {
return VRegister::Create(code(), kDRegSizeInBits, 1);
}
+ VRegister Format(VectorFormat f) const {
+ return VRegister::Create(code(), f);
+ }
+
bool Is8B() const { return (Is64Bits() && (lane_count_ == 8)); }
bool Is16B() const { return (Is128Bits() && (lane_count_ == 16)); }
bool Is4H() const { return (Is64Bits() && (lane_count_ == 4)); }
@@ -519,8 +524,6 @@ using Simd128Register = VRegister;
// Lists of registers.
class V8_EXPORT_PRIVATE CPURegList {
public:
- CPURegList() = default;
-
template <typename... CPURegisters>
explicit CPURegList(CPURegister reg0, CPURegisters... regs)
: list_(CPURegister::ListOf(reg0, regs...)),
diff --git a/deps/v8/src/codegen/bailout-reason.h b/deps/v8/src/codegen/bailout-reason.h
index 3e01dca7d0..e55e691a08 100644
--- a/deps/v8/src/codegen/bailout-reason.h
+++ b/deps/v8/src/codegen/bailout-reason.h
@@ -30,6 +30,7 @@ namespace internal {
V(kInvalidJumpTableIndex, "Invalid jump table index") \
V(kInvalidParametersAndRegistersInGenerator, \
"invalid parameters and registers in generator") \
+ V(kInvalidNumberOfJsArgs, "Invalid number of JS arguments") \
V(kMissingBytecodeArray, "Missing bytecode array from function") \
V(kObjectNotTagged, "The object is not tagged") \
V(kObjectTagged, "The object is tagged") \
diff --git a/deps/v8/src/codegen/code-stub-assembler.cc b/deps/v8/src/codegen/code-stub-assembler.cc
index 5a8d0bad03..184a31c8a3 100644
--- a/deps/v8/src/codegen/code-stub-assembler.cc
+++ b/deps/v8/src/codegen/code-stub-assembler.cc
@@ -287,23 +287,23 @@ TNode<RawPtrT> CodeStubAssembler::IntPtrOrSmiConstant<RawPtrT>(int value) {
return ReinterpretCast<RawPtrT>(IntPtrConstant(value));
}
-bool CodeStubAssembler::TryGetIntPtrOrSmiConstantValue(Node* maybe_constant,
- int* value,
- ParameterMode mode) {
+bool CodeStubAssembler::TryGetIntPtrOrSmiConstantValue(
+ TNode<Smi> maybe_constant, int* value) {
+ Smi smi_constant;
+ if (ToSmiConstant(maybe_constant, &smi_constant)) {
+ *value = Smi::ToInt(smi_constant);
+ return true;
+ }
+ return false;
+}
+
+bool CodeStubAssembler::TryGetIntPtrOrSmiConstantValue(
+ TNode<IntPtrT> maybe_constant, int* value) {
int32_t int32_constant;
- if (mode == INTPTR_PARAMETERS) {
if (ToInt32Constant(maybe_constant, &int32_constant)) {
*value = int32_constant;
return true;
}
- } else {
- DCHECK_EQ(mode, SMI_PARAMETERS);
- Smi smi_constant;
- if (ToSmiConstant(maybe_constant, &smi_constant)) {
- *value = Smi::ToInt(smi_constant);
- return true;
- }
- }
return false;
}
@@ -318,14 +318,6 @@ TNode<IntPtrT> CodeStubAssembler::IntPtrRoundUpToPowerOfTwo32(
return Signed(IntPtrAdd(value, IntPtrConstant(1)));
}
-Node* CodeStubAssembler::MatchesParameterMode(Node* value, ParameterMode mode) {
- if (mode == SMI_PARAMETERS) {
- return TaggedIsSmi(value);
- } else {
- return Int32Constant(1);
- }
-}
-
TNode<BoolT> CodeStubAssembler::WordIsPowerOfTwo(SloppyTNode<IntPtrT> value) {
intptr_t constant;
if (ToIntPtrConstant(value, &constant)) {
@@ -1383,20 +1375,6 @@ TNode<Object> CodeStubAssembler::LoadFromParentFrame(int offset) {
return LoadFullTagged(frame_pointer, IntPtrConstant(offset));
}
-Node* CodeStubAssembler::LoadObjectField(TNode<HeapObject> object, int offset,
- MachineType type) {
- CSA_ASSERT(this, IsStrong(object));
- return LoadFromObject(type, object, IntPtrConstant(offset - kHeapObjectTag));
-}
-
-Node* CodeStubAssembler::LoadObjectField(TNode<HeapObject> object,
- TNode<IntPtrT> offset,
- MachineType type) {
- CSA_ASSERT(this, IsStrong(object));
- return LoadFromObject(type, object,
- IntPtrSub(offset, IntPtrConstant(kHeapObjectTag)));
-}
-
TNode<IntPtrT> CodeStubAssembler::LoadAndUntagObjectField(
SloppyTNode<HeapObject> object, int offset) {
if (SmiValuesAre32Bits()) {
@@ -1405,8 +1383,7 @@ TNode<IntPtrT> CodeStubAssembler::LoadAndUntagObjectField(
#endif
return ChangeInt32ToIntPtr(LoadObjectField<Int32T>(object, offset));
} else {
- return SmiToIntPtr(
- LoadObjectField(object, offset, MachineType::TaggedSigned()));
+ return SmiToIntPtr(LoadObjectField<Smi>(object, offset));
}
}
@@ -1416,11 +1393,9 @@ TNode<Int32T> CodeStubAssembler::LoadAndUntagToWord32ObjectField(
#if V8_TARGET_LITTLE_ENDIAN
offset += 4;
#endif
- return UncheckedCast<Int32T>(
- LoadObjectField(object, offset, MachineType::Int32()));
+ return LoadObjectField<Int32T>(object, offset);
} else {
- return SmiToInt32(
- LoadObjectField(object, offset, MachineType::TaggedSigned()));
+ return SmiToInt32(LoadObjectField<Smi>(object, offset));
}
}
@@ -1428,8 +1403,7 @@ TNode<Float64T> CodeStubAssembler::LoadHeapNumberValue(
SloppyTNode<HeapObject> object) {
CSA_ASSERT(this, Word32Or(IsHeapNumber(object), IsOddball(object)));
STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset);
- return TNode<Float64T>::UncheckedCast(LoadObjectField(
- object, HeapNumber::kValueOffset, MachineType::Float64()));
+ return LoadObjectField<Float64T>(object, HeapNumber::kValueOffset);
}
TNode<Map> CodeStubAssembler::GetInstanceTypeMap(InstanceType instance_type) {
@@ -1440,10 +1414,7 @@ TNode<Map> CodeStubAssembler::GetInstanceTypeMap(InstanceType instance_type) {
}
TNode<Map> CodeStubAssembler::LoadMap(SloppyTNode<HeapObject> object) {
- // TODO(v8:9637): Do a proper LoadObjectField<Map> and remove UncheckedCast
- // when we can avoid making Large code objects due to TNodification.
- return UncheckedCast<Map>(LoadObjectField(object, HeapObject::kMapOffset,
- MachineType::TaggedPointer()));
+ return LoadObjectField<Map>(object, HeapObject::kMapOffset);
}
TNode<Uint16T> CodeStubAssembler::LoadInstanceType(
@@ -1567,9 +1538,8 @@ TNode<IntPtrT> CodeStubAssembler::LoadAndUntagWeakFixedArrayLength(
TNode<Int32T> CodeStubAssembler::LoadNumberOfDescriptors(
TNode<DescriptorArray> array) {
- return UncheckedCast<Int32T>(
- LoadObjectField(array, DescriptorArray::kNumberOfDescriptorsOffset,
- MachineType::Int16()));
+ return UncheckedCast<Int32T>(LoadObjectField<Int16T>(
+ array, DescriptorArray::kNumberOfDescriptorsOffset));
}
TNode<Int32T> CodeStubAssembler::LoadNumberOfOwnDescriptors(TNode<Map> map) {
@@ -1581,19 +1551,18 @@ TNode<Int32T> CodeStubAssembler::LoadNumberOfOwnDescriptors(TNode<Map> map) {
TNode<Int32T> CodeStubAssembler::LoadMapBitField(SloppyTNode<Map> map) {
CSA_SLOW_ASSERT(this, IsMap(map));
return UncheckedCast<Int32T>(
- LoadObjectField(map, Map::kBitFieldOffset, MachineType::Uint8()));
+ LoadObjectField<Uint8T>(map, Map::kBitFieldOffset));
}
TNode<Int32T> CodeStubAssembler::LoadMapBitField2(SloppyTNode<Map> map) {
CSA_SLOW_ASSERT(this, IsMap(map));
return UncheckedCast<Int32T>(
- LoadObjectField(map, Map::kBitField2Offset, MachineType::Uint8()));
+ LoadObjectField<Uint8T>(map, Map::kBitField2Offset));
}
TNode<Uint32T> CodeStubAssembler::LoadMapBitField3(SloppyTNode<Map> map) {
CSA_SLOW_ASSERT(this, IsMap(map));
- return UncheckedCast<Uint32T>(
- LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()));
+ return LoadObjectField<Uint32T>(map, Map::kBitField3Offset);
}
TNode<Uint16T> CodeStubAssembler::LoadMapInstanceType(SloppyTNode<Map> map) {
@@ -1754,12 +1723,13 @@ TNode<IntPtrT> CodeStubAssembler::LoadJSReceiverIdentityHash(
return var_hash.value();
}
-TNode<Uint32T> CodeStubAssembler::LoadNameHashField(SloppyTNode<Name> name) {
- CSA_ASSERT(this, IsName(name));
- return LoadObjectField<Uint32T>(name, Name::kHashFieldOffset);
+TNode<Uint32T> CodeStubAssembler::LoadNameHashAssumeComputed(TNode<Name> name) {
+ TNode<Uint32T> hash_field = LoadNameHashField(name);
+ CSA_ASSERT(this, IsClearWord32(hash_field, Name::kHashNotComputedMask));
+ return Unsigned(Word32Shr(hash_field, Int32Constant(Name::kHashShift)));
}
-TNode<Uint32T> CodeStubAssembler::LoadNameHash(SloppyTNode<Name> name,
+TNode<Uint32T> CodeStubAssembler::LoadNameHash(TNode<Name> name,
Label* if_hash_not_computed) {
TNode<Uint32T> hash_field = LoadNameHashField(name);
if (if_hash_not_computed != nullptr) {
@@ -1922,42 +1892,36 @@ TNode<IntPtrT> CodeStubAssembler::LoadArrayLength(
return LoadAndUntagWeakFixedArrayLength(array);
}
-template <typename Array, typename T>
-TNode<T> CodeStubAssembler::LoadArrayElement(TNode<Array> array,
- int array_header_size,
- Node* index_node,
- int additional_offset,
- ParameterMode parameter_mode,
- LoadSensitivity needs_poisoning) {
- CSA_ASSERT(this, IntPtrGreaterThanOrEqual(
- ParameterToIntPtr(index_node, parameter_mode),
- IntPtrConstant(0)));
+template <typename Array, typename TIndex, typename TValue>
+TNode<TValue> CodeStubAssembler::LoadArrayElement(
+ TNode<Array> array, int array_header_size, TNode<TIndex> index_node,
+ int additional_offset, LoadSensitivity needs_poisoning) {
+ // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants?
+ static_assert(std::is_same<TIndex, Smi>::value ||
+ std::is_same<TIndex, UintPtrT>::value ||
+ std::is_same<TIndex, IntPtrT>::value,
+ "Only Smi, UintPtrT or IntPtrT indices are allowed");
+ CSA_ASSERT(this, IntPtrGreaterThanOrEqual(ParameterToIntPtr(index_node),
+ IntPtrConstant(0)));
DCHECK(IsAligned(additional_offset, kTaggedSize));
int32_t header_size = array_header_size + additional_offset - kHeapObjectTag;
- TNode<IntPtrT> offset = ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS,
- parameter_mode, header_size);
+ TNode<IntPtrT> offset =
+ ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS, header_size);
CSA_ASSERT(this, IsOffsetInBounds(offset, LoadArrayLength(array),
array_header_size));
- constexpr MachineType machine_type = MachineTypeOf<T>::value;
+ constexpr MachineType machine_type = MachineTypeOf<TValue>::value;
// TODO(gsps): Remove the Load case once LoadFromObject supports poisoning
if (needs_poisoning == LoadSensitivity::kSafe) {
- return UncheckedCast<T>(LoadFromObject(machine_type, array, offset));
+ return UncheckedCast<TValue>(LoadFromObject(machine_type, array, offset));
} else {
- return UncheckedCast<T>(Load(machine_type, array, offset, needs_poisoning));
+ return UncheckedCast<TValue>(
+ Load(machine_type, array, offset, needs_poisoning));
}
}
-template TNode<MaybeObject>
-CodeStubAssembler::LoadArrayElement<TransitionArray>(TNode<TransitionArray>,
- int, Node*, int,
- ParameterMode,
- LoadSensitivity);
-
-template TNode<MaybeObject>
-CodeStubAssembler::LoadArrayElement<DescriptorArray>(TNode<DescriptorArray>,
- int, Node*, int,
- ParameterMode,
- LoadSensitivity);
+template V8_EXPORT_PRIVATE TNode<MaybeObject>
+CodeStubAssembler::LoadArrayElement<TransitionArray, IntPtrT>(
+ TNode<TransitionArray>, int, TNode<IntPtrT>, int, LoadSensitivity);
template <typename TIndex>
TNode<Object> CodeStubAssembler::LoadFixedArrayElement(
@@ -1971,14 +1935,12 @@ TNode<Object> CodeStubAssembler::LoadFixedArrayElement(
CSA_ASSERT(this, IsFixedArraySubclass(object));
CSA_ASSERT(this, IsNotWeakFixedArraySubclass(object));
- ParameterMode parameter_mode =
- std::is_same<TIndex, Smi>::value ? SMI_PARAMETERS : INTPTR_PARAMETERS;
if (NeedsBoundsCheck(check_bounds)) {
- FixedArrayBoundsCheck(object, index, additional_offset, parameter_mode);
+ FixedArrayBoundsCheck(object, index, additional_offset);
}
TNode<MaybeObject> element =
LoadArrayElement(object, FixedArray::kHeaderSize, index,
- additional_offset, parameter_mode, needs_poisoning);
+ additional_offset, needs_poisoning);
return CAST(element);
}
@@ -1997,43 +1959,41 @@ CodeStubAssembler::LoadFixedArrayElement<IntPtrT>(TNode<FixedArray>,
LoadSensitivity, CheckBounds);
void CodeStubAssembler::FixedArrayBoundsCheck(TNode<FixedArrayBase> array,
- Node* index,
- int additional_offset,
- ParameterMode parameter_mode) {
+ TNode<Smi> index,
+ int additional_offset) {
if (!FLAG_fixed_array_bounds_checks) return;
DCHECK(IsAligned(additional_offset, kTaggedSize));
- if (parameter_mode == ParameterMode::SMI_PARAMETERS) {
- TNode<Smi> effective_index;
- Smi constant_index;
- bool index_is_constant = ToSmiConstant(index, &constant_index);
- if (index_is_constant) {
- effective_index = SmiConstant(Smi::ToInt(constant_index) +
- additional_offset / kTaggedSize);
- } else if (additional_offset != 0) {
- effective_index =
- SmiAdd(CAST(index), SmiConstant(additional_offset / kTaggedSize));
- } else {
- effective_index = CAST(index);
- }
- CSA_CHECK(this, SmiBelow(effective_index, LoadFixedArrayBaseLength(array)));
+ TNode<Smi> effective_index;
+ Smi constant_index;
+ bool index_is_constant = ToSmiConstant(index, &constant_index);
+ if (index_is_constant) {
+ effective_index = SmiConstant(Smi::ToInt(constant_index) +
+ additional_offset / kTaggedSize);
} else {
- // IntPtrAdd does constant-folding automatically.
- TNode<IntPtrT> effective_index =
- IntPtrAdd(UncheckedCast<IntPtrT>(index),
- IntPtrConstant(additional_offset / kTaggedSize));
- CSA_CHECK(this, UintPtrLessThan(effective_index,
- LoadAndUntagFixedArrayBaseLength(array)));
+ effective_index =
+ SmiAdd(index, SmiConstant(additional_offset / kTaggedSize));
}
+ CSA_CHECK(this, SmiBelow(effective_index, LoadFixedArrayBaseLength(array)));
+}
+
+void CodeStubAssembler::FixedArrayBoundsCheck(TNode<FixedArrayBase> array,
+ TNode<IntPtrT> index,
+ int additional_offset) {
+ if (!FLAG_fixed_array_bounds_checks) return;
+ DCHECK(IsAligned(additional_offset, kTaggedSize));
+ // IntPtrAdd does constant-folding automatically.
+ TNode<IntPtrT> effective_index =
+ IntPtrAdd(index, IntPtrConstant(additional_offset / kTaggedSize));
+ CSA_CHECK(this, UintPtrLessThan(effective_index,
+ LoadAndUntagFixedArrayBaseLength(array)));
}
TNode<Object> CodeStubAssembler::LoadPropertyArrayElement(
TNode<PropertyArray> object, SloppyTNode<IntPtrT> index) {
int additional_offset = 0;
- ParameterMode parameter_mode = INTPTR_PARAMETERS;
LoadSensitivity needs_poisoning = LoadSensitivity::kSafe;
return CAST(LoadArrayElement(object, PropertyArray::kHeaderSize, index,
- additional_offset, parameter_mode,
- needs_poisoning));
+ additional_offset, needs_poisoning));
}
TNode<IntPtrT> CodeStubAssembler::LoadPropertyArrayLength(
@@ -2334,8 +2294,8 @@ template <typename TIndex>
TNode<MaybeObject> CodeStubAssembler::LoadFeedbackVectorSlot(
TNode<FeedbackVector> feedback_vector, TNode<TIndex> slot,
int additional_offset) {
- int32_t header_size =
- FeedbackVector::kFeedbackSlotsOffset + additional_offset - kHeapObjectTag;
+ int32_t header_size = FeedbackVector::kRawFeedbackSlotsOffset +
+ additional_offset - kHeapObjectTag;
TNode<IntPtrT> offset =
ElementOffsetFromIndex(slot, HOLEY_ELEMENTS, header_size);
CSA_SLOW_ASSERT(
@@ -2386,8 +2346,7 @@ TNode<Int32T> CodeStubAssembler::LoadAndUntagToWord32FixedArrayElement(
TNode<MaybeObject> CodeStubAssembler::LoadWeakFixedArrayElement(
TNode<WeakFixedArray> object, TNode<IntPtrT> index, int additional_offset) {
return LoadArrayElement(object, WeakFixedArray::kHeaderSize, index,
- additional_offset, INTPTR_PARAMETERS,
- LoadSensitivity::kSafe);
+ additional_offset, LoadSensitivity::kSafe);
}
TNode<Float64T> CodeStubAssembler::LoadFixedDoubleArrayElement(
@@ -2550,6 +2509,20 @@ TNode<Context> CodeStubAssembler::LoadModuleContext(
return UncheckedCast<Context>(cur_context.value());
}
+TNode<Map> CodeStubAssembler::LoadObjectFunctionInitialMap(
+ TNode<NativeContext> native_context) {
+ TNode<JSFunction> object_function =
+ CAST(LoadContextElement(native_context, Context::OBJECT_FUNCTION_INDEX));
+ return CAST(LoadJSFunctionPrototypeOrInitialMap(object_function));
+}
+
+TNode<Map> CodeStubAssembler::LoadSlowObjectWithNullPrototypeMap(
+ TNode<NativeContext> native_context) {
+ TNode<Map> map = CAST(LoadContextElement(
+ native_context, Context::SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP));
+ return map;
+}
+
TNode<Map> CodeStubAssembler::LoadJSArrayElementsMap(
SloppyTNode<Int32T> kind, SloppyTNode<NativeContext> native_context) {
CSA_ASSERT(this, IsFastElementsKind(kind));
@@ -2572,9 +2545,9 @@ TNode<BoolT> CodeStubAssembler::IsGeneratorFunction(
function, JSFunction::kSharedFunctionInfoOffset);
const TNode<Uint32T> function_kind =
- DecodeWord32<SharedFunctionInfo::FunctionKindBits>(LoadObjectField(
- shared_function_info, SharedFunctionInfo::kFlagsOffset,
- MachineType::Uint32()));
+ DecodeWord32<SharedFunctionInfo::FunctionKindBits>(
+ LoadObjectField<Uint32T>(shared_function_info,
+ SharedFunctionInfo::kFlagsOffset));
// See IsGeneratorFunction(FunctionKind kind).
return IsInRange(function_kind, FunctionKind::kAsyncConciseGeneratorMethod,
@@ -2711,13 +2684,15 @@ void CodeStubAssembler::StoreObjectFieldRoot(TNode<HeapObject> object,
}
}
+template <typename TIndex>
void CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement(
- TNode<UnionT<FixedArray, PropertyArray>> object, Node* index_node,
- TNode<Object> value, WriteBarrierMode barrier_mode, int additional_offset,
- ParameterMode parameter_mode) {
- CSA_SLOW_ASSERT(
- this, Word32Or(IsFixedArraySubclass(object), IsPropertyArray(object)));
- CSA_SLOW_ASSERT(this, MatchesParameterMode(index_node, parameter_mode));
+ TNode<UnionT<FixedArray, PropertyArray>> object, TNode<TIndex> index_node,
+ TNode<Object> value, WriteBarrierMode barrier_mode, int additional_offset) {
+ // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants?
+ static_assert(std::is_same<TIndex, Smi>::value ||
+ std::is_same<TIndex, UintPtrT>::value ||
+ std::is_same<TIndex, IntPtrT>::value,
+ "Only Smi, UintPtrT or IntPtrT index is allowed");
DCHECK(barrier_mode == SKIP_WRITE_BARRIER ||
barrier_mode == UNSAFE_SKIP_WRITE_BARRIER ||
barrier_mode == UPDATE_WRITE_BARRIER ||
@@ -2727,8 +2702,8 @@ void CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement(
static_cast<int>(PropertyArray::kHeaderSize));
int header_size =
FixedArray::kHeaderSize + additional_offset - kHeapObjectTag;
- TNode<IntPtrT> offset = ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS,
- parameter_mode, header_size);
+ TNode<IntPtrT> offset =
+ ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS, header_size);
STATIC_ASSERT(static_cast<int>(FixedArrayBase::kLengthOffset) ==
static_cast<int>(WeakFixedArray::kLengthOffset));
STATIC_ASSERT(static_cast<int>(FixedArrayBase::kLengthOffset) ==
@@ -2764,22 +2739,45 @@ void CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement(
}
}
+template V8_EXPORT_PRIVATE void
+CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement<Smi>(
+ TNode<UnionT<FixedArray, PropertyArray>>, TNode<Smi>, TNode<Object>,
+ WriteBarrierMode, int);
+
+template V8_EXPORT_PRIVATE void
+CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement<IntPtrT>(
+ TNode<UnionT<FixedArray, PropertyArray>>, TNode<IntPtrT>, TNode<Object>,
+ WriteBarrierMode, int);
+
+template V8_EXPORT_PRIVATE void
+CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement<UintPtrT>(
+ TNode<UnionT<FixedArray, PropertyArray>>, TNode<UintPtrT>, TNode<Object>,
+ WriteBarrierMode, int);
+
+template <typename TIndex>
void CodeStubAssembler::StoreFixedDoubleArrayElement(
- TNode<FixedDoubleArray> object, Node* index_node, TNode<Float64T> value,
- ParameterMode parameter_mode, CheckBounds check_bounds) {
- CSA_SLOW_ASSERT(this, MatchesParameterMode(index_node, parameter_mode));
+ TNode<FixedDoubleArray> object, TNode<TIndex> index, TNode<Float64T> value,
+ CheckBounds check_bounds) {
+ // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants?
+ static_assert(std::is_same<TIndex, Smi>::value ||
+ std::is_same<TIndex, UintPtrT>::value ||
+ std::is_same<TIndex, IntPtrT>::value,
+ "Only Smi, UintPtrT or IntPtrT index is allowed");
if (NeedsBoundsCheck(check_bounds)) {
- FixedArrayBoundsCheck(object, index_node, 0, parameter_mode);
+ FixedArrayBoundsCheck(object, index, 0);
}
- TNode<IntPtrT> offset =
- ElementOffsetFromIndex(index_node, PACKED_DOUBLE_ELEMENTS, parameter_mode,
- FixedArray::kHeaderSize - kHeapObjectTag);
+ TNode<IntPtrT> offset = ElementOffsetFromIndex(
+ index, PACKED_DOUBLE_ELEMENTS, FixedArray::kHeaderSize - kHeapObjectTag);
MachineRepresentation rep = MachineRepresentation::kFloat64;
// Make sure we do not store signalling NaNs into double arrays.
TNode<Float64T> value_silenced = Float64SilenceNaN(value);
StoreNoWriteBarrier(rep, object, offset, value_silenced);
}
+// Export the Smi version which is used outside of code-stub-assembler.
+template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreFixedDoubleArrayElement<
+ Smi>(TNode<FixedDoubleArray>, TNode<Smi>, TNode<Float64T>, CheckBounds);
+
void CodeStubAssembler::StoreFeedbackVectorSlot(
TNode<FeedbackVector> feedback_vector, TNode<UintPtrT> slot,
TNode<AnyTaggedT> value, WriteBarrierMode barrier_mode,
@@ -2788,8 +2786,8 @@ void CodeStubAssembler::StoreFeedbackVectorSlot(
DCHECK(barrier_mode == SKIP_WRITE_BARRIER ||
barrier_mode == UNSAFE_SKIP_WRITE_BARRIER ||
barrier_mode == UPDATE_WRITE_BARRIER);
- int header_size =
- FeedbackVector::kFeedbackSlotsOffset + additional_offset - kHeapObjectTag;
+ int header_size = FeedbackVector::kRawFeedbackSlotsOffset +
+ additional_offset - kHeapObjectTag;
TNode<IntPtrT> offset =
ElementOffsetFromIndex(Signed(slot), HOLEY_ELEMENTS, header_size);
// Check that slot <= feedback_vector.length.
@@ -2900,12 +2898,10 @@ void CodeStubAssembler::TryStoreArrayElement(ElementsKind kind, Label* bailout,
GotoIfNotNumber(value, bailout);
}
- ParameterMode mode = OptimalParameterMode();
if (IsDoubleElementsKind(kind)) {
- StoreElement(elements, kind, index, ChangeNumberToFloat64(CAST(value)),
- mode);
+ StoreElement(elements, kind, index, ChangeNumberToFloat64(CAST(value)));
} else {
- StoreElement(elements, kind, index, value, mode);
+ StoreElement(elements, kind, index, value);
}
}
@@ -3040,18 +3036,16 @@ void CodeStubAssembler::StoreBigIntDigit(TNode<BigInt> bigint,
TNode<Word32T> CodeStubAssembler::LoadBigIntBitfield(TNode<BigInt> bigint) {
return UncheckedCast<Word32T>(
- LoadObjectField(bigint, BigInt::kBitfieldOffset, MachineType::Uint32()));
+ LoadObjectField<Uint32T>(bigint, BigInt::kBitfieldOffset));
}
TNode<UintPtrT> CodeStubAssembler::LoadBigIntDigit(TNode<BigInt> bigint,
intptr_t digit_index) {
CHECK_LE(0, digit_index);
CHECK_LT(digit_index, BigInt::kMaxLength);
- return UncheckedCast<UintPtrT>(
- LoadObjectField(bigint,
- BigInt::kDigitsOffset +
- static_cast<int>(digit_index) * kSystemPointerSize,
- MachineType::UintPtr()));
+ return LoadObjectField<UintPtrT>(
+ bigint, BigInt::kDigitsOffset +
+ static_cast<int>(digit_index) * kSystemPointerSize);
}
TNode<UintPtrT> CodeStubAssembler::LoadBigIntDigit(TNode<BigInt> bigint,
@@ -3059,8 +3053,7 @@ TNode<UintPtrT> CodeStubAssembler::LoadBigIntDigit(TNode<BigInt> bigint,
TNode<IntPtrT> offset =
IntPtrAdd(IntPtrConstant(BigInt::kDigitsOffset),
IntPtrMul(digit_index, IntPtrConstant(kSystemPointerSize)));
- return UncheckedCast<UintPtrT>(
- LoadObjectField(bigint, offset, MachineType::UintPtr()));
+ return LoadObjectField<UintPtrT>(bigint, offset);
}
TNode<ByteArray> CodeStubAssembler::AllocateByteArray(TNode<UintPtrT> length,
@@ -3650,7 +3643,7 @@ TNode<JSArray> CodeStubAssembler::AllocateJSArray(
BIND(&nonempty);
{
FillFixedArrayWithValue(kind, elements, IntPtrConstant(0), capacity,
- RootIndex::kTheHoleValue, INTPTR_PARAMETERS);
+ RootIndex::kTheHoleValue);
Goto(&out);
}
@@ -3776,10 +3769,8 @@ TNode<FixedArrayBase> CodeStubAssembler::AllocateFixedArray(
const intptr_t kMaxLength = IsDoubleElementsKind(kind)
? FixedDoubleArray::kMaxLength
: FixedArray::kMaxLength;
- const ParameterMode parameter_mode =
- std::is_same<TIndex, Smi>::value ? SMI_PARAMETERS : INTPTR_PARAMETERS;
intptr_t capacity_constant;
- if (ToParameterConstant(capacity, &capacity_constant, parameter_mode)) {
+ if (ToParameterConstant(capacity, &capacity_constant)) {
CHECK_LE(capacity_constant, kMaxLength);
} else {
Label if_out_of_memory(this, Label::kDeferred), next(this);
@@ -3885,9 +3876,6 @@ TNode<FixedArray> CodeStubAssembler::ExtractToFixedArray(
}
}
- const ParameterMode parameter_mode =
- std::is_same<TIndex, Smi>::value ? SMI_PARAMETERS : INTPTR_PARAMETERS;
-
BIND(&new_space_check);
{
bool handle_old_space = !FLAG_young_generation_large_objects;
@@ -3899,8 +3887,7 @@ TNode<FixedArray> CodeStubAssembler::ExtractToFixedArray(
} else {
int constant_count;
handle_old_space =
- !TryGetIntPtrOrSmiConstantValue(count, &constant_count,
- parameter_mode) ||
+ !TryGetIntPtrOrSmiConstantValue(count, &constant_count) ||
(constant_count >
FixedArray::GetMaxLengthForNewSpaceAllocation(PACKED_ELEMENTS));
}
@@ -3941,7 +3928,7 @@ TNode<FixedArray> CodeStubAssembler::ExtractToFixedArray(
// convert any values. Since {to_elements} is in new-space, CopyElements
// will efficiently use memcpy.
FillFixedArrayWithValue(to_kind, to_elements, count, capacity,
- RootIndex::kTheHoleValue, parameter_mode);
+ RootIndex::kTheHoleValue);
CopyElements(to_kind, to_elements, IntPtrConstant(0), source,
ParameterToIntPtr(first), ParameterToIntPtr(count),
SKIP_WRITE_BARRIER);
@@ -3971,7 +3958,7 @@ TNode<FixedArray> CodeStubAssembler::ExtractToFixedArray(
var_result = to_elements;
FillFixedArrayWithValue(to_smi_kind, to_elements, count, capacity,
- RootIndex::kTheHoleValue, parameter_mode);
+ RootIndex::kTheHoleValue);
// CopyElements will try to use memcpy if it's not conflicting with
// GC. Otherwise it will copy elements by elements, but skip write
// barriers (since we're copying smis to smis).
@@ -4014,9 +4001,6 @@ TNode<FixedArrayBase> CodeStubAssembler::ExtractFixedDoubleArrayFillingHoles(
DCHECK_NE(var_holes_converted, nullptr);
CSA_ASSERT(this, IsFixedDoubleArrayMap(fixed_array_map));
- const ParameterMode parameter_mode =
- std::is_same<TIndex, Smi>::value ? SMI_PARAMETERS : INTPTR_PARAMETERS;
-
TVARIABLE(FixedArrayBase, var_result);
const ElementsKind kind = PACKED_DOUBLE_ELEMENTS;
TNode<FixedArrayBase> to_elements =
@@ -4035,7 +4019,7 @@ TNode<FixedArrayBase> CodeStubAssembler::ExtractFixedDoubleArrayFillingHoles(
// This copy can trigger GC, so we pre-initialize the array with holes.
FillFixedArrayWithValue(kind, to_elements, IntPtrOrSmiConstant<TIndex>(0),
- capacity, RootIndex::kTheHoleValue, parameter_mode);
+ capacity, RootIndex::kTheHoleValue);
const int first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag;
TNode<IntPtrT> first_from_element_offset =
@@ -4142,8 +4126,6 @@ TNode<FixedArrayBase> CodeStubAssembler::ExtractFixedArray(
}
}
- const ParameterMode parameter_mode =
- std::is_same<TIndex, Smi>::value ? SMI_PARAMETERS : INTPTR_PARAMETERS;
if (extract_flags & ExtractFixedArrayFlag::kFixedArrays) {
// Here we can only get |source| as FixedArray, never FixedDoubleArray.
// PACKED_ELEMENTS is used to signify that the source is a FixedArray.
@@ -4172,10 +4154,9 @@ TNode<FixedArrayBase> CodeStubAssembler::ExtractFixedArray(
TNode<FixedArrayBase> to_elements =
AllocateFixedArray(kind, *capacity, allocation_flags, source_map);
FillFixedArrayWithValue(kind, to_elements, *count, *capacity,
- RootIndex::kTheHoleValue, parameter_mode);
+ RootIndex::kTheHoleValue);
CopyElements(kind, to_elements, IntPtrConstant(0), source,
- ParameterToIntPtr(*first, parameter_mode),
- ParameterToIntPtr(*count, parameter_mode));
+ ParameterToIntPtr(*first), ParameterToIntPtr(*count));
var_result = to_elements;
}
@@ -4240,17 +4221,18 @@ void CodeStubAssembler::FillPropertyArrayWithUndefined(
[this, value](TNode<HeapObject> array, TNode<IntPtrT> offset) {
StoreNoWriteBarrier(MachineRepresentation::kTagged, array, offset,
value);
- },
- INTPTR_PARAMETERS);
+ });
}
+template <typename TIndex>
void CodeStubAssembler::FillFixedArrayWithValue(ElementsKind kind,
TNode<FixedArrayBase> array,
- Node* from_node, Node* to_node,
- RootIndex value_root_index,
- ParameterMode mode) {
- CSA_SLOW_ASSERT(this, MatchesParameterMode(from_node, mode));
- CSA_SLOW_ASSERT(this, MatchesParameterMode(to_node, mode));
+ TNode<TIndex> from_index,
+ TNode<TIndex> to_index,
+ RootIndex value_root_index) {
+ static_assert(
+ std::is_same<TIndex, Smi>::value || std::is_same<TIndex, IntPtrT>::value,
+ "Only Smi or IntPtrT from and to are allowed");
CSA_SLOW_ASSERT(this, IsFixedArrayWithKind(array, kind));
DCHECK(value_root_index == RootIndex::kTheHoleValue ||
value_root_index == RootIndex::kUndefinedValue);
@@ -4264,7 +4246,7 @@ void CodeStubAssembler::FillFixedArrayWithValue(ElementsKind kind,
}
BuildFastArrayForEach(
- array, kind, from_node, to_node,
+ array, kind, from_index, to_index,
[this, value, float_value, kind](TNode<HeapObject> array,
TNode<IntPtrT> offset) {
if (IsDoubleElementsKind(kind)) {
@@ -4274,10 +4256,18 @@ void CodeStubAssembler::FillFixedArrayWithValue(ElementsKind kind,
StoreNoWriteBarrier(MachineRepresentation::kTagged, array, offset,
value);
}
- },
- mode);
+ });
}
+template V8_EXPORT_PRIVATE void
+ CodeStubAssembler::FillFixedArrayWithValue<IntPtrT>(ElementsKind,
+ TNode<FixedArrayBase>,
+ TNode<IntPtrT>,
+ TNode<IntPtrT>,
+ RootIndex);
+template V8_EXPORT_PRIVATE void CodeStubAssembler::FillFixedArrayWithValue<Smi>(
+ ElementsKind, TNode<FixedArrayBase>, TNode<Smi>, TNode<Smi>, RootIndex);
+
void CodeStubAssembler::StoreDoubleHole(TNode<HeapObject> object,
TNode<IntPtrT> offset) {
TNode<UintPtrT> double_hole =
@@ -4436,14 +4426,14 @@ void CodeStubAssembler::MoveElements(ElementsKind kind,
{
// Make a loop for the stores.
BuildFastArrayForEach(elements, kind, begin, end, loop_body,
- INTPTR_PARAMETERS, ForEachDirection::kForward);
+ ForEachDirection::kForward);
Goto(&finished);
}
BIND(&iterate_backward);
{
BuildFastArrayForEach(elements, kind, begin, end, loop_body,
- INTPTR_PARAMETERS, ForEachDirection::kReverse);
+ ForEachDirection::kReverse);
Goto(&finished);
}
}
@@ -4523,7 +4513,7 @@ void CodeStubAssembler::CopyElements(ElementsKind kind,
Store(dst_elements, delta_offset, element);
}
},
- INTPTR_PARAMETERS, ForEachDirection::kForward);
+ ForEachDirection::kForward);
Goto(&finished);
}
BIND(&finished);
@@ -4569,8 +4559,6 @@ void CodeStubAssembler::CopyFixedArrayElements(
Is64() ? ReinterpretCast<UintPtrT>(Int64Constant(kHoleNanInt64))
: ReinterpretCast<UintPtrT>(Int32Constant(kHoleNanLower32));
- const ParameterMode mode =
- std::is_same<TIndex, Smi>::value ? SMI_PARAMETERS : INTPTR_PARAMETERS;
// If copying might trigger a GC, we pre-initialize the FixedArray such that
// it's always in a consistent state.
if (convert_holes == HoleConversionMode::kConvertToUndefined) {
@@ -4579,17 +4567,17 @@ void CodeStubAssembler::CopyFixedArrayElements(
// Later if we run into a hole in the source we can just skip the writing
// to the target and are still guaranteed that we get an undefined.
FillFixedArrayWithValue(to_kind, to_array, IntPtrOrSmiConstant<TIndex>(0),
- element_count, RootIndex::kUndefinedValue, mode);
+ element_count, RootIndex::kUndefinedValue);
FillFixedArrayWithValue(to_kind, to_array, element_count, capacity,
- RootIndex::kTheHoleValue, mode);
+ RootIndex::kTheHoleValue);
} else if (doubles_to_objects_conversion) {
// Pre-initialized the target with holes so later if we run into a hole in
// the source we can just skip the writing to the target.
FillFixedArrayWithValue(to_kind, to_array, IntPtrOrSmiConstant<TIndex>(0),
- capacity, RootIndex::kTheHoleValue, mode);
+ capacity, RootIndex::kTheHoleValue);
} else if (element_count != capacity) {
FillFixedArrayWithValue(to_kind, to_array, element_count, capacity,
- RootIndex::kTheHoleValue, mode);
+ RootIndex::kTheHoleValue);
}
TNode<IntPtrT> first_from_element_offset =
@@ -4754,8 +4742,7 @@ void CodeStubAssembler::CopyPropertyArrayValues(TNode<HeapObject> from_array,
StoreNoWriteBarrier(MachineRepresentation::kTagged, to_array, offset,
value);
}
- },
- INTPTR_PARAMETERS);
+ });
#ifdef DEBUG
// Zap {from_array} if the copying above has made it invalid.
@@ -6769,6 +6756,12 @@ TNode<String> CodeStubAssembler::NumberToString(TNode<Number> input) {
return result.value();
}
+// TODO(solanes, v8:6949): Refactor this to check for JSReceivers first. If we
+// have a JSReceiver, extract the primitive and fallthrough. Otherwise, continue
+// asking for the other instance types. This will make it so that we can remove
+// the loop (which was looping at most once). Also, see if we can make use of
+// PlainPrimitiveNonNumberToNumber to de-duplicate code, maybe changing it to a
+// TryPlainPrimitiveNonNumberToNumber with a Label* as a parameter.
TNode<Numeric> CodeStubAssembler::NonNumberToNumberOrNumeric(
TNode<Context> context, TNode<HeapObject> input, Object::Conversion mode,
BigIntHandling bigint_handling) {
@@ -6806,7 +6799,6 @@ TNode<Numeric> CodeStubAssembler::NonNumberToNumberOrNumeric(
}
BIND(&if_inputisbigint);
- CSA_ASSERT(this, Word32And(TaggedIsNotSmi(context), IsContext(context)));
if (mode == Object::Conversion::kToNumeric) {
var_result = CAST(input);
Goto(&end);
@@ -6831,9 +6823,9 @@ TNode<Numeric> CodeStubAssembler::NonNumberToNumberOrNumeric(
BIND(&if_inputisreceiver);
{
- CSA_ASSERT(this, Word32And(TaggedIsNotSmi(context), IsContext(context)));
- // The {input} is a JSReceiver, we need to convert it to a Primitive first
- // using the ToPrimitive type conversion, preferably yielding a Number.
+ // The {input} is a JSReceiver, we need to convert it to a Primitive
+ // first using the ToPrimitive type conversion, preferably yielding a
+ // Number.
Callable callable = CodeFactory::NonPrimitiveToPrimitive(
isolate(), ToPrimitiveHint::kNumber);
TNode<Object> result = CallStub(callable, context, input);
@@ -6846,15 +6838,16 @@ TNode<Numeric> CodeStubAssembler::NonNumberToNumberOrNumeric(
BIND(&if_done);
{
- // The ToPrimitive conversion already gave us a Number/Numeric, so we're
- // done.
+ // The ToPrimitive conversion already gave us a Number/Numeric, so
+ // we're done.
var_result = CAST(result);
Goto(&end);
}
BIND(&if_notdone);
{
- // We now have a Primitive {result}, but it's not yet a Number/Numeric.
+ // We now have a Primitive {result}, but it's not yet a
+ // Number/Numeric.
var_input = CAST(result);
Goto(&loop);
}
@@ -6862,7 +6855,6 @@ TNode<Numeric> CodeStubAssembler::NonNumberToNumberOrNumeric(
BIND(&if_inputisother);
{
- CSA_ASSERT(this, Word32And(TaggedIsNotSmi(context), IsContext(context)));
// The {input} is something else (e.g. Symbol), let the runtime figure
// out the correct exception.
// Note: We cannot tail call to the runtime here, as js-to-wasm
@@ -6887,14 +6879,46 @@ TNode<Numeric> CodeStubAssembler::NonNumberToNumberOrNumeric(
}
TNode<Number> CodeStubAssembler::NonNumberToNumber(
- SloppyTNode<Context> context, SloppyTNode<HeapObject> input,
+ TNode<Context> context, SloppyTNode<HeapObject> input,
BigIntHandling bigint_handling) {
return CAST(NonNumberToNumberOrNumeric(
context, input, Object::Conversion::kToNumber, bigint_handling));
}
+TNode<Number> CodeStubAssembler::PlainPrimitiveNonNumberToNumber(
+ TNode<HeapObject> input) {
+ CSA_ASSERT(this, Word32BinaryNot(IsHeapNumber(input)));
+ TVARIABLE(Number, var_result);
+ Label done(this);
+
+ // Dispatch on the {input} instance type.
+ TNode<Uint16T> input_instance_type = LoadInstanceType(input);
+ Label if_inputisstring(this), if_inputisoddball(this);
+ GotoIf(IsStringInstanceType(input_instance_type), &if_inputisstring);
+ CSA_ASSERT(this, InstanceTypeEqual(input_instance_type, ODDBALL_TYPE));
+ Goto(&if_inputisoddball);
+
+ BIND(&if_inputisstring);
+ {
+ // The {input} is a String, use the fast stub to convert it to a Number.
+ TNode<String> string_input = CAST(input);
+ var_result = StringToNumber(string_input);
+ Goto(&done);
+ }
+
+ BIND(&if_inputisoddball);
+ {
+ // The {input} is an Oddball, we just need to load the Number value of it.
+ var_result = LoadObjectField<Number>(input, Oddball::kToNumberOffset);
+ Goto(&done);
+ }
+
+ BIND(&done);
+ return var_result.value();
+}
+
TNode<Numeric> CodeStubAssembler::NonNumberToNumeric(
- SloppyTNode<Context> context, SloppyTNode<HeapObject> input) {
+ TNode<Context> context, SloppyTNode<HeapObject> input) {
return NonNumberToNumberOrNumeric(context, input,
Object::Conversion::kToNumeric);
}
@@ -6923,7 +6947,7 @@ TNode<Number> CodeStubAssembler::ToNumber_Inline(SloppyTNode<Context> context,
return var_result.value();
}
-TNode<Number> CodeStubAssembler::ToNumber(SloppyTNode<Context> context,
+TNode<Number> CodeStubAssembler::ToNumber(TNode<Context> context,
SloppyTNode<Object> input,
BigIntHandling bigint_handling) {
TVARIABLE(Number, var_result);
@@ -6956,6 +6980,37 @@ TNode<Number> CodeStubAssembler::ToNumber(SloppyTNode<Context> context,
return var_result.value();
}
+TNode<Number> CodeStubAssembler::PlainPrimitiveToNumber(TNode<Object> input) {
+ TVARIABLE(Number, var_result);
+ Label end(this);
+
+ Label not_smi(this, Label::kDeferred);
+ GotoIfNot(TaggedIsSmi(input), &not_smi);
+ TNode<Smi> input_smi = CAST(input);
+ var_result = input_smi;
+ Goto(&end);
+
+ BIND(&not_smi);
+ {
+ Label not_heap_number(this, Label::kDeferred);
+ TNode<HeapObject> input_ho = CAST(input);
+ GotoIfNot(IsHeapNumber(input_ho), &not_heap_number);
+
+ TNode<HeapNumber> input_hn = CAST(input_ho);
+ var_result = input_hn;
+ Goto(&end);
+
+ BIND(&not_heap_number);
+ {
+ var_result = PlainPrimitiveNonNumberToNumber(input_ho);
+ Goto(&end);
+ }
+ }
+
+ BIND(&end);
+ return var_result.value();
+}
+
TNode<BigInt> CodeStubAssembler::ToBigInt(TNode<Context> context,
TNode<Object> input) {
TVARIABLE(BigInt, var_result);
@@ -7429,7 +7484,7 @@ template <typename T>
TNode<T> CodeStubAssembler::LoadDescriptorArrayElement(
TNode<DescriptorArray> object, TNode<IntPtrT> index,
int additional_offset) {
- return LoadArrayElement<DescriptorArray, T>(
+ return LoadArrayElement<DescriptorArray, IntPtrT, T>(
object, DescriptorArray::kHeaderSize, index, additional_offset);
}
@@ -7967,7 +8022,7 @@ void CodeStubAssembler::LookupBinary(TNode<Name> unique_name,
TNode<Uint32T> limit =
Unsigned(Int32Sub(NumberOfEntries<Array>(array), Int32Constant(1)));
TVARIABLE(Uint32T, var_high, limit);
- TNode<Uint32T> hash = LoadNameHashField(unique_name);
+ TNode<Uint32T> hash = LoadNameHashAssumeComputed(unique_name);
CSA_ASSERT(this, Word32NotEqual(hash, Int32Constant(0)));
// Assume non-empty array.
@@ -7985,7 +8040,7 @@ void CodeStubAssembler::LookupBinary(TNode<Name> unique_name,
TNode<Uint32T> sorted_key_index = GetSortedKeyIndex<Array>(array, mid);
TNode<Name> mid_name = GetKey<Array>(array, sorted_key_index);
- TNode<Uint32T> mid_hash = LoadNameHashField(mid_name);
+ TNode<Uint32T> mid_hash = LoadNameHashAssumeComputed(mid_name);
Label mid_greater(this), mid_less(this), merge(this);
Branch(Uint32GreaterThanOrEqual(mid_hash, hash), &mid_greater, &mid_less);
@@ -8012,7 +8067,7 @@ void CodeStubAssembler::LookupBinary(TNode<Name> unique_name,
TNode<Uint32T> sort_index =
GetSortedKeyIndex<Array>(array, var_low.value());
TNode<Name> current_name = GetKey<Array>(array, sort_index);
- TNode<Uint32T> current_hash = LoadNameHashField(current_name);
+ TNode<Uint32T> current_hash = LoadNameHashAssumeComputed(current_name);
GotoIf(Word32NotEqual(current_hash, hash), if_not_found);
Label next(this);
GotoIf(TaggedNotEqual(current_name, unique_name), &next);
@@ -8169,7 +8224,7 @@ void CodeStubAssembler::ForEachEnumerableOwnProperty(
{
Label slow_load(this, Label::kDeferred);
- var_value = CallGetterIfAccessor(var_value.value(),
+ var_value = CallGetterIfAccessor(var_value.value(), object,
var_details.value(), context,
object, &slow_load, kCallJSGetter);
Goto(&callback);
@@ -8571,12 +8626,14 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary(
Comment("] LoadPropertyFromGlobalDictionary");
}
-// |value| is the property backing store's contents, which is either a value
-// or an accessor pair, as specified by |details|.
-// Returns either the original value, or the result of the getter call.
+// |value| is the property backing store's contents, which is either a value or
+// an accessor pair, as specified by |details|. |holder| is a JSObject or a
+// PropertyCell (TODO: use UnionT). Returns either the original value, or the
+// result of the getter call.
TNode<Object> CodeStubAssembler::CallGetterIfAccessor(
- TNode<Object> value, TNode<Uint32T> details, TNode<Context> context,
- TNode<Object> receiver, Label* if_bailout, GetOwnPropertyMode mode) {
+ TNode<Object> value, TNode<HeapObject> holder, TNode<Uint32T> details,
+ TNode<Context> context, TNode<Object> receiver, Label* if_bailout,
+ GetOwnPropertyMode mode) {
TVARIABLE(Object, var_value, value);
Label done(this), if_accessor_info(this, Label::kDeferred);
@@ -8616,7 +8673,7 @@ TNode<Object> CodeStubAssembler::CallGetterIfAccessor(
GotoIfNot(IsTheHole(cached_property_name), if_bailout);
TNode<NativeContext> creation_context =
- GetCreationContext(CAST(receiver), if_bailout);
+ GetCreationContext(CAST(holder), if_bailout);
var_value = CallBuiltin(
Builtins::kCallFunctionTemplate_CheckAccessAndCompatibleReceiver,
creation_context, getter, IntPtrConstant(0), receiver);
@@ -8630,17 +8687,16 @@ TNode<Object> CodeStubAssembler::CallGetterIfAccessor(
// AccessorInfo case.
BIND(&if_accessor_info);
{
- CSA_ASSERT(this, TaggedIsNotSmi(receiver));
TNode<AccessorInfo> accessor_info = CAST(value);
Label if_array(this), if_function(this), if_wrapper(this);
- // Dispatch based on {receiver} instance type.
- TNode<Map> receiver_map = LoadMap(CAST(receiver));
- TNode<Uint16T> receiver_instance_type = LoadMapInstanceType(receiver_map);
- GotoIf(IsJSArrayInstanceType(receiver_instance_type), &if_array);
- GotoIf(IsJSFunctionInstanceType(receiver_instance_type), &if_function);
- Branch(IsJSPrimitiveWrapperInstanceType(receiver_instance_type),
- &if_wrapper, if_bailout);
+ // Dispatch based on {holder} instance type.
+ TNode<Map> holder_map = LoadMap(holder);
+ TNode<Uint16T> holder_instance_type = LoadMapInstanceType(holder_map);
+ GotoIf(IsJSArrayInstanceType(holder_instance_type), &if_array);
+ GotoIf(IsJSFunctionInstanceType(holder_instance_type), &if_function);
+ Branch(IsJSPrimitiveWrapperInstanceType(holder_instance_type), &if_wrapper,
+ if_bailout);
// JSArray AccessorInfo case.
BIND(&if_array);
@@ -8649,7 +8705,7 @@ TNode<Object> CodeStubAssembler::CallGetterIfAccessor(
GotoIfNot(IsLengthString(
LoadObjectField(accessor_info, AccessorInfo::kNameOffset)),
if_bailout);
- TNode<JSArray> array = CAST(receiver);
+ TNode<JSArray> array = CAST(holder);
var_value = LoadJSArrayLength(array);
Goto(&done);
}
@@ -8662,9 +8718,9 @@ TNode<Object> CodeStubAssembler::CallGetterIfAccessor(
LoadObjectField(accessor_info, AccessorInfo::kNameOffset)),
if_bailout);
- GotoIfPrototypeRequiresRuntimeLookup(CAST(receiver), receiver_map,
- if_bailout);
- var_value = LoadJSFunctionPrototype(CAST(receiver), if_bailout);
+ TNode<JSFunction> function = CAST(holder);
+ GotoIfPrototypeRequiresRuntimeLookup(function, holder_map, if_bailout);
+ var_value = LoadJSFunctionPrototype(function, if_bailout);
Goto(&done);
}
@@ -8676,11 +8732,10 @@ TNode<Object> CodeStubAssembler::CallGetterIfAccessor(
GotoIfNot(IsLengthString(
LoadObjectField(accessor_info, AccessorInfo::kNameOffset)),
if_bailout);
- TNode<Object> receiver_value =
- LoadJSPrimitiveWrapperValue(CAST(receiver));
- GotoIfNot(TaggedIsNotSmi(receiver_value), if_bailout);
- GotoIfNot(IsString(CAST(receiver_value)), if_bailout);
- var_value = LoadStringLengthAsSmi(CAST(receiver_value));
+ TNode<Object> holder_value = LoadJSPrimitiveWrapperValue(CAST(holder));
+ GotoIfNot(TaggedIsNotSmi(holder_value), if_bailout);
+ GotoIfNot(IsString(CAST(holder_value)), if_bailout);
+ var_value = LoadStringLengthAsSmi(CAST(holder_value));
Goto(&done);
}
}
@@ -8756,8 +8811,8 @@ void CodeStubAssembler::TryGetOwnProperty(
*var_raw_value = *var_value;
}
TNode<Object> value =
- CallGetterIfAccessor(var_value->value(), var_details->value(), context,
- receiver, if_bailout, mode);
+ CallGetterIfAccessor(var_value->value(), object, var_details->value(),
+ context, receiver, if_bailout, mode);
*var_value = value;
Goto(if_found_value);
}
@@ -9173,21 +9228,6 @@ TNode<Oddball> CodeStubAssembler::OrdinaryHasInstance(
return var_result.value();
}
-TNode<IntPtrT> CodeStubAssembler::ElementOffsetFromIndex(Node* index_node,
- ElementsKind kind,
- ParameterMode mode,
- int base_size) {
- CSA_SLOW_ASSERT(this, MatchesParameterMode(index_node, mode));
- if (mode == SMI_PARAMETERS) {
- return ElementOffsetFromIndex(ReinterpretCast<Smi>(index_node), kind,
- base_size);
- } else {
- DCHECK(mode == INTPTR_PARAMETERS);
- return ElementOffsetFromIndex(ReinterpretCast<IntPtrT>(index_node), kind,
- base_size);
- }
-}
-
template <typename TIndex>
TNode<IntPtrT> CodeStubAssembler::ElementOffsetFromIndex(
TNode<TIndex> index_node, ElementsKind kind, int base_size) {
@@ -9482,11 +9522,16 @@ MachineRepresentation ElementsKindToMachineRepresentation(ElementsKind kind) {
} // namespace
+template <typename TIndex>
void CodeStubAssembler::StoreElement(Node* elements, ElementsKind kind,
- Node* index, Node* value,
- ParameterMode mode) {
+ TNode<TIndex> index, Node* value) {
+ // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants?
+ static_assert(std::is_same<TIndex, Smi>::value ||
+ std::is_same<TIndex, UintPtrT>::value ||
+ std::is_same<TIndex, IntPtrT>::value,
+ "Only Smi, UintPtrT or IntPtrT index is allowed");
if (kind == BIGINT64_ELEMENTS || kind == BIGUINT64_ELEMENTS) {
- TNode<IntPtrT> offset = ElementOffsetFromIndex(index, kind, mode, 0);
+ TNode<IntPtrT> offset = ElementOffsetFromIndex(index, kind, 0);
TVARIABLE(UintPtrT, var_low);
// Only used on 32-bit platforms.
TVARIABLE(UintPtrT, var_high);
@@ -9515,22 +9560,31 @@ void CodeStubAssembler::StoreElement(Node* elements, ElementsKind kind,
CSA_ASSERT(this, Word32Equal(UncheckedCast<Word32T>(value),
Word32And(Int32Constant(0xFF), value)));
}
- TNode<IntPtrT> offset = ElementOffsetFromIndex(index, kind, mode, 0);
+ TNode<IntPtrT> offset = ElementOffsetFromIndex(index, kind, 0);
// TODO(cbruni): Add OOB check once typed.
MachineRepresentation rep = ElementsKindToMachineRepresentation(kind);
StoreNoWriteBarrier(rep, elements, offset, value);
return;
} else if (IsDoubleElementsKind(kind)) {
TNode<Float64T> value_float64 = UncheckedCast<Float64T>(value);
- StoreFixedDoubleArrayElement(CAST(elements), index, value_float64, mode);
+ StoreFixedDoubleArrayElement(CAST(elements), index, value_float64);
} else {
WriteBarrierMode barrier_mode = IsSmiElementsKind(kind)
? UNSAFE_SKIP_WRITE_BARRIER
: UPDATE_WRITE_BARRIER;
- StoreFixedArrayElement(CAST(elements), index, value, barrier_mode, 0, mode);
+ StoreFixedArrayElement(CAST(elements), index, value, barrier_mode, 0);
}
}
+template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreElement<Smi>(
+ Node*, ElementsKind, TNode<Smi>, Node*);
+
+template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreElement<IntPtrT>(
+ Node*, ElementsKind, TNode<IntPtrT>, Node*);
+
+template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreElement<UintPtrT>(
+ Node*, ElementsKind, TNode<UintPtrT>, Node*);
+
TNode<Uint8T> CodeStubAssembler::Int32ToUint8Clamped(
TNode<Int32T> int32_value) {
Label done(this);
@@ -9801,8 +9855,7 @@ void CodeStubAssembler::EmitElementStore(
GotoIf(IsFixedCOWArrayMap(LoadMap(elements)), bailout);
}
- // TODO(ishell): introduce TryToIntPtrOrSmi() and use OptimalParameterMode().
- ParameterMode parameter_mode = INTPTR_PARAMETERS;
+ // TODO(ishell): introduce TryToIntPtrOrSmi() and use BInt.
TNode<IntPtrT> intptr_key = TryToIntptr(key, bailout);
// TODO(rmcilroy): TNodify the converted value once this funciton and
@@ -9843,8 +9896,7 @@ void CodeStubAssembler::EmitElementStore(
}
TNode<RawPtrT> data_ptr = LoadJSTypedArrayDataPtr(typed_array);
- StoreElement(data_ptr, elements_kind, intptr_key, converted_value,
- parameter_mode);
+ StoreElement(data_ptr, elements_kind, intptr_key, converted_value);
Goto(&done);
BIND(&update_value_and_bailout);
@@ -9968,8 +10020,7 @@ void CodeStubAssembler::EmitElementStore(
}
CSA_ASSERT(this, Word32BinaryNot(IsFixedCOWArrayMap(LoadMap(elements))));
- StoreElement(elements, elements_kind, intptr_key, converted_value,
- parameter_mode);
+ StoreElement(elements, elements_kind, intptr_key, converted_value);
}
TNode<FixedArrayBase> CodeStubAssembler::CheckForCapacityGrow(
@@ -10222,9 +10273,9 @@ TNode<MaybeObject> CodeStubAssembler::StoreWeakReferenceInFeedbackVector(
return weak_value;
}
-TNode<BoolT> CodeStubAssembler::NotHasBoilerplate(
+TNode<BoolT> CodeStubAssembler::HasBoilerplate(
TNode<Object> maybe_literal_site) {
- return TaggedIsSmi(maybe_literal_site);
+ return TaggedIsNotSmi(maybe_literal_site);
}
TNode<Smi> CodeStubAssembler::LoadTransitionInfo(
@@ -10304,16 +10355,16 @@ template TNode<UintPtrT> CodeStubAssembler::BuildFastLoop<UintPtrT>(
TNode<UintPtrT> end_index, const FastLoopBody<UintPtrT>& body,
int increment, IndexAdvanceMode advance_mode);
+template <typename TIndex>
void CodeStubAssembler::BuildFastArrayForEach(
- const CodeStubAssembler::VariableList& vars, Node* fixed_array,
- ElementsKind kind, Node* first_element_inclusive,
- Node* last_element_exclusive, const FastArrayForEachBody& body,
- ParameterMode mode, ForEachDirection direction) {
+ TNode<UnionT<UnionT<FixedArray, PropertyArray>, HeapObject>> array,
+ ElementsKind kind, TNode<TIndex> first_element_inclusive,
+ TNode<TIndex> last_element_exclusive, const FastArrayForEachBody& body,
+ ForEachDirection direction) {
STATIC_ASSERT(FixedArray::kHeaderSize == FixedDoubleArray::kHeaderSize);
- CSA_SLOW_ASSERT(this, MatchesParameterMode(first_element_inclusive, mode));
- CSA_SLOW_ASSERT(this, MatchesParameterMode(last_element_exclusive, mode));
- CSA_SLOW_ASSERT(this, Word32Or(IsFixedArrayWithKind(fixed_array, kind),
- IsPropertyArray(fixed_array)));
+ CSA_SLOW_ASSERT(this, Word32Or(IsFixedArrayWithKind(array, kind),
+ IsPropertyArray(array)));
+
int32_t first_val;
bool constant_first = ToInt32Constant(first_element_inclusive, &first_val);
int32_t last_val;
@@ -10327,32 +10378,29 @@ void CodeStubAssembler::BuildFastArrayForEach(
TNode<IntPtrT> index = IntPtrConstant(i);
TNode<IntPtrT> offset = ElementOffsetFromIndex(
index, kind, FixedArray::kHeaderSize - kHeapObjectTag);
- body(CAST(fixed_array), offset);
+ body(array, offset);
}
} else {
for (int i = last_val - 1; i >= first_val; --i) {
TNode<IntPtrT> index = IntPtrConstant(i);
TNode<IntPtrT> offset = ElementOffsetFromIndex(
index, kind, FixedArray::kHeaderSize - kHeapObjectTag);
- body(CAST(fixed_array), offset);
+ body(array, offset);
}
}
return;
}
}
- TNode<IntPtrT> start =
- ElementOffsetFromIndex(first_element_inclusive, kind, mode,
- FixedArray::kHeaderSize - kHeapObjectTag);
- TNode<IntPtrT> limit =
- ElementOffsetFromIndex(last_element_exclusive, kind, mode,
- FixedArray::kHeaderSize - kHeapObjectTag);
+ TNode<IntPtrT> start = ElementOffsetFromIndex(
+ first_element_inclusive, kind, FixedArray::kHeaderSize - kHeapObjectTag);
+ TNode<IntPtrT> limit = ElementOffsetFromIndex(
+ last_element_exclusive, kind, FixedArray::kHeaderSize - kHeapObjectTag);
if (direction == ForEachDirection::kReverse) std::swap(start, limit);
int increment = IsDoubleElementsKind(kind) ? kDoubleSize : kTaggedSize;
BuildFastLoop<IntPtrT>(
- vars, start, limit,
- [&](TNode<IntPtrT> offset) { body(CAST(fixed_array), offset); },
+ start, limit, [&](TNode<IntPtrT> offset) { body(array, offset); },
direction == ForEachDirection::kReverse ? -increment : increment,
direction == ForEachDirection::kReverse ? IndexAdvanceMode::kPre
: IndexAdvanceMode::kPost);
diff --git a/deps/v8/src/codegen/code-stub-assembler.h b/deps/v8/src/codegen/code-stub-assembler.h
index de2c16d35f..8306b7e466 100644
--- a/deps/v8/src/codegen/code-stub-assembler.h
+++ b/deps/v8/src/codegen/code-stub-assembler.h
@@ -22,7 +22,7 @@
#include "src/objects/smi.h"
#include "src/objects/tagged-index.h"
#include "src/roots/roots.h"
-#include "torque-generated/exported-macros-assembler-tq.h"
+#include "torque-generated/exported-macros-assembler.h"
namespace v8 {
namespace internal {
@@ -290,6 +290,13 @@ enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol };
#define CSA_SLOW_ASSERT(csa, ...) ((void)0)
#endif
+// Provides a constexpr boolean to be used inside Torque.
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+constexpr bool kNoArgumentsAdaptor = true;
+#else
+constexpr bool kNoArgumentsAdaptor = false;
+#endif
+
// Provides JavaScript-specific "macro-assembler" functionality on top of the
// CodeAssembler. By factoring the JavaScript-isms out of the CodeAssembler,
// it's possible to add JavaScript-specific useful CodeAssembler "macros"
@@ -318,30 +325,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
using AllocationFlags = base::Flags<AllocationFlag>;
- enum ParameterMode { SMI_PARAMETERS, INTPTR_PARAMETERS };
-
- // On 32-bit platforms, there is a slight performance advantage to doing all
- // of the array offset/index arithmetic with SMIs, since it's possible
- // to save a few tag/untag operations without paying an extra expense when
- // calculating array offset (the smi math can be folded away) and there are
- // fewer live ranges. Thus only convert indices to untagged value on 64-bit
- // platforms.
- ParameterMode OptimalParameterMode() const {
-#if defined(BINT_IS_SMI)
- return SMI_PARAMETERS;
-#elif defined(BINT_IS_INTPTR)
- return INTPTR_PARAMETERS;
-#else
-#error Unknown BInt type.
-#endif
- }
-
TNode<IntPtrT> ParameterToIntPtr(TNode<Smi> value) { return SmiUntag(value); }
TNode<IntPtrT> ParameterToIntPtr(TNode<IntPtrT> value) { return value; }
- // TODO(v8:9708): remove once all uses are ported.
- TNode<IntPtrT> ParameterToIntPtr(Node* value, ParameterMode mode) {
- if (mode == SMI_PARAMETERS) value = SmiUntag(value);
- return UncheckedCast<IntPtrT>(value);
+ TNode<IntPtrT> ParameterToIntPtr(TNode<UintPtrT> value) {
+ return Signed(value);
}
TNode<Smi> ParameterToTagged(TNode<Smi> value) { return value; }
@@ -351,22 +338,21 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <typename TIndex>
TNode<TIndex> TaggedToParameter(TNode<Smi> value);
- bool ToParameterConstant(Node* node, intptr_t* out, ParameterMode mode) {
- if (mode == ParameterMode::SMI_PARAMETERS) {
- Smi constant;
- if (ToSmiConstant(node, &constant)) {
- *out = static_cast<intptr_t>(constant.value());
- return true;
- }
- } else {
- DCHECK_EQ(mode, ParameterMode::INTPTR_PARAMETERS);
- intptr_t constant;
- if (ToIntPtrConstant(node, &constant)) {
- *out = constant;
- return true;
- }
+ bool ToParameterConstant(TNode<Smi> node, intptr_t* out) {
+ Smi constant;
+ if (ToSmiConstant(node, &constant)) {
+ *out = static_cast<intptr_t>(constant.value());
+ return true;
}
+ return false;
+ }
+ bool ToParameterConstant(TNode<IntPtrT> node, intptr_t* out) {
+ intptr_t constant;
+ if (ToIntPtrConstant(node, &constant)) {
+ *out = constant;
+ return true;
+ }
return false;
}
@@ -461,19 +447,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
return CAST(heap_object);
}
- Node* MatchesParameterMode(Node* value, ParameterMode mode);
-
#define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \
- /* TODO(v8:9708): remove once all uses are ported. */ \
- Node* OpName(Node* a, Node* b, ParameterMode mode) { \
- if (mode == SMI_PARAMETERS) { \
- return SmiOpName(CAST(a), CAST(b)); \
- } else { \
- DCHECK_EQ(INTPTR_PARAMETERS, mode); \
- return IntPtrOpName(UncheckedCast<IntPtrT>(a), \
- UncheckedCast<IntPtrT>(b)); \
- } \
- } \
TNode<Smi> OpName(TNode<Smi> a, TNode<Smi> b) { return SmiOpName(a, b); } \
TNode<IntPtrT> OpName(TNode<IntPtrT> a, TNode<IntPtrT> b) { \
return IntPtrOpName(a, b); \
@@ -486,22 +460,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
ReinterpretCast<IntPtrT>(a), ReinterpretCast<IntPtrT>(b))); \
}
// TODO(v8:9708): Define BInt operations once all uses are ported.
- PARAMETER_BINOP(IntPtrOrSmiMin, IntPtrMin, SmiMin)
PARAMETER_BINOP(IntPtrOrSmiAdd, IntPtrAdd, SmiAdd)
PARAMETER_BINOP(IntPtrOrSmiSub, IntPtrSub, SmiSub)
#undef PARAMETER_BINOP
#define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \
- /* TODO(v8:9708): remove once all uses are ported. */ \
- TNode<BoolT> OpName(Node* a, Node* b, ParameterMode mode) { \
- if (mode == SMI_PARAMETERS) { \
- return SmiOpName(CAST(a), CAST(b)); \
- } else { \
- DCHECK_EQ(INTPTR_PARAMETERS, mode); \
- return IntPtrOpName(UncheckedCast<IntPtrT>(a), \
- UncheckedCast<IntPtrT>(b)); \
- } \
- } \
TNode<BoolT> OpName(TNode<Smi> a, TNode<Smi> b) { return SmiOpName(a, b); } \
TNode<BoolT> OpName(TNode<IntPtrT> a, TNode<IntPtrT> b) { \
return IntPtrOpName(a, b); \
@@ -515,12 +478,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
// TODO(v8:9708): Define BInt operations once all uses are ported.
PARAMETER_BINOP(IntPtrOrSmiEqual, WordEqual, SmiEqual)
PARAMETER_BINOP(IntPtrOrSmiNotEqual, WordNotEqual, SmiNotEqual)
- PARAMETER_BINOP(IntPtrOrSmiLessThan, IntPtrLessThan, SmiLessThan)
PARAMETER_BINOP(IntPtrOrSmiLessThanOrEqual, IntPtrLessThanOrEqual,
SmiLessThanOrEqual)
PARAMETER_BINOP(IntPtrOrSmiGreaterThan, IntPtrGreaterThan, SmiGreaterThan)
- PARAMETER_BINOP(IntPtrOrSmiGreaterThanOrEqual, IntPtrGreaterThanOrEqual,
- SmiGreaterThanOrEqual)
PARAMETER_BINOP(UintPtrOrSmiLessThan, UintPtrLessThan, SmiBelow)
PARAMETER_BINOP(UintPtrOrSmiGreaterThanOrEqual, UintPtrGreaterThanOrEqual,
SmiAboveOrEqual)
@@ -573,8 +533,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <typename TIndex>
TNode<TIndex> IntPtrOrSmiConstant(int value);
- bool TryGetIntPtrOrSmiConstantValue(Node* maybe_constant, int* value,
- ParameterMode mode);
+ bool TryGetIntPtrOrSmiConstantValue(TNode<Smi> maybe_constant, int* value);
+ bool TryGetIntPtrOrSmiConstantValue(TNode<IntPtrT> maybe_constant,
+ int* value);
// Round the 32bits payload of the provided word up to the next power of two.
TNode<IntPtrT> IntPtrRoundUpToPowerOfTwo32(TNode<IntPtrT> value);
@@ -1049,35 +1010,43 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<Smi> LoadBufferSmi(TNode<RawPtrT> buffer, int offset) {
return CAST(LoadBufferObject(buffer, offset));
}
+ TNode<IntPtrT> LoadBufferIntptr(TNode<RawPtrT> buffer, int offset) {
+ return LoadBufferData<IntPtrT>(buffer, offset);
+ }
// Load a field from an object on the heap.
template <class T, typename std::enable_if<
std::is_convertible<TNode<T>, TNode<Object>>::value,
int>::type = 0>
TNode<T> LoadObjectField(TNode<HeapObject> object, int offset) {
- return CAST(LoadObjectField(object, offset, MachineTypeOf<T>::value));
+ return CAST(LoadFromObject(MachineTypeOf<T>::value, object,
+ IntPtrConstant(offset - kHeapObjectTag)));
}
template <class T, typename std::enable_if<
std::is_convertible<TNode<T>, TNode<UntaggedT>>::value,
int>::type = 0>
TNode<T> LoadObjectField(TNode<HeapObject> object, int offset) {
return UncheckedCast<T>(
- LoadObjectField(object, offset, MachineTypeOf<T>::value));
+ LoadFromObject(MachineTypeOf<T>::value, object,
+ IntPtrConstant(offset - kHeapObjectTag)));
}
TNode<Object> LoadObjectField(TNode<HeapObject> object, int offset) {
return UncheckedCast<Object>(
- LoadObjectField(object, offset, MachineType::AnyTagged()));
+ LoadFromObject(MachineType::AnyTagged(), object,
+ IntPtrConstant(offset - kHeapObjectTag)));
}
TNode<Object> LoadObjectField(TNode<HeapObject> object,
TNode<IntPtrT> offset) {
return UncheckedCast<Object>(
- LoadObjectField(object, offset, MachineType::AnyTagged()));
+ LoadFromObject(MachineType::AnyTagged(), object,
+ IntPtrSub(offset, IntPtrConstant(kHeapObjectTag))));
}
template <class T, typename std::enable_if<
std::is_convertible<TNode<T>, TNode<UntaggedT>>::value,
int>::type = 0>
TNode<T> LoadObjectField(TNode<HeapObject> object, TNode<IntPtrT> offset) {
return UncheckedCast<T>(
- LoadObjectField(object, offset, MachineTypeOf<T>::value));
+ LoadFromObject(MachineTypeOf<T>::value, object,
+ IntPtrSub(offset, IntPtrConstant(kHeapObjectTag))));
}
// Load a SMI field and untag it.
TNode<IntPtrT> LoadAndUntagObjectField(SloppyTNode<HeapObject> object,
@@ -1088,8 +1057,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<MaybeObject> LoadMaybeWeakObjectField(SloppyTNode<HeapObject> object,
int offset) {
- return UncheckedCast<MaybeObject>(
- LoadObjectField(object, offset, MachineType::AnyTagged()));
+ return UncheckedCast<MaybeObject>(LoadObjectField(object, offset));
}
TNode<Object> LoadConstructorOrBackPointer(TNode<Map> map) {
@@ -1240,13 +1208,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
// Check if the map is set for slow properties.
TNode<BoolT> IsDictionaryMap(SloppyTNode<Map> map);
- // Load the hash field of a name as an uint32 value.
- TNode<Uint32T> LoadNameHashField(SloppyTNode<Name> name);
- // Load the hash value of a name as an uint32 value.
+ // Load the Name::hash() value of a name as an uint32 value.
// If {if_hash_not_computed} label is specified then it also checks if
// hash is actually computed.
- TNode<Uint32T> LoadNameHash(SloppyTNode<Name> name,
+ TNode<Uint32T> LoadNameHash(TNode<Name> name,
Label* if_hash_not_computed = nullptr);
+ TNode<Uint32T> LoadNameHashAssumeComputed(TNode<Name> name);
// Load length field of a String object as Smi value.
TNode<Smi> LoadStringLengthAsSmi(TNode<String> string);
@@ -1297,9 +1264,16 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<MaybeObject> MakeWeak(TNode<HeapObject> value);
- void FixedArrayBoundsCheck(TNode<FixedArrayBase> array, Node* index,
- int additional_offset = 0,
- ParameterMode parameter_mode = INTPTR_PARAMETERS);
+ void FixedArrayBoundsCheck(TNode<FixedArrayBase> array, TNode<Smi> index,
+ int additional_offset);
+
+ void FixedArrayBoundsCheck(TNode<FixedArrayBase> array, TNode<IntPtrT> index,
+ int additional_offset);
+
+ void FixedArrayBoundsCheck(TNode<FixedArrayBase> array, TNode<UintPtrT> index,
+ int additional_offset) {
+ FixedArrayBoundsCheck(array, Signed(index), additional_offset);
+ }
// Array is any array-like type that has a fixed header followed by
// tagged elements.
@@ -1308,11 +1282,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
// Array is any array-like type that has a fixed header followed by
// tagged elements.
- template <typename Array, typename T = MaybeObject>
- TNode<T> LoadArrayElement(
- TNode<Array> array, int array_header_size, Node* index,
+ template <typename Array, typename TIndex, typename TValue = MaybeObject>
+ TNode<TValue> LoadArrayElement(
+ TNode<Array> array, int array_header_size, TNode<TIndex> index,
int additional_offset = 0,
- ParameterMode parameter_mode = INTPTR_PARAMETERS,
LoadSensitivity needs_poisoning = LoadSensitivity::kSafe);
template <typename TIndex>
@@ -1440,6 +1413,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
if_equal);
}
+ // Loads the initial map of the the Object constructor.
+ TNode<Map> LoadObjectFunctionInitialMap(TNode<NativeContext> native_context);
+ TNode<Map> LoadSlowObjectWithNullPrototypeMap(
+ TNode<NativeContext> native_context);
+
TNode<Map> LoadJSArrayElementsMap(ElementsKind kind,
SloppyTNode<NativeContext> native_context);
TNode<Map> LoadJSArrayElementsMap(SloppyTNode<Int32T> kind,
@@ -1510,21 +1488,18 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
CheckBounds check_bounds = CheckBounds::kAlways) {
return StoreFixedArrayElement(object, IntPtrConstant(index), value,
- barrier_mode, 0, INTPTR_PARAMETERS,
- check_bounds);
+ barrier_mode, 0, check_bounds);
}
// This doesn't emit a bounds-check. As part of the security-performance
// tradeoff, only use it if it is performance critical.
void UnsafeStoreFixedArrayElement(
- TNode<FixedArray> object, int index, SloppyTNode<Object> value,
+ TNode<FixedArray> object, int index, TNode<Object> value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER) {
return StoreFixedArrayElement(object, index, value, barrier_mode,
CheckBounds::kDebugOnly);
}
- void UnsafeStoreFixedArrayElement(
- TNode<FixedArray> object, int index, TNode<Smi> value,
- WriteBarrierMode barrier_mode = SKIP_WRITE_BARRIER) {
- DCHECK_EQ(SKIP_WRITE_BARRIER, barrier_mode);
+ void UnsafeStoreFixedArrayElement(TNode<FixedArray> object, int index,
+ TNode<Smi> value) {
return StoreFixedArrayElement(object, index, value,
UNSAFE_SKIP_WRITE_BARRIER,
CheckBounds::kDebugOnly);
@@ -1533,63 +1508,53 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<Smi> value,
CheckBounds check_bounds = CheckBounds::kAlways) {
return StoreFixedArrayElement(object, IntPtrConstant(index), value,
- UNSAFE_SKIP_WRITE_BARRIER, 0,
- INTPTR_PARAMETERS, check_bounds);
- }
- // This doesn't emit a bounds-check. As part of the security-performance
- // tradeoff, only use it if it is performance critical.
- void UnsafeStoreFixedArrayElement(TNode<FixedArray> object, int index,
- TNode<Smi> value) {
- return StoreFixedArrayElement(object, index, value,
- CheckBounds::kDebugOnly);
+ UNSAFE_SKIP_WRITE_BARRIER, 0, check_bounds);
}
-
+ template <typename TIndex>
void StoreFixedArrayElement(
- TNode<FixedArray> array, Node* index, SloppyTNode<Object> value,
+ TNode<FixedArray> array, TNode<TIndex> index, SloppyTNode<Object> value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
int additional_offset = 0,
- ParameterMode parameter_mode = INTPTR_PARAMETERS,
CheckBounds check_bounds = CheckBounds::kAlways) {
+ // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants?
+ static_assert(std::is_same<TIndex, Smi>::value ||
+ std::is_same<TIndex, UintPtrT>::value ||
+ std::is_same<TIndex, IntPtrT>::value,
+ "Only Smi, UintPtrT or IntPtrT index is allowed");
if (NeedsBoundsCheck(check_bounds)) {
- FixedArrayBoundsCheck(array, index, additional_offset, parameter_mode);
+ FixedArrayBoundsCheck(array, index, additional_offset);
}
StoreFixedArrayOrPropertyArrayElement(array, index, value, barrier_mode,
- additional_offset, parameter_mode);
+ additional_offset);
}
-
// This doesn't emit a bounds-check. As part of the security-performance
// tradeoff, only use it if it is performance critical.
void UnsafeStoreFixedArrayElement(
- TNode<FixedArray> array, Node* index, SloppyTNode<Object> value,
+ TNode<FixedArray> array, TNode<IntPtrT> index, TNode<Object> value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
- int additional_offset = 0,
- ParameterMode parameter_mode = INTPTR_PARAMETERS) {
+ int additional_offset = 0) {
return StoreFixedArrayElement(array, index, value, barrier_mode,
- additional_offset, parameter_mode,
- CheckBounds::kDebugOnly);
+ additional_offset, CheckBounds::kDebugOnly);
}
- void UnsafeStoreFixedArrayElement(
- TNode<FixedArray> array, Node* index, TNode<Smi> value,
- WriteBarrierMode barrier_mode = SKIP_WRITE_BARRIER,
- int additional_offset = 0,
- ParameterMode parameter_mode = INTPTR_PARAMETERS) {
- DCHECK_EQ(SKIP_WRITE_BARRIER, barrier_mode);
+
+ void UnsafeStoreFixedArrayElement(TNode<FixedArray> array,
+ TNode<IntPtrT> index, TNode<Smi> value,
+ int additional_offset) {
return StoreFixedArrayElement(array, index, value,
UNSAFE_SKIP_WRITE_BARRIER, additional_offset,
- parameter_mode, CheckBounds::kDebugOnly);
+ CheckBounds::kDebugOnly);
}
void StorePropertyArrayElement(TNode<PropertyArray> array,
TNode<IntPtrT> index, TNode<Object> value) {
- StoreFixedArrayOrPropertyArrayElement(
- array, index, value, UPDATE_WRITE_BARRIER, 0, INTPTR_PARAMETERS);
+ StoreFixedArrayOrPropertyArrayElement(array, index, value,
+ UPDATE_WRITE_BARRIER);
}
void StoreFixedArrayElement(
TNode<FixedArray> array, TNode<Smi> index, TNode<Object> value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER) {
- StoreFixedArrayElement(array, index, value, barrier_mode, 0,
- SMI_PARAMETERS);
+ StoreFixedArrayElement(array, index, value, barrier_mode, 0);
}
void StoreFixedArrayElement(
TNode<FixedArray> array, TNode<IntPtrT> index, TNode<Smi> value,
@@ -1605,28 +1570,13 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
int additional_offset = 0) {
DCHECK_EQ(SKIP_WRITE_BARRIER, barrier_mode);
StoreFixedArrayElement(array, index, TNode<Object>{value},
- UNSAFE_SKIP_WRITE_BARRIER, additional_offset,
- SMI_PARAMETERS);
+ UNSAFE_SKIP_WRITE_BARRIER, additional_offset);
}
+ template <typename TIndex>
void StoreFixedDoubleArrayElement(
- TNode<FixedDoubleArray> object, Node* index, TNode<Float64T> value,
- ParameterMode parameter_mode = INTPTR_PARAMETERS,
- CheckBounds check_bounds = CheckBounds::kAlways);
- // This doesn't emit a bounds-check. As part of the security-performance
- // tradeoff, only use it if it is performance critical.
- void UnsafeStoreFixedDoubleArrayElement(
- TNode<FixedDoubleArray> object, Node* index, TNode<Float64T> value,
- ParameterMode parameter_mode = INTPTR_PARAMETERS) {
- return StoreFixedDoubleArrayElement(object, index, value, parameter_mode,
- CheckBounds::kDebugOnly);
- }
-
- void StoreFixedDoubleArrayElementSmi(TNode<FixedDoubleArray> object,
- TNode<Smi> index,
- TNode<Float64T> value) {
- StoreFixedDoubleArrayElement(object, index, value, SMI_PARAMETERS);
- }
+ TNode<FixedDoubleArray> object, TNode<TIndex> index,
+ TNode<Float64T> value, CheckBounds check_bounds = CheckBounds::kAlways);
void StoreDoubleHole(TNode<HeapObject> object, TNode<IntPtrT> offset);
void StoreFixedDoubleArrayHole(TNode<FixedDoubleArray> array,
@@ -1886,10 +1836,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<Object> originalArray,
TNode<Number> len);
+ template <typename TIndex>
void FillFixedArrayWithValue(ElementsKind kind, TNode<FixedArrayBase> array,
- Node* from_index, Node* to_index,
- RootIndex value_root_index,
- ParameterMode mode = INTPTR_PARAMETERS);
+ TNode<TIndex> from_index, TNode<TIndex> to_index,
+ RootIndex value_root_index);
// Uses memset to effectively initialize the given FixedArray with zeroes.
void FillFixedArrayWithSmiZero(TNode<FixedArray> array,
@@ -2513,20 +2463,23 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
// Convert a Non-Number object to a Number.
TNode<Number> NonNumberToNumber(
- SloppyTNode<Context> context, SloppyTNode<HeapObject> input,
+ TNode<Context> context, SloppyTNode<HeapObject> input,
BigIntHandling bigint_handling = BigIntHandling::kThrow);
// Convert a Non-Number object to a Numeric.
- TNode<Numeric> NonNumberToNumeric(SloppyTNode<Context> context,
+ TNode<Numeric> NonNumberToNumeric(TNode<Context> context,
SloppyTNode<HeapObject> input);
// Convert any object to a Number.
// Conforms to ES#sec-tonumber if {bigint_handling} == kThrow.
// With {bigint_handling} == kConvertToNumber, matches behavior of
// tc39.github.io/proposal-bigint/#sec-number-constructor-number-value.
TNode<Number> ToNumber(
- SloppyTNode<Context> context, SloppyTNode<Object> input,
+ TNode<Context> context, SloppyTNode<Object> input,
BigIntHandling bigint_handling = BigIntHandling::kThrow);
TNode<Number> ToNumber_Inline(SloppyTNode<Context> context,
SloppyTNode<Object> input);
+ // Convert any plain primitive to a Number. No need to handle BigInts since
+ // they are not plain primitives.
+ TNode<Number> PlainPrimitiveToNumber(TNode<Object> input);
// Try to convert an object to a BigInt. Throws on failure (e.g. for Numbers).
// https://tc39.github.io/proposal-bigint/#sec-to-bigint
@@ -3155,12 +3108,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
// TODO(turbofan): For BIGINT64_ELEMENTS and BIGUINT64_ELEMENTS
// we pass {value} as BigInt object instead of int64_t. We should
// teach TurboFan to handle int64_t on 32-bit platforms eventually.
- void StoreElement(Node* elements, ElementsKind kind, Node* index, Node* value,
- ParameterMode mode);
- void StoreElement(TNode<RawPtrT> elements, ElementsKind kind,
- TNode<UintPtrT> index, Node* value) {
- return StoreElement(elements, kind, index, value, INTPTR_PARAMETERS);
- }
+ template <typename TIndex>
+ void StoreElement(Node* elements, ElementsKind kind, TNode<TIndex> index,
+ Node* value);
// Implements the BigInt part of
// https://tc39.github.io/proposal-bigint/#sec-numbertorawbytes,
@@ -3202,8 +3152,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<AllocationSite> CreateAllocationSiteInFeedbackVector(
TNode<FeedbackVector> feedback_vector, TNode<UintPtrT> slot);
- // TODO(ishell, cbruni): Change to HasBoilerplate.
- TNode<BoolT> NotHasBoilerplate(TNode<Object> maybe_literal_site);
+ TNode<BoolT> HasBoilerplate(TNode<Object> maybe_literal_site);
TNode<Smi> LoadTransitionInfo(TNode<AllocationSite> allocation_site);
TNode<JSObject> LoadBoilerplate(TNode<AllocationSite> allocation_site);
TNode<Int32T> LoadElementsKind(TNode<AllocationSite> allocation_site);
@@ -3233,23 +3182,13 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
using FastArrayForEachBody =
std::function<void(TNode<HeapObject> array, TNode<IntPtrT> offset)>;
+ template <typename TIndex>
void BuildFastArrayForEach(
- const CodeStubAssembler::VariableList& vars, Node* array,
- ElementsKind kind, Node* first_element_inclusive,
- Node* last_element_exclusive, const FastArrayForEachBody& body,
- ParameterMode mode = INTPTR_PARAMETERS,
+ TNode<UnionT<UnionT<FixedArray, PropertyArray>, HeapObject>> array,
+ ElementsKind kind, TNode<TIndex> first_element_inclusive,
+ TNode<TIndex> last_element_exclusive, const FastArrayForEachBody& body,
ForEachDirection direction = ForEachDirection::kReverse);
- void BuildFastArrayForEach(
- Node* array, ElementsKind kind, Node* first_element_inclusive,
- Node* last_element_exclusive, const FastArrayForEachBody& body,
- ParameterMode mode = INTPTR_PARAMETERS,
- ForEachDirection direction = ForEachDirection::kReverse) {
- CodeStubAssembler::VariableList list(0, zone());
- BuildFastArrayForEach(list, array, kind, first_element_inclusive,
- last_element_exclusive, body, mode, direction);
- }
-
template <typename TIndex>
TNode<IntPtrT> GetArrayAllocationSize(TNode<TIndex> element_count,
ElementsKind kind, int header_size) {
@@ -3407,9 +3346,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <typename TIndex>
TNode<IntPtrT> ElementOffsetFromIndex(TNode<TIndex> index, ElementsKind kind,
int base_size = 0);
- // TODO(v8:9708): remove once all uses are ported.
- TNode<IntPtrT> ElementOffsetFromIndex(Node* index, ElementsKind kind,
- ParameterMode mode, int base_size = 0);
// Check that a field offset is within the bounds of the an object.
TNode<BoolT> IsOffsetInBounds(SloppyTNode<IntPtrT> offset,
@@ -3612,6 +3548,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
Label* bailout);
TNode<Object> CallGetterIfAccessor(TNode<Object> value,
+ TNode<HeapObject> holder,
TNode<Uint32T> details,
TNode<Context> context,
TNode<Object> receiver, Label* if_bailout,
@@ -3701,10 +3638,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TVariable<BigInt>* var_maybe_bigint = nullptr,
TVariable<Smi>* var_feedback = nullptr);
- Node* LoadObjectField(TNode<HeapObject> object, int offset, MachineType type);
- Node* LoadObjectField(TNode<HeapObject> object, TNode<IntPtrT> offset,
- MachineType type);
-
// Low-level accessors for Descriptor arrays.
template <typename T>
TNode<T> LoadDescriptorArrayElement(TNode<DescriptorArray> object,
@@ -3719,11 +3652,14 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
return CodeAssembler::LoadRoot(root_index);
}
+ template <typename TIndex>
void StoreFixedArrayOrPropertyArrayElement(
- TNode<UnionT<FixedArray, PropertyArray>> array, Node* index,
+ TNode<UnionT<FixedArray, PropertyArray>> array, TNode<TIndex> index,
TNode<Object> value, WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
- int additional_offset = 0,
- ParameterMode parameter_mode = INTPTR_PARAMETERS);
+ int additional_offset = 0);
+
+ // Converts {input} to a number. {input} must be a plain primitve.
+ TNode<Number> PlainPrimitiveNonNumberToNumber(TNode<HeapObject> input);
};
class V8_EXPORT_PRIVATE CodeStubArguments {
diff --git a/deps/v8/src/codegen/compiler.cc b/deps/v8/src/codegen/compiler.cc
index bcc97e32f7..33b6bbb945 100644
--- a/deps/v8/src/codegen/compiler.cc
+++ b/deps/v8/src/codegen/compiler.cc
@@ -40,6 +40,7 @@
#include "src/interpreter/interpreter.h"
#include "src/logging/log-inl.h"
#include "src/objects/feedback-cell-inl.h"
+#include "src/objects/js-function-inl.h"
#include "src/objects/map.h"
#include "src/objects/object-list-macros.h"
#include "src/objects/shared-function-info.h"
@@ -59,12 +60,32 @@ namespace internal {
namespace {
bool IsForNativeContextIndependentCachingOnly(CodeKind kind) {
+ // NCI code is only cached (and not installed on the JSFunction upon
+ // successful compilation), unless the testing-only
+ // FLAG_turbo_nci_as_midtier is enabled.
return CodeKindIsNativeContextIndependentJSFunction(kind) &&
- !FLAG_turbo_nci_as_highest_tier;
+ !FLAG_turbo_nci_as_midtier;
}
-bool IsForNativeContextIndependentCachingOnly(OptimizedCompilationInfo* info) {
- return IsForNativeContextIndependentCachingOnly(info->code_kind());
+// This predicate is currently needed only because the nci-as-midtier testing
+// configuration is special. A quick summary of compilation configurations:
+//
+// - Turbofan (and currently Turboprop) uses both the optimization marker and
+// the optimized code cache (underneath, the marker and the cache share the same
+// slot on the feedback vector).
+// - Native context independent (NCI) code uses neither the marker nor the
+// cache.
+// - The NCI-as-midtier testing configuration uses the marker, but not the
+// cache.
+//
+// This predicate supports that last case. In the near future, this last case is
+// expected to change s.t. code kinds use the marker iff they use the optimized
+// code cache (details still TBD). In that case, the existing
+// CodeKindIsStoredInOptimizedCodeCache is sufficient and this extra predicate
+// can be removed.
+// TODO(jgruber,rmcilroy,v8:8888): Remove this predicate once that has happened.
+bool UsesOptimizationMarker(CodeKind kind) {
+ return !IsForNativeContextIndependentCachingOnly(kind);
}
class CompilerTracer : public AllStatic {
@@ -835,12 +856,16 @@ V8_WARN_UNUSED_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeCache(
// Caching of optimized code enabled and optimized code found.
DCHECK(!code.marked_for_deoptimization());
DCHECK(function->shared().is_compiled());
+ DCHECK(CodeKindIsStoredInOptimizedCodeCache(code.kind()));
+ DCHECK_IMPLIES(!osr_offset.IsNone(),
+ code.kind() == CodeKind::OPTIMIZED_FUNCTION);
return Handle<Code>(code, isolate);
}
return MaybeHandle<Code>();
}
void ClearOptimizedCodeCache(OptimizedCompilationInfo* compilation_info) {
+ DCHECK(UsesOptimizationMarker(compilation_info->code_kind()));
Handle<JSFunction> function = compilation_info->closure();
if (compilation_info->osr_offset().IsNone()) {
Handle<FeedbackVector> vector =
@@ -851,21 +876,22 @@ void ClearOptimizedCodeCache(OptimizedCompilationInfo* compilation_info) {
void InsertCodeIntoOptimizedCodeCache(
OptimizedCompilationInfo* compilation_info) {
- // Cached NCI code currently does not use the optimization marker field.
- if (IsForNativeContextIndependentCachingOnly(compilation_info)) return;
-
- if (!CodeKindIsOptimizedJSFunction(compilation_info->code_kind())) return;
+ const CodeKind kind = compilation_info->code_kind();
+ if (!CodeKindIsStoredInOptimizedCodeCache(kind)) {
+ if (UsesOptimizationMarker(kind)) {
+ ClearOptimizedCodeCache(compilation_info);
+ }
+ return;
+ }
- // Function context specialization folds-in the function context,
- // so no sharing can occur.
if (compilation_info->function_context_specializing()) {
- // Native context specialized code is not shared, so make sure the optimized
- // code cache is clear.
+ // Function context specialization folds-in the function context, so no
+ // sharing can occur. Make sure the optimized code cache is cleared.
ClearOptimizedCodeCache(compilation_info);
return;
}
- // Cache optimized context-specific code.
+ // Cache optimized code.
Handle<Code> code = compilation_info->code();
Handle<JSFunction> function = compilation_info->closure();
Handle<SharedFunctionInfo> shared(function->shared(), function->GetIsolate());
@@ -876,6 +902,7 @@ void InsertCodeIntoOptimizedCodeCache(
handle(function->feedback_vector(), function->GetIsolate());
FeedbackVector::SetOptimizedCode(vector, code);
} else {
+ DCHECK_EQ(kind, CodeKind::OPTIMIZED_FUNCTION);
OSROptimizedCodeCache::AddOptimizedCode(native_context, shared, code,
compilation_info->osr_offset());
}
@@ -885,9 +912,7 @@ void InsertCodeIntoCompilationCache(Isolate* isolate,
OptimizedCompilationInfo* info) {
if (!CodeKindIsNativeContextIndependentJSFunction(info->code_kind())) return;
- // TODO(jgruber,v8:8888): This should turn into a DCHECK once we
- // spawn dedicated NCI compile tasks.
- if (!info->osr_offset().IsNone()) return;
+ DCHECK(info->osr_offset().IsNone());
Handle<Code> code = info->code();
DCHECK(!info->function_context_specializing());
@@ -984,16 +1009,29 @@ bool GetOptimizedCodeLater(std::unique_ptr<OptimizedCompilationJob> job,
PrintF(" for concurrent optimization.\n");
}
- // Set the optimization marker and return a code object which checks it.
- if (!IsForNativeContextIndependentCachingOnly(code_kind)) {
- // Cached NCI code currently does not use the optimization marker field.
+ if (CodeKindIsStoredInOptimizedCodeCache(code_kind)) {
function->SetOptimizationMarker(OptimizationMarker::kInOptimizationQueue);
}
- DCHECK(function->ActiveTierIsIgnition());
+ DCHECK(function->ActiveTierIsIgnition() || function->ActiveTierIsNCI());
DCHECK(function->shared().HasBytecodeArray());
return true;
}
+// Returns the code object at which execution continues after a concurrent
+// optimization job has been started (but not finished).
+Handle<Code> ContinuationForConcurrentOptimization(
+ Isolate* isolate, Handle<JSFunction> function) {
+ Handle<Code> cached_code;
+ if (FLAG_turbo_nci && function->NextTier() == CodeKindForTopTier() &&
+ GetCodeFromCompilationCache(isolate, handle(function->shared(), isolate))
+ .ToHandle(&cached_code)) {
+ // Tiering up to Turbofan and cached optimized code exists. Continue
+ // execution there until TF optimization has finished.
+ return cached_code;
+ }
+ return BUILTIN_CODE(isolate, InterpreterEntryTrampoline);
+}
+
MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
ConcurrencyMode mode, CodeKind code_kind,
BailoutId osr_offset = BailoutId::None(),
@@ -1005,7 +1043,10 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
// Make sure we clear the optimization marker on the function so that we
// don't try to re-optimize.
- if (function->HasOptimizationMarker()) {
+ // If compiling for NCI caching only (which does not use the optimization
+ // marker), don't touch the marker to avoid interfering with Turbofan
+ // compilation.
+ if (UsesOptimizationMarker(code_kind) && function->HasOptimizationMarker()) {
function->ClearOptimizationMarker();
}
@@ -1024,13 +1065,14 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
// turbo_filter.
if (!FLAG_opt || !shared->PassesFilter(FLAG_turbo_filter)) return {};
- // If code was pending optimization for testing, delete remove the entry
- // from the table that was preventing the bytecode from being flushed
+ // If code was pending optimization for testing, remove the entry from the
+ // table that was preventing the bytecode from being flushed.
if (V8_UNLIKELY(FLAG_testing_d8_test_runner)) {
PendingOptimizationTable::FunctionWasOptimized(isolate, function);
}
- if (!IsForNativeContextIndependentCachingOnly(code_kind)) {
+ // Check the optimized code cache (stored on the SharedFunctionInfo).
+ if (CodeKindIsStoredInOptimizedCodeCache(code_kind)) {
Handle<Code> cached_code;
if (GetCodeFromOptimizedCodeCache(function, osr_offset)
.ToHandle(&cached_code)) {
@@ -1043,13 +1085,18 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
DCHECK(shared->is_compiled());
function->feedback_vector().set_profiler_ticks(0);
- if (CodeKindIsNativeContextIndependentJSFunction(code_kind) &&
- osr_offset == BailoutId::None()) {
- // Don't generate NCI code when we've already done so in the past.
+ // Check the compilation cache (stored on the Isolate, shared between native
+ // contexts).
+ if (CodeKindIsNativeContextIndependentJSFunction(code_kind)) {
+ DCHECK(osr_offset.IsNone());
+ DCHECK(FLAG_turbo_nci_as_midtier || shared->has_optimized_at_least_once());
+
Handle<Code> cached_code;
if (GetCodeFromCompilationCache(isolate, shared).ToHandle(&cached_code)) {
- if (FLAG_trace_turbo_nci)
+ CHECK_EQ(cached_code->kind(), CodeKind::NATIVE_CONTEXT_INDEPENDENT);
+ if (FLAG_trace_turbo_nci) {
CompilationCacheCode::TraceHit(shared, cached_code);
+ }
return cached_code;
}
}
@@ -1071,11 +1118,11 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
has_script, osr_offset, osr_frame));
OptimizedCompilationInfo* compilation_info = job->compilation_info();
- // Prepare the job and launch cocncurrent compilation, or compile now.
+ // Prepare the job and launch concurrent compilation, or compile now.
if (mode == ConcurrencyMode::kConcurrent) {
if (GetOptimizedCodeLater(std::move(job), isolate, compilation_info,
code_kind, function)) {
- return BUILTIN_CODE(isolate, InterpreterEntryTrampoline);
+ return ContinuationForConcurrentOptimization(isolate, function);
}
} else {
DCHECK_EQ(mode, ConcurrencyMode::kNotConcurrent);
@@ -1582,6 +1629,7 @@ bool Compiler::CollectSourcePositions(Isolate* isolate,
// Collecting source positions requires allocating a new source position
// table.
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
Handle<BytecodeArray> bytecode =
handle(shared_info->GetBytecodeArray(), isolate);
@@ -1653,7 +1701,7 @@ bool Compiler::CollectSourcePositions(Isolate* isolate,
shared_info->GetDebugInfo().HasInstrumentedBytecodeArray()) {
ByteArray source_position_table =
job->compilation_info()->bytecode_array()->SourcePositionTable();
- shared_info->GetDebugBytecodeArray().set_source_position_table(
+ shared_info->GetDebugBytecodeArray().set_synchronized_source_position_table(
source_position_table);
}
@@ -1835,7 +1883,8 @@ bool Compiler::CompileOptimized(Handle<JSFunction> function,
ConcurrencyMode mode, CodeKind code_kind) {
DCHECK(CodeKindIsOptimizedJSFunction(code_kind));
- if (function->HasAttachedOptimizedCode()) return true;
+ // If the requested code kind is already available, do nothing.
+ if (function->HasAvailableCodeKind(code_kind)) return true;
Isolate* isolate = function->GetIsolate();
DCHECK(AllowCompilation::IsAllowed(isolate));
@@ -1858,12 +1907,14 @@ bool Compiler::CompileOptimized(Handle<JSFunction> function,
DCHECK(!isolate->has_pending_exception());
DCHECK(function->shared().is_compiled());
DCHECK(function->is_compiled());
- DCHECK_IMPLIES(function->HasOptimizationMarker(),
- function->IsInOptimizationQueue());
- DCHECK_IMPLIES(function->HasOptimizationMarker(),
- function->ChecksOptimizationMarker());
- DCHECK_IMPLIES(function->IsInOptimizationQueue(),
- mode == ConcurrencyMode::kConcurrent);
+ if (UsesOptimizationMarker(code_kind)) {
+ DCHECK_IMPLIES(function->HasOptimizationMarker(),
+ function->IsInOptimizationQueue());
+ DCHECK_IMPLIES(function->HasOptimizationMarker(),
+ function->ChecksOptimizationMarker());
+ DCHECK_IMPLIES(function->IsInOptimizationQueue(),
+ mode == ConcurrencyMode::kConcurrent);
+ }
return true;
}
@@ -2553,10 +2604,13 @@ MaybeHandle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
LanguageMode language_mode = construct_language_mode(FLAG_use_strict);
CompilationCache* compilation_cache = isolate->compilation_cache();
- // Do a lookup in the compilation cache but not for extensions.
+ // For extensions or REPL mode scripts neither do a compilation cache lookup,
+ // nor put the compilation result back into the cache.
+ const bool use_compilation_cache =
+ extension == nullptr && script_details.repl_mode == REPLMode::kNo;
MaybeHandle<SharedFunctionInfo> maybe_result;
IsCompiledScope is_compiled_scope;
- if (extension == nullptr) {
+ if (use_compilation_cache) {
bool can_consume_code_cache =
compile_options == ScriptCompiler::kConsumeCodeCache;
if (can_consume_code_cache) {
@@ -2622,7 +2676,7 @@ MaybeHandle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
// Add the result to the isolate cache.
Handle<SharedFunctionInfo> result;
- if (extension == nullptr && maybe_result.ToHandle(&result)) {
+ if (use_compilation_cache && maybe_result.ToHandle(&result)) {
DCHECK(is_compiled_scope.is_compiled());
compilation_cache->PutScript(source, isolate->native_context(),
language_mode, result);
@@ -2933,8 +2987,9 @@ bool Compiler::FinalizeOptimizedCompilationJob(OptimizedCompilationJob* job,
Handle<SharedFunctionInfo> shared = compilation_info->shared_info();
+ CodeKind code_kind = compilation_info->code_kind();
const bool should_install_code_on_function =
- !IsForNativeContextIndependentCachingOnly(compilation_info);
+ !IsForNativeContextIndependentCachingOnly(code_kind);
if (should_install_code_on_function) {
// Reset profiler ticks, function is no longer considered hot.
compilation_info->closure()->feedback_vector().set_profiler_ticks(0);
@@ -2969,7 +3024,8 @@ bool Compiler::FinalizeOptimizedCompilationJob(OptimizedCompilationJob* job,
CompilerTracer::TraceAbortedJob(isolate, compilation_info);
compilation_info->closure()->set_code(shared->GetCode());
// Clear the InOptimizationQueue marker, if it exists.
- if (compilation_info->closure()->IsInOptimizationQueue()) {
+ if (UsesOptimizationMarker(code_kind) &&
+ compilation_info->closure()->IsInOptimizationQueue()) {
compilation_info->closure()->ClearOptimizationMarker();
}
return CompilationJob::FAILED;
diff --git a/deps/v8/src/codegen/compiler.h b/deps/v8/src/codegen/compiler.h
index 2af1baa277..1e3ed00f93 100644
--- a/deps/v8/src/codegen/compiler.h
+++ b/deps/v8/src/codegen/compiler.h
@@ -44,10 +44,6 @@ class WorkerThreadRuntimeCallStats;
using UnoptimizedCompilationJobList =
std::forward_list<std::unique_ptr<UnoptimizedCompilationJob>>;
-inline bool ShouldSpawnExtraNativeContextIndependentCompilationJob() {
- return FLAG_turbo_nci && !FLAG_turbo_nci_as_highest_tier;
-}
-
// The V8 compiler API.
//
// This is the central hub for dispatching to the various compilers within V8.
diff --git a/deps/v8/src/codegen/external-reference.h b/deps/v8/src/codegen/external-reference.h
index eaadc6fbad..e35e12237b 100644
--- a/deps/v8/src/codegen/external-reference.h
+++ b/deps/v8/src/codegen/external-reference.h
@@ -303,7 +303,8 @@ class ExternalReference {
ExternalReference() : address_(kNullAddress) {}
static ExternalReference Create(const SCTableReference& table_ref);
static ExternalReference Create(StatsCounter* counter);
- static ExternalReference Create(ApiFunction* ptr, Type type);
+ static V8_EXPORT_PRIVATE ExternalReference Create(ApiFunction* ptr,
+ Type type);
static ExternalReference Create(const Runtime::Function* f);
static ExternalReference Create(IsolateAddressId id, Isolate* isolate);
static ExternalReference Create(Runtime::FunctionId id);
diff --git a/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc b/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc
index 9b96dc1d8c..0177e36c4b 100644
--- a/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc
+++ b/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc
@@ -55,6 +55,11 @@ const Register LoadDescriptor::SlotRegister() { return eax; }
const Register LoadWithVectorDescriptor::VectorRegister() { return no_reg; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return edi;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return edx; }
const Register StoreDescriptor::NameRegister() { return ecx; }
const Register StoreDescriptor::ValueRegister() { return no_reg; }
diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
index 8b1cc91298..9558cf540d 100644
--- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
+++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
@@ -805,8 +805,9 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) {
void TurboAssembler::Prologue() {
push(ebp); // Caller's frame pointer.
mov(ebp, esp);
- push(esi); // Callee's context.
- push(edi); // Callee's JS function.
+ push(kContextRegister); // Callee's context.
+ push(kJSFunctionRegister); // Callee's JS function.
+ push(kJavaScriptCallArgCountRegister); // Actual argument count.
}
void TurboAssembler::EnterFrame(StackFrame::Type type) {
diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.h b/deps/v8/src/codegen/ia32/macro-assembler-ia32.h
index ef26309a2b..72d574f14c 100644
--- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.h
+++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.h
@@ -208,6 +208,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
void Popcnt(Register dst, Register src) { Popcnt(dst, Operand(src)); }
void Popcnt(Register dst, Operand src);
+ void PushReturnAddressFrom(Register src) { push(src); }
+ void PopReturnAddressTo(Register dst) { pop(dst); }
+
void Ret();
// Root register utility functions.
@@ -820,8 +823,6 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
void Pop(Register dst) { pop(dst); }
void Pop(Operand dst) { pop(dst); }
- void PushReturnAddressFrom(Register src) { push(src); }
- void PopReturnAddressTo(Register dst) { pop(dst); }
// ---------------------------------------------------------------------------
// In-place weak references.
diff --git a/deps/v8/src/codegen/interface-descriptors.cc b/deps/v8/src/codegen/interface-descriptors.cc
index 00f774f93c..8a6235fa08 100644
--- a/deps/v8/src/codegen/interface-descriptors.cc
+++ b/deps/v8/src/codegen/interface-descriptors.cc
@@ -221,6 +221,16 @@ void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers);
}
+void LoadWithReceiverAndVectorDescriptor::InitializePlatformSpecific(
+ CallInterfaceDescriptorData* data) {
+ DCHECK(!AreAliased(ReceiverRegister(), LookupStartObjectRegister(),
+ NameRegister(), SlotRegister(), VectorRegister()));
+ Register registers[] = {ReceiverRegister(), LookupStartObjectRegister(),
+ NameRegister(), SlotRegister(), VectorRegister()};
+ int len = arraysize(registers) - kStackArgumentsCount;
+ data->InitializePlatformSpecific(len, registers);
+}
+
void StoreGlobalDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {NameRegister(), ValueRegister(), SlotRegister()};
@@ -277,6 +287,12 @@ void TypeConversionDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers);
}
+void TypeConversionNoContextDescriptor::InitializePlatformSpecific(
+ CallInterfaceDescriptorData* data) {
+ Register registers[] = {TypeConversionDescriptor::ArgumentRegister()};
+ data->InitializePlatformSpecific(arraysize(registers), registers);
+}
+
void TypeConversionStackParameterDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
data->InitializePlatformSpecific(0, nullptr);
diff --git a/deps/v8/src/codegen/interface-descriptors.h b/deps/v8/src/codegen/interface-descriptors.h
index 1f025d37a3..d307502276 100644
--- a/deps/v8/src/codegen/interface-descriptors.h
+++ b/deps/v8/src/codegen/interface-descriptors.h
@@ -78,6 +78,7 @@ namespace internal {
V(LoadGlobalWithVector) \
V(LoadNoFeedback) \
V(LoadWithVector) \
+ V(LoadWithReceiverAndVector) \
V(NoContext) \
V(RecordWrite) \
V(ResumeGenerator) \
@@ -92,6 +93,7 @@ namespace internal {
V(StringAtAsString) \
V(StringSubstring) \
V(TypeConversion) \
+ V(TypeConversionNoContext) \
V(TypeConversionStackParameter) \
V(Typeof) \
V(UnaryOp_WithFeedback) \
@@ -503,6 +505,10 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged() /* result */, \
##__VA_ARGS__)
+// When the extra arguments described here are located in the stack, they are
+// just above the return address in the frame. Therefore, they are either the
+// first arguments when V8_REVERSE_JSARGS is enabled, or otherwise the last
+// arguments.
#define DEFINE_JS_PARAMETERS(...) \
static constexpr int kDescriptorFlags = \
CallInterfaceDescriptorData::kAllowVarArgs; \
@@ -817,6 +823,34 @@ class LoadWithVectorDescriptor : public LoadDescriptor {
static const int kStackArgumentsCount = kPassLastArgsOnStack ? 1 : 0;
};
+// Like LoadWithVectorDescriptor, except we pass the receiver (the object which
+// should be used as the receiver for accessor function calls) and the lookup
+// start object separately.
+class LoadWithReceiverAndVectorDescriptor : public LoadWithVectorDescriptor {
+ public:
+ // TODO(v8:9497): Revert the Machine type for kSlot to the
+ // TaggedSigned once Torque can emit better call descriptors
+ DEFINE_PARAMETERS(kReceiver, kLookupStartObject, kName, kSlot, kVector)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver
+ MachineType::AnyTagged(), // kLookupStartObject
+ MachineType::AnyTagged(), // kName
+ MachineType::AnyTagged(), // kSlot
+ MachineType::AnyTagged()) // kVector
+ DECLARE_DESCRIPTOR(LoadWithReceiverAndVectorDescriptor,
+ LoadWithVectorDescriptor)
+
+ static const Register LookupStartObjectRegister();
+
+#if V8_TARGET_ARCH_IA32
+ static const bool kPassLastArgsOnStack = true;
+#else
+ static const bool kPassLastArgsOnStack = false;
+#endif
+
+ // Pass vector through the stack.
+ static const int kStackArgumentsCount = kPassLastArgsOnStack ? 1 : 0;
+};
+
class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor {
public:
DEFINE_PARAMETERS(kName, kSlot, kVector)
@@ -876,6 +910,13 @@ class TypeConversionDescriptor final : public CallInterfaceDescriptor {
static const Register ArgumentRegister();
};
+class TypeConversionNoContextDescriptor final : public CallInterfaceDescriptor {
+ public:
+ DEFINE_PARAMETERS_NO_CONTEXT(kArgument)
+ DEFINE_PARAMETER_TYPES(MachineType::AnyTagged())
+ DECLARE_DESCRIPTOR(TypeConversionNoContextDescriptor, CallInterfaceDescriptor)
+};
+
class TypeConversionStackParameterDescriptor final
: public CallInterfaceDescriptor {
public:
@@ -927,8 +968,8 @@ class CallTrampolineDescriptor : public CallInterfaceDescriptor {
class CallVarargsDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kArgumentsLength,
- kArgumentsList)
+ DEFINE_PARAMETERS_VARARGS(kTarget, kActualArgumentsCount, kArgumentsLength,
+ kArgumentsList)
DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
MachineType::Int32(), // kActualArgumentsCount
MachineType::Int32(), // kArgumentsLength
@@ -938,7 +979,7 @@ class CallVarargsDescriptor : public CallInterfaceDescriptor {
class CallForwardVarargsDescriptor : public CallInterfaceDescriptor {
public:
- DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kStartIndex)
+ DEFINE_PARAMETERS_VARARGS(kTarget, kActualArgumentsCount, kStartIndex)
DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget
MachineType::Int32(), // kActualArgumentsCount
MachineType::Int32()) // kStartIndex
@@ -1536,7 +1577,7 @@ BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR)
// This file contains interface descriptor class definitions for builtins
// defined in Torque. It is included here because the class definitions need to
// precede the definition of name##Descriptor::key() below.
-#include "torque-generated/interface-descriptors-tq.inc"
+#include "torque-generated/interface-descriptors.inc"
#undef DECLARE_DEFAULT_DESCRIPTOR
#undef DECLARE_DESCRIPTOR_WITH_BASE
diff --git a/deps/v8/src/codegen/macro-assembler.h b/deps/v8/src/codegen/macro-assembler.h
index 01175e585e..a213fc504e 100644
--- a/deps/v8/src/codegen/macro-assembler.h
+++ b/deps/v8/src/codegen/macro-assembler.h
@@ -60,8 +60,14 @@ enum AllocationFlags {
namespace v8 {
namespace internal {
-// Simulators only support C calls with up to kMaxCParameters parameters.
+// Maximum number of parameters supported in calls to C/C++. The C++ standard
+// defines a limit of 256 parameters but in simulator builds we provide only
+// limited support.
+#ifdef USE_SIMULATOR
static constexpr int kMaxCParameters = 10;
+#else
+static constexpr int kMaxCParameters = 256;
+#endif
class FrameScope {
public:
diff --git a/deps/v8/src/codegen/mips/interface-descriptors-mips.cc b/deps/v8/src/codegen/mips/interface-descriptors-mips.cc
index 4945ce4395..132811a173 100644
--- a/deps/v8/src/codegen/mips/interface-descriptors-mips.cc
+++ b/deps/v8/src/codegen/mips/interface-descriptors-mips.cc
@@ -78,6 +78,11 @@ const Register LoadDescriptor::SlotRegister() { return a0; }
const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return t0;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return a1; }
const Register StoreDescriptor::NameRegister() { return a2; }
const Register StoreDescriptor::ValueRegister() { return a0; }
diff --git a/deps/v8/src/codegen/mips/macro-assembler-mips.cc b/deps/v8/src/codegen/mips/macro-assembler-mips.cc
index efb2dc11e1..f9a0f7f076 100644
--- a/deps/v8/src/codegen/mips/macro-assembler-mips.cc
+++ b/deps/v8/src/codegen/mips/macro-assembler-mips.cc
@@ -146,10 +146,11 @@ void TurboAssembler::PushCommonFrame(Register marker_reg) {
void TurboAssembler::PushStandardFrame(Register function_reg) {
int offset = -StandardFrameConstants::kContextOffset;
if (function_reg.is_valid()) {
- Push(ra, fp, cp, function_reg);
- offset += kPointerSize;
+ Push(ra, fp, cp, function_reg, kJavaScriptCallArgCountRegister);
+ offset += 2 * kPointerSize;
} else {
- Push(ra, fp, cp);
+ Push(ra, fp, cp, kJavaScriptCallArgCountRegister);
+ offset += kPointerSize;
}
Addu(fp, sp, Operand(offset));
}
@@ -4182,6 +4183,33 @@ void TurboAssembler::Push(Smi smi) {
push(scratch);
}
+void TurboAssembler::PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order) {
+ DCHECK(!AreAliased(array, size, scratch, scratch2));
+ Label loop, entry;
+ if (order == PushArrayOrder::kReverse) {
+ mov(scratch, zero_reg);
+ jmp(&entry);
+ bind(&loop);
+ Lsa(scratch2, array, scratch, kPointerSizeLog2);
+ Lw(scratch2, MemOperand(scratch2));
+ push(scratch2);
+ Addu(scratch, scratch, Operand(1));
+ bind(&entry);
+ Branch(&loop, less, scratch, Operand(size));
+ } else {
+ mov(scratch, size);
+ jmp(&entry);
+ bind(&loop);
+ Lsa(scratch2, array, scratch, kPointerSizeLog2);
+ Lw(scratch2, MemOperand(scratch2));
+ push(scratch2);
+ bind(&entry);
+ Addu(scratch, scratch, Operand(-1));
+ Branch(&loop, greater_equal, scratch, Operand(zero_reg));
+ }
+}
+
void MacroAssembler::MaybeDropFrames() {
// Check whether we need to drop frames to restart a function on the stack.
li(a1, ExternalReference::debug_restart_fp_address(isolate()));
@@ -4350,8 +4378,9 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count,
Label* done, InvokeFlag flag) {
Label regular_invoke;
- // Check whether the expected and actual arguments count match. The registers
- // are set up according to contract with ArgumentsAdaptorTrampoline:
+ // Check whether the expected and actual arguments count match. The
+ // registers are set up according to contract with
+ // ArgumentsAdaptorTrampoline:
// a0: actual arguments count
// a1: function (passed through to callee)
// a2: expected arguments count
@@ -4385,8 +4414,8 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
{
// Load receiver to pass it later to DebugOnFunctionCall hook.
- Lsa(at, sp, actual_parameter_count, kPointerSizeLog2);
- lw(t0, MemOperand(at));
+ LoadReceiver(t0, actual_parameter_count);
+
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
SmiTag(expected_parameter_count);
diff --git a/deps/v8/src/codegen/mips/macro-assembler-mips.h b/deps/v8/src/codegen/mips/macro-assembler-mips.h
index d7441c2fcf..cafcc42941 100644
--- a/deps/v8/src/codegen/mips/macro-assembler-mips.h
+++ b/deps/v8/src/codegen/mips/macro-assembler-mips.h
@@ -312,6 +312,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
sw(src, MemOperand(sp, 0));
}
+ enum PushArrayOrder { kNormal, kReverse };
+ void PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order = kNormal);
+
void SaveRegisters(RegList registers);
void RestoreRegisters(RegList registers);
@@ -905,6 +909,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
public:
using TurboAssembler::TurboAssembler;
+ // It assumes that the arguments are located below the stack pointer.
+ // argc is the number of arguments not including the receiver.
+ // TODO(victorgomes): Remove this function once we stick with the reversed
+ // arguments order.
+ void LoadReceiver(Register dest, Register argc) {
+#ifdef V8_REVERSE_JSARGS
+ Lw(dest, MemOperand(sp, 0));
+#else
+ Lsa(dest, sp, argc, kPointerSizeLog2);
+ Lw(dest, MemOperand(dest, 0));
+#endif
+ }
+
+ void StoreReceiver(Register rec, Register argc, Register scratch) {
+#ifdef V8_REVERSE_JSARGS
+ Sw(rec, MemOperand(sp, 0));
+#else
+ Lsa(scratch, sp, argc, kPointerSizeLog2);
+ Sw(rec, MemOperand(scratch, 0));
+#endif
+ }
+
// Swap two registers. If the scratch register is omitted then a slightly
// less efficient form using xor instead of mov is emitted.
void Swap(Register reg1, Register reg2, Register scratch = no_reg);
diff --git a/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc b/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc
index 9e33d39eba..4014607007 100644
--- a/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc
+++ b/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc
@@ -78,6 +78,11 @@ const Register LoadDescriptor::SlotRegister() { return a0; }
const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return a4;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return a1; }
const Register StoreDescriptor::NameRegister() { return a2; }
const Register StoreDescriptor::ValueRegister() { return a0; }
diff --git a/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc b/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc
index 785cf4aa5c..509153e6c2 100644
--- a/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc
+++ b/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc
@@ -144,10 +144,11 @@ void TurboAssembler::PushCommonFrame(Register marker_reg) {
void TurboAssembler::PushStandardFrame(Register function_reg) {
int offset = -StandardFrameConstants::kContextOffset;
if (function_reg.is_valid()) {
- Push(ra, fp, cp, function_reg);
- offset += kPointerSize;
+ Push(ra, fp, cp, function_reg, kJavaScriptCallArgCountRegister);
+ offset += 2 * kPointerSize;
} else {
- Push(ra, fp, cp);
+ Push(ra, fp, cp, kJavaScriptCallArgCountRegister);
+ offset += kPointerSize;
}
Daddu(fp, sp, Operand(offset));
}
@@ -2612,6 +2613,38 @@ void TurboAssembler::Round_s_s(FPURegister dst, FPURegister src) {
});
}
+void TurboAssembler::MSARoundW(MSARegister dst, MSARegister src,
+ FPURoundingMode mode) {
+ BlockTrampolinePoolScope block_trampoline_pool(this);
+ Register scratch = t8;
+ Register scratch2 = at;
+ cfcmsa(scratch, MSACSR);
+ if (mode == kRoundToNearest) {
+ scratch2 = zero_reg;
+ } else {
+ li(scratch2, Operand(mode));
+ }
+ ctcmsa(MSACSR, scratch2);
+ frint_w(dst, src);
+ ctcmsa(MSACSR, scratch);
+}
+
+void TurboAssembler::MSARoundD(MSARegister dst, MSARegister src,
+ FPURoundingMode mode) {
+ BlockTrampolinePoolScope block_trampoline_pool(this);
+ Register scratch = t8;
+ Register scratch2 = at;
+ cfcmsa(scratch, MSACSR);
+ if (mode == kRoundToNearest) {
+ scratch2 = zero_reg;
+ } else {
+ li(scratch2, Operand(mode));
+ }
+ ctcmsa(MSACSR, scratch2);
+ frint_d(dst, src);
+ ctcmsa(MSACSR, scratch);
+}
+
void MacroAssembler::Madd_s(FPURegister fd, FPURegister fr, FPURegister fs,
FPURegister ft, FPURegister scratch) {
DCHECK(fr != scratch && fs != scratch && ft != scratch);
@@ -4377,13 +4410,13 @@ void TurboAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) {
} else {
// Generate position independent long branch.
BlockTrampolinePoolScope block_trampoline_pool(this);
- int64_t imm64;
- imm64 = branch_long_offset(L);
+ int64_t imm64 = branch_long_offset(L);
DCHECK(is_int32(imm64));
+ int32_t imm32 = static_cast<int32_t>(imm64);
or_(t8, ra, zero_reg);
nal(); // Read PC into ra register.
- lui(t9, (imm64 & kHiMaskOf32) >> kLuiShift); // Branch delay slot.
- ori(t9, t9, (imm64 & kImm16Mask));
+ lui(t9, (imm32 & kHiMaskOf32) >> kLuiShift); // Branch delay slot.
+ ori(t9, t9, (imm32 & kImm16Mask));
daddu(t9, ra, t9);
if (bdslot == USE_DELAY_SLOT) {
or_(ra, t8, zero_reg);
@@ -4401,12 +4434,12 @@ void TurboAssembler::BranchAndLinkLong(Label* L, BranchDelaySlot bdslot) {
} else {
// Generate position independent long branch and link.
BlockTrampolinePoolScope block_trampoline_pool(this);
- int64_t imm64;
- imm64 = branch_long_offset(L);
+ int64_t imm64 = branch_long_offset(L);
DCHECK(is_int32(imm64));
- lui(t8, (imm64 & kHiMaskOf32) >> kLuiShift);
+ int32_t imm32 = static_cast<int32_t>(imm64);
+ lui(t8, (imm32 & kHiMaskOf32) >> kLuiShift);
nal(); // Read PC into ra register.
- ori(t8, t8, (imm64 & kImm16Mask)); // Branch delay slot.
+ ori(t8, t8, (imm32 & kImm16Mask)); // Branch delay slot.
daddu(t8, ra, t8);
jalr(t8);
// Emit a nop in the branch delay slot if required.
@@ -4488,6 +4521,33 @@ void TurboAssembler::Push(Handle<HeapObject> handle) {
push(scratch);
}
+void TurboAssembler::PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order) {
+ DCHECK(!AreAliased(array, size, scratch, scratch2));
+ Label loop, entry;
+ if (order == PushArrayOrder::kReverse) {
+ mov(scratch, zero_reg);
+ jmp(&entry);
+ bind(&loop);
+ Dlsa(scratch2, array, scratch, kPointerSizeLog2);
+ Ld(scratch2, MemOperand(scratch2));
+ push(scratch2);
+ Daddu(scratch, scratch, Operand(1));
+ bind(&entry);
+ Branch(&loop, less, scratch, Operand(size));
+ } else {
+ mov(scratch, size);
+ jmp(&entry);
+ bind(&loop);
+ Dlsa(scratch2, array, scratch, kPointerSizeLog2);
+ Ld(scratch2, MemOperand(scratch2));
+ push(scratch2);
+ bind(&entry);
+ Daddu(scratch, scratch, Operand(-1));
+ Branch(&loop, greater_equal, scratch, Operand(zero_reg));
+ }
+}
+
void MacroAssembler::MaybeDropFrames() {
// Check whether we need to drop frames to restart a function on the stack.
li(a1, ExternalReference::debug_restart_fp_address(isolate()));
@@ -4696,8 +4756,8 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
{
// Load receiver to pass it later to DebugOnFunctionCall hook.
- Dlsa(t0, sp, actual_parameter_count, kPointerSizeLog2);
- Ld(t0, MemOperand(t0));
+ LoadReceiver(t0, actual_parameter_count);
+
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
SmiTag(expected_parameter_count);
diff --git a/deps/v8/src/codegen/mips64/macro-assembler-mips64.h b/deps/v8/src/codegen/mips64/macro-assembler-mips64.h
index c8b8d2876f..56380cc8b2 100644
--- a/deps/v8/src/codegen/mips64/macro-assembler-mips64.h
+++ b/deps/v8/src/codegen/mips64/macro-assembler-mips64.h
@@ -334,6 +334,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
Sd(src, MemOperand(sp, 0));
}
+ enum PushArrayOrder { kNormal, kReverse };
+ void PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order = kNormal);
+
void SaveRegisters(RegList registers);
void RestoreRegisters(RegList registers);
@@ -787,6 +791,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
void Floor_s_s(FPURegister fd, FPURegister fs);
void Ceil_s_s(FPURegister fd, FPURegister fs);
+ void MSARoundW(MSARegister dst, MSARegister src, FPURoundingMode mode);
+ void MSARoundD(MSARegister dst, MSARegister src, FPURoundingMode mode);
+
// Jump the register contains a smi.
void JumpIfSmi(Register value, Label* smi_label, Register scratch = at,
BranchDelaySlot bd = PROTECT);
@@ -909,6 +916,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
public:
using TurboAssembler::TurboAssembler;
+ // It assumes that the arguments are located below the stack pointer.
+ // argc is the number of arguments not including the receiver.
+ // TODO(victorgomes): Remove this function once we stick with the reversed
+ // arguments order.
+ void LoadReceiver(Register dest, Register argc) {
+#ifdef V8_REVERSE_JSARGS
+ Ld(dest, MemOperand(sp, 0));
+#else
+ Dlsa(dest, sp, argc, kPointerSizeLog2);
+ Ld(dest, MemOperand(dest, 0));
+#endif
+ }
+
+ void StoreReceiver(Register rec, Register argc, Register scratch) {
+#ifdef V8_REVERSE_JSARGS
+ Sd(rec, MemOperand(sp, 0));
+#else
+ Dlsa(scratch, sp, argc, kPointerSizeLog2);
+ Sd(rec, MemOperand(scratch, 0));
+#endif
+ }
+
bool IsNear(Label* L, Condition cond, int rs_reg);
// Swap two registers. If the scratch register is omitted then a slightly
diff --git a/deps/v8/src/codegen/optimized-compilation-info.cc b/deps/v8/src/codegen/optimized-compilation-info.cc
index 160691cf89..b2c100aa05 100644
--- a/deps/v8/src/codegen/optimized-compilation-info.cc
+++ b/deps/v8/src/codegen/optimized-compilation-info.cc
@@ -111,12 +111,6 @@ void OptimizedCompilationInfo::ConfigureFlags() {
default:
break;
}
-
- if (FLAG_turbo_control_flow_aware_allocation) {
- set_turbo_control_flow_aware_allocation();
- } else {
- set_turbo_preprocess_ranges();
- }
}
OptimizedCompilationInfo::~OptimizedCompilationInfo() {
diff --git a/deps/v8/src/codegen/optimized-compilation-info.h b/deps/v8/src/codegen/optimized-compilation-info.h
index ac45bc2939..4de8ba1645 100644
--- a/deps/v8/src/codegen/optimized-compilation-info.h
+++ b/deps/v8/src/codegen/optimized-compilation-info.h
@@ -46,29 +46,27 @@ class V8_EXPORT_PRIVATE OptimizedCompilationInfo final {
// Various configuration flags for a compilation, as well as some properties
// of the compiled code produced by a compilation.
-#define FLAGS(V) \
- V(FunctionContextSpecializing, function_context_specializing, 0) \
- V(Inlining, inlining, 1) \
- V(DisableFutureOptimization, disable_future_optimization, 2) \
- V(Splitting, splitting, 3) \
- V(SourcePositions, source_positions, 4) \
- V(BailoutOnUninitialized, bailout_on_uninitialized, 5) \
- V(LoopPeeling, loop_peeling, 6) \
- V(UntrustedCodeMitigations, untrusted_code_mitigations, 7) \
- V(SwitchJumpTable, switch_jump_table, 8) \
- V(CalledWithCodeStartRegister, called_with_code_start_register, 9) \
- V(PoisonRegisterArguments, poison_register_arguments, 10) \
- V(AllocationFolding, allocation_folding, 11) \
- V(AnalyzeEnvironmentLiveness, analyze_environment_liveness, 12) \
- V(TraceTurboJson, trace_turbo_json, 13) \
- V(TraceTurboGraph, trace_turbo_graph, 14) \
- V(TraceTurboScheduled, trace_turbo_scheduled, 15) \
- V(TraceTurboAllocation, trace_turbo_allocation, 16) \
- V(TraceHeapBroker, trace_heap_broker, 17) \
- V(WasmRuntimeExceptionSupport, wasm_runtime_exception_support, 18) \
- V(TurboControlFlowAwareAllocation, turbo_control_flow_aware_allocation, 19) \
- V(TurboPreprocessRanges, turbo_preprocess_ranges, 20) \
- V(ConcurrentInlining, concurrent_inlining, 21)
+#define FLAGS(V) \
+ V(FunctionContextSpecializing, function_context_specializing, 0) \
+ V(Inlining, inlining, 1) \
+ V(DisableFutureOptimization, disable_future_optimization, 2) \
+ V(Splitting, splitting, 3) \
+ V(SourcePositions, source_positions, 4) \
+ V(BailoutOnUninitialized, bailout_on_uninitialized, 5) \
+ V(LoopPeeling, loop_peeling, 6) \
+ V(UntrustedCodeMitigations, untrusted_code_mitigations, 7) \
+ V(SwitchJumpTable, switch_jump_table, 8) \
+ V(CalledWithCodeStartRegister, called_with_code_start_register, 9) \
+ V(PoisonRegisterArguments, poison_register_arguments, 10) \
+ V(AllocationFolding, allocation_folding, 11) \
+ V(AnalyzeEnvironmentLiveness, analyze_environment_liveness, 12) \
+ V(TraceTurboJson, trace_turbo_json, 13) \
+ V(TraceTurboGraph, trace_turbo_graph, 14) \
+ V(TraceTurboScheduled, trace_turbo_scheduled, 15) \
+ V(TraceTurboAllocation, trace_turbo_allocation, 16) \
+ V(TraceHeapBroker, trace_heap_broker, 17) \
+ V(WasmRuntimeExceptionSupport, wasm_runtime_exception_support, 18) \
+ V(ConcurrentInlining, concurrent_inlining, 19)
enum Flag {
#define DEF_ENUM(Camel, Lower, Bit) k##Camel = 1 << Bit,
diff --git a/deps/v8/src/codegen/ppc/constants-ppc.h b/deps/v8/src/codegen/ppc/constants-ppc.h
index b91b40ca15..306175e06d 100644
--- a/deps/v8/src/codegen/ppc/constants-ppc.h
+++ b/deps/v8/src/codegen/ppc/constants-ppc.h
@@ -385,7 +385,23 @@ using Instr = uint32_t;
/* VSX Vector Convert Signed Fixed-Point Word to Single-Precision */ \
V(xvcvsxwsp, XVCVSXWSP, 0xF00002E0) \
/* VSX Vector Convert Unsigned Fixed-Point Word to Single-Precision */ \
- V(xvcvuxwsp, XVCVUXWSP, 0xF00002A0)
+ V(xvcvuxwsp, XVCVUXWSP, 0xF00002A0) \
+ /* VSX Vector Round to Double-Precision Integer toward +Infinity */ \
+ V(xvrdpip, XVRDPIP, 0xF00003A4) \
+ /* VSX Vector Round to Double-Precision Integer toward -Infinity */ \
+ V(xvrdpim, XVRDPIM, 0xF00003E4) \
+ /* VSX Vector Round to Double-Precision Integer toward Zero */ \
+ V(xvrdpiz, XVRDPIZ, 0xF0000364) \
+ /* VSX Vector Round to Double-Precision Integer */ \
+ V(xvrdpi, XVRDPI, 0xF0000324) \
+ /* VSX Vector Round to Single-Precision Integer toward +Infinity */ \
+ V(xvrspip, XVRSPIP, 0xF00002A4) \
+ /* VSX Vector Round to Single-Precision Integer toward -Infinity */ \
+ V(xvrspim, XVRSPIM, 0xF00002E4) \
+ /* VSX Vector Round to Single-Precision Integer toward Zero */ \
+ V(xvrspiz, XVRSPIZ, 0xF0000264) \
+ /* VSX Vector Round to Single-Precision Integer */ \
+ V(xvrspi, XVRSPI, 0xF0000224)
#define PPC_XX2_OPCODE_UNUSED_LIST(V) \
/* VSX Scalar Square Root Double-Precision */ \
@@ -497,28 +513,12 @@ using Instr = uint32_t;
V(xvnabsdp, XVNABSDP, 0xF00007A4) \
/* VSX Vector Negative Absolute Value Single-Precision */ \
V(xvnabssp, XVNABSSP, 0xF00006A4) \
- /* VSX Vector Round to Double-Precision Integer */ \
- V(xvrdpi, XVRDPI, 0xF0000324) \
/* VSX Vector Round to Double-Precision Integer using Current rounding */ \
/* mode */ \
V(xvrdpic, XVRDPIC, 0xF00003AC) \
- /* VSX Vector Round to Double-Precision Integer toward -Infinity */ \
- V(xvrdpim, XVRDPIM, 0xF00003E4) \
- /* VSX Vector Round to Double-Precision Integer toward +Infinity */ \
- V(xvrdpip, XVRDPIP, 0xF00003A4) \
- /* VSX Vector Round to Double-Precision Integer toward Zero */ \
- V(xvrdpiz, XVRDPIZ, 0xF0000364) \
- /* VSX Vector Round to Single-Precision Integer */ \
- V(xvrspi, XVRSPI, 0xF0000224) \
/* VSX Vector Round to Single-Precision Integer using Current rounding */ \
/* mode */ \
V(xvrspic, XVRSPIC, 0xF00002AC) \
- /* VSX Vector Round to Single-Precision Integer toward -Infinity */ \
- V(xvrspim, XVRSPIM, 0xF00002E4) \
- /* VSX Vector Round to Single-Precision Integer toward +Infinity */ \
- V(xvrspip, XVRSPIP, 0xF00002A4) \
- /* VSX Vector Round to Single-Precision Integer toward Zero */ \
- V(xvrspiz, XVRSPIZ, 0xF0000264) \
/* VSX Vector Reciprocal Square Root Estimate Double-Precision */ \
V(xvrsqrtedp, XVRSQRTEDP, 0xF0000328) \
/* VSX Vector Test for software Square Root Double-Precision */ \
@@ -2342,7 +2342,13 @@ using Instr = uint32_t;
/* Vector Average Unsigned Byte */ \
V(vavgub, VAVGUB, 0x10000402) \
/* Vector Average Unsigned Halfword */ \
- V(vavguh, VAVGUH, 0x10000442)
+ V(vavguh, VAVGUH, 0x10000442) \
+ /* Vector Logical AND with Complement */ \
+ V(vandc, VANDC, 0x10000444) \
+ /* Vector Minimum Single-Precision */ \
+ V(vminfp, VMINFP, 0x1000044A) \
+ /* Vector Maximum Single-Precision */ \
+ V(vmaxfp, VMAXFP, 0x1000040A)
#define PPC_VX_OPCODE_C_FORM_LIST(V) \
/* Vector Unpack Low Signed Halfword */ \
@@ -2373,8 +2379,6 @@ using Instr = uint32_t;
V(vadduqm, VADDUQM, 0x10000100) \
/* Vector Add Unsigned Word Saturate */ \
V(vadduws, VADDUWS, 0x10000280) \
- /* Vector Logical AND with Complement */ \
- V(vandc, VANDC, 0x10000444) \
/* Vector Average Signed Byte */ \
V(vavgsb, VAVGSB, 0x10000502) \
/* Vector Average Signed Halfword */ \
@@ -2411,10 +2415,6 @@ using Instr = uint32_t;
V(vgbbd, VGBBD, 0x1000050C) \
/* Vector Log Base 2 Estimate Single-Precision */ \
V(vlogefp, VLOGEFP, 0x100001CA) \
- /* Vector Maximum Single-Precision */ \
- V(vmaxfp, VMAXFP, 0x1000040A) \
- /* Vector Minimum Single-Precision */ \
- V(vminfp, VMINFP, 0x1000044A) \
/* Vector Merge High Byte */ \
V(vmrghb, VMRGHB, 0x1000000C) \
/* Vector Merge High Halfword */ \
diff --git a/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc b/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc
index cab95e2f41..4d68e01285 100644
--- a/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc
+++ b/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc
@@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return r3; }
const Register LoadWithVectorDescriptor::VectorRegister() { return r6; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return r7;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return r4; }
const Register StoreDescriptor::NameRegister() { return r5; }
const Register StoreDescriptor::ValueRegister() { return r3; }
diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
index c99977a5be..4a526384e0 100644
--- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
+++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
@@ -320,6 +320,38 @@ void TurboAssembler::Push(Smi smi) {
push(r0);
}
+void TurboAssembler::PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order) {
+ Label loop, done;
+
+ if (order == kNormal) {
+ cmpi(size, Operand::Zero());
+ beq(&done);
+ ShiftLeftImm(scratch, size, Operand(kSystemPointerSizeLog2));
+ add(scratch, array, scratch);
+ mtctr(size);
+
+ bind(&loop);
+ LoadPU(scratch2, MemOperand(scratch, -kSystemPointerSize));
+ StorePU(scratch2, MemOperand(sp, -kSystemPointerSize));
+ bdnz(&loop);
+
+ bind(&done);
+ } else {
+ cmpi(size, Operand::Zero());
+ beq(&done);
+
+ mtctr(size);
+ subi(scratch, array, Operand(kSystemPointerSize));
+
+ bind(&loop);
+ LoadPU(scratch2, MemOperand(scratch, kSystemPointerSize));
+ StorePU(scratch2, MemOperand(sp, -kSystemPointerSize));
+ bdnz(&loop);
+ bind(&done);
+ }
+}
+
void TurboAssembler::Move(Register dst, Handle<HeapObject> value,
RelocInfo::Mode rmode) {
// TODO(jgruber,v8:8887): Also consider a root-relative load when generating
@@ -775,6 +807,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) {
}
}
addi(fp, sp, Operand(fp_delta * kSystemPointerSize));
+ Push(kJavaScriptCallArgCountRegister);
}
void TurboAssembler::RestoreFrameStateForTailCall() {
@@ -1350,8 +1383,7 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
{
// Load receiver to pass it later to DebugOnFunctionCall hook.
- ShiftLeftImm(r7, actual_parameter_count, Operand(kSystemPointerSizeLog2));
- LoadPX(r7, MemOperand(sp, r7));
+ LoadReceiver(r7, actual_parameter_count);
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
index 0e9c764add..a74985cbe1 100644
--- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
+++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
@@ -237,6 +237,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
StoreP(src1, MemOperand(sp, 4 * kSystemPointerSize));
}
+ enum PushArrayOrder { kNormal, kReverse };
+ void PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order = kNormal);
+
void Pop(Register dst) { pop(dst); }
// Pop two registers. Pops rightmost register first (from lower address).
@@ -719,6 +723,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
public:
using TurboAssembler::TurboAssembler;
+ // It assumes that the arguments are located below the stack pointer.
+ // argc is the number of arguments not including the receiver.
+ // TODO(victorgomes): Remove this function once we stick with the reversed
+ // arguments order.
+ void LoadReceiver(Register dest, Register argc) {
+#ifdef V8_REVERSE_JSARGS
+ LoadP(dest, MemOperand(sp, 0));
+#else
+ ShiftLeftImm(dest, argc, Operand(kSystemPointerSizeLog2));
+ LoadPX(dest, MemOperand(sp, dest));
+#endif
+ }
+
+ void StoreReceiver(Register rec, Register argc, Register scratch) {
+#ifdef V8_REVERSE_JSARGS
+ StoreP(rec, MemOperand(sp, 0));
+#else
+ ShiftLeftImm(scratch, argc, Operand(kSystemPointerSizeLog2));
+ StorePX(rec, MemOperand(sp, scratch));
+#endif
+ }
+
// ---------------------------------------------------------------------------
// GC Support
diff --git a/deps/v8/src/codegen/s390/interface-descriptors-s390.cc b/deps/v8/src/codegen/s390/interface-descriptors-s390.cc
index 9e341c357b..6c56c19b5a 100644
--- a/deps/v8/src/codegen/s390/interface-descriptors-s390.cc
+++ b/deps/v8/src/codegen/s390/interface-descriptors-s390.cc
@@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return r2; }
const Register LoadWithVectorDescriptor::VectorRegister() { return r5; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return r6;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return r3; }
const Register StoreDescriptor::NameRegister() { return r4; }
const Register StoreDescriptor::ValueRegister() { return r2; }
diff --git a/deps/v8/src/codegen/s390/macro-assembler-s390.cc b/deps/v8/src/codegen/s390/macro-assembler-s390.cc
index 08adf57ff7..5c9fe62dd1 100644
--- a/deps/v8/src/codegen/s390/macro-assembler-s390.cc
+++ b/deps/v8/src/codegen/s390/macro-assembler-s390.cc
@@ -379,6 +379,37 @@ void TurboAssembler::BranchRelativeOnIdxHighP(Register dst, Register inc,
#endif // V8_TARGET_ARCH_S390X
}
+void TurboAssembler::PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order) {
+ Label loop, done;
+
+ if (order == kNormal) {
+ ShiftLeftP(scratch, size, Operand(kSystemPointerSizeLog2));
+ lay(scratch, MemOperand(array, scratch));
+ bind(&loop);
+ CmpP(array, scratch);
+ bge(&done);
+ lay(scratch, MemOperand(scratch, -kSystemPointerSize));
+ lay(sp, MemOperand(sp, -kSystemPointerSize));
+ MoveChar(MemOperand(sp), MemOperand(scratch), Operand(kSystemPointerSize));
+ b(&loop);
+ bind(&done);
+ } else {
+ DCHECK_NE(scratch2, r0);
+ ShiftLeftP(scratch, size, Operand(kSystemPointerSizeLog2));
+ lay(scratch, MemOperand(array, scratch));
+ LoadRR(scratch2, array);
+ bind(&loop);
+ CmpP(scratch2, scratch);
+ bge(&done);
+ lay(sp, MemOperand(sp, -kSystemPointerSize));
+ MoveChar(MemOperand(sp), MemOperand(scratch2), Operand(kSystemPointerSize));
+ lay(scratch2, MemOperand(scratch2, kSystemPointerSize));
+ b(&loop);
+ bind(&done);
+ }
+}
+
void TurboAssembler::MultiPush(RegList regs, Register location) {
int16_t num_to_push = base::bits::CountPopulation(regs);
int16_t stack_offset = num_to_push * kSystemPointerSize;
@@ -759,6 +790,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) {
fp_delta = 1;
}
la(fp, MemOperand(sp, fp_delta * kSystemPointerSize));
+ Push(kJavaScriptCallArgCountRegister);
}
void TurboAssembler::RestoreFrameStateForTailCall() {
@@ -1379,8 +1411,7 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
{
// Load receiver to pass it later to DebugOnFunctionCall hook.
- ShiftLeftP(r6, actual_parameter_count, Operand(kSystemPointerSizeLog2));
- LoadP(r6, MemOperand(sp, r6));
+ LoadReceiver(r6, actual_parameter_count);
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
diff --git a/deps/v8/src/codegen/s390/macro-assembler-s390.h b/deps/v8/src/codegen/s390/macro-assembler-s390.h
index 8b267eb2c6..f66be8c2ef 100644
--- a/deps/v8/src/codegen/s390/macro-assembler-s390.h
+++ b/deps/v8/src/codegen/s390/macro-assembler-s390.h
@@ -592,6 +592,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
StoreP(src5, MemOperand(sp, 0));
}
+ enum PushArrayOrder { kNormal, kReverse };
+ void PushArray(Register array, Register size, Register scratch,
+ Register scratch2, PushArrayOrder order = kNormal);
+
void Pop(Register dst) { pop(dst); }
// Pop two registers. Pops rightmost register first (from lower address).
@@ -1063,6 +1067,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
public:
using TurboAssembler::TurboAssembler;
+ // It assumes that the arguments are located below the stack pointer.
+ // argc is the number of arguments not including the receiver.
+ // TODO(victorgomes): Remove this function once we stick with the reversed
+ // arguments order.
+ void LoadReceiver(Register dest, Register argc) {
+#ifdef V8_REVERSE_JSARGS
+ LoadP(dest, MemOperand(sp, 0));
+#else
+ ShiftLeftP(dest, argc, Operand(kSystemPointerSizeLog2));
+ LoadP(dest, MemOperand(sp, dest));
+#endif
+ }
+
+ void StoreReceiver(Register rec, Register argc, Register scratch) {
+#ifdef V8_REVERSE_JSARGS
+ StoreP(rec, MemOperand(sp, 0));
+#else
+ ShiftLeftP(scratch, argc, Operand(kSystemPointerSizeLog2));
+ StoreP(rec, MemOperand(sp, scratch));
+#endif
+ }
+
void CallRuntime(const Runtime::Function* f, int num_arguments,
SaveFPRegsMode save_doubles = kDontSaveFPRegs);
void CallRuntimeSaveDoubles(Runtime::FunctionId fid) {
diff --git a/deps/v8/src/codegen/signature.h b/deps/v8/src/codegen/signature.h
index 1213a1fd49..bba3a1b13d 100644
--- a/deps/v8/src/codegen/signature.h
+++ b/deps/v8/src/codegen/signature.h
@@ -21,7 +21,12 @@ class Signature : public ZoneObject {
const T* reps)
: return_count_(return_count),
parameter_count_(parameter_count),
- reps_(reps) {}
+ reps_(reps) {
+ DCHECK_EQ(kReturnCountOffset, offsetof(Signature, return_count_));
+ DCHECK_EQ(kParameterCountOffset, offsetof(Signature, parameter_count_));
+ DCHECK_EQ(kRepsOffset, offsetof(Signature, reps_));
+ STATIC_ASSERT(std::is_standard_layout<Signature<T>>::value);
+ }
size_t return_count() const { return return_count_; }
size_t parameter_count() const { return parameter_count_; }
@@ -99,6 +104,11 @@ class Signature : public ZoneObject {
T* buffer_;
};
+ static constexpr size_t kReturnCountOffset = 0;
+ static constexpr size_t kParameterCountOffset =
+ kReturnCountOffset + kSizetSize;
+ static constexpr size_t kRepsOffset = kParameterCountOffset + kSizetSize;
+
protected:
size_t return_count_;
size_t parameter_count_;
diff --git a/deps/v8/src/codegen/x64/interface-descriptors-x64.cc b/deps/v8/src/codegen/x64/interface-descriptors-x64.cc
index d86089ca1d..5a9c386eb8 100644
--- a/deps/v8/src/codegen/x64/interface-descriptors-x64.cc
+++ b/deps/v8/src/codegen/x64/interface-descriptors-x64.cc
@@ -54,6 +54,11 @@ const Register LoadDescriptor::SlotRegister() { return rax; }
const Register LoadWithVectorDescriptor::VectorRegister() { return rbx; }
+const Register
+LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
+ return rdi;
+}
+
const Register StoreDescriptor::ReceiverRegister() { return rdx; }
const Register StoreDescriptor::NameRegister() { return rcx; }
const Register StoreDescriptor::ValueRegister() { return rax; }
diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.cc b/deps/v8/src/codegen/x64/macro-assembler-x64.cc
index faa96b7d3f..7f7ff5038a 100644
--- a/deps/v8/src/codegen/x64/macro-assembler-x64.cc
+++ b/deps/v8/src/codegen/x64/macro-assembler-x64.cc
@@ -2365,6 +2365,51 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count,
Label* done, InvokeFlag flag) {
if (expected_parameter_count != actual_parameter_count) {
Label regular_invoke;
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ // Skip if adaptor sentinel.
+ cmpl(expected_parameter_count, Immediate(kDontAdaptArgumentsSentinel));
+ j(equal, &regular_invoke, Label::kNear);
+
+ // Skip if overapplication or if expected number of arguments.
+ subq(expected_parameter_count, actual_parameter_count);
+ j(less_equal, &regular_invoke, Label::kNear);
+
+ // Underapplication. Move the arguments already in the stack, including the
+ // receiver and the return address.
+ {
+ Label copy, check;
+ Register src = r8, dest = rsp, num = r9, current = r11;
+ movq(src, rsp);
+ leaq(kScratchRegister,
+ Operand(expected_parameter_count, times_system_pointer_size, 0));
+ AllocateStackSpace(kScratchRegister);
+ // Extra words are the receiver and the return address (if a jump).
+ int extra_words = flag == CALL_FUNCTION ? 1 : 2;
+ leaq(num, Operand(rax, extra_words)); // Number of words to copy.
+ Set(current, 0);
+ // Fall-through to the loop body because there are non-zero words to copy.
+ bind(&copy);
+ movq(kScratchRegister,
+ Operand(src, current, times_system_pointer_size, 0));
+ movq(Operand(dest, current, times_system_pointer_size, 0),
+ kScratchRegister);
+ incq(current);
+ bind(&check);
+ cmpq(current, num);
+ j(less, &copy);
+ leaq(r8, Operand(rsp, num, times_system_pointer_size, 0));
+ }
+ // Fill remaining expected arguments with undefined values.
+ LoadRoot(kScratchRegister, RootIndex::kUndefinedValue);
+ {
+ Label loop;
+ bind(&loop);
+ decq(expected_parameter_count);
+ movq(Operand(r8, expected_parameter_count, times_system_pointer_size, 0),
+ kScratchRegister);
+ j(greater, &loop, Label::kNear);
+ }
+#else
// Both expected and actual are in (different) registers. This
// is the case when we invoke functions using call and apply.
cmpq(expected_parameter_count, actual_parameter_count);
@@ -2378,6 +2423,8 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count,
} else {
Jump(adaptor, RelocInfo::CODE_TARGET);
}
+#endif
+
bind(&regular_invoke);
} else {
Move(rax, actual_parameter_count);
@@ -2430,8 +2477,9 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) {
void TurboAssembler::Prologue() {
pushq(rbp); // Caller's frame pointer.
movq(rbp, rsp);
- Push(rsi); // Callee's context.
- Push(rdi); // Callee's JS function.
+ Push(kContextRegister); // Callee's context.
+ Push(kJSFunctionRegister); // Callee's JS function.
+ Push(kJavaScriptCallArgCountRegister); // Actual argument count.
}
void TurboAssembler::EnterFrame(StackFrame::Type type) {
diff --git a/deps/v8/src/common/assert-scope.cc b/deps/v8/src/common/assert-scope.cc
index 64b5415bc9..531ac4e024 100644
--- a/deps/v8/src/common/assert-scope.cc
+++ b/deps/v8/src/common/assert-scope.cc
@@ -120,6 +120,8 @@ bool PerIsolateAssertScope<kType, kAllow>::IsAllowed(Isolate* isolate) {
// -----------------------------------------------------------------------------
// Instantiations.
+template class PerThreadAssertScope<GARBAGE_COLLECTION_ASSERT, false>;
+template class PerThreadAssertScope<GARBAGE_COLLECTION_ASSERT, true>;
template class PerThreadAssertScope<HEAP_ALLOCATION_ASSERT, false>;
template class PerThreadAssertScope<HEAP_ALLOCATION_ASSERT, true>;
template class PerThreadAssertScope<HANDLE_ALLOCATION_ASSERT, false>;
diff --git a/deps/v8/src/common/assert-scope.h b/deps/v8/src/common/assert-scope.h
index 85b9a47d5c..b958ca4bed 100644
--- a/deps/v8/src/common/assert-scope.h
+++ b/deps/v8/src/common/assert-scope.h
@@ -28,6 +28,7 @@ struct PointerWithPayloadTraits<PerThreadAssertData> {
};
enum PerThreadAssertType {
+ GARBAGE_COLLECTION_ASSERT,
HEAP_ALLOCATION_ASSERT,
HANDLE_ALLOCATION_ASSERT,
HANDLE_DEREFERENCE_ASSERT,
@@ -126,7 +127,17 @@ using DisallowHandleAllocation =
using AllowHandleAllocation =
PerThreadAssertScopeDebugOnly<HANDLE_ALLOCATION_ASSERT, true>;
-// Scope to document where we do not expect any allocation and GC.
+// Scope to document where we do not expect garbage collections. It differs from
+// DisallowHeapAllocation by also forbiding safepoints.
+using DisallowGarbageCollection =
+ PerThreadAssertScopeDebugOnly<GARBAGE_COLLECTION_ASSERT, false>;
+
+// Scope to introduce an exception to DisallowGarbageCollection.
+using AllowGarbageCollection =
+ PerThreadAssertScopeDebugOnly<GARBAGE_COLLECTION_ASSERT, true>;
+
+// Scope to document where we do not expect any allocation and GC. Deprecated
+// and will eventually be removed, use DisallowGarbageCollection instead.
using DisallowHeapAllocation =
PerThreadAssertScopeDebugOnly<HEAP_ALLOCATION_ASSERT, false>;
#ifdef DEBUG
diff --git a/deps/v8/src/common/globals.h b/deps/v8/src/common/globals.h
index dbc6b9af9b..0e9d815207 100644
--- a/deps/v8/src/common/globals.h
+++ b/deps/v8/src/common/globals.h
@@ -186,14 +186,13 @@ constexpr int kElidedFrameSlots = 0;
#endif
constexpr int kDoubleSizeLog2 = 3;
-constexpr size_t kMaxWasmCodeMB = 1024;
+
+// Total wasm code space per engine (i.e. per process) is limited to make
+// certain attacks that rely on heap spraying harder.
+// This limit was increased to 2GB in August 2020 and we have security clearance
+// to increase to 4GB if needed.
+constexpr size_t kMaxWasmCodeMB = 2048;
constexpr size_t kMaxWasmCodeMemory = kMaxWasmCodeMB * MB;
-#if V8_TARGET_ARCH_ARM64
-// ARM64 only supports direct calls within a 128 MB range.
-constexpr size_t kMaxWasmCodeSpaceSize = 128 * MB;
-#else
-constexpr size_t kMaxWasmCodeSpaceSize = kMaxWasmCodeMemory;
-#endif
#if V8_HOST_ARCH_64_BIT
constexpr int kSystemPointerSizeLog2 = 3;
@@ -747,20 +746,20 @@ using WeakSlotCallbackWithHeap = bool (*)(Heap* heap, FullObjectSlot pointer);
// NOTE: SpaceIterator depends on AllocationSpace enumeration values being
// consecutive.
enum AllocationSpace {
- RO_SPACE, // Immortal, immovable and immutable objects,
- NEW_SPACE, // Young generation semispaces for regular objects collected with
- // Scavenger.
- OLD_SPACE, // Old generation regular object space.
- CODE_SPACE, // Old generation code object space, marked executable.
- MAP_SPACE, // Old generation map object space, non-movable.
- LO_SPACE, // Old generation large object space.
+ RO_SPACE, // Immortal, immovable and immutable objects,
+ OLD_SPACE, // Old generation regular object space.
+ CODE_SPACE, // Old generation code object space, marked executable.
+ MAP_SPACE, // Old generation map object space, non-movable.
+ LO_SPACE, // Old generation large object space.
CODE_LO_SPACE, // Old generation large code object space.
NEW_LO_SPACE, // Young generation large object space.
+ NEW_SPACE, // Young generation semispaces for regular objects collected with
+ // Scavenger.
FIRST_SPACE = RO_SPACE,
- LAST_SPACE = NEW_LO_SPACE,
- FIRST_MUTABLE_SPACE = NEW_SPACE,
- LAST_MUTABLE_SPACE = NEW_LO_SPACE,
+ LAST_SPACE = NEW_SPACE,
+ FIRST_MUTABLE_SPACE = OLD_SPACE,
+ LAST_MUTABLE_SPACE = NEW_SPACE,
FIRST_GROWABLE_PAGED_SPACE = OLD_SPACE,
LAST_GROWABLE_PAGED_SPACE = MAP_SPACE
};
@@ -1628,6 +1627,7 @@ enum class LoadSensitivity {
V(TrapRethrowNull) \
V(TrapNullDereference) \
V(TrapIllegalCast) \
+ V(TrapWasmJSFunction) \
V(TrapArrayOutOfBounds)
enum KeyedAccessLoadMode {
diff --git a/deps/v8/src/common/message-template.h b/deps/v8/src/common/message-template.h
index c4edee4921..b7bbc6da84 100644
--- a/deps/v8/src/common/message-template.h
+++ b/deps/v8/src/common/message-template.h
@@ -318,6 +318,7 @@ namespace internal {
T(BigIntDivZero, "Division by zero") \
T(BigIntNegativeExponent, "Exponent must be positive") \
T(BigIntTooBig, "Maximum BigInt size exceeded") \
+ T(CantSetOptionXWhenYIsUsed, "Can't set option % when % is used") \
T(DateRange, "Provided date is not in valid range.") \
T(ExpectedLocation, \
"Expected letters optionally connected with underscores or hyphens for " \
@@ -562,6 +563,7 @@ namespace internal {
T(WasmTrapNullDereference, "dereferencing a null pointer") \
T(WasmTrapIllegalCast, "illegal cast") \
T(WasmTrapArrayOutOfBounds, "array element access out of bounds") \
+ T(WasmTrapWasmJSFunction, "cannot call WebAssembly.Function with call_ref") \
T(WasmExceptionError, "wasm exception") \
/* Asm.js validation related */ \
T(AsmJsInvalid, "Invalid asm.js: %") \
diff --git a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc
index 6848ca2060..528a9babe3 100644
--- a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc
+++ b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc
@@ -214,7 +214,7 @@ void OptimizingCompileDispatcher::InstallOptimizedFunctions() {
}
OptimizedCompilationInfo* info = job->compilation_info();
Handle<JSFunction> function(*info->closure(), isolate_);
- if (function->HasAvailableOptimizedCode()) {
+ if (function->HasAvailableCodeKind(info->code_kind())) {
if (FLAG_trace_concurrent_recompilation) {
PrintF(" ** Aborting compilation for ");
function->ShortPrint();
diff --git a/deps/v8/src/compiler/access-builder.cc b/deps/v8/src/compiler/access-builder.cc
index 1b3b2752b6..f9d15264e6 100644
--- a/deps/v8/src/compiler/access-builder.cc
+++ b/deps/v8/src/compiler/access-builder.cc
@@ -17,7 +17,7 @@
#include "src/objects/objects-inl.h"
#include "src/objects/ordered-hash-table.h"
#include "src/objects/source-text-module.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
@@ -871,6 +871,15 @@ FieldAccess AccessBuilder::ForFeedbackVectorSlot(int index) {
}
// static
+FieldAccess AccessBuilder::ForWeakFixedArraySlot(int index) {
+ int offset = WeakFixedArray::OffsetOfElementAt(index);
+ FieldAccess access = {kTaggedBase, offset,
+ Handle<Name>(), MaybeHandle<Map>(),
+ Type::Any(), MachineType::AnyTagged(),
+ kFullWriteBarrier};
+ return access;
+}
+// static
FieldAccess AccessBuilder::ForCellValue() {
FieldAccess access = {kTaggedBase, Cell::kValueOffset,
Handle<Name>(), MaybeHandle<Map>(),
@@ -1239,6 +1248,16 @@ FieldAccess AccessBuilder::ForFeedbackVectorClosureFeedbackCellArray() {
return access;
}
+// static
+FieldAccess AccessBuilder::ForFeedbackVectorOptimizedCodeWeakOrSmi() {
+ FieldAccess access = {
+ kTaggedBase, FeedbackVector::kOptimizedCodeWeakOrSmiOffset,
+ Handle<Name>(), MaybeHandle<Map>(),
+ Type::Any(), MachineType::AnyTagged(),
+ kFullWriteBarrier};
+ return access;
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/compiler/access-builder.h b/deps/v8/src/compiler/access-builder.h
index 52c1261ff0..af5882988d 100644
--- a/deps/v8/src/compiler/access-builder.h
+++ b/deps/v8/src/compiler/access-builder.h
@@ -293,6 +293,7 @@ class V8_EXPORT_PRIVATE AccessBuilder final
// Provides access to WeakFixedArray elements.
static ElementAccess ForWeakFixedArrayElement();
+ static FieldAccess ForWeakFixedArraySlot(int index);
// Provides access to FixedArray elements.
static ElementAccess ForFixedArrayElement();
@@ -344,6 +345,7 @@ class V8_EXPORT_PRIVATE AccessBuilder final
// Provides access to a FeedbackVector fields.
static FieldAccess ForFeedbackVectorClosureFeedbackCellArray();
+ static FieldAccess ForFeedbackVectorOptimizedCodeWeakOrSmi();
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(AccessBuilder);
diff --git a/deps/v8/src/compiler/access-info.cc b/deps/v8/src/compiler/access-info.cc
index 4fb5ebd69c..046927e943 100644
--- a/deps/v8/src/compiler/access-info.cc
+++ b/deps/v8/src/compiler/access-info.cc
@@ -40,6 +40,19 @@ bool CanInlinePropertyAccess(Handle<Map> map) {
!map->is_access_check_needed();
}
+#ifdef DEBUG
+bool HasFieldRepresentationDependenciesOnMap(
+ ZoneVector<CompilationDependency const*>& dependencies,
+ Handle<Map> const& field_owner_map) {
+ for (auto dep : dependencies) {
+ if (dep->IsFieldRepresentationDependencyOnMap(field_owner_map)) {
+ return true;
+ }
+ }
+ return false;
+}
+#endif
+
} // namespace
@@ -84,6 +97,9 @@ PropertyAccessInfo PropertyAccessInfo::DataField(
FieldIndex field_index, Representation field_representation,
Type field_type, Handle<Map> field_owner_map, MaybeHandle<Map> field_map,
MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map) {
+ DCHECK_IMPLIES(
+ field_representation.IsDouble(),
+ HasFieldRepresentationDependenciesOnMap(dependencies, field_owner_map));
return PropertyAccessInfo(kDataField, holder, transition_map, field_index,
field_representation, field_type, field_owner_map,
field_map, {{receiver_map}, zone},
diff --git a/deps/v8/src/compiler/allocation-builder-inl.h b/deps/v8/src/compiler/allocation-builder-inl.h
index 2b6109f49e..8a9d74e071 100644
--- a/deps/v8/src/compiler/allocation-builder-inl.h
+++ b/deps/v8/src/compiler/allocation-builder-inl.h
@@ -8,8 +8,8 @@
#include "src/compiler/access-builder.h"
#include "src/compiler/allocation-builder.h"
#include "src/objects/map-inl.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/compiler/backend/arm/code-generator-arm.cc b/deps/v8/src/compiler/backend/arm/code-generator-arm.cc
index b01297e03a..2c7e856239 100644
--- a/deps/v8/src/compiler/backend/arm/code-generator-arm.cc
+++ b/deps/v8/src/compiler/backend/arm/code-generator-arm.cc
@@ -2026,7 +2026,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Simd128Register rhs = i.InputSimd128Register(1);
DCHECK_EQ(dst, lhs);
- // Move rhs only when rhs is strictly greater (mi).
+ // Move rhs only when rhs is strictly lesser (mi).
__ VFPCompareAndSetFlags(rhs.low(), lhs.low());
__ vmov(dst.low(), rhs.low(), mi);
__ VFPCompareAndSetFlags(rhs.high(), lhs.high());
@@ -2039,7 +2039,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Simd128Register rhs = i.InputSimd128Register(1);
DCHECK_EQ(dst, lhs);
- // Move rhs only when rhs is strictly greater (mi).
+ // Move rhs only when rhs is strictly greater (gt).
__ VFPCompareAndSetFlags(rhs.low(), lhs.low());
__ vmov(dst.low(), rhs.low(), gt);
__ VFPCompareAndSetFlags(rhs.high(), lhs.high());
@@ -2150,7 +2150,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArmI64x2Neg: {
Simd128Register dst = i.OutputSimd128Register();
__ vmov(dst, uint64_t{0});
- __ vqsub(NeonS64, dst, dst, i.InputSimd128Register(0));
+ __ vsub(Neon64, dst, dst, i.InputSimd128Register(0));
break;
}
case kArmI64x2Shl: {
@@ -3097,7 +3097,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
i.InputSimd128Register(1), i.InputInt4(2));
break;
}
- case kArmS8x16Swizzle: {
+ case kArmI8x16Swizzle: {
Simd128Register dst = i.OutputSimd128Register(),
tbl = i.InputSimd128Register(0),
src = i.InputSimd128Register(1);
@@ -3106,7 +3106,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ vtbl(dst.high(), table, src.high());
break;
}
- case kArmS8x16Shuffle: {
+ case kArmI8x16Shuffle: {
Simd128Register dst = i.OutputSimd128Register(),
src0 = i.InputSimd128Register(0),
src1 = i.InputSimd128Register(1);
@@ -3648,9 +3648,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue();
- if (call_descriptor->PushArgumentCount()) {
- __ Push(kJavaScriptCallArgCountRegister);
- }
} else {
__ StubPrologue(info()->GetOutputStackFrameType());
if (call_descriptor->IsWasmFunctionCall()) {
diff --git a/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h b/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h
index 64707cb612..b3ee561e27 100644
--- a/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h
+++ b/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h
@@ -307,8 +307,8 @@ namespace compiler {
V(ArmS8x16TransposeLeft) \
V(ArmS8x16TransposeRight) \
V(ArmS8x16Concat) \
- V(ArmS8x16Swizzle) \
- V(ArmS8x16Shuffle) \
+ V(ArmI8x16Swizzle) \
+ V(ArmI8x16Shuffle) \
V(ArmS32x2Reverse) \
V(ArmS16x4Reverse) \
V(ArmS16x2Reverse) \
diff --git a/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc b/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc
index aa9fa9e17b..6459d22a11 100644
--- a/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc
+++ b/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc
@@ -287,8 +287,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kArmS8x16TransposeLeft:
case kArmS8x16TransposeRight:
case kArmS8x16Concat:
- case kArmS8x16Swizzle:
- case kArmS8x16Shuffle:
+ case kArmI8x16Swizzle:
+ case kArmI8x16Shuffle:
case kArmS32x2Reverse:
case kArmS16x4Reverse:
case kArmS16x2Reverse:
diff --git a/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc b/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc
index c53c8f372e..e868a1a47a 100644
--- a/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc
+++ b/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc
@@ -2870,7 +2870,7 @@ void ArrangeShuffleTable(ArmOperandGenerator* g, Node* input0, Node* input1,
} // namespace
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -2923,18 +2923,18 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
// Code generator uses vtbl, arrange sources to form a valid lookup table.
InstructionOperand src0, src1;
ArrangeShuffleTable(&g, input0, input1, &src0, &src1);
- Emit(kArmS8x16Shuffle, g.DefineAsRegister(node), src0, src1,
+ Emit(kArmI8x16Shuffle, g.DefineAsRegister(node), src0, src1,
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 8)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 12)));
}
-void InstructionSelector::VisitS8x16Swizzle(Node* node) {
+void InstructionSelector::VisitI8x16Swizzle(Node* node) {
ArmOperandGenerator g(this);
// We don't want input 0 (the table) to be the same as output, since we will
// modify output twice (low and high), and need to keep the table the same.
- Emit(kArmS8x16Swizzle, g.DefineAsRegister(node),
+ Emit(kArmI8x16Swizzle, g.DefineAsRegister(node),
g.UseUniqueRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
}
diff --git a/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc b/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc
index cee8651276..6524502408 100644
--- a/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc
+++ b/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc
@@ -2551,18 +2551,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
i.InputSimd128Register(1).V16B(), i.InputInt4(2));
break;
}
- case kArm64S8x16Swizzle: {
+ case kArm64I8x16Swizzle: {
__ Tbl(i.OutputSimd128Register().V16B(), i.InputSimd128Register(0).V16B(),
i.InputSimd128Register(1).V16B());
break;
}
- case kArm64S8x16Shuffle: {
+ case kArm64I8x16Shuffle: {
Simd128Register dst = i.OutputSimd128Register().V16B(),
src0 = i.InputSimd128Register(0).V16B(),
src1 = i.InputSimd128Register(1).V16B();
// Unary shuffle table is in src0, binary shuffle table is in src0, src1,
// which must be consecutive.
- int64_t mask = 0;
+ uint32_t mask = 0;
if (src0 == src1) {
mask = 0x0F0F0F0F;
} else {
@@ -2601,20 +2601,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Add(i.OutputRegister32(), i.OutputRegister32(), 1);
break;
}
- case kArm64S8x16LoadSplat: {
- __ ld1r(i.OutputSimd128Register().V16B(), i.MemoryOperand(0));
- break;
- }
- case kArm64S16x8LoadSplat: {
- __ ld1r(i.OutputSimd128Register().V8H(), i.MemoryOperand(0));
- break;
- }
- case kArm64S32x4LoadSplat: {
- __ ld1r(i.OutputSimd128Register().V4S(), i.MemoryOperand(0));
- break;
- }
- case kArm64S64x2LoadSplat: {
- __ ld1r(i.OutputSimd128Register().V2D(), i.MemoryOperand(0));
+ case kArm64LoadSplat: {
+ VectorFormat f = VectorFormatFillQ(MiscField::decode(opcode));
+ __ ld1r(i.OutputSimd128Register().Format(f), i.MemoryOperand(0));
break;
}
case kArm64I16x8Load8x8S: {
@@ -2647,6 +2636,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Uxtl(i.OutputSimd128Register().V2D(), i.OutputSimd128Register().V2S());
break;
}
+ case kArm64S128LoadMem32Zero: {
+ __ Ldr(i.OutputSimd128Register().S(), i.MemoryOperand(0));
+ break;
+ }
+ case kArm64S128LoadMem64Zero: {
+ __ Ldr(i.OutputSimd128Register().D(), i.MemoryOperand(0));
+ break;
+ }
#define SIMD_REDUCE_OP_CASE(Op, Instr, format, FORMAT) \
case Op: { \
UseScratchRegisterScope scope(tasm()); \
@@ -2657,13 +2654,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Cset(i.OutputRegister32(), ne); \
break; \
}
- // for AnyTrue, the format does not matter, umaxv does not support 2D
- SIMD_REDUCE_OP_CASE(kArm64V64x2AnyTrue, Umaxv, kFormatS, 4S);
- SIMD_REDUCE_OP_CASE(kArm64V32x4AnyTrue, Umaxv, kFormatS, 4S);
+ // For AnyTrue, the format does not matter.
+ SIMD_REDUCE_OP_CASE(kArm64V128AnyTrue, Umaxv, kFormatS, 4S);
SIMD_REDUCE_OP_CASE(kArm64V32x4AllTrue, Uminv, kFormatS, 4S);
- SIMD_REDUCE_OP_CASE(kArm64V16x8AnyTrue, Umaxv, kFormatH, 8H);
SIMD_REDUCE_OP_CASE(kArm64V16x8AllTrue, Uminv, kFormatH, 8H);
- SIMD_REDUCE_OP_CASE(kArm64V8x16AnyTrue, Umaxv, kFormatB, 16B);
SIMD_REDUCE_OP_CASE(kArm64V8x16AllTrue, Uminv, kFormatB, 16B);
}
return kSuccess;
@@ -2911,7 +2905,12 @@ void CodeGenerator::AssembleConstructFrame() {
if (frame_access_state()->has_frame()) {
// Link the frame
if (call_descriptor->IsJSFunctionCall()) {
+ STATIC_ASSERT(InterpreterFrameConstants::kFixedFrameSize % 16 == 8);
+ DCHECK_EQ(required_slots % 2, 1);
__ Prologue();
+ // Update required_slots count since we have just claimed one extra slot.
+ STATIC_ASSERT(TurboAssembler::kExtraSlotClaimedByPrologue == 1);
+ required_slots -= TurboAssembler::kExtraSlotClaimedByPrologue;
} else {
__ Push<TurboAssembler::kSignLR>(lr, fp);
__ Mov(fp, sp);
@@ -2929,7 +2928,13 @@ void CodeGenerator::AssembleConstructFrame() {
// to allocate the remaining stack slots.
if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --");
osr_pc_offset_ = __ pc_offset();
- required_slots -= osr_helper()->UnoptimizedFrameSlots();
+ size_t unoptimized_frame_slots = osr_helper()->UnoptimizedFrameSlots();
+ DCHECK(call_descriptor->IsJSFunctionCall());
+ DCHECK_EQ(unoptimized_frame_slots % 2, 1);
+ // One unoptimized frame slot has already been claimed when the actual
+ // arguments count was pushed.
+ required_slots -=
+ unoptimized_frame_slots - TurboAssembler::kExtraSlotClaimedByPrologue;
ResetSpeculationPoison();
}
@@ -2984,13 +2989,7 @@ void CodeGenerator::AssembleConstructFrame() {
// recording their argument count.
switch (call_descriptor->kind()) {
case CallDescriptor::kCallJSFunction:
- if (call_descriptor->PushArgumentCount()) {
- __ Claim(required_slots + 1); // Claim extra slot for argc.
- __ Str(kJavaScriptCallArgCountRegister,
- MemOperand(fp, OptimizedBuiltinFrameConstants::kArgCOffset));
- } else {
- __ Claim(required_slots);
- }
+ __ Claim(required_slots);
break;
case CallDescriptor::kCallCodeObject: {
UseScratchRegisterScope temps(tasm());
diff --git a/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h b/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h
index e74819d9d6..7f84a3504b 100644
--- a/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h
+++ b/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h
@@ -367,26 +367,20 @@ namespace compiler {
V(Arm64S8x16TransposeLeft) \
V(Arm64S8x16TransposeRight) \
V(Arm64S8x16Concat) \
- V(Arm64S8x16Swizzle) \
- V(Arm64S8x16Shuffle) \
+ V(Arm64I8x16Swizzle) \
+ V(Arm64I8x16Shuffle) \
V(Arm64S32x2Reverse) \
V(Arm64S16x4Reverse) \
V(Arm64S16x2Reverse) \
V(Arm64S8x8Reverse) \
V(Arm64S8x4Reverse) \
V(Arm64S8x2Reverse) \
- V(Arm64V64x2AnyTrue) \
+ V(Arm64V128AnyTrue) \
V(Arm64V64x2AllTrue) \
- V(Arm64V32x4AnyTrue) \
V(Arm64V32x4AllTrue) \
- V(Arm64V16x8AnyTrue) \
V(Arm64V16x8AllTrue) \
- V(Arm64V8x16AnyTrue) \
V(Arm64V8x16AllTrue) \
- V(Arm64S8x16LoadSplat) \
- V(Arm64S16x8LoadSplat) \
- V(Arm64S32x4LoadSplat) \
- V(Arm64S64x2LoadSplat) \
+ V(Arm64LoadSplat) \
V(Arm64I16x8Load8x8S) \
V(Arm64I16x8Load8x8U) \
V(Arm64I32x4Load16x4S) \
@@ -428,7 +422,11 @@ namespace compiler {
V(Arm64Word64AtomicCompareExchangeUint8) \
V(Arm64Word64AtomicCompareExchangeUint16) \
V(Arm64Word64AtomicCompareExchangeUint32) \
- V(Arm64Word64AtomicCompareExchangeUint64)
+ V(Arm64Word64AtomicCompareExchangeUint64) \
+ V(Arm64S128LoadMem32Zero) \
+ V(Arm64S128LoadMem64Zero)
+// TODO(v8:10930) Adding new codes before these atomic instructions causes a
+// mksnapshot error.
// Addressing modes represent the "shape" of inputs to an instruction.
// Many instructions support multiple addressing modes. Addressing modes
diff --git a/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc b/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc
index 5d75c5147e..6c572d2a1c 100644
--- a/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc
+++ b/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc
@@ -337,21 +337,18 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kArm64S8x16TransposeLeft:
case kArm64S8x16TransposeRight:
case kArm64S8x16Concat:
- case kArm64S8x16Swizzle:
- case kArm64S8x16Shuffle:
+ case kArm64I8x16Swizzle:
+ case kArm64I8x16Shuffle:
case kArm64S32x2Reverse:
case kArm64S16x4Reverse:
case kArm64S16x2Reverse:
case kArm64S8x8Reverse:
case kArm64S8x4Reverse:
case kArm64S8x2Reverse:
- case kArm64V64x2AnyTrue:
+ case kArm64V128AnyTrue:
case kArm64V64x2AllTrue:
- case kArm64V32x4AnyTrue:
case kArm64V32x4AllTrue:
- case kArm64V16x8AnyTrue:
case kArm64V16x8AllTrue:
- case kArm64V8x16AnyTrue:
case kArm64V8x16AllTrue:
case kArm64TestAndBranch32:
case kArm64TestAndBranch:
@@ -373,16 +370,15 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kArm64LdrDecompressTaggedPointer:
case kArm64LdrDecompressAnyTagged:
case kArm64Peek:
- case kArm64S8x16LoadSplat:
- case kArm64S16x8LoadSplat:
- case kArm64S32x4LoadSplat:
- case kArm64S64x2LoadSplat:
+ case kArm64LoadSplat:
case kArm64I16x8Load8x8S:
case kArm64I16x8Load8x8U:
case kArm64I32x4Load16x4S:
case kArm64I32x4Load16x4U:
case kArm64I64x2Load32x2S:
case kArm64I64x2Load32x2U:
+ case kArm64S128LoadMem32Zero:
+ case kArm64S128LoadMem64Zero:
return kIsLoadOperation;
case kArm64Claim:
diff --git a/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc b/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
index 5f19a6bb7c..fac7f9c1d1 100644
--- a/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
+++ b/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
@@ -607,19 +607,23 @@ void InstructionSelector::VisitLoadTransform(Node* node) {
bool require_add = false;
switch (params.transformation) {
case LoadTransformation::kS8x16LoadSplat:
- opcode = kArm64S8x16LoadSplat;
+ opcode = kArm64LoadSplat;
+ opcode |= MiscField::encode(8);
require_add = true;
break;
case LoadTransformation::kS16x8LoadSplat:
- opcode = kArm64S16x8LoadSplat;
+ opcode = kArm64LoadSplat;
+ opcode |= MiscField::encode(16);
require_add = true;
break;
case LoadTransformation::kS32x4LoadSplat:
- opcode = kArm64S32x4LoadSplat;
+ opcode = kArm64LoadSplat;
+ opcode |= MiscField::encode(32);
require_add = true;
break;
case LoadTransformation::kS64x2LoadSplat:
- opcode = kArm64S64x2LoadSplat;
+ opcode = kArm64LoadSplat;
+ opcode |= MiscField::encode(64);
require_add = true;
break;
case LoadTransformation::kI16x8Load8x8S:
@@ -640,6 +644,12 @@ void InstructionSelector::VisitLoadTransform(Node* node) {
case LoadTransformation::kI64x2Load32x2U:
opcode = kArm64I64x2Load32x2U;
break;
+ case LoadTransformation::kS128LoadMem32Zero:
+ opcode = kArm64S128LoadMem32Zero;
+ break;
+ case LoadTransformation::kS128LoadMem64Zero:
+ opcode = kArm64S128LoadMem64Zero;
+ break;
default:
UNIMPLEMENTED();
}
@@ -1397,7 +1407,7 @@ void InstructionSelector::VisitWord64Ror(Node* node) {
V(Float64Max, kArm64Float64Max) \
V(Float32Min, kArm64Float32Min) \
V(Float64Min, kArm64Float64Min) \
- V(S8x16Swizzle, kArm64S8x16Swizzle)
+ V(I8x16Swizzle, kArm64I8x16Swizzle)
#define RR_VISITOR(Name, opcode) \
void InstructionSelector::Visit##Name(Node* node) { \
@@ -1775,10 +1785,9 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
VisitRR(this, kArm64Sxtw, node);
}
-void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
- Arm64OperandGenerator g(this);
- Node* value = node->InputAt(0);
- switch (value->opcode()) {
+bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) {
+ DCHECK_NE(node->opcode(), IrOpcode::kPhi);
+ switch (node->opcode()) {
case IrOpcode::kWord32And:
case IrOpcode::kWord32Or:
case IrOpcode::kWord32Xor:
@@ -1805,26 +1814,31 @@ void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
// 32-bit operations will write their result in a W register (implicitly
// clearing the top 32-bit of the corresponding X register) so the
// zero-extension is a no-op.
- EmitIdentity(node);
- return;
+ return true;
}
case IrOpcode::kLoad: {
// As for the operations above, a 32-bit load will implicitly clear the
// top 32 bits of the destination register.
- LoadRepresentation load_rep = LoadRepresentationOf(value->op());
+ LoadRepresentation load_rep = LoadRepresentationOf(node->op());
switch (load_rep.representation()) {
case MachineRepresentation::kWord8:
case MachineRepresentation::kWord16:
case MachineRepresentation::kWord32:
- EmitIdentity(node);
- return;
+ return true;
default:
- break;
+ return false;
}
- break;
}
default:
- break;
+ return false;
+ }
+}
+
+void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
+ Arm64OperandGenerator g(this);
+ Node* value = node->InputAt(0);
+ if (ZeroExtendsWord32ToWord64(value)) {
+ return EmitIdentity(node);
}
Emit(kArm64Mov32, g.DefineAsRegister(node), g.UseRegister(value));
}
@@ -3225,13 +3239,13 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(I8x16Neg, kArm64I8x16Neg) \
V(I8x16Abs, kArm64I8x16Abs) \
V(S128Not, kArm64S128Not) \
- V(V64x2AnyTrue, kArm64V64x2AnyTrue) \
+ V(V64x2AnyTrue, kArm64V128AnyTrue) \
V(V64x2AllTrue, kArm64V64x2AllTrue) \
- V(V32x4AnyTrue, kArm64V32x4AnyTrue) \
+ V(V32x4AnyTrue, kArm64V128AnyTrue) \
V(V32x4AllTrue, kArm64V32x4AllTrue) \
- V(V16x8AnyTrue, kArm64V16x8AnyTrue) \
+ V(V16x8AnyTrue, kArm64V128AnyTrue) \
V(V16x8AllTrue, kArm64V16x8AllTrue) \
- V(V8x16AnyTrue, kArm64V8x16AnyTrue) \
+ V(V8x16AnyTrue, kArm64V128AnyTrue) \
V(V8x16AllTrue, kArm64V8x16AllTrue)
#define SIMD_SHIFT_OP_LIST(V) \
@@ -3597,7 +3611,7 @@ void ArrangeShuffleTable(Arm64OperandGenerator* g, Node* input0, Node* input1,
} // namespace
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -3647,7 +3661,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
// Code generator uses vtbl, arrange sources to form a valid lookup table.
InstructionOperand src0, src1;
ArrangeShuffleTable(&g, input0, input1, &src0, &src1);
- Emit(kArm64S8x16Shuffle, g.DefineAsRegister(node), src0, src1,
+ Emit(kArm64I8x16Shuffle, g.DefineAsRegister(node), src0, src1,
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 8)),
diff --git a/deps/v8/src/compiler/backend/code-generator-impl.h b/deps/v8/src/compiler/backend/code-generator-impl.h
index e335135240..88f82fe930 100644
--- a/deps/v8/src/compiler/backend/code-generator-impl.h
+++ b/deps/v8/src/compiler/backend/code-generator-impl.h
@@ -259,6 +259,12 @@ class OutOfLineCode : public ZoneObject {
inline bool HasCallDescriptorFlag(Instruction* instr,
CallDescriptor::Flag flag) {
+ STATIC_ASSERT(CallDescriptor::kFlagsBitsEncodedInInstructionCode == 10);
+#ifdef DEBUG
+ static constexpr int kInstructionCodeFlagsMask =
+ ((1 << CallDescriptor::kFlagsBitsEncodedInInstructionCode) - 1);
+ DCHECK_EQ(static_cast<int>(flag) & kInstructionCodeFlagsMask, flag);
+#endif
return MiscField::decode(instr->opcode()) & flag;
}
diff --git a/deps/v8/src/compiler/backend/code-generator.cc b/deps/v8/src/compiler/backend/code-generator.cc
index 6e740b18f8..33a80f52d0 100644
--- a/deps/v8/src/compiler/backend/code-generator.cc
+++ b/deps/v8/src/compiler/backend/code-generator.cc
@@ -613,8 +613,8 @@ void CodeGenerator::GetPushCompatibleMoves(Instruction* instr,
// then the full gap resolver must be used since optimization with
// pushes don't participate in the parallel move and might clobber
// values needed for the gap resolve.
- if (source.IsStackSlot() && LocationOperand::cast(source).index() >=
- first_push_compatible_index) {
+ if (source.IsAnyStackSlot() && LocationOperand::cast(source).index() >=
+ first_push_compatible_index) {
pushes->clear();
return;
}
@@ -973,15 +973,13 @@ Label* CodeGenerator::AddJumpTable(Label** targets, size_t target_count) {
}
void CodeGenerator::RecordCallPosition(Instruction* instr) {
- CallDescriptor::Flags flags(MiscField::decode(instr->opcode()));
-
- bool needs_frame_state = (flags & CallDescriptor::kNeedsFrameState);
-
+ const bool needs_frame_state =
+ HasCallDescriptorFlag(instr, CallDescriptor::kNeedsFrameState);
RecordSafepoint(instr->reference_map(), needs_frame_state
? Safepoint::kLazyDeopt
: Safepoint::kNoLazyDeopt);
- if (flags & CallDescriptor::kHasExceptionHandler) {
+ if (HasCallDescriptorFlag(instr, CallDescriptor::kHasExceptionHandler)) {
InstructionOperandConverter i(this, instr);
RpoNumber handler_rpo = i.InputRpo(instr->InputCount() - 1);
DCHECK(instructions()->InstructionBlockAt(handler_rpo)->IsHandler());
diff --git a/deps/v8/src/compiler/backend/code-generator.h b/deps/v8/src/compiler/backend/code-generator.h
index 74ec66f8d8..26d03f129a 100644
--- a/deps/v8/src/compiler/backend/code-generator.h
+++ b/deps/v8/src/compiler/backend/code-generator.h
@@ -310,11 +310,11 @@ class V8_EXPORT_PRIVATE CodeGenerator final : public GapResolver::Assembler {
static bool IsValidPush(InstructionOperand source, PushTypeFlags push_type);
- // Generate a list moves from an instruction that are candidates to be turned
- // into push instructions on platforms that support them. In general, the list
- // of push candidates are moves to a set of contiguous destination
+ // Generate a list of moves from an instruction that are candidates to be
+ // turned into push instructions on platforms that support them. In general,
+ // the list of push candidates are moves to a set of contiguous destination
// InstructionOperand locations on the stack that don't clobber values that
- // are needed for resolve the gap or use values generated by the gap,
+ // are needed to resolve the gap or use values generated by the gap,
// i.e. moves that can be hoisted together before the actual gap and assembled
// together.
static void GetPushCompatibleMoves(Instruction* instr,
diff --git a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
index 2878d6e56b..077324a31f 100644
--- a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
+++ b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
@@ -2214,9 +2214,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ psrld(kScratchDoubleReg, 1);
__ andps(dst, kScratchDoubleReg);
} else {
+ // TODO(zhin) Improve codegen for this case.
__ pcmpeqd(dst, dst);
+ __ movups(kScratchDoubleReg, src);
__ psrld(dst, 1);
- __ andps(dst, src);
+ __ andps(dst, kScratchDoubleReg);
}
break;
}
@@ -2236,9 +2238,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ pslld(kScratchDoubleReg, 31);
__ xorps(dst, kScratchDoubleReg);
} else {
+ // TODO(zhin) Improve codegen for this case.
__ pcmpeqd(dst, dst);
+ __ movups(kScratchDoubleReg, src);
__ pslld(dst, 31);
- __ xorps(dst, src);
+ __ xorps(dst, kScratchDoubleReg);
}
break;
}
@@ -2251,7 +2255,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
}
case kSSEF32x4Sqrt: {
- __ sqrtps(i.OutputSimd128Register(), i.InputOperand(0));
+ // TODO(zhin) Improve codegen for this case.
+ __ movups(kScratchDoubleReg, i.InputOperand(0));
+ __ sqrtps(i.OutputSimd128Register(), kScratchDoubleReg);
break;
}
case kAVXF32x4Sqrt: {
@@ -2348,7 +2354,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Operand src1 = i.InputOperand(1);
// See comment above for correction of minps.
__ movups(kScratchDoubleReg, src1);
- __ vminps(kScratchDoubleReg, kScratchDoubleReg, dst);
+ __ vminps(kScratchDoubleReg, kScratchDoubleReg, src0);
__ vminps(dst, src0, src1);
__ vorps(dst, dst, kScratchDoubleReg);
__ vcmpneqps(kScratchDoubleReg, dst, dst);
@@ -2381,11 +2387,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kAVXF32x4Max: {
CpuFeatureScope avx_scope(tasm(), AVX);
XMMRegister dst = i.OutputSimd128Register();
+ XMMRegister src0 = i.InputSimd128Register(0);
Operand src1 = i.InputOperand(1);
// See comment above for correction of maxps.
__ vmovups(kScratchDoubleReg, src1);
- __ vmaxps(kScratchDoubleReg, kScratchDoubleReg, dst);
- __ vmaxps(dst, dst, src1);
+ __ vmaxps(kScratchDoubleReg, kScratchDoubleReg, src0);
+ __ vmaxps(dst, src0, src1);
__ vxorps(dst, dst, kScratchDoubleReg);
__ vorps(kScratchDoubleReg, kScratchDoubleReg, dst);
__ vsubps(kScratchDoubleReg, kScratchDoubleReg, dst);
@@ -3643,8 +3650,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg);
__ pxor(dst, kScratchDoubleReg);
} else {
+ // TODO(zhin) Improve codegen for this case.
__ pcmpeqd(dst, dst);
- __ pxor(dst, src);
+ __ movups(kScratchDoubleReg, src);
+ __ pxor(dst, kScratchDoubleReg);
}
break;
}
@@ -3715,7 +3724,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Andnps(dst, src1);
break;
}
- case kIA32S8x16Swizzle: {
+ case kIA32I8x16Swizzle: {
DCHECK_EQ(i.OutputSimd128Register(), i.InputSimd128Register(0));
XMMRegister dst = i.OutputSimd128Register();
XMMRegister mask = i.TempSimd128Register(0);
@@ -3728,7 +3737,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Pshufb(dst, mask);
break;
}
- case kIA32S8x16Shuffle: {
+ case kIA32I8x16Shuffle: {
XMMRegister dst = i.OutputSimd128Register();
Operand src0 = i.InputOperand(0);
Register tmp = i.TempRegister(0);
@@ -4690,9 +4699,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue();
- if (call_descriptor->PushArgumentCount()) {
- __ push(kJavaScriptCallArgCountRegister);
- }
} else {
__ StubPrologue(info()->GetOutputStackFrameType());
if (call_descriptor->IsWasmFunctionCall()) {
@@ -4836,10 +4842,11 @@ void CodeGenerator::AssembleReturn(InstructionOperand* pop) {
} else {
Register pop_reg = g.ToRegister(pop);
Register scratch_reg = pop_reg == ecx ? edx : ecx;
- __ pop(scratch_reg);
+ __ PopReturnAddressTo(scratch_reg);
__ lea(esp, Operand(esp, pop_reg, times_system_pointer_size,
static_cast<int>(pop_size)));
- __ jmp(scratch_reg);
+ __ PushReturnAddressFrom(scratch_reg);
+ __ Ret();
}
}
diff --git a/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h b/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h
index 8f9f4fcf1c..eca9dc9227 100644
--- a/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h
+++ b/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h
@@ -355,8 +355,8 @@ namespace compiler {
V(SSES128Select) \
V(AVXS128Select) \
V(IA32S128AndNot) \
- V(IA32S8x16Swizzle) \
- V(IA32S8x16Shuffle) \
+ V(IA32I8x16Swizzle) \
+ V(IA32I8x16Shuffle) \
V(IA32S8x16LoadSplat) \
V(IA32S16x8LoadSplat) \
V(IA32S32x4LoadSplat) \
diff --git a/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc b/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc
index 51a9a18e44..24abd58c7f 100644
--- a/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc
+++ b/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc
@@ -336,8 +336,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kSSES128Select:
case kAVXS128Select:
case kIA32S128AndNot:
- case kIA32S8x16Swizzle:
- case kIA32S8x16Shuffle:
+ case kIA32I8x16Swizzle:
+ case kIA32I8x16Shuffle:
case kIA32S32x4Swizzle:
case kIA32S32x4Shuffle:
case kIA32S16x8Blend:
diff --git a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
index b0556fd4ef..fec4053871 100644
--- a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
+++ b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
@@ -2687,7 +2687,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table,
} // namespace
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -2704,9 +2704,12 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
// AVX and swizzles don't generally need DefineSameAsFirst to avoid a move.
bool no_same_as_first = use_avx || is_swizzle;
// We generally need UseRegister for input0, Use for input1.
+ // TODO(v8:9198): We don't have 16-byte alignment for SIMD operands yet, but
+ // we retain this logic (continue setting these in the various shuffle match
+ // clauses), but ignore it when selecting registers or slots.
bool src0_needs_reg = true;
bool src1_needs_reg = false;
- ArchOpcode opcode = kIA32S8x16Shuffle; // general shuffle is the default
+ ArchOpcode opcode = kIA32I8x16Shuffle; // general shuffle is the default
uint8_t offset;
uint8_t shuffle32x4[4];
@@ -2794,7 +2797,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
src0_needs_reg = true;
imms[imm_count++] = index;
}
- if (opcode == kIA32S8x16Shuffle) {
+ if (opcode == kIA32I8x16Shuffle) {
// Use same-as-first for general swizzle, but not shuffle.
no_same_as_first = !is_swizzle;
src0_needs_reg = !no_same_as_first;
@@ -2810,16 +2813,18 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
Node* input0 = node->InputAt(0);
InstructionOperand dst =
no_same_as_first ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node);
- InstructionOperand src0 =
- src0_needs_reg ? g.UseRegister(input0) : g.Use(input0);
+ // TODO(v8:9198): Use src0_needs_reg when we have memory alignment for SIMD.
+ InstructionOperand src0 = g.UseRegister(input0);
+ USE(src0_needs_reg);
int input_count = 0;
InstructionOperand inputs[2 + kMaxImms + kMaxTemps];
inputs[input_count++] = src0;
if (!is_swizzle) {
Node* input1 = node->InputAt(1);
- inputs[input_count++] =
- src1_needs_reg ? g.UseRegister(input1) : g.Use(input1);
+ // TODO(v8:9198): Use src1_needs_reg when we have memory alignment for SIMD.
+ inputs[input_count++] = g.UseRegister(input1);
+ USE(src1_needs_reg);
}
for (int i = 0; i < imm_count; ++i) {
inputs[input_count++] = g.UseImmediate(imms[i]);
@@ -2827,10 +2832,10 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
Emit(opcode, 1, &dst, input_count, inputs, temp_count, temps);
}
-void InstructionSelector::VisitS8x16Swizzle(Node* node) {
+void InstructionSelector::VisitI8x16Swizzle(Node* node) {
IA32OperandGenerator g(this);
InstructionOperand temps[] = {g.TempSimd128Register()};
- Emit(kIA32S8x16Swizzle, g.DefineSameAsFirst(node),
+ Emit(kIA32I8x16Swizzle, g.DefineSameAsFirst(node),
g.UseRegister(node->InputAt(0)), g.UseUniqueRegister(node->InputAt(1)),
arraysize(temps), temps);
}
diff --git a/deps/v8/src/compiler/backend/instruction-codes.h b/deps/v8/src/compiler/backend/instruction-codes.h
index 84d5d249b8..8772a78df0 100644
--- a/deps/v8/src/compiler/backend/instruction-codes.h
+++ b/deps/v8/src/compiler/backend/instruction-codes.h
@@ -270,6 +270,8 @@ using InstructionCode = uint32_t;
// continuation into a single InstructionCode which is stored as part of
// the instruction.
using ArchOpcodeField = base::BitField<ArchOpcode, 0, 9>;
+static_assert(ArchOpcodeField::is_valid(kLastArchOpcode),
+ "All opcodes must fit in the 9-bit ArchOpcodeField.");
using AddressingModeField = base::BitField<AddressingMode, 9, 5>;
using FlagsModeField = base::BitField<FlagsMode, 14, 3>;
using FlagsConditionField = base::BitField<FlagsCondition, 17, 5>;
diff --git a/deps/v8/src/compiler/backend/instruction-selector.cc b/deps/v8/src/compiler/backend/instruction-selector.cc
index d1594f9305..1c14832bbf 100644
--- a/deps/v8/src/compiler/backend/instruction-selector.cc
+++ b/deps/v8/src/compiler/backend/instruction-selector.cc
@@ -62,7 +62,12 @@ InstructionSelector::InstructionSelector(
trace_turbo_(trace_turbo),
tick_counter_(tick_counter),
max_unoptimized_frame_height_(max_unoptimized_frame_height),
- max_pushed_argument_count_(max_pushed_argument_count) {
+ max_pushed_argument_count_(max_pushed_argument_count)
+#if V8_TARGET_ARCH_64_BIT
+ ,
+ phi_states_(node_count, Upper32BitsState::kNotYetChecked, zone)
+#endif
+{
DCHECK_EQ(*max_unoptimized_frame_height, 0); // Caller-initialized.
instructions_.reserve(node_count);
@@ -2214,10 +2219,10 @@ void InstructionSelector::VisitNode(Node* node) {
return MarkAsSimd128(node), VisitS128Select(node);
case IrOpcode::kS128AndNot:
return MarkAsSimd128(node), VisitS128AndNot(node);
- case IrOpcode::kS8x16Swizzle:
- return MarkAsSimd128(node), VisitS8x16Swizzle(node);
- case IrOpcode::kS8x16Shuffle:
- return MarkAsSimd128(node), VisitS8x16Shuffle(node);
+ case IrOpcode::kI8x16Swizzle:
+ return MarkAsSimd128(node), VisitI8x16Swizzle(node);
+ case IrOpcode::kI8x16Shuffle:
+ return MarkAsSimd128(node), VisitI8x16Shuffle(node);
case IrOpcode::kV64x2AnyTrue:
return MarkAsWord32(node), VisitV64x2AnyTrue(node);
case IrOpcode::kV64x2AllTrue:
@@ -2681,39 +2686,6 @@ void InstructionSelector::VisitI64x2MinU(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2MaxU(Node* node) { UNIMPLEMENTED(); }
#endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_S390X
-#if !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_IA32 && \
- !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_S390X && !V8_TARGET_ARCH_MIPS && \
- !V8_TARGET_ARCH_MIPS64
-// TODO(v8:10308) Bitmask operations are in prototype now, we can remove these
-// guards when they go into the proposal.
-void InstructionSelector::VisitI8x16BitMask(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitI16x8BitMask(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitI32x4BitMask(Node* node) { UNIMPLEMENTED(); }
-// TODO(v8:10501) Prototyping pmin and pmax instructions.
-void InstructionSelector::VisitF32x4Pmin(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF32x4Pmax(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Pmin(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Pmax(Node* node) { UNIMPLEMENTED(); }
-#endif // !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_IA32
- // && !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_S390X &&
- // !V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64
-
-#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_S390X && \
- !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_MIPS && \
- !V8_TARGET_ARCH_MIPS64
-// TODO(v8:10553) Prototyping floating point rounding instructions.
-void InstructionSelector::VisitF64x2Ceil(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Floor(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Trunc(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2NearestInt(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF32x4Ceil(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF32x4Floor(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF32x4Trunc(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF32x4NearestInt(Node* node) { UNIMPLEMENTED(); }
-#endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_S390X
- // && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM &&
- // !V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64
-
#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM64 && \
!V8_TARGET_ARCH_ARM
// TODO(v8:10583) Prototype i32x4.dot_i16x8_s
@@ -2737,10 +2709,20 @@ void InstructionSelector::VisitParameter(Node* node) {
}
namespace {
+
LinkageLocation ExceptionLocation() {
return LinkageLocation::ForRegister(kReturnRegister0.code(),
MachineType::IntPtr());
}
+
+constexpr InstructionCode EncodeCallDescriptorFlags(
+ InstructionCode opcode, CallDescriptor::Flags flags) {
+ // Note: Not all bits of `flags` are preserved.
+ STATIC_ASSERT(CallDescriptor::kFlagsBitsEncodedInInstructionCode ==
+ MiscField::kSize);
+ return opcode | MiscField::encode(flags & MiscField::kMax);
+}
+
} // namespace
void InstructionSelector::VisitIfException(Node* node) {
@@ -2863,6 +2845,7 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) {
#if ABI_USES_FUNCTION_DESCRIPTORS
// Highest misc_field bit is used on AIX to indicate if a CFunction call
// has function descriptor or not.
+ STATIC_ASSERT(MiscField::kSize == kHasFunctionDescriptorBitShift + 1);
if (!call_descriptor->NoFunctionDescriptor()) {
misc_field |= 1 << kHasFunctionDescriptorBitShift;
}
@@ -2871,18 +2854,18 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) {
break;
}
case CallDescriptor::kCallCodeObject:
- opcode = kArchCallCodeObject | MiscField::encode(flags);
+ opcode = EncodeCallDescriptorFlags(kArchCallCodeObject, flags);
break;
case CallDescriptor::kCallJSFunction:
- opcode = kArchCallJSFunction | MiscField::encode(flags);
+ opcode = EncodeCallDescriptorFlags(kArchCallJSFunction, flags);
break;
case CallDescriptor::kCallWasmCapiFunction:
case CallDescriptor::kCallWasmFunction:
case CallDescriptor::kCallWasmImportWrapper:
- opcode = kArchCallWasmFunction | MiscField::encode(flags);
+ opcode = EncodeCallDescriptorFlags(kArchCallWasmFunction, flags);
break;
case CallDescriptor::kCallBuiltinPointer:
- opcode = kArchCallBuiltinPointer | MiscField::encode(flags);
+ opcode = EncodeCallDescriptorFlags(kArchCallBuiltinPointer, flags);
break;
}
@@ -2912,9 +2895,9 @@ void InstructionSelector::VisitTailCall(Node* node) {
auto call_descriptor = CallDescriptorOf(node->op());
CallDescriptor* caller = linkage()->GetIncomingDescriptor();
- DCHECK(caller->CanTailCall(CallDescriptorOf(node->op())));
const CallDescriptor* callee = CallDescriptorOf(node->op());
- int stack_param_delta = callee->GetStackParameterDelta(caller);
+ DCHECK(caller->CanTailCall(callee));
+ const int stack_param_delta = callee->GetStackParameterDelta(caller);
CallBuffer buffer(zone(), call_descriptor, nullptr);
// Compute InstructionOperands for inputs and outputs.
@@ -2931,7 +2914,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
// Select the appropriate opcode based on the call type.
InstructionCode opcode;
InstructionOperandVector temps(zone());
- if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) {
+ if (caller->IsJSFunctionCall()) {
switch (call_descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
opcode = kArchTailCallCodeObjectFromJSFunction;
@@ -2960,7 +2943,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
return;
}
}
- opcode |= MiscField::encode(call_descriptor->flags());
+ opcode = EncodeCallDescriptorFlags(opcode, call_descriptor->flags());
Emit(kArchPrepareTailCall, g.NoOutput());
@@ -2969,7 +2952,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
// instruction. This is used by backends that need to pad arguments for stack
// alignment, in order to store an optional slot of padding above the
// arguments.
- int optional_padding_slot = callee->GetFirstUnusedStackSlot();
+ const int optional_padding_slot = callee->GetFirstUnusedStackSlot();
buffer.instruction_args.push_back(g.TempImmediate(optional_padding_slot));
const int first_unused_stack_slot =
@@ -3131,6 +3114,54 @@ bool InstructionSelector::CanProduceSignalingNaN(Node* node) {
return true;
}
+#if V8_TARGET_ARCH_64_BIT
+bool InstructionSelector::ZeroExtendsWord32ToWord64(Node* node,
+ int recursion_depth) {
+ // To compute whether a Node sets its upper 32 bits to zero, there are three
+ // cases.
+ // 1. Phi node, with a computed result already available in phi_states_:
+ // Read the value from phi_states_.
+ // 2. Phi node, with no result available in phi_states_ yet:
+ // Recursively check its inputs, and store the result in phi_states_.
+ // 3. Anything else:
+ // Call the architecture-specific ZeroExtendsWord32ToWord64NoPhis.
+
+ // Limit recursion depth to avoid the possibility of stack overflow on very
+ // large functions.
+ const int kMaxRecursionDepth = 100;
+
+ if (node->opcode() == IrOpcode::kPhi) {
+ Upper32BitsState current = phi_states_[node->id()];
+ if (current != Upper32BitsState::kNotYetChecked) {
+ return current == Upper32BitsState::kUpperBitsGuaranteedZero;
+ }
+
+ // If further recursion is prevented, we can't make any assumptions about
+ // the output of this phi node.
+ if (recursion_depth >= kMaxRecursionDepth) {
+ return false;
+ }
+
+ // Mark the current node so that we skip it if we recursively visit it
+ // again. Or, said differently, we compute a largest fixed-point so we can
+ // be optimistic when we hit cycles.
+ phi_states_[node->id()] = Upper32BitsState::kUpperBitsGuaranteedZero;
+
+ int input_count = node->op()->ValueInputCount();
+ for (int i = 0; i < input_count; ++i) {
+ Node* input = NodeProperties::GetValueInput(node, i);
+ if (!ZeroExtendsWord32ToWord64(input, recursion_depth + 1)) {
+ phi_states_[node->id()] = Upper32BitsState::kNoGuarantee;
+ return false;
+ }
+ }
+
+ return true;
+ }
+ return ZeroExtendsWord32ToWord64NoPhis(node);
+}
+#endif // V8_TARGET_ARCH_64_BIT
+
namespace {
FrameStateDescriptor* GetFrameStateDescriptorInternal(Zone* zone, Node* state) {
diff --git a/deps/v8/src/compiler/backend/instruction-selector.h b/deps/v8/src/compiler/backend/instruction-selector.h
index 0aa5dbbeaf..6452e3ec4c 100644
--- a/deps/v8/src/compiler/backend/instruction-selector.h
+++ b/deps/v8/src/compiler/backend/instruction-selector.h
@@ -667,6 +667,17 @@ class V8_EXPORT_PRIVATE InstructionSelector final {
void VisitWord64AtomicNarrowBinop(Node* node, ArchOpcode uint8_op,
ArchOpcode uint16_op, ArchOpcode uint32_op);
+#if V8_TARGET_ARCH_64_BIT
+ bool ZeroExtendsWord32ToWord64(Node* node, int recursion_depth = 0);
+ bool ZeroExtendsWord32ToWord64NoPhis(Node* node);
+
+ enum Upper32BitsState : uint8_t {
+ kNotYetChecked,
+ kUpperBitsGuaranteedZero,
+ kNoGuarantee,
+ };
+#endif // V8_TARGET_ARCH_64_BIT
+
// ===========================================================================
Zone* const zone_;
@@ -702,6 +713,13 @@ class V8_EXPORT_PRIVATE InstructionSelector final {
// arguments (for calls). Later used to apply an offset to stack checks.
size_t* max_unoptimized_frame_height_;
size_t* max_pushed_argument_count_;
+
+#if V8_TARGET_ARCH_64_BIT
+ // Holds lazily-computed results for whether phi nodes guarantee their upper
+ // 32 bits to be zero. Indexed by node ID; nobody reads or writes the values
+ // for non-phi nodes.
+ ZoneVector<Upper32BitsState> phi_states_;
+#endif
};
} // namespace compiler
diff --git a/deps/v8/src/compiler/backend/live-range-separator.cc b/deps/v8/src/compiler/backend/live-range-separator.cc
deleted file mode 100644
index acfe23dd06..0000000000
--- a/deps/v8/src/compiler/backend/live-range-separator.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2015 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/compiler/backend/live-range-separator.h"
-#include "src/compiler/backend/register-allocator.h"
-
-namespace v8 {
-namespace internal {
-namespace compiler {
-
-#define TRACE_COND(cond, ...) \
- do { \
- if (cond) PrintF(__VA_ARGS__); \
- } while (false)
-
-namespace {
-
-void CreateSplinter(TopLevelLiveRange* range,
- TopTierRegisterAllocationData* data,
- LifetimePosition first_cut, LifetimePosition last_cut,
- bool trace_alloc) {
- DCHECK(!range->IsSplinter());
- // We can ignore ranges that live solely in deferred blocks.
- // If a range ends right at the end of a deferred block, it is marked by
- // the range builder as ending at gap start of the next block - since the
- // end is a position where the variable isn't live. We need to take that
- // into consideration.
- LifetimePosition max_allowed_end = last_cut.NextFullStart();
-
- if (first_cut <= range->Start() && max_allowed_end >= range->End()) {
- return;
- }
-
- LifetimePosition start = Max(first_cut, range->Start());
- LifetimePosition end = Min(last_cut, range->End());
-
- if (start < end) {
- // Ensure the original range has a spill range associated, before it gets
- // splintered. Splinters will point to it. This way, when attempting to
- // reuse spill slots of splinters, during allocation, we avoid clobbering
- // such slots.
- if (range->MayRequireSpillRange()) {
- data->CreateSpillRangeForLiveRange(range);
- }
- if (range->splinter() == nullptr) {
- TopLevelLiveRange* splinter =
- data->NextLiveRange(range->representation());
- DCHECK_NULL(data->live_ranges()[splinter->vreg()]);
- data->live_ranges()[splinter->vreg()] = splinter;
- range->SetSplinter(splinter);
- }
- Zone* zone = data->allocation_zone();
- TRACE_COND(trace_alloc,
- "creating splinter %d for range %d between %d and %d\n",
- range->splinter()->vreg(), range->vreg(),
- start.ToInstructionIndex(), end.ToInstructionIndex());
- range->Splinter(start, end, zone);
- }
-}
-
-void SetSlotUse(TopLevelLiveRange* range) {
- range->reset_slot_use();
- for (const UsePosition* pos = range->first_pos();
- !range->has_slot_use() && pos != nullptr; pos = pos->next()) {
- if (pos->type() == UsePositionType::kRequiresSlot) {
- range->register_slot_use(TopLevelLiveRange::SlotUseKind::kGeneralSlotUse);
- }
- }
-}
-
-void SplinterLiveRange(TopLevelLiveRange* range,
- TopTierRegisterAllocationData* data) {
- const InstructionSequence* code = data->code();
- UseInterval* interval = range->first_interval();
-
- LifetimePosition first_cut = LifetimePosition::Invalid();
- LifetimePosition last_cut = LifetimePosition::Invalid();
-
- while (interval != nullptr) {
- // We have to cache these here, as splintering might destroy the original
- // interval below.
- UseInterval* next_interval = interval->next();
- LifetimePosition interval_end = interval->end();
- const InstructionBlock* first_block =
- code->GetInstructionBlock(interval->FirstGapIndex());
- const InstructionBlock* last_block =
- code->GetInstructionBlock(interval->LastGapIndex());
- int first_block_nr = first_block->rpo_number().ToInt();
- int last_block_nr = last_block->rpo_number().ToInt();
- for (int block_id = first_block_nr; block_id <= last_block_nr; ++block_id) {
- const InstructionBlock* current_block =
- code->InstructionBlockAt(RpoNumber::FromInt(block_id));
- if (current_block->IsDeferred()) {
- if (!first_cut.IsValid()) {
- first_cut = LifetimePosition::GapFromInstructionIndex(
- current_block->first_instruction_index());
- }
- // We splinter until the last gap in the block. I assume this is done to
- // leave a little range to be allocated by normal register allocation
- // and then use that range to connect when splinters are merged back.
- // This might be done as control flow resolution does not insert moves
- // if two consecutive blocks in rpo order are also consecutive in
- // control flow.
- last_cut = LifetimePosition::GapFromInstructionIndex(
- current_block->last_instruction_index());
- } else {
- if (first_cut.IsValid()) {
- CreateSplinter(range, data, first_cut, last_cut,
- data->is_trace_alloc());
- first_cut = LifetimePosition::Invalid();
- last_cut = LifetimePosition::Invalid();
- }
- }
- }
- // If we reach the end of an interval with a first_cut and last_cut set, it
- // means that we can splinter to the end of the interval, as the value dies
- // in this control flow branch or is not live in the next block. In the
- // former case, we won't need to reload the value, so we can splinter to the
- // end of its lifetime. In the latter case, control flow resolution will
- // have to connect blocks anyway, so we can also splinter to the end of the
- // block, too.
- if (first_cut.IsValid()) {
- CreateSplinter(range, data, first_cut, interval_end,
- data->is_trace_alloc());
- first_cut = LifetimePosition::Invalid();
- last_cut = LifetimePosition::Invalid();
- }
- interval = next_interval;
- }
-
- // Redo has_slot_use
- if (range->has_slot_use() && range->splinter() != nullptr) {
- SetSlotUse(range);
- SetSlotUse(range->splinter());
- }
-}
-
-} // namespace
-
-void LiveRangeSeparator::Splinter() {
- size_t virt_reg_count = data()->live_ranges().size();
- for (size_t vreg = 0; vreg < virt_reg_count; ++vreg) {
- TopLevelLiveRange* range = data()->live_ranges()[vreg];
- if (range == nullptr || range->IsEmpty() || range->IsSplinter()) {
- continue;
- }
- int first_instr = range->first_interval()->FirstGapIndex();
- if (!data()->code()->GetInstructionBlock(first_instr)->IsDeferred()) {
- SplinterLiveRange(range, data());
- }
- }
-}
-
-void LiveRangeMerger::MarkRangesSpilledInDeferredBlocks() {
- const InstructionSequence* code = data()->code();
- for (TopLevelLiveRange* top : data()->live_ranges()) {
- if (top == nullptr || top->IsEmpty() || top->splinter() == nullptr ||
- top->HasSpillOperand() || !top->splinter()->HasSpillRange()) {
- continue;
- }
-
- LiveRange* child = top;
- for (; child != nullptr; child = child->next()) {
- if (child->spilled() ||
- child->NextSlotPosition(child->Start()) != nullptr) {
- break;
- }
- }
- if (child == nullptr) {
- DCHECK(!data()->is_turbo_control_flow_aware_allocation());
- top->TreatAsSpilledInDeferredBlock(data()->allocation_zone(),
- code->InstructionBlockCount());
- }
- }
-}
-
-void LiveRangeMerger::Merge() {
- MarkRangesSpilledInDeferredBlocks();
-
- int live_range_count = static_cast<int>(data()->live_ranges().size());
- for (int i = 0; i < live_range_count; ++i) {
- TopLevelLiveRange* range = data()->live_ranges()[i];
- if (range == nullptr || range->IsEmpty() || !range->IsSplinter()) {
- continue;
- }
- TopLevelLiveRange* splinter_parent = range->splintered_from();
-
- int to_remove = range->vreg();
- splinter_parent->Merge(range, data()->allocation_zone());
- data()->live_ranges()[to_remove] = nullptr;
- }
-}
-
-#undef TRACE_COND
-
-} // namespace compiler
-} // namespace internal
-} // namespace v8
diff --git a/deps/v8/src/compiler/backend/live-range-separator.h b/deps/v8/src/compiler/backend/live-range-separator.h
deleted file mode 100644
index f84b275e08..0000000000
--- a/deps/v8/src/compiler/backend/live-range-separator.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2015 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_COMPILER_BACKEND_LIVE_RANGE_SEPARATOR_H_
-#define V8_COMPILER_BACKEND_LIVE_RANGE_SEPARATOR_H_
-
-#include "src/zone/zone.h"
-namespace v8 {
-namespace internal {
-
-class Zone;
-
-namespace compiler {
-
-class TopTierRegisterAllocationData;
-
-// A register allocation pair of transformations: splinter and merge live ranges
-class LiveRangeSeparator final : public ZoneObject {
- public:
- LiveRangeSeparator(TopTierRegisterAllocationData* data, Zone* zone)
- : data_(data), zone_(zone) {}
-
- void Splinter();
-
- private:
- TopTierRegisterAllocationData* data() const { return data_; }
- Zone* zone() const { return zone_; }
-
- TopTierRegisterAllocationData* const data_;
- Zone* const zone_;
-
- DISALLOW_COPY_AND_ASSIGN(LiveRangeSeparator);
-};
-
-class LiveRangeMerger final : public ZoneObject {
- public:
- LiveRangeMerger(TopTierRegisterAllocationData* data, Zone* zone)
- : data_(data), zone_(zone) {}
-
- void Merge();
-
- private:
- TopTierRegisterAllocationData* data() const { return data_; }
- Zone* zone() const { return zone_; }
-
- // Mark ranges spilled in deferred blocks, that also cover non-deferred code.
- // We do nothing special for ranges fully contained in deferred blocks,
- // because they would "spill in deferred blocks" anyway.
- void MarkRangesSpilledInDeferredBlocks();
-
- TopTierRegisterAllocationData* const data_;
- Zone* const zone_;
-
- DISALLOW_COPY_AND_ASSIGN(LiveRangeMerger);
-};
-
-} // namespace compiler
-} // namespace internal
-} // namespace v8
-#endif // V8_COMPILER_BACKEND_LIVE_RANGE_SEPARATOR_H_
diff --git a/deps/v8/src/compiler/backend/mips/code-generator-mips.cc b/deps/v8/src/compiler/backend/mips/code-generator-mips.cc
index 07416ab8ba..5457883fee 100644
--- a/deps/v8/src/compiler/backend/mips/code-generator-mips.cc
+++ b/deps/v8/src/compiler/backend/mips/code-generator-mips.cc
@@ -1239,7 +1239,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
}
case kMipsAbsS:
- __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0));
+ if (IsMipsArchVariant(kMips32r6)) {
+ __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0));
+ } else {
+ __ mfc1(kScratchReg, i.InputSingleRegister(0));
+ __ Ins(kScratchReg, zero_reg, 31, 1);
+ __ mtc1(kScratchReg, i.OutputSingleRegister());
+ }
break;
case kMipsSqrtS: {
__ sqrt_s(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
@@ -1330,9 +1336,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ MovFromFloatResult(i.OutputDoubleRegister());
break;
}
- case kMipsAbsD:
- __ abs_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
+ case kMipsAbsD: {
+ FPURegister src = i.InputDoubleRegister(0);
+ FPURegister dst = i.OutputDoubleRegister();
+ if (IsMipsArchVariant(kMips32r6)) {
+ __ abs_d(dst, src);
+ } else {
+ __ Move(dst, src);
+ __ mfhc1(kScratchReg, src);
+ __ Ins(kScratchReg, zero_reg, 31, 1);
+ __ mthc1(kScratchReg, dst);
+ }
break;
+ }
case kMipsNegS:
__ Neg_s(i.OutputSingleRegister(), i.InputSingleRegister(0));
break;
@@ -3274,7 +3290,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ sldi_b(dst, i.InputSimd128Register(1), i.InputInt4(2));
break;
}
- case kMipsS8x16Shuffle: {
+ case kMipsI8x16Shuffle: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
Simd128Register dst = i.OutputSimd128Register(),
src0 = i.InputSimd128Register(0),
@@ -3299,7 +3315,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ vshf_b(dst, src1, src0);
break;
}
- case kMipsS8x16Swizzle: {
+ case kMipsI8x16Swizzle: {
Simd128Register dst = i.OutputSimd128Register(),
tbl = i.InputSimd128Register(0),
ctl = i.InputSimd128Register(1);
@@ -3905,9 +3921,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue();
- if (call_descriptor->PushArgumentCount()) {
- __ Push(kJavaScriptCallArgCountRegister);
- }
} else {
__ StubPrologue(info()->GetOutputStackFrameType());
if (call_descriptor->IsWasmFunctionCall()) {
diff --git a/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h b/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h
index b95bd82d28..46ce3d359a 100644
--- a/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h
+++ b/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h
@@ -307,8 +307,8 @@ namespace compiler {
V(MipsS8x16PackOdd) \
V(MipsS8x16InterleaveEven) \
V(MipsS8x16InterleaveOdd) \
- V(MipsS8x16Shuffle) \
- V(MipsS8x16Swizzle) \
+ V(MipsI8x16Shuffle) \
+ V(MipsI8x16Swizzle) \
V(MipsS8x16Concat) \
V(MipsS8x8Reverse) \
V(MipsS8x4Reverse) \
diff --git a/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc b/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc
index 507bb14664..64e78b8122 100644
--- a/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc
+++ b/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc
@@ -273,8 +273,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kMipsS8x16InterleaveRight:
case kMipsS8x16PackEven:
case kMipsS8x16PackOdd:
- case kMipsS8x16Shuffle:
- case kMipsS8x16Swizzle:
+ case kMipsI8x16Shuffle:
+ case kMipsI8x16Swizzle:
case kMipsS8x2Reverse:
case kMipsS8x4Reverse:
case kMipsS8x8Reverse:
diff --git a/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc b/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc
index 6aabbf3761..b552b0dec1 100644
--- a/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc
+++ b/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc
@@ -1388,9 +1388,9 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) {
ArchOpcode opcode = kArchNop;
switch (load_rep.representation()) {
- case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kWord8:
- UNREACHABLE();
+ opcode = load_rep.IsUnsigned() ? kMipsLbu : kMipsLb;
+ break;
case MachineRepresentation::kWord16:
opcode = load_rep.IsUnsigned() ? kMipsUlhu : kMipsUlh;
break;
@@ -1409,6 +1409,7 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) {
case MachineRepresentation::kSimd128:
opcode = kMipsMsaLd;
break;
+ case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kCompressedPointer: // Fall through.
case MachineRepresentation::kCompressed: // Fall through.
case MachineRepresentation::kWord64: // Fall through.
@@ -1446,9 +1447,9 @@ void InstructionSelector::VisitUnalignedStore(Node* node) {
case MachineRepresentation::kFloat64:
opcode = kMipsUsdc1;
break;
- case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kWord8:
- UNREACHABLE();
+ opcode = kMipsSb;
+ break;
case MachineRepresentation::kWord16:
opcode = kMipsUsh;
break;
@@ -1461,6 +1462,7 @@ void InstructionSelector::VisitUnalignedStore(Node* node) {
case MachineRepresentation::kSimd128:
opcode = kMipsMsaSt;
break;
+ case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kCompressedPointer: // Fall through.
case MachineRepresentation::kCompressed: // Fall through.
case MachineRepresentation::kWord64: // Fall through.
@@ -2378,7 +2380,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table,
} // namespace
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -2404,7 +2406,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle32x4)));
return;
}
- Emit(kMipsS8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0),
+ Emit(kMipsI8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseRegister(input1),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)),
@@ -2412,15 +2414,14 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 12)));
}
-void InstructionSelector::VisitS8x16Swizzle(Node* node) {
+void InstructionSelector::VisitI8x16Swizzle(Node* node) {
MipsOperandGenerator g(this);
InstructionOperand temps[] = {g.TempSimd128Register()};
// We don't want input 0 or input 1 to be the same as output, since we will
// modify output before do the calculation.
- Emit(kMipsS8x16Swizzle, g.DefineAsRegister(node),
+ Emit(kMipsI8x16Swizzle, g.DefineAsRegister(node),
g.UseUniqueRegister(node->InputAt(0)),
- g.UseUniqueRegister(node->InputAt(1)),
- arraysize(temps), temps);
+ g.UseUniqueRegister(node->InputAt(1)), arraysize(temps), temps);
}
void InstructionSelector::VisitSignExtendWord8ToInt32(Node* node) {
diff --git a/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc b/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc
index 2fda592ae1..bb01eab924 100644
--- a/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc
+++ b/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc
@@ -1318,7 +1318,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
}
case kMips64AbsS:
- __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0));
+ if (kArchVariant == kMips64r6) {
+ __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0));
+ } else {
+ __ mfc1(kScratchReg, i.InputSingleRegister(0));
+ __ Dins(kScratchReg, zero_reg, 31, 1);
+ __ mtc1(kScratchReg, i.OutputSingleRegister());
+ }
break;
case kMips64NegS:
__ Neg_s(i.OutputSingleRegister(), i.InputSingleRegister(0));
@@ -1378,7 +1384,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
}
case kMips64AbsD:
- __ abs_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
+ if (kArchVariant == kMips64r6) {
+ __ abs_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
+ } else {
+ __ dmfc1(kScratchReg, i.InputDoubleRegister(0));
+ __ Dins(kScratchReg, zero_reg, 63, 1);
+ __ dmtc1(kScratchReg, i.OutputDoubleRegister());
+ }
break;
case kMips64NegD:
__ Neg_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
@@ -1810,19 +1822,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
}
break;
case kMips64Peek: {
- // The incoming value is 0-based, but we need a 1-based value.
- int reverse_slot = i.InputInt32(0) + 1;
+ int reverse_slot = i.InputInt32(0);
int offset =
FrameSlotToFPOffset(frame()->GetTotalFrameSlotCount() - reverse_slot);
if (instr->OutputAt(0)->IsFPRegister()) {
LocationOperand* op = LocationOperand::cast(instr->OutputAt(0));
if (op->representation() == MachineRepresentation::kFloat64) {
__ Ldc1(i.OutputDoubleRegister(), MemOperand(fp, offset));
- } else {
- DCHECK_EQ(op->representation(), MachineRepresentation::kFloat32);
- __ lwc1(
+ } else if (op->representation() == MachineRepresentation::kFloat32) {
+ __ Lwc1(
i.OutputSingleRegister(0),
MemOperand(fp, offset + kLessSignificantWordInDoublewordOffset));
+ } else {
+ DCHECK_EQ(MachineRepresentation::kSimd128, op->representation());
+ __ ld_b(i.OutputSimd128Register(), MemOperand(fp, offset));
}
} else {
__ Ld(i.OutputRegister(0), MemOperand(fp, offset));
@@ -2304,38 +2317,26 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
}
case kMips64F64x2Ceil: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- __ li(kScratchReg2, kRoundToPlusInf);
- __ ctcmsa(MSACSR, kScratchReg2);
- __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToPlusInf);
break;
}
case kMips64F64x2Floor: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- __ li(kScratchReg2, kRoundToMinusInf);
- __ ctcmsa(MSACSR, kScratchReg2);
- __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToMinusInf);
break;
}
case kMips64F64x2Trunc: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- __ li(kScratchReg2, kRoundToZero);
- __ ctcmsa(MSACSR, kScratchReg2);
- __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToZero);
break;
}
case kMips64F64x2NearestInt: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- // kRoundToNearest == 0
- __ ctcmsa(MSACSR, zero_reg);
- __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToNearest);
break;
}
case kMips64I64x2ReplaceLane: {
@@ -2676,38 +2677,26 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
}
case kMips64F32x4Ceil: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- __ li(kScratchReg2, kRoundToPlusInf);
- __ ctcmsa(MSACSR, kScratchReg2);
- __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToPlusInf);
break;
}
case kMips64F32x4Floor: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- __ li(kScratchReg2, kRoundToMinusInf);
- __ ctcmsa(MSACSR, kScratchReg2);
- __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToMinusInf);
break;
}
case kMips64F32x4Trunc: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- __ li(kScratchReg2, kRoundToZero);
- __ ctcmsa(MSACSR, kScratchReg2);
- __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToZero);
break;
}
case kMips64F32x4NearestInt: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
- __ cfcmsa(kScratchReg, MSACSR);
- // kRoundToNearest == 0
- __ ctcmsa(MSACSR, zero_reg);
- __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0));
- __ ctcmsa(MSACSR, kScratchReg);
+ __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ kRoundToNearest);
break;
}
case kMips64I32x4SConvertF32x4: {
@@ -3520,7 +3509,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ sldi_b(dst, i.InputSimd128Register(1), i.InputInt4(2));
break;
}
- case kMips64S8x16Shuffle: {
+ case kMips64I8x16Shuffle: {
CpuFeatureScope msa_scope(tasm(), MIPS_SIMD);
Simd128Register dst = i.OutputSimd128Register(),
src0 = i.InputSimd128Register(0),
@@ -3545,7 +3534,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ vshf_b(dst, src1, src0);
break;
}
- case kMips64S8x16Swizzle: {
+ case kMips64I8x16Swizzle: {
Simd128Register dst = i.OutputSimd128Register(),
tbl = i.InputSimd128Register(0),
ctl = i.InputSimd128Register(1);
@@ -4202,9 +4191,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue();
- if (call_descriptor->PushArgumentCount()) {
- __ Push(kJavaScriptCallArgCountRegister);
- }
} else {
__ StubPrologue(info()->GetOutputStackFrameType());
if (call_descriptor->IsWasmFunctionCall()) {
diff --git a/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h b/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h
index fb60316517..577db6347c 100644
--- a/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h
+++ b/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h
@@ -342,8 +342,8 @@ namespace compiler {
V(Mips64S8x16PackOdd) \
V(Mips64S8x16InterleaveEven) \
V(Mips64S8x16InterleaveOdd) \
- V(Mips64S8x16Shuffle) \
- V(Mips64S8x16Swizzle) \
+ V(Mips64I8x16Shuffle) \
+ V(Mips64I8x16Swizzle) \
V(Mips64S8x16Concat) \
V(Mips64S8x8Reverse) \
V(Mips64S8x4Reverse) \
diff --git a/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc b/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc
index 347cf577de..caf472bf30 100644
--- a/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc
+++ b/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc
@@ -305,8 +305,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kMips64S8x2Reverse:
case kMips64S8x4Reverse:
case kMips64S8x8Reverse:
- case kMips64S8x16Shuffle:
- case kMips64S8x16Swizzle:
+ case kMips64I8x16Shuffle:
+ case kMips64I8x16Swizzle:
case kMips64Sar:
case kMips64Seb:
case kMips64Seh:
diff --git a/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc b/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
index 16cc2bfa86..2c807b4183 100644
--- a/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
+++ b/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
@@ -1399,35 +1399,40 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
}
}
-void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
- Mips64OperandGenerator g(this);
- Node* value = node->InputAt(0);
- switch (value->opcode()) {
+bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) {
+ DCHECK_NE(node->opcode(), IrOpcode::kPhi);
+ switch (node->opcode()) {
// 32-bit operations will write their result in a 64 bit register,
// clearing the top 32 bits of the destination register.
case IrOpcode::kUint32Div:
case IrOpcode::kUint32Mod:
- case IrOpcode::kUint32MulHigh: {
- Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value));
- return;
- }
+ case IrOpcode::kUint32MulHigh:
+ return true;
case IrOpcode::kLoad: {
- LoadRepresentation load_rep = LoadRepresentationOf(value->op());
+ LoadRepresentation load_rep = LoadRepresentationOf(node->op());
if (load_rep.IsUnsigned()) {
switch (load_rep.representation()) {
case MachineRepresentation::kWord8:
case MachineRepresentation::kWord16:
case MachineRepresentation::kWord32:
- Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value));
- return;
+ return true;
default:
- break;
+ return false;
}
}
- break;
+ return false;
}
default:
- break;
+ return false;
+ }
+}
+
+void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
+ Mips64OperandGenerator g(this);
+ Node* value = node->InputAt(0);
+ if (ZeroExtendsWord32ToWord64(value)) {
+ Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value));
+ return;
}
Emit(kMips64Dext, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
g.TempImmediate(0), g.TempImmediate(32));
@@ -1711,7 +1716,7 @@ void InstructionSelector::EmitPrepareResults(
Node* node) {
Mips64OperandGenerator g(this);
- int reverse_slot = 0;
+ int reverse_slot = 1;
for (PushParameter output : *results) {
if (!output.location.IsCallerFrameSlot()) continue;
// Skip any alignment holes in nodes.
@@ -1721,6 +1726,8 @@ void InstructionSelector::EmitPrepareResults(
MarkAsFloat32(output.node);
} else if (output.location.GetType() == MachineType::Float64()) {
MarkAsFloat64(output.node);
+ } else if (output.location.GetType() == MachineType::Simd128()) {
+ MarkAsSimd128(output.node);
}
Emit(kMips64Peek, g.DefineAsRegister(output.node),
g.UseImmediate(reverse_slot));
@@ -1747,9 +1754,9 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) {
case MachineRepresentation::kFloat64:
opcode = kMips64Uldc1;
break;
- case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kWord8:
- UNREACHABLE();
+ opcode = load_rep.IsUnsigned() ? kMips64Lbu : kMips64Lb;
+ break;
case MachineRepresentation::kWord16:
opcode = load_rep.IsUnsigned() ? kMips64Ulhu : kMips64Ulh;
break;
@@ -1765,6 +1772,7 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) {
case MachineRepresentation::kSimd128:
opcode = kMips64MsaLd;
break;
+ case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kCompressedPointer: // Fall through.
case MachineRepresentation::kCompressed: // Fall through.
case MachineRepresentation::kNone:
@@ -1799,9 +1807,9 @@ void InstructionSelector::VisitUnalignedStore(Node* node) {
case MachineRepresentation::kFloat64:
opcode = kMips64Usdc1;
break;
- case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kWord8:
- UNREACHABLE();
+ opcode = kMips64Sb;
+ break;
case MachineRepresentation::kWord16:
opcode = kMips64Ush;
break;
@@ -1817,6 +1825,7 @@ void InstructionSelector::VisitUnalignedStore(Node* node) {
case MachineRepresentation::kSimd128:
opcode = kMips64MsaSt;
break;
+ case MachineRepresentation::kBit: // Fall through.
case MachineRepresentation::kCompressedPointer: // Fall through.
case MachineRepresentation::kCompressed: // Fall through.
case MachineRepresentation::kNone:
@@ -3073,7 +3082,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table,
} // namespace
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -3099,7 +3108,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle32x4)));
return;
}
- Emit(kMips64S8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0),
+ Emit(kMips64I8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseRegister(input1),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)),
@@ -3107,15 +3116,14 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 12)));
}
-void InstructionSelector::VisitS8x16Swizzle(Node* node) {
+void InstructionSelector::VisitI8x16Swizzle(Node* node) {
Mips64OperandGenerator g(this);
InstructionOperand temps[] = {g.TempSimd128Register()};
// We don't want input 0 or input 1 to be the same as output, since we will
// modify output before do the calculation.
- Emit(kMips64S8x16Swizzle, g.DefineAsRegister(node),
+ Emit(kMips64I8x16Swizzle, g.DefineAsRegister(node),
g.UseUniqueRegister(node->InputAt(0)),
- g.UseUniqueRegister(node->InputAt(1)),
- arraysize(temps), temps);
+ g.UseUniqueRegister(node->InputAt(1)), arraysize(temps), temps);
}
void InstructionSelector::VisitSignExtendWord8ToInt32(Node* node) {
diff --git a/deps/v8/src/compiler/backend/ppc/OWNERS b/deps/v8/src/compiler/backend/ppc/OWNERS
index 6d1a8fc472..6edd45a6ef 100644
--- a/deps/v8/src/compiler/backend/ppc/OWNERS
+++ b/deps/v8/src/compiler/backend/ppc/OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com \ No newline at end of file
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc b/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
index 9d112495b3..767247b2fd 100644
--- a/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
+++ b/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
@@ -449,41 +449,42 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr,
DCHECK_EQ(LeaveRC, i.OutputRCBit()); \
} while (0)
-#define ASSEMBLE_FLOAT_MAX() \
- do { \
- DoubleRegister left_reg = i.InputDoubleRegister(0); \
- DoubleRegister right_reg = i.InputDoubleRegister(1); \
- DoubleRegister result_reg = i.OutputDoubleRegister(); \
- Label check_nan_left, check_zero, return_left, return_right, done; \
- __ fcmpu(left_reg, right_reg); \
- __ bunordered(&check_nan_left); \
- __ beq(&check_zero); \
- __ bge(&return_left); \
- __ b(&return_right); \
- \
- __ bind(&check_zero); \
- __ fcmpu(left_reg, kDoubleRegZero); \
- /* left == right != 0. */ \
- __ bne(&return_left); \
- /* At this point, both left and right are either 0 or -0. */ \
- __ fadd(result_reg, left_reg, right_reg); \
- __ b(&done); \
- \
- __ bind(&check_nan_left); \
- __ fcmpu(left_reg, left_reg); \
- /* left == NaN. */ \
- __ bunordered(&return_left); \
- __ bind(&return_right); \
- if (right_reg != result_reg) { \
- __ fmr(result_reg, right_reg); \
- } \
- __ b(&done); \
- \
- __ bind(&return_left); \
- if (left_reg != result_reg) { \
- __ fmr(result_reg, left_reg); \
- } \
- __ bind(&done); \
+#define ASSEMBLE_FLOAT_MAX() \
+ do { \
+ DoubleRegister left_reg = i.InputDoubleRegister(0); \
+ DoubleRegister right_reg = i.InputDoubleRegister(1); \
+ DoubleRegister result_reg = i.OutputDoubleRegister(); \
+ Label check_zero, return_left, return_right, return_nan, done; \
+ __ fcmpu(left_reg, right_reg); \
+ __ bunordered(&return_nan); \
+ __ beq(&check_zero); \
+ __ bge(&return_left); \
+ __ b(&return_right); \
+ \
+ __ bind(&check_zero); \
+ __ fcmpu(left_reg, kDoubleRegZero); \
+ /* left == right != 0. */ \
+ __ bne(&return_left); \
+ /* At this point, both left and right are either 0 or -0. */ \
+ __ fadd(result_reg, left_reg, right_reg); \
+ __ b(&done); \
+ \
+ __ bind(&return_nan); \
+ /* If left or right are NaN, fadd propagates the appropriate one.*/ \
+ __ fadd(result_reg, left_reg, right_reg); \
+ __ b(&done); \
+ \
+ __ bind(&return_right); \
+ if (right_reg != result_reg) { \
+ __ fmr(result_reg, right_reg); \
+ } \
+ __ b(&done); \
+ \
+ __ bind(&return_left); \
+ if (left_reg != result_reg) { \
+ __ fmr(result_reg, left_reg); \
+ } \
+ __ bind(&done); \
} while (0)
#define ASSEMBLE_FLOAT_MIN() \
@@ -491,9 +492,9 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr,
DoubleRegister left_reg = i.InputDoubleRegister(0); \
DoubleRegister right_reg = i.InputDoubleRegister(1); \
DoubleRegister result_reg = i.OutputDoubleRegister(); \
- Label check_nan_left, check_zero, return_left, return_right, done; \
+ Label check_zero, return_left, return_right, return_nan, done; \
__ fcmpu(left_reg, right_reg); \
- __ bunordered(&check_nan_left); \
+ __ bunordered(&return_nan); \
__ beq(&check_zero); \
__ ble(&return_left); \
__ b(&return_right); \
@@ -515,10 +516,10 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr,
__ fneg(result_reg, result_reg); \
__ b(&done); \
\
- __ bind(&check_nan_left); \
- __ fcmpu(left_reg, left_reg); \
- /* left == NaN. */ \
- __ bunordered(&return_left); \
+ __ bind(&return_nan); \
+ /* If left or right are NaN, fadd propagates the appropriate one.*/ \
+ __ fadd(result_reg, left_reg, right_reg); \
+ __ b(&done); \
\
__ bind(&return_right); \
if (right_reg != result_reg) { \
@@ -3228,7 +3229,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
i.InputSimd128Register(1));
break;
}
- case kPPC_S8x16Shuffle: {
+ case kPPC_I8x16Shuffle: {
Simd128Register dst = i.OutputSimd128Register(),
src0 = i.InputSimd128Register(0),
src1 = i.InputSimd128Register(1);
@@ -3287,7 +3288,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
i.InputSimd128Register(1));
break;
}
- case kPPC_S8x16Swizzle: {
+ case kPPC_I8x16Swizzle: {
// Reverse the input to match IBM lane numbering.
Simd128Register tempFPReg1 = i.ToSimd128Register(instr->TempAt(0));
__ addi(sp, sp, Operand(-16));
@@ -3355,6 +3356,88 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
i.InputSimd128Register(1));
break;
}
+ case kPPC_S128AndNot: {
+ Simd128Register dst = i.OutputSimd128Register();
+ Simd128Register src = i.InputSimd128Register(0);
+ __ vandc(dst, src, i.InputSimd128Register(1));
+ break;
+ }
+ case kPPC_F64x2Div: {
+ __ xvdivdp(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ i.InputSimd128Register(1));
+ break;
+ }
+#define F64X2_MIN_MAX_NAN(result) \
+ Simd128Register tempFPReg1 = i.ToSimd128Register(instr->TempAt(0)); \
+ __ xvcmpeqdp(tempFPReg1, i.InputSimd128Register(0), \
+ i.InputSimd128Register(0)); \
+ __ vsel(result, i.InputSimd128Register(0), result, tempFPReg1); \
+ __ xvcmpeqdp(tempFPReg1, i.InputSimd128Register(1), \
+ i.InputSimd128Register(1)); \
+ __ vsel(i.OutputSimd128Register(), i.InputSimd128Register(1), result, \
+ tempFPReg1);
+ case kPPC_F64x2Min: {
+ __ xvmindp(kScratchDoubleReg, i.InputSimd128Register(0),
+ i.InputSimd128Register(1));
+ // We need to check if an input is NAN and preserve it.
+ F64X2_MIN_MAX_NAN(kScratchDoubleReg)
+ break;
+ }
+ case kPPC_F64x2Max: {
+ __ xvmaxdp(kScratchDoubleReg, i.InputSimd128Register(0),
+ i.InputSimd128Register(1));
+ // We need to check if an input is NAN and preserve it.
+ F64X2_MIN_MAX_NAN(kScratchDoubleReg)
+ break;
+ }
+#undef F64X2_MIN_MAX_NAN
+ case kPPC_F32x4Div: {
+ __ xvdivsp(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ i.InputSimd128Register(1));
+ break;
+ }
+ case kPPC_F32x4Min: {
+ __ vminfp(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ i.InputSimd128Register(1));
+ break;
+ }
+ case kPPC_F32x4Max: {
+ __ vmaxfp(i.OutputSimd128Register(), i.InputSimd128Register(0),
+ i.InputSimd128Register(1));
+ break;
+ }
+ case kPPC_F64x2Ceil: {
+ __ xvrdpip(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F64x2Floor: {
+ __ xvrdpim(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F64x2Trunc: {
+ __ xvrdpiz(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F64x2NearestInt: {
+ __ xvrdpi(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F32x4Ceil: {
+ __ xvrspip(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F32x4Floor: {
+ __ xvrspim(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F32x4Trunc: {
+ __ xvrspiz(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
+ case kPPC_F32x4NearestInt: {
+ __ xvrspi(i.OutputSimd128Register(), i.InputSimd128Register(0));
+ break;
+ }
case kPPC_StoreCompressTagged: {
ASSEMBLE_STORE_INTEGER(StoreTaggedField, StoreTaggedFieldX);
break;
@@ -3631,9 +3714,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue();
- if (call_descriptor->PushArgumentCount()) {
- __ Push(kJavaScriptCallArgCountRegister);
- }
} else {
StackFrame::Type type = info()->GetOutputStackFrameType();
// TODO(mbrandy): Detect cases where ip is the entrypoint (for
diff --git a/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h b/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h
index 9dc7bf49d0..fb5151ebd4 100644
--- a/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h
+++ b/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h
@@ -207,6 +207,13 @@ namespace compiler {
V(PPC_F64x2Sqrt) \
V(PPC_F64x2Qfma) \
V(PPC_F64x2Qfms) \
+ V(PPC_F64x2Div) \
+ V(PPC_F64x2Min) \
+ V(PPC_F64x2Max) \
+ V(PPC_F64x2Ceil) \
+ V(PPC_F64x2Floor) \
+ V(PPC_F64x2Trunc) \
+ V(PPC_F64x2NearestInt) \
V(PPC_F32x4Splat) \
V(PPC_F32x4ExtractLane) \
V(PPC_F32x4ReplaceLane) \
@@ -225,6 +232,13 @@ namespace compiler {
V(PPC_F32x4Sqrt) \
V(PPC_F32x4SConvertI32x4) \
V(PPC_F32x4UConvertI32x4) \
+ V(PPC_F32x4Div) \
+ V(PPC_F32x4Min) \
+ V(PPC_F32x4Max) \
+ V(PPC_F32x4Ceil) \
+ V(PPC_F32x4Floor) \
+ V(PPC_F32x4Trunc) \
+ V(PPC_F32x4NearestInt) \
V(PPC_I64x2Splat) \
V(PPC_I64x2ExtractLane) \
V(PPC_I64x2ReplaceLane) \
@@ -338,8 +352,8 @@ namespace compiler {
V(PPC_I8x16AddSaturateU) \
V(PPC_I8x16SubSaturateU) \
V(PPC_I8x16RoundingAverageU) \
- V(PPC_S8x16Shuffle) \
- V(PPC_S8x16Swizzle) \
+ V(PPC_I8x16Shuffle) \
+ V(PPC_I8x16Swizzle) \
V(PPC_V64x2AnyTrue) \
V(PPC_V32x4AnyTrue) \
V(PPC_V16x8AnyTrue) \
@@ -354,6 +368,7 @@ namespace compiler {
V(PPC_S128Zero) \
V(PPC_S128Not) \
V(PPC_S128Select) \
+ V(PPC_S128AndNot) \
V(PPC_StoreCompressTagged) \
V(PPC_LoadDecompressTaggedSigned) \
V(PPC_LoadDecompressTaggedPointer) \
diff --git a/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc b/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc
index 0493d81dd7..8beaa8539c 100644
--- a/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc
+++ b/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc
@@ -130,6 +130,13 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kPPC_F64x2Sqrt:
case kPPC_F64x2Qfma:
case kPPC_F64x2Qfms:
+ case kPPC_F64x2Div:
+ case kPPC_F64x2Min:
+ case kPPC_F64x2Max:
+ case kPPC_F64x2Ceil:
+ case kPPC_F64x2Floor:
+ case kPPC_F64x2Trunc:
+ case kPPC_F64x2NearestInt:
case kPPC_F32x4Splat:
case kPPC_F32x4ExtractLane:
case kPPC_F32x4ReplaceLane:
@@ -150,6 +157,13 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kPPC_F32x4UConvertI32x4:
case kPPC_F32x4Qfma:
case kPPC_F32x4Qfms:
+ case kPPC_F32x4Div:
+ case kPPC_F32x4Min:
+ case kPPC_F32x4Max:
+ case kPPC_F32x4Ceil:
+ case kPPC_F32x4Floor:
+ case kPPC_F32x4Trunc:
+ case kPPC_F32x4NearestInt:
case kPPC_I64x2Splat:
case kPPC_I64x2ExtractLane:
case kPPC_I64x2ReplaceLane:
@@ -261,8 +275,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kPPC_I8x16AddSaturateU:
case kPPC_I8x16SubSaturateU:
case kPPC_I8x16RoundingAverageU:
- case kPPC_S8x16Shuffle:
- case kPPC_S8x16Swizzle:
+ case kPPC_I8x16Shuffle:
+ case kPPC_I8x16Swizzle:
case kPPC_V64x2AnyTrue:
case kPPC_V32x4AnyTrue:
case kPPC_V16x8AnyTrue:
@@ -277,6 +291,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kPPC_S128Zero:
case kPPC_S128Not:
case kPPC_S128Select:
+ case kPPC_S128AndNot:
return kNoOpcodeFlags;
case kPPC_LoadWordS8:
diff --git a/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc b/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc
index 507542e28c..0c61821cf5 100644
--- a/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc
+++ b/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc
@@ -1200,6 +1200,10 @@ void InstructionSelector::VisitSignExtendWord32ToInt64(Node* node) {
VisitRR(this, kPPC_ExtendSignWord32, node);
}
+bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) {
+ UNIMPLEMENTED();
+}
+
void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
// TODO(mbrandy): inspect input to see if nop is appropriate.
VisitRR(this, kPPC_Uint32ToUint64, node);
@@ -2156,6 +2160,9 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(F64x2Ne) \
V(F64x2Le) \
V(F64x2Lt) \
+ V(F64x2Div) \
+ V(F64x2Min) \
+ V(F64x2Max) \
V(F32x4Add) \
V(F32x4AddHoriz) \
V(F32x4Sub) \
@@ -2164,6 +2171,9 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(F32x4Ne) \
V(F32x4Lt) \
V(F32x4Le) \
+ V(F32x4Div) \
+ V(F32x4Min) \
+ V(F32x4Max) \
V(I64x2Add) \
V(I64x2Sub) \
V(I64x2Mul) \
@@ -2222,15 +2232,20 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(I8x16AddSaturateU) \
V(I8x16SubSaturateU) \
V(I8x16RoundingAverageU) \
+ V(I8x16Swizzle) \
V(S128And) \
V(S128Or) \
V(S128Xor) \
- V(S8x16Swizzle)
+ V(S128AndNot)
#define SIMD_UNOP_LIST(V) \
V(F64x2Abs) \
V(F64x2Neg) \
V(F64x2Sqrt) \
+ V(F64x2Ceil) \
+ V(F64x2Floor) \
+ V(F64x2Trunc) \
+ V(F64x2NearestInt) \
V(F32x4Abs) \
V(F32x4Neg) \
V(F32x4RecipApprox) \
@@ -2238,6 +2253,10 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(F32x4Sqrt) \
V(F32x4SConvertI32x4) \
V(F32x4UConvertI32x4) \
+ V(F32x4Ceil) \
+ V(F32x4Floor) \
+ V(F32x4Trunc) \
+ V(F32x4NearestInt) \
V(I64x2Neg) \
V(I32x4Neg) \
V(I32x4Abs) \
@@ -2361,7 +2380,7 @@ SIMD_BOOL_LIST(SIMD_VISIT_BOOL)
#undef SIMD_BOOL_LIST
#undef SIMD_TYPES
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -2378,7 +2397,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
? max_index - current_index
: total_lane_count - current_index + max_index);
}
- Emit(kPPC_S8x16Shuffle, g.DefineAsRegister(node), g.UseUniqueRegister(input0),
+ Emit(kPPC_I8x16Shuffle, g.DefineAsRegister(node), g.UseUniqueRegister(input0),
g.UseUniqueRegister(input1),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_remapped)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_remapped + 4)),
@@ -2400,7 +2419,11 @@ void InstructionSelector::VisitS128Select(Node* node) {
void InstructionSelector::VisitS128Const(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitS128AndNot(Node* node) { UNIMPLEMENTED(); }
+void InstructionSelector::VisitI8x16BitMask(Node* node) { UNIMPLEMENTED(); }
+
+void InstructionSelector::VisitI16x8BitMask(Node* node) { UNIMPLEMENTED(); }
+
+void InstructionSelector::VisitI32x4BitMask(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::EmitPrepareResults(
ZoneVector<PushParameter>* results, const CallDescriptor* call_descriptor,
@@ -2427,19 +2450,15 @@ void InstructionSelector::EmitPrepareResults(
}
}
-void InstructionSelector::VisitF32x4Div(Node* node) { UNIMPLEMENTED(); }
-
-void InstructionSelector::VisitF32x4Min(Node* node) { UNIMPLEMENTED(); }
-
-void InstructionSelector::VisitF32x4Max(Node* node) { UNIMPLEMENTED(); }
+void InstructionSelector::VisitLoadTransform(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Div(Node* node) { UNIMPLEMENTED(); }
+void InstructionSelector::VisitF32x4Pmin(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Min(Node* node) { UNIMPLEMENTED(); }
+void InstructionSelector::VisitF32x4Pmax(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitF64x2Max(Node* node) { UNIMPLEMENTED(); }
+void InstructionSelector::VisitF64x2Pmin(Node* node) { UNIMPLEMENTED(); }
-void InstructionSelector::VisitLoadTransform(Node* node) { UNIMPLEMENTED(); }
+void InstructionSelector::VisitF64x2Pmax(Node* node) { UNIMPLEMENTED(); }
// static
MachineOperatorBuilder::Flags
diff --git a/deps/v8/src/compiler/backend/register-allocator.cc b/deps/v8/src/compiler/backend/register-allocator.cc
index b3b40281b9..30724647c6 100644
--- a/deps/v8/src/compiler/backend/register-allocator.cc
+++ b/deps/v8/src/compiler/backend/register-allocator.cc
@@ -300,7 +300,6 @@ LiveRange::LiveRange(int relative_id, MachineRepresentation rep,
next_(nullptr),
current_interval_(nullptr),
last_processed_use_(nullptr),
- splitting_pointer_(nullptr),
current_hint_position_(nullptr) {
DCHECK(AllocatedOperand::IsSupportedRepresentation(rep));
bits_ = AssignedRegisterField::encode(kUnassignedRegister) |
@@ -597,10 +596,7 @@ UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result,
// Find the last use position before the split and the first use
// position after it.
- UsePosition* use_after =
- splitting_pointer_ == nullptr || splitting_pointer_->pos() > position
- ? first_pos()
- : splitting_pointer_;
+ UsePosition* use_after = first_pos();
UsePosition* use_before = nullptr;
if (split_at_start) {
// The split position coincides with the beginning of a use interval (the
@@ -819,24 +815,16 @@ TopLevelLiveRange::TopLevelLiveRange(int vreg, MachineRepresentation rep)
: LiveRange(0, rep, this),
vreg_(vreg),
last_child_id_(0),
- splintered_from_(nullptr),
spill_operand_(nullptr),
spill_move_insertion_locations_(nullptr),
spilled_in_deferred_blocks_(false),
has_preassigned_slot_(false),
spill_start_index_(kMaxInt),
last_pos_(nullptr),
- last_child_covers_(this),
- splinter_(nullptr) {
+ last_child_covers_(this) {
bits_ |= SpillTypeField::encode(SpillType::kNoSpillType);
}
-#if DEBUG
-int TopLevelLiveRange::debug_virt_reg() const {
- return IsSplinter() ? splintered_from()->vreg() : vreg();
-}
-#endif
-
void TopLevelLiveRange::RecordSpillLocation(Zone* zone, int gap_index,
InstructionOperand* operand) {
DCHECK(HasNoSpillType());
@@ -925,157 +913,6 @@ AllocatedOperand TopLevelLiveRange::GetSpillRangeOperand() const {
return AllocatedOperand(LocationOperand::STACK_SLOT, representation(), index);
}
-void TopLevelLiveRange::Splinter(LifetimePosition start, LifetimePosition end,
- Zone* zone) {
- DCHECK(start != Start() || end != End());
- DCHECK(start < end);
-
- TopLevelLiveRange splinter_temp(-1, representation());
- UsePosition* last_in_splinter = nullptr;
- // Live ranges defined in deferred blocks stay in deferred blocks, so we
- // don't need to splinter them. That means that start should always be
- // after the beginning of the range.
- DCHECK(start > Start());
-
- if (end >= End()) {
- DCHECK(start > Start());
- DetachAt(start, &splinter_temp, zone, ConnectHints);
- next_ = nullptr;
- } else {
- DCHECK(start < End() && Start() < end);
-
- const int kInvalidId = std::numeric_limits<int>::max();
-
- UsePosition* last = DetachAt(start, &splinter_temp, zone, ConnectHints);
-
- LiveRange end_part(kInvalidId, this->representation(), nullptr);
- // The last chunk exits the deferred region, and we don't want to connect
- // hints here, because the non-deferred region shouldn't be affected
- // by allocation decisions on the deferred path.
- last_in_splinter =
- splinter_temp.DetachAt(end, &end_part, zone, DoNotConnectHints);
-
- next_ = end_part.next_;
- last_interval_->set_next(end_part.first_interval_);
- // The next splinter will happen either at or after the current interval.
- // We can optimize DetachAt by setting current_interval_ accordingly,
- // which will then be picked up by FirstSearchIntervalForPosition.
- current_interval_ = last_interval_;
- last_interval_ = end_part.last_interval_;
-
- if (first_pos_ == nullptr) {
- first_pos_ = end_part.first_pos_;
- } else {
- splitting_pointer_ = last;
- if (last != nullptr) last->set_next(end_part.first_pos_);
- }
- }
-
- if (splinter()->IsEmpty()) {
- splinter()->first_interval_ = splinter_temp.first_interval_;
- splinter()->last_interval_ = splinter_temp.last_interval_;
- } else {
- splinter()->last_interval_->set_next(splinter_temp.first_interval_);
- splinter()->last_interval_ = splinter_temp.last_interval_;
- }
- if (splinter()->first_pos() == nullptr) {
- splinter()->first_pos_ = splinter_temp.first_pos_;
- } else {
- splinter()->last_pos_->set_next(splinter_temp.first_pos_);
- }
- if (last_in_splinter != nullptr) {
- splinter()->last_pos_ = last_in_splinter;
- } else {
- if (splinter()->first_pos() != nullptr &&
- splinter()->last_pos_ == nullptr) {
- splinter()->last_pos_ = splinter()->first_pos();
- for (UsePosition* pos = splinter()->first_pos(); pos != nullptr;
- pos = pos->next()) {
- splinter()->last_pos_ = pos;
- }
- }
- }
-#if DEBUG
- Verify();
- splinter()->Verify();
-#endif
-}
-
-void TopLevelLiveRange::SetSplinteredFrom(TopLevelLiveRange* splinter_parent) {
- splintered_from_ = splinter_parent;
- if (!HasSpillOperand() && splinter_parent->spill_range_ != nullptr) {
- SetSpillRange(splinter_parent->spill_range_);
- }
-}
-
-void TopLevelLiveRange::UpdateSpillRangePostMerge(TopLevelLiveRange* merged) {
- DCHECK(merged->TopLevel() == this);
-
- if (HasNoSpillType() && merged->HasSpillRange()) {
- set_spill_type(merged->spill_type());
- DCHECK_LT(0, GetSpillRange()->live_ranges().size());
- merged->spill_range_ = nullptr;
- merged->bits_ =
- SpillTypeField::update(merged->bits_, SpillType::kNoSpillType);
- }
-}
-
-void TopLevelLiveRange::Merge(TopLevelLiveRange* other, Zone* zone) {
- DCHECK(Start() < other->Start());
- DCHECK(other->splintered_from() == this);
-
- LiveRange* first = this;
- LiveRange* second = other;
- DCHECK(first->Start() < second->Start());
- while (first != nullptr && second != nullptr) {
- DCHECK(first != second);
- // Make sure the ranges are in order each time we iterate.
- if (second->Start() < first->Start()) {
- LiveRange* tmp = second;
- second = first;
- first = tmp;
- continue;
- }
-
- if (first->End() <= second->Start()) {
- if (first->next() == nullptr ||
- first->next()->Start() > second->Start()) {
- // First is in order before second.
- LiveRange* temp = first->next();
- first->next_ = second;
- first = temp;
- } else {
- // First is in order before its successor (or second), so advance first.
- first = first->next();
- }
- continue;
- }
-
- DCHECK(first->Start() < second->Start());
- // If first and second intersect, split first.
- if (first->Start() < second->End() && second->Start() < first->End()) {
- LiveRange* temp = first->SplitAt(second->Start(), zone);
- CHECK(temp != first);
- temp->set_spilled(first->spilled());
- if (!temp->spilled())
- temp->set_assigned_register(first->assigned_register());
-
- first->next_ = second;
- first = temp;
- continue;
- }
- DCHECK(first->End() <= second->Start());
- }
-
- TopLevel()->UpdateParentForAllChildren(TopLevel());
- TopLevel()->UpdateSpillRangePostMerge(other);
- TopLevel()->register_slot_use(other->slot_use_kind());
-
-#if DEBUG
- Verify();
-#endif
-}
-
void TopLevelLiveRange::VerifyChildrenInOrder() const {
LifetimePosition last_end = End();
for (const LiveRange* child = this->next(); child != nullptr;
@@ -1271,8 +1108,7 @@ void PrintBlockRow(std::ostream& os, const InstructionBlocks& blocks) {
void LinearScanAllocator::PrintRangeRow(std::ostream& os,
const TopLevelLiveRange* toplevel) {
int position = 0;
- os << std::setw(3) << toplevel->vreg()
- << (toplevel->IsSplinter() ? "s:" : ": ");
+ os << std::setw(3) << toplevel->vreg() << ": ";
const char* kind_string;
switch (toplevel->spill_type()) {
@@ -1340,10 +1176,9 @@ SpillRange::SpillRange(TopLevelLiveRange* parent, Zone* zone)
: live_ranges_(zone),
assigned_slot_(kUnassignedSlot),
byte_width_(ByteWidthForStackSlot(parent->representation())) {
- // Spill ranges are created for top level, non-splintered ranges. This is so
- // that, when merging decisions are made, we consider the full extent of the
- // virtual register, and avoid clobbering it.
- DCHECK(!parent->IsSplinter());
+ // Spill ranges are created for top level. This is so that, when merging
+ // decisions are made, we consider the full extent of the virtual register,
+ // and avoid clobbering it.
UseInterval* result = nullptr;
UseInterval* node = nullptr;
// Copy the intervals for all ranges.
@@ -1646,32 +1481,16 @@ SpillRange* TopTierRegisterAllocationData::AssignSpillRangeToLiveRange(
SpillRange* spill_range = range->GetAllocatedSpillRange();
if (spill_range == nullptr) {
- DCHECK(!range->IsSplinter());
spill_range = allocation_zone()->New<SpillRange>(range, allocation_zone());
}
if (spill_mode == SpillMode::kSpillDeferred &&
(range->spill_type() != SpillType::kSpillRange)) {
- DCHECK(is_turbo_control_flow_aware_allocation());
range->set_spill_type(SpillType::kDeferredSpillRange);
} else {
range->set_spill_type(SpillType::kSpillRange);
}
- int spill_range_index =
- range->IsSplinter() ? range->splintered_from()->vreg() : range->vreg();
-
- spill_ranges()[spill_range_index] = spill_range;
-
- return spill_range;
-}
-
-SpillRange* TopTierRegisterAllocationData::CreateSpillRangeForLiveRange(
- TopLevelLiveRange* range) {
- DCHECK(is_turbo_preprocess_ranges());
- DCHECK(!range->HasSpillOperand());
- DCHECK(!range->IsSplinter());
- SpillRange* spill_range =
- allocation_zone()->New<SpillRange>(range, allocation_zone());
+ spill_ranges()[range->vreg()] = spill_range;
return spill_range;
}
@@ -2337,15 +2156,10 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block,
int vreg = unalloc->virtual_register();
live->Add(vreg);
if (unalloc->HasSlotPolicy()) {
- if (data()->is_turbo_control_flow_aware_allocation()) {
- data()->GetOrCreateLiveRangeFor(vreg)->register_slot_use(
- block->IsDeferred()
- ? TopLevelLiveRange::SlotUseKind::kDeferredSlotUse
- : TopLevelLiveRange::SlotUseKind::kGeneralSlotUse);
- } else {
- data()->GetOrCreateLiveRangeFor(vreg)->register_slot_use(
- TopLevelLiveRange::SlotUseKind::kGeneralSlotUse);
- }
+ data()->GetOrCreateLiveRangeFor(vreg)->register_slot_use(
+ block->IsDeferred()
+ ? TopLevelLiveRange::SlotUseKind::kDeferredSlotUse
+ : TopLevelLiveRange::SlotUseKind::kGeneralSlotUse);
}
}
Use(block_start_position, use_pos, input, spill_mode);
@@ -2917,12 +2731,7 @@ void RegisterAllocator::SplitAndSpillRangesDefinedByMemoryOperand() {
next_pos = next_pos.NextStart();
}
- // With splinters, we can be more strict and skip over positions
- // not strictly needing registers.
- UsePosition* pos =
- range->IsSplinter()
- ? range->NextRegisterPosition(next_pos)
- : range->NextUsePositionRegisterIsBeneficial(next_pos);
+ UsePosition* pos = range->NextUsePositionRegisterIsBeneficial(next_pos);
// If the range already has a spill operand and it doesn't need a
// register immediately, split it and spill the first part of the range.
if (pos == nullptr) {
@@ -3025,66 +2834,42 @@ LifetimePosition RegisterAllocator::FindOptimalSpillingPos(
block->IsLoopHeader() ? block : GetContainingLoop(code(), block);
if (loop_header == nullptr) return pos;
- if (data()->is_turbo_control_flow_aware_allocation()) {
- while (loop_header != nullptr) {
- // We are going to spill live range inside the loop.
- // If possible try to move spilling position backwards to loop header.
- // This will reduce number of memory moves on the back edge.
- LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex(
- loop_header->first_instruction_index());
- // Stop if we moved to a loop header before the value is defined or
- // at the define position that is not beneficial to spill.
- if (range->TopLevel()->Start() > loop_start ||
- (range->TopLevel()->Start() == loop_start &&
- range->TopLevel()->SpillAtLoopHeaderNotBeneficial()))
- return pos;
-
- LiveRange* live_at_header = range->TopLevel()->GetChildCovers(loop_start);
-
- if (live_at_header != nullptr && !live_at_header->spilled()) {
- for (LiveRange* check_use = live_at_header;
- check_use != nullptr && check_use->Start() < pos;
- check_use = check_use->next()) {
- // If we find a use for which spilling is detrimental, don't spill
- // at the loop header
- UsePosition* next_use =
- check_use->NextUsePositionSpillDetrimental(loop_start);
- // UsePosition at the end of a UseInterval may
- // have the same value as the start of next range.
- if (next_use != nullptr && next_use->pos() <= pos) {
- return pos;
- }
+ while (loop_header != nullptr) {
+ // We are going to spill live range inside the loop.
+ // If possible try to move spilling position backwards to loop header.
+ // This will reduce number of memory moves on the back edge.
+ LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex(
+ loop_header->first_instruction_index());
+ // Stop if we moved to a loop header before the value is defined or
+ // at the define position that is not beneficial to spill.
+ if (range->TopLevel()->Start() > loop_start ||
+ (range->TopLevel()->Start() == loop_start &&
+ range->TopLevel()->SpillAtLoopHeaderNotBeneficial()))
+ return pos;
+
+ LiveRange* live_at_header = range->TopLevel()->GetChildCovers(loop_start);
+
+ if (live_at_header != nullptr && !live_at_header->spilled()) {
+ for (LiveRange* check_use = live_at_header;
+ check_use != nullptr && check_use->Start() < pos;
+ check_use = check_use->next()) {
+ // If we find a use for which spilling is detrimental, don't spill
+ // at the loop header
+ UsePosition* next_use =
+ check_use->NextUsePositionSpillDetrimental(loop_start);
+ // UsePosition at the end of a UseInterval may
+ // have the same value as the start of next range.
+ if (next_use != nullptr && next_use->pos() <= pos) {
+ return pos;
}
- // No register beneficial use inside the loop before the pos.
- *begin_spill_out = live_at_header;
- pos = loop_start;
}
-
- // Try hoisting out to an outer loop.
- loop_header = GetContainingLoop(code(), loop_header);
+ // No register beneficial use inside the loop before the pos.
+ *begin_spill_out = live_at_header;
+ pos = loop_start;
}
- } else {
- const UsePosition* prev_use =
- range->PreviousUsePositionRegisterIsBeneficial(pos);
-
- while (loop_header != nullptr) {
- // We are going to spill live range inside the loop.
- // If possible try to move spilling position backwards to loop header
- // inside the current range. This will reduce number of memory moves on
- // the back edge.
- LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex(
- loop_header->first_instruction_index());
-
- if (range->Covers(loop_start)) {
- if (prev_use == nullptr || prev_use->pos() < loop_start) {
- // No register beneficial use inside the loop before the pos.
- pos = loop_start;
- }
- }
- // Try hoisting out to an outer loop.
- loop_header = GetContainingLoop(code(), loop_header);
- }
+ // Try hoisting out to an outer loop.
+ loop_header = GetContainingLoop(code(), loop_header);
}
return pos;
}
@@ -3761,9 +3546,7 @@ void LinearScanAllocator::AllocateRegisters() {
// those. Not only does this produce a potentially bad assignment, it also
// breaks with the invariant that we undo spills that happen in deferred code
// when crossing a deferred/non-deferred boundary.
- while (!unhandled_live_ranges().empty() ||
- (data()->is_turbo_control_flow_aware_allocation() &&
- last_block < max_blocks)) {
+ while (!unhandled_live_ranges().empty() || last_block < max_blocks) {
data()->tick_counter()->TickAndMaybeEnterSafepoint();
LiveRange* current = unhandled_live_ranges().empty()
? nullptr
@@ -3773,160 +3556,155 @@ void LinearScanAllocator::AllocateRegisters() {
#ifdef DEBUG
allocation_finger_ = position;
#endif
- if (data()->is_turbo_control_flow_aware_allocation()) {
- // Splintering is not supported.
- CHECK(!data()->is_turbo_preprocess_ranges());
- // Check whether we just moved across a block boundary. This will trigger
- // for the first range that is past the current boundary.
- if (position >= next_block_boundary) {
- TRACE("Processing boundary at %d leaving %d\n",
- next_block_boundary.value(), last_block.ToInt());
-
- // Forward state to before block boundary
- LifetimePosition end_of_block = next_block_boundary.PrevStart().End();
- ForwardStateTo(end_of_block);
-
- // Remember this state.
- InstructionBlock* current_block = data()->code()->GetInstructionBlock(
- next_block_boundary.ToInstructionIndex());
-
- // Store current spill state (as the state at end of block). For
- // simplicity, we store the active ranges, e.g., the live ranges that
- // are not spilled.
- data()->RememberSpillState(last_block, active_live_ranges());
-
- // Only reset the state if this was not a direct fallthrough. Otherwise
- // control flow resolution will get confused (it does not expect changes
- // across fallthrough edges.).
- bool fallthrough = (current_block->PredecessorCount() == 1) &&
- current_block->predecessors()[0].IsNext(
- current_block->rpo_number());
-
- // When crossing a deferred/non-deferred boundary, we have to load or
- // remove the deferred fixed ranges from inactive.
- if ((spill_mode == SpillMode::kSpillDeferred) !=
- current_block->IsDeferred()) {
- // Update spill mode.
- spill_mode = current_block->IsDeferred()
- ? SpillMode::kSpillDeferred
- : SpillMode::kSpillAtDefinition;
-
- ForwardStateTo(next_block_boundary);
+ // Check whether we just moved across a block boundary. This will trigger
+ // for the first range that is past the current boundary.
+ if (position >= next_block_boundary) {
+ TRACE("Processing boundary at %d leaving %d\n",
+ next_block_boundary.value(), last_block.ToInt());
+
+ // Forward state to before block boundary
+ LifetimePosition end_of_block = next_block_boundary.PrevStart().End();
+ ForwardStateTo(end_of_block);
+
+ // Remember this state.
+ InstructionBlock* current_block = data()->code()->GetInstructionBlock(
+ next_block_boundary.ToInstructionIndex());
+
+ // Store current spill state (as the state at end of block). For
+ // simplicity, we store the active ranges, e.g., the live ranges that
+ // are not spilled.
+ data()->RememberSpillState(last_block, active_live_ranges());
+
+ // Only reset the state if this was not a direct fallthrough. Otherwise
+ // control flow resolution will get confused (it does not expect changes
+ // across fallthrough edges.).
+ bool fallthrough =
+ (current_block->PredecessorCount() == 1) &&
+ current_block->predecessors()[0].IsNext(current_block->rpo_number());
+
+ // When crossing a deferred/non-deferred boundary, we have to load or
+ // remove the deferred fixed ranges from inactive.
+ if ((spill_mode == SpillMode::kSpillDeferred) !=
+ current_block->IsDeferred()) {
+ // Update spill mode.
+ spill_mode = current_block->IsDeferred()
+ ? SpillMode::kSpillDeferred
+ : SpillMode::kSpillAtDefinition;
+
+ ForwardStateTo(next_block_boundary);
#ifdef DEBUG
- // Allow allocation at current position.
- allocation_finger_ = next_block_boundary;
+ // Allow allocation at current position.
+ allocation_finger_ = next_block_boundary;
#endif
- UpdateDeferredFixedRanges(spill_mode, current_block);
- }
+ UpdateDeferredFixedRanges(spill_mode, current_block);
+ }
- // Allocation relies on the fact that each non-deferred block has at
- // least one non-deferred predecessor. Check this invariant here.
- DCHECK_IMPLIES(!current_block->IsDeferred(),
- HasNonDeferredPredecessor(current_block));
+ // Allocation relies on the fact that each non-deferred block has at
+ // least one non-deferred predecessor. Check this invariant here.
+ DCHECK_IMPLIES(!current_block->IsDeferred(),
+ HasNonDeferredPredecessor(current_block));
- if (!fallthrough) {
+ if (!fallthrough) {
#ifdef DEBUG
- // Allow allocation at current position.
- allocation_finger_ = next_block_boundary;
+ // Allow allocation at current position.
+ allocation_finger_ = next_block_boundary;
#endif
- // We are currently at next_block_boundary - 1. Move the state to the
- // actual block boundary position. In particular, we have to
- // reactivate inactive ranges so that they get rescheduled for
- // allocation if they were not live at the predecessors.
- ForwardStateTo(next_block_boundary);
-
- RangeWithRegisterSet to_be_live(data()->allocation_zone());
-
- // If we end up deciding to use the state of the immediate
- // predecessor, it is better not to perform a change. It would lead to
- // the same outcome anyway.
- // This may never happen on boundaries between deferred and
- // non-deferred code, as we rely on explicit respill to ensure we
- // spill at definition.
- bool no_change_required = false;
-
- auto pick_state_from = [this, current_block](
- RpoNumber pred,
- RangeWithRegisterSet* to_be_live) -> bool {
- TRACE("Using information from B%d\n", pred.ToInt());
- // If this is a fall-through that is not across a deferred
- // boundary, there is nothing to do.
- bool is_noop = pred.IsNext(current_block->rpo_number());
- if (!is_noop) {
- auto& spill_state = data()->GetSpillState(pred);
- TRACE("Not a fallthrough. Adding %zu elements...\n",
- spill_state.size());
- LifetimePosition pred_end =
- LifetimePosition::GapFromInstructionIndex(
- this->code()->InstructionBlockAt(pred)->code_end());
- for (const auto range : spill_state) {
- // Filter out ranges that were split or had their register
- // stolen by backwards working spill heuristics. These have
- // been spilled after the fact, so ignore them.
- if (range->End() < pred_end || !range->HasRegisterAssigned())
- continue;
- to_be_live->emplace(range);
- }
- }
- return is_noop;
- };
-
- // Multiple cases here:
- // 1) We have a single predecessor => this is a control flow split, so
- // just restore the predecessor state.
- // 2) We have two predecessors => this is a conditional, so break ties
- // based on what to do based on forward uses, trying to benefit
- // the same branch if in doubt (make one path fast).
- // 3) We have many predecessors => this is a switch. Compute union
- // based on majority, break ties by looking forward.
- if (current_block->PredecessorCount() == 1) {
- TRACE("Single predecessor for B%d\n",
- current_block->rpo_number().ToInt());
- no_change_required =
- pick_state_from(current_block->predecessors()[0], &to_be_live);
- } else if (current_block->PredecessorCount() == 2) {
- TRACE("Two predecessors for B%d\n",
- current_block->rpo_number().ToInt());
- // If one of the branches does not contribute any information,
- // e.g. because it is deferred or a back edge, we can short cut
- // here right away.
- RpoNumber chosen_predecessor = RpoNumber::Invalid();
- if (!ConsiderBlockForControlFlow(
- current_block, current_block->predecessors()[0])) {
- chosen_predecessor = current_block->predecessors()[1];
- } else if (!ConsiderBlockForControlFlow(
- current_block, current_block->predecessors()[1])) {
- chosen_predecessor = current_block->predecessors()[0];
- } else {
- chosen_predecessor = ChooseOneOfTwoPredecessorStates(
- current_block, next_block_boundary);
+ // We are currently at next_block_boundary - 1. Move the state to the
+ // actual block boundary position. In particular, we have to
+ // reactivate inactive ranges so that they get rescheduled for
+ // allocation if they were not live at the predecessors.
+ ForwardStateTo(next_block_boundary);
+
+ RangeWithRegisterSet to_be_live(data()->allocation_zone());
+
+ // If we end up deciding to use the state of the immediate
+ // predecessor, it is better not to perform a change. It would lead to
+ // the same outcome anyway.
+ // This may never happen on boundaries between deferred and
+ // non-deferred code, as we rely on explicit respill to ensure we
+ // spill at definition.
+ bool no_change_required = false;
+
+ auto pick_state_from = [this, current_block](
+ RpoNumber pred,
+ RangeWithRegisterSet* to_be_live) -> bool {
+ TRACE("Using information from B%d\n", pred.ToInt());
+ // If this is a fall-through that is not across a deferred
+ // boundary, there is nothing to do.
+ bool is_noop = pred.IsNext(current_block->rpo_number());
+ if (!is_noop) {
+ auto& spill_state = data()->GetSpillState(pred);
+ TRACE("Not a fallthrough. Adding %zu elements...\n",
+ spill_state.size());
+ LifetimePosition pred_end =
+ LifetimePosition::GapFromInstructionIndex(
+ this->code()->InstructionBlockAt(pred)->code_end());
+ for (const auto range : spill_state) {
+ // Filter out ranges that were split or had their register
+ // stolen by backwards working spill heuristics. These have
+ // been spilled after the fact, so ignore them.
+ if (range->End() < pred_end || !range->HasRegisterAssigned())
+ continue;
+ to_be_live->emplace(range);
}
- no_change_required =
- pick_state_from(chosen_predecessor, &to_be_live);
-
+ }
+ return is_noop;
+ };
+
+ // Multiple cases here:
+ // 1) We have a single predecessor => this is a control flow split, so
+ // just restore the predecessor state.
+ // 2) We have two predecessors => this is a conditional, so break ties
+ // based on what to do based on forward uses, trying to benefit
+ // the same branch if in doubt (make one path fast).
+ // 3) We have many predecessors => this is a switch. Compute union
+ // based on majority, break ties by looking forward.
+ if (current_block->PredecessorCount() == 1) {
+ TRACE("Single predecessor for B%d\n",
+ current_block->rpo_number().ToInt());
+ no_change_required =
+ pick_state_from(current_block->predecessors()[0], &to_be_live);
+ } else if (current_block->PredecessorCount() == 2) {
+ TRACE("Two predecessors for B%d\n",
+ current_block->rpo_number().ToInt());
+ // If one of the branches does not contribute any information,
+ // e.g. because it is deferred or a back edge, we can short cut
+ // here right away.
+ RpoNumber chosen_predecessor = RpoNumber::Invalid();
+ if (!ConsiderBlockForControlFlow(current_block,
+ current_block->predecessors()[0])) {
+ chosen_predecessor = current_block->predecessors()[1];
+ } else if (!ConsiderBlockForControlFlow(
+ current_block, current_block->predecessors()[1])) {
+ chosen_predecessor = current_block->predecessors()[0];
} else {
- // Merge at the end of, e.g., a switch.
- ComputeStateFromManyPredecessors(current_block, &to_be_live);
+ chosen_predecessor = ChooseOneOfTwoPredecessorStates(
+ current_block, next_block_boundary);
}
+ no_change_required = pick_state_from(chosen_predecessor, &to_be_live);
- if (!no_change_required) {
- SpillNotLiveRanges(&to_be_live, next_block_boundary, spill_mode);
- ReloadLiveRanges(to_be_live, next_block_boundary);
- }
+ } else {
+ // Merge at the end of, e.g., a switch.
+ ComputeStateFromManyPredecessors(current_block, &to_be_live);
+ }
+
+ if (!no_change_required) {
+ SpillNotLiveRanges(&to_be_live, next_block_boundary, spill_mode);
+ ReloadLiveRanges(to_be_live, next_block_boundary);
}
- // Update block information
- last_block = current_block->rpo_number();
- next_block_boundary = LifetimePosition::InstructionFromInstructionIndex(
- current_block->last_instruction_index())
- .NextFullStart();
-
- // We might have created new unhandled live ranges, so cycle around the
- // loop to make sure we pick the top most range in unhandled for
- // processing.
- continue;
}
+ // Update block information
+ last_block = current_block->rpo_number();
+ next_block_boundary = LifetimePosition::InstructionFromInstructionIndex(
+ current_block->last_instruction_index())
+ .NextFullStart();
+
+ // We might have created new unhandled live ranges, so cycle around the
+ // loop to make sure we pick the top most range in unhandled for
+ // processing.
+ continue;
}
DCHECK_NOT_NULL(current);
@@ -3952,28 +3730,6 @@ void LinearScanAllocator::AllocateRegisters() {
}
}
-bool LinearScanAllocator::TrySplitAndSpillSplinter(LiveRange* range) {
- DCHECK(!data()->is_turbo_control_flow_aware_allocation());
- DCHECK(range->TopLevel()->IsSplinter());
- // If we can spill the whole range, great. Otherwise, split above the
- // first use needing a register and spill the top part.
- const UsePosition* next_reg = range->NextRegisterPosition(range->Start());
- if (next_reg == nullptr) {
- Spill(range, SpillMode::kSpillAtDefinition);
- return true;
- } else if (range->FirstHintPosition() == nullptr) {
- // If there was no hint, but we have a use position requiring a
- // register, apply the hot path heuristics.
- return false;
- } else if (next_reg->pos().PrevStart() > range->Start()) {
- LiveRange* tail = SplitRangeAt(range, next_reg->pos().PrevStart());
- AddToUnhandled(tail);
- Spill(range, SpillMode::kSpillAtDefinition);
- return true;
- }
- return false;
-}
-
void LinearScanAllocator::SetLiveRangeAssignedRegister(LiveRange* range,
int reg) {
data()->MarkAllocated(range->representation(), reg);
@@ -4198,49 +3954,17 @@ void LinearScanAllocator::FindFreeRegistersForRange(
// High-level register allocation summary:
//
-// For regular, or hot (i.e. not splinter) ranges, we attempt to first
-// allocate first the preferred (hint) register. If that is not possible,
-// we find a register that's free, and allocate that. If that's not possible,
-// we search for a register to steal from a range that was allocated. The
-// goal is to optimize for throughput by avoiding register-to-memory
-// moves, which are expensive.
-//
-// For splinters, the goal is to minimize the number of moves. First we try
-// to allocate the preferred register (more discussion follows). Failing that,
-// we bail out and spill as far as we can, unless the first use is at start,
-// case in which we apply the same behavior as we do for regular ranges.
-// If there is no hint, we apply the hot-path behavior.
-//
-// For the splinter, the hint register may come from:
-//
-// - the hot path (we set it at splintering time with SetHint). In this case, if
-// we cannot offer the hint register, spilling is better because it's at most
-// 1 move, while trying to find and offer another register is at least 1 move.
-//
-// - a constraint. If we cannot offer that register, it's because there is some
-// interference. So offering the hint register up to the interference would
-// result
-// in a move at the interference, plus a move to satisfy the constraint. This is
-// also the number of moves if we spill, with the potential of the range being
-// already spilled and thus saving a move (the spill).
-// Note that this can only be an input constraint, if it were an output one,
-// the range wouldn't be a splinter because it means it'd be defined in a
-// deferred
-// block, and we don't mark those as splinters (they live in deferred blocks
-// only).
-//
-// - a phi. The same analysis as in the case of the input constraint applies.
-//
+// We attempt to first allocate the preferred (hint) register. If that is not
+// possible, we find a register that's free, and allocate that. If that's not
+// possible, we search for a register to steal from a range that was allocated.
+// The goal is to optimize for throughput by avoiding register-to-memory moves,
+// which are expensive.
void LinearScanAllocator::ProcessCurrentRange(LiveRange* current,
SpillMode spill_mode) {
EmbeddedVector<LifetimePosition, RegisterConfiguration::kMaxRegisters>
free_until_pos;
FindFreeRegistersForRange(current, free_until_pos);
if (!TryAllocatePreferredReg(current, free_until_pos)) {
- if (current->TopLevel()->IsSplinter()) {
- DCHECK(!data()->is_turbo_control_flow_aware_allocation());
- if (TrySplitAndSpillSplinter(current)) return;
- }
if (!TryAllocateFreeReg(current, free_until_pos)) {
AllocateBlockedReg(current, spill_mode);
}
@@ -4725,30 +4449,26 @@ OperandAssigner::OperandAssigner(TopTierRegisterAllocationData* data)
: data_(data) {}
void OperandAssigner::DecideSpillingMode() {
- if (data()->is_turbo_control_flow_aware_allocation()) {
- for (auto range : data()->live_ranges()) {
- data()->tick_counter()->TickAndMaybeEnterSafepoint();
- int max_blocks = data()->code()->InstructionBlockCount();
- if (range != nullptr && range->IsSpilledOnlyInDeferredBlocks(data())) {
- // If the range is spilled only in deferred blocks and starts in
- // a non-deferred block, we transition its representation here so
- // that the LiveRangeConnector processes them correctly. If,
- // however, they start in a deferred block, we uograde them to
- // spill at definition, as that definition is in a deferred block
- // anyway. While this is an optimization, the code in LiveRangeConnector
- // relies on it!
- if (GetInstructionBlock(data()->code(), range->Start())->IsDeferred()) {
- TRACE("Live range %d is spilled and alive in deferred code only\n",
- range->vreg());
- range->TransitionRangeToSpillAtDefinition();
- } else {
- TRACE(
- "Live range %d is spilled deferred code only but alive outside\n",
+ for (auto range : data()->live_ranges()) {
+ data()->tick_counter()->TickAndMaybeEnterSafepoint();
+ int max_blocks = data()->code()->InstructionBlockCount();
+ if (range != nullptr && range->IsSpilledOnlyInDeferredBlocks(data())) {
+ // If the range is spilled only in deferred blocks and starts in
+ // a non-deferred block, we transition its representation here so
+ // that the LiveRangeConnector processes them correctly. If,
+ // however, they start in a deferred block, we uograde them to
+ // spill at definition, as that definition is in a deferred block
+ // anyway. While this is an optimization, the code in LiveRangeConnector
+ // relies on it!
+ if (GetInstructionBlock(data()->code(), range->Start())->IsDeferred()) {
+ TRACE("Live range %d is spilled and alive in deferred code only\n",
range->vreg());
- DCHECK(data()->is_turbo_control_flow_aware_allocation());
- range->TransitionRangeToDeferredSpill(data()->allocation_zone(),
- max_blocks);
- }
+ range->TransitionRangeToSpillAtDefinition();
+ } else {
+ TRACE("Live range %d is spilled deferred code only but alive outside\n",
+ range->vreg());
+ range->TransitionRangeToDeferredSpill(data()->allocation_zone(),
+ max_blocks);
}
}
}
diff --git a/deps/v8/src/compiler/backend/register-allocator.h b/deps/v8/src/compiler/backend/register-allocator.h
index a9dc2900f1..87c0afbcfc 100644
--- a/deps/v8/src/compiler/backend/register-allocator.h
+++ b/deps/v8/src/compiler/backend/register-allocator.h
@@ -175,11 +175,7 @@ class LifetimePosition final {
std::ostream& operator<<(std::ostream& os, const LifetimePosition pos);
-enum class RegisterAllocationFlag : unsigned {
- kTurboControlFlowAwareAllocation = 1 << 0,
- kTurboPreprocessRanges = 1 << 1,
- kTraceAllocation = 1 << 2
-};
+enum class RegisterAllocationFlag : unsigned { kTraceAllocation = 1 << 0 };
using RegisterAllocationFlags = base::Flags<RegisterAllocationFlag>;
@@ -210,14 +206,6 @@ class TopTierRegisterAllocationData final : public RegisterAllocationData {
// regular code (kSpillAtDefinition).
enum SpillMode { kSpillAtDefinition, kSpillDeferred };
- bool is_turbo_control_flow_aware_allocation() const {
- return flags_ & RegisterAllocationFlag::kTurboControlFlowAwareAllocation;
- }
-
- bool is_turbo_preprocess_ranges() const {
- return flags_ & RegisterAllocationFlag::kTurboPreprocessRanges;
- }
-
bool is_trace_alloc() {
return flags_ & RegisterAllocationFlag::kTraceAllocation;
}
@@ -615,7 +603,7 @@ class V8_EXPORT_PRIVATE LiveRange : public NON_EXPORTED_BASE(ZoneObject) {
// Can this live range be spilled at this position.
bool CanBeSpilled(LifetimePosition pos) const;
- // Splitting primitive used by both splitting and splintering members.
+ // Splitting primitive used by splitting members.
// Performs the split, but does not link the resulting ranges.
// The given position must follow the start of the range.
// All uses following the given position will be moved from this
@@ -708,7 +696,7 @@ class V8_EXPORT_PRIVATE LiveRange : public NON_EXPORTED_BASE(ZoneObject) {
using ControlFlowRegisterHint = base::BitField<uint8_t, 22, 6>;
// Bits 28-31 are used by TopLevelLiveRange.
- // Unique among children and splinters of the same virtual register.
+ // Unique among children of the same virtual register.
int relative_id_;
uint32_t bits_;
UseInterval* last_interval_;
@@ -720,8 +708,6 @@ class V8_EXPORT_PRIVATE LiveRange : public NON_EXPORTED_BASE(ZoneObject) {
mutable UseInterval* current_interval_;
// This is used as a cache, it doesn't affect correctness.
mutable UsePosition* last_processed_use_;
- // Cache the last position splintering stopped at.
- mutable UsePosition* splitting_pointer_;
// This is used as a cache in BuildLiveRanges and during register allocation.
UsePosition* current_hint_position_;
LiveRangeBundle* bundle_ = nullptr;
@@ -853,16 +839,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
// Shorten the most recently added interval by setting a new start.
void ShortenTo(LifetimePosition start, bool trace_alloc);
- // Detaches between start and end, and attributes the resulting range to
- // result.
- // The current range is pointed to as "splintered_from". No parent/child
- // relationship is established between this and result.
- void Splinter(LifetimePosition start, LifetimePosition end, Zone* zone);
-
- // Assuming other was splintered from this range, embeds other and its
- // children as part of the children sequence of this range.
- void Merge(TopLevelLiveRange* other, Zone* zone);
-
// Spill range management.
void SetSpillRange(SpillRange* spill_range);
@@ -963,19 +939,12 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
}
}
- TopLevelLiveRange* splintered_from() const { return splintered_from_; }
- bool IsSplinter() const { return splintered_from_ != nullptr; }
bool MayRequireSpillRange() const {
- DCHECK(!IsSplinter());
return !HasSpillOperand() && spill_range_ == nullptr;
}
void UpdateSpillRangePostMerge(TopLevelLiveRange* merged);
int vreg() const { return vreg_; }
-#if DEBUG
- int debug_virt_reg() const;
-#endif
-
void Verify() const;
void VerifyChildrenInOrder() const;
@@ -985,19 +954,13 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
// if you call it with a non-decreasing sequence of positions.
LiveRange* GetChildCovers(LifetimePosition pos);
- int GetNextChildId() {
- return IsSplinter() ? splintered_from()->GetNextChildId()
- : ++last_child_id_;
- }
+ int GetNextChildId() { return ++last_child_id_; }
int GetMaxChildCount() const { return last_child_id_ + 1; }
bool IsSpilledOnlyInDeferredBlocks(
const TopTierRegisterAllocationData* data) const {
- if (data->is_turbo_control_flow_aware_allocation()) {
- return spill_type() == SpillType::kDeferredSpillRange;
- }
- return spilled_in_deferred_blocks_;
+ return spill_type() == SpillType::kDeferredSpillRange;
}
struct SpillMoveInsertionList;
@@ -1007,17 +970,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
DCHECK(!IsSpilledOnlyInDeferredBlocks(data));
return spill_move_insertion_locations_;
}
- TopLevelLiveRange* splinter() const { return splinter_; }
- void SetSplinter(TopLevelLiveRange* splinter) {
- DCHECK_NULL(splinter_);
- DCHECK_NOT_NULL(splinter);
-
- splinter_ = splinter;
- splinter->relative_id_ = GetNextChildId();
- splinter->set_spill_type(spill_type());
- splinter->SetSplinteredFrom(this);
- if (bundle_ != nullptr) splinter->set_bundle(bundle_);
- }
void MarkHasPreassignedSlot() { has_preassigned_slot_ = true; }
bool has_preassigned_slot() const { return has_preassigned_slot_; }
@@ -1056,7 +1008,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
private:
friend class LiveRange;
- void SetSplinteredFrom(TopLevelLiveRange* splinter_parent);
// If spill type is kSpillRange, then this value indicates whether we've
// chosen to spill at the definition or at some later points.
@@ -1076,7 +1027,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
int vreg_;
int last_child_id_;
- TopLevelLiveRange* splintered_from_;
union {
// Correct value determined by spill_type()
InstructionOperand* spill_operand_;
@@ -1096,7 +1046,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
int spill_start_index_;
UsePosition* last_pos_;
LiveRange* last_child_covers_;
- TopLevelLiveRange* splinter_;
DISALLOW_COPY_AND_ASSIGN(TopLevelLiveRange);
};
@@ -1310,11 +1259,8 @@ class LiveRangeBuilder final : public ZoneObject {
spill_mode);
}
SpillMode SpillModeForBlock(const InstructionBlock* block) const {
- if (data()->is_turbo_control_flow_aware_allocation()) {
- return block->IsDeferred() ? SpillMode::kSpillDeferred
- : SpillMode::kSpillAtDefinition;
- }
- return SpillMode::kSpillAtDefinition;
+ return block->IsDeferred() ? SpillMode::kSpillDeferred
+ : SpillMode::kSpillAtDefinition;
}
TopTierRegisterAllocationData* const data_;
ZoneMap<InstructionOperand*, UsePosition*> phi_hints_;
@@ -1529,7 +1475,6 @@ class LinearScanAllocator final : public RegisterAllocator {
Vector<LifetimePosition> free_until_pos);
void ProcessCurrentRange(LiveRange* current, SpillMode spill_mode);
void AllocateBlockedReg(LiveRange* range, SpillMode spill_mode);
- bool TrySplitAndSpillSplinter(LiveRange* range);
// Spill the given life range after position pos.
void SpillAfter(LiveRange* range, LifetimePosition pos, SpillMode spill_mode);
diff --git a/deps/v8/src/compiler/backend/s390/code-generator-s390.cc b/deps/v8/src/compiler/backend/s390/code-generator-s390.cc
index 12b1167d4d..f3ab25630f 100644
--- a/deps/v8/src/compiler/backend/s390/code-generator-s390.cc
+++ b/deps/v8/src/compiler/backend/s390/code-generator-s390.cc
@@ -643,184 +643,184 @@ static inline int AssembleUnaryOp(Instruction* instr, _R _r, _M _m, _I _i) {
__ MovFromFloatResult(i.OutputDoubleRegister()); \
} while (0)
-#define ASSEMBLE_DOUBLE_MAX() \
- do { \
- DoubleRegister left_reg = i.InputDoubleRegister(0); \
- DoubleRegister right_reg = i.InputDoubleRegister(1); \
- DoubleRegister result_reg = i.OutputDoubleRegister(); \
- Label check_nan_left, check_zero, return_left, return_right, done; \
- __ cdbr(left_reg, right_reg); \
- __ bunordered(&check_nan_left, Label::kNear); \
- __ beq(&check_zero); \
- __ bge(&return_left, Label::kNear); \
- __ b(&return_right, Label::kNear); \
- \
- __ bind(&check_zero); \
- __ lzdr(kDoubleRegZero); \
- __ cdbr(left_reg, kDoubleRegZero); \
- /* left == right != 0. */ \
- __ bne(&return_left, Label::kNear); \
- /* At this point, both left and right are either 0 or -0. */ \
- /* N.B. The following works because +0 + -0 == +0 */ \
- /* For max we want logical-and of sign bit: (L + R) */ \
- __ ldr(result_reg, left_reg); \
- __ adbr(result_reg, right_reg); \
- __ b(&done, Label::kNear); \
- \
- __ bind(&check_nan_left); \
- __ cdbr(left_reg, left_reg); \
- /* left == NaN. */ \
- __ bunordered(&return_left, Label::kNear); \
- \
- __ bind(&return_right); \
- if (right_reg != result_reg) { \
- __ ldr(result_reg, right_reg); \
- } \
- __ b(&done, Label::kNear); \
- \
- __ bind(&return_left); \
- if (left_reg != result_reg) { \
- __ ldr(result_reg, left_reg); \
- } \
- __ bind(&done); \
+#define ASSEMBLE_DOUBLE_MAX() \
+ do { \
+ DoubleRegister left_reg = i.InputDoubleRegister(0); \
+ DoubleRegister right_reg = i.InputDoubleRegister(1); \
+ DoubleRegister result_reg = i.OutputDoubleRegister(); \
+ Label check_zero, return_left, return_right, return_nan, done; \
+ __ cdbr(left_reg, right_reg); \
+ __ bunordered(&return_nan, Label::kNear); \
+ __ beq(&check_zero); \
+ __ bge(&return_left, Label::kNear); \
+ __ b(&return_right, Label::kNear); \
+ \
+ __ bind(&check_zero); \
+ __ lzdr(kDoubleRegZero); \
+ __ cdbr(left_reg, kDoubleRegZero); \
+ /* left == right != 0. */ \
+ __ bne(&return_left, Label::kNear); \
+ /* At this point, both left and right are either 0 or -0. */ \
+ /* N.B. The following works because +0 + -0 == +0 */ \
+ /* For max we want logical-and of sign bit: (L + R) */ \
+ __ ldr(result_reg, left_reg); \
+ __ adbr(result_reg, right_reg); \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_nan); \
+ /* If left or right are NaN, adbr propagates the appropriate one.*/ \
+ __ adbr(left_reg, right_reg); \
+ __ b(&return_left, Label::kNear); \
+ \
+ __ bind(&return_right); \
+ if (right_reg != result_reg) { \
+ __ ldr(result_reg, right_reg); \
+ } \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_left); \
+ if (left_reg != result_reg) { \
+ __ ldr(result_reg, left_reg); \
+ } \
+ __ bind(&done); \
} while (0)
-#define ASSEMBLE_DOUBLE_MIN() \
- do { \
- DoubleRegister left_reg = i.InputDoubleRegister(0); \
- DoubleRegister right_reg = i.InputDoubleRegister(1); \
- DoubleRegister result_reg = i.OutputDoubleRegister(); \
- Label check_nan_left, check_zero, return_left, return_right, done; \
- __ cdbr(left_reg, right_reg); \
- __ bunordered(&check_nan_left, Label::kNear); \
- __ beq(&check_zero); \
- __ ble(&return_left, Label::kNear); \
- __ b(&return_right, Label::kNear); \
- \
- __ bind(&check_zero); \
- __ lzdr(kDoubleRegZero); \
- __ cdbr(left_reg, kDoubleRegZero); \
- /* left == right != 0. */ \
- __ bne(&return_left, Label::kNear); \
- /* At this point, both left and right are either 0 or -0. */ \
- /* N.B. The following works because +0 + -0 == +0 */ \
- /* For min we want logical-or of sign bit: -(-L + -R) */ \
- __ lcdbr(left_reg, left_reg); \
- __ ldr(result_reg, left_reg); \
- if (left_reg == right_reg) { \
- __ adbr(result_reg, right_reg); \
- } else { \
- __ sdbr(result_reg, right_reg); \
- } \
- __ lcdbr(result_reg, result_reg); \
- __ b(&done, Label::kNear); \
- \
- __ bind(&check_nan_left); \
- __ cdbr(left_reg, left_reg); \
- /* left == NaN. */ \
- __ bunordered(&return_left, Label::kNear); \
- \
- __ bind(&return_right); \
- if (right_reg != result_reg) { \
- __ ldr(result_reg, right_reg); \
- } \
- __ b(&done, Label::kNear); \
- \
- __ bind(&return_left); \
- if (left_reg != result_reg) { \
- __ ldr(result_reg, left_reg); \
- } \
- __ bind(&done); \
+#define ASSEMBLE_DOUBLE_MIN() \
+ do { \
+ DoubleRegister left_reg = i.InputDoubleRegister(0); \
+ DoubleRegister right_reg = i.InputDoubleRegister(1); \
+ DoubleRegister result_reg = i.OutputDoubleRegister(); \
+ Label check_zero, return_left, return_right, return_nan, done; \
+ __ cdbr(left_reg, right_reg); \
+ __ bunordered(&return_nan, Label::kNear); \
+ __ beq(&check_zero); \
+ __ ble(&return_left, Label::kNear); \
+ __ b(&return_right, Label::kNear); \
+ \
+ __ bind(&check_zero); \
+ __ lzdr(kDoubleRegZero); \
+ __ cdbr(left_reg, kDoubleRegZero); \
+ /* left == right != 0. */ \
+ __ bne(&return_left, Label::kNear); \
+ /* At this point, both left and right are either 0 or -0. */ \
+ /* N.B. The following works because +0 + -0 == +0 */ \
+ /* For min we want logical-or of sign bit: -(-L + -R) */ \
+ __ lcdbr(left_reg, left_reg); \
+ __ ldr(result_reg, left_reg); \
+ if (left_reg == right_reg) { \
+ __ adbr(result_reg, right_reg); \
+ } else { \
+ __ sdbr(result_reg, right_reg); \
+ } \
+ __ lcdbr(result_reg, result_reg); \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_nan); \
+ /* If left or right are NaN, adbr propagates the appropriate one.*/ \
+ __ adbr(left_reg, right_reg); \
+ __ b(&return_left, Label::kNear); \
+ \
+ __ bind(&return_right); \
+ if (right_reg != result_reg) { \
+ __ ldr(result_reg, right_reg); \
+ } \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_left); \
+ if (left_reg != result_reg) { \
+ __ ldr(result_reg, left_reg); \
+ } \
+ __ bind(&done); \
} while (0)
-#define ASSEMBLE_FLOAT_MAX() \
- do { \
- DoubleRegister left_reg = i.InputDoubleRegister(0); \
- DoubleRegister right_reg = i.InputDoubleRegister(1); \
- DoubleRegister result_reg = i.OutputDoubleRegister(); \
- Label check_nan_left, check_zero, return_left, return_right, done; \
- __ cebr(left_reg, right_reg); \
- __ bunordered(&check_nan_left, Label::kNear); \
- __ beq(&check_zero); \
- __ bge(&return_left, Label::kNear); \
- __ b(&return_right, Label::kNear); \
- \
- __ bind(&check_zero); \
- __ lzdr(kDoubleRegZero); \
- __ cebr(left_reg, kDoubleRegZero); \
- /* left == right != 0. */ \
- __ bne(&return_left, Label::kNear); \
- /* At this point, both left and right are either 0 or -0. */ \
- /* N.B. The following works because +0 + -0 == +0 */ \
- /* For max we want logical-and of sign bit: (L + R) */ \
- __ ldr(result_reg, left_reg); \
- __ aebr(result_reg, right_reg); \
- __ b(&done, Label::kNear); \
- \
- __ bind(&check_nan_left); \
- __ cebr(left_reg, left_reg); \
- /* left == NaN. */ \
- __ bunordered(&return_left, Label::kNear); \
- \
- __ bind(&return_right); \
- if (right_reg != result_reg) { \
- __ ldr(result_reg, right_reg); \
- } \
- __ b(&done, Label::kNear); \
- \
- __ bind(&return_left); \
- if (left_reg != result_reg) { \
- __ ldr(result_reg, left_reg); \
- } \
- __ bind(&done); \
+#define ASSEMBLE_FLOAT_MAX() \
+ do { \
+ DoubleRegister left_reg = i.InputDoubleRegister(0); \
+ DoubleRegister right_reg = i.InputDoubleRegister(1); \
+ DoubleRegister result_reg = i.OutputDoubleRegister(); \
+ Label check_zero, return_left, return_right, return_nan, done; \
+ __ cebr(left_reg, right_reg); \
+ __ bunordered(&return_nan, Label::kNear); \
+ __ beq(&check_zero); \
+ __ bge(&return_left, Label::kNear); \
+ __ b(&return_right, Label::kNear); \
+ \
+ __ bind(&check_zero); \
+ __ lzdr(kDoubleRegZero); \
+ __ cebr(left_reg, kDoubleRegZero); \
+ /* left == right != 0. */ \
+ __ bne(&return_left, Label::kNear); \
+ /* At this point, both left and right are either 0 or -0. */ \
+ /* N.B. The following works because +0 + -0 == +0 */ \
+ /* For max we want logical-and of sign bit: (L + R) */ \
+ __ ldr(result_reg, left_reg); \
+ __ aebr(result_reg, right_reg); \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_nan); \
+ /* If left or right are NaN, aebr propagates the appropriate one.*/ \
+ __ aebr(left_reg, right_reg); \
+ __ b(&return_left, Label::kNear); \
+ \
+ __ bind(&return_right); \
+ if (right_reg != result_reg) { \
+ __ ldr(result_reg, right_reg); \
+ } \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_left); \
+ if (left_reg != result_reg) { \
+ __ ldr(result_reg, left_reg); \
+ } \
+ __ bind(&done); \
} while (0)
-#define ASSEMBLE_FLOAT_MIN() \
- do { \
- DoubleRegister left_reg = i.InputDoubleRegister(0); \
- DoubleRegister right_reg = i.InputDoubleRegister(1); \
- DoubleRegister result_reg = i.OutputDoubleRegister(); \
- Label check_nan_left, check_zero, return_left, return_right, done; \
- __ cebr(left_reg, right_reg); \
- __ bunordered(&check_nan_left, Label::kNear); \
- __ beq(&check_zero); \
- __ ble(&return_left, Label::kNear); \
- __ b(&return_right, Label::kNear); \
- \
- __ bind(&check_zero); \
- __ lzdr(kDoubleRegZero); \
- __ cebr(left_reg, kDoubleRegZero); \
- /* left == right != 0. */ \
- __ bne(&return_left, Label::kNear); \
- /* At this point, both left and right are either 0 or -0. */ \
- /* N.B. The following works because +0 + -0 == +0 */ \
- /* For min we want logical-or of sign bit: -(-L + -R) */ \
- __ lcebr(left_reg, left_reg); \
- __ ldr(result_reg, left_reg); \
- if (left_reg == right_reg) { \
- __ aebr(result_reg, right_reg); \
- } else { \
- __ sebr(result_reg, right_reg); \
- } \
- __ lcebr(result_reg, result_reg); \
- __ b(&done, Label::kNear); \
- \
- __ bind(&check_nan_left); \
- __ cebr(left_reg, left_reg); \
- /* left == NaN. */ \
- __ bunordered(&return_left, Label::kNear); \
- \
- __ bind(&return_right); \
- if (right_reg != result_reg) { \
- __ ldr(result_reg, right_reg); \
- } \
- __ b(&done, Label::kNear); \
- \
- __ bind(&return_left); \
- if (left_reg != result_reg) { \
- __ ldr(result_reg, left_reg); \
- } \
- __ bind(&done); \
+#define ASSEMBLE_FLOAT_MIN() \
+ do { \
+ DoubleRegister left_reg = i.InputDoubleRegister(0); \
+ DoubleRegister right_reg = i.InputDoubleRegister(1); \
+ DoubleRegister result_reg = i.OutputDoubleRegister(); \
+ Label check_zero, return_left, return_right, return_nan, done; \
+ __ cebr(left_reg, right_reg); \
+ __ bunordered(&return_nan, Label::kNear); \
+ __ beq(&check_zero); \
+ __ ble(&return_left, Label::kNear); \
+ __ b(&return_right, Label::kNear); \
+ \
+ __ bind(&check_zero); \
+ __ lzdr(kDoubleRegZero); \
+ __ cebr(left_reg, kDoubleRegZero); \
+ /* left == right != 0. */ \
+ __ bne(&return_left, Label::kNear); \
+ /* At this point, both left and right are either 0 or -0. */ \
+ /* N.B. The following works because +0 + -0 == +0 */ \
+ /* For min we want logical-or of sign bit: -(-L + -R) */ \
+ __ lcebr(left_reg, left_reg); \
+ __ ldr(result_reg, left_reg); \
+ if (left_reg == right_reg) { \
+ __ aebr(result_reg, right_reg); \
+ } else { \
+ __ sebr(result_reg, right_reg); \
+ } \
+ __ lcebr(result_reg, result_reg); \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_nan); \
+ /* If left or right are NaN, aebr propagates the appropriate one.*/ \
+ __ aebr(left_reg, right_reg); \
+ __ b(&return_left, Label::kNear); \
+ \
+ __ bind(&return_right); \
+ if (right_reg != result_reg) { \
+ __ ldr(result_reg, right_reg); \
+ } \
+ __ b(&done, Label::kNear); \
+ \
+ __ bind(&return_left); \
+ if (left_reg != result_reg) { \
+ __ ldr(result_reg, left_reg); \
+ } \
+ __ bind(&done); \
} while (0)
//
// Only MRI mode for these instructions available
@@ -2581,7 +2581,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kS390_LoadReverseSimd128: {
AddressingMode mode = kMode_None;
MemOperand operand = i.MemoryOperand(&mode);
- if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2)) {
+ if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2) &&
+ is_uint12(operand.offset())) {
__ vlbr(i.OutputSimd128Register(), operand, Condition(4));
} else {
__ lrvg(r0, operand);
@@ -2643,7 +2644,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
size_t index = 0;
AddressingMode mode = kMode_None;
MemOperand operand = i.MemoryOperand(&mode, &index);
- if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2)) {
+ if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2) &&
+ is_uint12(operand.offset())) {
__ vstbr(i.InputSimd128Register(index), operand, Condition(4));
} else {
__ vlgv(r0, i.InputSimd128Register(index), MemOperand(r0, 1),
@@ -3280,8 +3282,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Register scratch_0 = r0;
Register scratch_1 = r1;
for (int i = 0; i < 2; i++) {
- __ vlgv(scratch_0, src0, MemOperand(r0, 0), Condition(3));
- __ vlgv(scratch_1, src1, MemOperand(r0, 0), Condition(3));
+ __ vlgv(scratch_0, src0, MemOperand(r0, i), Condition(3));
+ __ vlgv(scratch_1, src1, MemOperand(r0, i), Condition(3));
__ Mul64(scratch_0, scratch_1);
scratch_0 = r1;
scratch_1 = ip;
@@ -4176,7 +4178,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
}
#undef BINOP_EXTRACT
- case kS390_S8x16Shuffle: {
+ case kS390_I8x16Shuffle: {
Simd128Register dst = i.OutputSimd128Register(),
src0 = i.InputSimd128Register(0),
src1 = i.InputSimd128Register(1);
@@ -4196,7 +4198,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ vperm(dst, src0, src1, kScratchDoubleReg, Condition(0), Condition(0));
break;
}
- case kS390_S8x16Swizzle: {
+ case kS390_I8x16Swizzle: {
Simd128Register dst = i.OutputSimd128Register(),
src0 = i.InputSimd128Register(0),
src1 = i.InputSimd128Register(1);
@@ -4579,9 +4581,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue(ip);
- if (call_descriptor->PushArgumentCount()) {
- __ Push(kJavaScriptCallArgCountRegister);
- }
} else {
StackFrame::Type type = info()->GetOutputStackFrameType();
// TODO(mbrandy): Detect cases where ip is the entrypoint (for
diff --git a/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h b/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h
index 693b555ae7..ab7973c089 100644
--- a/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h
+++ b/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h
@@ -365,8 +365,8 @@ namespace compiler {
V(S390_I8x16RoundingAverageU) \
V(S390_I8x16Abs) \
V(S390_I8x16BitMask) \
- V(S390_S8x16Shuffle) \
- V(S390_S8x16Swizzle) \
+ V(S390_I8x16Shuffle) \
+ V(S390_I8x16Swizzle) \
V(S390_V64x2AnyTrue) \
V(S390_V32x4AnyTrue) \
V(S390_V16x8AnyTrue) \
diff --git a/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc b/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc
index 1117ec5141..c0a854b7f1 100644
--- a/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc
+++ b/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc
@@ -311,8 +311,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kS390_I8x16RoundingAverageU:
case kS390_I8x16Abs:
case kS390_I8x16BitMask:
- case kS390_S8x16Shuffle:
- case kS390_S8x16Swizzle:
+ case kS390_I8x16Shuffle:
+ case kS390_I8x16Swizzle:
case kS390_V64x2AnyTrue:
case kS390_V32x4AnyTrue:
case kS390_V16x8AnyTrue:
diff --git a/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc b/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc
index bb74050dcf..ee3e996169 100644
--- a/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc
+++ b/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc
@@ -2201,6 +2201,10 @@ void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
VisitFloat64Compare(this, node, &cont);
}
+bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) {
+ UNIMPLEMENTED();
+}
+
void InstructionSelector::EmitPrepareArguments(
ZoneVector<PushParameter>* arguments, const CallDescriptor* call_descriptor,
Node* node) {
@@ -2820,7 +2824,7 @@ SIMD_VISIT_PMIN_MAX(F32x4Pmax)
#undef SIMD_VISIT_PMIN_MAX
#undef SIMD_TYPES
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
uint8_t* shuffle_p = &shuffle[0];
bool is_swizzle;
@@ -2841,7 +2845,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
}
shuffle_p = &shuffle_remapped[0];
#endif
- Emit(kS390_S8x16Shuffle, g.DefineAsRegister(node),
+ Emit(kS390_I8x16Shuffle, g.DefineAsRegister(node),
g.UseUniqueRegister(input0), g.UseUniqueRegister(input1),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_p)),
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_p + 4)),
@@ -2849,9 +2853,9 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_p + 12)));
}
-void InstructionSelector::VisitS8x16Swizzle(Node* node) {
+void InstructionSelector::VisitI8x16Swizzle(Node* node) {
S390OperandGenerator g(this);
- Emit(kS390_S8x16Swizzle, g.DefineAsRegister(node),
+ Emit(kS390_I8x16Swizzle, g.DefineAsRegister(node),
g.UseUniqueRegister(node->InputAt(0)),
g.UseUniqueRegister(node->InputAt(1)));
}
diff --git a/deps/v8/src/compiler/backend/x64/code-generator-x64.cc b/deps/v8/src/compiler/backend/x64/code-generator-x64.cc
index b84df81925..e0cf602b11 100644
--- a/deps/v8/src/compiler/backend/x64/code-generator-x64.cc
+++ b/deps/v8/src/compiler/backend/x64/code-generator-x64.cc
@@ -194,94 +194,6 @@ class OutOfLineLoadFloat64NaN final : public OutOfLineCode {
XMMRegister const result_;
};
-class OutOfLineF32x4Min final : public OutOfLineCode {
- public:
- OutOfLineF32x4Min(CodeGenerator* gen, XMMRegister result, XMMRegister error)
- : OutOfLineCode(gen), result_(result), error_(error) {}
-
- void Generate() final {
- // |result| is the partial result, |kScratchDoubleReg| is the error.
- // propagate -0's and NaNs (possibly non-canonical) from the error.
- __ Orps(error_, result_);
- // Canonicalize NaNs by quieting and clearing the payload.
- __ Cmpps(result_, error_, int8_t{3});
- __ Orps(error_, result_);
- __ Psrld(result_, byte{10});
- __ Andnps(result_, error_);
- }
-
- private:
- XMMRegister const result_;
- XMMRegister const error_;
-};
-
-class OutOfLineF64x2Min final : public OutOfLineCode {
- public:
- OutOfLineF64x2Min(CodeGenerator* gen, XMMRegister result, XMMRegister error)
- : OutOfLineCode(gen), result_(result), error_(error) {}
-
- void Generate() final {
- // |result| is the partial result, |kScratchDoubleReg| is the error.
- // propagate -0's and NaNs (possibly non-canonical) from the error.
- __ Orpd(error_, result_);
- // Canonicalize NaNs by quieting and clearing the payload.
- __ Cmppd(result_, error_, int8_t{3});
- __ Orpd(error_, result_);
- __ Psrlq(result_, 13);
- __ Andnpd(result_, error_);
- }
-
- private:
- XMMRegister const result_;
- XMMRegister const error_;
-};
-
-class OutOfLineF32x4Max final : public OutOfLineCode {
- public:
- OutOfLineF32x4Max(CodeGenerator* gen, XMMRegister result, XMMRegister error)
- : OutOfLineCode(gen), result_(result), error_(error) {}
-
- void Generate() final {
- // |result| is the partial result, |kScratchDoubleReg| is the error.
- // Propagate NaNs (possibly non-canonical).
- __ Orps(result_, error_);
- // Propagate sign errors and (subtle) quiet NaNs.
- __ Subps(result_, error_);
- // Canonicalize NaNs by clearing the payload. Sign is non-deterministic.
- __ Cmpps(error_, result_, int8_t{3});
- __ Psrld(error_, byte{10});
- __ Andnps(error_, result_);
- __ Movaps(result_, error_);
- }
-
- private:
- XMMRegister const result_;
- XMMRegister const error_;
-};
-
-class OutOfLineF64x2Max final : public OutOfLineCode {
- public:
- OutOfLineF64x2Max(CodeGenerator* gen, XMMRegister result, XMMRegister error)
- : OutOfLineCode(gen), result_(result), error_(error) {}
-
- void Generate() final {
- // |result| is the partial result, |kScratchDoubleReg| is the error.
- // Propagate NaNs (possibly non-canonical).
- __ Orpd(result_, error_);
- // Propagate sign errors and (subtle) quiet NaNs.
- __ Subpd(result_, error_);
- // Canonicalize NaNs by clearing the payload. Sign is non-deterministic.
- __ Cmppd(error_, result_, int8_t{3});
- __ Psrlq(error_, byte{13});
- __ Andnpd(error_, result_);
- __ Movapd(result_, error_);
- }
-
- private:
- XMMRegister const result_;
- XMMRegister const error_;
-};
-
class OutOfLineTruncateDoubleToI final : public OutOfLineCode {
public:
OutOfLineTruncateDoubleToI(CodeGenerator* gen, Register result,
@@ -745,13 +657,33 @@ void CodeGenerator::AssemblePopArgumentsAdaptorFrame(Register args_reg,
namespace {
-void AdjustStackPointerForTailCall(TurboAssembler* assembler,
+void AdjustStackPointerForTailCall(Instruction* instr,
+ TurboAssembler* assembler, Linkage* linkage,
+ OptimizedCompilationInfo* info,
FrameAccessState* state,
int new_slot_above_sp,
bool allow_shrinkage = true) {
- int current_sp_offset = state->GetSPToFPSlotCount() +
- StandardFrameConstants::kFixedSlotCountAboveFp;
- int stack_slot_delta = new_slot_above_sp - current_sp_offset;
+ int stack_slot_delta;
+ if (HasCallDescriptorFlag(instr, CallDescriptor::kIsTailCallForTierUp)) {
+ // For this special tail-call mode, the callee has the same arguments and
+ // linkage as the caller, and arguments adapter frames must be preserved.
+ // Thus we simply have reset the stack pointer register to its original
+ // value before frame construction.
+ // See also: AssembleConstructFrame.
+ DCHECK(!info->is_osr());
+ DCHECK_EQ(linkage->GetIncomingDescriptor()->CalleeSavedRegisters(), 0);
+ DCHECK_EQ(linkage->GetIncomingDescriptor()->CalleeSavedFPRegisters(), 0);
+ DCHECK_EQ(state->frame()->GetReturnSlotCount(), 0);
+ stack_slot_delta = (state->frame()->GetTotalFrameSlotCount() -
+ kReturnAddressStackSlotCount) *
+ -1;
+ DCHECK_LE(stack_slot_delta, 0);
+ } else {
+ int current_sp_offset = state->GetSPToFPSlotCount() +
+ StandardFrameConstants::kFixedSlotCountAboveFp;
+ stack_slot_delta = new_slot_above_sp - current_sp_offset;
+ }
+
if (stack_slot_delta > 0) {
assembler->AllocateStackSpace(stack_slot_delta * kSystemPointerSize);
state->IncreaseSPDelta(stack_slot_delta);
@@ -778,12 +710,14 @@ void CodeGenerator::AssembleTailCallBeforeGap(Instruction* instr,
if (!pushes.empty() &&
(LocationOperand::cast(pushes.back()->destination()).index() + 1 ==
first_unused_stack_slot)) {
+ DCHECK(!HasCallDescriptorFlag(instr, CallDescriptor::kIsTailCallForTierUp));
X64OperandConverter g(this, instr);
for (auto move : pushes) {
LocationOperand destination_location(
LocationOperand::cast(move->destination()));
InstructionOperand source(move->source());
- AdjustStackPointerForTailCall(tasm(), frame_access_state(),
+ AdjustStackPointerForTailCall(instr, tasm(), linkage(), info(),
+ frame_access_state(),
destination_location.index());
if (source.IsStackSlot()) {
LocationOperand source_location(LocationOperand::cast(source));
@@ -801,14 +735,15 @@ void CodeGenerator::AssembleTailCallBeforeGap(Instruction* instr,
move->Eliminate();
}
}
- AdjustStackPointerForTailCall(tasm(), frame_access_state(),
- first_unused_stack_slot, false);
+ AdjustStackPointerForTailCall(instr, tasm(), linkage(), info(),
+ frame_access_state(), first_unused_stack_slot,
+ false);
}
void CodeGenerator::AssembleTailCallAfterGap(Instruction* instr,
int first_unused_stack_slot) {
- AdjustStackPointerForTailCall(tasm(), frame_access_state(),
- first_unused_stack_slot);
+ AdjustStackPointerForTailCall(instr, tasm(), linkage(), info(),
+ frame_access_state(), first_unused_stack_slot);
}
// Check that {kJavaScriptCallCodeStartRegister} is correct.
@@ -912,12 +847,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
}
case kArchTailCallCodeObjectFromJSFunction:
- case kArchTailCallCodeObject: {
- if (arch_opcode == kArchTailCallCodeObjectFromJSFunction) {
+ if (!HasCallDescriptorFlag(instr, CallDescriptor::kIsTailCallForTierUp)) {
AssemblePopArgumentsAdaptorFrame(kJavaScriptCallArgCountRegister,
i.TempRegister(0), i.TempRegister(1),
i.TempRegister(2));
}
+ V8_FALLTHROUGH;
+ case kArchTailCallCodeObject: {
if (HasImmediateInput(instr, 0)) {
Handle<Code> code = i.InputCode(0);
__ Jump(code, RelocInfo::CODE_TARGET);
@@ -2348,6 +2284,16 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
int slot = MiscField::decode(instr->opcode());
if (HasImmediateInput(instr, 0)) {
__ movq(Operand(rsp, slot * kSystemPointerSize), i.InputImmediate(0));
+ } else if (instr->InputAt(0)->IsFPRegister()) {
+ LocationOperand* op = LocationOperand::cast(instr->InputAt(0));
+ if (op->representation() == MachineRepresentation::kFloat64) {
+ __ Movsd(Operand(rsp, slot * kSystemPointerSize),
+ i.InputDoubleRegister(0));
+ } else {
+ DCHECK_EQ(MachineRepresentation::kFloat32, op->representation());
+ __ Movss(Operand(rsp, slot * kSystemPointerSize),
+ i.InputFloatRegister(0));
+ }
} else {
__ movq(Operand(rsp, slot * kSystemPointerSize), i.InputRegister(0));
}
@@ -2419,18 +2365,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
XMMRegister src1 = i.InputSimd128Register(1),
dst = i.OutputSimd128Register();
DCHECK_EQ(dst, i.InputSimd128Register(0));
- // The minpd instruction doesn't propagate NaNs and -0's in its first
- // operand. Perform minpd in both orders and compare results. Handle the
- // unlikely case of discrepancies out of line.
+ // The minpd instruction doesn't propagate NaNs and +0's in its first
+ // operand. Perform minpd in both orders, merge the resuls, and adjust.
__ Movapd(kScratchDoubleReg, src1);
__ Minpd(kScratchDoubleReg, dst);
__ Minpd(dst, src1);
- // Most likely there is no difference and we're done.
- __ Xorpd(kScratchDoubleReg, dst);
- __ Ptest(kScratchDoubleReg, kScratchDoubleReg);
- auto ool = zone()->New<OutOfLineF64x2Min>(this, dst, kScratchDoubleReg);
- __ j(not_zero, ool->entry());
- __ bind(ool->exit());
+ // propagate -0's and NaNs, which may be non-canonical.
+ __ Orpd(kScratchDoubleReg, dst);
+ // Canonicalize NaNs by quieting and clearing the payload.
+ __ Cmppd(dst, kScratchDoubleReg, int8_t{3});
+ __ Orpd(kScratchDoubleReg, dst);
+ __ Psrlq(dst, 13);
+ __ Andnpd(dst, kScratchDoubleReg);
break;
}
case kX64F64x2Max: {
@@ -2438,17 +2384,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
dst = i.OutputSimd128Register();
DCHECK_EQ(dst, i.InputSimd128Register(0));
// The maxpd instruction doesn't propagate NaNs and +0's in its first
- // operand. Perform maxpd in both orders and compare results. Handle the
- // unlikely case of discrepancies out of line.
+ // operand. Perform maxpd in both orders, merge the resuls, and adjust.
__ Movapd(kScratchDoubleReg, src1);
__ Maxpd(kScratchDoubleReg, dst);
__ Maxpd(dst, src1);
- // Most likely there is no difference and we're done.
- __ Xorpd(kScratchDoubleReg, dst);
- __ Ptest(kScratchDoubleReg, kScratchDoubleReg);
- auto ool = zone()->New<OutOfLineF64x2Max>(this, dst, kScratchDoubleReg);
- __ j(not_zero, ool->entry());
- __ bind(ool->exit());
+ // Find discrepancies.
+ __ Xorpd(dst, kScratchDoubleReg);
+ // Propagate NaNs, which may be non-canonical.
+ __ Orpd(kScratchDoubleReg, dst);
+ // Propagate sign discrepancy and (subtle) quiet NaNs.
+ __ Subpd(kScratchDoubleReg, dst);
+ // Canonicalize NaNs by clearing the payload. Sign is non-deterministic.
+ __ Cmppd(dst, kScratchDoubleReg, int8_t{3});
+ __ Psrlq(dst, 13);
+ __ Andnpd(dst, kScratchDoubleReg);
break;
}
case kX64F64x2Eq: {
@@ -2612,18 +2561,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
XMMRegister src1 = i.InputSimd128Register(1),
dst = i.OutputSimd128Register();
DCHECK_EQ(dst, i.InputSimd128Register(0));
- // The minps instruction doesn't propagate NaNs and -0's in its first
- // operand. Perform minps in both orders and compare results. Handle the
- // unlikely case of discrepancies out of line.
+ // The minps instruction doesn't propagate NaNs and +0's in its first
+ // operand. Perform minps in both orders, merge the resuls, and adjust.
__ Movaps(kScratchDoubleReg, src1);
__ Minps(kScratchDoubleReg, dst);
__ Minps(dst, src1);
- // Most likely there is no difference and we're done.
- __ Xorps(kScratchDoubleReg, dst);
- __ Ptest(kScratchDoubleReg, kScratchDoubleReg);
- auto ool = zone()->New<OutOfLineF32x4Min>(this, dst, kScratchDoubleReg);
- __ j(not_zero, ool->entry());
- __ bind(ool->exit());
+ // propagate -0's and NaNs, which may be non-canonical.
+ __ Orps(kScratchDoubleReg, dst);
+ // Canonicalize NaNs by quieting and clearing the payload.
+ __ Cmpps(dst, kScratchDoubleReg, int8_t{3});
+ __ Orps(kScratchDoubleReg, dst);
+ __ Psrld(dst, byte{10});
+ __ Andnps(dst, kScratchDoubleReg);
break;
}
case kX64F32x4Max: {
@@ -2631,17 +2580,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
dst = i.OutputSimd128Register();
DCHECK_EQ(dst, i.InputSimd128Register(0));
// The maxps instruction doesn't propagate NaNs and +0's in its first
- // operand. Perform maxps in both orders and compare results. Handle the
- // unlikely case of discrepancies out of line.
+ // operand. Perform maxps in both orders, merge the resuls, and adjust.
__ Movaps(kScratchDoubleReg, src1);
__ Maxps(kScratchDoubleReg, dst);
__ Maxps(dst, src1);
- // Most likely there is no difference and we're done.
- __ Xorps(kScratchDoubleReg, dst);
- __ Ptest(kScratchDoubleReg, kScratchDoubleReg);
- auto ool = zone()->New<OutOfLineF32x4Max>(this, dst, kScratchDoubleReg);
- __ j(not_zero, ool->entry());
- __ bind(ool->exit());
+ // Find discrepancies.
+ __ Xorps(dst, kScratchDoubleReg);
+ // Propagate NaNs, which may be non-canonical.
+ __ Orps(kScratchDoubleReg, dst);
+ // Propagate sign discrepancy and (subtle) quiet NaNs.
+ __ Subps(kScratchDoubleReg, dst);
+ // Canonicalize NaNs by clearing the payload. Sign is non-deterministic.
+ __ Cmpps(dst, kScratchDoubleReg, int8_t{3});
+ __ Psrld(dst, byte{10});
+ __ Andnps(dst, kScratchDoubleReg);
break;
}
case kX64F32x4Eq: {
@@ -3724,7 +3676,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Andnps(dst, i.InputSimd128Register(1));
break;
}
- case kX64S8x16Swizzle: {
+ case kX64I8x16Swizzle: {
DCHECK_EQ(i.OutputSimd128Register(), i.InputSimd128Register(0));
XMMRegister dst = i.OutputSimd128Register();
XMMRegister mask = i.TempSimd128Register(0);
@@ -3737,7 +3689,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Pshufb(dst, mask);
break;
}
- case kX64S8x16Shuffle: {
+ case kX64I8x16Shuffle: {
XMMRegister dst = i.OutputSimd128Register();
XMMRegister tmp_simd = i.TempSimd128Register(0);
if (instr->InputCount() == 5) { // only one input operand
@@ -4454,7 +4406,7 @@ static const int kQuadWordSize = 16;
} // namespace
void CodeGenerator::FinishFrame(Frame* frame) {
- auto call_descriptor = linkage()->GetIncomingDescriptor();
+ CallDescriptor* call_descriptor = linkage()->GetIncomingDescriptor();
const RegList saves_fp = call_descriptor->CalleeSavedFPRegisters();
if (saves_fp != 0) {
@@ -4492,9 +4444,6 @@ void CodeGenerator::AssembleConstructFrame() {
}
} else if (call_descriptor->IsJSFunctionCall()) {
__ Prologue();
- if (call_descriptor->PushArgumentCount()) {
- __ pushq(kJavaScriptCallArgCountRegister);
- }
} else {
__ StubPrologue(info()->GetOutputStackFrameType());
if (call_descriptor->IsWasmFunctionCall()) {
@@ -4610,7 +4559,7 @@ void CodeGenerator::AssembleConstructFrame() {
}
}
-void CodeGenerator::AssembleReturn(InstructionOperand* pop) {
+void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
auto call_descriptor = linkage()->GetIncomingDescriptor();
// Restore registers.
@@ -4643,39 +4592,91 @@ void CodeGenerator::AssembleReturn(InstructionOperand* pop) {
unwinding_info_writer_.MarkBlockWillExit();
- // Might need rcx for scratch if pop_size is too big or if there is a variable
- // pop count.
+ // We might need rcx and rdx for scratch.
DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & rcx.bit());
DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & rdx.bit());
- size_t pop_size = call_descriptor->StackParameterCount() * kSystemPointerSize;
+ int parameter_count =
+ static_cast<int>(call_descriptor->StackParameterCount());
X64OperandConverter g(this, nullptr);
+ Register pop_reg = additional_pop_count->IsImmediate()
+ ? rcx
+ : g.ToRegister(additional_pop_count);
+ Register scratch_reg = pop_reg == rcx ? rdx : rcx;
+ Register argc_reg =
+ additional_pop_count->IsImmediate() ? pop_reg : scratch_reg;
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ // Functions with JS linkage have at least one parameter (the receiver).
+ // If {parameter_count} == 0, it means it is a builtin with
+ // kDontAdaptArgumentsSentinel, which takes care of JS arguments popping
+ // itself.
+ const bool drop_jsargs = frame_access_state()->has_frame() &&
+ call_descriptor->IsJSFunctionCall() &&
+ parameter_count != 0;
+#else
+ const bool drop_jsargs = false;
+#endif
if (call_descriptor->IsCFunctionCall()) {
AssembleDeconstructFrame();
} else if (frame_access_state()->has_frame()) {
- if (pop->IsImmediate() && g.ToConstant(pop).ToInt32() == 0) {
+ if (additional_pop_count->IsImmediate() &&
+ g.ToConstant(additional_pop_count).ToInt32() == 0) {
// Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) {
__ jmp(&return_label_);
return;
} else {
__ bind(&return_label_);
- AssembleDeconstructFrame();
}
- } else {
- AssembleDeconstructFrame();
}
+ if (drop_jsargs) {
+ // Get the actual argument count.
+ __ movq(argc_reg, Operand(rbp, StandardFrameConstants::kArgCOffset));
+ }
+ AssembleDeconstructFrame();
}
- if (pop->IsImmediate()) {
- pop_size += g.ToConstant(pop).ToInt32() * kSystemPointerSize;
- CHECK_LT(pop_size, static_cast<size_t>(std::numeric_limits<int>::max()));
- __ Ret(static_cast<int>(pop_size), rcx);
+ if (drop_jsargs) {
+ // In addition to the slots given by {additional_pop_count}, we must pop all
+ // arguments from the stack (including the receiver). This number of
+ // arguments is given by max(1 + argc_reg, parameter_count).
+ Label argc_reg_has_final_count;
+ // Exclude the receiver to simplify the computation. We'll account for it at
+ // the end.
+ int parameter_count_withouth_receiver = parameter_count - 1;
+ if (parameter_count_withouth_receiver != 0) {
+ __ cmpq(argc_reg, Immediate(parameter_count_withouth_receiver));
+ __ j(greater_equal, &argc_reg_has_final_count, Label::kNear);
+ __ movq(argc_reg, Immediate(parameter_count_withouth_receiver));
+ __ bind(&argc_reg_has_final_count);
+ }
+ // Add additional pop count.
+ if (additional_pop_count->IsImmediate()) {
+ DCHECK_EQ(pop_reg, argc_reg);
+ int additional_count = g.ToConstant(additional_pop_count).ToInt32();
+ if (additional_count != 0) {
+ __ addq(pop_reg, Immediate(additional_count));
+ }
+ } else {
+ __ addq(pop_reg, argc_reg);
+ }
+ __ PopReturnAddressTo(scratch_reg);
+ __ leaq(rsp, Operand(rsp, pop_reg, times_system_pointer_size,
+ kSystemPointerSize)); // Also pop the receiver.
+ // We use a return instead of a jump for better return address prediction.
+ __ PushReturnAddressFrom(scratch_reg);
+ __ Ret();
+ } else if (additional_pop_count->IsImmediate()) {
+ int additional_count = g.ToConstant(additional_pop_count).ToInt32();
+ size_t pop_size = (parameter_count + additional_count) * kSystemPointerSize;
+ CHECK_LE(pop_size, static_cast<size_t>(std::numeric_limits<int>::max()));
+ __ Ret(static_cast<int>(pop_size), scratch_reg);
} else {
- Register pop_reg = g.ToRegister(pop);
- Register scratch_reg = pop_reg == rcx ? rdx : rcx;
- __ popq(scratch_reg);
- __ leaq(rsp, Operand(rsp, pop_reg, times_8, static_cast<int>(pop_size)));
- __ jmp(scratch_reg);
+ int pop_size = static_cast<int>(parameter_count * kSystemPointerSize);
+ __ PopReturnAddressTo(scratch_reg);
+ __ leaq(rsp, Operand(rsp, pop_reg, times_system_pointer_size,
+ static_cast<int>(pop_size)));
+ __ PushReturnAddressFrom(scratch_reg);
+ __ Ret();
}
}
@@ -4923,15 +4924,10 @@ void CodeGenerator::AssembleSwap(InstructionOperand* source,
case MoveType::kRegisterToStack: {
if (source->IsRegister()) {
Register src = g.ToRegister(source);
- __ pushq(src);
- frame_access_state()->IncreaseSPDelta(1);
- unwinding_info_writer_.MaybeIncreaseBaseOffsetAt(__ pc_offset(),
- kSystemPointerSize);
- __ movq(src, g.ToOperand(destination));
- frame_access_state()->IncreaseSPDelta(-1);
- __ popq(g.ToOperand(destination));
- unwinding_info_writer_.MaybeIncreaseBaseOffsetAt(__ pc_offset(),
- -kSystemPointerSize);
+ Operand dst = g.ToOperand(destination);
+ __ movq(kScratchRegister, src);
+ __ movq(src, dst);
+ __ movq(dst, kScratchRegister);
} else {
DCHECK(source->IsFPRegister());
XMMRegister src = g.ToDoubleRegister(source);
diff --git a/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h b/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h
index 21f718b315..7312121a0a 100644
--- a/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h
+++ b/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h
@@ -325,8 +325,8 @@ namespace compiler {
V(X64S128Xor) \
V(X64S128Select) \
V(X64S128AndNot) \
- V(X64S8x16Swizzle) \
- V(X64S8x16Shuffle) \
+ V(X64I8x16Swizzle) \
+ V(X64I8x16Shuffle) \
V(X64S8x16LoadSplat) \
V(X64S16x8LoadSplat) \
V(X64S32x4LoadSplat) \
diff --git a/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc
index 56ca9f1dc1..169753b40e 100644
--- a/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc
+++ b/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc
@@ -303,8 +303,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kX64V32x4AllTrue:
case kX64V16x8AnyTrue:
case kX64V16x8AllTrue:
- case kX64S8x16Swizzle:
- case kX64S8x16Shuffle:
+ case kX64I8x16Swizzle:
+ case kX64I8x16Shuffle:
case kX64S32x4Swizzle:
case kX64S32x4Shuffle:
case kX64S16x8Blend:
diff --git a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
index 7df4fcbebd..db212677ea 100644
--- a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
+++ b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
@@ -1297,9 +1297,9 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
}
}
-namespace {
-
-bool ZeroExtendsWord32ToWord64(Node* node) {
+bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) {
+ X64OperandGenerator g(this);
+ DCHECK_NE(node->opcode(), IrOpcode::kPhi);
switch (node->opcode()) {
case IrOpcode::kWord32And:
case IrOpcode::kWord32Or:
@@ -1353,13 +1353,20 @@ bool ZeroExtendsWord32ToWord64(Node* node) {
return false;
}
}
+ case IrOpcode::kInt32Constant:
+ case IrOpcode::kInt64Constant:
+ // Constants are loaded with movl or movq, or xorl for zero; see
+ // CodeGenerator::AssembleMove. So any non-negative constant that fits
+ // in a 32-bit signed integer is zero-extended to 64 bits.
+ if (g.CanBeImmediate(node)) {
+ return g.GetImmediateIntegerValue(node) >= 0;
+ }
+ return false;
default:
return false;
}
}
-} // namespace
-
void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
X64OperandGenerator g(this);
Node* value = node->InputAt(0);
@@ -2271,7 +2278,12 @@ void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) {
value_operand, g.TempImmediate(-sw.min_value()));
} else {
// Zero extend, because we use it as 64-bit index into the jump table.
- Emit(kX64Movl, index_operand, value_operand);
+ if (ZeroExtendsWord32ToWord64(node->InputAt(0))) {
+ // Input value has already been zero-extended.
+ index_operand = value_operand;
+ } else {
+ Emit(kX64Movl, index_operand, value_operand);
+ }
}
// Generate a table lookup.
return EmitTableSwitch(sw, index_operand);
@@ -3257,7 +3269,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table,
} // namespace
-void InstructionSelector::VisitS8x16Shuffle(Node* node) {
+void InstructionSelector::VisitI8x16Shuffle(Node* node) {
uint8_t shuffle[kSimd128Size];
bool is_swizzle;
CanonicalizeShuffle(node, shuffle, &is_swizzle);
@@ -3273,9 +3285,12 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
// Swizzles don't generally need DefineSameAsFirst to avoid a move.
bool no_same_as_first = is_swizzle;
// We generally need UseRegister for input0, Use for input1.
+ // TODO(v8:9198): We don't have 16-byte alignment for SIMD operands yet, but
+ // we retain this logic (continue setting these in the various shuffle match
+ // clauses), but ignore it when selecting registers or slots.
bool src0_needs_reg = true;
bool src1_needs_reg = false;
- ArchOpcode opcode = kX64S8x16Shuffle; // general shuffle is the default
+ ArchOpcode opcode = kX64I8x16Shuffle; // general shuffle is the default
uint8_t offset;
uint8_t shuffle32x4[4];
@@ -3365,7 +3380,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
src0_needs_reg = true;
imms[imm_count++] = index;
}
- if (opcode == kX64S8x16Shuffle) {
+ if (opcode == kX64I8x16Shuffle) {
// Use same-as-first for general swizzle, but not shuffle.
no_same_as_first = !is_swizzle;
src0_needs_reg = !no_same_as_first;
@@ -3381,16 +3396,18 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
Node* input0 = node->InputAt(0);
InstructionOperand dst =
no_same_as_first ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node);
- InstructionOperand src0 =
- src0_needs_reg ? g.UseUniqueRegister(input0) : g.UseUnique(input0);
+ // TODO(v8:9198): Use src0_needs_reg when we have memory alignment for SIMD.
+ InstructionOperand src0 = g.UseUniqueRegister(input0);
+ USE(src0_needs_reg);
int input_count = 0;
InstructionOperand inputs[2 + kMaxImms + kMaxTemps];
inputs[input_count++] = src0;
if (!is_swizzle) {
Node* input1 = node->InputAt(1);
- inputs[input_count++] =
- src1_needs_reg ? g.UseUniqueRegister(input1) : g.UseUnique(input1);
+ // TODO(v8:9198): Use src1_needs_reg when we have memory alignment for SIMD.
+ inputs[input_count++] = g.UseUniqueRegister(input1);
+ USE(src1_needs_reg);
}
for (int i = 0; i < imm_count; ++i) {
inputs[input_count++] = g.UseImmediate(imms[i]);
@@ -3398,10 +3415,10 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
Emit(opcode, 1, &dst, input_count, inputs, temp_count, temps);
}
-void InstructionSelector::VisitS8x16Swizzle(Node* node) {
+void InstructionSelector::VisitI8x16Swizzle(Node* node) {
X64OperandGenerator g(this);
InstructionOperand temps[] = {g.TempSimd128Register()};
- Emit(kX64S8x16Swizzle, g.DefineSameAsFirst(node),
+ Emit(kX64I8x16Swizzle, g.DefineSameAsFirst(node),
g.UseRegister(node->InputAt(0)), g.UseUniqueRegister(node->InputAt(1)),
arraysize(temps), temps);
}
diff --git a/deps/v8/src/compiler/bytecode-graph-builder.cc b/deps/v8/src/compiler/bytecode-graph-builder.cc
index ecdfe72d7d..7855bc4c44 100644
--- a/deps/v8/src/compiler/bytecode-graph-builder.cc
+++ b/deps/v8/src/compiler/bytecode-graph-builder.cc
@@ -39,7 +39,7 @@ class BytecodeGraphBuilder {
BailoutId osr_offset, JSGraph* jsgraph,
CallFrequency const& invocation_frequency,
SourcePositionTable* source_positions, int inlining_id,
- BytecodeGraphBuilderFlags flags,
+ CodeKind code_kind, BytecodeGraphBuilderFlags flags,
TickCounter* tick_counter);
// Creates a graph by visiting bytecodes.
@@ -63,8 +63,26 @@ class BytecodeGraphBuilder {
// Get or create the node that represents the outer function closure.
Node* GetFunctionClosure();
+ CodeKind code_kind() const { return code_kind_; }
bool native_context_independent() const {
- return native_context_independent_;
+ return CodeKindIsNativeContextIndependentJSFunction(code_kind_);
+ }
+ bool generate_full_feedback_collection() const {
+ // NCI code currently collects full feedback.
+ DCHECK_IMPLIES(native_context_independent(),
+ CollectFeedbackInGenericLowering());
+ return native_context_independent();
+ }
+
+ static JSTypeHintLowering::LoweringResult NoChange() {
+ return JSTypeHintLowering::LoweringResult::NoChange();
+ }
+ bool CanApplyTypeHintLowering(IrOpcode::Value opcode) const {
+ return !generate_full_feedback_collection() ||
+ !IrOpcode::IsFeedbackCollectingOpcode(opcode);
+ }
+ bool CanApplyTypeHintLowering(const Operator* op) const {
+ return CanApplyTypeHintLowering(static_cast<IrOpcode::Value>(op->opcode()));
}
// The node representing the current feedback vector is generated once prior
@@ -97,6 +115,12 @@ class BytecodeGraphBuilder {
Node* BuildLoadFeedbackCell(int index);
+ // Checks the optimization marker and potentially triggers compilation or
+ // installs the finished code object.
+ // Only relevant for specific code kinds (see
+ // CodeKindChecksOptimizationMarker).
+ void MaybeBuildTierUpCheck();
+
// Builder for loading the a native context field.
Node* BuildLoadNativeContextField(int index);
@@ -426,7 +450,7 @@ class BytecodeGraphBuilder {
int input_buffer_size_;
Node** input_buffer_;
- const bool native_context_independent_;
+ const CodeKind code_kind_;
Node* feedback_cell_node_;
Node* feedback_vector_node_;
Node* native_context_node_;
@@ -958,7 +982,7 @@ BytecodeGraphBuilder::BytecodeGraphBuilder(
SharedFunctionInfoRef const& shared_info,
FeedbackVectorRef const& feedback_vector, BailoutId osr_offset,
JSGraph* jsgraph, CallFrequency const& invocation_frequency,
- SourcePositionTable* source_positions, int inlining_id,
+ SourcePositionTable* source_positions, int inlining_id, CodeKind code_kind,
BytecodeGraphBuilderFlags flags, TickCounter* tick_counter)
: broker_(broker),
local_zone_(local_zone),
@@ -977,7 +1001,7 @@ BytecodeGraphBuilder::BytecodeGraphBuilder(
bytecode_array().parameter_count(), bytecode_array().register_count(),
shared_info.object())),
source_position_iterator_(std::make_unique<SourcePositionTableIterator>(
- bytecode_array().source_positions())),
+ bytecode_array().SourcePositionTable())),
bytecode_iterator_(
std::make_unique<OffHeapBytecodeArray>(bytecode_array())),
bytecode_analysis_(broker_->GetBytecodeAnalysis(
@@ -997,8 +1021,7 @@ BytecodeGraphBuilder::BytecodeGraphBuilder(
current_exception_handler_(0),
input_buffer_size_(0),
input_buffer_(nullptr),
- native_context_independent_(
- flags & BytecodeGraphBuilderFlag::kNativeContextIndependent),
+ code_kind_(code_kind),
feedback_cell_node_(nullptr),
feedback_vector_node_(nullptr),
native_context_node_(nullptr),
@@ -1120,6 +1143,19 @@ Node* BytecodeGraphBuilder::BuildLoadNativeContext() {
return native_context;
}
+void BytecodeGraphBuilder::MaybeBuildTierUpCheck() {
+ if (!CodeKindChecksOptimizationMarker(code_kind())) return;
+
+ Environment* env = environment();
+ Node* control = env->GetControlDependency();
+ Node* effect = env->GetEffectDependency();
+
+ effect = graph()->NewNode(simplified()->TierUpCheck(), feedback_vector_node(),
+ effect, control);
+
+ env->UpdateEffectDependency(effect);
+}
+
Node* BytecodeGraphBuilder::BuildLoadNativeContextField(int index) {
Node* result = NewNode(javascript()->LoadContext(0, index, true));
NodeProperties::ReplaceContextInput(result, native_context_node());
@@ -1141,8 +1177,9 @@ void BytecodeGraphBuilder::CreateGraph() {
// Set up the basic structure of the graph. Outputs for {Start} are the formal
// parameters (including the receiver) plus new target, number of arguments,
// context and closure.
- int actual_parameter_count = bytecode_array().parameter_count() + 4;
- graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count)));
+ int start_output_arity = StartNode::OutputArityForFormalParameterCount(
+ bytecode_array().parameter_count());
+ graph()->SetStart(graph()->NewNode(common()->Start(start_output_arity)));
Environment env(this, bytecode_array().register_count(),
bytecode_array().parameter_count(),
@@ -1152,7 +1189,9 @@ void BytecodeGraphBuilder::CreateGraph() {
CreateFeedbackCellNode();
CreateFeedbackVectorNode();
+ MaybeBuildTierUpCheck();
CreateNativeContextNode();
+
VisitBytecodes();
// Finish the basic structure of the graph.
@@ -1539,6 +1578,7 @@ Node* BytecodeGraphBuilder::BuildLoadGlobal(NameRef name,
DCHECK(IsLoadGlobalICKind(broker()->GetFeedbackSlotKind(feedback)));
const Operator* op =
javascript()->LoadGlobal(name.object(), feedback, typeof_mode);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
return NewNode(op, feedback_vector_node());
}
@@ -1574,6 +1614,7 @@ void BytecodeGraphBuilder::VisitStaGlobal() {
GetLanguageModeFromSlotKind(broker()->GetFeedbackSlotKind(feedback));
const Operator* op =
javascript()->StoreGlobal(language_mode, name.object(), feedback);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* node = NewNode(op, value, feedback_vector_node());
environment()->RecordAfterState(node, Environment::kAttachFrameState);
}
@@ -1598,6 +1639,7 @@ void BytecodeGraphBuilder::VisitStaInArrayLiteral() {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, array, index, value, feedback_vector_node());
}
@@ -1626,6 +1668,7 @@ void BytecodeGraphBuilder::VisitStaDataPropertyInLiteral() {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, object, name, value, jsgraph()->Constant(flags),
feedback_vector_node());
}
@@ -1980,6 +2023,7 @@ void BytecodeGraphBuilder::VisitLdaNamedProperty() {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, object, feedback_vector_node());
}
environment()->BindAccumulator(node, Environment::kAttachFrameState);
@@ -1992,10 +2036,25 @@ void BytecodeGraphBuilder::VisitLdaNamedPropertyNoFeedback() {
NameRef name(broker(),
bytecode_iterator().GetConstantForIndexOperand(1, isolate()));
const Operator* op = javascript()->LoadNamed(name.object(), FeedbackSource());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* node = NewNode(op, object, feedback_vector_node());
environment()->BindAccumulator(node, Environment::kAttachFrameState);
}
+void BytecodeGraphBuilder::VisitLdaNamedPropertyFromSuper() {
+ PrepareEagerCheckpoint();
+ Node* receiver =
+ environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
+ Node* home_object = environment()->LookupAccumulator();
+ NameRef name(broker(),
+ bytecode_iterator().GetConstantForIndexOperand(1, isolate()));
+ const Operator* op = javascript()->LoadNamedFromSuper(name.object());
+ // TODO(marja, v8:9237): Use lowering.
+
+ Node* node = NewNode(op, receiver, home_object);
+ environment()->BindAccumulator(node, Environment::kAttachFrameState);
+}
+
void BytecodeGraphBuilder::VisitLdaKeyedProperty() {
PrepareEagerCheckpoint();
Node* key = environment()->LookupAccumulator();
@@ -2017,6 +2076,7 @@ void BytecodeGraphBuilder::VisitLdaKeyedProperty() {
STATIC_ASSERT(JSLoadPropertyNode::ObjectIndex() == 0);
STATIC_ASSERT(JSLoadPropertyNode::KeyIndex() == 1);
STATIC_ASSERT(JSLoadPropertyNode::FeedbackVectorIndex() == 2);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, object, key, feedback_vector_node());
}
environment()->BindAccumulator(node, Environment::kAttachFrameState);
@@ -2054,6 +2114,7 @@ void BytecodeGraphBuilder::BuildNamedStore(StoreMode store_mode) {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, object, value, feedback_vector_node());
}
environment()->RecordAfterState(node, Environment::kAttachFrameState);
@@ -2074,6 +2135,7 @@ void BytecodeGraphBuilder::VisitStaNamedPropertyNoFeedback() {
static_cast<LanguageMode>(bytecode_iterator().GetFlagOperand(2));
const Operator* op =
javascript()->StoreNamed(language_mode, name.object(), FeedbackSource());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* node = NewNode(op, object, value, feedback_vector_node());
environment()->RecordAfterState(node, Environment::kAttachFrameState);
}
@@ -2108,6 +2170,7 @@ void BytecodeGraphBuilder::VisitStaKeyedProperty() {
STATIC_ASSERT(JSStorePropertyNode::KeyIndex() == 1);
STATIC_ASSERT(JSStorePropertyNode::ValueIndex() == 2);
STATIC_ASSERT(JSStorePropertyNode::FeedbackVectorIndex() == 3);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, object, key, value, feedback_vector_node());
}
@@ -2243,9 +2306,10 @@ void BytecodeGraphBuilder::VisitCreateRegExpLiteral() {
FeedbackSource pair = CreateFeedbackSource(slot_id);
int literal_flags = bytecode_iterator().GetFlagOperand(2);
STATIC_ASSERT(JSCreateLiteralRegExpNode::FeedbackVectorIndex() == 0);
- Node* literal = NewNode(javascript()->CreateLiteralRegExp(
- constant_pattern.object(), pair, literal_flags),
- feedback_vector_node());
+ const Operator* op = javascript()->CreateLiteralRegExp(
+ constant_pattern.object(), pair, literal_flags);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
+ Node* literal = NewNode(op, feedback_vector_node());
environment()->BindAccumulator(literal, Environment::kAttachFrameState);
}
@@ -2265,18 +2329,20 @@ void BytecodeGraphBuilder::VisitCreateArrayLiteral() {
int number_of_elements =
array_boilerplate_description.constants_elements_length();
STATIC_ASSERT(JSCreateLiteralArrayNode::FeedbackVectorIndex() == 0);
- Node* literal = NewNode(
+ const Operator* op =
javascript()->CreateLiteralArray(array_boilerplate_description.object(),
- pair, literal_flags, number_of_elements),
- feedback_vector_node());
+ pair, literal_flags, number_of_elements);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
+ Node* literal = NewNode(op, feedback_vector_node());
environment()->BindAccumulator(literal, Environment::kAttachFrameState);
}
void BytecodeGraphBuilder::VisitCreateEmptyArrayLiteral() {
int const slot_id = bytecode_iterator().GetIndexOperand(0);
FeedbackSource pair = CreateFeedbackSource(slot_id);
- Node* literal = NewNode(javascript()->CreateEmptyLiteralArray(pair),
- feedback_vector_node());
+ const Operator* op = javascript()->CreateEmptyLiteralArray(pair);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
+ Node* literal = NewNode(op, feedback_vector_node());
environment()->BindAccumulator(literal);
}
@@ -2296,10 +2362,10 @@ void BytecodeGraphBuilder::VisitCreateObjectLiteral() {
interpreter::CreateObjectLiteralFlags::FlagsBits::decode(bytecode_flags);
int number_of_properties = constant_properties.size();
STATIC_ASSERT(JSCreateLiteralObjectNode::FeedbackVectorIndex() == 0);
- Node* literal = NewNode(
- javascript()->CreateLiteralObject(constant_properties.object(), pair,
- literal_flags, number_of_properties),
- feedback_vector_node());
+ const Operator* op = javascript()->CreateLiteralObject(
+ constant_properties.object(), pair, literal_flags, number_of_properties);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
+ Node* literal = NewNode(op, feedback_vector_node());
environment()->BindAccumulator(literal, Environment::kAttachFrameState);
}
@@ -2318,6 +2384,7 @@ void BytecodeGraphBuilder::VisitCloneObject() {
javascript()->CloneObject(CreateFeedbackSource(slot), flags);
STATIC_ASSERT(JSCloneObjectNode::SourceIndex() == 0);
STATIC_ASSERT(JSCloneObjectNode::FeedbackVectorIndex() == 1);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* value = NewNode(op, source, feedback_vector_node());
environment()->BindAccumulator(value, Environment::kAttachFrameState);
}
@@ -2329,10 +2396,10 @@ void BytecodeGraphBuilder::VisitGetTemplateObject() {
TemplateObjectDescriptionRef description(
broker(), bytecode_iterator().GetConstantForIndexOperand(0, isolate()));
STATIC_ASSERT(JSGetTemplateObjectNode::FeedbackVectorIndex() == 0);
- Node* template_object =
- NewNode(javascript()->GetTemplateObject(description.object(),
- shared_info().object(), source),
- feedback_vector_node());
+ const Operator* op = javascript()->GetTemplateObject(
+ description.object(), shared_info().object(), source);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
+ Node* template_object = NewNode(op, feedback_vector_node());
environment()->BindAccumulator(template_object);
}
@@ -2378,6 +2445,7 @@ void BytecodeGraphBuilder::BuildCall(ConvertReceiverMode receiver_mode,
const Operator* op =
javascript()->Call(arg_count, frequency, feedback, receiver_mode,
speculation_mode, CallFeedbackRelation::kRelated);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedCall(
op, args, static_cast<int>(arg_count), feedback.slot);
@@ -2563,6 +2631,7 @@ void BytecodeGraphBuilder::VisitCallWithSpread() {
const Operator* op = javascript()->CallWithSpread(
JSCallWithSpreadNode::ArityForArgc(arg_count), frequency, feedback,
speculation_mode);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedCall(
op, args, static_cast<int>(arg_count), feedback.slot);
@@ -2687,6 +2756,7 @@ void BytecodeGraphBuilder::VisitConstruct() {
const uint32_t arg_count = static_cast<uint32_t>(reg_count);
const uint32_t arity = JSConstructNode::ArityForArgc(arg_count);
const Operator* op = javascript()->Construct(arity, frequency, feedback);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* const* args = GetConstructArgumentsFromRegister(callee, new_target,
first_reg, arg_count);
JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedConstruct(
@@ -2719,6 +2789,7 @@ void BytecodeGraphBuilder::VisitConstructWithSpread() {
const uint32_t arity = JSConstructNode::ArityForArgc(arg_count);
const Operator* op =
javascript()->ConstructWithSpread(arity, frequency, feedback);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* const* args = GetConstructArgumentsFromRegister(callee, new_target,
first_reg, arg_count);
JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedConstruct(
@@ -2848,6 +2919,7 @@ void BytecodeGraphBuilder::BuildUnaryOp(const Operator* op) {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, operand, feedback_vector_node());
}
@@ -2872,6 +2944,7 @@ void BytecodeGraphBuilder::BuildBinaryOp(const Operator* op) {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, left, right, feedback_vector_node());
}
@@ -3029,6 +3102,7 @@ void BytecodeGraphBuilder::BuildBinaryOpWithImmediate(const Operator* op) {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, left, right, feedback_vector_node());
}
environment()->BindAccumulator(node, Environment::kAttachFrameState);
@@ -3167,6 +3241,7 @@ void BytecodeGraphBuilder::BuildCompareOp(const Operator* op) {
node = lowering.value();
} else {
DCHECK(!lowering.Changed());
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
node = NewNode(op, left, right, feedback_vector_node());
}
environment()->BindAccumulator(node, Environment::kAttachFrameState);
@@ -3226,8 +3301,9 @@ void BytecodeGraphBuilder::VisitTestIn() {
STATIC_ASSERT(JSHasPropertyNode::ObjectIndex() == 0);
STATIC_ASSERT(JSHasPropertyNode::KeyIndex() == 1);
STATIC_ASSERT(JSHasPropertyNode::FeedbackVectorIndex() == 2);
- Node* node = NewNode(javascript()->HasProperty(feedback), object, key,
- feedback_vector_node());
+ const Operator* op = javascript()->HasProperty(feedback);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
+ Node* node = NewNode(op, object, key, feedback_vector_node());
environment()->BindAccumulator(node, Environment::kAttachFrameState);
}
@@ -3608,6 +3684,7 @@ void BytecodeGraphBuilder::VisitGetIterator() {
DCHECK(!lowering.Changed());
STATIC_ASSERT(JSGetIteratorNode::ReceiverIndex() == 0);
STATIC_ASSERT(JSGetIteratorNode::FeedbackVectorIndex() == 1);
+ DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode()));
Node* iterator = NewNode(op, receiver, feedback_vector_node());
environment()->BindAccumulator(iterator, Environment::kAttachFrameState);
}
@@ -4007,6 +4084,7 @@ JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedUnaryOp(const Operator* op,
Node* operand,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4020,6 +4098,7 @@ JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedBinaryOp(const Operator* op, Node* left,
Node* right,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4034,6 +4113,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedForInNext(Node* receiver,
Node* cache_array,
Node* cache_type, Node* index,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(IrOpcode::kJSForInNext)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4046,6 +4126,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedForInNext(Node* receiver,
JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedForInPrepare(Node* enumerator,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(IrOpcode::kJSForInPrepare)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4058,6 +4139,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedForInPrepare(Node* enumerator,
JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedToNumber(Node* value,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(IrOpcode::kJSToNumber)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4069,6 +4151,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedToNumber(Node* value,
JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedCall(
const Operator* op, Node* const* args, int arg_count, FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4083,6 +4166,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedConstruct(const Operator* op,
Node* const* args,
int arg_count,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4097,6 +4181,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedGetIterator(const Operator* op,
Node* receiver,
FeedbackSlot load_slot,
FeedbackSlot call_slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult early_reduction =
@@ -4110,6 +4195,7 @@ JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedLoadNamed(const Operator* op,
Node* receiver,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult early_reduction =
@@ -4123,6 +4209,7 @@ JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedLoadKeyed(const Operator* op,
Node* receiver, Node* key,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4136,6 +4223,7 @@ JSTypeHintLowering::LoweringResult
BytecodeGraphBuilder::TryBuildSimplifiedStoreNamed(const Operator* op,
Node* receiver, Node* value,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4150,6 +4238,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedStoreKeyed(const Operator* op,
Node* receiver, Node* key,
Node* value,
FeedbackSlot slot) {
+ if (!CanApplyTypeHintLowering(op)) return NoChange();
Node* effect = environment()->GetEffectDependency();
Node* control = environment()->GetControlDependency();
JSTypeHintLowering::LoweringResult result =
@@ -4387,13 +4476,14 @@ void BuildGraphFromBytecode(JSHeapBroker* broker, Zone* local_zone,
BailoutId osr_offset, JSGraph* jsgraph,
CallFrequency const& invocation_frequency,
SourcePositionTable* source_positions,
- int inlining_id, BytecodeGraphBuilderFlags flags,
+ int inlining_id, CodeKind code_kind,
+ BytecodeGraphBuilderFlags flags,
TickCounter* tick_counter) {
DCHECK(broker->IsSerializedForCompilation(shared_info, feedback_vector));
BytecodeGraphBuilder builder(
broker, local_zone, broker->target_native_context(), shared_info,
feedback_vector, osr_offset, jsgraph, invocation_frequency,
- source_positions, inlining_id, flags, tick_counter);
+ source_positions, inlining_id, code_kind, flags, tick_counter);
builder.CreateGraph();
}
diff --git a/deps/v8/src/compiler/bytecode-graph-builder.h b/deps/v8/src/compiler/bytecode-graph-builder.h
index 1667a4d57d..a8423904f8 100644
--- a/deps/v8/src/compiler/bytecode-graph-builder.h
+++ b/deps/v8/src/compiler/bytecode-graph-builder.h
@@ -7,8 +7,9 @@
#include "src/compiler/js-operator.h"
#include "src/compiler/js-type-hint-lowering.h"
-#include "src/utils/utils.h"
#include "src/handles/handles.h"
+#include "src/objects/code-kind.h"
+#include "src/utils/utils.h"
namespace v8 {
@@ -33,7 +34,6 @@ enum class BytecodeGraphBuilderFlag : uint8_t {
// bytecode analysis.
kAnalyzeEnvironmentLiveness = 1 << 1,
kBailoutOnUninitialized = 1 << 2,
- kNativeContextIndependent = 1 << 3,
};
using BytecodeGraphBuilderFlags = base::Flags<BytecodeGraphBuilderFlag>;
@@ -45,7 +45,8 @@ void BuildGraphFromBytecode(JSHeapBroker* broker, Zone* local_zone,
BailoutId osr_offset, JSGraph* jsgraph,
CallFrequency const& invocation_frequency,
SourcePositionTable* source_positions,
- int inlining_id, BytecodeGraphBuilderFlags flags,
+ int inlining_id, CodeKind code_kind,
+ BytecodeGraphBuilderFlags flags,
TickCounter* tick_counter);
} // namespace compiler
diff --git a/deps/v8/src/compiler/c-linkage.cc b/deps/v8/src/compiler/c-linkage.cc
index fdf0a66a22..af467f2bb1 100644
--- a/deps/v8/src/compiler/c-linkage.cc
+++ b/deps/v8/src/compiler/c-linkage.cc
@@ -31,6 +31,7 @@ namespace {
// == x64 windows ============================================================
#define STACK_SHADOW_WORDS 4
#define PARAM_REGISTERS rcx, rdx, r8, r9
+#define FP_PARAM_REGISTERS xmm0, xmm1, xmm2, xmm3
#define CALLEE_SAVE_REGISTERS \
rbx.bit() | rdi.bit() | rsi.bit() | r12.bit() | r13.bit() | r14.bit() | \
r15.bit()
@@ -42,6 +43,7 @@ namespace {
#else // V8_TARGET_OS_WIN
// == x64 other ==============================================================
#define PARAM_REGISTERS rdi, rsi, rdx, rcx, r8, r9
+#define FP_PARAM_REGISTERS xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
#define CALLEE_SAVE_REGISTERS \
rbx.bit() | r12.bit() | r13.bit() | r14.bit() | r15.bit()
#endif // V8_TARGET_OS_WIN
@@ -137,38 +139,116 @@ namespace {
#endif
} // namespace
+#ifdef V8_TARGET_OS_WIN
+// As defined in
+// https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019#parameter-passing,
+// Windows calling convention doesn't differentiate between GP and FP params
+// when counting how many of them should be placed in registers. That's why
+// we use the same counter {i} for both types here.
+void BuildParameterLocations(const MachineSignature* msig,
+ size_t kFPParamRegisterCount,
+ size_t kParamRegisterCount,
+ const DoubleRegister* kFPParamRegisters,
+ const v8::internal::Register* kParamRegisters,
+ LocationSignature::Builder* out_locations) {
+#ifdef STACK_SHADOW_WORDS
+ int stack_offset = STACK_SHADOW_WORDS;
+#else
+ int stack_offset = 0;
+#endif
+ CHECK_EQ(kFPParamRegisterCount, kParamRegisterCount);
+
+ for (size_t i = 0; i < msig->parameter_count(); i++) {
+ MachineType type = msig->GetParam(i);
+ bool spill = (i >= kParamRegisterCount);
+ if (spill) {
+ out_locations->AddParam(
+ LinkageLocation::ForCallerFrameSlot(-1 - stack_offset, type));
+ stack_offset++;
+ } else {
+ if (IsFloatingPoint(type.representation())) {
+ out_locations->AddParam(
+ LinkageLocation::ForRegister(kFPParamRegisters[i].code(), type));
+ } else {
+ out_locations->AddParam(
+ LinkageLocation::ForRegister(kParamRegisters[i].code(), type));
+ }
+ }
+ }
+}
+#else // V8_TARGET_OS_WIN
+// As defined in https://www.agner.org/optimize/calling_conventions.pdf,
+// Section 7, Linux and Mac place parameters in consecutive registers,
+// differentiating between GP and FP params. That's why we maintain two
+// separate counters here.
+void BuildParameterLocations(const MachineSignature* msig,
+ size_t kFPParamRegisterCount,
+ size_t kParamRegisterCount,
+ const DoubleRegister* kFPParamRegisters,
+ const v8::internal::Register* kParamRegisters,
+ LocationSignature::Builder* out_locations) {
+#ifdef STACK_SHADOW_WORDS
+ int stack_offset = STACK_SHADOW_WORDS;
+#else
+ int stack_offset = 0;
+#endif
+ size_t num_params = 0;
+ size_t num_fp_params = 0;
+ for (size_t i = 0; i < msig->parameter_count(); i++) {
+ MachineType type = msig->GetParam(i);
+ bool spill = IsFloatingPoint(type.representation())
+ ? (num_fp_params >= kFPParamRegisterCount)
+ : (num_params >= kParamRegisterCount);
+ if (spill) {
+ out_locations->AddParam(
+ LinkageLocation::ForCallerFrameSlot(-1 - stack_offset, type));
+ stack_offset++;
+ } else {
+ if (IsFloatingPoint(type.representation())) {
+ out_locations->AddParam(LinkageLocation::ForRegister(
+ kFPParamRegisters[num_fp_params].code(), type));
+ ++num_fp_params;
+ } else {
+ out_locations->AddParam(LinkageLocation::ForRegister(
+ kParamRegisters[num_params].code(), type));
+ ++num_params;
+ }
+ }
+ }
+}
+#endif // V8_TARGET_OS_WIN
// General code uses the above configuration data.
CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone,
const MachineSignature* msig,
CallDescriptor::Flags flags) {
+#ifdef UNSUPPORTED_C_LINKAGE
+ // This method should not be called on unknown architectures.
+ FATAL("requested C call descriptor on unsupported architecture");
+ return nullptr;
+#endif
+
DCHECK_LE(msig->parameter_count(), static_cast<size_t>(kMaxCParameters));
LocationSignature::Builder locations(zone, msig->return_count(),
msig->parameter_count());
+
+#ifndef V8_ENABLE_FP_PARAMS_IN_C_LINKAGE
// Check the types of the signature.
- // Currently no floating point parameters or returns are allowed because
- // on ia32, the FP top of stack is involved.
- for (size_t i = 0; i < msig->return_count(); i++) {
- MachineRepresentation rep = msig->GetReturn(i).representation();
- CHECK_NE(MachineRepresentation::kFloat32, rep);
- CHECK_NE(MachineRepresentation::kFloat64, rep);
- }
for (size_t i = 0; i < msig->parameter_count(); i++) {
MachineRepresentation rep = msig->GetParam(i).representation();
CHECK_NE(MachineRepresentation::kFloat32, rep);
CHECK_NE(MachineRepresentation::kFloat64, rep);
}
-
-#ifdef UNSUPPORTED_C_LINKAGE
- // This method should not be called on unknown architectures.
- FATAL("requested C call descriptor on unsupported architecture");
- return nullptr;
#endif
- // Add return location(s).
- CHECK_GE(2, locations.return_count_);
+ // Add return location(s). We don't support FP returns for now.
+ for (size_t i = 0; i < locations.return_count_; i++) {
+ MachineType type = msig->GetReturn(i);
+ CHECK(!IsFloatingPoint(type.representation()));
+ }
+ CHECK_GE(2, locations.return_count_);
if (locations.return_count_ > 0) {
locations.AddReturn(LinkageLocation::ForRegister(kReturnRegister0.code(),
msig->GetReturn(0)));
@@ -178,8 +258,6 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone,
msig->GetReturn(1)));
}
- const int parameter_count = static_cast<int>(msig->parameter_count());
-
#ifdef PARAM_REGISTERS
const v8::internal::Register kParamRegisters[] = {PARAM_REGISTERS};
const int kParamRegisterCount = static_cast<int>(arraysize(kParamRegisters));
@@ -188,22 +266,17 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone,
const int kParamRegisterCount = 0;
#endif
-#ifdef STACK_SHADOW_WORDS
- int stack_offset = STACK_SHADOW_WORDS;
+#ifdef FP_PARAM_REGISTERS
+ const DoubleRegister kFPParamRegisters[] = {FP_PARAM_REGISTERS};
+ const size_t kFPParamRegisterCount = arraysize(kFPParamRegisters);
#else
- int stack_offset = 0;
+ const DoubleRegister* kFPParamRegisters = nullptr;
+ const size_t kFPParamRegisterCount = 0;
#endif
+
// Add register and/or stack parameter(s).
- for (int i = 0; i < parameter_count; i++) {
- if (i < kParamRegisterCount) {
- locations.AddParam(LinkageLocation::ForRegister(kParamRegisters[i].code(),
- msig->GetParam(i)));
- } else {
- locations.AddParam(LinkageLocation::ForCallerFrameSlot(
- -1 - stack_offset, msig->GetParam(i)));
- stack_offset++;
- }
- }
+ BuildParameterLocations(msig, kFPParamRegisterCount, kParamRegisterCount,
+ kFPParamRegisters, kParamRegisters, &locations);
#ifdef CALLEE_SAVE_REGISTERS
const RegList kCalleeSaveRegisters = CALLEE_SAVE_REGISTERS;
diff --git a/deps/v8/src/compiler/code-assembler.cc b/deps/v8/src/compiler/code-assembler.cc
index 5f5ff66cfe..273058ba25 100644
--- a/deps/v8/src/compiler/code-assembler.cc
+++ b/deps/v8/src/compiler/code-assembler.cc
@@ -64,11 +64,8 @@ CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone,
int32_t builtin_index)
: CodeAssemblerState(
isolate, zone,
- Linkage::GetJSCallDescriptor(
- zone, false, parameter_count,
- (kind == CodeKind::BUILTIN ? CallDescriptor::kPushArgumentCount
- : CallDescriptor::kNoFlags) |
- CallDescriptor::kCanUseRoots),
+ Linkage::GetJSCallDescriptor(zone, false, parameter_count,
+ CallDescriptor::kCanUseRoots),
kind, name, poisoning_level, builtin_index) {}
CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone,
diff --git a/deps/v8/src/compiler/common-operator.h b/deps/v8/src/compiler/common-operator.h
index 22547aa45c..f68780394a 100644
--- a/deps/v8/src/compiler/common-operator.h
+++ b/deps/v8/src/compiler/common-operator.h
@@ -12,6 +12,8 @@
#include "src/common/globals.h"
#include "src/compiler/feedback-source.h"
#include "src/compiler/frame-states.h"
+#include "src/compiler/linkage.h"
+#include "src/compiler/node-properties.h"
#include "src/deoptimizer/deoptimize-reason.h"
#include "src/zone/zone-containers.h"
#include "src/zone/zone-handle-set.h"
@@ -565,6 +567,77 @@ class V8_EXPORT_PRIVATE CommonOperatorBuilder final
DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder);
};
+// Node wrappers.
+
+class CommonNodeWrapperBase : public NodeWrapper {
+ public:
+ explicit constexpr CommonNodeWrapperBase(Node* node) : NodeWrapper(node) {}
+
+ // Valid iff this node has exactly one effect input.
+ Effect effect() const {
+ DCHECK_EQ(node()->op()->EffectInputCount(), 1);
+ return Effect{NodeProperties::GetEffectInput(node())};
+ }
+
+ // Valid iff this node has exactly one control input.
+ Control control() const {
+ DCHECK_EQ(node()->op()->ControlInputCount(), 1);
+ return Control{NodeProperties::GetControlInput(node())};
+ }
+};
+
+#define DEFINE_INPUT_ACCESSORS(Name, name, TheIndex, Type) \
+ static constexpr int Name##Index() { return TheIndex; } \
+ TNode<Type> name() const { \
+ return TNode<Type>::UncheckedCast( \
+ NodeProperties::GetValueInput(node(), TheIndex)); \
+ }
+
+class StartNode final : public CommonNodeWrapperBase {
+ public:
+ explicit constexpr StartNode(Node* node) : CommonNodeWrapperBase(node) {
+ CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kStart);
+ }
+
+ // The receiver is counted as part of formal parameters.
+ static constexpr int kReceiverOutputCount = 1;
+ // These outputs are in addition to formal parameters.
+ static constexpr int kExtraOutputCount = 4;
+
+ // Takes the formal parameter count of the current function (including
+ // receiver) and returns the number of value outputs of the start node.
+ static constexpr int OutputArityForFormalParameterCount(int argc) {
+ constexpr int kClosure = 1;
+ constexpr int kNewTarget = 1;
+ constexpr int kArgCount = 1;
+ constexpr int kContext = 1;
+ STATIC_ASSERT(kClosure + kNewTarget + kArgCount + kContext ==
+ kExtraOutputCount);
+ // Checking related linkage methods here since they rely on Start node
+ // layout.
+ CONSTEXPR_DCHECK(Linkage::kJSCallClosureParamIndex == -1);
+ CONSTEXPR_DCHECK(Linkage::GetJSCallNewTargetParamIndex(argc) == argc + 0);
+ CONSTEXPR_DCHECK(Linkage::GetJSCallArgCountParamIndex(argc) == argc + 1);
+ CONSTEXPR_DCHECK(Linkage::GetJSCallContextParamIndex(argc) == argc + 2);
+ return argc + kClosure + kNewTarget + kArgCount + kContext;
+ }
+
+ int FormalParameterCount() const {
+ DCHECK_GE(node()->op()->ValueOutputCount(),
+ kExtraOutputCount + kReceiverOutputCount);
+ return node()->op()->ValueOutputCount() - kExtraOutputCount;
+ }
+
+ int FormalParameterCountWithoutReceiver() const {
+ DCHECK_GE(node()->op()->ValueOutputCount(),
+ kExtraOutputCount + kReceiverOutputCount);
+ return node()->op()->ValueOutputCount() - kExtraOutputCount -
+ kReceiverOutputCount;
+ }
+};
+
+#undef DEFINE_INPUT_ACCESSORS
+
} // namespace compiler
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/compiler/compilation-dependencies.cc b/deps/v8/src/compiler/compilation-dependencies.cc
index 33e1930499..263a5a5f1e 100644
--- a/deps/v8/src/compiler/compilation-dependencies.cc
+++ b/deps/v8/src/compiler/compilation-dependencies.cc
@@ -8,6 +8,7 @@
#include "src/execution/protectors.h"
#include "src/handles/handles-inl.h"
#include "src/objects/allocation-site-inl.h"
+#include "src/objects/js-function-inl.h"
#include "src/objects/objects-inl.h"
#include "src/zone/zone-handle-set.h"
@@ -179,6 +180,13 @@ class FieldRepresentationDependency final : public CompilationDependency {
DependentCode::kFieldRepresentationGroup);
}
+#ifdef DEBUG
+ bool IsFieldRepresentationDependencyOnMap(
+ Handle<Map> const& receiver_map) const override {
+ return owner_.object().equals(receiver_map);
+ }
+#endif
+
private:
MapRef owner_;
InternalIndex descriptor_;
diff --git a/deps/v8/src/compiler/compilation-dependency.h b/deps/v8/src/compiler/compilation-dependency.h
index e5726a0ddb..751e8d9f35 100644
--- a/deps/v8/src/compiler/compilation-dependency.h
+++ b/deps/v8/src/compiler/compilation-dependency.h
@@ -22,6 +22,10 @@ class CompilationDependency : public ZoneObject {
#ifdef DEBUG
virtual bool IsPretenureModeDependency() const { return false; }
+ virtual bool IsFieldRepresentationDependencyOnMap(
+ Handle<Map> const& receiver_map) const {
+ return false;
+ }
#endif
};
diff --git a/deps/v8/src/compiler/effect-control-linearizer.cc b/deps/v8/src/compiler/effect-control-linearizer.cc
index 14dd26ba7f..98ca00c78b 100644
--- a/deps/v8/src/compiler/effect-control-linearizer.cc
+++ b/deps/v8/src/compiler/effect-control-linearizer.cc
@@ -45,7 +45,7 @@ class EffectControlLinearizer {
maintain_schedule_(maintain_schedule),
source_positions_(source_positions),
node_origins_(node_origins),
- graph_assembler_(js_graph, temp_zone,
+ graph_assembler_(js_graph, temp_zone, base::nullopt,
should_maintain_schedule() ? schedule : nullptr),
frame_state_zapper_(nullptr) {}
@@ -179,7 +179,8 @@ class EffectControlLinearizer {
void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state);
void LowerCheckEqualsSymbol(Node* node, Node* frame_state);
Node* LowerTypeOf(Node* node);
- Node* LowerUpdateInterruptBudget(Node* node);
+ void LowerTierUpCheck(Node* node);
+ void LowerUpdateInterruptBudget(Node* node);
Node* LowerToBoolean(Node* node);
Node* LowerPlainPrimitiveToNumber(Node* node);
Node* LowerPlainPrimitiveToWord32(Node* node);
@@ -265,6 +266,7 @@ class EffectControlLinearizer {
Node* ObjectIsSmi(Node* value);
Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte);
Node* TruncateWordToInt32(Node* value);
+ Node* MakeWeakForComparison(Node* heap_object);
Node* BuildIsWeakReferenceTo(Node* maybe_object, Node* value);
Node* BuildIsClearedWeakReference(Node* maybe_object);
Node* BuildIsStrongReference(Node* value);
@@ -282,8 +284,9 @@ class EffectControlLinearizer {
DeoptimizeReason reason);
// Helper functions used in LowerDynamicCheckMaps
- void CheckPolymorphic(Node* feedback, Node* value_map, Node* handler,
- GraphAssemblerLabel<0>* done, Node* frame_state);
+ void CheckPolymorphic(Node* expected_polymorphic_array, Node* actual_map,
+ Node* actual_handler, GraphAssemblerLabel<0>* done,
+ Node* frame_state);
void ProcessMonomorphic(Node* handler, GraphAssemblerLabel<0>* done,
Node* frame_state, int slot, Node* vector);
void BranchOnICState(int slot_index, Node* vector, Node* value_map,
@@ -1138,8 +1141,11 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
case IrOpcode::kTypeOf:
result = LowerTypeOf(node);
break;
+ case IrOpcode::kTierUpCheck:
+ LowerTierUpCheck(node);
+ break;
case IrOpcode::kUpdateInterruptBudget:
- result = LowerUpdateInterruptBudget(node);
+ LowerUpdateInterruptBudget(node);
break;
case IrOpcode::kNewDoubleElements:
result = LowerNewDoubleElements(node);
@@ -1881,51 +1887,107 @@ void EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state) {
}
}
-void EffectControlLinearizer::CheckPolymorphic(Node* feedback_slot,
- Node* value_map, Node* handler,
+void EffectControlLinearizer::CheckPolymorphic(Node* expected_polymorphic_array,
+ Node* actual_map,
+ Node* actual_handler,
GraphAssemblerLabel<0>* done,
Node* frame_state) {
- Node* feedback_slot_map =
- __ LoadField(AccessBuilder::ForMap(), feedback_slot);
- Node* is_weak_fixed_array_check =
- __ TaggedEqual(feedback_slot_map, __ WeakFixedArrayMapConstant());
+ Node* expected_polymorphic_array_map =
+ __ LoadField(AccessBuilder::ForMap(), expected_polymorphic_array);
+ Node* is_weak_fixed_array = __ TaggedEqual(expected_polymorphic_array_map,
+ __ WeakFixedArrayMapConstant());
__ DeoptimizeIfNot(DeoptimizeReason::kTransitionedToMegamorphicIC,
- FeedbackSource(), is_weak_fixed_array_check, frame_state,
+ FeedbackSource(), is_weak_fixed_array, frame_state,
IsSafetyCheck::kCriticalSafetyCheck);
- Node* length = ChangeSmiToInt32(
- __ LoadField(AccessBuilder::ForWeakFixedArrayLength(), feedback_slot));
- auto loop = __ MakeLoopLabel(MachineRepresentation::kWord32);
- __ Goto(&loop, __ Int32Constant(0));
- __ Bind(&loop);
- {
- Node* index = loop.PhiAt(0);
- Node* check = __ Int32LessThan(index, length);
- __ DeoptimizeIfNot(DeoptimizeKind::kBailout, DeoptimizeReason::kMissingMap,
- FeedbackSource(), check, frame_state,
- IsSafetyCheck::kCriticalSafetyCheck);
+ Node* polymorphic_array = expected_polymorphic_array;
- Node* maybe_map = __ LoadElement(AccessBuilder::ForWeakFixedArrayElement(),
- feedback_slot, index);
- auto continue_loop = __ MakeLabel();
-
- __ GotoIfNot(BuildIsWeakReferenceTo(maybe_map, value_map), &continue_loop);
- constexpr int kHandlerOffsetInEntry = 1;
- Node* maybe_handler = __ LoadElement(
- AccessBuilder::ForWeakFixedArrayElement(), feedback_slot,
- __ Int32Add(index, __ Int32Constant(kHandlerOffsetInEntry)));
- Node* handler_check = __ TaggedEqual(maybe_handler, handler);
- __ DeoptimizeIfNot(DeoptimizeReason::kWrongHandler, FeedbackSource(),
- handler_check, frame_state,
- IsSafetyCheck::kCriticalSafetyCheck);
+ // This is now a weak pointer that we're holding in the register, we
+ // need to be careful about spilling and reloading it (as it could
+ // get cleared in between). There's no runtime call here that could
+ // cause a spill so we should be safe.
+ Node* weak_actual_map = MakeWeakForComparison(actual_map);
+ Node* length = ChangeSmiToInt32(__ LoadField(
+ AccessBuilder::ForWeakFixedArrayLength(), polymorphic_array));
+ auto do_handler_check = __ MakeLabel(MachineRepresentation::kWord32);
- __ Goto(done);
+ GraphAssemblerLabel<0> labels[] = {__ MakeLabel(), __ MakeLabel(),
+ __ MakeLabel(), __ MakeLabel()};
- __ Bind(&continue_loop);
- constexpr int kEntrySize = 2;
- index = __ Int32Add(index, __ Int32Constant(kEntrySize));
- __ Goto(&loop, index);
+ STATIC_ASSERT(FLAG_max_minimorphic_map_checks == arraysize(labels));
+ DCHECK_GE(FLAG_max_minimorphic_map_checks,
+ FLAG_max_valid_polymorphic_map_count);
+
+ // The following generates a switch based on the length of the
+ // array:
+ //
+ // if length >= 4: goto labels[3]
+ // if length == 3: goto labels[2]
+ // if length == 2: goto labels[1]
+ // if length == 1: goto labels[0]
+ __ GotoIf(__ Int32LessThanOrEqual(
+ __ Int32Constant(FeedbackIterator::SizeFor(4)), length),
+ &labels[3]);
+ __ GotoIf(
+ __ Word32Equal(length, __ Int32Constant(FeedbackIterator::SizeFor(3))),
+ &labels[2]);
+ __ GotoIf(
+ __ Word32Equal(length, __ Int32Constant(FeedbackIterator::SizeFor(2))),
+ &labels[1]);
+ __ GotoIf(
+ __ Word32Equal(length, __ Int32Constant(FeedbackIterator::SizeFor(1))),
+ &labels[0]);
+
+ // We should never have an polymorphic feedback array of size 0.
+ __ Unreachable(done);
+
+ // This loop generates code like this to do the dynamic map check:
+ //
+ // labels[3]:
+ // maybe_map = load(polymorphic_array, i)
+ // if weak_actual_map == maybe_map goto handler_check
+ // goto labels[2]
+ // labels[2]:
+ // maybe_map = load(polymorphic_array, i - 1)
+ // if weak_actual_map == maybe_map goto handler_check
+ // goto labels[1]
+ // labels[1]:
+ // maybe_map = load(polymorphic_array, i - 2)
+ // if weak_actual_map == maybe_map goto handler_check
+ // goto labels[0]
+ // labels[0]:
+ // maybe_map = load(polymorphic_array, i - 3)
+ // if weak_actual_map == maybe_map goto handler_check
+ // bailout
+ for (int i = arraysize(labels) - 1; i >= 0; i--) {
+ __ Bind(&labels[i]);
+ Node* maybe_map = __ LoadField(AccessBuilder::ForWeakFixedArraySlot(
+ FeedbackIterator::MapIndexForEntry(i)),
+ polymorphic_array);
+ Node* map_check = __ TaggedEqual(maybe_map, weak_actual_map);
+
+ int handler_index = FeedbackIterator::HandlerIndexForEntry(i);
+ __ GotoIf(map_check, &do_handler_check, __ Int32Constant(handler_index));
+ if (i > 0) {
+ __ Goto(&labels[i - 1]);
+ } else {
+ // TODO(turbofan): Add support for gasm->Deoptimize.
+ __ DeoptimizeIf(DeoptimizeKind::kBailout, DeoptimizeReason::kMissingMap,
+ FeedbackSource(), __ IntPtrConstant(1),
+ FrameState(frame_state));
+ __ Unreachable(done);
+ }
}
+
+ __ Bind(&do_handler_check);
+ Node* handler_index = do_handler_check.PhiAt(0);
+ Node* maybe_handler =
+ __ LoadElement(AccessBuilder::ForWeakFixedArrayElement(),
+ polymorphic_array, handler_index);
+ __ DeoptimizeIfNot(DeoptimizeReason::kWrongHandler, FeedbackSource(),
+ __ TaggedEqual(maybe_handler, actual_handler), frame_state,
+ IsSafetyCheck::kCriticalSafetyCheck);
+ __ Goto(done);
}
void EffectControlLinearizer::ProcessMonomorphic(Node* handler,
@@ -2599,8 +2661,7 @@ Node* EffectControlLinearizer::LowerCheckedUint32Bounds(Node* node,
__ Branch(check, &done, &if_abort);
__ Bind(&if_abort);
- __ Unreachable();
- __ Goto(&done);
+ __ Unreachable(&done);
__ Bind(&done);
}
@@ -2646,8 +2707,7 @@ Node* EffectControlLinearizer::LowerCheckedUint64Bounds(Node* node,
__ Branch(check, &done, &if_abort);
__ Bind(&if_abort);
- __ Unreachable();
- __ Goto(&done);
+ __ Unreachable(&done);
__ Bind(&done);
}
@@ -3678,12 +3738,89 @@ Node* EffectControlLinearizer::LowerTypeOf(Node* node) {
__ NoContextConstant());
}
-Node* EffectControlLinearizer::LowerUpdateInterruptBudget(Node* node) {
+void EffectControlLinearizer::LowerTierUpCheck(Node* node) {
+ TierUpCheckNode n(node);
+ TNode<FeedbackVector> vector = n.feedback_vector();
+
+ Node* optimization_marker = __ LoadField(
+ AccessBuilder::ForFeedbackVectorOptimizedCodeWeakOrSmi(), vector);
+
+ // TODO(jgruber): The branch introduces a sequence of spills before the
+ // branch (and restores at `fallthrough`) that are completely unnecessary
+ // since the IfFalse continuation ends in a tail call. Investigate how to
+ // avoid these and fix it.
+
+ // TODO(jgruber): Combine the checks below for none/queued, e.g. by
+ // reorganizing OptimizationMarker values such that the least significant bit
+ // says whether the value is interesting or not. Also update the related
+ // check in the InterpreterEntryTrampoline.
+
+ auto fallthrough = __ MakeLabel();
+ auto optimization_marker_is_not_none = __ MakeDeferredLabel();
+ auto optimization_marker_is_neither_none_nor_queued = __ MakeDeferredLabel();
+ __ BranchWithHint(
+ __ TaggedEqual(optimization_marker, __ SmiConstant(static_cast<int>(
+ OptimizationMarker::kNone))),
+ &fallthrough, &optimization_marker_is_not_none, BranchHint::kTrue);
+
+ __ Bind(&optimization_marker_is_not_none);
+ __ BranchWithHint(
+ __ TaggedEqual(optimization_marker,
+ __ SmiConstant(static_cast<int>(
+ OptimizationMarker::kInOptimizationQueue))),
+ &fallthrough, &optimization_marker_is_neither_none_nor_queued,
+ BranchHint::kNone);
+
+ __ Bind(&optimization_marker_is_neither_none_nor_queued);
+
+ // The optimization marker field contains a non-trivial value, and some
+ // action has to be taken. For example, perhaps tier-up has been requested
+ // and we need to kick off a compilation job; or optimized code is available
+ // and should be tail-called.
+ //
+ // Currently we delegate these tasks to the InterpreterEntryTrampoline.
+ // TODO(jgruber,v8:8888): Consider a dedicated builtin instead.
+
+ const int parameter_count =
+ StartNode{graph()->start()}.FormalParameterCount();
+ TNode<HeapObject> code =
+ __ HeapConstant(BUILTIN_CODE(isolate(), InterpreterEntryTrampoline));
+ Node* target = __ Parameter(Linkage::kJSCallClosureParamIndex);
+ Node* new_target =
+ __ Parameter(Linkage::GetJSCallNewTargetParamIndex(parameter_count));
+ Node* argc =
+ __ Parameter(Linkage::GetJSCallArgCountParamIndex(parameter_count));
+ Node* context =
+ __ Parameter(Linkage::GetJSCallContextParamIndex(parameter_count));
+
+ JSTrampolineDescriptor descriptor;
+ CallDescriptor::Flags flags = CallDescriptor::kFixedTargetRegister |
+ CallDescriptor::kIsTailCallForTierUp;
+ auto call_descriptor = Linkage::GetStubCallDescriptor(
+ graph()->zone(), descriptor, descriptor.GetStackParameterCount(), flags,
+ Operator::kNoProperties);
+ Node* nodes[] = {code, target, new_target, argc,
+ context, __ effect(), __ control()};
+
+#ifdef DEBUG
+ static constexpr int kCodeContextEffectControl = 4;
+ DCHECK_EQ(arraysize(nodes),
+ descriptor.GetParameterCount() + kCodeContextEffectControl);
+#endif // DEBUG
+
+ __ TailCall(call_descriptor, arraysize(nodes), nodes);
+
+ __ Bind(&fallthrough);
+}
+
+void EffectControlLinearizer::LowerUpdateInterruptBudget(Node* node) {
UpdateInterruptBudgetNode n(node);
TNode<FeedbackCell> feedback_cell = n.feedback_cell();
TNode<Int32T> budget = __ LoadField<Int32T>(
AccessBuilder::ForFeedbackCellInterruptBudget(), feedback_cell);
Node* new_budget = __ Int32Add(budget, __ Int32Constant(n.delta()));
+ __ StoreField(AccessBuilder::ForFeedbackCellInterruptBudget(), feedback_cell,
+ new_budget);
if (n.delta() < 0) {
auto next = __ MakeLabel();
auto if_budget_exhausted = __ MakeDeferredLabel();
@@ -3697,9 +3834,6 @@ Node* EffectControlLinearizer::LowerUpdateInterruptBudget(Node* node) {
__ Bind(&next);
}
- __ StoreField(AccessBuilder::ForFeedbackCellInterruptBudget(), feedback_cell,
- new_budget);
- return nullptr;
}
Node* EffectControlLinearizer::LowerToBoolean(Node* node) {
@@ -3716,6 +3850,14 @@ Node* EffectControlLinearizer::LowerToBoolean(Node* node) {
}
Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) {
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ return ChangeIntPtrToSmi(
+ __ Load(MachineType::Pointer(), __ LoadFramePointer(),
+ __ IntPtrConstant(StandardFrameConstants::kArgCOffset)));
+#else
+ auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned);
+ Node* frame = __ LoadFramePointer();
+
Node* arguments_frame = NodeProperties::GetValueInput(node, 0);
int formal_parameter_count = FormalParameterCountOf(node->op());
DCHECK_LE(0, formal_parameter_count);
@@ -3724,9 +3866,6 @@ Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) {
// We have to distinguish the case when there is an arguments adaptor frame
// (i.e., arguments_frame != LoadFramePointer()).
auto if_adaptor_frame = __ MakeLabel();
- auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned);
-
- Node* frame = __ LoadFramePointer();
__ GotoIf(__ TaggedEqual(arguments_frame, frame), &done,
__ SmiConstant(formal_parameter_count));
__ Goto(&if_adaptor_frame);
@@ -3736,24 +3875,30 @@ Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) {
MachineType::Pointer(), arguments_frame,
__ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset)));
__ Goto(&done, arguments_length);
-
__ Bind(&done);
return done.PhiAt(0);
+#endif
}
Node* EffectControlLinearizer::LowerRestLength(Node* node) {
- Node* arguments_frame = NodeProperties::GetValueInput(node, 0);
int formal_parameter_count = FormalParameterCountOf(node->op());
DCHECK_LE(0, formal_parameter_count);
+ auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned);
+ Node* frame = __ LoadFramePointer();
+
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ Node* arguments_length = ChangeIntPtrToSmi(
+ __ Load(MachineType::Pointer(), frame,
+ __ IntPtrConstant(StandardFrameConstants::kArgCOffset)));
+#else
+ Node* arguments_frame = NodeProperties::GetValueInput(node, 0);
+
// The RestLength node is computing the number of rest parameters,
// which is max(0, actual_parameter_count - formal_parameter_count).
// We have to distinguish the case, when there is an arguments adaptor frame
// (i.e., arguments_frame != LoadFramePointer()).
auto if_adaptor_frame = __ MakeLabel();
- auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned);
-
- Node* frame = __ LoadFramePointer();
__ GotoIf(__ TaggedEqual(arguments_frame, frame), &done, __ SmiConstant(0));
__ Goto(&if_adaptor_frame);
@@ -3761,6 +3906,7 @@ Node* EffectControlLinearizer::LowerRestLength(Node* node) {
Node* arguments_length = __ BitcastWordToTaggedSigned(__ Load(
MachineType::Pointer(), arguments_frame,
__ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset)));
+#endif
Node* rest_length =
__ SmiSub(arguments_length, __ SmiConstant(formal_parameter_count));
@@ -4019,7 +4165,11 @@ Node* EffectControlLinearizer::LowerNumberSameValue(Node* node) {
Node* EffectControlLinearizer::LowerDeadValue(Node* node) {
Node* input = NodeProperties::GetValueInput(node, 0);
if (input->opcode() != IrOpcode::kUnreachable) {
- Node* unreachable = __ Unreachable();
+ // There is no fundamental reason not to connect to end here, except it
+ // integrates into the way the graph is constructed in a simpler way at
+ // this point.
+ // TODO(jgruber): Connect to end here as well.
+ Node* unreachable = __ UnreachableWithoutConnectToEnd();
NodeProperties::ReplaceValueInput(node, unreachable, 0);
}
return gasm()->AddNode(node);
@@ -5104,8 +5254,8 @@ Node* EffectControlLinearizer::LowerFastApiCall(Node* node) {
}
builder.AddParam(MachineType::Pointer()); // has_error
- CallDescriptor* call_descriptor = Linkage::GetSimplifiedCDescriptor(
- graph()->zone(), builder.Build(), CallDescriptor::kNoFlags);
+ CallDescriptor* call_descriptor =
+ Linkage::GetSimplifiedCDescriptor(graph()->zone(), builder.Build());
call_descriptor->SetCFunctionInfo(c_signature);
@@ -5698,9 +5848,7 @@ void EffectControlLinearizer::LowerTransitionAndStoreNumberElement(Node* node) {
// loop peeling can break this assumption.
__ GotoIf(__ Word32Equal(kind, __ Int32Constant(HOLEY_DOUBLE_ELEMENTS)),
&do_store);
- // TODO(turbofan): It would be good to have an "Unreachable()" node type.
- __ DebugBreak();
- __ Goto(&do_store);
+ __ Unreachable(&do_store);
}
__ Bind(&transition_smi_array); // deferred code.
@@ -5878,7 +6026,7 @@ Node* EffectControlLinearizer::LowerAssertType(Node* node) {
Node* const min = __ NumberConstant(range->Min());
Node* const max = __ NumberConstant(range->Max());
CallBuiltin(Builtins::kCheckNumberInRange, node->op()->properties(), input,
- min, max);
+ min, max, __ SmiConstant(node->id()));
return input;
}
@@ -6438,6 +6586,13 @@ Node* EffectControlLinearizer::BuildIsStrongReference(Node* value) {
__ Int32Constant(kHeapObjectTag));
}
+Node* EffectControlLinearizer::MakeWeakForComparison(Node* heap_object) {
+ // TODO(gsathya): Specialize this for pointer compression.
+ return __ BitcastWordToTagged(
+ __ WordOr(__ BitcastTaggedToWord(heap_object),
+ __ IntPtrConstant(kWeakHeapObjectTag)));
+}
+
Node* EffectControlLinearizer::BuildStrongReferenceFromWeakReference(
Node* maybe_object) {
return __ BitcastWordToTagged(
diff --git a/deps/v8/src/compiler/escape-analysis-reducer.cc b/deps/v8/src/compiler/escape-analysis-reducer.cc
index b3c348c579..89a8d4e118 100644
--- a/deps/v8/src/compiler/escape-analysis-reducer.cc
+++ b/deps/v8/src/compiler/escape-analysis-reducer.cc
@@ -318,8 +318,13 @@ void EscapeAnalysisReducer::Finalize() {
#ifdef V8_REVERSE_JSARGS
Node* offset_to_first_elem = jsgraph()->Constant(
CommonFrameConstants::kFixedSlotCountAboveFp);
- NodeProperties::SetType(offset_to_first_elem,
- TypeCache::Get()->kArgumentsLengthType);
+ if (!NodeProperties::IsTyped(offset_to_first_elem)) {
+ NodeProperties::SetType(
+ offset_to_first_elem,
+ Type::Constant(CommonFrameConstants::kFixedSlotCountAboveFp,
+ jsgraph()->graph()->zone()));
+ }
+
Node* offset = jsgraph()->graph()->NewNode(
jsgraph()->simplified()->NumberAdd(), index,
offset_to_first_elem);
diff --git a/deps/v8/src/compiler/graph-assembler.cc b/deps/v8/src/compiler/graph-assembler.cc
index ae999b6615..975efedf0f 100644
--- a/deps/v8/src/compiler/graph-assembler.cc
+++ b/deps/v8/src/compiler/graph-assembler.cc
@@ -32,6 +32,7 @@ class GraphAssembler::BasicBlockUpdater {
void AddBranch(Node* branch, BasicBlock* tblock, BasicBlock* fblock);
void AddGoto(BasicBlock* to);
void AddGoto(BasicBlock* from, BasicBlock* to);
+ void AddTailCall(Node* node);
void StartBlock(BasicBlock* block);
BasicBlock* Finalize(BasicBlock* original);
@@ -267,6 +268,18 @@ void GraphAssembler::BasicBlockUpdater::AddGoto(BasicBlock* from,
current_block_ = nullptr;
}
+void GraphAssembler::BasicBlockUpdater::AddTailCall(Node* node) {
+ DCHECK_EQ(node->opcode(), IrOpcode::kTailCall);
+ DCHECK_NOT_NULL(current_block_);
+
+ if (state_ == kUnchanged) {
+ CopyForChange();
+ }
+
+ schedule_->AddTailCall(current_block_, node);
+ current_block_ = nullptr;
+}
+
void GraphAssembler::BasicBlockUpdater::UpdateSuccessors(BasicBlock* block) {
for (SuccessorInfo succ : saved_successors_) {
(succ.block->predecessors())[succ.index] = block;
@@ -316,12 +329,15 @@ BasicBlock* GraphAssembler::BasicBlockUpdater::Finalize(BasicBlock* original) {
return block;
}
-GraphAssembler::GraphAssembler(MachineGraph* mcgraph, Zone* zone,
- Schedule* schedule, bool mark_loop_exits)
+GraphAssembler::GraphAssembler(
+ MachineGraph* mcgraph, Zone* zone,
+ base::Optional<NodeChangedCallback> node_changed_callback,
+ Schedule* schedule, bool mark_loop_exits)
: temp_zone_(zone),
mcgraph_(mcgraph),
effect_(nullptr),
control_(nullptr),
+ node_changed_callback_(node_changed_callback),
block_updater_(schedule != nullptr
? new BasicBlockUpdater(schedule, mcgraph->graph(),
mcgraph->common(), zone)
@@ -380,6 +396,11 @@ Node* GraphAssembler::ExternalConstant(ExternalReference ref) {
return AddClonedNode(mcgraph()->ExternalConstant(ref));
}
+Node* GraphAssembler::Parameter(int index) {
+ return AddNode(
+ graph()->NewNode(common()->Parameter(index), graph()->start()));
+}
+
Node* JSGraphAssembler::CEntryStubConstant(int result_size) {
return AddClonedNode(jsgraph()->CEntryStubConstant(result_size));
}
@@ -624,7 +645,20 @@ Node* GraphAssembler::DebugBreak() {
graph()->NewNode(machine()->DebugBreak(), effect(), control()));
}
-Node* GraphAssembler::Unreachable() {
+Node* GraphAssembler::Unreachable(
+ GraphAssemblerLabel<0u>* block_updater_successor) {
+ Node* result = UnreachableWithoutConnectToEnd();
+ if (block_updater_ == nullptr) {
+ ConnectUnreachableToEnd();
+ InitializeEffectControl(nullptr, nullptr);
+ } else {
+ DCHECK_NOT_NULL(block_updater_successor);
+ Goto(block_updater_successor);
+ }
+ return result;
+}
+
+Node* GraphAssembler::UnreachableWithoutConnectToEnd() {
return AddNode(
graph()->NewNode(common()->Unreachable(), effect(), control()));
}
@@ -685,9 +719,9 @@ Node* GraphAssembler::UnsafePointerAdd(Node* base, Node* external) {
}
TNode<Number> JSGraphAssembler::PlainPrimitiveToNumber(TNode<Object> value) {
- return AddNode<Number>(graph()->NewNode(PlainPrimitiveToNumberOperator(),
- ToNumberBuiltinConstant(), value,
- NoContextConstant(), effect()));
+ return AddNode<Number>(graph()->NewNode(
+ PlainPrimitiveToNumberOperator(), PlainPrimitiveToNumberBuiltinConstant(),
+ value, effect()));
}
Node* GraphAssembler::BitcastWordToTaggedSigned(Node* value) {
@@ -768,6 +802,28 @@ TNode<Object> GraphAssembler::Call(const Operator* op, int inputs_size,
return AddNode<Object>(graph()->NewNode(op, inputs_size, inputs));
}
+void GraphAssembler::TailCall(const CallDescriptor* call_descriptor,
+ int inputs_size, Node** inputs) {
+#ifdef DEBUG
+ static constexpr int kTargetEffectControl = 3;
+ DCHECK_EQ(inputs_size,
+ call_descriptor->ParameterCount() + kTargetEffectControl);
+#endif // DEBUG
+
+ Node* node = AddNode(graph()->NewNode(common()->TailCall(call_descriptor),
+ inputs_size, inputs));
+
+ if (block_updater_) block_updater_->AddTailCall(node);
+
+ // Unlike ConnectUnreachableToEnd, the TailCall node terminates a block; to
+ // keep it live, it *must* be connected to End (also in Turboprop schedules).
+ NodeProperties::MergeControlToEnd(graph(), common(), node);
+
+ // Setting effect, control to nullptr effectively terminates the current block
+ // by disallowing the addition of new nodes until a new label has been bound.
+ InitializeEffectControl(nullptr, nullptr);
+}
+
void GraphAssembler::BranchWithCriticalSafetyCheck(
Node* condition, GraphAssemblerLabel<0u>* if_true,
GraphAssemblerLabel<0u>* if_false) {
@@ -860,10 +916,13 @@ void GraphAssembler::ConnectUnreachableToEnd() {
// to disconnect them from the graph, so we just leave the unreachable nodes
// in the schedule.
// TODO(9684): Add a scheduled dead-code elimination phase to remove all the
- // subsiquent unreacahble code from the schedule.
+ // subsequent unreachable code from the schedule.
if (!block_updater_) {
Node* throw_node = graph()->NewNode(common()->Throw(), effect(), control());
NodeProperties::MergeControlToEnd(graph(), common(), throw_node);
+ if (node_changed_callback_.has_value()) {
+ (*node_changed_callback_)(graph()->end());
+ }
effect_ = control_ = mcgraph()->Dead();
}
}
@@ -906,7 +965,8 @@ void GraphAssembler::InitializeEffectControl(Node* effect, Node* control) {
Operator const* JSGraphAssembler::PlainPrimitiveToNumberOperator() {
if (!to_number_operator_.is_set()) {
- Callable callable = Builtins::CallableFor(isolate(), Builtins::kToNumber);
+ Callable callable =
+ Builtins::CallableFor(isolate(), Builtins::kPlainPrimitiveToNumber);
CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
auto call_descriptor = Linkage::GetStubCallDescriptor(
graph()->zone(), callable.descriptor(),
diff --git a/deps/v8/src/compiler/graph-assembler.h b/deps/v8/src/compiler/graph-assembler.h
index 2b2dbb5d67..1be52317c0 100644
--- a/deps/v8/src/compiler/graph-assembler.h
+++ b/deps/v8/src/compiler/graph-assembler.h
@@ -91,6 +91,7 @@ class BasicBlock;
V(Word64Or) \
V(WordAnd) \
V(WordEqual) \
+ V(WordOr) \
V(WordSar) \
V(WordSarShiftOutZeros) \
V(WordShl) \
@@ -126,6 +127,7 @@ class BasicBlock;
V(One, Number) \
V(TheHole, Oddball) \
V(ToNumberBuiltin, Code) \
+ V(PlainPrimitiveToNumberBuiltin, Code) \
V(True, Boolean) \
V(Undefined, Oddball) \
V(Zero, Number)
@@ -182,12 +184,15 @@ class GraphAssemblerLabel {
const std::array<MachineRepresentation, VarCount> representations_;
};
+using NodeChangedCallback = std::function<void(Node*)>;
class V8_EXPORT_PRIVATE GraphAssembler {
public:
// Constructs a GraphAssembler. If {schedule} is not null, the graph assembler
// will maintain the schedule as it updates blocks.
- GraphAssembler(MachineGraph* jsgraph, Zone* zone,
- Schedule* schedule = nullptr, bool mark_loop_exits = false);
+ GraphAssembler(
+ MachineGraph* jsgraph, Zone* zone,
+ base::Optional<NodeChangedCallback> node_changed_callback = base::nullopt,
+ Schedule* schedule = nullptr, bool mark_loop_exits = false);
virtual ~GraphAssembler();
void Reset(BasicBlock* block);
@@ -239,6 +244,8 @@ class V8_EXPORT_PRIVATE GraphAssembler {
Node* Projection(int index, Node* value);
Node* ExternalConstant(ExternalReference ref);
+ Node* Parameter(int index);
+
Node* LoadFramePointer();
Node* LoadHeapNumberValue(Node* heap_number);
@@ -252,10 +259,20 @@ class V8_EXPORT_PRIVATE GraphAssembler {
CHECKED_ASSEMBLER_MACH_BINOP_LIST(BINOP_DECL)
#undef BINOP_DECL
- // Debugging
Node* DebugBreak();
- Node* Unreachable();
+ // Unreachable nodes are similar to Goto in that they reset effect/control to
+ // nullptr and it's thus not possible to append other nodes without first
+ // binding a new label.
+ // The block_updater_successor label is a crutch to work around block updater
+ // weaknesses (see the related comment in ConnectUnreachableToEnd); if the
+ // block updater exists, we cannot connect unreachable to end, instead we
+ // must preserve the Goto pattern.
+ Node* Unreachable(GraphAssemblerLabel<0u>* block_updater_successor = nullptr);
+ // This special variant doesn't connect the Unreachable node to end, and does
+ // not reset current effect/control. Intended only for special use-cases like
+ // lowering DeadValue.
+ Node* UnreachableWithoutConnectToEnd();
Node* IntPtrEqual(Node* left, Node* right);
Node* TaggedEqual(Node* left, Node* right);
@@ -315,6 +332,8 @@ class V8_EXPORT_PRIVATE GraphAssembler {
Args... args);
template <typename... Args>
TNode<Object> Call(const Operator* op, Node* first_arg, Args... args);
+ void TailCall(const CallDescriptor* call_descriptor, int inputs_size,
+ Node** inputs);
// Basic control operations.
template <size_t VarCount>
@@ -350,6 +369,13 @@ class V8_EXPORT_PRIVATE GraphAssembler {
void GotoIfNot(Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* label,
Vars...);
+ bool HasActiveBlock() const {
+ // This is false if the current block has been terminated (e.g. by a Goto or
+ // Unreachable). In that case, a new label must be bound before we can
+ // continue emitting nodes.
+ return control() != nullptr;
+ }
+
// Updates current effect and control based on outputs of {node}.
V8_INLINE void UpdateEffectControlWith(Node* node) {
if (node->op()->EffectOutputCount() > 0) {
@@ -375,8 +401,8 @@ class V8_EXPORT_PRIVATE GraphAssembler {
void ConnectUnreachableToEnd();
- Control control() { return Control(control_); }
- Effect effect() { return Effect(effect_); }
+ Control control() const { return Control(control_); }
+ Effect effect() const { return Effect(effect_); }
protected:
class BasicBlockUpdater;
@@ -485,6 +511,9 @@ class V8_EXPORT_PRIVATE GraphAssembler {
MachineGraph* mcgraph_;
Node* effect_;
Node* control_;
+ // {node_changed_callback_} should be called when a node outside the
+ // subgraph created by the graph assembler changes.
+ base::Optional<NodeChangedCallback> node_changed_callback_;
std::unique_ptr<BasicBlockUpdater> block_updater_;
// Track loop information in order to properly mark loop exits with
@@ -753,9 +782,12 @@ class V8_EXPORT_PRIVATE JSGraphAssembler : public GraphAssembler {
public:
// Constructs a JSGraphAssembler. If {schedule} is not null, the graph
// assembler will maintain the schedule as it updates blocks.
- JSGraphAssembler(JSGraph* jsgraph, Zone* zone, Schedule* schedule = nullptr,
- bool mark_loop_exits = false)
- : GraphAssembler(jsgraph, zone, schedule, mark_loop_exits),
+ JSGraphAssembler(
+ JSGraph* jsgraph, Zone* zone,
+ base::Optional<NodeChangedCallback> node_changed_callback = base::nullopt,
+ Schedule* schedule = nullptr, bool mark_loop_exits = false)
+ : GraphAssembler(jsgraph, zone, node_changed_callback, schedule,
+ mark_loop_exits),
jsgraph_(jsgraph) {}
Node* SmiConstant(int32_t value);
diff --git a/deps/v8/src/compiler/graph-reducer.cc b/deps/v8/src/compiler/graph-reducer.cc
index 17789a0432..155d6fa8ef 100644
--- a/deps/v8/src/compiler/graph-reducer.cc
+++ b/deps/v8/src/compiler/graph-reducer.cc
@@ -2,12 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "src/compiler/graph-reducer.h"
+
#include <functional>
#include <limits>
#include "src/codegen/tick-counter.h"
-#include "src/compiler/graph-reducer.h"
#include "src/compiler/graph.h"
+#include "src/compiler/js-heap-broker.h"
#include "src/compiler/node-properties.h"
#include "src/compiler/node.h"
#include "src/compiler/verifier.h"
@@ -27,14 +29,15 @@ enum class GraphReducer::State : uint8_t {
void Reducer::Finalize() {}
GraphReducer::GraphReducer(Zone* zone, Graph* graph, TickCounter* tick_counter,
- Node* dead)
+ JSHeapBroker* broker, Node* dead)
: graph_(graph),
dead_(dead),
state_(graph, 4),
reducers_(zone),
revisit_(zone),
stack_(zone),
- tick_counter_(tick_counter) {
+ tick_counter_(tick_counter),
+ broker_(broker) {
if (dead != nullptr) {
NodeProperties::SetType(dead_, Type::None());
}
@@ -94,6 +97,9 @@ Reduction GraphReducer::Reduce(Node* const node) {
// all the other reducers for this node, as now there may be more
// opportunities for reduction.
if (FLAG_trace_turbo_reduction) {
+ UnparkedScopeIfNeeded unparked(broker_);
+ // TODO(neis): Disallow racy handle dereference once we stop
+ // supporting --no-local-heaps --no-turbo-direct-heap-access.
AllowHandleDereference allow_deref;
StdoutStream{} << "- In-place update of #" << *node << " by reducer "
<< (*i)->reducer_name() << std::endl;
@@ -104,6 +110,9 @@ Reduction GraphReducer::Reduce(Node* const node) {
} else {
// {node} was replaced by another node.
if (FLAG_trace_turbo_reduction) {
+ UnparkedScopeIfNeeded unparked(broker_);
+ // TODO(neis): Disallow racy handle dereference once we stop
+ // supporting --no-local-heaps --no-turbo-direct-heap-access.
AllowHandleDereference allow_deref;
StdoutStream{} << "- Replacement of #" << *node << " with #"
<< *(reduction.replacement()) << " by reducer "
diff --git a/deps/v8/src/compiler/graph-reducer.h b/deps/v8/src/compiler/graph-reducer.h
index 3c15214d93..95454098d5 100644
--- a/deps/v8/src/compiler/graph-reducer.h
+++ b/deps/v8/src/compiler/graph-reducer.h
@@ -17,8 +17,8 @@ class TickCounter;
namespace compiler {
-// Forward declarations.
class Graph;
+class JSHeapBroker;
class Node;
// NodeIds are identifying numbers for nodes that can be used to index auxiliary
@@ -136,7 +136,7 @@ class V8_EXPORT_PRIVATE GraphReducer
: public NON_EXPORTED_BASE(AdvancedReducer::Editor) {
public:
GraphReducer(Zone* zone, Graph* graph, TickCounter* tick_counter,
- Node* dead = nullptr);
+ JSHeapBroker* broker, Node* dead = nullptr);
~GraphReducer() override;
Graph* graph() const { return graph_; }
@@ -189,6 +189,7 @@ class V8_EXPORT_PRIVATE GraphReducer
ZoneQueue<Node*> revisit_;
ZoneStack<NodeState> stack_;
TickCounter* const tick_counter_;
+ JSHeapBroker* const broker_;
DISALLOW_COPY_AND_ASSIGN(GraphReducer);
};
diff --git a/deps/v8/src/compiler/graph-visualizer.cc b/deps/v8/src/compiler/graph-visualizer.cc
index f767e9ea4d..36372f5d02 100644
--- a/deps/v8/src/compiler/graph-visualizer.cc
+++ b/deps/v8/src/compiler/graph-visualizer.cc
@@ -774,10 +774,7 @@ void GraphC1Visualizer::PrintLiveRange(const LiveRange* range, const char* type,
}
}
- // The toplevel range might be a splinter. Pre-resolve those here so that
- // they have a proper parent.
const TopLevelLiveRange* parent = range->TopLevel();
- if (parent->IsSplinter()) parent = parent->splintered_from();
os_ << " " << parent->vreg() << ":" << parent->relative_id();
// TODO(herhut) Find something useful to print for the hint field
diff --git a/deps/v8/src/compiler/heap-refs.h b/deps/v8/src/compiler/heap-refs.h
index 137f61cc49..f66b678632 100644
--- a/deps/v8/src/compiler/heap-refs.h
+++ b/deps/v8/src/compiler/heap-refs.h
@@ -10,6 +10,7 @@
#include "src/objects/elements-kind.h"
#include "src/objects/feedback-vector.h"
#include "src/objects/instance-type.h"
+#include "src/utils/boxed-float.h"
namespace v8 {
class CFunctionInfo;
@@ -48,56 +49,67 @@ enum class OddballType : uint8_t {
};
// This list is sorted such that subtypes appear before their supertypes.
+// This list must not contain a type if it doesn't contain all of its subtypes
+// too. For example, it CANNOT contain FixedArrayBase if it doesn't contain
+// FixedDoubleArray, BytecodeArray and FixedArray.
+// DO NOT VIOLATE THESE TWO PROPERTIES!
+// Classes on this list will skip serialization when
+// FLAG_turbo_direct_heap_access is on. Otherwise, they might get serialized.
+#define HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(V) \
+ /* Subtypes of FixedArray */ \
+ V(ObjectBoilerplateDescription) \
+ /* Subtypes of HeapObject */ \
+ V(AccessorInfo) \
+ V(ArrayBoilerplateDescription) \
+ V(Cell) \
+ V(TemplateObjectDescription)
+
+// This list is sorted such that subtypes appear before their supertypes.
// DO NOT VIOLATE THIS PROPERTY!
-#define HEAP_BROKER_OBJECT_LIST(V) \
- /* Subtypes of JSObject */ \
- V(JSArray) \
- V(JSBoundFunction) \
- V(JSDataView) \
- V(JSFunction) \
- V(JSGlobalObject) \
- V(JSGlobalProxy) \
- V(JSRegExp) \
- V(JSTypedArray) \
- /* Subtypes of Context */ \
- V(NativeContext) \
- /* Subtypes of FixedArray */ \
- V(Context) \
- V(ObjectBoilerplateDescription) \
- V(ScopeInfo) \
- V(ScriptContextTable) \
- /* Subtypes of FixedArrayBase */ \
- V(BytecodeArray) \
- V(FixedArray) \
- V(FixedDoubleArray) \
- /* Subtypes of Name */ \
- V(InternalizedString) \
- V(String) \
- V(Symbol) \
- /* Subtypes of JSReceiver */ \
- V(JSObject) \
- /* Subtypes of HeapObject */ \
- V(AccessorInfo) \
- V(AllocationSite) \
- V(ArrayBoilerplateDescription) \
- V(BigInt) \
- V(CallHandlerInfo) \
- V(Cell) \
- V(Code) \
- V(DescriptorArray) \
- V(FeedbackCell) \
- V(FeedbackVector) \
- V(FixedArrayBase) \
- V(FunctionTemplateInfo) \
- V(HeapNumber) \
- V(JSReceiver) \
- V(Map) \
- V(Name) \
- V(PropertyCell) \
- V(SharedFunctionInfo) \
- V(SourceTextModule) \
- V(TemplateObjectDescription) \
- /* Subtypes of Object */ \
+#define HEAP_BROKER_SERIALIZED_OBJECT_LIST(V) \
+ /* Subtypes of JSObject */ \
+ V(JSArray) \
+ V(JSBoundFunction) \
+ V(JSDataView) \
+ V(JSFunction) \
+ V(JSGlobalObject) \
+ V(JSGlobalProxy) \
+ V(JSRegExp) \
+ V(JSTypedArray) \
+ /* Subtypes of Context */ \
+ V(NativeContext) \
+ /* Subtypes of FixedArray */ \
+ V(Context) \
+ V(ScopeInfo) \
+ V(ScriptContextTable) \
+ /* Subtypes of FixedArrayBase */ \
+ V(BytecodeArray) \
+ V(FixedArray) \
+ V(FixedDoubleArray) \
+ /* Subtypes of Name */ \
+ V(InternalizedString) \
+ V(String) \
+ V(Symbol) \
+ /* Subtypes of JSReceiver */ \
+ V(JSObject) \
+ /* Subtypes of HeapObject */ \
+ V(AllocationSite) \
+ V(BigInt) \
+ V(CallHandlerInfo) \
+ V(Code) \
+ V(DescriptorArray) \
+ V(FeedbackCell) \
+ V(FeedbackVector) \
+ V(FixedArrayBase) \
+ V(FunctionTemplateInfo) \
+ V(HeapNumber) \
+ V(JSReceiver) \
+ V(Map) \
+ V(Name) \
+ V(PropertyCell) \
+ V(SharedFunctionInfo) \
+ V(SourceTextModule) \
+ /* Subtypes of Object */ \
V(HeapObject)
class CompilationDependencies;
@@ -107,7 +119,8 @@ class ObjectData;
class PerIsolateCompilerCache;
class PropertyAccessInfo;
#define FORWARD_DECL(Name) class Name##Ref;
-HEAP_BROKER_OBJECT_LIST(FORWARD_DECL)
+HEAP_BROKER_SERIALIZED_OBJECT_LIST(FORWARD_DECL)
+HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(FORWARD_DECL)
#undef FORWARD_DECL
class V8_EXPORT_PRIVATE ObjectRef {
@@ -127,11 +140,13 @@ class V8_EXPORT_PRIVATE ObjectRef {
int AsSmi() const;
#define HEAP_IS_METHOD_DECL(Name) bool Is##Name() const;
- HEAP_BROKER_OBJECT_LIST(HEAP_IS_METHOD_DECL)
+ HEAP_BROKER_SERIALIZED_OBJECT_LIST(HEAP_IS_METHOD_DECL)
+ HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(HEAP_IS_METHOD_DECL)
#undef HEAP_IS_METHOD_DECL
#define HEAP_AS_METHOD_DECL(Name) Name##Ref As##Name() const;
- HEAP_BROKER_OBJECT_LIST(HEAP_AS_METHOD_DECL)
+ HEAP_BROKER_SERIALIZED_OBJECT_LIST(HEAP_AS_METHOD_DECL)
+ HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(HEAP_AS_METHOD_DECL)
#undef HEAP_AS_METHOD_DECL
bool IsNullOrUndefined() const;
@@ -293,7 +308,6 @@ class JSDataViewRef : public JSObjectRef {
Handle<JSDataView> object() const;
size_t byte_length() const;
- size_t byte_offset() const;
};
class JSBoundFunctionRef : public JSObjectRef {
@@ -704,8 +718,7 @@ class FixedDoubleArrayRef : public FixedArrayBaseRef {
Handle<FixedDoubleArray> object() const;
- double get_scalar(int i) const;
- bool is_the_hole(int i) const;
+ Float64 get(int i) const;
};
class BytecodeArrayRef : public FixedArrayBaseRef {
@@ -722,8 +735,7 @@ class BytecodeArrayRef : public FixedArrayBaseRef {
uint8_t get(int index) const;
Address GetFirstBytecodeAddress() const;
- // Source position table.
- Handle<ByteArray> source_positions() const;
+ Handle<ByteArray> SourcePositionTable() const;
// Constant pool access.
Handle<Object> GetConstantAtIndex(int index) const;
@@ -877,8 +889,6 @@ class CellRef : public HeapObjectRef {
DEFINE_REF_CONSTRUCTOR(Cell, HeapObjectRef)
Handle<Cell> object() const;
-
- ObjectRef value() const;
};
class JSGlobalObjectRef : public JSObjectRef {
diff --git a/deps/v8/src/compiler/js-call-reducer.cc b/deps/v8/src/compiler/js-call-reducer.cc
index 0a48bcbcc6..94a6b3a7c7 100644
--- a/deps/v8/src/compiler/js-call-reducer.cc
+++ b/deps/v8/src/compiler/js-call-reducer.cc
@@ -51,10 +51,15 @@ class JSCallReducerAssembler : public JSGraphAssembler {
static constexpr bool kMarkLoopExits = true;
public:
- JSCallReducerAssembler(JSGraph* jsgraph, Zone* zone, Node* node)
- : JSGraphAssembler(jsgraph, zone, nullptr, kMarkLoopExits),
+ JSCallReducerAssembler(JSCallReducer* reducer, Node* node)
+ : JSGraphAssembler(
+ reducer->JSGraphForGraphAssembler(),
+ reducer->ZoneForGraphAssembler(),
+ [reducer](Node* n) { reducer->RevisitForGraphAssembler(n); },
+ nullptr, kMarkLoopExits),
node_(node),
- outermost_catch_scope_(CatchScope::Outermost(zone)),
+ outermost_catch_scope_(
+ CatchScope::Outermost(reducer->ZoneForGraphAssembler())),
catch_scope_(&outermost_catch_scope_) {
InitializeEffectControl(NodeProperties::GetEffectInput(node),
NodeProperties::GetControlInput(node));
@@ -143,11 +148,11 @@ class JSCallReducerAssembler : public JSGraphAssembler {
gasm_->Bind(&if_true);
if (then_body_) then_body_();
- gasm_->Goto(&merge);
+ if (gasm_->HasActiveBlock()) gasm_->Goto(&merge);
gasm_->Bind(&if_false);
if (else_body_) else_body_();
- gasm_->Goto(&merge);
+ if (gasm_->HasActiveBlock()) gasm_->Goto(&merge);
gasm_->Bind(&merge);
}
@@ -209,11 +214,13 @@ class JSCallReducerAssembler : public JSGraphAssembler {
gasm_->Bind(&if_true);
TNode<T> then_result = then_body_();
- gasm_->Goto(&merge, then_result);
+ if (gasm_->HasActiveBlock()) gasm_->Goto(&merge, then_result);
gasm_->Bind(&if_false);
TNode<T> else_result = else_body_();
- gasm_->Goto(&merge, else_result);
+ if (gasm_->HasActiveBlock()) {
+ gasm_->Goto(&merge, else_result);
+ }
gasm_->Bind(&merge);
return merge.PhiAt<T>(0);
@@ -658,9 +665,8 @@ enum class ArrayIndexOfIncludesVariant { kIncludes, kIndexOf };
// builtins.
class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler {
public:
- IteratingArrayBuiltinReducerAssembler(JSGraph* jsgraph, Zone* zone,
- Node* node)
- : JSCallReducerAssembler(jsgraph, zone, node) {
+ IteratingArrayBuiltinReducerAssembler(JSCallReducer* reducer, Node* node)
+ : JSCallReducerAssembler(reducer, node) {
DCHECK(FLAG_turbo_inline_array_builtins);
}
@@ -784,9 +790,9 @@ class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler {
class PromiseBuiltinReducerAssembler : public JSCallReducerAssembler {
public:
- PromiseBuiltinReducerAssembler(JSGraph* jsgraph, Zone* zone, Node* node,
+ PromiseBuiltinReducerAssembler(JSCallReducer* reducer, Node* node,
JSHeapBroker* broker)
- : JSCallReducerAssembler(jsgraph, zone, node), broker_(broker) {
+ : JSCallReducerAssembler(reducer, node), broker_(broker) {
DCHECK_EQ(IrOpcode::kJSConstruct, node->opcode());
}
@@ -876,12 +882,12 @@ class PromiseBuiltinReducerAssembler : public JSCallReducerAssembler {
class FastApiCallReducerAssembler : public JSCallReducerAssembler {
public:
FastApiCallReducerAssembler(
- JSGraph* jsgraph, Zone* zone, Node* node, Address c_function,
+ JSCallReducer* reducer, Node* node, Address c_function,
const CFunctionInfo* c_signature,
const FunctionTemplateInfoRef function_template_info, Node* receiver,
Node* holder, const SharedFunctionInfoRef shared, Node* target,
const int arity, Node* effect)
- : JSCallReducerAssembler(jsgraph, zone, node),
+ : JSCallReducerAssembler(reducer, node),
c_function_(c_function),
c_signature_(c_signature),
function_template_info_(function_template_info),
@@ -1420,7 +1426,6 @@ TNode<Object> IteratingArrayBuiltinReducerAssembler::ReduceArrayPrototypeReduce(
Bind(&continue_label);
});
Unreachable(); // The loop is exited either by deopt or a jump to below.
- InitializeEffectControl(nullptr, nullptr);
// TODO(jgruber): This manual fiddling with blocks could be avoided by
// implementing a `break` mechanic for loop builders.
@@ -2244,7 +2249,7 @@ Reduction JSCallReducer::ReduceMathUnary(Node* node, const Operator* op) {
return Replace(value);
}
- JSCallReducerAssembler a(jsgraph(), temp_zone(), node);
+ JSCallReducerAssembler a(this, node);
Node* subgraph = a.ReduceMathUnary(op);
return ReplaceWithSubgraph(&a, subgraph);
}
@@ -2261,7 +2266,7 @@ Reduction JSCallReducer::ReduceMathBinary(Node* node, const Operator* op) {
return Replace(value);
}
- JSCallReducerAssembler a(jsgraph(), temp_zone(), node);
+ JSCallReducerAssembler a(this, node);
Node* subgraph = a.ReduceMathBinary(op);
return ReplaceWithSubgraph(&a, subgraph);
}
@@ -3283,7 +3288,7 @@ Reduction JSCallReducer::ReduceArrayForEach(
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeForEach(
h.inference(), h.has_stability_dependency(), h.elements_kind(), shared);
@@ -3296,7 +3301,7 @@ Reduction JSCallReducer::ReduceArrayReduce(
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeReduce(
h.inference(), h.has_stability_dependency(), h.elements_kind(),
@@ -3310,7 +3315,7 @@ Reduction JSCallReducer::ReduceArrayReduceRight(
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeReduce(
h.inference(), h.has_stability_dependency(), h.elements_kind(),
@@ -3329,7 +3334,7 @@ Reduction JSCallReducer::ReduceArrayMap(Node* node,
return h.inference()->NoChange();
}
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph =
@@ -3349,7 +3354,7 @@ Reduction JSCallReducer::ReduceArrayFilter(
return h.inference()->NoChange();
}
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph =
@@ -3364,7 +3369,7 @@ Reduction JSCallReducer::ReduceArrayFind(Node* node,
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeFind(
@@ -3379,7 +3384,7 @@ Reduction JSCallReducer::ReduceArrayFindIndex(
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeFind(
@@ -3394,7 +3399,7 @@ Reduction JSCallReducer::ReduceArrayEvery(Node* node,
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeEverySome(
@@ -3410,7 +3415,7 @@ Reduction JSCallReducer::ReduceArrayIncludes(Node* node) {
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeIndexOfIncludes(
@@ -3425,7 +3430,7 @@ Reduction JSCallReducer::ReduceArrayIndexOf(Node* node) {
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeIndexOfIncludes(
@@ -3439,7 +3444,7 @@ Reduction JSCallReducer::ReduceArraySome(Node* node,
IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies());
if (!h.can_reduce()) return h.inference()->NoChange();
- IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node);
+ IteratingArrayBuiltinReducerAssembler a(this, node);
a.InitializeEffectControl(h.effect(), h.control());
TNode<Object> subgraph = a.ReduceArrayPrototypeEverySome(
@@ -3623,9 +3628,9 @@ Reduction JSCallReducer::ReduceCallApiFunction(
if (FLAG_turbo_fast_api_calls && c_function != kNullAddress) {
const CFunctionInfo* c_signature = function_template_info.c_signature();
- FastApiCallReducerAssembler a(jsgraph(), graph()->zone(), node, c_function,
- c_signature, function_template_info, receiver,
- holder, shared, target, argc, effect);
+ FastApiCallReducerAssembler a(this, node, c_function, c_signature,
+ function_template_info, receiver, holder,
+ shared, target, argc, effect);
Node* fast_call_subgraph = a.ReduceFastApiCall();
ReplaceWithSubgraph(&a, fast_call_subgraph);
@@ -4804,7 +4809,7 @@ Reduction JSCallReducer::ReduceStringPrototypeSubstring(Node* node) {
return NoChange();
}
- JSCallReducerAssembler a(jsgraph(), temp_zone(), node);
+ JSCallReducerAssembler a(this, node);
Node* subgraph = a.ReduceStringPrototypeSubstring();
return ReplaceWithSubgraph(&a, subgraph);
}
@@ -4818,7 +4823,7 @@ Reduction JSCallReducer::ReduceStringPrototypeSlice(Node* node) {
return NoChange();
}
- JSCallReducerAssembler a(jsgraph(), temp_zone(), node);
+ JSCallReducerAssembler a(this, node);
Node* subgraph = a.ReduceStringPrototypeSlice();
return ReplaceWithSubgraph(&a, subgraph);
}
@@ -6316,7 +6321,7 @@ Reduction JSCallReducer::ReducePromiseConstructor(Node* node) {
if (broker()->is_native_context_independent()) return NoChange();
DisallowHeapAccessIf no_heap_access(should_disallow_heap_access());
- PromiseBuiltinReducerAssembler a(jsgraph(), temp_zone(), node, broker());
+ PromiseBuiltinReducerAssembler a(this, node, broker());
// We only inline when we have the executor.
if (a.ConstructArity() < 1) return NoChange();
@@ -7322,11 +7327,11 @@ Reduction JSCallReducer::ReduceDataViewAccess(Node* node, DataViewAccess access,
// We only deal with DataViews here whose [[ByteLength]] is at least
// {element_size}, as for all other DataViews it'll be out-of-bounds.
JSDataViewRef dataview = m.Ref(broker()).AsJSDataView();
- if (dataview.byte_length() < element_size) return NoChange();
+ size_t length = dataview.byte_length();
+ if (length < element_size) return NoChange();
- // Check that the {offset} is within range of the {byte_length}.
- Node* byte_length =
- jsgraph()->Constant(dataview.byte_length() - (element_size - 1));
+ // Check that the {offset} is within range of the {length}.
+ Node* byte_length = jsgraph()->Constant(length - (element_size - 1));
offset = effect = graph()->NewNode(simplified()->CheckBounds(p.feedback()),
offset, byte_length, effect, control);
} else {
diff --git a/deps/v8/src/compiler/js-call-reducer.h b/deps/v8/src/compiler/js-call-reducer.h
index 139ef7dfa4..fe5af04aa8 100644
--- a/deps/v8/src/compiler/js-call-reducer.h
+++ b/deps/v8/src/compiler/js-call-reducer.h
@@ -64,6 +64,11 @@ class V8_EXPORT_PRIVATE JSCallReducer final : public AdvancedReducer {
// and does a final attempt to reduce the nodes in the waitlist.
void Finalize() final;
+ // JSCallReducer outsources much work to a graph assembler.
+ void RevisitForGraphAssembler(Node* node) { Revisit(node); }
+ Zone* ZoneForGraphAssembler() const { return temp_zone(); }
+ JSGraph* JSGraphForGraphAssembler() const { return jsgraph(); }
+
private:
Reduction ReduceBooleanConstructor(Node* node);
Reduction ReduceCallApiFunction(Node* node,
diff --git a/deps/v8/src/compiler/js-create-lowering.cc b/deps/v8/src/compiler/js-create-lowering.cc
index 9fe968825f..1f3169fad3 100644
--- a/deps/v8/src/compiler/js-create-lowering.cc
+++ b/deps/v8/src/compiler/js-create-lowering.cc
@@ -28,7 +28,7 @@
#include "src/objects/js-regexp-inl.h"
#include "src/objects/objects-inl.h"
#include "src/objects/template-objects.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
@@ -1770,10 +1770,11 @@ Node* JSCreateLowering::AllocateFastLiteralElements(Node* effect, Node* control,
if (elements_map.instance_type() == FIXED_DOUBLE_ARRAY_TYPE) {
FixedDoubleArrayRef elements = boilerplate_elements.AsFixedDoubleArray();
for (int i = 0; i < elements_length; ++i) {
- if (elements.is_the_hole(i)) {
+ Float64 value = elements.get(i);
+ if (value.is_hole_nan()) {
elements_values[i] = jsgraph()->TheHoleConstant();
} else {
- elements_values[i] = jsgraph()->Constant(elements.get_scalar(i));
+ elements_values[i] = jsgraph()->Constant(value.get_scalar());
}
}
} else {
diff --git a/deps/v8/src/compiler/js-generic-lowering.cc b/deps/v8/src/compiler/js-generic-lowering.cc
index 0950248087..81bafa6183 100644
--- a/deps/v8/src/compiler/js-generic-lowering.cc
+++ b/deps/v8/src/compiler/js-generic-lowering.cc
@@ -315,6 +315,13 @@ void JSGenericLowering::LowerJSLoadNamed(Node* node) {
}
}
+void JSGenericLowering::LowerJSLoadNamedFromSuper(Node* node) {
+ JSLoadNamedFromSuperNode n(node);
+ NamedAccess const& p = n.Parameters();
+ node->InsertInput(zone(), 2, jsgraph()->HeapConstant(p.name()));
+ ReplaceWithRuntimeCall(node, Runtime::kLoadFromSuper);
+}
+
void JSGenericLowering::LowerJSLoadGlobal(Node* node) {
JSLoadGlobalNode n(node);
const LoadGlobalParameters& p = n.Parameters();
@@ -522,9 +529,14 @@ void JSGenericLowering::LowerJSCreateArguments(Node* node) {
void JSGenericLowering::LowerJSCreateArray(Node* node) {
CreateArrayParameters const& p = CreateArrayParametersOf(node->op());
int const arity = static_cast<int>(p.arity());
+ auto interface_descriptor = ArrayConstructorDescriptor{};
auto call_descriptor = Linkage::GetStubCallDescriptor(
- zone(), ArrayConstructorDescriptor{}, arity + 1,
- CallDescriptor::kNeedsFrameState, node->op()->properties());
+ zone(), interface_descriptor, arity + 1, CallDescriptor::kNeedsFrameState,
+ node->op()->properties());
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(interface_descriptor.GetStackParameterCount(), 0);
Node* stub_code = jsgraph()->ArrayConstructorStubConstant();
Node* stub_arity = jsgraph()->Int32Constant(arity);
MaybeHandle<AllocationSite> const maybe_site = p.site();
@@ -773,6 +785,10 @@ void JSGenericLowering::LowerJSConstructForwardVarargs(Node* node) {
int const arg_count = static_cast<int>(p.arity() - 2);
CallDescriptor::Flags flags = FrameStateFlagForCall(node);
Callable callable = CodeFactory::ConstructForwardVarargs(isolate());
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), arg_count + 1, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
@@ -801,12 +817,20 @@ void JSGenericLowering::LowerJSConstruct(Node* node) {
arg_count + kReceiver + kMaybeFeedbackVector;
Callable callable =
Builtins::CallableFor(isolate(), Builtins::kConstruct_WithFeedback);
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(),
+ kMaybeFeedbackVector);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
Node* stub_arity = jsgraph()->Int32Constant(arg_count);
Node* slot = jsgraph()->Int32Constant(p.feedback().index());
Node* receiver = jsgraph()->UndefinedConstant();
+#ifdef V8_REVERSE_JSARGS
+ Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex());
+#endif
// Register argument inputs are followed by stack argument inputs (such as
// feedback_vector). Both are listed in ascending order. Note that
// the receiver is implicitly placed on the stack and is thus inserted
@@ -815,10 +839,16 @@ void JSGenericLowering::LowerJSConstruct(Node* node) {
node->InsertInput(zone(), 0, stub_code);
node->InsertInput(zone(), 3, stub_arity);
node->InsertInput(zone(), 4, slot);
+#ifdef V8_REVERSE_JSARGS
+ node->InsertInput(zone(), 5, feedback_vector);
+ node->InsertInput(zone(), 6, receiver);
+ // After: {code, target, new_target, arity, slot, vector, receiver,
+ // ...args}.
+#else
node->InsertInput(zone(), 5, receiver);
-
// After: {code, target, new_target, arity, slot, receiver, ...args,
// vector}.
+#endif
NodeProperties::ChangeOp(node, common()->Call(call_descriptor));
} else {
@@ -857,12 +887,19 @@ void JSGenericLowering::LowerJSConstructWithArrayLike(Node* node) {
arg_count - kArgumentList + kReceiver + kMaybeFeedbackVector;
Callable callable = Builtins::CallableFor(
isolate(), Builtins::kConstructWithArrayLike_WithFeedback);
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(),
+ kMaybeFeedbackVector);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
Node* receiver = jsgraph()->UndefinedConstant();
Node* slot = jsgraph()->Int32Constant(p.feedback().index());
-
+#ifdef V8_REVERSE_JSARGS
+ Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex());
+#endif
// Register argument inputs are followed by stack argument inputs (such as
// feedback_vector). Both are listed in ascending order. Note that
// the receiver is implicitly placed on the stack and is thus inserted
@@ -870,16 +907,26 @@ void JSGenericLowering::LowerJSConstructWithArrayLike(Node* node) {
// TODO(jgruber): Implement a simpler way to specify these mutations.
node->InsertInput(zone(), 0, stub_code);
node->InsertInput(zone(), 4, slot);
+#ifdef V8_REVERSE_JSARGS
+ node->InsertInput(zone(), 5, feedback_vector);
+ node->InsertInput(zone(), 6, receiver);
+ // After: {code, target, new_target, arguments_list, slot, vector,
+ // receiver}.
+#else
node->InsertInput(zone(), 5, receiver);
-
// After: {code, target, new_target, arguments_list, slot, receiver,
// vector}.
+#endif
NodeProperties::ChangeOp(node, common()->Call(call_descriptor));
} else {
const int stack_argument_count = arg_count - kArgumentList + kReceiver;
Callable callable =
Builtins::CallableFor(isolate(), Builtins::kConstructWithArrayLike);
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
@@ -911,6 +958,11 @@ void JSGenericLowering::LowerJSConstructWithSpread(Node* node) {
arg_count + kReceiver + kMaybeFeedbackVector;
Callable callable = Builtins::CallableFor(
isolate(), Builtins::kConstructWithSpread_WithFeedback);
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(),
+ kTheSpread + kMaybeFeedbackVector);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
@@ -920,6 +972,10 @@ void JSGenericLowering::LowerJSConstructWithSpread(Node* node) {
// on the stack here.
Node* stub_arity = jsgraph()->Int32Constant(arg_count - kTheSpread);
Node* receiver = jsgraph()->UndefinedConstant();
+#ifdef V8_REVERSE_JSARGS
+ Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex());
+ Node* spread = node->RemoveInput(n.LastArgumentIndex());
+#endif
// Register argument inputs are followed by stack argument inputs (such as
// feedback_vector). Both are listed in ascending order. Note that
@@ -929,15 +985,26 @@ void JSGenericLowering::LowerJSConstructWithSpread(Node* node) {
node->InsertInput(zone(), 0, stub_code);
node->InsertInput(zone(), 3, stub_arity);
node->InsertInput(zone(), 4, slot);
+#ifdef V8_REVERSE_JSARGS
+ node->InsertInput(zone(), 5, spread);
+ node->InsertInput(zone(), 6, feedback_vector);
+ node->InsertInput(zone(), 7, receiver);
+ // After: {code, target, new_target, arity, slot, spread, vector, receiver,
+ // ...args}.
+#else
node->InsertInput(zone(), 5, receiver);
-
// After: {code, target, new_target, arity, slot, receiver, ...args, spread,
// vector}.
+#endif
NodeProperties::ChangeOp(node, common()->Call(call_descriptor));
} else {
const int stack_argument_count = arg_count + kReceiver - kTheSpread;
Callable callable = CodeFactory::ConstructWithSpread(isolate());
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
@@ -1091,6 +1158,11 @@ void JSGenericLowering::LowerJSCallWithSpread(Node* node) {
arg_count - kTheSpread + kReceiver + kMaybeFeedbackVector;
Callable callable = Builtins::CallableFor(
isolate(), Builtins::kCallWithSpread_WithFeedback);
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(),
+ kMaybeFeedbackVector);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
@@ -1107,22 +1179,29 @@ void JSGenericLowering::LowerJSCallWithSpread(Node* node) {
// Shuffling inputs.
// Before: {target, receiver, ...args, spread, vector}.
-
+#ifdef V8_REVERSE_JSARGS
+ Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex());
+#endif
Node* spread = node->RemoveInput(n.LastArgumentIndex());
-
- // Now: {target, receiver, ...args, vector}.
-
node->InsertInput(zone(), 0, stub_code);
node->InsertInput(zone(), 2, stub_arity);
node->InsertInput(zone(), 3, spread);
node->InsertInput(zone(), 4, slot);
-
+#ifdef V8_REVERSE_JSARGS
+ node->InsertInput(zone(), 5, feedback_vector);
+ // After: {code, target, arity, spread, slot, vector, receiver, ...args}.
+#else
// After: {code, target, arity, spread, slot, receiver, ...args, vector}.
+#endif
NodeProperties::ChangeOp(node, common()->Call(call_descriptor));
} else {
const int stack_argument_count = arg_count - kTheSpread + kReceiver;
Callable callable = CodeFactory::CallWithSpread(isolate());
+ // If this fails, we might need to update the parameter reordering code
+ // to ensure that the additional arguments passed via stack are pushed
+ // between top of stack and JS arguments.
+ DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0);
auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), callable.descriptor(), stack_argument_count, flags);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
diff --git a/deps/v8/src/compiler/js-graph.cc b/deps/v8/src/compiler/js-graph.cc
index 6b8d9761ff..120f8ee21d 100644
--- a/deps/v8/src/compiler/js-graph.cc
+++ b/deps/v8/src/compiler/js-graph.cc
@@ -129,6 +129,9 @@ DEFINE_GETTER(BooleanMapConstant, HeapConstant(factory()->boolean_map()))
DEFINE_GETTER(ToNumberBuiltinConstant,
HeapConstant(BUILTIN_CODE(isolate(), ToNumber)))
+DEFINE_GETTER(PlainPrimitiveToNumberBuiltinConstant,
+ HeapConstant(BUILTIN_CODE(isolate(), PlainPrimitiveToNumber)))
+
DEFINE_GETTER(EmptyFixedArrayConstant,
HeapConstant(factory()->empty_fixed_array()))
diff --git a/deps/v8/src/compiler/js-graph.h b/deps/v8/src/compiler/js-graph.h
index b055f399df..a17b615b3b 100644
--- a/deps/v8/src/compiler/js-graph.h
+++ b/deps/v8/src/compiler/js-graph.h
@@ -85,6 +85,7 @@ class V8_EXPORT_PRIVATE JSGraph : public MachineGraph {
V(BigIntMapConstant) \
V(BooleanMapConstant) \
V(ToNumberBuiltinConstant) \
+ V(PlainPrimitiveToNumberBuiltinConstant) \
V(EmptyFixedArrayConstant) \
V(EmptyStringConstant) \
V(FixedArrayMapConstant) \
diff --git a/deps/v8/src/compiler/js-heap-broker.cc b/deps/v8/src/compiler/js-heap-broker.cc
index 123297bc73..be05929bbc 100644
--- a/deps/v8/src/compiler/js-heap-broker.cc
+++ b/deps/v8/src/compiler/js-heap-broker.cc
@@ -34,7 +34,6 @@
#include "src/objects/objects-inl.h"
#include "src/objects/template-objects-inl.h"
#include "src/objects/templates.h"
-#include "src/utils/boxed-float.h"
#include "src/utils/utils.h"
namespace v8 {
@@ -45,7 +44,10 @@ namespace compiler {
#define TRACE_MISSING(broker, x) TRACE_BROKER_MISSING(broker, x)
#define FORWARD_DECL(Name) class Name##Data;
-HEAP_BROKER_OBJECT_LIST(FORWARD_DECL)
+HEAP_BROKER_SERIALIZED_OBJECT_LIST(FORWARD_DECL)
+// TODO(solanes, v8:10866): Remove once FLAG_turbo_direct_heap_access is
+// removed.
+HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(FORWARD_DECL)
#undef FORWARD_DECL
// There are three kinds of ObjectData values.
@@ -71,15 +73,19 @@ enum ObjectDataKind {
kSmi,
kSerializedHeapObject,
kUnserializedHeapObject,
+ kNeverSerializedHeapObject,
kUnserializedReadOnlyHeapObject
};
-class AllowHandleAllocationIf {
+class AllowHandleAllocationIfNeeded {
public:
- explicit AllowHandleAllocationIf(ObjectDataKind kind,
- JSHeapBroker::BrokerMode mode) {
+ explicit AllowHandleAllocationIfNeeded(ObjectDataKind kind,
+ JSHeapBroker::BrokerMode mode,
+ bool direct_heap_access = false) {
DCHECK_IMPLIES(mode == JSHeapBroker::BrokerMode::kSerialized,
- kind == kUnserializedReadOnlyHeapObject);
+ kind == kUnserializedReadOnlyHeapObject ||
+ kind == kNeverSerializedHeapObject ||
+ (direct_heap_access && kind == kSerializedHeapObject));
if (kind == kUnserializedHeapObject) maybe_allow_handle_.emplace();
}
@@ -87,31 +93,33 @@ class AllowHandleAllocationIf {
base::Optional<AllowHandleAllocation> maybe_allow_handle_;
};
-class AllowHandleDereferenceIf {
+class AllowHandleDereferenceIfNeeded {
public:
- explicit AllowHandleDereferenceIf(ObjectDataKind kind,
- JSHeapBroker::BrokerMode mode) {
+ explicit AllowHandleDereferenceIfNeeded(ObjectDataKind kind,
+ JSHeapBroker::BrokerMode mode,
+ bool direct_heap_access = false)
+ : AllowHandleDereferenceIfNeeded(kind) {
DCHECK_IMPLIES(mode == JSHeapBroker::BrokerMode::kSerialized,
- kind == kUnserializedReadOnlyHeapObject);
- if (kind == kUnserializedHeapObject ||
- kind == kUnserializedReadOnlyHeapObject)
- maybe_allow_handle_.emplace();
+ kind == kUnserializedReadOnlyHeapObject ||
+ kind == kNeverSerializedHeapObject ||
+ (direct_heap_access && kind == kSerializedHeapObject));
}
- explicit AllowHandleDereferenceIf(ObjectDataKind kind) {
+ explicit AllowHandleDereferenceIfNeeded(ObjectDataKind kind) {
if (kind == kUnserializedHeapObject ||
- kind == kUnserializedReadOnlyHeapObject)
+ kind == kUnserializedReadOnlyHeapObject) {
maybe_allow_handle_.emplace();
+ }
}
private:
base::Optional<AllowHandleDereference> maybe_allow_handle_;
};
-class AllowHeapAllocationIf {
+class AllowHeapAllocationIfNeeded {
public:
- explicit AllowHeapAllocationIf(ObjectDataKind kind,
- JSHeapBroker::BrokerMode mode) {
+ explicit AllowHeapAllocationIfNeeded(ObjectDataKind kind,
+ JSHeapBroker::BrokerMode mode) {
DCHECK_IMPLIES(mode == JSHeapBroker::BrokerMode::kSerialized,
kind == kUnserializedReadOnlyHeapObject);
if (kind == kUnserializedHeapObject) maybe_allow_handle_.emplace();
@@ -154,20 +162,29 @@ class ObjectData : public ZoneObject {
broker->mode() == JSHeapBroker::kSerializing,
broker->isolate()->handle_scope_data()->canonical_scope != nullptr);
CHECK_IMPLIES(broker->mode() == JSHeapBroker::kSerialized,
- IsReadOnlyHeapObject(*object));
+ (kind == kUnserializedReadOnlyHeapObject &&
+ IsReadOnlyHeapObject(*object)) ||
+ kind == kNeverSerializedHeapObject);
}
-#define DECLARE_IS_AND_AS(Name) \
- bool Is##Name() const; \
- Name##Data* As##Name();
- HEAP_BROKER_OBJECT_LIST(DECLARE_IS_AND_AS)
-#undef DECLARE_IS_AND_AS
+#define DECLARE_IS(Name) bool Is##Name() const;
+ HEAP_BROKER_SERIALIZED_OBJECT_LIST(DECLARE_IS)
+ HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DECLARE_IS)
+#undef DECLARE_IS
+
+#define DECLARE_AS(Name) Name##Data* As##Name();
+ HEAP_BROKER_SERIALIZED_OBJECT_LIST(DECLARE_AS)
+ // TODO(solanes, v8:10866): Remove once FLAG_turbo_direct_heap_access is
+ // removed.
+ HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DECLARE_AS)
+#undef DECLARE_AS
Handle<Object> object() const { return object_; }
ObjectDataKind kind() const { return kind_; }
bool is_smi() const { return kind_ == kSmi; }
bool should_access_heap() const {
return kind_ == kUnserializedHeapObject ||
+ kind_ == kNeverSerializedHeapObject ||
kind_ == kUnserializedReadOnlyHeapObject;
}
@@ -216,7 +233,7 @@ class PropertyCellData : public HeapObjectData {
// TODO(mslekova): Once we have real-world usage data, we might want to
// reimplement this as sorted vector instead, to reduce the memory overhead.
-typedef ZoneMap<MapData*, HolderLookupResult> KnownReceiversMap;
+typedef ZoneMap<ObjectData*, HolderLookupResult> KnownReceiversMap;
class FunctionTemplateInfoData : public HeapObjectData {
public:
@@ -228,7 +245,7 @@ class FunctionTemplateInfoData : public HeapObjectData {
bool has_call_code() const { return has_call_code_; }
void SerializeCallCode(JSHeapBroker* broker);
- CallHandlerInfoData* call_code() const { return call_code_; }
+ ObjectData* call_code() const { return call_code_; }
Address c_function() const { return c_function_; }
const CFunctionInfo* c_signature() const { return c_signature_; }
KnownReceiversMap& known_receivers() { return known_receivers_; }
@@ -238,7 +255,7 @@ class FunctionTemplateInfoData : public HeapObjectData {
bool accept_any_receiver_ = false;
bool has_call_code_ = false;
- CallHandlerInfoData* call_code_ = nullptr;
+ ObjectData* call_code_ = nullptr;
const Address c_function_;
const CFunctionInfo* const c_signature_;
KnownReceiversMap known_receivers_;
@@ -310,9 +327,10 @@ void FunctionTemplateInfoData::SerializeCallCode(JSHeapBroker* broker) {
TraceScope tracer(broker, this,
"FunctionTemplateInfoData::SerializeCallCode");
auto function_template_info = Handle<FunctionTemplateInfo>::cast(object());
- call_code_ = broker->GetOrCreateData(function_template_info->call_code())
- ->AsCallHandlerInfo();
- call_code_->Serialize(broker);
+ call_code_ = broker->GetOrCreateData(function_template_info->call_code());
+ if (!call_code_->should_access_heap()) {
+ call_code_->AsCallHandlerInfo()->Serialize(broker);
+ }
}
void CallHandlerInfoData::Serialize(JSHeapBroker* broker) {
@@ -451,7 +469,8 @@ base::Optional<ObjectRef> GetOwnElementFromHeap(JSHeapBroker* broker,
LookupIterator it(broker->isolate(), receiver, index, LookupIterator::OWN);
if (it.state() == LookupIterator::DATA &&
(!constant_only || (it.IsReadOnly() && !it.IsConfigurable()))) {
- return ObjectRef(broker, it.GetDataValue());
+ return ObjectRef(broker,
+ broker->CanonicalPersistentHandle(it.GetDataValue()));
}
return base::nullopt;
}
@@ -519,7 +538,7 @@ class JSTypedArrayData : public JSObjectData {
void Serialize(JSHeapBroker* broker);
bool serialized() const { return serialized_; }
- HeapObjectData* buffer() const { return buffer_; }
+ ObjectData* buffer() const { return buffer_; }
private:
bool const is_on_heap_;
@@ -527,7 +546,7 @@ class JSTypedArrayData : public JSObjectData {
void* const data_ptr_;
bool serialized_ = false;
- HeapObjectData* buffer_ = nullptr;
+ ObjectData* buffer_ = nullptr;
};
JSTypedArrayData::JSTypedArrayData(JSHeapBroker* broker, ObjectData** storage,
@@ -546,7 +565,7 @@ void JSTypedArrayData::Serialize(JSHeapBroker* broker) {
if (!is_on_heap()) {
DCHECK_NULL(buffer_);
- buffer_ = broker->GetOrCreateData(typed_array->buffer())->AsHeapObject();
+ buffer_ = broker->GetOrCreateData(typed_array->buffer());
}
}
@@ -555,7 +574,9 @@ class ArrayBoilerplateDescriptionData : public HeapObjectData {
ArrayBoilerplateDescriptionData(JSHeapBroker* broker, ObjectData** storage,
Handle<ArrayBoilerplateDescription> object)
: HeapObjectData(broker, storage, object),
- constants_elements_length_(object->constant_elements().length()) {}
+ constants_elements_length_(object->constant_elements().length()) {
+ DCHECK(!FLAG_turbo_direct_heap_access);
+ }
int constants_elements_length() const { return constants_elements_length_; }
@@ -567,7 +588,9 @@ class ObjectBoilerplateDescriptionData : public HeapObjectData {
public:
ObjectBoilerplateDescriptionData(JSHeapBroker* broker, ObjectData** storage,
Handle<ObjectBoilerplateDescription> object)
- : HeapObjectData(broker, storage, object), size_(object->size()) {}
+ : HeapObjectData(broker, storage, object), size_(object->size()) {
+ DCHECK(!FLAG_turbo_direct_heap_access);
+ }
int size() const { return size_; }
@@ -581,11 +604,9 @@ class JSDataViewData : public JSObjectData {
Handle<JSDataView> object);
size_t byte_length() const { return byte_length_; }
- size_t byte_offset() const { return byte_offset_; }
private:
size_t const byte_length_;
- size_t const byte_offset_;
};
class JSBoundFunctionData : public JSObjectData {
@@ -624,13 +645,13 @@ class JSFunctionData : public JSObjectData {
void Serialize(JSHeapBroker* broker);
bool serialized() const { return serialized_; }
- ContextData* context() const { return context_; }
- NativeContextData* native_context() const { return native_context_; }
+ ObjectData* context() const { return context_; }
+ ObjectData* native_context() const { return native_context_; }
ObjectData* initial_map() const { return initial_map_; }
ObjectData* prototype() const { return prototype_; }
- SharedFunctionInfoData* shared() const { return shared_; }
- FeedbackVectorData* feedback_vector() const { return feedback_vector_; }
- CodeData* code() const { return code_; }
+ ObjectData* shared() const { return shared_; }
+ ObjectData* feedback_vector() const { return feedback_vector_; }
+ ObjectData* code() const { return code_; }
int initial_map_instance_size_with_min_slack() const {
CHECK(serialized_);
return initial_map_instance_size_with_min_slack_;
@@ -645,13 +666,13 @@ class JSFunctionData : public JSObjectData {
bool serialized_ = false;
- ContextData* context_ = nullptr;
- NativeContextData* native_context_ = nullptr;
+ ObjectData* context_ = nullptr;
+ ObjectData* native_context_ = nullptr;
ObjectData* initial_map_ = nullptr;
ObjectData* prototype_ = nullptr;
- SharedFunctionInfoData* shared_ = nullptr;
- FeedbackVectorData* feedback_vector_ = nullptr;
- CodeData* code_ = nullptr;
+ ObjectData* shared_ = nullptr;
+ ObjectData* feedback_vector_ = nullptr;
+ ObjectData* code_ = nullptr;
int initial_map_instance_size_with_min_slack_;
};
@@ -683,7 +704,8 @@ class HeapNumberData : public HeapObjectData {
public:
HeapNumberData(JSHeapBroker* broker, ObjectData** storage,
Handle<HeapNumber> object)
- : HeapObjectData(broker, storage, object), value_(object->value()) {}
+ : HeapObjectData(broker, storage, object), value_(object->value()) {
+ }
double value() const { return value_; }
@@ -696,10 +718,8 @@ class ContextData : public HeapObjectData {
ContextData(JSHeapBroker* broker, ObjectData** storage,
Handle<Context> object);
- // {previous} will return the closest valid context possible to desired
- // {depth}, decrementing {depth} for each previous link successfully followed.
- ContextData* previous(
- JSHeapBroker* broker, size_t* depth,
+ ObjectData* previous(
+ JSHeapBroker* broker,
SerializationPolicy policy = SerializationPolicy::kAssumeSerialized);
// Returns nullptr if the slot index isn't valid or wasn't serialized,
@@ -710,32 +730,22 @@ class ContextData : public HeapObjectData {
private:
ZoneMap<int, ObjectData*> slots_;
- ContextData* previous_ = nullptr;
+ ObjectData* previous_ = nullptr;
};
ContextData::ContextData(JSHeapBroker* broker, ObjectData** storage,
Handle<Context> object)
: HeapObjectData(broker, storage, object), slots_(broker->zone()) {}
-ContextData* ContextData::previous(JSHeapBroker* broker, size_t* depth,
- SerializationPolicy policy) {
- if (*depth == 0) return this;
-
+ObjectData* ContextData::previous(JSHeapBroker* broker,
+ SerializationPolicy policy) {
if (policy == SerializationPolicy::kSerializeIfNeeded &&
previous_ == nullptr) {
TraceScope tracer(broker, this, "ContextData::previous");
Handle<Context> context = Handle<Context>::cast(object());
- Object prev = context->unchecked_previous();
- if (prev.IsContext()) {
- previous_ = broker->GetOrCreateData(prev)->AsContext();
- }
- }
-
- if (previous_ != nullptr) {
- *depth = *depth - 1;
- return previous_->previous(broker, depth, policy);
+ previous_ = broker->GetOrCreateData(context->unchecked_previous());
}
- return this;
+ return previous_;
}
ObjectData* ContextData::GetSlot(JSHeapBroker* broker, int index,
@@ -763,16 +773,16 @@ ObjectData* ContextData::GetSlot(JSHeapBroker* broker, int index,
class NativeContextData : public ContextData {
public:
#define DECL_ACCESSOR(type, name) \
- type##Data* name() const { return name##_; }
+ ObjectData* name() const { return name##_; }
BROKER_NATIVE_CONTEXT_FIELDS(DECL_ACCESSOR)
#undef DECL_ACCESSOR
- const ZoneVector<MapData*>& function_maps() const {
+ const ZoneVector<ObjectData*>& function_maps() const {
CHECK(serialized_);
return function_maps_;
}
- ScopeInfoData* scope_info() const {
+ ObjectData* scope_info() const {
CHECK(serialized_);
return scope_info_;
}
@@ -783,11 +793,11 @@ class NativeContextData : public ContextData {
private:
bool serialized_ = false;
-#define DECL_MEMBER(type, name) type##Data* name##_ = nullptr;
+#define DECL_MEMBER(type, name) ObjectData* name##_ = nullptr;
BROKER_NATIVE_CONTEXT_FIELDS(DECL_MEMBER)
#undef DECL_MEMBER
- ZoneVector<MapData*> function_maps_;
- ScopeInfoData* scope_info_ = nullptr;
+ ZoneVector<ObjectData*> function_maps_;
+ ObjectData* scope_info_ = nullptr;
};
class NameData : public HeapObjectData {
@@ -806,7 +816,7 @@ class StringData : public NameData {
bool is_external_string() const { return is_external_string_; }
bool is_seq_string() const { return is_seq_string_; }
- StringData* GetCharAsString(
+ ObjectData* GetCharAsString(
JSHeapBroker* broker, uint32_t index,
SerializationPolicy policy = SerializationPolicy::kAssumeSerialized);
@@ -820,7 +830,7 @@ class StringData : public NameData {
// Known individual characters as strings, corresponding to the semantics of
// element access (s[i]). The first pair component is always less than
// {length_}. The second component is never nullptr.
- ZoneVector<std::pair<uint32_t, StringData*>> chars_as_strings_;
+ ZoneVector<std::pair<uint32_t, ObjectData*>> chars_as_strings_;
static constexpr int kMaxLengthForDoubleConversion = 23;
};
@@ -859,7 +869,7 @@ class InternalizedStringData : public StringData {
uint32_t array_index_;
};
-StringData* StringData::GetCharAsString(JSHeapBroker* broker, uint32_t index,
+ObjectData* StringData::GetCharAsString(JSHeapBroker* broker, uint32_t index,
SerializationPolicy policy) {
if (index >= static_cast<uint32_t>(length())) return nullptr;
@@ -874,8 +884,7 @@ StringData* StringData::GetCharAsString(JSHeapBroker* broker, uint32_t index,
base::Optional<ObjectRef> element =
GetOwnElementFromHeap(broker, object(), index, true);
- StringData* result =
- element.has_value() ? element->data()->AsString() : nullptr;
+ ObjectData* result = element.has_value() ? element->data() : nullptr;
chars_as_strings_.push_back({index, result});
return result;
}
@@ -987,7 +996,7 @@ class AllocationSiteData : public HeapObjectData {
AllocationType GetAllocationType() const { return GetAllocationType_; }
ObjectData* nested_site() const { return nested_site_; }
bool IsFastLiteral() const { return IsFastLiteral_; }
- JSObjectData* boilerplate() const { return boilerplate_; }
+ ObjectData* boilerplate() const { return boilerplate_; }
// These are only valid if PointsToLiteral is false.
ElementsKind GetElementsKind() const { return GetElementsKind_; }
@@ -998,7 +1007,7 @@ class AllocationSiteData : public HeapObjectData {
AllocationType const GetAllocationType_;
ObjectData* nested_site_ = nullptr;
bool IsFastLiteral_ = false;
- JSObjectData* boilerplate_ = nullptr;
+ ObjectData* boilerplate_ = nullptr;
ElementsKind GetElementsKind_ = NO_ELEMENTS;
bool CanInlineCall_ = false;
bool serialized_boilerplate_ = false;
@@ -1008,7 +1017,8 @@ class BigIntData : public HeapObjectData {
public:
BigIntData(JSHeapBroker* broker, ObjectData** storage, Handle<BigInt> object)
: HeapObjectData(broker, storage, object),
- as_uint64_(object->AsUint64(nullptr)) {}
+ as_uint64_(object->AsUint64(nullptr)) {
+ }
uint64_t AsUint64() const { return as_uint64_; }
@@ -1025,11 +1035,11 @@ class ScriptContextTableData : public HeapObjectData {
};
struct PropertyDescriptor {
- NameData* key = nullptr;
+ ObjectData* key = nullptr;
ObjectData* value = nullptr;
PropertyDetails details = PropertyDetails::Empty();
FieldIndex field_index;
- MapData* field_owner = nullptr;
+ ObjectData* field_owner = nullptr;
ObjectData* field_type = nullptr;
bool is_unboxed_double_field = false;
};
@@ -1069,7 +1079,7 @@ class MapData : public HeapObjectData {
// Extra information.
void SerializeElementsKindGeneralizations(JSHeapBroker* broker);
- const ZoneVector<MapData*>& elements_kind_generalizations() const {
+ const ZoneVector<ObjectData*>& elements_kind_generalizations() const {
CHECK(serialized_elements_kind_generalizations_);
return elements_kind_generalizations_;
}
@@ -1080,12 +1090,16 @@ class MapData : public HeapObjectData {
InternalIndex descriptor_index);
void SerializeOwnDescriptors(JSHeapBroker* broker);
ObjectData* GetStrongValue(InternalIndex descriptor_index) const;
+ // TODO(neis): This code needs to be changed to allow for ObjectData* instance
+ // descriptors. However, this is likely to require a non-trivial refactoring
+ // of how maps are serialized because actual instance descriptors don't
+ // contain information about owner maps.
DescriptorArrayData* instance_descriptors() const {
return instance_descriptors_;
}
void SerializeRootMap(JSHeapBroker* broker);
- MapData* FindRootMap() const;
+ ObjectData* FindRootMap() const;
void SerializeConstructor(JSHeapBroker* broker);
ObjectData* GetConstructor() const {
@@ -1094,7 +1108,7 @@ class MapData : public HeapObjectData {
}
void SerializeBackPointer(JSHeapBroker* broker);
- HeapObjectData* GetBackPointer() const {
+ ObjectData* GetBackPointer() const {
CHECK(serialized_backpointer_);
return backpointer_;
}
@@ -1128,7 +1142,7 @@ class MapData : public HeapObjectData {
bool const is_abandoned_prototype_map_;
bool serialized_elements_kind_generalizations_ = false;
- ZoneVector<MapData*> elements_kind_generalizations_;
+ ZoneVector<ObjectData*> elements_kind_generalizations_;
bool serialized_own_descriptors_ = false;
DescriptorArrayData* instance_descriptors_ = nullptr;
@@ -1137,13 +1151,13 @@ class MapData : public HeapObjectData {
ObjectData* constructor_ = nullptr;
bool serialized_backpointer_ = false;
- HeapObjectData* backpointer_ = nullptr;
+ ObjectData* backpointer_ = nullptr;
bool serialized_prototype_ = false;
ObjectData* prototype_ = nullptr;
bool serialized_root_map_ = false;
- MapData* root_map_ = nullptr;
+ ObjectData* root_map_ = nullptr;
bool serialized_for_element_load_ = false;
@@ -1152,7 +1166,9 @@ class MapData : public HeapObjectData {
AccessorInfoData::AccessorInfoData(JSHeapBroker* broker, ObjectData** storage,
Handle<AccessorInfo> object)
- : HeapObjectData(broker, storage, object) {}
+ : HeapObjectData(broker, storage, object) {
+ DCHECK(!FLAG_turbo_direct_heap_access);
+}
AllocationSiteData::AllocationSiteData(JSHeapBroker* broker,
ObjectData** storage,
@@ -1178,12 +1194,14 @@ void AllocationSiteData::SerializeBoilerplate(JSHeapBroker* broker) {
CHECK(IsFastLiteral_);
DCHECK_NULL(boilerplate_);
- boilerplate_ = broker->GetOrCreateData(site->boilerplate())->AsJSObject();
- boilerplate_->SerializeAsBoilerplate(broker);
+ boilerplate_ = broker->GetOrCreateData(site->boilerplate());
+ if (!boilerplate_->should_access_heap()) {
+ boilerplate_->AsJSObject()->SerializeAsBoilerplate(broker);
+ }
DCHECK_NULL(nested_site_);
nested_site_ = broker->GetOrCreateData(site->nested_site());
- if (nested_site_->IsAllocationSite()) {
+ if (nested_site_->IsAllocationSite() && !nested_site_->should_access_heap()) {
nested_site_->AsAllocationSite()->SerializeBoilerplate(broker);
}
}
@@ -1198,13 +1216,13 @@ HeapObjectData::HeapObjectData(JSHeapBroker* broker, ObjectData** storage,
// meta map (whose map is itself), this member has not yet been
// initialized.
map_(broker->GetOrCreateData(object->map())) {
- CHECK(broker->SerializingAllowed());
+ CHECK_EQ(broker->mode(), JSHeapBroker::kSerializing);
}
InstanceType HeapObjectData::GetMapInstanceType() const {
ObjectData* map_data = map();
if (map_data->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(kind());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(kind());
return Handle<Map>::cast(map_data->object())->instance_type();
}
return map_data->AsMap()->instance_type();
@@ -1290,17 +1308,15 @@ void JSFunctionData::Serialize(JSHeapBroker* broker) {
DCHECK_NULL(feedback_vector_);
DCHECK_NULL(code_);
- context_ = broker->GetOrCreateData(function->context())->AsContext();
- native_context_ =
- broker->GetOrCreateData(function->native_context())->AsNativeContext();
- shared_ = broker->GetOrCreateData(function->shared())->AsSharedFunctionInfo();
+ context_ = broker->GetOrCreateData(function->context());
+ native_context_ = broker->GetOrCreateData(function->native_context());
+ shared_ = broker->GetOrCreateData(function->shared());
feedback_vector_ = has_feedback_vector()
? broker->GetOrCreateData(function->feedback_vector())
- ->AsFeedbackVector()
: nullptr;
- code_ = broker->GetOrCreateData(function->code())->AsCode();
+ code_ = broker->GetOrCreateData(function->code());
initial_map_ = has_initial_map()
- ? broker->GetOrCreateData(function->initial_map())->AsMap()
+ ? broker->GetOrCreateData(function->initial_map())
: nullptr;
prototype_ = has_prototype() ? broker->GetOrCreateData(function->prototype())
: nullptr;
@@ -1336,8 +1352,7 @@ void MapData::SerializeElementsKindGeneralizations(JSHeapBroker* broker) {
if (IsMoreGeneralElementsKindTransition(from_kind, to_kind)) {
Handle<Map> target =
Map::AsElementsKind(broker->isolate(), self.object(), to_kind);
- elements_kind_generalizations_.push_back(
- broker->GetOrCreateData(target)->AsMap());
+ elements_kind_generalizations_.push_back(broker->GetOrCreateData(target));
}
}
}
@@ -1359,16 +1374,16 @@ class FeedbackCellData : public HeapObjectData {
FeedbackCellData(JSHeapBroker* broker, ObjectData** storage,
Handle<FeedbackCell> object);
- HeapObjectData* value() const { return value_; }
+ ObjectData* value() const { return value_; }
private:
- HeapObjectData* const value_;
+ ObjectData* const value_;
};
FeedbackCellData::FeedbackCellData(JSHeapBroker* broker, ObjectData** storage,
Handle<FeedbackCell> object)
: HeapObjectData(broker, storage, object),
- value_(broker->GetOrCreateData(object->value())->AsHeapObject()) {}
+ value_(broker->GetOrCreateData(object->value())) {}
class FeedbackVectorData : public HeapObjectData {
public:
@@ -1377,21 +1392,20 @@ class FeedbackVectorData : public HeapObjectData {
double invocation_count() const { return invocation_count_; }
- SharedFunctionInfoData* shared_function_info() {
+ ObjectData* shared_function_info() {
CHECK(serialized_);
return shared_function_info_;
}
void Serialize(JSHeapBroker* broker);
bool serialized() const { return serialized_; }
- FeedbackCellData* GetClosureFeedbackCell(JSHeapBroker* broker,
- int index) const;
+ ObjectData* GetClosureFeedbackCell(JSHeapBroker* broker, int index) const;
private:
double const invocation_count_;
bool serialized_ = false;
- SharedFunctionInfoData* shared_function_info_;
+ ObjectData* shared_function_info_;
ZoneVector<ObjectData*> closure_feedback_cell_array_;
};
@@ -1402,8 +1416,8 @@ FeedbackVectorData::FeedbackVectorData(JSHeapBroker* broker,
invocation_count_(object->invocation_count()),
closure_feedback_cell_array_(broker->zone()) {}
-FeedbackCellData* FeedbackVectorData::GetClosureFeedbackCell(
- JSHeapBroker* broker, int index) const {
+ObjectData* FeedbackVectorData::GetClosureFeedbackCell(JSHeapBroker* broker,
+ int index) const {
CHECK_GE(index, 0);
size_t cell_array_size = closure_feedback_cell_array_.size();
@@ -1414,7 +1428,7 @@ FeedbackCellData* FeedbackVectorData::GetClosureFeedbackCell(
return nullptr;
}
CHECK_LT(index, cell_array_size);
- return closure_feedback_cell_array_[index]->AsFeedbackCell();
+ return closure_feedback_cell_array_[index];
}
void FeedbackVectorData::Serialize(JSHeapBroker* broker) {
@@ -1425,7 +1439,7 @@ void FeedbackVectorData::Serialize(JSHeapBroker* broker) {
Handle<FeedbackVector> vector = Handle<FeedbackVector>::cast(object());
Handle<SharedFunctionInfo> sfi(vector->shared_function_info(),
broker->isolate());
- shared_function_info_ = broker->GetOrCreateData(sfi)->AsSharedFunctionInfo();
+ shared_function_info_ = broker->GetOrCreateData(sfi);
DCHECK(closure_feedback_cell_array_.empty());
int length = vector->closure_feedback_cell_array().length();
closure_feedback_cell_array_.reserve(length);
@@ -1467,8 +1481,7 @@ class FixedArrayData : public FixedArrayBaseData {
JSDataViewData::JSDataViewData(JSHeapBroker* broker, ObjectData** storage,
Handle<JSDataView> object)
: JSObjectData(broker, storage, object),
- byte_length_(object->byte_length()),
- byte_offset_(object->byte_offset()) {}
+ byte_length_(object->byte_length()) {}
JSBoundFunctionData::JSBoundFunctionData(JSHeapBroker* broker,
ObjectData** storage,
@@ -1485,10 +1498,12 @@ void JSBoundFunctionData::Serialize(JSHeapBroker* broker) {
DCHECK_NULL(bound_target_function_);
bound_target_function_ =
broker->GetOrCreateData(function->bound_target_function());
- if (bound_target_function_->IsJSBoundFunction()) {
- bound_target_function_->AsJSBoundFunction()->Serialize(broker);
- } else if (bound_target_function_->IsJSFunction()) {
- bound_target_function_->AsJSFunction()->Serialize(broker);
+ if (!bound_target_function_->should_access_heap()) {
+ if (bound_target_function_->IsJSBoundFunction()) {
+ bound_target_function_->AsJSBoundFunction()->Serialize(broker);
+ } else if (bound_target_function_->IsJSFunction()) {
+ bound_target_function_->AsJSFunction()->Serialize(broker);
+ }
}
DCHECK_NULL(bound_arguments_);
@@ -1547,7 +1562,8 @@ class FixedDoubleArrayData : public FixedArrayBaseData {
FixedDoubleArrayData::FixedDoubleArrayData(JSHeapBroker* broker,
ObjectData** storage,
Handle<FixedDoubleArray> object)
- : FixedArrayBaseData(broker, storage, object), contents_(broker->zone()) {}
+ : FixedArrayBaseData(broker, storage, object), contents_(broker->zone()) {
+}
void FixedDoubleArrayData::SerializeContents(JSHeapBroker* broker) {
if (serialized_contents_) return;
@@ -1567,6 +1583,12 @@ void FixedDoubleArrayData::SerializeContents(JSHeapBroker* broker) {
class BytecodeArrayData : public FixedArrayBaseData {
public:
+ int register_count() const { return register_count_; }
+ int parameter_count() const { return parameter_count_; }
+ interpreter::Register incoming_new_target_or_generator_register() const {
+ return incoming_new_target_or_generator_register_;
+ }
+
Handle<Object> GetConstantAtIndex(int index, Isolate* isolate) const {
return constant_pool_[index]->object();
}
@@ -1599,9 +1621,17 @@ class BytecodeArrayData : public FixedArrayBaseData {
BytecodeArrayData(JSHeapBroker* broker, ObjectData** storage,
Handle<BytecodeArray> object)
: FixedArrayBaseData(broker, storage, object),
+ register_count_(object->register_count()),
+ parameter_count_(object->parameter_count()),
+ incoming_new_target_or_generator_register_(
+ object->incoming_new_target_or_generator_register()),
constant_pool_(broker->zone()) {}
private:
+ int const register_count_;
+ int const parameter_count_;
+ interpreter::Register const incoming_new_target_or_generator_register_;
+
bool is_serialized_for_compilation_ = false;
ZoneVector<ObjectData*> constant_pool_;
};
@@ -1671,7 +1701,7 @@ class ScopeInfoData : public HeapObjectData {
bool has_outer_scope_info() const { return has_outer_scope_info_; }
int flags() const { return flags_; }
- ScopeInfoData* outer_scope_info() const { return outer_scope_info_; }
+ ObjectData* outer_scope_info() const { return outer_scope_info_; }
void SerializeScopeInfoChain(JSHeapBroker* broker);
private:
@@ -1680,7 +1710,7 @@ class ScopeInfoData : public HeapObjectData {
int const flags_;
// Only serialized via SerializeScopeInfoChain.
- ScopeInfoData* outer_scope_info_;
+ ObjectData* outer_scope_info_;
};
ScopeInfoData::ScopeInfoData(JSHeapBroker* broker, ObjectData** storage,
@@ -1694,11 +1724,11 @@ ScopeInfoData::ScopeInfoData(JSHeapBroker* broker, ObjectData** storage,
void ScopeInfoData::SerializeScopeInfoChain(JSHeapBroker* broker) {
if (outer_scope_info_) return;
if (!has_outer_scope_info_) return;
- outer_scope_info_ =
- broker
- ->GetOrCreateData(Handle<ScopeInfo>::cast(object())->OuterScopeInfo())
- ->AsScopeInfo();
- outer_scope_info_->SerializeScopeInfoChain(broker);
+ outer_scope_info_ = broker->GetOrCreateData(
+ Handle<ScopeInfo>::cast(object())->OuterScopeInfo());
+ if (!outer_scope_info_->should_access_heap()) {
+ outer_scope_info_->AsScopeInfo()->SerializeScopeInfoChain(broker);
+ }
}
class SharedFunctionInfoData : public HeapObjectData {
@@ -1708,21 +1738,19 @@ class SharedFunctionInfoData : public HeapObjectData {
int builtin_id() const { return builtin_id_; }
int context_header_size() const { return context_header_size_; }
- BytecodeArrayData* GetBytecodeArray() const { return GetBytecodeArray_; }
+ ObjectData* GetBytecodeArray() const { return GetBytecodeArray_; }
void SerializeFunctionTemplateInfo(JSHeapBroker* broker);
- ScopeInfoData* scope_info() const { return scope_info_; }
+ ObjectData* scope_info() const { return scope_info_; }
void SerializeScopeInfoChain(JSHeapBroker* broker);
- FunctionTemplateInfoData* function_template_info() const {
- return function_template_info_;
- }
- JSArrayData* GetTemplateObject(FeedbackSlot slot) const {
+ ObjectData* function_template_info() const { return function_template_info_; }
+ ObjectData* GetTemplateObject(FeedbackSlot slot) const {
auto lookup_it = template_objects_.find(slot.ToInt());
if (lookup_it != template_objects_.cend()) {
return lookup_it->second;
}
return nullptr;
}
- void SetTemplateObject(FeedbackSlot slot, JSArrayData* object) {
+ void SetTemplateObject(FeedbackSlot slot, ObjectData* object) {
CHECK(
template_objects_.insert(std::make_pair(slot.ToInt(), object)).second);
}
@@ -1735,13 +1763,13 @@ class SharedFunctionInfoData : public HeapObjectData {
private:
int const builtin_id_;
int context_header_size_;
- BytecodeArrayData* const GetBytecodeArray_;
+ ObjectData* const GetBytecodeArray_;
#define DECL_MEMBER(type, name) type const name##_;
BROKER_SFI_FIELDS(DECL_MEMBER)
#undef DECL_MEMBER
- FunctionTemplateInfoData* function_template_info_;
- ZoneMap<int, JSArrayData*> template_objects_;
- ScopeInfoData* scope_info_;
+ ObjectData* function_template_info_;
+ ZoneMap<int, ObjectData*> template_objects_;
+ ObjectData* scope_info_;
};
SharedFunctionInfoData::SharedFunctionInfoData(
@@ -1754,7 +1782,6 @@ SharedFunctionInfoData::SharedFunctionInfoData(
GetBytecodeArray_(
object->HasBytecodeArray()
? broker->GetOrCreateData(object->GetBytecodeArray())
- ->AsBytecodeArray()
: nullptr)
#define INIT_MEMBER(type, name) , name##_(object->name())
BROKER_SFI_FIELDS(INIT_MEMBER)
@@ -1770,23 +1797,17 @@ SharedFunctionInfoData::SharedFunctionInfoData(
void SharedFunctionInfoData::SerializeFunctionTemplateInfo(
JSHeapBroker* broker) {
if (function_template_info_) return;
-
- function_template_info_ =
- broker
- ->GetOrCreateData(handle(
- Handle<SharedFunctionInfo>::cast(object())->function_data(),
- broker->isolate()))
- ->AsFunctionTemplateInfo();
+ function_template_info_ = broker->GetOrCreateData(
+ Handle<SharedFunctionInfo>::cast(object())->function_data());
}
void SharedFunctionInfoData::SerializeScopeInfoChain(JSHeapBroker* broker) {
if (scope_info_) return;
- scope_info_ =
- broker
- ->GetOrCreateData(
- Handle<SharedFunctionInfo>::cast(object())->scope_info())
- ->AsScopeInfo();
- scope_info_->SerializeScopeInfoChain(broker);
+ scope_info_ = broker->GetOrCreateData(
+ Handle<SharedFunctionInfo>::cast(object())->scope_info());
+ if (!scope_info_->should_access_heap()) {
+ scope_info_->AsScopeInfo()->SerializeScopeInfoChain(broker);
+ }
}
class SourceTextModuleData : public HeapObjectData {
@@ -1795,13 +1816,13 @@ class SourceTextModuleData : public HeapObjectData {
Handle<SourceTextModule> object);
void Serialize(JSHeapBroker* broker);
- CellData* GetCell(JSHeapBroker* broker, int cell_index) const;
+ ObjectData* GetCell(JSHeapBroker* broker, int cell_index) const;
ObjectData* GetImportMeta(JSHeapBroker* broker) const;
private:
bool serialized_ = false;
- ZoneVector<CellData*> imports_;
- ZoneVector<CellData*> exports_;
+ ZoneVector<ObjectData*> imports_;
+ ZoneVector<ObjectData*> exports_;
ObjectData* import_meta_;
};
@@ -1813,15 +1834,15 @@ SourceTextModuleData::SourceTextModuleData(JSHeapBroker* broker,
exports_(broker->zone()),
import_meta_(nullptr) {}
-CellData* SourceTextModuleData::GetCell(JSHeapBroker* broker,
- int cell_index) const {
+ObjectData* SourceTextModuleData::GetCell(JSHeapBroker* broker,
+ int cell_index) const {
if (!serialized_) {
DCHECK(imports_.empty());
TRACE_BROKER_MISSING(broker,
"module cell " << cell_index << " on " << this);
return nullptr;
}
- CellData* cell;
+ ObjectData* cell;
switch (SourceTextModuleDescriptor::GetCellIndexKind(cell_index)) {
case SourceTextModuleDescriptor::kImport:
cell = imports_.at(SourceTextModule::ImportIndex(cell_index));
@@ -1856,7 +1877,7 @@ void SourceTextModuleData::Serialize(JSHeapBroker* broker) {
int const imports_length = imports->length();
imports_.reserve(imports_length);
for (int i = 0; i < imports_length; ++i) {
- imports_.push_back(broker->GetOrCreateData(imports->get(i))->AsCell());
+ imports_.push_back(broker->GetOrCreateData(imports->get(i)));
}
TRACE(broker, "Copied " << imports_.size() << " imports");
@@ -1865,7 +1886,7 @@ void SourceTextModuleData::Serialize(JSHeapBroker* broker) {
int const exports_length = exports->length();
exports_.reserve(exports_length);
for (int i = 0; i < exports_length; ++i) {
- exports_.push_back(broker->GetOrCreateData(exports->get(i))->AsCell());
+ exports_.push_back(broker->GetOrCreateData(exports->get(i)));
}
TRACE(broker, "Copied " << exports_.size() << " exports");
@@ -1876,35 +1897,20 @@ void SourceTextModuleData::Serialize(JSHeapBroker* broker) {
class CellData : public HeapObjectData {
public:
- CellData(JSHeapBroker* broker, ObjectData** storage, Handle<Cell> object);
-
- void Serialize(JSHeapBroker* broker);
- ObjectData* value() { return value_; }
-
- private:
- ObjectData* value_ = nullptr;
+ CellData(JSHeapBroker* broker, ObjectData** storage, Handle<Cell> object)
+ : HeapObjectData(broker, storage, object) {
+ DCHECK(!FLAG_turbo_direct_heap_access);
+ }
};
-CellData::CellData(JSHeapBroker* broker, ObjectData** storage,
- Handle<Cell> object)
- : HeapObjectData(broker, storage, object) {}
-
-void CellData::Serialize(JSHeapBroker* broker) {
- if (value_ != nullptr) return;
-
- TraceScope tracer(broker, this, "CellData::Serialize");
- auto cell = Handle<Cell>::cast(object());
- value_ = broker->GetOrCreateData(cell->value());
-}
-
class JSGlobalObjectData : public JSObjectData {
public:
JSGlobalObjectData(JSHeapBroker* broker, ObjectData** storage,
Handle<JSGlobalObject> object);
bool IsDetached() const { return is_detached_; }
- PropertyCellData* GetPropertyCell(
- JSHeapBroker* broker, NameData* name,
+ ObjectData* GetPropertyCell(
+ JSHeapBroker* broker, ObjectData* name,
SerializationPolicy policy = SerializationPolicy::kAssumeSerialized);
private:
@@ -1914,7 +1920,7 @@ class JSGlobalObjectData : public JSObjectData {
// (1) are known to exist as property cells on the global object, or
// (2) are known not to (possibly they don't exist at all).
// In case (2), the second pair component is nullptr.
- ZoneVector<std::pair<NameData*, PropertyCellData*>> properties_;
+ ZoneVector<std::pair<ObjectData*, ObjectData*>> properties_;
};
JSGlobalObjectData::JSGlobalObjectData(JSHeapBroker* broker,
@@ -1951,8 +1957,9 @@ base::Optional<PropertyCellRef> GetPropertyCellFromHeap(JSHeapBroker* broker,
}
} // namespace
-PropertyCellData* JSGlobalObjectData::GetPropertyCell(
- JSHeapBroker* broker, NameData* name, SerializationPolicy policy) {
+ObjectData* JSGlobalObjectData::GetPropertyCell(JSHeapBroker* broker,
+ ObjectData* name,
+ SerializationPolicy policy) {
CHECK_NOT_NULL(name);
for (auto const& p : properties_) {
if (p.first == name) return p.second;
@@ -1963,12 +1970,14 @@ PropertyCellData* JSGlobalObjectData::GetPropertyCell(
return nullptr;
}
- PropertyCellData* result = nullptr;
+ ObjectData* result = nullptr;
base::Optional<PropertyCellRef> cell =
GetPropertyCellFromHeap(broker, Handle<Name>::cast(name->object()));
if (cell.has_value()) {
- cell->Serialize();
- result = cell->data()->AsPropertyCell();
+ result = cell->data();
+ if (!result->should_access_heap()) {
+ result->AsPropertyCell()->Serialize(broker);
+ }
}
properties_.push_back({name, result});
return result;
@@ -1978,7 +1987,9 @@ class TemplateObjectDescriptionData : public HeapObjectData {
public:
TemplateObjectDescriptionData(JSHeapBroker* broker, ObjectData** storage,
Handle<TemplateObjectDescription> object)
- : HeapObjectData(broker, storage, object) {}
+ : HeapObjectData(broker, storage, object) {
+ DCHECK(!FLAG_turbo_direct_heap_access);
+ }
};
class CodeData : public HeapObjectData {
@@ -1993,23 +2004,43 @@ class CodeData : public HeapObjectData {
unsigned const inlined_bytecode_size_;
};
-#define DEFINE_IS_AND_AS(Name) \
+#define DEFINE_IS(Name) \
bool ObjectData::Is##Name() const { \
if (should_access_heap()) { \
- AllowHandleDereferenceIf allow_handle_dereference(kind()); \
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(kind()); \
return object()->Is##Name(); \
} \
if (is_smi()) return false; \
InstanceType instance_type = \
static_cast<const HeapObjectData*>(this)->GetMapInstanceType(); \
return InstanceTypeChecker::Is##Name(instance_type); \
- } \
- Name##Data* ObjectData::As##Name() { \
- CHECK(Is##Name()); \
- return static_cast<Name##Data*>(this); \
}
-HEAP_BROKER_OBJECT_LIST(DEFINE_IS_AND_AS)
-#undef DEFINE_IS_AND_AS
+HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEFINE_IS)
+HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEFINE_IS)
+#undef DEFINE_IS
+
+#define DEFINE_AS(Name) \
+ Name##Data* ObjectData::As##Name() { \
+ CHECK(Is##Name()); \
+ CHECK_EQ(kind_, kSerializedHeapObject); \
+ return static_cast<Name##Data*>(this); \
+ }
+HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEFINE_AS)
+#undef DEFINE_AS
+
+// TODO(solanes, v8:10866): Remove once FLAG_turbo_direct_heap_access is
+// removed.
+// This macro defines the Asxxx methods for NeverSerialized objects, which
+// should only be used with direct heap access off.
+#define DEFINE_AS(Name) \
+ Name##Data* ObjectData::As##Name() { \
+ DCHECK(!FLAG_turbo_direct_heap_access); \
+ CHECK(Is##Name()); \
+ CHECK_EQ(kind_, kSerializedHeapObject); \
+ return static_cast<Name##Data*>(this); \
+ }
+HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEFINE_AS)
+#undef DEFINE_AS
const JSObjectField& JSObjectData::GetInobjectField(int property_index) const {
CHECK_LT(static_cast<size_t>(property_index), inobject_fields_.size());
@@ -2058,7 +2089,7 @@ void MapData::SerializeBackPointer(JSHeapBroker* broker) {
Handle<Map> map = Handle<Map>::cast(object());
DCHECK_NULL(backpointer_);
DCHECK(!map->IsContextMap());
- backpointer_ = broker->GetOrCreateData(map->GetBackPointer())->AsHeapObject();
+ backpointer_ = broker->GetOrCreateData(map->GetBackPointer());
}
void MapData::SerializePrototype(JSHeapBroker* broker) {
@@ -2086,7 +2117,6 @@ void MapData::SerializeOwnDescriptors(JSHeapBroker* broker) {
ObjectData* MapData::GetStrongValue(InternalIndex descriptor_index) const {
auto data = instance_descriptors_->contents().find(descriptor_index.as_int());
if (data == instance_descriptors_->contents().end()) return nullptr;
-
return data->second.value;
}
@@ -2111,28 +2141,26 @@ void MapData::SerializeOwnDescriptor(JSHeapBroker* broker,
CHECK_EQ(*descriptors, map->instance_descriptors());
PropertyDescriptor d;
- d.key =
- broker->GetOrCreateData(descriptors->GetKey(descriptor_index))->AsName();
+ d.key = broker->GetOrCreateData(descriptors->GetKey(descriptor_index));
MaybeObject value = descriptors->GetValue(descriptor_index);
HeapObject obj;
if (value.GetHeapObjectIfStrong(&obj)) {
- d.value = broker->GetOrCreateData(handle(obj, broker->isolate()));
+ d.value = broker->GetOrCreateData(obj);
}
d.details = descriptors->GetDetails(descriptor_index);
if (d.details.location() == kField) {
d.field_index = FieldIndex::ForDescriptor(*map, descriptor_index);
d.field_owner =
- broker->GetOrCreateData(map->FindFieldOwner(isolate, descriptor_index))
- ->AsMap();
+ broker->GetOrCreateData(map->FindFieldOwner(isolate, descriptor_index));
d.field_type =
broker->GetOrCreateData(descriptors->GetFieldType(descriptor_index));
d.is_unboxed_double_field = map->IsUnboxedDoubleField(d.field_index);
}
contents[descriptor_index.as_int()] = d;
- if (d.details.location() == kField) {
+ if (d.details.location() == kField && !d.field_owner->should_access_heap()) {
// Recurse on the owner map.
- d.field_owner->SerializeOwnDescriptor(broker, descriptor_index);
+ d.field_owner->AsMap()->SerializeOwnDescriptor(broker, descriptor_index);
}
TRACE(broker, "Copied descriptor " << descriptor_index.as_int() << " into "
@@ -2147,11 +2175,10 @@ void MapData::SerializeRootMap(JSHeapBroker* broker) {
TraceScope tracer(broker, this, "MapData::SerializeRootMap");
Handle<Map> map = Handle<Map>::cast(object());
DCHECK_NULL(root_map_);
- root_map_ =
- broker->GetOrCreateData(map->FindRootMap(broker->isolate()))->AsMap();
+ root_map_ = broker->GetOrCreateData(map->FindRootMap(broker->isolate()));
}
-MapData* MapData::FindRootMap() const { return root_map_; }
+ObjectData* MapData::FindRootMap() const { return root_map_; }
void JSObjectData::SerializeRecursiveAsBoilerplate(JSHeapBroker* broker,
int depth) {
@@ -2206,13 +2233,16 @@ void JSObjectData::SerializeRecursiveAsBoilerplate(JSHeapBroker* broker,
Handle<Object> value(fast_elements->get(i), isolate);
if (value->IsJSObject()) {
ObjectData* value_data = broker->GetOrCreateData(value);
- value_data->AsJSObject()->SerializeRecursiveAsBoilerplate(broker,
- depth - 1);
+ if (!value_data->should_access_heap()) {
+ value_data->AsJSObject()->SerializeRecursiveAsBoilerplate(broker,
+ depth - 1);
+ }
}
}
} else {
CHECK(boilerplate->HasDoubleElements());
CHECK_LE(elements_object->Size(), kMaxRegularHeapObjectSize);
+ DCHECK_EQ(elements_->kind(), ObjectDataKind::kSerializedHeapObject);
elements_->AsFixedDoubleArray()->SerializeContents(broker);
}
@@ -2255,7 +2285,7 @@ void JSObjectData::SerializeRecursiveAsBoilerplate(JSHeapBroker* broker,
value = isolate->factory()->uninitialized_value();
}
ObjectData* value_data = broker->GetOrCreateData(value);
- if (value->IsJSObject()) {
+ if (value_data->IsJSObject() && !value_data->should_access_heap()) {
value_data->AsJSObject()->SerializeRecursiveAsBoilerplate(broker,
depth - 1);
}
@@ -2303,29 +2333,36 @@ Isolate* ObjectRef::isolate() const { return broker()->isolate(); }
ContextRef ContextRef::previous(size_t* depth,
SerializationPolicy policy) const {
DCHECK_NOT_NULL(depth);
+
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
Context current = *object();
while (*depth != 0 && current.unchecked_previous().IsContext()) {
current = Context::cast(current.unchecked_previous());
(*depth)--;
}
- return ContextRef(broker(), handle(current, broker()->isolate()));
+ return ContextRef(broker(), broker()->CanonicalPersistentHandle(current));
}
- ContextData* current = this->data()->AsContext();
- return ContextRef(broker(), current->previous(broker(), depth, policy));
+
+ if (*depth == 0) return *this;
+
+ ObjectData* previous_data = data()->AsContext()->previous(broker(), policy);
+ if (previous_data == nullptr || !previous_data->IsContext()) return *this;
+
+ *depth = *depth - 1;
+ return ContextRef(broker(), previous_data).previous(depth, policy);
}
base::Optional<ObjectRef> ContextRef::get(int index,
SerializationPolicy policy) const {
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
Handle<Object> value(object()->get(index), broker()->isolate());
return ObjectRef(broker(), value);
}
@@ -2520,8 +2557,6 @@ void JSHeapBroker::Retire() {
#endif // DEBUG
}
-bool JSHeapBroker::SerializingAllowed() const { return mode() == kSerializing; }
-
void JSHeapBroker::SetTargetNativeContextRef(
Handle<NativeContext> native_context) {
// The MapData constructor uses {target_native_context_}. This creates a
@@ -2632,37 +2667,29 @@ void JSHeapBroker::InitializeAndStartSerializing(
CollectArrayAndObjectPrototypes();
- // Serialize Cells
Factory* const f = isolate()->factory();
- GetOrCreateData(f->array_buffer_detaching_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->array_constructor_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->array_iterator_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->array_species_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->many_closures_cell())->AsFeedbackCell();
- GetOrCreateData(f->no_elements_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->promise_hook_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->promise_species_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->promise_then_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- GetOrCreateData(f->string_length_protector())
- ->AsPropertyCell()
- ->Serialize(this);
- // - CEntry stub
+ {
+ ObjectData* data;
+ data = GetOrCreateData(f->array_buffer_detaching_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->array_constructor_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->array_iterator_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->array_species_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->no_elements_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->promise_hook_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->promise_species_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->promise_then_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ data = GetOrCreateData(f->string_length_protector());
+ if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this);
+ }
+ GetOrCreateData(f->many_closures_cell());
GetOrCreateData(
CodeFactory::CEntry(isolate(), 1, kDontSaveFPRegs, kArgvOnStack, true));
@@ -2683,15 +2710,29 @@ ObjectData* JSHeapBroker::GetOrCreateData(Handle<Object> object) {
} else if (IsReadOnlyHeapObject(*object)) {
object_data = zone()->New<ObjectData>(this, data_storage, object,
kUnserializedReadOnlyHeapObject);
-#define CREATE_DATA_IF_MATCH(name) \
+// TODO(solanes, v8:10866): Remove the if/else in this macro once we remove the
+// FLAG_turbo_direct_heap_access.
+#define CREATE_DATA_FOR_DIRECT_READ(name) \
+ } else if (object->Is##name()) { \
+ if (FLAG_turbo_direct_heap_access) { \
+ object_data = zone()->New<ObjectData>( \
+ this, data_storage, object, kNeverSerializedHeapObject); \
+ } else { \
+ CHECK_EQ(mode(), kSerializing); \
+ AllowHandleAllocation handle_allocation; \
+ object_data = zone()->New<name##Data>(this, data_storage, \
+ Handle<name>::cast(object)); \
+ }
+ HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(CREATE_DATA_FOR_DIRECT_READ)
+#undef CREATE_DATA_FOR_DIRECT_READ
+#define CREATE_DATA_FOR_SERIALIZATION(name) \
} else if (object->Is##name()) { \
- CHECK(SerializingAllowed()); \
+ CHECK_EQ(mode(), kSerializing); \
AllowHandleAllocation handle_allocation; \
object_data = zone()->New<name##Data>(this, data_storage, \
Handle<name>::cast(object));
-
- HEAP_BROKER_OBJECT_LIST(CREATE_DATA_IF_MATCH)
-#undef CREATE_DATA_IF_MATCH
+ HEAP_BROKER_SERIALIZED_OBJECT_LIST(CREATE_DATA_FOR_SERIALIZATION)
+#undef CREATE_DATA_FOR_SERIALIZATION
} else {
UNREACHABLE();
}
@@ -2704,7 +2745,7 @@ ObjectData* JSHeapBroker::GetOrCreateData(Handle<Object> object) {
// clang-format on
ObjectData* JSHeapBroker::GetOrCreateData(Object object) {
- return GetOrCreateData(handle(object, isolate()));
+ return GetOrCreateData(CanonicalPersistentHandle(object));
}
#define DEFINE_IS_AND_AS(Name) \
@@ -2713,7 +2754,8 @@ ObjectData* JSHeapBroker::GetOrCreateData(Object object) {
DCHECK(Is##Name()); \
return Name##Ref(broker(), data()); \
}
-HEAP_BROKER_OBJECT_LIST(DEFINE_IS_AND_AS)
+HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEFINE_IS_AND_AS)
+HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEFINE_IS_AND_AS)
#undef DEFINE_IS_AND_AS
bool ObjectRef::IsSmi() const { return data()->is_smi(); }
@@ -2726,13 +2768,12 @@ int ObjectRef::AsSmi() const {
base::Optional<MapRef> JSObjectRef::GetObjectCreateMap() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(),
broker()->mode());
- AllowHeapAllocationIf allow_heap_allocation(data()->kind(),
- broker()->mode());
Handle<Map> instance_map;
if (Map::TryGetObjectCreateMap(broker()->isolate(), object())
.ToHandle(&instance_map)) {
@@ -2758,17 +2799,17 @@ INSTANCE_TYPE_CHECKERS(DEF_TESTER)
base::Optional<MapRef> MapRef::AsElementsKind(ElementsKind kind) const {
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHeapAllocationIf allow_heap_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(),
broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return MapRef(broker(),
Map::AsElementsKind(broker()->isolate(), object(), kind));
}
if (kind == elements_kind()) return *this;
- const ZoneVector<MapData*>& elements_kind_generalizations =
+ const ZoneVector<ObjectData*>& elements_kind_generalizations =
data()->AsMap()->elements_kind_generalizations();
for (auto data : elements_kind_generalizations) {
MapRef map(broker(), data);
@@ -2778,14 +2819,14 @@ base::Optional<MapRef> MapRef::AsElementsKind(ElementsKind kind) const {
}
void MapRef::SerializeForElementLoad() {
+ if (data()->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
- if (data()->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) return;
data()->AsMap()->SerializeForElementLoad(broker());
}
void MapRef::SerializeForElementStore() {
+ if (data()->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
- if (data()->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) return;
data()->AsMap()->SerializeForElementStore(broker());
}
@@ -2843,10 +2884,10 @@ bool MapRef::HasOnlyStablePrototypesWithFastElements(
bool MapRef::supports_fast_array_iteration() const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
return SupportsFastArrayIteration(broker()->isolate(), object());
}
return data()->AsMap()->supports_fast_array_iteration();
@@ -2854,10 +2895,10 @@ bool MapRef::supports_fast_array_iteration() const {
bool MapRef::supports_fast_array_resize() const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
return SupportsFastArrayResize(broker()->isolate(), object());
}
return data()->AsMap()->supports_fast_array_resize();
@@ -2865,11 +2906,10 @@ bool MapRef::supports_fast_array_resize() const {
int JSFunctionRef::InitialMapInstanceSizeWithMinSlack() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
return object()->ComputeInstanceSizeWithMinSlack(broker()->isolate());
}
return data()->AsJSFunction()->initial_map_instance_size_with_min_slack();
@@ -2904,11 +2944,10 @@ OddballType MapRef::oddball_type() const {
FeedbackCellRef FeedbackVectorRef::GetClosureFeedbackCell(int index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return FeedbackCellRef(broker(), object()->GetClosureFeedbackCell(index));
}
@@ -2919,9 +2958,8 @@ FeedbackCellRef FeedbackVectorRef::GetClosureFeedbackCell(int index) const {
double JSObjectRef::RawFastDoublePropertyAt(FieldIndex index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->RawFastDoublePropertyAt(index);
}
JSObjectData* object_data = data()->AsJSObject();
@@ -2931,9 +2969,8 @@ double JSObjectRef::RawFastDoublePropertyAt(FieldIndex index) const {
uint64_t JSObjectRef::RawFastDoublePropertyAsBitsAt(FieldIndex index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->RawFastDoublePropertyAsBitsAt(index);
}
JSObjectData* object_data = data()->AsJSObject();
@@ -2943,13 +2980,12 @@ uint64_t JSObjectRef::RawFastDoublePropertyAsBitsAt(FieldIndex index) const {
ObjectRef JSObjectRef::RawFastPropertyAt(FieldIndex index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return ObjectRef(broker(), handle(object()->RawFastPropertyAt(index),
- broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return ObjectRef(broker(), broker()->CanonicalPersistentHandle(
+ object()->RawFastPropertyAt(index)));
}
JSObjectData* object_data = data()->AsJSObject();
CHECK(index.is_inobject());
@@ -2960,13 +2996,13 @@ ObjectRef JSObjectRef::RawFastPropertyAt(FieldIndex index) const {
bool AllocationSiteRef::IsFastLiteral() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHeapAllocationIf allow_heap_allocation(
+ CHECK_NE(data_->kind(), ObjectDataKind::kNeverSerializedHeapObject);
+ AllowHeapAllocationIfNeeded allow_heap_allocation(
data()->kind(), broker()->mode()); // For TryMigrateInstance.
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return IsInlinableFastLiteral(
handle(object()->boilerplate(), broker()->isolate()));
}
@@ -2974,24 +3010,25 @@ bool AllocationSiteRef::IsFastLiteral() const {
}
void AllocationSiteRef::SerializeBoilerplate() {
+ if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsAllocationSite()->SerializeBoilerplate(broker());
}
void JSObjectRef::SerializeElements() {
+ if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsJSObject()->SerializeElements(broker());
}
void JSObjectRef::EnsureElementsTenured() {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(),
broker()->mode());
- AllowHeapAllocationIf allow_heap_allocation(data()->kind(),
- broker()->mode());
Handle<FixedArrayBase> object_elements = elements().object();
if (ObjectInYoungGeneration(*object_elements)) {
@@ -3010,8 +3047,8 @@ void JSObjectRef::EnsureElementsTenured() {
FieldIndex MapRef::GetFieldIndexFor(InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return FieldIndex::ForDescriptor(*object(), descriptor_index);
}
DescriptorArrayData* descriptors = data()->AsMap()->instance_descriptors();
@@ -3020,8 +3057,8 @@ FieldIndex MapRef::GetFieldIndexFor(InternalIndex descriptor_index) const {
int MapRef::GetInObjectPropertyOffset(int i) const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->GetInObjectPropertyOffset(i);
}
return (GetInObjectPropertiesStartInWords() + i) * kTaggedSize;
@@ -3030,8 +3067,8 @@ int MapRef::GetInObjectPropertyOffset(int i) const {
PropertyDetails MapRef::GetPropertyDetails(
InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->instance_descriptors().GetDetails(descriptor_index);
}
DescriptorArrayData* descriptors = data()->AsMap()->instance_descriptors();
@@ -3040,14 +3077,14 @@ PropertyDetails MapRef::GetPropertyDetails(
NameRef MapRef::GetPropertyKey(InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return NameRef(
broker(),
- handle(object()->instance_descriptors().GetKey(descriptor_index),
- broker()->isolate()));
+ broker()->CanonicalPersistentHandle(
+ object()->instance_descriptors().GetKey(descriptor_index)));
}
DescriptorArrayData* descriptors = data()->AsMap()->instance_descriptors();
return NameRef(broker(),
@@ -3066,10 +3103,10 @@ bool MapRef::IsPrimitiveMap() const {
MapRef MapRef::FindFieldOwner(InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
Handle<Map> owner(
object()->FindFieldOwner(broker()->isolate(), descriptor_index),
broker()->isolate());
@@ -3083,10 +3120,10 @@ MapRef MapRef::FindFieldOwner(InternalIndex descriptor_index) const {
ObjectRef MapRef::GetFieldType(InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
Handle<FieldType> field_type(
object()->instance_descriptors().GetFieldType(descriptor_index),
broker()->isolate());
@@ -3100,8 +3137,8 @@ ObjectRef MapRef::GetFieldType(InternalIndex descriptor_index) const {
bool MapRef::IsUnboxedDoubleField(InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->IsUnboxedDoubleField(
FieldIndex::ForDescriptor(*object(), descriptor_index));
}
@@ -3113,8 +3150,8 @@ bool MapRef::IsUnboxedDoubleField(InternalIndex descriptor_index) const {
uint16_t StringRef::GetFirstChar() {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->Get(0);
}
return data()->AsString()->first_char();
@@ -3122,12 +3159,12 @@ uint16_t StringRef::GetFirstChar() {
base::Optional<double> StringRef::ToNumber() {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(),
broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHeapAllocationIf allow_heap_allocation(data()->kind(),
- broker()->mode());
int flags = ALLOW_HEX | ALLOW_OCTAL | ALLOW_BINARY;
return StringToDouble(broker()->isolate(), object(), flags);
}
@@ -3136,50 +3173,33 @@ base::Optional<double> StringRef::ToNumber() {
int ArrayBoilerplateDescriptionRef::constants_elements_length() const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->constant_elements().length();
}
return data()->AsArrayBoilerplateDescription()->constants_elements_length();
}
-int ObjectBoilerplateDescriptionRef::size() const {
- if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return object()->size();
- }
- return data()->AsObjectBoilerplateDescription()->size();
-}
-
ObjectRef FixedArrayRef::get(int i) const {
if (data_->should_access_heap()) {
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return ObjectRef(broker(), handle(object()->get(i), broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return ObjectRef(broker(),
+ broker()->CanonicalPersistentHandle(object()->get(i)));
}
return ObjectRef(broker(), data()->AsFixedArray()->Get(i));
}
-bool FixedDoubleArrayRef::is_the_hole(int i) const {
- if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return object()->is_the_hole(i);
- }
- return data()->AsFixedDoubleArray()->Get(i).is_hole_nan();
-}
-
-double FixedDoubleArrayRef::get_scalar(int i) const {
+Float64 FixedDoubleArrayRef::get(int i) const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return object()->get_scalar(i);
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return Float64::FromBits(object()->get_representation(i));
+ } else {
+ return data()->AsFixedDoubleArray()->Get(i);
}
- CHECK(!data()->AsFixedDoubleArray()->Get(i).is_hole_nan());
- return data()->AsFixedDoubleArray()->Get(i).get_scalar();
}
uint8_t BytecodeArrayRef::get(int index) const { return object()->get(index); }
@@ -3190,12 +3210,12 @@ Address BytecodeArrayRef::GetFirstBytecodeAddress() const {
Handle<Object> BytecodeArrayRef::GetConstantAtIndex(int index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return handle(object()->constant_pool().get(index), broker()->isolate());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return broker()->CanonicalPersistentHandle(
+ object()->constant_pool().get(index));
}
return data()->AsBytecodeArray()->GetConstantAtIndex(index,
broker()->isolate());
@@ -3203,11 +3223,10 @@ Handle<Object> BytecodeArrayRef::GetConstantAtIndex(int index) const {
bool BytecodeArrayRef::IsConstantAtIndexSmi(int index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->constant_pool().get(index).IsSmi();
}
return data()->AsBytecodeArray()->IsConstantAtIndexSmi(index);
@@ -3215,25 +3234,22 @@ bool BytecodeArrayRef::IsConstantAtIndexSmi(int index) const {
Smi BytecodeArrayRef::GetConstantAtIndexAsSmi(int index) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return Smi::cast(object()->constant_pool().get(index));
}
return data()->AsBytecodeArray()->GetConstantAtIndexAsSmi(index);
}
void BytecodeArrayRef::SerializeForCompilation() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
data()->AsBytecodeArray()->SerializeForCompilation(broker());
}
-Handle<ByteArray> BytecodeArrayRef::source_positions() const {
- return broker()->CanonicalPersistentHandle(
- object()->SourcePositionTableIfCollected());
+Handle<ByteArray> BytecodeArrayRef::SourcePositionTable() const {
+ return broker()->CanonicalPersistentHandle(object()->SourcePositionTable());
}
Address BytecodeArrayRef::handler_table_address() const {
@@ -3245,86 +3261,87 @@ int BytecodeArrayRef::handler_table_size() const {
return object()->handler_table().length();
}
-Handle<Object> JSHeapBroker::GetRootHandle(Object object) {
- RootIndex root_index;
- CHECK(root_index_map().Lookup(object.ptr(), &root_index));
- return Handle<Object>(isolate()->root_handle(root_index).location());
-}
-
-// Accessors for direct heap reads.
-#define DIRECT_HEAP_ACCESSOR_C(holder, result, name) \
- result holder##Ref::name() const { return object()->name(); }
+#define IF_ACCESS_FROM_HEAP_C(name) \
+ if (data_->should_access_heap()) { \
+ AllowHandleAllocationIfNeeded handle_allocation(data_->kind(), \
+ broker()->mode()); \
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data_->kind(), \
+ broker()->mode()); \
+ return object()->name(); \
+ }
-#define IF_ACCESS_FROM_HEAP_C(holder, name) \
- if (data_->should_access_heap()) { \
- CHECK(broker()->mode() == JSHeapBroker::kDisabled || \
- ReadOnlyHeap::Contains(HeapObject::cast(*object()))); \
- AllowHandleAllocationIf handle_allocation(data_->kind(), \
- broker()->mode()); \
- AllowHandleDereferenceIf allow_handle_dereference(data_->kind(), \
- broker()->mode()); \
- return object()->name(); \
+#define IF_ACCESS_FROM_HEAP(result, name) \
+ if (data_->should_access_heap()) { \
+ AllowHandleAllocationIfNeeded handle_allocation(data_->kind(), \
+ broker()->mode()); \
+ AllowHandleDereferenceIfNeeded handle_dereference(data_->kind(), \
+ broker()->mode()); \
+ return result##Ref(broker(), \
+ broker()->CanonicalPersistentHandle(object()->name())); \
}
-#define IF_ACCESS_FROM_HEAP(holder, result, name) \
- if (data_->kind() == ObjectDataKind::kUnserializedHeapObject) { \
- AllowHandleAllocationIf handle_allocation(data_->kind(), \
- broker()->mode()); \
- AllowHandleDereferenceIf handle_dereference(data_->kind(), \
- broker()->mode()); \
- return result##Ref(broker(), \
- handle(object()->name(), broker()->isolate())); \
- } else if (data_->kind() == \
- ObjectDataKind::kUnserializedReadOnlyHeapObject) { \
- AllowHandleDereferenceIf handle_dereference(data_->kind(), \
- broker()->mode()); \
- return result##Ref(broker(), broker()->GetRootHandle(object()->name())); \
- }
-
-// Macros for definining a const getter that, depending on the broker mode,
-// either looks into the handle or into the serialized data.
-#define BIMODAL_ACCESSOR(holder, result, name) \
- result##Ref holder##Ref::name() const { \
- IF_ACCESS_FROM_HEAP(holder, result, name); \
- ObjectData* data = ObjectRef::data()->As##holder()->name(); \
- if (data->kind() == ObjectDataKind::kUnserializedHeapObject) { \
- return result##Ref(broker(), data->object()); \
- } else { \
- return result##Ref(broker(), ObjectRef::data()->As##holder()->name()); \
- } \
+// Macros for definining a const getter that, depending on the data kind,
+// either looks into the heap or into the serialized data.
+#define BIMODAL_ACCESSOR(holder, result, name) \
+ result##Ref holder##Ref::name() const { \
+ IF_ACCESS_FROM_HEAP(result, name); \
+ return result##Ref(broker(), ObjectRef::data()->As##holder()->name()); \
}
// Like above except that the result type is not an XYZRef.
#define BIMODAL_ACCESSOR_C(holder, result, name) \
result holder##Ref::name() const { \
- IF_ACCESS_FROM_HEAP_C(holder, name); \
+ IF_ACCESS_FROM_HEAP_C(name); \
return ObjectRef::data()->As##holder()->name(); \
}
// Like above but for BitFields.
#define BIMODAL_ACCESSOR_B(holder, field, name, BitField) \
typename BitField::FieldType holder##Ref::name() const { \
- IF_ACCESS_FROM_HEAP_C(holder, name); \
+ IF_ACCESS_FROM_HEAP_C(name); \
return BitField::decode(ObjectRef::data()->As##holder()->field()); \
}
+// Like IF_ACCESS_FROM_HEAP_C but we also allow direct heap access for
+// kSerialized only for methods that we identified to be safe.
+#define IF_ACCESS_FROM_HEAP_WITH_FLAG_C(name) \
+ if (data_->should_access_heap() || FLAG_turbo_direct_heap_access) { \
+ AllowHandleAllocationIfNeeded handle_allocation( \
+ data_->kind(), broker()->mode(), FLAG_turbo_direct_heap_access); \
+ AllowHandleDereferenceIfNeeded allow_handle_dereference( \
+ data_->kind(), broker()->mode(), FLAG_turbo_direct_heap_access); \
+ return object()->name(); \
+ }
+
+// Like BIMODAL_ACCESSOR_C except that we force a direct heap access if
+// FLAG_turbo_direct_heap_access is true (even for kSerialized). This is because
+// we identified the method to be safe to use direct heap access, but the
+// holder##Data class still needs to be serialized.
+#define BIMODAL_ACCESSOR_WITH_FLAG_C(holder, result, name) \
+ result holder##Ref::name() const { \
+ IF_ACCESS_FROM_HEAP_WITH_FLAG_C(name); \
+ return ObjectRef::data()->As##holder()->name(); \
+ }
+
BIMODAL_ACCESSOR(AllocationSite, Object, nested_site)
BIMODAL_ACCESSOR_C(AllocationSite, bool, CanInlineCall)
BIMODAL_ACCESSOR_C(AllocationSite, bool, PointsToLiteral)
BIMODAL_ACCESSOR_C(AllocationSite, ElementsKind, GetElementsKind)
BIMODAL_ACCESSOR_C(AllocationSite, AllocationType, GetAllocationType)
-DIRECT_HEAP_ACCESSOR_C(BytecodeArray, int, register_count)
-DIRECT_HEAP_ACCESSOR_C(BytecodeArray, int, parameter_count)
-DIRECT_HEAP_ACCESSOR_C(BytecodeArray, interpreter::Register,
- incoming_new_target_or_generator_register)
+BIMODAL_ACCESSOR_C(BigInt, uint64_t, AsUint64)
-BIMODAL_ACCESSOR(Cell, Object, value)
+BIMODAL_ACCESSOR_C(BytecodeArray, int, register_count)
+BIMODAL_ACCESSOR_C(BytecodeArray, int, parameter_count)
+BIMODAL_ACCESSOR_C(BytecodeArray, interpreter::Register,
+ incoming_new_target_or_generator_register)
BIMODAL_ACCESSOR_C(FeedbackVector, double, invocation_count)
BIMODAL_ACCESSOR(HeapObject, Map, map)
+BIMODAL_ACCESSOR_C(HeapNumber, double, value)
+
BIMODAL_ACCESSOR(JSArray, Object, length)
BIMODAL_ACCESSOR(JSBoundFunction, JSReceiver, bound_target_function)
@@ -3332,7 +3349,6 @@ BIMODAL_ACCESSOR(JSBoundFunction, Object, bound_this)
BIMODAL_ACCESSOR(JSBoundFunction, FixedArray, bound_arguments)
BIMODAL_ACCESSOR_C(JSDataView, size_t, byte_length)
-BIMODAL_ACCESSOR_C(JSDataView, size_t, byte_offset)
BIMODAL_ACCESSOR_C(JSFunction, bool, has_feedback_vector)
BIMODAL_ACCESSOR_C(JSFunction, bool, has_initial_map)
@@ -3388,28 +3404,27 @@ BIMODAL_ACCESSOR_C(Code, unsigned, inlined_bytecode_size)
BROKER_NATIVE_CONTEXT_FIELDS(DEF_NATIVE_CONTEXT_ACCESSOR)
#undef DEF_NATIVE_CONTEXT_ACCESSOR
+BIMODAL_ACCESSOR_C(ObjectBoilerplateDescription, int, size)
+
BIMODAL_ACCESSOR(PropertyCell, Object, value)
BIMODAL_ACCESSOR_C(PropertyCell, PropertyDetails, property_details)
base::Optional<CallHandlerInfoRef> FunctionTemplateInfoRef::call_code() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
return CallHandlerInfoRef(
- broker(), handle(object()->call_code(), broker()->isolate()));
+ broker(), broker()->CanonicalPersistentHandle(object()->call_code()));
}
- CallHandlerInfoData* call_code =
- data()->AsFunctionTemplateInfo()->call_code();
+ ObjectData* call_code = data()->AsFunctionTemplateInfo()->call_code();
if (!call_code) return base::nullopt;
return CallHandlerInfoRef(broker(), call_code);
}
bool FunctionTemplateInfoRef::is_signature_undefined() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
return object()->signature().IsUndefined(broker()->isolate());
}
@@ -3418,11 +3433,10 @@ bool FunctionTemplateInfoRef::is_signature_undefined() const {
bool FunctionTemplateInfoRef::has_call_code() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
CallOptimization call_optimization(broker()->isolate(), object());
return call_optimization.is_simple_api_call();
@@ -3437,11 +3451,10 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType(
const HolderLookupResult not_found;
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
CallOptimization call_optimization(broker()->isolate(), object());
Handle<Map> receiver_map_ref(receiver_map.object());
@@ -3468,7 +3481,7 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType(
FunctionTemplateInfoData* fti_data = data()->AsFunctionTemplateInfo();
KnownReceiversMap::iterator lookup_it =
- fti_data->known_receivers().find(receiver_map.data()->AsMap());
+ fti_data->known_receivers().find(receiver_map.data());
if (lookup_it != fti_data->known_receivers().cend()) {
return lookup_it->second;
}
@@ -3479,8 +3492,7 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType(
}
if (!receiver_map.IsJSReceiverMap() ||
(receiver_map.is_access_check_needed() && !accept_any_receiver())) {
- fti_data->known_receivers().insert(
- {receiver_map.data()->AsMap(), not_found});
+ fti_data->known_receivers().insert({receiver_map.data(), not_found});
return not_found;
}
@@ -3492,14 +3504,12 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType(
switch (result.lookup) {
case CallOptimization::kHolderFound: {
result.holder = JSObjectRef(broker(), holder);
- fti_data->known_receivers().insert(
- {receiver_map.data()->AsMap(), result});
+ fti_data->known_receivers().insert({receiver_map.data(), result});
break;
}
default: {
DCHECK_EQ(result.holder, base::nullopt);
- fti_data->known_receivers().insert(
- {receiver_map.data()->AsMap(), result});
+ fti_data->known_receivers().insert({receiver_map.data(), result});
}
}
return result;
@@ -3521,13 +3531,13 @@ BIMODAL_ACCESSOR(FeedbackCell, HeapObject, value)
base::Optional<ObjectRef> MapRef::GetStrongValue(
InternalIndex descriptor_index) const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
MaybeObject value =
object()->instance_descriptors().GetValue(descriptor_index);
HeapObject object;
if (value.GetHeapObjectIfStrong(&object)) {
- return ObjectRef(broker(), handle(object, broker()->isolate()));
+ return ObjectRef(broker(), broker()->CanonicalPersistentHandle((object)));
}
return base::nullopt;
}
@@ -3545,19 +3555,14 @@ void MapRef::SerializeRootMap() {
}
base::Optional<MapRef> MapRef::FindRootMap() const {
- if (data_->kind() == ObjectDataKind::kUnserializedHeapObject) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return MapRef(broker(), handle(object()->FindRootMap(broker()->isolate()),
- broker()->isolate()));
- } else if (data_->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return MapRef(broker(), broker()->GetRootHandle(
+ if (data_->should_access_heap()) {
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return MapRef(broker(), broker()->CanonicalPersistentHandle(
object()->FindRootMap(broker()->isolate())));
}
- MapData* map_data = data()->AsMap()->FindRootMap();
- if (map_data) {
+ ObjectData* map_data = data()->AsMap()->FindRootMap();
+ if (map_data != nullptr) {
return MapRef(broker(), map_data);
}
TRACE_BROKER_MISSING(broker(), "root map for object " << *this);
@@ -3566,58 +3571,58 @@ base::Optional<MapRef> MapRef::FindRootMap() const {
void* JSTypedArrayRef::data_ptr() const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->DataPtr();
}
return data()->AsJSTypedArray()->data_ptr();
}
bool MapRef::IsInobjectSlackTrackingInProgress() const {
- IF_ACCESS_FROM_HEAP_C(Map, IsInobjectSlackTrackingInProgress);
+ IF_ACCESS_FROM_HEAP_C(IsInobjectSlackTrackingInProgress);
return Map::Bits3::ConstructionCounterBits::decode(
data()->AsMap()->bit_field3()) != Map::kNoSlackTracking;
}
int MapRef::constructor_function_index() const {
- IF_ACCESS_FROM_HEAP_C(Map, GetConstructorFunctionIndex);
+ IF_ACCESS_FROM_HEAP_C(GetConstructorFunctionIndex);
CHECK(IsPrimitiveMap());
return data()->AsMap()->constructor_function_index();
}
bool MapRef::is_stable() const {
- IF_ACCESS_FROM_HEAP_C(Map, is_stable);
+ IF_ACCESS_FROM_HEAP_C(is_stable);
return !Map::Bits3::IsUnstableBit::decode(data()->AsMap()->bit_field3());
}
bool MapRef::CanBeDeprecated() const {
- IF_ACCESS_FROM_HEAP_C(Map, CanBeDeprecated);
+ IF_ACCESS_FROM_HEAP_C(CanBeDeprecated);
CHECK_GT(NumberOfOwnDescriptors(), 0);
return data()->AsMap()->can_be_deprecated();
}
bool MapRef::CanTransition() const {
- IF_ACCESS_FROM_HEAP_C(Map, CanTransition);
+ IF_ACCESS_FROM_HEAP_C(CanTransition);
return data()->AsMap()->can_transition();
}
int MapRef::GetInObjectPropertiesStartInWords() const {
- IF_ACCESS_FROM_HEAP_C(Map, GetInObjectPropertiesStartInWords);
+ IF_ACCESS_FROM_HEAP_C(GetInObjectPropertiesStartInWords);
return data()->AsMap()->in_object_properties_start_in_words();
}
int MapRef::GetInObjectProperties() const {
- IF_ACCESS_FROM_HEAP_C(Map, GetInObjectProperties);
+ IF_ACCESS_FROM_HEAP_C(GetInObjectProperties);
return data()->AsMap()->in_object_properties();
}
int ScopeInfoRef::ContextLength() const {
- IF_ACCESS_FROM_HEAP_C(ScopeInfo, ContextLength);
+ IF_ACCESS_FROM_HEAP_C(ContextLength);
return data()->AsScopeInfo()->context_length();
}
int ScopeInfoRef::Flags() const {
- IF_ACCESS_FROM_HEAP_C(ScopeInfo, Flags);
+ IF_ACCESS_FROM_HEAP_C(Flags);
return data()->AsScopeInfo()->flags();
}
@@ -3626,30 +3631,30 @@ bool ScopeInfoRef::HasContextExtension() const {
}
bool ScopeInfoRef::HasOuterScopeInfo() const {
- IF_ACCESS_FROM_HEAP_C(ScopeInfo, HasOuterScopeInfo);
+ IF_ACCESS_FROM_HEAP_C(HasOuterScopeInfo);
return data()->AsScopeInfo()->has_outer_scope_info();
}
ScopeInfoRef ScopeInfoRef::OuterScopeInfo() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return ScopeInfoRef(
- broker(), handle(object()->OuterScopeInfo(), broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return ScopeInfoRef(broker(), broker()->CanonicalPersistentHandle(
+ object()->OuterScopeInfo()));
}
return ScopeInfoRef(broker(), data()->AsScopeInfo()->outer_scope_info());
}
void ScopeInfoRef::SerializeScopeInfoChain() {
+ if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsScopeInfo()->SerializeScopeInfoChain(broker());
}
bool StringRef::IsExternalString() const {
- IF_ACCESS_FROM_HEAP_C(String, IsExternalString);
+ IF_ACCESS_FROM_HEAP_C(IsExternalString);
return data()->AsString()->is_external_string();
}
@@ -3661,47 +3666,45 @@ Address CallHandlerInfoRef::callback() const {
}
Address FunctionTemplateInfoRef::c_function() const {
- if (broker()->mode() == JSHeapBroker::kDisabled) {
+ if (data_->should_access_heap()) {
return v8::ToCData<Address>(object()->GetCFunction());
}
return HeapObjectRef::data()->AsFunctionTemplateInfo()->c_function();
}
const CFunctionInfo* FunctionTemplateInfoRef::c_signature() const {
- if (broker()->mode() == JSHeapBroker::kDisabled) {
+ if (data_->should_access_heap()) {
return v8::ToCData<CFunctionInfo*>(object()->GetCSignature());
}
return HeapObjectRef::data()->AsFunctionTemplateInfo()->c_signature();
}
bool StringRef::IsSeqString() const {
- IF_ACCESS_FROM_HEAP_C(String, IsSeqString);
+ IF_ACCESS_FROM_HEAP_C(IsSeqString);
return data()->AsString()->is_seq_string();
}
ScopeInfoRef NativeContextRef::scope_info() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return ScopeInfoRef(broker(),
- handle(object()->scope_info(), broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return ScopeInfoRef(
+ broker(), broker()->CanonicalPersistentHandle(object()->scope_info()));
}
return ScopeInfoRef(broker(), data()->AsNativeContext()->scope_info());
}
SharedFunctionInfoRef FeedbackVectorRef::shared_function_info() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return SharedFunctionInfoRef(
broker(),
- handle(object()->shared_function_info(), broker()->isolate()));
+ broker()->CanonicalPersistentHandle(object()->shared_function_info()));
}
return SharedFunctionInfoRef(
@@ -3771,8 +3774,8 @@ bool ObjectRef::IsTheHole() const {
bool ObjectRef::BooleanValue() const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
return object()->BooleanValue(broker()->isolate());
}
return IsSmi() ? (AsSmi() != 0) : data()->AsHeapObject()->boolean_value();
@@ -3805,18 +3808,22 @@ Maybe<double> ObjectRef::OddballToNumber() const {
base::Optional<ObjectRef> ObjectRef::GetOwnConstantElement(
uint32_t index, SerializationPolicy policy) const {
- if (data_->kind() == ObjectDataKind::kUnserializedHeapObject) {
- return (IsJSObject() || IsString())
- ? GetOwnElementFromHeap(broker(), object(), index, true)
- : base::nullopt;
- } else if (data_->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) {
- DCHECK(!IsJSObject());
- // TODO(mythria): For ReadOnly strings, currently we cannot access data from
- // heap without creating handles since we use LookupIterator. We should have
- // a custom implementation for read only strings that doesn't create
- // handles. Till then it is OK to disable this optimization since this only
- // impacts keyed accesses on read only strings.
- return base::nullopt;
+ if (!(IsJSObject() || IsString())) return base::nullopt;
+ if (data_->should_access_heap()) {
+ // TODO(neis): Once the CHECK_NE below is eliminated, i.e. once we can
+ // safely read from the background thread, the special branch for read-only
+ // objects can be removed as well.
+ if (data_->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) {
+ DCHECK(IsString());
+ // TODO(mythria): For ReadOnly strings, currently we cannot access data
+ // from heap without creating handles since we use LookupIterator. We
+ // should have a custom implementation for read only strings that doesn't
+ // create handles. Till then it is OK to disable this optimization since
+ // this only impacts keyed accesses on read only strings.
+ return base::nullopt;
+ }
+ CHECK_NE(data_->kind(), ObjectDataKind::kNeverSerializedHeapObject);
+ return GetOwnElementFromHeap(broker(), object(), index, true);
}
ObjectData* element = nullptr;
if (IsJSObject()) {
@@ -3833,7 +3840,6 @@ base::Optional<ObjectRef> JSObjectRef::GetOwnDataProperty(
Representation field_representation, FieldIndex index,
SerializationPolicy policy) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
return GetOwnDataPropertyFromHeap(broker(),
Handle<JSObject>::cast(object()),
field_representation, index);
@@ -3865,40 +3871,29 @@ base::Optional<ObjectRef> JSArrayRef::GetOwnCowElement(
return ObjectRef(broker(), element);
}
-double HeapNumberRef::value() const {
- IF_ACCESS_FROM_HEAP_C(HeapNumber, value);
- return data()->AsHeapNumber()->value();
-}
-
-uint64_t BigIntRef::AsUint64() const {
- IF_ACCESS_FROM_HEAP_C(BigInt, AsUint64);
- return data()->AsBigInt()->AsUint64();
-}
-
base::Optional<CellRef> SourceTextModuleRef::GetCell(int cell_index) const {
- if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return CellRef(broker(),
- handle(object()->GetCell(cell_index), broker()->isolate()));
- }
- CellData* cell = data()->AsSourceTextModule()->GetCell(broker(), cell_index);
+ if (data_->should_access_heap() || FLAG_turbo_direct_heap_access) {
+ AllowHandleAllocationIfNeeded allow_handle_allocation(
+ data()->kind(), broker()->mode(), FLAG_turbo_direct_heap_access);
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(
+ data()->kind(), broker()->mode(), FLAG_turbo_direct_heap_access);
+ return CellRef(broker(), broker()->CanonicalPersistentHandle(
+ object()->GetCell(cell_index)));
+ }
+ ObjectData* cell =
+ data()->AsSourceTextModule()->GetCell(broker(), cell_index);
if (cell == nullptr) return base::nullopt;
return CellRef(broker(), cell);
}
ObjectRef SourceTextModuleRef::import_meta() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return ObjectRef(broker(),
- handle(object()->import_meta(), broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return ObjectRef(
+ broker(), broker()->CanonicalPersistentHandle(object()->import_meta()));
}
return ObjectRef(broker(),
data()->AsSourceTextModule()->GetImportMeta(broker()));
@@ -3919,7 +3914,7 @@ ObjectRef::ObjectRef(JSHeapBroker* broker, Handle<Object> object,
RefsMap::Entry* entry = broker->refs_->LookupOrInsert(object.address());
ObjectData** storage = &(entry->value);
if (*storage == nullptr) {
- AllowHandleDereferenceIf allow_handle_dereference(
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(
kUnserializedHeapObject, broker->mode());
entry->value = broker->zone()->New<ObjectData>(
broker, storage, object,
@@ -3932,8 +3927,8 @@ ObjectRef::ObjectRef(JSHeapBroker* broker, Handle<Object> object,
UNREACHABLE();
}
if (!data_) { // TODO(mslekova): Remove once we're on the background thread.
- AllowHandleDereferenceIf allow_handle_dereference(data_->kind(),
- broker->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data_->kind(),
+ broker->mode());
object->Print();
}
CHECK_WITH_MSG(data_ != nullptr, "Object is not known to the heap broker");
@@ -3969,8 +3964,8 @@ OddballType GetOddballType(Isolate* isolate, Map map) {
HeapObjectType HeapObjectRef::GetHeapObjectType() const {
if (data_->should_access_heap()) {
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
Map map = Handle<HeapObject>::cast(object())->map();
HeapObjectType::Flags flags(0);
if (map.is_undetectable()) flags |= HeapObjectType::kUndetectable;
@@ -3985,15 +3980,14 @@ HeapObjectType HeapObjectRef::GetHeapObjectType() const {
}
base::Optional<JSObjectRef> AllocationSiteRef::boilerplate() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return JSObjectRef(broker(),
- handle(object()->boilerplate(), broker()->isolate()));
- }
- JSObjectData* boilerplate = data()->AsAllocationSite()->boilerplate();
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return JSObjectRef(
+ broker(), broker()->CanonicalPersistentHandle(object()->boilerplate()));
+ }
+ ObjectData* boilerplate = data()->AsAllocationSite()->boilerplate();
if (boilerplate) {
return JSObjectRef(broker(), boilerplate);
} else {
@@ -4007,24 +4001,18 @@ ElementsKind JSObjectRef::GetElementsKind() const {
FixedArrayBaseRef JSObjectRef::elements() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return FixedArrayBaseRef(broker(),
- handle(object()->elements(), broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return FixedArrayBaseRef(
+ broker(), broker()->CanonicalPersistentHandle(object()->elements()));
}
- ObjectData* elements_data = data()->AsJSObject()->elements();
- if (elements_data->kind() ==
- ObjectDataKind::kUnserializedReadOnlyHeapObject) {
- return FixedArrayBaseRef(broker(), elements_data->object());
- }
- return FixedArrayBaseRef(broker(), elements_data->AsFixedArrayBase());
+ return FixedArrayBaseRef(broker(), data()->AsJSObject()->elements());
}
int FixedArrayBaseRef::length() const {
- IF_ACCESS_FROM_HEAP_C(FixedArrayBase, length);
+ IF_ACCESS_FROM_HEAP_C(length);
return data()->AsFixedArrayBase()->length();
}
@@ -4051,11 +4039,12 @@ base::Optional<SharedFunctionInfoRef> FeedbackCellRef::shared_function_info()
}
void FeedbackVectorRef::Serialize() {
+ if (data_->should_access_heap()) return;
+ CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsFeedbackVector()->Serialize(broker());
}
bool FeedbackVectorRef::serialized() const {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return true;
return data()->AsFeedbackVector()->serialized();
}
@@ -4066,32 +4055,33 @@ bool NameRef::IsUniqueName() const {
}
ObjectRef JSRegExpRef::data() const {
- IF_ACCESS_FROM_HEAP(JSRegExp, Object, data);
+ IF_ACCESS_FROM_HEAP(Object, data);
return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->data());
}
ObjectRef JSRegExpRef::flags() const {
- IF_ACCESS_FROM_HEAP(JSRegExp, Object, flags);
+ IF_ACCESS_FROM_HEAP(Object, flags);
return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->flags());
}
ObjectRef JSRegExpRef::last_index() const {
- IF_ACCESS_FROM_HEAP(JSRegExp, Object, last_index);
+ IF_ACCESS_FROM_HEAP(Object, last_index);
return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->last_index());
}
ObjectRef JSRegExpRef::raw_properties_or_hash() const {
- IF_ACCESS_FROM_HEAP(JSRegExp, Object, raw_properties_or_hash);
+ IF_ACCESS_FROM_HEAP(Object, raw_properties_or_hash);
return ObjectRef(broker(),
ObjectRef::data()->AsJSRegExp()->raw_properties_or_hash());
}
ObjectRef JSRegExpRef::source() const {
- IF_ACCESS_FROM_HEAP(JSRegExp, Object, source);
+ IF_ACCESS_FROM_HEAP(Object, source);
return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->source());
}
void JSRegExpRef::SerializeAsRegExpBoilerplate() {
+ if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
JSObjectRef::data()->AsJSRegExp()->SerializeAsRegExpBoilerplate(broker());
}
@@ -4122,7 +4112,8 @@ Handle<Object> ObjectRef::object() const {
}
#endif // DEBUG
-HEAP_BROKER_OBJECT_LIST(DEF_OBJECT_GETTER)
+HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEF_OBJECT_GETTER)
+HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEF_OBJECT_GETTER)
#undef DEF_OBJECT_GETTER
JSHeapBroker* ObjectRef::broker() const { return broker_; }
@@ -4163,13 +4154,15 @@ void NativeContextData::Serialize(JSHeapBroker* broker) {
TraceScope tracer(broker, this, "NativeContextData::Serialize");
Handle<NativeContext> context = Handle<NativeContext>::cast(object());
-#define SERIALIZE_MEMBER(type, name) \
- DCHECK_NULL(name##_); \
- name##_ = broker->GetOrCreateData(context->name())->As##type(); \
- if (name##_->IsJSFunction()) name##_->AsJSFunction()->Serialize(broker); \
- if (name##_->IsMap() && \
- !InstanceTypeChecker::IsContext(name##_->AsMap()->instance_type())) { \
- name##_->AsMap()->SerializeConstructor(broker); \
+#define SERIALIZE_MEMBER(type, name) \
+ DCHECK_NULL(name##_); \
+ name##_ = broker->GetOrCreateData(context->name()); \
+ if (!name##_->should_access_heap()) { \
+ if (name##_->IsJSFunction()) name##_->AsJSFunction()->Serialize(broker); \
+ if (name##_->IsMap() && \
+ !InstanceTypeChecker::IsContext(name##_->AsMap()->instance_type())) { \
+ name##_->AsMap()->SerializeConstructor(broker); \
+ } \
}
BROKER_COMPULSORY_NATIVE_CONTEXT_FIELDS(SERIALIZE_MEMBER)
if (!broker->isolate()->bootstrapper()->IsActive()) {
@@ -4177,35 +4170,37 @@ void NativeContextData::Serialize(JSHeapBroker* broker) {
}
#undef SERIALIZE_MEMBER
- bound_function_with_constructor_map_->SerializePrototype(broker);
- bound_function_without_constructor_map_->SerializePrototype(broker);
+ if (!bound_function_with_constructor_map_->should_access_heap()) {
+ bound_function_with_constructor_map_->AsMap()->SerializePrototype(broker);
+ }
+ if (!bound_function_without_constructor_map_->should_access_heap()) {
+ bound_function_without_constructor_map_->AsMap()->SerializePrototype(
+ broker);
+ }
DCHECK(function_maps_.empty());
int const first = Context::FIRST_FUNCTION_MAP_INDEX;
int const last = Context::LAST_FUNCTION_MAP_INDEX;
function_maps_.reserve(last + 1 - first);
for (int i = first; i <= last; ++i) {
- function_maps_.push_back(broker->GetOrCreateData(context->get(i))->AsMap());
+ function_maps_.push_back(broker->GetOrCreateData(context->get(i)));
}
- scope_info_ = broker->GetOrCreateData(context->scope_info())->AsScopeInfo();
+ scope_info_ = broker->GetOrCreateData(context->scope_info());
}
void JSFunctionRef::Serialize() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsJSFunction()->Serialize(broker());
}
bool JSBoundFunctionRef::serialized() const {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return true;
return data()->AsJSBoundFunction()->serialized();
}
bool JSFunctionRef::serialized() const {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return true;
return data()->AsJSFunction()->serialized();
}
@@ -4225,11 +4220,10 @@ JSArrayRef SharedFunctionInfoRef::GetTemplateObject(
}
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
Handle<JSArray> template_object =
TemplateObjectDescription::GetTemplateObject(
isolate(), broker()->target_native_context().object(),
@@ -4237,28 +4231,30 @@ JSArrayRef SharedFunctionInfoRef::GetTemplateObject(
return JSArrayRef(broker(), template_object);
}
- JSArrayData* array =
+ ObjectData* array =
data()->AsSharedFunctionInfo()->GetTemplateObject(source.slot);
if (array != nullptr) return JSArrayRef(broker(), array);
CHECK_EQ(policy, SerializationPolicy::kSerializeIfNeeded);
- CHECK(broker()->SerializingAllowed());
+ CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
Handle<JSArray> template_object =
TemplateObjectDescription::GetTemplateObject(
broker()->isolate(), broker()->target_native_context().object(),
description.object(), object(), source.slot.ToInt());
- array = broker()->GetOrCreateData(template_object)->AsJSArray();
+ array = broker()->GetOrCreateData(template_object);
data()->AsSharedFunctionInfo()->SetTemplateObject(source.slot, array);
return JSArrayRef(broker(), array);
}
void SharedFunctionInfoRef::SerializeFunctionTemplateInfo() {
+ if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsSharedFunctionInfo()->SerializeFunctionTemplateInfo(broker());
}
void SharedFunctionInfoRef::SerializeScopeInfoChain() {
+ if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsSharedFunctionInfo()->SerializeScopeInfoChain(broker());
}
@@ -4266,39 +4262,37 @@ void SharedFunctionInfoRef::SerializeScopeInfoChain() {
base::Optional<FunctionTemplateInfoRef>
SharedFunctionInfoRef::function_template_info() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (object()->IsApiFunction()) {
return FunctionTemplateInfoRef(
- broker(), handle(object()->function_data(), broker()->isolate()));
+ broker(),
+ broker()->CanonicalPersistentHandle(object()->function_data()));
}
return base::nullopt;
}
- FunctionTemplateInfoData* function_template_info =
+ ObjectData* function_template_info =
data()->AsSharedFunctionInfo()->function_template_info();
if (!function_template_info) return base::nullopt;
return FunctionTemplateInfoRef(broker(), function_template_info);
}
int SharedFunctionInfoRef::context_header_size() const {
- IF_ACCESS_FROM_HEAP_C(SharedFunctionInfo, scope_info().ContextHeaderLength);
+ IF_ACCESS_FROM_HEAP_C(scope_info().ContextHeaderLength);
return data()->AsSharedFunctionInfo()->context_header_size();
}
ScopeInfoRef SharedFunctionInfoRef::scope_info() const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
- AllowHandleAllocationIf allow_handle_allocation(data()->kind(),
- broker()->mode());
- AllowHandleDereferenceIf allow_handle_dereference(data()->kind(),
- broker()->mode());
- return ScopeInfoRef(broker(),
- handle(object()->scope_info(), broker()->isolate()));
+ AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(),
+ broker()->mode());
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(),
+ broker()->mode());
+ return ScopeInfoRef(
+ broker(), broker()->CanonicalPersistentHandle(object()->scope_info()));
}
return ScopeInfoRef(broker(), data()->AsSharedFunctionInfo()->scope_info());
}
void JSObjectRef::SerializeObjectCreateMap() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsJSObject()->SerializeObjectCreateMap(broker());
@@ -4345,14 +4339,12 @@ bool MapRef::serialized_prototype() const {
}
void SourceTextModuleRef::Serialize() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsSourceTextModule()->Serialize(broker());
}
void NativeContextRef::Serialize() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsNativeContext()->Serialize(broker());
@@ -4370,21 +4362,18 @@ bool JSTypedArrayRef::serialized() const {
}
void JSBoundFunctionRef::Serialize() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsJSBoundFunction()->Serialize(broker());
}
void PropertyCellRef::Serialize() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsPropertyCell()->Serialize(broker());
}
void FunctionTemplateInfoRef::SerializeCallCode() {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
if (data_->should_access_heap()) return;
CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing);
data()->AsFunctionTemplateInfo()->SerializeCallCode(broker());
@@ -4393,12 +4382,10 @@ void FunctionTemplateInfoRef::SerializeCallCode() {
base::Optional<PropertyCellRef> JSGlobalObjectRef::GetPropertyCell(
NameRef const& name, SerializationPolicy policy) const {
if (data_->should_access_heap()) {
- DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject);
return GetPropertyCellFromHeap(broker(), name.object());
}
- PropertyCellData* property_cell_data =
- data()->AsJSGlobalObject()->GetPropertyCell(
- broker(), name.data()->AsName(), policy);
+ ObjectData* property_cell_data = data()->AsJSGlobalObject()->GetPropertyCell(
+ broker(), name.data(), policy);
if (property_cell_data == nullptr) return base::nullopt;
return PropertyCellRef(broker(), property_cell_data);
}
@@ -4479,7 +4466,6 @@ GlobalAccessFeedback::GlobalAccessFeedback(PropertyCellRef cell,
GlobalAccessFeedback::GlobalAccessFeedback(FeedbackSlotKind slot_kind)
: ProcessedFeedback(kGlobalAccess, slot_kind),
- cell_or_context_(base::nullopt),
index_and_immutable_(0 /* doesn't matter */) {
DCHECK(IsGlobalICKind(slot_kind));
}
@@ -4611,12 +4597,12 @@ bool ElementAccessFeedback::HasOnlyStringMaps(JSHeapBroker* broker) const {
}
MinimorphicLoadPropertyAccessFeedback::MinimorphicLoadPropertyAccessFeedback(
- NameRef const& name, FeedbackSlotKind slot_kind, bool is_monomorphic,
- Handle<Object> handler, bool has_migration_target_maps)
+ NameRef const& name, FeedbackSlotKind slot_kind, Handle<Object> handler,
+ MaybeHandle<Map> maybe_map, bool has_migration_target_maps)
: ProcessedFeedback(kMinimorphicPropertyAccess, slot_kind),
name_(name),
- is_monomorphic_(is_monomorphic),
handler_(handler),
+ maybe_map_(maybe_map),
has_migration_target_maps_(has_migration_target_maps) {
DCHECK(IsLoadICKind(slot_kind));
}
@@ -4690,11 +4676,22 @@ void FilterRelevantReceiverMaps(Isolate* isolate, MapHandles* maps) {
}
MaybeObjectHandle TryGetMinimorphicHandler(
- std::vector<MapAndHandler> const& maps_and_handlers,
- FeedbackSlotKind kind) {
+ std::vector<MapAndHandler> const& maps_and_handlers, FeedbackSlotKind kind,
+ Handle<NativeContext> native_context) {
if (!FLAG_dynamic_map_checks || !IsLoadICKind(kind))
return MaybeObjectHandle();
+ // Don't use dynamic map checks when loading properties from Array.prototype.
+ // Using dynamic map checks prevents constant folding and hence does not
+ // inline the array builtins. We only care about monomorphic cases here. For
+ // polymorphic loads currently we don't inline the builtins even without
+ // dynamic map checks.
+ if (maps_and_handlers.size() == 1 &&
+ *maps_and_handlers[0].first ==
+ native_context->initial_array_prototype().map()) {
+ return MaybeObjectHandle();
+ }
+
MaybeObjectHandle initial_handler;
for (MapAndHandler map_and_handler : maps_and_handlers) {
auto map = map_and_handler.first;
@@ -4752,11 +4749,16 @@ ProcessedFeedback const& JSHeapBroker::ReadFeedbackForPropertyAccess(
base::Optional<NameRef> name =
static_name.has_value() ? static_name : GetNameFeedback(nexus);
- MaybeObjectHandle handler = TryGetMinimorphicHandler(maps_and_handlers, kind);
+ MaybeObjectHandle handler = TryGetMinimorphicHandler(
+ maps_and_handlers, kind, target_native_context().object());
if (!handler.is_null()) {
+ MaybeHandle<Map> maybe_map;
+ if (nexus.ic_state() == MONOMORPHIC) {
+ DCHECK_EQ(maps.size(), 1);
+ maybe_map = maps[0];
+ }
return *zone()->New<MinimorphicLoadPropertyAccessFeedback>(
- *name, kind, nexus.ic_state() == MONOMORPHIC, handler.object(),
- HasMigrationTargets(maps));
+ *name, kind, handler.object(), maybe_map, HasMigrationTargets(maps));
}
FilterRelevantReceiverMaps(isolate(), &maps);
@@ -5169,15 +5171,13 @@ void ElementAccessFeedback::AddGroup(TransitionGroup&& group) {
}
std::ostream& operator<<(std::ostream& os, const ObjectRef& ref) {
- if (ref.data_->kind() == ObjectDataKind::kUnserializedHeapObject ||
- !FLAG_concurrent_recompilation) {
+ if (!FLAG_concurrent_recompilation) {
// We cannot be in a background thread so it's safe to read the heap.
AllowHandleDereference allow_handle_dereference;
return os << ref.data() << " {" << ref.object() << "}";
- } else if (ref.data_->kind() ==
- ObjectDataKind::kUnserializedReadOnlyHeapObject) {
- AllowHandleDereferenceIf allow_handle_dereference(ref.data()->kind(),
- ref.broker()->mode());
+ } else if (ref.data_->should_access_heap()) {
+ AllowHandleDereferenceIfNeeded allow_handle_dereference(
+ ref.data()->kind(), ref.broker()->mode());
return os << ref.data() << " {" << ref.object() << "}";
} else {
return os << ref.data();
@@ -5210,7 +5210,7 @@ PropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo(
PropertyAccessInfo access_info = factory.ComputePropertyAccessInfo(
map.object(), name.object(), access_mode);
if (is_concurrent_inlining_) {
- CHECK(SerializingAllowed());
+ CHECK_EQ(mode(), kSerializing);
TRACE(this, "Storing PropertyAccessInfo for "
<< access_mode << " of property " << name << " on map "
<< map);
@@ -5222,12 +5222,13 @@ PropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo(
MinimorphicLoadPropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo(
MinimorphicLoadPropertyAccessFeedback const& feedback,
FeedbackSource const& source, SerializationPolicy policy) {
- auto it = minimorphic_property_access_infos_.find(source.index());
+ auto it = minimorphic_property_access_infos_.find(source);
if (it != minimorphic_property_access_infos_.end()) return it->second;
if (policy == SerializationPolicy::kAssumeSerialized) {
- TRACE_BROKER_MISSING(
- this, "MinimorphicLoadPropertyAccessInfo for slot " << source.index());
+ TRACE_BROKER_MISSING(this, "MinimorphicLoadPropertyAccessInfo for slot "
+ << source.index() << " "
+ << ObjectRef(this, source.vector));
return MinimorphicLoadPropertyAccessInfo::Invalid();
}
@@ -5235,9 +5236,10 @@ MinimorphicLoadPropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo(
MinimorphicLoadPropertyAccessInfo access_info =
factory.ComputePropertyAccessInfo(feedback);
if (is_concurrent_inlining_) {
- TRACE(this,
- "Storing MinimorphicLoadPropertyAccessInfo for " << source.index());
- minimorphic_property_access_infos_.insert({source.index(), access_info});
+ TRACE(this, "Storing MinimorphicLoadPropertyAccessInfo for "
+ << source.index() << " "
+ << ObjectRef(this, source.vector));
+ minimorphic_property_access_infos_.insert({source, access_info});
}
return access_info;
}
diff --git a/deps/v8/src/compiler/js-heap-broker.h b/deps/v8/src/compiler/js-heap-broker.h
index fdac46b9fd..d2bfbace26 100644
--- a/deps/v8/src/compiler/js-heap-broker.h
+++ b/deps/v8/src/compiler/js-heap-broker.h
@@ -10,6 +10,7 @@
#include "src/common/globals.h"
#include "src/compiler/access-info.h"
#include "src/compiler/feedback-source.h"
+#include "src/compiler/globals.h"
#include "src/compiler/processed-feedback.h"
#include "src/compiler/refs-map.h"
#include "src/compiler/serializer-hints.h"
@@ -103,6 +104,12 @@ class V8_EXPORT_PRIVATE JSHeapBroker {
bool is_native_context_independent() const {
return is_native_context_independent_;
}
+ bool generate_full_feedback_collection() const {
+ // NCI code currently collects full feedback.
+ DCHECK_IMPLIES(is_native_context_independent(),
+ CollectFeedbackInGenericLowering());
+ return is_native_context_independent();
+ }
enum BrokerMode { kDisabled, kSerializing, kSerialized, kRetired };
BrokerMode mode() const { return mode_; }
@@ -363,7 +370,8 @@ class V8_EXPORT_PRIVATE JSHeapBroker {
ZoneUnorderedMap<PropertyAccessTarget, PropertyAccessInfo,
PropertyAccessTarget::Hash, PropertyAccessTarget::Equal>
property_access_infos_;
- ZoneUnorderedMap<int, MinimorphicLoadPropertyAccessInfo>
+ ZoneUnorderedMap<FeedbackSource, MinimorphicLoadPropertyAccessInfo,
+ FeedbackSource::Hash, FeedbackSource::Equal>
minimorphic_property_access_infos_;
ZoneVector<ObjectData*> typed_array_string_tags_;
@@ -441,6 +449,27 @@ class OffHeapBytecodeArray final : public interpreter::AbstractBytecodeArray {
BytecodeArrayRef array_;
};
+// Scope that unparks the LocalHeap, if:
+// a) We have a JSHeapBroker,
+// b) Said JSHeapBroker has a LocalHeap, and
+// c) Said LocalHeap has been parked.
+// Used, for example, when printing the graph with --trace-turbo with a
+// previously parked LocalHeap.
+class UnparkedScopeIfNeeded {
+ public:
+ explicit UnparkedScopeIfNeeded(JSHeapBroker* broker) {
+ if (broker != nullptr) {
+ LocalHeap* local_heap = broker->local_heap();
+ if (local_heap != nullptr && local_heap->IsParked()) {
+ unparked_scope.emplace(local_heap);
+ }
+ }
+ }
+
+ private:
+ base::Optional<UnparkedScope> unparked_scope;
+};
+
} // namespace compiler
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/compiler/js-heap-copy-reducer.cc b/deps/v8/src/compiler/js-heap-copy-reducer.cc
index 069d42bc34..837369ec55 100644
--- a/deps/v8/src/compiler/js-heap-copy-reducer.cc
+++ b/deps/v8/src/compiler/js-heap-copy-reducer.cc
@@ -171,6 +171,13 @@ Reduction JSHeapCopyReducer::Reduce(Node* node) {
}
break;
}
+ case IrOpcode::kJSLoadNamedFromSuper: {
+ // TODO(marja, v8:9237): Process feedback once it's added to the byte
+ // code.
+ NamedAccess const& p = NamedAccessOf(node->op());
+ NameRef name(broker(), p.name());
+ break;
+ }
case IrOpcode::kJSStoreNamed: {
NamedAccess const& p = NamedAccessOf(node->op());
NameRef name(broker(), p.name());
diff --git a/deps/v8/src/compiler/js-inlining.cc b/deps/v8/src/compiler/js-inlining.cc
index 66e7820d65..74e9d2c012 100644
--- a/deps/v8/src/compiler/js-inlining.cc
+++ b/deps/v8/src/compiler/js-inlining.cc
@@ -470,8 +470,8 @@ Reduction JSInliner::ReduceJSCall(Node* node) {
CallFrequency frequency = call.frequency();
BuildGraphFromBytecode(broker(), zone(), *shared_info, feedback_vector,
BailoutId::None(), jsgraph(), frequency,
- source_positions_, inlining_id, flags,
- &info_->tick_counter());
+ source_positions_, inlining_id, info_->code_kind(),
+ flags, &info_->tick_counter());
}
// Extract the inlinee start/end nodes.
diff --git a/deps/v8/src/compiler/js-intrinsic-lowering.cc b/deps/v8/src/compiler/js-intrinsic-lowering.cc
index c5fda401dd..03ac064c4e 100644
--- a/deps/v8/src/compiler/js-intrinsic-lowering.cc
+++ b/deps/v8/src/compiler/js-intrinsic-lowering.cc
@@ -82,7 +82,7 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) {
return ReduceToLength(node);
case Runtime::kInlineToObject:
return ReduceToObject(node);
- case Runtime::kInlineToStringRT:
+ case Runtime::kInlineToString:
return ReduceToString(node);
case Runtime::kInlineCall:
return ReduceCall(node);
diff --git a/deps/v8/src/compiler/js-native-context-specialization.cc b/deps/v8/src/compiler/js-native-context-specialization.cc
index 2fd99244d1..2a4524f386 100644
--- a/deps/v8/src/compiler/js-native-context-specialization.cc
+++ b/deps/v8/src/compiler/js-native-context-specialization.cc
@@ -1071,13 +1071,10 @@ Reduction JSNativeContextSpecialization::ReduceMinimorphicPropertyAccess(
if (feedback.has_migration_target_maps()) {
flags |= CheckMapsFlag::kTryMigrateInstance;
}
- effect = graph()->NewNode(
- simplified()->DynamicCheckMaps(
- flags, feedback.handler(), source,
- feedback.is_monomorphic()
- ? DynamicCheckMapsParameters::ICState::kMonomorphic
- : DynamicCheckMapsParameters::ICState::kPolymorphic),
- receiver, effect, control);
+ effect =
+ graph()->NewNode(simplified()->DynamicCheckMaps(flags, feedback.handler(),
+ feedback.map(), source),
+ receiver, effect, control);
value = access_builder.BuildMinimorphicLoadDataField(
feedback.name(), access_info, receiver, &effect, &control);
diff --git a/deps/v8/src/compiler/js-operator.cc b/deps/v8/src/compiler/js-operator.cc
index f905505e2a..dccc9558b5 100644
--- a/deps/v8/src/compiler/js-operator.cc
+++ b/deps/v8/src/compiler/js-operator.cc
@@ -287,6 +287,7 @@ std::ostream& operator<<(std::ostream& os, NamedAccess const& p) {
NamedAccess const& NamedAccessOf(const Operator* op) {
DCHECK(op->opcode() == IrOpcode::kJSLoadNamed ||
+ op->opcode() == IrOpcode::kJSLoadNamedFromSuper ||
op->opcode() == IrOpcode::kJSStoreNamed);
return OpParameter<NamedAccess>(op);
}
@@ -918,6 +919,19 @@ const Operator* JSOperatorBuilder::LoadNamed(Handle<Name> name,
access); // parameter
}
+const Operator* JSOperatorBuilder::LoadNamedFromSuper(Handle<Name> name) {
+ static constexpr int kReceiver = 1;
+ static constexpr int kHomeObject = 1;
+ static constexpr int kArity = kReceiver + kHomeObject;
+ // TODO(marja, v8:9237): Use real feedback.
+ NamedAccess access(LanguageMode::kSloppy, name, FeedbackSource());
+ return zone()->New<Operator1<NamedAccess>>( // --
+ IrOpcode::kJSLoadNamedFromSuper, Operator::kNoProperties, // opcode
+ "JSLoadNamedFromSuper", // name
+ kArity, 1, 1, 1, 1, 2, // counts
+ access); // parameter
+}
+
const Operator* JSOperatorBuilder::LoadProperty(
FeedbackSource const& feedback) {
PropertyAccess access(LanguageMode::kSloppy, feedback);
diff --git a/deps/v8/src/compiler/js-operator.h b/deps/v8/src/compiler/js-operator.h
index 1df5326ae4..4043969000 100644
--- a/deps/v8/src/compiler/js-operator.h
+++ b/deps/v8/src/compiler/js-operator.h
@@ -921,6 +921,7 @@ class V8_EXPORT_PRIVATE JSOperatorBuilder final
const Operator* LoadProperty(FeedbackSource const& feedback);
const Operator* LoadNamed(Handle<Name> name, FeedbackSource const& feedback);
+ const Operator* LoadNamedFromSuper(Handle<Name> name);
const Operator* StoreProperty(LanguageMode language_mode,
FeedbackSource const& feedback);
@@ -1389,6 +1390,22 @@ class JSLoadNamedNode final : public JSNodeWrapperBase {
#undef INPUTS
};
+class JSLoadNamedFromSuperNode final : public JSNodeWrapperBase {
+ public:
+ explicit constexpr JSLoadNamedFromSuperNode(Node* node)
+ : JSNodeWrapperBase(node) {
+ CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kJSLoadNamedFromSuper);
+ }
+
+ const NamedAccess& Parameters() const { return NamedAccessOf(node()->op()); }
+
+#define INPUTS(V) \
+ V(Receiver, receiver, 0, Object) \
+ V(Object, home_object, 1, Object)
+ INPUTS(DEFINE_INPUT_ACCESSORS)
+#undef INPUTS
+};
+
class JSStoreNamedNode final : public JSNodeWrapperBase {
public:
explicit constexpr JSStoreNamedNode(Node* node) : JSNodeWrapperBase(node) {
diff --git a/deps/v8/src/compiler/js-typed-lowering.cc b/deps/v8/src/compiler/js-typed-lowering.cc
index 499af9442c..46018225a3 100644
--- a/deps/v8/src/compiler/js-typed-lowering.cc
+++ b/deps/v8/src/compiler/js-typed-lowering.cc
@@ -1589,11 +1589,13 @@ void ReduceBuiltin(JSGraph* jsgraph, Node* node, int builtin_index, int arity,
NodeProperties::ChangeOp(node, jsgraph->common()->Call(call_descriptor));
}
+#ifndef V8_NO_ARGUMENTS_ADAPTOR
bool NeedsArgumentAdaptorFrame(SharedFunctionInfoRef shared, int arity) {
static const int sentinel = kDontAdaptArgumentsSentinel;
const int num_decl_parms = shared.internal_formal_parameter_count();
return (num_decl_parms != arity && num_decl_parms != sentinel);
}
+#endif
} // namespace
@@ -1779,6 +1781,26 @@ Reduction JSTypedLowering::ReduceJSCall(Node* node) {
CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState;
Node* new_target = jsgraph()->UndefinedConstant();
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ int formal_count = shared->internal_formal_parameter_count();
+ if (formal_count != kDontAdaptArgumentsSentinel && formal_count > arity) {
+ node->RemoveInput(n.FeedbackVectorIndex());
+ // Underapplication. Massage the arguments to match the expected number of
+ // arguments.
+ for (int i = arity; i < formal_count; i++) {
+ node->InsertInput(graph()->zone(), arity + 2,
+ jsgraph()->UndefinedConstant());
+ }
+
+ // Patch {node} to a direct call.
+ node->InsertInput(graph()->zone(), formal_count + 2, new_target);
+ node->InsertInput(graph()->zone(), formal_count + 3,
+ jsgraph()->Constant(arity));
+ NodeProperties::ChangeOp(node,
+ common()->Call(Linkage::GetJSCallDescriptor(
+ graph()->zone(), false, 1 + formal_count,
+ flags | CallDescriptor::kCanUseRoots)));
+#else
if (NeedsArgumentAdaptorFrame(*shared, arity)) {
node->RemoveInput(n.FeedbackVectorIndex());
@@ -1826,6 +1848,7 @@ Reduction JSTypedLowering::ReduceJSCall(Node* node) {
common()->Call(Linkage::GetStubCallDescriptor(
graph()->zone(), callable.descriptor(), 1 + arity, flags)));
}
+#endif
} else if (shared->HasBuiltinId() &&
Builtins::IsCpp(shared->builtin_id())) {
// Patch {node} to a direct CEntry call.
@@ -2406,7 +2429,16 @@ Reduction JSTypedLowering::ReduceJSResolvePromise(Node* node) {
Reduction JSTypedLowering::Reduce(Node* node) {
DisallowHeapAccess no_heap_access;
- switch (node->opcode()) {
+ const IrOpcode::Value opcode = node->opcode();
+ if (broker()->generate_full_feedback_collection() &&
+ IrOpcode::IsFeedbackCollectingOpcode(opcode)) {
+ // In NCI code, it is not valid to reduce feedback-collecting JS opcodes
+ // into non-feedback-collecting lower-level opcodes; missed feedback would
+ // result in soft deopts.
+ return NoChange();
+ }
+
+ switch (opcode) {
case IrOpcode::kJSEqual:
return ReduceJSEqual(node);
case IrOpcode::kJSStrictEqual:
diff --git a/deps/v8/src/compiler/linkage.cc b/deps/v8/src/compiler/linkage.cc
index b8c14db539..cde4b96c87 100644
--- a/deps/v8/src/compiler/linkage.cc
+++ b/deps/v8/src/compiler/linkage.cc
@@ -94,6 +94,12 @@ int CallDescriptor::GetFirstUnusedStackSlot() const {
int CallDescriptor::GetStackParameterDelta(
CallDescriptor const* tail_caller) const {
+ // In the IsTailCallForTierUp case, the callee has
+ // identical linkage and runtime arguments to the caller, thus the stack
+ // parameter delta is 0. We don't explicitly pass the runtime arguments as
+ // inputs to the TailCall node, since they already exist on the stack.
+ if (IsTailCallForTierUp()) return 0;
+
int callee_slots_above_sp = GetFirstUnusedStackSlot();
int tail_caller_slots_above_sp = tail_caller->GetFirstUnusedStackSlot();
int stack_param_delta = callee_slots_above_sp - tail_caller_slots_above_sp;
@@ -103,6 +109,7 @@ int CallDescriptor::GetStackParameterDelta(
// of padding.
++stack_param_delta;
} else {
+ DCHECK_NE(tail_caller_slots_above_sp % 2, 0);
// The delta is odd because of the caller. We already have one slot of
// padding that we can reuse for arguments, so we will need one fewer
// slot.
@@ -147,9 +154,7 @@ bool CallDescriptor::CanTailCall(const CallDescriptor* callee) const {
int CallDescriptor::CalculateFixedFrameSize(CodeKind code_kind) const {
switch (kind_) {
case kCallJSFunction:
- return PushArgumentCount()
- ? OptimizedBuiltinFrameConstants::kFixedSlotCount
- : StandardFrameConstants::kFixedSlotCount;
+ return StandardFrameConstants::kFixedSlotCount;
case kCallAddress:
if (code_kind == CodeKind::C_WASM_ENTRY) {
return CWasmEntryFrameConstants::kFixedSlotCount;
diff --git a/deps/v8/src/compiler/linkage.h b/deps/v8/src/compiler/linkage.h
index e14f9cd8a4..d96b049d92 100644
--- a/deps/v8/src/compiler/linkage.h
+++ b/deps/v8/src/compiler/linkage.h
@@ -205,6 +205,9 @@ class V8_EXPORT_PRIVATE CallDescriptor final
kCallBuiltinPointer, // target is a builtin pointer
};
+ // NOTE: The lowest 10 bits of the Flags field are encoded in InstructionCode
+ // (for use in the code generator). All higher bits are lost.
+ static constexpr int kFlagsBitsEncodedInInstructionCode = 10;
enum Flag {
kNoFlags = 0u,
kNeedsFrameState = 1u << 0,
@@ -214,17 +217,36 @@ class V8_EXPORT_PRIVATE CallDescriptor final
kInitializeRootRegister = 1u << 3,
// Does not ever try to allocate space on our heap.
kNoAllocate = 1u << 4,
- // Push argument count as part of function prologue.
- kPushArgumentCount = 1u << 5,
// Use retpoline for this call if indirect.
- kRetpoline = 1u << 6,
+ kRetpoline = 1u << 5,
// Use the kJavaScriptCallCodeStartRegister (fixed) register for the
// indirect target address when calling.
- kFixedTargetRegister = 1u << 7,
- kCallerSavedRegisters = 1u << 8,
+ kFixedTargetRegister = 1u << 6,
+ kCallerSavedRegisters = 1u << 7,
// The kCallerSavedFPRegisters only matters (and set) when the more general
// flag for kCallerSavedRegisters above is also set.
- kCallerSavedFPRegisters = 1u << 9,
+ kCallerSavedFPRegisters = 1u << 8,
+ // Tail calls for tier up are special (in fact they are different enough
+ // from normal tail calls to warrant a dedicated opcode; but they also have
+ // enough similar aspects that reusing the TailCall opcode is pragmatic).
+ // Specifically:
+ //
+ // 1. Caller and callee are both JS-linkage Code objects.
+ // 2. JS runtime arguments are passed unchanged from caller to callee.
+ // 3. JS runtime arguments are not attached as inputs to the TailCall node.
+ // 4. Prior to the tail call, frame and register state is torn down to just
+ // before the caller frame was constructed.
+ // 5. Unlike normal tail calls, arguments adaptor frames (if present) are
+ // *not* torn down.
+ //
+ // In other words, behavior is identical to a jmp instruction prior caller
+ // frame construction.
+ kIsTailCallForTierUp = 1u << 9,
+
+ // Flags past here are *not* encoded in InstructionCode and are thus not
+ // accessible from the code generator. See also
+ // kFlagsBitsEncodedInInstructionCode.
+
// AIX has a function descriptor by default but it can be disabled for a
// certain CFunction call (only used for Kind::kCallAddress).
kNoFunctionDescriptor = 1u << 10,
@@ -317,7 +339,6 @@ class V8_EXPORT_PRIVATE CallDescriptor final
Flags flags() const { return flags_; }
bool NeedsFrameState() const { return flags() & kNeedsFrameState; }
- bool PushArgumentCount() const { return flags() & kPushArgumentCount; }
bool InitializeRootRegister() const {
return flags() & kInitializeRootRegister;
}
@@ -327,6 +348,7 @@ class V8_EXPORT_PRIVATE CallDescriptor final
bool NeedsCallerSavedFPRegisters() const {
return flags() & kCallerSavedFPRegisters;
}
+ bool IsTailCallForTierUp() const { return flags() & kIsTailCallForTierUp; }
bool NoFunctionDescriptor() const { return flags() & kNoFunctionDescriptor; }
LinkageLocation GetReturnLocation(size_t index) const {
@@ -511,22 +533,22 @@ class V8_EXPORT_PRIVATE Linkage : public NON_EXPORTED_BASE(ZoneObject) {
}
// A special {Parameter} index for JSCalls that represents the new target.
- static int GetJSCallNewTargetParamIndex(int parameter_count) {
+ static constexpr int GetJSCallNewTargetParamIndex(int parameter_count) {
return parameter_count + 0; // Parameter (arity + 0) is special.
}
// A special {Parameter} index for JSCalls that represents the argument count.
- static int GetJSCallArgCountParamIndex(int parameter_count) {
+ static constexpr int GetJSCallArgCountParamIndex(int parameter_count) {
return parameter_count + 1; // Parameter (arity + 1) is special.
}
// A special {Parameter} index for JSCalls that represents the context.
- static int GetJSCallContextParamIndex(int parameter_count) {
+ static constexpr int GetJSCallContextParamIndex(int parameter_count) {
return parameter_count + 2; // Parameter (arity + 2) is special.
}
// A special {Parameter} index for JSCalls that represents the closure.
- static const int kJSCallClosureParamIndex = -1;
+ static constexpr int kJSCallClosureParamIndex = -1;
// A special {OsrValue} index to indicate the context spill slot.
static const int kOsrContextSpillSlotIndex = -1;
diff --git a/deps/v8/src/compiler/machine-operator-reducer.cc b/deps/v8/src/compiler/machine-operator-reducer.cc
index 740a4f293c..55f39d76e8 100644
--- a/deps/v8/src/compiler/machine-operator-reducer.cc
+++ b/deps/v8/src/compiler/machine-operator-reducer.cc
@@ -1659,7 +1659,7 @@ struct BitfieldCheck {
Uint32BinopMatcher eq(node);
if (eq.left().IsWord32And()) {
Uint32BinopMatcher mand(eq.left().node());
- if (mand.right().HasValue()) {
+ if (mand.right().HasValue() && eq.right().HasValue()) {
BitfieldCheck result{mand.left().node(), mand.right().Value(),
eq.right().Value(), false};
if (mand.left().IsTruncateInt64ToInt32()) {
diff --git a/deps/v8/src/compiler/machine-operator.cc b/deps/v8/src/compiler/machine-operator.cc
index 644c445b94..98befab060 100644
--- a/deps/v8/src/compiler/machine-operator.cc
+++ b/deps/v8/src/compiler/machine-operator.cc
@@ -495,7 +495,7 @@ ShiftKind ShiftKindOf(Operator const* op) {
V(V16x8AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(V8x16AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(V8x16AllTrue, Operator::kNoProperties, 1, 0, 1) \
- V(S8x16Swizzle, Operator::kNoProperties, 2, 0, 1)
+ V(I8x16Swizzle, Operator::kNoProperties, 2, 0, 1)
// The format is:
// V(Name, properties, value_input_count, control_input_count, output_count)
@@ -1575,7 +1575,7 @@ std::ostream& operator<<(std::ostream& os, S128ImmediateParameter const& p) {
}
S128ImmediateParameter const& S128ImmediateParameterOf(Operator const* op) {
- DCHECK(IrOpcode::kS8x16Shuffle == op->opcode() ||
+ DCHECK(IrOpcode::kI8x16Shuffle == op->opcode() ||
IrOpcode::kS128Const == op->opcode());
return OpParameter<S128ImmediateParameter>(op);
}
@@ -1586,10 +1586,10 @@ const Operator* MachineOperatorBuilder::S128Const(const uint8_t value[16]) {
S128ImmediateParameter(value));
}
-const Operator* MachineOperatorBuilder::S8x16Shuffle(
+const Operator* MachineOperatorBuilder::I8x16Shuffle(
const uint8_t shuffle[16]) {
return zone_->New<Operator1<S128ImmediateParameter>>(
- IrOpcode::kS8x16Shuffle, Operator::kPure, "Shuffle", 2, 0, 0, 1, 0, 0,
+ IrOpcode::kI8x16Shuffle, Operator::kPure, "Shuffle", 2, 0, 0, 1, 0, 0,
S128ImmediateParameter(shuffle));
}
diff --git a/deps/v8/src/compiler/machine-operator.h b/deps/v8/src/compiler/machine-operator.h
index 5f7c900466..702c050223 100644
--- a/deps/v8/src/compiler/machine-operator.h
+++ b/deps/v8/src/compiler/machine-operator.h
@@ -197,8 +197,6 @@ ShiftKind ShiftKindOf(Operator const*) V8_WARN_UNUSED_RESULT;
// makes it easier to detect an overflow. This parameter is ignored on platforms
// like x64 and ia32 where a range overflow does not result in INT_MAX.
enum class TruncateKind { kArchitectureDefault, kSetOverflowToMin };
-std::ostream& operator<<(std::ostream& os, TruncateKind kind);
-size_t hash_value(TruncateKind kind);
// Interface for building machine-level operators. These operators are
// machine-level but machine-independent and thus define a language suitable
@@ -767,8 +765,8 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final
const Operator* S128Select();
const Operator* S128AndNot();
- const Operator* S8x16Swizzle();
- const Operator* S8x16Shuffle(const uint8_t shuffle[16]);
+ const Operator* I8x16Swizzle();
+ const Operator* I8x16Shuffle(const uint8_t shuffle[16]);
const Operator* V64x2AnyTrue();
const Operator* V64x2AllTrue();
diff --git a/deps/v8/src/compiler/opcodes.h b/deps/v8/src/compiler/opcodes.h
index 0aba619ffe..f1faeec936 100644
--- a/deps/v8/src/compiler/opcodes.h
+++ b/deps/v8/src/compiler/opcodes.h
@@ -170,6 +170,7 @@
JS_CREATE_OP_LIST(V) \
V(JSLoadProperty) \
V(JSLoadNamed) \
+ V(JSLoadNamedFromSuper) \
V(JSLoadGlobal) \
V(JSStoreProperty) \
V(JSStoreNamed) \
@@ -482,6 +483,7 @@
V(StringToLowerCaseIntl) \
V(StringToNumber) \
V(StringToUpperCaseIntl) \
+ V(TierUpCheck) \
V(ToBoolean) \
V(TransitionAndStoreElement) \
V(TransitionAndStoreNonNumberElement) \
@@ -950,8 +952,8 @@
V(S128Xor) \
V(S128Select) \
V(S128AndNot) \
- V(S8x16Swizzle) \
- V(S8x16Shuffle) \
+ V(I8x16Swizzle) \
+ V(I8x16Shuffle) \
V(V64x2AnyTrue) \
V(V64x2AllTrue) \
V(V32x4AnyTrue) \
@@ -1068,6 +1070,55 @@ class V8_EXPORT_PRIVATE IrOpcode {
static bool IsContextChainExtendingOpcode(Value value) {
return kJSCreateFunctionContext <= value && value <= kJSCreateBlockContext;
}
+
+ // These opcode take the feedback vector as an input, and implement
+ // feedback-collecting logic in generic lowering.
+ static bool IsFeedbackCollectingOpcode(Value value) {
+#define CASE(Name, ...) \
+ case k##Name: \
+ return true;
+ switch (value) {
+ JS_ARITH_BINOP_LIST(CASE)
+ JS_ARITH_UNOP_LIST(CASE)
+ JS_BITWISE_BINOP_LIST(CASE)
+ JS_BITWISE_UNOP_LIST(CASE)
+ JS_COMPARE_BINOP_LIST(CASE)
+ case kJSCall:
+ case kJSCallWithArrayLike:
+ case kJSCallWithSpread:
+ case kJSCloneObject:
+ case kJSConstruct:
+ case kJSConstructWithArrayLike:
+ case kJSConstructWithSpread:
+ case kJSCreateEmptyLiteralArray:
+ case kJSCreateLiteralArray:
+ case kJSCreateLiteralObject:
+ case kJSCreateLiteralRegExp:
+ case kJSGetIterator:
+ case kJSGetTemplateObject:
+ case kJSHasProperty:
+ case kJSInstanceOf:
+ case kJSLoadGlobal:
+ case kJSLoadNamed:
+ case kJSLoadProperty:
+ case kJSStoreDataPropertyInLiteral:
+ case kJSStoreGlobal:
+ case kJSStoreInArrayLiteral:
+ case kJSStoreNamed:
+ case kJSStoreNamedOwn:
+ case kJSStoreProperty:
+ return true;
+ default:
+ return false;
+ }
+#undef CASE
+ UNREACHABLE();
+ }
+
+ static bool IsFeedbackCollectingOpcode(int16_t value) {
+ DCHECK(0 <= value && value <= kLast);
+ return IsFeedbackCollectingOpcode(static_cast<IrOpcode::Value>(value));
+ }
};
V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, IrOpcode::Value);
diff --git a/deps/v8/src/compiler/operator-properties.cc b/deps/v8/src/compiler/operator-properties.cc
index c7851dd263..c77249f621 100644
--- a/deps/v8/src/compiler/operator-properties.cc
+++ b/deps/v8/src/compiler/operator-properties.cc
@@ -80,6 +80,7 @@ bool OperatorProperties::NeedsExactContext(const Operator* op) {
case IrOpcode::kJSLoadContext:
case IrOpcode::kJSLoadModule:
case IrOpcode::kJSLoadNamed:
+ case IrOpcode::kJSLoadNamedFromSuper:
case IrOpcode::kJSLoadProperty:
case IrOpcode::kJSStoreContext:
case IrOpcode::kJSStoreDataPropertyInLiteral:
@@ -193,6 +194,7 @@ bool OperatorProperties::HasFrameStateInput(const Operator* op) {
// Property access operations
case IrOpcode::kJSLoadNamed:
+ case IrOpcode::kJSLoadNamedFromSuper:
case IrOpcode::kJSStoreNamed:
case IrOpcode::kJSLoadProperty:
case IrOpcode::kJSStoreProperty:
diff --git a/deps/v8/src/compiler/pipeline.cc b/deps/v8/src/compiler/pipeline.cc
index 8a1c86ee49..7b99d07b6b 100644
--- a/deps/v8/src/compiler/pipeline.cc
+++ b/deps/v8/src/compiler/pipeline.cc
@@ -22,7 +22,6 @@
#include "src/compiler/backend/instruction-selector.h"
#include "src/compiler/backend/instruction.h"
#include "src/compiler/backend/jump-threading.h"
-#include "src/compiler/backend/live-range-separator.h"
#include "src/compiler/backend/mid-tier-register-allocator.h"
#include "src/compiler/backend/move-optimizer.h"
#include "src/compiler/backend/register-allocator-verifier.h"
@@ -784,27 +783,6 @@ class LocalHeapScope {
OptimizedCompilationInfo* info_;
};
-// Scope that unparks the LocalHeap, if:
-// a) We have a JSHeapBroker,
-// b) Said JSHeapBroker has a LocalHeap, and
-// c) Said LocalHeap has been parked.
-// Used, for example, when printing the graph with --trace-turbo with a
-// previously parked LocalHeap.
-class UnparkedScopeIfNeeded {
- public:
- explicit UnparkedScopeIfNeeded(JSHeapBroker* broker) {
- if (broker != nullptr) {
- LocalHeap* local_heap = broker->local_heap();
- if (local_heap != nullptr && local_heap->IsParked()) {
- unparked_scope.emplace(local_heap);
- }
- }
- }
-
- private:
- base::Optional<UnparkedScope> unparked_scope;
-};
-
void PrintFunctionSource(OptimizedCompilationInfo* info, Isolate* isolate,
int source_id, Handle<SharedFunctionInfo> shared) {
if (!shared->script().IsUndefined(isolate)) {
@@ -881,7 +859,8 @@ void PrintCode(Isolate* isolate, Handle<Code> code,
const bool print_code =
FLAG_print_code ||
(info->IsOptimizing() && FLAG_print_opt_code &&
- info->shared_info()->PassesFilter(FLAG_print_opt_code_filter));
+ info->shared_info()->PassesFilter(FLAG_print_opt_code_filter)) ||
+ (info->IsNativeContextIndependent() && FLAG_print_nci_code);
if (print_code) {
std::unique_ptr<char[]> debug_name = info->GetDebugName();
CodeTracer::StreamScope tracing_scope(isolate->GetCodeTracer());
@@ -1422,17 +1401,14 @@ struct GraphBuilderPhase {
if (data->info()->bailout_on_uninitialized()) {
flags |= BytecodeGraphBuilderFlag::kBailoutOnUninitialized;
}
- if (data->info()->IsNativeContextIndependent()) {
- flags |= BytecodeGraphBuilderFlag::kNativeContextIndependent;
- }
JSFunctionRef closure(data->broker(), data->info()->closure());
CallFrequency frequency(1.0f);
BuildGraphFromBytecode(
data->broker(), temp_zone, closure.shared(), closure.feedback_vector(),
data->info()->osr_offset(), data->jsgraph(), frequency,
- data->source_positions(), SourcePosition::kNotInlined, flags,
- &data->info()->tick_counter());
+ data->source_positions(), SourcePosition::kNotInlined,
+ data->info()->code_kind(), flags, &data->info()->tick_counter());
}
};
@@ -1442,7 +1418,7 @@ struct InliningPhase {
void Run(PipelineData* data, Zone* temp_zone) {
OptimizedCompilationInfo* info = data->info();
GraphReducer graph_reducer(temp_zone, data->graph(), &info->tick_counter(),
- data->jsgraph()->Dead());
+ data->broker(), data->jsgraph()->Dead());
DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
data->common(), temp_zone);
CheckpointElimination checkpoint_elimination(&graph_reducer);
@@ -1511,6 +1487,9 @@ struct TyperPhase {
LoopVariableOptimizer induction_vars(data->jsgraph()->graph(),
data->common(), temp_zone);
if (FLAG_turbo_loop_variable) induction_vars.Run();
+
+ // The typer inspects heap objects, so we need to unpark the local heap.
+ UnparkedScopeIfNeeded scope(data->broker());
typer->Run(roots, &induction_vars);
}
};
@@ -1538,7 +1517,7 @@ struct UntyperPhase {
}
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
RemoveTypeReducer remove_type_reducer;
AddReducer(data, &graph_reducer, &remove_type_reducer);
@@ -1559,7 +1538,7 @@ struct CopyMetadataForConcurrentCompilePhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
JSHeapCopyReducer heap_copy_reducer(data->broker());
AddReducer(data, &graph_reducer, &heap_copy_reducer);
@@ -1605,7 +1584,7 @@ struct TypedLoweringPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
data->common(), temp_zone);
@@ -1625,6 +1604,7 @@ struct TypedLoweringPhase {
data->broker(), data->common(),
data->machine(), temp_zone);
AddReducer(data, &graph_reducer, &dead_code_elimination);
+
if (!data->info()->IsNativeContextIndependent()) {
AddReducer(data, &graph_reducer, &create_lowering);
}
@@ -1634,8 +1614,11 @@ struct TypedLoweringPhase {
AddReducer(data, &graph_reducer, &simple_reducer);
AddReducer(data, &graph_reducer, &checkpoint_elimination);
AddReducer(data, &graph_reducer, &common_reducer);
- // JSCreateLowering accesses the heap and therefore we need to unpark it.
+
+ // ConstantFoldingReducer, JSCreateLowering, JSTypedLowering, and
+ // TypedOptimization access the heap.
UnparkedScopeIfNeeded scope(data->broker());
+
graph_reducer.ReduceGraph();
}
};
@@ -1648,13 +1631,19 @@ struct EscapeAnalysisPhase {
EscapeAnalysis escape_analysis(data->jsgraph(),
&data->info()->tick_counter(), temp_zone);
escape_analysis.ReduceGraph();
+
GraphReducer reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
EscapeAnalysisReducer escape_reducer(&reducer, data->jsgraph(),
escape_analysis.analysis_result(),
temp_zone);
+
AddReducer(data, &reducer, &escape_reducer);
+
+ // EscapeAnalysisReducer accesses the heap.
+ UnparkedScopeIfNeeded scope(data->broker());
+
reducer.ReduceGraph();
// TODO(tebbi): Turn this into a debug mode check once we have confidence.
escape_reducer.VerifyReplacement();
@@ -1666,7 +1655,7 @@ struct TypeAssertionsPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
AddTypeAssertionsReducer type_assertions(&graph_reducer, data->jsgraph(),
temp_zone);
@@ -1683,6 +1672,10 @@ struct SimplifiedLoweringPhase {
data->source_positions(), data->node_origins(),
data->info()->GetPoisoningMitigationLevel(),
&data->info()->tick_counter());
+
+ // RepresentationChanger accesses the heap.
+ UnparkedScopeIfNeeded scope(data->broker());
+
lowering.LowerAllNodes();
}
};
@@ -1717,7 +1710,7 @@ struct GenericLoweringPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
JSGenericLowering generic_lowering(data->jsgraph(), &graph_reducer,
data->broker());
@@ -1731,7 +1724,7 @@ struct EarlyOptimizationPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
data->common(), temp_zone);
@@ -1808,7 +1801,7 @@ struct EffectControlLinearizationPhase {
// doing a common operator reducer and dead code elimination just before
// it, to eliminate conditional deopts with a constant condition.
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(),
data->common(), temp_zone);
@@ -1841,7 +1834,7 @@ struct LoadEliminationPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
BranchElimination branch_condition_elimination(&graph_reducer,
data->jsgraph(), temp_zone,
@@ -1862,6 +1855,7 @@ struct LoadEliminationPhase {
&graph_reducer, data->jsgraph(), data->broker());
TypeNarrowingReducer type_narrowing_reducer(&graph_reducer, data->jsgraph(),
data->broker());
+
AddReducer(data, &graph_reducer, &branch_condition_elimination);
AddReducer(data, &graph_reducer, &dead_code_elimination);
AddReducer(data, &graph_reducer, &redundancy_elimination);
@@ -1872,6 +1866,10 @@ struct LoadEliminationPhase {
AddReducer(data, &graph_reducer, &checkpoint_elimination);
AddReducer(data, &graph_reducer, &common_reducer);
AddReducer(data, &graph_reducer, &value_numbering);
+
+ // ConstantFoldingReducer and TypedOptimization access the heap.
+ UnparkedScopeIfNeeded scope(data->broker());
+
graph_reducer.ReduceGraph();
}
};
@@ -1902,7 +1900,7 @@ struct LateOptimizationPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
BranchElimination branch_condition_elimination(&graph_reducer,
data->jsgraph(), temp_zone);
@@ -1930,7 +1928,7 @@ struct MachineOperatorOptimizationPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
ValueNumberingReducer value_numbering(temp_zone, data->graph()->zone());
MachineOperatorReducer machine_reducer(&graph_reducer, data->jsgraph());
@@ -2001,7 +1999,7 @@ struct CsaEarlyOptimizationPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
MachineOperatorReducer machine_reducer(&graph_reducer, data->jsgraph());
BranchElimination branch_condition_elimination(&graph_reducer,
@@ -2029,7 +2027,7 @@ struct CsaOptimizationPhase {
void Run(PipelineData* data, Zone* temp_zone) {
GraphReducer graph_reducer(temp_zone, data->graph(),
- &data->info()->tick_counter(),
+ &data->info()->tick_counter(), data->broker(),
data->jsgraph()->Dead());
BranchElimination branch_condition_elimination(&graph_reducer,
data->jsgraph(), temp_zone);
@@ -2200,17 +2198,6 @@ struct BuildBundlesPhase {
}
};
-struct SplinterLiveRangesPhase {
- DECL_PIPELINE_PHASE_CONSTANTS(SplinterLiveRanges)
-
- void Run(PipelineData* data, Zone* temp_zone) {
- LiveRangeSeparator live_range_splinterer(
- data->top_tier_register_allocation_data(), temp_zone);
- live_range_splinterer.Splinter();
- }
-};
-
-
template <typename RegAllocator>
struct AllocateGeneralRegistersPhase {
DECL_PIPELINE_PHASE_CONSTANTS(AllocateGeneralRegisters)
@@ -2233,18 +2220,6 @@ struct AllocateFPRegistersPhase {
}
};
-
-struct MergeSplintersPhase {
- DECL_PIPELINE_PHASE_CONSTANTS(MergeSplinteredRanges)
-
- void Run(PipelineData* pipeline_data, Zone* temp_zone) {
- TopTierRegisterAllocationData* data =
- pipeline_data->top_tier_register_allocation_data();
- LiveRangeMerger live_range_merger(data, temp_zone);
- live_range_merger.Merge();
- }
-};
-
struct DecideSpillingModePhase {
DECL_PIPELINE_PHASE_CONSTANTS(DecideSpillingMode)
@@ -2888,15 +2863,12 @@ MaybeHandle<Code> Pipeline::GenerateCodeForCodeStub(
info.profiler_data()->SetHash(graph_hash_before_scheduling);
}
- Handle<Code> code;
if (jump_opt.is_optimizable()) {
jump_opt.set_optimizing();
- code = pipeline.GenerateCode(call_descriptor).ToHandleChecked();
+ return pipeline.GenerateCode(call_descriptor);
} else {
- code = second_pipeline.FinalizeCode().ToHandleChecked();
+ return second_pipeline.FinalizeCode();
}
-
- return code;
}
struct BlockStartsAsJSON {
@@ -3164,7 +3136,7 @@ void Pipeline::GenerateCodeForWasmFunction(
PipelineRunScope scope(&data, "V8.WasmFullOptimization",
RuntimeCallCounterId::kOptimizeWasmFullOptimization);
GraphReducer graph_reducer(scope.zone(), data.graph(),
- &data.info()->tick_counter(),
+ &data.info()->tick_counter(), data.broker(),
data.mcgraph()->Dead());
DeadCodeElimination dead_code_elimination(&graph_reducer, data.graph(),
data.common(), scope.zone());
@@ -3184,7 +3156,7 @@ void Pipeline::GenerateCodeForWasmFunction(
PipelineRunScope scope(&data, "V8.OptimizeWasmBaseOptimization",
RuntimeCallCounterId::kOptimizeWasmBaseOptimization);
GraphReducer graph_reducer(scope.zone(), data.graph(),
- &data.info()->tick_counter(),
+ &data.info()->tick_counter(), data.broker(),
data.mcgraph()->Dead());
ValueNumberingReducer value_numbering(scope.zone(), data.graph()->zone());
AddReducer(&data, &graph_reducer, &value_numbering);
@@ -3630,12 +3602,6 @@ void PipelineImpl::AllocateRegistersForTopTier(
#endif
RegisterAllocationFlags flags;
- if (data->info()->turbo_control_flow_aware_allocation()) {
- flags |= RegisterAllocationFlag::kTurboControlFlowAwareAllocation;
- }
- if (data->info()->turbo_preprocess_ranges()) {
- flags |= RegisterAllocationFlag::kTurboPreprocessRanges;
- }
if (data->info()->trace_turbo_allocation()) {
flags |= RegisterAllocationFlag::kTraceAllocation;
}
@@ -3661,25 +3627,12 @@ void PipelineImpl::AllocateRegistersForTopTier(
"PreAllocation", data->top_tier_register_allocation_data());
}
- if (info()->turbo_preprocess_ranges()) {
- Run<SplinterLiveRangesPhase>();
- if (info()->trace_turbo_json() && !data->MayHaveUnverifiableGraph()) {
- TurboCfgFile tcf(isolate());
- tcf << AsC1VRegisterAllocationData(
- "PostSplinter", data->top_tier_register_allocation_data());
- }
- }
-
Run<AllocateGeneralRegistersPhase<LinearScanAllocator>>();
if (data->sequence()->HasFPVirtualRegisters()) {
Run<AllocateFPRegistersPhase<LinearScanAllocator>>();
}
- if (info()->turbo_preprocess_ranges()) {
- Run<MergeSplintersPhase>();
- }
-
Run<DecideSpillingModePhase>();
Run<AssignSpillSlotsPhase>();
Run<CommitAssignmentPhase>();
diff --git a/deps/v8/src/compiler/processed-feedback.h b/deps/v8/src/compiler/processed-feedback.h
index cd916f9b47..282923e0c3 100644
--- a/deps/v8/src/compiler/processed-feedback.h
+++ b/deps/v8/src/compiler/processed-feedback.h
@@ -177,19 +177,20 @@ class MinimorphicLoadPropertyAccessFeedback : public ProcessedFeedback {
public:
MinimorphicLoadPropertyAccessFeedback(NameRef const& name,
FeedbackSlotKind slot_kind,
- bool is_monomorphic,
Handle<Object> handler,
+ MaybeHandle<Map> maybe_map,
bool has_migration_target_maps);
NameRef const& name() const { return name_; }
- bool is_monomorphic() const { return is_monomorphic_; }
+ bool is_monomorphic() const { return !maybe_map_.is_null(); }
Handle<Object> handler() const { return handler_; }
+ MaybeHandle<Map> map() const { return maybe_map_; }
bool has_migration_target_maps() const { return has_migration_target_maps_; }
private:
NameRef const name_;
- bool const is_monomorphic_;
Handle<Object> const handler_;
+ MaybeHandle<Map> const maybe_map_;
bool const has_migration_target_maps_;
};
diff --git a/deps/v8/src/compiler/property-access-builder.cc b/deps/v8/src/compiler/property-access-builder.cc
index dc25326735..4235160037 100644
--- a/deps/v8/src/compiler/property-access-builder.cc
+++ b/deps/v8/src/compiler/property-access-builder.cc
@@ -199,17 +199,49 @@ Node* PropertyAccessBuilder::BuildLoadDataField(NameRef const& name,
MachineRepresentation::kFloat64) {
bool const is_heapnumber = !is_inobject || !FLAG_unbox_double_fields;
if (is_heapnumber) {
- FieldAccess const storage_access = {kTaggedBase,
- field_access.offset,
- name.object(),
- MaybeHandle<Map>(),
- Type::OtherInternal(),
- MachineType::TaggedPointer(),
- kPointerWriteBarrier,
- LoadSensitivity::kCritical,
- field_access.const_field_info};
- storage = *effect = graph()->NewNode(
- simplified()->LoadField(storage_access), storage, *effect, *control);
+ if (dependencies() == nullptr) {
+ FieldAccess const storage_access = {kTaggedBase,
+ field_access.offset,
+ name.object(),
+ MaybeHandle<Map>(),
+ Type::Any(),
+ MachineType::AnyTagged(),
+ kPointerWriteBarrier,
+ LoadSensitivity::kCritical,
+ field_access.const_field_info};
+ storage = *effect =
+ graph()->NewNode(simplified()->LoadField(storage_access), storage,
+ *effect, *control);
+ // We expect the loaded value to be a heap number here. With
+ // in-place field representation changes it is possible this is a
+ // no longer a heap number without map transitions. If we haven't taken
+ // a dependency on field representation, we should verify the loaded
+ // value is a heap number.
+ storage = *effect = graph()->NewNode(simplified()->CheckHeapObject(),
+ storage, *effect, *control);
+ Node* map = *effect =
+ graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
+ storage, *effect, *control);
+ Node* is_heap_number =
+ graph()->NewNode(simplified()->ReferenceEqual(), map,
+ jsgraph()->HeapNumberMapConstant());
+ *effect = graph()->NewNode(
+ simplified()->CheckIf(DeoptimizeReason::kNotAHeapNumber),
+ is_heap_number, *effect, *control);
+ } else {
+ FieldAccess const storage_access = {kTaggedBase,
+ field_access.offset,
+ name.object(),
+ MaybeHandle<Map>(),
+ Type::OtherInternal(),
+ MachineType::TaggedPointer(),
+ kPointerWriteBarrier,
+ LoadSensitivity::kCritical,
+ field_access.const_field_info};
+ storage = *effect =
+ graph()->NewNode(simplified()->LoadField(storage_access), storage,
+ *effect, *control);
+ }
field_access.offset = HeapNumber::kValueOffset;
field_access.name = MaybeHandle<Name>();
}
diff --git a/deps/v8/src/compiler/scheduled-machine-lowering.cc b/deps/v8/src/compiler/scheduled-machine-lowering.cc
index 9395c83e57..903052be1d 100644
--- a/deps/v8/src/compiler/scheduled-machine-lowering.cc
+++ b/deps/v8/src/compiler/scheduled-machine-lowering.cc
@@ -19,7 +19,7 @@ ScheduledMachineLowering::ScheduledMachineLowering(
SourcePositionTable* source_positions, NodeOriginTable* node_origins,
PoisoningMitigationLevel poison_level)
: schedule_(schedule),
- graph_assembler_(js_graph, temp_zone, schedule),
+ graph_assembler_(js_graph, temp_zone, base::nullopt, schedule),
select_lowering_(&graph_assembler_, js_graph->graph()),
memory_lowering_(js_graph, temp_zone, &graph_assembler_, poison_level),
reducers_({&select_lowering_, &memory_lowering_}, temp_zone),
diff --git a/deps/v8/src/compiler/serializer-for-background-compilation.cc b/deps/v8/src/compiler/serializer-for-background-compilation.cc
index a828010ee1..83b88cd3bf 100644
--- a/deps/v8/src/compiler/serializer-for-background-compilation.cc
+++ b/deps/v8/src/compiler/serializer-for-background-compilation.cc
@@ -198,6 +198,7 @@ namespace compiler {
V(LdaLookupSlot) \
V(LdaLookupSlotInsideTypeof) \
V(LdaNamedProperty) \
+ V(LdaNamedPropertyFromSuper) \
V(LdaNamedPropertyNoFeedback) \
V(LdaNull) \
V(Ldar) \
@@ -3260,6 +3261,13 @@ void SerializerForBackgroundCompilation::VisitLdaNamedProperty(
ProcessNamedPropertyAccess(receiver, name, slot, AccessMode::kLoad);
}
+void SerializerForBackgroundCompilation::VisitLdaNamedPropertyFromSuper(
+ BytecodeArrayIterator* iterator) {
+ NameRef(broker(),
+ iterator->GetConstantForIndexOperand(1, broker()->isolate()));
+ // TODO(marja, v8:9237): Process feedback once it's added to the byte code.
+}
+
// TODO(neis): Do feedback-independent serialization also for *NoFeedback
// bytecodes.
void SerializerForBackgroundCompilation::VisitLdaNamedPropertyNoFeedback(
diff --git a/deps/v8/src/compiler/simd-scalar-lowering.cc b/deps/v8/src/compiler/simd-scalar-lowering.cc
index a875cfada3..f832107939 100644
--- a/deps/v8/src/compiler/simd-scalar-lowering.cc
+++ b/deps/v8/src/compiler/simd-scalar-lowering.cc
@@ -5,6 +5,7 @@
#include "src/compiler/simd-scalar-lowering.h"
#include "src/codegen/machine-type.h"
+#include "src/common/globals.h"
#include "src/compiler/diamond.h"
#include "src/compiler/linkage.h"
#include "src/compiler/machine-operator.h"
@@ -29,6 +30,7 @@ static const int32_t kShift8 = 24;
static const int32_t kShiftMask8 = 0x7;
static const int32_t kShiftMask16 = 0xF;
static const int32_t kShiftMask32 = 0x1F;
+static const int32_t kShiftMask64 = 0x3F;
// Shift values are taken modulo lane size. This helper calculates the mask
// required for different shift opcodes.
@@ -46,6 +48,10 @@ int GetMaskForShift(Node* node) {
case IrOpcode::kI32x4ShrS:
case IrOpcode::kI32x4ShrU:
return kShiftMask32;
+ case IrOpcode::kI64x2Shl:
+ case IrOpcode::kI64x2ShrS:
+ case IrOpcode::kI64x2ShrU:
+ return kShiftMask64;
default:
UNIMPLEMENTED();
}
@@ -103,7 +109,17 @@ void SimdScalarLowering::LowerGraph() {
}
}
-#define FOREACH_INT64X2_OPCODE(V) V(I64x2Splat)
+#define FOREACH_INT64X2_OPCODE(V) \
+ V(I64x2Splat) \
+ V(I64x2ExtractLane) \
+ V(I64x2ReplaceLane) \
+ V(I64x2Neg) \
+ V(I64x2Shl) \
+ V(I64x2ShrS) \
+ V(I64x2ShrU) \
+ V(I64x2Add) \
+ V(I64x2Sub) \
+ V(I64x2Mul)
#define FOREACH_INT32X4_OPCODE(V) \
V(I32x4Splat) \
@@ -128,15 +144,15 @@ void SimdScalarLowering::LowerGraph() {
V(I32x4Eq) \
V(I32x4Ne) \
V(I32x4LtS) \
- V(I32x4LeS) \
+ V(I32x4LtU) \
V(I32x4GtS) \
+ V(I32x4GtU) \
+ V(I32x4LeS) \
+ V(I32x4LeU) \
V(I32x4GeS) \
+ V(I32x4GeU) \
V(I32x4UConvertI16x8Low) \
V(I32x4UConvertI16x8High) \
- V(I32x4LtU) \
- V(I32x4LeU) \
- V(I32x4GtU) \
- V(I32x4GeU) \
V(I32x4Abs) \
V(S128And) \
V(S128Or) \
@@ -150,7 +166,19 @@ void SimdScalarLowering::LowerGraph() {
V(V8x16AllTrue) \
V(I32x4BitMask)
-#define FOREACH_FLOAT64X2_OPCODE(V) V(F64x2Splat)
+#define FOREACH_FLOAT64X2_OPCODE(V) \
+ V(F64x2Splat) \
+ V(F64x2ExtractLane) \
+ V(F64x2ReplaceLane) \
+ V(F64x2Abs) \
+ V(F64x2Neg) \
+ V(F64x2Sqrt) \
+ V(F64x2Add) \
+ V(F64x2Sub) \
+ V(F64x2Mul) \
+ V(F64x2Div) \
+ V(F64x2Min) \
+ V(F64x2Max)
#define FOREACH_FLOAT32X4_OPCODE(V) \
V(F32x4Splat) \
@@ -171,6 +199,12 @@ void SimdScalarLowering::LowerGraph() {
V(F32x4Min) \
V(F32x4Max)
+#define FOREACH_FLOAT64x2_TO_INT64x2OPCODE(V) \
+ V(F64x2Eq) \
+ V(F64x2Ne) \
+ V(F64x2Lt) \
+ V(F64x2Le)
+
#define FOREACH_FLOAT32X4_TO_INT32X4OPCODE(V) \
V(F32x4Eq) \
V(F32x4Ne) \
@@ -209,9 +243,13 @@ void SimdScalarLowering::LowerGraph() {
V(I16x8Eq) \
V(I16x8Ne) \
V(I16x8LtS) \
- V(I16x8LeS) \
V(I16x8LtU) \
+ V(I16x8GtS) \
+ V(I16x8GtU) \
+ V(I16x8LeS) \
V(I16x8LeU) \
+ V(I16x8GeS) \
+ V(I16x8GeU) \
V(I16x8RoundingAverageU) \
V(I16x8Abs) \
V(I16x8BitMask)
@@ -241,11 +279,15 @@ void SimdScalarLowering::LowerGraph() {
V(I8x16Eq) \
V(I8x16Ne) \
V(I8x16LtS) \
- V(I8x16LeS) \
V(I8x16LtU) \
+ V(I8x16GtS) \
+ V(I8x16GtU) \
+ V(I8x16LeS) \
V(I8x16LeU) \
- V(S8x16Swizzle) \
- V(S8x16Shuffle) \
+ V(I8x16GeS) \
+ V(I8x16GeU) \
+ V(I8x16Swizzle) \
+ V(I8x16Shuffle) \
V(I8x16RoundingAverageU) \
V(I8x16Abs) \
V(I8x16BitMask)
@@ -294,6 +336,10 @@ void SimdScalarLowering::SetLoweredType(Node* node, Node* output) {
replacements_[node->id()].type = SimdType::kInt32x4;
break;
}
+ FOREACH_FLOAT64x2_TO_INT64x2OPCODE(CASE_STMT) {
+ replacements_[node->id()].type = SimdType::kInt64x2;
+ break;
+ }
FOREACH_INT16X8_OPCODE(CASE_STMT) {
replacements_[node->id()].type = SimdType::kInt16x8;
break;
@@ -314,6 +360,9 @@ void SimdScalarLowering::SetLoweredType(Node* node, Node* output) {
case LoadTransformation::kS32x4LoadSplat:
replacements_[node->id()].type = SimdType::kInt32x4;
break;
+ case LoadTransformation::kS64x2LoadSplat:
+ replacements_[node->id()].type = SimdType::kInt64x2;
+ break;
case LoadTransformation::kI16x8Load8x8S:
case LoadTransformation::kI16x8Load8x8U:
replacements_[node->id()].type = SimdType::kInt16x8;
@@ -322,6 +371,10 @@ void SimdScalarLowering::SetLoweredType(Node* node, Node* output) {
case LoadTransformation::kI32x4Load16x4U:
replacements_[node->id()].type = SimdType::kInt32x4;
break;
+ case LoadTransformation::kI64x2Load32x2S:
+ case LoadTransformation::kI64x2Load32x2U:
+ replacements_[node->id()].type = SimdType::kInt64x2;
+ break;
default:
UNIMPLEMENTED();
}
@@ -526,9 +579,18 @@ void SimdScalarLowering::LowerLoadTransformOp(Node* node, SimdType type) {
load_rep = MachineType::Uint16();
load_type = SimdType::kInt16x8;
break;
+ case LoadTransformation::kI64x2Load32x2S:
+ load_rep = MachineType::Int32();
+ load_type = SimdType::kInt32x4;
+ break;
+ case LoadTransformation::kI64x2Load32x2U:
+ load_rep = MachineType::Uint32();
+ load_type = SimdType::kInt32x4;
+ break;
case LoadTransformation::kS8x16LoadSplat:
case LoadTransformation::kS16x8LoadSplat:
case LoadTransformation::kS32x4LoadSplat:
+ case LoadTransformation::kS64x2LoadSplat:
load_rep = MachineTypeFrom(type);
break;
default:
@@ -569,6 +631,15 @@ void SimdScalarLowering::LowerLoadTransformOp(Node* node, SimdType type) {
rep_nodes[i] = graph()->NewNode(load_op, base, indices[i], effect_input,
control_input);
effect_input = rep_nodes[i];
+
+ // Load operations are Word32 nodes, change them to Word64.
+ if (params.transformation == LoadTransformation::kI64x2Load32x2S) {
+ rep_nodes[i] =
+ graph()->NewNode(machine()->ChangeInt32ToInt64(), rep_nodes[i]);
+ } else if (params.transformation == LoadTransformation::kI64x2Load32x2U) {
+ rep_nodes[i] =
+ graph()->NewNode(machine()->ChangeUint32ToUint64(), rep_nodes[i]);
+ }
}
} else {
// Load splat, load from the same index for every lane.
@@ -687,15 +758,8 @@ void SimdScalarLowering::LowerCompareOp(Node* node, SimdType input_rep_type,
} else {
cmp_result = graph()->NewNode(op, rep_left[i], rep_right[i]);
}
- Diamond d_cmp(graph(), common(),
- graph()->NewNode(machine()->Word32Equal(), cmp_result,
- mcgraph_->Int32Constant(0)));
- MachineRepresentation rep =
- (input_rep_type == SimdType::kFloat32x4)
- ? MachineRepresentation::kWord32
- : MachineTypeFrom(input_rep_type).representation();
- rep_node[i] =
- d_cmp.Phi(rep, mcgraph_->Int32Constant(0), mcgraph_->Int32Constant(-1));
+ Diamond d_cmp(graph(), common(), cmp_result);
+ rep_node[i] = ConstructPhiForComparison(d_cmp, input_rep_type, -1, 0);
}
ReplaceNode(node, rep_node, num_lanes);
}
@@ -999,6 +1063,14 @@ void SimdScalarLowering::LowerShiftOp(Node* node, SimdType type) {
rep_node[i] =
graph()->NewNode(machine()->Word32Shr(), rep_node[i], shift_node);
break;
+ case IrOpcode::kI64x2ShrU:
+ rep_node[i] =
+ graph()->NewNode(machine()->Word64Shr(), rep_node[i], shift_node);
+ break;
+ case IrOpcode::kI64x2Shl:
+ rep_node[i] =
+ graph()->NewNode(machine()->Word64Shl(), rep_node[i], shift_node);
+ break;
case IrOpcode::kI32x4Shl:
rep_node[i] =
graph()->NewNode(machine()->Word32Shl(), rep_node[i], shift_node);
@@ -1013,6 +1085,10 @@ void SimdScalarLowering::LowerShiftOp(Node* node, SimdType type) {
graph()->NewNode(machine()->Word32Shl(), rep_node[i], shift_node);
rep_node[i] = FixUpperBits(rep_node[i], kShift8);
break;
+ case IrOpcode::kI64x2ShrS:
+ rep_node[i] =
+ graph()->NewNode(machine()->Word64Sar(), rep_node[i], shift_node);
+ break;
case IrOpcode::kI32x4ShrS:
case IrOpcode::kI16x8ShrS:
case IrOpcode::kI8x16ShrS:
@@ -1026,6 +1102,26 @@ void SimdScalarLowering::LowerShiftOp(Node* node, SimdType type) {
ReplaceNode(node, rep_node, num_lanes);
}
+Node* SimdScalarLowering::ConstructPhiForComparison(Diamond d,
+ SimdType rep_type,
+ int true_value,
+ int false_value) {
+ // Close the given Diamond d using a Phi node, taking care of constructing the
+ // right kind of constants (Int32 or Int64) based on rep_type.
+ if (rep_type == SimdType::kFloat64x2) {
+ MachineRepresentation rep = MachineRepresentation::kWord64;
+ return d.Phi(rep, mcgraph_->Int64Constant(true_value),
+ mcgraph_->Int64Constant(false_value));
+ } else {
+ MachineRepresentation rep =
+ (rep_type == SimdType::kFloat32x4)
+ ? MachineRepresentation::kWord32
+ : MachineTypeFrom(rep_type).representation();
+ return d.Phi(rep, mcgraph_->Int32Constant(true_value),
+ mcgraph_->Int32Constant(false_value));
+ }
+}
+
void SimdScalarLowering::LowerNotEqual(Node* node, SimdType input_rep_type,
const Operator* op) {
DCHECK_EQ(2, node->InputCount());
@@ -1036,12 +1132,7 @@ void SimdScalarLowering::LowerNotEqual(Node* node, SimdType input_rep_type,
for (int i = 0; i < num_lanes; ++i) {
Diamond d(graph(), common(),
graph()->NewNode(op, rep_left[i], rep_right[i]));
- MachineRepresentation rep =
- (input_rep_type == SimdType::kFloat32x4)
- ? MachineRepresentation::kWord32
- : MachineTypeFrom(input_rep_type).representation();
- rep_node[i] =
- d.Phi(rep, mcgraph_->Int32Constant(0), mcgraph_->Int32Constant(-1));
+ rep_node[i] = ConstructPhiForComparison(d, input_rep_type, 0, -1);
}
ReplaceNode(node, rep_node, num_lanes);
}
@@ -1084,21 +1175,99 @@ void SimdScalarLowering::LowerBitMaskOp(Node* node, SimdType rep_type,
ReplaceNode(node, rep_node, 1);
}
+void SimdScalarLowering::LowerAllTrueOp(Node* node, SimdType rep_type) {
+ // AllTrue ops require the input to be of a particular SimdType, but the op
+ // itself is always replaced by a Int32x4 with 1 node.
+ int num_lanes = NumLanes(rep_type);
+ DCHECK_EQ(1, node->InputCount());
+ Node** rep = GetReplacementsWithType(node->InputAt(0), rep_type);
+
+ Node** rep_node = zone()->NewArray<Node*>(num_lanes);
+ Node* zero = mcgraph_->Int32Constant(0);
+ Node* tmp_result = mcgraph_->Int32Constant(1);
+ for (int i = 0; i < num_lanes; ++i) {
+ Diamond d(graph(), common(),
+ graph()->NewNode(machine()->Word32Equal(), rep[i], zero));
+ tmp_result = d.Phi(MachineRepresentation::kWord32, zero, tmp_result);
+ }
+ rep_node[0] = tmp_result;
+ for (int i = 1; i < num_lanes; ++i) {
+ rep_node[i] = nullptr;
+ }
+ ReplaceNode(node, rep_node, num_lanes);
+}
+
void SimdScalarLowering::LowerNode(Node* node) {
SimdType rep_type = ReplacementType(node);
int num_lanes = NumLanes(rep_type);
switch (node->opcode()) {
case IrOpcode::kS128Const: {
- // Lower 128.const to 4 Int32Constant.
+ // We could use GetReplacementsWithType for all this, but it adds a lot of
+ // nodes, so sign extend the immediates ourselves here.
DCHECK_EQ(0, node->InputCount());
- constexpr int kNumLanes = kSimd128Size / sizeof(uint32_t);
- uint32_t val[kNumLanes];
- memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size);
- Node** rep_node = zone()->NewArray<Node*>(kNumLanes);
- for (int i = 0; i < kNumLanes; ++i) {
- rep_node[i] = mcgraph_->Int32Constant(val[i]);
+ Node** rep_node = zone()->NewArray<Node*>(num_lanes);
+ S128ImmediateParameter params = S128ImmediateParameterOf(node->op());
+
+ // For all the small ints below, we have a choice of static_cast or bit
+ // twiddling, clang seems to be able to optimize either
+ // (https://godbolt.org/z/9c65o8) so use static_cast for clarity.
+ switch (rep_type) {
+ case SimdType::kInt8x16: {
+ for (int i = 0; i < num_lanes; ++i) {
+ Address data_address = reinterpret_cast<Address>(params.data() + i);
+ rep_node[i] = mcgraph_->Int32Constant(
+ static_cast<int32_t>(static_cast<int8_t>(
+ base::ReadLittleEndianValue<int8_t>(data_address))));
+ }
+ break;
+ }
+ case SimdType::kInt16x8: {
+ int16_t val[kNumLanes16];
+ memcpy(val, params.data(), kSimd128Size);
+ for (int i = 0; i < num_lanes; ++i) {
+ rep_node[i] = mcgraph_->Int32Constant(static_cast<int32_t>(
+ base::ReadLittleEndianValue<int16_t>(&val[i])));
+ }
+ break;
+ }
+ case SimdType::kInt32x4: {
+ uint32_t val[kNumLanes32];
+ memcpy(val, params.data(), kSimd128Size);
+ for (int i = 0; i < num_lanes; ++i) {
+ rep_node[i] = mcgraph_->Int32Constant(
+ base::ReadLittleEndianValue<uint32_t>(&val[i]));
+ }
+ break;
+ }
+ case SimdType::kInt64x2: {
+ uint64_t val[kNumLanes64];
+ memcpy(val, params.data(), kSimd128Size);
+ for (int i = 0; i < num_lanes; ++i) {
+ rep_node[i] = mcgraph_->Int64Constant(
+ base::ReadLittleEndianValue<uint64_t>(&val[i]));
+ }
+ break;
+ }
+ case SimdType::kFloat32x4: {
+ float val[kNumLanes32];
+ memcpy(val, params.data(), kSimd128Size);
+ for (int i = 0; i < num_lanes; ++i) {
+ rep_node[i] = mcgraph_->Float32Constant(
+ base::ReadLittleEndianValue<float>(&val[i]));
+ }
+ break;
+ }
+ case SimdType::kFloat64x2: {
+ double val[kNumLanes64];
+ memcpy(val, params.data(), kSimd128Size);
+ for (int i = 0; i < num_lanes; ++i) {
+ rep_node[i] = mcgraph_->Float64Constant(
+ base::ReadLittleEndianValue<double>(&val[i]));
+ }
+ break;
+ }
}
- ReplaceNode(node, rep_node, kNumLanes);
+ ReplaceNode(node, rep_node, num_lanes);
break;
}
case IrOpcode::kStart: {
@@ -1152,7 +1321,9 @@ void SimdScalarLowering::LowerNode(Node* node) {
}
case IrOpcode::kSimd128ReverseBytes: {
DCHECK_EQ(1, node->InputCount());
- bool is_float = ReplacementType(node->InputAt(0)) == SimdType::kFloat32x4;
+ SimdType input_type = ReplacementType(node->InputAt(0));
+ bool is_float = input_type == SimdType::kFloat32x4 ||
+ input_type == SimdType::kFloat64x2;
replacements_[node->id()].type =
is_float ? SimdType::kFloat32x4 : SimdType::kInt32x4;
Node** rep = GetReplacementsWithType(
@@ -1189,7 +1360,30 @@ void SimdScalarLowering::LowerNode(Node* node) {
break;
}
case IrOpcode::kReturn: {
+ int old_input_count = node->InputCount();
+ int return_arity = static_cast<int>(signature()->return_count());
+ for (int i = 0; i < return_arity; i++) {
+ if (signature()->GetReturn(i) != MachineRepresentation::kSimd128) {
+ continue;
+ }
+
+ // Return nodes have a hidden input at value 0.
+ Node* input = node->InputAt(i + 1);
+ if (!HasReplacement(0, input)) {
+ continue;
+ }
+
+ // V128 return types are lowered to i32x4.
+ Node** reps = GetReplacementsWithType(input, rep_type);
+ ReplaceNode(input, reps, NumLanes(rep_type));
+ }
+
DefaultLowering(node);
+ // Nothing needs to be done here since inputs did not change.
+ if (old_input_count == node->InputCount()) {
+ break;
+ }
+
int new_return_count = GetReturnCountAfterLoweringSimd128(signature());
if (static_cast<int>(signature()->return_count()) != new_return_count) {
NodeProperties::ChangeOp(node, common()->Return(new_return_count));
@@ -1204,6 +1398,16 @@ void SimdScalarLowering::LowerNode(Node* node) {
GetReturnCountAfterLoweringSimd128(call_descriptor) !=
static_cast<int>(call_descriptor->ReturnCount());
+ // All call arguments are lowered to i32x4 in the call descriptor, so the
+ // arguments need to be converted to i32x4 as well.
+ for (int i = NodeProperties::PastValueIndex(node) - 1; i >= 0; i--) {
+ Node* input = node->InputAt(i);
+ if (HasReplacement(0, input)) {
+ Node** reps = GetReplacementsWithType(input, SimdType::kInt32x4);
+ ReplaceNode(input, reps, NumLanes(SimdType::kInt32x4));
+ }
+ }
+
if (DefaultLowering(node) || returns_require_lowering) {
// We have to adjust the call descriptor.
const Operator* op = common()->Call(
@@ -1216,6 +1420,21 @@ void SimdScalarLowering::LowerNode(Node* node) {
}
size_t return_arity = call_descriptor->ReturnCount();
+
+ if (return_arity == 1) {
+ // We access the additional return values through projections.
+ // Special case for return_arity 1, with multi-returns, we would have
+ // already built projections for each return value, and will be handled
+ // by the following code.
+ Node* rep_node[kNumLanes32];
+ for (int i = 0; i < kNumLanes32; ++i) {
+ rep_node[i] =
+ graph()->NewNode(common()->Projection(i), node, graph()->start());
+ }
+ ReplaceNode(node, rep_node, kNumLanes32);
+ break;
+ }
+
ZoneVector<Node*> projections(return_arity, zone());
NodeProperties::CollectValueProjections(node, projections.data(),
return_arity);
@@ -1261,6 +1480,18 @@ void SimdScalarLowering::LowerNode(Node* node) {
}
break;
}
+ case IrOpcode::kI64x2Add: {
+ LowerBinaryOp(node, rep_type, machine()->Int64Add());
+ break;
+ }
+ case IrOpcode::kI64x2Sub: {
+ LowerBinaryOp(node, rep_type, machine()->Int64Sub());
+ break;
+ }
+ case IrOpcode::kI64x2Mul: {
+ LowerBinaryOp(node, rep_type, machine()->Int64Mul());
+ break;
+ }
#define I32X4_BINOP_CASE(opcode, instruction) \
case IrOpcode::opcode: { \
LowerBinaryOp(node, rep_type, machine()->instruction()); \
@@ -1340,6 +1571,18 @@ void SimdScalarLowering::LowerNode(Node* node) {
LowerIntMinMax(node, machine()->Uint32LessThan(), false, rep_type);
break;
}
+ case IrOpcode::kI64x2Neg: {
+ DCHECK_EQ(1, node->InputCount());
+ Node** rep = GetReplacementsWithType(node->InputAt(0), rep_type);
+ int num_lanes = NumLanes(rep_type);
+ Node** rep_node = zone()->NewArray<Node*>(num_lanes);
+ Node* zero = graph()->NewNode(common()->Int64Constant(0));
+ for (int i = 0; i < num_lanes; ++i) {
+ rep_node[i] = graph()->NewNode(machine()->Int64Sub(), zero, rep[i]);
+ }
+ ReplaceNode(node, rep_node, num_lanes);
+ break;
+ }
case IrOpcode::kI32x4Neg:
case IrOpcode::kI16x8Neg:
case IrOpcode::kI8x16Neg: {
@@ -1483,12 +1726,15 @@ void SimdScalarLowering::LowerNode(Node* node) {
LowerPack(node, SimdType::kInt16x8, SimdType::kInt8x16, false);
break;
}
+ case IrOpcode::kI64x2Shl:
case IrOpcode::kI32x4Shl:
case IrOpcode::kI16x8Shl:
case IrOpcode::kI8x16Shl:
+ case IrOpcode::kI64x2ShrS:
case IrOpcode::kI32x4ShrS:
case IrOpcode::kI16x8ShrS:
case IrOpcode::kI8x16ShrS:
+ case IrOpcode::kI64x2ShrU:
case IrOpcode::kI32x4ShrU:
case IrOpcode::kI16x8ShrU:
case IrOpcode::kI8x16ShrU: {
@@ -1544,6 +1790,42 @@ void SimdScalarLowering::LowerNode(Node* node) {
LowerUnaryOp(node, SimdType::kInt32x4, machine()->RoundUint32ToFloat32());
break;
}
+ case IrOpcode::kF64x2Abs: {
+ LowerUnaryOp(node, rep_type, machine()->Float64Abs());
+ break;
+ }
+ case IrOpcode::kF64x2Neg: {
+ LowerUnaryOp(node, rep_type, machine()->Float64Neg());
+ break;
+ }
+ case IrOpcode::kF64x2Sqrt: {
+ LowerUnaryOp(node, rep_type, machine()->Float64Sqrt());
+ break;
+ }
+ case IrOpcode::kF64x2Add: {
+ LowerBinaryOp(node, rep_type, machine()->Float64Add());
+ break;
+ }
+ case IrOpcode::kF64x2Sub: {
+ LowerBinaryOp(node, rep_type, machine()->Float64Sub());
+ break;
+ }
+ case IrOpcode::kF64x2Mul: {
+ LowerBinaryOp(node, rep_type, machine()->Float64Mul());
+ break;
+ }
+ case IrOpcode::kF64x2Div: {
+ LowerBinaryOp(node, rep_type, machine()->Float64Div());
+ break;
+ }
+ case IrOpcode::kF64x2Min: {
+ LowerBinaryOp(node, rep_type, machine()->Float64Min());
+ break;
+ }
+ case IrOpcode::kF64x2Max: {
+ LowerBinaryOp(node, rep_type, machine()->Float64Max());
+ break;
+ }
case IrOpcode::kF64x2Splat:
case IrOpcode::kF32x4Splat:
case IrOpcode::kI64x2Splat:
@@ -1551,18 +1833,30 @@ void SimdScalarLowering::LowerNode(Node* node) {
case IrOpcode::kI16x8Splat:
case IrOpcode::kI8x16Splat: {
Node** rep_node = zone()->NewArray<Node*>(num_lanes);
+ Node* val = (HasReplacement(0, node->InputAt(0)))
+ ? GetReplacements(node->InputAt(0))[0]
+ : node->InputAt(0);
+
+ // I16 and I8 are placed in Word32 nodes, we need to mask them
+ // accordingly, to account for overflows, then sign extend them.
+ if (node->opcode() == IrOpcode::kI16x8Splat) {
+ val = graph()->NewNode(machine()->SignExtendWord16ToInt32(),
+ Mask(val, kMask16));
+ } else if (node->opcode() == IrOpcode::kI8x16Splat) {
+ val = graph()->NewNode(machine()->SignExtendWord8ToInt32(),
+ Mask(val, kMask8));
+ }
+
for (int i = 0; i < num_lanes; ++i) {
- if (HasReplacement(0, node->InputAt(0))) {
- rep_node[i] = GetReplacements(node->InputAt(0))[0];
- } else {
- rep_node[i] = node->InputAt(0);
- }
+ rep_node[i] = val;
}
ReplaceNode(node, rep_node, num_lanes);
break;
}
- case IrOpcode::kI32x4ExtractLane:
+ case IrOpcode::kF64x2ExtractLane:
case IrOpcode::kF32x4ExtractLane:
+ case IrOpcode::kI64x2ExtractLane:
+ case IrOpcode::kI32x4ExtractLane:
case IrOpcode::kI16x8ExtractLaneU:
case IrOpcode::kI16x8ExtractLaneS:
case IrOpcode::kI8x16ExtractLaneU:
@@ -1573,11 +1867,14 @@ void SimdScalarLowering::LowerNode(Node* node) {
for (int i = 1; i < num_lanes; ++i) {
rep_node[i] = nullptr;
}
+
ReplaceNode(node, rep_node, num_lanes);
break;
}
- case IrOpcode::kI32x4ReplaceLane:
+ case IrOpcode::kF64x2ReplaceLane:
case IrOpcode::kF32x4ReplaceLane:
+ case IrOpcode::kI64x2ReplaceLane:
+ case IrOpcode::kI32x4ReplaceLane:
case IrOpcode::kI16x8ReplaceLane:
case IrOpcode::kI8x16ReplaceLane: {
DCHECK_EQ(2, node->InputCount());
@@ -1601,6 +1898,9 @@ void SimdScalarLowering::LowerNode(Node* node) {
LowerCompareOp(node, SimdType::k##type, machine()->lowering_op(), invert); \
break; \
}
+ COMPARISON_CASE(Float64x2, kF64x2Eq, Float64Equal, false)
+ COMPARISON_CASE(Float64x2, kF64x2Lt, Float64LessThan, false)
+ COMPARISON_CASE(Float64x2, kF64x2Le, Float64LessThanOrEqual, false)
COMPARISON_CASE(Float32x4, kF32x4Eq, Float32Equal, false)
COMPARISON_CASE(Float32x4, kF32x4Lt, Float32LessThan, false)
COMPARISON_CASE(Float32x4, kF32x4Le, Float32LessThanOrEqual, false)
@@ -1634,6 +1934,10 @@ void SimdScalarLowering::LowerNode(Node* node) {
COMPARISON_CASE(Int8x16, kI8x16GtU, Uint32LessThan, true)
COMPARISON_CASE(Int8x16, kI8x16GeU, Uint32LessThanOrEqual, true)
#undef COMPARISON_CASE
+ case IrOpcode::kF64x2Ne: {
+ LowerNotEqual(node, SimdType::kFloat64x2, machine()->Float64Equal());
+ break;
+ }
case IrOpcode::kF32x4Ne: {
LowerNotEqual(node, SimdType::kFloat32x4, machine()->Float32Equal());
break;
@@ -1655,7 +1959,8 @@ void SimdScalarLowering::LowerNode(Node* node) {
DCHECK(ReplacementType(node->InputAt(0)) == SimdType::kInt32x4 ||
ReplacementType(node->InputAt(0)) == SimdType::kInt16x8 ||
ReplacementType(node->InputAt(0)) == SimdType::kInt8x16);
- Node** boolean_input = GetReplacements(node->InputAt(0));
+ Node** boolean_input =
+ GetReplacementsWithType(node->InputAt(0), rep_type);
Node** rep_left = GetReplacementsWithType(node->InputAt(1), rep_type);
Node** rep_right = GetReplacementsWithType(node->InputAt(2), rep_type);
Node** rep_node = zone()->NewArray<Node*>(num_lanes);
@@ -1670,7 +1975,7 @@ void SimdScalarLowering::LowerNode(Node* node) {
ReplaceNode(node, rep_node, num_lanes);
break;
}
- case IrOpcode::kS8x16Swizzle: {
+ case IrOpcode::kI8x16Swizzle: {
DCHECK_EQ(2, node->InputCount());
Node** rep_left = GetReplacementsWithType(node->InputAt(0), rep_type);
Node** indices = GetReplacementsWithType(node->InputAt(1), rep_type);
@@ -1709,7 +2014,7 @@ void SimdScalarLowering::LowerNode(Node* node) {
ReplaceNode(node, rep_nodes, num_lanes);
break;
}
- case IrOpcode::kS8x16Shuffle: {
+ case IrOpcode::kI8x16Shuffle: {
DCHECK_EQ(2, node->InputCount());
S128ImmediateParameter shuffle = S128ImmediateParameterOf(node->op());
Node** rep_left = GetReplacementsWithType(node->InputAt(0), rep_type);
@@ -1723,45 +2028,22 @@ void SimdScalarLowering::LowerNode(Node* node) {
break;
}
case IrOpcode::kV32x4AnyTrue:
- case IrOpcode::kV32x4AllTrue:
case IrOpcode::kV16x8AnyTrue:
- case IrOpcode::kV16x8AllTrue:
- case IrOpcode::kV8x16AnyTrue:
- case IrOpcode::kV8x16AllTrue: {
+ case IrOpcode::kV8x16AnyTrue: {
DCHECK_EQ(1, node->InputCount());
- SimdType input_rep_type = ReplacementType(node->InputAt(0));
- Node** rep;
- // If the input is a SIMD float, bitcast it to a SIMD int of the same
- // shape, because the comparisons below use Word32.
- if (input_rep_type == SimdType::kFloat32x4) {
- // TODO(v8:9418): f64x2 lowering is not implemented yet.
- rep = GetReplacementsWithType(node->InputAt(0), SimdType::kInt32x4);
- } else {
- rep = GetReplacements(node->InputAt(0));
- }
- int input_num_lanes = NumLanes(input_rep_type);
+ // AnyTrue always returns a I32x4, and can work with inputs of any shape,
+ // but we still need GetReplacementsWithType if input is float.
+ DCHECK_EQ(ReplacementType(node), SimdType::kInt32x4);
+ Node** reps = GetReplacementsWithType(node->InputAt(0), rep_type);
Node** rep_node = zone()->NewArray<Node*>(num_lanes);
Node* true_node = mcgraph_->Int32Constant(1);
- Node* false_node = mcgraph_->Int32Constant(0);
- Node* tmp_result = false_node;
- if (node->opcode() == IrOpcode::kV32x4AllTrue ||
- node->opcode() == IrOpcode::kV16x8AllTrue ||
- node->opcode() == IrOpcode::kV8x16AllTrue) {
- tmp_result = true_node;
- }
- for (int i = 0; i < input_num_lanes; ++i) {
- Diamond is_false(
- graph(), common(),
- graph()->NewNode(machine()->Word32Equal(), rep[i], false_node));
- if (node->opcode() == IrOpcode::kV32x4AllTrue ||
- node->opcode() == IrOpcode::kV16x8AllTrue ||
- node->opcode() == IrOpcode::kV8x16AllTrue) {
- tmp_result = is_false.Phi(MachineRepresentation::kWord32, false_node,
- tmp_result);
- } else {
- tmp_result = is_false.Phi(MachineRepresentation::kWord32, tmp_result,
- true_node);
- }
+ Node* zero = mcgraph_->Int32Constant(0);
+ Node* tmp_result = zero;
+ for (int i = 0; i < num_lanes; ++i) {
+ Diamond d(graph(), common(),
+ graph()->NewNode(machine()->Word32Equal(), reps[i], zero));
+ tmp_result =
+ d.Phi(MachineRepresentation::kWord32, tmp_result, true_node);
}
rep_node[0] = tmp_result;
for (int i = 1; i < num_lanes; ++i) {
@@ -1770,6 +2052,18 @@ void SimdScalarLowering::LowerNode(Node* node) {
ReplaceNode(node, rep_node, num_lanes);
break;
}
+ case IrOpcode::kV32x4AllTrue: {
+ LowerAllTrueOp(node, SimdType::kInt32x4);
+ break;
+ }
+ case IrOpcode::kV16x8AllTrue: {
+ LowerAllTrueOp(node, SimdType::kInt16x8);
+ break;
+ }
+ case IrOpcode::kV8x16AllTrue: {
+ LowerAllTrueOp(node, SimdType::kInt8x16);
+ break;
+ }
case IrOpcode::kI8x16BitMask: {
LowerBitMaskOp(node, rep_type, 7);
break;
@@ -1789,11 +2083,18 @@ void SimdScalarLowering::LowerNode(Node* node) {
Node** rep_right = GetReplacementsWithType(node->InputAt(1), rep_type);
int num_lanes = NumLanes(rep_type);
Node** rep_node = zone()->NewArray<Node*>(num_lanes);
+ // Nodes are stored signed, so mask away the top bits.
// rounding_average(left, right) = (left + right + 1) >> 1
+ const int bit_mask = num_lanes == 16 ? kMask8 : kMask16;
for (int i = 0; i < num_lanes; ++i) {
+ Node* mask_left = graph()->NewNode(machine()->Word32And(), rep_left[i],
+ mcgraph_->Int32Constant(bit_mask));
+ Node* mask_right =
+ graph()->NewNode(machine()->Word32And(), rep_right[i],
+ mcgraph_->Int32Constant(bit_mask));
Node* left_plus_right_plus_one = graph()->NewNode(
machine()->Int32Add(),
- graph()->NewNode(machine()->Int32Add(), rep_left[i], rep_right[i]),
+ graph()->NewNode(machine()->Int32Add(), mask_left, mask_right),
mcgraph_->Int32Constant(1));
rep_node[i] =
graph()->NewNode(machine()->Word32Shr(), left_plus_right_plus_one,
@@ -1862,6 +2163,28 @@ void SimdScalarLowering::Int32ToFloat32(Node** replacements, Node** result) {
}
}
+void SimdScalarLowering::Int64ToFloat64(Node** replacements, Node** result) {
+ for (int i = 0; i < kNumLanes64; ++i) {
+ if (replacements[i] != nullptr) {
+ result[i] =
+ graph()->NewNode(machine()->BitcastInt64ToFloat64(), replacements[i]);
+ } else {
+ result[i] = nullptr;
+ }
+ }
+}
+
+void SimdScalarLowering::Float64ToInt64(Node** replacements, Node** result) {
+ for (int i = 0; i < kNumLanes64; ++i) {
+ if (replacements[i] != nullptr) {
+ result[i] =
+ graph()->NewNode(machine()->BitcastFloat64ToInt64(), replacements[i]);
+ } else {
+ result[i] = nullptr;
+ }
+ }
+}
+
void SimdScalarLowering::Float32ToInt32(Node** replacements, Node** result) {
for (int i = 0; i < kNumLanes32; ++i) {
if (replacements[i] != nullptr) {
@@ -1873,6 +2196,26 @@ void SimdScalarLowering::Float32ToInt32(Node** replacements, Node** result) {
}
}
+void SimdScalarLowering::Int64ToInt32(Node** replacements, Node** result) {
+ const int num_ints = sizeof(int64_t) / sizeof(int32_t);
+ const int bit_size = sizeof(int32_t) * 8;
+ const Operator* truncate = machine()->TruncateInt64ToInt32();
+
+ for (int i = 0; i < kNumLanes64; i++) {
+ if (replacements[i] != nullptr) {
+ for (int j = 0; j < num_ints; j++) {
+ result[num_ints * i + j] = graph()->NewNode(
+ truncate, graph()->NewNode(machine()->Word64Sar(), replacements[i],
+ mcgraph_->Int32Constant(j * bit_size)));
+ }
+ } else {
+ for (int j = 0; j < num_ints; j++) {
+ result[num_ints * i + j] = nullptr;
+ }
+ }
+ }
+}
+
template <typename T>
void SimdScalarLowering::Int32ToSmallerInt(Node** replacements, Node** result) {
const int num_ints = sizeof(int32_t) / sizeof(T);
@@ -1926,6 +2269,20 @@ void SimdScalarLowering::SmallerIntToInt32(Node** replacements, Node** result) {
}
}
+void SimdScalarLowering::Int32ToInt64(Node** replacements, Node** result) {
+ const int num_ints = sizeof(int64_t) / sizeof(int32_t);
+
+ for (int i = 0; i < kNumLanes64; i++) {
+ Node* i64 = graph()->NewNode(machine()->ChangeUint32ToUint64(),
+ replacements[num_ints * i + 1]);
+ Node* high = graph()->NewNode(machine()->Word64Shl(), i64,
+ mcgraph_->Int32Constant(32));
+ Node* i64_low = graph()->NewNode(machine()->ChangeUint32ToUint64(),
+ replacements[num_ints * i]);
+ result[i] = graph()->NewNode(machine()->Word64Or(), high, i64_low);
+ }
+}
+
Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) {
Node** replacements = GetReplacements(node);
if (ReplacementType(node) == type) {
@@ -1933,8 +2290,22 @@ Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) {
}
int num_lanes = NumLanes(type);
Node** result = zone()->NewArray<Node*>(num_lanes);
- if (type == SimdType::kInt32x4) {
- if (ReplacementType(node) == SimdType::kFloat32x4) {
+ if (type == SimdType::kInt64x2) {
+ if (ReplacementType(node) == SimdType::kInt32x4) {
+ Int32ToInt64(replacements, result);
+ } else if (ReplacementType(node) == SimdType::kFloat64x2) {
+ Float64ToInt64(replacements, result);
+ } else {
+ UNIMPLEMENTED();
+ }
+ } else if (type == SimdType::kInt32x4) {
+ if (ReplacementType(node) == SimdType::kInt64x2) {
+ Int64ToInt32(replacements, result);
+ } else if (ReplacementType(node) == SimdType::kFloat64x2) {
+ Node** float64_to_int64 = zone()->NewArray<Node*>(kNumLanes64);
+ Float64ToInt64(replacements, float64_to_int64);
+ Int64ToInt32(float64_to_int64, result);
+ } else if (ReplacementType(node) == SimdType::kFloat32x4) {
Float32ToInt32(replacements, result);
} else if (ReplacementType(node) == SimdType::kInt16x8) {
SmallerIntToInt32<int16_t>(replacements, result);
@@ -1943,8 +2314,24 @@ Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) {
} else {
UNREACHABLE();
}
+ } else if (type == SimdType::kFloat64x2) {
+ if (ReplacementType(node) == SimdType::kInt64x2) {
+ Int64ToFloat64(replacements, result);
+ } else if (ReplacementType(node) == SimdType::kInt32x4) {
+ Node** int32_to_int64 = zone()->NewArray<Node*>(kNumLanes64);
+ Int32ToInt64(replacements, int32_to_int64);
+ Int64ToFloat64(int32_to_int64, result);
+ } else {
+ UNIMPLEMENTED();
+ }
} else if (type == SimdType::kFloat32x4) {
- if (ReplacementType(node) == SimdType::kInt32x4) {
+ if (ReplacementType(node) == SimdType::kFloat64x2) {
+ Node** float64_to_int64 = zone()->NewArray<Node*>(kNumLanes64);
+ Node** int64_to_int32 = zone()->NewArray<Node*>(kNumLanes32);
+ Float64ToInt64(replacements, float64_to_int64);
+ Int64ToInt32(float64_to_int64, int64_to_int32);
+ Int32ToFloat32(int64_to_int32, result);
+ } else if (ReplacementType(node) == SimdType::kInt32x4) {
Int32ToFloat32(replacements, result);
} else if (ReplacementType(node) == SimdType::kInt16x8) {
UNIMPLEMENTED();
@@ -1958,13 +2345,23 @@ Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) {
if (ReplacementType(node) == SimdType::kInt32x4) {
Int32ToSmallerInt<int16_t>(replacements, result);
} else if (ReplacementType(node) == SimdType::kFloat32x4) {
- UNIMPLEMENTED();
+ Node** float32_to_int32 = zone()->NewArray<Node*>(kNumLanes32);
+ Float32ToInt32(replacements, float32_to_int32);
+ Int32ToSmallerInt<int16_t>(float32_to_int32, result);
} else {
UNREACHABLE();
}
} else if (type == SimdType::kInt8x16) {
- if (ReplacementType(node) == SimdType::kInt32x4) {
+ if (ReplacementType(node) == SimdType::kInt64x2) {
+ Node** int64_to_int32 = zone()->NewArray<Node*>(kNumLanes32);
+ Int64ToInt32(replacements, int64_to_int32);
+ Int32ToSmallerInt<int8_t>(int64_to_int32, result);
+ } else if (ReplacementType(node) == SimdType::kInt32x4) {
Int32ToSmallerInt<int8_t>(replacements, result);
+ } else if (ReplacementType(node) == SimdType::kInt16x8) {
+ Node** int16_to_int32 = zone()->NewArray<Node*>(kNumLanes32);
+ SmallerIntToInt32<int16_t>(replacements, int16_to_int32);
+ Int32ToSmallerInt<int8_t>(int16_to_int32, result);
} else {
UNIMPLEMENTED();
}
diff --git a/deps/v8/src/compiler/simd-scalar-lowering.h b/deps/v8/src/compiler/simd-scalar-lowering.h
index a852f94c7c..b86071f0ae 100644
--- a/deps/v8/src/compiler/simd-scalar-lowering.h
+++ b/deps/v8/src/compiler/simd-scalar-lowering.h
@@ -6,6 +6,7 @@
#define V8_COMPILER_SIMD_SCALAR_LOWERING_H_
#include "src/compiler/common-operator.h"
+#include "src/compiler/diamond.h"
#include "src/compiler/graph.h"
#include "src/compiler/machine-graph.h"
#include "src/compiler/machine-operator.h"
@@ -73,12 +74,16 @@ class SimdScalarLowering {
bool HasReplacement(size_t index, Node* node);
Node** GetReplacements(Node* node);
int ReplacementCount(Node* node);
+ void Float64ToInt64(Node** replacements, Node** result);
void Float32ToInt32(Node** replacements, Node** result);
void Int32ToFloat32(Node** replacements, Node** result);
+ void Int64ToFloat64(Node** replacements, Node** result);
+ void Int64ToInt32(Node** replacements, Node** result);
template <typename T>
void Int32ToSmallerInt(Node** replacements, Node** result);
template <typename T>
void SmallerIntToInt32(Node** replacements, Node** result);
+ void Int32ToInt64(Node** replacements, Node** result);
Node** GetReplacementsWithType(Node* node, SimdType type);
SimdType ReplacementType(Node* node);
void PreparePhiReplacement(Node* phi);
@@ -89,6 +94,8 @@ class SimdScalarLowering {
void LowerStoreOp(Node* node);
void LowerBinaryOp(Node* node, SimdType input_rep_type, const Operator* op,
bool not_horizontal = true);
+ Node* ConstructPhiForComparison(Diamond d, SimdType rep_type, int true_value,
+ int false_value);
void LowerCompareOp(Node* node, SimdType input_rep_type, const Operator* op,
bool invert_inputs = false);
Node* FixUpperBits(Node* input, int32_t shift);
@@ -111,6 +118,7 @@ class SimdScalarLowering {
void LowerNotEqual(Node* node, SimdType input_rep_type, const Operator* op);
MachineType MachineTypeFrom(SimdType simdType);
void LowerBitMaskOp(Node* node, SimdType rep_type, int msb_index);
+ void LowerAllTrueOp(Node* node, SimdType rep_type);
MachineGraph* const mcgraph_;
NodeMarker<State> state_;
diff --git a/deps/v8/src/compiler/simplified-lowering.cc b/deps/v8/src/compiler/simplified-lowering.cc
index 491fe74e39..2842259a2e 100644
--- a/deps/v8/src/compiler/simplified-lowering.cc
+++ b/deps/v8/src/compiler/simplified-lowering.cc
@@ -2828,6 +2828,7 @@ class RepresentationSelector {
return VisitUnop<T>(node, UseInfo::AnyTagged(),
MachineRepresentation::kTaggedPointer);
}
+ case IrOpcode::kTierUpCheck:
case IrOpcode::kUpdateInterruptBudget: {
ProcessInput<T>(node, 0, UseInfo::AnyTagged());
ProcessRemainingInputs<T>(node, 1);
diff --git a/deps/v8/src/compiler/simplified-operator-reducer.cc b/deps/v8/src/compiler/simplified-operator-reducer.cc
index e2f87b674e..3a5b3c6ec6 100644
--- a/deps/v8/src/compiler/simplified-operator-reducer.cc
+++ b/deps/v8/src/compiler/simplified-operator-reducer.cc
@@ -220,6 +220,41 @@ Reduction SimplifiedOperatorReducer::Reduce(Node* node) {
if (m.left().node() == m.right().node()) return ReplaceBoolean(true);
break;
}
+ case IrOpcode::kCheckedInt32Add: {
+ // (x + a) + b => x + (a + b) where a and b are constants and have the
+ // same sign.
+ Int32BinopMatcher m(node);
+ if (m.right().HasValue()) {
+ Node* checked_int32_add = m.left().node();
+ if (checked_int32_add->opcode() == IrOpcode::kCheckedInt32Add) {
+ Int32BinopMatcher n(checked_int32_add);
+ if (n.right().HasValue() &&
+ (n.right().Value() >= 0) == (m.right().Value() >= 0)) {
+ int32_t val;
+ bool overflow = base::bits::SignedAddOverflow32(
+ n.right().Value(), m.right().Value(), &val);
+ if (!overflow) {
+ bool has_no_other_value_uses = true;
+ for (Edge edge : checked_int32_add->use_edges()) {
+ if (!edge.from()->IsDead() &&
+ !NodeProperties::IsEffectEdge(edge) &&
+ edge.from() != node) {
+ has_no_other_value_uses = false;
+ break;
+ }
+ }
+ if (has_no_other_value_uses) {
+ node->ReplaceInput(0, n.left().node());
+ node->ReplaceInput(1, jsgraph()->Int32Constant(val));
+ RelaxEffectsAndControls(checked_int32_add);
+ return Changed(node);
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
default:
break;
}
diff --git a/deps/v8/src/compiler/simplified-operator.cc b/deps/v8/src/compiler/simplified-operator.cc
index bedfb6acaa..33bd71d221 100644
--- a/deps/v8/src/compiler/simplified-operator.cc
+++ b/deps/v8/src/compiler/simplified-operator.cc
@@ -289,19 +289,26 @@ CheckMapsParameters const& CheckMapsParametersOf(Operator const* op) {
bool operator==(DynamicCheckMapsParameters const& lhs,
DynamicCheckMapsParameters const& rhs) {
- return lhs.handler().address() == rhs.handler().address() &&
- lhs.feedback() == rhs.feedback() && lhs.state() == rhs.state();
+ // FeedbackSource is sufficient as an equality check. FeedbackSource uniquely
+ // determines all other properties (handler, flags and the monomorphic map
+ DCHECK_IMPLIES(lhs.feedback() == rhs.feedback(),
+ lhs.flags() == rhs.flags() && lhs.state() == rhs.state() &&
+ lhs.handler().address() == rhs.handler().address() &&
+ lhs.map().address() == rhs.map().address());
+ return lhs.feedback() == rhs.feedback();
}
size_t hash_value(DynamicCheckMapsParameters const& p) {
FeedbackSource::Hash feedback_hash;
- return base::hash_combine(p.handler().address(), feedback_hash(p.feedback()),
- p.state());
+ // FeedbackSource is sufficient for hashing. FeedbackSource uniquely
+ // determines all other properties (handler, flags and the monomorphic map
+ return base::hash_combine(feedback_hash(p.feedback()));
}
std::ostream& operator<<(std::ostream& os,
DynamicCheckMapsParameters const& p) {
- return os << p.handler() << ", " << p.feedback() << "," << p.state();
+ return os << p.handler() << ", " << p.feedback() << "," << p.state() << ","
+ << p.flags() << "," << p.map().address();
}
DynamicCheckMapsParameters const& DynamicCheckMapsParametersOf(
@@ -1315,6 +1322,12 @@ const Operator* SimplifiedOperatorBuilder::UpdateInterruptBudget(int delta) {
"UpdateInterruptBudget", 1, 1, 1, 0, 1, 0, delta);
}
+const Operator* SimplifiedOperatorBuilder::TierUpCheck() {
+ return zone()->New<Operator>(IrOpcode::kTierUpCheck,
+ Operator::kNoThrow | Operator::kNoDeopt,
+ "TierUpCheck", 1, 1, 1, 0, 1, 0);
+}
+
const Operator* SimplifiedOperatorBuilder::AssertType(Type type) {
DCHECK(type.IsRange());
return zone()->New<Operator1<Type>>(IrOpcode::kAssertType,
@@ -1474,11 +1487,10 @@ const Operator* SimplifiedOperatorBuilder::CheckMaps(
}
const Operator* SimplifiedOperatorBuilder::DynamicCheckMaps(
- CheckMapsFlags flags, Handle<Object> handler,
- const FeedbackSource& feedback,
- DynamicCheckMapsParameters::ICState ic_state) {
- DynamicCheckMapsParameters const parameters(flags, handler, feedback,
- ic_state);
+ CheckMapsFlags flags, Handle<Object> handler, MaybeHandle<Map> maybe_map,
+ const FeedbackSource& feedback) {
+ DynamicCheckMapsParameters const parameters(flags, handler, maybe_map,
+ feedback);
return zone()->New<Operator1<DynamicCheckMapsParameters>>( // --
IrOpcode::kDynamicCheckMaps, // opcode
Operator::kNoThrow | Operator::kNoWrite, // flags
diff --git a/deps/v8/src/compiler/simplified-operator.h b/deps/v8/src/compiler/simplified-operator.h
index c4b5740c10..eab865fd59 100644
--- a/deps/v8/src/compiler/simplified-operator.h
+++ b/deps/v8/src/compiler/simplified-operator.h
@@ -432,19 +432,26 @@ class DynamicCheckMapsParameters final {
enum ICState { kMonomorphic, kPolymorphic };
DynamicCheckMapsParameters(CheckMapsFlags flags, Handle<Object> handler,
- const FeedbackSource& feedback, ICState state)
- : flags_(flags), handler_(handler), feedback_(feedback), state_(state) {}
+ MaybeHandle<Map> maybe_map,
+ const FeedbackSource& feedback)
+ : flags_(flags),
+ handler_(handler),
+ maybe_map_(maybe_map),
+ feedback_(feedback) {}
CheckMapsFlags flags() const { return flags_; }
Handle<Object> handler() const { return handler_; }
+ MaybeHandle<Map> map() const { return maybe_map_; }
FeedbackSource const& feedback() const { return feedback_; }
- ICState const& state() const { return state_; }
+ ICState state() const {
+ return maybe_map_.is_null() ? ICState::kPolymorphic : ICState::kMonomorphic;
+ }
private:
CheckMapsFlags const flags_;
Handle<Object> const handler_;
+ MaybeHandle<Map> const maybe_map_;
FeedbackSource const feedback_;
- ICState const state_;
};
bool operator==(DynamicCheckMapsParameters const&,
@@ -803,6 +810,11 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final
// delta parameter represents the executed bytecodes since the last update.
const Operator* UpdateInterruptBudget(int delta);
+ // Takes the current feedback vector as input 0, and generates a check of the
+ // vector's marker. Depending on the marker's value, we either do nothing,
+ // trigger optimized compilation, or install a finished code object.
+ const Operator* TierUpCheck();
+
const Operator* ToBoolean();
const Operator* StringConcat();
@@ -875,10 +887,9 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final
const Operator* CheckInternalizedString();
const Operator* CheckMaps(CheckMapsFlags, ZoneHandleSet<Map>,
const FeedbackSource& = FeedbackSource());
- const Operator* DynamicCheckMaps(
- CheckMapsFlags flags, Handle<Object> handler,
- const FeedbackSource& feedback,
- DynamicCheckMapsParameters::ICState ic_state);
+ const Operator* DynamicCheckMaps(CheckMapsFlags flags, Handle<Object> handler,
+ MaybeHandle<Map> map,
+ const FeedbackSource& feedback);
const Operator* CheckNotTaggedHole();
const Operator* CheckNumber(const FeedbackSource& feedback);
const Operator* CheckReceiver();
@@ -1159,6 +1170,18 @@ class FastApiCallNode final : public SimplifiedNodeWrapperBase {
}
};
+class TierUpCheckNode final : public SimplifiedNodeWrapperBase {
+ public:
+ explicit constexpr TierUpCheckNode(Node* node)
+ : SimplifiedNodeWrapperBase(node) {
+ CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kTierUpCheck);
+ }
+
+#define INPUTS(V) V(FeedbackVector, feedback_vector, 0, FeedbackVector)
+ INPUTS(DEFINE_INPUT_ACCESSORS)
+#undef INPUTS
+};
+
class UpdateInterruptBudgetNode final : public SimplifiedNodeWrapperBase {
public:
explicit constexpr UpdateInterruptBudgetNode(Node* node)
diff --git a/deps/v8/src/compiler/store-store-elimination.cc b/deps/v8/src/compiler/store-store-elimination.cc
index c89d5d712a..70dadd9441 100644
--- a/deps/v8/src/compiler/store-store-elimination.cc
+++ b/deps/v8/src/compiler/store-store-elimination.cc
@@ -396,7 +396,8 @@ UnobservablesSet RedundantStoreFinder::RecomputeUseIntersection(Node* node) {
// Everything is observable after these opcodes; return the empty set.
DCHECK_EXTRA(
opcode == IrOpcode::kReturn || opcode == IrOpcode::kTerminate ||
- opcode == IrOpcode::kDeoptimize || opcode == IrOpcode::kThrow,
+ opcode == IrOpcode::kDeoptimize || opcode == IrOpcode::kThrow ||
+ opcode == IrOpcode::kTailCall,
"for #%d:%s", node->id(), node->op()->mnemonic());
USE(opcode);
diff --git a/deps/v8/src/compiler/typer.cc b/deps/v8/src/compiler/typer.cc
index 9ec3eac5e5..a4996f3cc2 100644
--- a/deps/v8/src/compiler/typer.cc
+++ b/deps/v8/src/compiler/typer.cc
@@ -325,7 +325,7 @@ void Typer::Run(const NodeVector& roots,
induction_vars->ChangeToInductionVariablePhis();
}
Visitor visitor(this, induction_vars);
- GraphReducer graph_reducer(zone(), graph(), tick_counter_);
+ GraphReducer graph_reducer(zone(), graph(), tick_counter_, broker());
graph_reducer.AddReducer(&visitor);
for (Node* const root : roots) graph_reducer.ReduceNode(root);
graph_reducer.ReduceGraph();
@@ -1196,6 +1196,7 @@ Type Typer::Visitor::TypeTypeOf(Node* node) {
return Type::InternalizedString();
}
+Type Typer::Visitor::TypeTierUpCheck(Node* node) { UNREACHABLE(); }
Type Typer::Visitor::TypeUpdateInterruptBudget(Node* node) { UNREACHABLE(); }
// JS conversion operators.
@@ -1307,6 +1308,10 @@ Type Typer::Visitor::TypeJSLoadProperty(Node* node) {
Type Typer::Visitor::TypeJSLoadNamed(Node* node) { return Type::NonInternal(); }
+Type Typer::Visitor::TypeJSLoadNamedFromSuper(Node* node) {
+ return Type::NonInternal();
+}
+
Type Typer::Visitor::TypeJSLoadGlobal(Node* node) {
return Type::NonInternal();
}
@@ -1821,7 +1826,7 @@ Type Typer::Visitor::TypeJSCallRuntime(Node* node) {
return TypeUnaryOp(node, ToNumber);
case Runtime::kInlineToObject:
return TypeUnaryOp(node, ToObject);
- case Runtime::kInlineToStringRT:
+ case Runtime::kInlineToString:
return TypeUnaryOp(node, ToString);
case Runtime::kHasInPrototypeChain:
return Type::Boolean();
diff --git a/deps/v8/src/compiler/verifier.cc b/deps/v8/src/compiler/verifier.cc
index edf085485c..302e1212ee 100644
--- a/deps/v8/src/compiler/verifier.cc
+++ b/deps/v8/src/compiler/verifier.cc
@@ -722,6 +722,9 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
case IrOpcode::kJSLoadNamed:
CheckTypeIs(node, Type::Any());
break;
+ case IrOpcode::kJSLoadNamedFromSuper:
+ CheckTypeIs(node, Type::Any());
+ break;
case IrOpcode::kJSLoadGlobal:
CheckTypeIs(node, Type::Any());
CHECK(LoadGlobalParametersOf(node->op()).feedback().IsValid());
@@ -760,6 +763,7 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
case IrOpcode::kTypeOf:
CheckTypeIs(node, Type::InternalizedString());
break;
+ case IrOpcode::kTierUpCheck:
case IrOpcode::kUpdateInterruptBudget:
CheckValueInputIs(node, 0, Type::Any());
CheckNotTyped(node);
diff --git a/deps/v8/src/compiler/wasm-compiler.cc b/deps/v8/src/compiler/wasm-compiler.cc
index f8f333da2b..91dde088f6 100644
--- a/deps/v8/src/compiler/wasm-compiler.cc
+++ b/deps/v8/src/compiler/wasm-compiler.cc
@@ -134,15 +134,18 @@ MachineType assert_size(int expected_size, MachineType type) {
wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(index), value, \
MachineRepresentation::kTagged, kFullWriteBarrier)
-void MergeControlToEnd(MachineGraph* mcgraph, Node* node) {
+void EnsureEnd(MachineGraph* mcgraph) {
Graph* g = mcgraph->graph();
- if (g->end()) {
- NodeProperties::MergeControlToEnd(g, mcgraph->common(), node);
- } else {
- g->SetEnd(g->NewNode(mcgraph->common()->End(1), node));
+ if (g->end() == nullptr) {
+ g->SetEnd(g->NewNode(mcgraph->common()->End(0)));
}
}
+void MergeControlToEnd(MachineGraph* mcgraph, Node* node) {
+ EnsureEnd(mcgraph);
+ NodeProperties::MergeControlToEnd(mcgraph->graph(), mcgraph->common(), node);
+}
+
bool ContainsSimd(const wasm::FunctionSig* sig) {
for (auto type : sig->all()) {
if (type == wasm::kWasmS128) return true;
@@ -3051,15 +3054,6 @@ Node* WasmGraphBuilder::BuildCallRef(uint32_t sig_index, Vector<Node*> args,
{
// Function imported to module.
- // TODO(9495): Make sure it works with functions imported from other
- // modules. Currently, this will never happen: Since functions have to be
- // tunneled through JS, and we currently do not have a JS API to pass
- // specific function types, we habe to export/import function references
- // as funcref. Then, we cannot cast down to the type of the function,
- // because we do not have access to the defining module's types. This
- // could be fixed either by building a richer JS API, or by implementing
- // the type import proposal. That said, this code should work for those
- // cases too.
gasm_->Bind(&imported_label);
Node* imported_instance = gasm_->Load(
@@ -3087,8 +3081,9 @@ Node* WasmGraphBuilder::BuildCallRef(uint32_t sig_index, Vector<Node*> args,
// Call to a WasmJSFunction.
// The call target is the wasm-to-js wrapper code.
gasm_->Bind(&js_label);
- // TODO(7748): Implement.
- TrapIfTrue(wasm::kTrapUnreachable, gasm_->Int32Constant(1), position);
+ // TODO(9495): Implement when the interaction with the type reflection
+ // proposal is clear.
+ TrapIfTrue(wasm::kTrapWasmJSFunction, gasm_->Int32Constant(1), position);
gasm_->Goto(&end_label, args[0], RefNull() /* Dummy value */);
}
@@ -3675,7 +3670,7 @@ Node* WasmGraphBuilder::CheckBoundsAndAlignment(
// bounds-checked index, which is guaranteed to have (the equivalent of)
// {uintptr_t} representation.
Node* WasmGraphBuilder::BoundsCheckMem(uint8_t access_size, Node* index,
- uint32_t offset,
+ uint64_t offset,
wasm::WasmCodePosition position,
EnforceBoundsCheck enforce_check) {
DCHECK_LE(1, access_size);
@@ -3686,13 +3681,17 @@ Node* WasmGraphBuilder::BoundsCheckMem(uint8_t access_size, Node* index,
return index;
}
- if (!base::IsInBounds<uint64_t>(offset, access_size, env_->max_memory_size)) {
+ // If the offset does not fit in a uintptr_t, this can never succeed on this
+ // machine.
+ if (offset > std::numeric_limits<uintptr_t>::max() ||
+ !base::IsInBounds<uintptr_t>(offset, access_size,
+ env_->max_memory_size)) {
// The access will be out of bounds, even for the largest memory.
TrapIfEq32(wasm::kTrapMemOutOfBounds, Int32Constant(0), 0, position);
- return mcgraph()->IntPtrConstant(0);
+ return mcgraph()->UintPtrConstant(0);
}
- uint64_t end_offset = uint64_t{offset} + access_size - 1u;
- Node* end_offset_node = IntPtrConstant(end_offset);
+ uintptr_t end_offset = offset + access_size - 1u;
+ Node* end_offset_node = mcgraph_->UintPtrConstant(end_offset);
// The accessed memory is [index + offset, index + end_offset].
// Check that the last read byte (at {index + end_offset}) is in bounds.
@@ -3996,9 +3995,7 @@ Node* WasmGraphBuilder::LoadTransform(wasm::ValueType type, MachineType memtype,
Node* index, uint32_t offset,
uint32_t alignment,
wasm::WasmCodePosition position) {
- if (memtype.representation() == MachineRepresentation::kSimd128) {
- has_simd_ = true;
- }
+ has_simd_ = true;
Node* load;
@@ -4366,15 +4363,17 @@ CallDescriptor* WasmGraphBuilder::GetI64AtomicWaitCallDescriptor() {
return i64_atomic_wait_descriptor_;
}
-void WasmGraphBuilder::LowerInt64(CallOrigin origin) {
+void WasmGraphBuilder::LowerInt64(Signature<MachineRepresentation>* sig) {
if (mcgraph()->machine()->Is64()) return;
Int64Lowering r(mcgraph()->graph(), mcgraph()->machine(), mcgraph()->common(),
- mcgraph()->zone(),
- CreateMachineSignature(mcgraph()->zone(), sig_, origin),
- std::move(lowering_special_case_));
+ mcgraph()->zone(), sig, std::move(lowering_special_case_));
r.LowerGraph();
}
+void WasmGraphBuilder::LowerInt64(CallOrigin origin) {
+ LowerInt64(CreateMachineSignature(mcgraph()->zone(), sig_, origin));
+}
+
void WasmGraphBuilder::SimdScalarLoweringForTesting() {
SimdScalarLowering(mcgraph(), CreateMachineSignature(mcgraph()->zone(), sig_,
kCalledFromWasm))
@@ -4952,8 +4951,8 @@ Node* WasmGraphBuilder::SimdOp(wasm::WasmOpcode opcode, Node* const* inputs) {
return graph()->NewNode(mcgraph()->machine()->V8x16AnyTrue(), inputs[0]);
case wasm::kExprV8x16AllTrue:
return graph()->NewNode(mcgraph()->machine()->V8x16AllTrue(), inputs[0]);
- case wasm::kExprS8x16Swizzle:
- return graph()->NewNode(mcgraph()->machine()->S8x16Swizzle(), inputs[0],
+ case wasm::kExprI8x16Swizzle:
+ return graph()->NewNode(mcgraph()->machine()->I8x16Swizzle(), inputs[0],
inputs[1]);
default:
FATAL_UNSUPPORTED_OPCODE(opcode);
@@ -5014,7 +5013,7 @@ Node* WasmGraphBuilder::SimdLaneOp(wasm::WasmOpcode opcode, uint8_t lane,
Node* WasmGraphBuilder::Simd8x16ShuffleOp(const uint8_t shuffle[16],
Node* const* inputs) {
has_simd_ = true;
- return graph()->NewNode(mcgraph()->machine()->S8x16Shuffle(shuffle),
+ return graph()->NewNode(mcgraph()->machine()->I8x16Shuffle(shuffle),
inputs[0], inputs[1]);
}
@@ -5568,13 +5567,13 @@ Node* IsI31(GraphAssembler* gasm, Node* object) {
}
}
-void AssertFalse(GraphAssembler* gasm, Node* condition) {
+void AssertFalse(MachineGraph* mcgraph, GraphAssembler* gasm, Node* condition) {
#if DEBUG
if (FLAG_debug_code) {
auto ok = gasm->MakeLabel();
gasm->GotoIfNot(condition, &ok);
+ EnsureEnd(mcgraph);
gasm->Unreachable();
- gasm->Goto(&ok);
gasm->Bind(&ok);
}
#endif
@@ -5592,7 +5591,7 @@ Node* WasmGraphBuilder::RefTest(Node* object, Node* rtt,
gasm_->GotoIf(IsI31(gasm_.get(), object), &done, gasm_->Int32Constant(0));
need_done_label = true;
} else {
- AssertFalse(gasm_.get(), IsI31(gasm_.get(), object));
+ AssertFalse(mcgraph(), gasm_.get(), IsI31(gasm_.get(), object));
}
if (null_check == kWithNullCheck) {
gasm_->GotoIf(gasm_->WordEqual(object, RefNull()), &done,
@@ -5627,7 +5626,7 @@ Node* WasmGraphBuilder::RefCast(Node* object, Node* rtt,
TrapIfTrue(wasm::kTrapIllegalCast, IsI31(gasm_.get(), object), position);
}
} else {
- AssertFalse(gasm_.get(), IsI31(gasm_.get(), object));
+ AssertFalse(mcgraph(), gasm_.get(), IsI31(gasm_.get(), object));
}
if (null_check == kWithNullCheck) {
TrapIfTrue(wasm::kTrapIllegalCast, gasm_->WordEqual(object, RefNull()),
@@ -5667,7 +5666,7 @@ Node* WasmGraphBuilder::BrOnCast(Node* object, Node* rtt,
merge_effects.emplace_back(effect());
}
} else {
- AssertFalse(gasm_.get(), is_i31);
+ AssertFalse(mcgraph(), gasm_.get(), is_i31);
}
if (null_check == kWithNullCheck) {
@@ -5855,9 +5854,11 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
public:
WasmWrapperGraphBuilder(Zone* zone, MachineGraph* mcgraph,
const wasm::FunctionSig* sig,
+ const wasm::WasmModule* module,
compiler::SourcePositionTable* spt,
StubCallMode stub_mode, wasm::WasmFeatures features)
: WasmGraphBuilder(nullptr, zone, mcgraph, sig, spt),
+ module_(module),
stub_mode_(stub_mode),
enabled_features_(features) {}
@@ -6063,6 +6064,10 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
if (representation == wasm::HeapType::kEq) {
return BuildAllocateObjectWrapper(node);
}
+ if (type.has_index() && module_->has_signature(type.ref_index())) {
+ // Typed function
+ return node;
+ }
// TODO(7748): Figure out a JS interop story for arrays and structs.
// If this is reached, then IsJSCompatibleSignature() is too permissive.
UNREACHABLE();
@@ -6148,6 +6153,29 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
graph()->NewNode(call, target, input, context, effect(), control()));
}
+ void BuildCheckValidRefValue(Node* input, Node* js_context,
+ wasm::ValueType type) {
+ // Make sure ValueType fits in a Smi.
+ STATIC_ASSERT(wasm::ValueType::kLastUsedBit + 1 <= kSmiValueSize);
+ Node* inputs[] = {
+ instance_node_.get(), input,
+ IntPtrConstant(IntToSmi(static_cast<int>(type.raw_bit_field())))};
+
+ Node* check = BuildChangeSmiToInt32(SetEffect(BuildCallToRuntimeWithContext(
+ Runtime::kWasmIsValidRefValue, js_context, inputs, 3)));
+
+ Diamond type_check(graph(), mcgraph()->common(), check, BranchHint::kTrue);
+ type_check.Chain(control());
+ SetControl(type_check.if_false);
+
+ Node* old_effect = effect();
+ BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, js_context,
+ nullptr, 0);
+
+ SetEffectControl(type_check.EffectPhi(old_effect, effect()),
+ type_check.merge);
+ }
+
Node* FromJS(Node* input, Node* js_context, wasm::ValueType type) {
switch (type.kind()) {
case wasm::ValueType::kRef:
@@ -6156,28 +6184,21 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
case wasm::HeapType::kExtern:
case wasm::HeapType::kExn:
return input;
- case wasm::HeapType::kFunc: {
- Node* check =
- BuildChangeSmiToInt32(SetEffect(BuildCallToRuntimeWithContext(
- Runtime::kWasmIsValidFuncRefValue, js_context, &input, 1)));
-
- Diamond type_check(graph(), mcgraph()->common(), check,
- BranchHint::kTrue);
- type_check.Chain(control());
- SetControl(type_check.if_false);
-
- Node* old_effect = effect();
- BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError,
- js_context, nullptr, 0);
-
- SetEffectControl(type_check.EffectPhi(old_effect, effect()),
- type_check.merge);
-
+ case wasm::HeapType::kFunc:
+ BuildCheckValidRefValue(input, js_context, type);
return input;
- }
case wasm::HeapType::kEq:
+ BuildCheckValidRefValue(input, js_context, type);
return BuildUnpackObjectWrapper(input);
+ case wasm::HeapType::kI31:
+ // If this is reached, then IsJSCompatibleSignature() is too
+ // permissive.
+ UNREACHABLE();
default:
+ if (module_->has_signature(type.ref_index())) {
+ BuildCheckValidRefValue(input, js_context, type);
+ return input;
+ }
// If this is reached, then IsJSCompatibleSignature() is too
// permissive.
UNREACHABLE();
@@ -6210,6 +6231,38 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
}
}
+ Node* SmiToFloat32(Node* input) {
+ return graph()->NewNode(mcgraph()->machine()->RoundInt32ToFloat32(),
+ BuildChangeSmiToInt32(input));
+ }
+
+ Node* SmiToFloat64(Node* input) {
+ return graph()->NewNode(mcgraph()->machine()->ChangeInt32ToFloat64(),
+ BuildChangeSmiToInt32(input));
+ }
+
+ Node* FromJSFast(Node* input, wasm::ValueType type) {
+ switch (type.kind()) {
+ case wasm::ValueType::kI32:
+ return BuildChangeSmiToInt32(input);
+ case wasm::ValueType::kF32:
+ return SmiToFloat32(input);
+ case wasm::ValueType::kF64:
+ return SmiToFloat64(input);
+ case wasm::ValueType::kRef:
+ case wasm::ValueType::kOptRef:
+ case wasm::ValueType::kI64:
+ case wasm::ValueType::kRtt:
+ case wasm::ValueType::kS128:
+ case wasm::ValueType::kI8:
+ case wasm::ValueType::kI16:
+ case wasm::ValueType::kBottom:
+ case wasm::ValueType::kStmt:
+ UNREACHABLE();
+ break;
+ }
+ }
+
void BuildModifyThreadInWasmFlag(bool new_value) {
if (!trap_handler::IsTrapHandlerEnabled()) return;
Node* isolate_root = BuildLoadIsolateRoot();
@@ -6280,55 +6333,15 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
return SetControl(CALL_BUILTIN(WasmAllocateJSArray, array_length, context));
}
- void BuildJSToWasmWrapper(bool is_import) {
- const int wasm_count = static_cast<int>(sig_->parameter_count());
- const int rets_count = static_cast<int>(sig_->return_count());
-
- // Build the start and the JS parameter nodes.
- SetEffectControl(Start(wasm_count + 5));
-
- // Create the js_closure and js_context parameters.
- Node* js_closure =
- graph()->NewNode(mcgraph()->common()->Parameter(
- Linkage::kJSCallClosureParamIndex, "%closure"),
- graph()->start());
- Node* js_context = graph()->NewNode(
- mcgraph()->common()->Parameter(
- Linkage::GetJSCallContextParamIndex(wasm_count + 1), "%context"),
- graph()->start());
-
- // Create the instance_node node to pass as parameter. It is loaded from
- // an actual reference to an instance or a placeholder reference,
- // called {WasmExportedFunction} via the {WasmExportedFunctionData}
- // structure.
- Node* function_data = BuildLoadFunctionDataFromExportedFunction(js_closure);
- instance_node_.set(
- BuildLoadInstanceFromExportedFunctionData(function_data));
-
- if (!wasm::IsJSCompatibleSignature(sig_, enabled_features_)) {
- // Throw a TypeError. Use the js_context of the calling javascript
- // function (passed as a parameter), such that the generated code is
- // js_context independent.
- BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, js_context,
- nullptr, 0);
- TerminateThrow(effect(), control());
- return;
- }
-
- const int args_count = wasm_count + 1; // +1 for wasm_code.
- base::SmallVector<Node*, 16> args(args_count);
- base::SmallVector<Node*, 1> rets(rets_count);
-
- // Convert JS parameters to wasm numbers.
- for (int i = 0; i < wasm_count; ++i) {
- Node* param = Param(i + 1);
- Node* wasm_param = FromJS(param, js_context, sig_->GetParam(i));
- args[i + 1] = wasm_param;
- }
-
+ Node* BuildCallAndReturn(bool is_import, Node* js_context,
+ Node* function_data,
+ base::SmallVector<Node*, 16> args) {
// Set the ThreadInWasm flag before we do the actual call.
BuildModifyThreadInWasmFlag(true);
+ const int rets_count = static_cast<int>(sig_->return_count());
+ base::SmallVector<Node*, 1> rets(rets_count);
+
if (is_import) {
// Call to an imported function.
// Load function index from {WasmExportedFunctionData}.
@@ -6373,7 +6386,147 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
STORE_FIXED_ARRAY_SLOT_ANY(fixed_array, i, value);
}
}
- Return(jsval);
+ return jsval;
+ }
+
+ bool QualifiesForFastTransform(const wasm::FunctionSig*) {
+ const int wasm_count = static_cast<int>(sig_->parameter_count());
+ for (int i = 0; i < wasm_count; ++i) {
+ wasm::ValueType type = sig_->GetParam(i);
+ switch (type.kind()) {
+ case wasm::ValueType::kRef:
+ case wasm::ValueType::kOptRef:
+ case wasm::ValueType::kI64:
+ case wasm::ValueType::kRtt:
+ case wasm::ValueType::kS128:
+ case wasm::ValueType::kI8:
+ case wasm::ValueType::kI16:
+ case wasm::ValueType::kBottom:
+ case wasm::ValueType::kStmt:
+ return false;
+ case wasm::ValueType::kI32:
+ case wasm::ValueType::kF32:
+ case wasm::ValueType::kF64:
+ break;
+ }
+ }
+ return true;
+ }
+
+ Node* IsSmi(Node* input) {
+ return gasm_->Word32Equal(
+ gasm_->Word32And(BuildTruncateIntPtrToInt32(input),
+ gasm_->Int32Constant(kSmiTagMask)),
+ gasm_->Int32Constant(0));
+ }
+
+ Node* CanTransformFast(Node* input, wasm::ValueType type) {
+ switch (type.kind()) {
+ case wasm::ValueType::kI32:
+ case wasm::ValueType::kF64:
+ case wasm::ValueType::kF32:
+ return IsSmi(input);
+ case wasm::ValueType::kRef:
+ case wasm::ValueType::kOptRef:
+ case wasm::ValueType::kI64:
+ case wasm::ValueType::kRtt:
+ case wasm::ValueType::kS128:
+ case wasm::ValueType::kI8:
+ case wasm::ValueType::kI16:
+ case wasm::ValueType::kBottom:
+ case wasm::ValueType::kStmt:
+ UNREACHABLE();
+ break;
+ }
+ }
+
+ void BuildJSToWasmWrapper(bool is_import) {
+ const int wasm_count = static_cast<int>(sig_->parameter_count());
+
+ // Build the start and the JS parameter nodes.
+ SetEffectControl(Start(wasm_count + 5));
+
+ // Create the js_closure and js_context parameters.
+ Node* js_closure =
+ graph()->NewNode(mcgraph()->common()->Parameter(
+ Linkage::kJSCallClosureParamIndex, "%closure"),
+ graph()->start());
+ Node* js_context = graph()->NewNode(
+ mcgraph()->common()->Parameter(
+ Linkage::GetJSCallContextParamIndex(wasm_count + 1), "%context"),
+ graph()->start());
+
+ // Create the instance_node node to pass as parameter. It is loaded from
+ // an actual reference to an instance or a placeholder reference,
+ // called {WasmExportedFunction} via the {WasmExportedFunctionData}
+ // structure.
+ Node* function_data = BuildLoadFunctionDataFromExportedFunction(js_closure);
+ instance_node_.set(
+ BuildLoadInstanceFromExportedFunctionData(function_data));
+
+ if (!wasm::IsJSCompatibleSignature(sig_, module_, enabled_features_)) {
+ // Throw a TypeError. Use the js_context of the calling javascript
+ // function (passed as a parameter), such that the generated code is
+ // js_context independent.
+ BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, js_context,
+ nullptr, 0);
+ TerminateThrow(effect(), control());
+ return;
+ }
+
+ const int args_count = wasm_count + 1; // +1 for wasm_code.
+
+ // Check whether the signature of the function allows for a fast
+ // transformation (if any params exist that need transformation).
+ // Create a fast transformation path, only if it does.
+ bool include_fast_path = wasm_count && QualifiesForFastTransform(sig_);
+
+ // Prepare Param() nodes. Param() nodes can only be created once,
+ // so we need to use the same nodes along all possible transformation paths.
+ base::SmallVector<Node*, 16> params(args_count);
+ for (int i = 0; i < wasm_count; ++i) params[i + 1] = Param(i + 1);
+
+ auto done = gasm_->MakeLabel(MachineRepresentation::kTagged);
+ if (include_fast_path) {
+ auto slow_path = gasm_->MakeDeferredLabel();
+ // Check if the params received on runtime can be actually transformed
+ // using the fast transformation. When a param that cannot be transformed
+ // fast is encountered, skip checking the rest and fall back to the slow
+ // path.
+ for (int i = 0; i < wasm_count; ++i) {
+ gasm_->GotoIfNot(CanTransformFast(params[i + 1], sig_->GetParam(i)),
+ &slow_path);
+ }
+ // Convert JS parameters to wasm numbers using the fast transformation
+ // and build the call.
+ base::SmallVector<Node*, 16> args(args_count);
+ for (int i = 0; i < wasm_count; ++i) {
+ Node* wasm_param = FromJSFast(params[i + 1], sig_->GetParam(i));
+ args[i + 1] = wasm_param;
+ }
+ Node* jsval =
+ BuildCallAndReturn(is_import, js_context, function_data, args);
+ gasm_->Goto(&done, jsval);
+ gasm_->Bind(&slow_path);
+ }
+ // Convert JS parameters to wasm numbers using the default transformation
+ // and build the call.
+ base::SmallVector<Node*, 16> args(args_count);
+ for (int i = 0; i < wasm_count; ++i) {
+ Node* wasm_param = FromJS(params[i + 1], js_context, sig_->GetParam(i));
+ args[i + 1] = wasm_param;
+ }
+ Node* jsval =
+ BuildCallAndReturn(is_import, js_context, function_data, args);
+ // If both the default and a fast transformation paths are present,
+ // get the return value based on the path used.
+ if (include_fast_path) {
+ gasm_->Goto(&done, jsval);
+ gasm_->Bind(&done);
+ Return(done.PhiAt(0));
+ } else {
+ Return(jsval);
+ }
if (ContainsInt64(sig_)) LowerInt64(kCalledFromJS);
}
@@ -6743,7 +6896,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
isolate->factory()->undefined_value()));
// Throw a TypeError if the signature is incompatible with JavaScript.
- if (!wasm::IsJSCompatibleSignature(sig_, enabled_features_)) {
+ if (!wasm::IsJSCompatibleSignature(sig_, module_, enabled_features_)) {
BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, context,
nullptr, 0);
TerminateThrow(effect(), control());
@@ -6898,6 +7051,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
}
private:
+ const wasm::WasmModule* module_;
StubCallMode stub_mode_;
SetOncePointer<Node> undefined_value_node_;
SetOncePointer<const Operator> int32_to_heapnumber_operator_;
@@ -6914,8 +7068,8 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
std::unique_ptr<OptimizedCompilationJob> NewJSToWasmCompilationJob(
Isolate* isolate, wasm::WasmEngine* wasm_engine,
- const wasm::FunctionSig* sig, bool is_import,
- const wasm::WasmFeatures& enabled_features) {
+ const wasm::FunctionSig* sig, const wasm::WasmModule* module,
+ bool is_import, const wasm::WasmFeatures& enabled_features) {
//----------------------------------------------------------------------------
// Create the Graph.
//----------------------------------------------------------------------------
@@ -6929,7 +7083,7 @@ std::unique_ptr<OptimizedCompilationJob> NewJSToWasmCompilationJob(
InstructionSelector::AlignmentRequirements());
MachineGraph* mcgraph = zone->New<MachineGraph>(graph, common, machine);
- WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, nullptr,
+ WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, module, nullptr,
StubCallMode::kCallBuiltinPointer,
enabled_features);
builder.BuildJSToWasmWrapper(is_import);
@@ -6956,6 +7110,7 @@ std::unique_ptr<OptimizedCompilationJob> NewJSToWasmCompilationJob(
std::pair<WasmImportCallKind, Handle<JSReceiver>> ResolveWasmImportCall(
Handle<JSReceiver> callable, const wasm::FunctionSig* expected_sig,
+ const wasm::WasmModule* module,
const wasm::WasmFeatures& enabled_features) {
if (WasmExportedFunction::IsWasmExportedFunction(*callable)) {
auto imported_function = Handle<WasmExportedFunction>::cast(callable);
@@ -6985,13 +7140,13 @@ std::pair<WasmImportCallKind, Handle<JSReceiver>> ResolveWasmImportCall(
}
if (WasmCapiFunction::IsWasmCapiFunction(*callable)) {
auto capi_function = Handle<WasmCapiFunction>::cast(callable);
- if (!capi_function->IsSignatureEqual(expected_sig)) {
+ if (!capi_function->MatchesSignature(expected_sig)) {
return std::make_pair(WasmImportCallKind::kLinkError, callable);
}
return std::make_pair(WasmImportCallKind::kWasmToCapi, callable);
}
// Assuming we are calling to JS, check whether this would be a runtime error.
- if (!wasm::IsJSCompatibleSignature(expected_sig, enabled_features)) {
+ if (!wasm::IsJSCompatibleSignature(expected_sig, module, enabled_features)) {
return std::make_pair(WasmImportCallKind::kRuntimeTypeError, callable);
}
// For JavaScript calls, determine whether the target has an arity match.
@@ -7069,10 +7224,14 @@ std::pair<WasmImportCallKind, Handle<JSReceiver>> ResolveWasmImportCall(
Compiler::Compile(function, Compiler::CLEAR_EXCEPTION,
&is_compiled_scope);
}
+#ifndef V8_REVERSE_JSARGS
+ // This optimization is disabled when the arguments are reversed. It will be
+ // subsumed when the argumens adaptor frame is removed.
if (shared->is_safe_to_skip_arguments_adaptor()) {
return std::make_pair(
WasmImportCallKind::kJSFunctionArityMismatchSkipAdaptor, callable);
}
+#endif
return std::make_pair(WasmImportCallKind::kJSFunctionArityMismatch,
callable);
@@ -7216,9 +7375,9 @@ wasm::WasmCompilationResult CompileWasmImportCallWrapper(
SourcePositionTable* source_position_table =
source_positions ? zone.New<SourcePositionTable>(graph) : nullptr;
- WasmWrapperGraphBuilder builder(&zone, mcgraph, sig, source_position_table,
- StubCallMode::kCallWasmRuntimeStub,
- env->enabled_features);
+ WasmWrapperGraphBuilder builder(
+ &zone, mcgraph, sig, env->module, source_position_table,
+ StubCallMode::kCallWasmRuntimeStub, env->enabled_features);
builder.BuildWasmImportCallWrapper(kind, expected_arity);
// Build a name in the form "wasm-to-js-<kind>-<signature>".
@@ -7261,9 +7420,9 @@ wasm::WasmCode* CompileWasmCapiCallWrapper(wasm::WasmEngine* wasm_engine,
InstructionSelector::SupportedMachineOperatorFlags(),
InstructionSelector::AlignmentRequirements()));
- WasmWrapperGraphBuilder builder(&zone, mcgraph, sig, source_positions,
- StubCallMode::kCallWasmRuntimeStub,
- native_module->enabled_features());
+ WasmWrapperGraphBuilder builder(
+ &zone, mcgraph, sig, native_module->module(), source_positions,
+ StubCallMode::kCallWasmRuntimeStub, native_module->enabled_features());
// Set up the graph start.
int param_count = static_cast<int>(sig->parameter_count()) +
@@ -7297,7 +7456,8 @@ wasm::WasmCode* CompileWasmCapiCallWrapper(wasm::WasmEngine* wasm_engine,
}
MaybeHandle<Code> CompileJSToJSWrapper(Isolate* isolate,
- const wasm::FunctionSig* sig) {
+ const wasm::FunctionSig* sig,
+ const wasm::WasmModule* module) {
std::unique_ptr<Zone> zone = std::make_unique<Zone>(
isolate->allocator(), ZONE_NAME, kCompressGraphZone);
Graph* graph = zone->New<Graph>(zone.get());
@@ -7308,7 +7468,7 @@ MaybeHandle<Code> CompileJSToJSWrapper(Isolate* isolate,
InstructionSelector::AlignmentRequirements());
MachineGraph* mcgraph = zone->New<MachineGraph>(graph, common, machine);
- WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, nullptr,
+ WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, module, nullptr,
StubCallMode::kCallBuiltinPointer,
wasm::WasmFeatures::FromIsolate(isolate));
builder.BuildJSToJSWrapper(isolate);
@@ -7342,7 +7502,8 @@ MaybeHandle<Code> CompileJSToJSWrapper(Isolate* isolate,
return code;
}
-Handle<Code> CompileCWasmEntry(Isolate* isolate, const wasm::FunctionSig* sig) {
+Handle<Code> CompileCWasmEntry(Isolate* isolate, const wasm::FunctionSig* sig,
+ const wasm::WasmModule* module) {
std::unique_ptr<Zone> zone = std::make_unique<Zone>(
isolate->allocator(), ZONE_NAME, kCompressGraphZone);
Graph* graph = zone->New<Graph>(zone.get());
@@ -7353,7 +7514,7 @@ Handle<Code> CompileCWasmEntry(Isolate* isolate, const wasm::FunctionSig* sig) {
InstructionSelector::AlignmentRequirements());
MachineGraph* mcgraph = zone->New<MachineGraph>(graph, common, machine);
- WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, nullptr,
+ WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, module, nullptr,
StubCallMode::kCallBuiltinPointer,
wasm::WasmFeatures::FromIsolate(isolate));
builder.BuildCWasmEntry();
@@ -7417,16 +7578,50 @@ bool BuildGraphForWasmFunction(AccountingAllocator* allocator,
return false;
}
- builder.LowerInt64(WasmWrapperGraphBuilder::kCalledFromWasm);
-
+ // Lower SIMD first, i64x2 nodes will be lowered to int64 nodes, then int64
+ // lowering will take care of them.
+ auto sig = CreateMachineSignature(mcgraph->zone(), func_body.sig,
+ WasmGraphBuilder::kCalledFromWasm);
if (builder.has_simd() &&
(!CpuFeatures::SupportsWasmSimd128() || env->lower_simd)) {
- SimdScalarLowering(
- mcgraph, CreateMachineSignature(mcgraph->zone(), func_body.sig,
- WasmGraphBuilder::kCalledFromWasm))
- .LowerGraph();
+ SimdScalarLowering(mcgraph, sig).LowerGraph();
+
+ // SimdScalarLowering changes all v128 to 4 i32, so update the machine
+ // signature for the call to LowerInt64.
+ size_t return_count = 0;
+ size_t param_count = 0;
+ for (auto ret : sig->returns()) {
+ return_count += ret == MachineRepresentation::kSimd128 ? 4 : 1;
+ }
+ for (auto param : sig->parameters()) {
+ param_count += param == MachineRepresentation::kSimd128 ? 4 : 1;
+ }
+
+ Signature<MachineRepresentation>::Builder sig_builder(
+ mcgraph->zone(), return_count, param_count);
+ for (auto ret : sig->returns()) {
+ if (ret == MachineRepresentation::kSimd128) {
+ for (int i = 0; i < 4; ++i) {
+ sig_builder.AddReturn(MachineRepresentation::kWord32);
+ }
+ } else {
+ sig_builder.AddReturn(ret);
+ }
+ }
+ for (auto param : sig->parameters()) {
+ if (param == MachineRepresentation::kSimd128) {
+ for (int i = 0; i < 4; ++i) {
+ sig_builder.AddParam(MachineRepresentation::kWord32);
+ }
+ } else {
+ sig_builder.AddParam(param);
+ }
+ }
+ sig = sig_builder.Build();
}
+ builder.LowerInt64(sig);
+
if (func_index >= FLAG_trace_wasm_ast_start &&
func_index < FLAG_trace_wasm_ast_end) {
PrintRawWasmCode(allocator, func_body, env->module, wasm::kPrintLocals);
diff --git a/deps/v8/src/compiler/wasm-compiler.h b/deps/v8/src/compiler/wasm-compiler.h
index c35ca3e844..ab42610239 100644
--- a/deps/v8/src/compiler/wasm-compiler.h
+++ b/deps/v8/src/compiler/wasm-compiler.h
@@ -106,6 +106,7 @@ constexpr WasmImportCallKind kDefaultImportCallKind =
// another target, which is why the ultimate target is returned as well.
V8_EXPORT_PRIVATE std::pair<WasmImportCallKind, Handle<JSReceiver>>
ResolveWasmImportCall(Handle<JSReceiver> callable, const wasm::FunctionSig* sig,
+ const wasm::WasmModule* module,
const wasm::WasmFeatures& enabled_features);
// Compiles an import call wrapper, which allows Wasm to call imports.
@@ -122,13 +123,14 @@ wasm::WasmCode* CompileWasmCapiCallWrapper(wasm::WasmEngine*,
// Returns an OptimizedCompilationJob object for a JS to Wasm wrapper.
std::unique_ptr<OptimizedCompilationJob> NewJSToWasmCompilationJob(
Isolate* isolate, wasm::WasmEngine* wasm_engine,
- const wasm::FunctionSig* sig, bool is_import,
- const wasm::WasmFeatures& enabled_features);
+ const wasm::FunctionSig* sig, const wasm::WasmModule* module,
+ bool is_import, const wasm::WasmFeatures& enabled_features);
// Compiles a stub with JS linkage that serves as an adapter for function
// objects constructed via {WebAssembly.Function}. It performs a round-trip
// simulating a JS-to-Wasm-to-JS coercion of parameter and return values.
-MaybeHandle<Code> CompileJSToJSWrapper(Isolate*, const wasm::FunctionSig*);
+MaybeHandle<Code> CompileJSToJSWrapper(Isolate*, const wasm::FunctionSig*,
+ const wasm::WasmModule* module);
enum CWasmEntryParameters {
kCodeEntry,
@@ -141,8 +143,8 @@ enum CWasmEntryParameters {
// Compiles a stub with C++ linkage, to be called from Execution::CallWasm,
// which knows how to feed it its parameters.
-V8_EXPORT_PRIVATE Handle<Code> CompileCWasmEntry(Isolate*,
- const wasm::FunctionSig*);
+V8_EXPORT_PRIVATE Handle<Code> CompileCWasmEntry(
+ Isolate*, const wasm::FunctionSig*, const wasm::WasmModule* module);
// Values from the instance object are cached between Wasm-level function calls.
// This struct allows the SSA environment handling this cache to be defined
@@ -359,6 +361,9 @@ class WasmGraphBuilder {
enum CallOrigin { kCalledFromWasm, kCalledFromJS };
+ // Overload for when we want to provide a specific signature, rather than
+ // build one using sig_, for example after scalar lowering.
+ V8_EXPORT_PRIVATE void LowerInt64(Signature<MachineRepresentation>* sig);
V8_EXPORT_PRIVATE void LowerInt64(CallOrigin origin);
V8_EXPORT_PRIVATE void SimdScalarLoweringForTesting();
@@ -452,7 +457,7 @@ class WasmGraphBuilder {
Node* MemBuffer(uint32_t offset);
// BoundsCheckMem receives a uint32 {index} node and returns a ptrsize index.
- Node* BoundsCheckMem(uint8_t access_size, Node* index, uint32_t offset,
+ Node* BoundsCheckMem(uint8_t access_size, Node* index, uint64_t offset,
wasm::WasmCodePosition, EnforceBoundsCheck);
// Check that the range [start, start + size) is in the range [0, max).
// Also updates *size with the valid range. Returns true if the range is
diff --git a/deps/v8/src/d8/async-hooks-wrapper.cc b/deps/v8/src/d8/async-hooks-wrapper.cc
index 1d160cdb0d..fc58db9bd8 100644
--- a/deps/v8/src/d8/async-hooks-wrapper.cc
+++ b/deps/v8/src/d8/async-hooks-wrapper.cc
@@ -196,11 +196,9 @@ void AsyncHooks::Initialize() {
async_hook_ctor.Get(isolate_)->InstanceTemplate());
async_hooks_templ.Get(isolate_)->SetInternalFieldCount(1);
async_hooks_templ.Get(isolate_)->Set(
- String::NewFromUtf8Literal(isolate_, "enable"),
- FunctionTemplate::New(isolate_, EnableHook));
+ isolate_, "enable", FunctionTemplate::New(isolate_, EnableHook));
async_hooks_templ.Get(isolate_)->Set(
- String::NewFromUtf8Literal(isolate_, "disable"),
- FunctionTemplate::New(isolate_, DisableHook));
+ isolate_, "disable", FunctionTemplate::New(isolate_, DisableHook));
async_id_smb.Reset(isolate_, Private::New(isolate_));
trigger_id_smb.Reset(isolate_, Private::New(isolate_));
diff --git a/deps/v8/src/d8/d8-platforms.cc b/deps/v8/src/d8/d8-platforms.cc
index a170e39c92..e42ee60a16 100644
--- a/deps/v8/src/d8/d8-platforms.cc
+++ b/deps/v8/src/d8/d8-platforms.cc
@@ -276,8 +276,8 @@ class DelayedTasksPlatform final : public Platform {
job_task_->Run(delegate);
}
- size_t GetMaxConcurrency() const override {
- return job_task_->GetMaxConcurrency();
+ size_t GetMaxConcurrency(size_t worker_count) const override {
+ return job_task_->GetMaxConcurrency(worker_count);
}
private:
diff --git a/deps/v8/src/d8/d8-posix.cc b/deps/v8/src/d8/d8-posix.cc
index ba6356e447..c7313b4435 100644
--- a/deps/v8/src/d8/d8-posix.cc
+++ b/deps/v8/src/d8/d8-posix.cc
@@ -677,7 +677,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) {
if (connect(sockfd, reinterpret_cast<sockaddr*>(&serv_addr),
sizeof(serv_addr)) < 0) {
fprintf(stderr, "Failed to connect to localhost:%d\n",
- Shell::options.read_from_tcp_port);
+ Shell::options.read_from_tcp_port.get());
close(sockfd);
return nullptr;
}
@@ -705,7 +705,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) {
ssize_t sent_now = send(sockfd, name + sent_len, name_len - sent_len, 0);
if (sent_now < 0) {
fprintf(stderr, "Failed to send %s to localhost:%d\n", name,
- Shell::options.read_from_tcp_port);
+ Shell::options.read_from_tcp_port.get());
close(sockfd);
return nullptr;
}
@@ -722,7 +722,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) {
// We need those 4 bytes to read off the file length.
if (received < 4) {
fprintf(stderr, "Failed to receive %s's length from localhost:%d\n", name,
- Shell::options.read_from_tcp_port);
+ Shell::options.read_from_tcp_port.get());
close(sockfd);
return nullptr;
}
@@ -731,7 +731,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) {
if (file_length < 0) {
fprintf(stderr, "Received length %d for %s from localhost:%d\n",
- file_length, name, Shell::options.read_from_tcp_port);
+ file_length, name, Shell::options.read_from_tcp_port.get());
close(sockfd);
return nullptr;
}
@@ -746,7 +746,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) {
recv(sockfd, chars + total_received, file_length - total_received, 0);
if (received < 0) {
fprintf(stderr, "Failed to receive %s from localhost:%d\n", name,
- Shell::options.read_from_tcp_port);
+ Shell::options.read_from_tcp_port.get());
close(sockfd);
delete[] chars;
return nullptr;
diff --git a/deps/v8/src/d8/d8.cc b/deps/v8/src/d8/d8.cc
index 26ccb62c68..dc17a69697 100644
--- a/deps/v8/src/d8/d8.cc
+++ b/deps/v8/src/d8/d8.cc
@@ -43,6 +43,7 @@
#include "src/init/v8.h"
#include "src/interpreter/interpreter.h"
#include "src/logging/counters.h"
+#include "src/logging/log-utils.h"
#include "src/objects/managed.h"
#include "src/objects/objects-inl.h"
#include "src/objects/objects.h"
@@ -100,7 +101,7 @@ namespace {
const int kMB = 1024 * 1024;
#ifdef V8_FUZZILLI
-// REPRL = read-eval-print-loop
+// REPRL = read-eval-print-reset-loop
// These file descriptors are being opened when Fuzzilli uses fork & execve to
// run V8.
#define REPRL_CRFD 100 // Control read file decriptor
@@ -472,6 +473,7 @@ std::atomic<int> Shell::unhandled_promise_rejections_{0};
Global<Context> Shell::evaluation_context_;
ArrayBuffer::Allocator* Shell::array_buffer_allocator;
+bool check_d8_flag_contradictions = true;
ShellOptions Shell::options;
base::OnceType Shell::quit_once_ = V8_ONCE_INIT;
@@ -712,7 +714,7 @@ std::string ToSTLString(Isolate* isolate, Local<String> v8_str) {
bool IsAbsolutePath(const std::string& path) {
#if defined(_WIN32) || defined(_WIN64)
- // TODO(adamk): This is an incorrect approximation, but should
+ // This is an incorrect approximation, but should
// work for all our test-running cases.
return path.find(':') != std::string::npos;
#else
@@ -723,7 +725,8 @@ bool IsAbsolutePath(const std::string& path) {
std::string GetWorkingDirectory() {
#if defined(_WIN32) || defined(_WIN64)
char system_buffer[MAX_PATH];
- // TODO(adamk): Support Unicode paths.
+ // Unicode paths are unsupported, which is fine as long as
+ // the test directory doesn't include any such paths.
DWORD len = GetCurrentDirectoryA(MAX_PATH, system_buffer);
CHECK_GT(len, 0);
return system_buffer;
@@ -846,7 +849,7 @@ MaybeLocal<Module> Shell::FetchModuleTree(Local<Context> context,
}
}
if (source_text.IsEmpty()) {
- std::string msg = "Error reading: " + file_name;
+ std::string msg = "d8: Error reading module from " + file_name;
Throw(isolate, msg.c_str());
return MaybeLocal<Module>();
}
@@ -1140,6 +1143,7 @@ PerIsolateData::PerIsolateData(Isolate* isolate)
if (i::FLAG_expose_async_hooks) {
async_hooks_wrapper_ = new AsyncHooks(isolate);
}
+ ignore_unhandled_promises_ = false;
}
PerIsolateData::~PerIsolateData() {
@@ -1170,6 +1174,7 @@ MaybeLocal<Context> PerIsolateData::GetTimeoutContext() {
}
void PerIsolateData::RemoveUnhandledPromise(Local<Promise> promise) {
+ if (ignore_unhandled_promises_) return;
// Remove handled promises from the list
DCHECK_EQ(promise->GetIsolate(), isolate_);
for (auto it = unhandled_promises_.begin(); it != unhandled_promises_.end();
@@ -1184,28 +1189,28 @@ void PerIsolateData::RemoveUnhandledPromise(Local<Promise> promise) {
void PerIsolateData::AddUnhandledPromise(Local<Promise> promise,
Local<Message> message,
Local<Value> exception) {
+ if (ignore_unhandled_promises_) return;
DCHECK_EQ(promise->GetIsolate(), isolate_);
unhandled_promises_.emplace_back(v8::Global<v8::Promise>(isolate_, promise),
v8::Global<v8::Message>(isolate_, message),
v8::Global<v8::Value>(isolate_, exception));
}
-size_t PerIsolateData::GetUnhandledPromiseCount() {
- return unhandled_promises_.size();
-}
-
int PerIsolateData::HandleUnhandledPromiseRejections() {
+ // Avoid recursive calls to HandleUnhandledPromiseRejections.
+ if (ignore_unhandled_promises_) return 0;
+ ignore_unhandled_promises_ = true;
v8::HandleScope scope(isolate_);
// Ignore promises that get added during error reporting.
- size_t unhandled_promises_count = unhandled_promises_.size();
- for (size_t i = 0; i < unhandled_promises_count; i++) {
+ size_t i = 0;
+ for (; i < unhandled_promises_.size(); i++) {
const auto& tuple = unhandled_promises_[i];
Local<v8::Message> message = std::get<1>(tuple).Get(isolate_);
Local<v8::Value> value = std::get<2>(tuple).Get(isolate_);
Shell::ReportException(isolate_, message, value);
}
unhandled_promises_.clear();
- return static_cast<int>(unhandled_promises_count);
+ return static_cast<int>(i);
}
PerIsolateData::RealmScope::RealmScope(PerIsolateData* data) : data_(data) {
@@ -1503,6 +1508,41 @@ void Shell::RealmSharedSet(Local<String> property, Local<Value> value,
data->realm_shared_.Reset(isolate, value);
}
+void Shell::LogGetAndStop(const v8::FunctionCallbackInfo<v8::Value>& args) {
+ Isolate* isolate = args.GetIsolate();
+ i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
+ HandleScope handle_scope(isolate);
+
+ std::string file_name = i_isolate->logger()->file_name();
+ if (!i::Log::IsLoggingToTemporaryFile(file_name)) {
+ Throw(isolate, "Only capturing from temporary files is supported.");
+ return;
+ }
+ if (!i_isolate->logger()->is_logging()) {
+ Throw(isolate, "Logging not enabled.");
+ return;
+ }
+
+ std::string raw_log;
+ FILE* log_file = i_isolate->logger()->TearDownAndGetLogFile();
+ CHECK_NOT_NULL(log_file);
+
+ bool exists = false;
+ raw_log = i::ReadFile(log_file, &exists, true);
+ fclose(log_file);
+
+ if (!exists) {
+ Throw(isolate, "Unable to read log file.");
+ return;
+ }
+ Local<String> result =
+ String::NewFromUtf8(isolate, raw_log.c_str(), NewStringType::kNormal,
+ static_cast<int>(raw_log.size()))
+ .ToLocalChecked();
+
+ args.GetReturnValue().Set(result);
+}
+
// async_hooks.createHook() registers functions to be called for different
// lifetime events of each async operation.
void Shell::AsyncHooksCreateHook(
@@ -2071,6 +2111,11 @@ Local<String> Shell::Stringify(Isolate* isolate, Local<Value> value) {
Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate);
+ global_template->Set(Symbol::GetToStringTag(isolate),
+ String::NewFromUtf8Literal(isolate, "global"));
+ global_template->Set(isolate, "version",
+ FunctionTemplate::New(isolate, Version));
+
global_template->Set(isolate, "print", FunctionTemplate::New(isolate, Print));
global_template->Set(isolate, "printErr",
FunctionTemplate::New(isolate, PrintErr));
@@ -2089,8 +2134,79 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
if (!options.omit_quit) {
global_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit));
}
+ global_template->Set(isolate, "testRunner",
+ Shell::CreateTestRunnerTemplate(isolate));
+ global_template->Set(isolate, "Realm", Shell::CreateRealmTemplate(isolate));
+ global_template->Set(isolate, "performance",
+ Shell::CreatePerformanceTemplate(isolate));
+ global_template->Set(isolate, "Worker", Shell::CreateWorkerTemplate(isolate));
+ global_template->Set(isolate, "os", Shell::CreateOSTemplate(isolate));
+ global_template->Set(isolate, "d8", Shell::CreateD8Template(isolate));
+
+#ifdef V8_FUZZILLI
+ global_template->Set(
+ String::NewFromUtf8(isolate, "fuzzilli", NewStringType::kNormal)
+ .ToLocalChecked(),
+ FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum);
+#endif // V8_FUZZILLI
+
+ if (i::FLAG_expose_async_hooks) {
+ global_template->Set(isolate, "async_hooks",
+ Shell::CreateAsyncHookTemplate(isolate));
+ }
+
+ return global_template;
+}
+
+Local<ObjectTemplate> Shell::CreateOSTemplate(Isolate* isolate) {
+ Local<ObjectTemplate> os_template = ObjectTemplate::New(isolate);
+ AddOSMethods(isolate, os_template);
+ return os_template;
+}
+
+Local<FunctionTemplate> Shell::CreateWorkerTemplate(Isolate* isolate) {
+ Local<FunctionTemplate> worker_fun_template =
+ FunctionTemplate::New(isolate, WorkerNew);
+ Local<Signature> worker_signature =
+ Signature::New(isolate, worker_fun_template);
+ worker_fun_template->SetClassName(
+ String::NewFromUtf8Literal(isolate, "Worker"));
+ worker_fun_template->ReadOnlyPrototype();
+ worker_fun_template->PrototypeTemplate()->Set(
+ isolate, "terminate",
+ FunctionTemplate::New(isolate, WorkerTerminate, Local<Value>(),
+ worker_signature));
+ worker_fun_template->PrototypeTemplate()->Set(
+ isolate, "terminateAndWait",
+ FunctionTemplate::New(isolate, WorkerTerminateAndWait, Local<Value>(),
+ worker_signature));
+ worker_fun_template->PrototypeTemplate()->Set(
+ isolate, "postMessage",
+ FunctionTemplate::New(isolate, WorkerPostMessage, Local<Value>(),
+ worker_signature));
+ worker_fun_template->PrototypeTemplate()->Set(
+ isolate, "getMessage",
+ FunctionTemplate::New(isolate, WorkerGetMessage, Local<Value>(),
+ worker_signature));
+ worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1);
+ return worker_fun_template;
+}
+
+Local<ObjectTemplate> Shell::CreateAsyncHookTemplate(Isolate* isolate) {
+ Local<ObjectTemplate> async_hooks_templ = ObjectTemplate::New(isolate);
+ async_hooks_templ->Set(isolate, "createHook",
+ FunctionTemplate::New(isolate, AsyncHooksCreateHook));
+ async_hooks_templ->Set(
+ isolate, "executionAsyncId",
+ FunctionTemplate::New(isolate, AsyncHooksExecutionAsyncId));
+ async_hooks_templ->Set(
+ isolate, "triggerAsyncId",
+ FunctionTemplate::New(isolate, AsyncHooksTriggerAsyncId));
+ return async_hooks_templ;
+}
+
+Local<ObjectTemplate> Shell::CreateTestRunnerTemplate(Isolate* isolate) {
Local<ObjectTemplate> test_template = ObjectTemplate::New(isolate);
- global_template->Set(isolate, "testRunner", test_template);
test_template->Set(isolate, "notifyDone",
FunctionTemplate::New(isolate, NotifyDone));
test_template->Set(isolate, "waitUntilDone",
@@ -2099,13 +2215,20 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
// installed on the global object can be hidden with the --omit-quit flag
// (e.g. on asan bots).
test_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit));
+ return test_template;
+}
- global_template->Set(isolate, "version",
- FunctionTemplate::New(isolate, Version));
- global_template->Set(Symbol::GetToStringTag(isolate),
- String::NewFromUtf8Literal(isolate, "global"));
+Local<ObjectTemplate> Shell::CreatePerformanceTemplate(Isolate* isolate) {
+ Local<ObjectTemplate> performance_template = ObjectTemplate::New(isolate);
+ performance_template->Set(isolate, "now",
+ FunctionTemplate::New(isolate, PerformanceNow));
+ performance_template->Set(
+ isolate, "measureMemory",
+ FunctionTemplate::New(isolate, PerformanceMeasureMemory));
+ return performance_template;
+}
- // Bind the Realm object.
+Local<ObjectTemplate> Shell::CreateRealmTemplate(Isolate* isolate) {
Local<ObjectTemplate> realm_template = ObjectTemplate::New(isolate);
realm_template->Set(isolate, "current",
FunctionTemplate::New(isolate, RealmCurrent));
@@ -2130,68 +2253,19 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
FunctionTemplate::New(isolate, RealmEval));
realm_template->SetAccessor(String::NewFromUtf8Literal(isolate, "shared"),
RealmSharedGet, RealmSharedSet);
- global_template->Set(isolate, "Realm", realm_template);
-
- Local<ObjectTemplate> performance_template = ObjectTemplate::New(isolate);
- performance_template->Set(isolate, "now",
- FunctionTemplate::New(isolate, PerformanceNow));
- performance_template->Set(
- isolate, "measureMemory",
- FunctionTemplate::New(isolate, PerformanceMeasureMemory));
- global_template->Set(isolate, "performance", performance_template);
-
- Local<FunctionTemplate> worker_fun_template =
- FunctionTemplate::New(isolate, WorkerNew);
- Local<Signature> worker_signature =
- Signature::New(isolate, worker_fun_template);
- worker_fun_template->SetClassName(
- String::NewFromUtf8Literal(isolate, "Worker"));
- worker_fun_template->ReadOnlyPrototype();
- worker_fun_template->PrototypeTemplate()->Set(
- isolate, "terminate",
- FunctionTemplate::New(isolate, WorkerTerminate, Local<Value>(),
- worker_signature));
- worker_fun_template->PrototypeTemplate()->Set(
- isolate, "terminateAndWait",
- FunctionTemplate::New(isolate, WorkerTerminateAndWait, Local<Value>(),
- worker_signature));
- worker_fun_template->PrototypeTemplate()->Set(
- isolate, "postMessage",
- FunctionTemplate::New(isolate, WorkerPostMessage, Local<Value>(),
- worker_signature));
- worker_fun_template->PrototypeTemplate()->Set(
- isolate, "getMessage",
- FunctionTemplate::New(isolate, WorkerGetMessage, Local<Value>(),
- worker_signature));
- worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1);
- global_template->Set(isolate, "Worker", worker_fun_template);
-
- Local<ObjectTemplate> os_templ = ObjectTemplate::New(isolate);
- AddOSMethods(isolate, os_templ);
- global_template->Set(isolate, "os", os_templ);
+ return realm_template;
+}
-#ifdef V8_FUZZILLI
- global_template->Set(
- String::NewFromUtf8(isolate, "fuzzilli", NewStringType::kNormal)
- .ToLocalChecked(),
- FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum);
-#endif // V8_FUZZILLI
+Local<ObjectTemplate> Shell::CreateD8Template(Isolate* isolate) {
+ Local<ObjectTemplate> d8_template = ObjectTemplate::New(isolate);
+ {
+ Local<ObjectTemplate> log_template = ObjectTemplate::New(isolate);
+ log_template->Set(isolate, "getAndStop",
+ FunctionTemplate::New(isolate, LogGetAndStop));
- if (i::FLAG_expose_async_hooks) {
- Local<ObjectTemplate> async_hooks_templ = ObjectTemplate::New(isolate);
- async_hooks_templ->Set(
- isolate, "createHook",
- FunctionTemplate::New(isolate, AsyncHooksCreateHook));
- async_hooks_templ->Set(
- isolate, "executionAsyncId",
- FunctionTemplate::New(isolate, AsyncHooksExecutionAsyncId));
- async_hooks_templ->Set(
- isolate, "triggerAsyncId",
- FunctionTemplate::New(isolate, AsyncHooksTriggerAsyncId));
- global_template->Set(isolate, "async_hooks", async_hooks_templ);
+ d8_template->Set(isolate, "log", log_template);
}
-
- return global_template;
+ return d8_template;
}
static void PrintMessageCallback(Local<Message> message, Local<Value> error) {
@@ -2794,33 +2868,35 @@ bool ends_with(const char* input, const char* suffix) {
bool SourceGroup::Execute(Isolate* isolate) {
bool success = true;
#ifdef V8_FUZZILLI
- HandleScope handle_scope(isolate);
- Local<String> file_name =
- String::NewFromUtf8(isolate, "fuzzcode.js", NewStringType::kNormal)
- .ToLocalChecked();
+ if (fuzzilli_reprl) {
+ HandleScope handle_scope(isolate);
+ Local<String> file_name =
+ String::NewFromUtf8(isolate, "fuzzcode.js", NewStringType::kNormal)
+ .ToLocalChecked();
- size_t script_size;
- CHECK_EQ(read(REPRL_CRFD, &script_size, 8), 8);
- char* buffer = new char[script_size + 1];
- char* ptr = buffer;
- size_t remaining = script_size;
- while (remaining > 0) {
- ssize_t rv = read(REPRL_DRFD, ptr, remaining);
- CHECK_GE(rv, 0);
- remaining -= rv;
- ptr += rv;
- }
- buffer[script_size] = 0;
-
- Local<String> source =
- String::NewFromUtf8(isolate, buffer, NewStringType::kNormal)
- .ToLocalChecked();
- delete[] buffer;
- Shell::set_script_executed();
- if (!Shell::ExecuteString(isolate, source, file_name, Shell::kNoPrintResult,
- Shell::kReportExceptions,
- Shell::kNoProcessMessageQueue)) {
- return false;
+ size_t script_size;
+ CHECK_EQ(read(REPRL_CRFD, &script_size, 8), 8);
+ char* buffer = new char[script_size + 1];
+ char* ptr = buffer;
+ size_t remaining = script_size;
+ while (remaining > 0) {
+ ssize_t rv = read(REPRL_DRFD, ptr, remaining);
+ CHECK_GE(rv, 0);
+ remaining -= rv;
+ ptr += rv;
+ }
+ buffer[script_size] = 0;
+
+ Local<String> source =
+ String::NewFromUtf8(isolate, buffer, NewStringType::kNormal)
+ .ToLocalChecked();
+ delete[] buffer;
+ Shell::set_script_executed();
+ if (!Shell::ExecuteString(isolate, source, file_name, Shell::kNoPrintResult,
+ Shell::kReportExceptions,
+ Shell::kNoProcessMessageQueue)) {
+ return false;
+ }
}
#endif // V8_FUZZILLI
for (int i = begin_offset_; i < end_offset_; ++i) {
@@ -3233,6 +3309,7 @@ void Worker::PostMessageOut(const v8::FunctionCallbackInfo<v8::Value>& args) {
bool Shell::SetOptions(int argc, char* argv[]) {
bool logfile_per_isolate = false;
+ bool no_always_opt = false;
for (int i = 0; i < argc; i++) {
if (strcmp(argv[i], "--") == 0) {
argv[i] = nullptr;
@@ -3253,6 +3330,18 @@ bool Shell::SetOptions(int argc, char* argv[]) {
argv[i] = nullptr;
} else if (strcmp(argv[i], "--stress-snapshot") == 0) {
options.stress_snapshot = true;
+ // Incremental marking is incompatible with the stress_snapshot mode;
+ // specifically, serialization may clear bytecode arrays from shared
+ // function infos which the MarkCompactCollector (running concurrently)
+ // may still need. See also https://crbug.com/v8/10882.
+ //
+ // We thus force the implication
+ //
+ // --stress-snapshot ~~> --no-incremental-marking
+ //
+ // Note: This is not an issue in production because we don't clear SFI's
+ // there (that only happens in mksnapshot and in --stress-snapshot mode).
+ i::FLAG_incremental_marking = false;
argv[i] = nullptr;
} else if (strcmp(argv[i], "--nostress-snapshot") == 0 ||
strcmp(argv[i], "--no-stress-snapshot") == 0) {
@@ -3260,8 +3349,13 @@ bool Shell::SetOptions(int argc, char* argv[]) {
argv[i] = nullptr;
} else if (strcmp(argv[i], "--noalways-opt") == 0 ||
strcmp(argv[i], "--no-always-opt") == 0) {
- // No support for stressing if we can't use --always-opt.
- options.stress_opt = false;
+ no_always_opt = true;
+ } else if (strcmp(argv[i], "--fuzzing") == 0 ||
+ strcmp(argv[i], "--no-abort-on-contradictory-flags") == 0 ||
+ strcmp(argv[i], "--noabort-on-contradictory-flags") == 0) {
+ check_d8_flag_contradictions = false;
+ } else if (strcmp(argv[i], "--abort-on-contradictory-flags") == 0) {
+ check_d8_flag_contradictions = true;
} else if (strcmp(argv[i], "--logfile-per-isolate") == 0) {
logfile_per_isolate = true;
argv[i] = nullptr;
@@ -3402,6 +3496,10 @@ bool Shell::SetOptions(int argc, char* argv[]) {
}
}
+ if (options.stress_opt && no_always_opt && check_d8_flag_contradictions) {
+ FATAL("Flag --no-always-opt is incompatible with --stress-opt.");
+ }
+
const char* usage =
"Synopsis:\n"
" shell [options] [--shell] [<file>...]\n"
@@ -3410,6 +3508,7 @@ bool Shell::SetOptions(int argc, char* argv[]) {
" --shell run an interactive JavaScript shell\n"
" --module execute a file as a JavaScript module\n\n";
using HelpOptions = i::FlagList::HelpOptions;
+ i::FLAG_abort_on_contradictory_flags = true;
i::FlagList::SetFlagsFromCommandLine(&argc, argv, true,
HelpOptions(HelpOptions::kExit, usage));
options.mock_arraybuffer_allocator = i::FLAG_mock_arraybuffer_allocator;
@@ -3870,12 +3969,11 @@ class D8Testing {
"--max-inlined-bytecode-size=999999 "
"--max-inlined-bytecode-size-cumulative=999999 "
"--noalways-opt";
- static const char* kForcedOptimizations = "--always-opt";
- if (run == GetStressRuns() - 1) {
- V8::SetFlagsFromString(kForcedOptimizations);
- } else {
+ if (run == 0) {
V8::SetFlagsFromString(kLazyOptimizations);
+ } else if (run == GetStressRuns() - 1) {
+ i::FLAG_always_opt = true;
}
}
@@ -4117,7 +4215,7 @@ int Shell::Main(int argc, char* argv[]) {
options.stress_runs = D8Testing::GetStressRuns();
for (int i = 0; i < options.stress_runs && result == 0; i++) {
printf("============ Stress %d/%d ============\n", i + 1,
- options.stress_runs);
+ options.stress_runs.get());
D8Testing::PrepareStressRun(i);
bool last_run = i == options.stress_runs - 1;
result = RunMain(isolate, last_run);
@@ -4128,7 +4226,7 @@ int Shell::Main(int argc, char* argv[]) {
options.stress_runs = i::FLAG_stress_runs;
for (int i = 0; i < options.stress_runs && result == 0; i++) {
printf("============ Run %d/%d ============\n", i + 1,
- options.stress_runs);
+ options.stress_runs.get());
bool last_run = i == options.stress_runs - 1;
result = RunMain(isolate, last_run);
}
@@ -4155,14 +4253,16 @@ int Shell::Main(int argc, char* argv[]) {
DCHECK(options.compile_options == v8::ScriptCompiler::kEagerCompile ||
options.compile_options ==
v8::ScriptCompiler::kNoCompileOptions);
- options.compile_options = v8::ScriptCompiler::kConsumeCodeCache;
- options.code_cache_options =
- ShellOptions::CodeCacheOptions::kNoProduceCache;
+ options.compile_options.Overwrite(
+ v8::ScriptCompiler::kConsumeCodeCache);
+ options.code_cache_options.Overwrite(
+ ShellOptions::CodeCacheOptions::kNoProduceCache);
printf("============ Run: Consume code cache ============\n");
// Second run to consume the cache in current isolate
result = RunMain(isolate, true);
- options.compile_options = v8::ScriptCompiler::kNoCompileOptions;
+ options.compile_options.Overwrite(
+ v8::ScriptCompiler::kNoCompileOptions);
} else {
bool last_run = true;
result = RunMain(isolate, last_run);
@@ -4219,6 +4319,10 @@ int Shell::Main(int argc, char* argv[]) {
<< bitmap.size() << std::endl;
iteration_counter++;
}
+ // In REPRL mode, stdout and stderr can be regular files, so they need
+ // to be flushed after every execution
+ fflush(stdout);
+ fflush(stderr);
CHECK_EQ(write(REPRL_CWFD, &status, 4), 4);
sanitizer_cov_reset_edgeguards();
if (options.fuzzilli_enable_builtins_coverage) {
diff --git a/deps/v8/src/d8/d8.h b/deps/v8/src/d8/d8.h
index 6b2c08fd6e..11ec47d815 100644
--- a/deps/v8/src/d8/d8.h
+++ b/deps/v8/src/d8/d8.h
@@ -260,7 +260,6 @@ class PerIsolateData {
void AddUnhandledPromise(Local<Promise> promise, Local<Message> message,
Local<Value> exception);
int HandleUnhandledPromiseRejections();
- size_t GetUnhandledPromiseCount();
private:
friend class Shell;
@@ -273,6 +272,7 @@ class PerIsolateData {
Global<Value> realm_shared_;
std::queue<Global<Function>> set_timeout_callbacks_;
std::queue<Global<Context>> set_timeout_contexts_;
+ bool ignore_unhandled_promises_;
std::vector<std::tuple<Global<Promise>, Global<Message>, Global<Value>>>
unhandled_promises_;
AsyncHooks* async_hooks_wrapper_;
@@ -282,6 +282,8 @@ class PerIsolateData {
int RealmFind(Local<Context> context);
};
+extern bool check_d8_flag_contradictions;
+
class ShellOptions {
public:
enum CodeCacheOptions {
@@ -292,47 +294,97 @@ class ShellOptions {
~ShellOptions() { delete[] isolate_sources; }
- bool fuzzilli_coverage_statistics = false;
- bool fuzzilli_enable_builtins_coverage = true;
- bool send_idle_notification = false;
- bool invoke_weak_callbacks = false;
- bool omit_quit = false;
- bool wait_for_background_tasks = true;
- bool stress_opt = false;
- int stress_runs = 1;
- bool stress_snapshot = false;
- bool interactive_shell = false;
+ // In analogy to Flag::CheckFlagChange() in src/flags/flag.cc, only allow
+ // repeated flags for identical boolean values. We allow exceptions for flags
+ // with enum-like arguments since their conflicts can also be specified
+ // completely.
+ template <class T,
+ bool kAllowIdenticalAssignment = std::is_same<T, bool>::value>
+ class DisallowReassignment {
+ public:
+ DisallowReassignment(const char* name, T value)
+ : name_(name), value_(value) {}
+
+ operator T() const { return value_; } // NOLINT
+ T get() const { return value_; }
+ DisallowReassignment& operator=(T value) {
+ if (check_d8_flag_contradictions) {
+ if (kAllowIdenticalAssignment) {
+ if (specified_ && value_ != value) {
+ FATAL("Contradictory values for d8 flag --%s", name_);
+ }
+ } else {
+ if (specified_) {
+ FATAL("Repeated specification of d8 flag --%s", name_);
+ }
+ }
+ }
+ value_ = value;
+ specified_ = true;
+ return *this;
+ }
+ void Overwrite(T value) { value_ = value; }
+
+ private:
+ const char* name_;
+ T value_;
+ bool specified_ = false;
+ };
+
+ DisallowReassignment<bool> fuzzilli_coverage_statistics = {
+ "fuzzilli-coverage-statistics", false};
+ DisallowReassignment<bool> fuzzilli_enable_builtins_coverage = {
+ "fuzzilli-enable-builtins-coverage", true};
+ DisallowReassignment<bool> send_idle_notification = {"send-idle-notification",
+ false};
+ DisallowReassignment<bool> invoke_weak_callbacks = {"invoke-weak-callbacks",
+ false};
+ DisallowReassignment<bool> omit_quit = {"omit-quit", false};
+ DisallowReassignment<bool> wait_for_background_tasks = {
+ "wait-for-background-tasks", true};
+ DisallowReassignment<bool> stress_opt = {"stress-opt", false};
+ DisallowReassignment<int> stress_runs = {"stress-runs", 1};
+ DisallowReassignment<bool> stress_snapshot = {"stress-snapshot", false};
+ DisallowReassignment<bool> interactive_shell = {"shell", false};
bool test_shell = false;
- bool expected_to_throw = false;
- bool ignore_unhandled_promises = false;
- bool mock_arraybuffer_allocator = false;
- size_t mock_arraybuffer_allocator_limit = 0;
- bool multi_mapped_mock_allocator = false;
- bool enable_inspector = false;
+ DisallowReassignment<bool> expected_to_throw = {"throws", false};
+ DisallowReassignment<bool> ignore_unhandled_promises = {
+ "ignore-unhandled-promises", false};
+ DisallowReassignment<bool> mock_arraybuffer_allocator = {
+ "mock-arraybuffer-allocator", false};
+ DisallowReassignment<size_t> mock_arraybuffer_allocator_limit = {
+ "mock-arraybuffer-allocator-limit", 0};
+ DisallowReassignment<bool> multi_mapped_mock_allocator = {
+ "multi-mapped-mock-allocator", false};
+ DisallowReassignment<bool> enable_inspector = {"enable-inspector", false};
int num_isolates = 1;
- v8::ScriptCompiler::CompileOptions compile_options =
- v8::ScriptCompiler::kNoCompileOptions;
- CodeCacheOptions code_cache_options = CodeCacheOptions::kNoProduceCache;
- bool streaming_compile = false;
- SourceGroup* isolate_sources = nullptr;
- const char* icu_data_file = nullptr;
- const char* icu_locale = nullptr;
- const char* snapshot_blob = nullptr;
- bool trace_enabled = false;
- const char* trace_path = nullptr;
- const char* trace_config = nullptr;
- const char* lcov_file = nullptr;
- bool disable_in_process_stack_traces = false;
- int read_from_tcp_port = -1;
- bool enable_os_system = false;
- bool quiet_load = false;
- int thread_pool_size = 0;
- bool stress_delay_tasks = false;
+ DisallowReassignment<v8::ScriptCompiler::CompileOptions, true>
+ compile_options = {"cache", v8::ScriptCompiler::kNoCompileOptions};
+ DisallowReassignment<CodeCacheOptions, true> code_cache_options = {
+ "cache", CodeCacheOptions::kNoProduceCache};
+ DisallowReassignment<bool> streaming_compile = {"streaming-compile", false};
+ DisallowReassignment<SourceGroup*> isolate_sources = {"isolate-sources",
+ nullptr};
+ DisallowReassignment<const char*> icu_data_file = {"icu-data-file", nullptr};
+ DisallowReassignment<const char*> icu_locale = {"icu-locale", nullptr};
+ DisallowReassignment<const char*> snapshot_blob = {"snapshot_blob", nullptr};
+ DisallowReassignment<bool> trace_enabled = {"trace-enabled", false};
+ DisallowReassignment<const char*> trace_path = {"trace-path", nullptr};
+ DisallowReassignment<const char*> trace_config = {"trace-config", nullptr};
+ DisallowReassignment<const char*> lcov_file = {"lcov", nullptr};
+ DisallowReassignment<bool> disable_in_process_stack_traces = {
+ "disable-in-process-stack-traces", false};
+ DisallowReassignment<int> read_from_tcp_port = {"read-from-tcp-port", -1};
+ DisallowReassignment<bool> enable_os_system = {"enable-os-system", false};
+ DisallowReassignment<bool> quiet_load = {"quiet-load", false};
+ DisallowReassignment<int> thread_pool_size = {"thread-pool-size", 0};
+ DisallowReassignment<bool> stress_delay_tasks = {"stress-delay-tasks", false};
std::vector<const char*> arguments;
- bool include_arguments = true;
- bool cpu_profiler = false;
- bool cpu_profiler_print = false;
- bool fuzzy_module_file_extensions = true;
+ DisallowReassignment<bool> include_arguments = {"arguments", true};
+ DisallowReassignment<bool> cpu_profiler = {"cpu-profiler", false};
+ DisallowReassignment<bool> cpu_profiler_print = {"cpu-profiler-print", false};
+ DisallowReassignment<bool> fuzzy_module_file_extensions = {
+ "fuzzy-module-file-extensions", true};
};
class Shell : public i::AllStatic {
@@ -401,6 +453,8 @@ class Shell : public i::AllStatic {
static void RealmSharedSet(Local<String> property, Local<Value> value,
const PropertyCallbackInfo<void>& info);
+ static void LogGetAndStop(const v8::FunctionCallbackInfo<v8::Value>& args);
+
static void AsyncHooksCreateHook(
const v8::FunctionCallbackInfo<v8::Value>& args);
static void AsyncHooksExecutionAsyncId(
@@ -539,7 +593,16 @@ class Shell : public i::AllStatic {
static Local<String> Stringify(Isolate* isolate, Local<Value> value);
static void RunShell(Isolate* isolate);
static bool SetOptions(int argc, char* argv[]);
+
static Local<ObjectTemplate> CreateGlobalTemplate(Isolate* isolate);
+ static Local<ObjectTemplate> CreateOSTemplate(Isolate* isolate);
+ static Local<FunctionTemplate> CreateWorkerTemplate(Isolate* isolate);
+ static Local<ObjectTemplate> CreateAsyncHookTemplate(Isolate* isolate);
+ static Local<ObjectTemplate> CreateTestRunnerTemplate(Isolate* isolate);
+ static Local<ObjectTemplate> CreatePerformanceTemplate(Isolate* isolate);
+ static Local<ObjectTemplate> CreateRealmTemplate(Isolate* isolate);
+ static Local<ObjectTemplate> CreateD8Template(Isolate* isolate);
+
static MaybeLocal<Context> CreateRealm(
const v8::FunctionCallbackInfo<v8::Value>& args, int index,
v8::MaybeLocal<Value> global_object);
diff --git a/deps/v8/src/debug/debug-evaluate.cc b/deps/v8/src/debug/debug-evaluate.cc
index c0ce638e64..c7d0a890c4 100644
--- a/deps/v8/src/debug/debug-evaluate.cc
+++ b/deps/v8/src/debug/debug-evaluate.cc
@@ -261,7 +261,7 @@ bool IntrinsicHasNoSideEffect(Runtime::FunctionId id) {
V(ToLength) \
V(ToNumber) \
V(ToObject) \
- V(ToStringRT) \
+ V(ToString) \
/* Type checks */ \
V(IsArray) \
V(IsFunction) \
diff --git a/deps/v8/src/debug/debug-interface.h b/deps/v8/src/debug/debug-interface.h
index 077f96b1ab..9234fe35ac 100644
--- a/deps/v8/src/debug/debug-interface.h
+++ b/deps/v8/src/debug/debug-interface.h
@@ -10,6 +10,7 @@
#include "include/v8-inspector.h"
#include "include/v8-util.h"
#include "include/v8.h"
+#include "src/base/platform/time.h"
#include "src/common/globals.h"
#include "src/debug/interface-types.h"
#include "src/utils/vector.h"
@@ -250,6 +251,7 @@ Local<Function> GetBuiltin(Isolate* isolate, Builtin builtin);
V8_EXPORT_PRIVATE void SetConsoleDelegate(Isolate* isolate,
ConsoleDelegate* delegate);
+V8_DEPRECATED("See http://crbug.com/v8/10566.")
int GetStackFrameId(v8::Local<v8::StackFrame> frame);
v8::Local<v8::StackTrace> GetDetailedStackTrace(Isolate* isolate,
@@ -504,6 +506,11 @@ enum class NativeAccessorType {
int64_t GetNextRandomInt64(v8::Isolate* isolate);
+using RuntimeCallCounterCallback =
+ std::function<void(const char* name, int64_t count, base::TimeDelta time)>;
+void EnumerateRuntimeCallCounters(v8::Isolate* isolate,
+ RuntimeCallCounterCallback callback);
+
enum class EvaluateGlobalMode {
kDefault,
kDisableBreaks,
diff --git a/deps/v8/src/debug/debug.cc b/deps/v8/src/debug/debug.cc
index 15085b9577..d86a7ff5b8 100644
--- a/deps/v8/src/debug/debug.cc
+++ b/deps/v8/src/debug/debug.cc
@@ -372,6 +372,18 @@ char* Debug::RestoreDebug(char* storage) {
ClearOneShot();
if (thread_local_.last_step_action_ != StepNone) {
+ int current_frame_count = CurrentFrameCount();
+ int target_frame_count = thread_local_.target_frame_count_;
+ DCHECK(current_frame_count >= target_frame_count);
+ StackTraceFrameIterator frames_it(isolate_);
+ while (current_frame_count > target_frame_count) {
+ current_frame_count -= frames_it.FrameFunctionCount();
+ frames_it.Advance();
+ }
+ DCHECK(current_frame_count == target_frame_count);
+ // Set frame to what it was at Step break
+ thread_local_.break_frame_id_ = frames_it.frame()->id();
+
// Reset the previous step action for this thread.
PrepareStep(thread_local_.last_step_action_);
}
@@ -2040,15 +2052,8 @@ int Debug::CurrentFrameCount() {
while (!it.done() && it.frame()->id() != break_frame_id()) it.Advance();
}
int counter = 0;
- while (!it.done()) {
- if (it.frame()->is_optimized()) {
- std::vector<SharedFunctionInfo> infos;
- OptimizedFrame::cast(it.frame())->GetFunctions(&infos);
- counter += infos.size();
- } else {
- counter++;
- }
- it.Advance();
+ for (; !it.done(); it.Advance()) {
+ counter += it.FrameFunctionCount();
}
return counter;
}
diff --git a/deps/v8/src/debug/liveedit.cc b/deps/v8/src/debug/liveedit.cc
index 1dc0a803c1..e62fbab04a 100644
--- a/deps/v8/src/debug/liveedit.cc
+++ b/deps/v8/src/debug/liveedit.cc
@@ -1025,7 +1025,7 @@ void TranslateSourcePositionTable(Isolate* isolate, Handle<BytecodeArray> code,
Handle<ByteArray> new_source_position_table(
builder.ToSourcePositionTable(isolate));
- code->set_source_position_table(*new_source_position_table);
+ code->set_synchronized_source_position_table(*new_source_position_table);
LOG_CODE_EVENT(isolate,
CodeLinePosInfoRecordEvent(code->GetFirstBytecodeAddress(),
*new_source_position_table));
diff --git a/deps/v8/src/debug/ppc/OWNERS b/deps/v8/src/debug/ppc/OWNERS
index 6d1a8fc472..6edd45a6ef 100644
--- a/deps/v8/src/debug/ppc/OWNERS
+++ b/deps/v8/src/debug/ppc/OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com \ No newline at end of file
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc b/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
index 05dae1e21f..21a75d024d 100644
--- a/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
+++ b/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
@@ -308,14 +308,9 @@ Float32 RegisterValues::GetFloatRegister(unsigned n) const {
}
void FrameDescription::SetCallerPc(unsigned offset, intptr_t value) {
- // TODO(v8:10026): check that the pointer is still in the list of allowed
- // builtins.
Address new_context =
static_cast<Address>(GetTop()) + offset + kPCOnStackSize;
- uint64_t old_context = GetTop() + GetFrameSize();
- PointerAuthentication::ReplaceContext(reinterpret_cast<Address*>(&value),
- old_context, new_context);
-
+ value = PointerAuthentication::SignAndCheckPC(value, new_context);
SetFrameSlot(offset, value);
}
@@ -329,9 +324,11 @@ void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) {
}
void FrameDescription::SetPc(intptr_t pc) {
- // TODO(v8:10026): we should only accept a specific list of allowed builtins
- // here.
- pc_ = PointerAuthentication::SignPCWithSP(pc, GetTop());
+ if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
+ CHECK(
+ Deoptimizer::IsValidReturnAddress(PointerAuthentication::StripPAC(pc)));
+ }
+ pc_ = pc;
}
#undef __
diff --git a/deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc b/deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc
new file mode 100644
index 0000000000..ae00947a10
--- /dev/null
+++ b/deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc
@@ -0,0 +1,47 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/builtins/builtins.h"
+#include "src/deoptimizer/deoptimizer.h"
+
+extern "C" {
+void Builtins_InterpreterEnterBytecodeAdvance();
+void Builtins_InterpreterEnterBytecodeDispatch();
+void Builtins_ContinueToCodeStubBuiltinWithResult();
+void Builtins_ContinueToCodeStubBuiltin();
+void Builtins_ContinueToJavaScriptBuiltinWithResult();
+void Builtins_ContinueToJavaScriptBuiltin();
+void arguments_adaptor_deopt_addr();
+void construct_stub_create_deopt_addr();
+void construct_stub_invoke_deopt_addr();
+typedef void (*function_ptr)();
+}
+
+namespace v8 {
+namespace internal {
+
+// List of allowed builtin addresses that we can return to in the deoptimizer.
+constexpr function_ptr builtins[] = {
+ &Builtins_InterpreterEnterBytecodeAdvance,
+ &Builtins_InterpreterEnterBytecodeDispatch,
+ &Builtins_ContinueToCodeStubBuiltinWithResult,
+ &Builtins_ContinueToCodeStubBuiltin,
+ &Builtins_ContinueToJavaScriptBuiltinWithResult,
+ &Builtins_ContinueToJavaScriptBuiltin,
+ &construct_stub_create_deopt_addr,
+ &construct_stub_invoke_deopt_addr,
+ &arguments_adaptor_deopt_addr,
+};
+
+bool Deoptimizer::IsValidReturnAddress(Address address) {
+ for (function_ptr builtin : builtins) {
+ if (address == FUNCTION_ADDR(builtin)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc b/deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc
new file mode 100644
index 0000000000..60ff43701c
--- /dev/null
+++ b/deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc
@@ -0,0 +1,14 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/deoptimizer/deoptimizer.h"
+
+namespace v8 {
+namespace internal {
+
+// Dummy implementation when building mksnapshot.
+bool Deoptimizer::IsValidReturnAddress(Address address) { return false; }
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/deoptimizer/deoptimizer.cc b/deps/v8/src/deoptimizer/deoptimizer.cc
index 9f7adfa729..c2b4d402ee 100644
--- a/deps/v8/src/deoptimizer/deoptimizer.cc
+++ b/deps/v8/src/deoptimizer/deoptimizer.cc
@@ -12,6 +12,7 @@
#include "src/codegen/callable.h"
#include "src/codegen/macro-assembler.h"
#include "src/codegen/register-configuration.h"
+#include "src/common/assert-scope.h"
#include "src/diagnostics/disasm.h"
#include "src/execution/frames-inl.h"
#include "src/execution/pointer-authentication.h"
@@ -26,7 +27,7 @@
#include "src/objects/heap-number-inl.h"
#include "src/objects/smi.h"
#include "src/tracing/trace-event.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions.h"
// Has to be the last include (doesn't have include guards)
#include "src/objects/object-macros.h"
@@ -62,7 +63,16 @@ class FrameWriter {
}
}
- void PushCallerPc(intptr_t pc) {
+ // There is no check against the allowed addresses for bottommost frames, as
+ // the caller's pc could be anything. The caller's pc pushed here should never
+ // be re-signed.
+ void PushBottommostCallerPc(intptr_t pc) {
+ top_offset_ -= kPCOnStackSize;
+ frame_->SetFrameSlot(top_offset_, pc);
+ DebugPrintOutputPc(pc, "bottommost caller's pc\n");
+ }
+
+ void PushApprovedCallerPc(intptr_t pc) {
top_offset_ -= kPCOnStackSize;
frame_->SetCallerPc(top_offset_, pc);
DebugPrintOutputPc(pc, "caller's pc\n");
@@ -111,6 +121,8 @@ class FrameWriter {
unsigned top_offset() const { return top_offset_; }
+ FrameDescription* frame() { return frame_; }
+
private:
void PushValue(intptr_t value) {
CHECK_GE(top_offset_, 0);
@@ -163,19 +175,19 @@ class FrameWriter {
Deoptimizer* deoptimizer_;
FrameDescription* frame_;
- CodeTracer::Scope* trace_scope_;
+ CodeTracer::Scope* const trace_scope_;
unsigned top_offset_;
};
DeoptimizerData::DeoptimizerData(Heap* heap) : heap_(heap), current_(nullptr) {
Code* start = &deopt_entry_code_[0];
Code* end = &deopt_entry_code_[DeoptimizerData::kLastDeoptimizeKind + 1];
- heap_->RegisterStrongRoots(FullObjectSlot(start), FullObjectSlot(end));
+ strong_roots_entry_ =
+ heap_->RegisterStrongRoots(FullObjectSlot(start), FullObjectSlot(end));
}
DeoptimizerData::~DeoptimizerData() {
- Code* start = &deopt_entry_code_[0];
- heap_->UnregisterStrongRoots(FullObjectSlot(start));
+ heap_->UnregisterStrongRoots(strong_roots_entry_);
}
Code DeoptimizerData::deopt_entry_code(DeoptimizeKind kind) {
@@ -304,6 +316,7 @@ class ActivationsFinder : public ThreadVisitor {
// Move marked code from the optimized code list to the deoptimized code list,
// and replace pc on the stack for codes marked for deoptimization.
+// static
void Deoptimizer::DeoptimizeMarkedCodeForContext(NativeContext native_context) {
DisallowHeapAllocation no_allocation;
@@ -321,12 +334,7 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(NativeContext native_context) {
Code code = it.frame()->LookupCode();
JSFunction function =
static_cast<OptimizedFrame*>(it.frame())->function();
- if (FLAG_trace_deopt) {
- CodeTracer::Scope scope(isolate->GetCodeTracer());
- PrintF(scope.file(), "[deoptimizer found activation of function: ");
- function.PrintName(scope.file());
- PrintF(scope.file(), " / %" V8PRIxPTR "]\n", function.ptr());
- }
+ TraceFoundActivation(isolate, function);
SafepointEntry safepoint = code.GetSafepointEntry(it.frame()->pc());
// Turbofan deopt is checked when we are patching addresses on stack.
@@ -401,10 +409,7 @@ void Deoptimizer::DeoptimizeAll(Isolate* isolate) {
RuntimeCallCounterId::kDeoptimizeCode);
TimerEventScope<TimerEventDeoptimizeCode> timer(isolate);
TRACE_EVENT0("v8", "V8.DeoptimizeCode");
- if (FLAG_trace_deopt) {
- CodeTracer::Scope scope(isolate->GetCodeTracer());
- PrintF(scope.file(), "[deoptimize all code in all contexts]\n");
- }
+ TraceDeoptAll(isolate);
isolate->AbortConcurrentOptimization(BlockingBehavior::kBlock);
DisallowHeapAllocation no_allocation;
// For all contexts, mark all code, then deoptimize.
@@ -423,10 +428,7 @@ void Deoptimizer::DeoptimizeMarkedCode(Isolate* isolate) {
RuntimeCallCounterId::kDeoptimizeCode);
TimerEventScope<TimerEventDeoptimizeCode> timer(isolate);
TRACE_EVENT0("v8", "V8.DeoptimizeCode");
- if (FLAG_trace_deopt) {
- CodeTracer::Scope scope(isolate->GetCodeTracer());
- PrintF(scope.file(), "[deoptimize marked code in all contexts]\n");
- }
+ TraceDeoptMarked(isolate);
DisallowHeapAllocation no_allocation;
// For all contexts, deoptimize code already marked.
Object context = isolate->heap()->native_contexts_list();
@@ -530,8 +532,11 @@ Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction function,
caller_pc_(0),
caller_constant_pool_(0),
input_frame_context_(0),
+ actual_argument_count_(0),
stack_fp_(0),
- trace_scope_(nullptr) {
+ trace_scope_(FLAG_trace_deopt
+ ? new CodeTracer::Scope(isolate->GetCodeTracer())
+ : nullptr) {
if (isolate->deoptimizer_lazy_throw()) {
isolate->set_deoptimizer_lazy_throw(false);
deoptimizing_throw_ = true;
@@ -542,12 +547,10 @@ Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction function,
DCHECK(!compiled_code_.is_null());
DCHECK(function.IsJSFunction());
- trace_scope_ = FLAG_trace_deopt
- ? new CodeTracer::Scope(isolate->GetCodeTracer())
- : nullptr;
#ifdef DEBUG
DCHECK(AllowHeapAllocation::IsAllowed());
- disallow_heap_allocation_ = new DisallowHeapAllocation();
+ DCHECK(AllowGarbageCollection::IsAllowed());
+ disallow_garbage_collection_ = new DisallowGarbageCollection();
#endif // DEBUG
CHECK(CodeKindCanDeoptimize(compiled_code_.kind()));
if (!compiled_code_.deopt_already_counted() &&
@@ -604,14 +607,6 @@ Code Deoptimizer::FindOptimizedCode() {
: isolate_->FindCodeObject(from_);
}
-void Deoptimizer::PrintFunctionName() {
- if (function_.IsHeapObject() && function_.IsJSFunction()) {
- function_.ShortPrint(trace_scope_->file());
- } else {
- PrintF(trace_scope_->file(), "%s", CodeKindToString(compiled_code_.kind()));
- }
-}
-
Handle<JSFunction> Deoptimizer::function() const {
return Handle<JSFunction>(function_, isolate());
}
@@ -627,8 +622,7 @@ bool Deoptimizer::should_reuse_code() const {
Deoptimizer::~Deoptimizer() {
DCHECK(input_ == nullptr && output_ == nullptr);
- DCHECK_NULL(disallow_heap_allocation_);
- delete trace_scope_;
+ DCHECK_NULL(disallow_garbage_collection_);
}
void Deoptimizer::DeleteFrameDescriptions() {
@@ -640,10 +634,10 @@ void Deoptimizer::DeleteFrameDescriptions() {
input_ = nullptr;
output_ = nullptr;
#ifdef DEBUG
- DCHECK(!AllowHeapAllocation::IsAllowed());
- DCHECK_NOT_NULL(disallow_heap_allocation_);
- delete disallow_heap_allocation_;
- disallow_heap_allocation_ = nullptr;
+ DCHECK(!AllowGarbageCollection::IsAllowed());
+ DCHECK_NOT_NULL(disallow_garbage_collection_);
+ delete disallow_garbage_collection_;
+ disallow_garbage_collection_ = nullptr;
#endif // DEBUG
}
@@ -726,6 +720,106 @@ int LookupCatchHandler(TranslatedFrame* translated_frame, int* data_out) {
} // namespace
+void Deoptimizer::TraceDeoptBegin(int optimization_id, int node_id) {
+ DCHECK(tracing_enabled());
+ FILE* file = trace_scope()->file();
+ Deoptimizer::DeoptInfo info =
+ Deoptimizer::GetDeoptInfo(compiled_code_, from_);
+ PrintF(file, "[bailout (kind: %s, reason: %s): begin. deoptimizing ",
+ MessageFor(deopt_kind_, should_reuse_code()),
+ DeoptimizeReasonToString(info.deopt_reason));
+ if (function_.IsJSFunction()) {
+ function_.ShortPrint(file);
+ } else {
+ PrintF(file, "%s", CodeKindToString(compiled_code_.kind()));
+ }
+ PrintF(file,
+ ", opt id %d, node id %d, bailout id %d, FP to SP delta %d, "
+ "caller SP " V8PRIxPTR_FMT ", pc " V8PRIxPTR_FMT "]\n",
+ optimization_id, node_id, bailout_id_, fp_to_sp_delta_,
+ caller_frame_top_, PointerAuthentication::StripPAC(from_));
+ if (verbose_tracing_enabled() && deopt_kind_ != DeoptimizeKind::kLazy) {
+ PrintF(file, " ;;; deoptimize at ");
+ OFStream outstr(file);
+ info.position.Print(outstr, compiled_code_);
+ PrintF(file, "\n");
+ }
+}
+
+void Deoptimizer::TraceDeoptEnd(double deopt_duration) {
+ DCHECK(verbose_tracing_enabled());
+ PrintF(trace_scope()->file(), "[bailout end. took %0.3f ms]\n",
+ deopt_duration);
+}
+
+// static
+void Deoptimizer::TraceMarkForDeoptimization(Code code, const char* reason) {
+ if (!FLAG_trace_deopt_verbose) return;
+
+ DisallowHeapAllocation no_gc;
+ Isolate* isolate = code.GetIsolate();
+ Object maybe_data = code.deoptimization_data();
+ if (maybe_data == ReadOnlyRoots(isolate).empty_fixed_array()) return;
+
+ DeoptimizationData deopt_data = DeoptimizationData::cast(maybe_data);
+ CodeTracer::Scope scope(isolate->GetCodeTracer());
+ PrintF(scope.file(), "[marking dependent code " V8PRIxPTR_FMT " ",
+ code.ptr());
+ deopt_data.SharedFunctionInfo().ShortPrint(scope.file());
+ PrintF(" (opt id %d) for deoptimization, reason: %s]\n",
+ deopt_data.OptimizationId().value(), reason);
+ {
+ AllowHeapAllocation yes_gc;
+ HandleScope scope(isolate);
+ PROFILE(
+ isolate,
+ CodeDependencyChangeEvent(
+ handle(code, isolate),
+ handle(SharedFunctionInfo::cast(deopt_data.SharedFunctionInfo()),
+ isolate),
+ reason));
+ }
+}
+
+// static
+void Deoptimizer::TraceEvictFromOptimizedCodeCache(SharedFunctionInfo sfi,
+ const char* reason) {
+ if (!FLAG_trace_deopt_verbose) return;
+
+ DisallowHeapAllocation no_gc;
+ CodeTracer::Scope scope(sfi.GetIsolate()->GetCodeTracer());
+ PrintF(scope.file(),
+ "[evicting optimized code marked for deoptimization (%s) for ",
+ reason);
+ sfi.ShortPrint(scope.file());
+ PrintF(scope.file(), "]\n");
+}
+
+#ifdef DEBUG
+// static
+void Deoptimizer::TraceFoundActivation(Isolate* isolate, JSFunction function) {
+ if (!FLAG_trace_deopt_verbose) return;
+ CodeTracer::Scope scope(isolate->GetCodeTracer());
+ PrintF(scope.file(), "[deoptimizer found activation of function: ");
+ function.PrintName(scope.file());
+ PrintF(scope.file(), " / %" V8PRIxPTR "]\n", function.ptr());
+}
+#endif // DEBUG
+
+// static
+void Deoptimizer::TraceDeoptAll(Isolate* isolate) {
+ if (!FLAG_trace_deopt_verbose) return;
+ CodeTracer::Scope scope(isolate->GetCodeTracer());
+ PrintF(scope.file(), "[deoptimize all code in all contexts]\n");
+}
+
+// static
+void Deoptimizer::TraceDeoptMarked(Isolate* isolate) {
+ if (!FLAG_trace_deopt_verbose) return;
+ CodeTracer::Scope scope(isolate->GetCodeTracer());
+ PrintF(scope.file(), "[deoptimize marked code in all contexts]\n");
+}
+
// We rely on this function not causing a GC. It is called from generated code
// without having a real stack frame in place.
void Deoptimizer::DoComputeOutputFrames() {
@@ -755,15 +849,10 @@ void Deoptimizer::DoComputeOutputFrames() {
caller_fp_ = Memory<intptr_t>(fp_address);
caller_pc_ =
Memory<intptr_t>(fp_address + CommonFrameConstants::kCallerPCOffset);
- // Sign caller_pc_ with caller_frame_top_ to be consistent with everything
- // else here.
- uint64_t sp = stack_fp_ + StandardFrameConstants::kCallerSPOffset;
- // TODO(v8:10026): avoid replacing a signed pointer.
- PointerAuthentication::ReplaceContext(
- reinterpret_cast<Address*>(&caller_pc_), sp, caller_frame_top_);
-
input_frame_context_ = Memory<intptr_t>(
fp_address + CommonFrameConstants::kContextOrFrameTypeOffset);
+ actual_argument_count_ = static_cast<int>(
+ Memory<intptr_t>(fp_address + StandardFrameConstants::kArgCOffset));
if (FLAG_enable_embedded_constant_pool) {
caller_constant_pool_ = Memory<intptr_t>(
@@ -775,34 +864,25 @@ void Deoptimizer::DoComputeOutputFrames() {
CHECK_GT(static_cast<uintptr_t>(caller_frame_top_),
stack_guard->real_jslimit());
- if (trace_scope_ != nullptr) {
- timer.Start();
- PrintF(trace_scope_->file(), "[bailout (kind: %s): begin ",
- MessageFor(deopt_kind_, should_reuse_code()));
- PrintFunctionName();
- PrintF(trace_scope_->file(),
- " (opt #%d) @%d, FP to SP delta: %d, caller sp: " V8PRIxPTR_FMT
- "]\n",
- input_data.OptimizationId().value(), bailout_id_, fp_to_sp_delta_,
- caller_frame_top_);
- if (deopt_kind_ != DeoptimizeKind::kLazy) {
- compiled_code_.PrintDeoptLocation(
- trace_scope_->file(), " ;;; deoptimize at ", from_);
- }
- }
-
BailoutId node_id = input_data.BytecodeOffset(bailout_id_);
ByteArray translations = input_data.TranslationByteArray();
unsigned translation_index = input_data.TranslationIndex(bailout_id_).value();
+ if (tracing_enabled()) {
+ timer.Start();
+ TraceDeoptBegin(input_data.OptimizationId().value(), node_id.ToInt());
+ }
+
+ FILE* trace_file =
+ verbose_tracing_enabled() ? trace_scope()->file() : nullptr;
TranslationIterator state_iterator(translations, translation_index);
translated_state_.Init(
- isolate_, input_->GetFramePointerAddress(), &state_iterator,
- input_data.LiteralArray(), input_->GetRegisterValues(),
- trace_scope_ == nullptr ? nullptr : trace_scope_->file(),
+ isolate_, input_->GetFramePointerAddress(), stack_fp_, &state_iterator,
+ input_data.LiteralArray(), input_->GetRegisterValues(), trace_file,
function_.IsHeapObject()
? function_.shared().internal_formal_parameter_count()
- : 0);
+ : 0,
+ actual_argument_count_);
// Do the input frame to output frame(s) translation.
size_t count = translated_state_.frames().size();
@@ -875,18 +955,8 @@ void Deoptimizer::DoComputeOutputFrames() {
isolate()->isolate_root());
// Print some helpful diagnostic information.
- if (trace_scope_ != nullptr) {
- double ms = timer.Elapsed().InMillisecondsF();
- int index = output_count_ - 1; // Index of the topmost frame.
- PrintF(trace_scope_->file(), "[bailout (kind: %s): end ",
- MessageFor(deopt_kind_, should_reuse_code()));
- PrintFunctionName();
- PrintF(trace_scope_->file(),
- " @%d => node=%d, pc=" V8PRIxPTR_FMT
- " (unsigned), caller sp=" V8PRIxPTR_FMT ", took %0.3f ms]\n",
- bailout_id_, node_id.ToInt(),
- PointerAuthentication::StripPAC(output_[index]->GetPc()),
- caller_frame_top_, ms);
+ if (verbose_tracing_enabled()) {
+ TraceDeoptEnd(timer.Elapsed().InMillisecondsF());
}
// The following invariant is fairly tricky to guarantee, since the size of
@@ -922,11 +992,11 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
const uint32_t output_frame_size = frame_info.frame_size_in_bytes();
TranslatedFrame::iterator function_iterator = value_iterator++;
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(), " translating interpreted frame ");
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(), " translating interpreted frame ");
std::unique_ptr<char[]> name = shared.DebugName().ToCString();
- PrintF(trace_scope_->file(), "%s", name.get());
- PrintF(trace_scope_->file(),
+ PrintF(trace_scope()->file(), "%s", name.get());
+ PrintF(trace_scope()->file(),
" => bytecode_offset=%d, variable_frame_size=%d, frame_size=%d%s\n",
real_bytecode_offset, frame_info.frame_size_in_bytes_without_fixed(),
output_frame_size, goto_catch_handler ? " (throw)" : "");
@@ -935,7 +1005,7 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
// Allocate and store the output frame description.
FrameDescription* output_frame = new (output_frame_size)
FrameDescription(output_frame_size, parameters_count);
- FrameWriter frame_writer(this, output_frame, trace_scope_);
+ FrameWriter frame_writer(this, output_frame, verbose_trace_scope());
CHECK(frame_index >= 0 && frame_index < output_count_);
CHECK_NULL(output_[frame_index]);
@@ -953,12 +1023,19 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
if (ShouldPadArguments(parameters_count)) {
frame_writer.PushRawObject(roots.the_hole_value(), "padding\n");
}
+ // Note: parameters_count includes the receiver.
+ if (verbose_tracing_enabled() && is_bottommost &&
+ actual_argument_count_ > parameters_count - 1) {
+ PrintF(trace_scope_->file(),
+ " -- %d extra argument(s) already in the stack --\n",
+ actual_argument_count_ - parameters_count + 1);
+ }
frame_writer.PushStackJSArguments(value_iterator, parameters_count);
DCHECK_EQ(output_frame->GetLastArgumentSlotOffset(),
frame_writer.top_offset());
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(), " -------------------------\n");
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(), " -------------------------\n");
}
// There are no translation commands for the caller's pc and fp, the
@@ -970,9 +1047,11 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
// input frame. For all subsequent output frames, it can be read from the
// previous one. This frame's pc can be computed from the non-optimized
// function code and AST id of the bailout.
- const intptr_t caller_pc =
- is_bottommost ? caller_pc_ : output_[frame_index - 1]->GetPc();
- frame_writer.PushCallerPc(caller_pc);
+ if (is_bottommost) {
+ frame_writer.PushBottommostCallerPc(caller_pc_);
+ } else {
+ frame_writer.PushApprovedCallerPc(output_[frame_index - 1]->GetPc());
+ }
// The caller's frame pointer for the bottommost output frame is the same
// as in the input frame. For all subsequent output frames, it can be
@@ -1021,6 +1100,19 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
// The function was mentioned explicitly in the BEGIN_FRAME.
frame_writer.PushTranslatedValue(function_iterator, "function");
+ // Actual argument count.
+ int argc;
+ if (is_bottommost) {
+ argc = actual_argument_count_;
+ } else {
+ TranslatedFrame::Kind previous_frame_kind =
+ (translated_state_.frames()[frame_index - 1]).kind();
+ argc = previous_frame_kind == TranslatedFrame::kArgumentsAdaptor
+ ? output_[frame_index - 1]->parameter_count()
+ : parameters_count - 1;
+ }
+ frame_writer.PushRawValue(argc, "actual argument count\n");
+
// Set the bytecode array pointer.
Object bytecode_array = shared.HasBreakInfo()
? shared.GetDebugInfo().DebugBytecodeArray()
@@ -1033,8 +1125,8 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
Smi smi_bytecode_offset = Smi::FromInt(raw_bytecode_offset);
frame_writer.PushRawObject(smi_bytecode_offset, "bytecode offset\n");
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(), " -------------------------\n");
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(), " -------------------------\n");
}
// Translate the rest of the interpreter registers in the frame.
@@ -1124,8 +1216,17 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
!goto_catch_handler
? builtins->builtin(Builtins::kInterpreterEnterBytecodeAdvance)
: builtins->builtin(Builtins::kInterpreterEnterBytecodeDispatch);
- output_frame->SetPc(
- static_cast<intptr_t>(dispatch_builtin.InstructionStart()));
+ if (is_topmost) {
+ // Only the pc of the topmost frame needs to be signed since it is
+ // authenticated at the end of GenerateDeoptimizationEntries.
+ const intptr_t top_most_pc = PointerAuthentication::SignAndCheckPC(
+ static_cast<intptr_t>(dispatch_builtin.InstructionStart()),
+ frame_writer.frame()->GetTop());
+ output_frame->SetPc(top_most_pc);
+ } else {
+ output_frame->SetPc(
+ static_cast<intptr_t>(dispatch_builtin.InstructionStart()));
+ }
// Update constant pool.
if (FLAG_enable_embedded_constant_pool) {
@@ -1155,6 +1256,64 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame,
void Deoptimizer::DoComputeArgumentsAdaptorFrame(
TranslatedFrame* translated_frame, int frame_index) {
+ // Arguments adaptor can not be top most, nor the bottom most frames.
+ CHECK(frame_index < output_count_ - 1);
+ CHECK_GT(frame_index, 0);
+ CHECK_NULL(output_[frame_index]);
+
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ // During execution, V8 does not understand arguments adaptor frames anymore,
+ // so during deoptimization we only push the extra arguments (arguments with
+ // index greater than the formal parameter count). Therefore we call this
+ // TranslatedFrame the fake adaptor frame. For more info, see the design
+ // document shorturl.at/fKT49.
+
+ TranslatedFrame::iterator value_iterator = translated_frame->begin();
+ const int argument_count_without_receiver = translated_frame->height() - 1;
+ const int formal_parameter_count =
+ translated_frame->raw_shared_info().internal_formal_parameter_count();
+ const int extra_argument_count =
+ argument_count_without_receiver - formal_parameter_count;
+
+ const int output_frame_size =
+ std::max(0, extra_argument_count * kSystemPointerSize);
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope_->file(),
+ " translating arguments adaptor => variable_size=%d\n",
+ output_frame_size);
+ }
+
+ // Allocate and store the output frame description.
+ FrameDescription* output_frame = new (output_frame_size)
+ FrameDescription(output_frame_size, argument_count_without_receiver);
+ // The top address of the frame is computed from the previous frame's top and
+ // this frame's size.
+ const intptr_t top_address =
+ output_[frame_index - 1]->GetTop() - output_frame_size;
+ output_frame->SetTop(top_address);
+ // This is not a real frame, we take PC and FP values from the parent frame.
+ output_frame->SetPc(output_[frame_index - 1]->GetPc());
+ output_frame->SetFp(output_[frame_index - 1]->GetFp());
+ output_[frame_index] = output_frame;
+
+ if (extra_argument_count > 0) {
+ FrameWriter frame_writer(this, output_frame, verbose_trace_scope());
+
+ ReadOnlyRoots roots(isolate());
+ if (ShouldPadArguments(extra_argument_count)) {
+ frame_writer.PushRawObject(roots.the_hole_value(), "padding\n");
+ }
+
+ // The receiver and arguments with index below the formal parameter
+ // count are in the fake adaptor frame, because they are used to create the
+ // arguments object. We should however not push them, since the interpreter
+ // frame with do that.
+ value_iterator++; // Skip function.
+ value_iterator++; // Skip receiver.
+ for (int i = 0; i < formal_parameter_count; i++) value_iterator++;
+ frame_writer.PushStackJSArguments(value_iterator, extra_argument_count);
+ }
+#else
TranslatedFrame::iterator value_iterator = translated_frame->begin();
const bool is_bottommost = (0 == frame_index);
@@ -1164,8 +1323,8 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(
const uint32_t output_frame_size = frame_info.frame_size_in_bytes();
TranslatedFrame::iterator function_iterator = value_iterator++;
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(),
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(),
" translating arguments adaptor => variable_frame_size=%d, "
"frame_size=%d\n",
frame_info.frame_size_in_bytes_without_fixed(), output_frame_size);
@@ -1174,7 +1333,7 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(
// Allocate and store the output frame description.
FrameDescription* output_frame = new (output_frame_size)
FrameDescription(output_frame_size, parameters_count);
- FrameWriter frame_writer(this, output_frame, trace_scope_);
+ FrameWriter frame_writer(this, output_frame, verbose_trace_scope());
// Arguments adaptor can not be topmost.
CHECK(frame_index < output_count_ - 1);
@@ -1194,17 +1353,17 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(
}
// Compute the incoming parameter translation.
- for (int i = 0; i < parameters_count; ++i, ++value_iterator) {
- frame_writer.PushTranslatedValue(value_iterator, "stack parameter");
- }
+ frame_writer.PushStackJSArguments(value_iterator, parameters_count);
DCHECK_EQ(output_frame->GetLastArgumentSlotOffset(),
frame_writer.top_offset());
// Read caller's PC from the previous frame.
- const intptr_t caller_pc =
- is_bottommost ? caller_pc_ : output_[frame_index - 1]->GetPc();
- frame_writer.PushCallerPc(caller_pc);
+ if (is_bottommost) {
+ frame_writer.PushBottommostCallerPc(caller_pc_);
+ } else {
+ frame_writer.PushApprovedCallerPc(output_[frame_index - 1]->GetPc());
+ }
// Read caller's FP from the previous frame, and set this frame's FP.
const intptr_t caller_fp =
@@ -1251,6 +1410,7 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(
static_cast<intptr_t>(adaptor_trampoline.constant_pool());
output_frame->SetConstantPool(constant_pool_value);
}
+#endif
}
void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
@@ -1272,8 +1432,8 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
const uint32_t output_frame_size = frame_info.frame_size_in_bytes();
TranslatedFrame::iterator function_iterator = value_iterator++;
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(),
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(),
" translating construct stub => bailout_id=%d (%s), "
"variable_frame_size=%d, frame_size=%d\n",
bailout_id.ToInt(),
@@ -1284,7 +1444,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
// Allocate and store the output frame description.
FrameDescription* output_frame = new (output_frame_size)
FrameDescription(output_frame_size, parameters_count);
- FrameWriter frame_writer(this, output_frame, trace_scope_);
+ FrameWriter frame_writer(this, output_frame, verbose_trace_scope());
// Construct stub can not be topmost.
DCHECK(frame_index > 0 && frame_index < output_count_);
@@ -1315,7 +1475,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
// Read caller's PC from the previous frame.
const intptr_t caller_pc = output_[frame_index - 1]->GetPc();
- frame_writer.PushCallerPc(caller_pc);
+ frame_writer.PushApprovedCallerPc(caller_pc);
// Read caller's FP from the previous frame, and set this frame's FP.
const intptr_t caller_fp = output_[frame_index - 1]->GetFp();
@@ -1383,7 +1543,14 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
? isolate_->heap()->construct_stub_create_deopt_pc_offset().value()
: isolate_->heap()->construct_stub_invoke_deopt_pc_offset().value();
intptr_t pc_value = static_cast<intptr_t>(start + pc_offset);
- output_frame->SetPc(pc_value);
+ if (is_topmost) {
+ // Only the pc of the topmost frame needs to be signed since it is
+ // authenticated at the end of GenerateDeoptimizationEntries.
+ output_frame->SetPc(PointerAuthentication::SignAndCheckPC(
+ pc_value, frame_writer.frame()->GetTop()));
+ } else {
+ output_frame->SetPc(pc_value);
+ }
// Update constant pool.
if (FLAG_enable_embedded_constant_pool) {
@@ -1566,8 +1733,8 @@ void Deoptimizer::DoComputeBuiltinContinuation(
}
CHECK_EQ(BuiltinContinuationModeIsJavaScript(mode), has_argc);
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(),
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(),
" translating BuiltinContinuation to %s,"
" => register_param_count=%d,"
" stack_param_count=%d, frame_size=%d\n",
@@ -1578,7 +1745,7 @@ void Deoptimizer::DoComputeBuiltinContinuation(
FrameDescription* output_frame = new (output_frame_size)
FrameDescription(output_frame_size, frame_info.stack_parameter_count());
output_[frame_index] = output_frame;
- FrameWriter frame_writer(this, output_frame, trace_scope_);
+ FrameWriter frame_writer(this, output_frame, verbose_trace_scope());
// The top address of the frame is computed from the previous frame's top and
// this frame's size.
@@ -1692,9 +1859,11 @@ void Deoptimizer::DoComputeBuiltinContinuation(
output_frame->SetRegister(kContextRegister.code(), value);
// Set caller's PC (JSFunction continuation).
- const intptr_t caller_pc =
- is_bottommost ? caller_pc_ : output_[frame_index - 1]->GetPc();
- frame_writer.PushCallerPc(caller_pc);
+ if (is_bottommost) {
+ frame_writer.PushBottommostCallerPc(caller_pc_);
+ } else {
+ frame_writer.PushApprovedCallerPc(output_[frame_index - 1]->GetPc());
+ }
// Read caller's FP from the previous frame, and set this frame's FP.
const intptr_t caller_fp =
@@ -1744,7 +1913,7 @@ void Deoptimizer::DoComputeBuiltinContinuation(
for (int i = 0; i < allocatable_register_count; ++i) {
int code = config->GetAllocatableGeneralCode(i);
ScopedVector<char> str(128);
- if (trace_scope_ != nullptr) {
+ if (verbose_tracing_enabled()) {
if (BuiltinContinuationModeIsJavaScript(mode) &&
code == kJavaScriptCallArgCountRegister.code()) {
SNPrintF(
@@ -1757,7 +1926,7 @@ void Deoptimizer::DoComputeBuiltinContinuation(
}
}
frame_writer.PushTranslatedValue(
- register_values[code], trace_scope_ != nullptr ? str.begin() : "");
+ register_values[code], verbose_tracing_enabled() ? str.begin() : "");
}
// Some architectures must pad the stack frame with extra stack slots
@@ -1804,8 +1973,17 @@ void Deoptimizer::DoComputeBuiltinContinuation(
Code continue_to_builtin =
isolate()->builtins()->builtin(TrampolineForBuiltinContinuation(
mode, frame_info.frame_has_result_stack_slot()));
- output_frame->SetPc(
- static_cast<intptr_t>(continue_to_builtin.InstructionStart()));
+ if (is_topmost) {
+ // Only the pc of the topmost frame needs to be signed since it is
+ // authenticated at the end of GenerateDeoptimizationEntries.
+ const intptr_t top_most_pc = PointerAuthentication::SignAndCheckPC(
+ static_cast<intptr_t>(continue_to_builtin.InstructionStart()),
+ frame_writer.frame()->GetTop());
+ output_frame->SetPc(top_most_pc);
+ } else {
+ output_frame->SetPc(
+ static_cast<intptr_t>(continue_to_builtin.InstructionStart()));
+ }
Code continuation =
isolate()->builtins()->builtin(Builtins::kNotifyDeoptimized);
@@ -1824,13 +2002,13 @@ void Deoptimizer::MaterializeHeapObjects() {
for (auto& materialization : values_to_materialize_) {
Handle<Object> value = materialization.value_->GetValue();
- if (trace_scope_ != nullptr) {
- PrintF(trace_scope_->file(),
+ if (verbose_tracing_enabled()) {
+ PrintF(trace_scope()->file(),
"Materialization [" V8PRIxPTR_FMT "] <- " V8PRIxPTR_FMT " ; ",
static_cast<intptr_t>(materialization.output_slot_address_),
value->ptr());
- value->ShortPrint(trace_scope_->file());
- PrintF(trace_scope_->file(), "\n");
+ value->ShortPrint(trace_scope()->file());
+ PrintF(trace_scope()->file(), "\n");
}
*(reinterpret_cast<Address*>(materialization.output_slot_address_)) =
@@ -1840,10 +2018,14 @@ void Deoptimizer::MaterializeHeapObjects() {
translated_state_.VerifyMaterializedObjects();
bool feedback_updated = translated_state_.DoUpdateFeedback();
- if (trace_scope_ != nullptr && feedback_updated) {
- PrintF(trace_scope_->file(), "Feedback updated");
- compiled_code_.PrintDeoptLocation(trace_scope_->file(),
- " from deoptimization at ", from_);
+ if (verbose_tracing_enabled() && feedback_updated) {
+ FILE* file = trace_scope()->file();
+ Deoptimizer::DeoptInfo info =
+ Deoptimizer::GetDeoptInfo(compiled_code_, from_);
+ PrintF(file, "Feedback updated from deoptimization at ");
+ OFStream outstr(file);
+ info.position.Print(outstr, compiled_code_);
+ PrintF(file, ", %s\n", DeoptimizeReasonToString(info.deopt_reason));
}
isolate_->materialized_object_store()->Remove(
@@ -2969,9 +3151,13 @@ void TranslatedState::CreateArgumentsElementsTranslatedValues(
FILE* trace_file) {
TranslatedFrame& frame = frames_[frame_index];
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ int arguments_length = actual_argument_count_;
+#else
int arguments_length;
Address arguments_frame =
ComputeArgumentsPosition(input_frame_pointer, &arguments_length);
+#endif
int length = type == CreateArgumentsType::kRestParameter
? std::max(0, arguments_length - formal_parameter_count_)
@@ -3015,9 +3201,15 @@ void TranslatedState::CreateArgumentsElementsTranslatedValues(
#else
int offset = argc - i - 1;
#endif
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ Address arguments_frame = offset > formal_parameter_count_
+ ? stack_frame_pointer_
+ : input_frame_pointer;
+#endif
Address argument_slot = arguments_frame +
CommonFrameConstants::kFixedFrameSizeAboveFp +
offset * kSystemPointerSize;
+
frame.Add(TranslatedValue::NewTagged(this, *FullObjectSlot(argument_slot)));
}
}
@@ -3074,8 +3266,12 @@ int TranslatedState::CreateNextTranslatedValue(
}
case Translation::ARGUMENTS_LENGTH: {
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ int arguments_length = actual_argument_count_;
+#else
int arguments_length;
ComputeArgumentsPosition(fp, &arguments_length);
+#endif
if (trace_file != nullptr) {
PrintF(trace_file, "arguments length field (length = %d)",
arguments_length);
@@ -3360,18 +3556,28 @@ TranslatedState::TranslatedState(const JavaScriptFrame* frame) {
DCHECK(!data.is_null() && deopt_index != Safepoint::kNoDeoptimizationIndex);
TranslationIterator it(data.TranslationByteArray(),
data.TranslationIndex(deopt_index).value());
- Init(frame->isolate(), frame->fp(), &it, data.LiteralArray(),
+#ifdef V8_NO_ARGUMENT_ADAPTOR
+ int actual_argc = frame->GetActualArgumentCount();
+#else
+ int actual_argc = 0;
+#endif
+ Init(frame->isolate(), frame->fp(), kNullAddress, &it, data.LiteralArray(),
nullptr /* registers */, nullptr /* trace file */,
- frame->function().shared().internal_formal_parameter_count());
+ frame->function().shared().internal_formal_parameter_count(),
+ actual_argc);
}
void TranslatedState::Init(Isolate* isolate, Address input_frame_pointer,
+ Address stack_frame_pointer,
TranslationIterator* iterator,
FixedArray literal_array, RegisterValues* registers,
- FILE* trace_file, int formal_parameter_count) {
+ FILE* trace_file, int formal_parameter_count,
+ int actual_argument_count) {
DCHECK(frames_.empty());
+ stack_frame_pointer_ = stack_frame_pointer;
formal_parameter_count_ = formal_parameter_count;
+ actual_argument_count_ = actual_argument_count;
isolate_ = isolate;
// Read out the 'header' translation.
diff --git a/deps/v8/src/deoptimizer/deoptimizer.h b/deps/v8/src/deoptimizer/deoptimizer.h
index 9bca74c7b2..152e5e510e 100644
--- a/deps/v8/src/deoptimizer/deoptimizer.h
+++ b/deps/v8/src/deoptimizer/deoptimizer.h
@@ -12,11 +12,13 @@
#include "src/codegen/label.h"
#include "src/codegen/register-arch.h"
#include "src/codegen/source-position.h"
+#include "src/common/assert-scope.h"
#include "src/common/globals.h"
#include "src/deoptimizer/deoptimize-reason.h"
#include "src/diagnostics/code-tracer.h"
#include "src/execution/frame-constants.h"
#include "src/execution/isolate.h"
+#include "src/heap/heap.h"
#include "src/objects/feedback-vector.h"
#include "src/objects/js-function.h"
#include "src/objects/shared-function-info.h"
@@ -35,6 +37,7 @@ class TranslatedFrame;
class TranslatedState;
class RegisterValues;
class MacroAssembler;
+class StrongRootsEntry;
enum class BuiltinContinuationMode;
@@ -339,8 +342,9 @@ class TranslatedState {
Isolate* isolate() { return isolate_; }
void Init(Isolate* isolate, Address input_frame_pointer,
- TranslationIterator* iterator, FixedArray literal_array,
- RegisterValues* registers, FILE* trace_file, int parameter_count);
+ Address stack_frame_pointer, TranslationIterator* iterator,
+ FixedArray literal_array, RegisterValues* registers,
+ FILE* trace_file, int parameter_count, int actual_argument_count);
void VerifyMaterializedObjects();
bool DoUpdateFeedback();
@@ -408,6 +412,7 @@ class TranslatedState {
Isolate* isolate_ = nullptr;
Address stack_frame_pointer_ = kNullAddress;
int formal_parameter_count_;
+ int actual_argument_count_;
struct ObjectPosition {
int frame_index_;
@@ -482,6 +487,13 @@ class Deoptimizer : public Malloced {
// refer to that code.
static void DeoptimizeMarkedCode(Isolate* isolate);
+ // Check the given address against a list of allowed addresses, to prevent a
+ // potential attacker from using the frame creation process in the
+ // deoptimizer, in particular the signing process, to gain control over the
+ // program.
+ // When building mksnapshot, always return false.
+ static bool IsValidReturnAddress(Address address);
+
~Deoptimizer();
void MaterializeHeapObjects();
@@ -528,6 +540,11 @@ class Deoptimizer : public Malloced {
static const int kNonLazyDeoptExitSize;
static const int kLazyDeoptExitSize;
+ // Tracing.
+ static void TraceMarkForDeoptimization(Code code, const char* reason);
+ static void TraceEvictFromOptimizedCodeCache(SharedFunctionInfo sfi,
+ const char* reason);
+
private:
friend class FrameWriter;
void QueueValueForMaterialization(Address output_address, Object obj,
@@ -536,7 +553,6 @@ class Deoptimizer : public Malloced {
Deoptimizer(Isolate* isolate, JSFunction function, DeoptimizeKind kind,
unsigned bailout_id, Address from, int fp_to_sp_delta);
Code FindOptimizedCode();
- void PrintFunctionName();
void DeleteFrameDescriptions();
static bool IsDeoptimizationEntry(Isolate* isolate, Address addr,
@@ -574,6 +590,23 @@ class Deoptimizer : public Malloced {
// searching all code objects).
Code FindDeoptimizingCode(Address addr);
+ // Tracing.
+ bool tracing_enabled() const { return static_cast<bool>(trace_scope_); }
+ bool verbose_tracing_enabled() const {
+ return FLAG_trace_deopt_verbose && trace_scope_;
+ }
+ CodeTracer::Scope* trace_scope() const { return trace_scope_.get(); }
+ CodeTracer::Scope* verbose_trace_scope() const {
+ return FLAG_trace_deopt_verbose ? trace_scope() : nullptr;
+ }
+ void TraceDeoptBegin(int optimization_id, int node_id);
+ void TraceDeoptEnd(double deopt_duration);
+#ifdef DEBUG
+ static void TraceFoundActivation(Isolate* isolate, JSFunction function);
+#endif
+ static void TraceDeoptAll(Isolate* isolate);
+ static void TraceDeoptMarked(Isolate* isolate);
+
Isolate* isolate_;
JSFunction function_;
Code compiled_code_;
@@ -601,6 +634,9 @@ class Deoptimizer : public Malloced {
intptr_t caller_constant_pool_;
intptr_t input_frame_context_;
+ // The argument count of the bottom most frame.
+ int actual_argument_count_;
+
// Key for lookup of previously materialized objects
intptr_t stack_fp_;
@@ -612,10 +648,10 @@ class Deoptimizer : public Malloced {
std::vector<ValueToMaterialize> values_to_materialize_;
#ifdef DEBUG
- DisallowHeapAllocation* disallow_heap_allocation_;
+ DisallowGarbageCollection* disallow_garbage_collection_;
#endif // DEBUG
- CodeTracer::Scope* trace_scope_;
+ std::unique_ptr<CodeTracer::Scope> trace_scope_;
static const int table_entry_size_;
@@ -814,6 +850,7 @@ class DeoptimizerData {
void set_deopt_entry_code(DeoptimizeKind kind, Code code);
Deoptimizer* current_;
+ StrongRootsEntry* strong_roots_entry_;
friend class Deoptimizer;
diff --git a/deps/v8/src/diagnostics/basic-block-profiler.cc b/deps/v8/src/diagnostics/basic-block-profiler.cc
index ddce03880e..95e2cb8dae 100644
--- a/deps/v8/src/diagnostics/basic-block-profiler.cc
+++ b/deps/v8/src/diagnostics/basic-block-profiler.cc
@@ -10,7 +10,7 @@
#include "src/base/lazy-instance.h"
#include "src/heap/heap-inl.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
+#include "torque-generated/exported-class-definitions-inl.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/diagnostics/basic-block-profiler.h b/deps/v8/src/diagnostics/basic-block-profiler.h
index b0bf3543d9..41d0e65ccb 100644
--- a/deps/v8/src/diagnostics/basic-block-profiler.h
+++ b/deps/v8/src/diagnostics/basic-block-profiler.h
@@ -14,7 +14,7 @@
#include "src/base/macros.h"
#include "src/base/platform/mutex.h"
#include "src/common/globals.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/diagnostics/ia32/disasm-ia32.cc b/deps/v8/src/diagnostics/ia32/disasm-ia32.cc
index 608b3fac82..80ab5663aa 100644
--- a/deps/v8/src/diagnostics/ia32/disasm-ia32.cc
+++ b/deps/v8/src/diagnostics/ia32/disasm-ia32.cc
@@ -1074,6 +1074,10 @@ int DisassemblerIA32::AVXInstruction(byte* data) {
int mod, regop, rm, vvvv = vex_vreg();
get_modrm(*current, &mod, &regop, &rm);
switch (opcode) {
+ case 0x10:
+ AppendToBuffer("vmovups %s,", NameOfXMMRegister(regop));
+ current += PrintRightXMMOperand(current);
+ break;
case 0x28:
AppendToBuffer("vmovaps %s,", NameOfXMMRegister(regop));
current += PrintRightXMMOperand(current);
diff --git a/deps/v8/src/diagnostics/objects-debug.cc b/deps/v8/src/diagnostics/objects-debug.cc
index 054b9dec17..83a1ac3a9f 100644
--- a/deps/v8/src/diagnostics/objects-debug.cc
+++ b/deps/v8/src/diagnostics/objects-debug.cc
@@ -71,9 +71,9 @@
#include "src/regexp/regexp.h"
#include "src/utils/ostreams.h"
#include "src/wasm/wasm-objects-inl.h"
-#include "torque-generated/class-verifiers-tq.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/internal-class-definitions-tq-inl.h"
+#include "torque-generated/class-verifiers.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/internal-class-definitions-inl.h"
namespace v8 {
namespace internal {
@@ -288,17 +288,19 @@ void BytecodeArray::BytecodeArrayVerify(Isolate* isolate) {
// - Jumps must go to new instructions starts.
// - No Illegal bytecodes.
// - No consecutive sequences of prefix Wide / ExtraWide.
- CHECK(IsBytecodeArray());
- CHECK(constant_pool().IsFixedArray());
- VerifyHeapPointer(isolate, constant_pool());
- CHECK(source_position_table().IsUndefined() ||
- source_position_table().IsException() ||
- source_position_table().IsByteArray());
- CHECK(handler_table().IsByteArray());
+ CHECK(IsBytecodeArray(isolate));
+ CHECK(constant_pool(isolate).IsFixedArray(isolate));
+ VerifyHeapPointer(isolate, constant_pool(isolate));
+ CHECK(synchronized_source_position_table(isolate).IsUndefined(isolate) ||
+ synchronized_source_position_table(isolate).IsException(isolate) ||
+ synchronized_source_position_table(isolate).IsByteArray(isolate));
+ CHECK(handler_table(isolate).IsByteArray(isolate));
+ for (int i = 0; i < constant_pool(isolate).length(); ++i) {
+ // No ThinStrings in the constant pool.
+ CHECK(!constant_pool(isolate).get(isolate, i).IsThinString(isolate));
+ }
}
-USE_TORQUE_VERIFIER(FeedbackVector)
-
USE_TORQUE_VERIFIER(JSReceiver)
bool JSObject::ElementsAreSafeToExamine(const Isolate* isolate) const {
@@ -703,12 +705,10 @@ void JSArgumentsObject::JSArgumentsObjectVerify(Isolate* isolate) {
void JSAsyncFunctionObject::JSAsyncFunctionObjectVerify(Isolate* isolate) {
TorqueGeneratedClassVerifiers::JSAsyncFunctionObjectVerify(*this, isolate);
- promise().HeapObjectVerify(isolate);
}
void JSAsyncGeneratorObject::JSAsyncGeneratorObjectVerify(Isolate* isolate) {
TorqueGeneratedClassVerifiers::JSAsyncGeneratorObjectVerify(*this, isolate);
- queue().HeapObjectVerify(isolate);
}
void JSDate::JSDateVerify(Isolate* isolate) {
@@ -1225,31 +1225,29 @@ void JSRegExp::JSRegExpVerify(Isolate* isolate) {
Object latin1_code = arr.get(JSRegExp::kIrregexpLatin1CodeIndex);
Object uc16_code = arr.get(JSRegExp::kIrregexpUC16CodeIndex);
- Object experimental_pattern =
- arr.get(JSRegExp::kExperimentalPatternIndex);
- if (latin1_code.IsCode()) {
- // `this` should be a compiled regexp.
- CHECK(latin1_code.IsCode());
- CHECK_EQ(Code::cast(latin1_code).builtin_index(),
- Builtins::kRegExpExperimentalTrampoline);
+ Object latin1_bytecode = arr.get(JSRegExp::kIrregexpLatin1BytecodeIndex);
+ Object uc16_bytecode = arr.get(JSRegExp::kIrregexpUC16BytecodeIndex);
- CHECK(uc16_code.IsCode());
- CHECK_EQ(Code::cast(uc16_code).builtin_index(),
+ bool is_compiled = latin1_code.IsCode();
+ if (is_compiled) {
+ CHECK_EQ(Code::cast(latin1_code).builtin_index(),
Builtins::kRegExpExperimentalTrampoline);
+ CHECK_EQ(uc16_code, latin1_code);
- CHECK(experimental_pattern.IsString());
+ CHECK(latin1_bytecode.IsByteArray());
+ CHECK_EQ(uc16_bytecode, latin1_bytecode);
} else {
CHECK_EQ(latin1_code, uninitialized);
CHECK_EQ(uc16_code, uninitialized);
- CHECK_EQ(experimental_pattern, uninitialized);
+
+ CHECK_EQ(latin1_bytecode, uninitialized);
+ CHECK_EQ(uc16_bytecode, uninitialized);
}
CHECK_EQ(arr.get(JSRegExp::kIrregexpMaxRegisterCountIndex),
uninitialized);
- // TODO(mbid,v8:10765): Once the EXPERIMENTAL regexps support captures,
- // the capture count should be allowed to be a Smi >= 0.
- CHECK_EQ(arr.get(JSRegExp::kIrregexpCaptureCountIndex), Smi::FromInt(0));
- CHECK_EQ(arr.get(JSRegExp::kIrregexpCaptureNameMapIndex), uninitialized);
+ CHECK(arr.get(JSRegExp::kIrregexpCaptureCountIndex).IsSmi());
+ CHECK_GE(Smi::ToInt(arr.get(JSRegExp::kIrregexpCaptureCountIndex)), 0);
CHECK_EQ(arr.get(JSRegExp::kIrregexpTicksUntilTierUpIndex),
uninitialized);
CHECK_EQ(arr.get(JSRegExp::kIrregexpBacktrackLimit), uninitialized);
@@ -1286,6 +1284,7 @@ void JSRegExp::JSRegExpVerify(Isolate* isolate) {
CHECK_IMPLIES(uc16_data.IsSmi(), uc16_bytecode.IsSmi());
CHECK(arr.get(JSRegExp::kIrregexpCaptureCountIndex).IsSmi());
+ CHECK_GE(Smi::ToInt(arr.get(JSRegExp::kIrregexpCaptureCountIndex)), 0);
CHECK(arr.get(JSRegExp::kIrregexpMaxRegisterCountIndex).IsSmi());
CHECK(arr.get(JSRegExp::kIrregexpTicksUntilTierUpIndex).IsSmi());
CHECK(arr.get(JSRegExp::kIrregexpBacktrackLimit).IsSmi());
@@ -1344,7 +1343,6 @@ void AsyncGeneratorRequest::AsyncGeneratorRequestVerify(Isolate* isolate) {
TorqueGeneratedClassVerifiers::AsyncGeneratorRequestVerify(*this, isolate);
CHECK_GE(resume_mode(), JSGeneratorObject::kNext);
CHECK_LE(resume_mode(), JSGeneratorObject::kThrow);
- next().ObjectVerify(isolate);
}
void BigIntBase::BigIntBaseVerify(Isolate* isolate) {
@@ -1385,12 +1383,19 @@ void SourceTextModule::SourceTextModuleVerify(Isolate* isolate) {
} else if (status() == kEvaluating || status() == kEvaluated) {
CHECK(code().IsJSGeneratorObject());
} else {
- CHECK((status() == kInstantiated && code().IsJSGeneratorObject()) ||
- (status() == kInstantiating && code().IsJSFunction()) ||
- (status() == kPreInstantiating && code().IsSharedFunctionInfo()) ||
- (status() == kUninstantiated && code().IsSharedFunctionInfo()));
- CHECK(top_level_capability().IsUndefined() && !AsyncParentModuleCount() &&
- !pending_async_dependencies() && !async_evaluating());
+ if (status() == kInstantiated) {
+ CHECK(code().IsJSGeneratorObject());
+ } else if (status() == kInstantiating) {
+ CHECK(code().IsJSFunction());
+ } else if (status() == kPreInstantiating) {
+ CHECK(code().IsSharedFunctionInfo());
+ } else if (status() == kUninstantiated) {
+ CHECK(code().IsSharedFunctionInfo());
+ }
+ CHECK(top_level_capability().IsUndefined());
+ CHECK(!AsyncParentModuleCount());
+ CHECK(!pending_async_dependencies());
+ CHECK(!async_evaluating());
}
CHECK_EQ(requested_modules().length(), info().module_requests().length());
@@ -1460,6 +1465,10 @@ void ObjectBoilerplateDescription::ObjectBoilerplateDescriptionVerify(
CHECK_GE(this->length(),
ObjectBoilerplateDescription::kDescriptionStartIndex);
this->FixedArrayVerify(isolate);
+ for (int i = 0; i < length(); ++i) {
+ // No ThinStrings in the boilerplate.
+ CHECK(!get(isolate, i).IsThinString(isolate));
+ }
}
USE_TORQUE_VERIFIER(AsmWasmData)
@@ -1702,12 +1711,13 @@ bool DescriptorArray::IsSortedNoDuplicates() {
uint32_t current = 0;
for (int i = 0; i < number_of_descriptors(); i++) {
Name key = GetSortedKey(i);
+ CHECK(key.HasHashCode());
if (key == current_key) {
Print();
return false;
}
current_key = key;
- uint32_t hash = GetSortedKey(i).Hash();
+ uint32_t hash = key.hash();
if (hash < current) {
Print();
return false;
@@ -1725,7 +1735,8 @@ bool TransitionArray::IsSortedNoDuplicates() {
for (int i = 0; i < number_of_transitions(); i++) {
Name key = GetSortedKey(i);
- uint32_t hash = key.Hash();
+ CHECK(key.HasHashCode());
+ uint32_t hash = key.hash();
PropertyKind kind = kData;
PropertyAttributes attributes = NONE;
if (!TransitionsAccessor::IsSpecialTransition(key.GetReadOnlyRoots(),
diff --git a/deps/v8/src/diagnostics/objects-printer.cc b/deps/v8/src/diagnostics/objects-printer.cc
index db14898c13..9afe8e9445 100644
--- a/deps/v8/src/diagnostics/objects-printer.cc
+++ b/deps/v8/src/diagnostics/objects-printer.cc
@@ -69,9 +69,9 @@
#include "src/wasm/wasm-code-manager.h"
#include "src/wasm/wasm-engine.h"
#include "src/wasm/wasm-objects-inl.h"
-#include "torque-generated/class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/internal-class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/internal-class-definitions-inl.h"
namespace v8 {
namespace internal {
@@ -874,7 +874,8 @@ void FeedbackCell::FeedbackCellPrint(std::ostream& os) { // NOLINT
} else {
os << "\n - Invalid FeedbackCell map";
}
- os << " - value: " << Brief(value());
+ os << "\n - value: " << Brief(value());
+ os << "\n - interrupt_budget: " << interrupt_budget();
os << "\n";
}
@@ -950,8 +951,9 @@ void FeedbackVector::FeedbackVectorPrint(std::ostream& os) { // NOLINT
int entry_size = iter.entry_size();
if (entry_size > 0) os << " {";
for (int i = 0; i < entry_size; i++) {
- int index = GetIndex(slot) + i;
- os << "\n [" << index << "]: " << Brief(get(index));
+ FeedbackSlot slot_with_offset = slot.WithOffset(i);
+ os << "\n [" << slot_with_offset.ToInt()
+ << "]: " << Brief(Get(slot_with_offset));
}
if (entry_size > 0) os << "\n }";
}
@@ -2205,7 +2207,6 @@ void ScopeInfo::ScopeInfoPrint(std::ostream& os) { // NOLINT
void StackTraceFrame::StackTraceFramePrint(std::ostream& os) { // NOLINT
PrintHeader(os, "StackTraceFrame");
os << "\n - frame_index: " << frame_index();
- os << "\n - id: " << id();
os << "\n - frame_info: " << Brief(frame_info());
os << "\n";
}
diff --git a/deps/v8/src/diagnostics/unwinder.cc b/deps/v8/src/diagnostics/unwinder.cc
index c08fe20330..c4a559c9d9 100644
--- a/deps/v8/src/diagnostics/unwinder.cc
+++ b/deps/v8/src/diagnostics/unwinder.cc
@@ -46,21 +46,6 @@ bool PCIsInCodePages(size_t code_pages_length, const MemoryRange* code_pages,
return it->start <= pc && pc < CalculateEnd(it->start, it->length_in_bytes);
}
-bool IsInJSEntryRange(const UnwindState& unwind_state, void* pc) {
- return PCIsInCodeRange(unwind_state.js_entry_stub.code, pc) ||
- PCIsInCodeRange(unwind_state.js_construct_entry_stub.code, pc) ||
- PCIsInCodeRange(unwind_state.js_run_microtasks_entry_stub.code, pc);
-}
-
-bool IsInUnsafeJSEntryRange(const UnwindState& unwind_state, void* pc) {
- return IsInJSEntryRange(unwind_state, pc);
-
- // TODO(petermarshall): We can be more precise by checking whether we are
- // in JSEntry but after frame setup and before frame teardown, in which case
- // we are safe to unwind the stack. For now, we bail out if the PC is anywhere
- // within JSEntry.
-}
-
bool IsInJSEntryRange(const JSEntryStubs& entry_stubs, void* pc) {
return PCIsInCodeRange(entry_stubs.js_entry_stub.code, pc) ||
PCIsInCodeRange(entry_stubs.js_construct_entry_stub.code, pc) ||
@@ -81,22 +66,9 @@ i::Address Load(i::Address address) {
}
void* GetReturnAddressFromFP(void* fp, void* pc,
- const v8::UnwindState& unwind_state) {
- int caller_pc_offset = i::CommonFrameConstants::kCallerPCOffset;
-#ifdef V8_TARGET_ARCH_ARM64
- if (IsInJSEntryRange(unwind_state, pc)) {
- caller_pc_offset = i::EntryFrameConstants::kDirectCallerPCOffset;
- }
-#endif
- i::Address ret_addr =
- Load(reinterpret_cast<i::Address>(fp) + caller_pc_offset);
- return reinterpret_cast<void*>(i::PointerAuthentication::StripPAC(ret_addr));
-}
-
-void* GetReturnAddressFromFP(void* fp, void* pc,
const JSEntryStubs& entry_stubs) {
int caller_pc_offset = i::CommonFrameConstants::kCallerPCOffset;
-#ifdef V8_TARGET_ARCH_ARM64
+#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM
if (IsInJSEntryRange(entry_stubs, pc)) {
caller_pc_offset = i::EntryFrameConstants::kDirectCallerPCOffset;
}
@@ -106,21 +78,9 @@ void* GetReturnAddressFromFP(void* fp, void* pc,
return reinterpret_cast<void*>(i::PointerAuthentication::StripPAC(ret_addr));
}
-void* GetCallerFPFromFP(void* fp, void* pc,
- const v8::UnwindState& unwind_state) {
- int caller_fp_offset = i::CommonFrameConstants::kCallerFPOffset;
-#ifdef V8_TARGET_ARCH_ARM64
- if (IsInJSEntryRange(unwind_state, pc)) {
- caller_fp_offset = i::EntryFrameConstants::kDirectCallerFPOffset;
- }
-#endif
- return reinterpret_cast<void*>(
- Load(reinterpret_cast<i::Address>(fp) + caller_fp_offset));
-}
-
void* GetCallerFPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) {
int caller_fp_offset = i::CommonFrameConstants::kCallerFPOffset;
-#ifdef V8_TARGET_ARCH_ARM64
+#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM
if (IsInJSEntryRange(entry_stubs, pc)) {
caller_fp_offset = i::EntryFrameConstants::kDirectCallerFPOffset;
}
@@ -129,21 +89,9 @@ void* GetCallerFPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) {
Load(reinterpret_cast<i::Address>(fp) + caller_fp_offset));
}
-void* GetCallerSPFromFP(void* fp, void* pc,
- const v8::UnwindState& unwind_state) {
- int caller_sp_offset = i::CommonFrameConstants::kCallerSPOffset;
-#ifdef V8_TARGET_ARCH_ARM64
- if (IsInJSEntryRange(unwind_state, pc)) {
- caller_sp_offset = i::EntryFrameConstants::kDirectCallerSPOffset;
- }
-#endif
- return reinterpret_cast<void*>(reinterpret_cast<i::Address>(fp) +
- caller_sp_offset);
-}
-
void* GetCallerSPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) {
int caller_sp_offset = i::CommonFrameConstants::kCallerSPOffset;
-#ifdef V8_TARGET_ARCH_ARM64
+#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM
if (IsInJSEntryRange(entry_stubs, pc)) {
caller_sp_offset = i::EntryFrameConstants::kDirectCallerSPOffset;
}
@@ -159,46 +107,6 @@ bool AddressIsInStack(const void* address, const void* stack_base,
} // namespace
-bool Unwinder::TryUnwindV8Frames(const UnwindState& unwind_state,
- RegisterState* register_state,
- const void* stack_base) {
- const void* stack_top = register_state->sp;
-
- void* pc = register_state->pc;
- if (PCIsInV8(unwind_state, pc) && !IsInUnsafeJSEntryRange(unwind_state, pc)) {
- void* current_fp = register_state->fp;
- if (!AddressIsInStack(current_fp, stack_base, stack_top)) return false;
-
- // Peek at the return address that the caller pushed. If it's in V8, then we
- // assume the caller frame is a JS frame and continue to unwind.
- void* next_pc = GetReturnAddressFromFP(current_fp, pc, unwind_state);
- while (PCIsInV8(unwind_state, next_pc)) {
- current_fp = GetCallerFPFromFP(current_fp, pc, unwind_state);
- if (!AddressIsInStack(current_fp, stack_base, stack_top)) return false;
- pc = next_pc;
- next_pc = GetReturnAddressFromFP(current_fp, pc, unwind_state);
- }
-
- void* final_sp = GetCallerSPFromFP(current_fp, pc, unwind_state);
- if (!AddressIsInStack(final_sp, stack_base, stack_top)) return false;
- register_state->sp = final_sp;
-
- // We don't check that the final FP value is within the stack bounds because
- // this is just the rbp value that JSEntryStub pushed. On platforms like
- // Win64 this is not used as a dedicated FP register, and could contain
- // anything.
- void* final_fp = GetCallerFPFromFP(current_fp, pc, unwind_state);
- register_state->fp = final_fp;
-
- register_state->pc = next_pc;
-
- // Link register no longer valid after unwinding.
- register_state->lr = nullptr;
- return true;
- }
- return false;
-}
-
bool Unwinder::TryUnwindV8Frames(const JSEntryStubs& entry_stubs,
size_t code_pages_length,
const MemoryRange* code_pages,
@@ -242,11 +150,6 @@ bool Unwinder::TryUnwindV8Frames(const JSEntryStubs& entry_stubs,
return false;
}
-bool Unwinder::PCIsInV8(const UnwindState& unwind_state, void* pc) {
- return pc && (PCIsInCodeRange(unwind_state.code_range, pc) ||
- PCIsInCodeRange(unwind_state.embedded_code_range, pc));
-}
-
bool Unwinder::PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages,
void* pc) {
return pc && PCIsInCodePages(code_pages_length, code_pages, pc);
diff --git a/deps/v8/src/diagnostics/unwinding-info-win64.cc b/deps/v8/src/diagnostics/unwinding-info-win64.cc
index c39adcf710..f3b9a753af 100644
--- a/deps/v8/src/diagnostics/unwinding-info-win64.cc
+++ b/deps/v8/src/diagnostics/unwinding-info-win64.cc
@@ -16,37 +16,6 @@
#error "Unsupported OS"
#endif // V8_OS_WIN_X64
-// Forward declaration to keep this independent of Win8
-NTSYSAPI
-DWORD
-NTAPI
-RtlAddGrowableFunctionTable(
- _Out_ PVOID* DynamicTable,
- _In_reads_(MaximumEntryCount) PRUNTIME_FUNCTION FunctionTable,
- _In_ DWORD EntryCount,
- _In_ DWORD MaximumEntryCount,
- _In_ ULONG_PTR RangeBase,
- _In_ ULONG_PTR RangeEnd
- );
-
-
-NTSYSAPI
-void
-NTAPI
-RtlGrowFunctionTable(
- _Inout_ PVOID DynamicTable,
- _In_ DWORD NewEntryCount
- );
-
-
-NTSYSAPI
-void
-NTAPI
-RtlDeleteGrowableFunctionTable(
- _In_ PVOID DynamicTable
- );
-
-
namespace v8 {
namespace internal {
namespace win64_unwindinfo {
diff --git a/deps/v8/src/execution/arm/frame-constants-arm.h b/deps/v8/src/execution/arm/frame-constants-arm.h
index cd9c4527b3..e8bee055d2 100644
--- a/deps/v8/src/execution/arm/frame-constants-arm.h
+++ b/deps/v8/src/execution/arm/frame-constants-arm.h
@@ -7,21 +7,53 @@
#include "src/base/bits.h"
#include "src/base/macros.h"
+#include "src/codegen/arm/register-arm.h"
#include "src/execution/frame-constants.h"
namespace v8 {
namespace internal {
+// The layout of an EntryFrame is as follows:
+// TOP OF THE STACK LOWEST ADDRESS
+// +---------------------+-----------------------
+// 0 | bad frame pointer | <-- frame ptr
+// | (0xFFF.. FF) |
+// |- - - - - - - - - - -|
+// 1..2 | saved register d8 |
+// ... | ... |
+// 15..16 | saved register d15 |
+// |- - - - - - - - - - -|
+// 17 | saved register r4 |
+// ... | ... |
+// 23 | saved register r10 |
+// |- - - - - - - - - - -|
+// 24 | saved fp (r11) |
+// |- - - - - - - - - - -|
+// 25 | saved lr (r14) |
+// -----+---------------------+-----------------------
+// BOTTOM OF THE STACK HIGHEST ADDRESS
class EntryFrameConstants : public AllStatic {
public:
// This is the offset to where JSEntry pushes the current value of
// Isolate::c_entry_fp onto the stack.
- static constexpr int kCallerFPOffset =
- -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
+ static constexpr int kCallerFPOffset = -3 * kSystemPointerSize;
// Stack offsets for arguments passed to JSEntry.
static constexpr int kArgcOffset = +0 * kSystemPointerSize;
static constexpr int kArgvOffset = +1 * kSystemPointerSize;
+
+ // These offsets refer to the immediate caller (i.e a native frame).
+ static constexpr int kDirectCallerFPOffset =
+ /* bad frame pointer (-1) */
+ kPointerSize +
+ /* d8...d15 */
+ kNumDoubleCalleeSaved * kDoubleSize +
+ /* r4...r10 (i.e callee saved without fp) */
+ (kNumCalleeSaved - 1) * kPointerSize;
+ static constexpr int kDirectCallerPCOffset =
+ kDirectCallerFPOffset + 1 * kSystemPointerSize;
+ static constexpr int kDirectCallerSPOffset =
+ kDirectCallerPCOffset + 1 * kSystemPointerSize;
};
class WasmCompileLazyFrameConstants : public TypedFrameConstants {
diff --git a/deps/v8/src/execution/arm/simulator-arm.cc b/deps/v8/src/execution/arm/simulator-arm.cc
index d0031d557a..3c6368d8f5 100644
--- a/deps/v8/src/execution/arm/simulator-arm.cc
+++ b/deps/v8/src/execution/arm/simulator-arm.cc
@@ -248,7 +248,7 @@ void ArmDebugger::Debug() {
PrintF("\n");
}
}
- for (int i = 0; i < DwVfpRegister::NumRegisters(); i++) {
+ for (int i = 0; i < DwVfpRegister::SupportedRegisterCount(); i++) {
dvalue = GetVFPDoubleRegisterValue(i);
uint64_t as_words = bit_cast<uint64_t>(dvalue);
PrintF("%3s: %f 0x%08x %08x\n", VFPRegisters::Name(i, true),
@@ -753,22 +753,22 @@ void Simulator::set_dw_register(int dreg, const int* dbl) {
}
void Simulator::get_d_register(int dreg, uint64_t* value) {
- DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters()));
+ DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value));
}
void Simulator::set_d_register(int dreg, const uint64_t* value) {
- DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters()));
+ DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value));
}
void Simulator::get_d_register(int dreg, uint32_t* value) {
- DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters()));
+ DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value) * 2);
}
void Simulator::set_d_register(int dreg, const uint32_t* value) {
- DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters()));
+ DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount()));
memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value) * 2);
}
@@ -818,7 +818,8 @@ void Simulator::SetVFPRegister(int reg_index, const InputType& value) {
DCHECK_EQ(sizeof(InputType), bytes);
DCHECK_GE(reg_index, 0);
if (register_size == 1) DCHECK(reg_index < num_s_registers);
- if (register_size == 2) DCHECK(reg_index < DwVfpRegister::NumRegisters());
+ if (register_size == 2)
+ DCHECK(reg_index < DwVfpRegister::SupportedRegisterCount());
memcpy(&vfp_registers_[reg_index * register_size], &value, bytes);
}
@@ -829,7 +830,8 @@ ReturnType Simulator::GetFromVFPRegister(int reg_index) {
DCHECK_EQ(sizeof(ReturnType), bytes);
DCHECK_GE(reg_index, 0);
if (register_size == 1) DCHECK(reg_index < num_s_registers);
- if (register_size == 2) DCHECK(reg_index < DwVfpRegister::NumRegisters());
+ if (register_size == 2)
+ DCHECK(reg_index < DwVfpRegister::SupportedRegisterCount());
ReturnType value;
memcpy(&value, &vfp_registers_[register_size * reg_index], bytes);
@@ -4610,9 +4612,13 @@ void Simulator::DecodeSpecialCondition(Instruction* instr) {
} else {
// vmin/vmax.f32 Qd, Qm, Qn.
bool min = instr->Bit(21) == 1;
+ bool saved = FPSCR_default_NaN_mode_;
+ FPSCR_default_NaN_mode_ = true;
for (int i = 0; i < 4; i++) {
- src1[i] = MinMax(src1[i], src2[i], min);
+ // vmin returns default NaN if any input is NaN.
+ src1[i] = canonicalizeNaN(MinMax(src1[i], src2[i], min));
}
+ FPSCR_default_NaN_mode_ = saved;
}
set_neon_register(Vd, src1);
} else {
diff --git a/deps/v8/src/execution/arm64/frame-constants-arm64.cc b/deps/v8/src/execution/arm64/frame-constants-arm64.cc
index 607081a562..94d12f058f 100644
--- a/deps/v8/src/execution/arm64/frame-constants-arm64.cc
+++ b/deps/v8/src/execution/arm64/frame-constants-arm64.cc
@@ -20,8 +20,11 @@ Register JavaScriptFrame::context_register() { return cp; }
Register JavaScriptFrame::constant_pool_pointer_register() { UNREACHABLE(); }
int InterpreterFrameConstants::RegisterStackSlotCount(int register_count) {
- // Round up to a multiple of two, to make the frame a multiple of 16 bytes.
- return RoundUp(register_count, 2);
+ STATIC_ASSERT(InterpreterFrameConstants::kFixedFrameSize % 16 == 8);
+ // Interpreter frame header size is not 16-bytes aligned, so we'll need at
+ // least one register slot to make the frame a multiple of 16 bytes. The code
+ // below is equivalent to "RoundUp(register_count - 1, 2) + 1".
+ return RoundDown(register_count, 2) + 1;
}
int BuiltinContinuationFrameConstants::PaddingSlotCount(int register_count) {
diff --git a/deps/v8/src/execution/arm64/frame-constants-arm64.h b/deps/v8/src/execution/arm64/frame-constants-arm64.h
index 4a09e5b911..409fcec504 100644
--- a/deps/v8/src/execution/arm64/frame-constants-arm64.h
+++ b/deps/v8/src/execution/arm64/frame-constants-arm64.h
@@ -110,7 +110,7 @@ class WasmDebugBreakFrameConstants : public TypedFrameConstants {
-RoundUp<16>(TypedFrameConstants::kFixedFrameSizeFromFp) -
kSystemPointerSize * kNumPushedGpRegisters;
static constexpr int kLastPushedFpRegisterOffset =
- kLastPushedGpRegisterOffset - kDoubleSize * kNumPushedFpRegisters;
+ kLastPushedGpRegisterOffset - kSimd128Size * kNumPushedFpRegisters;
// Offsets are fp-relative.
static int GetPushedGpRegisterOffset(int reg_code) {
@@ -124,7 +124,7 @@ class WasmDebugBreakFrameConstants : public TypedFrameConstants {
DCHECK_NE(0, kPushedFpRegs & (1 << reg_code));
uint32_t lower_regs = kPushedFpRegs & ((uint32_t{1} << reg_code) - 1);
return kLastPushedFpRegisterOffset +
- base::bits::CountPopulation(lower_regs) * kDoubleSize;
+ base::bits::CountPopulation(lower_regs) * kSimd128Size;
}
};
diff --git a/deps/v8/src/execution/arm64/pointer-authentication-arm64.h b/deps/v8/src/execution/arm64/pointer-authentication-arm64.h
index e4bc476b3d..ec7f8d1850 100644
--- a/deps/v8/src/execution/arm64/pointer-authentication-arm64.h
+++ b/deps/v8/src/execution/arm64/pointer-authentication-arm64.h
@@ -60,24 +60,6 @@ V8_INLINE Address PointerAuthentication::StripPAC(Address pc) {
#endif
}
-// Sign {pc} using {sp}.
-V8_INLINE Address PointerAuthentication::SignPCWithSP(Address pc, Address sp) {
-#ifdef USE_SIMULATOR
- return Simulator::AddPAC(pc, sp, Simulator::kPACKeyIB,
- Simulator::kInstructionPointer);
-#else
- asm volatile(
- " mov x17, %[pc]\n"
- " mov x16, %[sp]\n"
- " pacib1716\n"
- " mov %[pc], x17\n"
- : [pc] "+r"(pc)
- : [sp] "r"(sp)
- : "x16", "x17");
- return pc;
-#endif
-}
-
// Authenticate the address stored in {pc_address} and replace it with
// {new_pc}, after signing it. {offset_from_sp} is the offset between
// {pc_address} and the pointer used as a context for signing.
@@ -113,43 +95,27 @@ V8_INLINE void PointerAuthentication::ReplacePC(Address* pc_address,
*pc_address = new_pc;
}
-// Authenticate the address stored in {pc_address} based on {old_context} and
-// replace it with the same address signed with {new_context} instead.
-V8_INLINE void PointerAuthentication::ReplaceContext(Address* pc_address,
- Address old_context,
- Address new_context) {
- uint64_t old_signed_pc = static_cast<uint64_t>(*pc_address);
- uint64_t new_pc;
+
+// Sign {pc} using {sp}.
+V8_INLINE Address PointerAuthentication::SignAndCheckPC(Address pc,
+ Address sp) {
#ifdef USE_SIMULATOR
- uint64_t auth_pc =
- Simulator::AuthPAC(old_signed_pc, old_context, Simulator::kPACKeyIB,
- Simulator::kInstructionPointer);
- uint64_t raw_pc =
- Simulator::StripPAC(auth_pc, Simulator::kInstructionPointer);
- // Verify that the old address is authenticated.
- CHECK_EQ(raw_pc, auth_pc);
- new_pc = Simulator::AddPAC(raw_pc, new_context, Simulator::kPACKeyIB,
- Simulator::kInstructionPointer);
+ pc = Simulator::AddPAC(pc, sp, Simulator::kPACKeyIB,
+ Simulator::kInstructionPointer);
+ CHECK(Deoptimizer::IsValidReturnAddress(PointerAuthentication::StripPAC(pc)));
+ return pc;
#else
- // Only store newly signed address after we have verified that the old
- // address is authenticated.
asm volatile(
- " mov x17, %[old_pc]\n"
- " mov x16, %[old_ctx]\n"
- " autib1716\n"
- " mov x16, %[new_ctx]\n"
- " pacib1716\n"
- " mov %[new_pc], x17\n"
- " mov x17, %[old_pc]\n"
- " mov x16, %[old_ctx]\n"
- " autib1716\n"
- " ldr xzr, [x17]\n"
- : [new_pc] "=&r"(new_pc)
- : [old_pc] "r"(old_signed_pc), [old_ctx] "r"(old_context),
- [new_ctx] "r"(new_context)
- : "x16", "x17");
+ " mov x17, %[pc]\n"
+ " mov x16, %[sp]\n"
+ " pacib1716\n"
+ " mov %[pc], x17\n"
+ : [pc] "+r"(pc)
+ : [sp] "r"(sp)
+ : "x16", "x17");
+ CHECK(Deoptimizer::IsValidReturnAddress(PointerAuthentication::StripPAC(pc)));
+ return pc;
#endif
- *pc_address = new_pc;
}
// clang-format on
diff --git a/deps/v8/src/execution/frame-constants.h b/deps/v8/src/execution/frame-constants.h
index 4809eeca80..6c037451a2 100644
--- a/deps/v8/src/execution/frame-constants.h
+++ b/deps/v8/src/execution/frame-constants.h
@@ -76,7 +76,9 @@ class CommonFrameConstants : public AllStatic {
// StandardFrames are used for interpreted and optimized JavaScript
// frames. They always have a context below the saved fp/constant
-// pool and below that the JSFunction of the executing function.
+// pool, below that the JSFunction of the executing function and below that an
+// integer (not a Smi) containing the actual number of arguments passed to the
+// JavaScript code.
//
// slot JS frame
// +-----------------+--------------------------------
@@ -96,11 +98,13 @@ class CommonFrameConstants : public AllStatic {
// |- - - - - - - - -| | |
// 2+cp | Context | | if a constant pool |
// |- - - - - - - - -| | is used, cp = 1, |
-// 3+cp | JSFunction | v otherwise, cp = 0 |
+// 3+cp | JSFunction | | otherwise, cp = 0 |
+// |- - - - - - - - -| | |
+// 4+cp | argc | v |
// +-----------------+---- |
-// 4+cp | | ^ Callee
+// 5+cp | expressions or | ^ Callee
// |- - - - - - - - -| | frame slots
-// ... | | Frame slots (slot >= 0)
+// ... | pushed values | Frame slots (slot >= 0)
// |- - - - - - - - -| | |
// | | v |
// -----+-----------------+----- <-- stack ptr -------------
@@ -108,7 +112,7 @@ class CommonFrameConstants : public AllStatic {
class StandardFrameConstants : public CommonFrameConstants {
public:
static constexpr int kFixedFrameSizeFromFp =
- 2 * kSystemPointerSize + kCPSlotSize;
+ 3 * kSystemPointerSize + kCPSlotSize;
static constexpr int kFixedFrameSize =
kFixedFrameSizeAboveFp + kFixedFrameSizeFromFp;
static constexpr int kFixedSlotCountFromFp =
@@ -116,53 +120,13 @@ class StandardFrameConstants : public CommonFrameConstants {
static constexpr int kFixedSlotCount = kFixedFrameSize / kSystemPointerSize;
static constexpr int kContextOffset = kContextOrFrameTypeOffset;
static constexpr int kFunctionOffset = -2 * kSystemPointerSize - kCPSlotSize;
+ static constexpr int kArgCOffset = -3 * kSystemPointerSize - kCPSlotSize;
static constexpr int kExpressionsOffset =
- -3 * kSystemPointerSize - kCPSlotSize;
+ -4 * kSystemPointerSize - kCPSlotSize;
+ static constexpr int kFirstPushedFrameValueOffset = kExpressionsOffset;
static constexpr int kLastObjectOffset = kContextOffset;
};
-// OptimizedBuiltinFrameConstants are used for TF-generated builtins. They
-// always have a context below the saved fp/constant pool and below that the
-// JSFunction of the executing function and below that an integer (not a Smi)
-// containing the number of arguments passed to the builtin.
-//
-// slot JS frame
-// +-----------------+--------------------------------
-// -n-1 | parameter 0 | ^
-// |- - - - - - - - -| |
-// -n | | Caller
-// ... | ... | frame slots
-// -2 | parameter n-1 | (slot < 0)
-// |- - - - - - - - -| |
-// -1 | parameter n | v
-// -----+-----------------+--------------------------------
-// 0 | return addr | ^ ^
-// |- - - - - - - - -| | |
-// 1 | saved frame ptr | Fixed |
-// |- - - - - - - - -| Header <-- frame ptr |
-// 2 | [Constant Pool] | | |
-// |- - - - - - - - -| | |
-// 2+cp | Context | | if a constant pool |
-// |- - - - - - - - -| | is used, cp = 1, |
-// 3+cp | JSFunction | | otherwise, cp = 0 |
-// |- - - - - - - - -| | |
-// 4+cp | argc | v |
-// +-----------------+---- |
-// 5+cp | | ^ Callee
-// |- - - - - - - - -| | frame slots
-// ... | | Frame slots (slot >= 0)
-// |- - - - - - - - -| | |
-// | | v |
-// -----+-----------------+----- <-- stack ptr -------------
-//
-class OptimizedBuiltinFrameConstants : public StandardFrameConstants {
- public:
- static constexpr int kArgCSize = kSystemPointerSize;
- static constexpr int kArgCOffset = -3 * kSystemPointerSize - kCPSlotSize;
- static constexpr int kFixedFrameSize = kFixedFrameSizeAboveFp - kArgCOffset;
- static constexpr int kFixedSlotCount = kFixedFrameSize / kSystemPointerSize;
-};
-
// TypedFrames have a type maker value below the saved FP/constant pool to
// distinguish them from StandardFrames, which have a context in that position
// instead.
@@ -185,9 +149,9 @@ class OptimizedBuiltinFrameConstants : public StandardFrameConstants {
// |- - - - - - - - -| | |
// 2+cp |Frame Type Marker| v if a constant pool |
// |-----------------+---- is used, cp = 1, |
-// 3+cp | | ^ otherwise, cp = 0 |
+// 3+cp | pushed value 0 | ^ otherwise, cp = 0 |
// |- - - - - - - - -| | |
-// 4+cp | | | Callee
+// 4+cp | pushed value 1 | | Callee
// |- - - - - - - - -| | frame slots
// ... | | Frame slots (slot >= 0)
// |- - - - - - - - -| | |
@@ -208,19 +172,32 @@ class TypedFrameConstants : public CommonFrameConstants {
-kFixedFrameSizeFromFp - kSystemPointerSize;
};
-#define TYPED_FRAME_PUSHED_VALUE_OFFSET(x) \
- (TypedFrameConstants::kFirstPushedFrameValueOffset - (x)*kSystemPointerSize)
-#define TYPED_FRAME_SIZE(count) \
- (TypedFrameConstants::kFixedFrameSize + (count)*kSystemPointerSize)
-#define TYPED_FRAME_SIZE_FROM_FP(count) \
- (TypedFrameConstants::kFixedFrameSizeFromFp + (count)*kSystemPointerSize)
-#define DEFINE_TYPED_FRAME_SIZES(count) \
- static constexpr int kFixedFrameSize = TYPED_FRAME_SIZE(count); \
+#define FRAME_PUSHED_VALUE_OFFSET(parent, x) \
+ (parent::kFirstPushedFrameValueOffset - (x)*kSystemPointerSize)
+#define FRAME_SIZE(parent, count) \
+ (parent::kFixedFrameSize + (count)*kSystemPointerSize)
+#define FRAME_SIZE_FROM_FP(parent, count) \
+ (parent::kFixedFrameSizeFromFp + (count)*kSystemPointerSize)
+#define DEFINE_FRAME_SIZES(parent, count) \
+ static constexpr int kFixedFrameSize = FRAME_SIZE(parent, count); \
static constexpr int kFixedSlotCount = kFixedFrameSize / kSystemPointerSize; \
static constexpr int kFixedFrameSizeFromFp = \
- TYPED_FRAME_SIZE_FROM_FP(count); \
+ FRAME_SIZE_FROM_FP(parent, count); \
static constexpr int kFixedSlotCountFromFp = \
- kFixedFrameSizeFromFp / kSystemPointerSize
+ kFixedFrameSizeFromFp / kSystemPointerSize; \
+ static constexpr int kExtraSlotCount = \
+ kFixedFrameSize / kSystemPointerSize - \
+ parent::kFixedFrameSize / kSystemPointerSize
+
+#define STANDARD_FRAME_EXTRA_PUSHED_VALUE_OFFSET(x) \
+ FRAME_PUSHED_VALUE_OFFSET(StandardFrameConstants, x)
+#define DEFINE_STANDARD_FRAME_SIZES(count) \
+ DEFINE_FRAME_SIZES(StandardFrameConstants, count)
+
+#define TYPED_FRAME_PUSHED_VALUE_OFFSET(x) \
+ FRAME_PUSHED_VALUE_OFFSET(TypedFrameConstants, x)
+#define DEFINE_TYPED_FRAME_SIZES(count) \
+ DEFINE_FRAME_SIZES(TypedFrameConstants, count)
class ArgumentsAdaptorFrameConstants : public TypedFrameConstants {
public:
@@ -306,7 +283,7 @@ class ExitFrameConstants : public TypedFrameConstants {
};
// Behaves like an exit frame but with target and new target args.
-class BuiltinExitFrameConstants : public CommonFrameConstants {
+class BuiltinExitFrameConstants : public ExitFrameConstants {
public:
static constexpr int kNewTargetOffset =
kCallerPCOffset + 1 * kSystemPointerSize;
@@ -319,15 +296,15 @@ class BuiltinExitFrameConstants : public CommonFrameConstants {
static constexpr int kNumExtraArgsWithReceiver = 5;
};
-class InterpreterFrameConstants : public AllStatic {
+class InterpreterFrameConstants : public StandardFrameConstants {
public:
- // Fixed frame includes bytecode array and bytecode offset.
- static constexpr int kFixedFrameSize =
- StandardFrameConstants::kFixedFrameSize + 2 * kSystemPointerSize;
- static constexpr int kFixedFrameSizeFromFp =
- StandardFrameConstants::kFixedFrameSizeFromFp + 2 * kSystemPointerSize;
-
// FP-relative.
+ static constexpr int kBytecodeArrayFromFp =
+ STANDARD_FRAME_EXTRA_PUSHED_VALUE_OFFSET(0);
+ static constexpr int kBytecodeOffsetFromFp =
+ STANDARD_FRAME_EXTRA_PUSHED_VALUE_OFFSET(1);
+ DEFINE_STANDARD_FRAME_SIZES(2);
+
#ifdef V8_REVERSE_JSARGS
static constexpr int kFirstParamFromFp =
StandardFrameConstants::kCallerSPOffset;
@@ -335,22 +312,10 @@ class InterpreterFrameConstants : public AllStatic {
static constexpr int kLastParamFromFp =
StandardFrameConstants::kCallerSPOffset;
#endif
- static constexpr int kCallerPCOffsetFromFp =
- StandardFrameConstants::kCallerPCOffset;
- static constexpr int kBytecodeArrayFromFp =
- -StandardFrameConstants::kFixedFrameSizeFromFp - 1 * kSystemPointerSize;
- static constexpr int kBytecodeOffsetFromFp =
- -StandardFrameConstants::kFixedFrameSizeFromFp - 2 * kSystemPointerSize;
static constexpr int kRegisterFileFromFp =
- -StandardFrameConstants::kFixedFrameSizeFromFp - 3 * kSystemPointerSize;
-
+ -kFixedFrameSizeFromFp - kSystemPointerSize;
static constexpr int kExpressionsOffset = kRegisterFileFromFp;
- // Number of fixed slots in addition to a {StandardFrame}.
- static constexpr int kExtraSlotCount =
- InterpreterFrameConstants::kFixedFrameSize / kSystemPointerSize -
- StandardFrameConstants::kFixedFrameSize / kSystemPointerSize;
-
// Expression index for {StandardFrame::GetExpressionAddress}.
static constexpr int kBytecodeArrayExpressionIndex = -2;
static constexpr int kBytecodeOffsetExpressionIndex = -1;
diff --git a/deps/v8/src/execution/frames-inl.h b/deps/v8/src/execution/frames-inl.h
index d23249c7f1..e56db9ee4a 100644
--- a/deps/v8/src/execution/frames-inl.h
+++ b/deps/v8/src/execution/frames-inl.h
@@ -202,9 +202,14 @@ inline JavaScriptFrame::JavaScriptFrame(StackFrameIteratorBase* iterator)
: StandardFrame(iterator) {}
Address JavaScriptFrame::GetParameterSlot(int index) const {
- DCHECK(-1 <= index &&
- (index < ComputeParametersCount() ||
- ComputeParametersCount() == kDontAdaptArgumentsSentinel));
+ DCHECK_LE(-1, index);
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ DCHECK_LT(index,
+ std::max(GetActualArgumentsCount(), ComputeParametersCount()));
+#else
+ DCHECK(index < ComputeParametersCount() ||
+ ComputeParametersCount() == kDontAdaptArgumentsSentinel);
+#endif
#ifdef V8_REVERSE_JSARGS
int parameter_offset = (index + 1) * kSystemPointerSize;
#else
@@ -335,7 +340,7 @@ inline StackFrame* SafeStackFrameIterator::frame() const {
DCHECK(!done());
DCHECK(frame_->is_java_script() || frame_->is_exit() ||
frame_->is_builtin_exit() || frame_->is_wasm() ||
- frame_->is_wasm_to_js());
+ frame_->is_wasm_to_js() || frame_->is_js_to_wasm());
return frame_;
}
diff --git a/deps/v8/src/execution/frames.cc b/deps/v8/src/execution/frames.cc
index b77e4bcf65..d7aa13c3ec 100644
--- a/deps/v8/src/execution/frames.cc
+++ b/deps/v8/src/execution/frames.cc
@@ -181,6 +181,14 @@ void StackTraceFrameIterator::Advance() {
} while (!done() && !IsValidFrame(iterator_.frame()));
}
+int StackTraceFrameIterator::FrameFunctionCount() const {
+ DCHECK(!done());
+ if (!iterator_.frame()->is_optimized()) return 1;
+ std::vector<SharedFunctionInfo> infos;
+ OptimizedFrame::cast(iterator_.frame())->GetFunctions(&infos);
+ return static_cast<int>(infos.size());
+}
+
bool StackTraceFrameIterator::IsValidFrame(StackFrame* frame) const {
if (frame->is_java_script()) {
JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame);
@@ -458,7 +466,7 @@ void SafeStackFrameIterator::Advance() {
external_callback_scope_ = external_callback_scope_->previous();
}
if (frame_->is_java_script() || frame_->is_wasm() ||
- frame_->is_wasm_to_js()) {
+ frame_->is_wasm_to_js() || frame_->is_js_to_wasm()) {
break;
}
if (frame_->is_exit() || frame_->is_builtin_exit()) {
@@ -952,7 +960,8 @@ void StandardFrame::IterateCompiledFrame(RootVisitor* v) const {
int frame_header_size = StandardFrameConstants::kFixedFrameSizeFromFp;
intptr_t marker =
Memory<intptr_t>(fp() + CommonFrameConstants::kContextOrFrameTypeOffset);
- if (StackFrame::IsTypeMarker(marker)) {
+ bool typed_frame = StackFrame::IsTypeMarker(marker);
+ if (typed_frame) {
StackFrame::Type candidate = StackFrame::MarkerToType(marker);
switch (candidate) {
case ENTRY:
@@ -1062,6 +1071,11 @@ void StandardFrame::IterateCompiledFrame(RootVisitor* v) const {
// If this frame has JavaScript ABI, visit the context (in stub and JS
// frames) and the function (in JS frames). If it has WebAssembly ABI, visit
// the instance object.
+ if (!typed_frame) {
+ // JavaScript ABI frames also contain arguments count value which is stored
+ // untagged, we don't need to visit it.
+ frame_header_base += 1;
+ }
v->VisitRootPointers(Root::kTop, nullptr, frame_header_base,
frame_header_limit);
}
@@ -1112,7 +1126,7 @@ int OptimizedFrame::ComputeParametersCount() const {
Code code = LookupCode();
if (code.kind() == CodeKind::BUILTIN) {
return static_cast<int>(
- Memory<intptr_t>(fp() + OptimizedBuiltinFrameConstants::kArgCOffset));
+ Memory<intptr_t>(fp() + StandardFrameConstants::kArgCOffset));
} else {
return JavaScriptFrame::ComputeParametersCount();
}
@@ -1282,6 +1296,13 @@ int JavaScriptFrame::ComputeParametersCount() const {
return function().shared().internal_formal_parameter_count();
}
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+int JavaScriptFrame::GetActualArgumentCount() const {
+ return static_cast<int>(
+ Memory<intptr_t>(fp() + StandardFrameConstants::kArgCOffset));
+}
+#endif
+
Handle<FixedArray> JavaScriptFrame::GetParameters() const {
if (V8_LIKELY(!FLAG_detailed_error_stack_trace)) {
return isolate()->factory()->empty_fixed_array();
@@ -1636,7 +1657,7 @@ Object OptimizedFrame::receiver() const {
Code code = LookupCode();
if (code.kind() == CodeKind::BUILTIN) {
intptr_t argc = static_cast<int>(
- Memory<intptr_t>(fp() + OptimizedBuiltinFrameConstants::kArgCOffset));
+ Memory<intptr_t>(fp() + StandardFrameConstants::kArgCOffset));
intptr_t args_size =
(StandardFrameConstants::kFixedSlotCountAboveFp + argc) *
kSystemPointerSize;
@@ -1794,7 +1815,8 @@ void InterpretedFrame::Summarize(std::vector<FrameSummary>* functions) const {
}
int ArgumentsAdaptorFrame::ComputeParametersCount() const {
- return Smi::ToInt(GetExpression(0));
+ const int offset = ArgumentsAdaptorFrameConstants::kLengthOffset;
+ return Smi::ToInt(Object(base::Memory<Address>(fp() + offset)));
}
Code ArgumentsAdaptorFrame::unchecked_code() const {
@@ -1802,7 +1824,8 @@ Code ArgumentsAdaptorFrame::unchecked_code() const {
}
int BuiltinFrame::ComputeParametersCount() const {
- return Smi::ToInt(GetExpression(0));
+ const int offset = BuiltinFrameConstants::kLengthOffset;
+ return Smi::ToInt(Object(base::Memory<Address>(fp() + offset)));
}
void BuiltinFrame::PrintFrameKind(StringStream* accumulator) const {
@@ -1964,17 +1987,17 @@ void JsToWasmFrame::Iterate(RootVisitor* v) const {
// GenericJSToWasmWrapper stack layout
// ------+-----------------+----------------------
// | return addr |
- // rbp |- - - - - - - - -| <-fp() -------------|
- // | rbp | |
- // rbp-p |- - - - - - - - -| |
+ // fp |- - - - - - - - -| -------------------|
+ // | fp | |
+ // fp-p |- - - - - - - - -| |
// | frame marker | | no GC scan
- // rbp-2p | - - - - - - - - | <- spill_slot_limit |
- // | signature_type | |
- // rbp-3p |- - - - - - - - -| -------------------|
- // | .... | |
- // | spill slots | | GC scan
- // | .... |<- spill_slot_base |
- // |- - - - - - - - -| -------------------|
+ // fp-2p |- - - - - - - - -| |
+ // | scan_count | |
+ // fp-3p |- - - - - - - - -| -------------------|
+ // | .... | <- spill_slot_limit |
+ // | spill slots | | GC scan scan_count slots
+ // | .... | <- spill_slot_base--|
+ // |- - - - - - - - -| |
if (code.is_null() || !code.is_builtin() ||
code.builtin_index() != Builtins::kGenericJSToWasmWrapper) {
// If it's not the GenericJSToWasmWrapper, then it's the TurboFan compiled
@@ -1982,9 +2005,14 @@ void JsToWasmFrame::Iterate(RootVisitor* v) const {
IterateCompiledFrame(v);
return;
}
+ // The [fp - 2*kSystemPointerSize] on the stack is a value indicating how
+ // many values should be scanned from the top.
+ intptr_t scan_count =
+ *reinterpret_cast<intptr_t*>(fp() - 2 * kSystemPointerSize);
+
FullObjectSlot spill_slot_base(&Memory<Address>(sp()));
FullObjectSlot spill_slot_limit(
- &Memory<Address>(fp() - 2 * kSystemPointerSize));
+ &Memory<Address>(sp() + scan_count * kSystemPointerSize));
v->VisitRootPointers(Root::kTop, nullptr, spill_slot_base, spill_slot_limit);
}
@@ -2174,10 +2202,21 @@ void EntryFrame::Iterate(RootVisitor* v) const {
}
void StandardFrame::IterateExpressions(RootVisitor* v) const {
- const int offset = StandardFrameConstants::kLastObjectOffset;
+ const int last_object_offset = StandardFrameConstants::kLastObjectOffset;
+ intptr_t marker =
+ Memory<intptr_t>(fp() + CommonFrameConstants::kContextOrFrameTypeOffset);
FullObjectSlot base(&Memory<Address>(sp()));
- FullObjectSlot limit(&Memory<Address>(fp() + offset) + 1);
- v->VisitRootPointers(Root::kTop, nullptr, base, limit);
+ FullObjectSlot limit(&Memory<Address>(fp() + last_object_offset) + 1);
+ if (StackFrame::IsTypeMarker(marker)) {
+ v->VisitRootPointers(Root::kTop, nullptr, base, limit);
+ } else {
+ // The frame contains the actual argument count (intptr) that should not be
+ // visited.
+ FullObjectSlot argc(
+ &Memory<Address>(fp() + StandardFrameConstants::kArgCOffset));
+ v->VisitRootPointers(Root::kTop, nullptr, base, argc);
+ v->VisitRootPointers(Root::kTop, nullptr, argc + 1, limit);
+ }
}
void JavaScriptFrame::Iterate(RootVisitor* v) const {
diff --git a/deps/v8/src/execution/frames.h b/deps/v8/src/execution/frames.h
index b04d0e0140..eb627a158a 100644
--- a/deps/v8/src/execution/frames.h
+++ b/deps/v8/src/execution/frames.h
@@ -205,6 +205,7 @@ class StackFrame {
(type == JAVA_SCRIPT_BUILTIN_CONTINUATION_WITH_CATCH);
}
bool is_wasm_to_js() const { return type() == WASM_TO_JS; }
+ bool is_js_to_wasm() const { return type() == JS_TO_WASM; }
// Accessors.
Address sp() const { return state_.sp; }
@@ -669,6 +670,9 @@ class JavaScriptFrame : public StandardFrame {
inline Address GetParameterSlot(int index) const;
Object GetParameter(int index) const override;
int ComputeParametersCount() const override;
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ int GetActualArgumentCount() const;
+#endif
Handle<FixedArray> GetParameters() const;
// Debugger access.
@@ -1230,6 +1234,7 @@ class V8_EXPORT_PRIVATE StackTraceFrameIterator {
bool done() const { return iterator_.done(); }
void Advance();
void AdvanceOneFrame() { iterator_.Advance(); }
+ int FrameFunctionCount() const;
inline StandardFrame* frame() const;
diff --git a/deps/v8/src/execution/isolate.cc b/deps/v8/src/execution/isolate.cc
index bd357d4bfc..c1c3bd1b24 100644
--- a/deps/v8/src/execution/isolate.cc
+++ b/deps/v8/src/execution/isolate.cc
@@ -26,6 +26,7 @@
#include "src/codegen/assembler-inl.h"
#include "src/codegen/compilation-cache.h"
#include "src/codegen/flush-instruction-cache.h"
+#include "src/common/assert-scope.h"
#include "src/common/ptr-compr.h"
#include "src/compiler-dispatcher/compiler-dispatcher.h"
#include "src/compiler-dispatcher/optimizing-compile-dispatcher.h"
@@ -99,6 +100,10 @@
#include "src/diagnostics/unwinding-info-win64.h"
#endif // V8_OS_WIN64
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+#include "src/heap/conservative-stack-visitor.h"
+#endif
+
extern "C" const uint8_t* v8_Default_embedded_blob_code_;
extern "C" uint32_t v8_Default_embedded_blob_code_size_;
extern "C" const uint8_t* v8_Default_embedded_blob_metadata_;
@@ -505,6 +510,11 @@ void Isolate::Iterate(RootVisitor* v, ThreadLocalTop* thread) {
FullObjectSlot(reinterpret_cast<Address>(&(block->message_obj_))));
}
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ ConservativeStackVisitor stack_visitor(this, v);
+ thread_local_top()->stack_.IteratePointers(&stack_visitor);
+#endif
+
// Iterate over pointers on native execution stack.
wasm::WasmCodeRefScope wasm_code_ref_scope;
for (StackFrameIterator it(this, thread); !it.done(); it.Advance()) {
@@ -1588,7 +1598,8 @@ Object Isolate::Throw(Object raw_exception, MessageLocation* location) {
// Script::GetLineNumber and Script::GetColumnNumber can allocate on the heap to
// initialize the line_ends array, so be careful when calling them.
#ifdef DEBUG
- if (AllowHeapAllocation::IsAllowed()) {
+ if (AllowHeapAllocation::IsAllowed() &&
+ AllowGarbageCollection::IsAllowed()) {
#else
if ((false)) {
#endif
@@ -3068,7 +3079,8 @@ void Isolate::Deinit() {
cancelable_task_manager()->CancelAndWait();
heap_.TearDown();
- logger_->TearDown();
+ FILE* logfile = logger_->TearDownAndGetLogFile();
+ if (logfile != nullptr) fclose(logfile);
if (wasm_engine_) {
wasm_engine_->RemoveIsolate(this);
@@ -3324,6 +3336,8 @@ void Isolate::CreateAndSetEmbeddedBlob() {
PrepareBuiltinSourcePositionMap();
+ PrepareBuiltinLabelInfoMap();
+
// If a sticky blob has been set, we reuse it.
if (StickyEmbeddedBlobCode() != nullptr) {
CHECK_EQ(embedded_blob_code(), StickyEmbeddedBlobCode());
@@ -3472,7 +3486,7 @@ bool Isolate::Init(ReadOnlyDeserializer* read_only_deserializer,
date_cache_ = new DateCache();
heap_profiler_ = new HeapProfiler(heap());
interpreter_ = new interpreter::Interpreter(this);
- string_table_.reset(new StringTable());
+ string_table_.reset(new StringTable(this));
compiler_dispatcher_ =
new CompilerDispatcher(this, V8::GetCurrentPlatform(), FLAG_stack_size);
@@ -4198,6 +4212,15 @@ void Isolate::PrepareBuiltinSourcePositionMap() {
}
}
+void Isolate::PrepareBuiltinLabelInfoMap() {
+ if (embedded_file_writer_ != nullptr) {
+ embedded_file_writer_->PrepareBuiltinLabelInfoMap(
+ heap()->construct_stub_create_deopt_pc_offset().value(),
+ heap()->construct_stub_invoke_deopt_pc_offset().value(),
+ heap()->arguments_adaptor_deopt_pc_offset().value());
+ }
+}
+
#if defined(V8_OS_WIN64)
void Isolate::SetBuiltinUnwindData(
int builtin_index,
@@ -4362,13 +4385,6 @@ void Isolate::CountUsage(v8::Isolate::UseCounterFeature feature) {
int Isolate::GetNextScriptId() { return heap()->NextScriptId(); }
-int Isolate::GetNextStackFrameInfoId() {
- int id = last_stack_frame_info_id();
- int next_id = id == Smi::kMaxValue ? 0 : (id + 1);
- set_last_stack_frame_info_id(next_id);
- return next_id;
-}
-
// static
std::string Isolate::GetTurboCfgFileName(Isolate* isolate) {
if (FLAG_trace_turbo_cfg_file == nullptr) {
@@ -4569,11 +4585,33 @@ SaveAndSwitchContext::SaveAndSwitchContext(Isolate* isolate,
#ifdef DEBUG
AssertNoContextChange::AssertNoContextChange(Isolate* isolate)
: isolate_(isolate), context_(isolate->context(), isolate) {}
+
+namespace {
+
+bool Overlapping(const MemoryRange& a, const MemoryRange& b) {
+ uintptr_t a1 = reinterpret_cast<uintptr_t>(a.start);
+ uintptr_t a2 = a1 + a.length_in_bytes;
+ uintptr_t b1 = reinterpret_cast<uintptr_t>(b.start);
+ uintptr_t b2 = b1 + b.length_in_bytes;
+ // Either b1 or b2 are in the [a1, a2) range.
+ return (a1 <= b1 && b1 < a2) || (a1 <= b2 && b2 < a2);
+}
+
+} // anonymous namespace
+
#endif // DEBUG
void Isolate::AddCodeMemoryRange(MemoryRange range) {
std::vector<MemoryRange>* old_code_pages = GetCodePages();
DCHECK_NOT_NULL(old_code_pages);
+#ifdef DEBUG
+ auto overlapping = [range](const MemoryRange& a) {
+ return Overlapping(range, a);
+ };
+ DCHECK_EQ(old_code_pages->end(),
+ std::find_if(old_code_pages->begin(), old_code_pages->end(),
+ overlapping));
+#endif
std::vector<MemoryRange>* new_code_pages;
if (old_code_pages == &code_pages_buffer1_) {
@@ -4687,7 +4725,7 @@ void Isolate::RemoveCodeMemoryChunk(MemoryChunk* chunk) {
[removed_page_start](const MemoryRange& range) {
return range.start == removed_page_start;
});
-
+ DCHECK_EQ(old_code_pages->size(), new_code_pages->size() + 1);
// Atomically switch out the pointer
SetCodePages(new_code_pages);
#endif // !defined(V8_TARGET_ARCH_ARM)
diff --git a/deps/v8/src/execution/isolate.h b/deps/v8/src/execution/isolate.h
index 8c538ab27d..43b7e27dd4 100644
--- a/deps/v8/src/execution/isolate.h
+++ b/deps/v8/src/execution/isolate.h
@@ -5,6 +5,7 @@
#ifndef V8_EXECUTION_ISOLATE_H_
#define V8_EXECUTION_ISOLATE_H_
+#include <atomic>
#include <cstddef>
#include <functional>
#include <memory>
@@ -432,8 +433,6 @@ using DebugObjectCache = std::vector<Handle<HeapObject>>;
V(int, code_and_metadata_size, 0) \
V(int, bytecode_and_metadata_size, 0) \
V(int, external_script_source_size, 0) \
- /* true if being profiled. Causes collection of extra compile info. */ \
- V(bool, is_profiling, false) \
/* Number of CPU profilers running on the isolate. */ \
V(size_t, num_cpu_profilers, 0) \
/* true if a trace is being formatted through Error.prepareStackTrace. */ \
@@ -443,7 +442,6 @@ using DebugObjectCache = std::vector<Handle<HeapObject>>;
/* Current code coverage mode */ \
V(debug::CoverageMode, code_coverage_mode, debug::CoverageMode::kBestEffort) \
V(debug::TypeProfileMode, type_profile_mode, debug::TypeProfileMode::kNone) \
- V(int, last_stack_frame_info_id, 0) \
V(int, last_console_context_id, 0) \
V(v8_inspector::V8Inspector*, inspector, nullptr) \
V(bool, next_v8_call_is_safe_for_termination, false) \
@@ -1074,7 +1072,16 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
Debug* debug() { return debug_; }
- bool* is_profiling_address() { return &is_profiling_; }
+ void* is_profiling_address() { return &is_profiling_; }
+
+ bool is_profiling() const {
+ return is_profiling_.load(std::memory_order_relaxed);
+ }
+
+ void set_is_profiling(bool enabled) {
+ is_profiling_.store(enabled, std::memory_order_relaxed);
+ }
+
CodeEventDispatcher* code_event_dispatcher() const {
return code_event_dispatcher_.get();
}
@@ -1311,8 +1318,6 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
int GetNextScriptId();
- int GetNextStackFrameInfoId();
-
#if V8_SFI_HAS_UNIQUE_ID
int GetNextUniqueSharedFunctionInfoId() {
int current_id = next_unique_sfi_id_.load(std::memory_order_relaxed);
@@ -1466,6 +1471,10 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
// annotate the builtin blob with debugging information.
void PrepareBuiltinSourcePositionMap();
+ // Store the position of the labels that will be used in the list of allowed
+ // return addresses.
+ void PrepareBuiltinLabelInfoMap();
+
#if defined(V8_OS_WIN64)
void SetBuiltinUnwindData(
int builtin_index,
@@ -1731,6 +1740,9 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
#endif // V8_INTL_SUPPORT
+ // true if being profiled. Causes collection of extra compile info.
+ std::atomic<bool> is_profiling_{false};
+
// Whether the isolate has been created for snapshotting.
bool serializer_enabled_ = false;
diff --git a/deps/v8/src/execution/mips/frame-constants-mips.h b/deps/v8/src/execution/mips/frame-constants-mips.h
index 6287203f95..48704cf56a 100644
--- a/deps/v8/src/execution/mips/frame-constants-mips.h
+++ b/deps/v8/src/execution/mips/frame-constants-mips.h
@@ -16,8 +16,7 @@ class EntryFrameConstants : public AllStatic {
public:
// This is the offset to where JSEntry pushes the current value of
// Isolate::c_entry_fp onto the stack.
- static constexpr int kCallerFPOffset =
- -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
+ static constexpr int kCallerFPOffset = -3 * kSystemPointerSize;
// Stack offsets for arguments passed to JSEntry.
static constexpr int kArgcOffset = +0 * kSystemPointerSize;
@@ -28,9 +27,12 @@ class WasmCompileLazyFrameConstants : public TypedFrameConstants {
public:
static constexpr int kNumberOfSavedGpParamRegs = 3;
static constexpr int kNumberOfSavedFpParamRegs = 7;
+ static constexpr int kNumberOfSavedAllParamRegs = 10;
// FP-relative.
- static constexpr int kWasmInstanceOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(3);
+ // See Generate_WasmCompileLazy in builtins-mips.cc.
+ static constexpr int kWasmInstanceOffset =
+ TYPED_FRAME_PUSHED_VALUE_OFFSET(kNumberOfSavedAllParamRegs);
static constexpr int kFixedFrameSizeFromFp =
TypedFrameConstants::kFixedFrameSizeFromFp +
kNumberOfSavedGpParamRegs * kPointerSize +
diff --git a/deps/v8/src/execution/mips64/frame-constants-mips64.h b/deps/v8/src/execution/mips64/frame-constants-mips64.h
index 7a49ef6d19..0f20f55d76 100644
--- a/deps/v8/src/execution/mips64/frame-constants-mips64.h
+++ b/deps/v8/src/execution/mips64/frame-constants-mips64.h
@@ -16,17 +16,19 @@ class EntryFrameConstants : public AllStatic {
public:
// This is the offset to where JSEntry pushes the current value of
// Isolate::c_entry_fp onto the stack.
- static constexpr int kCallerFPOffset =
- -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
+ static constexpr int kCallerFPOffset = -3 * kSystemPointerSize;
};
class WasmCompileLazyFrameConstants : public TypedFrameConstants {
public:
static constexpr int kNumberOfSavedGpParamRegs = 7;
static constexpr int kNumberOfSavedFpParamRegs = 7;
+ static constexpr int kNumberOfSavedAllParamRegs = 14;
// FP-relative.
- static constexpr int kWasmInstanceOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(7);
+ // See Generate_WasmCompileLazy in builtins-mips64.cc.
+ static constexpr int kWasmInstanceOffset =
+ TYPED_FRAME_PUSHED_VALUE_OFFSET(kNumberOfSavedAllParamRegs);
static constexpr int kFixedFrameSizeFromFp =
TypedFrameConstants::kFixedFrameSizeFromFp +
kNumberOfSavedGpParamRegs * kPointerSize +
diff --git a/deps/v8/src/execution/pointer-authentication-dummy.h b/deps/v8/src/execution/pointer-authentication-dummy.h
index 32a10dc0dd..9948d8303d 100644
--- a/deps/v8/src/execution/pointer-authentication-dummy.h
+++ b/deps/v8/src/execution/pointer-authentication-dummy.h
@@ -27,12 +27,6 @@ V8_INLINE Address PointerAuthentication::AuthenticatePC(
// Return {pc} unmodified.
V8_INLINE Address PointerAuthentication::StripPAC(Address pc) { return pc; }
-// Return {pc} unmodified.
-V8_INLINE Address PointerAuthentication::SignPCWithSP(Address pc, Address sp) {
- USE(sp);
- return pc;
-}
-
// Store {new_pc} to {pc_address} without signing.
V8_INLINE void PointerAuthentication::ReplacePC(Address* pc_address,
Address new_pc,
@@ -41,13 +35,11 @@ V8_INLINE void PointerAuthentication::ReplacePC(Address* pc_address,
*pc_address = new_pc;
}
-// Do nothing.
-V8_INLINE void PointerAuthentication::ReplaceContext(Address* pc_address,
- Address old_context,
- Address new_context) {
- USE(pc_address);
- USE(old_context);
- USE(new_context);
+// Return {pc} unmodified.
+V8_INLINE Address PointerAuthentication::SignAndCheckPC(Address pc,
+ Address sp) {
+ USE(sp);
+ return pc;
}
} // namespace internal
diff --git a/deps/v8/src/execution/pointer-authentication.h b/deps/v8/src/execution/pointer-authentication.h
index f2d63773f4..8caf1d0b9d 100644
--- a/deps/v8/src/execution/pointer-authentication.h
+++ b/deps/v8/src/execution/pointer-authentication.h
@@ -8,6 +8,7 @@
#include "include/v8.h"
#include "src/base/macros.h"
#include "src/common/globals.h"
+#include "src/deoptimizer/deoptimizer.h"
namespace v8 {
namespace internal {
@@ -27,10 +28,6 @@ class PointerAuthentication : public AllStatic {
// When CFI is not enabled, return {pc} unmodified.
V8_INLINE static Address StripPAC(Address pc);
- // When CFI is enabled, sign {pc} using {sp} and return the signed value.
- // When CFI is not enabled, return {pc} unmodified.
- V8_INLINE static Address SignPCWithSP(Address pc, Address sp);
-
// When CFI is enabled, authenticate the address stored in {pc_address} and
// replace it with {new_pc}, after signing it. {offset_from_sp} is the offset
// between {pc_address} and the pointer used as a context for signing.
@@ -38,12 +35,10 @@ class PointerAuthentication : public AllStatic {
V8_INLINE static void ReplacePC(Address* pc_address, Address new_pc,
int offset_from_sp);
- // When CFI is enabled, authenticate the address stored in {pc_address} based
- // on {old_context} and replace it with the same address signed with
- // {new_context} instead.
- // When CFI is not enabled, do nothing.
- V8_INLINE static void ReplaceContext(Address* pc_address, Address old_context,
- Address new_context);
+ // When CFI is enabled, sign {pc} using {sp}, check the address and return the
+ // signed value. When CFI is not enabled, return {pc} unmodified. This method
+ // only applies in the deoptimizer.
+ V8_INLINE static Address SignAndCheckPC(Address pc, Address sp);
};
} // namespace internal
diff --git a/deps/v8/src/execution/ppc/frame-constants-ppc.h b/deps/v8/src/execution/ppc/frame-constants-ppc.h
index 24ef585031..0931ffe101 100644
--- a/deps/v8/src/execution/ppc/frame-constants-ppc.h
+++ b/deps/v8/src/execution/ppc/frame-constants-ppc.h
@@ -14,8 +14,8 @@ namespace internal {
class EntryFrameConstants : public AllStatic {
public:
- static constexpr int kCallerFPOffset =
- -(StandardFrameConstants::kFixedFrameSizeFromFp + kSystemPointerSize);
+ // Need to take constant pool into account.
+ static constexpr int kCallerFPOffset = -4 * kSystemPointerSize;
};
class WasmCompileLazyFrameConstants : public TypedFrameConstants {
diff --git a/deps/v8/src/execution/ppc/simulator-ppc.cc b/deps/v8/src/execution/ppc/simulator-ppc.cc
index f845739e75..8e7070e5dc 100644
--- a/deps/v8/src/execution/ppc/simulator-ppc.cc
+++ b/deps/v8/src/execution/ppc/simulator-ppc.cc
@@ -2216,7 +2216,9 @@ void Simulator::ExecuteGeneric(Instruction* instr) {
int32_t ra_val = (get_register(ra) & 0xFFFFFFFF);
int32_t rb_val = (get_register(rb) & 0xFFFFFFFF);
int64_t alu_out = (int64_t)ra_val * (int64_t)rb_val;
- alu_out >>= 32;
+ // High 32 bits of the result is undefined,
+ // Which is simulated here by adding random bits.
+ alu_out = (alu_out >> 32) | 0x421000000000000;
set_register(rt, alu_out);
if (instr->Bit(0)) { // RC bit set
SetCR0(static_cast<intptr_t>(alu_out));
@@ -2230,7 +2232,9 @@ void Simulator::ExecuteGeneric(Instruction* instr) {
uint32_t ra_val = (get_register(ra) & 0xFFFFFFFF);
uint32_t rb_val = (get_register(rb) & 0xFFFFFFFF);
uint64_t alu_out = (uint64_t)ra_val * (uint64_t)rb_val;
- alu_out >>= 32;
+ // High 32 bits of the result is undefined,
+ // Which is simulated here by adding random bits.
+ alu_out = (alu_out >> 32) | 0x421000000000000;
set_register(rt, alu_out);
if (instr->Bit(0)) { // RC bit set
SetCR0(static_cast<intptr_t>(alu_out));
diff --git a/deps/v8/src/execution/runtime-profiler.cc b/deps/v8/src/execution/runtime-profiler.cc
index 8650867117..686fa23751 100644
--- a/deps/v8/src/execution/runtime-profiler.cc
+++ b/deps/v8/src/execution/runtime-profiler.cc
@@ -74,24 +74,52 @@ std::ostream& operator<<(std::ostream& os, OptimizationReason reason) {
return os << OptimizationReasonToString(reason);
}
-RuntimeProfiler::RuntimeProfiler(Isolate* isolate)
- : isolate_(isolate), any_ic_changed_(false) {}
+namespace {
+
+void TraceInOptimizationQueue(JSFunction function) {
+ if (FLAG_trace_opt_verbose) {
+ PrintF("[function ");
+ function.PrintName();
+ PrintF(" is already in optimization queue]\n");
+ }
+}
+
+void TraceHeuristicOptimizationDisallowed(JSFunction function) {
+ if (FLAG_trace_opt_verbose) {
+ PrintF("[function ");
+ function.PrintName();
+ PrintF(" has been marked manually for optimization]\n");
+ }
+}
-static void TraceRecompile(JSFunction function, const char* reason,
- const char* type, Isolate* isolate) {
+void TraceRecompile(JSFunction function, OptimizationReason reason,
+ Isolate* isolate) {
if (FLAG_trace_opt) {
CodeTracer::Scope scope(isolate->GetCodeTracer());
PrintF(scope.file(), "[marking ");
function.ShortPrint(scope.file());
- PrintF(scope.file(), " for %s recompilation, reason: %s", type, reason);
+ PrintF(scope.file(), " for optimized recompilation, reason: %s",
+ OptimizationReasonToString(reason));
PrintF(scope.file(), "]\n");
}
}
+void TraceNCIRecompile(JSFunction function, OptimizationReason reason) {
+ if (FLAG_trace_turbo_nci) {
+ StdoutStream os;
+ os << "NCI tierup mark: " << Brief(function) << ", "
+ << OptimizationReasonToString(reason) << std::endl;
+ }
+}
+
+} // namespace
+
+RuntimeProfiler::RuntimeProfiler(Isolate* isolate)
+ : isolate_(isolate), any_ic_changed_(false) {}
+
void RuntimeProfiler::Optimize(JSFunction function, OptimizationReason reason) {
DCHECK_NE(reason, OptimizationReason::kDoNotOptimize);
- TraceRecompile(function, OptimizationReasonToString(reason), "optimized",
- isolate_);
+ TraceRecompile(function, reason, isolate_);
function.MarkForOptimization(ConcurrencyMode::kConcurrent);
}
@@ -122,28 +150,21 @@ void RuntimeProfiler::AttemptOnStackReplacement(InterpretedFrame* frame,
Min(level + loop_nesting_levels, AbstractCode::kMaxLoopNestingMarker));
}
-void RuntimeProfiler::MaybeOptimize(JSFunction function,
- InterpretedFrame* frame) {
+void RuntimeProfiler::MaybeOptimizeInterpretedFrame(JSFunction function,
+ InterpretedFrame* frame) {
if (function.IsInOptimizationQueue()) {
- if (FLAG_trace_opt_verbose) {
- PrintF("[function ");
- function.PrintName();
- PrintF(" is already in optimization queue]\n");
- }
+ TraceInOptimizationQueue(function);
return;
}
- if (FLAG_testing_d8_test_runner) {
- if (!PendingOptimizationTable::IsHeuristicOptimizationAllowed(isolate_,
- function)) {
- if (FLAG_trace_opt_verbose) {
- PrintF("[function ");
- function.PrintName();
- PrintF(" has been marked manually for optimization]\n");
- }
- return;
- }
+ if (FLAG_testing_d8_test_runner &&
+ !PendingOptimizationTable::IsHeuristicOptimizationAllowed(isolate_,
+ function)) {
+ TraceHeuristicOptimizationDisallowed(function);
+ return;
}
+ if (function.shared().optimization_disabled()) return;
+
if (FLAG_always_osr) {
AttemptOnStackReplacement(frame, AbstractCode::kMaxLoopNestingMarker);
// Fall through and do a normal optimized compile as well.
@@ -151,12 +172,38 @@ void RuntimeProfiler::MaybeOptimize(JSFunction function,
return;
}
+ OptimizationReason reason =
+ ShouldOptimize(function, function.shared().GetBytecodeArray());
+
+ if (reason != OptimizationReason::kDoNotOptimize) {
+ Optimize(function, reason);
+ }
+}
+
+void RuntimeProfiler::MaybeOptimizeNCIFrame(JSFunction function) {
+ DCHECK_EQ(function.code().kind(), CodeKind::NATIVE_CONTEXT_INDEPENDENT);
+
+ if (function.IsInOptimizationQueue()) {
+ TraceInOptimizationQueue(function);
+ return;
+ }
+ if (FLAG_testing_d8_test_runner &&
+ !PendingOptimizationTable::IsHeuristicOptimizationAllowed(isolate_,
+ function)) {
+ TraceHeuristicOptimizationDisallowed(function);
+ return;
+ }
+
if (function.shared().optimization_disabled()) return;
+ // Note: We currently do not trigger OSR compilation from NCI code.
+ // TODO(jgruber,v8:8888): But we should.
+
OptimizationReason reason =
ShouldOptimize(function, function.shared().GetBytecodeArray());
if (reason != OptimizationReason::kDoNotOptimize) {
+ TraceNCIRecompile(function, reason);
Optimize(function, reason);
}
}
@@ -190,7 +237,7 @@ bool RuntimeProfiler::MaybeOSR(JSFunction function, InterpretedFrame* frame) {
OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction function,
BytecodeArray bytecode) {
- if (function.HasAvailableOptimizedCode()) {
+ if (function.ActiveTierIsTurbofan()) {
return OptimizationReason::kDoNotOptimize;
}
int ticks = function.feedback_vector().profiler_ticks();
@@ -219,22 +266,24 @@ OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction function,
return OptimizationReason::kDoNotOptimize;
}
-void RuntimeProfiler::MarkCandidatesForOptimizationFromBytecode() {
- HandleScope scope(isolate_);
-
- if (!isolate_->use_optimizer()) return;
-
- DisallowHeapAllocation no_gc;
+RuntimeProfiler::MarkCandidatesForOptimizationScope::
+ MarkCandidatesForOptimizationScope(RuntimeProfiler* profiler)
+ : handle_scope_(profiler->isolate_), profiler_(profiler) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
"V8.MarkCandidatesForOptimization");
+}
+
+RuntimeProfiler::MarkCandidatesForOptimizationScope::
+ ~MarkCandidatesForOptimizationScope() {
+ profiler_->any_ic_changed_ = false;
+}
- // Run through the JavaScript frames and collect them. If we already
- // have a sample of the function, we mark it for optimizations
- // (eagerly or lazily).
- int frame_count = 0;
- int frame_count_limit = FLAG_frame_count;
- for (JavaScriptFrameIterator it(isolate_);
- frame_count++ < frame_count_limit && !it.done(); it.Advance()) {
+void RuntimeProfiler::MarkCandidatesForOptimizationFromBytecode() {
+ if (!isolate_->use_optimizer()) return;
+ MarkCandidatesForOptimizationScope scope(this);
+ int i = 0;
+ for (JavaScriptFrameIterator it(isolate_); i < FLAG_frame_count && !it.done();
+ i++, it.Advance()) {
JavaScriptFrame* frame = it.frame();
if (!frame->is_interpreted()) continue;
@@ -244,24 +293,35 @@ void RuntimeProfiler::MarkCandidatesForOptimizationFromBytecode() {
if (!function.has_feedback_vector()) continue;
- MaybeOptimize(function, InterpretedFrame::cast(frame));
+ MaybeOptimizeInterpretedFrame(function, InterpretedFrame::cast(frame));
// TODO(leszeks): Move this increment to before the maybe optimize checks,
// and update the tests to assume the increment has already happened.
- int ticks = function.feedback_vector().profiler_ticks();
- if (ticks < Smi::kMaxValue) {
- function.feedback_vector().set_profiler_ticks(ticks + 1);
- }
+ function.feedback_vector().SaturatingIncrementProfilerTicks();
}
- any_ic_changed_ = false;
}
void RuntimeProfiler::MarkCandidatesForOptimizationFromCode() {
- if (FLAG_trace_turbo_nci) {
- StdoutStream os;
- os << "NCI tier-up: Marking candidates for optimization" << std::endl;
+ if (!isolate_->use_optimizer()) return;
+ MarkCandidatesForOptimizationScope scope(this);
+ int i = 0;
+ for (JavaScriptFrameIterator it(isolate_); i < FLAG_frame_count && !it.done();
+ i++, it.Advance()) {
+ JavaScriptFrame* frame = it.frame();
+ if (!frame->is_optimized()) continue;
+
+ JSFunction function = frame->function();
+ if (function.code().kind() != CodeKind::NATIVE_CONTEXT_INDEPENDENT) {
+ continue;
+ }
+
+ DCHECK(function.shared().is_compiled());
+ DCHECK(function.has_feedback_vector());
+
+ function.feedback_vector().SaturatingIncrementProfilerTicks();
+
+ MaybeOptimizeNCIFrame(function);
}
- // TODO(jgruber,v8:8888): Implement.
}
} // namespace internal
diff --git a/deps/v8/src/execution/runtime-profiler.h b/deps/v8/src/execution/runtime-profiler.h
index 0ab1b29ac1..d7125ef73c 100644
--- a/deps/v8/src/execution/runtime-profiler.h
+++ b/deps/v8/src/execution/runtime-profiler.h
@@ -5,6 +5,8 @@
#ifndef V8_EXECUTION_RUNTIME_PROFILER_H_
#define V8_EXECUTION_RUNTIME_PROFILER_H_
+#include "src/common/assert-scope.h"
+#include "src/handles/handles.h"
#include "src/utils/allocation.h"
namespace v8 {
@@ -31,7 +33,11 @@ class RuntimeProfiler {
int nesting_levels = 1);
private:
- void MaybeOptimize(JSFunction function, InterpretedFrame* frame);
+ // Make the decision whether to optimize the given function, and mark it for
+ // optimization if the decision was 'yes'.
+ void MaybeOptimizeNCIFrame(JSFunction function);
+ void MaybeOptimizeInterpretedFrame(JSFunction function,
+ InterpretedFrame* frame);
// Potentially attempts OSR from and returns whether no other
// optimization attempts should be made.
bool MaybeOSR(JSFunction function, InterpretedFrame* frame);
@@ -40,6 +46,17 @@ class RuntimeProfiler {
void Optimize(JSFunction function, OptimizationReason reason);
void Baseline(JSFunction function, OptimizationReason reason);
+ class MarkCandidatesForOptimizationScope final {
+ public:
+ explicit MarkCandidatesForOptimizationScope(RuntimeProfiler* profiler);
+ ~MarkCandidatesForOptimizationScope();
+
+ private:
+ HandleScope handle_scope_;
+ RuntimeProfiler* const profiler_;
+ DisallowHeapAllocation no_gc;
+ };
+
Isolate* isolate_;
bool any_ic_changed_;
};
diff --git a/deps/v8/src/execution/s390/frame-constants-s390.h b/deps/v8/src/execution/s390/frame-constants-s390.h
index 0893fffedf..282bd673cd 100644
--- a/deps/v8/src/execution/s390/frame-constants-s390.h
+++ b/deps/v8/src/execution/s390/frame-constants-s390.h
@@ -14,8 +14,8 @@ namespace internal {
class EntryFrameConstants : public AllStatic {
public:
- static constexpr int kCallerFPOffset =
- -(StandardFrameConstants::kFixedFrameSizeFromFp + kSystemPointerSize);
+ static constexpr int kCallerFPOffset = -3 * kSystemPointerSize;
+
// Stack offsets for arguments passed to JSEntry.
static constexpr int kArgvOffset = 20 * kSystemPointerSize;
};
diff --git a/deps/v8/src/execution/s390/simulator-s390.cc b/deps/v8/src/execution/s390/simulator-s390.cc
index 9ace63a009..3c30c87583 100644
--- a/deps/v8/src/execution/s390/simulator-s390.cc
+++ b/deps/v8/src/execution/s390/simulator-s390.cc
@@ -3407,7 +3407,7 @@ template <class S, class D>
void VectorUnpackHigh(void* dst, void* src) {
D value = 0;
for (size_t i = 0; i < kSimd128Size / sizeof(D); i++) {
- value = *(reinterpret_cast<S*>(src) + i + (sizeof(S) / 2));
+ value = *(reinterpret_cast<S*>(src) + i);
memcpy(reinterpret_cast<D*>(dst) + i, &value, sizeof(D));
}
}
@@ -3463,9 +3463,10 @@ EVALUATE(VUPLH) {
template <class S, class D>
void VectorUnpackLow(void* dst, void* src) {
D value = 0;
- for (size_t i = kSimd128Size / sizeof(D); i > 0; i--) {
- value = *(reinterpret_cast<S*>(src) + i - 1);
- memcpy(reinterpret_cast<D*>(dst) + i - 1, &value, sizeof(D));
+ size_t count = kSimd128Size / sizeof(D);
+ for (size_t i = 0; i < count; i++) {
+ value = *(reinterpret_cast<S*>(src) + i + count);
+ memcpy(reinterpret_cast<D*>(dst) + i, &value, sizeof(D));
}
}
diff --git a/deps/v8/src/execution/thread-local-top.cc b/deps/v8/src/execution/thread-local-top.cc
index cb69fb56ef..84d3432aec 100644
--- a/deps/v8/src/execution/thread-local-top.cc
+++ b/deps/v8/src/execution/thread-local-top.cc
@@ -19,6 +19,10 @@ void ThreadLocalTop::Initialize(Isolate* isolate) {
thread_id_ = ThreadId::Current();
thread_in_wasm_flag_address_ = reinterpret_cast<Address>(
trap_handler::GetThreadInWasmThreadLocalAddress());
+
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ stack_ = ::heap::base::Stack(base::Stack::GetStackStart());
+#endif
}
void ThreadLocalTop::Free() {
diff --git a/deps/v8/src/execution/thread-local-top.h b/deps/v8/src/execution/thread-local-top.h
index 57166299c5..d48371a362 100644
--- a/deps/v8/src/execution/thread-local-top.h
+++ b/deps/v8/src/execution/thread-local-top.h
@@ -10,6 +10,10 @@
#include "src/objects/contexts.h"
#include "src/utils/utils.h"
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+#include "src/heap/base/stack.h"
+#endif
+
namespace v8 {
class TryCatch;
@@ -26,7 +30,11 @@ class ThreadLocalTop {
// TODO(all): This is not particularly beautiful. We should probably
// refactor this to really consist of just Addresses and 32-bit
// integer fields.
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ static constexpr uint32_t kSizeInBytes = 25 * kSystemPointerSize;
+#else
static constexpr uint32_t kSizeInBytes = 24 * kSystemPointerSize;
+#endif
// Does early low-level initialization that does not depend on the
// isolate being present.
@@ -142,6 +150,10 @@ class ThreadLocalTop {
// Address of the thread-local "thread in wasm" flag.
Address thread_in_wasm_flag_address_ = kNullAddress;
+
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ ::heap::base::Stack stack_ = ::heap::base::Stack(nullptr);
+#endif
};
} // namespace internal
diff --git a/deps/v8/src/execution/v8threads.cc b/deps/v8/src/execution/v8threads.cc
index e16988b275..a320f42745 100644
--- a/deps/v8/src/execution/v8threads.cc
+++ b/deps/v8/src/execution/v8threads.cc
@@ -128,8 +128,10 @@ bool ThreadManager::RestoreThread() {
from = isolate_->handle_scope_implementer()->RestoreThread(from);
from = isolate_->RestoreThread(from);
from = Relocatable::RestoreState(isolate_, from);
- from = isolate_->debug()->RestoreDebug(from);
+ // Stack guard should be restored before Debug, etc. since Debug etc. might
+ // depend on a correct stack guard.
from = isolate_->stack_guard()->RestoreStackGuard(from);
+ from = isolate_->debug()->RestoreDebug(from);
from = isolate_->regexp_stack()->RestoreStack(from);
from = isolate_->bootstrapper()->RestoreState(from);
per_thread->set_thread_state(nullptr);
@@ -262,8 +264,8 @@ void ThreadManager::EagerlyArchiveThread() {
to = isolate_->handle_scope_implementer()->ArchiveThread(to);
to = isolate_->ArchiveThread(to);
to = Relocatable::ArchiveState(isolate_, to);
- to = isolate_->debug()->ArchiveDebug(to);
to = isolate_->stack_guard()->ArchiveStackGuard(to);
+ to = isolate_->debug()->ArchiveDebug(to);
to = isolate_->regexp_stack()->ArchiveStack(to);
to = isolate_->bootstrapper()->ArchiveState(to);
lazily_archived_thread_ = ThreadId::Invalid();
diff --git a/deps/v8/src/execution/v8threads.h b/deps/v8/src/execution/v8threads.h
index c59b5ccee3..ccaa6b1bef 100644
--- a/deps/v8/src/execution/v8threads.h
+++ b/deps/v8/src/execution/v8threads.h
@@ -73,6 +73,9 @@ class ThreadManager {
bool IsLockedByCurrentThread() const {
return mutex_owner_.load(std::memory_order_relaxed) == ThreadId::Current();
}
+ bool IsLockedByThread(ThreadId id) const {
+ return mutex_owner_.load(std::memory_order_relaxed) == id;
+ }
ThreadId CurrentId();
diff --git a/deps/v8/src/flags/flag-definitions.h b/deps/v8/src/flags/flag-definitions.h
index 35b055b42d..ab689283e9 100644
--- a/deps/v8/src/flags/flag-definitions.h
+++ b/deps/v8/src/flags/flag-definitions.h
@@ -15,6 +15,11 @@
#define DEFINE_IMPLICATION(whenflag, thenflag) \
DEFINE_VALUE_IMPLICATION(whenflag, thenflag, true)
+// A weak implication will be overwritten by a normal implication or by an
+// explicit flag.
+#define DEFINE_WEAK_IMPLICATION(whenflag, thenflag) \
+ DEFINE_WEAK_VALUE_IMPLICATION(whenflag, thenflag, true)
+
#define DEFINE_NEG_IMPLICATION(whenflag, thenflag) \
DEFINE_VALUE_IMPLICATION(whenflag, thenflag, false)
@@ -59,14 +64,22 @@
// We produce the code to set flags when it is implied by another flag.
#elif defined(FLAG_MODE_DEFINE_IMPLICATIONS)
-#define DEFINE_VALUE_IMPLICATION(whenflag, thenflag, value) \
- if (FLAG_##whenflag) FLAG_##thenflag = value;
+#define DEFINE_VALUE_IMPLICATION(whenflag, thenflag, value) \
+ changed |= TriggerImplication(FLAG_##whenflag, #whenflag, &FLAG_##thenflag, \
+ value, false);
+
+// A weak implication will be overwritten by a normal implication or by an
+// explicit flag.
+#define DEFINE_WEAK_VALUE_IMPLICATION(whenflag, thenflag, value) \
+ changed |= TriggerImplication(FLAG_##whenflag, #whenflag, &FLAG_##thenflag, \
+ value, true);
#define DEFINE_GENERIC_IMPLICATION(whenflag, statement) \
if (FLAG_##whenflag) statement;
-#define DEFINE_NEG_VALUE_IMPLICATION(whenflag, thenflag, value) \
- if (!FLAG_##whenflag) FLAG_##thenflag = value;
+#define DEFINE_NEG_VALUE_IMPLICATION(whenflag, thenflag, value) \
+ changed |= TriggerImplication(!FLAG_##whenflag, #whenflag, &FLAG_##thenflag, \
+ value, false);
// We apply a generic macro to the flags.
#elif defined(FLAG_MODE_APPLY)
@@ -94,6 +107,10 @@
#define DEFINE_VALUE_IMPLICATION(whenflag, thenflag, value)
#endif
+#ifndef DEFINE_WEAK_VALUE_IMPLICATION
+#define DEFINE_WEAK_VALUE_IMPLICATION(whenflag, thenflag, value)
+#endif
+
#ifndef DEFINE_GENERIC_IMPLICATION
#define DEFINE_GENERIC_IMPLICATION(whenflag, statement)
#endif
@@ -203,6 +220,20 @@ struct MaybeBoolFlag {
//
#define FLAG FLAG_FULL
+// ATTENTION: This is set to true by default in d8. But for API compatibility,
+// it generally defaults to false.
+DEFINE_BOOL(abort_on_contradictory_flags, false,
+ "Disallow flags or implications overriding each other.")
+// This implication is also hard-coded into the flags processing to make sure it
+// becomes active before we even process subsequent flags.
+DEFINE_NEG_IMPLICATION(fuzzing, abort_on_contradictory_flags)
+// This is not really a flag, it affects the interpretation of the next flag but
+// doesn't become permanently true when specified. This only works for flags
+// defined in this file, but not for d8 flags defined in src/d8/d8.cc.
+DEFINE_BOOL(allow_overwriting_for_next_flag, false,
+ "temporary disable flag contradiction to allow overwriting just "
+ "the next flag")
+
// Flags for language modes and experimental language features.
DEFINE_BOOL(use_strict, false, "enforce strict mode")
@@ -234,16 +265,14 @@ DEFINE_IMPLICATION(harmony_weak_refs_with_cleanup_some, harmony_weak_refs)
#endif
// Features that are complete (but still behind --harmony/es-staging flag).
-#define HARMONY_STAGED_BASE(V) \
- V(harmony_top_level_await, "harmony top level await") \
- V(harmony_atomics_waitasync, "harmony Atomics.waitAsync")
+#define HARMONY_STAGED_BASE(V) \
+ V(harmony_top_level_await, "harmony top level await")
#ifdef V8_INTL_SUPPORT
-#define HARMONY_STAGED(V) \
- HARMONY_STAGED_BASE(V) \
- V(harmony_intl_dateformat_day_period, \
- "Add dayPeriod option to DateTimeFormat") \
- V(harmony_intl_segmenter, "Intl.Segmenter")
+#define HARMONY_STAGED(V) \
+ HARMONY_STAGED_BASE(V) \
+ V(harmony_intl_dateformat_day_period, \
+ "Add dayPeriod option to DateTimeFormat")
#else
#define HARMONY_STAGED(V) HARMONY_STAGED_BASE(V)
#endif
@@ -253,6 +282,7 @@ DEFINE_IMPLICATION(harmony_weak_refs_with_cleanup_some, harmony_weak_refs)
V(harmony_namespace_exports, \
"harmony namespace exports (export * as foo from 'bar')") \
V(harmony_sharedarraybuffer, "harmony sharedarraybuffer") \
+ V(harmony_atomics, "harmony atomics") \
V(harmony_import_meta, "harmony import.meta property") \
V(harmony_dynamic_import, "harmony dynamic import") \
V(harmony_promise_all_settled, "harmony Promise.allSettled") \
@@ -260,9 +290,16 @@ DEFINE_IMPLICATION(harmony_weak_refs_with_cleanup_some, harmony_weak_refs)
V(harmony_private_methods, "harmony private methods in class literals") \
V(harmony_weak_refs, "harmony weak references") \
V(harmony_string_replaceall, "harmony String.prototype.replaceAll") \
- V(harmony_logical_assignment, "harmony logical assignment")
+ V(harmony_logical_assignment, "harmony logical assignment") \
+ V(harmony_atomics_waitasync, "harmony Atomics.waitAsync")
+#ifdef V8_INTL_SUPPORT
+#define HARMONY_SHIPPING(V) \
+ HARMONY_SHIPPING_BASE(V) \
+ V(harmony_intl_segmenter, "Intl.Segmenter")
+#else
#define HARMONY_SHIPPING(V) HARMONY_SHIPPING_BASE(V)
+#endif
// Once a shipping feature has proved stable in the wild, it will be dropped
// from HARMONY_SHIPPING, all occurrences of the FLAG_ variable are removed,
@@ -368,6 +405,15 @@ DEFINE_BOOL_READONLY(
DEFINE_NEG_IMPLICATION(single_generation, inline_new)
DEFINE_NEG_IMPLICATION(single_generation, turbo_allocation_folding)
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+#define V8_ENABLE_CONSERVATIVE_STACK_SCANNING_BOOL true
+#else
+#define V8_ENABLE_CONSERVATIVE_STACK_SCANNING_BOOL false
+#endif
+DEFINE_BOOL_READONLY(conservative_stack_scanning,
+ V8_ENABLE_CONSERVATIVE_STACK_SCANNING_BOOL,
+ "use conservative stack scanning")
+
#ifdef V8_ENABLE_FUTURE
#define FUTURE_BOOL true
#else
@@ -377,7 +423,28 @@ DEFINE_BOOL(future, FUTURE_BOOL,
"Implies all staged features that we want to ship in the "
"not-too-far future")
-DEFINE_IMPLICATION(future, write_protect_code_memory)
+DEFINE_WEAK_IMPLICATION(future, write_protect_code_memory)
+DEFINE_WEAK_IMPLICATION(future, finalize_streaming_on_background)
+
+// Flags for jitless
+DEFINE_BOOL(jitless, V8_LITE_BOOL,
+ "Disable runtime allocation of executable memory.")
+
+// Jitless V8 has a few implications:
+DEFINE_NEG_IMPLICATION(jitless, opt)
+// Field representation tracking is only used by TurboFan.
+DEFINE_NEG_IMPLICATION(jitless, track_field_types)
+DEFINE_NEG_IMPLICATION(jitless, track_heap_object_fields)
+// Regexps are interpreted.
+DEFINE_IMPLICATION(jitless, regexp_interpret_all)
+// asm.js validation is disabled since it triggers wasm code generation.
+DEFINE_NEG_IMPLICATION(jitless, validate_asm)
+// --jitless also implies --no-expose-wasm, see InitializeOncePerProcessImpl.
+
+#ifndef V8_TARGET_ARCH_ARM
+// Unsupported on arm. See https://crbug.com/v8/8713.
+DEFINE_NEG_IMPLICATION(jitless, interpreted_frames_native_stack)
+#endif
DEFINE_BOOL(assert_types, false,
"generate runtime type assertions to test the typer")
@@ -430,26 +497,6 @@ DEFINE_BOOL_READONLY(string_slices, true, "use string slices")
DEFINE_INT(interrupt_budget, 144 * KB,
"interrupt budget which should be used for the profiler counter")
-// Flags for jitless
-DEFINE_BOOL(jitless, V8_LITE_BOOL,
- "Disable runtime allocation of executable memory.")
-
-// Jitless V8 has a few implications:
-DEFINE_NEG_IMPLICATION(jitless, opt)
-// Field representation tracking is only used by TurboFan.
-DEFINE_NEG_IMPLICATION(jitless, track_field_types)
-DEFINE_NEG_IMPLICATION(jitless, track_heap_object_fields)
-// Regexps are interpreted.
-DEFINE_IMPLICATION(jitless, regexp_interpret_all)
-// asm.js validation is disabled since it triggers wasm code generation.
-DEFINE_NEG_IMPLICATION(jitless, validate_asm)
-// --jitless also implies --no-expose-wasm, see InitializeOncePerProcessImpl.
-
-#ifndef V8_TARGET_ARCH_ARM
-// Unsupported on arm. See https://crbug.com/v8/8713.
-DEFINE_NEG_IMPLICATION(jitless, interpreted_frames_native_stack)
-#endif
-
// Flags for inline caching and feedback vectors.
DEFINE_BOOL(use_ic, true, "use inline caching")
DEFINE_INT(budget_for_feedback_vector_allocation, 1 * KB,
@@ -508,6 +555,8 @@ DEFINE_IMPLICATION(turboprop, concurrent_inlining)
DEFINE_VALUE_IMPLICATION(turboprop, interrupt_budget, 15 * KB)
DEFINE_VALUE_IMPLICATION(turboprop, reuse_opt_code_count, 2)
DEFINE_IMPLICATION(turboprop, dynamic_map_checks)
+DEFINE_UINT_READONLY(max_minimorphic_map_checks, 4,
+ "max number of map checks to perform in minimorphic state")
// Flags for concurrent recompilation.
DEFINE_BOOL(concurrent_recompilation, true,
@@ -522,9 +571,12 @@ DEFINE_BOOL(block_concurrent_recompilation, false,
"block queued jobs until released")
DEFINE_BOOL(concurrent_inlining, false,
"run optimizing compiler's inlining phase on a separate thread")
+DEFINE_BOOL(turbo_direct_heap_access, false,
+ "access kNeverSerialized objects directly from the heap")
+DEFINE_IMPLICATION(concurrent_inlining, turbo_direct_heap_access)
DEFINE_INT(max_serializer_nesting, 25,
"maximum levels for nesting child serializers")
-DEFINE_IMPLICATION(future, concurrent_inlining)
+DEFINE_WEAK_IMPLICATION(future, concurrent_inlining)
DEFINE_BOOL(trace_heap_broker_verbose, false,
"trace the heap broker verbosely (all reports)")
DEFINE_BOOL(trace_heap_broker_memory, false,
@@ -544,8 +596,6 @@ DEFINE_BOOL(print_deopt_stress, false, "print number of possible deopt points")
DEFINE_BOOL(opt, true, "use adaptive optimizations")
DEFINE_BOOL(turbo_sp_frame_access, false,
"use stack pointer-relative access to frame wherever possible")
-DEFINE_BOOL(turbo_control_flow_aware_allocation, true,
- "consider control flow while allocating registers")
DEFINE_BOOL(
stress_turbo_late_spilling, false,
"optimize placement of all spill instructions, not just loop-top phis")
@@ -683,9 +733,8 @@ DEFINE_BOOL(turbo_nci, false,
// TODO(v8:8888): Temporary until NCI caching is implemented or
// feedback collection is made unconditional.
DEFINE_IMPLICATION(turbo_nci, turbo_collect_feedback_in_generic_lowering)
-DEFINE_BOOL(turbo_nci_as_highest_tier, false,
- "replace default TF with NCI code as the highest tier for testing "
- "purposes.")
+DEFINE_BOOL(turbo_nci_as_midtier, false,
+ "insert NCI as a midtier compiler for testing purposes.")
DEFINE_BOOL(print_nci_code, false, "print native context independent code.")
DEFINE_BOOL(trace_turbo_nci, false, "trace native context independent code.")
DEFINE_BOOL(turbo_collect_feedback_in_generic_lowering, true,
@@ -710,8 +759,6 @@ DEFINE_BOOL(untrusted_code_mitigations, V8_DEFAULT_UNTRUSTED_CODE_MITIGATIONS,
DEFINE_BOOL(wasm_generic_wrapper, false,
"use generic js-to-wasm wrapper instead of per-signature wrappers")
DEFINE_BOOL(expose_wasm, true, "expose wasm interface to JavaScript")
-DEFINE_BOOL(assume_asmjs_origin, false,
- "force wasm decoder to assume input is internal asm-wasm format")
DEFINE_INT(wasm_num_compilation_tasks, 128,
"maximum number of parallel compilation tasks for wasm")
DEFINE_DEBUG_BOOL(trace_wasm_native_heap, false,
@@ -725,9 +772,7 @@ DEFINE_BOOL(wasm_async_compilation, true,
DEFINE_BOOL(wasm_test_streaming, false,
"use streaming compilation instead of async compilation for tests")
DEFINE_UINT(wasm_max_mem_pages, v8::internal::wasm::kSpecMaxMemoryPages,
- "maximum initial number of 64KiB memory pages of a wasm instance")
-DEFINE_UINT(wasm_max_mem_pages_growth, v8::internal::wasm::kSpecMaxMemoryPages,
- "maximum number of 64KiB pages a Wasm memory can grow to")
+ "maximum number of 64KiB memory pages per wasm memory")
DEFINE_UINT(wasm_max_table_size, v8::internal::wasm::kV8MaxWasmTableSize,
"maximum table size of a wasm instance")
DEFINE_UINT(wasm_max_code_space, v8::internal::kMaxWasmCodeMB,
@@ -748,6 +793,8 @@ DEFINE_INT(trace_wasm_ast_start, 0,
DEFINE_INT(trace_wasm_ast_end, 0, "end function for wasm AST trace (exclusive)")
DEFINE_BOOL(liftoff, true,
"enable Liftoff, the baseline compiler for WebAssembly")
+DEFINE_BOOL(liftoff_extern_ref, false,
+ "enable support for externref in Liftoff")
// We can't tier up (from Liftoff to TurboFan) in single-threaded mode, hence
// disable Liftoff in that configuration for now. The alternative is disabling
// TurboFan, which would reduce peak performance considerably.
@@ -952,13 +999,18 @@ DEFINE_BOOL(concurrent_marking, V8_CONCURRENT_MARKING_BOOL,
"use concurrent marking")
DEFINE_BOOL(concurrent_array_buffer_sweeping, true,
"concurrently sweep array buffers")
-DEFINE_BOOL(concurrent_allocation, false, "concurrently allocate in old space")
-DEFINE_BOOL(local_heaps, false, "allow heap access from background tasks")
-DEFINE_IMPLICATION(concurrent_inlining, local_heaps)
+DEFINE_BOOL(concurrent_allocation, true, "concurrently allocate in old space")
DEFINE_BOOL(stress_concurrent_allocation, false,
"start background threads that allocate memory")
-DEFINE_IMPLICATION(stress_concurrent_allocation, concurrent_allocation)
-DEFINE_IMPLICATION(stress_concurrent_allocation, local_heaps)
+DEFINE_BOOL(local_heaps, true, "allow heap access from background tasks")
+// Since the local_heaps flag is enabled by default, we defined reverse
+// implications to simplify disabling the flag.
+DEFINE_NEG_NEG_IMPLICATION(local_heaps, turbo_direct_heap_access)
+DEFINE_NEG_NEG_IMPLICATION(local_heaps, concurrent_inlining)
+DEFINE_NEG_NEG_IMPLICATION(local_heaps, concurrent_allocation)
+DEFINE_NEG_NEG_IMPLICATION(concurrent_allocation,
+ finalize_streaming_on_background)
+DEFINE_NEG_NEG_IMPLICATION(concurrent_allocation, stress_concurrent_allocation)
DEFINE_BOOL(parallel_marking, V8_CONCURRENT_MARKING_BOOL,
"use parallel marking in atomic pause")
DEFINE_INT(ephemeron_fixpoint_iterations, 10,
@@ -1065,8 +1117,8 @@ DEFINE_INT(stress_marking, 0,
DEFINE_INT(stress_scavenge, 0,
"force scavenge at random points between 0 and X (inclusive) "
"percent of the new space capacity")
-DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_marking)
-DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_scavenge)
+DEFINE_VALUE_IMPLICATION(fuzzer_gc_analysis, stress_marking, 99)
+DEFINE_VALUE_IMPLICATION(fuzzer_gc_analysis, stress_scavenge, 99)
DEFINE_BOOL(
reclaim_unmodified_wrappers, true,
"reclaim otherwise unreachable unmodified wrapper objects when possible")
@@ -1154,8 +1206,6 @@ DEFINE_BOOL(stress_background_compile, false,
DEFINE_BOOL(
finalize_streaming_on_background, false,
"perform the script streaming finalization on the background thread")
-DEFINE_IMPLICATION(finalize_streaming_on_background, concurrent_allocation)
-DEFINE_IMPLICATION(finalize_streaming_on_background, local_heaps)
DEFINE_BOOL(disable_old_api_accessors, false,
"Disable old-style API accessors whose setters trigger through the "
"prototype chain")
@@ -1201,11 +1251,14 @@ DEFINE_BOOL(trace_wasm, false, "trace wasm function calls")
DEFINE_BOOL(lazy, true, "use lazy compilation")
DEFINE_BOOL(max_lazy, false, "ignore eager compilation hints")
DEFINE_IMPLICATION(max_lazy, lazy)
-DEFINE_BOOL(trace_opt, false, "trace lazy optimization")
-DEFINE_BOOL(trace_opt_verbose, false, "extra verbose compilation tracing")
+DEFINE_BOOL(trace_opt, false, "trace optimized compilation")
+DEFINE_BOOL(trace_opt_verbose, false,
+ "extra verbose optimized compilation tracing")
DEFINE_IMPLICATION(trace_opt_verbose, trace_opt)
-DEFINE_BOOL(trace_opt_stats, false, "trace lazy optimization statistics")
-DEFINE_BOOL(trace_deopt, false, "trace optimize function deoptimization")
+DEFINE_BOOL(trace_opt_stats, false, "trace optimized compilation statistics")
+DEFINE_BOOL(trace_deopt, false, "trace deoptimization")
+DEFINE_BOOL(trace_deopt_verbose, false, "extra verbose deoptimization tracing")
+DEFINE_IMPLICATION(trace_deopt_verbose, trace_deopt)
DEFINE_BOOL(trace_file_names, false,
"include file names in trace-opt/trace-deopt output")
DEFINE_BOOL(always_opt, false, "always try to optimize functions")
@@ -1292,6 +1345,8 @@ DEFINE_INT(max_valid_polymorphic_map_count, 4,
DEFINE_BOOL(native_code_counters, DEBUG_BOOL,
"generate extra code for manipulating stats counters")
+DEFINE_BOOL(super_ic, false, "use an IC for super property loads")
+
// objects.cc
DEFINE_BOOL(thin_strings, true, "Enable ThinString support")
DEFINE_BOOL(trace_prototype_users, false,
@@ -1608,6 +1663,11 @@ DEFINE_BOOL(trace_wasm_gdb_remote, false, "trace Webassembly GDB-remote server")
#define FLAG FLAG_FULL
// log.cc
+DEFINE_STRING(logfile, "v8.log",
+ "Specify the name of the log file, use '-' for console, '+' for "
+ "a temporary file.")
+DEFINE_BOOL(logfile_per_isolate, true, "Separate log files for each isolate.")
+
DEFINE_BOOL(log, false,
"Minimal logging (no API, code, GC, suspect, or handles samples).")
DEFINE_BOOL(log_all, false, "Log all events to the log file.")
@@ -1620,8 +1680,13 @@ DEFINE_BOOL(log_source_code, false, "Log source code.")
DEFINE_BOOL(log_function_events, false,
"Log function events "
"(parse, compile, execute) separately.")
-DEFINE_BOOL(prof, false,
- "Log statistical profiling information (implies --log-code).")
+
+DEFINE_IMPLICATION(log_all, log_api)
+DEFINE_IMPLICATION(log_all, log_code)
+DEFINE_IMPLICATION(log_all, log_suspect)
+DEFINE_IMPLICATION(log_all, log_handles)
+DEFINE_IMPLICATION(log_all, log_internal_timer_events)
+DEFINE_IMPLICATION(log_all, log_function_events)
DEFINE_BOOL(detailed_line_info, false,
"Always generate detailed line information for CPU profiling.")
@@ -1638,11 +1703,14 @@ DEFINE_INT(prof_sampling_interval, DEFAULT_PROF_SAMPLING_INTERVAL,
#undef DEFAULT_PROF_SAMPLING_INTERVAL
DEFINE_BOOL(prof_cpp, false, "Like --prof, but ignore generated code.")
-DEFINE_IMPLICATION(prof, prof_cpp)
DEFINE_BOOL(prof_browser_mode, true,
"Used with --prof, turns on browser-compatible mode for profiling.")
-DEFINE_STRING(logfile, "v8.log", "Specify the name of the log file.")
-DEFINE_BOOL(logfile_per_isolate, true, "Separate log files for each isolate.")
+
+DEFINE_BOOL(prof, false,
+ "Log statistical profiling information (implies --log-code).")
+DEFINE_IMPLICATION(prof, prof_cpp)
+DEFINE_IMPLICATION(prof, log_code)
+
DEFINE_BOOL(ll_prof, false, "Enable low-level linux profiler.")
#if V8_OS_LINUX
@@ -1854,9 +1922,11 @@ DEFINE_IMPLICATION(unbox_double_fields, track_double_fields)
#undef DEFINE_STRING
#undef DEFINE_FLOAT
#undef DEFINE_IMPLICATION
+#undef DEFINE_WEAK_IMPLICATION
#undef DEFINE_NEG_IMPLICATION
#undef DEFINE_NEG_VALUE_IMPLICATION
#undef DEFINE_VALUE_IMPLICATION
+#undef DEFINE_WEAK_VALUE_IMPLICATION
#undef DEFINE_GENERIC_IMPLICATION
#undef DEFINE_ALIAS_BOOL
#undef DEFINE_ALIAS_INT
diff --git a/deps/v8/src/flags/flags.cc b/deps/v8/src/flags/flags.cc
index a5dfb543d5..f9f74b009b 100644
--- a/deps/v8/src/flags/flags.cc
+++ b/deps/v8/src/flags/flags.cc
@@ -8,9 +8,11 @@
#include <cerrno>
#include <cinttypes>
#include <cstdlib>
+#include <cstring>
#include <sstream>
#include "src/base/functional.h"
+#include "src/base/logging.h"
#include "src/base/platform/platform.h"
#include "src/codegen/cpu-features.h"
#include "src/logging/counters.h"
@@ -33,6 +35,10 @@ namespace internal {
namespace {
+struct Flag;
+Flag* FindFlagByPointer(const void* ptr);
+Flag* FindFlagByName(const char* name);
+
// This structure represents a single entry in the flag system, with a pointer
// to the actual flag, default value, comment, etc. This is designed to be POD
// initialized as to avoid requiring static constructors.
@@ -48,12 +54,16 @@ struct Flag {
TYPE_STRING,
};
+ enum class SetBy { kDefault, kWeakImplication, kImplication, kCommandLine };
+
FlagType type_; // What type of flag, bool, int, or string.
const char* name_; // Name of the flag, ex "my_flag".
void* valptr_; // Pointer to the global flag variable.
const void* defptr_; // Pointer to the default value.
const char* cmt_; // A comment about the flags purpose.
bool owns_ptr_; // Does the flag own its string value?
+ SetBy set_by_ = SetBy::kDefault;
+ const char* implied_by_ = nullptr;
FlagType type() const { return type_; }
@@ -61,39 +71,90 @@ struct Flag {
const char* comment() const { return cmt_; }
- bool* bool_variable() const {
+ bool PointsTo(const void* ptr) const { return valptr_ == ptr; }
+
+ bool bool_variable() const {
+ DCHECK(type_ == TYPE_BOOL);
+ return *reinterpret_cast<bool*>(valptr_);
+ }
+
+ void set_bool_variable(bool value, SetBy set_by) {
DCHECK(type_ == TYPE_BOOL);
- return reinterpret_cast<bool*>(valptr_);
+ bool change_flag = *reinterpret_cast<bool*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<bool*>(valptr_) = value;
}
- MaybeBoolFlag* maybe_bool_variable() const {
+ MaybeBoolFlag maybe_bool_variable() const {
DCHECK(type_ == TYPE_MAYBE_BOOL);
- return reinterpret_cast<MaybeBoolFlag*>(valptr_);
+ return *reinterpret_cast<MaybeBoolFlag*>(valptr_);
+ }
+
+ void set_maybe_bool_variable(MaybeBoolFlag value, SetBy set_by) {
+ DCHECK(type_ == TYPE_MAYBE_BOOL);
+ bool change_flag = *reinterpret_cast<MaybeBoolFlag*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<MaybeBoolFlag*>(valptr_) = value;
+ }
+
+ int int_variable() const {
+ DCHECK(type_ == TYPE_INT);
+ return *reinterpret_cast<int*>(valptr_);
}
- int* int_variable() const {
+ void set_int_variable(int value, SetBy set_by) {
DCHECK(type_ == TYPE_INT);
- return reinterpret_cast<int*>(valptr_);
+ bool change_flag = *reinterpret_cast<int*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<int*>(valptr_) = value;
+ }
+
+ unsigned int uint_variable() const {
+ DCHECK(type_ == TYPE_UINT);
+ return *reinterpret_cast<unsigned int*>(valptr_);
}
- unsigned int* uint_variable() const {
+ void set_uint_variable(unsigned int value, SetBy set_by) {
DCHECK(type_ == TYPE_UINT);
- return reinterpret_cast<unsigned int*>(valptr_);
+ bool change_flag = *reinterpret_cast<unsigned int*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<unsigned int*>(valptr_) = value;
}
- uint64_t* uint64_variable() const {
+ uint64_t uint64_variable() const {
DCHECK(type_ == TYPE_UINT64);
- return reinterpret_cast<uint64_t*>(valptr_);
+ return *reinterpret_cast<uint64_t*>(valptr_);
}
- double* float_variable() const {
+ void set_uint64_variable(uint64_t value, SetBy set_by) {
+ DCHECK(type_ == TYPE_UINT64);
+ bool change_flag = *reinterpret_cast<uint64_t*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<uint64_t*>(valptr_) = value;
+ }
+
+ double float_variable() const {
DCHECK(type_ == TYPE_FLOAT);
- return reinterpret_cast<double*>(valptr_);
+ return *reinterpret_cast<double*>(valptr_);
}
- size_t* size_t_variable() const {
+ void set_float_variable(double value, SetBy set_by) {
+ DCHECK(type_ == TYPE_FLOAT);
+ bool change_flag = *reinterpret_cast<double*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<double*>(valptr_) = value;
+ }
+
+ size_t size_t_variable() const {
DCHECK(type_ == TYPE_SIZE_T);
- return reinterpret_cast<size_t*>(valptr_);
+ return *reinterpret_cast<size_t*>(valptr_);
+ }
+
+ void set_size_t_variable(size_t value, SetBy set_by) {
+ DCHECK(type_ == TYPE_SIZE_T);
+ bool change_flag = *reinterpret_cast<size_t*>(valptr_) != value;
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) *reinterpret_cast<size_t*>(valptr_) = value;
}
const char* string_value() const {
@@ -101,12 +162,19 @@ struct Flag {
return *reinterpret_cast<const char**>(valptr_);
}
- void set_string_value(const char* value, bool owns_ptr) {
+ void set_string_value(const char* value, bool owns_ptr, SetBy set_by) {
DCHECK(type_ == TYPE_STRING);
const char** ptr = reinterpret_cast<const char**>(valptr_);
- if (owns_ptr_ && *ptr != nullptr) DeleteArray(*ptr);
- *ptr = value;
- owns_ptr_ = owns_ptr;
+ bool change_flag = (*ptr == nullptr) != (value == nullptr) ||
+ (*ptr && value && std::strcmp(*ptr, value) != 0);
+ change_flag = CheckFlagChange(set_by, change_flag);
+ if (change_flag) {
+ if (owns_ptr_ && *ptr != nullptr) DeleteArray(*ptr);
+ *ptr = value;
+ owns_ptr_ = owns_ptr;
+ } else {
+ if (owns_ptr && value != nullptr) DeleteArray(value);
+ }
}
bool bool_default() const {
@@ -144,23 +212,110 @@ struct Flag {
return *reinterpret_cast<const char* const*>(defptr_);
}
+ static bool ShouldCheckFlagContradictions() {
+ if (FLAG_allow_overwriting_for_next_flag) {
+ // Setting the flag manually to false before calling Reset() avoids this
+ // becoming re-entrant.
+ FLAG_allow_overwriting_for_next_flag = false;
+ FindFlagByPointer(&FLAG_allow_overwriting_for_next_flag)->Reset();
+ return false;
+ }
+ return FLAG_abort_on_contradictory_flags && !FLAG_fuzzing;
+ }
+
+ // {change_flag} indicates if we're going to change the flag value.
+ // Returns an updated value for {change_flag}, which is changed to false if a
+ // weak implication is being ignored beause a flag is already set by a normal
+ // implication or from the command-line.
+ bool CheckFlagChange(SetBy new_set_by, bool change_flag,
+ const char* implied_by = nullptr) {
+ if (new_set_by == SetBy::kWeakImplication &&
+ (set_by_ == SetBy::kImplication || set_by_ == SetBy::kCommandLine)) {
+ return false;
+ }
+ if (ShouldCheckFlagContradictions()) {
+ // For bool flags, we only check for a conflict if the value actually
+ // changes. So specifying the same flag with the same value multiple times
+ // is allowed.
+ // For other flags, we disallow specifying them explicitly or in the
+ // presence of an implication even if the value is the same.
+ // This is to simplify the rules describing conflicts in variants.py: A
+ // repeated non-boolean flag is considered an error independently of its
+ // value.
+ bool is_bool_flag = type_ == TYPE_MAYBE_BOOL || type_ == TYPE_BOOL;
+ bool check_implications = change_flag;
+ bool check_command_line_flags = change_flag || !is_bool_flag;
+ const char* hint =
+ "To fix this, it might be necessary to specify additional "
+ "contradictory flags in tools/testrunner/local/variants.py.";
+ switch (set_by_) {
+ case SetBy::kDefault:
+ break;
+ case SetBy::kWeakImplication:
+ if (new_set_by == SetBy::kWeakImplication && check_implications) {
+ FATAL(
+ "Contradictory weak flag implications from --%s and --%s for "
+ "flag %s\n%s",
+ implied_by_, implied_by, name(), hint);
+ }
+ break;
+ case SetBy::kImplication:
+ if (new_set_by == SetBy::kImplication && check_implications) {
+ FATAL(
+ "Contradictory flag implications from --%s and --%s for flag "
+ "%s\n%s",
+ implied_by_, implied_by, name(), hint);
+ }
+ break;
+ case SetBy::kCommandLine:
+ if (new_set_by == SetBy::kImplication && check_command_line_flags) {
+ FATAL(
+ "Flag --%s is implied by --%s but also specified "
+ "explicitly.\n%s",
+ name(), implied_by, hint);
+ } else if (new_set_by == SetBy::kCommandLine &&
+ check_command_line_flags) {
+ if (is_bool_flag) {
+ FATAL(
+ "Command-line provided flag --%s specified as both true and "
+ "false.\n%s",
+ name(), hint);
+ } else {
+ FATAL(
+ "Command-line provided flag --%s specified multiple "
+ "times.\n%s",
+ name(), hint);
+ }
+ }
+ break;
+ }
+ }
+ set_by_ = new_set_by;
+ if (new_set_by == SetBy::kImplication ||
+ new_set_by == SetBy::kWeakImplication) {
+ DCHECK_NOT_NULL(implied_by);
+ implied_by_ = implied_by;
+ }
+ return change_flag;
+ }
+
// Compare this flag's current value against the default.
bool IsDefault() const {
switch (type_) {
case TYPE_BOOL:
- return *bool_variable() == bool_default();
+ return bool_variable() == bool_default();
case TYPE_MAYBE_BOOL:
- return maybe_bool_variable()->has_value == false;
+ return maybe_bool_variable().has_value == false;
case TYPE_INT:
- return *int_variable() == int_default();
+ return int_variable() == int_default();
case TYPE_UINT:
- return *uint_variable() == uint_default();
+ return uint_variable() == uint_default();
case TYPE_UINT64:
- return *uint64_variable() == uint64_default();
+ return uint64_variable() == uint64_default();
case TYPE_FLOAT:
- return *float_variable() == float_default();
+ return float_variable() == float_default();
case TYPE_SIZE_T:
- return *size_t_variable() == size_t_default();
+ return size_t_variable() == size_t_default();
case TYPE_STRING: {
const char* str1 = string_value();
const char* str2 = string_default();
@@ -176,31 +331,34 @@ struct Flag {
void Reset() {
switch (type_) {
case TYPE_BOOL:
- *bool_variable() = bool_default();
+ set_bool_variable(bool_default(), SetBy::kDefault);
break;
case TYPE_MAYBE_BOOL:
- *maybe_bool_variable() = MaybeBoolFlag::Create(false, false);
+ set_maybe_bool_variable(MaybeBoolFlag::Create(false, false),
+ SetBy::kDefault);
break;
case TYPE_INT:
- *int_variable() = int_default();
+ set_int_variable(int_default(), SetBy::kDefault);
break;
case TYPE_UINT:
- *uint_variable() = uint_default();
+ set_uint_variable(uint_default(), SetBy::kDefault);
break;
case TYPE_UINT64:
- *uint64_variable() = uint64_default();
+ set_uint64_variable(uint64_default(), SetBy::kDefault);
break;
case TYPE_FLOAT:
- *float_variable() = float_default();
+ set_float_variable(float_default(), SetBy::kDefault);
break;
case TYPE_SIZE_T:
- *size_t_variable() = size_t_default();
+ set_size_t_variable(size_t_default(), SetBy::kDefault);
break;
case TYPE_STRING:
- set_string_value(string_default(), false);
+ set_string_value(string_default(), false, SetBy::kDefault);
break;
}
}
+
+ void AllowOverwriting() { set_by_ = SetBy::kDefault; }
};
Flag flags[] = {
@@ -210,6 +368,31 @@ Flag flags[] = {
const size_t num_flags = sizeof(flags) / sizeof(*flags);
+inline char NormalizeChar(char ch) { return ch == '_' ? '-' : ch; }
+
+bool EqualNames(const char* a, const char* b) {
+ for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) {
+ if (a[i] == '\0') {
+ return true;
+ }
+ }
+ return false;
+}
+
+Flag* FindFlagByName(const char* name) {
+ for (size_t i = 0; i < num_flags; ++i) {
+ if (EqualNames(name, flags[i].name())) return &flags[i];
+ }
+ return nullptr;
+}
+
+Flag* FindFlagByPointer(const void* ptr) {
+ for (size_t i = 0; i < num_flags; ++i) {
+ if (flags[i].PointsTo(ptr)) return &flags[i];
+ }
+ return nullptr;
+}
+
} // namespace
static const char* Type2String(Flag::FlagType type) {
@@ -237,27 +420,27 @@ static const char* Type2String(Flag::FlagType type) {
std::ostream& operator<<(std::ostream& os, const Flag& flag) { // NOLINT
switch (flag.type()) {
case Flag::TYPE_BOOL:
- os << (*flag.bool_variable() ? "true" : "false");
+ os << (flag.bool_variable() ? "true" : "false");
break;
case Flag::TYPE_MAYBE_BOOL:
- os << (flag.maybe_bool_variable()->has_value
- ? (flag.maybe_bool_variable()->value ? "true" : "false")
+ os << (flag.maybe_bool_variable().has_value
+ ? (flag.maybe_bool_variable().value ? "true" : "false")
: "unset");
break;
case Flag::TYPE_INT:
- os << *flag.int_variable();
+ os << flag.int_variable();
break;
case Flag::TYPE_UINT:
- os << *flag.uint_variable();
+ os << flag.uint_variable();
break;
case Flag::TYPE_UINT64:
- os << *flag.uint64_variable();
+ os << flag.uint64_variable();
break;
case Flag::TYPE_FLOAT:
- os << *flag.float_variable();
+ os << flag.float_variable();
break;
case Flag::TYPE_SIZE_T:
- os << *flag.size_t_variable();
+ os << flag.size_t_variable();
break;
case Flag::TYPE_STRING: {
const char* str = flag.string_value();
@@ -275,7 +458,7 @@ std::vector<const char*>* FlagList::argv() {
Flag* f = &flags[i];
if (!f->IsDefault()) {
{
- bool disabled = f->type() == Flag::TYPE_BOOL && !*f->bool_variable();
+ bool disabled = f->type() == Flag::TYPE_BOOL && !f->bool_variable();
std::ostringstream os;
os << (disabled ? "--no" : "--") << f->name();
args->push_back(StrDup(os.str().c_str()));
@@ -290,8 +473,6 @@ std::vector<const char*>* FlagList::argv() {
return args;
}
-inline char NormalizeChar(char ch) { return ch == '_' ? '-' : ch; }
-
// Helper function to parse flags: Takes an argument arg and splits it into
// a flag name and flag value (or nullptr if they are missing). negated is set
// if the arg started with "-no" or "--no". The buffer may be used to NUL-
@@ -334,22 +515,6 @@ static void SplitArgument(const char* arg, char* buffer, int buffer_size,
}
}
-static bool EqualNames(const char* a, const char* b) {
- for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) {
- if (a[i] == '\0') {
- return true;
- }
- }
- return false;
-}
-
-static Flag* FindFlag(const char* name) {
- for (size_t i = 0; i < num_flags; ++i) {
- if (EqualNames(name, flags[i].name())) return &flags[i];
- }
- return nullptr;
-}
-
template <typename T>
bool TryParseUnsigned(Flag* flag, const char* arg, const char* value,
char** endp, T* out_val) {
@@ -388,7 +553,7 @@ int FlagList::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags,
if (name != nullptr) {
// lookup the flag
- Flag* flag = FindFlag(name);
+ Flag* flag = FindFlagByName(name);
if (flag == nullptr) {
if (remove_flags) {
// We don't recognize this flag but since we're removing
@@ -421,37 +586,50 @@ int FlagList::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags,
char* endp = const_cast<char*>(""); // *endp is only read
switch (flag->type()) {
case Flag::TYPE_BOOL:
- *flag->bool_variable() = !negated;
+ flag->set_bool_variable(!negated, Flag::SetBy::kCommandLine);
break;
case Flag::TYPE_MAYBE_BOOL:
- *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !negated);
+ flag->set_maybe_bool_variable(MaybeBoolFlag::Create(true, !negated),
+ Flag::SetBy::kCommandLine);
break;
case Flag::TYPE_INT:
- *flag->int_variable() = static_cast<int>(strtol(value, &endp, 10));
+ flag->set_int_variable(static_cast<int>(strtol(value, &endp, 10)),
+ Flag::SetBy::kCommandLine);
break;
- case Flag::TYPE_UINT:
- if (!TryParseUnsigned(flag, arg, value, &endp,
- flag->uint_variable())) {
+ case Flag::TYPE_UINT: {
+ unsigned int parsed_value;
+ if (TryParseUnsigned(flag, arg, value, &endp, &parsed_value)) {
+ flag->set_uint_variable(parsed_value, Flag::SetBy::kCommandLine);
+ } else {
return_code = j;
}
break;
- case Flag::TYPE_UINT64:
- if (!TryParseUnsigned(flag, arg, value, &endp,
- flag->uint64_variable())) {
+ }
+ case Flag::TYPE_UINT64: {
+ uint64_t parsed_value;
+ if (TryParseUnsigned(flag, arg, value, &endp, &parsed_value)) {
+ flag->set_uint64_variable(parsed_value, Flag::SetBy::kCommandLine);
+ } else {
return_code = j;
}
break;
+ }
case Flag::TYPE_FLOAT:
- *flag->float_variable() = strtod(value, &endp);
+ flag->set_float_variable(strtod(value, &endp),
+ Flag::SetBy::kCommandLine);
break;
- case Flag::TYPE_SIZE_T:
- if (!TryParseUnsigned(flag, arg, value, &endp,
- flag->size_t_variable())) {
+ case Flag::TYPE_SIZE_T: {
+ size_t parsed_value;
+ if (TryParseUnsigned(flag, arg, value, &endp, &parsed_value)) {
+ flag->set_size_t_variable(parsed_value, Flag::SetBy::kCommandLine);
+ } else {
return_code = j;
}
break;
+ }
case Flag::TYPE_STRING:
- flag->set_string_value(value ? StrDup(value) : nullptr, true);
+ flag->set_string_value(value ? StrDup(value) : nullptr, true,
+ Flag::SetBy::kCommandLine);
break;
}
@@ -588,6 +766,8 @@ void FlagList::PrintHelp() {
}
}
+namespace {
+
static uint32_t flag_hash = 0;
void ComputeFlagListHash() {
@@ -600,8 +780,7 @@ void ComputeFlagListHash() {
}
for (size_t i = 0; i < num_flags; ++i) {
Flag* current = &flags[i];
- if (current->type() == Flag::TYPE_BOOL &&
- current->bool_variable() == &FLAG_profile_deserialization) {
+ if (current->PointsTo(&FLAG_profile_deserialization)) {
// We want to be able to flip --profile-deserialization without
// causing the code cache to get invalidated by this hash.
continue;
@@ -616,11 +795,31 @@ void ComputeFlagListHash() {
base::hash_range(args.c_str(), args.c_str() + args.length()));
}
+template <class A, class B>
+bool TriggerImplication(bool premise, const char* premise_name,
+ A* conclusion_pointer, B value, bool weak_implication) {
+ if (!premise) return false;
+ bool change_flag = *conclusion_pointer != implicit_cast<A>(value);
+ Flag* conclusion_flag = FindFlagByPointer(conclusion_pointer);
+ change_flag = conclusion_flag->CheckFlagChange(
+ weak_implication ? Flag::SetBy::kWeakImplication
+ : Flag::SetBy::kImplication,
+ change_flag, premise_name);
+ if (change_flag) *conclusion_pointer = value;
+ return change_flag;
+}
+
+} // namespace
+
// static
void FlagList::EnforceFlagImplications() {
+ bool changed;
+ do {
+ changed = false;
#define FLAG_MODE_DEFINE_IMPLICATIONS
#include "src/flags/flag-definitions.h" // NOLINT(build/include)
#undef FLAG_MODE_DEFINE_IMPLICATIONS
+ } while (changed);
ComputeFlagListHash();
}
diff --git a/deps/v8/src/handles/handles.cc b/deps/v8/src/handles/handles.cc
index a03a619922..85072a375a 100644
--- a/deps/v8/src/handles/handles.cc
+++ b/deps/v8/src/handles/handles.cc
@@ -43,7 +43,7 @@ bool HandleBase::IsDereferenceAllowed() const {
}
LocalHeap* local_heap = LocalHeap::Current();
- if (V8_UNLIKELY(local_heap)) {
+ if (FLAG_local_heaps && local_heap) {
// Local heap can't access handles when parked
if (!local_heap->IsHandleDereferenceAllowed()) return false;
diff --git a/deps/v8/src/handles/handles.h b/deps/v8/src/handles/handles.h
index 3512ecbfc7..6f45da8483 100644
--- a/deps/v8/src/handles/handles.h
+++ b/deps/v8/src/handles/handles.h
@@ -59,6 +59,8 @@ class HandleBase {
V8_INLINE Address address() const { return bit_cast<Address>(location_); }
// Returns the address to where the raw pointer is stored.
+ // TODO(leszeks): This should probably be a const Address*, to encourage using
+ // PatchValue for modifying the handle's value.
V8_INLINE Address* location() const {
SLOW_DCHECK(location_ == nullptr || IsDereferenceAllowed());
return location_;
@@ -154,6 +156,13 @@ class Handle final : public HandleBase {
// Location equality.
bool equals(Handle<T> other) const { return address() == other.address(); }
+ // Patches this Handle's value, in-place, with a new value. All handles with
+ // the same location will see this update.
+ void PatchValue(T new_value) {
+ SLOW_DCHECK(location_ != nullptr && IsDereferenceAllowed());
+ *location_ = new_value.ptr();
+ }
+
// Provide function object for location equality comparison.
struct equal_to {
V8_INLINE bool operator()(Handle<T> lhs, Handle<T> rhs) const {
diff --git a/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc b/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc
index 6936819ba2..c0e6c0bf53 100644
--- a/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc
+++ b/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc
@@ -64,9 +64,9 @@ asm(
#if defined(_AIX)
// Set up TOC for callee.
" ld 2,8(5) \n"
- // AIX uses function decorators, which means that
+ // AIX uses function descriptors, which means that
// pointers to functions do not point to code, but
- // instead point to metadata about them, hence
+ // instead point to metadata about them, hence
// need to deterrence.
" ld 6,0(6) \n"
#endif
diff --git a/deps/v8/src/heap/base/worklist.cc b/deps/v8/src/heap/base/worklist.cc
new file mode 100644
index 0000000000..bda562ff5b
--- /dev/null
+++ b/deps/v8/src/heap/base/worklist.cc
@@ -0,0 +1,19 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/base/worklist.h"
+
+namespace heap {
+namespace base {
+namespace internal {
+
+// static
+SegmentBase* SegmentBase::GetSentinelSegmentAddress() {
+static SegmentBase kSentinelSegment(0);
+return &kSentinelSegment;
+}
+
+} // namespace internal
+} // namespace base
+} // namespace heap
diff --git a/deps/v8/src/heap/base/worklist.h b/deps/v8/src/heap/base/worklist.h
new file mode 100644
index 0000000000..be2ecf158b
--- /dev/null
+++ b/deps/v8/src/heap/base/worklist.h
@@ -0,0 +1,451 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_BASE_WORKLIST_H_
+#define V8_HEAP_BASE_WORKLIST_H_
+
+#include <cstddef>
+#include <utility>
+
+#include "src/base/atomic-utils.h"
+#include "src/base/logging.h"
+#include "src/base/platform/mutex.h"
+#include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck
+
+namespace heap {
+namespace base {
+
+namespace internal {
+class V8_EXPORT_PRIVATE SegmentBase {
+ public:
+ static SegmentBase* GetSentinelSegmentAddress();
+
+ explicit SegmentBase(uint16_t capacity) : capacity_(capacity) {}
+
+ size_t Size() const { return index_; }
+ bool IsEmpty() const { return index_ == 0; }
+ bool IsFull() const { return index_ == capacity_; }
+ void Clear() { index_ = 0; }
+
+ protected:
+ const uint16_t capacity_;
+ uint16_t index_ = 0;
+};
+} // namespace internal
+
+// A global marking worklist that is similar the existing Worklist
+// but does not reserve space and keep track of the local segments.
+// Eventually this will replace Worklist after all its current uses
+// are migrated.
+template <typename EntryType, uint16_t SegmentSize>
+class Worklist {
+ public:
+ static const int kSegmentSize = SegmentSize;
+ class Segment;
+ class Local;
+
+ Worklist() = default;
+ ~Worklist() { CHECK(IsEmpty()); }
+
+ void Push(Segment* segment);
+ bool Pop(Segment** segment);
+
+ // Returns true if the list of segments is empty.
+ bool IsEmpty();
+ // Returns the number of segments in the list.
+ size_t Size();
+
+ // Moves the segments of the given marking worklist into this
+ // marking worklist.
+ void Merge(Worklist<EntryType, SegmentSize>* other);
+
+ // These functions are not thread-safe. They should be called only
+ // if all local marking worklists that use the current worklist have
+ // been published and are empty.
+ void Clear();
+ template <typename Callback>
+ void Update(Callback callback);
+ template <typename Callback>
+ void Iterate(Callback callback);
+
+ private:
+ void set_top(Segment* segment) {
+ v8::base::AsAtomicPtr(&top_)->store(segment, std::memory_order_relaxed);
+ }
+
+ v8::base::Mutex lock_;
+ Segment* top_ = nullptr;
+ std::atomic<size_t> size_{0};
+};
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Push(Segment* segment) {
+ DCHECK(!segment->IsEmpty());
+ v8::base::MutexGuard guard(&lock_);
+ segment->set_next(top_);
+ set_top(segment);
+ size_.fetch_add(1, std::memory_order_relaxed);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::Pop(Segment** segment) {
+ v8::base::MutexGuard guard(&lock_);
+ if (top_ == nullptr) return false;
+ DCHECK_LT(0U, size_);
+ size_.fetch_sub(1, std::memory_order_relaxed);
+ *segment = top_;
+ set_top(top_->next());
+ return true;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::IsEmpty() {
+ return v8::base::AsAtomicPtr(&top_)->load(std::memory_order_relaxed) ==
+ nullptr;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+size_t Worklist<EntryType, SegmentSize>::Size() {
+ // It is safe to read |size_| without a lock since this variable is
+ // atomic, keeping in mind that threads may not immediately see the new
+ // value when it is updated.
+ return size_.load(std::memory_order_relaxed);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Clear() {
+ v8::base::MutexGuard guard(&lock_);
+ size_.store(0, std::memory_order_relaxed);
+ Segment* current = top_;
+ while (current != nullptr) {
+ Segment* tmp = current;
+ current = current->next();
+ delete tmp;
+ }
+ set_top(nullptr);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+template <typename Callback>
+void Worklist<EntryType, SegmentSize>::Update(Callback callback) {
+ v8::base::MutexGuard guard(&lock_);
+ Segment* prev = nullptr;
+ Segment* current = top_;
+ size_t num_deleted = 0;
+ while (current != nullptr) {
+ current->Update(callback);
+ if (current->IsEmpty()) {
+ DCHECK_LT(0U, size_);
+ ++num_deleted;
+ if (prev == nullptr) {
+ top_ = current->next();
+ } else {
+ prev->set_next(current->next());
+ }
+ Segment* tmp = current;
+ current = current->next();
+ delete tmp;
+ } else {
+ prev = current;
+ current = current->next();
+ }
+ }
+ size_.fetch_sub(num_deleted, std::memory_order_relaxed);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+template <typename Callback>
+void Worklist<EntryType, SegmentSize>::Iterate(Callback callback) {
+ v8::base::MutexGuard guard(&lock_);
+ for (Segment* current = top_; current != nullptr; current = current->next()) {
+ current->Iterate(callback);
+ }
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Merge(
+ Worklist<EntryType, SegmentSize>* other) {
+ Segment* top = nullptr;
+ size_t other_size = 0;
+ {
+ v8::base::MutexGuard guard(&other->lock_);
+ if (!other->top_) return;
+ top = other->top_;
+ other_size = other->size_.load(std::memory_order_relaxed);
+ other->size_.store(0, std::memory_order_relaxed);
+ other->set_top(nullptr);
+ }
+
+ // It's safe to iterate through these segments because the top was
+ // extracted from |other|.
+ Segment* end = top;
+ while (end->next()) end = end->next();
+
+ {
+ v8::base::MutexGuard guard(&lock_);
+ size_.fetch_add(other_size, std::memory_order_relaxed);
+ end->set_next(top_);
+ set_top(top);
+ }
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+class Worklist<EntryType, SegmentSize>::Segment : public internal::SegmentBase {
+ public:
+ static const uint16_t kSize = SegmentSize;
+
+ void Push(EntryType entry);
+ void Pop(EntryType* entry);
+
+ template <typename Callback>
+ void Update(Callback callback);
+ template <typename Callback>
+ void Iterate(Callback callback) const;
+
+ Segment* next() const { return next_; }
+ void set_next(Segment* segment) { next_ = segment; }
+
+ private:
+ Segment() : internal::SegmentBase(kSize) {}
+
+ Segment* next_ = nullptr;
+ EntryType entries_[kSize];
+
+ friend class Worklist<EntryType, SegmentSize>::Local;
+
+ FRIEND_TEST(CppgcWorkListTest, SegmentCreate);
+ FRIEND_TEST(CppgcWorkListTest, SegmentPush);
+ FRIEND_TEST(CppgcWorkListTest, SegmentPushPop);
+ FRIEND_TEST(CppgcWorkListTest, SegmentIsEmpty);
+ FRIEND_TEST(CppgcWorkListTest, SegmentIsFull);
+ FRIEND_TEST(CppgcWorkListTest, SegmentClear);
+ FRIEND_TEST(CppgcWorkListTest, SegmentUpdateFalse);
+ FRIEND_TEST(CppgcWorkListTest, SegmentUpdate);
+};
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Segment::Push(EntryType entry) {
+ DCHECK(!IsFull());
+ entries_[index_++] = entry;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Segment::Pop(EntryType* entry) {
+ DCHECK(!IsEmpty());
+ *entry = entries_[--index_];
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+template <typename Callback>
+void Worklist<EntryType, SegmentSize>::Segment::Update(Callback callback) {
+ size_t new_index = 0;
+ for (size_t i = 0; i < index_; i++) {
+ if (callback(entries_[i], &entries_[new_index])) {
+ new_index++;
+ }
+ }
+ index_ = new_index;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+template <typename Callback>
+void Worklist<EntryType, SegmentSize>::Segment::Iterate(
+ Callback callback) const {
+ for (size_t i = 0; i < index_; i++) {
+ callback(entries_[i]);
+ }
+}
+
+// A thread-local view of the marking worklist.
+template <typename EntryType, uint16_t SegmentSize>
+class Worklist<EntryType, SegmentSize>::Local {
+ public:
+ using ItemType = EntryType;
+
+ Local() = default;
+ explicit Local(Worklist<EntryType, SegmentSize>* worklist);
+ ~Local();
+
+ Local(Local&&) V8_NOEXCEPT;
+ Local& operator=(Local&&) V8_NOEXCEPT;
+
+ // Disable copying since having multiple copies of the same
+ // local marking worklist is unsafe.
+ Local(const Local&) = delete;
+ Local& operator=(const Local& other) = delete;
+
+ void Push(EntryType entry);
+ bool Pop(EntryType* entry);
+
+ bool IsLocalAndGlobalEmpty() const;
+ bool IsLocalEmpty() const;
+ bool IsGlobalEmpty() const;
+
+ void Publish();
+ void Merge(Worklist<EntryType, SegmentSize>::Local* other);
+
+ size_t PushSegmentSize() const { return push_segment_->Size(); }
+
+ private:
+ void PublishPushSegment();
+ void PublishPopSegment();
+ bool StealPopSegment();
+
+ Segment* NewSegment() const {
+ // Bottleneck for filtering in crash dumps.
+ return new Segment();
+ }
+ void DeleteSegment(internal::SegmentBase* segment) const {
+ if (segment == internal::SegmentBase::GetSentinelSegmentAddress()) return;
+ delete static_cast<Segment*>(segment);
+ }
+
+ inline Segment* push_segment() {
+ DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(),
+ push_segment_);
+ return static_cast<Segment*>(push_segment_);
+ }
+ inline const Segment* push_segment() const {
+ DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(),
+ push_segment_);
+ return static_cast<const Segment*>(push_segment_);
+ }
+
+ inline Segment* pop_segment() {
+ DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(), pop_segment_);
+ return static_cast<Segment*>(pop_segment_);
+ }
+ inline const Segment* pop_segment() const {
+ DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(), pop_segment_);
+ return static_cast<const Segment*>(pop_segment_);
+ }
+
+ Worklist<EntryType, SegmentSize>* worklist_ = nullptr;
+ internal::SegmentBase* push_segment_ = nullptr;
+ internal::SegmentBase* pop_segment_ = nullptr;
+};
+
+template <typename EntryType, uint16_t SegmentSize>
+Worklist<EntryType, SegmentSize>::Local::Local(
+ Worklist<EntryType, SegmentSize>* worklist)
+ : worklist_(worklist),
+ push_segment_(internal::SegmentBase::GetSentinelSegmentAddress()),
+ pop_segment_(internal::SegmentBase::GetSentinelSegmentAddress()) {}
+
+template <typename EntryType, uint16_t SegmentSize>
+Worklist<EntryType, SegmentSize>::Local::~Local() {
+ CHECK_IMPLIES(push_segment_, push_segment_->IsEmpty());
+ CHECK_IMPLIES(pop_segment_, pop_segment_->IsEmpty());
+ DeleteSegment(push_segment_);
+ DeleteSegment(pop_segment_);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+Worklist<EntryType, SegmentSize>::Local::Local(
+ Worklist<EntryType, SegmentSize>::Local&& other) V8_NOEXCEPT {
+ worklist_ = other.worklist_;
+ push_segment_ = other.push_segment_;
+ pop_segment_ = other.pop_segment_;
+ other.worklist_ = nullptr;
+ other.push_segment_ = nullptr;
+ other.pop_segment_ = nullptr;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+typename Worklist<EntryType, SegmentSize>::Local&
+Worklist<EntryType, SegmentSize>::Local::operator=(
+ Worklist<EntryType, SegmentSize>::Local&& other) V8_NOEXCEPT {
+ if (this != &other) {
+ DCHECK_NULL(worklist_);
+ DCHECK_NULL(push_segment_);
+ DCHECK_NULL(pop_segment_);
+ worklist_ = other.worklist_;
+ push_segment_ = other.push_segment_;
+ pop_segment_ = other.pop_segment_;
+ other.worklist_ = nullptr;
+ other.push_segment_ = nullptr;
+ other.pop_segment_ = nullptr;
+ }
+ return *this;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Local::Push(EntryType entry) {
+ if (V8_UNLIKELY(push_segment_->IsFull())) {
+ PublishPushSegment();
+ }
+ push_segment()->Push(entry);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::Local::Pop(EntryType* entry) {
+ if (pop_segment_->IsEmpty()) {
+ if (!push_segment_->IsEmpty()) {
+ std::swap(push_segment_, pop_segment_);
+ } else if (!StealPopSegment()) {
+ return false;
+ }
+ }
+ pop_segment()->Pop(entry);
+ return true;
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::Local::IsLocalAndGlobalEmpty() const {
+ return IsLocalEmpty() && IsGlobalEmpty();
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::Local::IsLocalEmpty() const {
+ return push_segment_->IsEmpty() && pop_segment_->IsEmpty();
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::Local::IsGlobalEmpty() const {
+ return worklist_->IsEmpty();
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Local::Publish() {
+ if (!push_segment_->IsEmpty()) PublishPushSegment();
+ if (!pop_segment_->IsEmpty()) PublishPopSegment();
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Local::Merge(
+ Worklist<EntryType, SegmentSize>::Local* other) {
+ other->Publish();
+ worklist_->Merge(other->worklist_);
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Local::PublishPushSegment() {
+ if (push_segment_ != internal::SegmentBase::GetSentinelSegmentAddress())
+ worklist_->Push(push_segment());
+ push_segment_ = NewSegment();
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+void Worklist<EntryType, SegmentSize>::Local::PublishPopSegment() {
+ if (pop_segment_ != internal::SegmentBase::GetSentinelSegmentAddress())
+ worklist_->Push(pop_segment());
+ pop_segment_ = NewSegment();
+}
+
+template <typename EntryType, uint16_t SegmentSize>
+bool Worklist<EntryType, SegmentSize>::Local::StealPopSegment() {
+ if (worklist_->IsEmpty()) return false;
+ Segment* new_segment = nullptr;
+ if (worklist_->Pop(&new_segment)) {
+ DeleteSegment(pop_segment_);
+ pop_segment_ = new_segment;
+ return true;
+ }
+ return false;
+}
+
+} // namespace base
+} // namespace heap
+
+#endif // V8_HEAP_BASE_WORKLIST_H_
diff --git a/deps/v8/src/heap/concurrent-allocator.cc b/deps/v8/src/heap/concurrent-allocator.cc
index 184ad88490..5db9159f14 100644
--- a/deps/v8/src/heap/concurrent-allocator.cc
+++ b/deps/v8/src/heap/concurrent-allocator.cc
@@ -27,6 +27,9 @@ void StressConcurrentAllocatorTask::RunInternal() {
MemoryChunkLayout::ObjectStartOffsetInDataPage());
for (int i = 0; i < kNumIterations; i++) {
+ // Isolate tear down started, stop allocation...
+ if (heap->gc_state() == Heap::TEAR_DOWN) return;
+
Address address = local_heap.AllocateRawOrFail(
kSmallObjectSize, AllocationType::kOld, AllocationOrigin::kRuntime,
AllocationAlignment::kWordAligned);
@@ -62,27 +65,6 @@ void StressConcurrentAllocatorTask::Schedule(Isolate* isolate) {
kDelayInSeconds);
}
-Address ConcurrentAllocator::PerformCollectionAndAllocateAgain(
- int object_size, AllocationAlignment alignment, AllocationOrigin origin) {
- Heap* heap = local_heap_->heap();
- local_heap_->allocation_failed_ = true;
-
- for (int i = 0; i < 3; i++) {
- {
- ParkedScope scope(local_heap_);
- heap->RequestAndWaitForCollection();
- }
-
- AllocationResult result = AllocateRaw(object_size, alignment, origin);
- if (!result.IsRetry()) {
- local_heap_->allocation_failed_ = false;
- return result.ToObjectChecked().address();
- }
- }
-
- heap->FatalProcessOutOfMemory("ConcurrentAllocator: allocation failed");
-}
-
void ConcurrentAllocator::FreeLinearAllocationArea() {
lab_.CloseAndMakeIterable();
}
diff --git a/deps/v8/src/heap/concurrent-allocator.h b/deps/v8/src/heap/concurrent-allocator.h
index bb87425ffc..fe6144eb7e 100644
--- a/deps/v8/src/heap/concurrent-allocator.h
+++ b/deps/v8/src/heap/concurrent-allocator.h
@@ -63,9 +63,6 @@ class ConcurrentAllocator {
V8_EXPORT_PRIVATE AllocationResult AllocateOutsideLab(
int object_size, AllocationAlignment alignment, AllocationOrigin origin);
- V8_EXPORT_PRIVATE Address PerformCollectionAndAllocateAgain(
- int object_size, AllocationAlignment alignment, AllocationOrigin origin);
-
LocalHeap* const local_heap_;
PagedSpace* const space_;
LocalAllocationBuffer lab_;
diff --git a/deps/v8/src/heap/conservative-stack-visitor.cc b/deps/v8/src/heap/conservative-stack-visitor.cc
new file mode 100644
index 0000000000..4e112f81ad
--- /dev/null
+++ b/deps/v8/src/heap/conservative-stack-visitor.cc
@@ -0,0 +1,78 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/conservative-stack-visitor.h"
+
+#include "src/execution/isolate-utils-inl.h"
+#include "src/heap/large-spaces.h"
+#include "src/heap/paged-spaces-inl.h"
+
+namespace v8 {
+namespace internal {
+
+ConservativeStackVisitor::ConservativeStackVisitor(Isolate* isolate,
+ RootVisitor* delegate)
+ : isolate_(isolate), delegate_(delegate) {}
+
+void ConservativeStackVisitor::VisitPointer(const void* pointer) {
+ VisitConservativelyIfPointer(pointer);
+}
+
+bool ConservativeStackVisitor::CheckPage(Address address, MemoryChunk* page) {
+ if (address < page->area_start() || address >= page->area_end()) return false;
+
+ auto base_ptr = page->object_start_bitmap()->FindBasePtr(address);
+ if (base_ptr == kNullAddress) {
+ return false;
+ }
+
+ // At this point, base_ptr *must* refer to the valid object. We check if
+ // |address| resides inside the object or beyond it in unused memory.
+ HeapObject obj = HeapObject::FromAddress(base_ptr);
+ Address obj_end = obj.address() + obj.Size();
+
+ if (address >= obj_end) {
+ // |address| points to unused memory.
+ return false;
+ }
+
+ // TODO(jakehughes) Pinning is only required for the marking visitor. Other
+ // visitors (such as verify visitor) could work without pining. This should
+ // be moved to delegate_
+ page->SetFlag(BasicMemoryChunk::Flag::PINNED);
+
+ Object ptr = HeapObject::FromAddress(base_ptr);
+ FullObjectSlot root = FullObjectSlot(&ptr);
+ delegate_->VisitRootPointer(Root::kHandleScope, nullptr, root);
+ DCHECK(root == FullObjectSlot(reinterpret_cast<Address>(&base_ptr)));
+ return true;
+}
+
+void ConservativeStackVisitor::VisitConservativelyIfPointer(
+ const void* pointer) {
+ auto address = reinterpret_cast<Address>(pointer);
+ if (address > isolate_->heap()->old_space()->top() ||
+ address < isolate_->heap()->old_space()->limit()) {
+ return;
+ }
+
+ for (Page* page : *isolate_->heap()->old_space()) {
+ if (CheckPage(address, page)) {
+ return;
+ }
+ }
+
+ for (LargePage* page : *isolate_->heap()->lo_space()) {
+ if (address >= page->area_start() && address < page->area_end()) {
+ Object ptr = page->GetObject();
+ FullObjectSlot root = FullObjectSlot(&ptr);
+ delegate_->VisitRootPointer(Root::kHandleScope, nullptr, root);
+ DCHECK(root == FullObjectSlot(&ptr));
+ return;
+ }
+ }
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/heap/conservative-stack-visitor.h b/deps/v8/src/heap/conservative-stack-visitor.h
new file mode 100644
index 0000000000..649608b423
--- /dev/null
+++ b/deps/v8/src/heap/conservative-stack-visitor.h
@@ -0,0 +1,32 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
+#define V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
+
+#include "src/heap/base/stack.h"
+#include "src/heap/memory-chunk.h"
+
+namespace v8 {
+namespace internal {
+
+class ConservativeStackVisitor : public ::heap::base::StackVisitor {
+ public:
+ ConservativeStackVisitor(Isolate* isolate, RootVisitor* delegate);
+
+ void VisitPointer(const void* pointer) final;
+
+ private:
+ bool CheckPage(Address address, MemoryChunk* page);
+
+ void VisitConservativelyIfPointer(const void* pointer);
+
+ Isolate* isolate_ = nullptr;
+ RootVisitor* delegate_ = nullptr;
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
diff --git a/deps/v8/src/heap/cppgc-js/cpp-heap.cc b/deps/v8/src/heap/cppgc-js/cpp-heap.cc
index 8243e9e366..6c9f99272a 100644
--- a/deps/v8/src/heap/cppgc-js/cpp-heap.cc
+++ b/deps/v8/src/heap/cppgc-js/cpp-heap.cc
@@ -65,7 +65,8 @@ class CppgcPlatformAdapter final : public cppgc::Platform {
class UnifiedHeapMarker final : public cppgc::internal::MarkerBase {
public:
- explicit UnifiedHeapMarker(Heap& v8_heap, cppgc::internal::HeapBase& heap);
+ UnifiedHeapMarker(Key, Heap& v8_heap, cppgc::internal::HeapBase& cpp_heap,
+ cppgc::Platform* platform, MarkingConfig config);
~UnifiedHeapMarker() final = default;
@@ -86,9 +87,11 @@ class UnifiedHeapMarker final : public cppgc::internal::MarkerBase {
cppgc::internal::ConservativeMarkingVisitor conservative_marking_visitor_;
};
-UnifiedHeapMarker::UnifiedHeapMarker(Heap& v8_heap,
- cppgc::internal::HeapBase& heap)
- : cppgc::internal::MarkerBase(heap),
+UnifiedHeapMarker::UnifiedHeapMarker(Key key, Heap& v8_heap,
+ cppgc::internal::HeapBase& heap,
+ cppgc::Platform* platform,
+ MarkingConfig config)
+ : cppgc::internal::MarkerBase(key, heap, platform, config),
unified_heap_mutator_marking_state_(v8_heap),
marking_visitor_(heap, mutator_marking_state_,
unified_heap_mutator_marking_state_),
@@ -104,7 +107,9 @@ void UnifiedHeapMarker::AddObject(void* object) {
CppHeap::CppHeap(v8::Isolate* isolate, size_t custom_spaces)
: cppgc::internal::HeapBase(std::make_shared<CppgcPlatformAdapter>(isolate),
- custom_spaces),
+ custom_spaces,
+ cppgc::internal::HeapBase::StackSupport::
+ kSupportsConservativeStackScan),
isolate_(*reinterpret_cast<Isolate*>(isolate)) {
CHECK(!FLAG_incremental_marking_wrappers);
}
@@ -121,17 +126,20 @@ void CppHeap::RegisterV8References(
}
void CppHeap::TracePrologue(TraceFlags flags) {
- marker_.reset(new UnifiedHeapMarker(*isolate_.heap(), AsBase()));
const UnifiedHeapMarker::MarkingConfig marking_config{
UnifiedHeapMarker::MarkingConfig::CollectionType::kMajor,
cppgc::Heap::StackState::kNoHeapPointers,
- UnifiedHeapMarker::MarkingConfig::MarkingType::kAtomic};
- marker_->StartMarking(marking_config);
+ UnifiedHeapMarker::MarkingConfig::MarkingType::kIncremental};
+ marker_ =
+ cppgc::internal::MarkerFactory::CreateAndStartMarking<UnifiedHeapMarker>(
+ *isolate_.heap(), AsBase(), platform_.get(), marking_config);
marking_done_ = false;
}
bool CppHeap::AdvanceTracing(double deadline_in_ms) {
- marking_done_ = marker_->AdvanceMarkingWithDeadline(
+ // TODO(chromium:1056170): Replace std::numeric_limits<size_t>::max() with a
+ // proper deadline when unified heap transitions to bytes-based deadline.
+ marking_done_ = marker_->AdvanceMarkingWithMaxDuration(
v8::base::TimeDelta::FromMillisecondsD(deadline_in_ms));
return marking_done_;
}
@@ -139,11 +147,7 @@ bool CppHeap::AdvanceTracing(double deadline_in_ms) {
bool CppHeap::IsTracingDone() { return marking_done_; }
void CppHeap::EnterFinalPause(EmbedderStackState stack_state) {
- const UnifiedHeapMarker::MarkingConfig marking_config{
- UnifiedHeapMarker::MarkingConfig::CollectionType::kMajor,
- cppgc::Heap::StackState::kNoHeapPointers,
- UnifiedHeapMarker::MarkingConfig::MarkingType::kAtomic};
- marker_->EnterAtomicPause(marking_config);
+ marker_->EnterAtomicPause(cppgc::Heap::StackState::kNoHeapPointers);
}
void CppHeap::TraceEpilogue(TraceSummary* trace_summary) {
diff --git a/deps/v8/src/heap/cppgc-js/cpp-heap.h b/deps/v8/src/heap/cppgc-js/cpp-heap.h
index 0105934ac1..f3bbab8b16 100644
--- a/deps/v8/src/heap/cppgc-js/cpp-heap.h
+++ b/deps/v8/src/heap/cppgc-js/cpp-heap.h
@@ -33,6 +33,12 @@ class V8_EXPORT_PRIVATE CppHeap final : public cppgc::internal::HeapBase,
void EnterFinalPause(EmbedderStackState stack_state) final;
private:
+ void FinalizeIncrementalGarbageCollectionIfNeeded(
+ cppgc::Heap::StackState) final {
+ // For unified heap, CppHeap shouldn't finalize independently (i.e.
+ // finalization is not needed) thus this method is left empty.
+ }
+
Isolate& isolate_;
bool marking_done_ = false;
};
diff --git a/deps/v8/src/heap/cppgc/default-job.h b/deps/v8/src/heap/cppgc/default-job.h
new file mode 100644
index 0000000000..9ef6f3fb58
--- /dev/null
+++ b/deps/v8/src/heap/cppgc/default-job.h
@@ -0,0 +1,186 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_CPPGC_DEFAULT_JOB_H_
+#define V8_HEAP_CPPGC_DEFAULT_JOB_H_
+
+#include <atomic>
+#include <map>
+#include <memory>
+#include <unordered_set>
+#include <vector>
+
+#include "include/cppgc/platform.h"
+#include "src/base/logging.h"
+#include "src/base/platform/mutex.h"
+
+namespace cppgc {
+namespace internal {
+
+template <typename Job>
+class DefaultJobFactory {
+ public:
+ static std::shared_ptr<Job> Create(std::unique_ptr<cppgc::JobTask> job_task) {
+ std::shared_ptr<Job> job =
+ std::make_shared<Job>(typename Job::Key(), std::move(job_task));
+ job->NotifyConcurrencyIncrease();
+ return job;
+ }
+};
+
+template <typename Thread>
+class DefaultJobImpl {
+ public:
+ class JobDelegate;
+ class JobHandle;
+
+ class Key {
+ private:
+ Key() {}
+
+ template <typename Job>
+ friend class DefaultJobFactory;
+ };
+
+ DefaultJobImpl(Key, std::unique_ptr<cppgc::JobTask> job_task)
+ : job_task_(std::move(job_task)) {}
+
+ ~DefaultJobImpl() {
+ Cancel();
+ DCHECK_EQ(0, active_threads_.load(std::memory_order_relaxed));
+ }
+
+ void NotifyConcurrencyIncrease();
+
+ void Join() {
+ for (std::shared_ptr<Thread>& thread : job_threads_) thread->Join();
+ job_threads_.clear();
+ can_run_.store(false, std::memory_order_relaxed);
+ }
+
+ void Cancel() {
+ can_run_.store(false, std::memory_order_relaxed);
+ Join();
+ }
+
+ bool IsCompleted() const { return !IsRunning(); }
+ bool IsRunning() const {
+ uint8_t active_threads = active_threads_.load(std::memory_order_relaxed);
+ return (active_threads + job_task_->GetMaxConcurrency(active_threads)) > 0;
+ }
+
+ bool CanRun() const { return can_run_.load(std::memory_order_relaxed); }
+
+ void RunJobTask() {
+ DCHECK_NOT_NULL(job_task_);
+ NotifyJobThreadStart();
+ JobDelegate delegate(this);
+ job_task_->Run(&delegate);
+ NotifyJobThreadEnd();
+ }
+
+ protected:
+ virtual std::shared_ptr<Thread> CreateThread(DefaultJobImpl*) = 0;
+
+ void NotifyJobThreadStart() {
+ active_threads_.fetch_add(1, std::memory_order_relaxed);
+ }
+ void NotifyJobThreadEnd() {
+ active_threads_.fetch_sub(1, std::memory_order_relaxed);
+ }
+
+ void GuaranteeAvailableIds(uint8_t max_threads) {
+ if (max_threads <= highest_thread_count_) return;
+ v8::base::MutexGuard guard(&ids_lock_);
+ while (highest_thread_count_ < max_threads) {
+ available_ids_.push_back(++highest_thread_count_);
+ }
+ }
+
+ std::unique_ptr<cppgc::JobTask> job_task_;
+ std::vector<std::shared_ptr<Thread>> job_threads_;
+ std::atomic_bool can_run_{true};
+ std::atomic<uint8_t> active_threads_{0};
+
+ // Task id management.
+ v8::base::Mutex ids_lock_;
+ std::vector<uint8_t> available_ids_;
+ uint8_t highest_thread_count_ = -1;
+};
+
+template <typename Thread>
+class DefaultJobImpl<Thread>::JobDelegate final : public cppgc::JobDelegate {
+ public:
+ explicit JobDelegate(DefaultJobImpl* job) : job_(job) {}
+ ~JobDelegate() { ReleaseTaskId(); }
+ bool ShouldYield() override { return !job_->CanRun(); }
+ void NotifyConcurrencyIncrease() override {
+ job_->NotifyConcurrencyIncrease();
+ }
+ uint8_t GetTaskId() override {
+ AcquireTaskId();
+ return job_thread_id_;
+ }
+
+ private:
+ void AcquireTaskId() {
+ if (job_thread_id_ != kInvalidTaskId) return;
+ v8::base::MutexGuard guard(&job_->ids_lock_);
+ job_thread_id_ = job_->available_ids_.back();
+ DCHECK_NE(kInvalidTaskId, job_thread_id_);
+ job_->available_ids_.pop_back();
+ }
+ void ReleaseTaskId() {
+ if (job_thread_id_ == kInvalidTaskId) return;
+ v8::base::MutexGuard guard(&job_->ids_lock_);
+ job_->available_ids_.push_back(job_thread_id_);
+ }
+
+ DefaultJobImpl* const job_;
+ static constexpr uint8_t kInvalidTaskId = std::numeric_limits<uint8_t>::max();
+ uint8_t job_thread_id_ = kInvalidTaskId;
+};
+
+template <typename Thread>
+void DefaultJobImpl<Thread>::NotifyConcurrencyIncrease() {
+ DCHECK(CanRun());
+ static const size_t kMaxThreads = Thread::GetMaxSupportedConcurrency();
+ uint8_t current_active_threads =
+ active_threads_.load(std::memory_order_relaxed);
+ size_t max_threads = std::min(
+ kMaxThreads, job_task_->GetMaxConcurrency(current_active_threads));
+ if (current_active_threads >= max_threads) return;
+ DCHECK_LT(max_threads, std::numeric_limits<uint8_t>::max());
+ GuaranteeAvailableIds(max_threads);
+ for (uint8_t new_threads = max_threads - current_active_threads;
+ new_threads > 0; --new_threads) {
+ std::shared_ptr<Thread> thread = CreateThread(this);
+ job_threads_.push_back(thread);
+ }
+}
+
+template <typename Thread>
+class DefaultJobImpl<Thread>::JobHandle final : public cppgc::JobHandle {
+ public:
+ explicit JobHandle(std::shared_ptr<DefaultJobImpl> job)
+ : job_(std::move(job)) {
+ DCHECK_NOT_NULL(job_);
+ }
+
+ void NotifyConcurrencyIncrease() override {
+ job_->NotifyConcurrencyIncrease();
+ }
+ void Join() override { job_->Join(); }
+ void Cancel() override { job_->Cancel(); }
+ bool IsCompleted() override { return job_->IsCompleted(); }
+ bool IsRunning() override { return job_->IsRunning(); }
+
+ private:
+ std::shared_ptr<DefaultJobImpl> job_;
+};
+
+} // namespace internal
+} // namespace cppgc
+
+#endif // V8_HEAP_CPPGC_DEFAULT_JOB_H_
diff --git a/deps/v8/src/heap/cppgc/default-platform.cc b/deps/v8/src/heap/cppgc/default-platform.cc
index 792bf38189..0ac5440f7e 100644
--- a/deps/v8/src/heap/cppgc/default-platform.cc
+++ b/deps/v8/src/heap/cppgc/default-platform.cc
@@ -7,47 +7,63 @@
#include <chrono> // NOLINT(build/c++11)
#include <thread> // NOLINT(build/c++11)
+#include "src/base/logging.h"
#include "src/base/page-allocator.h"
+#include "src/base/sys-info.h"
+#include "src/heap/cppgc/default-job.h"
namespace cppgc {
-namespace {
+namespace internal {
-// Simple implementation of JobTask based on std::thread.
-class DefaultJobHandle : public JobHandle {
+// Default implementation of Jobs based on std::thread.
+namespace {
+class DefaultJobThread final : private std::thread {
public:
- explicit DefaultJobHandle(std::shared_ptr<std::thread> thread)
- : thread_(std::move(thread)) {}
+ template <typename Function>
+ explicit DefaultJobThread(Function function)
+ : std::thread(std::move(function)) {}
+ ~DefaultJobThread() { DCHECK(!joinable()); }
- void NotifyConcurrencyIncrease() override {}
- void Join() override {
- if (thread_->joinable()) thread_->join();
+ void Join() { join(); }
+
+ static size_t GetMaxSupportedConcurrency() {
+ return v8::base::SysInfo::NumberOfProcessors() - 1;
}
- void Cancel() override { Join(); }
- bool IsRunning() override { return thread_->joinable(); }
+};
+} // namespace
- private:
- std::shared_ptr<std::thread> thread_;
+class DefaultJob final : public DefaultJobImpl<DefaultJobThread> {
+ public:
+ DefaultJob(Key key, std::unique_ptr<cppgc::JobTask> job_task)
+ : DefaultJobImpl(key, std::move(job_task)) {}
+
+ std::shared_ptr<DefaultJobThread> CreateThread(DefaultJobImpl* job) final {
+ return std::make_shared<DefaultJobThread>([job = this] {
+ DCHECK_NOT_NULL(job);
+ job->RunJobTask();
+ });
+ }
};
-} // namespace
+} // namespace internal
void DefaultTaskRunner::PostTask(std::unique_ptr<cppgc::Task> task) {
tasks_.push_back(std::move(task));
}
-void DefaultTaskRunner::PostNonNestableTask(std::unique_ptr<cppgc::Task> task) {
- PostTask(std::move(task));
-}
-
void DefaultTaskRunner::PostDelayedTask(std::unique_ptr<cppgc::Task> task,
double) {
PostTask(std::move(task));
}
-void DefaultTaskRunner::PostNonNestableDelayedTask(
- std::unique_ptr<cppgc::Task> task, double) {
- PostTask(std::move(task));
+void DefaultTaskRunner::PostNonNestableTask(std::unique_ptr<cppgc::Task>) {
+ UNREACHABLE();
+}
+
+void DefaultTaskRunner::PostNonNestableDelayedTask(std::unique_ptr<cppgc::Task>,
+ double) {
+ UNREACHABLE();
}
void DefaultTaskRunner::PostIdleTask(std::unique_ptr<cppgc::IdleTask> task) {
@@ -106,17 +122,11 @@ std::shared_ptr<cppgc::TaskRunner> DefaultPlatform::GetForegroundTaskRunner() {
std::unique_ptr<cppgc::JobHandle> DefaultPlatform::PostJob(
cppgc::TaskPriority priority, std::unique_ptr<cppgc::JobTask> job_task) {
- auto thread = std::make_shared<std::thread>([task = std::move(job_task)] {
- class SimpleDelegate final : public cppgc::JobDelegate {
- public:
- bool ShouldYield() override { return false; }
- void NotifyConcurrencyIncrease() override {}
- } delegate;
-
- if (task) task->Run(&delegate);
- });
- job_threads_.push_back(thread);
- return std::make_unique<DefaultJobHandle>(std::move(thread));
+ std::shared_ptr<internal::DefaultJob> job =
+ internal::DefaultJobFactory<internal::DefaultJob>::Create(
+ std::move(job_task));
+ jobs_.push_back(job);
+ return std::make_unique<internal::DefaultJob::JobHandle>(std::move(job));
}
void DefaultPlatform::WaitAllForegroundTasks() {
@@ -124,10 +134,10 @@ void DefaultPlatform::WaitAllForegroundTasks() {
}
void DefaultPlatform::WaitAllBackgroundTasks() {
- for (auto& thread : job_threads_) {
- thread->join();
+ for (auto& job : jobs_) {
+ job->Join();
}
- job_threads_.clear();
+ jobs_.clear();
}
} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/garbage-collector.h b/deps/v8/src/heap/cppgc/garbage-collector.h
index 6c906fd501..1fc7ed925d 100644
--- a/deps/v8/src/heap/cppgc/garbage-collector.h
+++ b/deps/v8/src/heap/cppgc/garbage-collector.h
@@ -31,6 +31,16 @@ class GarbageCollector {
MarkingType::kAtomic, SweepingType::kAtomic};
}
+ static constexpr Config ConservativeIncrementalConfig() {
+ return {CollectionType::kMajor, StackState::kMayContainHeapPointers,
+ MarkingType::kIncremental, SweepingType::kAtomic};
+ }
+
+ static constexpr Config PreciseIncrementalConfig() {
+ return {CollectionType::kMajor, StackState::kNoHeapPointers,
+ MarkingType::kIncremental, SweepingType::kAtomic};
+ }
+
static constexpr Config MinorPreciseAtomicConfig() {
return {CollectionType::kMinor, StackState::kNoHeapPointers,
MarkingType::kAtomic, SweepingType::kAtomic};
@@ -43,7 +53,8 @@ class GarbageCollector {
};
// Executes a garbage collection specified in config.
- virtual void CollectGarbage(Config config) = 0;
+ virtual void CollectGarbage(Config) = 0;
+ virtual void StartIncrementalGarbageCollection(Config) = 0;
// The current epoch that the GC maintains. The epoch is increased on every
// GC invocation.
diff --git a/deps/v8/src/heap/cppgc/gc-invoker.cc b/deps/v8/src/heap/cppgc/gc-invoker.cc
index a1212d8052..31ca9780bf 100644
--- a/deps/v8/src/heap/cppgc/gc-invoker.cc
+++ b/deps/v8/src/heap/cppgc/gc-invoker.cc
@@ -22,6 +22,7 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector {
GCInvokerImpl& operator=(const GCInvokerImpl&) = delete;
void CollectGarbage(GarbageCollector::Config) final;
+ void StartIncrementalGarbageCollection(GarbageCollector::Config) final;
size_t epoch() const final { return collector_->epoch(); }
private:
@@ -37,7 +38,9 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector {
}
explicit GCTask(GarbageCollector* collector)
- : collector_(collector), saved_epoch_(collector->epoch()) {}
+ : collector_(collector),
+ handle_(Handle::NonEmptyTag{}),
+ saved_epoch_(collector->epoch()) {}
private:
void Run() final {
@@ -88,6 +91,24 @@ void GCInvoker::GCInvokerImpl::CollectGarbage(GarbageCollector::Config config) {
}
}
+void GCInvoker::GCInvokerImpl::StartIncrementalGarbageCollection(
+ GarbageCollector::Config config) {
+ if ((stack_support_ !=
+ cppgc::Heap::StackSupport::kSupportsConservativeStackScan) &&
+ (!platform_->GetForegroundTaskRunner() ||
+ !platform_->GetForegroundTaskRunner()->NonNestableTasksEnabled())) {
+ // In this configuration the GC finalization can only be triggered through
+ // ForceGarbageCollectionSlow. If incremental GC is started, there is no
+ // way to know how long it will remain enabled (and the write barrier with
+ // it). For that reason, we do not support running incremental GCs in this
+ // configuration.
+ return;
+ }
+ // No need to postpone starting incremental GC since the stack is not scanned
+ // until GC finalization.
+ collector_->StartIncrementalGarbageCollection(config);
+}
+
GCInvoker::GCInvoker(GarbageCollector* collector, cppgc::Platform* platform,
cppgc::Heap::StackSupport stack_support)
: impl_(std::make_unique<GCInvoker::GCInvokerImpl>(collector, platform,
@@ -99,6 +120,11 @@ void GCInvoker::CollectGarbage(GarbageCollector::Config config) {
impl_->CollectGarbage(config);
}
+void GCInvoker::StartIncrementalGarbageCollection(
+ GarbageCollector::Config config) {
+ impl_->StartIncrementalGarbageCollection(config);
+}
+
size_t GCInvoker::epoch() const { return impl_->epoch(); }
} // namespace internal
diff --git a/deps/v8/src/heap/cppgc/gc-invoker.h b/deps/v8/src/heap/cppgc/gc-invoker.h
index a9e3369b3e..fa5e7e5435 100644
--- a/deps/v8/src/heap/cppgc/gc-invoker.h
+++ b/deps/v8/src/heap/cppgc/gc-invoker.h
@@ -34,6 +34,7 @@ class V8_EXPORT_PRIVATE GCInvoker final : public GarbageCollector {
GCInvoker& operator=(const GCInvoker&) = delete;
void CollectGarbage(GarbageCollector::Config) final;
+ void StartIncrementalGarbageCollection(GarbageCollector::Config) final;
size_t epoch() const final;
private:
diff --git a/deps/v8/src/heap/cppgc/heap-base.cc b/deps/v8/src/heap/cppgc/heap-base.cc
index c3ea0d3d16..5a92c4f159 100644
--- a/deps/v8/src/heap/cppgc/heap-base.cc
+++ b/deps/v8/src/heap/cppgc/heap-base.cc
@@ -54,7 +54,7 @@ class ObjectSizeCounter : private HeapVisitor<ObjectSizeCounter> {
} // namespace
HeapBase::HeapBase(std::shared_ptr<cppgc::Platform> platform,
- size_t custom_spaces)
+ size_t custom_spaces, StackSupport stack_support)
: raw_heap_(this, custom_spaces),
platform_(std::move(platform)),
#if defined(CPPGC_CAGED_HEAP)
@@ -70,7 +70,8 @@ HeapBase::HeapBase(std::shared_ptr<cppgc::Platform> platform,
prefinalizer_handler_(std::make_unique<PreFinalizerHandler>()),
object_allocator_(&raw_heap_, page_backend_.get(),
stats_collector_.get()),
- sweeper_(&raw_heap_, platform_.get(), stats_collector_.get()) {
+ sweeper_(&raw_heap_, platform_.get(), stats_collector_.get()),
+ stack_support_(stack_support) {
}
HeapBase::~HeapBase() = default;
@@ -89,5 +90,9 @@ void HeapBase::VerifyMarking(cppgc::Heap::StackState stack_state) {
MarkingVerifier verifier(*this, stack_state);
}
+void HeapBase::AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded() {
+ if (marker_) marker_->AdvanceMarkingOnAllocation();
+}
+
} // namespace internal
} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/heap-base.h b/deps/v8/src/heap/cppgc/heap-base.h
index df5646a202..efc4dbd40d 100644
--- a/deps/v8/src/heap/cppgc/heap-base.h
+++ b/deps/v8/src/heap/cppgc/heap-base.h
@@ -12,6 +12,7 @@
#include "include/cppgc/internal/persistent-node.h"
#include "include/cppgc/macros.h"
#include "src/base/macros.h"
+#include "src/heap/cppgc/marker.h"
#include "src/heap/cppgc/object-allocator.h"
#include "src/heap/cppgc/raw-heap.h"
#include "src/heap/cppgc/sweeper.h"
@@ -36,7 +37,6 @@ namespace testing {
class TestWithHeap;
} // namespace testing
-class MarkerBase;
class PageBackend;
class PreFinalizerHandler;
class StatsCollector;
@@ -44,6 +44,8 @@ class StatsCollector;
// Base class for heap implementations.
class V8_EXPORT_PRIVATE HeapBase {
public:
+ using StackSupport = cppgc::Heap::StackSupport;
+
// NoGCScope allows going over limits and avoids triggering garbage
// collection triggered through allocations or even explicitly.
class V8_EXPORT_PRIVATE NoGCScope final {
@@ -60,7 +62,8 @@ class V8_EXPORT_PRIVATE HeapBase {
HeapBase& heap_;
};
- HeapBase(std::shared_ptr<cppgc::Platform> platform, size_t custom_spaces);
+ HeapBase(std::shared_ptr<cppgc::Platform> platform, size_t custom_spaces,
+ StackSupport stack_support);
virtual ~HeapBase();
HeapBase(const HeapBase&) = delete;
@@ -116,9 +119,16 @@ class V8_EXPORT_PRIVATE HeapBase {
size_t ObjectPayloadSize() const;
+ StackSupport stack_support() const { return stack_support_; }
+
+ void AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded();
+
protected:
void VerifyMarking(cppgc::Heap::StackState);
+ virtual void FinalizeIncrementalGarbageCollectionIfNeeded(
+ cppgc::Heap::StackState) = 0;
+
bool in_no_gc_scope() const { return no_gc_scope_ > 0; }
RawHeap raw_heap_;
@@ -145,6 +155,9 @@ class V8_EXPORT_PRIVATE HeapBase {
size_t no_gc_scope_ = 0;
+ const StackSupport stack_support_;
+
+ friend class MarkerBase::IncrementalMarkingTask;
friend class testing::TestWithHeap;
};
diff --git a/deps/v8/src/heap/cppgc/heap-growing.cc b/deps/v8/src/heap/cppgc/heap-growing.cc
index 751d32b0e6..45c606505f 100644
--- a/deps/v8/src/heap/cppgc/heap-growing.cc
+++ b/deps/v8/src/heap/cppgc/heap-growing.cc
@@ -4,18 +4,29 @@
#include "src/heap/cppgc/heap-growing.h"
+#include <cmath>
#include <memory>
#include "include/cppgc/platform.h"
#include "src/base/macros.h"
#include "src/heap/cppgc/globals.h"
#include "src/heap/cppgc/heap.h"
+#include "src/heap/cppgc/incremental-marking-schedule.h"
#include "src/heap/cppgc/stats-collector.h"
#include "src/heap/cppgc/task-handle.h"
namespace cppgc {
namespace internal {
+namespace {
+// Minimum ratio between limit for incremental GC and limit for atomic GC
+// (to guarantee that limits are not to close to each other).
+constexpr double kMaximumLimitRatioForIncrementalGC = 0.9;
+// Minimum ratio between limit for incremental GC and limit for atomic GC
+// (to guarantee that limit is not too close to current allocated size).
+constexpr double kMinimumLimitRatioForIncrementalGC = 0.5;
+} // namespace
+
class HeapGrowing::HeapGrowingImpl final
: public StatsCollector::AllocationObserver {
public:
@@ -31,7 +42,10 @@ class HeapGrowing::HeapGrowingImpl final
void AllocatedObjectSizeDecreased(size_t) final {}
void ResetAllocatedObjectSize(size_t) final;
- size_t limit() const { return limit_; }
+ size_t limit_for_atomic_gc() const { return limit_for_atomic_gc_; }
+ size_t limit_for_incremental_gc() const { return limit_for_incremental_gc_; }
+
+ void DisableForTesting();
private:
void ConfigureLimit(size_t allocated_object_size);
@@ -40,9 +54,12 @@ class HeapGrowing::HeapGrowingImpl final
StatsCollector* stats_collector_;
// Allow 1 MB heap by default;
size_t initial_heap_size_ = 1 * kMB;
- size_t limit_ = 0; // See ConfigureLimit().
+ size_t limit_for_atomic_gc_ = 0; // See ConfigureLimit().
+ size_t limit_for_incremental_gc_ = 0; // See ConfigureLimit().
SingleThreadedHandle gc_task_handle_;
+
+ bool disabled_for_testing_ = false;
};
HeapGrowing::HeapGrowingImpl::HeapGrowingImpl(
@@ -64,9 +81,14 @@ HeapGrowing::HeapGrowingImpl::~HeapGrowingImpl() {
}
void HeapGrowing::HeapGrowingImpl::AllocatedObjectSizeIncreased(size_t) {
- if (stats_collector_->allocated_object_size() > limit_) {
+ if (disabled_for_testing_) return;
+ size_t allocated_object_size = stats_collector_->allocated_object_size();
+ if (allocated_object_size > limit_for_atomic_gc_) {
collector_->CollectGarbage(
GarbageCollector::Config::ConservativeAtomicConfig());
+ } else if (allocated_object_size > limit_for_incremental_gc_) {
+ collector_->StartIncrementalGarbageCollection(
+ GarbageCollector::Config::ConservativeIncrementalConfig());
}
}
@@ -78,8 +100,35 @@ void HeapGrowing::HeapGrowingImpl::ResetAllocatedObjectSize(
void HeapGrowing::HeapGrowingImpl::ConfigureLimit(
size_t allocated_object_size) {
const size_t size = std::max(allocated_object_size, initial_heap_size_);
- limit_ = std::max(static_cast<size_t>(size * kGrowingFactor),
- size + kMinLimitIncrease);
+ limit_for_atomic_gc_ = std::max(static_cast<size_t>(size * kGrowingFactor),
+ size + kMinLimitIncrease);
+ // Estimate when to start incremental GC based on current allocation speed.
+ // Ideally we start incremental GC such that it is ready to finalize no
+ // later than when we reach |limit_for_atomic_gc_|. However, we need to cap
+ // |limit_for_incremental_gc_| within a range to prevent:
+ // 1) |limit_for_incremental_gc_| being too close to |limit_for_atomic_gc_|
+ // such that incremental gc gets nothing done before reaching
+ // |limit_for_atomic_gc_| (in case where the allocation rate is very low).
+ // 2) |limit_for_incremental_gc_| being too close to |size| such that GC is
+ // essentially always running and write barriers are always active (in
+ // case allocation rate is very high).
+ size_t estimated_bytes_allocated_during_incremental_gc =
+ std::ceil(IncrementalMarkingSchedule::kEstimatedMarkingTimeMs *
+ stats_collector_->GetRecentAllocationSpeedInBytesPerMs());
+ size_t limit_incremental_gc_based_on_allocation_rate =
+ limit_for_atomic_gc_ - estimated_bytes_allocated_during_incremental_gc;
+ size_t maximum_limit_incremental_gc =
+ size + (limit_for_atomic_gc_ - size) * kMaximumLimitRatioForIncrementalGC;
+ size_t minimum_limit_incremental_gc =
+ size + (limit_for_atomic_gc_ - size) * kMinimumLimitRatioForIncrementalGC;
+ limit_for_incremental_gc_ =
+ std::max(minimum_limit_incremental_gc,
+ std::min(maximum_limit_incremental_gc,
+ limit_incremental_gc_based_on_allocation_rate));
+}
+
+void HeapGrowing::HeapGrowingImpl::DisableForTesting() {
+ disabled_for_testing_ = true;
}
HeapGrowing::HeapGrowing(GarbageCollector* collector,
@@ -90,7 +139,14 @@ HeapGrowing::HeapGrowing(GarbageCollector* collector,
HeapGrowing::~HeapGrowing() = default;
-size_t HeapGrowing::limit() const { return impl_->limit(); }
+size_t HeapGrowing::limit_for_atomic_gc() const {
+ return impl_->limit_for_atomic_gc();
+}
+size_t HeapGrowing::limit_for_incremental_gc() const {
+ return impl_->limit_for_incremental_gc();
+}
+
+void HeapGrowing::DisableForTesting() { impl_->DisableForTesting(); }
// static
constexpr double HeapGrowing::kGrowingFactor;
diff --git a/deps/v8/src/heap/cppgc/heap-growing.h b/deps/v8/src/heap/cppgc/heap-growing.h
index 772fc2db55..4ecedb3e16 100644
--- a/deps/v8/src/heap/cppgc/heap-growing.h
+++ b/deps/v8/src/heap/cppgc/heap-growing.h
@@ -40,7 +40,10 @@ class V8_EXPORT_PRIVATE HeapGrowing final {
HeapGrowing(const HeapGrowing&) = delete;
HeapGrowing& operator=(const HeapGrowing&) = delete;
- size_t limit() const;
+ size_t limit_for_atomic_gc() const;
+ size_t limit_for_incremental_gc() const;
+
+ void DisableForTesting();
private:
class HeapGrowingImpl;
diff --git a/deps/v8/src/heap/cppgc/heap.cc b/deps/v8/src/heap/cppgc/heap.cc
index ad28ead5d2..0db04fb537 100644
--- a/deps/v8/src/heap/cppgc/heap.cc
+++ b/deps/v8/src/heap/cppgc/heap.cc
@@ -40,8 +40,9 @@ std::unique_ptr<Heap> Heap::Create(std::shared_ptr<cppgc::Platform> platform,
void Heap::ForceGarbageCollectionSlow(const char* source, const char* reason,
Heap::StackState stack_state) {
internal::Heap::From(this)->CollectGarbage(
- {internal::GarbageCollector::Config::CollectionType::kMajor,
- stack_state});
+ {internal::GarbageCollector::Config::CollectionType::kMajor, stack_state,
+ internal::GarbageCollector::Config::MarkingType::kAtomic,
+ internal::GarbageCollector::Config::SweepingType::kAtomic});
}
AllocationHandle& Heap::GetAllocationHandle() {
@@ -76,7 +77,7 @@ void CheckConfig(Heap::Config config) {
Heap::Heap(std::shared_ptr<cppgc::Platform> platform,
cppgc::Heap::HeapOptions options)
- : HeapBase(platform, options.custom_spaces.size()),
+ : HeapBase(platform, options.custom_spaces.size(), options.stack_support),
gc_invoker_(this, platform_.get(), options.stack_support),
growing_(&gc_invoker_, stats_collector_.get(),
options.resource_constraints) {}
@@ -84,14 +85,54 @@ Heap::Heap(std::shared_ptr<cppgc::Platform> platform,
Heap::~Heap() {
NoGCScope no_gc(*this);
// Finish already running GC if any, but don't finalize live objects.
- sweeper_.Finish();
+ sweeper_.FinishIfRunning();
}
void Heap::CollectGarbage(Config config) {
+ DCHECK_EQ(Config::MarkingType::kAtomic, config.marking_type);
CheckConfig(config);
if (in_no_gc_scope()) return;
+ config_ = config;
+
+ if (!gc_in_progress_) StartGarbageCollection(config);
+
+ DCHECK(marker_);
+
+ FinalizeGarbageCollection(config.stack_state);
+}
+
+void Heap::StartIncrementalGarbageCollection(Config config) {
+ DCHECK_NE(Config::MarkingType::kAtomic, config.marking_type);
+ CheckConfig(config);
+
+ if (gc_in_progress_ || in_no_gc_scope()) return;
+
+ config_ = config;
+
+ StartGarbageCollection(config);
+}
+
+void Heap::FinalizeIncrementalGarbageCollectionIfRunning(Config config) {
+ if (!gc_in_progress_) return;
+
+ DCHECK(!in_no_gc_scope());
+
+ DCHECK_NE(Config::MarkingType::kAtomic, config_.marking_type);
+ config_ = config;
+ FinalizeGarbageCollection(config.stack_state);
+}
+
+void Heap::StartGarbageCollection(Config config) {
+ DCHECK(!gc_in_progress_);
+
+ DCHECK(!in_no_gc_scope());
+
+ // Finish sweeping in case it is still running.
+ sweeper_.FinishIfRunning();
+
+ gc_in_progress_ = true;
epoch_++;
#if defined(CPPGC_YOUNG_GENERATION)
@@ -99,13 +140,18 @@ void Heap::CollectGarbage(Config config) {
Unmarker unmarker(&raw_heap());
#endif
- // "Marking".
- marker_ = std::make_unique<Marker>(AsBase());
const Marker::MarkingConfig marking_config{
config.collection_type, config.stack_state, config.marking_type};
- marker_->StartMarking(marking_config);
- marker_->FinishMarking(marking_config);
- // "Sweeping and finalization".
+ marker_ = MarkerFactory::CreateAndStartMarking<Marker>(
+ AsBase(), platform_.get(), marking_config);
+}
+
+void Heap::FinalizeGarbageCollection(Config::StackState stack_state) {
+ DCHECK(gc_in_progress_);
+ DCHECK(!in_no_gc_scope());
+ config_.stack_state = stack_state;
+ DCHECK(marker_);
+ marker_->FinishMarking(stack_state);
{
// Pre finalizers are forbidden from allocating objects.
ObjectAllocator::NoAllocationScope no_allocation_scope_(object_allocator_);
@@ -115,13 +161,16 @@ void Heap::CollectGarbage(Config config) {
marker_.reset();
// TODO(chromium:1056170): replace build flag with dedicated flag.
#if DEBUG
- VerifyMarking(config.stack_state);
+ VerifyMarking(stack_state);
#endif
{
NoGCScope no_gc(*this);
- sweeper_.Start(config.sweeping_type);
+ sweeper_.Start(config_.sweeping_type);
}
+ gc_in_progress_ = false;
}
+void Heap::DisableHeapGrowingForTesting() { growing_.DisableForTesting(); }
+
} // namespace internal
} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/heap.h b/deps/v8/src/heap/cppgc/heap.h
index 2512afd1fd..cd4d3d2bfe 100644
--- a/deps/v8/src/heap/cppgc/heap.h
+++ b/deps/v8/src/heap/cppgc/heap.h
@@ -32,14 +32,28 @@ class V8_EXPORT_PRIVATE Heap final : public HeapBase,
HeapBase& AsBase() { return *this; }
const HeapBase& AsBase() const { return *this; }
- void CollectGarbage(Config config) final;
+ void CollectGarbage(Config) final;
+ void StartIncrementalGarbageCollection(Config) final;
+ void FinalizeIncrementalGarbageCollectionIfRunning(Config);
size_t epoch() const final { return epoch_; }
+ void DisableHeapGrowingForTesting();
+
private:
+ void StartGarbageCollection(Config);
+ void FinalizeGarbageCollection(Config::StackState);
+
+ void FinalizeIncrementalGarbageCollectionIfNeeded(
+ Config::StackState stack_state) final {
+ FinalizeGarbageCollection(stack_state);
+ }
+
+ Config config_;
GCInvoker gc_invoker_;
HeapGrowing growing_;
+ bool gc_in_progress_ = false;
size_t epoch_ = 0;
};
diff --git a/deps/v8/src/heap/cppgc/incremental-marking-schedule.cc b/deps/v8/src/heap/cppgc/incremental-marking-schedule.cc
new file mode 100644
index 0000000000..7e1ff951ab
--- /dev/null
+++ b/deps/v8/src/heap/cppgc/incremental-marking-schedule.cc
@@ -0,0 +1,74 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/cppgc/incremental-marking-schedule.h"
+
+#include <cmath>
+
+#include "src/heap/cppgc/globals.h"
+
+namespace cppgc {
+namespace internal {
+
+const double IncrementalMarkingSchedule::kEstimatedMarkingTimeMs = 500.0;
+const size_t IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep =
+ 64 * kKB;
+
+void IncrementalMarkingSchedule::NotifyIncrementalMarkingStart() {
+ DCHECK(incremental_marking_start_time_.IsNull());
+ incremental_marking_start_time_ = v8::base::TimeTicks::Now();
+}
+
+void IncrementalMarkingSchedule::UpdateIncrementalMarkedBytes(
+ size_t overall_marked_bytes) {
+ DCHECK(!incremental_marking_start_time_.IsNull());
+ incrementally_marked_bytes_ = overall_marked_bytes;
+}
+
+void IncrementalMarkingSchedule::AddConcurrentlyMarkedBytes(
+ size_t marked_bytes) {
+ DCHECK(!incremental_marking_start_time_.IsNull());
+ concurrently_marked_bytes_.fetch_add(marked_bytes, std::memory_order_relaxed);
+}
+
+size_t IncrementalMarkingSchedule::GetOverallMarkedBytes() {
+ return incrementally_marked_bytes_ +
+ concurrently_marked_bytes_.load(std::memory_order_relaxed);
+}
+
+double IncrementalMarkingSchedule::GetElapsedTimeInMs(
+ v8::base::TimeTicks start_time) {
+ if (elapsed_time_for_testing_ != kNoSetElapsedTimeForTesting) {
+ double elapsed_time = elapsed_time_for_testing_;
+ elapsed_time_for_testing_ = kNoSetElapsedTimeForTesting;
+ return elapsed_time;
+ }
+ return (v8::base::TimeTicks::Now() - start_time).InMillisecondsF();
+}
+
+size_t IncrementalMarkingSchedule::GetNextIncrementalStepDuration(
+ size_t estimated_live_bytes) {
+ DCHECK(!incremental_marking_start_time_.IsNull());
+ double elapsed_time_in_ms =
+ GetElapsedTimeInMs(incremental_marking_start_time_);
+ size_t actual_marked_bytes = GetOverallMarkedBytes();
+ size_t expected_marked_bytes = std::ceil(
+ estimated_live_bytes * elapsed_time_in_ms / kEstimatedMarkingTimeMs);
+ if (expected_marked_bytes < actual_marked_bytes) {
+ // Marking is ahead of schedule, incremental marking should do the minimum.
+ return kMinimumMarkedBytesPerIncrementalStep;
+ }
+ // Assuming marking will take |kEstimatedMarkingTime|, overall there will
+ // be |estimated_live_bytes| live bytes to mark, and that marking speed is
+ // constant, after |elapsed_time| the number of marked_bytes should be
+ // |estimated_live_bytes| * (|elapsed_time| / |kEstimatedMarkingTime|),
+ // denoted as |expected_marked_bytes|. If |actual_marked_bytes| is less,
+ // i.e. marking is behind schedule, incremental marking should help "catch
+ // up" by marking (|expected_marked_bytes| - |actual_marked_bytes|).
+ return std::max(kMinimumMarkedBytesPerIncrementalStep,
+ expected_marked_bytes - actual_marked_bytes);
+}
+
+} // namespace internal
+} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/incremental-marking-schedule.h b/deps/v8/src/heap/cppgc/incremental-marking-schedule.h
new file mode 100644
index 0000000000..3c8a9e1a01
--- /dev/null
+++ b/deps/v8/src/heap/cppgc/incremental-marking-schedule.h
@@ -0,0 +1,53 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_CPPGC_INCREMENTAL_MARKING_SCHEDULE_H_
+#define V8_HEAP_CPPGC_INCREMENTAL_MARKING_SCHEDULE_H_
+
+#include <atomic>
+
+#include "src/base/platform/time.h"
+
+namespace cppgc {
+namespace internal {
+
+class V8_EXPORT_PRIVATE IncrementalMarkingSchedule {
+ public:
+ // Estimated duration of GC cycle in milliseconds.
+ static const double kEstimatedMarkingTimeMs;
+
+ // Minimum number of bytes that should be marked during an incremental
+ // marking step.
+ static const size_t kMinimumMarkedBytesPerIncrementalStep;
+
+ void NotifyIncrementalMarkingStart();
+
+ void UpdateIncrementalMarkedBytes(size_t);
+ void AddConcurrentlyMarkedBytes(size_t);
+
+ size_t GetOverallMarkedBytes();
+
+ size_t GetNextIncrementalStepDuration(size_t);
+
+ void SetElapsedTimeForTesting(double elapsed_time) {
+ elapsed_time_for_testing_ = elapsed_time;
+ }
+
+ private:
+ double GetElapsedTimeInMs(v8::base::TimeTicks);
+
+ v8::base::TimeTicks incremental_marking_start_time_;
+
+ size_t incrementally_marked_bytes_ = 0;
+ std::atomic_size_t concurrently_marked_bytes_{0};
+
+ // Using -1 as sentinel to denote
+ static constexpr double kNoSetElapsedTimeForTesting = -1;
+ double elapsed_time_for_testing_ = kNoSetElapsedTimeForTesting;
+};
+
+} // namespace internal
+} // namespace cppgc
+
+#endif // V8_HEAP_CPPGC_INCREMENTAL_MARKING_SCHEDULE_H_
diff --git a/deps/v8/src/heap/cppgc/marker.cc b/deps/v8/src/heap/cppgc/marker.cc
index 104d4d2041..0d044588b6 100644
--- a/deps/v8/src/heap/cppgc/marker.cc
+++ b/deps/v8/src/heap/cppgc/marker.cc
@@ -7,6 +7,7 @@
#include <memory>
#include "include/cppgc/internal/process-heap.h"
+#include "include/cppgc/platform.h"
#include "src/heap/cppgc/heap-object-header.h"
#include "src/heap/cppgc/heap-page.h"
#include "src/heap/cppgc/heap-visitor.h"
@@ -25,28 +26,32 @@ namespace internal {
namespace {
-void EnterIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
+bool EnterIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
HeapBase& heap) {
if (config.marking_type == Marker::MarkingConfig::MarkingType::kIncremental ||
config.marking_type ==
Marker::MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
ProcessHeap::EnterIncrementalOrConcurrentMarking();
- }
#if defined(CPPGC_CAGED_HEAP)
- heap.caged_heap().local_data().is_marking_in_progress = true;
+ heap.caged_heap().local_data().is_marking_in_progress = true;
#endif
+ return true;
+ }
+ return false;
}
-void ExitIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
+bool ExitIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
HeapBase& heap) {
if (config.marking_type == Marker::MarkingConfig::MarkingType::kIncremental ||
config.marking_type ==
Marker::MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
ProcessHeap::ExitIncrementalOrConcurrentMarking();
- }
#if defined(CPPGC_CAGED_HEAP)
- heap.caged_heap().local_data().is_marking_in_progress = false;
+ heap.caged_heap().local_data().is_marking_in_progress = false;
#endif
+ return true;
+ }
+ return false;
}
// Visit remembered set that was recorded in the generational barrier.
@@ -78,26 +83,42 @@ void ResetRememberedSet(HeapBase& heap) {
#endif
}
-template <typename Worklist, typename Callback>
-bool DrainWorklistWithDeadline(v8::base::TimeTicks deadline, Worklist* worklist,
- Callback callback, int task_id) {
- const size_t kDeadlineCheckInterval = 1250;
+static constexpr size_t kDefaultDeadlineCheckInterval = 150u;
+template <size_t kDeadlineCheckInterval = kDefaultDeadlineCheckInterval,
+ typename WorklistLocal, typename Callback, typename Predicate>
+bool DrainWorklistWithDeadline(Predicate should_yield,
+ WorklistLocal& worklist_local,
+ Callback callback) {
size_t processed_callback_count = 0;
- typename Worklist::View view(worklist, task_id);
- typename Worklist::EntryType item;
- while (view.Pop(&item)) {
+ typename WorklistLocal::ItemType item;
+ while (worklist_local.Pop(&item)) {
callback(item);
- if (++processed_callback_count == kDeadlineCheckInterval) {
- if (deadline <= v8::base::TimeTicks::Now()) {
+ if (processed_callback_count-- == 0) {
+ if (should_yield()) {
return false;
}
- processed_callback_count = 0;
+ processed_callback_count = kDeadlineCheckInterval;
}
}
return true;
}
+template <size_t kDeadlineCheckInterval = kDefaultDeadlineCheckInterval,
+ typename WorklistLocal, typename Callback>
+bool DrainWorklistWithBytesAndTimeDeadline(MarkingState& marking_state,
+ size_t marked_bytes_deadline,
+ v8::base::TimeTicks time_deadline,
+ WorklistLocal& worklist_local,
+ Callback callback) {
+ return DrainWorklistWithDeadline(
+ [&marking_state, marked_bytes_deadline, time_deadline]() {
+ return (marked_bytes_deadline <= marking_state.marked_bytes()) ||
+ (time_deadline <= v8::base::TimeTicks::Now());
+ },
+ worklist_local, callback);
+}
+
void TraceMarkedObject(Visitor* visitor, const HeapObjectHeader* header) {
DCHECK(header);
DCHECK(!header->IsInConstruction<HeapObjectHeader::AccessMode::kNonAtomic>());
@@ -107,15 +128,64 @@ void TraceMarkedObject(Visitor* visitor, const HeapObjectHeader* header) {
gcinfo.trace(visitor, header->Payload());
}
+size_t GetNextIncrementalStepDuration(IncrementalMarkingSchedule& schedule,
+ HeapBase& heap) {
+ return schedule.GetNextIncrementalStepDuration(
+ heap.stats_collector()->allocated_object_size());
+}
+
} // namespace
-MarkerBase::MarkerBase(HeapBase& heap)
+constexpr v8::base::TimeDelta MarkerBase::kMaximumIncrementalStepDuration;
+
+MarkerBase::IncrementalMarkingTask::IncrementalMarkingTask(
+ MarkerBase* marker, MarkingConfig::StackState stack_state)
+ : marker_(marker),
+ stack_state_(stack_state),
+ handle_(Handle::NonEmptyTag{}) {}
+
+// static
+MarkerBase::IncrementalMarkingTask::Handle
+MarkerBase::IncrementalMarkingTask::Post(cppgc::TaskRunner* runner,
+ MarkerBase* marker) {
+ // Incremental GC is possible only via the GCInvoker, so getting here
+ // guarantees that either non-nestable tasks or conservative stack
+ // scannnig are supported. This is required so that the incremental
+ // task can safely finalize GC if needed.
+ DCHECK_IMPLIES(marker->heap().stack_support() !=
+ HeapBase::StackSupport::kSupportsConservativeStackScan,
+ runner->NonNestableTasksEnabled());
+ MarkingConfig::StackState stack_state_for_task =
+ runner->NonNestableTasksEnabled()
+ ? MarkingConfig::StackState::kNoHeapPointers
+ : MarkingConfig::StackState::kMayContainHeapPointers;
+ auto task =
+ std::make_unique<IncrementalMarkingTask>(marker, stack_state_for_task);
+ auto handle = task->handle_;
+ if (runner->NonNestableTasksEnabled()) {
+ runner->PostNonNestableTask(std::move(task));
+ } else {
+ runner->PostTask(std::move(task));
+ }
+ return handle;
+}
+
+void MarkerBase::IncrementalMarkingTask::Run() {
+ if (handle_.IsCanceled()) return;
+
+ if (marker_->IncrementalMarkingStep(stack_state_)) {
+ // Incremental marking is done so should finalize GC.
+ marker_->heap().FinalizeIncrementalGarbageCollectionIfNeeded(stack_state_);
+ }
+}
+
+MarkerBase::MarkerBase(Key, HeapBase& heap, cppgc::Platform* platform,
+ MarkingConfig config)
: heap_(heap),
- mutator_marking_state_(
- heap, marking_worklists_.marking_worklist(),
- marking_worklists_.not_fully_constructed_worklist(),
- marking_worklists_.weak_callback_worklist(),
- MarkingWorklists::kMutatorThreadId) {}
+ config_(config),
+ platform_(platform),
+ foreground_task_runner_(platform_->GetForegroundTaskRunner()),
+ mutator_marking_state_(heap, marking_worklists_) {}
MarkerBase::~MarkerBase() {
// The fixed point iteration may have found not-fully-constructed objects.
@@ -125,10 +195,9 @@ MarkerBase::~MarkerBase() {
#if DEBUG
DCHECK_NE(MarkingConfig::StackState::kNoHeapPointers, config_.stack_state);
HeapObjectHeader* header;
- MarkingWorklists::NotFullyConstructedWorklist::View view(
- marking_worklists_.not_fully_constructed_worklist(),
- MarkingWorklists::kMutatorThreadId);
- while (view.Pop(&header)) {
+ MarkingWorklists::NotFullyConstructedWorklist::Local& local =
+ mutator_marking_state_.not_fully_constructed_worklist();
+ while (local.Pop(&header)) {
DCHECK(header->IsMarked());
}
#else
@@ -137,37 +206,52 @@ MarkerBase::~MarkerBase() {
}
}
-void MarkerBase::StartMarking(MarkingConfig config) {
+void MarkerBase::StartMarking() {
heap().stats_collector()->NotifyMarkingStarted();
- config_ = config;
- VisitRoots();
- EnterIncrementalMarkingIfNeeded(config, heap());
+ is_marking_started_ = true;
+ if (EnterIncrementalMarkingIfNeeded(config_, heap())) {
+ // Performing incremental or concurrent marking.
+ schedule_.NotifyIncrementalMarkingStart();
+ // Scanning the stack is expensive so we only do it at the atomic pause.
+ VisitRoots(MarkingConfig::StackState::kNoHeapPointers);
+ ScheduleIncrementalMarkingTask();
+ }
}
-void MarkerBase::EnterAtomicPause(MarkingConfig config) {
- ExitIncrementalMarkingIfNeeded(config_, heap());
- config_ = config;
+void MarkerBase::EnterAtomicPause(MarkingConfig::StackState stack_state) {
+ if (ExitIncrementalMarkingIfNeeded(config_, heap())) {
+ // Cancel remaining incremental tasks.
+ if (incremental_marking_handle_) incremental_marking_handle_.Cancel();
+ }
+ config_.stack_state = stack_state;
+ config_.marking_type = MarkingConfig::MarkingType::kAtomic;
// VisitRoots also resets the LABs.
- VisitRoots();
+ VisitRoots(config_.stack_state);
if (config_.stack_state == MarkingConfig::StackState::kNoHeapPointers) {
- marking_worklists_.FlushNotFullyConstructedObjects();
+ mutator_marking_state_.FlushNotFullyConstructedObjects();
} else {
MarkNotFullyConstructedObjects();
}
}
void MarkerBase::LeaveAtomicPause() {
+ DCHECK(!incremental_marking_handle_);
ResetRememberedSet(heap());
heap().stats_collector()->NotifyMarkingCompleted(
- mutator_marking_state_.marked_bytes());
+ // GetOverallMarkedBytes also includes concurrently marked bytes.
+ schedule_.GetOverallMarkedBytes());
}
-void MarkerBase::FinishMarking(MarkingConfig config) {
- EnterAtomicPause(config);
- AdvanceMarkingWithDeadline(v8::base::TimeDelta::Max());
+void MarkerBase::FinishMarking(MarkingConfig::StackState stack_state) {
+ DCHECK(is_marking_started_);
+ EnterAtomicPause(stack_state);
+ ProcessWorklistsWithDeadline(std::numeric_limits<size_t>::max(),
+ v8::base::TimeTicks::Max());
+ mutator_marking_state_.Publish();
LeaveAtomicPause();
+ is_marking_started_ = false;
}
void MarkerBase::ProcessWeakness() {
@@ -176,23 +260,22 @@ void MarkerBase::ProcessWeakness() {
// Call weak callbacks on objects that may now be pointing to dead objects.
MarkingWorklists::WeakCallbackItem item;
LivenessBroker broker = LivenessBrokerFactory::Create();
- MarkingWorklists::WeakCallbackWorklist::View view(
- marking_worklists_.weak_callback_worklist(),
- MarkingWorklists::kMutatorThreadId);
- while (view.Pop(&item)) {
+ MarkingWorklists::WeakCallbackWorklist::Local& local =
+ mutator_marking_state_.weak_callback_worklist();
+ while (local.Pop(&item)) {
item.callback(broker, item.parameter);
}
// Weak callbacks should not add any new objects for marking.
DCHECK(marking_worklists_.marking_worklist()->IsEmpty());
}
-void MarkerBase::VisitRoots() {
+void MarkerBase::VisitRoots(MarkingConfig::StackState stack_state) {
// Reset LABs before scanning roots. LABs are cleared to allow
// ObjectStartBitmap handling without considering LABs.
heap().object_allocator().ResetLinearAllocationBuffers();
heap().GetStrongPersistentRegion().Trace(&visitor());
- if (config_.stack_state != MarkingConfig::StackState::kNoHeapPointers) {
+ if (stack_state != MarkingConfig::StackState::kNoHeapPointers) {
heap().stack()->IteratePointers(&stack_visitor());
}
if (config_.collection_type == MarkingConfig::CollectionType::kMinor) {
@@ -200,25 +283,79 @@ void MarkerBase::VisitRoots() {
}
}
-bool MarkerBase::AdvanceMarkingWithDeadline(v8::base::TimeDelta duration) {
- v8::base::TimeTicks deadline = v8::base::TimeTicks::Now() + duration;
+void MarkerBase::ScheduleIncrementalMarkingTask() {
+ if (!platform_ || !foreground_task_runner_ || incremental_marking_handle_)
+ return;
+ incremental_marking_handle_ =
+ IncrementalMarkingTask::Post(foreground_task_runner_.get(), this);
+}
+
+bool MarkerBase::IncrementalMarkingStepForTesting(
+ MarkingConfig::StackState stack_state) {
+ return IncrementalMarkingStep(stack_state);
+}
+
+bool MarkerBase::IncrementalMarkingStep(MarkingConfig::StackState stack_state) {
+ if (stack_state == MarkingConfig::StackState::kNoHeapPointers) {
+ mutator_marking_state_.FlushNotFullyConstructedObjects();
+ }
+ config_.stack_state = stack_state;
+
+ return AdvanceMarkingWithDeadline();
+}
+
+bool MarkerBase::AdvanceMarkingOnAllocation() {
+ bool is_done = AdvanceMarkingWithDeadline();
+ if (is_done) {
+ // Schedule another incremental task for finalizing without a stack.
+ ScheduleIncrementalMarkingTask();
+ }
+ return is_done;
+}
+
+bool MarkerBase::AdvanceMarkingWithMaxDuration(
+ v8::base::TimeDelta max_duration) {
+ return AdvanceMarkingWithDeadline(max_duration);
+}
+
+bool MarkerBase::AdvanceMarkingWithDeadline(v8::base::TimeDelta max_duration) {
+ bool is_done = false;
+ if (!incremental_marking_disabled_for_testing_) {
+ size_t step_size_in_bytes =
+ GetNextIncrementalStepDuration(schedule_, heap_);
+ is_done = ProcessWorklistsWithDeadline(
+ mutator_marking_state_.marked_bytes() + step_size_in_bytes,
+ v8::base::TimeTicks::Now() + max_duration);
+ }
+ schedule_.UpdateIncrementalMarkedBytes(mutator_marking_state_.marked_bytes());
+ if (!is_done) {
+ // If marking is atomic, |is_done| should always be true.
+ DCHECK_NE(MarkingConfig::MarkingType::kAtomic, config_.marking_type);
+ ScheduleIncrementalMarkingTask();
+ }
+ mutator_marking_state_.Publish();
+ return is_done;
+}
+bool MarkerBase::ProcessWorklistsWithDeadline(
+ size_t marked_bytes_deadline, v8::base::TimeTicks time_deadline) {
do {
// Convert |previously_not_fully_constructed_worklist_| to
// |marking_worklist_|. This merely re-adds items with the proper
// callbacks.
- if (!DrainWorklistWithDeadline(
- deadline,
- marking_worklists_.previously_not_fully_constructed_worklist(),
+ if (!DrainWorklistWithBytesAndTimeDeadline(
+ mutator_marking_state_, marked_bytes_deadline, time_deadline,
+ mutator_marking_state_.previously_not_fully_constructed_worklist(),
[this](HeapObjectHeader* header) {
TraceMarkedObject(&visitor(), header);
mutator_marking_state_.AccountMarkedBytes(*header);
- },
- MarkingWorklists::kMutatorThreadId))
+ })) {
return false;
+ }
- if (!DrainWorklistWithDeadline(
- deadline, marking_worklists_.marking_worklist(),
+ if (!DrainWorklistWithBytesAndTimeDeadline(
+ mutator_marking_state_, marked_bytes_deadline, time_deadline,
+ mutator_marking_state_.marking_worklist(),
[this](const MarkingWorklists::MarkingItem& item) {
const HeapObjectHeader& header =
HeapObjectHeader::FromPayload(item.base_object_payload);
@@ -228,30 +365,28 @@ bool MarkerBase::AdvanceMarkingWithDeadline(v8::base::TimeDelta duration) {
header.IsMarked<HeapObjectHeader::AccessMode::kNonAtomic>());
item.callback(&visitor(), item.base_object_payload);
mutator_marking_state_.AccountMarkedBytes(header);
- },
- MarkingWorklists::kMutatorThreadId))
+ })) {
return false;
+ }
- if (!DrainWorklistWithDeadline(
- deadline, marking_worklists_.write_barrier_worklist(),
+ if (!DrainWorklistWithBytesAndTimeDeadline(
+ mutator_marking_state_, marked_bytes_deadline, time_deadline,
+ mutator_marking_state_.write_barrier_worklist(),
[this](HeapObjectHeader* header) {
TraceMarkedObject(&visitor(), header);
mutator_marking_state_.AccountMarkedBytes(*header);
- },
- MarkingWorklists::kMutatorThreadId))
+ })) {
return false;
- } while (!marking_worklists_.marking_worklist()->IsLocalViewEmpty(
- MarkingWorklists::kMutatorThreadId));
-
+ }
+ } while (!mutator_marking_state_.marking_worklist().IsLocalAndGlobalEmpty());
return true;
}
void MarkerBase::MarkNotFullyConstructedObjects() {
HeapObjectHeader* header;
- MarkingWorklists::NotFullyConstructedWorklist::View view(
- marking_worklists_.not_fully_constructed_worklist(),
- MarkingWorklists::kMutatorThreadId);
- while (view.Pop(&header)) {
+ MarkingWorklists::NotFullyConstructedWorklist::Local& local =
+ mutator_marking_state_.not_fully_constructed_worklist();
+ while (local.Pop(&header)) {
DCHECK(header);
DCHECK(header->IsMarked<HeapObjectHeader::AccessMode::kNonAtomic>());
// TraceConservativelyIfNeeded will either push to a worklist
@@ -264,8 +399,13 @@ void MarkerBase::ClearAllWorklistsForTesting() {
marking_worklists_.ClearForTesting();
}
-Marker::Marker(HeapBase& heap)
- : MarkerBase(heap),
+void MarkerBase::DisableIncrementalMarkingForTesting() {
+ incremental_marking_disabled_for_testing_ = true;
+}
+
+Marker::Marker(Key key, HeapBase& heap, cppgc::Platform* platform,
+ MarkingConfig config)
+ : MarkerBase(key, heap, platform, config),
marking_visitor_(heap, mutator_marking_state_),
conservative_marking_visitor_(heap, mutator_marking_state_,
marking_visitor_) {}
diff --git a/deps/v8/src/heap/cppgc/marker.h b/deps/v8/src/heap/cppgc/marker.h
index 80a056c436..47ce9998b4 100644
--- a/deps/v8/src/heap/cppgc/marker.h
+++ b/deps/v8/src/heap/cppgc/marker.h
@@ -11,20 +11,24 @@
#include "include/cppgc/visitor.h"
#include "src/base/macros.h"
#include "src/base/platform/time.h"
+#include "src/heap/base/worklist.h"
#include "src/heap/cppgc/globals.h"
+#include "src/heap/cppgc/incremental-marking-schedule.h"
#include "src/heap/cppgc/marking-state.h"
#include "src/heap/cppgc/marking-visitor.h"
#include "src/heap/cppgc/marking-worklists.h"
-#include "src/heap/cppgc/worklist.h"
+#include "src/heap/cppgc/task-handle.h"
namespace cppgc {
namespace internal {
class HeapBase;
+class MarkerFactory;
// Marking algorithm. Example for a valid call sequence creating the marking
// phase:
-// 1. StartMarking()
+// 1. StartMarking() [Called implicitly when creating a Marker using
+// MarkerFactory]
// 2. AdvanceMarkingWithDeadline() [Optional, depending on environment.]
// 3. EnterAtomicPause()
// 4. AdvanceMarkingWithDeadline()
@@ -47,9 +51,9 @@ class V8_EXPORT_PRIVATE MarkerBase {
static constexpr MarkingConfig Default() { return {}; }
- CollectionType collection_type = CollectionType::kMajor;
+ const CollectionType collection_type = CollectionType::kMajor;
StackState stack_state = StackState::kMayContainHeapPointers;
- MarkingType marking_type = MarkingType::kAtomic;
+ MarkingType marking_type = MarkingType::kIncremental;
};
virtual ~MarkerBase();
@@ -57,18 +61,19 @@ class V8_EXPORT_PRIVATE MarkerBase {
MarkerBase(const MarkerBase&) = delete;
MarkerBase& operator=(const MarkerBase&) = delete;
- // Initialize marking according to the given config. This method will
- // trigger incremental/concurrent marking if needed.
- void StartMarking(MarkingConfig config);
-
// Signals entering the atomic marking pause. The method
// - stops incremental/concurrent marking;
// - flushes back any in-construction worklists if needed;
// - Updates the MarkingConfig if the stack state has changed;
- void EnterAtomicPause(MarkingConfig config);
+ void EnterAtomicPause(MarkingConfig::StackState);
// Makes marking progress.
- virtual bool AdvanceMarkingWithDeadline(v8::base::TimeDelta);
+ // TODO(chromium:1056170): Remove TimeDelta argument when unified heap no
+ // longer uses it.
+ bool AdvanceMarkingWithMaxDuration(v8::base::TimeDelta);
+
+ // Makes marking progress when allocation a new lab.
+ bool AdvanceMarkingOnAllocation();
// Signals leaving the atomic marking pause. This method expects no more
// objects to be marked and merely updates marking states if needed.
@@ -78,7 +83,7 @@ class V8_EXPORT_PRIVATE MarkerBase {
// - EnterAtomicPause()
// - AdvanceMarkingWithDeadline()
// - LeaveAtomicPause()
- void FinishMarking(MarkingConfig config);
+ void FinishMarking(MarkingConfig::StackState);
void ProcessWeakness();
@@ -92,27 +97,98 @@ class V8_EXPORT_PRIVATE MarkerBase {
cppgc::Visitor& VisitorForTesting() { return visitor(); }
void ClearAllWorklistsForTesting();
+ bool IncrementalMarkingStepForTesting(MarkingConfig::StackState);
+
+ class IncrementalMarkingTask final : public cppgc::Task {
+ public:
+ using Handle = SingleThreadedHandle;
+
+ IncrementalMarkingTask(MarkerBase*, MarkingConfig::StackState);
+
+ static Handle Post(cppgc::TaskRunner*, MarkerBase*);
+
+ private:
+ void Run() final;
+
+ MarkerBase* const marker_;
+ MarkingConfig::StackState stack_state_;
+ // TODO(chromium:1056170): Change to CancelableTask.
+ Handle handle_;
+ };
+
+ void DisableIncrementalMarkingForTesting();
+
protected:
- explicit MarkerBase(HeapBase& heap);
+ static constexpr v8::base::TimeDelta kMaximumIncrementalStepDuration =
+ v8::base::TimeDelta::FromMilliseconds(2);
+
+ class Key {
+ private:
+ Key() = default;
+ friend class MarkerFactory;
+ };
+
+ MarkerBase(Key, HeapBase&, cppgc::Platform*, MarkingConfig);
+
+ // Initialize marking according to the given config. This method will
+ // trigger incremental/concurrent marking if needed.
+ void StartMarking();
virtual cppgc::Visitor& visitor() = 0;
virtual ConservativeTracingVisitor& conservative_visitor() = 0;
virtual heap::base::StackVisitor& stack_visitor() = 0;
- void VisitRoots();
+ // Makes marking progress.
+ // TODO(chromium:1056170): Remove TimeDelta argument when unified heap no
+ // longer uses it.
+ bool AdvanceMarkingWithDeadline(
+ v8::base::TimeDelta = kMaximumIncrementalStepDuration);
+
+ bool ProcessWorklistsWithDeadline(size_t, v8::base::TimeTicks);
+
+ void VisitRoots(MarkingConfig::StackState);
void MarkNotFullyConstructedObjects();
+ void ScheduleIncrementalMarkingTask();
+
+ bool IncrementalMarkingStep(MarkingConfig::StackState);
+
HeapBase& heap_;
MarkingConfig config_ = MarkingConfig::Default();
+ cppgc::Platform* platform_;
+ std::shared_ptr<cppgc::TaskRunner> foreground_task_runner_;
+ IncrementalMarkingTask::Handle incremental_marking_handle_;
+
MarkingWorklists marking_worklists_;
MarkingState mutator_marking_state_;
+ bool is_marking_started_ = false;
+
+ IncrementalMarkingSchedule schedule_;
+
+ bool incremental_marking_disabled_for_testing_{false};
+
+ friend class MarkerFactory;
+};
+
+class V8_EXPORT_PRIVATE MarkerFactory {
+ public:
+ template <typename T, typename... Args>
+ static std::unique_ptr<T> CreateAndStartMarking(Args&&... args) {
+ static_assert(std::is_base_of<MarkerBase, T>::value,
+ "MarkerFactory can only create subclasses of MarkerBase");
+ std::unique_ptr<T> marker =
+ std::make_unique<T>(MarkerBase::Key(), std::forward<Args>(args)...);
+ marker->StartMarking();
+ return marker;
+ }
};
class V8_EXPORT_PRIVATE Marker final : public MarkerBase {
public:
- explicit Marker(HeapBase&);
+ Marker(Key, HeapBase&, cppgc::Platform*,
+ MarkingConfig = MarkingConfig::Default());
protected:
cppgc::Visitor& visitor() final { return marking_visitor_; }
@@ -129,18 +205,11 @@ class V8_EXPORT_PRIVATE Marker final : public MarkerBase {
};
void MarkerBase::WriteBarrierForInConstructionObject(HeapObjectHeader& header) {
- MarkingWorklists::NotFullyConstructedWorklist::View
- not_fully_constructed_worklist(
- marking_worklists_.not_fully_constructed_worklist(),
- MarkingWorklists::kMutatorThreadId);
- not_fully_constructed_worklist.Push(&header);
+ mutator_marking_state_.not_fully_constructed_worklist().Push(&header);
}
void MarkerBase::WriteBarrierForObject(HeapObjectHeader& header) {
- MarkingWorklists::WriteBarrierWorklist::View write_barrier_worklist(
- marking_worklists_.write_barrier_worklist(),
- MarkingWorklists::kMutatorThreadId);
- write_barrier_worklist.Push(&header);
+ mutator_marking_state_.write_barrier_worklist().Push(&header);
}
} // namespace internal
diff --git a/deps/v8/src/heap/cppgc/marking-state.cc b/deps/v8/src/heap/cppgc/marking-state.cc
new file mode 100644
index 0000000000..0cc160bd0d
--- /dev/null
+++ b/deps/v8/src/heap/cppgc/marking-state.cc
@@ -0,0 +1,20 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/cppgc/marking-state.h"
+
+namespace cppgc {
+namespace internal {
+
+void MarkingState::FlushNotFullyConstructedObjects() {
+ not_fully_constructed_worklist().Publish();
+ if (!not_fully_constructed_worklist_.IsGlobalEmpty()) {
+ previously_not_fully_constructed_worklist_.Merge(
+ &not_fully_constructed_worklist_);
+ }
+ DCHECK(not_fully_constructed_worklist_.IsGlobalEmpty());
+}
+
+} // namespace internal
+} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/marking-state.h b/deps/v8/src/heap/cppgc/marking-state.h
index b27956964f..526633d455 100644
--- a/deps/v8/src/heap/cppgc/marking-state.h
+++ b/deps/v8/src/heap/cppgc/marking-state.h
@@ -18,9 +18,7 @@ namespace internal {
// C++ marking implementation.
class MarkingState {
public:
- inline MarkingState(HeapBase& heap, MarkingWorklists::MarkingWorklist*,
- MarkingWorklists::NotFullyConstructedWorklist*,
- MarkingWorklists::WeakCallbackWorklist*, int);
+ inline MarkingState(HeapBase& heap, MarkingWorklists&);
MarkingState(const MarkingState&) = delete;
MarkingState& operator=(const MarkingState&) = delete;
@@ -44,31 +42,64 @@ class MarkingState {
inline void AccountMarkedBytes(const HeapObjectHeader&);
size_t marked_bytes() const { return marked_bytes_; }
+ void Publish() {
+ marking_worklist_.Publish();
+ not_fully_constructed_worklist_.Publish();
+ previously_not_fully_constructed_worklist_.Publish();
+ weak_callback_worklist_.Publish();
+ write_barrier_worklist_.Publish();
+ }
+
+ // Moves objects in not_fully_constructed_worklist_ to
+ // previously_not_full_constructed_worklists_.
+ void FlushNotFullyConstructedObjects();
+
+ MarkingWorklists::MarkingWorklist::Local& marking_worklist() {
+ return marking_worklist_;
+ }
+ MarkingWorklists::NotFullyConstructedWorklist::Local&
+ not_fully_constructed_worklist() {
+ return not_fully_constructed_worklist_;
+ }
+ MarkingWorklists::NotFullyConstructedWorklist::Local&
+ previously_not_fully_constructed_worklist() {
+ return previously_not_fully_constructed_worklist_;
+ }
+ MarkingWorklists::WeakCallbackWorklist::Local& weak_callback_worklist() {
+ return weak_callback_worklist_;
+ }
+ MarkingWorklists::WriteBarrierWorklist::Local& write_barrier_worklist() {
+ return write_barrier_worklist_;
+ }
+
private:
#ifdef DEBUG
HeapBase& heap_;
#endif // DEBUG
- MarkingWorklists::MarkingWorklist::View marking_worklist_;
- MarkingWorklists::NotFullyConstructedWorklist::View
+ MarkingWorklists::MarkingWorklist::Local marking_worklist_;
+ MarkingWorklists::NotFullyConstructedWorklist::Local
not_fully_constructed_worklist_;
- MarkingWorklists::WeakCallbackWorklist::View weak_callback_worklist_;
+ MarkingWorklists::NotFullyConstructedWorklist::Local
+ previously_not_fully_constructed_worklist_;
+ MarkingWorklists::WeakCallbackWorklist::Local weak_callback_worklist_;
+ MarkingWorklists::WriteBarrierWorklist::Local write_barrier_worklist_;
size_t marked_bytes_ = 0;
};
-MarkingState::MarkingState(
- HeapBase& heap, MarkingWorklists::MarkingWorklist* marking_worklist,
- MarkingWorklists::NotFullyConstructedWorklist*
- not_fully_constructed_worklist,
- MarkingWorklists::WeakCallbackWorklist* weak_callback_worklist, int task_id)
+MarkingState::MarkingState(HeapBase& heap, MarkingWorklists& marking_worklists)
:
#ifdef DEBUG
heap_(heap),
#endif // DEBUG
- marking_worklist_(marking_worklist, task_id),
- not_fully_constructed_worklist_(not_fully_constructed_worklist, task_id),
- weak_callback_worklist_(weak_callback_worklist, task_id) {
+ marking_worklist_(marking_worklists.marking_worklist()),
+ not_fully_constructed_worklist_(
+ marking_worklists.not_fully_constructed_worklist()),
+ previously_not_fully_constructed_worklist_(
+ marking_worklists.previously_not_fully_constructed_worklist()),
+ weak_callback_worklist_(marking_worklists.weak_callback_worklist()),
+ write_barrier_worklist_(marking_worklists.write_barrier_worklist()) {
}
void MarkingState::MarkAndPush(const void* object, TraceDescriptor desc) {
diff --git a/deps/v8/src/heap/cppgc/marking-verifier.cc b/deps/v8/src/heap/cppgc/marking-verifier.cc
index 58c1368f99..4238709ae1 100644
--- a/deps/v8/src/heap/cppgc/marking-verifier.cc
+++ b/deps/v8/src/heap/cppgc/marking-verifier.cc
@@ -16,8 +16,11 @@ MarkingVerifier::MarkingVerifier(HeapBase& heap,
: cppgc::Visitor(VisitorFactory::CreateKey()),
ConservativeTracingVisitor(heap, *heap.page_backend(), *this) {
Traverse(&heap.raw_heap());
- if (stack_state == Heap::Config::StackState::kMayContainHeapPointers)
+ if (stack_state == Heap::Config::StackState::kMayContainHeapPointers) {
+ in_construction_objects_ = &in_construction_objects_stack_;
heap.stack()->IteratePointers(this);
+ CHECK_EQ(in_construction_objects_stack_, in_construction_objects_heap_);
+ }
}
void MarkingVerifier::Visit(const void* object, TraceDescriptor desc) {
@@ -42,6 +45,8 @@ void MarkingVerifier::VerifyChild(const void* base_object_payload) {
void MarkingVerifier::VisitConservatively(
HeapObjectHeader& header, TraceConservativelyCallback callback) {
CHECK(header.IsMarked());
+ in_construction_objects_->insert(&header);
+ callback(this, header);
}
void MarkingVerifier::VisitPointer(const void* address) {
@@ -54,8 +59,14 @@ bool MarkingVerifier::VisitHeapObjectHeader(HeapObjectHeader* header) {
DCHECK(!header->IsFree());
- GlobalGCInfoTable::GCInfoFromIndex(header->GetGCInfoIndex())
- .trace(this, header->Payload());
+ if (!header->IsInConstruction()) {
+ GlobalGCInfoTable::GCInfoFromIndex(header->GetGCInfoIndex())
+ .trace(this, header->Payload());
+ } else {
+ // Dispatches to conservative tracing implementation.
+ TraceConservativelyIfNeeded(*header);
+ }
+
return true;
}
diff --git a/deps/v8/src/heap/cppgc/marking-verifier.h b/deps/v8/src/heap/cppgc/marking-verifier.h
index 440b198dd5..45661bd465 100644
--- a/deps/v8/src/heap/cppgc/marking-verifier.h
+++ b/deps/v8/src/heap/cppgc/marking-verifier.h
@@ -5,6 +5,8 @@
#ifndef V8_HEAP_CPPGC_MARKING_VERIFIER_H_
#define V8_HEAP_CPPGC_MARKING_VERIFIER_H_
+#include <unordered_set>
+
#include "src/heap/base/stack.h"
#include "src/heap/cppgc/heap-visitor.h"
#include "src/heap/cppgc/heap.h"
@@ -34,6 +36,11 @@ class V8_EXPORT_PRIVATE MarkingVerifier final
void VisitPointer(const void*) final;
bool VisitHeapObjectHeader(HeapObjectHeader*);
+
+ std::unordered_set<const HeapObjectHeader*> in_construction_objects_heap_;
+ std::unordered_set<const HeapObjectHeader*> in_construction_objects_stack_;
+ std::unordered_set<const HeapObjectHeader*>* in_construction_objects_ =
+ &in_construction_objects_heap_;
};
} // namespace internal
diff --git a/deps/v8/src/heap/cppgc/marking-visitor.h b/deps/v8/src/heap/cppgc/marking-visitor.h
index 0bfc96b7d0..408fa2514c 100644
--- a/deps/v8/src/heap/cppgc/marking-visitor.h
+++ b/deps/v8/src/heap/cppgc/marking-visitor.h
@@ -23,7 +23,7 @@ class V8_EXPORT_PRIVATE MarkingVisitor : public VisitorBase {
MarkingVisitor(HeapBase&, MarkingState&);
~MarkingVisitor() override = default;
- private:
+ protected:
void Visit(const void*, TraceDescriptor) final;
void VisitWeak(const void*, TraceDescriptor, WeakCallback, const void*) final;
void VisitRoot(const void*, TraceDescriptor) final;
diff --git a/deps/v8/src/heap/cppgc/marking-worklists.cc b/deps/v8/src/heap/cppgc/marking-worklists.cc
index ecbfe48d82..15d78fd4cf 100644
--- a/deps/v8/src/heap/cppgc/marking-worklists.cc
+++ b/deps/v8/src/heap/cppgc/marking-worklists.cc
@@ -18,15 +18,5 @@ void MarkingWorklists::ClearForTesting() {
weak_callback_worklist_.Clear();
}
-void MarkingWorklists::FlushNotFullyConstructedObjects() {
- if (!not_fully_constructed_worklist_.IsLocalViewEmpty(kMutatorThreadId)) {
- not_fully_constructed_worklist_.FlushToGlobal(kMutatorThreadId);
- previously_not_fully_constructed_worklist_.MergeGlobalPool(
- &not_fully_constructed_worklist_);
- }
- DCHECK(not_fully_constructed_worklist_.IsLocalViewEmpty(
- MarkingWorklists::kMutatorThreadId));
-}
-
} // namespace internal
} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/marking-worklists.h b/deps/v8/src/heap/cppgc/marking-worklists.h
index b38d77780d..96d11eef53 100644
--- a/deps/v8/src/heap/cppgc/marking-worklists.h
+++ b/deps/v8/src/heap/cppgc/marking-worklists.h
@@ -6,7 +6,7 @@
#define V8_HEAP_CPPGC_MARKING_WORKLISTS_H_
#include "include/cppgc/visitor.h"
-#include "src/heap/cppgc/worklist.h"
+#include "src/heap/base/worklist.h"
namespace cppgc {
namespace internal {
@@ -14,9 +14,6 @@ namespace internal {
class HeapObjectHeader;
class MarkingWorklists {
- static constexpr int kNumConcurrentMarkers = 0;
- static constexpr int kNumMarkers = 1 + kNumConcurrentMarkers;
-
public:
static constexpr int kMutatorThreadId = 0;
@@ -29,13 +26,13 @@ class MarkingWorklists {
// Segment size of 512 entries necessary to avoid throughput regressions.
// Since the work list is currently a temporary object this is not a problem.
using MarkingWorklist =
- Worklist<MarkingItem, 512 /* local entries */, kNumMarkers>;
+ heap::base::Worklist<MarkingItem, 512 /* local entries */>;
using NotFullyConstructedWorklist =
- Worklist<HeapObjectHeader*, 16 /* local entries */, kNumMarkers>;
+ heap::base::Worklist<HeapObjectHeader*, 16 /* local entries */>;
using WeakCallbackWorklist =
- Worklist<WeakCallbackItem, 64 /* local entries */, kNumMarkers>;
+ heap::base::Worklist<WeakCallbackItem, 64 /* local entries */>;
using WriteBarrierWorklist =
- Worklist<HeapObjectHeader*, 64 /*local entries */, kNumMarkers>;
+ heap::base::Worklist<HeapObjectHeader*, 64 /*local entries */>;
MarkingWorklist* marking_worklist() { return &marking_worklist_; }
NotFullyConstructedWorklist* not_fully_constructed_worklist() {
@@ -51,10 +48,6 @@ class MarkingWorklists {
return &weak_callback_worklist_;
}
- // Moves objects in not_fully_constructed_worklist_ to
- // previously_not_full_constructed_worklists_.
- void FlushNotFullyConstructedObjects();
-
void ClearForTesting();
private:
diff --git a/deps/v8/src/heap/cppgc/object-allocator.cc b/deps/v8/src/heap/cppgc/object-allocator.cc
index 131ab60401..fdc50d0cab 100644
--- a/deps/v8/src/heap/cppgc/object-allocator.cc
+++ b/deps/v8/src/heap/cppgc/object-allocator.cc
@@ -110,6 +110,7 @@ void* ObjectAllocator::OutOfLineAllocate(NormalPageSpace* space, size_t size,
GCInfoIndex gcinfo) {
void* memory = OutOfLineAllocateImpl(space, size, gcinfo);
stats_collector_->NotifySafePointForConservativeCollection();
+ raw_heap_->heap()->AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded();
return memory;
}
@@ -136,7 +137,7 @@ void* ObjectAllocator::OutOfLineAllocateImpl(NormalPageSpace* space,
// TODO(chromium:1056170): Add lazy sweep.
// 4. Complete sweeping.
- raw_heap_->heap()->sweeper().Finish();
+ raw_heap_->heap()->sweeper().FinishIfRunning();
// 5. Add a new page to this heap.
auto* new_page = NormalPage::Create(page_backend_, space);
diff --git a/deps/v8/src/heap/cppgc/prefinalizer-handler.cc b/deps/v8/src/heap/cppgc/prefinalizer-handler.cc
index 97dca47dac..c20b5ec721 100644
--- a/deps/v8/src/heap/cppgc/prefinalizer-handler.cc
+++ b/deps/v8/src/heap/cppgc/prefinalizer-handler.cc
@@ -25,7 +25,7 @@ void PreFinalizerRegistrationDispatcher::RegisterPrefinalizer(
}
bool PreFinalizerRegistrationDispatcher::PreFinalizer::operator==(
- const PreFinalizer& other) {
+ const PreFinalizer& other) const {
return (object == other.object) && (callback == other.callback);
}
diff --git a/deps/v8/src/heap/cppgc/stats-collector.cc b/deps/v8/src/heap/cppgc/stats-collector.cc
index a92aba021d..dd6d678877 100644
--- a/deps/v8/src/heap/cppgc/stats-collector.cc
+++ b/deps/v8/src/heap/cppgc/stats-collector.cc
@@ -80,13 +80,25 @@ void StatsCollector::NotifyMarkingCompleted(size_t marked_bytes) {
DCHECK_EQ(GarbageCollectionState::kMarking, gc_state_);
gc_state_ = GarbageCollectionState::kSweeping;
current_.marked_bytes = marked_bytes;
- allocated_bytes_since_end_of_marking_ = 0;
allocated_bytes_since_safepoint_ = 0;
explicitly_freed_bytes_since_safepoint_ = 0;
ForAllAllocationObservers([marked_bytes](AllocationObserver* observer) {
observer->ResetAllocatedObjectSize(marked_bytes);
});
+
+ // HeapGrowing would use the below fields to estimate allocation rate during
+ // execution of ResetAllocatedObjectSize.
+ allocated_bytes_since_end_of_marking_ = 0;
+ time_of_last_end_of_marking_ = v8::base::TimeTicks::Now();
+}
+
+double StatsCollector::GetRecentAllocationSpeedInBytesPerMs() const {
+ v8::base::TimeTicks current_time = v8::base::TimeTicks::Now();
+ DCHECK_LE(time_of_last_end_of_marking_, current_time);
+ if (time_of_last_end_of_marking_ == current_time) return 0;
+ return allocated_bytes_since_end_of_marking_ /
+ (current_time - time_of_last_end_of_marking_).InMillisecondsF();
}
const StatsCollector::Event& StatsCollector::NotifySweepingCompleted() {
diff --git a/deps/v8/src/heap/cppgc/stats-collector.h b/deps/v8/src/heap/cppgc/stats-collector.h
index cc122a17dd..795832ba47 100644
--- a/deps/v8/src/heap/cppgc/stats-collector.h
+++ b/deps/v8/src/heap/cppgc/stats-collector.h
@@ -11,6 +11,7 @@
#include <vector>
#include "src/base/macros.h"
+#include "src/base/platform/time.h"
namespace cppgc {
namespace internal {
@@ -79,6 +80,8 @@ class V8_EXPORT_PRIVATE StatsCollector final {
// bytes and the bytes allocated since last marking.
size_t allocated_object_size() const;
+ double GetRecentAllocationSpeedInBytesPerMs() const;
+
private:
enum class GarbageCollectionState : uint8_t {
kNotRunning,
@@ -97,6 +100,7 @@ class V8_EXPORT_PRIVATE StatsCollector final {
// an object was explicitly freed that was marked as live in the previous
// cycle.
int64_t allocated_bytes_since_end_of_marking_ = 0;
+ v8::base::TimeTicks time_of_last_end_of_marking_ = v8::base::TimeTicks::Now();
// Counters for allocation and free. The individual values are never negative
// but their delta may be because of the same reason the overall
// allocated_bytes_since_end_of_marking_ may be negative. Keep integer
diff --git a/deps/v8/src/heap/cppgc/sweeper.cc b/deps/v8/src/heap/cppgc/sweeper.cc
index 9595ae30cf..986ea6f4fa 100644
--- a/deps/v8/src/heap/cppgc/sweeper.cc
+++ b/deps/v8/src/heap/cppgc/sweeper.cc
@@ -384,14 +384,14 @@ class MutatorThreadSweeper final : private HeapVisitor<MutatorThreadSweeper> {
cppgc::Platform* platform_;
};
-class ConcurrentSweepTask final : public v8::JobTask,
+class ConcurrentSweepTask final : public cppgc::JobTask,
private HeapVisitor<ConcurrentSweepTask> {
friend class HeapVisitor<ConcurrentSweepTask>;
public:
explicit ConcurrentSweepTask(SpaceStates* states) : states_(states) {}
- void Run(v8::JobDelegate* delegate) final {
+ void Run(cppgc::JobDelegate* delegate) final {
for (SpaceState& state : *states_) {
while (auto page = state.unswept_pages.Pop()) {
Traverse(*page);
@@ -401,7 +401,7 @@ class ConcurrentSweepTask final : public v8::JobTask,
is_completed_.store(true, std::memory_order_relaxed);
}
- size_t GetMaxConcurrency() const final {
+ size_t GetMaxConcurrency(size_t /* active_worker_count */) const final {
return is_completed_.load(std::memory_order_relaxed) ? 0 : 1;
}
@@ -499,9 +499,15 @@ class Sweeper::SweeperImpl final {
}
}
- void Finish() {
+ void FinishIfRunning() {
if (!is_in_progress_) return;
+ Finish();
+ }
+
+ void Finish() {
+ DCHECK(is_in_progress_);
+
// First, call finalizers on the mutator thread.
SweepFinalizer finalizer(platform_);
finalizer.FinalizeHeap(&space_states_);
@@ -519,14 +525,14 @@ class Sweeper::SweeperImpl final {
}
private:
- class IncrementalSweepTask : public v8::IdleTask {
+ class IncrementalSweepTask : public cppgc::IdleTask {
public:
using Handle = SingleThreadedHandle;
explicit IncrementalSweepTask(SweeperImpl* sweeper)
: sweeper_(sweeper), handle_(Handle::NonEmptyTag{}) {}
- static Handle Post(SweeperImpl* sweeper, v8::TaskRunner* runner) {
+ static Handle Post(SweeperImpl* sweeper, cppgc::TaskRunner* runner) {
auto task = std::make_unique<IncrementalSweepTask>(sweeper);
auto handle = task->GetHandle();
runner->PostIdleTask(std::move(task));
@@ -567,7 +573,7 @@ class Sweeper::SweeperImpl final {
if (!platform_) return;
concurrent_sweeper_handle_ = platform_->PostJob(
- v8::TaskPriority::kUserVisible,
+ cppgc::TaskPriority::kUserVisible,
std::make_unique<ConcurrentSweepTask>(&space_states_));
}
@@ -587,9 +593,9 @@ class Sweeper::SweeperImpl final {
StatsCollector* stats_collector_;
SpaceStates space_states_;
cppgc::Platform* platform_;
- std::shared_ptr<v8::TaskRunner> foreground_task_runner_;
+ std::shared_ptr<cppgc::TaskRunner> foreground_task_runner_;
IncrementalSweepTask::Handle incremental_sweeper_handle_;
- std::unique_ptr<v8::JobHandle> concurrent_sweeper_handle_;
+ std::unique_ptr<cppgc::JobHandle> concurrent_sweeper_handle_;
bool is_in_progress_ = false;
};
@@ -600,7 +606,7 @@ Sweeper::Sweeper(RawHeap* heap, cppgc::Platform* platform,
Sweeper::~Sweeper() = default;
void Sweeper::Start(Config config) { impl_->Start(config); }
-void Sweeper::Finish() { impl_->Finish(); }
+void Sweeper::FinishIfRunning() { impl_->FinishIfRunning(); }
} // namespace internal
} // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/sweeper.h b/deps/v8/src/heap/cppgc/sweeper.h
index 6ce17ea8fc..e94036521e 100644
--- a/deps/v8/src/heap/cppgc/sweeper.h
+++ b/deps/v8/src/heap/cppgc/sweeper.h
@@ -30,7 +30,7 @@ class V8_EXPORT_PRIVATE Sweeper final {
// Sweeper::Start assumes the heap holds no linear allocation buffers.
void Start(Config);
- void Finish();
+ void FinishIfRunning();
private:
class SweeperImpl;
diff --git a/deps/v8/src/heap/cppgc/worklist.h b/deps/v8/src/heap/cppgc/worklist.h
deleted file mode 100644
index 5993d6a04e..0000000000
--- a/deps/v8/src/heap/cppgc/worklist.h
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2020 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_HEAP_CPPGC_WORKLIST_H_
-#define V8_HEAP_CPPGC_WORKLIST_H_
-
-#include <cstddef>
-#include <utility>
-
-#include "src/base/atomic-utils.h"
-#include "src/base/logging.h"
-#include "src/base/platform/mutex.h"
-#include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck
-
-namespace cppgc {
-namespace internal {
-
-// A concurrent worklist based on segments. Each tasks gets private
-// push and pop segments. Empty pop segments are swapped with their
-// corresponding push segments. Full push segments are published to a global
-// pool of segments and replaced with empty segments.
-//
-// Work stealing is best effort, i.e., there is no way to inform other tasks
-// of the need of items.
-template <typename EntryType_, int SEGMENT_SIZE, int max_num_tasks = 8>
-class Worklist {
- using WorklistType = Worklist<EntryType_, SEGMENT_SIZE, max_num_tasks>;
-
- public:
- using EntryType = EntryType_;
- static constexpr int kMaxNumTasks = max_num_tasks;
- static constexpr size_t kSegmentCapacity = SEGMENT_SIZE;
-
- class View {
- public:
- View(WorklistType* worklist, int task_id)
- : worklist_(worklist), task_id_(task_id) {}
-
- // Pushes an entry onto the worklist.
- bool Push(EntryType entry) { return worklist_->Push(task_id_, entry); }
-
- // Pops an entry from the worklist.
- bool Pop(EntryType* entry) { return worklist_->Pop(task_id_, entry); }
-
- // Returns true if the local portion of the worklist is empty.
- bool IsLocalEmpty() const { return worklist_->IsLocalEmpty(task_id_); }
-
- // Returns true if the worklist is empty. Can only be used from the main
- // thread without concurrent access.
- bool IsEmpty() const { return worklist_->IsEmpty(); }
-
- bool IsGlobalPoolEmpty() const { return worklist_->IsGlobalPoolEmpty(); }
-
- // Returns true if the local portion and the global pool are empty (i.e.
- // whether the current view cannot pop anymore).
- bool IsLocalViewEmpty() const {
- return worklist_->IsLocalViewEmpty(task_id_);
- }
-
- void FlushToGlobal() { worklist_->FlushToGlobal(task_id_); }
-
- void* operator new(size_t, void* location) = delete;
- void* operator new(size_t) = delete;
-
- private:
- WorklistType* const worklist_;
- const int task_id_;
- };
-
- Worklist() : Worklist(kMaxNumTasks) {}
-
- explicit Worklist(int num_tasks) : num_tasks_(num_tasks) {
- DCHECK_LE(num_tasks_, kMaxNumTasks);
- for (int i = 0; i < num_tasks_; i++) {
- private_push_segment(i) = NewSegment();
- private_pop_segment(i) = NewSegment();
- }
- }
-
- ~Worklist() {
- CHECK(IsEmpty());
- for (int i = 0; i < num_tasks_; i++) {
- DCHECK_NOT_NULL(private_push_segment(i));
- DCHECK_NOT_NULL(private_pop_segment(i));
- delete private_push_segment(i);
- delete private_pop_segment(i);
- }
- }
-
- // Swaps content with the given worklist. Local buffers need to
- // be empty, not thread safe.
- void Swap(Worklist<EntryType, SEGMENT_SIZE>& other) {
- CHECK(AreLocalsEmpty());
- CHECK(other.AreLocalsEmpty());
-
- global_pool_.Swap(other.global_pool_);
- }
-
- bool Push(int task_id, EntryType entry) {
- DCHECK_LT(task_id, num_tasks_);
- DCHECK_NOT_NULL(private_push_segment(task_id));
- if (!private_push_segment(task_id)->Push(entry)) {
- PublishPushSegmentToGlobal(task_id);
- bool success = private_push_segment(task_id)->Push(entry);
- USE(success);
- DCHECK(success);
- }
- return true;
- }
-
- bool Pop(int task_id, EntryType* entry) {
- DCHECK_LT(task_id, num_tasks_);
- DCHECK_NOT_NULL(private_pop_segment(task_id));
- if (!private_pop_segment(task_id)->Pop(entry)) {
- if (!private_push_segment(task_id)->IsEmpty()) {
- Segment* tmp = private_pop_segment(task_id);
- private_pop_segment(task_id) = private_push_segment(task_id);
- private_push_segment(task_id) = tmp;
- } else if (!StealPopSegmentFromGlobal(task_id)) {
- return false;
- }
- bool success = private_pop_segment(task_id)->Pop(entry);
- USE(success);
- DCHECK(success);
- }
- return true;
- }
-
- size_t LocalPushSegmentSize(int task_id) const {
- return private_push_segment(task_id)->Size();
- }
-
- bool IsLocalEmpty(int task_id) const {
- return private_pop_segment(task_id)->IsEmpty() &&
- private_push_segment(task_id)->IsEmpty();
- }
-
- bool IsGlobalPoolEmpty() const { return global_pool_.IsEmpty(); }
-
- bool IsEmpty() const {
- if (!AreLocalsEmpty()) return false;
- return IsGlobalPoolEmpty();
- }
-
- bool AreLocalsEmpty() const {
- for (int i = 0; i < num_tasks_; i++) {
- if (!IsLocalEmpty(i)) return false;
- }
- return true;
- }
-
- bool IsLocalViewEmpty(int task_id) const {
- return IsLocalEmpty(task_id) && IsGlobalPoolEmpty();
- }
-
- size_t LocalSize(int task_id) const {
- return private_pop_segment(task_id)->Size() +
- private_push_segment(task_id)->Size();
- }
-
- // Thread-safe but may return an outdated result.
- size_t GlobalPoolSize() const { return global_pool_.Size(); }
-
- // Clears all segments. Frees the global segment pool.
- //
- // Assumes that no other tasks are running.
- void Clear() {
- for (int i = 0; i < num_tasks_; i++) {
- private_pop_segment(i)->Clear();
- private_push_segment(i)->Clear();
- }
- global_pool_.Clear();
- }
-
- // Calls the specified callback on each element of the deques and replaces
- // the element with the result of the callback.
- // The signature of the callback is
- // bool Callback(EntryType old, EntryType* new).
- // If the callback returns |false| then the element is removed from the
- // worklist. Otherwise the |new| entry is updated.
- //
- // Assumes that no other tasks are running.
- template <typename Callback>
- void Update(Callback callback) {
- for (int i = 0; i < num_tasks_; i++) {
- private_pop_segment(i)->Update(callback);
- private_push_segment(i)->Update(callback);
- }
- global_pool_.Update(callback);
- }
-
- // Calls the specified callback on each element of the deques.
- // The signature of the callback is:
- // void Callback(EntryType entry).
- //
- // Assumes that no other tasks are running.
- template <typename Callback>
- void Iterate(Callback callback) {
- for (int i = 0; i < num_tasks_; i++) {
- private_pop_segment(i)->Iterate(callback);
- private_push_segment(i)->Iterate(callback);
- }
- global_pool_.Iterate(callback);
- }
-
- template <typename Callback>
- void IterateGlobalPool(Callback callback) {
- global_pool_.Iterate(callback);
- }
-
- void FlushToGlobal(int task_id) {
- PublishPushSegmentToGlobal(task_id);
- PublishPopSegmentToGlobal(task_id);
- }
-
- void MergeGlobalPool(Worklist* other) {
- global_pool_.Merge(&other->global_pool_);
- }
-
- private:
- FRIEND_TEST(CppgcWorkListTest, SegmentCreate);
- FRIEND_TEST(CppgcWorkListTest, SegmentPush);
- FRIEND_TEST(CppgcWorkListTest, SegmentPushPop);
- FRIEND_TEST(CppgcWorkListTest, SegmentIsEmpty);
- FRIEND_TEST(CppgcWorkListTest, SegmentIsFull);
- FRIEND_TEST(CppgcWorkListTest, SegmentClear);
- FRIEND_TEST(CppgcWorkListTest, SegmentFullPushFails);
- FRIEND_TEST(CppgcWorkListTest, SegmentEmptyPopFails);
- FRIEND_TEST(CppgcWorkListTest, SegmentUpdateFalse);
- FRIEND_TEST(CppgcWorkListTest, SegmentUpdate);
-
- class Segment {
- public:
- static const size_t kCapacity = kSegmentCapacity;
-
- Segment() : index_(0) {}
-
- bool Push(EntryType entry) {
- if (IsFull()) return false;
- entries_[index_++] = entry;
- return true;
- }
-
- bool Pop(EntryType* entry) {
- if (IsEmpty()) return false;
- *entry = entries_[--index_];
- return true;
- }
-
- size_t Size() const { return index_; }
- bool IsEmpty() const { return index_ == 0; }
- bool IsFull() const { return index_ == kCapacity; }
- void Clear() { index_ = 0; }
-
- template <typename Callback>
- void Update(Callback callback) {
- size_t new_index = 0;
- for (size_t i = 0; i < index_; i++) {
- if (callback(entries_[i], &entries_[new_index])) {
- new_index++;
- }
- }
- index_ = new_index;
- }
-
- template <typename Callback>
- void Iterate(Callback callback) const {
- for (size_t i = 0; i < index_; i++) {
- callback(entries_[i]);
- }
- }
-
- Segment* next() const { return next_; }
- void set_next(Segment* segment) { next_ = segment; }
-
- private:
- Segment* next_;
- size_t index_;
- EntryType entries_[kCapacity];
- };
-
- struct PrivateSegmentHolder {
- Segment* private_push_segment;
- Segment* private_pop_segment;
- char cache_line_padding[64];
- };
-
- class GlobalPool {
- public:
- GlobalPool() : top_(nullptr) {}
-
- // Swaps contents, not thread safe.
- void Swap(GlobalPool& other) {
- Segment* temp = top_;
- set_top(other.top_);
- other.set_top(temp);
- size_t other_size = other.size_.exchange(
- size_.load(std::memory_order_relaxed), std::memory_order_relaxed);
- size_.store(other_size, std::memory_order_relaxed);
- }
-
- V8_INLINE void Push(Segment* segment) {
- v8::base::MutexGuard guard(&lock_);
- segment->set_next(top_);
- set_top(segment);
- size_.fetch_add(1, std::memory_order_relaxed);
- }
-
- V8_INLINE bool Pop(Segment** segment) {
- v8::base::MutexGuard guard(&lock_);
- if (top_) {
- DCHECK_LT(0U, size_);
- size_.fetch_sub(1, std::memory_order_relaxed);
- *segment = top_;
- set_top(top_->next());
- return true;
- }
- return false;
- }
-
- V8_INLINE bool IsEmpty() const {
- return v8::base::AsAtomicPtr(&top_)->load(std::memory_order_relaxed) ==
- nullptr;
- }
-
- V8_INLINE size_t Size() const {
- // It is safe to read |size_| without a lock since this variable is
- // atomic, keeping in mind that threads may not immediately see the new
- // value when it is updated.
- return size_.load(std::memory_order_relaxed);
- }
-
- void Clear() {
- v8::base::MutexGuard guard(&lock_);
- size_.store(0, std::memory_order_relaxed);
- Segment* current = top_;
- while (current) {
- Segment* tmp = current;
- current = current->next();
- delete tmp;
- }
- set_top(nullptr);
- }
-
- // See Worklist::Update.
- template <typename Callback>
- void Update(Callback callback) {
- v8::base::MutexGuard guard(&lock_);
- Segment* prev = nullptr;
- Segment* current = top_;
- while (current) {
- current->Update(callback);
- if (current->IsEmpty()) {
- DCHECK_LT(0U, size_);
- size_.fetch_sub(1, std::memory_order_relaxed);
- if (!prev) {
- top_ = current->next();
- } else {
- prev->set_next(current->next());
- }
- Segment* tmp = current;
- current = current->next();
- delete tmp;
- } else {
- prev = current;
- current = current->next();
- }
- }
- }
-
- // See Worklist::Iterate.
- template <typename Callback>
- void Iterate(Callback callback) {
- v8::base::MutexGuard guard(&lock_);
- for (Segment* current = top_; current; current = current->next()) {
- current->Iterate(callback);
- }
- }
-
- void Merge(GlobalPool* other) {
- Segment* top = nullptr;
- size_t other_size = 0;
- {
- v8::base::MutexGuard guard(&other->lock_);
- if (!other->top_) return;
- top = other->top_;
- other_size = other->size_.load(std::memory_order_relaxed);
- other->size_.store(0, std::memory_order_relaxed);
- other->set_top(nullptr);
- }
-
- // It's safe to iterate through these segments because the top was
- // extracted from |other|.
- Segment* end = top;
- while (end->next()) end = end->next();
-
- {
- v8::base::MutexGuard guard(&lock_);
- size_.fetch_add(other_size, std::memory_order_relaxed);
- end->set_next(top_);
- set_top(top);
- }
- }
-
- void* operator new(size_t, void* location) = delete;
- void* operator new(size_t) = delete;
-
- private:
- void set_top(Segment* segment) {
- v8::base::AsAtomicPtr(&top_)->store(segment, std::memory_order_relaxed);
- }
-
- v8::base::Mutex lock_;
- Segment* top_;
- std::atomic<size_t> size_{0};
- };
-
- V8_INLINE Segment*& private_push_segment(int task_id) {
- return private_segments_[task_id].private_push_segment;
- }
-
- V8_INLINE Segment* const& private_push_segment(int task_id) const {
- return private_segments_[task_id].private_push_segment;
- }
-
- V8_INLINE Segment*& private_pop_segment(int task_id) {
- return private_segments_[task_id].private_pop_segment;
- }
-
- V8_INLINE Segment* const& private_pop_segment(int task_id) const {
- return private_segments_[task_id].private_pop_segment;
- }
-
- V8_INLINE void PublishPushSegmentToGlobal(int task_id) {
- if (!private_push_segment(task_id)->IsEmpty()) {
- global_pool_.Push(private_push_segment(task_id));
- private_push_segment(task_id) = NewSegment();
- }
- }
-
- V8_INLINE void PublishPopSegmentToGlobal(int task_id) {
- if (!private_pop_segment(task_id)->IsEmpty()) {
- global_pool_.Push(private_pop_segment(task_id));
- private_pop_segment(task_id) = NewSegment();
- }
- }
-
- V8_INLINE bool StealPopSegmentFromGlobal(int task_id) {
- if (global_pool_.IsEmpty()) return false;
- Segment* new_segment = nullptr;
- if (global_pool_.Pop(&new_segment)) {
- delete private_pop_segment(task_id);
- private_pop_segment(task_id) = new_segment;
- return true;
- }
- return false;
- }
-
- V8_INLINE Segment* NewSegment() {
- // Bottleneck for filtering in crash dumps.
- return new Segment();
- }
-
- PrivateSegmentHolder private_segments_[kMaxNumTasks];
- GlobalPool global_pool_;
- int num_tasks_;
-};
-
-} // namespace internal
-} // namespace cppgc
-
-#endif // V8_HEAP_CPPGC_WORKLIST_H_
diff --git a/deps/v8/src/heap/factory-base.cc b/deps/v8/src/heap/factory-base.cc
index a3c00bb9c6..51a856809a 100644
--- a/deps/v8/src/heap/factory-base.cc
+++ b/deps/v8/src/heap/factory-base.cc
@@ -195,7 +195,8 @@ Handle<BytecodeArray> FactoryBase<Impl>::NewBytecodeArray(
instance->set_bytecode_age(BytecodeArray::kNoAgeBytecodeAge);
instance->set_constant_pool(*constant_pool);
instance->set_handler_table(read_only_roots().empty_byte_array());
- instance->set_source_position_table(read_only_roots().undefined_value());
+ instance->set_synchronized_source_position_table(
+ read_only_roots().undefined_value());
CopyBytes(reinterpret_cast<byte*>(instance->GetFirstBytecodeAddress()),
raw_bytecodes, length);
instance->clear_padding();
diff --git a/deps/v8/src/heap/factory.cc b/deps/v8/src/heap/factory.cc
index 4d344339f8..7e66123681 100644
--- a/deps/v8/src/heap/factory.cc
+++ b/deps/v8/src/heap/factory.cc
@@ -206,7 +206,7 @@ MaybeHandle<Code> Factory::CodeBuilder::BuildInternal(
isolate_->builtins_constants_table_builder()->PatchSelfReference(
self_reference, code);
}
- *(self_reference.location()) = code->ptr();
+ self_reference.PatchValue(*code);
}
// Likewise, any references to the basic block counters marker need to be
@@ -2162,7 +2162,8 @@ Handle<BytecodeArray> Factory::CopyBytecodeArray(
bytecode_array->incoming_new_target_or_generator_register());
copy->set_constant_pool(bytecode_array->constant_pool());
copy->set_handler_table(bytecode_array->handler_table());
- copy->set_source_position_table(bytecode_array->source_position_table());
+ copy->set_synchronized_source_position_table(
+ bytecode_array->synchronized_source_position_table());
copy->set_osr_loop_nesting_level(bytecode_array->osr_loop_nesting_level());
copy->set_bytecode_age(bytecode_array->bytecode_age());
bytecode_array->CopyBytecodesTo(*copy);
@@ -2793,7 +2794,7 @@ Handle<JSGlobalProxy> Factory::NewUninitializedJSGlobalProxy(int size) {
map->set_may_have_interesting_symbols(true);
LOG(isolate(), MapDetails(*map));
Handle<JSGlobalProxy> proxy = Handle<JSGlobalProxy>::cast(
- NewJSObjectFromMap(map, AllocationType::kYoung));
+ NewJSObjectFromMap(map, AllocationType::kOld));
// Create identity hash early in case there is any JS collection containing
// a global proxy key and needs to be rehashed after deserialization.
proxy->GetOrCreateIdentityHash(isolate());
@@ -3099,7 +3100,6 @@ Handle<StackTraceFrame> Factory::NewStackTraceFrame(
frame->set_frame_index(index);
frame->set_frame_info(*undefined_value());
- frame->set_id(isolate()->GetNextStackFrameInfoId());
return frame;
}
@@ -3347,7 +3347,6 @@ void Factory::SetRegExpExperimentalData(Handle<JSRegExp> regexp,
store->set(JSRegExp::kIrregexpCaptureNameMapIndex, uninitialized);
store->set(JSRegExp::kIrregexpTicksUntilTierUpIndex, uninitialized);
store->set(JSRegExp::kIrregexpBacktrackLimit, uninitialized);
- store->set(JSRegExp::kExperimentalPatternIndex, uninitialized);
regexp->set_data(*store);
}
diff --git a/deps/v8/src/heap/factory.h b/deps/v8/src/heap/factory.h
index 5e5e2c23ae..05f271e3a2 100644
--- a/deps/v8/src/heap/factory.h
+++ b/deps/v8/src/heap/factory.h
@@ -112,7 +112,7 @@ class V8_EXPORT_PRIVATE Factory : public FactoryBase<Factory> {
return handle(obj, isolate());
}
-#include "torque-generated/factory-tq.inc"
+#include "torque-generated/factory.inc"
Handle<Oddball> NewOddball(Handle<Map> map, const char* to_string,
Handle<Object> to_number, const char* type_of,
diff --git a/deps/v8/src/heap/heap-inl.h b/deps/v8/src/heap/heap-inl.h
index 34ea80f30f..d4dc7e2b8c 100644
--- a/deps/v8/src/heap/heap-inl.h
+++ b/deps/v8/src/heap/heap-inl.h
@@ -13,6 +13,7 @@
#include "src/base/atomic-utils.h"
#include "src/base/atomicops.h"
#include "src/base/platform/platform.h"
+#include "src/common/assert-scope.h"
#include "src/heap/heap-write-barrier.h"
#include "src/heap/heap.h"
#include "src/heap/third-party/heap-api.h"
@@ -169,6 +170,7 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type,
AllocationAlignment alignment) {
DCHECK(AllowHandleAllocation::IsAllowed());
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
DCHECK_IMPLIES(type == AllocationType::kCode,
alignment == AllocationAlignment::kCodeAligned);
DCHECK_EQ(gc_state(), NOT_IN_GC);
@@ -183,7 +185,12 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type,
IncrementObjectCounters();
#endif
- bool large_object = size_in_bytes > kMaxRegularHeapObjectSize;
+ size_t large_object_threshold =
+ AllocationType::kCode == type
+ ? std::min(kMaxRegularHeapObjectSize, code_space()->AreaSize())
+ : kMaxRegularHeapObjectSize;
+ bool large_object =
+ static_cast<size_t>(size_in_bytes) > large_object_threshold;
HeapObject object;
AllocationResult allocation;
@@ -216,10 +223,10 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type,
allocation = old_space_->AllocateRaw(size_in_bytes, alignment, origin);
}
} else if (AllocationType::kCode == type) {
- if (size_in_bytes <= code_space()->AreaSize() && !large_object) {
- allocation = code_space_->AllocateRawUnaligned(size_in_bytes);
- } else {
+ if (large_object) {
allocation = code_lo_space_->AllocateRaw(size_in_bytes);
+ } else {
+ allocation = code_space_->AllocateRawUnaligned(size_in_bytes);
}
} else if (AllocationType::kMap == type) {
allocation = map_space_->AllocateRawUnaligned(size_in_bytes);
@@ -246,6 +253,15 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type,
->RegisterNewlyAllocatedCodeObject(object.address());
}
}
+
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ if (AllocationType::kReadOnly != type) {
+ DCHECK_TAG_ALIGNED(object.address());
+ Page::FromHeapObject(object)->object_start_bitmap()->SetBit(
+ object.address());
+ }
+#endif
+
OnAllocationEvent(object, size_in_bytes);
}
@@ -258,6 +274,7 @@ HeapObject Heap::AllocateRawWith(int size, AllocationType allocation,
AllocationAlignment alignment) {
DCHECK(AllowHandleAllocation::IsAllowed());
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
if (V8_ENABLE_THIRD_PARTY_HEAP_BOOL) {
AllocationResult result = AllocateRaw(size, allocation, origin, alignment);
DCHECK(!result.IsRetry());
diff --git a/deps/v8/src/heap/heap-write-barrier-inl.h b/deps/v8/src/heap/heap-write-barrier-inl.h
index cfdbec4f29..79265c4db6 100644
--- a/deps/v8/src/heap/heap-write-barrier-inl.h
+++ b/deps/v8/src/heap/heap-write-barrier-inl.h
@@ -238,11 +238,11 @@ void WriteBarrier::Marking(JSArrayBuffer host,
MarkingSlow(*heap, host, extension);
}
-void WriteBarrier::Marking(Map host, DescriptorArray descriptor_array,
+void WriteBarrier::Marking(DescriptorArray descriptor_array,
int number_of_own_descriptors) {
- auto heap = GetHeapIfMarking(host);
+ auto heap = GetHeapIfMarking(descriptor_array);
if (!heap) return;
- MarkingSlow(*heap, host, descriptor_array, number_of_own_descriptors);
+ MarkingSlow(*heap, descriptor_array, number_of_own_descriptors);
}
} // namespace internal
diff --git a/deps/v8/src/heap/heap-write-barrier.cc b/deps/v8/src/heap/heap-write-barrier.cc
index df2e38432e..e600c9cebb 100644
--- a/deps/v8/src/heap/heap-write-barrier.cc
+++ b/deps/v8/src/heap/heap-write-barrier.cc
@@ -14,26 +14,50 @@
namespace v8 {
namespace internal {
+namespace {
+thread_local MarkingBarrier* current_marking_barrier = nullptr;
+} // namespace
+
+void WriteBarrier::SetForThread(MarkingBarrier* marking_barrier) {
+ DCHECK_NULL(current_marking_barrier);
+ current_marking_barrier = marking_barrier;
+}
+
+void WriteBarrier::ClearForThread(MarkingBarrier* marking_barrier) {
+ DCHECK_EQ(current_marking_barrier, marking_barrier);
+ current_marking_barrier = nullptr;
+}
+
void WriteBarrier::MarkingSlow(Heap* heap, HeapObject host, HeapObjectSlot slot,
HeapObject value) {
- heap->marking_barrier()->Write(host, slot, value);
+ MarkingBarrier* marking_barrier = current_marking_barrier
+ ? current_marking_barrier
+ : heap->marking_barrier();
+ marking_barrier->Write(host, slot, value);
}
void WriteBarrier::MarkingSlow(Heap* heap, Code host, RelocInfo* reloc_info,
HeapObject value) {
- heap->marking_barrier()->Write(host, reloc_info, value);
+ MarkingBarrier* marking_barrier = current_marking_barrier
+ ? current_marking_barrier
+ : heap->marking_barrier();
+ marking_barrier->Write(host, reloc_info, value);
}
void WriteBarrier::MarkingSlow(Heap* heap, JSArrayBuffer host,
ArrayBufferExtension* extension) {
- heap->marking_barrier()->Write(host, extension);
+ MarkingBarrier* marking_barrier = current_marking_barrier
+ ? current_marking_barrier
+ : heap->marking_barrier();
+ marking_barrier->Write(host, extension);
}
-void WriteBarrier::MarkingSlow(Heap* heap, Map host,
- DescriptorArray descriptor_array,
+void WriteBarrier::MarkingSlow(Heap* heap, DescriptorArray descriptor_array,
int number_of_own_descriptors) {
- heap->marking_barrier()->Write(host, descriptor_array,
- number_of_own_descriptors);
+ MarkingBarrier* marking_barrier = current_marking_barrier
+ ? current_marking_barrier
+ : heap->marking_barrier();
+ marking_barrier->Write(descriptor_array, number_of_own_descriptors);
}
int WriteBarrier::MarkingFromCode(Address raw_host, Address raw_slot) {
diff --git a/deps/v8/src/heap/heap-write-barrier.h b/deps/v8/src/heap/heap-write-barrier.h
index d56757b538..c510c069fe 100644
--- a/deps/v8/src/heap/heap-write-barrier.h
+++ b/deps/v8/src/heap/heap-write-barrier.h
@@ -21,6 +21,7 @@ class Heap;
class JSArrayBuffer;
class Map;
class MarkCompactCollector;
+class MarkingBarrier;
class RelocInfo;
// Note: In general it is preferred to use the macros defined in
@@ -50,18 +51,20 @@ class V8_EXPORT_PRIVATE WriteBarrier {
MaybeObject value);
static inline void Marking(Code host, RelocInfo*, HeapObject value);
static inline void Marking(JSArrayBuffer host, ArrayBufferExtension*);
- static inline void Marking(Map host, DescriptorArray,
- int number_of_own_descriptors);
+ static inline void Marking(DescriptorArray, int number_of_own_descriptors);
// It is invoked from generated code and has to take raw addresses.
static int MarkingFromCode(Address raw_host, Address raw_slot);
+ static void SetForThread(MarkingBarrier*);
+ static void ClearForThread(MarkingBarrier*);
+
private:
static void MarkingSlow(Heap* heap, HeapObject host, HeapObjectSlot,
HeapObject value);
static void MarkingSlow(Heap* heap, Code host, RelocInfo*, HeapObject value);
static void MarkingSlow(Heap* heap, JSArrayBuffer host,
ArrayBufferExtension*);
- static void MarkingSlow(Heap* heap, Map host, DescriptorArray,
+ static void MarkingSlow(Heap* heap, DescriptorArray,
int number_of_own_descriptors);
static inline base::Optional<Heap*> GetHeapIfMarking(HeapObject object);
};
diff --git a/deps/v8/src/heap/heap.cc b/deps/v8/src/heap/heap.cc
index 8c3d506dd0..4506ed71aa 100644
--- a/deps/v8/src/heap/heap.cc
+++ b/deps/v8/src/heap/heap.cc
@@ -20,6 +20,7 @@
#include "src/builtins/accessors.h"
#include "src/codegen/assembler-inl.h"
#include "src/codegen/compilation-cache.h"
+#include "src/common/assert-scope.h"
#include "src/common/globals.h"
#include "src/debug/debug.h"
#include "src/deoptimizer/deoptimizer.h"
@@ -31,6 +32,7 @@
#include "src/handles/global-handles.h"
#include "src/heap/array-buffer-sweeper.h"
#include "src/heap/barrier.h"
+#include "src/heap/base/stack.h"
#include "src/heap/code-object-registry.h"
#include "src/heap/code-stats.h"
#include "src/heap/combined-heap.h"
@@ -89,6 +91,10 @@
#include "src/utils/utils-inl.h"
#include "src/utils/utils.h"
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+#include "src/heap/conservative-stack-visitor.h"
+#endif
+
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -170,12 +176,6 @@ bool Heap::GCCallbackTuple::operator==(
Heap::GCCallbackTuple& Heap::GCCallbackTuple::operator=(
const Heap::GCCallbackTuple& other) V8_NOEXCEPT = default;
-struct Heap::StrongRootsList {
- FullObjectSlot start;
- FullObjectSlot end;
- StrongRootsList* next;
-};
-
class ScavengeTaskObserver : public AllocationObserver {
public:
ScavengeTaskObserver(Heap* heap, intptr_t step_size)
@@ -405,7 +405,16 @@ bool Heap::CanExpandOldGeneration(size_t size) {
bool Heap::CanExpandOldGenerationBackground(size_t size) {
if (force_oom_) return false;
- return memory_allocator()->Size() + size <= MaxReserved();
+ // When the heap is tearing down, then GC requests from background threads
+ // are not served and the threads are allowed to expand the heap to avoid OOM.
+ return gc_state() == TEAR_DOWN ||
+ memory_allocator()->Size() + size <= MaxReserved();
+}
+
+bool Heap::CanPromoteYoungAndExpandOldGeneration(size_t size) {
+ // Over-estimate the new space size using capacity to allow some slack.
+ return CanExpandOldGeneration(size + new_space_->Capacity() +
+ new_lo_space_->Size());
}
bool Heap::HasBeenSetUp() const {
@@ -433,9 +442,7 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space,
return MARK_COMPACTOR;
}
- // Over-estimate the new space size using capacity to allow some slack.
- if (!CanExpandOldGeneration(new_space_->TotalCapacity() +
- new_lo_space()->Size())) {
+ if (!CanPromoteYoungAndExpandOldGeneration(0)) {
isolate_->counters()
->gc_compactor_caused_by_oldspace_exhaustion()
->Increment();
@@ -1086,7 +1093,11 @@ void Heap::DeoptMarkedAllocationSites() {
Deoptimizer::DeoptimizeMarkedCode(isolate_);
}
-void Heap::GarbageCollectionEpilogueInSafepoint() {
+void Heap::GarbageCollectionEpilogueInSafepoint(GarbageCollector collector) {
+ if (collector == MARK_COMPACTOR) {
+ memory_pressure_level_ = MemoryPressureLevel::kNone;
+ }
+
TRACE_GC(tracer(), GCTracer::Scope::HEAP_EPILOGUE_SAFEPOINT);
#define UPDATE_COUNTERS_FOR_SPACE(space) \
@@ -1497,8 +1508,7 @@ bool Heap::CollectGarbage(AllocationSpace space,
this, IsYoungGenerationCollector(collector) ? "MinorGC" : "MajorGC",
GarbageCollectionReasonToString(gc_reason));
- if (!CanExpandOldGeneration(new_space()->Capacity() +
- new_lo_space()->Size())) {
+ if (!CanPromoteYoungAndExpandOldGeneration(0)) {
InvokeNearHeapLimitCallback();
}
@@ -1544,7 +1554,9 @@ bool Heap::CollectGarbage(AllocationSpace space,
{
tracer()->Start(collector, gc_reason, collector_reason);
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
DisallowHeapAllocation no_allocation_during_gc;
+ DisallowGarbageCollection no_gc_during_gc;
GarbageCollectionPrologue();
{
@@ -1575,6 +1587,7 @@ bool Heap::CollectGarbage(AllocationSpace space,
EmbedderHeapTracer::EmbedderStackState::kMayContainHeapPointers);
if (scope.CheckReenter()) {
AllowHeapAllocation allow_allocation;
+ AllowGarbageCollection allow_gc;
AllowJavascriptExecution allow_js(isolate());
TRACE_GC(tracer(), GCTracer::Scope::HEAP_EXTERNAL_PROLOGUE);
VMState<EXTERNAL> state(isolate_);
@@ -1599,6 +1612,7 @@ bool Heap::CollectGarbage(AllocationSpace space,
gc_post_processing_depth_++;
{
AllowHeapAllocation allow_allocation;
+ AllowGarbageCollection allow_gc;
AllowJavascriptExecution allow_js(isolate());
freed_global_handles +=
isolate_->global_handles()->PostGarbageCollectionProcessing(
@@ -1611,6 +1625,7 @@ bool Heap::CollectGarbage(AllocationSpace space,
GCCallbacksScope scope(this);
if (scope.CheckReenter()) {
AllowHeapAllocation allow_allocation;
+ AllowGarbageCollection allow_gc;
AllowJavascriptExecution allow_js(isolate());
TRACE_GC(tracer(), GCTracer::Scope::HEAP_EXTERNAL_EPILOGUE);
VMState<EXTERNAL> state(isolate_);
@@ -1872,6 +1887,8 @@ bool Heap::ReserveSpace(Reservation* reservations, std::vector<Address>* maps) {
for (int space = FIRST_SPACE;
space < static_cast<int>(SnapshotSpace::kNumberOfHeapSpaces);
space++) {
+ DCHECK_NE(space, NEW_SPACE);
+ DCHECK_NE(space, NEW_LO_SPACE);
Reservation* reservation = &reservations[space];
DCHECK_LE(1, reservation->size());
if (reservation->at(0).size == 0) {
@@ -1932,10 +1949,7 @@ bool Heap::ReserveSpace(Reservation* reservations, std::vector<Address>* maps) {
allocation =
AllocateRaw(size, type, AllocationOrigin::kRuntime, align);
#else
- if (space == NEW_SPACE) {
- allocation = new_space()->AllocateRaw(
- size, AllocationAlignment::kWordAligned);
- } else if (space == RO_SPACE) {
+ if (space == RO_SPACE) {
allocation = read_only_space()->AllocateRaw(
size, AllocationAlignment::kWordAligned);
} else {
@@ -1967,16 +1981,11 @@ bool Heap::ReserveSpace(Reservation* reservations, std::vector<Address>* maps) {
V8::FatalProcessOutOfMemory(
isolate(), "insufficient memory to create an Isolate");
}
- if (space == NEW_SPACE) {
- CollectGarbage(NEW_SPACE, GarbageCollectionReason::kDeserializer);
+ if (counter > 1) {
+ CollectAllGarbage(kReduceMemoryFootprintMask,
+ GarbageCollectionReason::kDeserializer);
} else {
- if (counter > 1) {
- CollectAllGarbage(kReduceMemoryFootprintMask,
- GarbageCollectionReason::kDeserializer);
- } else {
- CollectAllGarbage(kNoGCFlags,
- GarbageCollectionReason::kDeserializer);
- }
+ CollectAllGarbage(kNoGCFlags, GarbageCollectionReason::kDeserializer);
}
gc_performed = true;
break; // Abort for-loop over spaces and retry.
@@ -2131,7 +2140,7 @@ size_t Heap::PerformGarbageCollection(
RecomputeLimits(collector);
- GarbageCollectionEpilogueInSafepoint();
+ GarbageCollectionEpilogueInSafepoint(collector);
tracer()->StopInSafepoint();
@@ -2336,8 +2345,7 @@ void Heap::EvacuateYoungGeneration() {
ConcurrentMarking::PauseScope pause_scope(concurrent_marking());
if (!FLAG_concurrent_marking) {
DCHECK(fast_promotion_mode_);
- DCHECK(
- CanExpandOldGeneration(new_space()->Size() + new_lo_space()->Size()));
+ DCHECK(CanPromoteYoungAndExpandOldGeneration(0));
}
mark_compact_collector()->sweeper()->EnsureIterabilityCompleted();
@@ -2384,8 +2392,7 @@ void Heap::EvacuateYoungGeneration() {
}
void Heap::Scavenge() {
- if ((fast_promotion_mode_ &&
- CanExpandOldGeneration(new_space()->Size() + new_lo_space()->Size()))) {
+ if (fast_promotion_mode_ && CanPromoteYoungAndExpandOldGeneration(0)) {
tracer()->NotifyYoungGenerationHandling(
YoungGenerationHandling::kFastPromotionDuringScavenge);
EvacuateYoungGeneration();
@@ -3104,9 +3111,6 @@ void Heap::OnMoveEvent(HeapObject target, HeapObject source,
if (target.IsSharedFunctionInfo()) {
LOG_CODE_EVENT(isolate_, SharedFunctionInfoMoveEvent(source.address(),
target.address()));
- } else if (target.IsNativeContext()) {
- PROFILE(isolate_,
- NativeContextMoveEvent(source.address(), target.address()));
}
if (FLAG_verify_predictable) {
@@ -4541,8 +4545,10 @@ void Heap::IterateRoots(RootVisitor* v, base::EnumSet<SkipRoot> options) {
// Iterate over local handles in handle scopes.
FixStaleLeftTrimmedHandlesVisitor left_trim_visitor(this);
+#ifndef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
isolate_->handle_scope_implementer()->Iterate(&left_trim_visitor);
isolate_->handle_scope_implementer()->Iterate(v);
+#endif
if (FLAG_local_heaps) {
safepoint_->Iterate(&left_trim_visitor);
@@ -4574,8 +4580,10 @@ void Heap::IterateRoots(RootVisitor* v, base::EnumSet<SkipRoot> options) {
// Iterate over other strong roots (currently only identity maps and
// deoptimization entries).
- for (StrongRootsList* list = strong_roots_list_; list; list = list->next) {
- v->VisitRootPointers(Root::kStrongRoots, nullptr, list->start, list->end);
+ for (StrongRootsEntry* current = strong_roots_head_; current;
+ current = current->next) {
+ v->VisitRootPointers(Root::kStrongRoots, nullptr, current->start,
+ current->end);
}
v->Synchronize(VisitorSynchronization::kStrongRoots);
@@ -4915,6 +4923,10 @@ bool Heap::ShouldExpandOldGenerationOnSlowAllocation(LocalHeap* local_heap) {
if (always_allocate() || OldGenerationSpaceAvailable() > 0) return true;
// We reached the old generation allocation limit.
+ // Background threads need to be allowed to allocate without GC after teardown
+ // was initiated.
+ if (gc_state() == TEAR_DOWN) return true;
+
// Ensure that retry of allocation on background thread succeeds
if (IsRetryOfFailedAllocation(local_heap)) return true;
@@ -4939,11 +4951,6 @@ bool Heap::IsRetryOfFailedAllocation(LocalHeap* local_heap) {
return local_heap->allocation_failed_;
}
-void Heap::AlwaysAllocateAfterTearDownStarted() {
- always_allocate_scope_count_++;
- collection_barrier_.ShutdownRequested();
-}
-
Heap::HeapGrowingMode Heap::CurrentHeapGrowingMode() {
if (ShouldReduceMemory() || FLAG_stress_compaction) {
return Heap::HeapGrowingMode::kMinimal;
@@ -5252,8 +5259,7 @@ void Heap::SetUp() {
concurrent_marking_.reset(new ConcurrentMarking(this, nullptr, nullptr));
}
- marking_barrier_.reset(new MarkingBarrier(this, mark_compact_collector(),
- incremental_marking()));
+ marking_barrier_.reset(new MarkingBarrier(this));
for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) {
space_[i] = nullptr;
@@ -5285,7 +5291,11 @@ class StressConcurrentAllocationObserver : public AllocationObserver {
void Step(int bytes_allocated, Address, size_t) override {
DCHECK(heap_->deserialization_complete());
- StressConcurrentAllocatorTask::Schedule(heap_->isolate());
+ if (FLAG_stress_concurrent_allocation) {
+ // Only schedule task if --stress-concurrent-allocation is enabled. This
+ // allows tests to disable flag even when Isolate was already initialized.
+ StressConcurrentAllocatorTask::Schedule(heap_->isolate());
+ }
heap_->RemoveAllocationObserversFromAllSpaces(this, this);
heap_->need_to_remove_stress_concurrent_allocation_observer_ = false;
}
@@ -5503,7 +5513,7 @@ void Heap::StartTearDown() {
// process the event queue anymore. Avoid this deadlock by allowing all
// allocations after tear down was requested to make sure all background
// threads finish.
- AlwaysAllocateAfterTearDownStarted();
+ collection_barrier_.ShutdownRequested();
#ifdef VERIFY_HEAP
// {StartTearDown} is called fairly early during Isolate teardown, so it's
@@ -5606,12 +5616,13 @@ void Heap::TearDown() {
memory_allocator()->TearDown();
- StrongRootsList* next = nullptr;
- for (StrongRootsList* list = strong_roots_list_; list; list = next) {
- next = list->next;
- delete list;
+ StrongRootsEntry* next = nullptr;
+ for (StrongRootsEntry* current = strong_roots_head_; current;
+ current = next) {
+ next = current->next;
+ delete current;
}
- strong_roots_list_ = nullptr;
+ strong_roots_head_ = nullptr;
memory_allocator_.reset();
}
@@ -5880,9 +5891,9 @@ void Heap::ClearRecordedSlotRange(Address start, Address end) {
}
PagedSpace* PagedSpaceIterator::Next() {
- switch (counter_++) {
+ int space = counter_++;
+ switch (space) {
case RO_SPACE:
- case NEW_SPACE:
UNREACHABLE();
case OLD_SPACE:
return heap_->old_space();
@@ -5891,6 +5902,7 @@ PagedSpace* PagedSpaceIterator::Next() {
case MAP_SPACE:
return heap_->map_space();
default:
+ DCHECK_GT(space, LAST_GROWABLE_PAGED_SPACE);
return nullptr;
}
}
@@ -6185,31 +6197,46 @@ size_t Heap::OldArrayBufferBytes() {
return array_buffer_sweeper()->OldBytes();
}
-void Heap::RegisterStrongRoots(FullObjectSlot start, FullObjectSlot end) {
- StrongRootsList* list = new StrongRootsList();
- list->next = strong_roots_list_;
- list->start = start;
- list->end = end;
- strong_roots_list_ = list;
+StrongRootsEntry* Heap::RegisterStrongRoots(FullObjectSlot start,
+ FullObjectSlot end) {
+ base::MutexGuard guard(&strong_roots_mutex_);
+
+ StrongRootsEntry* entry = new StrongRootsEntry();
+ entry->start = start;
+ entry->end = end;
+ entry->prev = nullptr;
+ entry->next = strong_roots_head_;
+
+ if (strong_roots_head_) {
+ DCHECK_NULL(strong_roots_head_->prev);
+ strong_roots_head_->prev = entry;
+ }
+ strong_roots_head_ = entry;
+
+ return entry;
}
-void Heap::UnregisterStrongRoots(FullObjectSlot start) {
- StrongRootsList* prev = nullptr;
- StrongRootsList* list = strong_roots_list_;
- while (list != nullptr) {
- StrongRootsList* next = list->next;
- if (list->start == start) {
- if (prev) {
- prev->next = next;
- } else {
- strong_roots_list_ = next;
- }
- delete list;
- } else {
- prev = list;
- }
- list = next;
+void Heap::UpdateStrongRoots(StrongRootsEntry* entry, FullObjectSlot start,
+ FullObjectSlot end) {
+ entry->start = start;
+ entry->end = end;
+}
+
+void Heap::UnregisterStrongRoots(StrongRootsEntry* entry) {
+ base::MutexGuard guard(&strong_roots_mutex_);
+
+ StrongRootsEntry* prev = entry->prev;
+ StrongRootsEntry* next = entry->next;
+
+ if (prev) prev->next = next;
+ if (next) next->prev = prev;
+
+ if (strong_roots_head_ == entry) {
+ DCHECK_NULL(prev);
+ strong_roots_head_ = next;
}
+
+ delete entry;
}
void Heap::SetBuiltinsConstantsTable(FixedArray cache) {
diff --git a/deps/v8/src/heap/heap.h b/deps/v8/src/heap/heap.h
index ff89cd6fb5..b8220dad5e 100644
--- a/deps/v8/src/heap/heap.h
+++ b/deps/v8/src/heap/heap.h
@@ -177,6 +177,18 @@ enum class SkipRoot {
kWeak
};
+class StrongRootsEntry {
+ StrongRootsEntry() = default;
+
+ FullObjectSlot start;
+ FullObjectSlot end;
+
+ StrongRootsEntry* prev;
+ StrongRootsEntry* next;
+
+ friend class Heap;
+};
+
class AllocationResult {
public:
static inline AllocationResult Retry(AllocationSpace space = NEW_SPACE) {
@@ -868,8 +880,11 @@ class Heap {
V8_INLINE void SetMessageListeners(TemplateList value);
V8_INLINE void SetPendingOptimizeForTestBytecode(Object bytecode);
- void RegisterStrongRoots(FullObjectSlot start, FullObjectSlot end);
- void UnregisterStrongRoots(FullObjectSlot start);
+ StrongRootsEntry* RegisterStrongRoots(FullObjectSlot start,
+ FullObjectSlot end);
+ void UnregisterStrongRoots(StrongRootsEntry* entry);
+ void UpdateStrongRoots(StrongRootsEntry* entry, FullObjectSlot start,
+ FullObjectSlot end);
void SetBuiltinsConstantsTable(FixedArray cache);
void SetDetachedContexts(WeakArrayList detached_contexts);
@@ -1426,8 +1441,10 @@ class Heap {
// Heap object allocation tracking. ==========================================
// ===========================================================================
- void AddHeapObjectAllocationTracker(HeapObjectAllocationTracker* tracker);
- void RemoveHeapObjectAllocationTracker(HeapObjectAllocationTracker* tracker);
+ V8_EXPORT_PRIVATE void AddHeapObjectAllocationTracker(
+ HeapObjectAllocationTracker* tracker);
+ V8_EXPORT_PRIVATE void RemoveHeapObjectAllocationTracker(
+ HeapObjectAllocationTracker* tracker);
bool has_heap_object_allocation_tracker() const {
return !allocation_trackers_.empty();
}
@@ -1573,8 +1590,6 @@ class Heap {
void Wait();
};
- struct StrongRootsList;
-
struct StringTypeTable {
InstanceType type;
int size;
@@ -1800,7 +1815,7 @@ class Heap {
void GarbageCollectionPrologue();
void GarbageCollectionPrologueInSafepoint();
void GarbageCollectionEpilogue();
- void GarbageCollectionEpilogueInSafepoint();
+ void GarbageCollectionEpilogueInSafepoint(GarbageCollector collector);
// Performs a major collection in the whole heap.
void MarkCompact();
@@ -1887,13 +1902,12 @@ class Heap {
V8_EXPORT_PRIVATE bool CanExpandOldGeneration(size_t size);
V8_EXPORT_PRIVATE bool CanExpandOldGenerationBackground(size_t size);
+ V8_EXPORT_PRIVATE bool CanPromoteYoungAndExpandOldGeneration(size_t size);
bool ShouldExpandOldGenerationOnSlowAllocation(
LocalHeap* local_heap = nullptr);
bool IsRetryOfFailedAllocation(LocalHeap* local_heap);
- void AlwaysAllocateAfterTearDownStarted();
-
HeapGrowingMode CurrentHeapGrowingMode();
double PercentToOldGenerationLimit();
@@ -2201,7 +2215,9 @@ class Heap {
std::unique_ptr<AllocationObserver> stress_concurrent_allocation_observer_;
std::unique_ptr<LocalEmbedderHeapTracer> local_embedder_heap_tracer_;
std::unique_ptr<MarkingBarrier> marking_barrier_;
- StrongRootsList* strong_roots_list_ = nullptr;
+
+ StrongRootsEntry* strong_roots_head_ = nullptr;
+ base::Mutex strong_roots_mutex_;
bool need_to_remove_stress_concurrent_allocation_observer_ = false;
@@ -2488,7 +2504,8 @@ class VerifySmisVisitor : public RootVisitor {
// is done.
class V8_EXPORT_PRIVATE PagedSpaceIterator {
public:
- explicit PagedSpaceIterator(Heap* heap) : heap_(heap), counter_(OLD_SPACE) {}
+ explicit PagedSpaceIterator(Heap* heap)
+ : heap_(heap), counter_(FIRST_GROWABLE_PAGED_SPACE) {}
PagedSpace* Next();
private:
diff --git a/deps/v8/src/heap/incremental-marking.cc b/deps/v8/src/heap/incremental-marking.cc
index 4cde2c6b9e..c5206adf81 100644
--- a/deps/v8/src/heap/incremental-marking.cc
+++ b/deps/v8/src/heap/incremental-marking.cc
@@ -237,7 +237,7 @@ void IncrementalMarking::StartMarking() {
SetState(MARKING);
- heap_->marking_barrier()->Activate(is_compacting_);
+ MarkingBarrier::ActivateAll(heap(), is_compacting_);
heap_->isolate()->compilation_cache()->MarkCompactPrologue();
@@ -412,6 +412,8 @@ void IncrementalMarking::FinalizeIncrementally() {
// so we can do it only once at the beginning of the finalization.
RetainMaps();
+ MarkingBarrier::PublishAll(heap());
+
finalize_marking_completed_ = true;
if (FLAG_trace_incremental_marking) {
@@ -433,6 +435,7 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() {
#endif // ENABLE_MINOR_MC
collector_->local_marking_worklists()->Publish();
+ MarkingBarrier::PublishAll(heap());
collector_->marking_worklists()->Update(
[
#ifdef DEBUG
@@ -1080,6 +1083,9 @@ StepResult IncrementalMarking::Step(double max_step_size_in_ms,
embedder_deadline =
Min(max_step_size_in_ms,
static_cast<double>(bytes_to_process) / marking_speed);
+ // TODO(chromium:1056170): Replace embedder_deadline with bytes_to_process
+ // after migrating blink to the cppgc library and after v8 can directly
+ // push objects to Oilpan.
embedder_result = EmbedderStep(embedder_deadline, &embedder_duration);
}
bytes_marked_ += v8_bytes_processed;
diff --git a/deps/v8/src/heap/incremental-marking.h b/deps/v8/src/heap/incremental-marking.h
index 342a82c02d..29df137711 100644
--- a/deps/v8/src/heap/incremental-marking.h
+++ b/deps/v8/src/heap/incremental-marking.h
@@ -251,6 +251,8 @@ class V8_EXPORT_PRIVATE IncrementalMarking final {
// increase chances of reusing of map transition tree in future.
void RetainMaps();
+ void PublishWriteBarrierWorklists();
+
// Updates scheduled_bytes_to_mark_ to ensure marking progress based on
// time.
void ScheduleBytesToMarkBasedOnTime(double time_ms);
diff --git a/deps/v8/src/heap/index-generator.cc b/deps/v8/src/heap/index-generator.cc
new file mode 100644
index 0000000000..150e3fa159
--- /dev/null
+++ b/deps/v8/src/heap/index-generator.cc
@@ -0,0 +1,48 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/index-generator.h"
+
+namespace v8 {
+namespace internal {
+
+IndexGenerator::IndexGenerator(size_t size) : size_(size) {
+ if (size == 0) return;
+ base::MutexGuard guard(&lock_);
+ pending_indices_.push(0);
+ ranges_to_split_.push({0, size_});
+}
+
+base::Optional<size_t> IndexGenerator::GetNext() {
+ base::MutexGuard guard(&lock_);
+ if (!pending_indices_.empty()) {
+ // Return any pending index first.
+ auto index = pending_indices_.top();
+ pending_indices_.pop();
+ return index;
+ }
+ if (ranges_to_split_.empty()) return base::nullopt;
+
+ // Split the oldest running range in 2 and return the middle index as
+ // starting point.
+ auto range = ranges_to_split_.front();
+ ranges_to_split_.pop();
+ size_t size = range.second - range.first;
+ size_t mid = range.first + size / 2;
+ // Both sides of the range are added to |ranges_to_split_| so they may be
+ // further split if possible.
+ if (mid - range.first > 1) ranges_to_split_.push({range.first, mid});
+ if (range.second - mid > 1) ranges_to_split_.push({mid, range.second});
+ return mid;
+}
+
+void IndexGenerator::GiveBack(size_t index) {
+ base::MutexGuard guard(&lock_);
+ // Add |index| to pending indices so GetNext() may return it before anything
+ // else.
+ pending_indices_.push(index);
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/heap/index-generator.h b/deps/v8/src/heap/index-generator.h
new file mode 100644
index 0000000000..0e4df1714e
--- /dev/null
+++ b/deps/v8/src/heap/index-generator.h
@@ -0,0 +1,43 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_INDEX_GENERATOR_H_
+#define V8_HEAP_INDEX_GENERATOR_H_
+
+#include <cstddef>
+#include <queue>
+#include <stack>
+
+#include "src/base/macros.h"
+#include "src/base/optional.h"
+#include "src/base/platform/mutex.h"
+
+namespace v8 {
+namespace internal {
+
+// A thread-safe data structure that generates heuristic starting points in a
+// range to process items in parallel.
+class V8_EXPORT_PRIVATE IndexGenerator {
+ public:
+ explicit IndexGenerator(size_t size);
+ IndexGenerator(const IndexGenerator&) = delete;
+ IndexGenerator& operator=(const IndexGenerator&) = delete;
+
+ base::Optional<size_t> GetNext();
+ void GiveBack(size_t index);
+
+ private:
+ base::Mutex lock_;
+ // Pending indices that are ready to be handed out, prioritized over
+ // |pending_ranges_| when non-empty.
+ std::stack<size_t> pending_indices_;
+ // Pending [start, end] (exclusive) ranges to split and hand out indices from.
+ std::queue<std::pair<size_t, size_t>> ranges_to_split_;
+ const size_t size_;
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_HEAP_INDEX_GENERATOR_H_
diff --git a/deps/v8/src/heap/local-heap-inl.h b/deps/v8/src/heap/local-heap-inl.h
index 69eb86de1e..770e1cb8e9 100644
--- a/deps/v8/src/heap/local-heap-inl.h
+++ b/deps/v8/src/heap/local-heap-inl.h
@@ -15,13 +15,16 @@ namespace internal {
AllocationResult LocalHeap::AllocateRaw(int size_in_bytes, AllocationType type,
AllocationOrigin origin,
AllocationAlignment alignment) {
+#if DEBUG
DCHECK_EQ(LocalHeap::Current(), this);
DCHECK(AllowHandleAllocation::IsAllowed());
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
DCHECK_IMPLIES(type == AllocationType::kCode,
alignment == AllocationAlignment::kCodeAligned);
- DCHECK(heap()->gc_state() == Heap::TEAR_DOWN ||
- heap()->gc_state() == Heap::NOT_IN_GC);
+ Heap::HeapState state = heap()->gc_state();
+ DCHECK(state == Heap::TEAR_DOWN || state == Heap::NOT_IN_GC);
+#endif
bool large_object = size_in_bytes > kMaxRegularHeapObjectSize;
CHECK_EQ(type, AllocationType::kOld);
diff --git a/deps/v8/src/heap/local-heap.cc b/deps/v8/src/heap/local-heap.cc
index b17243c680..a17c22a6d2 100644
--- a/deps/v8/src/heap/local-heap.cc
+++ b/deps/v8/src/heap/local-heap.cc
@@ -10,7 +10,9 @@
#include "src/common/globals.h"
#include "src/handles/local-handles.h"
#include "src/heap/heap-inl.h"
+#include "src/heap/heap-write-barrier.h"
#include "src/heap/local-heap-inl.h"
+#include "src/heap/marking-barrier.h"
#include "src/heap/safepoint.h"
namespace v8 {
@@ -32,6 +34,7 @@ LocalHeap::LocalHeap(Heap* heap,
next_(nullptr),
handles_(new LocalHandles),
persistent_handles_(std::move(persistent_handles)),
+ marking_barrier_(new MarkingBarrier(this)),
old_space_allocator_(this, heap->old_space()) {
heap_->safepoint()->AddLocalHeap(this);
if (persistent_handles_) {
@@ -39,9 +42,21 @@ LocalHeap::LocalHeap(Heap* heap,
}
DCHECK_NULL(current_local_heap);
current_local_heap = this;
+ // TODO(ulan): Ensure that LocalHeap cannot be created without --local-heaps.
+ if (FLAG_local_heaps) {
+ WriteBarrier::SetForThread(marking_barrier_.get());
+ if (heap_->incremental_marking()->IsMarking()) {
+ marking_barrier_->Activate(heap_->incremental_marking()->IsCompacting());
+ }
+ }
}
LocalHeap::~LocalHeap() {
+ // TODO(ulan): Ensure that LocalHeap cannot be created without --local-heaps.
+ if (FLAG_local_heaps) {
+ marking_barrier_->Publish();
+ WriteBarrier::ClearForThread(marking_barrier_.get());
+ }
// Give up LAB before parking thread
old_space_allocator_.FreeLinearAllocationArea();
diff --git a/deps/v8/src/heap/local-heap.h b/deps/v8/src/heap/local-heap.h
index 4789eaf065..f6244aaefe 100644
--- a/deps/v8/src/heap/local-heap.h
+++ b/deps/v8/src/heap/local-heap.h
@@ -10,6 +10,7 @@
#include "src/base/platform/condition-variable.h"
#include "src/base/platform/mutex.h"
+#include "src/common/assert-scope.h"
#include "src/execution/isolate.h"
#include "src/handles/persistent-handles.h"
#include "src/heap/concurrent-allocator.h"
@@ -35,6 +36,10 @@ class V8_EXPORT_PRIVATE LocalHeap {
// Frequently invoked by local thread to check whether safepoint was requested
// from the main thread.
void Safepoint() {
+ // In case garbage collection is disabled, the thread isn't even allowed to
+ // invoke Safepoint(). Otherwise a GC might happen here.
+ DCHECK(AllowGarbageCollection::IsAllowed());
+
if (IsSafepointRequested()) {
ClearSafepointRequested();
EnterSafepoint();
@@ -76,6 +81,7 @@ class V8_EXPORT_PRIVATE LocalHeap {
Heap* heap() { return heap_; }
+ MarkingBarrier* marking_barrier() { return marking_barrier_.get(); }
ConcurrentAllocator* old_space_allocator() { return &old_space_allocator_; }
// Mark/Unmark linear allocation areas black. Used for black allocation.
@@ -155,6 +161,7 @@ class V8_EXPORT_PRIVATE LocalHeap {
std::unique_ptr<LocalHandles> handles_;
std::unique_ptr<PersistentHandles> persistent_handles_;
+ std::unique_ptr<MarkingBarrier> marking_barrier_;
ConcurrentAllocator old_space_allocator_;
diff --git a/deps/v8/src/heap/mark-compact-inl.h b/deps/v8/src/heap/mark-compact-inl.h
index 5580b888d7..c49bad62cc 100644
--- a/deps/v8/src/heap/mark-compact-inl.h
+++ b/deps/v8/src/heap/mark-compact-inl.h
@@ -126,12 +126,11 @@ void MainMarkingVisitor<MarkingState>::RecordRelocSlot(Code host,
template <typename MarkingState>
void MainMarkingVisitor<MarkingState>::MarkDescriptorArrayFromWriteBarrier(
- HeapObject host, DescriptorArray descriptors,
- int number_of_own_descriptors) {
+ DescriptorArray descriptors, int number_of_own_descriptors) {
// This is necessary because the Scavenger records slots only for the
// promoted black objects and the marking visitor of DescriptorArray skips
// the descriptors marked by the visitor.VisitDescriptors() below.
- this->MarkDescriptorArrayBlack(host, descriptors);
+ this->MarkDescriptorArrayBlack(descriptors);
this->VisitDescriptors(descriptors, number_of_own_descriptors);
}
diff --git a/deps/v8/src/heap/mark-compact.cc b/deps/v8/src/heap/mark-compact.cc
index 2f56649692..6e00912e61 100644
--- a/deps/v8/src/heap/mark-compact.cc
+++ b/deps/v8/src/heap/mark-compact.cc
@@ -395,7 +395,7 @@ int MarkCompactCollectorBase::NumberOfParallelCompactionTasks(int pages) {
int tasks = FLAG_parallel_compaction ? Min(NumberOfAvailableCores(),
pages / (MB / Page::kPageSize) + 1)
: 1;
- if (!heap_->CanExpandOldGeneration(
+ if (!heap_->CanPromoteYoungAndExpandOldGeneration(
static_cast<size_t>(tasks * Page::kPageSize))) {
// Optimize for memory usage near the heap limit.
tasks = 1;
@@ -456,6 +456,8 @@ void MarkCompactCollector::TearDown() {
AbortWeakObjects();
if (heap()->incremental_marking()->IsMarking()) {
local_marking_worklists()->Publish();
+ heap()->marking_barrier()->Publish();
+ // Marking barriers of LocalHeaps will be published in their destructors.
marking_worklists()->Clear();
}
}
@@ -508,9 +510,6 @@ bool MarkCompactCollector::StartCompaction() {
}
void MarkCompactCollector::StartMarking() {
- if (FLAG_concurrent_marking || FLAG_parallel_marking) {
- heap_->new_lo_space()->ResetPendingObject();
- }
std::vector<Address> contexts =
heap()->memory_measurement()->StartProcessing();
if (FLAG_stress_per_context_marking_worklist) {
@@ -747,6 +746,11 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
} else {
pages.push_back(std::make_pair(p->allocated_bytes(), p));
}
+
+ // Unpin pages for the next GC
+ if (p->IsFlagSet(MemoryChunk::PINNED)) {
+ p->ClearFlag(MemoryChunk::PINNED);
+ }
}
int candidate_count = 0;
@@ -895,6 +899,11 @@ void MarkCompactCollector::Prepare() {
heap_->safepoint()->IterateLocalHeaps(
[](LocalHeap* local_heap) { local_heap->FreeLinearAllocationArea(); });
}
+
+ // All objects are guaranteed to be initialized in atomic pause
+ heap()->new_lo_space()->ResetPendingObject();
+ DCHECK_EQ(heap()->new_space()->top(),
+ heap()->new_space()->original_top_acquire());
}
void MarkCompactCollector::FinishConcurrentMarking(
@@ -1627,10 +1636,9 @@ void MarkCompactCollector::RevisitObject(HeapObject obj) {
}
void MarkCompactCollector::MarkDescriptorArrayFromWriteBarrier(
- HeapObject host, DescriptorArray descriptors,
- int number_of_own_descriptors) {
+ DescriptorArray descriptors, int number_of_own_descriptors) {
marking_visitor_->MarkDescriptorArrayFromWriteBarrier(
- host, descriptors, number_of_own_descriptors);
+ descriptors, number_of_own_descriptors);
}
void MarkCompactCollector::ProcessEphemeronsUntilFixpoint() {
@@ -1953,6 +1961,7 @@ void MarkCompactCollector::MarkLiveObjects() {
IncrementalMarking* incremental_marking = heap_->incremental_marking();
if (was_marked_incrementally_) {
incremental_marking->Finalize();
+ MarkingBarrier::PublishAll(heap());
} else {
CHECK(incremental_marking->IsStopped());
}
@@ -2056,9 +2065,8 @@ void MarkCompactCollector::MarkLiveObjects() {
&IsUnmarkedHeapObject);
}
}
-
if (was_marked_incrementally_) {
- heap()->marking_barrier()->Deactivate();
+ MarkingBarrier::DeactivateAll(heap());
}
epoch_++;
@@ -3210,11 +3218,8 @@ void MarkCompactCollector::EvacuatePagesInParallel() {
&page_parallel_job_semaphore_);
intptr_t live_bytes = 0;
- for (Page* page : old_space_evacuation_pages_) {
- live_bytes += non_atomic_marking_state()->live_bytes(page);
- evacuation_job.AddItem(new EvacuationItem(page));
- }
-
+ // Evacuation of new space pages cannot be aborted, so it needs to run
+ // before old space evacuation.
for (Page* page : new_space_evacuation_pages_) {
intptr_t live_bytes_on_page = non_atomic_marking_state()->live_bytes(page);
if (live_bytes_on_page == 0) continue;
@@ -3236,6 +3241,11 @@ void MarkCompactCollector::EvacuatePagesInParallel() {
evacuation_job.AddItem(new EvacuationItem(page));
}
+ for (Page* page : old_space_evacuation_pages_) {
+ live_bytes += non_atomic_marking_state()->live_bytes(page);
+ evacuation_job.AddItem(new EvacuationItem(page));
+ }
+
// Promote young generation large objects.
IncrementalMarking::NonAtomicMarkingState* marking_state =
heap()->incremental_marking()->non_atomic_marking_state();
diff --git a/deps/v8/src/heap/mark-compact.h b/deps/v8/src/heap/mark-compact.h
index d823ea7c1d..d369ac0183 100644
--- a/deps/v8/src/heap/mark-compact.h
+++ b/deps/v8/src/heap/mark-compact.h
@@ -395,8 +395,7 @@ class MainMarkingVisitor final
V8_UNLIKELY(revisiting_object_);
}
- void MarkDescriptorArrayFromWriteBarrier(HeapObject host,
- DescriptorArray descriptors,
+ void MarkDescriptorArrayFromWriteBarrier(DescriptorArray descriptors,
int number_of_own_descriptors);
private:
@@ -583,8 +582,7 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
void RevisitObject(HeapObject obj);
// Ensures that all descriptors int range [0, number_of_own_descripts)
// are visited.
- void MarkDescriptorArrayFromWriteBarrier(HeapObject host,
- DescriptorArray array,
+ void MarkDescriptorArrayFromWriteBarrier(DescriptorArray array,
int number_of_own_descriptors);
// Drains the main thread marking worklist until the specified number of
diff --git a/deps/v8/src/heap/marking-barrier-inl.h b/deps/v8/src/heap/marking-barrier-inl.h
index 716a181073..28ac8ba3aa 100644
--- a/deps/v8/src/heap/marking-barrier-inl.h
+++ b/deps/v8/src/heap/marking-barrier-inl.h
@@ -22,12 +22,12 @@ bool MarkingBarrier::MarkValue(HeapObject host, HeapObject value) {
// filler map.
DCHECK(!marking_state_.IsImpossible(host) ||
value == ReadOnlyRoots(heap_->isolate()).one_pointer_filler_map());
- if (!V8_CONCURRENT_MARKING_BOOL && marking_state_.IsBlack(host)) {
+ if (!V8_CONCURRENT_MARKING_BOOL && !marking_state_.IsBlack(host)) {
// The value will be marked and the slot will be recorded when the marker
// visits the host object.
return false;
}
- if (WhiteToGreyAndPush(value)) {
+ if (WhiteToGreyAndPush(value) && is_main_thread_barrier_) {
incremental_marking_->RestartIfNotMarking();
}
return true;
@@ -35,7 +35,7 @@ bool MarkingBarrier::MarkValue(HeapObject host, HeapObject value) {
bool MarkingBarrier::WhiteToGreyAndPush(HeapObject obj) {
if (marking_state_.WhiteToGrey(obj)) {
- collector_->local_marking_worklists()->Push(obj);
+ worklist_.Push(obj);
return true;
}
return false;
diff --git a/deps/v8/src/heap/marking-barrier.cc b/deps/v8/src/heap/marking-barrier.cc
index 3b3873f9f3..8e73518d97 100644
--- a/deps/v8/src/heap/marking-barrier.cc
+++ b/deps/v8/src/heap/marking-barrier.cc
@@ -11,16 +11,29 @@
#include "src/heap/mark-compact-inl.h"
#include "src/heap/mark-compact.h"
#include "src/heap/marking-barrier-inl.h"
+#include "src/heap/marking-worklist-inl.h"
+#include "src/heap/marking-worklist.h"
+#include "src/heap/safepoint.h"
#include "src/objects/js-array-buffer.h"
namespace v8 {
namespace internal {
-MarkingBarrier::MarkingBarrier(Heap* heap, MarkCompactCollector* collector,
- IncrementalMarking* incremental_marking)
+MarkingBarrier::MarkingBarrier(Heap* heap)
: heap_(heap),
- collector_(collector),
- incremental_marking_(incremental_marking) {}
+ collector_(heap_->mark_compact_collector()),
+ incremental_marking_(heap_->incremental_marking()),
+ worklist_(collector_->marking_worklists()->shared()),
+ is_main_thread_barrier_(true) {}
+
+MarkingBarrier::MarkingBarrier(LocalHeap* local_heap)
+ : heap_(local_heap->heap()),
+ collector_(heap_->mark_compact_collector()),
+ incremental_marking_(nullptr),
+ worklist_(collector_->marking_worklists()->shared()),
+ is_main_thread_barrier_(false) {}
+
+MarkingBarrier::~MarkingBarrier() { DCHECK(worklist_.IsLocalEmpty()); }
void MarkingBarrier::Write(HeapObject host, HeapObjectSlot slot,
HeapObject value) {
@@ -34,68 +47,142 @@ void MarkingBarrier::Write(HeapObject host, HeapObjectSlot slot,
void MarkingBarrier::Write(Code host, RelocInfo* reloc_info, HeapObject value) {
if (MarkValue(host, value)) {
if (is_compacting_) {
- collector_->RecordRelocSlot(host, reloc_info, value);
+ if (is_main_thread_barrier_) {
+ // An optimization to avoid allocating additional typed slots for the
+ // main thread.
+ collector_->RecordRelocSlot(host, reloc_info, value);
+ } else {
+ RecordRelocSlot(host, reloc_info, value);
+ }
}
}
}
void MarkingBarrier::Write(JSArrayBuffer host,
ArrayBufferExtension* extension) {
- if (!V8_CONCURRENT_MARKING_BOOL && marking_state_.IsBlack(host)) {
+ if (!V8_CONCURRENT_MARKING_BOOL && !marking_state_.IsBlack(host)) {
// The extension will be marked when the marker visits the host object.
return;
}
extension->Mark();
}
-void MarkingBarrier::Write(Map host, DescriptorArray descriptor_array,
+void MarkingBarrier::Write(DescriptorArray descriptor_array,
int number_of_own_descriptors) {
+ DCHECK(is_main_thread_barrier_);
int16_t raw_marked = descriptor_array.raw_number_of_marked_descriptors();
if (NumberOfMarkedDescriptors::decode(collector_->epoch(), raw_marked) <
number_of_own_descriptors) {
- collector_->MarkDescriptorArrayFromWriteBarrier(host, descriptor_array,
+ collector_->MarkDescriptorArrayFromWriteBarrier(descriptor_array,
number_of_own_descriptors);
}
}
-void MarkingBarrier::Deactivate(PagedSpace* space) {
+void MarkingBarrier::RecordRelocSlot(Code host, RelocInfo* rinfo,
+ HeapObject target) {
+ MarkCompactCollector::RecordRelocSlotInfo info =
+ MarkCompactCollector::PrepareRecordRelocSlot(host, rinfo, target);
+ if (info.should_record) {
+ auto& typed_slots = typed_slots_map_[info.memory_chunk];
+ if (!typed_slots) {
+ typed_slots.reset(new TypedSlots());
+ }
+ typed_slots->Insert(info.slot_type, info.offset);
+ }
+}
+
+// static
+void MarkingBarrier::ActivateAll(Heap* heap, bool is_compacting) {
+ heap->marking_barrier()->Activate(is_compacting);
+ if (FLAG_local_heaps) {
+ heap->safepoint()->IterateLocalHeaps(
+ [is_compacting](LocalHeap* local_heap) {
+ local_heap->marking_barrier()->Activate(is_compacting);
+ });
+ }
+}
+
+// static
+void MarkingBarrier::DeactivateAll(Heap* heap) {
+ heap->marking_barrier()->Deactivate();
+ if (FLAG_local_heaps) {
+ heap->safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
+ local_heap->marking_barrier()->Deactivate();
+ });
+ }
+}
+
+// static
+void MarkingBarrier::PublishAll(Heap* heap) {
+ heap->marking_barrier()->Publish();
+ if (FLAG_local_heaps) {
+ heap->safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
+ local_heap->marking_barrier()->Publish();
+ });
+ }
+}
+
+void MarkingBarrier::Publish() {
+ DCHECK_IMPLIES(!is_main_thread_barrier_, FLAG_local_heaps);
+ if (is_activated_) {
+ worklist_.Publish();
+ for (auto& it : typed_slots_map_) {
+ MemoryChunk* memory_chunk = it.first;
+ std::unique_ptr<TypedSlots>& typed_slots = it.second;
+ RememberedSet<OLD_TO_OLD>::MergeTyped(memory_chunk,
+ std::move(typed_slots));
+ }
+ typed_slots_map_.clear();
+ }
+}
+
+void MarkingBarrier::DeactivateSpace(PagedSpace* space) {
+ DCHECK(is_main_thread_barrier_);
for (Page* p : *space) {
p->SetOldGenerationPageFlags(false);
}
}
-void MarkingBarrier::Deactivate(NewSpace* space) {
+void MarkingBarrier::DeactivateSpace(NewSpace* space) {
+ DCHECK(is_main_thread_barrier_);
for (Page* p : *space) {
p->SetYoungGenerationPageFlags(false);
}
}
void MarkingBarrier::Deactivate() {
- Deactivate(heap_->old_space());
- Deactivate(heap_->map_space());
- Deactivate(heap_->code_space());
- Deactivate(heap_->new_space());
- for (LargePage* p : *heap_->new_lo_space()) {
- p->SetYoungGenerationPageFlags(false);
- DCHECK(p->IsLargePage());
- }
- for (LargePage* p : *heap_->lo_space()) {
- p->SetOldGenerationPageFlags(false);
- }
- for (LargePage* p : *heap_->code_lo_space()) {
- p->SetOldGenerationPageFlags(false);
- }
is_activated_ = false;
is_compacting_ = false;
+ DCHECK_IMPLIES(!is_main_thread_barrier_, FLAG_local_heaps);
+ if (is_main_thread_barrier_) {
+ DeactivateSpace(heap_->old_space());
+ DeactivateSpace(heap_->map_space());
+ DeactivateSpace(heap_->code_space());
+ DeactivateSpace(heap_->new_space());
+ for (LargePage* p : *heap_->new_lo_space()) {
+ p->SetYoungGenerationPageFlags(false);
+ DCHECK(p->IsLargePage());
+ }
+ for (LargePage* p : *heap_->lo_space()) {
+ p->SetOldGenerationPageFlags(false);
+ }
+ for (LargePage* p : *heap_->code_lo_space()) {
+ p->SetOldGenerationPageFlags(false);
+ }
+ }
+ DCHECK(typed_slots_map_.empty());
+ DCHECK(worklist_.IsLocalEmpty());
}
-void MarkingBarrier::Activate(PagedSpace* space) {
+void MarkingBarrier::ActivateSpace(PagedSpace* space) {
+ DCHECK(is_main_thread_barrier_);
for (Page* p : *space) {
p->SetOldGenerationPageFlags(true);
}
}
-void MarkingBarrier::Activate(NewSpace* space) {
+void MarkingBarrier::ActivateSpace(NewSpace* space) {
+ DCHECK(is_main_thread_barrier_);
for (Page* p : *space) {
p->SetYoungGenerationPageFlags(true);
}
@@ -103,24 +190,28 @@ void MarkingBarrier::Activate(NewSpace* space) {
void MarkingBarrier::Activate(bool is_compacting) {
DCHECK(!is_activated_);
+ DCHECK(worklist_.IsLocalEmpty());
+ DCHECK_IMPLIES(!is_main_thread_barrier_, FLAG_local_heaps);
is_compacting_ = is_compacting;
is_activated_ = true;
- Activate(heap_->old_space());
- Activate(heap_->map_space());
- Activate(heap_->code_space());
- Activate(heap_->new_space());
-
- for (LargePage* p : *heap_->new_lo_space()) {
- p->SetYoungGenerationPageFlags(true);
- DCHECK(p->IsLargePage());
- }
+ if (is_main_thread_barrier_) {
+ ActivateSpace(heap_->old_space());
+ ActivateSpace(heap_->map_space());
+ ActivateSpace(heap_->code_space());
+ ActivateSpace(heap_->new_space());
+
+ for (LargePage* p : *heap_->new_lo_space()) {
+ p->SetYoungGenerationPageFlags(true);
+ DCHECK(p->IsLargePage());
+ }
- for (LargePage* p : *heap_->lo_space()) {
- p->SetOldGenerationPageFlags(true);
- }
+ for (LargePage* p : *heap_->lo_space()) {
+ p->SetOldGenerationPageFlags(true);
+ }
- for (LargePage* p : *heap_->code_lo_space()) {
- p->SetOldGenerationPageFlags(true);
+ for (LargePage* p : *heap_->code_lo_space()) {
+ p->SetOldGenerationPageFlags(true);
+ }
}
}
diff --git a/deps/v8/src/heap/marking-barrier.h b/deps/v8/src/heap/marking-barrier.h
index 761231b93d..df34bbddfe 100644
--- a/deps/v8/src/heap/marking-barrier.h
+++ b/deps/v8/src/heap/marking-barrier.h
@@ -14,19 +14,28 @@ namespace internal {
class Heap;
class IncrementalMarking;
+class LocalHeap;
class PagedSpace;
class NewSpace;
class MarkingBarrier {
public:
- MarkingBarrier(Heap*, MarkCompactCollector*, IncrementalMarking*);
+ explicit MarkingBarrier(Heap*);
+ explicit MarkingBarrier(LocalHeap*);
+ ~MarkingBarrier();
+
void Activate(bool is_compacting);
void Deactivate();
+ void Publish();
+
+ static void ActivateAll(Heap* heap, bool is_compacting);
+ static void DeactivateAll(Heap* heap);
+ static void PublishAll(Heap* heap);
void Write(HeapObject host, HeapObjectSlot, HeapObject value);
void Write(Code host, RelocInfo*, HeapObject value);
void Write(JSArrayBuffer host, ArrayBufferExtension*);
- void Write(Map host, DescriptorArray, int number_of_own_descriptors);
+ void Write(DescriptorArray, int number_of_own_descriptors);
// Returns true if the slot needs to be recorded.
inline bool MarkValue(HeapObject host, HeapObject value);
@@ -36,18 +45,25 @@ class MarkingBarrier {
inline bool WhiteToGreyAndPush(HeapObject value);
- void Activate(PagedSpace*);
- void Activate(NewSpace*);
+ void RecordRelocSlot(Code host, RelocInfo* rinfo, HeapObject target);
- void Deactivate(PagedSpace*);
- void Deactivate(NewSpace*);
+ void ActivateSpace(PagedSpace*);
+ void ActivateSpace(NewSpace*);
+
+ void DeactivateSpace(PagedSpace*);
+ void DeactivateSpace(NewSpace*);
- MarkingState marking_state_;
Heap* heap_;
MarkCompactCollector* collector_;
IncrementalMarking* incremental_marking_;
+ MarkingWorklist::Local worklist_;
+ MarkingState marking_state_;
+ std::unordered_map<MemoryChunk*, std::unique_ptr<TypedSlots>,
+ MemoryChunk::Hasher>
+ typed_slots_map_;
bool is_compacting_ = false;
bool is_activated_ = false;
+ bool is_main_thread_barrier_;
};
} // namespace internal
diff --git a/deps/v8/src/heap/marking-visitor-inl.h b/deps/v8/src/heap/marking-visitor-inl.h
index e4d495b86f..532e1c9fd5 100644
--- a/deps/v8/src/heap/marking-visitor-inl.h
+++ b/deps/v8/src/heap/marking-visitor-inl.h
@@ -351,7 +351,7 @@ int MarkingVisitorBase<ConcreteVisitor, MarkingState>::VisitWeakCell(
template <typename ConcreteVisitor, typename MarkingState>
size_t
MarkingVisitorBase<ConcreteVisitor, MarkingState>::MarkDescriptorArrayBlack(
- HeapObject host, DescriptorArray descriptors) {
+ DescriptorArray descriptors) {
concrete_visitor()->marking_state()->WhiteToGrey(descriptors);
if (concrete_visitor()->marking_state()->GreyToBlack(descriptors)) {
VisitPointer(descriptors, descriptors.map_slot());
@@ -402,7 +402,7 @@ int MarkingVisitorBase<ConcreteVisitor, MarkingState>::VisitMap(Map meta_map,
// slot holding the descriptor array will be implicitly recorded when the
// pointer fields of this map are visited.
DescriptorArray descriptors = map.synchronized_instance_descriptors();
- size += MarkDescriptorArrayBlack(map, descriptors);
+ size += MarkDescriptorArrayBlack(descriptors);
int number_of_own_descriptors = map.NumberOfOwnDescriptors();
if (number_of_own_descriptors) {
// It is possible that the concurrent marker observes the
diff --git a/deps/v8/src/heap/marking-visitor.h b/deps/v8/src/heap/marking-visitor.h
index f09f87530a..3707fc6031 100644
--- a/deps/v8/src/heap/marking-visitor.h
+++ b/deps/v8/src/heap/marking-visitor.h
@@ -227,8 +227,7 @@ class MarkingVisitorBase : public HeapVisitor<int, ConcreteVisitor> {
// Marks the descriptor array black without pushing it on the marking work
// list and visits its header. Returns the size of the descriptor array
// if it was successully marked as black.
- V8_INLINE size_t MarkDescriptorArrayBlack(HeapObject host,
- DescriptorArray descriptors);
+ V8_INLINE size_t MarkDescriptorArrayBlack(DescriptorArray descriptors);
// Marks the object grey and pushes it on the marking work list.
V8_INLINE void MarkObject(HeapObject host, HeapObject obj);
diff --git a/deps/v8/src/heap/marking-worklist-inl.h b/deps/v8/src/heap/marking-worklist-inl.h
index 25e83562bf..7e4c49667f 100644
--- a/deps/v8/src/heap/marking-worklist-inl.h
+++ b/deps/v8/src/heap/marking-worklist-inl.h
@@ -12,275 +12,6 @@
namespace v8 {
namespace internal {
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Push(Segment* segment) {
- base::MutexGuard guard(&lock_);
- segment->set_next(top_);
- set_top(segment);
- size_.fetch_add(1, std::memory_order_relaxed);
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Pop(Segment** segment) {
- base::MutexGuard guard(&lock_);
- if (top_ != nullptr) {
- DCHECK_LT(0U, size_);
- size_.fetch_sub(1, std::memory_order_relaxed);
- *segment = top_;
- set_top(top_->next());
- return true;
- }
- return false;
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::IsEmpty() {
- return base::AsAtomicPointer::Relaxed_Load(&top_) == nullptr;
-}
-
-template <typename EntryType, int SegmentSize>
-size_t MarkingWorklistImpl<EntryType, SegmentSize>::Size() {
- // It is safe to read |size_| without a lock since this variable is
- // atomic, keeping in mind that threads may not immediately see the new
- // value when it is updated.
- return size_.load(std::memory_order_relaxed);
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Clear() {
- base::MutexGuard guard(&lock_);
- size_.store(0, std::memory_order_relaxed);
- Segment* current = top_;
- while (current != nullptr) {
- Segment* tmp = current;
- current = current->next();
- delete tmp;
- }
- set_top(nullptr);
-}
-
-template <typename EntryType, int SegmentSize>
-template <typename Callback>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Update(Callback callback) {
- base::MutexGuard guard(&lock_);
- Segment* prev = nullptr;
- Segment* current = top_;
- size_t num_deleted = 0;
- while (current != nullptr) {
- current->Update(callback);
- if (current->IsEmpty()) {
- DCHECK_LT(0U, size_);
- ++num_deleted;
- if (prev == nullptr) {
- top_ = current->next();
- } else {
- prev->set_next(current->next());
- }
- Segment* tmp = current;
- current = current->next();
- delete tmp;
- } else {
- prev = current;
- current = current->next();
- }
- }
- size_.fetch_sub(num_deleted, std::memory_order_relaxed);
-}
-
-template <typename EntryType, int SegmentSize>
-template <typename Callback>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Iterate(Callback callback) {
- base::MutexGuard guard(&lock_);
- for (Segment* current = top_; current != nullptr; current = current->next()) {
- current->Iterate(callback);
- }
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Merge(
- MarkingWorklistImpl<EntryType, SegmentSize>* other) {
- Segment* top = nullptr;
- size_t other_size = 0;
- {
- base::MutexGuard guard(&other->lock_);
- if (!other->top_) return;
- top = other->top_;
- other_size = other->size_.load(std::memory_order_relaxed);
- other->size_.store(0, std::memory_order_relaxed);
- other->set_top(nullptr);
- }
-
- // It's safe to iterate through these segments because the top was
- // extracted from |other|.
- Segment* end = top;
- while (end->next()) end = end->next();
-
- {
- base::MutexGuard guard(&lock_);
- size_.fetch_add(other_size, std::memory_order_relaxed);
- end->set_next(top_);
- set_top(top);
- }
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Segment::Push(
- EntryType entry) {
- if (IsFull()) return false;
- entries_[index_++] = entry;
- return true;
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Segment::Pop(
- EntryType* entry) {
- if (IsEmpty()) return false;
- *entry = entries_[--index_];
- return true;
-}
-
-template <typename EntryType, int SegmentSize>
-template <typename Callback>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Segment::Update(
- Callback callback) {
- size_t new_index = 0;
- for (size_t i = 0; i < index_; i++) {
- if (callback(entries_[i], &entries_[new_index])) {
- new_index++;
- }
- }
- index_ = new_index;
-}
-
-template <typename EntryType, int SegmentSize>
-template <typename Callback>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Segment::Iterate(
- Callback callback) const {
- for (size_t i = 0; i < index_; i++) {
- callback(entries_[i]);
- }
-}
-
-template <typename EntryType, int SegmentSize>
-MarkingWorklistImpl<EntryType, SegmentSize>::Local::Local(
- MarkingWorklistImpl<EntryType, SegmentSize>* worklist)
- : worklist_(worklist),
- push_segment_(NewSegment()),
- pop_segment_(NewSegment()) {}
-
-template <typename EntryType, int SegmentSize>
-MarkingWorklistImpl<EntryType, SegmentSize>::Local::~Local() {
- CHECK_IMPLIES(push_segment_, push_segment_->IsEmpty());
- CHECK_IMPLIES(pop_segment_, pop_segment_->IsEmpty());
- delete push_segment_;
- delete pop_segment_;
-}
-
-template <typename EntryType, int SegmentSize>
-MarkingWorklistImpl<EntryType, SegmentSize>::Local::Local(
- MarkingWorklistImpl<EntryType, SegmentSize>::Local&& other) V8_NOEXCEPT {
- worklist_ = other.worklist_;
- push_segment_ = other.push_segment_;
- pop_segment_ = other.pop_segment_;
- other.worklist_ = nullptr;
- other.push_segment_ = nullptr;
- other.pop_segment_ = nullptr;
-}
-
-template <typename EntryType, int SegmentSize>
-typename MarkingWorklistImpl<EntryType, SegmentSize>::Local&
-MarkingWorklistImpl<EntryType, SegmentSize>::Local::operator=(
- MarkingWorklistImpl<EntryType, SegmentSize>::Local&& other) V8_NOEXCEPT {
- if (this != &other) {
- DCHECK_NULL(worklist_);
- DCHECK_NULL(push_segment_);
- DCHECK_NULL(pop_segment_);
- worklist_ = other.worklist_;
- push_segment_ = other.push_segment_;
- pop_segment_ = other.pop_segment_;
- other.worklist_ = nullptr;
- other.push_segment_ = nullptr;
- other.pop_segment_ = nullptr;
- }
- return *this;
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Local::Push(EntryType entry) {
- if (V8_UNLIKELY(!push_segment_->Push(entry))) {
- PublishPushSegment();
- bool success = push_segment_->Push(entry);
- USE(success);
- DCHECK(success);
- }
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Local::Pop(EntryType* entry) {
- if (!pop_segment_->Pop(entry)) {
- if (!push_segment_->IsEmpty()) {
- std::swap(push_segment_, pop_segment_);
- } else if (!StealPopSegment()) {
- return false;
- }
- bool success = pop_segment_->Pop(entry);
- USE(success);
- DCHECK(success);
- }
- return true;
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Local::IsLocalEmpty() const {
- return push_segment_->IsEmpty() && pop_segment_->IsEmpty();
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Local::IsGlobalEmpty() const {
- return worklist_->IsEmpty();
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Local::Publish() {
- if (!push_segment_->IsEmpty()) {
- PublishPushSegment();
- }
- if (!pop_segment_->IsEmpty()) {
- PublishPopSegment();
- }
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Local::Merge(
- MarkingWorklistImpl<EntryType, SegmentSize>::Local* other) {
- other->Publish();
- worklist_->Merge(other->worklist_);
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Local::PublishPushSegment() {
- worklist_->Push(push_segment_);
- push_segment_ = NewSegment();
-}
-
-template <typename EntryType, int SegmentSize>
-void MarkingWorklistImpl<EntryType, SegmentSize>::Local::PublishPopSegment() {
- worklist_->Push(pop_segment_);
- pop_segment_ = NewSegment();
-}
-
-template <typename EntryType, int SegmentSize>
-bool MarkingWorklistImpl<EntryType, SegmentSize>::Local::StealPopSegment() {
- if (worklist_->IsEmpty()) return false;
- Segment* new_segment = nullptr;
- if (worklist_->Pop(&new_segment)) {
- delete pop_segment_;
- pop_segment_ = new_segment;
- return true;
- }
- return false;
-}
-
template <typename Callback>
void MarkingWorklists::Update(Callback callback) {
shared_.Update(callback);
diff --git a/deps/v8/src/heap/marking-worklist.h b/deps/v8/src/heap/marking-worklist.h
index 9ed8d9de63..2be050c7e5 100644
--- a/deps/v8/src/heap/marking-worklist.h
+++ b/deps/v8/src/heap/marking-worklist.h
@@ -8,6 +8,7 @@
#include <unordered_map>
#include <vector>
+#include "src/heap/base/worklist.h"
#include "src/heap/marking.h"
#include "src/objects/heap-object.h"
@@ -17,120 +18,8 @@ namespace internal {
// The index of the main thread task used by concurrent/parallel GC.
const int kMainThreadTask = 0;
-// A global marking worklist that is similar the existing Worklist
-// but does not reserve space and keep track of the local segments.
-// Eventually this will replace Worklist after all its current uses
-// are migrated.
-template <typename EntryType, int SegmentSize>
-class MarkingWorklistImpl {
- public:
- static const int kSegmentSize = SegmentSize;
- class Segment;
- class Local;
-
- MarkingWorklistImpl() = default;
- ~MarkingWorklistImpl() { CHECK(IsEmpty()); }
-
- void Push(Segment* segment);
- bool Pop(Segment** segment);
-
- // Returns true if the list of segments is empty.
- bool IsEmpty();
- // Returns the number of segments in the list.
- size_t Size();
-
- // Moves the segments of the given marking worklist into this
- // marking worklist.
- void Merge(MarkingWorklistImpl<EntryType, SegmentSize>* other);
-
- // These functions are not thread-safe. They should be called only
- // if all local marking worklists that use the current worklist have
- // been published and are empty.
- void Clear();
- template <typename Callback>
- void Update(Callback callback);
- template <typename Callback>
- void Iterate(Callback callback);
-
- private:
- void set_top(Segment* segment) {
- base::AsAtomicPointer::Relaxed_Store(&top_, segment);
- }
- base::Mutex lock_;
- Segment* top_ = nullptr;
- std::atomic<size_t> size_{0};
-};
-
-template <typename EntryType, int SegmentSize>
-class MarkingWorklistImpl<EntryType, SegmentSize>::Segment {
- public:
- static const size_t kSize = SegmentSize;
-
- Segment() = default;
- bool Push(EntryType entry);
- bool Pop(EntryType* entry);
-
- size_t Size() const { return index_; }
- bool IsEmpty() const { return index_ == 0; }
- bool IsFull() const { return index_ == kSize; }
- void Clear() { index_ = 0; }
-
- template <typename Callback>
- void Update(Callback callback);
- template <typename Callback>
- void Iterate(Callback callback) const;
-
- Segment* next() const { return next_; }
- void set_next(Segment* segment) { next_ = segment; }
-
- private:
- Segment* next_;
- size_t index_;
- EntryType entries_[kSize];
-};
-
-// A thread-local view of the marking worklist.
-template <typename EntryType, int SegmentSize>
-class MarkingWorklistImpl<EntryType, SegmentSize>::Local {
- public:
- Local() = default;
- explicit Local(MarkingWorklistImpl<EntryType, SegmentSize>* worklist);
- ~Local();
-
- Local(Local&&) V8_NOEXCEPT;
- Local& operator=(Local&&) V8_NOEXCEPT;
-
- // Disable copying since having multiple copies of the same
- // local marking worklist is unsafe.
- Local(const Local&) = delete;
- Local& operator=(const Local& other) = delete;
-
- void Push(EntryType entry);
- bool Pop(EntryType* entry);
-
- bool IsLocalEmpty() const;
- bool IsGlobalEmpty() const;
-
- void Publish();
- void Merge(MarkingWorklistImpl<EntryType, SegmentSize>::Local* other);
-
- size_t PushSegmentSize() const { return push_segment_->Size(); }
-
- private:
- void PublishPushSegment();
- void PublishPopSegment();
- bool StealPopSegment();
- Segment* NewSegment() const {
- // Bottleneck for filtering in crash dumps.
- return new Segment();
- }
- MarkingWorklistImpl<EntryType, SegmentSize>* worklist_ = nullptr;
- Segment* push_segment_ = nullptr;
- Segment* pop_segment_ = nullptr;
-};
-
-using MarkingWorklist = MarkingWorklistImpl<HeapObject, 64>;
-using EmbedderTracingWorklist = MarkingWorklistImpl<HeapObject, 16>;
+using MarkingWorklist = ::heap::base::Worklist<HeapObject, 64>;
+using EmbedderTracingWorklist = ::heap::base::Worklist<HeapObject, 16>;
// We piggyback on marking to compute object sizes per native context that is
// needed for the new memory measurement API. The algorithm works as follows:
diff --git a/deps/v8/src/heap/marking.h b/deps/v8/src/heap/marking.h
index fc87041d4e..5ce2f6cd25 100644
--- a/deps/v8/src/heap/marking.h
+++ b/deps/v8/src/heap/marking.h
@@ -58,8 +58,9 @@ class MarkBit {
template <>
inline bool MarkBit::Set<AccessMode::NON_ATOMIC>() {
CellType old_value = *cell_;
+ if ((old_value & mask_) == mask_) return false;
*cell_ = old_value | mask_;
- return (old_value & mask_) == 0;
+ return true;
}
template <>
diff --git a/deps/v8/src/heap/memory-chunk-layout.h b/deps/v8/src/heap/memory-chunk-layout.h
index aaf0334acb..0a95c70989 100644
--- a/deps/v8/src/heap/memory-chunk-layout.h
+++ b/deps/v8/src/heap/memory-chunk-layout.h
@@ -9,6 +9,10 @@
#include "src/heap/list.h"
#include "src/heap/slot-set.h"
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+#include "src/heap/object-start-bitmap.h"
+#endif
+
namespace v8 {
namespace internal {
@@ -61,6 +65,9 @@ class V8_EXPORT_PRIVATE MemoryChunkLayout {
FIELD(Bitmap*, YoungGenerationBitmap),
FIELD(CodeObjectRegistry*, CodeObjectRegistry),
FIELD(PossiblyEmptyBuckets, PossiblyEmptyBuckets),
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ FIELD(ObjectStartBitmap, ObjectStartBitmap),
+#endif
kMarkingBitmapOffset,
kMemoryChunkHeaderSize = kMarkingBitmapOffset,
kMemoryChunkHeaderStart = kSlotSetOffset,
diff --git a/deps/v8/src/heap/memory-chunk.cc b/deps/v8/src/heap/memory-chunk.cc
index 96b50939e9..9ff4d23557 100644
--- a/deps/v8/src/heap/memory-chunk.cc
+++ b/deps/v8/src/heap/memory-chunk.cc
@@ -155,6 +155,10 @@ MemoryChunk* MemoryChunk::Initialize(BasicMemoryChunk* basic_chunk, Heap* heap,
chunk->possibly_empty_buckets_.Initialize();
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ chunk->object_start_bitmap_ = ObjectStartBitmap(chunk->area_start());
+#endif
+
#ifdef DEBUG
ValidateOffsets(chunk);
#endif
diff --git a/deps/v8/src/heap/memory-chunk.h b/deps/v8/src/heap/memory-chunk.h
index cd74c61def..ba6c06d026 100644
--- a/deps/v8/src/heap/memory-chunk.h
+++ b/deps/v8/src/heap/memory-chunk.h
@@ -227,6 +227,10 @@ class MemoryChunk : public BasicMemoryChunk {
// read-only space chunks.
void ReleaseAllocatedMemoryNeededForWritableChunk();
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ ObjectStartBitmap* object_start_bitmap() { return &object_start_bitmap_; }
+#endif
+
protected:
static MemoryChunk* Initialize(BasicMemoryChunk* basic_chunk, Heap* heap,
Executability executable);
@@ -301,6 +305,10 @@ class MemoryChunk : public BasicMemoryChunk {
PossiblyEmptyBuckets possibly_empty_buckets_;
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ ObjectStartBitmap object_start_bitmap_;
+#endif
+
private:
friend class ConcurrentMarkingState;
friend class MajorMarkingState;
diff --git a/deps/v8/src/heap/new-spaces.cc b/deps/v8/src/heap/new-spaces.cc
index 6aa715da5f..98a8c715f4 100644
--- a/deps/v8/src/heap/new-spaces.cc
+++ b/deps/v8/src/heap/new-spaces.cc
@@ -10,6 +10,7 @@
#include "src/heap/mark-compact.h"
#include "src/heap/memory-allocator.h"
#include "src/heap/paged-spaces.h"
+#include "src/heap/safepoint.h"
#include "src/heap/spaces-inl.h"
#include "src/heap/spaces.h"
@@ -417,6 +418,7 @@ void NewSpace::TearDown() {
void NewSpace::Flip() { SemiSpace::Swap(&from_space_, &to_space_); }
void NewSpace::Grow() {
+ DCHECK(heap()->safepoint()->IsActive());
// Double the semispace size but only up to maximum capacity.
DCHECK(TotalCapacity() < MaximumCapacity());
size_t new_capacity =
diff --git a/deps/v8/src/heap/object-start-bitmap.h b/deps/v8/src/heap/object-start-bitmap.h
new file mode 100644
index 0000000000..75051d9a58
--- /dev/null
+++ b/deps/v8/src/heap/object-start-bitmap.h
@@ -0,0 +1,188 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_OBJECT_START_BITMAP_H_
+#define V8_HEAP_OBJECT_START_BITMAP_H_
+
+#include <limits.h>
+#include <stdint.h>
+
+#include <array>
+
+#include "include/v8-internal.h"
+#include "src/base/bits.h"
+#include "src/base/macros.h"
+#include "src/common/globals.h"
+
+namespace v8 {
+namespace internal {
+
+static constexpr size_t kAllocationGranularity = kTaggedSize;
+static constexpr size_t kAllocationMask = kAllocationGranularity - 1;
+static const int kPageSize = 1 << kPageSizeBits;
+
+// A bitmap for recording object starts. Objects have to be allocated at
+// minimum granularity of kGranularity.
+//
+// Depends on internals such as:
+// - kPageSize
+// - kAllocationGranularity
+//
+// ObjectStartBitmap does not support concurrent access and is used only by the
+// main thread.
+class V8_EXPORT_PRIVATE ObjectStartBitmap {
+ public:
+ // Granularity of addresses added to the bitmap.
+ static constexpr size_t Granularity() { return kAllocationGranularity; }
+
+ // Maximum number of entries in the bitmap.
+ static constexpr size_t MaxEntries() {
+ return kReservedForBitmap * kBitsPerCell;
+ }
+
+ explicit inline ObjectStartBitmap(size_t offset = 0);
+
+ // Finds an object header based on a maybe_inner_ptr. Will search for an
+ // object start in decreasing address order.
+ //
+ // This must only be used when there exists at least one entry in the bitmap.
+ inline Address FindBasePtr(Address maybe_inner_ptr) const;
+
+ inline void SetBit(Address);
+ inline void ClearBit(Address);
+ inline bool CheckBit(Address) const;
+
+ // Iterates all object starts recorded in the bitmap.
+ //
+ // The callback is of type
+ // void(Address)
+ // and is passed the object start address as parameter.
+ template <typename Callback>
+ inline void Iterate(Callback) const;
+
+ // Clear the object start bitmap.
+ inline void Clear();
+
+ private:
+ inline void store(size_t cell_index, uint32_t value);
+ inline uint32_t load(size_t cell_index) const;
+
+ inline Address offset() const;
+
+ static constexpr size_t kBitsPerCell = sizeof(uint32_t) * CHAR_BIT;
+ static constexpr size_t kCellMask = kBitsPerCell - 1;
+ static constexpr size_t kBitmapSize =
+ (kPageSize + ((kBitsPerCell * kAllocationGranularity) - 1)) /
+ (kBitsPerCell * kAllocationGranularity);
+ static constexpr size_t kReservedForBitmap =
+ ((kBitmapSize + kAllocationMask) & ~kAllocationMask);
+
+ inline void ObjectStartIndexAndBit(Address, size_t*, size_t*) const;
+
+ inline Address StartIndexToAddress(size_t object_start_index) const;
+
+ size_t offset_;
+
+ std::array<uint32_t, kReservedForBitmap> object_start_bit_map_;
+};
+
+ObjectStartBitmap::ObjectStartBitmap(size_t offset) : offset_(offset) {
+ Clear();
+}
+
+Address ObjectStartBitmap::FindBasePtr(Address maybe_inner_ptr) const {
+ DCHECK_LE(offset(), maybe_inner_ptr);
+ size_t object_offset = maybe_inner_ptr - offset();
+ size_t object_start_number = object_offset / kAllocationGranularity;
+ size_t cell_index = object_start_number / kBitsPerCell;
+ DCHECK_GT(object_start_bit_map_.size(), cell_index);
+ const size_t bit = object_start_number & kCellMask;
+ // check if maybe_inner_ptr is the base pointer
+ uint32_t byte = load(cell_index) & ((1 << (bit + 1)) - 1);
+ while (!byte && cell_index) {
+ DCHECK_LT(0u, cell_index);
+ byte = load(--cell_index);
+ }
+ const int leading_zeroes = v8::base::bits::CountLeadingZeros(byte);
+ if (leading_zeroes == kBitsPerCell) {
+ return kNullAddress;
+ }
+
+ object_start_number =
+ (cell_index * kBitsPerCell) + (kBitsPerCell - 1) - leading_zeroes;
+ Address base_ptr = StartIndexToAddress(object_start_number);
+ return base_ptr;
+}
+
+void ObjectStartBitmap::SetBit(Address base_ptr) {
+ size_t cell_index, object_bit;
+ ObjectStartIndexAndBit(base_ptr, &cell_index, &object_bit);
+ store(cell_index,
+ static_cast<uint32_t>(load(cell_index) | (1 << object_bit)));
+}
+
+void ObjectStartBitmap::ClearBit(Address base_ptr) {
+ size_t cell_index, object_bit;
+ ObjectStartIndexAndBit(base_ptr, &cell_index, &object_bit);
+ store(cell_index,
+ static_cast<uint32_t>(load(cell_index) & ~(1 << object_bit)));
+}
+
+bool ObjectStartBitmap::CheckBit(Address base_ptr) const {
+ size_t cell_index, object_bit;
+ ObjectStartIndexAndBit(base_ptr, &cell_index, &object_bit);
+ return load(cell_index) & (1 << object_bit);
+}
+
+void ObjectStartBitmap::store(size_t cell_index, uint32_t value) {
+ object_start_bit_map_[cell_index] = value;
+ return;
+}
+
+uint32_t ObjectStartBitmap::load(size_t cell_index) const {
+ return object_start_bit_map_[cell_index];
+}
+
+Address ObjectStartBitmap::offset() const { return offset_; }
+
+void ObjectStartBitmap::ObjectStartIndexAndBit(Address base_ptr,
+ size_t* cell_index,
+ size_t* bit) const {
+ const size_t object_offset = base_ptr - offset();
+ DCHECK(!(object_offset & kAllocationMask));
+ const size_t object_start_number = object_offset / kAllocationGranularity;
+ *cell_index = object_start_number / kBitsPerCell;
+ DCHECK_GT(kBitmapSize, *cell_index);
+ *bit = object_start_number & kCellMask;
+}
+
+Address ObjectStartBitmap::StartIndexToAddress(
+ size_t object_start_index) const {
+ return offset() + (kAllocationGranularity * object_start_index);
+}
+
+template <typename Callback>
+inline void ObjectStartBitmap::Iterate(Callback callback) const {
+ for (size_t cell_index = 0; cell_index < kReservedForBitmap; cell_index++) {
+ uint32_t value = object_start_bit_map_[cell_index];
+ while (value) {
+ const int trailing_zeroes = v8::base::bits::CountTrailingZeros(value);
+ const size_t object_start_number =
+ (cell_index * kBitsPerCell) + trailing_zeroes;
+ const Address object_address = StartIndexToAddress(object_start_number);
+ callback(object_address);
+ // Clear current object bit in temporary value to advance iteration.
+ value &= ~(1 << (object_start_number & kCellMask));
+ }
+ }
+}
+
+void ObjectStartBitmap::Clear() {
+ std::fill(object_start_bit_map_.begin(), object_start_bit_map_.end(), 0);
+}
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_HEAP_OBJECT_START_BITMAP_H_
diff --git a/deps/v8/src/heap/object-stats.cc b/deps/v8/src/heap/object-stats.cc
index 1db380b882..b84ae26c90 100644
--- a/deps/v8/src/heap/object-stats.cc
+++ b/deps/v8/src/heap/object-stats.cc
@@ -723,7 +723,7 @@ void ObjectStatsCollectorImpl::RecordVirtualFeedbackVectorDetails(
// Log the monomorphic/polymorphic helper objects that this slot owns.
for (int i = 0; i < it.entry_size(); i++) {
- MaybeObject raw_object = vector.get(slot.ToInt() + i);
+ MaybeObject raw_object = vector.Get(slot.WithOffset(i));
HeapObject object;
if (raw_object->GetHeapObject(&object)) {
if (object.IsCell() || object.IsWeakFixedArray()) {
diff --git a/deps/v8/src/heap/objects-visiting.h b/deps/v8/src/heap/objects-visiting.h
index 7fbe91c665..7ecb66bcee 100644
--- a/deps/v8/src/heap/objects-visiting.h
+++ b/deps/v8/src/heap/objects-visiting.h
@@ -9,7 +9,7 @@
#include "src/objects/map.h"
#include "src/objects/objects.h"
#include "src/objects/visitors.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
namespace v8 {
namespace internal {
@@ -30,7 +30,6 @@ namespace internal {
V(EphemeronHashTable) \
V(FeedbackCell) \
V(FeedbackMetadata) \
- V(FeedbackVector) \
V(FixedDoubleArray) \
V(JSArrayBuffer) \
V(JSDataView) \
diff --git a/deps/v8/src/heap/paged-spaces.cc b/deps/v8/src/heap/paged-spaces.cc
index 1760716516..5ab30e3aa8 100644
--- a/deps/v8/src/heap/paged-spaces.cc
+++ b/deps/v8/src/heap/paged-spaces.cc
@@ -137,13 +137,14 @@ void PagedSpace::RefillFreeList() {
owner->RefineAllocatedBytesAfterSweeping(p);
owner->RemovePage(p);
added += AddPage(p);
+ added += p->wasted_memory();
} else {
base::MutexGuard guard(mutex());
DCHECK_EQ(this, p->owner());
RefineAllocatedBytesAfterSweeping(p);
added += RelinkFreeListCategories(p);
+ added += p->wasted_memory();
}
- added += p->wasted_memory();
if (is_compaction_space() && (added > kCompactionMemoryWanted)) break;
}
}
@@ -180,7 +181,6 @@ void PagedSpace::MergeLocalSpace(LocalSpace* other) {
// Relinking requires the category to be unlinked.
other->RemovePage(p);
AddPage(p);
- heap()->NotifyOldGenerationExpansion(identity(), p);
DCHECK_IMPLIES(
!p->IsFlagSet(Page::NEVER_ALLOCATE_ON_PAGE),
p->AvailableInFreeList() == p->AvailableInFreeListFromAllocatedBytes());
@@ -192,6 +192,9 @@ void PagedSpace::MergeLocalSpace(LocalSpace* other) {
// We'll have to come up with a better solution for allocation stepping
// before shipping, which will likely be using LocalHeap.
}
+ for (auto p : other->GetNewPages()) {
+ heap()->NotifyOldGenerationExpansion(identity(), p);
+ }
DCHECK_EQ(0u, other->Size());
DCHECK_EQ(0u, other->Capacity());
@@ -200,6 +203,7 @@ void PagedSpace::MergeLocalSpace(LocalSpace* other) {
size_t PagedSpace::CommittedPhysicalMemory() {
if (!base::OS::HasLazyCommits()) return CommittedMemory();
BasicMemoryChunk::UpdateHighWaterMark(allocation_info_.top());
+ base::MutexGuard guard(mutex());
size_t size = 0;
for (Page* page : *this) {
size += page->CommittedPhysicalMemory();
@@ -451,7 +455,9 @@ void PagedSpace::ReleasePage(Page* page) {
SetTopAndLimit(kNullAddress, kNullAddress);
}
- heap()->isolate()->RemoveCodeMemoryChunk(page);
+ if (identity() == CODE_SPACE) {
+ heap()->isolate()->RemoveCodeMemoryChunk(page);
+ }
AccountUncommitted(page->size());
accounting_stats_.DecreaseCapacity(page->area_size());
@@ -827,6 +833,12 @@ bool PagedSpace::RefillLabMain(int size_in_bytes, AllocationOrigin origin) {
return RawRefillLabMain(size_in_bytes, origin);
}
+Page* LocalSpace::Expand() {
+ Page* page = PagedSpace::Expand();
+ new_pages_.push_back(page);
+ return page;
+}
+
bool CompactionSpace::RefillLabMain(int size_in_bytes,
AllocationOrigin origin) {
return RawRefillLabMain(size_in_bytes, origin);
diff --git a/deps/v8/src/heap/paged-spaces.h b/deps/v8/src/heap/paged-spaces.h
index 4af1b3013c..198f12e103 100644
--- a/deps/v8/src/heap/paged-spaces.h
+++ b/deps/v8/src/heap/paged-spaces.h
@@ -341,7 +341,7 @@ class V8_EXPORT_PRIVATE PagedSpace
// Expands the space by allocating a fixed number of pages. Returns false if
// it cannot allocate requested number of pages from OS, or if the hard heap
// size limit has been hit.
- Page* Expand();
+ virtual Page* Expand();
Page* ExpandBackground(LocalHeap* local_heap);
Page* AllocatePage();
@@ -417,9 +417,15 @@ class V8_EXPORT_PRIVATE LocalSpace : public PagedSpace {
DCHECK_NE(local_space_kind, LocalSpaceKind::kNone);
}
+ const std::vector<Page*>& GetNewPages() { return new_pages_; }
+
protected:
+ Page* Expand() override;
// The space is temporary and not included in any snapshots.
bool snapshotable() override { return false; }
+ // Pages that were allocated in this local space and need to be merged
+ // to the main space.
+ std::vector<Page*> new_pages_;
};
// -----------------------------------------------------------------------------
diff --git a/deps/v8/src/heap/safepoint.cc b/deps/v8/src/heap/safepoint.cc
index 8f20bde75e..a306fbde08 100644
--- a/deps/v8/src/heap/safepoint.cc
+++ b/deps/v8/src/heap/safepoint.cc
@@ -16,10 +16,6 @@ namespace internal {
GlobalSafepoint::GlobalSafepoint(Heap* heap)
: heap_(heap), local_heaps_head_(nullptr), active_safepoint_scopes_(0) {}
-void GlobalSafepoint::Start() { EnterSafepointScope(); }
-
-void GlobalSafepoint::End() { LeaveSafepointScope(); }
-
void GlobalSafepoint::EnterSafepointScope() {
if (!FLAG_local_heaps) return;
diff --git a/deps/v8/src/heap/safepoint.h b/deps/v8/src/heap/safepoint.h
index e36e37fd71..efe499ea13 100644
--- a/deps/v8/src/heap/safepoint.h
+++ b/deps/v8/src/heap/safepoint.h
@@ -43,10 +43,6 @@ class GlobalSafepoint {
}
}
- // Use these methods now instead of the more intrusive SafepointScope
- void Start();
- void End();
-
bool IsActive() { return active_safepoint_scopes_ > 0; }
private:
diff --git a/deps/v8/src/heap/scavenger.cc b/deps/v8/src/heap/scavenger.cc
index 2861198327..f51a385085 100644
--- a/deps/v8/src/heap/scavenger.cc
+++ b/deps/v8/src/heap/scavenger.cc
@@ -486,7 +486,7 @@ int ScavengerCollector::NumberOfScavengeTasks() {
static int num_cores = V8::GetCurrentPlatform()->NumberOfWorkerThreads() + 1;
int tasks =
Max(1, Min(Min(num_scavenge_tasks, kMaxScavengerTasks), num_cores));
- if (!heap_->CanExpandOldGeneration(
+ if (!heap_->CanPromoteYoungAndExpandOldGeneration(
static_cast<size_t>(tasks * Page::kPageSize))) {
// Optimize for memory usage near the heap limit.
tasks = 1;
diff --git a/deps/v8/src/heap/setup-heap-internal.cc b/deps/v8/src/heap/setup-heap-internal.cc
index b255d4858d..b1844256e8 100644
--- a/deps/v8/src/heap/setup-heap-internal.cc
+++ b/deps/v8/src/heap/setup-heap-internal.cc
@@ -44,9 +44,9 @@
#include "src/objects/template-objects-inl.h"
#include "src/regexp/regexp.h"
#include "src/wasm/wasm-objects.h"
-#include "torque-generated/class-definitions-tq.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/internal-class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/internal-class-definitions-inl.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/heap/sweeper.cc b/deps/v8/src/heap/sweeper.cc
index b335e23277..cdb1058edb 100644
--- a/deps/v8/src/heap/sweeper.cc
+++ b/deps/v8/src/heap/sweeper.cc
@@ -386,6 +386,10 @@ int Sweeper::RawSweep(
// The free ranges map is used for filtering typed slots.
FreeRangesMap free_ranges_map;
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ p->object_start_bitmap()->Clear();
+#endif
+
// Iterate over the page using the live objects and free the memory before
// the given live object.
Address free_start = p->area_start();
@@ -410,6 +414,10 @@ int Sweeper::RawSweep(
int size = object.SizeFromMap(map);
live_bytes += size;
free_start = free_end + size;
+
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+ p->object_start_bitmap()->SetBit(object.address());
+#endif
}
// If there is free memory after the last live object also free that.
diff --git a/deps/v8/src/ic/accessor-assembler.cc b/deps/v8/src/ic/accessor-assembler.cc
index 40e8a5de72..40728edf90 100644
--- a/deps/v8/src/ic/accessor-assembler.cc
+++ b/deps/v8/src/ic/accessor-assembler.cc
@@ -6,6 +6,7 @@
#include "src/ast/ast.h"
#include "src/base/optional.h"
+#include "src/builtins/builtins-constructor-gen.h"
#include "src/codegen/code-factory.h"
#include "src/ic/handler-configuration.h"
#include "src/ic/ic.h"
@@ -65,14 +66,15 @@ TNode<MaybeObject> AccessorAssembler::LoadHandlerDataField(
TNode<MaybeObject> AccessorAssembler::TryMonomorphicCase(
TNode<TaggedIndex> slot, TNode<FeedbackVector> vector,
- TNode<Map> receiver_map, Label* if_handler,
+ TNode<Map> lookup_start_object_map, Label* if_handler,
TVariable<MaybeObject>* var_handler, Label* if_miss) {
Comment("TryMonomorphicCase");
DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
// TODO(ishell): add helper class that hides offset computations for a series
// of loads.
- int32_t header_size = FeedbackVector::kFeedbackSlotsOffset - kHeapObjectTag;
+ int32_t header_size =
+ FeedbackVector::kRawFeedbackSlotsOffset - kHeapObjectTag;
// Adding |header_size| with a separate IntPtrAdd rather than passing it
// into ElementOffsetFromIndex() allows it to be folded into a single
// [base, index, offset] indirect memory access on x64.
@@ -83,7 +85,7 @@ TNode<MaybeObject> AccessorAssembler::TryMonomorphicCase(
// Try to quickly handle the monomorphic case without knowing for sure
// if we have a weak reference in feedback.
- GotoIfNot(IsWeakReferenceTo(feedback, receiver_map), if_miss);
+ GotoIfNot(IsWeakReferenceTo(feedback, lookup_start_object_map), if_miss);
TNode<MaybeObject> handler = UncheckedCast<MaybeObject>(
Load(MachineType::AnyTagged(), vector,
@@ -95,8 +97,8 @@ TNode<MaybeObject> AccessorAssembler::TryMonomorphicCase(
}
void AccessorAssembler::HandlePolymorphicCase(
- TNode<Map> receiver_map, TNode<WeakFixedArray> feedback, Label* if_handler,
- TVariable<MaybeObject>* var_handler, Label* if_miss) {
+ TNode<Map> lookup_start_object_map, TNode<WeakFixedArray> feedback,
+ Label* if_handler, TVariable<MaybeObject>* var_handler, Label* if_miss) {
Comment("HandlePolymorphicCase");
DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
@@ -118,7 +120,8 @@ void AccessorAssembler::HandlePolymorphicCase(
TNode<MaybeObject> maybe_cached_map =
LoadWeakFixedArrayElement(feedback, var_index.value());
CSA_ASSERT(this, IsWeakOrCleared(maybe_cached_map));
- GotoIfNot(IsWeakReferenceTo(maybe_cached_map, receiver_map), &loop_next);
+ GotoIfNot(IsWeakReferenceTo(maybe_cached_map, lookup_start_object_map),
+ &loop_next);
// Found, now call handler.
TNode<MaybeObject> handler =
@@ -140,7 +143,7 @@ void AccessorAssembler::HandleLoadICHandlerCase(
ElementSupport support_elements, LoadAccessMode access_mode) {
Comment("have_handler");
- TVARIABLE(Object, var_holder, p->holder());
+ TVARIABLE(Object, var_holder, p->lookup_start_object());
TVARIABLE(Object, var_smi_handler, handler);
Label if_smi_handler(this, {&var_holder, &var_smi_handler});
@@ -197,7 +200,8 @@ void AccessorAssembler::HandleLoadAccessor(
// Context is stored either in data2 or data3 field depending on whether
// the access check is enabled for this handler or not.
TNode<MaybeObject> maybe_context = Select<MaybeObject>(
- IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word),
+ IsSetWord<LoadHandler::DoAccessCheckOnLookupStartObjectBits>(
+ handler_word),
[=] { return LoadHandlerDataField(handler, 3); },
[=] { return LoadHandlerDataField(handler, 2); });
@@ -212,7 +216,7 @@ void AccessorAssembler::HandleLoadAccessor(
TNode<Object> data =
LoadObjectField(call_handler_info, CallHandlerInfo::kDataOffset);
- TVARIABLE(HeapObject, api_holder, CAST(p->receiver()));
+ TVARIABLE(HeapObject, api_holder, CAST(p->lookup_start_object()));
Label load(this);
GotoIf(WordEqual(handler_kind, IntPtrConstant(LoadHandler::kApiGetter)),
&load);
@@ -222,7 +226,7 @@ void AccessorAssembler::HandleLoadAccessor(
WordEqual(handler_kind,
IntPtrConstant(LoadHandler::kApiGetterHolderIsPrototype)));
- api_holder = LoadMapPrototype(LoadMap(CAST(p->receiver())));
+ api_holder = LoadMapPrototype(LoadMap(CAST(p->lookup_start_object())));
Goto(&load);
BIND(&load);
@@ -546,9 +550,9 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(
TVARIABLE(Object, var_value);
LoadPropertyFromNameDictionary(properties, var_name_index.value(),
&var_details, &var_value);
- TNode<Object> value =
- CallGetterIfAccessor(var_value.value(), var_details.value(),
- p->context(), p->receiver(), miss);
+ TNode<Object> value = CallGetterIfAccessor(
+ var_value.value(), CAST(holder), var_details.value(), p->context(),
+ p->receiver(), miss);
exit_point->Return(value);
}
}
@@ -631,8 +635,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(
CAST(holder), PropertyCell::kPropertyDetailsRawOffset));
GotoIf(IsTheHole(value), miss);
- exit_point->Return(CallGetterIfAccessor(value, details, p->context(),
- p->receiver(), miss));
+ exit_point->Return(CallGetterIfAccessor(value, CAST(holder), details,
+ p->context(), p->receiver(), miss));
}
BIND(&interceptor);
@@ -650,8 +654,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(
p->name(), p->slot(), p->vector());
} else {
- exit_point->ReturnCallRuntime(Runtime::kGetProperty, p->context(),
- p->receiver(), p->name());
+ exit_point->ReturnCallRuntime(Runtime::kGetProperty, p->context(), holder,
+ p->name(), p->receiver());
}
}
@@ -787,12 +791,14 @@ void AccessorAssembler::HandleLoadICSmiHandlerHasNamedCase(
// generate a code that handles Code handlers.
// If |on_code_handler| is not provided, then only smi sub handler are
// expected.
-// 3. Does access check on receiver if ICHandler::DoAccessCheckOnReceiverBits
-// bit is set in the smi handler.
-// 4. Does dictionary lookup on receiver if ICHandler::LookupOnReceiverBits bit
-// is set in the smi handler. If |on_found_on_receiver| is provided then
-// it calls it to generate a code that handles the "found on receiver case"
-// or just misses if the |on_found_on_receiver| is not provided.
+// 3. Does access check on lookup start object if
+// ICHandler::DoAccessCheckOnLookupStartObjectBits bit is set in the smi
+// handler.
+// 4. Does dictionary lookup on receiver if
+// ICHandler::LookupOnLookupStartObjectBits bit is set in the smi handler. If
+// |on_found_on_lookup_start_object| is provided then it calls it to
+// generate a code that handles the "found on receiver case" or just misses
+// if the |on_found_on_lookup_start_object| is not provided.
// 5. Falls through in a case of a smi handler which is returned from this
// function (tagged!).
// TODO(ishell): Remove templatezation once we move common bits from
@@ -801,8 +807,8 @@ template <typename ICHandler, typename ICParameters>
TNode<Object> AccessorAssembler::HandleProtoHandler(
const ICParameters* p, TNode<DataHandler> handler,
const OnCodeHandler& on_code_handler,
- const OnFoundOnReceiver& on_found_on_receiver, Label* miss,
- ICMode ic_mode) {
+ const OnFoundOnLookupStartObject& on_found_on_lookup_start_object,
+ Label* miss, ICMode ic_mode) {
//
// Check prototype validity cell.
//
@@ -832,21 +838,24 @@ TNode<Object> AccessorAssembler::HandleProtoHandler(
// because in the former case the validity cell check guards modifications
// of the global object and the latter is not applicable to the global
// object.
- int mask = ICHandler::LookupOnReceiverBits::kMask |
- ICHandler::DoAccessCheckOnReceiverBits::kMask;
+ int mask = ICHandler::LookupOnLookupStartObjectBits::kMask |
+ ICHandler::DoAccessCheckOnLookupStartObjectBits::kMask;
if (ic_mode == ICMode::kGlobalIC) {
CSA_ASSERT(this, IsClearWord(handler_flags, mask));
} else {
DCHECK_EQ(ICMode::kNonGlobalIC, ic_mode);
- Label done(this), if_do_access_check(this), if_lookup_on_receiver(this);
+ Label done(this), if_do_access_check(this),
+ if_lookup_on_lookup_start_object(this);
GotoIf(IsClearWord(handler_flags, mask), &done);
// Only one of the bits can be set at a time.
CSA_ASSERT(this,
WordNotEqual(WordAnd(handler_flags, IntPtrConstant(mask)),
IntPtrConstant(mask)));
- Branch(IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_flags),
- &if_do_access_check, &if_lookup_on_receiver);
+ Branch(
+ IsSetWord<typename ICHandler::DoAccessCheckOnLookupStartObjectBits>(
+ handler_flags),
+ &if_do_access_check, &if_lookup_on_lookup_start_object);
BIND(&if_do_access_check);
{
@@ -854,29 +863,31 @@ TNode<Object> AccessorAssembler::HandleProtoHandler(
CSA_ASSERT(this, IsWeakOrCleared(data2));
TNode<Context> expected_native_context =
CAST(GetHeapObjectAssumeWeak(data2, miss));
- EmitAccessCheck(expected_native_context, p->context(), p->receiver(),
- &done, miss);
+ EmitAccessCheck(expected_native_context, p->context(),
+ p->lookup_start_object(), &done, miss);
}
- // Dictionary lookup on receiver is not necessary for Load/StoreGlobalIC
- // because prototype validity cell check already guards modifications of
- // the global object.
- BIND(&if_lookup_on_receiver);
+ BIND(&if_lookup_on_lookup_start_object);
{
- DCHECK_EQ(ICMode::kNonGlobalIC, ic_mode);
- CSA_ASSERT(this, Word32BinaryNot(HasInstanceType(
- CAST(p->receiver()), JS_GLOBAL_OBJECT_TYPE)));
+ // Dictionary lookup on lookup start object is not necessary for
+ // Load/StoreGlobalIC (which is the only case when the
+ // lookup_start_object can be a JSGlobalObject) because prototype
+ // validity cell check already guards modifications of the global
+ // object.
+ CSA_ASSERT(this,
+ Word32BinaryNot(HasInstanceType(
+ CAST(p->lookup_start_object()), JS_GLOBAL_OBJECT_TYPE)));
TNode<NameDictionary> properties =
- CAST(LoadSlowProperties(CAST(p->receiver())));
+ CAST(LoadSlowProperties(CAST(p->lookup_start_object())));
TVARIABLE(IntPtrT, var_name_index);
Label found(this, &var_name_index);
NameDictionaryLookup<NameDictionary>(properties, CAST(p->name()),
&found, &var_name_index, &done);
BIND(&found);
{
- if (on_found_on_receiver) {
- on_found_on_receiver(properties, var_name_index.value());
+ if (on_found_on_lookup_start_object) {
+ on_found_on_lookup_start_object(properties, var_name_index.value());
} else {
Goto(miss);
}
@@ -898,7 +909,7 @@ void AccessorAssembler::HandleLoadICProtoHandler(
p, handler,
// Code sub-handlers are not expected in LoadICs, so no |on_code_handler|.
nullptr,
- // on_found_on_receiver
+ // on_found_on_lookup_start_object
[=](TNode<NameDictionary> properties, TNode<IntPtrT> name_index) {
if (access_mode == LoadAccessMode::kHas) {
exit_point->Return(TrueConstant());
@@ -907,9 +918,9 @@ void AccessorAssembler::HandleLoadICProtoHandler(
TVARIABLE(Object, var_value);
LoadPropertyFromNameDictionary(properties, name_index, &var_details,
&var_value);
- TNode<Object> value =
- CallGetterIfAccessor(var_value.value(), var_details.value(),
- p->context(), p->receiver(), miss);
+ TNode<Object> value = CallGetterIfAccessor(
+ var_value.value(), CAST(var_holder->value()), var_details.value(),
+ p->context(), p->receiver(), miss);
exit_point->Return(value);
}
},
@@ -1539,7 +1550,7 @@ void AccessorAssembler::HandleStoreICProtoHandler(
TNode<Object> smi_handler = HandleProtoHandler<StoreHandler>(
p, handler, on_code_handler,
- // on_found_on_receiver
+ // on_found_on_lookup_start_object
[=](TNode<NameDictionary> properties, TNode<IntPtrT> name_index) {
TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, name_index);
// Check that the property is a writable data property (no accessor).
@@ -1614,8 +1625,8 @@ void AccessorAssembler::HandleStoreICProtoHandler(
BIND(&if_add_normal);
{
// This is a case of "transitioning store" to a dictionary mode object
- // when the property is still does not exist. The "existing property"
- // case is covered above by LookupOnReceiver bit handling of the smi
+ // when the property does not exist. The "existing property" case is
+ // covered above by LookupOnLookupStartObject bit handling of the smi
// handler.
Label slow(this);
TNode<Map> receiver_map = LoadMap(CAST(p->receiver()));
@@ -1646,7 +1657,8 @@ void AccessorAssembler::HandleStoreICProtoHandler(
// Context is stored either in data2 or data3 field depending on whether
// the access check is enabled for this handler or not.
TNode<MaybeObject> maybe_context = Select<MaybeObject>(
- IsSetWord32<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word),
+ IsSetWord32<StoreHandler::DoAccessCheckOnLookupStartObjectBits>(
+ handler_word),
[=] { return LoadHandlerDataField(handler, 3); },
[=] { return LoadHandlerDataField(handler, 2); });
@@ -2281,10 +2293,10 @@ void AccessorAssembler::InvalidateValidityCellIfPrototype(
BIND(&cont);
}
-void AccessorAssembler::GenericElementLoad(TNode<HeapObject> receiver,
- TNode<Map> receiver_map,
- TNode<Int32T> instance_type,
- TNode<IntPtrT> index, Label* slow) {
+void AccessorAssembler::GenericElementLoad(
+ TNode<HeapObject> lookup_start_object, TNode<Map> lookup_start_object_map,
+ TNode<Int32T> lookup_start_object_instance_type, TNode<IntPtrT> index,
+ Label* slow) {
Comment("integer index");
ExitPoint direct_exit(this);
@@ -2293,18 +2305,22 @@ void AccessorAssembler::GenericElementLoad(TNode<HeapObject> receiver,
Label return_undefined(this);
// Receivers requiring non-standard element accesses (interceptors, access
// checks, strings and string wrappers, proxies) are handled in the runtime.
- GotoIf(IsCustomElementsReceiverInstanceType(instance_type), &if_custom);
- TNode<Int32T> elements_kind = LoadMapElementsKind(receiver_map);
- TNode<BoolT> is_jsarray_condition = IsJSArrayInstanceType(instance_type);
+ GotoIf(
+ IsCustomElementsReceiverInstanceType(lookup_start_object_instance_type),
+ &if_custom);
+ TNode<Int32T> elements_kind = LoadMapElementsKind(lookup_start_object_map);
+ TNode<BoolT> is_jsarray_condition =
+ IsJSArrayInstanceType(lookup_start_object_instance_type);
TVARIABLE(Float64T, var_double_value);
Label rebox_double(this, &var_double_value);
// Unimplemented elements kinds fall back to a runtime call.
Label* unimplemented_elements_kind = slow;
IncrementCounter(isolate()->counters()->ic_keyed_load_generic_smi(), 1);
- EmitElementLoad(receiver, elements_kind, index, is_jsarray_condition,
- &if_element_hole, &rebox_double, &var_double_value,
- unimplemented_elements_kind, &if_oob, slow, &direct_exit);
+ EmitElementLoad(lookup_start_object, elements_kind, index,
+ is_jsarray_condition, &if_element_hole, &rebox_double,
+ &var_double_value, unimplemented_elements_kind, &if_oob, slow,
+ &direct_exit);
BIND(&rebox_double);
Return(AllocateHeapNumberWithValue(var_double_value.value()));
@@ -2314,7 +2330,8 @@ void AccessorAssembler::GenericElementLoad(TNode<HeapObject> receiver,
Comment("out of bounds");
// On TypedArrays, all OOB loads (positive and negative) return undefined
// without ever checking the prototype chain.
- GotoIf(IsJSTypedArrayInstanceType(instance_type), &return_undefined);
+ GotoIf(IsJSTypedArrayInstanceType(lookup_start_object_instance_type),
+ &return_undefined);
// Positive OOB indices within JSArray index range are effectively the same
// as hole loads. Larger keys and negative keys are named loads.
if (Is64()) {
@@ -2329,35 +2346,35 @@ void AccessorAssembler::GenericElementLoad(TNode<HeapObject> receiver,
BIND(&if_element_hole);
{
Comment("found the hole");
- BranchIfPrototypesHaveNoElements(receiver_map, &return_undefined, slow);
+ BranchIfPrototypesHaveNoElements(lookup_start_object_map, &return_undefined,
+ slow);
}
BIND(&if_custom);
{
Comment("check if string");
- GotoIfNot(IsStringInstanceType(instance_type), slow);
+ GotoIfNot(IsStringInstanceType(lookup_start_object_instance_type), slow);
Comment("load string character");
- TNode<IntPtrT> length = LoadStringLengthAsWord(CAST(receiver));
+ TNode<IntPtrT> length = LoadStringLengthAsWord(CAST(lookup_start_object));
GotoIfNot(UintPtrLessThan(index, length), slow);
IncrementCounter(isolate()->counters()->ic_keyed_load_generic_smi(), 1);
- TailCallBuiltin(Builtins::kStringCharAt, NoContextConstant(), receiver,
- index);
+ TailCallBuiltin(Builtins::kStringCharAt, NoContextConstant(),
+ lookup_start_object, index);
}
BIND(&return_undefined);
Return(UndefinedConstant());
}
-void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
- TNode<Map> receiver_map,
- TNode<Int32T> instance_type,
- const LoadICParameters* p,
- Label* slow,
- UseStubCache use_stub_cache) {
+void AccessorAssembler::GenericPropertyLoad(
+ TNode<HeapObject> lookup_start_object, TNode<Map> lookup_start_object_map,
+ TNode<Int32T> lookup_start_object_instance_type, const LoadICParameters* p,
+ Label* slow, UseStubCache use_stub_cache) {
+ DCHECK_EQ(lookup_start_object, p->lookup_start_object());
ExitPoint direct_exit(this);
Comment("key is unique name");
- Label if_found_on_receiver(this), if_property_dictionary(this),
+ Label if_found_on_lookup_start_object(this), if_property_dictionary(this),
lookup_prototype_chain(this), special_receiver(this);
TVARIABLE(Uint32T, var_details);
TVARIABLE(Object, var_value);
@@ -2366,16 +2383,18 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
// Receivers requiring non-standard accesses (interceptors, access
// checks, strings and string wrappers) are handled in the runtime.
- GotoIf(IsSpecialReceiverInstanceType(instance_type), &special_receiver);
+ GotoIf(IsSpecialReceiverInstanceType(lookup_start_object_instance_type),
+ &special_receiver);
- // Check if the receiver has fast or slow properties.
- TNode<Uint32T> bitfield3 = LoadMapBitField3(receiver_map);
+ // Check if the lookup_start_object has fast or slow properties.
+ TNode<Uint32T> bitfield3 = LoadMapBitField3(lookup_start_object_map);
GotoIf(IsSetWord32<Map::Bits3::IsDictionaryMapBit>(bitfield3),
&if_property_dictionary);
- // Try looking up the property on the receiver; if unsuccessful, look
- // for a handler in the stub cache.
- TNode<DescriptorArray> descriptors = LoadMapDescriptors(receiver_map);
+ // Try looking up the property on the lookup_start_object; if unsuccessful,
+ // look for a handler in the stub cache.
+ TNode<DescriptorArray> descriptors =
+ LoadMapDescriptors(lookup_start_object_map);
Label if_descriptor_found(this), try_stub_cache(this);
TVARIABLE(IntPtrT, var_name_index);
@@ -2386,13 +2405,14 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
BIND(&if_descriptor_found);
{
- LoadPropertyFromFastObject(receiver, receiver_map, descriptors,
- var_name_index.value(), &var_details,
- &var_value);
- Goto(&if_found_on_receiver);
+ LoadPropertyFromFastObject(lookup_start_object, lookup_start_object_map,
+ descriptors, var_name_index.value(),
+ &var_details, &var_value);
+ Goto(&if_found_on_lookup_start_object);
}
if (use_stub_cache == kUseStubCache) {
+ DCHECK_EQ(lookup_start_object, p->receiver_and_lookup_start_object());
Label stub_cache(this);
BIND(&try_stub_cache);
// When there is no feedback vector don't use stub cache.
@@ -2404,7 +2424,7 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
Comment("stub cache probe for fast property load");
TVARIABLE(MaybeObject, var_handler);
Label found_handler(this, &var_handler), stub_cache_miss(this);
- TryProbeStubCache(isolate()->load_stub_cache(), receiver, name,
+ TryProbeStubCache(isolate()->load_stub_cache(), lookup_start_object, name,
&found_handler, &var_handler, &stub_cache_miss);
BIND(&found_handler);
{
@@ -2418,8 +2438,9 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
// TODO(jkummerow): Check if the property exists on the prototype
// chain. If it doesn't, then there's no point in missing.
Comment("KeyedLoadGeneric_miss");
- TailCallRuntime(Runtime::kKeyedLoadIC_Miss, p->context(), p->receiver(),
- name, p->slot(), p->vector());
+ TailCallRuntime(Runtime::kKeyedLoadIC_Miss, p->context(),
+ p->receiver_and_lookup_start_object(), name, p->slot(),
+ p->vector());
}
}
@@ -2431,7 +2452,8 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
TVARIABLE(IntPtrT, var_name_index);
Label dictionary_found(this, &var_name_index);
- TNode<NameDictionary> properties = CAST(LoadSlowProperties(CAST(receiver)));
+ TNode<NameDictionary> properties =
+ CAST(LoadSlowProperties(CAST(lookup_start_object)));
NameDictionaryLookup<NameDictionary>(properties, name, &dictionary_found,
&var_name_index,
&lookup_prototype_chain);
@@ -2439,14 +2461,15 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
{
LoadPropertyFromNameDictionary(properties, var_name_index.value(),
&var_details, &var_value);
- Goto(&if_found_on_receiver);
+ Goto(&if_found_on_lookup_start_object);
}
}
- BIND(&if_found_on_receiver);
+ BIND(&if_found_on_lookup_start_object);
{
TNode<Object> value = CallGetterIfAccessor(
- var_value.value(), var_details.value(), p->context(), receiver, slow);
+ var_value.value(), lookup_start_object, var_details.value(),
+ p->context(), p->receiver(), slow);
IncrementCounter(isolate()->counters()->ic_keyed_load_generic_symbol(), 1);
Return(value);
}
@@ -2458,8 +2481,8 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
Label return_undefined(this), is_private_symbol(this);
Label loop(this, {&var_holder_map, &var_holder_instance_type});
- var_holder_map = receiver_map;
- var_holder_instance_type = instance_type;
+ var_holder_map = lookup_start_object_map;
+ var_holder_instance_type = lookup_start_object_instance_type;
GotoIf(IsPrivateSymbol(name), &is_private_symbol);
Goto(&loop);
@@ -2476,9 +2499,9 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
var_holder_map = proto_map;
var_holder_instance_type = proto_instance_type;
Label next_proto(this), return_value(this, &var_value), goto_slow(this);
- TryGetOwnProperty(p->context(), receiver, CAST(proto), proto_map,
- proto_instance_type, name, &return_value, &var_value,
- &next_proto, &goto_slow);
+ TryGetOwnProperty(p->context(), CAST(p->receiver()), CAST(proto),
+ proto_map, proto_instance_type, name, &return_value,
+ &var_value, &next_proto, &goto_slow);
// This trampoline and the next are required to appease Turbofan's
// variable merging.
@@ -2509,15 +2532,17 @@ void AccessorAssembler::GenericPropertyLoad(TNode<HeapObject> receiver,
BIND(&special_receiver);
{
// TODO(jkummerow): Consider supporting JSModuleNamespace.
- GotoIfNot(InstanceTypeEqual(instance_type, JS_PROXY_TYPE), slow);
+ GotoIfNot(
+ InstanceTypeEqual(lookup_start_object_instance_type, JS_PROXY_TYPE),
+ slow);
// Private field/symbol lookup is not supported.
GotoIf(IsPrivateSymbol(name), slow);
direct_exit.ReturnCallStub(
Builtins::CallableFor(isolate(), Builtins::kProxyGetProperty),
- p->context(), receiver /*holder is the same as receiver*/, name,
- receiver, SmiConstant(OnNonExistent::kReturnUndefined));
+ p->context(), lookup_start_object, name, p->receiver(),
+ SmiConstant(OnNonExistent::kReturnUndefined));
}
}
@@ -2605,7 +2630,7 @@ void AccessorAssembler::TryProbeStubCacheTable(
}
void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache,
- TNode<Object> receiver,
+ TNode<Object> lookup_start_object,
TNode<Name> name, Label* if_handler,
TVariable<MaybeObject>* var_handler,
Label* if_miss) {
@@ -2614,15 +2639,17 @@ void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache,
Counters* counters = isolate()->counters();
IncrementCounter(counters->megamorphic_stub_cache_probes(), 1);
- // Check that the {receiver} isn't a smi.
- GotoIf(TaggedIsSmi(receiver), &miss);
+ // Check that the {lookup_start_object} isn't a smi.
+ GotoIf(TaggedIsSmi(lookup_start_object), &miss);
- TNode<Map> receiver_map = LoadMap(CAST(receiver));
+ TNode<Map> lookup_start_object_map = LoadMap(CAST(lookup_start_object));
// Probe the primary table.
- TNode<IntPtrT> primary_offset = StubCachePrimaryOffset(name, receiver_map);
+ TNode<IntPtrT> primary_offset =
+ StubCachePrimaryOffset(name, lookup_start_object_map);
TryProbeStubCacheTable(stub_cache, kPrimary, primary_offset, name,
- receiver_map, if_handler, var_handler, &try_secondary);
+ lookup_start_object_map, if_handler, var_handler,
+ &try_secondary);
BIND(&try_secondary);
{
@@ -2630,7 +2657,8 @@ void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache,
TNode<IntPtrT> secondary_offset =
StubCacheSecondaryOffset(name, primary_offset);
TryProbeStubCacheTable(stub_cache, kSecondary, secondary_offset, name,
- receiver_map, if_handler, var_handler, &miss);
+ lookup_start_object_map, if_handler, var_handler,
+ &miss);
}
BIND(&miss);
@@ -2658,8 +2686,9 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p,
GotoIf(IsUndefined(p->vector()), &no_feedback);
- TNode<Map> recv_map = LoadReceiverMap(p->receiver());
- GotoIf(IsDeprecatedMap(recv_map), &miss);
+ TNode<Map> lookup_start_object_map =
+ LoadReceiverMap(p->receiver_and_lookup_start_object());
+ GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss);
// Inlined fast path.
{
@@ -2668,9 +2697,9 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p,
TVARIABLE(MaybeObject, var_handler);
Label try_polymorphic(this), if_handler(this, &var_handler);
- TNode<MaybeObject> feedback =
- TryMonomorphicCase(p->slot(), CAST(p->vector()), recv_map, &if_handler,
- &var_handler, &try_polymorphic);
+ TNode<MaybeObject> feedback = TryMonomorphicCase(
+ p->slot(), CAST(p->vector()), lookup_start_object_map, &if_handler,
+ &var_handler, &try_polymorphic);
BIND(&if_handler);
HandleLoadICHandlerCase(p, CAST(var_handler.value()), &miss, exit_point);
@@ -2680,8 +2709,8 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p,
TNode<HeapObject> strong_feedback =
GetHeapObjectIfStrong(feedback, &miss);
GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &stub_call);
- HandlePolymorphicCase(recv_map, CAST(strong_feedback), &if_handler,
- &var_handler, &miss);
+ HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback),
+ &if_handler, &var_handler, &miss);
}
}
@@ -2694,8 +2723,8 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p,
Builtins::CallableFor(isolate(), Builtins::kLoadIC_Noninlined);
TNode<Code> code_target = HeapConstant(ic.code());
exit_point->ReturnCallStub(ic.descriptor(), code_target, p->context(),
- p->receiver(), p->name(), p->slot(),
- p->vector());
+ p->receiver_and_lookup_start_object(), p->name(),
+ p->slot(), p->vector());
}
BIND(&no_feedback);
@@ -2727,12 +2756,13 @@ void AccessorAssembler::LoadIC(const LoadICParameters* p) {
Label if_handler(this, &var_handler), non_inlined(this, Label::kDeferred),
try_polymorphic(this), miss(this, Label::kDeferred);
- TNode<Map> receiver_map = LoadReceiverMap(p->receiver());
- GotoIf(IsDeprecatedMap(receiver_map), &miss);
+ TNode<Map> lookup_start_object_map =
+ LoadReceiverMap(p->receiver_and_lookup_start_object());
+ GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss);
// Check monomorphic case.
TNode<MaybeObject> feedback =
- TryMonomorphicCase(p->slot(), CAST(p->vector()), receiver_map,
+ TryMonomorphicCase(p->slot(), CAST(p->vector()), lookup_start_object_map,
&if_handler, &var_handler, &try_polymorphic);
BIND(&if_handler);
{
@@ -2747,32 +2777,85 @@ void AccessorAssembler::LoadIC(const LoadICParameters* p) {
// Check polymorphic case.
Comment("LoadIC_try_polymorphic");
GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &non_inlined);
- HandlePolymorphicCase(receiver_map, CAST(strong_feedback), &if_handler,
- &var_handler, &miss);
+ HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback),
+ &if_handler, &var_handler, &miss);
}
BIND(&non_inlined);
{
- LoadIC_Noninlined(p, receiver_map, strong_feedback, &var_handler,
+ LoadIC_Noninlined(p, lookup_start_object_map, strong_feedback, &var_handler,
&if_handler, &miss, &direct_exit);
}
BIND(&miss);
direct_exit.ReturnCallRuntime(Runtime::kLoadIC_Miss, p->context(),
- p->receiver(), p->name(), p->slot(),
- p->vector());
+ p->receiver_and_lookup_start_object(),
+ p->name(), p->slot(), p->vector());
+}
+
+void AccessorAssembler::LoadSuperIC(const LoadICParameters* p) {
+ ExitPoint direct_exit(this);
+
+ TVARIABLE(MaybeObject, var_handler);
+ Label if_handler(this, &var_handler), no_feedback(this),
+ non_inlined(this, Label::kDeferred), try_polymorphic(this),
+ miss(this, Label::kDeferred);
+
+ GotoIf(IsUndefined(p->vector()), &no_feedback);
+
+ // The lookup start object cannot be a SMI, since it's the home object's
+ // prototype, and it's not possible to set SMIs as prototypes.
+ TNode<Map> lookup_start_object_map =
+ LoadReceiverMap(p->lookup_start_object());
+ GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss);
+
+ TNode<MaybeObject> feedback =
+ TryMonomorphicCase(p->slot(), CAST(p->vector()), lookup_start_object_map,
+ &if_handler, &var_handler, &try_polymorphic);
+
+ BIND(&if_handler);
+ {
+ LazyLoadICParameters lazy_p(p);
+ HandleLoadICHandlerCase(&lazy_p, CAST(var_handler.value()), &miss,
+ &direct_exit);
+ }
+
+ BIND(&no_feedback);
+ { LoadSuperIC_NoFeedback(p); }
+
+ BIND(&try_polymorphic);
+ TNode<HeapObject> strong_feedback = GetHeapObjectIfStrong(feedback, &miss);
+ {
+ Comment("LoadSuperIC_try_polymorphic");
+ GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &non_inlined);
+ HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback),
+ &if_handler, &var_handler, &miss);
+ }
+
+ BIND(&non_inlined);
+ {
+ // LoadIC_Noninlined can be used here, since it handles the
+ // lookup_start_object != receiver case gracefully.
+ LoadIC_Noninlined(p, lookup_start_object_map, strong_feedback, &var_handler,
+ &if_handler, &miss, &direct_exit);
+ }
+
+ BIND(&miss);
+ direct_exit.ReturnCallRuntime(Runtime::kLoadWithReceiverIC_Miss, p->context(),
+ p->receiver(), p->lookup_start_object(),
+ p->name(), p->slot(), p->vector());
}
void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p,
- TNode<Map> receiver_map,
+ TNode<Map> lookup_start_object_map,
TNode<HeapObject> feedback,
TVariable<MaybeObject>* var_handler,
Label* if_handler, Label* miss,
ExitPoint* exit_point) {
// Neither deprecated map nor monomorphic. These cases are handled in the
// bytecode handler.
- CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(receiver_map)));
- CSA_ASSERT(this, TaggedNotEqual(receiver_map, feedback));
+ CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(lookup_start_object_map)));
+ CSA_ASSERT(this, TaggedNotEqual(lookup_start_object_map, feedback));
CSA_ASSERT(this, Word32BinaryNot(IsWeakFixedArrayMap(LoadMap(feedback))));
DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
@@ -2780,7 +2863,7 @@ void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p,
// Check megamorphic case.
GotoIfNot(TaggedEqual(feedback, MegamorphicSymbolConstant()), miss);
- TryProbeStubCache(isolate()->load_stub_cache(), p->receiver(),
+ TryProbeStubCache(isolate()->load_stub_cache(), p->lookup_start_object(),
CAST(p->name()), if_handler, var_handler, miss);
}
}
@@ -2788,12 +2871,12 @@ void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p,
void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p,
TNode<Smi> ic_kind) {
Label miss(this, Label::kDeferred);
- TNode<Object> receiver = p->receiver();
- GotoIf(TaggedIsSmi(receiver), &miss);
- TNode<Map> receiver_map = LoadMap(CAST(receiver));
- GotoIf(IsDeprecatedMap(receiver_map), &miss);
+ TNode<Object> lookup_start_object = p->receiver_and_lookup_start_object();
+ GotoIf(TaggedIsSmi(lookup_start_object), &miss);
+ TNode<Map> lookup_start_object_map = LoadMap(CAST(lookup_start_object));
+ GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss);
- TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map);
+ TNode<Uint16T> instance_type = LoadMapInstanceType(lookup_start_object_map);
{
// Special case for Function.prototype load, because it's very common
@@ -2803,14 +2886,15 @@ void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p,
&not_function_prototype);
GotoIfNot(IsPrototypeString(p->name()), &not_function_prototype);
- GotoIfPrototypeRequiresRuntimeLookup(CAST(receiver), receiver_map,
+ GotoIfPrototypeRequiresRuntimeLookup(CAST(lookup_start_object),
+ lookup_start_object_map,
&not_function_prototype);
- Return(LoadJSFunctionPrototype(CAST(receiver), &miss));
+ Return(LoadJSFunctionPrototype(CAST(lookup_start_object), &miss));
BIND(&not_function_prototype);
}
- GenericPropertyLoad(CAST(receiver), receiver_map, instance_type, p, &miss,
- kDontUseStubCache);
+ GenericPropertyLoad(CAST(lookup_start_object), lookup_start_object_map,
+ instance_type, p, &miss, kDontUseStubCache);
BIND(&miss);
{
@@ -2819,6 +2903,27 @@ void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p,
}
}
+void AccessorAssembler::LoadSuperIC_NoFeedback(const LoadICParameters* p) {
+ Label miss(this, Label::kDeferred);
+ TNode<Object> lookup_start_object = p->lookup_start_object();
+
+ // The lookup start object cannot be a SMI, since it's the home object's
+ // prototype, and it's not possible to set SMIs as prototypes.
+ TNode<Map> lookup_start_object_map = LoadMap(CAST(lookup_start_object));
+ GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss);
+
+ TNode<Uint16T> instance_type = LoadMapInstanceType(lookup_start_object_map);
+
+ GenericPropertyLoad(CAST(lookup_start_object), lookup_start_object_map,
+ instance_type, p, &miss, kDontUseStubCache);
+
+ BIND(&miss);
+ {
+ TailCallRuntime(Runtime::kLoadWithReceiverNoFeedbackIC_Miss, p->context(),
+ p->receiver(), p->lookup_start_object(), p->name());
+ }
+}
+
void AccessorAssembler::LoadGlobalIC(TNode<HeapObject> maybe_feedback_vector,
const LazyNode<TaggedIndex>& lazy_slot,
const LazyNode<Context>& lazy_context,
@@ -2923,11 +3028,11 @@ void AccessorAssembler::LoadGlobalIC_TryHandlerCase(
TNode<NativeContext> native_context = LoadNativeContext(context);
TNode<JSGlobalProxy> receiver =
CAST(LoadContextElement(native_context, Context::GLOBAL_PROXY_INDEX));
- TNode<Object> holder =
+ TNode<Object> global =
LoadContextElement(native_context, Context::EXTENSION_INDEX);
LazyLoadICParameters p([=] { return context; }, receiver, lazy_name,
- [=] { return slot; }, vector, holder);
+ [=] { return slot; }, vector, global);
HandleLoadICHandlerCase(&p, handler, miss, exit_point, ICMode::kGlobalIC,
on_nonexistent);
@@ -3019,14 +3124,15 @@ void AccessorAssembler::KeyedLoadIC(const LoadICParameters* p,
try_polymorphic_name(this, Label::kDeferred),
miss(this, Label::kDeferred), generic(this, Label::kDeferred);
- TNode<Map> receiver_map = LoadReceiverMap(p->receiver());
- GotoIf(IsDeprecatedMap(receiver_map), &miss);
+ TNode<Map> lookup_start_object_map =
+ LoadReceiverMap(p->receiver_and_lookup_start_object());
+ GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss);
GotoIf(IsUndefined(p->vector()), &generic);
// Check monomorphic case.
TNode<MaybeObject> feedback =
- TryMonomorphicCase(p->slot(), CAST(p->vector()), receiver_map,
+ TryMonomorphicCase(p->slot(), CAST(p->vector()), lookup_start_object_map,
&if_handler, &var_handler, &try_polymorphic);
BIND(&if_handler);
{
@@ -3043,8 +3149,8 @@ void AccessorAssembler::KeyedLoadIC(const LoadICParameters* p,
// Check polymorphic case.
Comment("KeyedLoadIC_try_polymorphic");
GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &try_megamorphic);
- HandlePolymorphicCase(receiver_map, CAST(strong_feedback), &if_handler,
- &var_handler, &miss);
+ HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback),
+ &if_handler, &var_handler, &miss);
}
BIND(&try_megamorphic);
@@ -3136,9 +3242,9 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
TVARIABLE(Object, var_name, p->name());
Label if_runtime(this, Label::kDeferred);
- TNode<Object> receiver = p->receiver();
- GotoIf(TaggedIsSmi(receiver), &if_runtime);
- GotoIf(IsNullOrUndefined(receiver), &if_runtime);
+ TNode<Object> lookup_start_object = p->lookup_start_object();
+ GotoIf(TaggedIsSmi(lookup_start_object), &if_runtime);
+ GotoIf(IsNullOrUndefined(lookup_start_object), &if_runtime);
{
TVARIABLE(IntPtrT, var_index);
@@ -3152,9 +3258,9 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
BIND(&if_unique_name);
{
LoadICParameters pp(p, var_unique.value());
- TNode<Map> receiver_map = LoadMap(CAST(receiver));
- TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map);
- GenericPropertyLoad(CAST(receiver), receiver_map, instance_type, &pp,
+ TNode<Map> lookup_start_object_map = LoadMap(CAST(lookup_start_object));
+ GenericPropertyLoad(CAST(lookup_start_object), lookup_start_object_map,
+ LoadMapInstanceType(lookup_start_object_map), &pp,
&if_runtime);
}
@@ -3185,9 +3291,11 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
// experiments with this have shown that it causes too much traffic
// on the stub cache. We may want to re-evaluate that in the future.
LoadICParameters pp(p, var_unique.value());
- TNode<Map> receiver_map = LoadMap(CAST(receiver));
- TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map);
- GenericPropertyLoad(CAST(receiver), receiver_map, instance_type, &pp,
+ TNode<Map> lookup_start_object_map =
+ LoadMap(CAST(lookup_start_object));
+ GenericPropertyLoad(CAST(lookup_start_object),
+ lookup_start_object_map,
+ LoadMapInstanceType(lookup_start_object_map), &pp,
&if_runtime, kDontUseStubCache);
}
} else {
@@ -3197,9 +3305,9 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
BIND(&if_index);
{
- TNode<Map> receiver_map = LoadMap(CAST(receiver));
- TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map);
- GenericElementLoad(CAST(receiver), receiver_map, instance_type,
+ TNode<Map> lookup_start_object_map = LoadMap(CAST(lookup_start_object));
+ GenericElementLoad(CAST(lookup_start_object), lookup_start_object_map,
+ LoadMapInstanceType(lookup_start_object_map),
var_index.value(), &if_runtime);
}
}
@@ -3209,8 +3317,8 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
Comment("KeyedLoadGeneric_slow");
IncrementCounter(isolate()->counters()->ic_keyed_load_generic_slow(), 1);
// TODO(jkummerow): Should we use the GetProperty TF stub instead?
- TailCallRuntime(Runtime::kGetProperty, p->context(), p->receiver(),
- var_name.value());
+ TailCallRuntime(Runtime::kGetProperty, p->context(),
+ p->receiver_and_lookup_start_object(), var_name.value());
}
}
@@ -3219,8 +3327,8 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p,
TVARIABLE(MaybeObject, var_handler);
Label if_handler(this, &var_handler), miss(this, Label::kDeferred);
- TNode<Object> receiver = p->receiver();
- TNode<Map> receiver_map = LoadReceiverMap(receiver);
+ TNode<Object> lookup_start_object = p->lookup_start_object();
+ TNode<Map> lookup_start_object_map = LoadReceiverMap(lookup_start_object);
TNode<Name> name = CAST(p->name());
TNode<FeedbackVector> vector = CAST(p->vector());
TNode<TaggedIndex> slot = p->slot();
@@ -3229,15 +3337,16 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p,
// When we get here, we know that the {name} matches the recorded
// feedback name in the {vector} and can safely be used for the
// LoadIC handler logic below.
- CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(receiver_map)));
+ CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(lookup_start_object_map)));
CSA_ASSERT(this, TaggedEqual(name, LoadFeedbackVectorSlot(vector, slot)),
name, vector);
- // Check if we have a matching handler for the {receiver_map}.
+ // Check if we have a matching handler for the {lookup_start_object_map}.
TNode<MaybeObject> feedback_element =
LoadFeedbackVectorSlot(vector, slot, kTaggedSize);
TNode<WeakFixedArray> array = CAST(feedback_element);
- HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler, &miss);
+ HandlePolymorphicCase(lookup_start_object_map, array, &if_handler,
+ &var_handler, &miss);
BIND(&if_handler);
{
@@ -3252,10 +3361,10 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p,
BIND(&miss);
{
Comment("KeyedLoadIC_miss");
- TailCallRuntime(access_mode == LoadAccessMode::kLoad
- ? Runtime::kKeyedLoadIC_Miss
- : Runtime::kKeyedHasIC_Miss,
- context, receiver, name, slot, vector);
+ TailCallRuntime(
+ access_mode == LoadAccessMode::kLoad ? Runtime::kKeyedLoadIC_Miss
+ : Runtime::kKeyedHasIC_Miss,
+ context, p->receiver_and_lookup_start_object(), name, slot, vector);
}
}
@@ -3679,13 +3788,13 @@ void AccessorAssembler::GenerateLoadIC_Noninlined() {
TVARIABLE(MaybeObject, var_handler);
Label if_handler(this, &var_handler), miss(this, Label::kDeferred);
- TNode<Map> receiver_map = LoadReceiverMap(receiver);
TNode<MaybeObject> feedback_element = LoadFeedbackVectorSlot(vector, slot);
TNode<HeapObject> feedback = CAST(feedback_element);
LoadICParameters p(context, receiver, name, slot, vector);
- LoadIC_Noninlined(&p, receiver_map, feedback, &var_handler, &if_handler,
- &miss, &direct_exit);
+ TNode<Map> lookup_start_object_map = LoadReceiverMap(p.lookup_start_object());
+ LoadIC_Noninlined(&p, lookup_start_object_map, feedback, &var_handler,
+ &if_handler, &miss, &direct_exit);
BIND(&if_handler);
{
@@ -3738,6 +3847,22 @@ void AccessorAssembler::GenerateLoadICTrampoline_Megamorphic() {
vector);
}
+void AccessorAssembler::GenerateLoadSuperIC() {
+ using Descriptor = LoadWithReceiverAndVectorDescriptor;
+
+ TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver));
+ TNode<Object> lookup_start_object =
+ CAST(Parameter(Descriptor::kLookupStartObject));
+ TNode<Object> name = CAST(Parameter(Descriptor::kName));
+ TNode<TaggedIndex> slot = CAST(Parameter(Descriptor::kSlot));
+ TNode<HeapObject> vector = CAST(Parameter(Descriptor::kVector));
+ TNode<Context> context = CAST(Parameter(Descriptor::kContext));
+
+ LoadICParameters p(context, receiver, name, slot, vector,
+ lookup_start_object);
+ LoadSuperIC(&p);
+}
+
void AccessorAssembler::GenerateLoadGlobalIC_NoFeedback() {
using Descriptor = LoadGlobalNoFeedbackDescriptor;
@@ -3951,12 +4076,7 @@ void AccessorAssembler::GenerateCloneObjectIC_Slow() {
// used.
TNode<NativeContext> native_context = LoadNativeContext(context);
- TNode<JSFunction> object_fn =
- CAST(LoadContextElement(native_context, Context::OBJECT_FUNCTION_INDEX));
- TNode<Map> initial_map = CAST(
- LoadObjectField(object_fn, JSFunction::kPrototypeOrInitialMapOffset));
- CSA_ASSERT(this, IsMap(initial_map));
-
+ TNode<Map> initial_map = LoadObjectFunctionInitialMap(native_context);
TNode<JSObject> result = AllocateJSObjectFromMap(initial_map);
{
@@ -4097,25 +4217,11 @@ void AccessorAssembler::GenerateCloneObjectIC() {
// ensure that the GC (and heap verifier) always sees properly initialized
// objects, i.e. never hits undefined values in double fields.
if (!FLAG_unbox_double_fields) {
- BuildFastLoop<IntPtrT>(
- source_start, source_size,
- [=](TNode<IntPtrT> field_index) {
- TNode<IntPtrT> result_offset = IntPtrAdd(
- TimesTaggedSize(field_index), field_offset_difference);
- TNode<Object> field = LoadObjectField(object, result_offset);
- Label if_done(this), if_mutableheapnumber(this, Label::kDeferred);
- GotoIf(TaggedIsSmi(field), &if_done);
- Branch(IsHeapNumber(CAST(field)), &if_mutableheapnumber, &if_done);
- BIND(&if_mutableheapnumber);
- {
- TNode<HeapNumber> value = AllocateHeapNumberWithValue(
- LoadHeapNumberValue(UncheckedCast<HeapNumber>(field)));
- StoreObjectField(object, result_offset, value);
- Goto(&if_done);
- }
- BIND(&if_done);
- },
- 1, IndexAdvanceMode::kPost);
+ TNode<IntPtrT> start_offset = TimesTaggedSize(result_start);
+ TNode<IntPtrT> end_offset =
+ IntPtrAdd(TimesTaggedSize(source_size), field_offset_difference);
+ ConstructorBuiltinsAssembler(state()).CopyMutableHeapNumbersInObject(
+ object, start_offset, end_offset);
}
Return(object);
diff --git a/deps/v8/src/ic/accessor-assembler.h b/deps/v8/src/ic/accessor-assembler.h
index ec5758ec35..bf506da478 100644
--- a/deps/v8/src/ic/accessor-assembler.h
+++ b/deps/v8/src/ic/accessor-assembler.h
@@ -32,6 +32,7 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
void GenerateLoadGlobalIC_NoFeedback();
void GenerateLoadICTrampoline();
void GenerateLoadICTrampoline_Megamorphic();
+ void GenerateLoadSuperIC();
void GenerateKeyedLoadIC();
void GenerateKeyedLoadIC_Megamorphic();
void GenerateKeyedLoadIC_PolymorphicName();
@@ -55,9 +56,10 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
void GenerateStoreInArrayLiteralIC();
- void TryProbeStubCache(StubCache* stub_cache, TNode<Object> receiver,
- TNode<Name> name, Label* if_handler,
- TVariable<MaybeObject>* var_handler, Label* if_miss);
+ void TryProbeStubCache(StubCache* stub_cache,
+ TNode<Object> lookup_start_object, TNode<Name> name,
+ Label* if_handler, TVariable<MaybeObject>* var_handler,
+ Label* if_miss);
TNode<IntPtrT> StubCachePrimaryOffsetForTesting(TNode<Name> name,
TNode<Map> map) {
@@ -69,16 +71,17 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
}
struct LoadICParameters {
- LoadICParameters(TNode<Context> context,
- base::Optional<TNode<Object>> receiver, TNode<Object> name,
- TNode<TaggedIndex> slot, TNode<HeapObject> vector,
- base::Optional<TNode<Object>> holder = base::nullopt)
+ LoadICParameters(
+ TNode<Context> context, TNode<Object> receiver, TNode<Object> name,
+ TNode<TaggedIndex> slot, TNode<HeapObject> vector,
+ base::Optional<TNode<Object>> lookup_start_object = base::nullopt)
: context_(context),
receiver_(receiver),
name_(name),
slot_(slot),
vector_(vector),
- holder_(holder ? holder.value() : receiver) {}
+ lookup_start_object_(lookup_start_object ? lookup_start_object.value()
+ : receiver) {}
LoadICParameters(const LoadICParameters* p, TNode<Object> unique_name)
: context_(p->context_),
@@ -86,41 +89,52 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
name_(unique_name),
slot_(p->slot_),
vector_(p->vector_),
- holder_(p->holder_) {}
+ lookup_start_object_(p->lookup_start_object_) {}
TNode<Context> context() const { return context_; }
- TNode<Object> receiver() const { return receiver_.value(); }
+ TNode<Object> receiver() const { return receiver_; }
TNode<Object> name() const { return name_; }
TNode<TaggedIndex> slot() const { return slot_; }
TNode<HeapObject> vector() const { return vector_; }
- TNode<Object> holder() const { return holder_.value(); }
- bool receiver_is_null() const { return !receiver_.has_value(); }
+ TNode<Object> lookup_start_object() const {
+ return lookup_start_object_.value();
+ }
+
+ // Usable in cases where the receiver and the lookup start object are
+ // expected to be the same, i.e., when "receiver != lookup_start_object"
+ // case is not supported or not expected by the surrounding code.
+ TNode<Object> receiver_and_lookup_start_object() const {
+ DCHECK_EQ(receiver_, lookup_start_object_);
+ return receiver_;
+ }
private:
TNode<Context> context_;
- base::Optional<TNode<Object>> receiver_;
+ TNode<Object> receiver_;
TNode<Object> name_;
TNode<TaggedIndex> slot_;
TNode<HeapObject> vector_;
- base::Optional<TNode<Object>> holder_;
+ base::Optional<TNode<Object>> lookup_start_object_;
};
struct LazyLoadICParameters {
- LazyLoadICParameters(LazyNode<Context> context, TNode<Object> receiver,
- LazyNode<Object> name, LazyNode<TaggedIndex> slot,
- TNode<HeapObject> vector,
- base::Optional<TNode<Object>> holder = base::nullopt)
+ LazyLoadICParameters(
+ LazyNode<Context> context, TNode<Object> receiver,
+ LazyNode<Object> name, LazyNode<TaggedIndex> slot,
+ TNode<HeapObject> vector,
+ base::Optional<TNode<Object>> lookup_start_object = base::nullopt)
: context_(context),
receiver_(receiver),
name_(name),
slot_(slot),
vector_(vector),
- holder_(holder ? holder.value() : receiver) {}
+ lookup_start_object_(lookup_start_object ? lookup_start_object.value()
+ : receiver) {}
explicit LazyLoadICParameters(const LoadICParameters* p)
: receiver_(p->receiver()),
vector_(p->vector()),
- holder_(p->holder()) {
+ lookup_start_object_(p->lookup_start_object()) {
slot_ = [=] { return p->slot(); };
context_ = [=] { return p->context(); };
name_ = [=] { return p->name(); };
@@ -131,7 +145,15 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
TNode<Object> name() const { return name_(); }
TNode<TaggedIndex> slot() const { return slot_(); }
TNode<HeapObject> vector() const { return vector_; }
- TNode<Object> holder() const { return holder_; }
+ TNode<Object> lookup_start_object() const { return lookup_start_object_; }
+
+ // Usable in cases where the receiver and the lookup start object are
+ // expected to be the same, i.e., when "receiver != lookup_start_object"
+ // case is not supported or not expected by the surrounding code.
+ TNode<Object> receiver_and_lookup_start_object() const {
+ DCHECK_EQ(receiver_, lookup_start_object_);
+ return receiver_;
+ }
private:
LazyNode<Context> context_;
@@ -139,7 +161,7 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
LazyNode<Object> name_;
LazyNode<TaggedIndex> slot_;
TNode<HeapObject> vector_;
- TNode<Object> holder_;
+ TNode<Object> lookup_start_object_;
};
void LoadGlobalIC(TNode<HeapObject> maybe_feedback_vector,
@@ -158,18 +180,36 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
int data_index);
protected:
- struct StoreICParameters : public LoadICParameters {
+ struct StoreICParameters {
StoreICParameters(TNode<Context> context,
base::Optional<TNode<Object>> receiver,
TNode<Object> name, TNode<Object> value,
TNode<TaggedIndex> slot, TNode<HeapObject> vector)
- : LoadICParameters(context, receiver, name, slot, vector),
- value_(value) {}
+ : context_(context),
+ receiver_(receiver),
+ name_(name),
+ value_(value),
+ slot_(slot),
+ vector_(vector) {}
+ TNode<Context> context() const { return context_; }
+ TNode<Object> receiver() const { return receiver_.value(); }
+ TNode<Object> name() const { return name_; }
TNode<Object> value() const { return value_; }
+ TNode<TaggedIndex> slot() const { return slot_; }
+ TNode<HeapObject> vector() const { return vector_; }
+
+ TNode<Object> lookup_start_object() const { return receiver(); }
+
+ bool receiver_is_null() const { return !receiver_.has_value(); }
private:
+ TNode<Context> context_;
+ base::Optional<TNode<Object>> receiver_;
+ TNode<Object> name_;
TNode<Object> value_;
+ TNode<TaggedIndex> slot_;
+ TNode<HeapObject> vector_;
};
enum class LoadAccessMode { kLoad, kHas };
@@ -213,17 +253,23 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
// LoadIC contains the full LoadIC logic, while LoadIC_Noninlined contains
// logic not inlined into Ignition bytecode handlers.
void LoadIC(const LoadICParameters* p);
- void LoadIC_Noninlined(const LoadICParameters* p, TNode<Map> receiver_map,
+
+ // Can be used in the receiver != lookup_start_object case.
+ void LoadIC_Noninlined(const LoadICParameters* p,
+ TNode<Map> lookup_start_object_map,
TNode<HeapObject> feedback,
TVariable<MaybeObject>* var_handler, Label* if_handler,
Label* miss, ExitPoint* exit_point);
+ void LoadSuperIC(const LoadICParameters* p);
+
TNode<Object> LoadDescriptorValue(TNode<Map> map,
TNode<IntPtrT> descriptor_entry);
TNode<MaybeObject> LoadDescriptorValueOrFieldType(
TNode<Map> map, TNode<IntPtrT> descriptor_entry);
void LoadIC_NoFeedback(const LoadICParameters* p, TNode<Smi> smi_typeof_mode);
+ void LoadSuperIC_NoFeedback(const LoadICParameters* p);
void LoadGlobalIC_NoFeedback(TNode<Context> context, TNode<Object> name,
TNode<Smi> smi_typeof_mode);
@@ -244,11 +290,11 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
// Checks monomorphic case. Returns {feedback} entry of the vector.
TNode<MaybeObject> TryMonomorphicCase(TNode<TaggedIndex> slot,
TNode<FeedbackVector> vector,
- TNode<Map> receiver_map,
+ TNode<Map> lookup_start_object_map,
Label* if_handler,
TVariable<MaybeObject>* var_handler,
Label* if_miss);
- void HandlePolymorphicCase(TNode<Map> receiver_map,
+ void HandlePolymorphicCase(TNode<Map> lookup_start_object_map,
TNode<WeakFixedArray> feedback, Label* if_handler,
TVariable<MaybeObject>* var_handler,
Label* if_miss);
@@ -356,28 +402,30 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
// KeyedLoadIC_Generic implementation.
- void GenericElementLoad(TNode<HeapObject> receiver, TNode<Map> receiver_map,
- TNode<Int32T> instance_type, TNode<IntPtrT> index,
- Label* slow);
+ void GenericElementLoad(TNode<HeapObject> lookup_start_object,
+ TNode<Map> lookup_start_object_map,
+ TNode<Int32T> lookup_start_object_instance_type,
+ TNode<IntPtrT> index, Label* slow);
enum UseStubCache { kUseStubCache, kDontUseStubCache };
- void GenericPropertyLoad(TNode<HeapObject> receiver, TNode<Map> receiver_map,
- TNode<Int32T> instance_type,
+ void GenericPropertyLoad(TNode<HeapObject> lookup_start_object,
+ TNode<Map> lookup_start_object_map,
+ TNode<Int32T> lookup_start_object_instance_type,
const LoadICParameters* p, Label* slow,
UseStubCache use_stub_cache = kUseStubCache);
// Low-level helpers.
using OnCodeHandler = std::function<void(TNode<Code> code_handler)>;
- using OnFoundOnReceiver = std::function<void(TNode<NameDictionary> properties,
- TNode<IntPtrT> name_index)>;
+ using OnFoundOnLookupStartObject = std::function<void(
+ TNode<NameDictionary> properties, TNode<IntPtrT> name_index)>;
template <typename ICHandler, typename ICParameters>
TNode<Object> HandleProtoHandler(
const ICParameters* p, TNode<DataHandler> handler,
const OnCodeHandler& on_code_handler,
- const OnFoundOnReceiver& on_found_on_receiver, Label* miss,
- ICMode ic_mode);
+ const OnFoundOnLookupStartObject& on_found_on_lookup_start_object,
+ Label* miss, ICMode ic_mode);
void CheckHeapObjectTypeMatchesDescriptor(TNode<Word32T> handler_word,
TNode<JSObject> holder,
diff --git a/deps/v8/src/ic/handler-configuration.cc b/deps/v8/src/ic/handler-configuration.cc
index a9bae12482..73cd228001 100644
--- a/deps/v8/src/ic/handler-configuration.cc
+++ b/deps/v8/src/ic/handler-configuration.cc
@@ -27,16 +27,20 @@ Handle<Smi> SetBitFieldValue(Isolate* isolate, Handle<Smi> smi_handler,
// Load/StoreHandler to the base class.
template <typename ICHandler, bool fill_handler = true>
int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
- Handle<Smi>* smi_handler, Handle<Map> receiver_map,
- Handle<JSReceiver> holder, MaybeObjectHandle data1,
+ Handle<Smi>* smi_handler,
+ Handle<Map> lookup_start_object_map,
+ MaybeObjectHandle data1,
MaybeObjectHandle maybe_data2) {
int data_size = 1;
// Holder-is-receiver case itself does not add entries unless there is an
// optional data2 value provided.
- if (receiver_map->IsPrimitiveMap() ||
- receiver_map->is_access_check_needed()) {
- DCHECK(!receiver_map->IsJSGlobalObjectMap());
+ DCHECK_IMPLIES(lookup_start_object_map->IsJSGlobalObjectMap(),
+ lookup_start_object_map->is_prototype_map());
+
+ if (lookup_start_object_map->IsPrimitiveMap() ||
+ lookup_start_object_map->is_access_check_needed()) {
+ DCHECK(!lookup_start_object_map->IsJSGlobalObjectMap());
// The validity cell check for primitive and global proxy receivers does
// not guarantee that certain native context ever had access to other
// native context. However, a handler created for one native context could
@@ -47,17 +51,19 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
Handle<Context> native_context = isolate->native_context();
handler->set_data2(HeapObjectReference::Weak(*native_context));
} else {
- // Enable access checks on receiver.
- using Bit = typename ICHandler::DoAccessCheckOnReceiverBits;
- *smi_handler = SetBitFieldValue<Bit>(isolate, *smi_handler, true);
+ // Enable access checks on the lookup start object.
+ *smi_handler = SetBitFieldValue<
+ typename ICHandler::DoAccessCheckOnLookupStartObjectBits>(
+ isolate, *smi_handler, true);
}
data_size++;
- } else if (receiver_map->is_dictionary_map() &&
- !receiver_map->IsJSGlobalObjectMap()) {
+ } else if (lookup_start_object_map->is_dictionary_map() &&
+ !lookup_start_object_map->IsJSGlobalObjectMap()) {
if (!fill_handler) {
- // Enable lookup on receiver.
- using Bit = typename ICHandler::LookupOnReceiverBits;
- *smi_handler = SetBitFieldValue<Bit>(isolate, *smi_handler, true);
+ // Enable lookup on lookup start object.
+ *smi_handler =
+ SetBitFieldValue<typename ICHandler::LookupOnLookupStartObjectBits>(
+ isolate, *smi_handler, true);
}
}
if (fill_handler) {
@@ -80,40 +86,36 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle<ICHandler> handler,
}
// Returns 0 if the validity cell check is enough to ensure that the
-// prototype chain from |receiver_map| till |holder| did not change.
+// prototype chain from |lookup_start_object_map| till |holder| did not change.
// If the |holder| is an empty handle then the full prototype chain is
// checked.
-// Returns -1 if the handler has to be compiled or the number of prototype
-// checks otherwise.
template <typename ICHandler>
int GetHandlerDataSize(Isolate* isolate, Handle<Smi>* smi_handler,
- Handle<Map> receiver_map, Handle<JSReceiver> holder,
+ Handle<Map> lookup_start_object_map,
MaybeObjectHandle data1,
MaybeObjectHandle maybe_data2 = MaybeObjectHandle()) {
DCHECK_NOT_NULL(smi_handler);
- return InitPrototypeChecksImpl<ICHandler, false>(isolate, Handle<ICHandler>(),
- smi_handler, receiver_map,
- holder, data1, maybe_data2);
+ return InitPrototypeChecksImpl<ICHandler, false>(
+ isolate, Handle<ICHandler>(), smi_handler, lookup_start_object_map, data1,
+ maybe_data2);
}
template <typename ICHandler>
void InitPrototypeChecks(Isolate* isolate, Handle<ICHandler> handler,
- Handle<Map> receiver_map, Handle<JSReceiver> holder,
+ Handle<Map> lookup_start_object_map,
MaybeObjectHandle data1,
MaybeObjectHandle maybe_data2 = MaybeObjectHandle()) {
InitPrototypeChecksImpl<ICHandler, true>(
- isolate, handler, nullptr, receiver_map, holder, data1, maybe_data2);
+ isolate, handler, nullptr, lookup_start_object_map, data1, maybe_data2);
}
} // namespace
// static
-Handle<Object> LoadHandler::LoadFromPrototype(Isolate* isolate,
- Handle<Map> receiver_map,
- Handle<JSReceiver> holder,
- Handle<Smi> smi_handler,
- MaybeObjectHandle maybe_data1,
- MaybeObjectHandle maybe_data2) {
+Handle<Object> LoadHandler::LoadFromPrototype(
+ Isolate* isolate, Handle<Map> lookup_start_object_map,
+ Handle<JSReceiver> holder, Handle<Smi> smi_handler,
+ MaybeObjectHandle maybe_data1, MaybeObjectHandle maybe_data2) {
MaybeObjectHandle data1;
if (maybe_data1.is_null()) {
data1 = MaybeObjectHandle::Weak(holder);
@@ -122,43 +124,45 @@ Handle<Object> LoadHandler::LoadFromPrototype(Isolate* isolate,
}
int data_size = GetHandlerDataSize<LoadHandler>(
- isolate, &smi_handler, receiver_map, holder, data1, maybe_data2);
+ isolate, &smi_handler, lookup_start_object_map, data1, maybe_data2);
- Handle<Object> validity_cell =
- Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate);
+ Handle<Object> validity_cell = Map::GetOrCreatePrototypeChainValidityCell(
+ lookup_start_object_map, isolate);
Handle<LoadHandler> handler = isolate->factory()->NewLoadHandler(data_size);
handler->set_smi_handler(*smi_handler);
handler->set_validity_cell(*validity_cell);
- InitPrototypeChecks(isolate, handler, receiver_map, holder, data1,
+ InitPrototypeChecks(isolate, handler, lookup_start_object_map, data1,
maybe_data2);
return handler;
}
// static
Handle<Object> LoadHandler::LoadFullChain(Isolate* isolate,
- Handle<Map> receiver_map,
+ Handle<Map> lookup_start_object_map,
const MaybeObjectHandle& holder,
Handle<Smi> smi_handler) {
- Handle<JSReceiver> end; // null handle, means full prototype chain lookup.
MaybeObjectHandle data1 = holder;
- int data_size = GetHandlerDataSize<LoadHandler>(isolate, &smi_handler,
- receiver_map, end, data1);
+ int data_size = GetHandlerDataSize<LoadHandler>(
+ isolate, &smi_handler, lookup_start_object_map, data1);
- Handle<Object> validity_cell =
- Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate);
+ Handle<Object> validity_cell = Map::GetOrCreatePrototypeChainValidityCell(
+ lookup_start_object_map, isolate);
if (validity_cell->IsSmi()) {
DCHECK_EQ(1, data_size);
- // Lookup on receiver isn't supported in case of a simple smi handler.
- if (!LookupOnReceiverBits::decode(smi_handler->value())) return smi_handler;
+ // Lookup on lookup start object isn't supported in case of a simple smi
+ // handler.
+ if (!LookupOnLookupStartObjectBits::decode(smi_handler->value())) {
+ return smi_handler;
+ }
}
Handle<LoadHandler> handler = isolate->factory()->NewLoadHandler(data_size);
handler->set_smi_handler(*smi_handler);
handler->set_validity_cell(*validity_cell);
- InitPrototypeChecks(isolate, handler, receiver_map, end, data1);
+ InitPrototypeChecks(isolate, handler, lookup_start_object_map, data1);
return handler;
}
@@ -247,7 +251,8 @@ MaybeObjectHandle StoreHandler::StoreTransition(Isolate* isolate,
DCHECK(!transition_map->IsJSGlobalObjectMap());
Handle<StoreHandler> handler = isolate->factory()->NewStoreHandler(0);
// Store normal with enabled lookup on receiver.
- int config = KindBits::encode(kNormal) | LookupOnReceiverBits::encode(true);
+ int config =
+ KindBits::encode(kNormal) | LookupOnLookupStartObjectBits::encode(true);
handler->set_smi_handler(Smi::FromInt(config));
handler->set_validity_cell(*validity_cell);
return MaybeObjectHandle(handler);
@@ -274,7 +279,7 @@ Handle<Object> StoreHandler::StoreThroughPrototype(
}
int data_size = GetHandlerDataSize<StoreHandler>(
- isolate, &smi_handler, receiver_map, holder, data1, maybe_data2);
+ isolate, &smi_handler, receiver_map, data1, maybe_data2);
Handle<Object> validity_cell =
Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate);
@@ -283,8 +288,7 @@ Handle<Object> StoreHandler::StoreThroughPrototype(
handler->set_smi_handler(*smi_handler);
handler->set_validity_cell(*validity_cell);
- InitPrototypeChecks(isolate, handler, receiver_map, holder, data1,
- maybe_data2);
+ InitPrototypeChecks(isolate, handler, receiver_map, data1, maybe_data2);
return handler;
}
@@ -304,5 +308,233 @@ Handle<Object> StoreHandler::StoreProxy(Isolate* isolate,
MaybeObjectHandle::Weak(proxy));
}
+#if defined(OBJECT_PRINT)
+namespace {
+void PrintSmiLoadHandler(int raw_handler, std::ostream& os) {
+ LoadHandler::Kind kind = LoadHandler::KindBits::decode(raw_handler);
+ os << "kind = ";
+ switch (kind) {
+ case LoadHandler::Kind::kElement:
+ os << "kElement, allow out of bounds = "
+ << LoadHandler::AllowOutOfBoundsBits::decode(raw_handler)
+ << ", is JSArray = " << LoadHandler::IsJsArrayBits::decode(raw_handler)
+ << ", convert hole = "
+ << LoadHandler::ConvertHoleBits::decode(raw_handler)
+ << ", elements kind = "
+ << ElementsKindToString(
+ LoadHandler::ElementsKindBits::decode(raw_handler));
+ break;
+ case LoadHandler::Kind::kIndexedString:
+ os << "kIndexedString, allow out of bounds = "
+ << LoadHandler::AllowOutOfBoundsBits::decode(raw_handler);
+ break;
+ case LoadHandler::Kind::kNormal:
+ os << "kNormal";
+ break;
+ case LoadHandler::Kind::kGlobal:
+ os << "kGlobal";
+ break;
+ case LoadHandler::Kind::kField: {
+ CompactElementsKind compact_elements_kind =
+ LoadHandler::CompactElementsKindBits::decode(raw_handler);
+ os << "kField, is in object = "
+ << LoadHandler::IsInobjectBits::decode(raw_handler)
+ << ", is double = " << LoadHandler::IsDoubleBits::decode(raw_handler)
+ << ", field index = "
+ << LoadHandler::FieldIndexBits::decode(raw_handler)
+ << ", elements kind = "
+ << CompactElementsKindToString(compact_elements_kind);
+ break;
+ }
+ case LoadHandler::Kind::kConstantFromPrototype: {
+ CompactElementsKind compact_elements_kind =
+ LoadHandler::CompactElementsKindBits::decode(raw_handler);
+ os << "kConstantFromPrototype, elements kind = "
+ << CompactElementsKindToString(compact_elements_kind);
+ break;
+ }
+ case LoadHandler::Kind::kAccessor:
+ os << "kAccessor, descriptor = "
+ << LoadHandler::DescriptorBits::decode(raw_handler);
+ break;
+ case LoadHandler::Kind::kNativeDataProperty:
+ os << "kNativeDataProperty, descriptor = "
+ << LoadHandler::DescriptorBits::decode(raw_handler);
+ break;
+ case LoadHandler::Kind::kApiGetter:
+ os << "kApiGetter";
+ break;
+ case LoadHandler::Kind::kApiGetterHolderIsPrototype:
+ os << "kApiGetterHolderIsPrototype";
+ break;
+ case LoadHandler::Kind::kInterceptor:
+ os << "kInterceptor";
+ break;
+ case LoadHandler::Kind::kSlow:
+ os << "kSlow";
+ break;
+ case LoadHandler::Kind::kProxy:
+ os << "kProxy";
+ break;
+ case LoadHandler::Kind::kNonExistent:
+ os << "kNonExistent";
+ break;
+ case LoadHandler::Kind::kModuleExport:
+ os << "kModuleExport, exports index = "
+ << LoadHandler::ExportsIndexBits::decode(raw_handler);
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+const char* KeyedAccessStoreModeToString(KeyedAccessStoreMode mode) {
+ switch (mode) {
+ case STANDARD_STORE:
+ return "STANDARD_STORE";
+ case STORE_AND_GROW_HANDLE_COW:
+ return "STORE_AND_GROW_HANDLE_COW";
+ case STORE_IGNORE_OUT_OF_BOUNDS:
+ return "STORE_IGNORE_OUT_OF_BOUNDS";
+ case STORE_HANDLE_COW:
+ return "STORE_HANDLE_COW";
+ }
+ UNREACHABLE();
+}
+
+void PrintSmiStoreHandler(int raw_handler, std::ostream& os) {
+ StoreHandler::Kind kind = StoreHandler::KindBits::decode(raw_handler);
+ os << "kind = ";
+ switch (kind) {
+ case StoreHandler::Kind::kField:
+ case StoreHandler::Kind::kConstField: {
+ os << "k";
+ if (kind == StoreHandler::Kind::kConstField) {
+ os << "Const";
+ }
+ Representation representation = Representation::FromKind(
+ StoreHandler::RepresentationBits::decode(raw_handler));
+ os << "Field, descriptor = "
+ << StoreHandler::DescriptorBits::decode(raw_handler)
+ << ", is in object = "
+ << StoreHandler::IsInobjectBits::decode(raw_handler)
+ << ", representation = " << representation.Mnemonic()
+ << ", field index = "
+ << StoreHandler::FieldIndexBits::decode(raw_handler);
+ break;
+ }
+ case StoreHandler::Kind::kAccessor:
+ os << "kAccessor, descriptor = "
+ << StoreHandler::DescriptorBits::decode(raw_handler);
+ break;
+ case StoreHandler::Kind::kNativeDataProperty:
+ os << "kNativeDataProperty, descriptor = "
+ << StoreHandler::DescriptorBits::decode(raw_handler);
+ break;
+ case StoreHandler::Kind::kApiSetter:
+ os << "kApiSetter";
+ break;
+ case StoreHandler::Kind::kApiSetterHolderIsPrototype:
+ os << "kApiSetterHolderIsPrototype";
+ break;
+ case StoreHandler::Kind::kGlobalProxy:
+ os << "kGlobalProxy";
+ break;
+ case StoreHandler::Kind::kNormal:
+ os << "kNormal";
+ break;
+ case StoreHandler::Kind::kInterceptor:
+ os << "kInterceptor";
+ break;
+ case StoreHandler::Kind::kSlow: {
+ KeyedAccessStoreMode keyed_access_store_mode =
+ StoreHandler::KeyedAccessStoreModeBits::decode(raw_handler);
+ os << "kSlow, keyed access store mode = "
+ << KeyedAccessStoreModeToString(keyed_access_store_mode);
+ break;
+ }
+ case StoreHandler::Kind::kProxy:
+ os << "kProxy";
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+} // namespace
+
+// static
+void LoadHandler::PrintHandler(Object handler, std::ostream& os) {
+ DisallowHeapAllocation no_gc;
+ if (handler.IsSmi()) {
+ int raw_handler = handler.ToSmi().value();
+ os << "LoadHandler(Smi)(";
+ PrintSmiLoadHandler(raw_handler, os);
+ os << ")" << std::endl;
+ } else {
+ LoadHandler load_handler = LoadHandler::cast(handler);
+ int raw_handler = load_handler.smi_handler().ToSmi().value();
+ os << "LoadHandler(do access check on lookup start object = "
+ << DoAccessCheckOnLookupStartObjectBits::decode(raw_handler)
+ << ", lookup on lookup start object = "
+ << LookupOnLookupStartObjectBits::decode(raw_handler) << ", ";
+ PrintSmiLoadHandler(raw_handler, os);
+ DCHECK_GE(load_handler.data_field_count(), 1);
+ os << ", data1 = ";
+ load_handler.data1().ShortPrint(os);
+ if (load_handler.data_field_count() >= 2) {
+ os << ", data2 = ";
+ load_handler.data2().ShortPrint(os);
+ }
+ if (load_handler.data_field_count() >= 3) {
+ os << ", data3 = ";
+ load_handler.data3().ShortPrint(os);
+ }
+ os << ", validity cell = ";
+ load_handler.validity_cell().ShortPrint(os);
+ os << ")" << std::endl;
+ }
+}
+
+void StoreHandler::PrintHandler(Object handler, std::ostream& os) {
+ DisallowHeapAllocation no_gc;
+ if (handler.IsSmi()) {
+ int raw_handler = handler.ToSmi().value();
+ os << "StoreHandler(Smi)(";
+ PrintSmiStoreHandler(raw_handler, os);
+ os << ")" << std::endl;
+ } else {
+ os << "StoreHandler(";
+ StoreHandler store_handler = StoreHandler::cast(handler);
+ if (store_handler.smi_handler().IsCode()) {
+ Code code = Code::cast(store_handler.smi_handler());
+ os << "builtin = ";
+ code.ShortPrint(os);
+ } else {
+ int raw_handler = store_handler.smi_handler().ToSmi().value();
+ os << "do access check on lookup start object = "
+ << DoAccessCheckOnLookupStartObjectBits::decode(raw_handler)
+ << ", lookup on lookup start object = "
+ << LookupOnLookupStartObjectBits::decode(raw_handler) << ", ";
+ PrintSmiStoreHandler(raw_handler, os);
+ }
+ DCHECK_GE(store_handler.data_field_count(), 1);
+ os << ", data1 = ";
+ store_handler.data1().ShortPrint(os);
+ if (store_handler.data_field_count() >= 2) {
+ os << ", data2 = ";
+ store_handler.data2().ShortPrint(os);
+ }
+ if (store_handler.data_field_count() >= 3) {
+ os << ", data3 = ";
+ store_handler.data3().ShortPrint(os);
+ }
+ os << ", validity cell = ";
+ store_handler.validity_cell().ShortPrint(os);
+ os << ")" << std::endl;
+ }
+}
+#endif // defined(OBJECT_PRINT)
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/ic/handler-configuration.h b/deps/v8/src/ic/handler-configuration.h
index 4f3d12597e..aaa2ac551f 100644
--- a/deps/v8/src/ic/handler-configuration.h
+++ b/deps/v8/src/ic/handler-configuration.h
@@ -50,30 +50,32 @@ class LoadHandler final : public DataHandler {
};
using KindBits = base::BitField<Kind, 0, 4>;
- // Defines whether access rights check should be done on receiver object.
+ // Defines whether access rights check should be done on lookup start object.
// Applicable to named property kinds only when loading value from prototype
- // chain. Ignored when loading from holder.
- using DoAccessCheckOnReceiverBits = KindBits::Next<bool, 1>;
+ // chain. Ignored when loading from lookup start object.
+ using DoAccessCheckOnLookupStartObjectBits = KindBits::Next<bool, 1>;
- // Defines whether a lookup should be done on receiver object before
+ // Defines whether a lookup should be done on lookup start object before
// proceeding to the prototype chain. Applicable to named property kinds only
- // when loading value from prototype chain. Ignored when loading from holder.
- using LookupOnReceiverBits = DoAccessCheckOnReceiverBits::Next<bool, 1>;
+ // when loading value from prototype chain. Ignored when loading from lookup
+ // start object.
+ using LookupOnLookupStartObjectBits =
+ DoAccessCheckOnLookupStartObjectBits::Next<bool, 1>;
//
- // Encoding when KindBits contains kForConstants.
+ // Encoding when KindBits contains kAccessor or kNativeDataProperty.
//
// Index of a value entry in the descriptor array.
using DescriptorBits =
- LookupOnReceiverBits::Next<unsigned, kDescriptorIndexBitCount>;
+ LookupOnLookupStartObjectBits::Next<unsigned, kDescriptorIndexBitCount>;
// Make sure we don't overflow the smi.
STATIC_ASSERT(DescriptorBits::kLastUsedBit < kSmiValueSize);
//
// Encoding when KindBits contains kField.
//
- using IsInobjectBits = LookupOnReceiverBits::Next<bool, 1>;
+ using IsInobjectBits = LookupOnLookupStartObjectBits::Next<bool, 1>;
using IsDoubleBits = IsInobjectBits::Next<bool, 1>;
// +1 here is to cover all possible JSObject header sizes.
using FieldIndexBits =
@@ -85,7 +87,7 @@ class LoadHandler final : public DataHandler {
//
// Encoding when KindBits contains kElement or kIndexedString.
//
- using AllowOutOfBoundsBits = LookupOnReceiverBits::Next<bool, 1>;
+ using AllowOutOfBoundsBits = LookupOnLookupStartObjectBits::Next<bool, 1>;
//
// Encoding when KindBits contains kElement.
@@ -99,8 +101,9 @@ class LoadHandler final : public DataHandler {
//
// Encoding when KindBits contains kModuleExport.
//
- using ExportsIndexBits = LookupOnReceiverBits::Next<
- unsigned, kSmiValueSize - LookupOnReceiverBits::kLastUsedBit - 1>;
+ using ExportsIndexBits = LookupOnLookupStartObjectBits::Next<
+ unsigned,
+ kSmiValueSize - LookupOnLookupStartObjectBits::kLastUsedBit - 1>;
// Decodes kind from Smi-handler.
static inline Kind GetHandlerKind(Smi smi_handler);
@@ -156,7 +159,6 @@ class LoadHandler final : public DataHandler {
// Creates a data handler that represents a prototype chain check followed
// by given Smi-handler that encoded a load from the holder.
- // Can be used only if GetPrototypeCheckCount() returns non negative value.
static Handle<Object> LoadFromPrototype(
Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder,
Handle<Smi> smi_handler,
@@ -181,6 +183,10 @@ class LoadHandler final : public DataHandler {
// Decodes the KeyedAccessLoadMode from a {handler}.
static KeyedAccessLoadMode GetKeyedAccessLoadMode(MaybeObject handler);
+#if defined(OBJECT_PRINT)
+ static void PrintHandler(Object handler, std::ostream& os);
+#endif // defined(OBJECT_PRINT)
+
OBJECT_CONSTRUCTORS(LoadHandler, DataHandler);
};
@@ -195,7 +201,6 @@ class StoreHandler final : public DataHandler {
DECL_VERIFIER(StoreHandler)
enum Kind {
- kElement,
kField,
kConstField,
kAccessor,
@@ -213,36 +218,29 @@ class StoreHandler final : public DataHandler {
// Applicable to kGlobalProxy, kProxy kinds.
- // Defines whether access rights check should be done on receiver object.
- using DoAccessCheckOnReceiverBits = KindBits::Next<bool, 1>;
+ // Defines whether access rights check should be done on lookup start object.
+ using DoAccessCheckOnLookupStartObjectBits = KindBits::Next<bool, 1>;
- // Defines whether a lookup should be done on receiver object before
+ // Defines whether a lookup should be done on lookup start object before
// proceeding to the prototype chain. Applicable to named property kinds only
// when storing through prototype chain. Ignored when storing to holder.
- using LookupOnReceiverBits = DoAccessCheckOnReceiverBits::Next<bool, 1>;
+ using LookupOnLookupStartObjectBits =
+ DoAccessCheckOnLookupStartObjectBits::Next<bool, 1>;
- // Applicable to kField, kTransitionToField and kTransitionToConstant
- // kinds.
+ // Applicable to kField, kAccessor and kNativeDataProperty.
// Index of a value entry in the descriptor array.
using DescriptorBits =
- LookupOnReceiverBits::Next<unsigned, kDescriptorIndexBitCount>;
+ LookupOnLookupStartObjectBits::Next<unsigned, kDescriptorIndexBitCount>;
//
- // Encodes the bits when StoreSlow contains KeyedAccessStoreMode.
+ // Encoding when KindBits contains kStoreSlow.
//
using KeyedAccessStoreModeBits =
- DescriptorBits::Next<KeyedAccessStoreMode, 2>;
-
- //
- // Encoding when KindBits contains kTransitionToConstant.
- //
-
- // Make sure we don't overflow the smi.
- STATIC_ASSERT(DescriptorBits::kLastUsedBit < kSmiValueSize);
+ LookupOnLookupStartObjectBits::Next<KeyedAccessStoreMode, 2>;
//
- // Encoding when KindBits contains kField or kTransitionToField.
+ // Encoding when KindBits contains kField.
//
using IsInobjectBits = DescriptorBits::Next<bool, 1>;
using RepresentationBits = IsInobjectBits::Next<Representation::Kind, 3>;
@@ -310,6 +308,10 @@ class StoreHandler final : public DataHandler {
// Decodes the KeyedAccessStoreMode from a {handler}.
static KeyedAccessStoreMode GetKeyedAccessStoreMode(MaybeObject handler);
+#if defined(OBJECT_PRINT)
+ static void PrintHandler(Object handler, std::ostream& os);
+#endif // defined(OBJECT_PRINT)
+
private:
static inline Handle<Smi> StoreField(Isolate* isolate, Kind kind,
int descriptor, FieldIndex field_index,
diff --git a/deps/v8/src/ic/ic-inl.h b/deps/v8/src/ic/ic-inl.h
index 29373d85d8..35218f7df5 100644
--- a/deps/v8/src/ic/ic-inl.h
+++ b/deps/v8/src/ic/ic-inl.h
@@ -16,11 +16,12 @@
namespace v8 {
namespace internal {
-void IC::update_receiver_map(Handle<Object> receiver) {
- if (receiver->IsSmi()) {
- receiver_map_ = isolate_->factory()->heap_number_map();
+void IC::update_lookup_start_object_map(Handle<Object> object) {
+ if (object->IsSmi()) {
+ lookup_start_object_map_ = isolate_->factory()->heap_number_map();
} else {
- receiver_map_ = handle(HeapObject::cast(*receiver).map(), isolate_);
+ lookup_start_object_map_ =
+ handle(HeapObject::cast(*object).map(), isolate_);
}
}
diff --git a/deps/v8/src/ic/ic.cc b/deps/v8/src/ic/ic.cc
index 1a414626bf..d8e25f3c74 100644
--- a/deps/v8/src/ic/ic.cc
+++ b/deps/v8/src/ic/ic.cc
@@ -11,6 +11,7 @@
#include "src/base/logging.h"
#include "src/builtins/accessors.h"
#include "src/codegen/code-factory.h"
+#include "src/common/assert-scope.h"
#include "src/execution/arguments-inl.h"
#include "src/execution/execution.h"
#include "src/execution/frames-inl.h"
@@ -96,7 +97,7 @@ void IC::TraceIC(const char* type, Handle<Object> name, State old_state,
State new_state) {
if (V8_LIKELY(!TracingFlags::is_ic_stats_enabled())) return;
- Handle<Map> map = receiver_map(); // Might be empty.
+ Handle<Map> map = lookup_start_object_map(); // Might be empty.
const char* modifier = "";
if (state() == NO_FEEDBACK) {
@@ -216,7 +217,8 @@ bool IC::ShouldRecomputeHandler(Handle<String> name) {
// monomorphic.
if (IsGlobalIC()) return true;
- MaybeObjectHandle maybe_handler = nexus()->FindHandlerForMap(receiver_map());
+ MaybeObjectHandle maybe_handler =
+ nexus()->FindHandlerForMap(lookup_start_object_map());
// The current map wasn't handled yet. There's no reason to stay monomorphic,
// *unless* we're moving from a deprecated map to its replacement, or
@@ -224,13 +226,13 @@ bool IC::ShouldRecomputeHandler(Handle<String> name) {
// TODO(verwaest): Check if the current map is actually what the old map
// would transition to.
if (maybe_handler.is_null()) {
- if (!receiver_map()->IsJSObjectMap()) return false;
+ if (!lookup_start_object_map()->IsJSObjectMap()) return false;
Map first_map = FirstTargetMap();
if (first_map.is_null()) return false;
Handle<Map> old_map(first_map, isolate());
if (old_map->is_deprecated()) return true;
- return IsMoreGeneralElementsKindTransition(old_map->elements_kind(),
- receiver_map()->elements_kind());
+ return IsMoreGeneralElementsKindTransition(
+ old_map->elements_kind(), lookup_start_object_map()->elements_kind());
}
return true;
@@ -247,12 +249,12 @@ bool IC::RecomputeHandlerForName(Handle<Object> name) {
return true;
}
-void IC::UpdateState(Handle<Object> receiver, Handle<Object> name) {
+void IC::UpdateState(Handle<Object> lookup_start_object, Handle<Object> name) {
if (state() == NO_FEEDBACK) return;
- update_receiver_map(receiver);
+ update_lookup_start_object_map(lookup_start_object);
if (!name->IsString()) return;
if (state() != MONOMORPHIC && state() != POLYMORPHIC) return;
- if (receiver->IsNullOrUndefined(isolate())) return;
+ if (lookup_start_object->IsNullOrUndefined(isolate())) return;
// Remove the target from the code cache if it became invalid
// because of changes in the prototype chain to avoid hitting it
@@ -383,9 +385,14 @@ void IC::ConfigureVectorState(
}
MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name,
- bool update_feedback) {
+ bool update_feedback,
+ Handle<Object> receiver) {
bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic && update_feedback;
+ if (receiver.is_null()) {
+ receiver = object;
+ }
+
// If the object is undefined or null it's illegal to try to get any
// of its properties; throw a TypeError in that case.
if (IsAnyHas() ? !object->IsJSReceiver()
@@ -393,7 +400,7 @@ MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name,
if (use_ic) {
// Ensure the IC state progresses.
TRACE_HANDLER_STATS(isolate(), LoadIC_NonReceiver);
- update_receiver_map(object);
+ update_lookup_start_object_map(object);
SetCache(name, LoadHandler::LoadSlow(isolate()));
TraceIC("LoadIC", name);
}
@@ -415,10 +422,10 @@ MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name,
if (MigrateDeprecated(isolate(), object)) use_ic = false;
JSObject::MakePrototypesFast(object, kStartAtReceiver, isolate());
- update_receiver_map(object);
+ update_lookup_start_object_map(object);
LookupIterator::Key key(isolate(), name);
- LookupIterator it(isolate(), object, key);
+ LookupIterator it = LookupIterator(isolate(), receiver, key, object);
// Named lookup in the object.
LookupForRead(&it, IsAnyHas());
@@ -563,40 +570,67 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name,
if (is_keyed() && state() != RECOMPUTE_HANDLER) {
if (nexus()->GetName() != *name) return false;
}
- Handle<Map> map = receiver_map();
+ Handle<Map> map = lookup_start_object_map();
std::vector<MapAndHandler> maps_and_handlers;
- nexus()->ExtractMapsAndHandlers(&maps_and_handlers);
- int number_of_maps = static_cast<int>(maps_and_handlers.size());
- int deprecated_maps = 0;
+ maps_and_handlers.reserve(FLAG_max_valid_polymorphic_map_count);
+ std::vector<MapAndHandler> deprecated_maps_and_handlers;
int handler_to_overwrite = -1;
- for (int i = 0; i < number_of_maps; i++) {
- Handle<Map> current_map = maps_and_handlers.at(i).first;
- MaybeObjectHandle current_handler = maps_and_handlers.at(i).second;
- if (current_map->is_deprecated()) {
- // Filter out deprecated maps to ensure their instances get migrated.
- ++deprecated_maps;
- } else if (map.is_identical_to(current_map)) {
- // If both map and handler stayed the same (and the name is also the
- // same as checked above, for keyed accesses), we're not progressing
- // in the lattice and need to go MEGAMORPHIC instead. There's one
- // exception to this rule, which is when we're in RECOMPUTE_HANDLER
- // state, there we allow to migrate to a new handler.
- if (handler.is_identical_to(current_handler) &&
- state() != RECOMPUTE_HANDLER) {
- return false;
+ {
+ DisallowHeapAllocation no_gc;
+ int i = 0;
+ for (FeedbackIterator it(nexus()); !it.done(); it.Advance()) {
+ if (it.handler()->IsCleared()) continue;
+ MaybeObjectHandle existing_handler = handle(it.handler(), isolate());
+ Handle<Map> existing_map = handle(it.map(), isolate());
+
+ if (existing_map->is_deprecated()) {
+ // Filter out deprecated maps to ensure their instances get migrated.
+ deprecated_maps_and_handlers.push_back(
+ MapAndHandler(existing_map, existing_handler));
+ continue;
+ }
+
+ maps_and_handlers.push_back(
+ MapAndHandler(existing_map, existing_handler));
+
+ if (map.is_identical_to(existing_map)) {
+ // If both map and handler stayed the same (and the name is also the
+ // same as checked above, for keyed accesses), we're not progressing
+ // in the lattice and need to go MEGAMORPHIC instead. There's one
+ // exception to this rule, which is when we're in RECOMPUTE_HANDLER
+ // state, there we allow to migrate to a new handler.
+ if (handler.is_identical_to(existing_handler) &&
+ state() != RECOMPUTE_HANDLER) {
+ return false;
+ }
+
+ // If the receiver type is already in the polymorphic IC, this indicates
+ // there was a prototoype chain failure. In that case, just overwrite
+ // the handler.
+ handler_to_overwrite = i;
+ } else if (handler_to_overwrite == -1 &&
+ IsTransitionOfMonomorphicTarget(*existing_map, *map)) {
+ handler_to_overwrite = i;
}
- // If the receiver type is already in the polymorphic IC, this indicates
- // there was a prototoype chain failure. In that case, just overwrite the
- // handler.
- handler_to_overwrite = i;
- } else if (handler_to_overwrite == -1 &&
- IsTransitionOfMonomorphicTarget(*current_map, *map)) {
- handler_to_overwrite = i;
+
+ i++;
}
+ DCHECK_LE(i, maps_and_handlers.size());
+ }
+
+ // Reorder the deprecated maps to be at the end, so that
+ // minimorphic ICs have the best chance of succeeding as they only
+ // check the first FLAG_max_minimorphic_map_checks maps.
+ if (deprecated_maps_and_handlers.size() > 0) {
+ maps_and_handlers.insert(maps_and_handlers.end(),
+ deprecated_maps_and_handlers.begin(),
+ deprecated_maps_and_handlers.end());
}
+ int number_of_maps = static_cast<int>(maps_and_handlers.size());
+ int deprecated_maps = static_cast<int>(deprecated_maps_and_handlers.size());
int number_of_valid_maps =
number_of_maps - deprecated_maps - (handler_to_overwrite != -1);
@@ -608,7 +642,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name,
number_of_valid_maps++;
if (number_of_valid_maps == 1) {
- ConfigureVectorState(name, receiver_map(), handler);
+ ConfigureVectorState(name, lookup_start_object_map(), handler);
} else {
if (is_keyed() && nexus()->GetName() != *name) return false;
if (handler_to_overwrite >= 0) {
@@ -630,7 +664,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name,
void IC::UpdateMonomorphicIC(const MaybeObjectHandle& handler,
Handle<Name> name) {
DCHECK(IsHandler(*handler));
- ConfigureVectorState(name, receiver_map(), handler);
+ ConfigureVectorState(name, lookup_start_object_map(), handler);
}
void IC::CopyICToMegamorphicCache(Handle<Name> name) {
@@ -687,7 +721,7 @@ void IC::SetCache(Handle<Name> name, const MaybeObjectHandle& handler) {
ConfigureVectorState(MEGAMORPHIC, name);
V8_FALLTHROUGH;
case MEGAMORPHIC:
- UpdateMegamorphicCache(receiver_map(), name, handler);
+ UpdateMegamorphicCache(lookup_start_object_map(), name, handler);
// Indicate that we've handled this case.
vector_set_ = true;
break;
@@ -704,7 +738,7 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) {
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH);
Handle<Smi> smi_handler = LoadHandler::LoadNonExistent(isolate());
code = LoadHandler::LoadFullChain(
- isolate(), receiver_map(),
+ isolate(), lookup_start_object_map(),
MaybeObjectHandle(isolate()->factory()->null_value()), smi_handler);
} else if (IsLoadGlobalIC() && lookup->state() == LookupIterator::JSPROXY) {
// If there is proxy just install the slow stub since we need to call the
@@ -712,8 +746,8 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) {
// handle this case.
Handle<Smi> slow_handler = LoadHandler::LoadSlow(isolate());
Handle<JSProxy> holder = lookup->GetHolder<JSProxy>();
- code = LoadHandler::LoadFromPrototype(isolate(), receiver_map(), holder,
- slow_handler);
+ code = LoadHandler::LoadFromPrototype(isolate(), lookup_start_object_map(),
+ holder, slow_handler);
} else {
if (IsLoadGlobalIC()) {
if (lookup->TryLookupCachedProperty()) {
@@ -782,12 +816,13 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
}
}
- Handle<Map> map = receiver_map();
+ Handle<Map> map = lookup_start_object_map();
Handle<JSObject> holder;
- bool receiver_is_holder;
+ bool holder_is_lookup_start_object;
if (lookup->state() != LookupIterator::JSPROXY) {
holder = lookup->GetHolder<JSObject>();
- receiver_is_holder = receiver.is_identical_to(holder);
+ holder_is_lookup_start_object =
+ lookup->lookup_start_object().is_identical_to(holder);
}
switch (lookup->state()) {
@@ -796,7 +831,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
if (holder->GetNamedInterceptor().non_masking()) {
MaybeObjectHandle holder_ref(isolate()->factory()->null_value());
- if (!receiver_is_holder || IsLoadGlobalIC()) {
+ if (!holder_is_lookup_start_object || IsLoadGlobalIC()) {
holder_ref = MaybeObjectHandle::Weak(holder);
}
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonMaskingInterceptorDH);
@@ -804,7 +839,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
smi_handler);
}
- if (receiver_is_holder) {
+ if (holder_is_lookup_start_object) {
DCHECK(map->has_named_interceptor());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptorDH);
return smi_handler;
@@ -818,7 +853,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
case LookupIterator::ACCESSOR: {
// Use simple field loads for some well-known callback properties.
// The method will only return true for absolute truths based on the
- // receiver maps.
+ // lookup start object maps.
FieldIndex index;
if (Accessors::IsJSObjectFieldAccessor(isolate(), map, lookup->name(),
&index)) {
@@ -892,7 +927,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
LoadHandler::LoadAccessor(isolate(), lookup->GetAccessorIndex());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadAccessorDH);
- if (receiver_is_holder) return smi_handler;
+ if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadAccessorFromPrototypeDH);
} else if (holder->IsJSGlobalObject()) {
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobalFromPrototypeDH);
@@ -904,7 +939,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
smi_handler = LoadHandler::LoadNormal(isolate());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH);
- if (receiver_is_holder) return smi_handler;
+ if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH);
}
@@ -925,7 +960,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
Handle<Smi> smi_handler = LoadHandler::LoadNativeDataProperty(
isolate(), lookup->GetAccessorIndex());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNativeDataPropertyDH);
- if (receiver_is_holder) return smi_handler;
+ if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(),
LoadIC_LoadNativeDataPropertyFromPrototypeDH);
return LoadHandler::LoadFromPrototype(isolate(), map, holder,
@@ -948,7 +983,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
smi_handler = LoadHandler::LoadNormal(isolate());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH);
- if (receiver_is_holder) return smi_handler;
+ if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH);
} else if (lookup->IsElement(*holder)) {
TRACE_HANDLER_STATS(isolate(), LoadIC_SlowStub);
@@ -959,11 +994,11 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
smi_handler =
LoadHandler::LoadField(isolate(), field, map->elements_kind());
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldDH);
- if (receiver_is_holder) return smi_handler;
+ if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldFromPrototypeDH);
}
if (lookup->constness() == PropertyConstness::kConst &&
- !receiver_is_holder) {
+ !holder_is_lookup_start_object) {
DCHECK(!lookup->is_dictionary_holder());
Handle<Object> value = lookup->GetDataValue();
@@ -998,9 +1033,10 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
return LoadHandler::LoadNonExistent(isolate());
case LookupIterator::JSPROXY: {
Handle<JSProxy> holder_proxy = lookup->GetHolder<JSProxy>();
- bool receiver_is_holder_proxy = receiver.is_identical_to(holder_proxy);
+ bool holder_proxy_is_lookup_start_object =
+ lookup->lookup_start_object().is_identical_to(holder_proxy);
Handle<Smi> smi_handler = LoadHandler::LoadProxy(isolate());
- if (receiver_is_holder_proxy) {
+ if (holder_proxy_is_lookup_start_object) {
return smi_handler;
}
return LoadHandler::LoadFromPrototype(isolate(), map, holder_proxy,
@@ -1408,7 +1444,7 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value,
it->PrepareForDataProperty(value);
// The previous receiver map might just have been deprecated,
// so reload it.
- update_receiver_map(receiver);
+ update_lookup_start_object_map(receiver);
return true;
}
@@ -1531,7 +1567,7 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, Handle<Name> name,
if (use_ic) {
// Ensure the IC state progresses.
TRACE_HANDLER_STATS(isolate(), StoreIC_NonReceiver);
- update_receiver_map(object);
+ update_lookup_start_object_map(object);
SetCache(name, StoreHandler::StoreSlow(isolate()));
TraceIC("StoreIC", name);
}
@@ -1601,7 +1637,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
if (store_target->IsJSGlobalObject()) {
TRACE_HANDLER_STATS(isolate(), StoreIC_StoreGlobalTransitionDH);
- if (receiver_map()->IsJSGlobalObject()) {
+ if (lookup_start_object_map()->IsJSGlobalObject()) {
DCHECK(IsStoreGlobalIC());
#ifdef DEBUG
Handle<JSObject> holder = lookup->GetHolder<JSObject>();
@@ -1613,13 +1649,13 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
Handle<Smi> smi_handler = StoreHandler::StoreGlobalProxy(isolate());
Handle<Object> handler = StoreHandler::StoreThroughPrototype(
- isolate(), receiver_map(), store_target, smi_handler,
+ isolate(), lookup_start_object_map(), store_target, smi_handler,
MaybeObjectHandle::Weak(lookup->transition_cell()));
return MaybeObjectHandle(handler);
}
// Dictionary-to-fast transitions are not expected and not supported.
DCHECK_IMPLIES(!lookup->transition_map()->is_dictionary_map(),
- !receiver_map()->is_dictionary_map());
+ !lookup_start_object_map()->is_dictionary_map());
DCHECK(lookup->IsCacheableTransition());
@@ -1646,7 +1682,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
DCHECK(!info.getter().IsUndefined(isolate()) ||
!info.query().IsUndefined(isolate()));
Handle<Object> handler = StoreHandler::StoreThroughPrototype(
- isolate(), receiver_map(), holder,
+ isolate(), lookup_start_object_map(), holder,
StoreHandler::StoreSlow(isolate()));
return MaybeObjectHandle(handler);
}
@@ -1678,7 +1714,8 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub);
return MaybeObjectHandle(StoreHandler::StoreSlow(isolate()));
}
- if (!AccessorInfo::IsCompatibleReceiverMap(info, receiver_map())) {
+ if (!AccessorInfo::IsCompatibleReceiverMap(info,
+ lookup_start_object_map())) {
set_slow_stub_reason("incompatible receiver type");
TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub);
return MaybeObjectHandle(StoreHandler::StoreSlow(isolate()));
@@ -1693,7 +1730,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
TRACE_HANDLER_STATS(isolate(),
StoreIC_StoreNativeDataPropertyOnPrototypeDH);
return MaybeObjectHandle(StoreHandler::StoreThroughPrototype(
- isolate(), receiver_map(), holder, smi_handler));
+ isolate(), lookup_start_object_map(), holder, smi_handler));
} else if (accessors->IsAccessorPair()) {
Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(),
@@ -1717,8 +1754,8 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
if (call_optimization.is_simple_api_call()) {
if (call_optimization.IsCompatibleReceiver(receiver, holder)) {
CallOptimization::HolderLookup holder_lookup;
- call_optimization.LookupHolderOfExpectedType(receiver_map(),
- &holder_lookup);
+ call_optimization.LookupHolderOfExpectedType(
+ lookup_start_object_map(), &holder_lookup);
Handle<Smi> smi_handler = StoreHandler::StoreApiSetter(
isolate(),
@@ -1728,7 +1765,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
call_optimization.GetAccessorContext(holder->map()), isolate());
TRACE_HANDLER_STATS(isolate(), StoreIC_StoreApiSetterOnPrototypeDH);
return MaybeObjectHandle(StoreHandler::StoreThroughPrototype(
- isolate(), receiver_map(), holder, smi_handler,
+ isolate(), lookup_start_object_map(), holder, smi_handler,
MaybeObjectHandle::Weak(call_optimization.api_call_info()),
MaybeObjectHandle::Weak(context)));
}
@@ -1751,7 +1788,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
TRACE_HANDLER_STATS(isolate(), StoreIC_StoreAccessorOnPrototypeDH);
return MaybeObjectHandle(StoreHandler::StoreThroughPrototype(
- isolate(), receiver_map(), holder, smi_handler));
+ isolate(), lookup_start_object_map(), holder, smi_handler));
}
TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub);
return MaybeObjectHandle(StoreHandler::StoreSlow(isolate()));
@@ -1810,7 +1847,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
Handle<JSReceiver>::cast(lookup->GetReceiver());
Handle<JSProxy> holder = lookup->GetHolder<JSProxy>();
return MaybeObjectHandle(StoreHandler::StoreProxy(
- isolate(), receiver_map(), holder, receiver));
+ isolate(), lookup_start_object_map(), holder, receiver));
}
case LookupIterator::INTEGER_INDEXED_EXOTIC:
@@ -2338,6 +2375,21 @@ RUNTIME_FUNCTION(Runtime_LoadNoFeedbackIC_Miss) {
RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
}
+RUNTIME_FUNCTION(Runtime_LoadWithReceiverNoFeedbackIC_Miss) {
+ HandleScope scope(isolate);
+ DCHECK_EQ(3, args.length());
+ // Runtime functions don't follow the IC's calling convention.
+ Handle<Object> receiver = args.at(0);
+ Handle<Object> object = args.at(1);
+ Handle<Name> key = args.at<Name>(2);
+
+ Handle<FeedbackVector> vector = Handle<FeedbackVector>();
+ FeedbackSlot vector_slot = FeedbackSlot::Invalid();
+ LoadIC ic(isolate, vector, vector_slot, FeedbackSlotKind::kLoadProperty);
+ ic.UpdateState(object, key);
+ RETURN_RESULT_OR_FAILURE(isolate, ic.Load(object, key, true, receiver));
+}
+
RUNTIME_FUNCTION(Runtime_LoadGlobalIC_Miss) {
HandleScope scope(isolate);
DCHECK_EQ(4, args.length());
@@ -2383,6 +2435,23 @@ RUNTIME_FUNCTION(Runtime_LoadGlobalIC_Slow) {
return *result;
}
+RUNTIME_FUNCTION(Runtime_LoadWithReceiverIC_Miss) {
+ HandleScope scope(isolate);
+ DCHECK_EQ(5, args.length());
+ // Runtime functions don't follow the IC's calling convention.
+ Handle<Object> receiver = args.at(0);
+ Handle<Object> object = args.at(1);
+ Handle<Name> key = args.at<Name>(2);
+ Handle<TaggedIndex> slot = args.at<TaggedIndex>(3);
+ Handle<FeedbackVector> vector = args.at<FeedbackVector>(4);
+ FeedbackSlot vector_slot = FeedbackVector::ToSlot(slot->value());
+
+ DCHECK(IsLoadICKind(vector->GetKind(vector_slot)));
+ LoadIC ic(isolate, vector, vector_slot, FeedbackSlotKind::kLoadProperty);
+ ic.UpdateState(object, key);
+ RETURN_RESULT_OR_FAILURE(isolate, ic.Load(object, key, true, receiver));
+}
+
RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) {
HandleScope scope(isolate);
DCHECK_EQ(4, args.length());
diff --git a/deps/v8/src/ic/ic.h b/deps/v8/src/ic/ic.h
index da4b22a2c2..170ee609cb 100644
--- a/deps/v8/src/ic/ic.h
+++ b/deps/v8/src/ic/ic.h
@@ -37,8 +37,9 @@ class IC {
State state() const { return state_; }
- // Compute the current IC state based on the target stub, receiver and name.
- void UpdateState(Handle<Object> receiver, Handle<Object> name);
+ // Compute the current IC state based on the target stub, lookup_start_object
+ // and name.
+ void UpdateState(Handle<Object> lookup_start_object, Handle<Object> name);
bool RecomputeHandlerForName(Handle<Object> name);
void MarkRecomputeHandler(Handle<Object> name) {
@@ -121,8 +122,8 @@ class IC {
}
bool ShouldRecomputeHandler(Handle<String> name);
- Handle<Map> receiver_map() { return receiver_map_; }
- inline void update_receiver_map(Handle<Object> receiver);
+ Handle<Map> lookup_start_object_map() { return lookup_start_object_map_; }
+ inline void update_lookup_start_object_map(Handle<Object> object);
void TargetMaps(MapHandles* list) {
FindTargetMaps();
@@ -136,10 +137,6 @@ class IC {
return !target_maps_.empty() ? *target_maps_[0] : Map();
}
- State saved_state() const {
- return state() == RECOMPUTE_HANDLER ? old_state_ : state();
- }
-
const FeedbackNexus* nexus() const { return &nexus_; }
FeedbackNexus* nexus() { return &nexus_; }
@@ -156,7 +153,7 @@ class IC {
State old_state_; // For saving if we marked as prototype failure.
State state_;
FeedbackSlotKind kind_;
- Handle<Map> receiver_map_;
+ Handle<Map> lookup_start_object_map_;
MapHandles target_maps_;
bool target_maps_set_;
@@ -184,9 +181,10 @@ class LoadIC : public IC {
return ShouldThrowReferenceError(kind());
}
- V8_WARN_UNUSED_RESULT MaybeHandle<Object> Load(Handle<Object> object,
- Handle<Name> name,
- bool update_feedback = true);
+ // If receiver is empty, use object as the receiver.
+ V8_WARN_UNUSED_RESULT MaybeHandle<Object> Load(
+ Handle<Object> object, Handle<Name> name, bool update_feedback = true,
+ Handle<Object> receiver = Handle<Object>());
protected:
// Update the inline cache and the global stub cache based on the
diff --git a/deps/v8/src/init/bootstrapper.cc b/deps/v8/src/init/bootstrapper.cc
index 996b872878..c5cfceb069 100644
--- a/deps/v8/src/init/bootstrapper.cc
+++ b/deps/v8/src/init/bootstrapper.cc
@@ -4151,6 +4151,12 @@ void Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
JSObject::AddProperty(isolate_, global, "SharedArrayBuffer",
isolate()->shared_array_buffer_fun(), DONT_ENUM);
+}
+
+void Genesis::InitializeGlobal_harmony_atomics() {
+ if (!FLAG_harmony_atomics) return;
+
+ Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
JSObject::AddProperty(isolate_, global, "Atomics",
isolate()->atomics_object(), DONT_ENUM);
@@ -4219,7 +4225,7 @@ void Genesis::InitializeGlobal_harmony_weak_refs() {
factory->WeakRef_string());
SimpleInstallFunction(isolate(), weak_ref_prototype, "deref",
- Builtins::kWeakRefDeref, 0, false);
+ Builtins::kWeakRefDeref, 0, true);
}
}
diff --git a/deps/v8/src/inspector/DEPS b/deps/v8/src/inspector/DEPS
index f72271a55c..55d8e7a51e 100644
--- a/deps/v8/src/inspector/DEPS
+++ b/deps/v8/src/inspector/DEPS
@@ -13,6 +13,7 @@ include_rules = [
"+src/base/safe_conversions.h",
"+src/base/template-utils.h",
"+src/base/v8-fallthrough.h",
+ "+src/logging/tracing-flags.h",
"+src/numbers/conversions.h",
"+src/inspector",
"+src/tracing",
diff --git a/deps/v8/src/inspector/string-16.cc b/deps/v8/src/inspector/string-16.cc
index 15344ee2b8..466852fa36 100644
--- a/deps/v8/src/inspector/string-16.cc
+++ b/deps/v8/src/inspector/string-16.cc
@@ -196,6 +196,14 @@ void String16Builder::appendUnsignedAsHex(uint32_t number) {
m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
}
+void String16Builder::appendUnsignedAsHex(uint8_t number) {
+ constexpr int kBufferSize = 3;
+ char buffer[kBufferSize];
+ int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%02" PRIx8, number);
+ DCHECK_LE(0, chars);
+ m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
+}
+
String16 String16Builder::toString() {
return String16(m_buffer.data(), m_buffer.size());
}
diff --git a/deps/v8/src/inspector/string-16.h b/deps/v8/src/inspector/string-16.h
index 014c5f4c7e..4143f6c311 100644
--- a/deps/v8/src/inspector/string-16.h
+++ b/deps/v8/src/inspector/string-16.h
@@ -128,6 +128,7 @@ class String16Builder {
void appendNumber(size_t);
void appendUnsignedAsHex(uint64_t);
void appendUnsignedAsHex(uint32_t);
+ void appendUnsignedAsHex(uint8_t);
String16 toString();
void reserveCapacity(size_t);
diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.cc b/deps/v8/src/inspector/v8-profiler-agent-impl.cc
index 873add9a19..47be944879 100644
--- a/deps/v8/src/inspector/v8-profiler-agent-impl.cc
+++ b/deps/v8/src/inspector/v8-profiler-agent-impl.cc
@@ -6,6 +6,7 @@
#include <vector>
+#include "include/v8-profiler.h"
#include "src/base/atomicops.h"
#include "src/base/platform/time.h"
#include "src/debug/debug-interface.h"
@@ -15,8 +16,7 @@
#include "src/inspector/v8-inspector-impl.h"
#include "src/inspector/v8-inspector-session-impl.h"
#include "src/inspector/v8-stack-trace-impl.h"
-
-#include "include/v8-profiler.h"
+#include "src/logging/tracing-flags.h"
namespace v8_inspector {
@@ -30,6 +30,8 @@ static const char preciseCoverageDetailed[] = "preciseCoverageDetailed";
static const char preciseCoverageAllowTriggeredUpdates[] =
"preciseCoverageAllowTriggeredUpdates";
static const char typeProfileStarted[] = "typeProfileStarted";
+static const char countersEnabled[] = "countersEnabled";
+static const char runtimeCallStatsEnabled[] = "runtimeCallStatsEnabled";
} // namespace ProfilerAgentState
namespace {
@@ -220,22 +222,36 @@ void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title) {
}
Response V8ProfilerAgentImpl::enable() {
- if (m_enabled) return Response::Success();
- m_enabled = true;
- m_state->setBoolean(ProfilerAgentState::profilerEnabled, true);
+ if (!m_enabled) {
+ m_enabled = true;
+ m_state->setBoolean(ProfilerAgentState::profilerEnabled, true);
+ }
+
return Response::Success();
}
Response V8ProfilerAgentImpl::disable() {
- if (!m_enabled) return Response::Success();
- for (size_t i = m_startedProfiles.size(); i > 0; --i)
- stopProfiling(m_startedProfiles[i - 1].m_id, false);
- m_startedProfiles.clear();
- stop(nullptr);
- stopPreciseCoverage();
- DCHECK(!m_profiler);
- m_enabled = false;
- m_state->setBoolean(ProfilerAgentState::profilerEnabled, false);
+ if (m_enabled) {
+ for (size_t i = m_startedProfiles.size(); i > 0; --i)
+ stopProfiling(m_startedProfiles[i - 1].m_id, false);
+ m_startedProfiles.clear();
+ stop(nullptr);
+ stopPreciseCoverage();
+ DCHECK(!m_profiler);
+ m_enabled = false;
+ m_state->setBoolean(ProfilerAgentState::profilerEnabled, false);
+ }
+
+ if (m_counters) {
+ disableCounters();
+ m_state->setBoolean(ProfilerAgentState::countersEnabled, false);
+ }
+
+ if (m_runtime_call_stats_enabled) {
+ disableRuntimeCallStats();
+ m_state->setBoolean(ProfilerAgentState::runtimeCallStatsEnabled, false);
+ }
+
return Response::Success();
}
@@ -250,25 +266,34 @@ Response V8ProfilerAgentImpl::setSamplingInterval(int interval) {
void V8ProfilerAgentImpl::restore() {
DCHECK(!m_enabled);
- if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false))
- return;
- m_enabled = true;
- DCHECK(!m_profiler);
- if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling,
- false)) {
- start();
+ if (m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) {
+ m_enabled = true;
+ DCHECK(!m_profiler);
+ if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling,
+ false)) {
+ start();
+ }
+ if (m_state->booleanProperty(ProfilerAgentState::preciseCoverageStarted,
+ false)) {
+ bool callCount = m_state->booleanProperty(
+ ProfilerAgentState::preciseCoverageCallCount, false);
+ bool detailed = m_state->booleanProperty(
+ ProfilerAgentState::preciseCoverageDetailed, false);
+ bool updatesAllowed = m_state->booleanProperty(
+ ProfilerAgentState::preciseCoverageAllowTriggeredUpdates, false);
+ double timestamp;
+ startPreciseCoverage(Maybe<bool>(callCount), Maybe<bool>(detailed),
+ Maybe<bool>(updatesAllowed), &timestamp);
+ }
}
- if (m_state->booleanProperty(ProfilerAgentState::preciseCoverageStarted,
+
+ if (m_state->booleanProperty(ProfilerAgentState::countersEnabled, false)) {
+ enableCounters();
+ }
+
+ if (m_state->booleanProperty(ProfilerAgentState::runtimeCallStatsEnabled,
false)) {
- bool callCount = m_state->booleanProperty(
- ProfilerAgentState::preciseCoverageCallCount, false);
- bool detailed = m_state->booleanProperty(
- ProfilerAgentState::preciseCoverageDetailed, false);
- bool updatesAllowed = m_state->booleanProperty(
- ProfilerAgentState::preciseCoverageAllowTriggeredUpdates, false);
- double timestamp;
- startPreciseCoverage(Maybe<bool>(callCount), Maybe<bool>(detailed),
- Maybe<bool>(updatesAllowed), &timestamp);
+ enableRuntimeCallStats();
}
}
@@ -525,10 +550,9 @@ Response V8ProfilerAgentImpl::takeTypeProfile(
return Response::Success();
}
-Response V8ProfilerAgentImpl::enableRuntimeCallStats() {
+Response V8ProfilerAgentImpl::enableCounters() {
if (m_counters)
- return Response::ServerError(
- "RuntimeCallStats collection already enabled.");
+ return Response::ServerError("Counters collection already enabled.");
if (V8Inspector* inspector = v8::debug::GetInspector(m_isolate))
m_counters = inspector->enableCounters();
@@ -538,16 +562,16 @@ Response V8ProfilerAgentImpl::enableRuntimeCallStats() {
return Response::Success();
}
-Response V8ProfilerAgentImpl::disableRuntimeCallStats() {
+Response V8ProfilerAgentImpl::disableCounters() {
if (m_counters) m_counters.reset();
return Response::Success();
}
-Response V8ProfilerAgentImpl::getRuntimeCallStats(
+Response V8ProfilerAgentImpl::getCounters(
std::unique_ptr<protocol::Array<protocol::Profiler::CounterInfo>>*
out_result) {
if (!m_counters)
- return Response::ServerError("RuntimeCallStats collection is not enabled.");
+ return Response::ServerError("Counters collection is not enabled.");
*out_result =
std::make_unique<protocol::Array<protocol::Profiler::CounterInfo>>();
@@ -564,6 +588,66 @@ Response V8ProfilerAgentImpl::getRuntimeCallStats(
return Response::Success();
}
+Response V8ProfilerAgentImpl::enableRuntimeCallStats() {
+ if (v8::internal::TracingFlags::runtime_stats.load()) {
+ return Response::ServerError(
+ "Runtime Call Stats collection is already enabled.");
+ }
+
+ v8::internal::TracingFlags::runtime_stats.store(true);
+ m_runtime_call_stats_enabled = true;
+
+ return Response::Success();
+}
+
+Response V8ProfilerAgentImpl::disableRuntimeCallStats() {
+ if (!v8::internal::TracingFlags::runtime_stats.load()) {
+ return Response::ServerError(
+ "Runtime Call Stats collection is not enabled.");
+ }
+
+ if (!m_runtime_call_stats_enabled) {
+ return Response::ServerError(
+ "Runtime Call Stats collection was not enabled by this session.");
+ }
+
+ v8::internal::TracingFlags::runtime_stats.store(false);
+ m_runtime_call_stats_enabled = false;
+
+ return Response::Success();
+}
+
+Response V8ProfilerAgentImpl::getRuntimeCallStats(
+ std::unique_ptr<
+ protocol::Array<protocol::Profiler::RuntimeCallCounterInfo>>*
+ out_result) {
+ if (!m_runtime_call_stats_enabled) {
+ return Response::ServerError(
+ "Runtime Call Stats collection is not enabled.");
+ }
+
+ if (!v8::internal::TracingFlags::runtime_stats.load()) {
+ return Response::ServerError(
+ "Runtime Call Stats collection was disabled outside of this session.");
+ }
+
+ *out_result = std::make_unique<
+ protocol::Array<protocol::Profiler::RuntimeCallCounterInfo>>();
+
+ v8::debug::EnumerateRuntimeCallCounters(
+ m_isolate,
+ [&](const char* name, int64_t count, v8::base::TimeDelta time) {
+ (*out_result)
+ ->emplace_back(protocol::Profiler::RuntimeCallCounterInfo::create()
+ .setName(String16(name))
+ .setValue(static_cast<double>(count))
+ .setTime(time.InSecondsF())
+ .build());
+ });
+
+ return Response::Success();
+}
+
String16 V8ProfilerAgentImpl::nextProfileId() {
return String16::fromInteger(
v8::base::Relaxed_AtomicIncrement(&s_lastProfileId, 1));
diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.h b/deps/v8/src/inspector/v8-profiler-agent-impl.h
index 0beb278845..79016727b6 100644
--- a/deps/v8/src/inspector/v8-profiler-agent-impl.h
+++ b/deps/v8/src/inspector/v8-profiler-agent-impl.h
@@ -57,10 +57,17 @@ class V8ProfilerAgentImpl : public protocol::Profiler::Backend {
std::unique_ptr<protocol::Array<protocol::Profiler::ScriptTypeProfile>>*
out_result) override;
+ Response enableCounters() override;
+ Response disableCounters() override;
+ Response getCounters(
+ std::unique_ptr<protocol::Array<protocol::Profiler::CounterInfo>>*
+ out_result) override;
+
Response enableRuntimeCallStats() override;
Response disableRuntimeCallStats() override;
Response getRuntimeCallStats(
- std::unique_ptr<protocol::Array<protocol::Profiler::CounterInfo>>*
+ std::unique_ptr<
+ protocol::Array<protocol::Profiler::RuntimeCallCounterInfo>>*
out_result) override;
void consoleProfile(const String16& title);
@@ -87,6 +94,7 @@ class V8ProfilerAgentImpl : public protocol::Profiler::Backend {
String16 m_frontendInitiatedProfileId;
int m_startedProfilesCount = 0;
std::shared_ptr<V8Inspector::Counters> m_counters;
+ bool m_runtime_call_stats_enabled = false;
DISALLOW_COPY_AND_ASSIGN(V8ProfilerAgentImpl);
};
diff --git a/deps/v8/src/inspector/value-mirror.cc b/deps/v8/src/inspector/value-mirror.cc
index 2d83002611..6bfb3dc3e4 100644
--- a/deps/v8/src/inspector/value-mirror.cc
+++ b/deps/v8/src/inspector/value-mirror.cc
@@ -54,6 +54,15 @@ ResultType unpackWasmValue(v8::Local<v8::Context> context,
return result;
}
+String16 descriptionForWasmS128(std::array<uint8_t, 16> arr) {
+ String16Builder builder;
+ for (int i = 0; i < 16; i++) {
+ builder.appendUnsignedAsHex(arr.at(i));
+ builder.append(" ");
+ }
+ return builder.toString();
+}
+
// Partial list of Wasm's ValueType, copied here to avoid including internal
// header. Using an unscoped enumeration here to allow implicit conversions from
// int. Keep in sync with ValueType::Kind in wasm/value-type.h.
@@ -176,6 +185,14 @@ Response toProtocolValue(v8::Local<v8::Context> context,
unpackWasmValue<double>(context, wasmValue->bytes()));
break;
}
+ case kS128: {
+ auto bytes = wasmValue->bytes();
+ DCHECK_EQ(16, bytes->Length());
+ auto s128 = unpackWasmValue<std::array<uint8_t, 16>>(context, bytes);
+ String16 desc = descriptionForWasmS128(s128);
+ *result = protocol::StringValue::create(desc);
+ break;
+ }
case kExternRef: {
std::unique_ptr<protocol::Value> externrefValue;
Response response = toProtocolValue(context, wasmValue->ref(), maxDepth,
@@ -525,6 +542,8 @@ class WasmValueMirror final : public ValueMirror {
return RemoteObject::SubtypeEnum::F32;
case kF64:
return RemoteObject::SubtypeEnum::F64;
+ case kS128:
+ return RemoteObject::SubtypeEnum::V128;
case kExternRef:
return RemoteObject::SubtypeEnum::Externref;
default:
@@ -553,6 +572,13 @@ class WasmValueMirror final : public ValueMirror {
return String16::fromDouble(
unpackWasmValue<double>(context, m_value->bytes()));
}
+ case kS128: {
+ *serializable = false;
+ auto bytes = m_value->bytes();
+ DCHECK_EQ(16, bytes->Length());
+ auto s128 = unpackWasmValue<std::array<uint8_t, 16>>(context, bytes);
+ return descriptionForWasmS128(s128);
+ }
case kExternRef: {
return descriptionForObject(context->GetIsolate(),
m_value->ref().As<v8::Object>());
diff --git a/deps/v8/src/interpreter/OWNERS b/deps/v8/src/interpreter/OWNERS
index cd7c1db6d0..f013999565 100644
--- a/deps/v8/src/interpreter/OWNERS
+++ b/deps/v8/src/interpreter/OWNERS
@@ -1,4 +1,3 @@
-bmeurer@chromium.org
leszeks@chromium.org
mythria@chromium.org
rmcilroy@chromium.org
diff --git a/deps/v8/src/interpreter/bytecode-array-builder.cc b/deps/v8/src/interpreter/bytecode-array-builder.cc
index 4cd43d3c99..74c2065355 100644
--- a/deps/v8/src/interpreter/bytecode-array-builder.cc
+++ b/deps/v8/src/interpreter/bytecode-array-builder.cc
@@ -13,7 +13,7 @@
#include "src/interpreter/bytecode-register-optimizer.h"
#include "src/interpreter/bytecode-source-info.h"
#include "src/interpreter/interpreter-intrinsics.h"
-#include "src/objects/objects-inl.h"
+#include "src/objects/feedback-vector-inl.h"
#include "src/objects/smi.h"
namespace v8 {
@@ -830,6 +830,13 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty(
return *this;
}
+BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedPropertyFromSuper(
+ Register object, const AstRawString* name, int feedback_slot) {
+ size_t name_index = GetConstantPoolEntry(name);
+ OutputLdaNamedPropertyFromSuper(object, name_index, feedback_slot);
+ return *this;
+}
+
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedPropertyNoFeedback(
Register object, const AstRawString* name) {
size_t name_index = GetConstantPoolEntry(name);
diff --git a/deps/v8/src/interpreter/bytecode-array-builder.h b/deps/v8/src/interpreter/bytecode-array-builder.h
index cad4f473a2..ff7e9cb21f 100644
--- a/deps/v8/src/interpreter/bytecode-array-builder.h
+++ b/deps/v8/src/interpreter/bytecode-array-builder.h
@@ -136,6 +136,10 @@ class V8_EXPORT_PRIVATE BytecodeArrayBuilder final {
BytecodeArrayBuilder& LoadNamedPropertyNoFeedback(Register object,
const AstRawString* name);
+ BytecodeArrayBuilder& LoadNamedPropertyFromSuper(Register object,
+ const AstRawString* name,
+ int feedback_slot);
+
// Keyed load property. The key should be in the accumulator.
BytecodeArrayBuilder& LoadKeyedProperty(Register object, int feedback_slot);
diff --git a/deps/v8/src/interpreter/bytecode-generator.cc b/deps/v8/src/interpreter/bytecode-generator.cc
index 87c537879c..6b29add333 100644
--- a/deps/v8/src/interpreter/bytecode-generator.cc
+++ b/deps/v8/src/interpreter/bytecode-generator.cc
@@ -860,6 +860,7 @@ class BytecodeGenerator::FeedbackSlotCache : public ZoneObject {
kStoreNamedStrict,
kStoreNamedSloppy,
kLoadProperty,
+ kLoadSuperProperty,
kLoadGlobalNotInsideTypeof,
kLoadGlobalInsideTypeof,
kClosureFeedbackCell
@@ -877,6 +878,9 @@ class BytecodeGenerator::FeedbackSlotCache : public ZoneObject {
int slot_index) {
PutImpl(slot_kind, variable_index, name, slot_index);
}
+ void Put(SlotKind slot_kind, const AstRawString* name, int slot_index) {
+ PutImpl(slot_kind, 0, name, slot_index);
+ }
int Get(SlotKind slot_kind, Variable* variable) const {
return GetImpl(slot_kind, 0, variable);
@@ -888,6 +892,9 @@ class BytecodeGenerator::FeedbackSlotCache : public ZoneObject {
const AstRawString* name) const {
return GetImpl(slot_kind, variable_index, name);
}
+ int Get(SlotKind slot_kind, const AstRawString* name) const {
+ return GetImpl(slot_kind, 0, name);
+ }
private:
using Key = std::tuple<SlotKind, int, const void*>;
@@ -2921,6 +2928,7 @@ void BytecodeGenerator::BuildCreateArrayLiteral(
// If we have a leading spread, use CreateArrayFromIterable to create
// an array from it and then add the remaining components to that array.
VisitForAccumulatorValue(*current);
+ builder()->SetExpressionPosition((*current)->AsSpread()->expression());
builder()->CreateArrayFromIterable().StoreAccumulatorInRegister(array);
if (++current != end) {
@@ -3021,6 +3029,7 @@ void BytecodeGenerator::BuildCreateArrayLiteral(
builder()->SetExpressionAsStatementPosition(
subexpr->AsSpread()->expression());
VisitForAccumulatorValue(subexpr->AsSpread()->expression());
+ builder()->SetExpressionPosition(subexpr->AsSpread()->expression());
IteratorRecord iterator = BuildGetIteratorRecord(IteratorType::kNormal);
Register value = register_allocator()->NewRegister();
@@ -3784,6 +3793,7 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment(
if (spread) {
RegisterAllocationScope scope(this);
+ BytecodeLabel is_done;
// A spread is turned into a loop over the remainer of the iterator.
Expression* target = spread->expression();
@@ -3800,6 +3810,10 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment(
feedback_index(feedback_spec()->AddLiteralSlot()));
builder()->StoreAccumulatorInRegister(array);
+ // If done, jump to assigning empty array
+ builder()->LoadAccumulatorWithRegister(done);
+ builder()->JumpIfTrue(ToBooleanMode::kConvertToBoolean, &is_done);
+
// var index = 0;
Register index = register_allocator()->NewRegister();
builder()->LoadLiteral(Smi::zero());
@@ -3817,6 +3831,7 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment(
next_value_load_slot, next_done_load_slot,
index_slot, element_slot);
+ builder()->Bind(&is_done);
// Assign the array to the LHS.
builder()->LoadAccumulatorWithRegister(array);
BuildAssignment(lhs_data, op, lookup_hoisting_mode);
@@ -4718,19 +4733,33 @@ void BytecodeGenerator::VisitNamedSuperPropertyLoad(Property* property,
RegisterAllocationScope register_scope(this);
SuperPropertyReference* super_property =
property->obj()->AsSuperPropertyReference();
- RegisterList args = register_allocator()->NewRegisterList(3);
- BuildThisVariableLoad();
- builder()->StoreAccumulatorInRegister(args[0]);
- VisitForRegisterValue(super_property->home_object(), args[1]);
+ if (FLAG_super_ic) {
+ Register receiver = register_allocator()->NewRegister();
+ BuildThisVariableLoad();
+ builder()->StoreAccumulatorInRegister(receiver);
+ VisitForAccumulatorValue(super_property->home_object());
+ builder()->SetExpressionPosition(property);
+ auto name = property->key()->AsLiteral()->AsRawPropertyName();
+ FeedbackSlot slot = GetCachedLoadSuperICSlot(name);
+ builder()->LoadNamedPropertyFromSuper(receiver, name, feedback_index(slot));
+ if (opt_receiver_out.is_valid()) {
+ builder()->MoveRegister(receiver, opt_receiver_out);
+ }
+ } else {
+ RegisterList args = register_allocator()->NewRegisterList(3);
+ BuildThisVariableLoad();
+ builder()->StoreAccumulatorInRegister(args[0]);
+ VisitForRegisterValue(super_property->home_object(), args[1]);
- builder()->SetExpressionPosition(property);
- builder()
- ->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName())
- .StoreAccumulatorInRegister(args[2])
- .CallRuntime(Runtime::kLoadFromSuper, args);
+ builder()->SetExpressionPosition(property);
+ builder()
+ ->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName())
+ .StoreAccumulatorInRegister(args[2])
+ .CallRuntime(Runtime::kLoadFromSuper, args);
- if (opt_receiver_out.is_valid()) {
- builder()->MoveRegister(args[0], opt_receiver_out);
+ if (opt_receiver_out.is_valid()) {
+ builder()->MoveRegister(args[0], opt_receiver_out);
+ }
}
}
@@ -6553,6 +6582,7 @@ FeedbackSlot BytecodeGenerator::GetCachedStoreGlobalICSlot(
FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr,
const AstRawString* name) {
+ DCHECK(!expr->IsSuperPropertyReference());
if (!FLAG_ignition_share_named_property_feedback) {
return feedback_spec()->AddLoadICSlot();
}
@@ -6573,6 +6603,23 @@ FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr,
return slot;
}
+FeedbackSlot BytecodeGenerator::GetCachedLoadSuperICSlot(
+ const AstRawString* name) {
+ if (!FLAG_ignition_share_named_property_feedback) {
+ return feedback_spec()->AddLoadICSlot();
+ }
+ FeedbackSlotCache::SlotKind slot_kind =
+ FeedbackSlotCache::SlotKind::kLoadSuperProperty;
+
+ FeedbackSlot slot(feedback_slot_cache()->Get(slot_kind, name));
+ if (!slot.IsInvalid()) {
+ return slot;
+ }
+ slot = feedback_spec()->AddLoadICSlot();
+ feedback_slot_cache()->Put(slot_kind, name, feedback_index(slot));
+ return slot;
+}
+
FeedbackSlot BytecodeGenerator::GetCachedStoreICSlot(const Expression* expr,
const AstRawString* name) {
if (!FLAG_ignition_share_named_property_feedback) {
diff --git a/deps/v8/src/interpreter/bytecode-generator.h b/deps/v8/src/interpreter/bytecode-generator.h
index 2b11e721fa..93c422dcb7 100644
--- a/deps/v8/src/interpreter/bytecode-generator.h
+++ b/deps/v8/src/interpreter/bytecode-generator.h
@@ -422,6 +422,7 @@ class BytecodeGenerator final : public AstVisitor<BytecodeGenerator> {
Variable* variable);
FeedbackSlot GetCachedLoadICSlot(const Expression* expr,
const AstRawString* name);
+ FeedbackSlot GetCachedLoadSuperICSlot(const AstRawString* name);
FeedbackSlot GetCachedStoreICSlot(const Expression* expr,
const AstRawString* name);
FeedbackSlot GetDummyCompareICSlot();
diff --git a/deps/v8/src/interpreter/bytecode-register.cc b/deps/v8/src/interpreter/bytecode-register.cc
index 4e56c3b411..13d831e8b7 100644
--- a/deps/v8/src/interpreter/bytecode-register.cc
+++ b/deps/v8/src/interpreter/bytecode-register.cc
@@ -37,7 +37,7 @@ static const int kBytecodeOffsetRegisterIndex =
kSystemPointerSize;
static const int kCallerPCOffsetRegisterIndex =
(InterpreterFrameConstants::kRegisterFileFromFp -
- InterpreterFrameConstants::kCallerPCOffsetFromFp) /
+ InterpreterFrameConstants::kCallerPCOffset) /
kSystemPointerSize;
Register Register::FromParameterIndex(int index, int parameter_count) {
diff --git a/deps/v8/src/interpreter/bytecodes.h b/deps/v8/src/interpreter/bytecodes.h
index 0b638418d1..fe22559f18 100644
--- a/deps/v8/src/interpreter/bytecodes.h
+++ b/deps/v8/src/interpreter/bytecodes.h
@@ -100,6 +100,8 @@ namespace interpreter {
OperandType::kIdx, OperandType::kIdx) \
V(LdaNamedPropertyNoFeedback, AccumulatorUse::kWrite, OperandType::kReg, \
OperandType::kIdx) \
+ V(LdaNamedPropertyFromSuper, AccumulatorUse::kReadWrite, OperandType::kReg, \
+ OperandType::kIdx, OperandType::kIdx) \
V(LdaKeyedProperty, AccumulatorUse::kReadWrite, OperandType::kReg, \
OperandType::kIdx) \
\
diff --git a/deps/v8/src/interpreter/interpreter-generator.cc b/deps/v8/src/interpreter/interpreter-generator.cc
index c4ca458a88..b3ca4a1b9c 100644
--- a/deps/v8/src/interpreter/interpreter-generator.cc
+++ b/deps/v8/src/interpreter/interpreter-generator.cc
@@ -27,7 +27,7 @@
#include "src/objects/shared-function-info.h"
#include "src/objects/source-text-module.h"
#include "src/utils/ostreams.h"
-#include "torque-generated/exported-macros-assembler-tq.h"
+#include "torque-generated/exported-macros-assembler.h"
namespace v8 {
namespace internal {
@@ -539,9 +539,10 @@ IGNITION_HANDLER(LdaNamedProperty, InterpreterAssembler) {
}
}
-// LdaPropertyNofeedback <object> <slot>
+// LdaNamedPropertyNoFeedback <object> <name_index>
//
-// Calls the GetProperty builtin for <object> and the key in the accumulator.
+// Calls the GetProperty builtin for <object> and the name at
+// constant pool entry <name_index>.
IGNITION_HANDLER(LdaNamedPropertyNoFeedback, InterpreterAssembler) {
TNode<Object> object = LoadRegisterAtOperandIndex(0);
TNode<Name> name = CAST(LoadConstantPoolEntryAtOperandIndex(1));
@@ -552,7 +553,28 @@ IGNITION_HANDLER(LdaNamedPropertyNoFeedback, InterpreterAssembler) {
Dispatch();
}
-// KeyedLoadIC <object> <slot>
+// LdaNamedPropertyFromSuper <receiver> <name_index> <slot>
+//
+// Calls the LoadSuperIC at FeedBackVector slot <slot> for <receiver>, home
+// object's prototype (home object in the accumulator) and the name at constant
+// pool entry <name_index>.
+IGNITION_HANDLER(LdaNamedPropertyFromSuper, InterpreterAssembler) {
+ TNode<Object> receiver = LoadRegisterAtOperandIndex(0);
+ TNode<HeapObject> home_object = CAST(GetAccumulator());
+ TNode<Object> home_object_prototype = LoadMapPrototype(LoadMap(home_object));
+ TNode<Object> name = LoadConstantPoolEntryAtOperandIndex(1);
+ TNode<TaggedIndex> slot = BytecodeOperandIdxTaggedIndex(2);
+ TNode<HeapObject> feedback_vector = LoadFeedbackVector();
+ TNode<Context> context = GetContext();
+
+ TNode<Object> result =
+ CallBuiltin(Builtins::kLoadSuperIC, context, receiver,
+ home_object_prototype, name, slot, feedback_vector);
+ SetAccumulator(result);
+ Dispatch();
+}
+
+// LdaKeyedProperty <object> <slot>
//
// Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
// in the accumulator.
@@ -684,7 +706,7 @@ IGNITION_HANDLER(StaInArrayLiteral, InterpreterAssembler) {
Dispatch();
}
-// StaDataPropertyInLiteral <object> <name> <flags>
+// StaDataPropertyInLiteral <object> <name> <flags> <slot>
//
// Define a property <name> with value from the accumulator in <object>.
// Property attributes and whether set_function_name are stored in
diff --git a/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc b/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc
index f67e78b3b2..03ca61de52 100644
--- a/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc
+++ b/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc
@@ -213,7 +213,7 @@ TNode<Object> IntrinsicsGenerator::HasProperty(
args, context, Builtins::CallableFor(isolate(), Builtins::kHasProperty));
}
-TNode<Object> IntrinsicsGenerator::ToStringRT(
+TNode<Object> IntrinsicsGenerator::ToString(
const InterpreterAssembler::RegListNodePair& args, TNode<Context> context) {
return IntrinsicAsStubCall(
args, context, Builtins::CallableFor(isolate(), Builtins::kToString));
diff --git a/deps/v8/src/interpreter/interpreter-intrinsics.h b/deps/v8/src/interpreter/interpreter-intrinsics.h
index 6cb2483533..07c60270c2 100644
--- a/deps/v8/src/interpreter/interpreter-intrinsics.h
+++ b/deps/v8/src/interpreter/interpreter-intrinsics.h
@@ -36,7 +36,7 @@ namespace interpreter {
V(IsArray, is_array, 1) \
V(IsJSReceiver, is_js_receiver, 1) \
V(IsSmi, is_smi, 1) \
- V(ToStringRT, to_string, 1) \
+ V(ToString, to_string, 1) \
V(ToLength, to_length, 1) \
V(ToObject, to_object, 1)
diff --git a/deps/v8/src/interpreter/interpreter.cc b/deps/v8/src/interpreter/interpreter.cc
index 9707ef60ce..28dd10a576 100644
--- a/deps/v8/src/interpreter/interpreter.cc
+++ b/deps/v8/src/interpreter/interpreter.cc
@@ -250,7 +250,7 @@ InterpreterCompilationJob::Status InterpreterCompilationJob::DoFinalizeJobImpl(
SourcePositionTableBuilder::RecordingMode::RECORD_SOURCE_POSITIONS) {
Handle<ByteArray> source_position_table =
generator()->FinalizeSourcePositionTable(isolate);
- bytecodes->set_source_position_table(*source_position_table);
+ bytecodes->set_synchronized_source_position_table(*source_position_table);
}
if (ShouldPrintBytecode(shared_info)) {
@@ -286,7 +286,7 @@ Interpreter::NewSourcePositionCollectionJob(
auto job = std::make_unique<InterpreterCompilationJob>(parse_info, literal,
allocator, nullptr);
job->compilation_info()->SetBytecodeArray(existing_bytecode);
- return std::unique_ptr<UnoptimizedCompilationJob> { static_cast<UnoptimizedCompilationJob*>(job.release()) };
+ return job;
}
void Interpreter::ForEachBytecode(
diff --git a/deps/v8/src/libplatform/OWNERS b/deps/v8/src/libplatform/OWNERS
index 8c766ab282..7ec6602147 100644
--- a/deps/v8/src/libplatform/OWNERS
+++ b/deps/v8/src/libplatform/OWNERS
@@ -1,3 +1,4 @@
mlippautz@chromium.org
+ulan@chromium.org
# COMPONENT: Blink>JavaScript>API
diff --git a/deps/v8/src/libplatform/default-job.cc b/deps/v8/src/libplatform/default-job.cc
index 7f750f185f..728c1f5b28 100644
--- a/deps/v8/src/libplatform/default-job.cc
+++ b/deps/v8/src/libplatform/default-job.cc
@@ -4,8 +4,38 @@
#include "src/libplatform/default-job.h"
+#include "src/base/bits.h"
+#include "src/base/macros.h"
+
namespace v8 {
namespace platform {
+namespace {
+
+// Capped to allow assigning task_ids from a bitfield.
+constexpr size_t kMaxWorkersPerJob = 32;
+
+} // namespace
+
+DefaultJobState::JobDelegate::~JobDelegate() {
+ static_assert(kInvalidTaskId >= kMaxWorkersPerJob,
+ "kInvalidTaskId must be outside of the range of valid task_ids "
+ "[0, kMaxWorkersPerJob)");
+ if (task_id_ != kInvalidTaskId) outer_->ReleaseTaskId(task_id_);
+}
+
+uint8_t DefaultJobState::JobDelegate::GetTaskId() {
+ if (task_id_ == kInvalidTaskId) task_id_ = outer_->AcquireTaskId();
+ return task_id_;
+}
+
+DefaultJobState::DefaultJobState(Platform* platform,
+ std::unique_ptr<JobTask> job_task,
+ TaskPriority priority,
+ size_t num_worker_threads)
+ : platform_(platform),
+ job_task_(std::move(job_task)),
+ priority_(priority),
+ num_worker_threads_(std::min(num_worker_threads, kMaxWorkersPerJob)) {}
DefaultJobState::~DefaultJobState() { DCHECK_EQ(0U, active_workers_); }
@@ -13,22 +43,55 @@ void DefaultJobState::NotifyConcurrencyIncrease() {
if (is_canceled_.load(std::memory_order_relaxed)) return;
size_t num_tasks_to_post = 0;
+ TaskPriority priority;
{
base::MutexGuard guard(&mutex_);
- const size_t max_concurrency = CappedMaxConcurrency();
+ const size_t max_concurrency = CappedMaxConcurrency(active_workers_);
// Consider |pending_tasks_| to avoid posting too many tasks.
if (max_concurrency > (active_workers_ + pending_tasks_)) {
num_tasks_to_post = max_concurrency - active_workers_ - pending_tasks_;
pending_tasks_ += num_tasks_to_post;
}
+ priority = priority_;
}
// Post additional worker tasks to reach |max_concurrency|.
for (size_t i = 0; i < num_tasks_to_post; ++i) {
- CallOnWorkerThread(std::make_unique<DefaultJobWorker>(shared_from_this(),
- job_task_.get()));
+ CallOnWorkerThread(priority, std::make_unique<DefaultJobWorker>(
+ shared_from_this(), job_task_.get()));
}
}
+uint8_t DefaultJobState::AcquireTaskId() {
+ static_assert(kMaxWorkersPerJob <= sizeof(assigned_task_ids_) * 8,
+ "TaskId bitfield isn't big enough to fit kMaxWorkersPerJob.");
+ uint32_t assigned_task_ids =
+ assigned_task_ids_.load(std::memory_order_relaxed);
+ DCHECK_LE(v8::base::bits::CountPopulation(assigned_task_ids) + 1,
+ kMaxWorkersPerJob);
+ uint32_t new_assigned_task_ids = 0;
+ uint8_t task_id = 0;
+ // memory_order_acquire on success, matched with memory_order_release in
+ // ReleaseTaskId() so that operations done by previous threads that had
+ // the same task_id become visible to the current thread.
+ do {
+ // Count trailing one bits. This is the id of the right-most 0-bit in
+ // |assigned_task_ids|.
+ task_id = v8::base::bits::CountTrailingZeros32(~assigned_task_ids);
+ new_assigned_task_ids = assigned_task_ids | (uint32_t(1) << task_id);
+ } while (!assigned_task_ids_.compare_exchange_weak(
+ assigned_task_ids, new_assigned_task_ids, std::memory_order_acquire,
+ std::memory_order_relaxed));
+ return task_id;
+}
+
+void DefaultJobState::ReleaseTaskId(uint8_t task_id) {
+ // memory_order_release to match AcquireTaskId().
+ uint32_t previous_task_ids = assigned_task_ids_.fetch_and(
+ ~(uint32_t(1) << task_id), std::memory_order_release);
+ DCHECK(previous_task_ids & (uint32_t(1) << task_id));
+ USE(previous_task_ids);
+}
+
void DefaultJobState::Join() {
bool can_run = false;
{
@@ -41,8 +104,9 @@ void DefaultJobState::Join() {
++active_workers_;
can_run = WaitForParticipationOpportunityLockRequired();
}
+ DefaultJobState::JobDelegate delegate(this, true);
while (can_run) {
- job_task_->Run(this);
+ job_task_->Run(&delegate);
base::MutexGuard guard(&mutex_);
can_run = WaitForParticipationOpportunityLockRequired();
}
@@ -58,12 +122,18 @@ void DefaultJobState::CancelAndWait() {
}
}
+bool DefaultJobState::IsCompleted() {
+ base::MutexGuard guard(&mutex_);
+ return job_task_->GetMaxConcurrency(active_workers_) == 0 &&
+ active_workers_ == 0;
+}
+
bool DefaultJobState::CanRunFirstTask() {
base::MutexGuard guard(&mutex_);
--pending_tasks_;
if (is_canceled_.load(std::memory_order_relaxed)) return false;
- if (active_workers_ >=
- std::min(job_task_->GetMaxConcurrency(), num_worker_threads_)) {
+ if (active_workers_ >= std::min(job_task_->GetMaxConcurrency(active_workers_),
+ num_worker_threads_)) {
return false;
}
// Acquire current worker.
@@ -73,9 +143,10 @@ bool DefaultJobState::CanRunFirstTask() {
bool DefaultJobState::DidRunTask() {
size_t num_tasks_to_post = 0;
+ TaskPriority priority;
{
base::MutexGuard guard(&mutex_);
- const size_t max_concurrency = CappedMaxConcurrency();
+ const size_t max_concurrency = CappedMaxConcurrency(active_workers_ - 1);
if (is_canceled_.load(std::memory_order_relaxed) ||
active_workers_ > max_concurrency) {
// Release current worker and notify.
@@ -88,6 +159,7 @@ bool DefaultJobState::DidRunTask() {
num_tasks_to_post = max_concurrency - active_workers_ - pending_tasks_;
pending_tasks_ += num_tasks_to_post;
}
+ priority = priority_;
}
// Post additional worker tasks to reach |max_concurrency| in the case that
// max concurrency increased. This is not strictly necessary, since
@@ -95,17 +167,17 @@ bool DefaultJobState::DidRunTask() {
// users of PostJob() batch work and tend to call NotifyConcurrencyIncrease()
// late. Posting here allows us to spawn new workers sooner.
for (size_t i = 0; i < num_tasks_to_post; ++i) {
- CallOnWorkerThread(std::make_unique<DefaultJobWorker>(shared_from_this(),
- job_task_.get()));
+ CallOnWorkerThread(priority, std::make_unique<DefaultJobWorker>(
+ shared_from_this(), job_task_.get()));
}
return true;
}
bool DefaultJobState::WaitForParticipationOpportunityLockRequired() {
- size_t max_concurrency = CappedMaxConcurrency();
+ size_t max_concurrency = CappedMaxConcurrency(active_workers_ - 1);
while (active_workers_ > max_concurrency && active_workers_ > 1) {
worker_released_condition_.Wait(&mutex_);
- max_concurrency = CappedMaxConcurrency();
+ max_concurrency = CappedMaxConcurrency(active_workers_ - 1);
}
if (active_workers_ <= max_concurrency) return true;
DCHECK_EQ(1U, active_workers_);
@@ -115,12 +187,14 @@ bool DefaultJobState::WaitForParticipationOpportunityLockRequired() {
return false;
}
-size_t DefaultJobState::CappedMaxConcurrency() const {
- return std::min(job_task_->GetMaxConcurrency(), num_worker_threads_);
+size_t DefaultJobState::CappedMaxConcurrency(size_t worker_count) const {
+ return std::min(job_task_->GetMaxConcurrency(worker_count),
+ num_worker_threads_);
}
-void DefaultJobState::CallOnWorkerThread(std::unique_ptr<Task> task) {
- switch (priority_) {
+void DefaultJobState::CallOnWorkerThread(TaskPriority priority,
+ std::unique_ptr<Task> task) {
+ switch (priority) {
case TaskPriority::kBestEffort:
return platform_->CallLowPriorityTaskOnWorkerThread(std::move(task));
case TaskPriority::kUserVisible:
@@ -146,5 +220,7 @@ void DefaultJobHandle::Cancel() {
state_ = nullptr;
}
+bool DefaultJobHandle::IsCompleted() { return state_->IsCompleted(); }
+
} // namespace platform
} // namespace v8
diff --git a/deps/v8/src/libplatform/default-job.h b/deps/v8/src/libplatform/default-job.h
index 2eb00cbd74..15517f49ac 100644
--- a/deps/v8/src/libplatform/default-job.h
+++ b/deps/v8/src/libplatform/default-job.h
@@ -17,25 +17,44 @@ namespace v8 {
namespace platform {
class V8_PLATFORM_EXPORT DefaultJobState
- : NON_EXPORTED_BASE(public JobDelegate),
- public std::enable_shared_from_this<DefaultJobState> {
+ : public std::enable_shared_from_this<DefaultJobState> {
public:
+ class JobDelegate : public v8::JobDelegate {
+ public:
+ explicit JobDelegate(DefaultJobState* outer, bool is_joining_thread = false)
+ : outer_(outer), is_joining_thread_(is_joining_thread) {}
+ ~JobDelegate();
+
+ void NotifyConcurrencyIncrease() override {
+ outer_->NotifyConcurrencyIncrease();
+ }
+ bool ShouldYield() override {
+ // Thread-safe but may return an outdated result.
+ return outer_->is_canceled_.load(std::memory_order_relaxed);
+ }
+ uint8_t GetTaskId() override;
+ bool IsJoiningThread() const override { return is_joining_thread_; }
+
+ private:
+ static constexpr uint8_t kInvalidTaskId =
+ std::numeric_limits<uint8_t>::max();
+
+ DefaultJobState* outer_;
+ uint8_t task_id_ = kInvalidTaskId;
+ bool is_joining_thread_;
+ };
+
DefaultJobState(Platform* platform, std::unique_ptr<JobTask> job_task,
- TaskPriority priority, size_t num_worker_threads)
- : platform_(platform),
- job_task_(std::move(job_task)),
- priority_(priority),
- num_worker_threads_(num_worker_threads) {}
+ TaskPriority priority, size_t num_worker_threads);
virtual ~DefaultJobState();
- void NotifyConcurrencyIncrease() override;
- bool ShouldYield() override {
- // Thread-safe but may return an outdated result.
- return is_canceled_.load(std::memory_order_relaxed);
- }
+ void NotifyConcurrencyIncrease();
+ uint8_t AcquireTaskId();
+ void ReleaseTaskId(uint8_t task_id);
void Join();
void CancelAndWait();
+ bool IsCompleted();
// Must be called before running |job_task_| for the first time. If it returns
// true, then the worker thread must contribute and must call DidRunTask(), or
@@ -55,9 +74,9 @@ class V8_PLATFORM_EXPORT DefaultJobState
// Returns GetMaxConcurrency() capped by the number of threads used by this
// job.
- size_t CappedMaxConcurrency() const;
+ size_t CappedMaxConcurrency(size_t worker_count) const;
- void CallOnWorkerThread(std::unique_ptr<Task> task);
+ void CallOnWorkerThread(TaskPriority priority, std::unique_ptr<Task> task);
Platform* const platform_;
std::unique_ptr<JobTask> job_task_;
@@ -75,6 +94,8 @@ class V8_PLATFORM_EXPORT DefaultJobState
size_t num_worker_threads_;
// Signaled when a worker returns.
base::ConditionVariable worker_released_condition_;
+
+ std::atomic<uint32_t> assigned_task_ids_{0};
};
class V8_PLATFORM_EXPORT DefaultJobHandle : public JobHandle {
@@ -88,6 +109,7 @@ class V8_PLATFORM_EXPORT DefaultJobHandle : public JobHandle {
void Join() override;
void Cancel() override;
+ bool IsCompleted() override;
bool IsRunning() override { return state_ != nullptr; }
private:
@@ -105,9 +127,10 @@ class DefaultJobWorker : public Task {
void Run() override {
auto shared_state = state_.lock();
if (!shared_state) return;
+ DefaultJobState::JobDelegate delegate(shared_state.get());
if (!shared_state->CanRunFirstTask()) return;
do {
- job_task_->Run(shared_state.get());
+ job_task_->Run(&delegate);
} while (shared_state->DidRunTask());
}
diff --git a/deps/v8/src/libsampler/sampler.cc b/deps/v8/src/libsampler/sampler.cc
index 0443657d1e..9631d2f478 100644
--- a/deps/v8/src/libsampler/sampler.cc
+++ b/deps/v8/src/libsampler/sampler.cc
@@ -227,6 +227,7 @@ void SamplerManager::RemoveSampler(Sampler* sampler) {
void SamplerManager::DoSample(const v8::RegisterState& state) {
AtomicGuard atomic_guard(&samplers_access_counter_, false);
+ // TODO(petermarshall): Add stat counters for the bailouts here.
if (!atomic_guard.is_success()) return;
pthread_t thread_id = pthread_self();
auto it = sampler_map_.find(thread_id);
@@ -238,7 +239,6 @@ void SamplerManager::DoSample(const v8::RegisterState& state) {
Isolate* isolate = sampler->isolate();
// We require a fully initialized and entered isolate.
if (isolate == nullptr || !isolate->IsInUse()) continue;
- if (v8::Locker::IsActive() && !Locker::IsLocked(isolate)) continue;
sampler->SampleStack(state);
}
}
diff --git a/deps/v8/src/logging/code-events.h b/deps/v8/src/logging/code-events.h
index f27b0d16e5..b3fb960052 100644
--- a/deps/v8/src/logging/code-events.h
+++ b/deps/v8/src/logging/code-events.h
@@ -94,7 +94,6 @@ class CodeEventListener {
// Not handlified as this happens during GC. No allocation allowed.
virtual void CodeMoveEvent(AbstractCode from, AbstractCode to) = 0;
virtual void SharedFunctionInfoMoveEvent(Address from, Address to) = 0;
- virtual void NativeContextMoveEvent(Address from, Address to) = 0;
virtual void CodeMovingGCEvent() = 0;
virtual void CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) = 0;
@@ -205,11 +204,6 @@ class CodeEventDispatcher : public CodeEventListener {
listener->SharedFunctionInfoMoveEvent(from, to);
});
}
- void NativeContextMoveEvent(Address from, Address to) override {
- DispatchEventToListeners([=](CodeEventListener* listener) {
- listener->NativeContextMoveEvent(from, to);
- });
- }
void CodeMovingGCEvent() override {
DispatchEventToListeners(
[](CodeEventListener* listener) { listener->CodeMovingGCEvent(); });
diff --git a/deps/v8/src/logging/counters.cc b/deps/v8/src/logging/counters.cc
index 386bb8a75a..986848361e 100644
--- a/deps/v8/src/logging/counters.cc
+++ b/deps/v8/src/logging/counters.cc
@@ -557,6 +557,17 @@ void RuntimeCallStats::Print(std::ostream& os) {
entries.Print(os);
}
+void RuntimeCallStats::EnumerateCounters(
+ debug::RuntimeCallCounterCallback callback) {
+ if (current_timer_.Value() != nullptr) {
+ current_timer_.Value()->Snapshot();
+ }
+ for (int i = 0; i < kNumberOfCounters; i++) {
+ RuntimeCallCounter* counter = GetCounter(i);
+ callback(counter->name(), counter->count(), counter->time());
+ }
+}
+
void RuntimeCallStats::Reset() {
if (V8_LIKELY(!TracingFlags::is_runtime_stats_enabled())) return;
diff --git a/deps/v8/src/logging/counters.h b/deps/v8/src/logging/counters.h
index de583dde82..b1b61aca0a 100644
--- a/deps/v8/src/logging/counters.h
+++ b/deps/v8/src/logging/counters.h
@@ -13,6 +13,7 @@
#include "src/base/platform/elapsed-timer.h"
#include "src/base/platform/time.h"
#include "src/common/globals.h"
+#include "src/debug/debug-interface.h"
#include "src/execution/isolate.h"
#include "src/init/heap-symbols.h"
#include "src/logging/counters-definitions.h"
@@ -926,7 +927,6 @@ class RuntimeCallTimer final {
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MachineOperatorOptimization) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MeetRegisterConstraints) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MemoryOptimization) \
- ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MergeSplinteredRanges) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, OptimizeMoves) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, PopulatePointerMaps) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, PrintGraph) \
@@ -938,7 +938,6 @@ class RuntimeCallTimer final {
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, Scheduling) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SelectInstructions) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SimplifiedLowering) \
- ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SplinterLiveRanges) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, StoreStoreElimination) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, TypeAssertions) \
ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, TypedLowering) \
@@ -1146,6 +1145,9 @@ class RuntimeCallStats final {
V8_EXPORT_PRIVATE void Print();
V8_NOINLINE void Dump(v8::tracing::TracedValue* value);
+ V8_EXPORT_PRIVATE void EnumerateCounters(
+ debug::RuntimeCallCounterCallback callback);
+
ThreadId thread_id() const { return thread_id_; }
RuntimeCallTimer* current_timer() { return current_timer_.Value(); }
RuntimeCallCounter* current_counter() { return current_counter_.Value(); }
diff --git a/deps/v8/src/logging/log-utils.cc b/deps/v8/src/logging/log-utils.cc
index 8d21d5f329..aaf7a37618 100644
--- a/deps/v8/src/logging/log-utils.cc
+++ b/deps/v8/src/logging/log-utils.cc
@@ -4,6 +4,10 @@
#include "src/logging/log-utils.h"
+#include <atomic>
+#include <memory>
+
+#include "src/base/platform/mutex.h"
#include "src/base/platform/platform.h"
#include "src/common/assert-scope.h"
#include "src/objects/objects-inl.h"
@@ -15,43 +19,43 @@
namespace v8 {
namespace internal {
-const char* const Log::kLogToTemporaryFile = "&";
+const char* const Log::kLogToTemporaryFile = "+";
const char* const Log::kLogToConsole = "-";
// static
-FILE* Log::CreateOutputHandle(const char* file_name) {
+FILE* Log::CreateOutputHandle(std::string file_name) {
// If we're logging anything, we need to open the log file.
if (!Log::InitLogAtStart()) {
return nullptr;
- } else if (strcmp(file_name, kLogToConsole) == 0) {
+ } else if (Log::IsLoggingToConsole(file_name)) {
return stdout;
- } else if (strcmp(file_name, kLogToTemporaryFile) == 0) {
+ } else if (Log::IsLoggingToTemporaryFile(file_name)) {
return base::OS::OpenTemporaryFile();
} else {
- return base::OS::FOpen(file_name, base::OS::LogFileOpenMode);
+ return base::OS::FOpen(file_name.c_str(), base::OS::LogFileOpenMode);
}
}
-Log::Log(Logger* logger, const char* file_name)
- : is_stopped_(false),
+// static
+bool Log::IsLoggingToConsole(std::string file_name) {
+ return file_name.compare(Log::kLogToConsole) == 0;
+}
+
+// static
+bool Log::IsLoggingToTemporaryFile(std::string file_name) {
+ return file_name.compare(Log::kLogToTemporaryFile) == 0;
+}
+
+Log::Log(Logger* logger, std::string file_name)
+ : logger_(logger),
+ file_name_(file_name),
output_handle_(Log::CreateOutputHandle(file_name)),
os_(output_handle_ == nullptr ? stdout : output_handle_),
- format_buffer_(NewArray<char>(kMessageBufferSize)),
- logger_(logger) {
- // --log-all enables all the log flags.
- if (FLAG_log_all) {
- FLAG_log_api = true;
- FLAG_log_code = true;
- FLAG_log_suspect = true;
- FLAG_log_handles = true;
- FLAG_log_internal_timer_events = true;
- FLAG_log_function_events = true;
- }
-
- // --prof implies --log-code.
- if (FLAG_prof) FLAG_log_code = true;
+ format_buffer_(NewArray<char>(kMessageBufferSize)) {
+ if (output_handle_) WriteLogHeader();
+}
- if (output_handle_ == nullptr) return;
+void Log::WriteLogHeader() {
Log::MessageBuilder msg(this);
LogSeparator kNext = LogSeparator::kSeparator;
msg << "v8-version" << kNext << Version::GetMajor() << kNext
@@ -64,26 +68,37 @@ Log::Log(Logger* logger, const char* file_name)
msg.WriteToLogFile();
}
+std::unique_ptr<Log::MessageBuilder> Log::NewMessageBuilder() {
+ // Fast check of is_logging() without taking the lock. Bail out immediately if
+ // logging isn't enabled.
+ if (!logger_->is_logging()) return {};
+
+ std::unique_ptr<Log::MessageBuilder> result(new Log::MessageBuilder(this));
+
+ // The first invocation of is_logging() might still read an old value. It is
+ // fine if a background thread starts logging a bit later, but we want to
+ // avoid background threads continue logging after logging was already closed.
+ if (!logger_->is_logging()) return {};
+ DCHECK_NOT_NULL(format_buffer_.get());
+
+ return result;
+}
+
FILE* Log::Close() {
FILE* result = nullptr;
if (output_handle_ != nullptr) {
- if (strcmp(FLAG_logfile, kLogToTemporaryFile) != 0) {
- fclose(output_handle_);
- } else {
- result = output_handle_;
- }
+ fflush(output_handle_);
+ result = output_handle_;
}
output_handle_ = nullptr;
-
format_buffer_.reset();
-
- is_stopped_ = false;
return result;
}
+std::string Log::file_name() const { return file_name_; }
+
Log::MessageBuilder::MessageBuilder(Log* log)
: log_(log), lock_guard_(&log_->mutex_) {
- DCHECK_NOT_NULL(log_->format_buffer_.get());
}
void Log::MessageBuilder::AppendString(String str,
@@ -113,12 +128,19 @@ void Log::MessageBuilder::AppendString(const char* str) {
AppendString(str, strlen(str));
}
-void Log::MessageBuilder::AppendString(const char* str, size_t length) {
+void Log::MessageBuilder::AppendString(const char* str, size_t length,
+ bool is_one_byte) {
if (str == nullptr) return;
-
- for (size_t i = 0; i < length; i++) {
- DCHECK_NE(str[i], '\0');
- AppendCharacter(str[i]);
+ if (is_one_byte) {
+ for (size_t i = 0; i < length; i++) {
+ DCHECK_IMPLIES(is_one_byte, str[i] != '\0');
+ AppendCharacter(str[i]);
+ }
+ } else {
+ DCHECK_EQ(length % 2, 0);
+ for (size_t i = 0; i + 1 < length; i += 2) {
+ AppendTwoByteCharacter(str[i], str[i + 1]);
+ }
}
}
@@ -133,6 +155,14 @@ void Log::MessageBuilder::AppendFormatString(const char* format, ...) {
}
}
+void Log::MessageBuilder::AppendTwoByteCharacter(char c1, char c2) {
+ if (c2 == 0) {
+ AppendCharacter(c1);
+ } else {
+ // Escape non-printable characters.
+ AppendRawFormatString("\\u%02x%02x", c1 & 0xFF, c2 & 0xFF);
+ }
+}
void Log::MessageBuilder::AppendCharacter(char c) {
if (c >= 32 && c <= 126) {
if (c == ',') {
@@ -206,7 +236,9 @@ void Log::MessageBuilder::AppendRawFormatString(const char* format, ...) {
void Log::MessageBuilder::AppendRawCharacter(char c) { log_->os_ << c; }
-void Log::MessageBuilder::WriteToLogFile() { log_->os_ << std::endl; }
+void Log::MessageBuilder::WriteToLogFile() {
+ log_->os_ << std::endl;
+}
template <>
Log::MessageBuilder& Log::MessageBuilder::operator<<<const char*>(
diff --git a/deps/v8/src/logging/log-utils.h b/deps/v8/src/logging/log-utils.h
index 14395de84e..47abf927f1 100644
--- a/deps/v8/src/logging/log-utils.h
+++ b/deps/v8/src/logging/log-utils.h
@@ -7,7 +7,9 @@
#include <stdio.h>
+#include <atomic>
#include <cstdarg>
+#include <memory>
#include "src/base/compiler-specific.h"
#include "src/base/optional.h"
@@ -28,26 +30,26 @@ enum class LogSeparator { kSeparator };
// Functions and data for performing output of log messages.
class Log {
public:
- Log(Logger* log, const char* log_file_name);
- // Disables logging, but preserves acquired resources.
- void stop() { is_stopped_ = true; }
+ explicit Log(Logger* logger, std::string log_file_name);
static bool InitLogAtStart() {
- return FLAG_log || FLAG_log_api || FLAG_log_code || FLAG_log_handles ||
- FLAG_log_suspect || FLAG_ll_prof || FLAG_perf_basic_prof ||
- FLAG_perf_prof || FLAG_log_source_code || FLAG_gdbjit ||
- FLAG_log_internal_timer_events || FLAG_prof_cpp || FLAG_trace_ic ||
- FLAG_log_function_events || FLAG_trace_zone_stats ||
+ return FLAG_log || FLAG_log_all || FLAG_log_api || FLAG_log_code ||
+ FLAG_log_handles || FLAG_log_suspect || FLAG_ll_prof ||
+ FLAG_perf_basic_prof || FLAG_perf_prof || FLAG_log_source_code ||
+ FLAG_gdbjit || FLAG_log_internal_timer_events || FLAG_prof_cpp ||
+ FLAG_trace_ic || FLAG_log_function_events || FLAG_trace_zone_stats ||
FLAG_turbo_profiling_log_builtins;
}
+ V8_EXPORT_PRIVATE static bool IsLoggingToConsole(std::string file_name);
+ V8_EXPORT_PRIVATE static bool IsLoggingToTemporaryFile(std::string file_name);
+
// Frees all resources acquired in Initialize and Open... functions.
// When a temporary file is used for the log, returns its stream descriptor,
// leaving the file open.
FILE* Close();
- // Returns whether logging is enabled.
- bool IsEnabled() { return !is_stopped_ && output_handle_ != nullptr; }
+ std::string file_name() const;
// Size of buffer used for formatting log messages.
static const int kMessageBufferSize = 2048;
@@ -61,18 +63,16 @@ class Log {
// and then appends them to the static buffer in Log.
class MessageBuilder {
public:
- // Create a message builder starting from position 0.
- // This acquires the mutex in the log as well.
- explicit MessageBuilder(Log* log);
~MessageBuilder() = default;
void AppendString(String str,
base::Optional<int> length_limit = base::nullopt);
void AppendString(Vector<const char> str);
void AppendString(const char* str);
- void AppendString(const char* str, size_t length);
+ void AppendString(const char* str, size_t length, bool is_one_byte = true);
void PRINTF_FORMAT(2, 3) AppendFormatString(const char* format, ...);
void AppendCharacter(char c);
+ void AppendTwoByteCharacter(char c1, char c2);
void AppendSymbolName(Symbol symbol);
// Delegate insertion to the underlying {log_}.
@@ -87,6 +87,10 @@ class Log {
void WriteToLogFile();
private:
+ // Create a message builder starting from position 0.
+ // This acquires the mutex in the log as well.
+ explicit MessageBuilder(Log* log);
+
// Prints the format string into |log_->format_buffer_|. Returns the length
// of the result, or kMessageBufferSize if it was truncated.
int PRINTF_FORMAT(2, 0)
@@ -99,25 +103,28 @@ class Log {
Log* log_;
base::MutexGuard lock_guard_;
+
+ friend class Log;
};
+ // Use this method to create an instance of Log::MessageBuilder. This method
+ // will return null if logging is disabled.
+ std::unique_ptr<Log::MessageBuilder> NewMessageBuilder();
+
private:
- static FILE* CreateOutputHandle(const char* file_name);
-
- // Implementation of writing to a log file.
- int WriteToFile(const char* msg, int length) {
- DCHECK_NOT_NULL(output_handle_);
- os_.write(msg, length);
- DCHECK(!os_.bad());
- return length;
- }
+ static FILE* CreateOutputHandle(std::string file_name);
+ base::Mutex* mutex() { return &mutex_; }
+
+ void WriteLogHeader();
+
+ Logger* logger_;
- // Whether logging is stopped (e.g. due to insufficient resources).
- bool is_stopped_;
+ std::string file_name_;
// When logging is active output_handle_ is used to store a pointer to log
// destination. mutex_ should be acquired before using output_handle_.
FILE* output_handle_;
+
OFStream os_;
// mutex_ is a Mutex used for enforcing exclusive
@@ -128,8 +135,6 @@ class Log {
// mutex_ should be acquired before using it.
std::unique_ptr<char[]> format_buffer_;
- Logger* logger_;
-
friend class Logger;
};
diff --git a/deps/v8/src/logging/log.cc b/deps/v8/src/logging/log.cc
index 4f4e31ffb4..efd7c2b5f3 100644
--- a/deps/v8/src/logging/log.cc
+++ b/deps/v8/src/logging/log.cc
@@ -4,11 +4,13 @@
#include "src/logging/log.h"
+#include <atomic>
#include <cstdarg>
#include <memory>
#include <sstream>
#include "src/api/api-inl.h"
+#include "src/base/platform/mutex.h"
#include "src/base/platform/platform.h"
#include "src/builtins/profile-data-reader.h"
#include "src/codegen/bailout-reason.h"
@@ -18,6 +20,7 @@
#include "src/diagnostics/perf-jit.h"
#include "src/execution/isolate.h"
#include "src/execution/runtime-profiler.h"
+#include "src/execution/v8threads.h"
#include "src/execution/vm-state-inl.h"
#include "src/handles/global-handles.h"
#include "src/heap/combined-heap.h"
@@ -881,7 +884,8 @@ class Ticker : public sampler::Sampler {
Ticker(Isolate* isolate, int interval_microseconds)
: sampler::Sampler(reinterpret_cast<v8::Isolate*>(isolate)),
sampling_thread_(
- std::make_unique<SamplingThread>(this, interval_microseconds)) {}
+ std::make_unique<SamplingThread>(this, interval_microseconds)),
+ threadId_(ThreadId::Current()) {}
~Ticker() override {
if (IsActive()) Stop();
@@ -903,6 +907,9 @@ class Ticker : public sampler::Sampler {
void SampleStack(const v8::RegisterState& state) override {
if (!profiler_) return;
Isolate* isolate = reinterpret_cast<Isolate*>(this->isolate());
+ if (v8::Locker::IsActive() &&
+ !isolate->thread_manager()->IsLockedByThread(threadId_))
+ return;
TickSample sample;
sample.Init(isolate, state, TickSample::kIncludeCEntryFrame, true);
profiler_->Insert(&sample);
@@ -911,6 +918,7 @@ class Ticker : public sampler::Sampler {
private:
Profiler* profiler_ = nullptr;
std::unique_ptr<SamplingThread> sampling_thread_;
+ ThreadId threadId_;
};
//
@@ -993,8 +1001,9 @@ void Logger::RemoveCodeEventListener(CodeEventListener* listener) {
}
void Logger::ProfilerBeginEvent() {
- if (!log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "profiler" << kNext << "begin" << kNext << FLAG_prof_sampling_interval;
msg.WriteToLogFile();
}
@@ -1004,8 +1013,9 @@ void Logger::StringEvent(const char* name, const char* value) {
}
void Logger::UncheckedStringEvent(const char* name, const char* value) {
- if (!log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << name << kNext << value;
msg.WriteToLogFile();
}
@@ -1015,23 +1025,28 @@ void Logger::IntPtrTEvent(const char* name, intptr_t value) {
}
void Logger::UncheckedIntPtrTEvent(const char* name, intptr_t value) {
- if (!log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << name << kNext;
msg.AppendFormatString("%" V8PRIdPTR, value);
msg.WriteToLogFile();
}
void Logger::HandleEvent(const char* name, Address* location) {
- if (!log_->IsEnabled() || !FLAG_log_handles) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_handles) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << name << kNext << reinterpret_cast<void*>(location);
msg.WriteToLogFile();
}
void Logger::ApiSecurityCheck() {
- if (!log_->IsEnabled() || !FLAG_log_api) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_api) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "api" << kNext << "check-security";
msg.WriteToLogFile();
}
@@ -1039,8 +1054,10 @@ void Logger::ApiSecurityCheck() {
void Logger::SharedLibraryEvent(const std::string& library_path,
uintptr_t start, uintptr_t end,
intptr_t aslr_slide) {
- if (!log_->IsEnabled() || !FLAG_prof_cpp) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_prof_cpp) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "shared-library" << kNext << library_path.c_str() << kNext
<< reinterpret_cast<void*>(start) << kNext << reinterpret_cast<void*>(end)
<< kNext << aslr_slide;
@@ -1048,16 +1065,18 @@ void Logger::SharedLibraryEvent(const std::string& library_path,
}
void Logger::CurrentTimeEvent() {
- if (!log_->IsEnabled()) return;
DCHECK(FLAG_log_internal_timer_events);
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "current-time" << kNext << timer_.Elapsed().InMicroseconds();
msg.WriteToLogFile();
}
void Logger::TimerEvent(Logger::StartEnd se, const char* name) {
- if (!log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
switch (se) {
case START:
msg << "timer-event-start";
@@ -1074,16 +1093,20 @@ void Logger::TimerEvent(Logger::StartEnd se, const char* name) {
void Logger::BasicBlockCounterEvent(const char* name, int block_id,
uint32_t count) {
- if (!log_->IsEnabled() || !FLAG_turbo_profiling_log_builtins) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_turbo_profiling_log_builtins) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << ProfileDataFromFileConstants::kBlockCounterMarker << kNext << name
<< kNext << block_id << kNext << count;
msg.WriteToLogFile();
}
void Logger::BuiltinHashEvent(const char* name, int hash) {
- if (!log_->IsEnabled() || !FLAG_turbo_profiling_log_builtins) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_turbo_profiling_log_builtins) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << ProfileDataFromFileConstants::kBuiltinHashMarker << kNext << name
<< kNext << hash;
msg.WriteToLogFile();
@@ -1092,7 +1115,7 @@ void Logger::BuiltinHashEvent(const char* name, int hash) {
bool Logger::is_logging() {
// Disable logging while the CPU profiler is running.
if (isolate_->is_profiling()) return false;
- return is_logging_;
+ return is_logging_.load(std::memory_order_relaxed);
}
// Instantiate template methods.
@@ -1105,8 +1128,10 @@ TIMER_EVENTS_LIST(V)
void Logger::ApiNamedPropertyAccess(const char* tag, JSObject holder,
Object property_name) {
DCHECK(property_name.IsName());
- if (!log_->IsEnabled() || !FLAG_log_api) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_api) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "api" << kNext << tag << kNext << holder.class_name() << kNext
<< Name::cast(property_name);
msg.WriteToLogFile();
@@ -1114,38 +1139,48 @@ void Logger::ApiNamedPropertyAccess(const char* tag, JSObject holder,
void Logger::ApiIndexedPropertyAccess(const char* tag, JSObject holder,
uint32_t index) {
- if (!log_->IsEnabled() || !FLAG_log_api) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_api) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "api" << kNext << tag << kNext << holder.class_name() << kNext
<< index;
msg.WriteToLogFile();
}
void Logger::ApiObjectAccess(const char* tag, JSObject object) {
- if (!log_->IsEnabled() || !FLAG_log_api) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_api) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "api" << kNext << tag << kNext << object.class_name();
msg.WriteToLogFile();
}
void Logger::ApiEntryCall(const char* name) {
- if (!log_->IsEnabled() || !FLAG_log_api) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_api) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "api" << kNext << name;
msg.WriteToLogFile();
}
void Logger::NewEvent(const char* name, void* object, size_t size) {
- if (!log_->IsEnabled() || !FLAG_log) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "new" << kNext << name << kNext << object << kNext
<< static_cast<unsigned int>(size);
msg.WriteToLogFile();
}
void Logger::DeleteEvent(const char* name, void* object) {
- if (!log_->IsEnabled() || !FLAG_log) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "delete" << kNext << name << kNext << object;
msg.WriteToLogFile();
}
@@ -1178,8 +1213,10 @@ void AppendCodeCreateHeader(
void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
const char* name) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendCodeCreateHeader(msg, tag, *code, &timer_);
msg << name;
msg.WriteToLogFile();
@@ -1188,8 +1225,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
Handle<Name> name) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendCodeCreateHeader(msg, tag, *code, &timer_);
msg << *name;
msg.WriteToLogFile();
@@ -1199,13 +1238,15 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared,
Handle<Name> script_name) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
+ if (!FLAG_log_code) return;
if (*code == AbstractCode::cast(
isolate_->builtins()->builtin(Builtins::kCompileLazy))) {
return;
}
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendCodeCreateHeader(msg, tag, *code, &timer_);
msg << *script_name << kNext << reinterpret_cast<void*>(shared->address())
<< kNext << ComputeMarker(*shared, *code);
@@ -1219,9 +1260,11 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared,
Handle<Name> script_name, int line, int column) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
+ if (!FLAG_log_code) return;
{
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendCodeCreateHeader(msg, tag, *code, &timer_);
msg << shared->DebugName() << " " << *script_name << ":" << line << ":"
<< column << kNext << reinterpret_cast<void*>(shared->address())
@@ -1256,7 +1299,9 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
// <function-id> is an index into the <fns> function table
// <fns> is the function table encoded as a sequence of strings
// S<shared-function-info-address>
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "code-source-info" << kNext
<< reinterpret_cast<void*>(code->InstructionStart()) << kNext
<< script.id() << kNext << shared->StartPosition() << kNext
@@ -1314,8 +1359,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
void Logger::CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendCodeCreateHeader(msg, tag, CodeKind::WASM_FUNCTION,
code->instructions().begin(),
code->instructions().length(), &timer_);
@@ -1335,8 +1382,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
void Logger::CallbackEventInternal(const char* prefix, Handle<Name> name,
Address entry_point) {
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << kLogEventsNames[CodeEventListener::CODE_CREATION_EVENT] << kNext
<< kLogEventsNames[CodeEventListener::CALLBACK_TAG] << kNext << -2
<< kNext << timer_.Elapsed().InMicroseconds() << kNext
@@ -1360,8 +1409,10 @@ void Logger::SetterCallbackEvent(Handle<Name> name, Address entry_point) {
void Logger::RegExpCodeCreateEvent(Handle<AbstractCode> code,
Handle<String> source) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendCodeCreateHeader(msg, CodeEventListener::REG_EXP_TAG, *code, &timer_);
msg << *source;
msg.WriteToLogFile();
@@ -1380,15 +1431,17 @@ void Logger::SharedFunctionInfoMoveEvent(Address from, Address to) {
void Logger::CodeMovingGCEvent() {
if (!is_listening_to_code_events()) return;
- if (!log_->IsEnabled() || !FLAG_ll_prof) return;
+ if (!FLAG_ll_prof) return;
base::OS::SignalCodeMovingGC();
}
void Logger::CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) {
if (!is_listening_to_code_events()) return;
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << kLogEventsNames[CodeEventListener::CODE_DISABLE_OPT_EVENT] << kNext
<< shared->DebugName() << kNext
<< GetBailoutReason(shared->disable_optimization_reason());
@@ -1397,7 +1450,9 @@ void Logger::CodeDisableOptEvent(Handle<AbstractCode> code,
void Logger::ProcessDeoptEvent(Handle<Code> code, SourcePosition position,
const char* kind, const char* reason) {
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "code-deopt" << kNext << timer_.Elapsed().InMicroseconds() << kNext
<< code->CodeSize() << kNext
<< reinterpret_cast<void*>(code->InstructionStart());
@@ -1420,7 +1475,7 @@ void Logger::ProcessDeoptEvent(Handle<Code> code, SourcePosition position,
void Logger::CodeDeoptEvent(Handle<Code> code, DeoptimizeKind kind, Address pc,
int fp_to_sp_delta, bool reuse_code) {
- if (!log_->IsEnabled()) return;
+ if (!is_logging()) return;
Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(*code, pc);
ProcessDeoptEvent(code, info.position,
Deoptimizer::MessageFor(kind, reuse_code),
@@ -1430,7 +1485,7 @@ void Logger::CodeDeoptEvent(Handle<Code> code, DeoptimizeKind kind, Address pc,
void Logger::CodeDependencyChangeEvent(Handle<Code> code,
Handle<SharedFunctionInfo> sfi,
const char* reason) {
- if (!log_->IsEnabled()) return;
+ if (!is_logging()) return;
SourcePosition position(sfi->StartPosition(), -1);
ProcessDeoptEvent(code, position, "dependency-change", reason);
}
@@ -1473,7 +1528,9 @@ void Logger::CodeLinePosInfoRecordEvent(
void Logger::CodeNameEvent(Address addr, int pos, const char* code_name) {
if (code_name == nullptr) return; // Not a code object.
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << kLogEventsNames[CodeEventListener::SNAPSHOT_CODE_NAME_EVENT] << kNext
<< pos << kNext << code_name;
msg.WriteToLogFile();
@@ -1481,16 +1538,20 @@ void Logger::CodeNameEvent(Address addr, int pos, const char* code_name) {
void Logger::MoveEventInternal(LogEventsAndTags event, Address from,
Address to) {
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_code) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << kLogEventsNames[event] << kNext << reinterpret_cast<void*>(from)
<< kNext << reinterpret_cast<void*>(to);
msg.WriteToLogFile();
}
void Logger::ResourceEvent(const char* name, const char* tag) {
- if (!log_->IsEnabled() || !FLAG_log) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << name << kNext << tag << kNext;
uint32_t sec, usec;
@@ -1503,8 +1564,10 @@ void Logger::ResourceEvent(const char* name, const char* tag) {
}
void Logger::SuspectReadEvent(Name name, Object obj) {
- if (!log_->IsEnabled() || !FLAG_log_suspect) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_suspect) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
String class_name = obj.IsJSObject() ? JSObject::cast(obj).class_name()
: ReadOnlyRoots(isolate_).empty_string();
msg << "suspect-read" << kNext << class_name << kNext << name;
@@ -1526,8 +1589,10 @@ void AppendFunctionMessage(
void Logger::FunctionEvent(const char* reason, int script_id, double time_delta,
int start_position, int end_position,
String function_name) {
- if (!log_->IsEnabled() || !FLAG_log_function_events) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_function_events) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendFunctionMessage(msg, reason, script_id, time_delta, start_position,
end_position, &timer_);
if (!function_name.is_null()) msg << function_name;
@@ -1537,21 +1602,25 @@ void Logger::FunctionEvent(const char* reason, int script_id, double time_delta,
void Logger::FunctionEvent(const char* reason, int script_id, double time_delta,
int start_position, int end_position,
const char* function_name,
- size_t function_name_length) {
- if (!log_->IsEnabled() || !FLAG_log_function_events) return;
- Log::MessageBuilder msg(log_.get());
+ size_t function_name_length, bool is_one_byte) {
+ if (!FLAG_log_function_events) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
AppendFunctionMessage(msg, reason, script_id, time_delta, start_position,
end_position, &timer_);
if (function_name_length > 0) {
- msg.AppendString(function_name, function_name_length);
+ msg.AppendString(function_name, function_name_length, is_one_byte);
}
msg.WriteToLogFile();
}
void Logger::CompilationCacheEvent(const char* action, const char* cache_type,
SharedFunctionInfo sfi) {
- if (!log_->IsEnabled() || !FLAG_log_function_events) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_function_events) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
int script_id = -1;
if (sfi.script().IsScript()) {
script_id = Script::cast(sfi.script()).id();
@@ -1564,8 +1633,10 @@ void Logger::CompilationCacheEvent(const char* action, const char* cache_type,
}
void Logger::ScriptEvent(ScriptEventType type, int script_id) {
- if (!log_->IsEnabled() || !FLAG_log_function_events) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_log_function_events) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "script" << Logger::kNext;
switch (type) {
case ScriptEventType::kReserveId:
@@ -1590,9 +1661,11 @@ void Logger::ScriptEvent(ScriptEventType type, int script_id) {
}
void Logger::ScriptDetails(Script script) {
- if (!log_->IsEnabled() || !FLAG_log_function_events) return;
+ if (!FLAG_log_function_events) return;
{
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "script-details" << Logger::kNext << script.id() << Logger::kNext;
if (script.name().IsString()) {
msg << String::cast(script.name());
@@ -1608,8 +1681,9 @@ void Logger::ScriptDetails(Script script) {
}
bool Logger::EnsureLogScriptSource(Script script) {
- if (!log_->IsEnabled()) return false;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return false;
+ Log::MessageBuilder& msg = *msg_ptr.get();
// Make sure the script is written to the log file.
int script_id = script.id();
if (logged_source_code_.find(script_id) != logged_source_code_.end()) {
@@ -1639,18 +1713,22 @@ void Logger::RuntimeCallTimerEvent() {
RuntimeCallStats* stats = isolate_->counters()->runtime_call_stats();
RuntimeCallCounter* counter = stats->current_counter();
if (counter == nullptr) return;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "active-runtime-timer" << kNext << counter->name();
msg.WriteToLogFile();
}
void Logger::TickEvent(TickSample* sample, bool overflow) {
- if (!log_->IsEnabled() || !FLAG_prof_cpp) return;
+ if (!FLAG_prof_cpp) return;
if (V8_UNLIKELY(TracingFlags::runtime_stats.load(std::memory_order_relaxed) ==
v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE)) {
RuntimeCallTimerEvent();
}
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << kLogEventsNames[CodeEventListener::TICK_EVENT] << kNext
<< reinterpret_cast<void*>(sample->pc) << kNext
<< timer_.Elapsed().InMicroseconds();
@@ -1671,8 +1749,10 @@ void Logger::TickEvent(TickSample* sample, bool overflow) {
void Logger::ICEvent(const char* type, bool keyed, Handle<Map> map,
Handle<Object> key, char old_state, char new_state,
const char* modifier, const char* slow_stub_reason) {
- if (!log_->IsEnabled() || !FLAG_trace_ic) return;
- Log::MessageBuilder msg(log_.get());
+ if (!FLAG_trace_ic) return;
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
if (keyed) msg << "Keyed";
int line;
int column;
@@ -1697,7 +1777,7 @@ void Logger::ICEvent(const char* type, bool keyed, Handle<Map> map,
void Logger::MapEvent(const char* type, Handle<Map> from, Handle<Map> to,
const char* reason, Handle<HeapObject> name_or_sfi) {
- if (!log_->IsEnabled() || !FLAG_trace_maps) return;
+ if (!FLAG_trace_maps) return;
if (!to.is_null()) MapDetails(*to);
int line = -1;
int column = -1;
@@ -1706,7 +1786,9 @@ void Logger::MapEvent(const char* type, Handle<Map> from, Handle<Map> to,
if (!isolate_->bootstrapper()->IsActive()) {
pc = isolate_->GetAbstractPC(&line, &column);
}
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "map" << kNext << type << kNext << timer_.Elapsed().InMicroseconds()
<< kNext << AsHex::Address(from.is_null() ? kNullAddress : from->ptr())
<< kNext << AsHex::Address(to.is_null() ? kNullAddress : to->ptr())
@@ -1728,18 +1810,22 @@ void Logger::MapEvent(const char* type, Handle<Map> from, Handle<Map> to,
}
void Logger::MapCreate(Map map) {
- if (!log_->IsEnabled() || !FLAG_trace_maps) return;
+ if (!FLAG_trace_maps) return;
DisallowHeapAllocation no_gc;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "map-create" << kNext << timer_.Elapsed().InMicroseconds() << kNext
<< AsHex::Address(map.ptr());
msg.WriteToLogFile();
}
void Logger::MapDetails(Map map) {
- if (!log_->IsEnabled() || !FLAG_trace_maps) return;
+ if (!FLAG_trace_maps) return;
DisallowHeapAllocation no_gc;
- Log::MessageBuilder msg(log_.get());
+ std::unique_ptr<Log::MessageBuilder> msg_ptr = log_->NewMessageBuilder();
+ if (!msg_ptr) return;
+ Log::MessageBuilder& msg = *msg_ptr.get();
msg << "map-details" << kNext << timer_.Elapsed().InMicroseconds() << kNext
<< AsHex::Address(map.ptr()) << kNext;
if (FLAG_trace_maps_details) {
@@ -1890,16 +1976,13 @@ void Logger::LogAllMaps() {
}
}
-static void AddIsolateIdIfNeeded(std::ostream& os, // NOLINT
- Isolate* isolate) {
- if (FLAG_logfile_per_isolate) {
- os << "isolate-" << isolate << "-" << base::OS::GetCurrentProcessId()
- << "-";
- }
+static void AddIsolateIdIfNeeded(std::ostream& os, Isolate* isolate) {
+ if (!FLAG_logfile_per_isolate) return;
+ os << "isolate-" << isolate << "-" << base::OS::GetCurrentProcessId() << "-";
}
-static void PrepareLogFileName(std::ostream& os, // NOLINT
- Isolate* isolate, const char* file_name) {
+static void PrepareLogFileName(std::ostream& os, Isolate* isolate,
+ const char* file_name) {
int dir_separator_count = 0;
for (const char* p = file_name; *p; p++) {
if (base::OS::isDirectorySeparator(*p)) dir_separator_count++;
@@ -1948,9 +2031,8 @@ bool Logger::SetUp(Isolate* isolate) {
is_initialized_ = true;
std::ostringstream log_file_name;
- std::ostringstream source_log_file_name;
PrepareLogFileName(log_file_name, isolate, FLAG_logfile);
- log_ = std::make_unique<Log>(this, log_file_name.str().c_str());
+ log_ = std::make_unique<Log>(this, log_file_name.str());
#if V8_OS_LINUX
if (FLAG_perf_basic_prof) {
@@ -1979,20 +2061,21 @@ bool Logger::SetUp(Isolate* isolate) {
ticker_ = std::make_unique<Ticker>(isolate, FLAG_prof_sampling_interval);
- if (Log::InitLogAtStart()) {
- is_logging_ = true;
- }
+ bool activate_logging = false;
+
+ if (Log::InitLogAtStart()) activate_logging = true;
timer_.Start();
if (FLAG_prof_cpp) {
profiler_ = std::make_unique<Profiler>(isolate);
- is_logging_ = true;
+ activate_logging = true;
profiler_->Engage();
}
- if (is_logging_) {
+ if (activate_logging) {
AddCodeEventListener(this);
+ UpdateIsLogging(true);
}
return true;
@@ -2020,6 +2103,7 @@ void Logger::SetCodeEventHandler(uint32_t options,
}
sampler::Sampler* Logger::sampler() { return ticker_.get(); }
+std::string Logger::file_name() const { return log_.get()->file_name(); }
void Logger::StopProfilerThread() {
if (profiler_ != nullptr) {
@@ -2028,14 +2112,16 @@ void Logger::StopProfilerThread() {
}
}
-FILE* Logger::TearDown() {
+FILE* Logger::TearDownAndGetLogFile() {
if (!is_initialized_) return nullptr;
is_initialized_ = false;
+ UpdateIsLogging(false);
// Stop the profiler thread before closing the file.
StopProfilerThread();
ticker_.reset();
+ timer_.Stop();
#if V8_OS_LINUX
if (perf_basic_logger_) {
@@ -2062,6 +2148,13 @@ FILE* Logger::TearDown() {
return log_->Close();
}
+void Logger::UpdateIsLogging(bool value) {
+ base::MutexGuard guard(log_->mutex());
+ // Relaxed atomic to avoid locking the mutex for the most common case: when
+ // logging is disabled.
+ is_logging_.store(value, std::memory_order_relaxed);
+}
+
void ExistingCodeLogger::LogCodeObject(Object object) {
HandleScope scope(isolate_);
Handle<AbstractCode> abstract_code(AbstractCode::cast(object), isolate_);
diff --git a/deps/v8/src/logging/log.h b/deps/v8/src/logging/log.h
index c5c4217d0a..aa9b0c4237 100644
--- a/deps/v8/src/logging/log.h
+++ b/deps/v8/src/logging/log.h
@@ -5,6 +5,7 @@
#ifndef V8_LOGGING_LOG_H_
#define V8_LOGGING_LOG_H_
+#include <atomic>
#include <memory>
#include <set>
#include <string>
@@ -126,18 +127,19 @@ class Logger : public CodeEventListener {
// Acquires resources for logging if the right flags are set.
bool SetUp(Isolate* isolate);
+ // Frees resources acquired in SetUp.
+ // When a temporary file is used for the log, returns its stream descriptor,
+ // leaving the file open.
+ V8_EXPORT_PRIVATE FILE* TearDownAndGetLogFile();
+
// Sets the current code event handler.
void SetCodeEventHandler(uint32_t options, JitCodeEventHandler event_handler);
sampler::Sampler* sampler();
+ V8_EXPORT_PRIVATE std::string file_name() const;
V8_EXPORT_PRIVATE void StopProfilerThread();
- // Frees resources acquired in SetUp.
- // When a temporary file is used for the log, returns its stream descriptor,
- // leaving the file open.
- V8_EXPORT_PRIVATE FILE* TearDown();
-
// Emits an event with a string value -> (name, value).
V8_EXPORT_PRIVATE void StringEvent(const char* name, const char* value);
@@ -168,7 +170,7 @@ class Logger : public CodeEventListener {
void FunctionEvent(const char* reason, int script_id, double time_delta_ms,
int start_position, int end_position,
const char* function_name = nullptr,
- size_t function_name_length = 0);
+ size_t function_name_length = 0, bool is_one_byte = true);
void CompilationCacheEvent(const char* action, const char* cache_type,
SharedFunctionInfo sfi);
@@ -208,7 +210,6 @@ class Logger : public CodeEventListener {
Handle<String> source) override;
void CodeMoveEvent(AbstractCode from, AbstractCode to) override;
void SharedFunctionInfoMoveEvent(Address from, Address to) override;
- void NativeContextMoveEvent(Address from, Address to) override {}
void CodeMovingGCEvent() override;
void CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) override;
@@ -283,6 +284,8 @@ class Logger : public CodeEventListener {
void LogCodeObject(Object code_object);
private:
+ void UpdateIsLogging(bool value);
+
// Emits the profiler's first message.
void ProfilerBeginEvent();
@@ -324,7 +327,7 @@ class Logger : public CodeEventListener {
// Internal implementation classes with access to private members.
friend class Profiler;
- bool is_logging_;
+ std::atomic<bool> is_logging_;
std::unique_ptr<Log> log_;
#if V8_OS_LINUX
std::unique_ptr<PerfBasicLogger> perf_basic_logger_;
@@ -405,7 +408,6 @@ class V8_EXPORT_PRIVATE CodeEventLogger : public CodeEventListener {
void GetterCallbackEvent(Handle<Name> name, Address entry_point) override {}
void SetterCallbackEvent(Handle<Name> name, Address entry_point) override {}
void SharedFunctionInfoMoveEvent(Address from, Address to) override {}
- void NativeContextMoveEvent(Address from, Address to) override {}
void CodeMovingGCEvent() override {}
void CodeDeoptEvent(Handle<Code> code, DeoptimizeKind kind, Address pc,
int fp_to_sp_delta, bool reuse_code) override {}
@@ -465,7 +467,6 @@ class ExternalCodeEventListener : public CodeEventListener {
void GetterCallbackEvent(Handle<Name> name, Address entry_point) override {}
void SetterCallbackEvent(Handle<Name> name, Address entry_point) override {}
void SharedFunctionInfoMoveEvent(Address from, Address to) override {}
- void NativeContextMoveEvent(Address from, Address to) override {}
void CodeMoveEvent(AbstractCode from, AbstractCode to) override;
void CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) override {}
diff --git a/deps/v8/src/numbers/conversions.cc b/deps/v8/src/numbers/conversions.cc
index 70d914e6df..1423bd6fcd 100644
--- a/deps/v8/src/numbers/conversions.cc
+++ b/deps/v8/src/numbers/conversions.cc
@@ -209,6 +209,7 @@ class StringToIntHelper {
void ParseInt();
// Subclasses may override this.
+ virtual bool CheckTermination() { return false; }
virtual void HandleSpecialCases() {}
// Subclass constructors should call these for configuration before calling
@@ -249,7 +250,7 @@ class StringToIntHelper {
template <class Char>
void DetectRadixInternal(Char current, int length);
template <class Char>
- void ParseInternal(Char start);
+ bool ParseChunkInternal(Char start);
LocalIsolate* isolate_;
Handle<String> subject_;
@@ -280,18 +281,31 @@ void StringToIntHelper<LocalIsolate>::ParseInt() {
AllocateResult();
HandleSpecialCases();
if (state_ != State::kRunning) return;
- {
- DisallowHeapAllocation no_gc;
- if (IsOneByte()) {
- Vector<const uint8_t> vector = GetOneByteVector();
- DCHECK_EQ(length_, vector.length());
- ParseInternal(vector.begin());
- } else {
- Vector<const uc16> vector = GetTwoByteVector();
- DCHECK_EQ(length_, vector.length());
- ParseInternal(vector.begin());
+ do {
+ {
+ DisallowHeapAllocation no_gc;
+ if (IsOneByte()) {
+ Vector<const uint8_t> vector = GetOneByteVector();
+ DCHECK_EQ(length_, vector.length());
+ if (ParseChunkInternal(vector.begin())) {
+ break;
+ }
+ } else {
+ Vector<const uc16> vector = GetTwoByteVector();
+ DCHECK_EQ(length_, vector.length());
+ if (ParseChunkInternal(vector.begin())) {
+ break;
+ }
+ }
}
- }
+
+ // The flat vector handle is temporarily released after parsing 10kb
+ // in order to invoke interrupts which may in turn invoke GC.
+ if (CheckTermination()) {
+ set_state(State::kError);
+ break;
+ }
+ } while (true);
DCHECK_NE(state_, State::kRunning);
}
@@ -377,9 +391,11 @@ void StringToIntHelper<LocalIsolate>::DetectRadixInternal(Char current,
template <typename LocalIsolate>
template <class Char>
-void StringToIntHelper<LocalIsolate>::ParseInternal(Char start) {
+bool StringToIntHelper<LocalIsolate>::ParseChunkInternal(Char start) {
+ const int kChunkSize = 10240;
Char current = start + cursor_;
Char end = start + length_;
+ Char break_pos = current + kChunkSize;
// The following code causes accumulating rounding error for numbers greater
// than ~2^56. It's explicitly allowed in the spec: "if R is not 2, 4, 8, 10,
@@ -433,13 +449,20 @@ void StringToIntHelper<LocalIsolate>::ParseInternal(Char start) {
// Update the value and skip the part in the string.
ResultMultiplyAdd(multiplier, part);
- } while (!done);
- if (!allow_trailing_junk_ && AdvanceToNonspace(&current, end)) {
- return set_state(State::kJunk);
- }
+ // Set final state
+ if (done) {
+ if (!allow_trailing_junk_ && AdvanceToNonspace(&current, end)) {
+ set_state(State::kJunk);
+ } else {
+ set_state(State::kDone);
+ }
+ return true;
+ }
+ } while (current < break_pos);
- return set_state(State::kDone);
+ cursor_ = static_cast<int>(current - start);
+ return false;
}
class NumberParseIntHelper : public StringToIntHelper<Isolate> {
@@ -904,6 +927,8 @@ class StringToBigIntHelper : public StringToIntHelper<LocalIsolate> {
static_cast<uintptr_t>(part));
}
+ bool CheckTermination() override;
+
AllocationType allocation_type() {
// For literals, we pretenure the allocated BigInt, since it's about
// to be stored in the interpreter's constants array.
@@ -916,6 +941,18 @@ class StringToBigIntHelper : public StringToIntHelper<LocalIsolate> {
Behavior behavior_;
};
+template <typename LocalIsolate>
+bool StringToBigIntHelper<LocalIsolate>::CheckTermination() {
+ return false;
+}
+
+template <>
+bool StringToBigIntHelper<Isolate>::CheckTermination() {
+ StackLimitCheck interrupt_check(isolate());
+ return interrupt_check.InterruptRequested() &&
+ isolate()->stack_guard()->HandleInterrupts().IsException(isolate());
+}
+
MaybeHandle<BigInt> StringToBigInt(Isolate* isolate, Handle<String> string) {
string = String::Flatten(isolate, string);
StringToBigIntHelper<Isolate> helper(isolate, string);
diff --git a/deps/v8/src/numbers/hash-seed-inl.h b/deps/v8/src/numbers/hash-seed-inl.h
index dad8db01c7..51ee906be2 100644
--- a/deps/v8/src/numbers/hash-seed-inl.h
+++ b/deps/v8/src/numbers/hash-seed-inl.h
@@ -19,7 +19,6 @@ namespace internal {
class Isolate;
class ReadOnlyRoots;
-// TODO(v8:7464): Remove the Isolate version of this.
inline uint64_t HashSeed(Isolate* isolate);
inline uint64_t HashSeed(ReadOnlyRoots roots);
diff --git a/deps/v8/src/objects/allocation-site-scopes.h b/deps/v8/src/objects/allocation-site-scopes.h
index 8f5fb42986..9617b76b5e 100644
--- a/deps/v8/src/objects/allocation-site-scopes.h
+++ b/deps/v8/src/objects/allocation-site-scopes.h
@@ -27,9 +27,7 @@ class AllocationSiteContext {
Isolate* isolate() { return isolate_; }
protected:
- void update_current_site(AllocationSite site) {
- *(current_.location()) = site.ptr();
- }
+ void update_current_site(AllocationSite site) { current_.PatchValue(site); }
inline void InitializeTraversal(Handle<AllocationSite> site);
diff --git a/deps/v8/src/objects/api-callbacks-inl.h b/deps/v8/src/objects/api-callbacks-inl.h
index 93d2bcd7f4..8fa0f40c73 100644
--- a/deps/v8/src/objects/api-callbacks-inl.h
+++ b/deps/v8/src/objects/api-callbacks-inl.h
@@ -13,7 +13,7 @@
#include "src/objects/js-objects-inl.h"
#include "src/objects/name.h"
#include "src/objects/templates.h"
-#include "torque-generated/class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/api-callbacks.h b/deps/v8/src/objects/api-callbacks.h
index 969adb9fca..ffd9e9f02e 100644
--- a/deps/v8/src/objects/api-callbacks.h
+++ b/deps/v8/src/objects/api-callbacks.h
@@ -6,8 +6,8 @@
#define V8_OBJECTS_API_CALLBACKS_H_
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/bit-fields.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/arguments.h b/deps/v8/src/objects/arguments.h
index 41eaaed1a1..d8cbdbae50 100644
--- a/deps/v8/src/objects/arguments.h
+++ b/deps/v8/src/objects/arguments.h
@@ -8,7 +8,7 @@
#include "src/objects/fixed-array.h"
#include "src/objects/js-objects.h"
#include "src/objects/struct.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/arguments.tq b/deps/v8/src/objects/arguments.tq
index 0699034851..2fc9dfc53a 100644
--- a/deps/v8/src/objects/arguments.tq
+++ b/deps/v8/src/objects/arguments.tq
@@ -53,7 +53,7 @@ extern shape JSStrictArgumentsObject extends JSArgumentsObject {
// entry has been deleted fron the arguments object, and value is looked up in
// the unmapped arguments array, as described above. Otherwise, t is a Smi
// index into the context array specified at elements.context, and the return
-// value is elements.context.
+// value is elements.context[t].
//
// A graphic representation of a SloppyArgumentsElements object and a
// corresponding unmapped arguments FixedArray:
@@ -79,7 +79,7 @@ extern shape JSStrictArgumentsObject extends JSArgumentsObject {
@export
class SloppyArgumentsElements extends FixedArrayBase {
context: Context;
- arguments: FixedArray;
+ arguments: FixedArray|NumberDictionary;
mapped_entries[length]: Smi|TheHole;
}
@@ -316,3 +316,58 @@ builtin NewRestArgumentsElements(
return arguments::NewRestArgumentsElements(
frame, formalParameterCount, Convert<intptr>(argumentCount));
}
+
+macro
+AccessSloppyArgumentsCommon(
+ receiver: JSObject, keyObject: Object): &Object labels Bailout {
+ const key = Cast<Smi>(keyObject) otherwise Bailout;
+ const elements =
+ Cast<SloppyArgumentsElements>(receiver.elements) otherwise Bailout;
+
+ try {
+ if (OutOfBounds(key, elements.length)) goto Unmapped;
+ const mappedIndex = elements.mapped_entries[key];
+ typeswitch (mappedIndex) {
+ case (contextIndex: Smi): {
+ return &(elements.context.elements[contextIndex]);
+ }
+ case (TheHole): {
+ goto Unmapped;
+ }
+ }
+ } label Unmapped {
+ typeswitch (elements.arguments) {
+ case (NumberDictionary): {
+ goto Bailout;
+ }
+ case (arguments: FixedArray): {
+ if (OutOfBounds(key, arguments.length)) goto Bailout;
+ if (arguments.objects[key] == TheHole) goto Bailout;
+ return &(arguments.objects[key]);
+ }
+ }
+ }
+}
+
+@export
+macro SloppyArgumentsLoad(receiver: JSObject, keyObject: Object):
+ JSAny labels Bailout {
+ return UnsafeCast<JSAny>(
+ *AccessSloppyArgumentsCommon(receiver, keyObject) otherwise Bailout);
+}
+
+@export
+macro SloppyArgumentsHas(receiver: JSObject, keyObject: Object):
+ JSAny labels Bailout {
+ AccessSloppyArgumentsCommon(receiver, keyObject) otherwise Bailout;
+ return True;
+}
+
+@export
+macro SloppyArgumentsStore(receiver: JSObject, keyObject: Object, value: JSAny):
+ JSAny labels Bailout {
+ let destination =
+ AccessSloppyArgumentsCommon(receiver, keyObject) otherwise Bailout;
+ *destination = value;
+ return value;
+}
diff --git a/deps/v8/src/objects/backing-store.cc b/deps/v8/src/objects/backing-store.cc
index e81b854fce..c67fff0fa9 100644
--- a/deps/v8/src/objects/backing-store.cc
+++ b/deps/v8/src/objects/backing-store.cc
@@ -276,9 +276,9 @@ std::unique_ptr<BackingStore> BackingStore::Allocate(
}
// Trying to allocate 4 GiB on a 32-bit platform is guaranteed to fail.
-// We don't lower the official max_maximum_mem_pages() limit because that
-// would be observable upon instantiation; this way the effective limit
-// on 32-bit platforms is defined by the allocator.
+// We don't lower the official max_mem_pages() limit because that would be
+// observable upon instantiation; this way the effective limit on 32-bit
+// platforms is defined by the allocator.
constexpr size_t kPlatformMaxPages =
std::numeric_limits<size_t>::max() / wasm::kWasmPageSize;
@@ -325,7 +325,7 @@ std::unique_ptr<BackingStore> BackingStore::TryAllocateWasmMemory(
// Compute size of reserved memory.
- size_t engine_max_pages = wasm::max_maximum_mem_pages();
+ size_t engine_max_pages = wasm::max_mem_pages();
maximum_pages = std::min(engine_max_pages, maximum_pages);
// If the platform doesn't support so many pages, attempting to allocate
// is guaranteed to fail, so we don't even try.
diff --git a/deps/v8/src/objects/bigint.cc b/deps/v8/src/objects/bigint.cc
index 76b6e417ab..fbbfbeb69d 100644
--- a/deps/v8/src/objects/bigint.cc
+++ b/deps/v8/src/objects/bigint.cc
@@ -822,32 +822,39 @@ MaybeHandle<BigInt> BigInt::Decrement(Isolate* isolate, Handle<BigInt> x) {
return MutableBigInt::MakeImmutable(result);
}
-ComparisonResult BigInt::CompareToString(Isolate* isolate, Handle<BigInt> x,
- Handle<String> y) {
+Maybe<ComparisonResult> BigInt::CompareToString(Isolate* isolate,
+ Handle<BigInt> x,
+ Handle<String> y) {
// a. Let ny be StringToBigInt(y);
MaybeHandle<BigInt> maybe_ny = StringToBigInt(isolate, y);
// b. If ny is NaN, return undefined.
Handle<BigInt> ny;
if (!maybe_ny.ToHandle(&ny)) {
- DCHECK(!isolate->has_pending_exception());
- return ComparisonResult::kUndefined;
+ if (isolate->has_pending_exception()) {
+ return Nothing<ComparisonResult>();
+ } else {
+ return Just(ComparisonResult::kUndefined);
+ }
}
// c. Return BigInt::lessThan(x, ny).
- return CompareToBigInt(x, ny);
+ return Just(CompareToBigInt(x, ny));
}
-bool BigInt::EqualToString(Isolate* isolate, Handle<BigInt> x,
- Handle<String> y) {
+Maybe<bool> BigInt::EqualToString(Isolate* isolate, Handle<BigInt> x,
+ Handle<String> y) {
// a. Let n be StringToBigInt(y).
MaybeHandle<BigInt> maybe_n = StringToBigInt(isolate, y);
// b. If n is NaN, return false.
Handle<BigInt> n;
if (!maybe_n.ToHandle(&n)) {
- DCHECK(!isolate->has_pending_exception());
- return false;
+ if (isolate->has_pending_exception()) {
+ return Nothing<bool>();
+ } else {
+ return Just(false);
+ }
}
// c. Return the result of x == n.
- return EqualToBigInt(*x, *n);
+ return Just(EqualToBigInt(*x, *n));
}
bool BigInt::EqualToNumber(Handle<BigInt> x, Handle<Object> y) {
@@ -1047,9 +1054,13 @@ MaybeHandle<BigInt> BigInt::FromObject(Isolate* isolate, Handle<Object> obj) {
if (obj->IsString()) {
Handle<BigInt> n;
if (!StringToBigInt(isolate, Handle<String>::cast(obj)).ToHandle(&n)) {
- THROW_NEW_ERROR(isolate,
- NewSyntaxError(MessageTemplate::kBigIntFromObject, obj),
- BigInt);
+ if (isolate->has_pending_exception()) {
+ return MaybeHandle<BigInt>();
+ } else {
+ THROW_NEW_ERROR(isolate,
+ NewSyntaxError(MessageTemplate::kBigIntFromObject, obj),
+ BigInt);
+ }
}
return n;
}
diff --git a/deps/v8/src/objects/bigint.h b/deps/v8/src/objects/bigint.h
index ccdbf33f61..4fdd9b1501 100644
--- a/deps/v8/src/objects/bigint.h
+++ b/deps/v8/src/objects/bigint.h
@@ -189,11 +189,12 @@ class BigInt : public BigIntBase {
bool IsNegative() const { return sign(); }
- static bool EqualToString(Isolate* isolate, Handle<BigInt> x,
- Handle<String> y);
+ static Maybe<bool> EqualToString(Isolate* isolate, Handle<BigInt> x,
+ Handle<String> y);
static bool EqualToNumber(Handle<BigInt> x, Handle<Object> y);
- static ComparisonResult CompareToString(Isolate* isolate, Handle<BigInt> x,
- Handle<String> y);
+ static Maybe<ComparisonResult> CompareToString(Isolate* isolate,
+ Handle<BigInt> x,
+ Handle<String> y);
static ComparisonResult CompareToNumber(Handle<BigInt> x, Handle<Object> y);
// Exposed for tests, do not call directly. Use CompareToNumber() instead.
V8_EXPORT_PRIVATE static ComparisonResult CompareToDouble(Handle<BigInt> x,
@@ -203,12 +204,13 @@ class BigInt : public BigIntBase {
static MaybeHandle<BigInt> AsUintN(Isolate* isolate, uint64_t n,
Handle<BigInt> x);
- static Handle<BigInt> FromInt64(Isolate* isolate, int64_t n);
+ V8_EXPORT_PRIVATE static Handle<BigInt> FromInt64(Isolate* isolate,
+ int64_t n);
static Handle<BigInt> FromUint64(Isolate* isolate, uint64_t n);
static MaybeHandle<BigInt> FromWords64(Isolate* isolate, int sign_bit,
int words64_count,
const uint64_t* words);
- int64_t AsInt64(bool* lossless = nullptr);
+ V8_EXPORT_PRIVATE int64_t AsInt64(bool* lossless = nullptr);
uint64_t AsUint64(bool* lossless = nullptr);
int Words64Count();
void ToWordsArray64(int* sign_bit, int* words64_count, uint64_t* words);
diff --git a/deps/v8/src/objects/cell.h b/deps/v8/src/objects/cell.h
index f26feae421..de43897350 100644
--- a/deps/v8/src/objects/cell.h
+++ b/deps/v8/src/objects/cell.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_CELL_H_
#include "src/objects/heap-object.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/class-definitions-tq-deps-inl.h b/deps/v8/src/objects/class-definitions-tq-deps-inl.h
index ccfd8c3aa1..ad046cbf8b 100644
--- a/deps/v8/src/objects/class-definitions-tq-deps-inl.h
+++ b/deps/v8/src/objects/class-definitions-tq-deps-inl.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_CLASS_DEFINITIONS_TQ_DEPS_INL_H_
// This is a collection of -inl.h files required by the generated file
-// class-definitions-tq.cc. Generally, classes using @generateCppClass need an
+// class-definitions.cc. Generally, classes using @generateCppClass need an
// entry here.
#include "src/objects/allocation-site-inl.h"
#include "src/objects/arguments-inl.h"
diff --git a/deps/v8/src/objects/code-inl.h b/deps/v8/src/objects/code-inl.h
index c5a4187822..3c772f855a 100644
--- a/deps/v8/src/objects/code-inl.h
+++ b/deps/v8/src/objects/code-inl.h
@@ -208,21 +208,12 @@ void Code::clear_padding() {
CodeSize() - (data_end - address()));
}
-ByteArray Code::SourcePositionTableIfCollected() const {
- ReadOnlyRoots roots = GetReadOnlyRoots();
- Object maybe_table = source_position_table();
- if (maybe_table.IsUndefined(roots) || maybe_table.IsException(roots)) {
- return roots.empty_byte_array();
- }
- DCHECK(maybe_table.IsByteArray());
- return ByteArray::cast(maybe_table);
-}
-
ByteArray Code::SourcePositionTable() const {
Object maybe_table = source_position_table();
- DCHECK(!maybe_table.IsUndefined() && !maybe_table.IsException());
- DCHECK(maybe_table.IsByteArray());
- return ByteArray::cast(maybe_table);
+ if (maybe_table.IsByteArray()) return ByteArray::cast(maybe_table);
+ ReadOnlyRoots roots = GetReadOnlyRoots();
+ DCHECK(maybe_table.IsUndefined(roots) || maybe_table.IsException(roots));
+ return roots.empty_byte_array();
}
Object Code::next_code_link() const {
@@ -376,7 +367,8 @@ inline bool Code::is_interpreter_trampoline_builtin() const {
inline bool Code::checks_optimization_marker() const {
bool checks_marker =
(builtin_index() == Builtins::kCompileLazy ||
- builtin_index() == Builtins::kInterpreterEntryTrampoline);
+ builtin_index() == Builtins::kInterpreterEntryTrampoline ||
+ CodeKindChecksOptimizationMarker(kind()));
return checks_marker ||
(CodeKindCanDeoptimize(kind()) && marked_for_deoptimization());
}
@@ -709,8 +701,8 @@ int32_t BytecodeArray::parameter_count() const {
ACCESSORS(BytecodeArray, constant_pool, FixedArray, kConstantPoolOffset)
ACCESSORS(BytecodeArray, handler_table, ByteArray, kHandlerTableOffset)
-ACCESSORS(BytecodeArray, source_position_table, Object,
- kSourcePositionTableOffset)
+SYNCHRONIZED_ACCESSORS(BytecodeArray, synchronized_source_position_table,
+ Object, kSourcePositionTableOffset)
void BytecodeArray::clear_padding() {
int data_size = kHeaderSize + length();
@@ -723,40 +715,37 @@ Address BytecodeArray::GetFirstBytecodeAddress() {
}
bool BytecodeArray::HasSourcePositionTable() const {
- Object maybe_table = source_position_table();
+ Object maybe_table = synchronized_source_position_table();
return !(maybe_table.IsUndefined() || DidSourcePositionGenerationFail());
}
bool BytecodeArray::DidSourcePositionGenerationFail() const {
- return source_position_table().IsException();
+ return synchronized_source_position_table().IsException();
}
void BytecodeArray::SetSourcePositionsFailedToCollect() {
- set_source_position_table(GetReadOnlyRoots().exception());
+ set_synchronized_source_position_table(GetReadOnlyRoots().exception());
}
ByteArray BytecodeArray::SourcePositionTable() const {
- Object maybe_table = source_position_table();
+ // WARNING: This function may be called from a background thread, hence
+ // changes to how it accesses the heap can easily lead to bugs.
+ Object maybe_table = synchronized_source_position_table();
if (maybe_table.IsByteArray()) return ByteArray::cast(maybe_table);
ReadOnlyRoots roots = GetReadOnlyRoots();
- DCHECK(maybe_table.IsException(roots));
+ DCHECK(maybe_table.IsUndefined(roots) || maybe_table.IsException(roots));
return roots.empty_byte_array();
}
-ByteArray BytecodeArray::SourcePositionTableIfCollected() const {
- if (!HasSourcePositionTable()) return GetReadOnlyRoots().empty_byte_array();
-
- return SourcePositionTable();
-}
-
int BytecodeArray::BytecodeArraySize() { return SizeFor(this->length()); }
int BytecodeArray::SizeIncludingMetadata() {
int size = BytecodeArraySize();
size += constant_pool().Size();
size += handler_table().Size();
- if (HasSourcePositionTable()) {
- size += SourcePositionTable().Size();
+ ByteArray table = SourcePositionTable();
+ if (table.length() != 0) {
+ size += table.Size();
}
return size;
}
diff --git a/deps/v8/src/objects/code-kind.h b/deps/v8/src/objects/code-kind.h
index 13baf0a1f5..a1f9b43900 100644
--- a/deps/v8/src/objects/code-kind.h
+++ b/deps/v8/src/objects/code-kind.h
@@ -72,11 +72,21 @@ inline constexpr bool CodeKindCanDeoptimize(CodeKind kind) {
return CodeKindIsOptimizedJSFunction(kind);
}
-inline CodeKind CodeKindForTopTier() {
- return FLAG_turbo_nci_as_highest_tier ? CodeKind::NATIVE_CONTEXT_INDEPENDENT
- : CodeKind::OPTIMIZED_FUNCTION;
+inline constexpr bool CodeKindChecksOptimizationMarker(CodeKind kind) {
+ return kind == CodeKind::INTERPRETED_FUNCTION ||
+ kind == CodeKind::NATIVE_CONTEXT_INDEPENDENT;
}
+// The optimization marker field on the feedback vector has a dual purpose of
+// controlling the tier-up workflow, and caching the produced code object for
+// access from multiple closures. The marker is not used for all code kinds
+// though, in particular it is not used when generating NCI code.
+inline constexpr bool CodeKindIsStoredInOptimizedCodeCache(CodeKind kind) {
+ return kind == CodeKind::OPTIMIZED_FUNCTION;
+}
+
+inline CodeKind CodeKindForTopTier() { return CodeKind::OPTIMIZED_FUNCTION; }
+
// The dedicated CodeKindFlag enum represents all code kinds in a format
// suitable for bit sets.
enum class CodeKindFlag {
diff --git a/deps/v8/src/objects/code.cc b/deps/v8/src/objects/code.cc
index 26f84c21c4..c796904718 100644
--- a/deps/v8/src/objects/code.cc
+++ b/deps/v8/src/objects/code.cc
@@ -201,17 +201,6 @@ int AbstractCode::SourceStatementPosition(int offset) {
return statement_position;
}
-void Code::PrintDeoptLocation(FILE* out, const char* str, Address pc) {
- Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(*this, pc);
- class SourcePosition pos = info.position;
- if (info.deopt_reason != DeoptimizeReason::kUnknown || pos.IsKnown()) {
- PrintF(out, "%s", str);
- OFStream outstr(out);
- pos.Print(outstr, *this);
- PrintF(out, ", %s\n", DeoptimizeReasonToString(info.deopt_reason));
- }
-}
-
bool Code::CanDeoptAt(Address pc) {
DeoptimizationData deopt_data =
DeoptimizationData::cast(deoptimization_data());
@@ -712,8 +701,7 @@ void Code::Disassemble(const char* name, std::ostream& os, Isolate* isolate,
{
SourcePositionTableIterator it(
- SourcePositionTableIfCollected(),
- SourcePositionTableIterator::kJavaScriptOnly);
+ SourcePositionTable(), SourcePositionTableIterator::kJavaScriptOnly);
if (!it.done()) {
os << "Source positions:\n pc offset position\n";
for (; !it.done(); it.Advance()) {
@@ -726,7 +714,7 @@ void Code::Disassemble(const char* name, std::ostream& os, Isolate* isolate,
}
{
- SourcePositionTableIterator it(SourcePositionTableIfCollected(),
+ SourcePositionTableIterator it(SourcePositionTable(),
SourcePositionTableIterator::kExternalOnly);
if (!it.done()) {
os << "External Source positions:\n pc offset fileid line\n";
@@ -808,8 +796,7 @@ void BytecodeArray::Disassemble(std::ostream& os) {
os << "Frame size " << frame_size() << "\n";
Address base_address = GetFirstBytecodeAddress();
- SourcePositionTableIterator source_positions(
- SourcePositionTableIfCollected());
+ SourcePositionTableIterator source_positions(SourcePositionTable());
// Storage for backing the handle passed to the iterator. This handle won't be
// updated by the gc, but that's ok because we've disallowed GCs anyway.
@@ -868,11 +855,12 @@ void BytecodeArray::Disassemble(std::ostream& os) {
}
#endif
- os << "Source Position Table (size = "
- << SourcePositionTableIfCollected().length() << ")\n";
+ ByteArray source_position_table = SourcePositionTable();
+ os << "Source Position Table (size = " << source_position_table.length()
+ << ")\n";
#ifdef OBJECT_PRINT
- if (SourcePositionTableIfCollected().length() > 0) {
- os << Brief(SourcePositionTableIfCollected()) << std::endl;
+ if (source_position_table.length() > 0) {
+ os << Brief(source_position_table) << std::endl;
}
#endif
}
@@ -1058,27 +1046,7 @@ void DependentCode::DeoptimizeDependentCodeGroup(
void Code::SetMarkedForDeoptimization(const char* reason) {
set_marked_for_deoptimization(true);
- if (FLAG_trace_deopt &&
- (deoptimization_data() != GetReadOnlyRoots().empty_fixed_array())) {
- DeoptimizationData deopt_data =
- DeoptimizationData::cast(deoptimization_data());
- auto isolate = GetIsolate();
- CodeTracer::Scope scope(isolate->GetCodeTracer());
- PrintF(scope.file(), "[marking dependent code " V8PRIxPTR_FMT " ", ptr());
- deopt_data.SharedFunctionInfo().ShortPrint(scope.file());
- PrintF(" (opt #%d) for deoptimization, reason: %s]\n",
- deopt_data.OptimizationId().value(), reason);
- {
- HandleScope scope(isolate);
- PROFILE(
- isolate,
- CodeDependencyChangeEvent(
- handle(*this, isolate),
- handle(SharedFunctionInfo::cast(deopt_data.SharedFunctionInfo()),
- isolate),
- reason));
- }
- }
+ Deoptimizer::TraceMarkForDeoptimization(*this, reason);
}
const char* DependentCode::DependencyGroupName(DependencyGroup group) {
diff --git a/deps/v8/src/objects/code.h b/deps/v8/src/objects/code.h
index af6af90c0d..d71a0b1132 100644
--- a/deps/v8/src/objects/code.h
+++ b/deps/v8/src/objects/code.h
@@ -109,8 +109,10 @@ class Code : public HeapObject {
// [source_position_table]: ByteArray for the source positions table.
DECL_ACCESSORS(source_position_table, Object)
+
+ // If source positions have not been collected or an exception has been thrown
+ // this will return empty_byte_array.
inline ByteArray SourcePositionTable() const;
- inline ByteArray SourcePositionTableIfCollected() const;
// [code_data_container]: A container indirection for all mutable fields.
DECL_ACCESSORS(code_data_container, CodeDataContainer)
@@ -387,7 +389,6 @@ class Code : public HeapObject {
DECL_PRINTER(Code)
DECL_VERIFIER(Code)
- void PrintDeoptLocation(FILE* out, const char* str, Address pc);
bool CanDeoptAt(Address pc);
void SetMarkedForDeoptimization(const char* reason);
@@ -773,18 +774,15 @@ class BytecodeArray : public FixedArrayBase {
// * ByteArray (when source positions have been collected for the bytecode)
// * exception (when an error occurred while explicitly collecting source
// positions for pre-existing bytecode).
- DECL_ACCESSORS(source_position_table, Object)
+ DECL_SYNCHRONIZED_ACCESSORS(source_position_table, Object)
- // This must only be called if source position collection has already been
- // attempted. (If it failed because of an exception then it will return
- // empty_byte_array).
- inline ByteArray SourcePositionTable() const;
- // If source positions have not been collected or an exception has been thrown
- // this will return empty_byte_array.
- inline ByteArray SourcePositionTableIfCollected() const;
inline bool HasSourcePositionTable() const;
inline bool DidSourcePositionGenerationFail() const;
+ // If source positions have not been collected or an exception has been thrown
+ // this will return empty_byte_array.
+ inline ByteArray SourcePositionTable() const;
+
// Indicates that an attempt was made to collect source positions, but that it
// failed most likely due to stack exhaustion. When in this state
// |SourcePositionTable| will return an empty byte array rather than crashing
diff --git a/deps/v8/src/objects/compressed-slots-inl.h b/deps/v8/src/objects/compressed-slots-inl.h
index 72a2420ed2..81eff427e4 100644
--- a/deps/v8/src/objects/compressed-slots-inl.h
+++ b/deps/v8/src/objects/compressed-slots-inl.h
@@ -164,11 +164,21 @@ Object OffHeapCompressedObjectSlot::Relaxed_Load(const Isolate* isolate) const {
return Object(DecompressTaggedAny(isolate, value));
}
+Object OffHeapCompressedObjectSlot::Acquire_Load(const Isolate* isolate) const {
+ AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location());
+ return Object(DecompressTaggedAny(isolate, value));
+}
+
void OffHeapCompressedObjectSlot::Relaxed_Store(Object value) const {
Tagged_t ptr = CompressTagged(value.ptr());
AsAtomicTagged::Relaxed_Store(location(), ptr);
}
+void OffHeapCompressedObjectSlot::Release_Store(Object value) const {
+ Tagged_t ptr = CompressTagged(value.ptr());
+ AsAtomicTagged::Release_Store(location(), ptr);
+}
+
void OffHeapCompressedObjectSlot::Release_CompareAndSwap(Object old,
Object target) const {
Tagged_t old_ptr = CompressTagged(old.ptr());
diff --git a/deps/v8/src/objects/compressed-slots.h b/deps/v8/src/objects/compressed-slots.h
index d234b9d1b7..b8f3872384 100644
--- a/deps/v8/src/objects/compressed-slots.h
+++ b/deps/v8/src/objects/compressed-slots.h
@@ -135,7 +135,9 @@ class OffHeapCompressedObjectSlot
inline void store(Object value) const;
inline Object Relaxed_Load(const Isolate* isolate) const;
+ inline Object Acquire_Load(const Isolate* isolate) const;
inline void Relaxed_Store(Object value) const;
+ inline void Release_Store(Object value) const;
inline void Release_CompareAndSwap(Object old, Object target) const;
};
diff --git a/deps/v8/src/objects/contexts-inl.h b/deps/v8/src/objects/contexts-inl.h
index aeff21427d..9bd30530c9 100644
--- a/deps/v8/src/objects/contexts-inl.h
+++ b/deps/v8/src/objects/contexts-inl.h
@@ -9,6 +9,7 @@
#include "src/objects/contexts.h"
#include "src/objects/dictionary-inl.h"
#include "src/objects/fixed-array-inl.h"
+#include "src/objects/js-function-inl.h"
#include "src/objects/js-objects-inl.h"
#include "src/objects/map-inl.h"
#include "src/objects/objects-inl.h"
diff --git a/deps/v8/src/objects/contexts.h b/deps/v8/src/objects/contexts.h
index ec032a6be4..e63ed580f4 100644
--- a/deps/v8/src/objects/contexts.h
+++ b/deps/v8/src/objects/contexts.h
@@ -9,7 +9,7 @@
#include "src/objects/function-kind.h"
#include "src/objects/ordered-hash-table.h"
#include "src/objects/osr-optimized-code-cache.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/debug-objects.h b/deps/v8/src/objects/debug-objects.h
index 22eea25481..b9012fd9c1 100644
--- a/deps/v8/src/objects/debug-objects.h
+++ b/deps/v8/src/objects/debug-objects.h
@@ -11,7 +11,7 @@
#include "src/objects/fixed-array.h"
#include "src/objects/objects.h"
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/descriptor-array-inl.h b/deps/v8/src/objects/descriptor-array-inl.h
index d9e3408dd9..a7c6443a05 100644
--- a/deps/v8/src/objects/descriptor-array-inl.h
+++ b/deps/v8/src/objects/descriptor-array-inl.h
@@ -228,7 +228,7 @@ void DescriptorArray::Append(Descriptor* desc) {
for (insertion = descriptor_number; insertion > 0; --insertion) {
Name key = GetSortedKey(insertion - 1);
- if (key.Hash() <= hash) break;
+ if (key.hash() <= hash) break;
SetSortedKey(insertion, GetSortedKeyIndex(insertion - 1));
}
diff --git a/deps/v8/src/objects/descriptor-array.h b/deps/v8/src/objects/descriptor-array.h
index f689481929..890863d5a0 100644
--- a/deps/v8/src/objects/descriptor-array.h
+++ b/deps/v8/src/objects/descriptor-array.h
@@ -113,7 +113,7 @@ class DescriptorArray
int slack = 0);
// Sort the instance descriptors by the hash codes of their keys.
- void Sort();
+ V8_EXPORT_PRIVATE void Sort();
// Search the instance descriptors for given name. {concurrent_search} signals
// if we are doing the search on a background thread. If so, we will sacrifice
diff --git a/deps/v8/src/objects/elements-kind.cc b/deps/v8/src/objects/elements-kind.cc
index 78670f25bd..15528244e6 100644
--- a/deps/v8/src/objects/elements-kind.cc
+++ b/deps/v8/src/objects/elements-kind.cc
@@ -115,6 +115,13 @@ const char* ElementsKindToString(ElementsKind kind) {
}
}
+const char* CompactElementsKindToString(CompactElementsKind kind) {
+ if (kind == CompactElementsKind::NON_COMPACT_ELEMENTS_KIND) {
+ return "NON_COMPACT_ELEMENTS_KIND";
+ }
+ return ElementsKindToString(static_cast<ElementsKind>(kind));
+}
+
const ElementsKind kFastElementsKindSequence[kFastElementsKindCount] = {
PACKED_SMI_ELEMENTS, // 0
HOLEY_SMI_ELEMENTS, // 1
diff --git a/deps/v8/src/objects/elements-kind.h b/deps/v8/src/objects/elements-kind.h
index a5da057aab..4bd5672b44 100644
--- a/deps/v8/src/objects/elements-kind.h
+++ b/deps/v8/src/objects/elements-kind.h
@@ -364,13 +364,15 @@ enum class CompactElementsKind : uint8_t {
};
inline CompactElementsKind ToCompactElementsKind(ElementsKind kind) {
- if (base::IsInRange(kind, PACKED_ELEMENTS, HOLEY_DOUBLE_ELEMENTS)) {
+ if (base::IsInRange(kind, PACKED_SMI_ELEMENTS, HOLEY_DOUBLE_ELEMENTS)) {
return static_cast<CompactElementsKind>(kind);
}
return CompactElementsKind::NON_COMPACT_ELEMENTS_KIND;
}
+const char* CompactElementsKindToString(CompactElementsKind kind);
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/objects/elements.cc b/deps/v8/src/objects/elements.cc
index 3057a9ee5a..32bd891a74 100644
--- a/deps/v8/src/objects/elements.cc
+++ b/deps/v8/src/objects/elements.cc
@@ -22,8 +22,8 @@
#include "src/objects/slots-atomic-inl.h"
#include "src/objects/slots.h"
#include "src/utils/utils.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions.h"
// Each concrete ElementsAccessor can handle exactly one ElementsKind,
// several abstract ElementsAccessor classes are used to allow sharing
@@ -3627,12 +3627,12 @@ class TypedElementsAccessor
Handle<JSTypedArray> destination_ta =
Handle<JSTypedArray>::cast(destination);
DCHECK_LE(offset + length, destination_ta->length());
- CHECK(!destination_ta->WasDetached());
if (length == 0) return *isolate->factory()->undefined_value();
// All conversions from TypedArrays can be done without allocation.
if (source->IsJSTypedArray()) {
+ CHECK(!destination_ta->WasDetached());
Handle<JSTypedArray> source_ta = Handle<JSTypedArray>::cast(source);
ElementsKind source_kind = source_ta->GetElementsKind();
bool source_is_bigint =
@@ -3647,6 +3647,7 @@ class TypedElementsAccessor
return *isolate->factory()->undefined_value();
}
} else if (source->IsJSArray()) {
+ CHECK(!destination_ta->WasDetached());
// Fast cases for packed numbers kinds where we don't need to allocate.
Handle<JSArray> source_js_array = Handle<JSArray>::cast(source);
size_t current_length;
diff --git a/deps/v8/src/objects/embedder-data-array.h b/deps/v8/src/objects/embedder-data-array.h
index 4fdf64bfc8..728c3cf86a 100644
--- a/deps/v8/src/objects/embedder-data-array.h
+++ b/deps/v8/src/objects/embedder-data-array.h
@@ -8,7 +8,7 @@
#include "src/common/globals.h"
#include "src/handles/maybe-handles.h"
#include "src/objects/heap-object.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/embedder-data-slot-inl.h b/deps/v8/src/objects/embedder-data-slot-inl.h
index 3e5276166d..2ede262f80 100644
--- a/deps/v8/src/objects/embedder-data-slot-inl.h
+++ b/deps/v8/src/objects/embedder-data-slot-inl.h
@@ -99,7 +99,7 @@ bool EmbedderDataSlot::store_aligned_pointer(Isolate* isolate, void* ptr) {
}
EmbedderDataSlot::RawData EmbedderDataSlot::load_raw(
- Isolate* isolate, const DisallowHeapAllocation& no_gc) const {
+ Isolate* isolate, const DisallowGarbageCollection& no_gc) const {
// We don't care about atomicity of access here because embedder slots
// are accessed this way only by serializer from the main thread when
// GC is not active (concurrent marker may still look at the tagged part
@@ -120,7 +120,7 @@ EmbedderDataSlot::RawData EmbedderDataSlot::load_raw(
void EmbedderDataSlot::store_raw(Isolate* isolate,
EmbedderDataSlot::RawData data,
- const DisallowHeapAllocation& no_gc) {
+ const DisallowGarbageCollection& no_gc) {
// We currently have to treat zero as nullptr in embedder slots.
if (data) data = EncodeExternalPointer(isolate, data);
gc_safe_store(data);
diff --git a/deps/v8/src/objects/embedder-data-slot.h b/deps/v8/src/objects/embedder-data-slot.h
index 2881ca03b3..68d71c0177 100644
--- a/deps/v8/src/objects/embedder-data-slot.h
+++ b/deps/v8/src/objects/embedder-data-slot.h
@@ -75,9 +75,9 @@ class EmbedderDataSlot
void* ptr);
V8_INLINE RawData load_raw(Isolate* isolate,
- const DisallowHeapAllocation& no_gc) const;
+ const DisallowGarbageCollection& no_gc) const;
V8_INLINE void store_raw(Isolate* isolate, RawData data,
- const DisallowHeapAllocation& no_gc);
+ const DisallowGarbageCollection& no_gc);
private:
// Stores given value to the embedder data slot in a concurrent-marker
diff --git a/deps/v8/src/objects/feedback-vector-inl.h b/deps/v8/src/objects/feedback-vector-inl.h
index 5979e3969f..6db9230ebb 100644
--- a/deps/v8/src/objects/feedback-vector-inl.h
+++ b/deps/v8/src/objects/feedback-vector-inl.h
@@ -21,14 +21,13 @@
namespace v8 {
namespace internal {
-OBJECT_CONSTRUCTORS_IMPL(FeedbackVector, HeapObject)
+TQ_OBJECT_CONSTRUCTORS_IMPL(FeedbackVector)
OBJECT_CONSTRUCTORS_IMPL(FeedbackMetadata, HeapObject)
OBJECT_CONSTRUCTORS_IMPL(ClosureFeedbackCellArray, FixedArray)
NEVER_READ_ONLY_SPACE_IMPL(FeedbackVector)
NEVER_READ_ONLY_SPACE_IMPL(ClosureFeedbackCellArray)
-CAST_ACCESSOR(FeedbackVector)
CAST_ACCESSOR(FeedbackMetadata)
CAST_ACCESSOR(ClosureFeedbackCellArray)
@@ -99,22 +98,7 @@ Handle<FeedbackCell> ClosureFeedbackCellArray::GetFeedbackCell(int index) {
return handle(FeedbackCell::cast(get(index)), GetIsolate());
}
-ACCESSORS(FeedbackVector, shared_function_info, SharedFunctionInfo,
- kSharedFunctionInfoOffset)
-WEAK_ACCESSORS(FeedbackVector, optimized_code_weak_or_smi,
- kOptimizedCodeWeakOrSmiOffset)
-ACCESSORS(FeedbackVector, closure_feedback_cell_array, ClosureFeedbackCellArray,
- kClosureFeedbackCellArrayOffset)
-INT32_ACCESSORS(FeedbackVector, length, kLengthOffset)
-INT32_ACCESSORS(FeedbackVector, invocation_count, kInvocationCountOffset)
-INT32_ACCESSORS(FeedbackVector, profiler_ticks, kProfilerTicksOffset)
-
-void FeedbackVector::clear_padding() {
- if (FIELD_SIZE(kPaddingOffset) == 0) return;
- DCHECK_EQ(4, FIELD_SIZE(kPaddingOffset));
- memset(reinterpret_cast<void*>(address() + kPaddingOffset), 0,
- FIELD_SIZE(kPaddingOffset));
-}
+void FeedbackVector::clear_padding() { set_padding(0); }
bool FeedbackVector::is_empty() const { return length() == 0; }
@@ -156,24 +140,12 @@ FeedbackSlot FeedbackVector::ToSlot(intptr_t index) {
}
MaybeObject FeedbackVector::Get(FeedbackSlot slot) const {
- const Isolate* isolate = GetIsolateForPtrCompr(*this);
- return Get(isolate, slot);
+ return raw_feedback_slots(GetIndex(slot));
}
MaybeObject FeedbackVector::Get(const Isolate* isolate,
FeedbackSlot slot) const {
- return get(isolate, GetIndex(slot));
-}
-
-MaybeObject FeedbackVector::get(int index) const {
- const Isolate* isolate = GetIsolateForPtrCompr(*this);
- return get(isolate, index);
-}
-
-MaybeObject FeedbackVector::get(const Isolate* isolate, int index) const {
- DCHECK_LT(static_cast<unsigned>(index), static_cast<unsigned>(length()));
- int offset = OffsetOfElementAt(index);
- return RELAXED_READ_WEAK_FIELD(*this, offset);
+ return raw_feedback_slots(isolate, GetIndex(slot));
}
Handle<FeedbackCell> FeedbackVector::GetClosureFeedbackCell(int index) const {
@@ -185,28 +157,16 @@ Handle<FeedbackCell> FeedbackVector::GetClosureFeedbackCell(int index) const {
void FeedbackVector::Set(FeedbackSlot slot, MaybeObject value,
WriteBarrierMode mode) {
- set(GetIndex(slot), value, mode);
-}
-
-void FeedbackVector::set(int index, MaybeObject value, WriteBarrierMode mode) {
- DCHECK_GE(index, 0);
- DCHECK_LT(index, this->length());
- int offset = OffsetOfElementAt(index);
- RELAXED_WRITE_WEAK_FIELD(*this, offset, value);
- CONDITIONAL_WEAK_WRITE_BARRIER(*this, offset, value, mode);
+ set_raw_feedback_slots(GetIndex(slot), value, mode);
}
void FeedbackVector::Set(FeedbackSlot slot, Object value,
WriteBarrierMode mode) {
- set(GetIndex(slot), MaybeObject::FromObject(value), mode);
-}
-
-void FeedbackVector::set(int index, Object value, WriteBarrierMode mode) {
- set(index, MaybeObject::FromObject(value), mode);
+ set_raw_feedback_slots(GetIndex(slot), MaybeObject::FromObject(value), mode);
}
inline MaybeObjectSlot FeedbackVector::slots_start() {
- return RawMaybeWeakField(kFeedbackSlotsOffset);
+ return RawMaybeWeakField(OffsetOfElementAt(0));
}
// Helper function to transform the feedback to BinaryOperationHint.
@@ -334,8 +294,7 @@ MaybeObject FeedbackNexus::GetFeedbackExtra() const {
FeedbackSlotKind kind = vector().GetKind(slot());
DCHECK_LT(1, FeedbackMetadata::GetSlotSize(kind));
#endif
- int extra_index = vector().GetIndex(slot()) + 1;
- return vector().get(extra_index);
+ return vector().Get(slot().WithOffset(1));
}
void FeedbackNexus::SetFeedback(Object feedback, WriteBarrierMode mode) {
@@ -354,8 +313,8 @@ void FeedbackNexus::SetFeedbackExtra(Object feedback_extra,
DCHECK_LT(1, FeedbackMetadata::GetSlotSize(kind));
FeedbackVector::AssertNoLegacyTypes(MaybeObject::FromObject(feedback_extra));
#endif
- int index = vector().GetIndex(slot()) + 1;
- vector().set(index, MaybeObject::FromObject(feedback_extra), mode);
+ vector().Set(slot().WithOffset(1), MaybeObject::FromObject(feedback_extra),
+ mode);
}
void FeedbackNexus::SetFeedbackExtra(MaybeObject feedback_extra,
@@ -363,8 +322,7 @@ void FeedbackNexus::SetFeedbackExtra(MaybeObject feedback_extra,
#ifdef DEBUG
FeedbackVector::AssertNoLegacyTypes(feedback_extra);
#endif
- int index = vector().GetIndex(slot()) + 1;
- vector().set(index, feedback_extra, mode);
+ vector().Set(slot().WithOffset(1), feedback_extra, mode);
}
Isolate* FeedbackNexus::GetIsolate() const { return vector().GetIsolate(); }
diff --git a/deps/v8/src/objects/feedback-vector.cc b/deps/v8/src/objects/feedback-vector.cc
index cf1712b0f0..d48cd7eb28 100644
--- a/deps/v8/src/objects/feedback-vector.cc
+++ b/deps/v8/src/objects/feedback-vector.cc
@@ -266,7 +266,6 @@ Handle<FeedbackVector> FeedbackVector::New(
for (int i = 0; i < slot_count;) {
FeedbackSlot slot(i);
FeedbackSlotKind kind = feedback_metadata->GetKind(slot);
- int index = FeedbackVector::GetIndex(slot);
int entry_size = FeedbackMetadata::GetSlotSize(kind);
Object extra_value = *uninitialized_sentinel;
@@ -275,19 +274,19 @@ Handle<FeedbackVector> FeedbackVector::New(
case FeedbackSlotKind::kLoadGlobalNotInsideTypeof:
case FeedbackSlotKind::kStoreGlobalSloppy:
case FeedbackSlotKind::kStoreGlobalStrict:
- vector->set(index, HeapObjectReference::ClearedValue(isolate),
+ vector->Set(slot, HeapObjectReference::ClearedValue(isolate),
SKIP_WRITE_BARRIER);
break;
case FeedbackSlotKind::kForIn:
case FeedbackSlotKind::kCompareOp:
case FeedbackSlotKind::kBinaryOp:
- vector->set(index, Smi::zero(), SKIP_WRITE_BARRIER);
+ vector->Set(slot, Smi::zero(), SKIP_WRITE_BARRIER);
break;
case FeedbackSlotKind::kLiteral:
- vector->set(index, Smi::zero(), SKIP_WRITE_BARRIER);
+ vector->Set(slot, Smi::zero(), SKIP_WRITE_BARRIER);
break;
case FeedbackSlotKind::kCall:
- vector->set(index, *uninitialized_sentinel, SKIP_WRITE_BARRIER);
+ vector->Set(slot, *uninitialized_sentinel, SKIP_WRITE_BARRIER);
extra_value = Smi::zero();
break;
case FeedbackSlotKind::kCloneObject:
@@ -303,7 +302,7 @@ Handle<FeedbackVector> FeedbackVector::New(
case FeedbackSlotKind::kStoreDataPropertyInLiteral:
case FeedbackSlotKind::kTypeProfile:
case FeedbackSlotKind::kInstanceOf:
- vector->set(index, *uninitialized_sentinel, SKIP_WRITE_BARRIER);
+ vector->Set(slot, *uninitialized_sentinel, SKIP_WRITE_BARRIER);
break;
case FeedbackSlotKind::kInvalid:
@@ -312,7 +311,7 @@ Handle<FeedbackVector> FeedbackVector::New(
break;
}
for (int j = 1; j < entry_size; j++) {
- vector->set(index + j, extra_value, SKIP_WRITE_BARRIER);
+ vector->Set(slot.WithOffset(j), extra_value, SKIP_WRITE_BARRIER);
}
i += entry_size;
}
@@ -374,6 +373,11 @@ void FeedbackVector::AddToVectorsForProfilingTools(
isolate->SetFeedbackVectorsForProfilingTools(*list);
}
+void FeedbackVector::SaturatingIncrementProfilerTicks() {
+ int ticks = profiler_ticks();
+ if (ticks < Smi::kMaxValue) set_profiler_ticks(ticks + 1);
+}
+
// static
void FeedbackVector::SetOptimizedCode(Handle<FeedbackVector> vector,
Handle<Code> code) {
@@ -409,14 +413,7 @@ void FeedbackVector::EvictOptimizedCodeMarkedForDeoptimization(
Code code = Code::cast(slot->GetHeapObject());
if (code.marked_for_deoptimization()) {
- if (FLAG_trace_deopt) {
- CodeTracer::Scope scope(GetIsolate()->GetCodeTracer());
- PrintF(scope.file(),
- "[evicting optimized code marked for deoptimization (%s) for ",
- reason);
- shared.ShortPrint(scope.file());
- PrintF(scope.file(), "]\n");
- }
+ Deoptimizer::TraceEvictFromOptimizedCodeCache(shared, reason);
if (!code.deopt_already_counted()) {
code.set_deopt_already_counted(true);
}
diff --git a/deps/v8/src/objects/feedback-vector.h b/deps/v8/src/objects/feedback-vector.h
index f84a33c598..677ec22457 100644
--- a/deps/v8/src/objects/feedback-vector.h
+++ b/deps/v8/src/objects/feedback-vector.h
@@ -17,6 +17,7 @@
#include "src/objects/name.h"
#include "src/objects/type-hints.h"
#include "src/zone/zone-containers.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -180,38 +181,17 @@ class ClosureFeedbackCellArray : public FixedArray {
// - optimized code cell (weak cell or Smi marker)
// followed by an array of feedback slots, of length determined by the feedback
// metadata.
-class FeedbackVector : public HeapObject {
+class FeedbackVector
+ : public TorqueGeneratedFeedbackVector<FeedbackVector, HeapObject> {
public:
NEVER_READ_ONLY_SPACE
- DECL_CAST(FeedbackVector)
-
inline bool is_empty() const;
inline FeedbackMetadata metadata() const;
- // [shared_function_info]: The shared function info for the function with this
- // feedback vector.
- DECL_ACCESSORS(shared_function_info, SharedFunctionInfo)
-
- // [optimized_code_weak_or_smi]: weak reference to optimized code or a Smi
- // marker defining optimization behaviour.
- DECL_ACCESSORS(optimized_code_weak_or_smi, MaybeObject)
-
- // [feedback_cell_array]: The FixedArray to hold the feedback cells for any
- // closures created by this function.
- DECL_ACCESSORS(closure_feedback_cell_array, ClosureFeedbackCellArray)
-
- // [length]: The length of the feedback vector (not including the header, i.e.
- // the number of feedback slots).
- DECL_INT32_ACCESSORS(length)
-
- // [invocation_count]: The number of times this function has been invoked.
- DECL_INT32_ACCESSORS(invocation_count)
-
- // [profiler_ticks]: The number of times this function has been seen by the
- // runtime profiler.
- DECL_INT32_ACCESSORS(profiler_ticks)
+ // Increment profiler ticks, saturating at the maximal value.
+ void SaturatingIncrementProfilerTicks();
// Initialize the padding if necessary.
inline void clear_padding();
@@ -239,16 +219,10 @@ class FeedbackVector : public HeapObject {
static inline FeedbackSlot ToSlot(intptr_t index);
inline MaybeObject Get(FeedbackSlot slot) const;
inline MaybeObject Get(const Isolate* isolate, FeedbackSlot slot) const;
- inline MaybeObject get(int index) const;
- inline MaybeObject get(const Isolate* isolate, int index) const;
inline void Set(FeedbackSlot slot, MaybeObject value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
- inline void set(int index, MaybeObject value,
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
inline void Set(FeedbackSlot slot, Object value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
- inline void set(int index, Object value,
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
// Returns the feedback cell at |index| that is used to create the
// closure.
@@ -300,7 +274,6 @@ class FeedbackVector : public HeapObject {
V8_EXPORT_PRIVATE static void AssertNoLegacyTypes(MaybeObject object);
DECL_PRINTER(FeedbackVector)
- DECL_VERIFIER(FeedbackVector)
void FeedbackSlotPrint(std::ostream& os, FeedbackSlot slot); // NOLINT
@@ -320,28 +293,23 @@ class FeedbackVector : public HeapObject {
// garbage collection (e.g., for patching the cache).
static inline Symbol RawUninitializedSentinel(Isolate* isolate);
- // Layout description.
- DEFINE_FIELD_OFFSET_CONSTANTS(HeapObject::kHeaderSize,
- TORQUE_GENERATED_FEEDBACK_VECTOR_FIELDS)
-
- static_assert(kSize % kObjectAlignment == 0,
+ static_assert(kHeaderSize % kObjectAlignment == 0,
"Header must be padded for alignment");
- static const int kFeedbackSlotsOffset = kHeaderSize;
class BodyDescriptor;
static constexpr int OffsetOfElementAt(int index) {
- return kFeedbackSlotsOffset + index * kTaggedSize;
+ return kRawFeedbackSlotsOffset + index * kTaggedSize;
}
- // Garbage collection support.
- static constexpr int SizeFor(int length) { return OffsetOfElementAt(length); }
+ TQ_OBJECT_CONSTRUCTORS(FeedbackVector)
private:
static void AddToVectorsForProfilingTools(Isolate* isolate,
Handle<FeedbackVector> vector);
- OBJECT_CONSTRUCTORS(FeedbackVector, HeapObject);
+ // Don't expose the raw feedback slot getter/setter.
+ using TorqueGeneratedFeedbackVector::raw_feedback_slots;
};
class V8_EXPORT_PRIVATE FeedbackVectorSpec {
@@ -789,12 +757,27 @@ class V8_EXPORT_PRIVATE FeedbackIterator final {
Map map() { return map_; }
MaybeObject handler() { return handler_; }
+ static int SizeFor(int number_of_entries) {
+ CHECK_GT(number_of_entries, 0);
+ return number_of_entries * kEntrySize;
+ }
+
+ static int MapIndexForEntry(int entry) {
+ CHECK_GE(entry, 0);
+ return entry * kEntrySize;
+ }
+
+ static int HandlerIndexForEntry(int entry) {
+ CHECK_GE(entry, 0);
+ return (entry * kEntrySize) + kHandlerOffset;
+ }
+
private:
void AdvancePolymorphic();
enum State { kMonomorphic, kPolymorphic, kOther };
+
static constexpr int kEntrySize = 2;
static constexpr int kHandlerOffset = 1;
-
Handle<WeakFixedArray> polymorphic_feedback_;
Map map_;
MaybeObject handler_;
diff --git a/deps/v8/src/objects/feedback-vector.tq b/deps/v8/src/objects/feedback-vector.tq
index 8ede5579d5..794a159ca9 100644
--- a/deps/v8/src/objects/feedback-vector.tq
+++ b/deps/v8/src/objects/feedback-vector.tq
@@ -2,10 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+@generateBodyDescriptor
+@generateCppClass
extern class FeedbackVector extends HeapObject {
- shared_function_info: SharedFunctionInfo;
- optimized_code_weak_or_smi: Weak<Code>|Smi;
- closure_feedback_cell_array: FixedArray;
const length: int32;
invocation_count: int32;
profiler_ticks: int32;
@@ -13,8 +12,10 @@ extern class FeedbackVector extends HeapObject {
// tagged pointers, we should make it conditional; however, platform-specific
// interacts badly with GCMole, so we need to address that first.
padding: uint32;
- // TODO(tebbi): The variable-length feedback_slots field should be declared
- // here once it is possible to declare tagged slots after untagged slots.
+ shared_function_info: SharedFunctionInfo;
+ optimized_code_weak_or_smi: Weak<Code>|Smi;
+ closure_feedback_cell_array: ClosureFeedbackCellArray;
+ raw_feedback_slots[length]: MaybeObject;
}
extern class FeedbackMetadata extends HeapObject;
diff --git a/deps/v8/src/objects/fixed-array-inl.h b/deps/v8/src/objects/fixed-array-inl.h
index 7c0013e3b2..e602243158 100644
--- a/deps/v8/src/objects/fixed-array-inl.h
+++ b/deps/v8/src/objects/fixed-array-inl.h
@@ -20,8 +20,7 @@
#include "src/objects/slots.h"
#include "src/roots/roots-inl.h"
#include "src/sanitizer/tsan.h"
-
-#include "torque-generated/class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -88,7 +87,6 @@ bool FixedArray::is_the_hole(Isolate* isolate, int index) {
return get(isolate, index).IsTheHole(isolate);
}
-#if !defined(_WIN32) || defined(_WIN64)
void FixedArray::set(int index, Smi value) {
DCHECK_NE(map(), GetReadOnlyRoots().fixed_cow_array_map());
DCHECK_LT(static_cast<unsigned>(index), static_cast<unsigned>(length()));
@@ -96,7 +94,6 @@ void FixedArray::set(int index, Smi value) {
int offset = OffsetOfElementAt(index);
RELAXED_WRITE_FIELD(*this, offset, value);
}
-#endif
void FixedArray::set(int index, Object value) {
DCHECK_NE(GetReadOnlyRoots().fixed_cow_array_map(), map());
@@ -236,7 +233,7 @@ int BinarySearch(T* array, Name name, int valid_entries,
// index). After doing the binary search and getting the correct internal
// index we check to have the index lower than valid_entries, if needed.
int high = array->number_of_entries() - 1;
- uint32_t hash = name.hash_field();
+ uint32_t hash = name.hash();
int limit = high;
DCHECK(low <= high);
@@ -244,7 +241,7 @@ int BinarySearch(T* array, Name name, int valid_entries,
while (low != high) {
int mid = low + (high - low) / 2;
Name mid_name = array->GetSortedKey(mid);
- uint32_t mid_hash = mid_name.hash_field();
+ uint32_t mid_hash = mid_name.hash();
if (mid_hash >= hash) {
high = mid;
@@ -256,7 +253,7 @@ int BinarySearch(T* array, Name name, int valid_entries,
for (; low <= limit; ++low) {
int sort_index = array->GetSortedKeyIndex(low);
Name entry = array->GetKey(InternalIndex(sort_index));
- uint32_t current_hash = entry.hash_field();
+ uint32_t current_hash = entry.hash();
if (current_hash != hash) {
// 'search_mode == ALL_ENTRIES' here and below is not needed since
// 'out_insertion_index != nullptr' implies 'search_mode == ALL_ENTRIES'.
@@ -288,12 +285,12 @@ template <SearchMode search_mode, typename T>
int LinearSearch(T* array, Name name, int valid_entries,
int* out_insertion_index) {
if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
- uint32_t hash = name.hash_field();
+ uint32_t hash = name.hash();
int len = array->number_of_entries();
for (int number = 0; number < len; number++) {
int sorted_index = array->GetSortedKeyIndex(number);
Name entry = array->GetKey(InternalIndex(sorted_index));
- uint32_t current_hash = entry.hash_field();
+ uint32_t current_hash = entry.hash();
if (current_hash > hash) {
*out_insertion_index = sorted_index;
return T::kNotFound;
diff --git a/deps/v8/src/objects/fixed-array.h b/deps/v8/src/objects/fixed-array.h
index 9ec197ca1f..5054f16b41 100644
--- a/deps/v8/src/objects/fixed-array.h
+++ b/deps/v8/src/objects/fixed-array.h
@@ -9,7 +9,7 @@
#include "src/objects/instance-type.h"
#include "src/objects/objects.h"
#include "src/objects/smi.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -122,18 +122,7 @@ class FixedArray
inline bool is_the_hole(Isolate* isolate, int index);
// Setter that doesn't need write barrier.
-#if defined(_WIN32) && !defined(_WIN64)
- inline void set(int index, Smi value) {
- DCHECK_NE(map(), GetReadOnlyRoots().fixed_cow_array_map());
- DCHECK_LT(static_cast<unsigned>(index), static_cast<unsigned>(length()));
- DCHECK(Object(value).IsSmi());
- int offset = OffsetOfElementAt(index);
- RELAXED_WRITE_FIELD(*this, offset, value);
- }
-#else
inline void set(int index, Smi value);
-#endif
-
// Setter with explicit barrier mode.
inline void set(int index, Object value, WriteBarrierMode mode);
@@ -307,7 +296,6 @@ class WeakFixedArray
int AllocatedSize();
- protected:
static int OffsetOfElementAt(int index) {
STATIC_ASSERT(kObjectsOffset == SizeFor(0));
return SizeFor(index);
diff --git a/deps/v8/src/objects/fixed-array.tq b/deps/v8/src/objects/fixed-array.tq
index 39428ab36c..86ebea5db8 100644
--- a/deps/v8/src/objects/fixed-array.tq
+++ b/deps/v8/src/objects/fixed-array.tq
@@ -91,7 +91,7 @@ extern macro StoreFixedArrayElement(
FixedArray, intptr, Smi, constexpr WriteBarrierMode): void;
extern operator '.floats[]=' macro StoreFixedDoubleArrayElement(
FixedDoubleArray, intptr, float64): void;
-extern operator '.floats[]=' macro StoreFixedDoubleArrayElementSmi(
+extern operator '.floats[]=' macro StoreFixedDoubleArrayElement(
FixedDoubleArray, Smi, float64): void;
extern operator '.floats[]' macro LoadFixedDoubleArrayElement(
FixedDoubleArray, intptr): float64;
diff --git a/deps/v8/src/objects/foreign.h b/deps/v8/src/objects/foreign.h
index 9d28109a12..2dd869d5ac 100644
--- a/deps/v8/src/objects/foreign.h
+++ b/deps/v8/src/objects/foreign.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_FOREIGN_H_
#include "src/objects/heap-object.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/free-space.h b/deps/v8/src/objects/free-space.h
index ad5ffa075c..7bed4a1a7c 100644
--- a/deps/v8/src/objects/free-space.h
+++ b/deps/v8/src/objects/free-space.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_FREE_SPACE_H_
#include "src/objects/heap-object.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/heap-object.h b/deps/v8/src/objects/heap-object.h
index 37abc61c11..2f16236e02 100644
--- a/deps/v8/src/objects/heap-object.h
+++ b/deps/v8/src/objects/heap-object.h
@@ -62,9 +62,7 @@ class HeapObject : public Object {
DECL_GETTER(synchronized_map_word, MapWord)
inline void synchronized_set_map_word(MapWord map_word);
- // TODO(v8:7464): Once RO_SPACE is shared between isolates, this method can be
- // removed as ReadOnlyRoots will be accessible from a global variable. For now
- // this method exists to help remove GetIsolate/GetHeap from HeapObject, in a
+ // This method exists to help remove GetIsolate/GetHeap from HeapObject, in a
// way that doesn't require passing Isolate/Heap down huge call chains or to
// places where it might not be safe to access it.
inline ReadOnlyRoots GetReadOnlyRoots() const;
diff --git a/deps/v8/src/objects/instance-type.h b/deps/v8/src/objects/instance-type.h
index 3a324e4b1f..2b230224e3 100644
--- a/deps/v8/src/objects/instance-type.h
+++ b/deps/v8/src/objects/instance-type.h
@@ -10,8 +10,7 @@
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
-
-#include "torque-generated/instance-types-tq.h"
+#include "torque-generated/instance-types.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/objects/internal-index.h b/deps/v8/src/objects/internal-index.h
index 7cc9fa6738..130d4d1868 100644
--- a/deps/v8/src/objects/internal-index.h
+++ b/deps/v8/src/objects/internal-index.h
@@ -40,7 +40,8 @@ class InternalIndex {
return static_cast<uint32_t>(entry_);
}
constexpr int as_int() const {
- CONSTEXPR_DCHECK(entry_ <= std::numeric_limits<int>::max());
+ CONSTEXPR_DCHECK(entry_ <=
+ static_cast<size_t>(std::numeric_limits<int>::max()));
return static_cast<int>(entry_);
}
diff --git a/deps/v8/src/objects/intl-objects.tq b/deps/v8/src/objects/intl-objects.tq
index cbfcc360bb..88714f2bee 100644
--- a/deps/v8/src/objects/intl-objects.tq
+++ b/deps/v8/src/objects/intl-objects.tq
@@ -134,6 +134,7 @@ bitfield struct JSSegmentIteratorFlags extends uint31 {
@generateCppClass
extern class JSSegmentIterator extends JSObject {
icu_break_iterator: Foreign; // Managed<icu::BreakIterator>
+ unicode_string: Foreign; // Managed<icu::UnicodeString>
flags: SmiTagged<JSSegmentIteratorFlags>;
}
@@ -153,4 +154,5 @@ extern class JSV8BreakIterator extends JSObject {
extern class JSCollator extends JSObject {
icu_collator: Foreign; // Managed<icu::Collator>
bound_compare: Undefined|JSFunction;
+ locale: String;
}
diff --git a/deps/v8/src/objects/js-array-buffer.h b/deps/v8/src/objects/js-array-buffer.h
index 3d6b293e2d..543cbc1a34 100644
--- a/deps/v8/src/objects/js-array-buffer.h
+++ b/deps/v8/src/objects/js-array-buffer.h
@@ -7,7 +7,7 @@
#include "src/objects/backing-store.h"
#include "src/objects/js-objects.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-array.h b/deps/v8/src/objects/js-array.h
index 6cf54df896..cd1d2d800d 100644
--- a/deps/v8/src/objects/js-array.h
+++ b/deps/v8/src/objects/js-array.h
@@ -8,7 +8,7 @@
#include "src/objects/allocation-site.h"
#include "src/objects/fixed-array.h"
#include "src/objects/js-objects.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-break-iterator.h b/deps/v8/src/objects/js-break-iterator.h
index 20c177a5f6..e06b7b42b0 100644
--- a/deps/v8/src/objects/js-break-iterator.h
+++ b/deps/v8/src/objects/js-break-iterator.h
@@ -15,7 +15,7 @@
#include "src/objects/intl-objects.h"
#include "src/objects/managed.h"
#include "src/objects/objects.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-collator.cc b/deps/v8/src/objects/js-collator.cc
index b3b3c8fb55..8d5dd0c56a 100644
--- a/deps/v8/src/objects/js-collator.cc
+++ b/deps/v8/src/objects/js-collator.cc
@@ -196,8 +196,26 @@ Handle<JSObject> JSCollator::ResolvedOptions(Isolate* isolate,
// [[Collation]] "collation"
// [[Numeric]] "numeric" kn
// [[CaseFirst]] "caseFirst" kf
- CreateDataPropertyForOptions(
- isolate, options, isolate->factory()->locale_string(), locale.c_str());
+
+ // If the collator return the locale differ from what got requested, we stored
+ // it in the collator->locale. Otherwise, we just use the one from the
+ // collator.
+ if (collator->locale().length() != 0) {
+ // Get the locale from collator->locale() since we know in some cases
+ // collator won't be able to return the requested one, such as zh_CN.
+ Handle<String> locale_from_collator(collator->locale(), isolate);
+ Maybe<bool> maybe = JSReceiver::CreateDataProperty(
+ isolate, options, isolate->factory()->locale_string(),
+ locale_from_collator, Just(kDontThrow));
+ DCHECK(maybe.FromJust());
+ USE(maybe);
+ } else {
+ // Just return from the collator for most of the cases that we can recover
+ // from the collator.
+ CreateDataPropertyForOptions(
+ isolate, options, isolate->factory()->locale_string(), locale.c_str());
+ }
+
CreateDataPropertyForOptions(isolate, options,
isolate->factory()->usage_string(), usage);
CreateDataPropertyForOptions(
@@ -424,6 +442,9 @@ MaybeHandle<JSCollator> JSCollator::New(Isolate* isolate, Handle<Map> map,
}
DCHECK(U_SUCCESS(status));
+ icu::Locale collator_locale(
+ icu_collator->getLocale(ULOC_VALID_LOCALE, status));
+
// 22. If relevantExtensionKeys contains "kn", then
// a. Set collator.[[Numeric]] to ! SameValue(r.[[kn]], "true").
//
@@ -521,11 +542,15 @@ MaybeHandle<JSCollator> JSCollator::New(Isolate* isolate, Handle<Map> map,
Managed<icu::Collator>::FromUniquePtr(isolate, 0,
std::move(icu_collator));
+ // We only need to do so if it is different from the collator would return.
+ Handle<String> locale_str = isolate->factory()->NewStringFromAsciiChecked(
+ (collator_locale != icu_locale) ? r.locale.c_str() : "");
// Now all properties are ready, so we can allocate the result object.
Handle<JSCollator> collator = Handle<JSCollator>::cast(
isolate->factory()->NewFastOrSlowJSObjectFromMap(map));
DisallowHeapAllocation no_gc;
collator->set_icu_collator(*managed_collator);
+ collator->set_locale(*locale_str);
// 29. Return collator.
return collator;
diff --git a/deps/v8/src/objects/js-date-time-format.cc b/deps/v8/src/objects/js-date-time-format.cc
index c5181ecb9e..3e9cff0df8 100644
--- a/deps/v8/src/objects/js-date-time-format.cc
+++ b/deps/v8/src/objects/js-date-time-format.cc
@@ -432,8 +432,10 @@ std::string CanonicalizeTimeZoneID(const std::string& input) {
}
} else if (memcmp(upper.c_str(), "US/", 3) == 0) {
std::string title = ToTitleCaseTimezoneLocation(input);
- // Change "Us/" to "US/"
- title[1] = 'S';
+ if (title.length() >= 2) {
+ // Change "Us/" to "US/"
+ title[1] = 'S';
+ }
return title;
} else if (memcmp(upper.c_str(), "SYSTEMV/", 8) == 0) {
upper.replace(0, 8, "SystemV/");
@@ -568,8 +570,8 @@ MaybeHandle<JSObject> JSDateTimeFormat::ResolvedOptions(
// [[Hour]] "hour"
// [[Minute]] "minute"
// [[Second]] "second"
- // [[TimeZoneName]] "timeZoneName"
// [[FractionalSecondDigits]] "fractionalSecondDigits"
+ // [[TimeZoneName]] "timeZoneName"
Maybe<bool> maybe_create_locale = JSReceiver::CreateDataProperty(
isolate, options, factory->locale_string(), locale, Just(kDontThrow));
DCHECK(maybe_create_locale.FromJust());
@@ -636,6 +638,18 @@ MaybeHandle<JSObject> JSDateTimeFormat::ResolvedOptions(
if (date_time_format->date_style() == DateTimeStyle::kUndefined &&
date_time_format->time_style() == DateTimeStyle::kUndefined) {
for (const auto& item : GetPatternItems()) {
+ // fractionalSecondsDigits need to be added before timeZoneName
+ if (item.property == "timeZoneName") {
+ int fsd = FractionalSecondDigitsFromPattern(pattern);
+ if (fsd > 0) {
+ Maybe<bool> maybe_create_fractional_seconds_digits =
+ JSReceiver::CreateDataProperty(
+ isolate, options, factory->fractionalSecondDigits_string(),
+ factory->NewNumberFromInt(fsd), Just(kDontThrow));
+ DCHECK(maybe_create_fractional_seconds_digits.FromJust());
+ USE(maybe_create_fractional_seconds_digits);
+ }
+ }
for (const auto& pair : item.pairs) {
if (pattern.find(pair.pattern) != std::string::npos) {
Maybe<bool> maybe_create_property = JSReceiver::CreateDataProperty(
@@ -649,15 +663,6 @@ MaybeHandle<JSObject> JSDateTimeFormat::ResolvedOptions(
}
}
}
- int fsd = FractionalSecondDigitsFromPattern(pattern);
- if (fsd > 0) {
- Maybe<bool> maybe_create_fractional_seconds_digits =
- JSReceiver::CreateDataProperty(
- isolate, options, factory->fractionalSecondDigits_string(),
- factory->NewNumberFromInt(fsd), Just(kDontThrow));
- DCHECK(maybe_create_fractional_seconds_digits.FromJust());
- USE(maybe_create_fractional_seconds_digits);
- }
}
// dateStyle
@@ -1653,6 +1658,19 @@ MaybeHandle<JSDateTimeFormat> JSDateTimeFormat::New(
bool has_hour_option = false;
std::string skeleton;
for (const PatternData& item : GetPatternData(hc)) {
+ // Need to read fractionalSecondDigits before reading the timeZoneName
+ if (item.property == "timeZoneName") {
+ // Let _value_ be ? GetNumberOption(options, "fractionalSecondDigits", 1,
+ // 3, *undefined*). The *undefined* is represented by value 0 here.
+ Maybe<int> maybe_fsd = Intl::GetNumberOption(
+ isolate, options, factory->fractionalSecondDigits_string(), 1, 3, 0);
+ MAYBE_RETURN(maybe_fsd, MaybeHandle<JSDateTimeFormat>());
+ // Convert fractionalSecondDigits to skeleton.
+ int fsd = maybe_fsd.FromJust();
+ for (int i = 0; i < fsd; i++) {
+ skeleton += "S";
+ }
+ }
std::unique_ptr<char[]> input;
// i. Let prop be the name given in the Property column of the row.
// ii. Let value be ? GetOption(options, prop, "string", « the strings
@@ -1670,16 +1688,6 @@ MaybeHandle<JSDateTimeFormat> JSDateTimeFormat::New(
skeleton += item.map.find(input.get())->second;
}
}
- // Let _value_ be ? GetNumberOption(options, "fractionalSecondDigits", 1, 3,
- // *undefined*). The *undefined* is represented by value 0 here.
- Maybe<int> maybe_fsd = Intl::GetNumberOption(
- isolate, options, factory->fractionalSecondDigits_string(), 1, 3, 0);
- MAYBE_RETURN(maybe_fsd, MaybeHandle<JSDateTimeFormat>());
- // Convert fractionalSecondDigits to skeleton.
- int fsd = maybe_fsd.FromJust();
- for (int i = 0; i < fsd; i++) {
- skeleton += "S";
- }
// 29. Let matcher be ? GetOption(options, "formatMatcher", "string", «
// "basic", "best fit" », "best fit").
@@ -1738,13 +1746,32 @@ MaybeHandle<JSDateTimeFormat> JSDateTimeFormat::New(
// iii. If p is not undefined, then
// 1. Throw a TypeError exception.
if (skeleton.length() > 0) {
- THROW_NEW_ERROR(isolate,
- NewTypeError(MessageTemplate::kInvalid,
- factory->NewStringFromStaticChars("option"),
- date_style != DateTimeStyle::kUndefined
- ? factory->dateStyle_string()
- : factory->timeStyle_string()),
- JSDateTimeFormat);
+ std::string prop;
+ for (const auto& item : GetPatternItems()) {
+ for (const auto& pair : item.pairs) {
+ if (skeleton.find(pair.pattern) != std::string::npos) {
+ prop.assign(item.property);
+ break;
+ }
+ }
+ if (!prop.empty()) {
+ break;
+ }
+ }
+ if (prop.empty() && skeleton.find("S") != std::string::npos) {
+ prop.assign("fractionalSecondDigits");
+ }
+ if (!prop.empty()) {
+ THROW_NEW_ERROR(
+ isolate,
+ NewTypeError(MessageTemplate::kCantSetOptionXWhenYIsUsed,
+ factory->NewStringFromAsciiChecked(prop.c_str()),
+ date_style != DateTimeStyle::kUndefined
+ ? factory->dateStyle_string()
+ : factory->timeStyle_string()),
+ JSDateTimeFormat);
+ }
+ UNREACHABLE();
}
// b. Let pattern be DateTimeStylePattern(dateStyle, timeStyle,
// dataLocaleData, hc).
diff --git a/deps/v8/src/objects/js-date-time-format.h b/deps/v8/src/objects/js-date-time-format.h
index 1e5720760e..64c89eeaeb 100644
--- a/deps/v8/src/objects/js-date-time-format.h
+++ b/deps/v8/src/objects/js-date-time-format.h
@@ -16,7 +16,7 @@
#include "src/execution/isolate.h"
#include "src/objects/intl-objects.h"
#include "src/objects/managed.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
#include "unicode/uversion.h"
// Has to be the last include (doesn't have include guards):
diff --git a/deps/v8/src/objects/js-function-inl.h b/deps/v8/src/objects/js-function-inl.h
new file mode 100644
index 0000000000..606deb290a
--- /dev/null
+++ b/deps/v8/src/objects/js-function-inl.h
@@ -0,0 +1,304 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_OBJECTS_JS_FUNCTION_INL_H_
+#define V8_OBJECTS_JS_FUNCTION_INL_H_
+
+#include "src/codegen/compiler.h"
+#include "src/diagnostics/code-tracer.h"
+#include "src/heap/heap-inl.h"
+#include "src/ic/ic.h"
+#include "src/init/bootstrapper.h"
+#include "src/objects/feedback-cell-inl.h"
+#include "src/objects/js-function.h"
+#include "src/strings/string-builder-inl.h"
+
+// Has to be the last include (doesn't have include guards):
+#include "src/objects/object-macros.h"
+
+namespace v8 {
+namespace internal {
+
+TQ_OBJECT_CONSTRUCTORS_IMPL(JSFunctionOrBoundFunction)
+TQ_OBJECT_CONSTRUCTORS_IMPL(JSBoundFunction)
+OBJECT_CONSTRUCTORS_IMPL(JSFunction, JSFunctionOrBoundFunction)
+
+CAST_ACCESSOR(JSFunction)
+
+ACCESSORS(JSFunction, raw_feedback_cell, FeedbackCell, kFeedbackCellOffset)
+
+FeedbackVector JSFunction::feedback_vector() const {
+ DCHECK(has_feedback_vector());
+ return FeedbackVector::cast(raw_feedback_cell().value());
+}
+
+ClosureFeedbackCellArray JSFunction::closure_feedback_cell_array() const {
+ DCHECK(has_closure_feedback_cell_array());
+ return ClosureFeedbackCellArray::cast(raw_feedback_cell().value());
+}
+
+bool JSFunction::HasOptimizationMarker() {
+ return has_feedback_vector() && feedback_vector().has_optimization_marker();
+}
+
+void JSFunction::ClearOptimizationMarker() {
+ DCHECK(has_feedback_vector());
+ feedback_vector().ClearOptimizationMarker();
+}
+
+bool JSFunction::ChecksOptimizationMarker() {
+ return code().checks_optimization_marker();
+}
+
+bool JSFunction::IsMarkedForOptimization() {
+ return has_feedback_vector() && feedback_vector().optimization_marker() ==
+ OptimizationMarker::kCompileOptimized;
+}
+
+bool JSFunction::IsMarkedForConcurrentOptimization() {
+ return has_feedback_vector() &&
+ feedback_vector().optimization_marker() ==
+ OptimizationMarker::kCompileOptimizedConcurrent;
+}
+
+void JSFunction::MarkForOptimization(ConcurrencyMode mode) {
+ Isolate* isolate = GetIsolate();
+ if (!isolate->concurrent_recompilation_enabled() ||
+ isolate->bootstrapper()->IsActive()) {
+ mode = ConcurrencyMode::kNotConcurrent;
+ }
+
+ DCHECK(!is_compiled() || ActiveTierIsIgnition() || ActiveTierIsNCI());
+ DCHECK(!ActiveTierIsTurbofan());
+ DCHECK(shared().IsInterpreted());
+ DCHECK(shared().allows_lazy_compilation() ||
+ !shared().optimization_disabled());
+
+ if (mode == ConcurrencyMode::kConcurrent) {
+ if (IsInOptimizationQueue()) {
+ if (FLAG_trace_concurrent_recompilation) {
+ PrintF(" ** Not marking ");
+ ShortPrint();
+ PrintF(" -- already in optimization queue.\n");
+ }
+ return;
+ }
+ if (FLAG_trace_concurrent_recompilation) {
+ PrintF(" ** Marking ");
+ ShortPrint();
+ PrintF(" for concurrent recompilation.\n");
+ }
+ }
+
+ SetOptimizationMarker(mode == ConcurrencyMode::kConcurrent
+ ? OptimizationMarker::kCompileOptimizedConcurrent
+ : OptimizationMarker::kCompileOptimized);
+}
+
+bool JSFunction::IsInOptimizationQueue() {
+ return has_feedback_vector() && feedback_vector().optimization_marker() ==
+ OptimizationMarker::kInOptimizationQueue;
+}
+
+void JSFunction::CompleteInobjectSlackTrackingIfActive() {
+ if (!has_prototype_slot()) return;
+ if (has_initial_map() && initial_map().IsInobjectSlackTrackingInProgress()) {
+ initial_map().CompleteInobjectSlackTracking(GetIsolate());
+ }
+}
+
+AbstractCode JSFunction::abstract_code() {
+ if (ActiveTierIsIgnition()) {
+ return AbstractCode::cast(shared().GetBytecodeArray());
+ } else {
+ return AbstractCode::cast(code());
+ }
+}
+
+int JSFunction::length() { return shared().length(); }
+
+Code JSFunction::code() const {
+ return Code::cast(RELAXED_READ_FIELD(*this, kCodeOffset));
+}
+
+void JSFunction::set_code(Code value) {
+ DCHECK(!ObjectInYoungGeneration(value));
+ RELAXED_WRITE_FIELD(*this, kCodeOffset, value);
+#ifndef V8_DISABLE_WRITE_BARRIERS
+ WriteBarrier::Marking(*this, RawField(kCodeOffset), value);
+#endif
+}
+
+void JSFunction::set_code_no_write_barrier(Code value) {
+ DCHECK(!ObjectInYoungGeneration(value));
+ RELAXED_WRITE_FIELD(*this, kCodeOffset, value);
+}
+
+// TODO(ishell): Why relaxed read but release store?
+DEF_GETTER(JSFunction, shared, SharedFunctionInfo) {
+ return SharedFunctionInfo::cast(
+ RELAXED_READ_FIELD(*this, kSharedFunctionInfoOffset));
+}
+
+void JSFunction::set_shared(SharedFunctionInfo value, WriteBarrierMode mode) {
+ // Release semantics to support acquire read in NeedsResetDueToFlushedBytecode
+ RELEASE_WRITE_FIELD(*this, kSharedFunctionInfoOffset, value);
+ CONDITIONAL_WRITE_BARRIER(*this, kSharedFunctionInfoOffset, value, mode);
+}
+
+void JSFunction::ClearOptimizedCodeSlot(const char* reason) {
+ if (has_feedback_vector() && feedback_vector().has_optimized_code()) {
+ if (FLAG_trace_opt) {
+ CodeTracer::Scope scope(GetIsolate()->GetCodeTracer());
+ PrintF(scope.file(),
+ "[evicting entry from optimizing code feedback slot (%s) for ",
+ reason);
+ ShortPrint(scope.file());
+ PrintF(scope.file(), "]\n");
+ }
+ feedback_vector().ClearOptimizedCode();
+ }
+}
+
+void JSFunction::SetOptimizationMarker(OptimizationMarker marker) {
+ DCHECK(has_feedback_vector());
+ DCHECK(ChecksOptimizationMarker());
+ DCHECK(!ActiveTierIsTurbofan());
+
+ feedback_vector().SetOptimizationMarker(marker);
+}
+
+bool JSFunction::has_feedback_vector() const {
+ return shared().is_compiled() &&
+ raw_feedback_cell().value().IsFeedbackVector();
+}
+
+bool JSFunction::has_closure_feedback_cell_array() const {
+ return shared().is_compiled() &&
+ raw_feedback_cell().value().IsClosureFeedbackCellArray();
+}
+
+Context JSFunction::context() {
+ return TaggedField<Context, kContextOffset>::load(*this);
+}
+
+bool JSFunction::has_context() const {
+ return TaggedField<HeapObject, kContextOffset>::load(*this).IsContext();
+}
+
+JSGlobalProxy JSFunction::global_proxy() { return context().global_proxy(); }
+
+NativeContext JSFunction::native_context() {
+ return context().native_context();
+}
+
+void JSFunction::set_context(HeapObject value) {
+ DCHECK(value.IsUndefined() || value.IsContext());
+ WRITE_FIELD(*this, kContextOffset, value);
+ WRITE_BARRIER(*this, kContextOffset, value);
+}
+
+ACCESSORS_CHECKED(JSFunction, prototype_or_initial_map, HeapObject,
+ kPrototypeOrInitialMapOffset, map().has_prototype_slot())
+
+DEF_GETTER(JSFunction, has_prototype_slot, bool) {
+ return map(isolate).has_prototype_slot();
+}
+
+DEF_GETTER(JSFunction, initial_map, Map) {
+ return Map::cast(prototype_or_initial_map(isolate));
+}
+
+DEF_GETTER(JSFunction, has_initial_map, bool) {
+ DCHECK(has_prototype_slot(isolate));
+ return prototype_or_initial_map(isolate).IsMap(isolate);
+}
+
+DEF_GETTER(JSFunction, has_instance_prototype, bool) {
+ DCHECK(has_prototype_slot(isolate));
+ // Can't use ReadOnlyRoots(isolate) as this isolate could be produced by
+ // i::GetIsolateForPtrCompr(HeapObject).
+ return has_initial_map(isolate) ||
+ !prototype_or_initial_map(isolate).IsTheHole(
+ GetReadOnlyRoots(isolate));
+}
+
+DEF_GETTER(JSFunction, has_prototype, bool) {
+ DCHECK(has_prototype_slot(isolate));
+ return map(isolate).has_non_instance_prototype() ||
+ has_instance_prototype(isolate);
+}
+
+DEF_GETTER(JSFunction, has_prototype_property, bool) {
+ return (has_prototype_slot(isolate) && IsConstructor(isolate)) ||
+ IsGeneratorFunction(shared(isolate).kind());
+}
+
+DEF_GETTER(JSFunction, PrototypeRequiresRuntimeLookup, bool) {
+ return !has_prototype_property(isolate) ||
+ map(isolate).has_non_instance_prototype();
+}
+
+DEF_GETTER(JSFunction, instance_prototype, HeapObject) {
+ DCHECK(has_instance_prototype(isolate));
+ if (has_initial_map(isolate)) return initial_map(isolate).prototype(isolate);
+ // When there is no initial map and the prototype is a JSReceiver, the
+ // initial map field is used for the prototype field.
+ return HeapObject::cast(prototype_or_initial_map(isolate));
+}
+
+DEF_GETTER(JSFunction, prototype, Object) {
+ DCHECK(has_prototype(isolate));
+ // If the function's prototype property has been set to a non-JSReceiver
+ // value, that value is stored in the constructor field of the map.
+ if (map(isolate).has_non_instance_prototype()) {
+ Object prototype = map(isolate).GetConstructor(isolate);
+ // The map must have a prototype in that field, not a back pointer.
+ DCHECK(!prototype.IsMap(isolate));
+ DCHECK(!prototype.IsFunctionTemplateInfo(isolate));
+ return prototype;
+ }
+ return instance_prototype(isolate);
+}
+
+bool JSFunction::is_compiled() const {
+ return code().builtin_index() != Builtins::kCompileLazy &&
+ shared().is_compiled();
+}
+
+bool JSFunction::NeedsResetDueToFlushedBytecode() {
+ // Do a raw read for shared and code fields here since this function may be
+ // called on a concurrent thread and the JSFunction might not be fully
+ // initialized yet.
+ Object maybe_shared = ACQUIRE_READ_FIELD(*this, kSharedFunctionInfoOffset);
+ Object maybe_code = RELAXED_READ_FIELD(*this, kCodeOffset);
+
+ if (!maybe_shared.IsSharedFunctionInfo() || !maybe_code.IsCode()) {
+ return false;
+ }
+
+ SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
+ Code code = Code::cast(maybe_code);
+ return !shared.is_compiled() &&
+ code.builtin_index() != Builtins::kCompileLazy;
+}
+
+void JSFunction::ResetIfBytecodeFlushed(
+ base::Optional<std::function<void(HeapObject object, ObjectSlot slot,
+ HeapObject target)>>
+ gc_notify_updated_slot) {
+ if (FLAG_flush_bytecode && NeedsResetDueToFlushedBytecode()) {
+ // Bytecode was flushed and function is now uncompiled, reset JSFunction
+ // by setting code to CompileLazy and clearing the feedback vector.
+ set_code(GetIsolate()->builtins()->builtin(i::Builtins::kCompileLazy));
+ raw_feedback_cell().reset_feedback_vector(gc_notify_updated_slot);
+ }
+}
+
+} // namespace internal
+} // namespace v8
+
+#include "src/objects/object-macros-undef.h"
+
+#endif // V8_OBJECTS_JS_FUNCTION_INL_H_
diff --git a/deps/v8/src/objects/js-function.cc b/deps/v8/src/objects/js-function.cc
index c85d76c4e2..6e83273e8f 100644
--- a/deps/v8/src/objects/js-function.cc
+++ b/deps/v8/src/objects/js-function.cc
@@ -18,24 +18,6 @@
namespace v8 {
namespace internal {
-TQ_OBJECT_CONSTRUCTORS_IMPL_NONINLINE(JSFunctionOrBoundFunction)
-TQ_OBJECT_CONSTRUCTORS_IMPL_NONINLINE(JSBoundFunction)
-OBJECT_CONSTRUCTORS_IMPL_NONINLINE(JSFunction, JSFunctionOrBoundFunction)
-
-CAST_ACCESSOR(JSFunction)
-
-ACCESSORS(JSFunction, raw_feedback_cell, FeedbackCell, kFeedbackCellOffset)
-
-FeedbackVector JSFunction::feedback_vector() const {
- DCHECK(has_feedback_vector());
- return FeedbackVector::cast(raw_feedback_cell().value());
-}
-
-ClosureFeedbackCellArray JSFunction::closure_feedback_cell_array() const {
- DCHECK(has_closure_feedback_cell_array());
- return ClosureFeedbackCellArray::cast(raw_feedback_cell().value());
-}
-
CodeKinds JSFunction::GetAttachedCodeKinds() const {
CodeKinds result;
@@ -94,6 +76,11 @@ bool JSFunction::HasAvailableOptimizedCode() const {
return (result & kOptimizedJSFunctionCodeKindsMask) != 0;
}
+bool JSFunction::HasAvailableCodeKind(CodeKind kind) const {
+ CodeKinds result = GetAvailableCodeKinds();
+ return (result & CodeKindToCodeKindFlag(kind)) != 0;
+}
+
namespace {
// Returns false if no highest tier exists (i.e. the function is not compiled),
@@ -132,17 +119,19 @@ bool JSFunction::ActiveTierIsIgnition() const {
bool JSFunction::ActiveTierIsTurbofan() const {
CodeKind highest_tier;
if (!HighestTierOf(GetAvailableCodeKinds(), &highest_tier)) return false;
- bool result = highest_tier == CodeKind::OPTIMIZED_FUNCTION;
- DCHECK_IMPLIES(result, !code().marked_for_deoptimization());
- return result;
+ return highest_tier == CodeKind::OPTIMIZED_FUNCTION;
}
bool JSFunction::ActiveTierIsNCI() const {
CodeKind highest_tier;
if (!HighestTierOf(GetAvailableCodeKinds(), &highest_tier)) return false;
- bool result = highest_tier == CodeKind::NATIVE_CONTEXT_INDEPENDENT;
- DCHECK_IMPLIES(result, !code().marked_for_deoptimization());
- return result;
+ return highest_tier == CodeKind::NATIVE_CONTEXT_INDEPENDENT;
+}
+
+CodeKind JSFunction::NextTier() const {
+ return (FLAG_turbo_nci_as_midtier && ActiveTierIsIgnition())
+ ? CodeKind::NATIVE_CONTEXT_INDEPENDENT
+ : CodeKind::OPTIMIZED_FUNCTION;
}
bool JSFunction::CanDiscardCompiled() const {
@@ -160,230 +149,6 @@ bool JSFunction::CanDiscardCompiled() const {
return (result & kJSFunctionCodeKindsMask) != 0;
}
-bool JSFunction::HasOptimizationMarker() {
- return has_feedback_vector() && feedback_vector().has_optimization_marker();
-}
-
-void JSFunction::ClearOptimizationMarker() {
- DCHECK(has_feedback_vector());
- feedback_vector().ClearOptimizationMarker();
-}
-
-bool JSFunction::ChecksOptimizationMarker() {
- return code().checks_optimization_marker();
-}
-
-bool JSFunction::IsMarkedForOptimization() {
- return has_feedback_vector() && feedback_vector().optimization_marker() ==
- OptimizationMarker::kCompileOptimized;
-}
-
-bool JSFunction::IsMarkedForConcurrentOptimization() {
- return has_feedback_vector() &&
- feedback_vector().optimization_marker() ==
- OptimizationMarker::kCompileOptimizedConcurrent;
-}
-
-bool JSFunction::IsInOptimizationQueue() {
- return has_feedback_vector() && feedback_vector().optimization_marker() ==
- OptimizationMarker::kInOptimizationQueue;
-}
-
-void JSFunction::CompleteInobjectSlackTrackingIfActive() {
- if (!has_prototype_slot()) return;
- if (has_initial_map() && initial_map().IsInobjectSlackTrackingInProgress()) {
- initial_map().CompleteInobjectSlackTracking(GetIsolate());
- }
-}
-
-AbstractCode JSFunction::abstract_code() {
- if (ActiveTierIsIgnition()) {
- return AbstractCode::cast(shared().GetBytecodeArray());
- } else {
- return AbstractCode::cast(code());
- }
-}
-
-int JSFunction::length() { return shared().length(); }
-
-Code JSFunction::code() const {
- return Code::cast(RELAXED_READ_FIELD(*this, kCodeOffset));
-}
-
-void JSFunction::set_code(Code value) {
- DCHECK(!ObjectInYoungGeneration(value));
- RELAXED_WRITE_FIELD(*this, kCodeOffset, value);
-#ifndef V8_DISABLE_WRITE_BARRIERS
- WriteBarrier::Marking(*this, RawField(kCodeOffset), value);
-#endif
-}
-
-void JSFunction::set_code_no_write_barrier(Code value) {
- DCHECK(!ObjectInYoungGeneration(value));
- RELAXED_WRITE_FIELD(*this, kCodeOffset, value);
-}
-
-// TODO(ishell): Why relaxed read but release store?
-DEF_GETTER(JSFunction, shared, SharedFunctionInfo) {
- return SharedFunctionInfo::cast(
- RELAXED_READ_FIELD(*this, kSharedFunctionInfoOffset));
-}
-
-void JSFunction::set_shared(SharedFunctionInfo value, WriteBarrierMode mode) {
- // Release semantics to support acquire read in NeedsResetDueToFlushedBytecode
- RELEASE_WRITE_FIELD(*this, kSharedFunctionInfoOffset, value);
- CONDITIONAL_WRITE_BARRIER(*this, kSharedFunctionInfoOffset, value, mode);
-}
-
-void JSFunction::ClearOptimizedCodeSlot(const char* reason) {
- if (has_feedback_vector() && feedback_vector().has_optimized_code()) {
- if (FLAG_trace_opt) {
- CodeTracer::Scope scope(GetIsolate()->GetCodeTracer());
- PrintF(scope.file(),
- "[evicting entry from optimizing code feedback slot (%s) for ",
- reason);
- ShortPrint(scope.file());
- PrintF(scope.file(), "]\n");
- }
- feedback_vector().ClearOptimizedCode();
- }
-}
-
-void JSFunction::SetOptimizationMarker(OptimizationMarker marker) {
- DCHECK(has_feedback_vector());
- DCHECK(ChecksOptimizationMarker());
- DCHECK(!HasAvailableOptimizedCode());
-
- feedback_vector().SetOptimizationMarker(marker);
-}
-
-bool JSFunction::has_feedback_vector() const {
- return shared().is_compiled() &&
- raw_feedback_cell().value().IsFeedbackVector();
-}
-
-bool JSFunction::has_closure_feedback_cell_array() const {
- return shared().is_compiled() &&
- raw_feedback_cell().value().IsClosureFeedbackCellArray();
-}
-
-Context JSFunction::context() {
- return TaggedField<Context, kContextOffset>::load(*this);
-}
-
-bool JSFunction::has_context() const {
- return TaggedField<HeapObject, kContextOffset>::load(*this).IsContext();
-}
-
-JSGlobalProxy JSFunction::global_proxy() { return context().global_proxy(); }
-
-NativeContext JSFunction::native_context() {
- return context().native_context();
-}
-
-void JSFunction::set_context(HeapObject value) {
- DCHECK(value.IsUndefined() || value.IsContext());
- WRITE_FIELD(*this, kContextOffset, value);
- WRITE_BARRIER(*this, kContextOffset, value);
-}
-
-ACCESSORS_CHECKED(JSFunction, prototype_or_initial_map, HeapObject,
- kPrototypeOrInitialMapOffset, map().has_prototype_slot())
-
-DEF_GETTER(JSFunction, has_prototype_slot, bool) {
- return map(isolate).has_prototype_slot();
-}
-
-DEF_GETTER(JSFunction, initial_map, Map) {
- return Map::cast(prototype_or_initial_map(isolate));
-}
-
-DEF_GETTER(JSFunction, has_initial_map, bool) {
- DCHECK(has_prototype_slot(isolate));
- return prototype_or_initial_map(isolate).IsMap(isolate);
-}
-
-DEF_GETTER(JSFunction, has_instance_prototype, bool) {
- DCHECK(has_prototype_slot(isolate));
- // Can't use ReadOnlyRoots(isolate) as this isolate could be produced by
- // i::GetIsolateForPtrCompr(HeapObject).
- return has_initial_map(isolate) ||
- !prototype_or_initial_map(isolate).IsTheHole(
- GetReadOnlyRoots(isolate));
-}
-
-DEF_GETTER(JSFunction, has_prototype, bool) {
- DCHECK(has_prototype_slot(isolate));
- return map(isolate).has_non_instance_prototype() ||
- has_instance_prototype(isolate);
-}
-
-DEF_GETTER(JSFunction, has_prototype_property, bool) {
- return (has_prototype_slot(isolate) && IsConstructor(isolate)) ||
- IsGeneratorFunction(shared(isolate).kind());
-}
-
-DEF_GETTER(JSFunction, PrototypeRequiresRuntimeLookup, bool) {
- return !has_prototype_property(isolate) ||
- map(isolate).has_non_instance_prototype();
-}
-
-DEF_GETTER(JSFunction, instance_prototype, HeapObject) {
- DCHECK(has_instance_prototype(isolate));
- if (has_initial_map(isolate)) return initial_map(isolate).prototype(isolate);
- // When there is no initial map and the prototype is a JSReceiver, the
- // initial map field is used for the prototype field.
- return HeapObject::cast(prototype_or_initial_map(isolate));
-}
-
-DEF_GETTER(JSFunction, prototype, Object) {
- DCHECK(has_prototype(isolate));
- // If the function's prototype property has been set to a non-JSReceiver
- // value, that value is stored in the constructor field of the map.
- if (map(isolate).has_non_instance_prototype()) {
- Object prototype = map(isolate).GetConstructor(isolate);
- // The map must have a prototype in that field, not a back pointer.
- DCHECK(!prototype.IsMap(isolate));
- DCHECK(!prototype.IsFunctionTemplateInfo(isolate));
- return prototype;
- }
- return instance_prototype(isolate);
-}
-
-bool JSFunction::is_compiled() const {
- return code().builtin_index() != Builtins::kCompileLazy &&
- shared().is_compiled();
-}
-
-bool JSFunction::NeedsResetDueToFlushedBytecode() {
- // Do a raw read for shared and code fields here since this function may be
- // called on a concurrent thread and the JSFunction might not be fully
- // initialized yet.
- Object maybe_shared = ACQUIRE_READ_FIELD(*this, kSharedFunctionInfoOffset);
- Object maybe_code = RELAXED_READ_FIELD(*this, kCodeOffset);
-
- if (!maybe_shared.IsSharedFunctionInfo() || !maybe_code.IsCode()) {
- return false;
- }
-
- SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
- Code code = Code::cast(maybe_code);
- return !shared.is_compiled() &&
- code.builtin_index() != Builtins::kCompileLazy;
-}
-
-void JSFunction::ResetIfBytecodeFlushed(
- base::Optional<std::function<void(HeapObject object, ObjectSlot slot,
- HeapObject target)>>
- gc_notify_updated_slot) {
- if (FLAG_flush_bytecode && NeedsResetDueToFlushedBytecode()) {
- // Bytecode was flushed and function is now uncompiled, reset JSFunction
- // by setting code to CompileLazy and clearing the feedback vector.
- set_code(GetIsolate()->builtins()->builtin(i::Builtins::kCompileLazy));
- raw_feedback_cell().reset_feedback_vector(gc_notify_updated_slot);
- }
-}
-
// static
MaybeHandle<NativeContext> JSBoundFunction::GetFunctionRealm(
Handle<JSBoundFunction> function) {
@@ -466,40 +231,6 @@ Handle<NativeContext> JSFunction::GetFunctionRealm(
return handle(function->context().native_context(), function->GetIsolate());
}
-void JSFunction::MarkForOptimization(ConcurrencyMode mode) {
- Isolate* isolate = GetIsolate();
- if (!isolate->concurrent_recompilation_enabled() ||
- isolate->bootstrapper()->IsActive()) {
- mode = ConcurrencyMode::kNotConcurrent;
- }
-
- DCHECK(!is_compiled() || ActiveTierIsIgnition());
- DCHECK(shared().IsInterpreted());
- DCHECK(!HasAvailableOptimizedCode());
- DCHECK(shared().allows_lazy_compilation() ||
- !shared().optimization_disabled());
-
- if (mode == ConcurrencyMode::kConcurrent) {
- if (IsInOptimizationQueue()) {
- if (FLAG_trace_concurrent_recompilation) {
- PrintF(" ** Not marking ");
- ShortPrint();
- PrintF(" -- already in optimization queue.\n");
- }
- return;
- }
- if (FLAG_trace_concurrent_recompilation) {
- PrintF(" ** Marking ");
- ShortPrint();
- PrintF(" for concurrent recompilation.\n");
- }
- }
-
- SetOptimizationMarker(mode == ConcurrencyMode::kConcurrent
- ? OptimizationMarker::kCompileOptimizedConcurrent
- : OptimizationMarker::kCompileOptimized);
-}
-
// static
void JSFunction::EnsureClosureFeedbackCellArray(Handle<JSFunction> function) {
Isolate* const isolate = function->GetIsolate();
diff --git a/deps/v8/src/objects/js-function.h b/deps/v8/src/objects/js-function.h
index 06d6a2cd60..e7f2c0caf3 100644
--- a/deps/v8/src/objects/js-function.h
+++ b/deps/v8/src/objects/js-function.h
@@ -7,8 +7,8 @@
#include "src/objects/code-kind.h"
#include "src/objects/js-objects.h"
-#include "torque-generated/class-definitions-tq.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/class-definitions.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -24,7 +24,7 @@ class JSFunctionOrBoundFunction
JSObject> {
public:
STATIC_ASSERT(kHeaderSize == JSObject::kHeaderSize);
- TQ_OBJECT_CONSTRUCTORS_NONINLINE(JSFunctionOrBoundFunction)
+ TQ_OBJECT_CONSTRUCTORS(JSFunctionOrBoundFunction)
};
// JSBoundFunction describes a bound function exotic object.
@@ -47,18 +47,18 @@ class JSBoundFunction
// to ES6 section 19.2.3.5 Function.prototype.toString ( ).
static Handle<String> ToString(Handle<JSBoundFunction> function);
- TQ_OBJECT_CONSTRUCTORS_NONINLINE(JSBoundFunction)
+ TQ_OBJECT_CONSTRUCTORS(JSBoundFunction)
};
// JSFunction describes JavaScript functions.
class JSFunction : public JSFunctionOrBoundFunction {
public:
// [prototype_or_initial_map]:
- DECL_ACCESSORS_NONINLINE(prototype_or_initial_map, HeapObject)
+ DECL_ACCESSORS(prototype_or_initial_map, HeapObject)
// [shared]: The information about the function that
// can be shared by instances.
- DECL_ACCESSORS_NONINLINE(shared, SharedFunctionInfo)
+ DECL_ACCESSORS(shared, SharedFunctionInfo)
static const int kLengthDescriptorIndex = 0;
static const int kNameDescriptorIndex = 1;
@@ -68,12 +68,12 @@ class JSFunction : public JSFunctionOrBoundFunction {
static const int kMinDescriptorsForFastBind = 2;
// [context]: The context for this function.
- V8_EXPORT_PRIVATE Context context();
- bool has_context() const;
- void set_context(HeapObject context);
- JSGlobalProxy global_proxy();
- V8_EXPORT_PRIVATE NativeContext native_context();
- int length();
+ inline Context context();
+ inline bool has_context() const;
+ inline void set_context(HeapObject context);
+ inline JSGlobalProxy global_proxy();
+ inline NativeContext native_context();
+ inline int length();
static Handle<Object> GetName(Isolate* isolate, Handle<JSFunction> function);
static Handle<NativeContext> GetFunctionRealm(Handle<JSFunction> function);
@@ -82,13 +82,13 @@ class JSFunction : public JSFunctionOrBoundFunction {
// when the function is invoked, e.g. foo() or new foo(). See
// [[Call]] and [[Construct]] description in ECMA-262, section
// 8.6.2, page 27.
- V8_EXPORT_PRIVATE Code code() const;
- V8_EXPORT_PRIVATE void set_code(Code code);
- void set_code_no_write_barrier(Code code);
+ inline Code code() const;
+ inline void set_code(Code code);
+ inline void set_code_no_write_barrier(Code code);
// Get the abstract code associated with the function, which will either be
// a Code object or a BytecodeArray.
- V8_EXPORT_PRIVATE AbstractCode abstract_code();
+ inline AbstractCode abstract_code();
// The predicates for querying code kinds related to this function have
// specific terminology:
@@ -110,10 +110,14 @@ class JSFunction : public JSFunctionOrBoundFunction {
V8_EXPORT_PRIVATE bool HasAttachedOptimizedCode() const;
bool HasAvailableOptimizedCode() const;
+ bool HasAvailableCodeKind(CodeKind kind) const;
+
V8_EXPORT_PRIVATE bool ActiveTierIsIgnition() const;
bool ActiveTierIsTurbofan() const;
bool ActiveTierIsNCI() const;
+ CodeKind NextTier() const;
+
// Similar to SharedFunctionInfo::CanDiscardCompiled. Returns true, if the
// attached code can be recreated at a later point by replacing it with
// CompileLazy.
@@ -121,30 +125,30 @@ class JSFunction : public JSFunctionOrBoundFunction {
// Tells whether or not this function checks its optimization marker in its
// feedback vector.
- bool ChecksOptimizationMarker();
+ inline bool ChecksOptimizationMarker();
// Tells whether or not this function has a (non-zero) optimization marker.
- bool HasOptimizationMarker();
+ inline bool HasOptimizationMarker();
// Mark this function for lazy recompilation. The function will be recompiled
// the next time it is executed.
- void MarkForOptimization(ConcurrencyMode mode);
+ inline void MarkForOptimization(ConcurrencyMode mode);
// Tells whether or not the function is already marked for lazy recompilation.
- bool IsMarkedForOptimization();
- bool IsMarkedForConcurrentOptimization();
+ inline bool IsMarkedForOptimization();
+ inline bool IsMarkedForConcurrentOptimization();
// Tells whether or not the function is on the concurrent recompilation queue.
- bool IsInOptimizationQueue();
+ inline bool IsInOptimizationQueue();
// Clears the optimized code slot in the function's feedback vector.
- void ClearOptimizedCodeSlot(const char* reason);
+ inline void ClearOptimizedCodeSlot(const char* reason);
// Sets the optimization marker in the function's feedback vector.
- void SetOptimizationMarker(OptimizationMarker marker);
+ inline void SetOptimizationMarker(OptimizationMarker marker);
// Clears the optimization marker in the function's feedback vector.
- void ClearOptimizationMarker();
+ inline void ClearOptimizationMarker();
// If slack tracking is active, it computes instance size of the initial map
// with minimum permissible object slack. If it is not active, it simply
@@ -152,28 +156,28 @@ class JSFunction : public JSFunctionOrBoundFunction {
int ComputeInstanceSizeWithMinSlack(Isolate* isolate);
// Completes inobject slack tracking on initial map if it is active.
- void CompleteInobjectSlackTrackingIfActive();
+ inline void CompleteInobjectSlackTrackingIfActive();
// [raw_feedback_cell]: Gives raw access to the FeedbackCell used to hold the
/// FeedbackVector eventually. Generally this shouldn't be used to get the
// feedback_vector, instead use feedback_vector() which correctly deals with
// the JSFunction's bytecode being flushed.
- DECL_ACCESSORS_NONINLINE(raw_feedback_cell, FeedbackCell)
+ DECL_ACCESSORS(raw_feedback_cell, FeedbackCell)
// Functions related to feedback vector. feedback_vector() can be used once
// the function has feedback vectors allocated. feedback vectors may not be
// available after compile when lazily allocating feedback vectors.
- V8_EXPORT_PRIVATE FeedbackVector feedback_vector() const;
- V8_EXPORT_PRIVATE bool has_feedback_vector() const;
+ inline FeedbackVector feedback_vector() const;
+ inline bool has_feedback_vector() const;
V8_EXPORT_PRIVATE static void EnsureFeedbackVector(
Handle<JSFunction> function, IsCompiledScope* compiled_scope);
- // Functions related to clousre feedback cell array that holds feedback cells
+ // Functions related to closure feedback cell array that holds feedback cells
// used to create closures from this function. We allocate closure feedback
// cell arrays after compile, when we want to allocate feedback vectors
// lazily.
- V8_EXPORT_PRIVATE bool has_closure_feedback_cell_array() const;
- ClosureFeedbackCellArray closure_feedback_cell_array() const;
+ inline bool has_closure_feedback_cell_array() const;
+ inline ClosureFeedbackCellArray closure_feedback_cell_array() const;
static void EnsureClosureFeedbackCellArray(Handle<JSFunction> function);
// Initializes the feedback cell of |function|. In lite mode, this would be
@@ -187,20 +191,20 @@ class JSFunction : public JSFunctionOrBoundFunction {
void ClearTypeFeedbackInfo();
// Resets function to clear compiled data after bytecode has been flushed.
- bool NeedsResetDueToFlushedBytecode();
- void ResetIfBytecodeFlushed(
+ inline bool NeedsResetDueToFlushedBytecode();
+ inline void ResetIfBytecodeFlushed(
base::Optional<std::function<void(HeapObject object, ObjectSlot slot,
HeapObject target)>>
gc_notify_updated_slot = base::nullopt);
- DECL_GETTER_NONINLINE(has_prototype_slot, bool)
+ DECL_GETTER(has_prototype_slot, bool)
// The initial map for an object created by this constructor.
- DECL_GETTER_NONINLINE(initial_map, Map)
+ DECL_GETTER(initial_map, Map)
static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map,
Handle<HeapObject> prototype);
- DECL_GETTER_NONINLINE(has_initial_map, bool)
+ DECL_GETTER(has_initial_map, bool)
V8_EXPORT_PRIVATE static void EnsureHasInitialMap(
Handle<JSFunction> function);
@@ -215,16 +219,16 @@ class JSFunction : public JSFunctionOrBoundFunction {
// function has an initial map the prototype is set on the initial
// map. Otherwise, the prototype is put in the initial map field
// until an initial map is needed.
- DECL_GETTER_NONINLINE(has_prototype, bool)
- DECL_GETTER_NONINLINE(has_instance_prototype, bool)
- DECL_GETTER_NONINLINE(prototype, Object)
- DECL_GETTER_NONINLINE(instance_prototype, HeapObject)
- DECL_GETTER_NONINLINE(has_prototype_property, bool)
- DECL_GETTER_NONINLINE(PrototypeRequiresRuntimeLookup, bool)
+ DECL_GETTER(has_prototype, bool)
+ DECL_GETTER(has_instance_prototype, bool)
+ DECL_GETTER(prototype, Object)
+ DECL_GETTER(instance_prototype, HeapObject)
+ DECL_GETTER(has_prototype_property, bool)
+ DECL_GETTER(PrototypeRequiresRuntimeLookup, bool)
static void SetPrototype(Handle<JSFunction> function, Handle<Object> value);
// Returns if this function has been compiled to native code yet.
- V8_EXPORT_PRIVATE bool is_compiled() const;
+ inline bool is_compiled() const;
static int GetHeaderSize(bool function_has_prototype_slot) {
return function_has_prototype_slot ? JSFunction::kSizeWithPrototype
@@ -234,7 +238,7 @@ class JSFunction : public JSFunctionOrBoundFunction {
// Prints the name of the function using PrintF.
void PrintName(FILE* out = stdout);
- DECL_CAST_NONINLINE(JSFunction)
+ DECL_CAST(JSFunction)
// Calculate the instance size and in-object properties count.
// {CalculateExpectedNofProperties} can trigger compilation.
@@ -307,7 +311,7 @@ class JSFunction : public JSFunctionOrBoundFunction {
static constexpr int kSizeWithoutPrototype = kPrototypeOrInitialMapOffset;
static constexpr int kSizeWithPrototype = FieldOffsets::kHeaderSize;
- OBJECT_CONSTRUCTORS_NONINLINE(JSFunction, JSFunctionOrBoundFunction);
+ OBJECT_CONSTRUCTORS(JSFunction, JSFunctionOrBoundFunction);
};
} // namespace internal
diff --git a/deps/v8/src/objects/js-objects.cc b/deps/v8/src/objects/js-objects.cc
index 7f5378e6c1..2d095d1743 100644
--- a/deps/v8/src/objects/js-objects.cc
+++ b/deps/v8/src/objects/js-objects.cc
@@ -70,8 +70,8 @@
#include "src/strings/string-stream.h"
#include "src/utils/ostreams.h"
#include "src/wasm/wasm-objects.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
@@ -252,7 +252,7 @@ V8_WARN_UNUSED_RESULT Maybe<bool> FastAssign(
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, prop_value, Object::GetProperty(&it), Nothing<bool>());
stable = from->map() == *map;
- *descriptors.location() = map->instance_descriptors().ptr();
+ descriptors.PatchValue(map->instance_descriptors());
}
} else {
// If the map did change, do a slower lookup. We are still guaranteed that
@@ -278,7 +278,7 @@ V8_WARN_UNUSED_RESULT Maybe<bool> FastAssign(
if (result.IsNothing()) return result;
if (stable) {
stable = from->map() == *map;
- *descriptors.location() = map->instance_descriptors().ptr();
+ descriptors.PatchValue(map->instance_descriptors());
}
} else {
if (excluded_properties != nullptr &&
@@ -309,6 +309,7 @@ Maybe<bool> JSReceiver::SetOrCopyDataProperties(
if (fast_assign.FromJust()) return Just(true);
Handle<JSReceiver> from = Object::ToObject(isolate, source).ToHandleChecked();
+
// 3b. Let keys be ? from.[[OwnPropertyKeys]]().
Handle<FixedArray> keys;
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
@@ -317,9 +318,25 @@ Maybe<bool> JSReceiver::SetOrCopyDataProperties(
GetKeysConversion::kKeepNumbers),
Nothing<bool>());
+ if (!from->HasFastProperties() && target->HasFastProperties()) {
+ // Convert to slow properties if we're guaranteed to overflow the number of
+ // descriptors.
+ int source_length =
+ from->IsJSGlobalObject()
+ ? JSGlobalObject::cast(*from)
+ .global_dictionary()
+ .NumberOfEnumerableProperties()
+ : from->property_dictionary().NumberOfEnumerableProperties();
+ if (source_length > kMaxNumberOfDescriptors) {
+ JSObject::NormalizeProperties(isolate, Handle<JSObject>::cast(target),
+ CLEAR_INOBJECT_PROPERTIES, source_length,
+ "Copying data properties");
+ }
+ }
+
// 4. Repeat for each element nextKey of keys in List order,
- for (int j = 0; j < keys->length(); ++j) {
- Handle<Object> next_key(keys->get(j), isolate);
+ for (int i = 0; i < keys->length(); ++i) {
+ Handle<Object> next_key(keys->get(i), isolate);
// 4a i. Let desc be ? from.[[GetOwnProperty]](nextKey).
PropertyDescriptor desc;
Maybe<bool> found =
@@ -1866,7 +1883,7 @@ V8_WARN_UNUSED_RESULT Maybe<bool> FastGetOwnValuesOrEntries(
// side-effects.
bool stable = *map == object->map();
if (stable) {
- *descriptors.location() = map->instance_descriptors().ptr();
+ descriptors.PatchValue(map->instance_descriptors());
}
for (InternalIndex index : InternalIndex::Range(number_of_own_descriptors)) {
@@ -1900,7 +1917,7 @@ V8_WARN_UNUSED_RESULT Maybe<bool> FastGetOwnValuesOrEntries(
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, prop_value, Object::GetProperty(&it), Nothing<bool>());
stable = object->map() == *map;
- *descriptors.location() = map->instance_descriptors().ptr();
+ descriptors.PatchValue(map->instance_descriptors());
}
} else {
// If the map did change, do a slower lookup. We are still guaranteed that
diff --git a/deps/v8/src/objects/js-objects.h b/deps/v8/src/objects/js-objects.h
index e33df30ac8..11e8273fcb 100644
--- a/deps/v8/src/objects/js-objects.h
+++ b/deps/v8/src/objects/js-objects.h
@@ -10,8 +10,8 @@
#include "src/objects/internal-index.h"
#include "src/objects/objects.h"
#include "src/objects/property-array.h"
-#include "torque-generated/class-definitions-tq.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/class-definitions.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-promise.h b/deps/v8/src/objects/js-promise.h
index cd54f9349e..2028bc3f8b 100644
--- a/deps/v8/src/objects/js-promise.h
+++ b/deps/v8/src/objects/js-promise.h
@@ -7,7 +7,7 @@
#include "src/objects/js-objects.h"
#include "src/objects/promise.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-proxy.h b/deps/v8/src/objects/js-proxy.h
index c6bb844fe5..1161f71486 100644
--- a/deps/v8/src/objects/js-proxy.h
+++ b/deps/v8/src/objects/js-proxy.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_JS_PROXY_H_
#include "src/objects/js-objects.h"
-#include "torque-generated/builtin-definitions-tq.h"
+#include "torque-generated/builtin-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-regexp-inl.h b/deps/v8/src/objects/js-regexp-inl.h
index 8a731008e1..48fe911ff5 100644
--- a/deps/v8/src/objects/js-regexp-inl.h
+++ b/deps/v8/src/objects/js-regexp-inl.h
@@ -67,7 +67,7 @@ String JSRegExp::Pattern() {
Object JSRegExp::CaptureNameMap() {
DCHECK(this->data().IsFixedArray());
- DCHECK_EQ(TypeTag(), IRREGEXP);
+ DCHECK(TypeSupportsCaptures(TypeTag()));
Object value = DataAt(kIrregexpCaptureNameMapIndex);
DCHECK_NE(value, Smi::FromInt(JSRegExp::kUninitializedValue));
return value;
@@ -85,6 +85,14 @@ void JSRegExp::SetDataAt(int index, Object value) {
FixedArray::cast(data()).set(index, value);
}
+void JSRegExp::SetCaptureNameMap(Handle<FixedArray> capture_name_map) {
+ if (capture_name_map.is_null()) {
+ SetDataAt(JSRegExp::kIrregexpCaptureNameMapIndex, Smi::zero());
+ } else {
+ SetDataAt(JSRegExp::kIrregexpCaptureNameMapIndex, *capture_name_map);
+ }
+}
+
bool JSRegExp::HasCompiledCode() const {
if (TypeTag() != IRREGEXP) return false;
Smi uninitialized = Smi::FromInt(kUninitializedValue);
diff --git a/deps/v8/src/objects/js-regexp-string-iterator.h b/deps/v8/src/objects/js-regexp-string-iterator.h
index 1fdd503072..c5f2e33421 100644
--- a/deps/v8/src/objects/js-regexp-string-iterator.h
+++ b/deps/v8/src/objects/js-regexp-string-iterator.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_JS_REGEXP_STRING_ITERATOR_H_
#include "src/objects/js-objects.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/js-regexp.h b/deps/v8/src/objects/js-regexp.h
index 4751966e70..f9618e5266 100644
--- a/deps/v8/src/objects/js-regexp.h
+++ b/deps/v8/src/objects/js-regexp.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_JS_REGEXP_H_
#include "src/objects/js-array.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -89,6 +89,9 @@ class JSRegExp : public TorqueGeneratedJSRegExp<JSRegExp, JSObject> {
void MarkTierUpForNextExec();
inline Type TypeTag() const;
+ static bool TypeSupportsCaptures(Type t) {
+ return t == IRREGEXP || t == EXPERIMENTAL;
+ }
// Maximum number of captures allowed.
static constexpr int kMaxCaptures = 1 << 16;
@@ -105,6 +108,7 @@ class JSRegExp : public TorqueGeneratedJSRegExp<JSRegExp, JSObject> {
inline Object DataAt(int index) const;
// Set implementation data after the object has been prepared.
inline void SetDataAt(int index, Object value);
+ inline void SetCaptureNameMap(Handle<FixedArray> capture_name_map);
static constexpr int code_index(bool is_latin1) {
return is_latin1 ? kIrregexpLatin1CodeIndex : kIrregexpUC16CodeIndex;
@@ -189,18 +193,14 @@ class JSRegExp : public TorqueGeneratedJSRegExp<JSRegExp, JSObject> {
static const int kIrregexpBacktrackLimit = kDataIndex + 8;
static const int kIrregexpDataSize = kDataIndex + 9;
- // TODO(mbid,v8:10765): At the moment the EXPERIMENTAL data array is an
- // extension of IRREGEXP data, with most fields set to some
+ // TODO(mbid,v8:10765): At the moment the EXPERIMENTAL data array conforms
+ // to the format of an IRREGEXP data array, with most fields set to some
// default/uninitialized value. This is because EXPERIMENTAL and IRREGEXP
- // regexps take the same code path in
- // `RegExpBuiltinsAssembler::RegExpExecInternal`, which reads off various
- // fields from the `store` array. `RegExpExecInternal` should probably
+ // regexps take the same code path in `RegExpExecInternal`, which reads off
+ // various fields from the data array. `RegExpExecInternal` should probably
// distinguish between EXPERIMENTAL and IRREGEXP, and then we can get rid of
// all the IRREGEXP only fields.
-
- // The same as kAtomPatternIndex for atom regexps.
- static constexpr int kExperimentalPatternIndex = kIrregexpDataSize;
- static constexpr int kExperimentalDataSize = kIrregexpDataSize + 1;
+ static constexpr int kExperimentalDataSize = kIrregexpDataSize;
// In-object fields.
static const int kLastIndexFieldIndex = 0;
diff --git a/deps/v8/src/objects/js-segment-iterator-inl.h b/deps/v8/src/objects/js-segment-iterator-inl.h
index 5a010a186f..e6a1c4a53d 100644
--- a/deps/v8/src/objects/js-segment-iterator-inl.h
+++ b/deps/v8/src/objects/js-segment-iterator-inl.h
@@ -22,6 +22,8 @@ TQ_OBJECT_CONSTRUCTORS_IMPL(JSSegmentIterator)
// Base segment iterator accessors.
ACCESSORS(JSSegmentIterator, icu_break_iterator, Managed<icu::BreakIterator>,
kIcuBreakIteratorOffset)
+ACCESSORS(JSSegmentIterator, unicode_string, Managed<icu::UnicodeString>,
+ kUnicodeStringOffset)
inline void JSSegmentIterator::set_granularity(
JSSegmenter::Granularity granularity) {
diff --git a/deps/v8/src/objects/js-segment-iterator.cc b/deps/v8/src/objects/js-segment-iterator.cc
index f520185b49..23758e3456 100644
--- a/deps/v8/src/objects/js-segment-iterator.cc
+++ b/deps/v8/src/objects/js-segment-iterator.cc
@@ -46,6 +46,13 @@ MaybeHandle<JSSegmentIterator> JSSegmentIterator::Create(
Handle<Managed<icu::BreakIterator>> managed_break_iterator =
Managed<icu::BreakIterator>::FromRawPtr(isolate, 0, break_iterator);
+ icu::UnicodeString* string = new icu::UnicodeString();
+ break_iterator->getText().getText(*string);
+ Handle<Managed<icu::UnicodeString>> unicode_string =
+ Managed<icu::UnicodeString>::FromRawPtr(isolate, 0, string);
+
+ break_iterator->setText(*string);
+
// Now all properties are ready, so we can allocate the result object.
Handle<JSObject> result = isolate->factory()->NewJSObjectFromMap(map);
DisallowHeapAllocation no_gc;
@@ -55,6 +62,7 @@ MaybeHandle<JSSegmentIterator> JSSegmentIterator::Create(
segment_iterator->set_flags(0);
segment_iterator->set_granularity(granularity);
segment_iterator->set_icu_break_iterator(*managed_break_iterator);
+ segment_iterator->set_unicode_string(*unicode_string);
return segment_iterator;
}
diff --git a/deps/v8/src/objects/js-segment-iterator.h b/deps/v8/src/objects/js-segment-iterator.h
index 1e70298797..45e03c06fa 100644
--- a/deps/v8/src/objects/js-segment-iterator.h
+++ b/deps/v8/src/objects/js-segment-iterator.h
@@ -43,6 +43,7 @@ class JSSegmentIterator
// SegmentIterator accessors.
DECL_ACCESSORS(icu_break_iterator, Managed<icu::BreakIterator>)
+ DECL_ACCESSORS(unicode_string, Managed<icu::UnicodeString>)
DECL_PRINTER(JSSegmentIterator)
diff --git a/deps/v8/src/objects/js-segments.cc b/deps/v8/src/objects/js-segments.cc
index f0a7a47896..ec3f8f6a2c 100644
--- a/deps/v8/src/objects/js-segments.cc
+++ b/deps/v8/src/objects/js-segments.cc
@@ -60,15 +60,16 @@ MaybeHandle<JSSegments> JSSegments::Create(Isolate* isolate,
// ecma402 #sec-%segmentsprototype%.containing
MaybeHandle<Object> JSSegments::Containing(Isolate* isolate,
Handle<JSSegments> segments,
- int32_t n) {
+ double n_double) {
// 5. Let len be the length of string.
int32_t len = segments->unicode_string().raw()->length();
// 7. If n < 0 or n ≥ len, return undefined.
- if (n < 0 || n >= len) {
+ if (n_double < 0 || n_double >= len) {
return isolate->factory()->undefined_value();
}
+ int32_t n = static_cast<int32_t>(n_double);
// n may point to the surrogate tail- adjust it back to the lead.
n = segments->unicode_string().raw()->getChar32Start(n);
diff --git a/deps/v8/src/objects/js-segments.h b/deps/v8/src/objects/js-segments.h
index ad6dd967b3..b33323d6f9 100644
--- a/deps/v8/src/objects/js-segments.h
+++ b/deps/v8/src/objects/js-segments.h
@@ -35,7 +35,7 @@ class JSSegments : public TorqueGeneratedJSSegments<JSSegments, JSObject> {
// ecma402 #sec-%segmentsprototype%.containing
V8_WARN_UNUSED_RESULT static MaybeHandle<Object> Containing(
- Isolate* isolate, Handle<JSSegments> segments_holder, int32_t index);
+ Isolate* isolate, Handle<JSSegments> segments_holder, double n);
// ecma402 #sec-createsegmentdataobject
V8_WARN_UNUSED_RESULT static MaybeHandle<Object> CreateSegmentDataObject(
diff --git a/deps/v8/src/objects/js-weak-refs.h b/deps/v8/src/objects/js-weak-refs.h
index 048285e5f8..2aa0a4ff2d 100644
--- a/deps/v8/src/objects/js-weak-refs.h
+++ b/deps/v8/src/objects/js-weak-refs.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_JS_WEAK_REFS_H_
#include "src/objects/js-objects.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/literal-objects.cc b/deps/v8/src/objects/literal-objects.cc
index 61e581a3d2..b5cdfd2795 100644
--- a/deps/v8/src/objects/literal-objects.cc
+++ b/deps/v8/src/objects/literal-objects.cc
@@ -347,7 +347,7 @@ class ObjectDescriptor {
AddToDictionaryTemplate(isolate, properties_dictionary_template_, name,
value_index, value_kind, value);
} else {
- *temp_handle_.location() = value.ptr();
+ temp_handle_.PatchValue(value);
AddToDescriptorArrayTemplate(isolate, descriptor_array_template_, name,
value_kind, temp_handle_);
}
diff --git a/deps/v8/src/objects/lookup-inl.h b/deps/v8/src/objects/lookup-inl.h
index 1fdfde6a05..2339606a45 100644
--- a/deps/v8/src/objects/lookup-inl.h
+++ b/deps/v8/src/objects/lookup-inl.h
@@ -20,58 +20,60 @@ namespace internal {
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
Handle<Name> name, Configuration configuration)
- : LookupIterator(isolate, receiver, name, kInvalidIndex,
- GetRoot(isolate, receiver, kInvalidIndex), configuration) {
-}
+ : LookupIterator(isolate, receiver, name, kInvalidIndex, receiver,
+ configuration) {}
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
- Handle<Name> name, Handle<JSReceiver> holder,
+ Handle<Name> name,
+ Handle<Object> lookup_start_object,
Configuration configuration)
- : LookupIterator(isolate, receiver, name, kInvalidIndex, holder,
- configuration) {}
+ : LookupIterator(isolate, receiver, name, kInvalidIndex,
+ lookup_start_object, configuration) {}
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
size_t index, Configuration configuration)
- : LookupIterator(isolate, receiver, Handle<Name>(), index,
- GetRoot(isolate, receiver, index), configuration) {
+ : LookupIterator(isolate, receiver, Handle<Name>(), index, receiver,
+ configuration) {
DCHECK_NE(index, kInvalidIndex);
}
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
- size_t index, Handle<JSReceiver> holder,
+ size_t index, Handle<Object> lookup_start_object,
Configuration configuration)
- : LookupIterator(isolate, receiver, Handle<Name>(), index, holder,
- configuration) {
+ : LookupIterator(isolate, receiver, Handle<Name>(), index,
+ lookup_start_object, configuration) {
DCHECK_NE(index, kInvalidIndex);
}
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
const Key& key, Configuration configuration)
- : LookupIterator(isolate, receiver, key.name(), key.index(),
- GetRoot(isolate, receiver, key.index()), configuration) {}
+ : LookupIterator(isolate, receiver, key.name(), key.index(), receiver,
+ configuration) {}
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
- const Key& key, Handle<JSReceiver> holder,
+ const Key& key,
+ Handle<Object> lookup_start_object,
Configuration configuration)
- : LookupIterator(isolate, receiver, key.name(), key.index(), holder,
- configuration) {}
+ : LookupIterator(isolate, receiver, key.name(), key.index(),
+ lookup_start_object, configuration) {}
// This private constructor is the central bottleneck that all the other
// constructors use.
LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
Handle<Name> name, size_t index,
- Handle<JSReceiver> holder,
+ Handle<Object> lookup_start_object,
Configuration configuration)
: configuration_(ComputeConfiguration(isolate, configuration, name)),
isolate_(isolate),
name_(name),
receiver_(receiver),
- initial_holder_(holder),
+ lookup_start_object_(lookup_start_object),
index_(index) {
if (IsElement()) {
// If we're not looking at a TypedArray, we will need the key represented
// as an internalized string.
- if (index_ > JSArray::kMaxArrayIndex && !holder->IsJSTypedArray()) {
+ if (index_ > JSArray::kMaxArrayIndex &&
+ !lookup_start_object->IsJSTypedArray()) {
if (name_.is_null()) {
name_ = isolate->factory()->SizeToString(index_);
}
@@ -85,10 +87,10 @@ LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
name_ = isolate->factory()->InternalizeName(name_);
#ifdef DEBUG
// Assert that the name is not an index.
- // If we're not looking at the prototype chain and the initial holder is
- // not a typed array, then this means "array index", otherwise we need to
+ // If we're not looking at the prototype chain and the lookup start object
+ // is not a typed array, then this means "array index", otherwise we need to
// ensure the full generality so that typed arrays are handled correctly.
- if (!check_prototype_chain() && !holder->IsJSTypedArray()) {
+ if (!check_prototype_chain() && !lookup_start_object->IsJSTypedArray()) {
uint32_t index;
DCHECK(!name_->AsArrayIndex(&index));
} else {
@@ -242,12 +244,12 @@ LookupIterator::Configuration LookupIterator::ComputeConfiguration(
// static
Handle<JSReceiver> LookupIterator::GetRoot(Isolate* isolate,
- Handle<Object> receiver,
+ Handle<Object> lookup_start_object,
size_t index) {
- if (receiver->IsJSReceiver(isolate)) {
- return Handle<JSReceiver>::cast(receiver);
+ if (lookup_start_object->IsJSReceiver(isolate)) {
+ return Handle<JSReceiver>::cast(lookup_start_object);
}
- return GetRootForNonJSReceiver(isolate, receiver, index);
+ return GetRootForNonJSReceiver(isolate, lookup_start_object, index);
}
template <class T>
diff --git a/deps/v8/src/objects/lookup.cc b/deps/v8/src/objects/lookup.cc
index b7086fc06f..25f2d254df 100644
--- a/deps/v8/src/objects/lookup.cc
+++ b/deps/v8/src/objects/lookup.cc
@@ -14,8 +14,8 @@
#include "src/objects/hash-table-inl.h"
#include "src/objects/heap-number-inl.h"
#include "src/objects/struct-inl.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
@@ -49,26 +49,30 @@ LookupIterator::LookupIterator(Isolate* isolate, Handle<Object> receiver,
name_(name),
transition_(transition_map),
receiver_(receiver),
- initial_holder_(GetRoot(isolate, receiver)),
+ lookup_start_object_(receiver),
index_(kInvalidIndex) {
- holder_ = initial_holder_;
+ holder_ = GetRoot(isolate, lookup_start_object_);
}
template <bool is_element>
void LookupIterator::Start() {
- DisallowHeapAllocation no_gc;
+ // GetRoot might allocate if lookup_start_object_ is a string.
+ holder_ = GetRoot(isolate_, lookup_start_object_, index_);
- has_property_ = false;
- state_ = NOT_FOUND;
- holder_ = initial_holder_;
+ {
+ DisallowHeapAllocation no_gc;
- JSReceiver holder = *holder_;
- Map map = holder.map(isolate_);
+ has_property_ = false;
+ state_ = NOT_FOUND;
- state_ = LookupInHolder<is_element>(map, holder);
- if (IsFound()) return;
+ JSReceiver holder = *holder_;
+ Map map = holder.map(isolate_);
- NextInternal<is_element>(map, holder);
+ state_ = LookupInHolder<is_element>(map, holder);
+ if (IsFound()) return;
+
+ NextInternal<is_element>(map, holder);
+ }
}
template void LookupIterator::Start<true>();
@@ -127,22 +131,25 @@ template void LookupIterator::RestartInternal<false>(InterceptorState);
// static
Handle<JSReceiver> LookupIterator::GetRootForNonJSReceiver(
- Isolate* isolate, Handle<Object> receiver, size_t index) {
+ Isolate* isolate, Handle<Object> lookup_start_object, size_t index) {
// Strings are the only objects with properties (only elements) directly on
// the wrapper. Hence we can skip generating the wrapper for all other cases.
- if (receiver->IsString(isolate) &&
- index < static_cast<size_t>(String::cast(*receiver).length())) {
+ if (lookup_start_object->IsString(isolate) &&
+ index <
+ static_cast<size_t>(String::cast(*lookup_start_object).length())) {
// TODO(verwaest): Speed this up. Perhaps use a cached wrapper on the native
// context, ensuring that we don't leak it into JS?
Handle<JSFunction> constructor = isolate->string_function();
Handle<JSObject> result = isolate->factory()->NewJSObject(constructor);
- Handle<JSPrimitiveWrapper>::cast(result)->set_value(*receiver);
+ Handle<JSPrimitiveWrapper>::cast(result)->set_value(*lookup_start_object);
return result;
}
Handle<HeapObject> root(
- receiver->GetPrototypeChainRootMap(isolate).prototype(isolate), isolate);
+ lookup_start_object->GetPrototypeChainRootMap(isolate).prototype(isolate),
+ isolate);
if (root->IsNull(isolate)) {
- isolate->PushStackTraceAndDie(reinterpret_cast<void*>(receiver->ptr()));
+ isolate->PushStackTraceAndDie(
+ reinterpret_cast<void*>(lookup_start_object->ptr()));
}
return Handle<JSReceiver>::cast(root);
}
diff --git a/deps/v8/src/objects/lookup.h b/deps/v8/src/objects/lookup.h
index 8ae05f073b..28a6bd8336 100644
--- a/deps/v8/src/objects/lookup.h
+++ b/deps/v8/src/objects/lookup.h
@@ -70,19 +70,19 @@ class V8_EXPORT_PRIVATE LookupIterator final {
Handle<Name> name,
Configuration configuration = DEFAULT);
inline LookupIterator(Isolate* isolate, Handle<Object> receiver,
- Handle<Name> name, Handle<JSReceiver> holder,
+ Handle<Name> name, Handle<Object> lookup_start_object,
Configuration configuration = DEFAULT);
inline LookupIterator(Isolate* isolate, Handle<Object> receiver, size_t index,
Configuration configuration = DEFAULT);
inline LookupIterator(Isolate* isolate, Handle<Object> receiver, size_t index,
- Handle<JSReceiver> holder,
+ Handle<Object> lookup_start_object,
Configuration configuration = DEFAULT);
inline LookupIterator(Isolate* isolate, Handle<Object> receiver,
const Key& key, Configuration configuration = DEFAULT);
inline LookupIterator(Isolate* isolate, Handle<Object> receiver,
- const Key& key, Handle<JSReceiver> holder,
+ const Key& key, Handle<Object> lookup_start_object,
Configuration configuration = DEFAULT);
void Restart() {
@@ -128,6 +128,8 @@ class V8_EXPORT_PRIVATE LookupIterator final {
template <class T>
inline Handle<T> GetHolder() const;
+ Handle<Object> lookup_start_object() const { return lookup_start_object_; }
+
bool HolderIsReceiver() const;
bool HolderIsReceiverOrHiddenPrototype() const;
@@ -196,7 +198,8 @@ class V8_EXPORT_PRIVATE LookupIterator final {
inline LookupIterator(Isolate* isolate, Handle<Object> receiver,
Handle<Name> name, size_t index,
- Handle<JSReceiver> holder, Configuration configuration);
+ Handle<Object> lookup_start_object,
+ Configuration configuration);
// For |ForTransitionHandler|.
LookupIterator(Isolate* isolate, Handle<Object> receiver, Handle<Name> name,
@@ -261,9 +264,10 @@ class V8_EXPORT_PRIVATE LookupIterator final {
Handle<Name> name);
static Handle<JSReceiver> GetRootForNonJSReceiver(
- Isolate* isolate, Handle<Object> receiver, size_t index = kInvalidIndex);
+ Isolate* isolate, Handle<Object> lookup_start_object,
+ size_t index = kInvalidIndex);
static inline Handle<JSReceiver> GetRoot(Isolate* isolate,
- Handle<Object> receiver,
+ Handle<Object> lookup_start_object,
size_t index = kInvalidIndex);
State NotFound(JSReceiver const holder) const;
@@ -280,7 +284,7 @@ class V8_EXPORT_PRIVATE LookupIterator final {
Handle<Object> transition_;
const Handle<Object> receiver_;
Handle<JSReceiver> holder_;
- const Handle<JSReceiver> initial_holder_;
+ const Handle<Object> lookup_start_object_;
const size_t index_;
InternalIndex number_ = InternalIndex::NotFound();
};
diff --git a/deps/v8/src/objects/map-inl.h b/deps/v8/src/objects/map-inl.h
index 0e0adc2092..01beb50652 100644
--- a/deps/v8/src/objects/map-inl.h
+++ b/deps/v8/src/objects/map-inl.h
@@ -11,6 +11,7 @@
#include "src/objects/descriptor-array-inl.h"
#include "src/objects/field-type.h"
#include "src/objects/instance-type-inl.h"
+#include "src/objects/js-function-inl.h"
#include "src/objects/layout-descriptor-inl.h"
#include "src/objects/map.h"
#include "src/objects/objects-inl.h"
@@ -697,7 +698,7 @@ void Map::AppendDescriptor(Isolate* isolate, Descriptor* desc) {
descriptors.Append(desc);
SetNumberOfOwnDescriptors(number_of_own_descriptors + 1);
#ifndef V8_DISABLE_WRITE_BARRIERS
- WriteBarrier::Marking(*this, descriptors, number_of_own_descriptors + 1);
+ WriteBarrier::Marking(descriptors, number_of_own_descriptors + 1);
#endif
}
// Properly mark the map if the {desc} is an "interesting symbol".
diff --git a/deps/v8/src/objects/map-updater.cc b/deps/v8/src/objects/map-updater.cc
index e51bcfc760..b4b1587493 100644
--- a/deps/v8/src/objects/map-updater.cc
+++ b/deps/v8/src/objects/map-updater.cc
@@ -232,10 +232,7 @@ MapUpdater::State MapUpdater::TryReconfigureToDataFieldInplace() {
handle(old_descriptors_->GetFieldType(modified_descriptor_), isolate_),
MaybeHandle<Object>(), new_field_type_, MaybeHandle<Object>());
}
- Handle<Map> field_owner(
- old_map_->FindFieldOwner(isolate_, modified_descriptor_), isolate_);
-
- GeneralizeField(field_owner, modified_descriptor_, new_constness_,
+ GeneralizeField(old_map_, modified_descriptor_, new_constness_,
new_representation_, new_field_type_);
// Check that the descriptor array was updated.
DCHECK(old_descriptors_->GetDetails(modified_descriptor_)
@@ -401,7 +398,13 @@ MapUpdater::State MapUpdater::FindTargetMap() {
}
Representation tmp_representation = tmp_details.representation();
if (!old_details.representation().fits_into(tmp_representation)) {
- break;
+ // Try updating the field in-place to a generalized type.
+ Representation generalized =
+ tmp_representation.generalize(old_details.representation());
+ if (!tmp_representation.CanBeInPlaceChangedTo(generalized)) {
+ break;
+ }
+ tmp_representation = generalized;
}
if (tmp_details.location() == kField) {
diff --git a/deps/v8/src/objects/map.cc b/deps/v8/src/objects/map.cc
index 5f310819ef..d1370aeaf4 100644
--- a/deps/v8/src/objects/map.cc
+++ b/deps/v8/src/objects/map.cc
@@ -25,9 +25,9 @@
#include "src/roots/roots.h"
#include "src/utils/ostreams.h"
#include "src/zone/zone-containers.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions.h"
+#include "torque-generated/field-offsets.h"
namespace v8 {
namespace internal {
@@ -188,9 +188,6 @@ VisitorId Map::GetVisitorId(Map map) {
case FEEDBACK_METADATA_TYPE:
return kVisitFeedbackMetadata;
- case FEEDBACK_VECTOR_TYPE:
- return kVisitFeedbackVector;
-
case ODDBALL_TYPE:
return kVisitOddball;
@@ -613,6 +610,7 @@ void Map::DeprecateTransitionTree(Isolate* isolate) {
transitions.GetTarget(i).DeprecateTransitionTree(isolate);
}
DCHECK(!constructor_or_backpointer().IsFunctionTemplateInfo());
+ DCHECK(CanBeDeprecated());
set_is_deprecated(true);
if (FLAG_trace_maps) {
LOG(isolate, MapEvent("Deprecate", handle(*this, isolate), Handle<Map>()));
@@ -638,8 +636,7 @@ void Map::ReplaceDescriptors(Isolate* isolate, DescriptorArray new_descriptors,
// all its elements.
Map current = *this;
#ifndef V8_DISABLE_WRITE_BARRIERS
- WriteBarrier::Marking(current, to_replace,
- to_replace.number_of_descriptors());
+ WriteBarrier::Marking(to_replace, to_replace.number_of_descriptors());
#endif
while (current.instance_descriptors(isolate) == to_replace) {
Object next = current.GetBackPointer(isolate);
@@ -1136,8 +1133,7 @@ void Map::EnsureDescriptorSlack(Isolate* isolate, Handle<Map> map, int slack) {
// descriptors will not be trimmed in the mark-compactor, we need to mark
// all its elements.
#ifndef V8_DISABLE_WRITE_BARRIERS
- WriteBarrier::Marking(*map, *descriptors,
- descriptors->number_of_descriptors());
+ WriteBarrier::Marking(*descriptors, descriptors->number_of_descriptors());
#endif
Map current = *map;
@@ -2580,7 +2576,7 @@ void Map::SetInstanceDescriptors(Isolate* isolate, DescriptorArray descriptors,
set_synchronized_instance_descriptors(descriptors);
SetNumberOfOwnDescriptors(number_of_own_descriptors);
#ifndef V8_DISABLE_WRITE_BARRIERS
- WriteBarrier::Marking(*this, descriptors, number_of_own_descriptors);
+ WriteBarrier::Marking(descriptors, number_of_own_descriptors);
#endif
}
diff --git a/deps/v8/src/objects/map.h b/deps/v8/src/objects/map.h
index 74ef9c8fcf..007dd77d6e 100644
--- a/deps/v8/src/objects/map.h
+++ b/deps/v8/src/objects/map.h
@@ -11,8 +11,8 @@
#include "src/objects/heap-object.h"
#include "src/objects/internal-index.h"
#include "src/objects/objects.h"
-#include "torque-generated/bit-fields-tq.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/bit-fields.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -42,7 +42,6 @@ enum InstanceType : uint16_t;
V(EmbedderDataArray) \
V(EphemeronHashTable) \
V(FeedbackCell) \
- V(FeedbackVector) \
V(FreeSpace) \
V(JSApiObject) \
V(JSArrayBuffer) \
diff --git a/deps/v8/src/objects/maybe-object-inl.h b/deps/v8/src/objects/maybe-object-inl.h
index 36da46fa17..afb3a93123 100644
--- a/deps/v8/src/objects/maybe-object-inl.h
+++ b/deps/v8/src/objects/maybe-object-inl.h
@@ -56,6 +56,19 @@ HeapObjectReference HeapObjectReference::Weak(Object object) {
}
// static
+HeapObjectReference HeapObjectReference::From(Object object,
+ HeapObjectReferenceType type) {
+ DCHECK(!object.IsSmi());
+ DCHECK(!HasWeakHeapObjectTag(object));
+ switch (type) {
+ case HeapObjectReferenceType::STRONG:
+ return HeapObjectReference::Strong(object);
+ case HeapObjectReferenceType::WEAK:
+ return HeapObjectReference::Weak(object);
+ }
+}
+
+// static
HeapObjectReference HeapObjectReference::ClearedValue(const Isolate* isolate) {
// Construct cleared weak ref value.
#ifdef V8_COMPRESS_POINTERS
diff --git a/deps/v8/src/objects/maybe-object.h b/deps/v8/src/objects/maybe-object.h
index 7074d1ae95..fd1363498e 100644
--- a/deps/v8/src/objects/maybe-object.h
+++ b/deps/v8/src/objects/maybe-object.h
@@ -47,6 +47,9 @@ class HeapObjectReference : public MaybeObject {
V8_INLINE static HeapObjectReference Weak(Object object);
+ V8_INLINE static HeapObjectReference From(Object object,
+ HeapObjectReferenceType type);
+
V8_INLINE static HeapObjectReference ClearedValue(const Isolate* isolate);
template <typename THeapObjectSlot>
diff --git a/deps/v8/src/objects/module.cc b/deps/v8/src/objects/module.cc
index 2101589f60..e35870e953 100644
--- a/deps/v8/src/objects/module.cc
+++ b/deps/v8/src/objects/module.cc
@@ -21,57 +21,74 @@
namespace v8 {
namespace internal {
+namespace {
#ifdef DEBUG
-void Module::PrintStatusTransition(Status new_status) {
- if (FLAG_trace_module_status) {
- StdoutStream os;
- os << "Changing module status from " << status() << " to " << new_status
- << " for ";
- if (this->IsSourceTextModule()) {
- Handle<Script> script(SourceTextModule::cast(*this).script(),
- GetIsolate());
- script->GetNameOrSourceURL().Print(os);
- } else {
- SyntheticModule::cast(*this).name().Print(os);
- }
+void PrintModuleName(Module module, std::ostream& os) {
+ if (module.IsSourceTextModule()) {
+ SourceTextModule::cast(module).script().GetNameOrSourceURL().Print(os);
+ } else {
+ SyntheticModule::cast(module).name().Print(os);
+ }
#ifndef OBJECT_PRINT
- os << "\n";
+ os << "\n";
#endif // OBJECT_PRINT
- }
+}
+
+void PrintStatusTransition(Module module, Module::Status new_status) {
+ if (!FLAG_trace_module_status) return;
+ StdoutStream os;
+ os << "Changing module status from " << module.status() << " to "
+ << new_status << " for ";
+ PrintModuleName(module, os);
+}
+
+void PrintStatusMessage(Module module, const char* message) {
+ if (!FLAG_trace_module_status) return;
+ StdoutStream os;
+ os << "Instantiating module ";
+ PrintModuleName(module, os);
}
#endif // DEBUG
+void SetStatusInternal(Module module, Module::Status new_status) {
+ DisallowHeapAllocation no_alloc;
+#ifdef DEBUG
+ PrintStatusTransition(module, new_status);
+#endif // DEBUG
+ module.set_status(new_status);
+}
+
+} // end namespace
+
void Module::SetStatus(Status new_status) {
DisallowHeapAllocation no_alloc;
DCHECK_LE(status(), new_status);
DCHECK_NE(new_status, Module::kErrored);
-#ifdef DEBUG
- PrintStatusTransition(new_status);
-#endif // DEBUG
- set_status(new_status);
+ SetStatusInternal(*this, new_status);
}
-void Module::RecordErrorUsingPendingException(Isolate* isolate) {
+// static
+void Module::RecordErrorUsingPendingException(Isolate* isolate,
+ Handle<Module> module) {
Handle<Object> the_exception(isolate->pending_exception(), isolate);
- RecordError(isolate, the_exception);
+ RecordError(isolate, module, the_exception);
}
-void Module::RecordError(Isolate* isolate, Handle<Object> error) {
- DCHECK(exception().IsTheHole(isolate));
+// static
+void Module::RecordError(Isolate* isolate, Handle<Module> module,
+ Handle<Object> error) {
+ DCHECK(module->exception().IsTheHole(isolate));
DCHECK(!error->IsTheHole(isolate));
- if (this->IsSourceTextModule()) {
- Handle<SourceTextModule> self(SourceTextModule::cast(*this), GetIsolate());
+ if (module->IsSourceTextModule()) {
+ Handle<SourceTextModule> self(SourceTextModule::cast(*module), isolate);
self->set_code(self->info());
}
-#ifdef DEBUG
- PrintStatusTransition(Module::kErrored);
-#endif // DEBUG
- set_status(Module::kErrored);
+ SetStatusInternal(*module, Module::kErrored);
if (isolate->is_catchable_by_javascript(*error)) {
- set_exception(*error);
+ module->set_exception(*error);
} else {
// v8::TryCatch uses `null` for termination exceptions.
- set_exception(*isolate->factory()->null_value());
+ module->set_exception(*isolate->factory()->null_value());
}
}
@@ -85,22 +102,21 @@ void Module::ResetGraph(Isolate* isolate, Handle<Module> module) {
Handle<FixedArray> requested_modules =
module->IsSourceTextModule()
? Handle<FixedArray>(
- Handle<SourceTextModule>::cast(module)->requested_modules(),
- isolate)
+ SourceTextModule::cast(*module).requested_modules(), isolate)
: Handle<FixedArray>();
Reset(isolate, module);
- if (module->IsSourceTextModule()) {
- for (int i = 0; i < requested_modules->length(); ++i) {
- Handle<Object> descendant(requested_modules->get(i), isolate);
- if (descendant->IsModule()) {
- ResetGraph(isolate, Handle<Module>::cast(descendant));
- } else {
- DCHECK(descendant->IsUndefined(isolate));
- }
- }
- } else {
+
+ if (!module->IsSourceTextModule()) {
DCHECK(module->IsSyntheticModule());
- // Nothing else to do here.
+ return;
+ }
+ for (int i = 0; i < requested_modules->length(); ++i) {
+ Handle<Object> descendant(requested_modules->get(i), isolate);
+ if (descendant->IsModule()) {
+ ResetGraph(isolate, Handle<Module>::cast(descendant));
+ } else {
+ DCHECK(descendant->IsUndefined(isolate));
+ }
}
}
@@ -112,29 +128,22 @@ void Module::Reset(Isolate* isolate, Handle<Module> module) {
// by RunInitializationCode, which is called only after this module's SCC
// succeeds instantiation.
DCHECK(!module->module_namespace().IsJSModuleNamespace());
-
-#ifdef DEBUG
- module->PrintStatusTransition(kUninstantiated);
-#endif // DEBUG
-
const int export_count =
module->IsSourceTextModule()
- ? Handle<SourceTextModule>::cast(module)->regular_exports().length()
- : Handle<SyntheticModule>::cast(module)->export_names().length();
+ ? SourceTextModule::cast(*module).regular_exports().length()
+ : SyntheticModule::cast(*module).export_names().length();
Handle<ObjectHashTable> exports = ObjectHashTable::New(isolate, export_count);
if (module->IsSourceTextModule()) {
SourceTextModule::Reset(isolate, Handle<SourceTextModule>::cast(module));
- } else {
- // Nothing to do here.
}
module->set_exports(*exports);
- module->set_status(kUninstantiated);
+ SetStatusInternal(*module, kUninstantiated);
}
Object Module::GetException() {
- DisallowHeapAllocation no_alloc;
+ DisallowHeapAllocation no_gc;
DCHECK_EQ(status(), Module::kErrored);
DCHECK(!exception().IsTheHole());
return exception();
@@ -163,21 +172,7 @@ bool Module::Instantiate(Isolate* isolate, Handle<Module> module,
v8::Local<v8::Context> context,
v8::Module::ResolveCallback callback) {
#ifdef DEBUG
- if (FLAG_trace_module_status) {
- StdoutStream os;
- os << "Instantiating module ";
- if (module->IsSourceTextModule()) {
- Handle<SourceTextModule>::cast(module)
- ->script()
- .GetNameOrSourceURL()
- .Print(os);
- } else {
- Handle<SyntheticModule>::cast(module)->name().Print(os);
- }
-#ifndef OBJECT_PRINT
- os << "\n";
-#endif // OBJECT_PRINT
- }
+ PrintStatusMessage(*module, "Instantiating module ");
#endif // DEBUG
if (!PrepareInstantiate(isolate, module, context, callback)) {
@@ -237,21 +232,7 @@ bool Module::FinishInstantiate(Isolate* isolate, Handle<Module> module,
MaybeHandle<Object> Module::Evaluate(Isolate* isolate, Handle<Module> module) {
#ifdef DEBUG
- if (FLAG_trace_module_status) {
- StdoutStream os;
- os << "Evaluating module ";
- if (module->IsSourceTextModule()) {
- Handle<SourceTextModule>::cast(module)
- ->script()
- .GetNameOrSourceURL()
- .Print(os);
- } else {
- Handle<SyntheticModule>::cast(module)->name().Print(os);
- }
-#ifndef OBJECT_PRINT
- os << "\n";
-#endif // OBJECT_PRINT
- }
+ PrintStatusMessage(*module, "Evaluating module ");
#endif // DEBUG
STACK_CHECK(isolate, MaybeHandle<Object>());
if (FLAG_harmony_top_level_await && module->IsSourceTextModule()) {
@@ -360,7 +341,7 @@ MaybeHandle<Object> JSModuleNamespace::GetExport(Isolate* isolate,
return isolate->factory()->undefined_value();
}
- Handle<Object> value(Handle<Cell>::cast(object)->value(), isolate);
+ Handle<Object> value(Cell::cast(*object).value(), isolate);
if (value->IsTheHole(isolate)) {
THROW_NEW_ERROR(
isolate, NewReferenceError(MessageTemplate::kNotDefined, name), Object);
@@ -378,9 +359,7 @@ Maybe<PropertyAttributes> JSModuleNamespace::GetPropertyAttributes(
Isolate* isolate = it->isolate();
Handle<Object> lookup(object->module().exports().Lookup(name), isolate);
- if (lookup->IsTheHole(isolate)) {
- return Just(ABSENT);
- }
+ if (lookup->IsTheHole(isolate)) return Just(ABSENT);
Handle<Object> value(Handle<Cell>::cast(lookup)->value(), isolate);
if (value->IsTheHole(isolate)) {
diff --git a/deps/v8/src/objects/module.h b/deps/v8/src/objects/module.h
index 3907ea32df..f58454fac2 100644
--- a/deps/v8/src/objects/module.h
+++ b/deps/v8/src/objects/module.h
@@ -9,7 +9,7 @@
#include "src/objects/js-objects.h"
#include "src/objects/objects.h"
#include "src/objects/struct.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -123,13 +123,10 @@ class Module : public HeapObject {
// To set status to kErrored, RecordError or RecordErrorUsingPendingException
// should be used.
void SetStatus(Status status);
- void RecordErrorUsingPendingException(Isolate* isolate);
- void RecordError(Isolate* isolate, Handle<Object> error);
-
-#ifdef DEBUG
- // For --trace-module-status.
- void PrintStatusTransition(Status new_status);
-#endif // DEBUG
+ static void RecordErrorUsingPendingException(Isolate* isolate,
+ Handle<Module>);
+ static void RecordError(Isolate* isolate, Handle<Module> module,
+ Handle<Object> error);
OBJECT_CONSTRUCTORS(Module, HeapObject);
};
diff --git a/deps/v8/src/objects/name-inl.h b/deps/v8/src/objects/name-inl.h
index 0735b4e506..ffcd287fd3 100644
--- a/deps/v8/src/objects/name-inl.h
+++ b/deps/v8/src/objects/name-inl.h
@@ -94,6 +94,12 @@ uint32_t Name::Hash() {
return String::cast(*this).ComputeAndSetHash();
}
+uint32_t Name::hash() const {
+ uint32_t field = hash_field();
+ DCHECK(IsHashFieldComputed(field));
+ return field >> kHashShift;
+}
+
DEF_GETTER(Name, IsInterestingSymbol, bool) {
return IsSymbol(isolate) && Symbol::cast(*this).is_interesting_symbol();
}
diff --git a/deps/v8/src/objects/name.h b/deps/v8/src/objects/name.h
index 533d8b000e..264cb3698e 100644
--- a/deps/v8/src/objects/name.h
+++ b/deps/v8/src/objects/name.h
@@ -8,7 +8,7 @@
#include "src/base/bit-field.h"
#include "src/objects/objects.h"
#include "src/objects/primitive-heap-object.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -23,9 +23,15 @@ class Name : public TorqueGeneratedName<Name, PrimitiveHeapObject> {
// Tells whether the hash code has been computed.
inline bool HasHashCode();
- // Returns a hash value used for the property table
+ // Returns a hash value used for the property table. Ensures that the hash
+ // value is computed.
+ // TODO(ishell): rename to EnsureHash().
inline uint32_t Hash();
+ // Returns a hash value used for the property table (same as Hash()), assumes
+ // the hash is already computed.
+ inline uint32_t hash() const;
+
// Equality operations.
inline bool Equals(Name other);
inline static bool Equals(Isolate* isolate, Handle<Name> one,
diff --git a/deps/v8/src/objects/object-list-macros.h b/deps/v8/src/objects/object-list-macros.h
index 4c5646089c..9eef5c0dbf 100644
--- a/deps/v8/src/objects/object-list-macros.h
+++ b/deps/v8/src/objects/object-list-macros.h
@@ -5,7 +5,7 @@
#ifndef V8_OBJECTS_OBJECT_LIST_MACROS_H_
#define V8_OBJECTS_OBJECT_LIST_MACROS_H_
-#include "torque-generated/instance-types-tq.h"
+#include "torque-generated/instance-types.h"
namespace v8 {
namespace internal {
diff --git a/deps/v8/src/objects/object-macros-undef.h b/deps/v8/src/objects/object-macros-undef.h
index 508797ce9b..b96c03c00f 100644
--- a/deps/v8/src/objects/object-macros-undef.h
+++ b/deps/v8/src/objects/object-macros-undef.h
@@ -81,10 +81,3 @@
#undef DEFINE_DEOPT_ENTRY_ACCESSORS
#undef TQ_OBJECT_CONSTRUCTORS
#undef TQ_OBJECT_CONSTRUCTORS_IMPL
-#undef OBJECT_CONSTRUCTORS_NONINLINE
-#undef OBJECT_CONSTRUCTORS_IMPL_NONINLINE
-#undef DECL_GETTER_NONINLINE
-#undef DECL_ACCESSORS_NONINLINE
-#undef DECL_CAST_NONINLINE
-#undef TQ_OBJECT_CONSTRUCTORS_NONINLINE
-#undef TQ_OBJECT_CONSTRUCTORS_IMPL_NONINLINE
diff --git a/deps/v8/src/objects/object-macros.h b/deps/v8/src/objects/object-macros.h
index 9518bf982b..b4fc7717fe 100644
--- a/deps/v8/src/objects/object-macros.h
+++ b/deps/v8/src/objects/object-macros.h
@@ -16,19 +16,6 @@
#include "src/base/memory.h"
-// TODO(v8:10749): When we've had a chance to collect performance impact,
-// either move towards using _NONINLINE versions everywhere, or revert back to
-// inline use and remove _NONINLINE macros.
-#define OBJECT_CONSTRUCTORS_NONINLINE(Type, ...) \
- public: \
- constexpr Type() : __VA_ARGS__() {} \
- \
- protected: \
- template <typename TFieldType, int kFieldOffset> \
- friend class TaggedField; \
- \
- V8_EXPORT_PRIVATE explicit Type(Address ptr)
-
// Since this changes visibility, it should always be last in a class
// definition.
#define OBJECT_CONSTRUCTORS(Type, ...) \
@@ -41,9 +28,6 @@
\
explicit inline Type(Address ptr)
-#define OBJECT_CONSTRUCTORS_IMPL_NONINLINE(Type, Super) \
- Type::Type(Address ptr) : Super(ptr) { SLOW_DCHECK(Is##Type()); }
-
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super) \
inline Type::Type(Address ptr) : Super(ptr) { SLOW_DCHECK(Is##Type()); }
// In these cases, we don't have our own instance type to check, so check the
@@ -100,10 +84,6 @@
inline type name() const; \
inline type name(const Isolate* isolate) const;
-#define DECL_GETTER_NONINLINE(name, type) \
- V8_EXPORT_PRIVATE type name() const; \
- V8_EXPORT_PRIVATE type name(const Isolate* isolate) const;
-
#define DEF_GETTER(holder, name, type) \
type holder::name() const { \
const Isolate* isolate = GetIsolateForPtrCompr(*this); \
@@ -116,17 +96,12 @@
inline void set_##name(type value, \
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
-#define DECL_ACCESSORS_NONINLINE(name, type) \
- DECL_GETTER_NONINLINE(name, type) \
- V8_EXPORT_PRIVATE void set_##name( \
+// TODO(solanes, neis): Unify naming for synchronized accessor uses.
+#define DECL_SYNCHRONIZED_ACCESSORS(name, type) \
+ DECL_GETTER(synchronized_##name, type) \
+ inline void set_synchronized_##name( \
type value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
-#define DECL_CAST_NONINLINE(Type) \
- V8_EXPORT_PRIVATE static Type cast(Object object); \
- inline static Type unchecked_cast(Object object) { \
- return bit_cast<Type>(object); \
- }
-
#define DECL_CAST(Type) \
V8_INLINE static Type cast(Object object); \
V8_INLINE static Type unchecked_cast(Object object) { \
@@ -513,20 +488,6 @@
set(IndexForEntry(i) + k##name##Offset, value); \
}
-#define TQ_OBJECT_CONSTRUCTORS_NONINLINE(Type) \
- public: \
- constexpr Type() = default; \
- \
- protected: \
- template <typename TFieldType, int kFieldOffset> \
- friend class TaggedField; \
- \
- V8_EXPORT_PRIVATE explicit Type(Address ptr); \
- friend class TorqueGenerated##Type<Type, Super>;
-
-#define TQ_OBJECT_CONSTRUCTORS_IMPL_NONINLINE(Type) \
- Type::Type(Address ptr) : TorqueGenerated##Type<Type, Type::Super>(ptr) {}
-
#define TQ_OBJECT_CONSTRUCTORS(Type) \
public: \
constexpr Type() = default; \
diff --git a/deps/v8/src/objects/objects-body-descriptors-inl.h b/deps/v8/src/objects/objects-body-descriptors-inl.h
index 94fb44ace7..275ac9a9e6 100644
--- a/deps/v8/src/objects/objects-body-descriptors-inl.h
+++ b/deps/v8/src/objects/objects-body-descriptors-inl.h
@@ -10,7 +10,6 @@
#include "src/codegen/reloc-info.h"
#include "src/objects/cell.h"
#include "src/objects/data-handler.h"
-#include "src/objects/feedback-vector.h"
#include "src/objects/foreign-inl.h"
#include "src/objects/hash-table.h"
#include "src/objects/js-collection.h"
@@ -22,9 +21,9 @@
#include "src/objects/synthetic-module.h"
#include "src/objects/transitions.h"
#include "src/wasm/wasm-objects-inl.h"
-#include "torque-generated/class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/internal-class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/internal-class-definitions-inl.h"
namespace v8 {
namespace internal {
@@ -504,29 +503,6 @@ class FeedbackMetadata::BodyDescriptor final : public BodyDescriptorBase {
}
};
-class FeedbackVector::BodyDescriptor final : public BodyDescriptorBase {
- public:
- static bool IsValidSlot(Map map, HeapObject obj, int offset) {
- return offset == kSharedFunctionInfoOffset ||
- offset == kOptimizedCodeWeakOrSmiOffset ||
- offset == kClosureFeedbackCellArrayOffset ||
- offset >= kFeedbackSlotsOffset;
- }
-
- template <typename ObjectVisitor>
- static inline void IterateBody(Map map, HeapObject obj, int object_size,
- ObjectVisitor* v) {
- IteratePointer(obj, kSharedFunctionInfoOffset, v);
- IterateMaybeWeakPointer(obj, kOptimizedCodeWeakOrSmiOffset, v);
- IteratePointer(obj, kClosureFeedbackCellArrayOffset, v);
- IterateMaybeWeakPointers(obj, kFeedbackSlotsOffset, object_size, v);
- }
-
- static inline int SizeOf(Map map, HeapObject obj) {
- return FeedbackVector::SizeFor(FeedbackVector::cast(obj).length());
- }
-};
-
class PreparseData::BodyDescriptor final : public BodyDescriptorBase {
public:
static bool IsValidSlot(Map map, HeapObject obj, int offset) {
@@ -978,8 +954,6 @@ ReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3, T4 p4) {
p4);
case FEEDBACK_CELL_TYPE:
return Op::template apply<FeedbackCell::BodyDescriptor>(p1, p2, p3, p4);
- case FEEDBACK_VECTOR_TYPE:
- return Op::template apply<FeedbackVector::BodyDescriptor>(p1, p2, p3, p4);
case COVERAGE_INFO_TYPE:
return Op::template apply<CoverageInfo::BodyDescriptor>(p1, p2, p3, p4);
case WASM_ARRAY_TYPE:
@@ -1205,7 +1179,7 @@ class EphemeronHashTable::BodyDescriptor final : public BodyDescriptorBase {
}
};
-#include "torque-generated/objects-body-descriptors-tq-inl.inc"
+#include "torque-generated/objects-body-descriptors-inl.inc"
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/objects/objects-definitions.h b/deps/v8/src/objects/objects-definitions.h
index eaa3d9e9cc..30d5bb6ec4 100644
--- a/deps/v8/src/objects/objects-definitions.h
+++ b/deps/v8/src/objects/objects-definitions.h
@@ -6,8 +6,7 @@
#define V8_OBJECTS_OBJECTS_DEFINITIONS_H_
#include "src/init/heap-symbols.h"
-
-#include "torque-generated/instance-types-tq.h"
+#include "torque-generated/instance-types.h"
namespace v8 {
diff --git a/deps/v8/src/objects/objects-inl.h b/deps/v8/src/objects/objects-inl.h
index e8f5d870f6..c8ceea8f9a 100644
--- a/deps/v8/src/objects/objects-inl.h
+++ b/deps/v8/src/objects/objects-inl.h
@@ -42,7 +42,7 @@
#include "src/objects/tagged-index.h"
#include "src/objects/templates.h"
#include "src/sanitizer/tsan.h"
-#include "torque-generated/class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/objects.cc b/deps/v8/src/objects/objects.cc
index a8dfa6adf5..bb33b5d097 100644
--- a/deps/v8/src/objects/objects.cc
+++ b/deps/v8/src/objects/objects.cc
@@ -126,9 +126,9 @@
#include "src/wasm/wasm-engine.h"
#include "src/wasm/wasm-objects.h"
#include "src/zone/zone.h"
-#include "torque-generated/class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/internal-class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/internal-class-definitions-inl.h"
namespace v8 {
namespace internal {
@@ -671,12 +671,18 @@ Maybe<ComparisonResult> Object::Compare(Isolate* isolate, Handle<Object> x,
Handle<String>::cast(y)));
}
if (x->IsBigInt() && y->IsString()) {
- return Just(BigInt::CompareToString(isolate, Handle<BigInt>::cast(x),
- Handle<String>::cast(y)));
+ return BigInt::CompareToString(isolate, Handle<BigInt>::cast(x),
+ Handle<String>::cast(y));
}
if (x->IsString() && y->IsBigInt()) {
- return Just(Reverse(BigInt::CompareToString(
- isolate, Handle<BigInt>::cast(y), Handle<String>::cast(x))));
+ Maybe<ComparisonResult> maybe_result = BigInt::CompareToString(
+ isolate, Handle<BigInt>::cast(y), Handle<String>::cast(x));
+ ComparisonResult result;
+ if (maybe_result.To(&result)) {
+ return Just(Reverse(result));
+ } else {
+ return Nothing<ComparisonResult>();
+ }
}
// ES6 section 7.2.11 Abstract Relational Comparison step 6.
if (!Object::ToNumeric(isolate, x).ToHandle(&x) ||
@@ -735,8 +741,8 @@ Maybe<bool> Object::Equals(Isolate* isolate, Handle<Object> x,
return Just(
StrictNumberEquals(*x, Handle<Oddball>::cast(y)->to_number()));
} else if (y->IsBigInt()) {
- return Just(BigInt::EqualToString(isolate, Handle<BigInt>::cast(y),
- Handle<String>::cast(x)));
+ return BigInt::EqualToString(isolate, Handle<BigInt>::cast(y),
+ Handle<String>::cast(x));
} else if (y->IsJSReceiver()) {
if (!JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y))
.ToHandle(&y)) {
@@ -4347,16 +4353,16 @@ void DescriptorArray::Sort() {
// Reset sorting since the descriptor array might contain invalid pointers.
for (int i = 0; i < len; ++i) SetSortedKey(i, i);
// Bottom-up max-heap construction.
- // Index of the last node with children
+ // Index of the last node with children.
const int max_parent_index = (len / 2) - 1;
for (int i = max_parent_index; i >= 0; --i) {
int parent_index = i;
- const uint32_t parent_hash = GetSortedKey(i).Hash();
+ const uint32_t parent_hash = GetSortedKey(i).hash();
while (parent_index <= max_parent_index) {
int child_index = 2 * parent_index + 1;
- uint32_t child_hash = GetSortedKey(child_index).Hash();
+ uint32_t child_hash = GetSortedKey(child_index).hash();
if (child_index + 1 < len) {
- uint32_t right_child_hash = GetSortedKey(child_index + 1).Hash();
+ uint32_t right_child_hash = GetSortedKey(child_index + 1).hash();
if (right_child_hash > child_hash) {
child_index++;
child_hash = right_child_hash;
@@ -4375,13 +4381,13 @@ void DescriptorArray::Sort() {
SwapSortedKeys(0, i);
// Shift down the new top element.
int parent_index = 0;
- const uint32_t parent_hash = GetSortedKey(parent_index).Hash();
+ const uint32_t parent_hash = GetSortedKey(parent_index).hash();
const int max_parent_index = (i / 2) - 1;
while (parent_index <= max_parent_index) {
int child_index = parent_index * 2 + 1;
- uint32_t child_hash = GetSortedKey(child_index).Hash();
+ uint32_t child_hash = GetSortedKey(child_index).hash();
if (child_index + 1 < i) {
- uint32_t right_child_hash = GetSortedKey(child_index + 1).Hash();
+ uint32_t right_child_hash = GetSortedKey(child_index + 1).hash();
if (right_child_hash > child_hash) {
child_index++;
child_hash = right_child_hash;
@@ -6150,6 +6156,18 @@ Handle<CompilationCacheTable> CompilationCacheTable::PutCode(
Isolate* isolate, Handle<CompilationCacheTable> cache,
Handle<SharedFunctionInfo> key, Handle<Code> value) {
CodeKey k(key);
+
+ {
+ InternalIndex entry = cache->FindEntry(isolate, &k);
+ if (entry.is_found()) {
+ // Update.
+ cache->set(EntryToIndex(entry), *key);
+ cache->set(EntryToIndex(entry) + 1, *value);
+ return cache;
+ }
+ }
+
+ // Insert.
cache = EnsureCapacity(isolate, cache);
InternalIndex entry = cache->FindInsertionEntry(isolate, k.Hash());
cache->set(EntryToIndex(entry), *key);
diff --git a/deps/v8/src/objects/primitive-heap-object-inl.h b/deps/v8/src/objects/primitive-heap-object-inl.h
index 2c694bd1d6..609bf027da 100644
--- a/deps/v8/src/objects/primitive-heap-object-inl.h
+++ b/deps/v8/src/objects/primitive-heap-object-inl.h
@@ -8,7 +8,7 @@
#include "src/objects/primitive-heap-object.h"
#include "src/objects/heap-object-inl.h"
-#include "torque-generated/class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/primitive-heap-object.h b/deps/v8/src/objects/primitive-heap-object.h
index 9bd13cafc9..f7a57ffc08 100644
--- a/deps/v8/src/objects/primitive-heap-object.h
+++ b/deps/v8/src/objects/primitive-heap-object.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_PRIMITIVE_HEAP_OBJECT_H_
#include "src/objects/heap-object.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/property-array.h b/deps/v8/src/objects/property-array.h
index c8e9041c6e..e7fbb49c72 100644
--- a/deps/v8/src/objects/property-array.h
+++ b/deps/v8/src/objects/property-array.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_PROPERTY_ARRAY_H_
#include "src/objects/heap-object.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/property-cell.h b/deps/v8/src/objects/property-cell.h
index b1251151a4..64751558a5 100644
--- a/deps/v8/src/objects/property-cell.h
+++ b/deps/v8/src/objects/property-cell.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_PROPERTY_CELL_H_
#include "src/objects/heap-object.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/property-descriptor-object.h b/deps/v8/src/objects/property-descriptor-object.h
index a0cd895fe6..1b019e48f2 100644
--- a/deps/v8/src/objects/property-descriptor-object.h
+++ b/deps/v8/src/objects/property-descriptor-object.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_PROPERTY_DESCRIPTOR_OBJECT_H_
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/prototype-info.h b/deps/v8/src/objects/prototype-info.h
index 4e665a39c8..ab312b71a7 100644
--- a/deps/v8/src/objects/prototype-info.h
+++ b/deps/v8/src/objects/prototype-info.h
@@ -8,7 +8,7 @@
#include "src/objects/fixed-array.h"
#include "src/objects/objects.h"
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/scope-info.h b/deps/v8/src/objects/scope-info.h
index 73f039e3f6..23c3949895 100644
--- a/deps/v8/src/objects/scope-info.h
+++ b/deps/v8/src/objects/scope-info.h
@@ -11,7 +11,7 @@
#include "src/objects/objects.h"
#include "src/utils/utils.h"
#include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/script.h b/deps/v8/src/objects/script.h
index 9ce44c770f..d9caff4bb6 100644
--- a/deps/v8/src/objects/script.h
+++ b/deps/v8/src/objects/script.h
@@ -11,7 +11,7 @@
#include "src/objects/fixed-array.h"
#include "src/objects/objects.h"
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/shared-function-info-inl.h b/deps/v8/src/objects/shared-function-info-inl.h
index 503c71ccdc..17677106d9 100644
--- a/deps/v8/src/objects/shared-function-info-inl.h
+++ b/deps/v8/src/objects/shared-function-info-inl.h
@@ -186,6 +186,9 @@ BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags2,
has_static_private_methods_or_accessors,
SharedFunctionInfo::HasStaticPrivateMethodsOrAccessorsBit)
+BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags2, has_optimized_at_least_once,
+ SharedFunctionInfo::HasOptimizedAtLeastOnceBit)
+
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags2, may_have_cached_code,
SharedFunctionInfo::MayHaveCachedCodeBit)
diff --git a/deps/v8/src/objects/shared-function-info.h b/deps/v8/src/objects/shared-function-info.h
index f349220af5..e195f99771 100644
--- a/deps/v8/src/objects/shared-function-info.h
+++ b/deps/v8/src/objects/shared-function-info.h
@@ -19,8 +19,8 @@
#include "src/objects/struct.h"
#include "src/roots/roots.h"
#include "testing/gtest/include/gtest/gtest_prod.h"
-#include "torque-generated/bit-fields-tq.h"
-#include "torque-generated/field-offsets-tq.h"
+#include "torque-generated/bit-fields.h"
+#include "torque-generated/field-offsets.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
@@ -408,6 +408,10 @@ class SharedFunctionInfo : public HeapObject {
DECL_BOOLEAN_ACCESSORS(class_scope_has_private_brand)
DECL_BOOLEAN_ACCESSORS(has_static_private_methods_or_accessors)
+ // True if this SFI has been (non-OSR) optimized in the past. This is used to
+ // guide native-context-independent codegen.
+ DECL_BOOLEAN_ACCESSORS(has_optimized_at_least_once)
+
// True if a Code object associated with this SFI has been inserted into the
// compilation cache. Note that the cache entry may be removed by aging,
// hence the 'may'.
diff --git a/deps/v8/src/objects/shared-function-info.tq b/deps/v8/src/objects/shared-function-info.tq
index 1533d552cf..17ec1f2fea 100644
--- a/deps/v8/src/objects/shared-function-info.tq
+++ b/deps/v8/src/objects/shared-function-info.tq
@@ -44,6 +44,7 @@ bitfield struct SharedFunctionInfoFlags extends uint32 {
bitfield struct SharedFunctionInfoFlags2 extends uint8 {
class_scope_has_private_brand: bool: 1 bit;
has_static_private_methods_or_accessors: bool: 1 bit;
+ has_optimized_at_least_once: bool: 1 bit;
may_have_cached_code: bool: 1 bit;
}
diff --git a/deps/v8/src/objects/slots-inl.h b/deps/v8/src/objects/slots-inl.h
index e9f48c8407..bd243cd8ba 100644
--- a/deps/v8/src/objects/slots-inl.h
+++ b/deps/v8/src/objects/slots-inl.h
@@ -39,6 +39,10 @@ Object FullObjectSlot::Acquire_Load() const {
return Object(base::AsAtomicPointer::Acquire_Load(location()));
}
+Object FullObjectSlot::Acquire_Load(const Isolate* isolate) const {
+ return Acquire_Load();
+}
+
Object FullObjectSlot::Relaxed_Load() const {
return Object(base::AsAtomicPointer::Relaxed_Load(location()));
}
diff --git a/deps/v8/src/objects/slots.h b/deps/v8/src/objects/slots.h
index 53bdab03a1..cb726eba46 100644
--- a/deps/v8/src/objects/slots.h
+++ b/deps/v8/src/objects/slots.h
@@ -114,6 +114,7 @@ class FullObjectSlot : public SlotBase<FullObjectSlot, Address> {
inline void store(Object value) const;
inline Object Acquire_Load() const;
+ inline Object Acquire_Load(const Isolate* isolate) const;
inline Object Relaxed_Load() const;
inline Object Relaxed_Load(const Isolate* isolate) const;
inline void Relaxed_Store(Object value) const;
diff --git a/deps/v8/src/objects/source-text-module.cc b/deps/v8/src/objects/source-text-module.cc
index bffe6b6061..fb29c18e2f 100644
--- a/deps/v8/src/objects/source-text-module.cc
+++ b/deps/v8/src/objects/source-text-module.cc
@@ -453,10 +453,9 @@ bool SourceTextModule::FinishInstantiate(
if (requested_module->status() == kInstantiating) {
// SyntheticModules go straight to kInstantiated so this must be a
// SourceTextModule
- module->set_dfs_ancestor_index(
- std::min(module->dfs_ancestor_index(),
- Handle<SourceTextModule>::cast(requested_module)
- ->dfs_ancestor_index()));
+ module->set_dfs_ancestor_index(std::min(
+ module->dfs_ancestor_index(),
+ SourceTextModule::cast(*requested_module).dfs_ancestor_index()));
}
}
@@ -694,7 +693,7 @@ MaybeHandle<Object> SourceTextModule::Evaluate(
CHECK_EQ(descendant->status(), kEvaluating);
// ii. Set m.[[Status]] to "evaluated".
// iii. Set m.[[EvaluationError]] to result.
- descendant->RecordErrorUsingPendingException(isolate);
+ Module::RecordErrorUsingPendingException(isolate, descendant);
}
#ifdef DEBUG
@@ -819,7 +818,7 @@ void SourceTextModule::AsyncModuleExecutionRejected(
}
// 4. Set module.[[EvaluationError]] to ThrowCompletion(error).
- module->RecordError(isolate, exception);
+ Module::RecordError(isolate, module, exception);
// 5. Set module.[[AsyncEvaluating]] to false.
module->set_async_evaluating(false);
diff --git a/deps/v8/src/objects/source-text-module.h b/deps/v8/src/objects/source-text-module.h
index f7ebf3f28f..7d79213f13 100644
--- a/deps/v8/src/objects/source-text-module.h
+++ b/deps/v8/src/objects/source-text-module.h
@@ -7,7 +7,7 @@
#include "src/objects/module.h"
#include "src/objects/promise.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/stack-frame-info.h b/deps/v8/src/objects/stack-frame-info.h
index 0da16a80c3..837c7e4b30 100644
--- a/deps/v8/src/objects/stack-frame-info.h
+++ b/deps/v8/src/objects/stack-frame-info.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_STACK_FRAME_INFO_H_
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/stack-frame-info.tq b/deps/v8/src/objects/stack-frame-info.tq
index b8b218bce1..b977128b3e 100644
--- a/deps/v8/src/objects/stack-frame-info.tq
+++ b/deps/v8/src/objects/stack-frame-info.tq
@@ -37,5 +37,4 @@ extern class StackTraceFrame extends Struct {
frame_array: FrameArray|Undefined;
frame_index: Smi;
frame_info: StackFrameInfo|Undefined;
- id: Smi;
}
diff --git a/deps/v8/src/objects/string-table.cc b/deps/v8/src/objects/string-table.cc
index c1cb99140b..ae8da8412c 100644
--- a/deps/v8/src/objects/string-table.cc
+++ b/deps/v8/src/objects/string-table.cc
@@ -4,11 +4,15 @@
#include "src/objects/string-table.h"
+#include <atomic>
+
+#include "src/base/atomicops.h"
#include "src/base/macros.h"
#include "src/common/assert-scope.h"
#include "src/common/globals.h"
#include "src/common/ptr-compr-inl.h"
#include "src/execution/isolate-utils-inl.h"
+#include "src/heap/safepoint.h"
#include "src/objects/internal-index.h"
#include "src/objects/object-list-macros.h"
#include "src/objects/slots-inl.h"
@@ -87,19 +91,19 @@ bool KeyIsMatch(StringTableKey* key, String string) {
class StringTable::Data {
public:
static std::unique_ptr<Data> New(int capacity);
- static void Resize(const Isolate* isolate, std::unique_ptr<Data>& data,
- int capacity);
+ static std::unique_ptr<Data> Resize(const Isolate* isolate,
+ std::unique_ptr<Data> data, int capacity);
OffHeapObjectSlot slot(InternalIndex index) const {
return OffHeapObjectSlot(&elements_[index.as_uint32()]);
}
Object Get(const Isolate* isolate, InternalIndex index) const {
- return slot(index).Relaxed_Load(isolate);
+ return slot(index).Acquire_Load(isolate);
}
void Set(InternalIndex index, String entry) {
- slot(index).Relaxed_Store(entry);
+ slot(index).Release_Store(entry);
}
void ElementAdded() {
@@ -173,7 +177,7 @@ class StringTable::Data {
std::unique_ptr<Data> previous_data_;
int number_of_elements_;
int number_of_deleted_elements_;
- int capacity_;
+ const int capacity_;
Tagged_t elements_[1];
};
@@ -219,8 +223,8 @@ std::unique_ptr<StringTable::Data> StringTable::Data::New(int capacity) {
return std::unique_ptr<Data>(new (capacity) Data(capacity));
}
-void StringTable::Data::Resize(const Isolate* isolate,
- std::unique_ptr<Data>& data, int capacity) {
+std::unique_ptr<StringTable::Data> StringTable::Data::Resize(
+ const Isolate* isolate, std::unique_ptr<Data> data, int capacity) {
std::unique_ptr<Data> new_data(new (capacity) Data(capacity));
DCHECK_LT(data->number_of_elements(), new_data->capacity());
@@ -239,12 +243,8 @@ void StringTable::Data::Resize(const Isolate* isolate,
}
new_data->number_of_elements_ = data->number_of_elements();
- // unique_ptr swap dance to update `data` with `new_data`, move the old `data`
- // to `new_data->previous_data_`, all while ensuring that `data` is never
- // nullptr.
- std::unique_ptr<Data>& data_storage = new_data->previous_data_;
- data_storage = std::move(new_data);
- std::swap(data_storage, data);
+ new_data->previous_data_ = std::move(data);
+ return new_data;
}
template <typename StringTableKey>
@@ -326,12 +326,24 @@ void StringTable::Data::Print(const Isolate* isolate) const {
os << "}" << std::endl;
}
-StringTable::StringTable() : data_(Data::New(kStringTableMinCapacity)) {}
-StringTable::~StringTable() = default;
+StringTable::StringTable(Isolate* isolate)
+ : data_(Data::New(kStringTableMinCapacity).release())
+#ifdef DEBUG
+ ,
+ isolate_(isolate)
+#endif
+{
+}
+StringTable::~StringTable() { delete data_; }
-int StringTable::Capacity() const { return data_->capacity(); }
+int StringTable::Capacity() const {
+ return data_.load(std::memory_order_acquire)->capacity();
+}
int StringTable::NumberOfElements() const {
- return data_->number_of_elements();
+ {
+ base::MutexGuard table_write_guard(&write_mutex_);
+ return data_.load(std::memory_order_relaxed)->number_of_elements();
+ }
}
// InternalizedStringKey carries a string/internalized-string object as key.
@@ -455,7 +467,7 @@ Handle<String> StringTable::LookupKey(LocalIsolate* isolate,
while (true) {
// Load the current string table data, in case another thread updates the
// data while we're reading.
- const StringTable::Data* data = data_.get();
+ const Data* data = data_.load(std::memory_order_acquire);
// First try to find the string in the table. This is safe to do even if the
// table is now reallocated; we won't find a stale entry in the old table
@@ -478,9 +490,7 @@ Handle<String> StringTable::LookupKey(LocalIsolate* isolate,
{
base::MutexGuard table_write_guard(&write_mutex_);
- EnsureCapacity(ptr_cmp_isolate, 1);
- // Reload the data pointer in case EnsureCapacity changed it.
- StringTable::Data* data = data_.get();
+ Data* data = EnsureCapacity(ptr_cmp_isolate, 1);
// Check one last time if the key is present in the table, in case it was
// added after the check.
@@ -529,12 +539,14 @@ template Handle<String> StringTable::LookupKey(LocalIsolate* isolate,
template Handle<String> StringTable::LookupKey(Isolate* isolate,
StringTableInsertionKey* key);
-void StringTable::EnsureCapacity(const Isolate* isolate,
- int additional_elements) {
+StringTable::Data* StringTable::EnsureCapacity(const Isolate* isolate,
+ int additional_elements) {
// This call is only allowed while the write mutex is held.
write_mutex_.AssertHeld();
- StringTable::Data* data = data_.get();
+ // This load can be relaxed as the table pointer can only be modified while
+ // the lock is held.
+ Data* data = data_.load(std::memory_order_relaxed);
// Grow or shrink table if needed. We first try to shrink the table, if it
// is sufficiently empty; otherwise we make sure to grow it so that it has
@@ -556,8 +568,18 @@ void StringTable::EnsureCapacity(const Isolate* isolate,
}
if (new_capacity != -1) {
- Data::Resize(isolate, data_, new_capacity);
+ std::unique_ptr<Data> new_data =
+ Data::Resize(isolate, std::unique_ptr<Data>(data), new_capacity);
+ // `new_data` is the new owner of `data`.
+ DCHECK_EQ(new_data->PreviousData(), data);
+ // Release-store the new data pointer as `data_`, so that it can be
+ // acquire-loaded by other threads. This string table becomes the owner of
+ // the pointer.
+ data = new_data.release();
+ data_.store(data, std::memory_order_release);
}
+
+ return data;
}
// static
@@ -601,7 +623,8 @@ Address StringTable::Data::TryStringToIndexOrLookupExisting(Isolate* isolate,
return Smi::FromInt(ResultSentinel::kUnsupported).ptr();
}
- StringTable::Data* string_table_data = isolate->string_table()->data_.get();
+ Data* string_table_data =
+ isolate->string_table()->data_.load(std::memory_order_acquire);
InternalIndex entry = string_table_data->FindEntry(isolate, &key, key.hash());
if (entry.is_not_found()) {
@@ -646,29 +669,44 @@ Address StringTable::TryStringToIndexOrLookupExisting(Isolate* isolate,
}
}
- StringTable* table = isolate->string_table();
if (source.IsOneByteRepresentation()) {
- return table->data_->TryStringToIndexOrLookupExisting<uint8_t>(
+ return StringTable::Data::TryStringToIndexOrLookupExisting<uint8_t>(
isolate, string, source, start);
}
- return table->data_->TryStringToIndexOrLookupExisting<uint16_t>(
+ return StringTable::Data::TryStringToIndexOrLookupExisting<uint16_t>(
isolate, string, source, start);
}
-void StringTable::Print(const Isolate* isolate) const { data_->Print(isolate); }
+void StringTable::Print(const Isolate* isolate) const {
+ data_.load(std::memory_order_acquire)->Print(isolate);
+}
size_t StringTable::GetCurrentMemoryUsage() const {
- return sizeof(*this) + data_->GetCurrentMemoryUsage();
+ return sizeof(*this) +
+ data_.load(std::memory_order_acquire)->GetCurrentMemoryUsage();
}
void StringTable::IterateElements(RootVisitor* visitor) {
- data_->IterateElements(visitor);
+ // This should only happen during garbage collection when background threads
+ // are paused, so the load can be relaxed.
+ DCHECK_IMPLIES(FLAG_local_heaps, isolate_->heap()->safepoint()->IsActive());
+ data_.load(std::memory_order_relaxed)->IterateElements(visitor);
}
-void StringTable::DropOldData() { data_->DropPreviousData(); }
+void StringTable::DropOldData() {
+ // This should only happen during garbage collection when background threads
+ // are paused, so the load can be relaxed.
+ DCHECK_IMPLIES(FLAG_local_heaps, isolate_->heap()->safepoint()->IsActive());
+ DCHECK_NE(isolate_->heap()->gc_state(), Heap::NOT_IN_GC);
+ data_.load(std::memory_order_relaxed)->DropPreviousData();
+}
void StringTable::NotifyElementsRemoved(int count) {
- data_->ElementsRemoved(count);
+ // This should only happen during garbage collection when background threads
+ // are paused, so the load can be relaxed.
+ DCHECK_IMPLIES(FLAG_local_heaps, isolate_->heap()->safepoint()->IsActive());
+ DCHECK_NE(isolate_->heap()->gc_state(), Heap::NOT_IN_GC);
+ data_.load(std::memory_order_relaxed)->ElementsRemoved(count);
}
} // namespace internal
diff --git a/deps/v8/src/objects/string-table.h b/deps/v8/src/objects/string-table.h
index d7a88ee68f..9efcc6e016 100644
--- a/deps/v8/src/objects/string-table.h
+++ b/deps/v8/src/objects/string-table.h
@@ -55,7 +55,7 @@ class V8_EXPORT_PRIVATE StringTable {
static constexpr Smi empty_element() { return Smi::FromInt(0); }
static constexpr Smi deleted_element() { return Smi::FromInt(1); }
- StringTable();
+ explicit StringTable(Isolate* isolate);
~StringTable();
int Capacity() const;
@@ -87,11 +87,17 @@ class V8_EXPORT_PRIVATE StringTable {
void NotifyElementsRemoved(int count);
private:
- void EnsureCapacity(const Isolate* isolate, int additional_elements);
-
class Data;
- std::unique_ptr<Data> data_;
- base::Mutex write_mutex_;
+
+ Data* EnsureCapacity(const Isolate* isolate, int additional_elements);
+
+ std::atomic<Data*> data_;
+ // Write mutex is mutable so that readers of concurrently mutated values (e.g.
+ // NumberOfElements) are allowed to lock it while staying const.
+ mutable base::Mutex write_mutex_;
+#ifdef DEBUG
+ Isolate* isolate_;
+#endif
};
} // namespace internal
diff --git a/deps/v8/src/objects/string.cc b/deps/v8/src/objects/string.cc
index 38b5412bb2..c450485a1b 100644
--- a/deps/v8/src/objects/string.cc
+++ b/deps/v8/src/objects/string.cc
@@ -4,6 +4,7 @@
#include "src/objects/string.h"
+#include "src/common/assert-scope.h"
#include "src/common/globals.h"
#include "src/handles/handles-inl.h"
#include "src/heap/heap-inl.h"
@@ -42,6 +43,7 @@ Handle<String> String::SlowFlatten(Isolate* isolate, Handle<ConsString> cons,
}
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
int length = cons->length();
allocation =
ObjectInYoungGeneration(*cons) ? allocation : AllocationType::kOld;
diff --git a/deps/v8/src/objects/struct-inl.h b/deps/v8/src/objects/struct-inl.h
index fbbdd3038b..afc4c6ce49 100644
--- a/deps/v8/src/objects/struct-inl.h
+++ b/deps/v8/src/objects/struct-inl.h
@@ -11,7 +11,7 @@
#include "src/objects/objects-inl.h"
#include "src/objects/oddball.h"
#include "src/roots/roots-inl.h"
-#include "torque-generated/class-definitions-tq-inl.h"
+#include "torque-generated/class-definitions-inl.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/struct.h b/deps/v8/src/objects/struct.h
index e28785ce6e..fcae2e593d 100644
--- a/deps/v8/src/objects/struct.h
+++ b/deps/v8/src/objects/struct.h
@@ -7,7 +7,7 @@
#include "src/objects/heap-object.h"
#include "src/objects/objects.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/synthetic-module.cc b/deps/v8/src/objects/synthetic-module.cc
index 75e79e8955..abe9ad2ed2 100644
--- a/deps/v8/src/objects/synthetic-module.cc
+++ b/deps/v8/src/objects/synthetic-module.cc
@@ -30,9 +30,8 @@ Maybe<bool> SyntheticModule::SetExport(Isolate* isolate,
return Nothing<bool>();
}
- Handle<Cell> export_cell(Handle<Cell>::cast(export_object));
// Spec step 2: Set the mutable binding of export_name to export_value
- export_cell->set_value(*export_value);
+ Cell::cast(*export_object).set_value(*export_value);
return Just(true);
}
@@ -56,18 +55,14 @@ MaybeHandle<Cell> SyntheticModule::ResolveExport(
Handle<String> module_specifier, Handle<String> export_name,
MessageLocation loc, bool must_resolve) {
Handle<Object> object(module->exports().Lookup(export_name), isolate);
- if (object->IsCell()) {
- return Handle<Cell>::cast(object);
- }
+ if (object->IsCell()) return Handle<Cell>::cast(object);
- if (must_resolve) {
- return isolate->Throw<Cell>(
- isolate->factory()->NewSyntaxError(MessageTemplate::kUnresolvableExport,
- module_specifier, export_name),
- &loc);
- }
+ if (!must_resolve) return MaybeHandle<Cell>();
- return MaybeHandle<Cell>();
+ return isolate->Throw<Cell>(
+ isolate->factory()->NewSyntaxError(MessageTemplate::kUnresolvableExport,
+ module_specifier, export_name),
+ &loc);
}
// Implements Synthetic Module Record's Instantiate concrete method :
@@ -116,7 +111,7 @@ MaybeHandle<Object> SyntheticModule::Evaluate(Isolate* isolate,
Utils::ToLocal(Handle<Module>::cast(module)))
.ToLocal(&result)) {
isolate->PromoteScheduledException();
- module->RecordErrorUsingPendingException(isolate);
+ Module::RecordErrorUsingPendingException(isolate, module);
return MaybeHandle<Object>();
}
diff --git a/deps/v8/src/objects/tagged-field.h b/deps/v8/src/objects/tagged-field.h
index 82b6268ecd..947bf6247b 100644
--- a/deps/v8/src/objects/tagged-field.h
+++ b/deps/v8/src/objects/tagged-field.h
@@ -45,11 +45,11 @@ class TaggedField : public AllStatic {
static inline T Relaxed_Load(HeapObject host, int offset = 0);
template <typename LocalIsolate>
- static T Relaxed_Load(const LocalIsolate* isolate, HeapObject host,
- int offset = 0);
+ static inline T Relaxed_Load(const LocalIsolate* isolate, HeapObject host,
+ int offset = 0);
static inline void Relaxed_Store(HeapObject host, T value);
- static void Relaxed_Store(HeapObject host, int offset, T value);
+ static inline void Relaxed_Store(HeapObject host, int offset, T value);
static inline T Acquire_Load(HeapObject host, int offset = 0);
template <typename LocalIsolate>
diff --git a/deps/v8/src/objects/templates.h b/deps/v8/src/objects/templates.h
index bed0fa3585..5aa0dc16a3 100644
--- a/deps/v8/src/objects/templates.h
+++ b/deps/v8/src/objects/templates.h
@@ -6,7 +6,7 @@
#define V8_OBJECTS_TEMPLATES_H_
#include "src/objects/struct.h"
-#include "torque-generated/bit-fields-tq.h"
+#include "torque-generated/bit-fields.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
diff --git a/deps/v8/src/objects/transitions-inl.h b/deps/v8/src/objects/transitions-inl.h
index ac5b1034c2..b2ee5366b2 100644
--- a/deps/v8/src/objects/transitions-inl.h
+++ b/deps/v8/src/objects/transitions-inl.h
@@ -169,12 +169,20 @@ int TransitionArray::SearchNameForTesting(Name name, int* out_insertion_index) {
return SearchName(name, out_insertion_index);
}
+Map TransitionArray::SearchAndGetTargetForTesting(
+ PropertyKind kind, Name name, PropertyAttributes attributes) {
+ return SearchAndGetTarget(kind, name, attributes);
+}
+
int TransitionArray::SearchSpecial(Symbol symbol, int* out_insertion_index) {
return SearchName(symbol, out_insertion_index);
}
int TransitionArray::SearchName(Name name, int* out_insertion_index) {
DCHECK(name.IsUniqueName());
+ // The name is taken from DescriptorArray, so it must already has a computed
+ // hash.
+ DCHECK(name.HasHashCode());
return internal::Search<ALL_ENTRIES>(this, name, number_of_entries(),
out_insertion_index);
}
diff --git a/deps/v8/src/objects/transitions.cc b/deps/v8/src/objects/transitions.cc
index 5b0c8674b6..d2c5f56fd5 100644
--- a/deps/v8/src/objects/transitions.cc
+++ b/deps/v8/src/objects/transitions.cc
@@ -644,8 +644,8 @@ void TransitionArray::Sort() {
temp_kind = details.kind();
temp_attributes = details.attributes();
}
- int cmp = CompareKeys(temp_key, temp_key.Hash(), temp_kind,
- temp_attributes, key, key.Hash(), kind, attributes);
+ int cmp = CompareKeys(temp_key, temp_key.hash(), temp_kind,
+ temp_attributes, key, key.hash(), kind, attributes);
if (cmp > 0) {
SetKey(j + 1, temp_key);
SetRawTarget(j + 1, temp_target);
diff --git a/deps/v8/src/objects/transitions.h b/deps/v8/src/objects/transitions.h
index 3e3dc1ad90..f0038f7350 100644
--- a/deps/v8/src/objects/transitions.h
+++ b/deps/v8/src/objects/transitions.h
@@ -150,6 +150,8 @@ class V8_EXPORT_PRIVATE TransitionsAccessor {
inline int Capacity();
+ inline TransitionArray transitions();
+
private:
friend class MarkCompactCollector; // For HasSimpleTransitionTo.
friend class TransitionArray;
@@ -182,8 +184,6 @@ class V8_EXPORT_PRIVATE TransitionsAccessor {
void TraverseTransitionTreeInternal(TraverseCallback callback, void* data,
DisallowHeapAllocation* no_gc);
- inline TransitionArray transitions();
-
Isolate* isolate_;
Handle<Map> map_handle_;
Map map_;
@@ -239,7 +239,7 @@ class TransitionArray : public WeakFixedArray {
V8_EXPORT_PRIVATE bool IsSortedNoDuplicates();
#endif
- void Sort();
+ V8_EXPORT_PRIVATE void Sort();
void PrintInternal(std::ostream& os);
@@ -268,6 +268,9 @@ class TransitionArray : public WeakFixedArray {
inline int SearchNameForTesting(Name name,
int* out_insertion_index = nullptr);
+ inline Map SearchAndGetTargetForTesting(PropertyKind kind, Name name,
+ PropertyAttributes attributes);
+
private:
friend class Factory;
friend class MarkCompactCollector;
@@ -304,8 +307,8 @@ class TransitionArray : public WeakFixedArray {
int Search(PropertyKind kind, Name name, PropertyAttributes attributes,
int* out_insertion_index = nullptr);
- Map SearchAndGetTarget(PropertyKind kind, Name name,
- PropertyAttributes attributes);
+ V8_EXPORT_PRIVATE Map SearchAndGetTarget(PropertyKind kind, Name name,
+ PropertyAttributes attributes);
// Search a non-property transition (like elements kind, observe or frozen
// transitions).
diff --git a/deps/v8/src/objects/value-serializer.cc b/deps/v8/src/objects/value-serializer.cc
index 58b1db6749..b34076025f 100644
--- a/deps/v8/src/objects/value-serializer.cc
+++ b/deps/v8/src/objects/value-serializer.cc
@@ -1642,7 +1642,6 @@ MaybeHandle<JSRegExp> ValueDeserializer::ReadJSRegExp() {
}
// Ensure the deserialized flags are valid.
- // TODO(adamk): Can we remove this check now that dotAll is always-on?
uint32_t flags_mask = static_cast<uint32_t>(-1) << JSRegExp::kFlagCount;
if ((raw_flags & flags_mask) ||
!JSRegExp::New(isolate_, pattern, static_cast<JSRegExp::Flags>(raw_flags))
diff --git a/deps/v8/src/parsing/expression-scope.h b/deps/v8/src/parsing/expression-scope.h
index 9cb04003ab..9d8c2a9345 100644
--- a/deps/v8/src/parsing/expression-scope.h
+++ b/deps/v8/src/parsing/expression-scope.h
@@ -505,8 +505,10 @@ class ExpressionParsingScope : public ExpressionScope<Types> {
return expression;
}
this->mark_verified();
+ const bool early_error = false;
return this->parser()->RewriteInvalidReferenceExpression(
- expression, beg_pos, end_pos, MessageTemplate::kInvalidLhsInFor);
+ expression, beg_pos, end_pos, MessageTemplate::kInvalidLhsInFor,
+ early_error);
}
void RecordExpressionError(const Scanner::Location& loc,
diff --git a/deps/v8/src/parsing/parser-base.h b/deps/v8/src/parsing/parser-base.h
index 50902f67d6..37de4ef4f5 100644
--- a/deps/v8/src/parsing/parser-base.h
+++ b/deps/v8/src/parsing/parser-base.h
@@ -1353,9 +1353,12 @@ class ParserBase {
// Checks if the expression is a valid reference expression (e.g., on the
// left-hand side of assignments). Although ruled out by ECMA as early errors,
// we allow calls for web compatibility and rewrite them to a runtime throw.
+ // Modern language features can be exempted from this hack by passing
+ // early_error = true.
ExpressionT RewriteInvalidReferenceExpression(ExpressionT expression,
int beg_pos, int end_pos,
- MessageTemplate message);
+ MessageTemplate message,
+ bool early_error);
bool IsValidReferenceExpression(ExpressionT expression);
@@ -2825,9 +2828,12 @@ ParserBase<Impl>::ParseAssignmentExpressionCoverGrammar() {
end_position());
} else {
DCHECK(!IsValidReferenceExpression(expression));
+ // For web compatibility reasons, throw early errors only for logical
+ // assignment, not for regular assignment.
+ const bool early_error = Token::IsLogicalAssignmentOp(op);
expression = RewriteInvalidReferenceExpression(
expression, lhs_beg_pos, end_position(),
- MessageTemplate::kInvalidLhsInAssignment);
+ MessageTemplate::kInvalidLhsInAssignment, early_error);
}
Consume(op);
@@ -3142,9 +3148,10 @@ ParserBase<Impl>::ParseUnaryOrPrefixExpression() {
expression_scope()->MarkIdentifierAsAssigned();
}
} else {
+ const bool early_error = false;
expression = RewriteInvalidReferenceExpression(
expression, expression_position, end_position(),
- MessageTemplate::kInvalidLhsInPrefixOp);
+ MessageTemplate::kInvalidLhsInPrefixOp, early_error);
}
return factory()->NewCountOperation(op, true /* prefix */, expression,
@@ -3217,9 +3224,10 @@ typename ParserBase<Impl>::ExpressionT
ParserBase<Impl>::ParsePostfixContinuation(ExpressionT expression,
int lhs_beg_pos) {
if (V8_UNLIKELY(!IsValidReferenceExpression(expression))) {
+ const bool early_error = false;
expression = RewriteInvalidReferenceExpression(
expression, lhs_beg_pos, end_position(),
- MessageTemplate::kInvalidLhsInPostfixOp);
+ MessageTemplate::kInvalidLhsInPostfixOp, early_error);
}
if (impl()->IsIdentifier(expression)) {
expression_scope()->MarkIdentifierAsAssigned();
@@ -4743,7 +4751,8 @@ template <typename Impl>
typename ParserBase<Impl>::ExpressionT
ParserBase<Impl>::RewriteInvalidReferenceExpression(ExpressionT expression,
int beg_pos, int end_pos,
- MessageTemplate message) {
+ MessageTemplate message,
+ bool early_error) {
DCHECK(!IsValidReferenceExpression(expression));
if (impl()->IsIdentifier(expression)) {
DCHECK(is_strict(language_mode()));
@@ -4753,7 +4762,8 @@ ParserBase<Impl>::RewriteInvalidReferenceExpression(ExpressionT expression,
MessageTemplate::kStrictEvalArguments);
return impl()->FailureExpression();
}
- if (expression->IsCall() && !expression->AsCall()->is_tagged_template()) {
+ if (expression->IsCall() && !expression->AsCall()->is_tagged_template() &&
+ !early_error) {
expression_scope()->RecordPatternError(
Scanner::Location(beg_pos, end_pos),
MessageTemplate::kInvalidDestructuringTarget);
@@ -4767,6 +4777,9 @@ ParserBase<Impl>::RewriteInvalidReferenceExpression(ExpressionT expression,
ExpressionT error = impl()->NewThrowReferenceError(message, beg_pos);
return factory()->NewProperty(expression, error, beg_pos);
}
+ // Tagged templates and other modern language features (which pass early_error
+ // = true) are exempt from the web compatibility hack. Throw a regular early
+ // error.
ReportMessageAt(Scanner::Location(beg_pos, end_pos), message);
return impl()->FailureExpression();
}
diff --git a/deps/v8/src/parsing/parser.cc b/deps/v8/src/parsing/parser.cc
index e8a8e60589..b05ae32bba 100644
--- a/deps/v8/src/parsing/parser.cc
+++ b/deps/v8/src/parsing/parser.cc
@@ -2507,7 +2507,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
event_name, flags().script_id(), ms, scope->start_position(),
scope->end_position(),
reinterpret_cast<const char*>(function_name->raw_data()),
- function_name->byte_length());
+ function_name->byte_length(), function_name->is_one_byte());
}
if (V8_UNLIKELY(TracingFlags::is_runtime_stats_enabled()) &&
did_preparse_successfully) {
diff --git a/deps/v8/src/parsing/parser.h b/deps/v8/src/parsing/parser.h
index 46abe16d4f..3836cdc1c8 100644
--- a/deps/v8/src/parsing/parser.h
+++ b/deps/v8/src/parsing/parser.h
@@ -655,7 +655,7 @@ class V8_EXPORT_PRIVATE Parser : public NON_EXPORTED_BASE(ParserBase<Parser>) {
if (expr->IsStringLiteral()) return expr;
ScopedPtrList<Expression> args(pointer_buffer());
args.Add(expr);
- return factory()->NewCallRuntime(Runtime::kInlineToStringRT, args,
+ return factory()->NewCallRuntime(Runtime::kInlineToString, args,
expr->position());
}
diff --git a/deps/v8/src/parsing/preparser.cc b/deps/v8/src/parsing/preparser.cc
index 6da0faa74a..2764e00a8b 100644
--- a/deps/v8/src/parsing/preparser.cc
+++ b/deps/v8/src/parsing/preparser.cc
@@ -347,14 +347,16 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
// reconstructed from the script id and the byte range in the log processor.
const char* name = "";
size_t name_byte_length = 0;
+ bool is_one_byte = true;
const AstRawString* string = function_name.string_;
if (string != nullptr) {
name = reinterpret_cast<const char*>(string->raw_data());
name_byte_length = string->byte_length();
+ is_one_byte = string->is_one_byte();
}
logger_->FunctionEvent(
event_name, flags().script_id(), ms, function_scope->start_position(),
- function_scope->end_position(), name, name_byte_length);
+ function_scope->end_position(), name, name_byte_length, is_one_byte);
}
return Expression::Default();
diff --git a/deps/v8/src/profiler/cpu-profiler-inl.h b/deps/v8/src/profiler/cpu-profiler-inl.h
index 4dd457581d..2e479f75b7 100644
--- a/deps/v8/src/profiler/cpu-profiler-inl.h
+++ b/deps/v8/src/profiler/cpu-profiler-inl.h
@@ -34,22 +34,26 @@ void CodeDisableOptEventRecord::UpdateCodeMap(CodeMap* code_map) {
void CodeDeoptEventRecord::UpdateCodeMap(CodeMap* code_map) {
CodeEntry* entry = code_map->FindEntry(instruction_start);
- if (entry == nullptr) return;
- std::vector<CpuProfileDeoptFrame> frames_vector(
- deopt_frames, deopt_frames + deopt_frame_count);
- entry->set_deopt_info(deopt_reason, deopt_id, std::move(frames_vector));
+ if (entry != nullptr) {
+ std::vector<CpuProfileDeoptFrame> frames_vector(
+ deopt_frames, deopt_frames + deopt_frame_count);
+ entry->set_deopt_info(deopt_reason, deopt_id, std::move(frames_vector));
+ }
delete[] deopt_frames;
}
void ReportBuiltinEventRecord::UpdateCodeMap(CodeMap* code_map) {
CodeEntry* entry = code_map->FindEntry(instruction_start);
- if (!entry) {
- // Code objects for builtins should already have been added to the map but
- // some of them have been filtered out by CpuProfiler.
- return;
+ if (entry) {
+ entry->SetBuiltinId(builtin_id);
+ } else if (builtin_id == Builtins::kGenericJSToWasmWrapper) {
+ // Make sure to add the generic js-to-wasm wrapper builtin, because that
+ // one is supposed to show up in profiles.
+ entry = new CodeEntry(CodeEventListener::BUILTIN_TAG,
+ Builtins::name(builtin_id));
+ code_map->AddCode(instruction_start, entry, instruction_size);
}
- entry->SetBuiltinId(builtin_id);
}
TickSample* SamplingEventsProcessor::StartTickSample() {
diff --git a/deps/v8/src/profiler/cpu-profiler.cc b/deps/v8/src/profiler/cpu-profiler.cc
index 71130f65ed..3b72ef818a 100644
--- a/deps/v8/src/profiler/cpu-profiler.cc
+++ b/deps/v8/src/profiler/cpu-profiler.cc
@@ -11,11 +11,13 @@
#include "src/base/template-utils.h"
#include "src/debug/debug.h"
#include "src/execution/frames-inl.h"
+#include "src/execution/v8threads.h"
#include "src/execution/vm-state-inl.h"
#include "src/libsampler/sampler.h"
#include "src/logging/counters.h"
#include "src/logging/log.h"
#include "src/profiler/cpu-profiler-inl.h"
+#include "src/profiler/profiler-stats.h"
#include "src/utils/locked-queue-inl.h"
#include "src/wasm/wasm-engine.h"
@@ -28,12 +30,25 @@ class CpuSampler : public sampler::Sampler {
public:
CpuSampler(Isolate* isolate, SamplingEventsProcessor* processor)
: sampler::Sampler(reinterpret_cast<v8::Isolate*>(isolate)),
- processor_(processor) {}
+ processor_(processor),
+ threadId_(ThreadId::Current()) {}
void SampleStack(const v8::RegisterState& regs) override {
- TickSample* sample = processor_->StartTickSample();
- if (sample == nullptr) return;
Isolate* isolate = reinterpret_cast<Isolate*>(this->isolate());
+ if (v8::Locker::IsActive() &&
+ !isolate->thread_manager()->IsLockedByThread(threadId_)) {
+ ProfilerStats::Instance()->AddReason(
+ ProfilerStats::Reason::kIsolateNotLocked);
+ return;
+ }
+ TickSample* sample = processor_->StartTickSample();
+ if (sample == nullptr) {
+ ProfilerStats::Instance()->AddReason(
+ ProfilerStats::Reason::kTickBufferFull);
+ return;
+ }
+ // Every bailout up until here resulted in a dropped sample. From now on,
+ // the sample is created in the buffer.
sample->Init(isolate, regs, TickSample::kIncludeCEntryFrame,
/* update_stats */ true,
/* use_simulator_reg_state */ true, processor_->period());
@@ -46,6 +61,7 @@ class CpuSampler : public sampler::Sampler {
private:
SamplingEventsProcessor* processor_;
+ ThreadId threadId_;
};
ProfilingScope::ProfilingScope(Isolate* isolate, ProfilerListener* listener)
@@ -164,14 +180,7 @@ void ProfilerEventsProcessor::StopSynchronously() {
bool ProfilerEventsProcessor::ProcessCodeEvent() {
CodeEventsContainer record;
if (events_buffer_.Dequeue(&record)) {
- if (record.generic.type == CodeEventRecord::NATIVE_CONTEXT_MOVE) {
- NativeContextMoveEventRecord& nc_record =
- record.NativeContextMoveEventRecord_;
- generator_->UpdateNativeContextAddress(nc_record.from_address,
- nc_record.to_address);
- } else {
- code_observer_->CodeEventHandlerInternal(record);
- }
+ code_observer_->CodeEventHandlerInternal(record);
last_processed_code_event_id_ = record.generic.order;
return true;
}
@@ -184,7 +193,6 @@ void ProfilerEventsProcessor::CodeEventHandler(
case CodeEventRecord::CODE_CREATION:
case CodeEventRecord::CODE_MOVE:
case CodeEventRecord::CODE_DISABLE_OPT:
- case CodeEventRecord::NATIVE_CONTEXT_MOVE:
Enqueue(evt_rec);
break;
case CodeEventRecord::CODE_DEOPT: {
@@ -351,7 +359,9 @@ void ProfilerCodeObserver::LogBuiltins() {
CodeEventsContainer evt_rec(CodeEventRecord::REPORT_BUILTIN);
ReportBuiltinEventRecord* rec = &evt_rec.ReportBuiltinEventRecord_;
Builtins::Name id = static_cast<Builtins::Name>(i);
- rec->instruction_start = builtins->builtin(id).InstructionStart();
+ Code code = builtins->builtin(id);
+ rec->instruction_start = code.InstructionStart();
+ rec->instruction_size = code.InstructionSize();
rec->builtin_id = id;
CodeEventHandlerInternal(evt_rec);
}
diff --git a/deps/v8/src/profiler/cpu-profiler.h b/deps/v8/src/profiler/cpu-profiler.h
index ab43aa34fa..e8d977424b 100644
--- a/deps/v8/src/profiler/cpu-profiler.h
+++ b/deps/v8/src/profiler/cpu-profiler.h
@@ -36,14 +36,10 @@ class ProfileGenerator;
V(CODE_DEOPT, CodeDeoptEventRecord) \
V(REPORT_BUILTIN, ReportBuiltinEventRecord)
-#define VM_EVENTS_TYPE_LIST(V) \
- CODE_EVENTS_TYPE_LIST(V) \
- V(NATIVE_CONTEXT_MOVE, NativeContextMoveEventRecord)
-
class CodeEventRecord {
public:
#define DECLARE_TYPE(type, ignore) type,
- enum Type { NONE = 0, VM_EVENTS_TYPE_LIST(DECLARE_TYPE) };
+ enum Type { NONE = 0, CODE_EVENTS_TYPE_LIST(DECLARE_TYPE) };
#undef DECLARE_TYPE
Type type;
@@ -96,18 +92,12 @@ class CodeDeoptEventRecord : public CodeEventRecord {
class ReportBuiltinEventRecord : public CodeEventRecord {
public:
Address instruction_start;
+ unsigned instruction_size;
Builtins::Name builtin_id;
V8_INLINE void UpdateCodeMap(CodeMap* code_map);
};
-// Signals that a native context's address has changed.
-class NativeContextMoveEventRecord : public CodeEventRecord {
- public:
- Address from_address;
- Address to_address;
-};
-
// A record type for sending samples from the main thread/signal handler to the
// profiling thread.
class TickSampleEventRecord {
@@ -132,7 +122,7 @@ class CodeEventsContainer {
union {
CodeEventRecord generic;
#define DECLARE_CLASS(ignore, type) type type##_;
- VM_EVENTS_TYPE_LIST(DECLARE_CLASS)
+ CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
#undef DECLARE_CLASS
};
};
diff --git a/deps/v8/src/profiler/heap-profiler.cc b/deps/v8/src/profiler/heap-profiler.cc
index fc9bd00f47..f063fd1f47 100644
--- a/deps/v8/src/profiler/heap-profiler.cc
+++ b/deps/v8/src/profiler/heap-profiler.cc
@@ -18,8 +18,7 @@ namespace internal {
HeapProfiler::HeapProfiler(Heap* heap)
: ids_(new HeapObjectsMap(heap)),
names_(new StringsStorage()),
- is_tracking_object_moves_(false),
- is_taking_snapshot_(false) {}
+ is_tracking_object_moves_(false) {}
HeapProfiler::~HeapProfiler() = default;
@@ -29,8 +28,7 @@ void HeapProfiler::DeleteAllSnapshots() {
}
void HeapProfiler::MaybeClearStringsStorage() {
- if (snapshots_.empty() && !sampling_heap_profiler_ && !allocation_tracker_ &&
- !is_taking_snapshot_) {
+ if (snapshots_.empty() && !sampling_heap_profiler_ && !allocation_tracker_) {
names_.reset(new StringsStorage());
}
}
@@ -68,7 +66,6 @@ HeapSnapshot* HeapProfiler::TakeSnapshot(
v8::ActivityControl* control,
v8::HeapProfiler::ObjectNameResolver* resolver,
bool treat_global_objects_as_roots) {
- is_taking_snapshot_ = true;
HeapSnapshot* result = new HeapSnapshot(this, treat_global_objects_as_roots);
{
HeapSnapshotGenerator generator(result, control, resolver, heap());
@@ -81,7 +78,6 @@ HeapSnapshot* HeapProfiler::TakeSnapshot(
}
ids_->RemoveDeadEntries();
is_tracking_object_moves_ = true;
- is_taking_snapshot_ = false;
heap()->isolate()->debug()->feature_tracker()->Track(
DebugFeatureTracker::kHeapSnapshot);
@@ -142,12 +138,10 @@ void HeapProfiler::StopHeapObjectsTracking() {
}
}
-int HeapProfiler::GetSnapshotsCount() const {
+int HeapProfiler::GetSnapshotsCount() {
return static_cast<int>(snapshots_.size());
}
-bool HeapProfiler::IsTakingSnapshot() const { return is_taking_snapshot_; }
-
HeapSnapshot* HeapProfiler::GetSnapshot(int index) {
return snapshots_.at(index).get();
}
diff --git a/deps/v8/src/profiler/heap-profiler.h b/deps/v8/src/profiler/heap-profiler.h
index 21d9bb8fcf..0d964b5c5d 100644
--- a/deps/v8/src/profiler/heap-profiler.h
+++ b/deps/v8/src/profiler/heap-profiler.h
@@ -49,8 +49,7 @@ class HeapProfiler : public HeapObjectAllocationTracker {
SnapshotObjectId PushHeapObjectsStats(OutputStream* stream,
int64_t* timestamp_us);
- int GetSnapshotsCount() const;
- bool IsTakingSnapshot() const;
+ int GetSnapshotsCount();
HeapSnapshot* GetSnapshot(int index);
SnapshotObjectId GetSnapshotObjectId(Handle<Object> obj);
SnapshotObjectId GetSnapshotObjectId(NativeObject obj);
@@ -94,7 +93,6 @@ class HeapProfiler : public HeapObjectAllocationTracker {
std::unique_ptr<StringsStorage> names_;
std::unique_ptr<AllocationTracker> allocation_tracker_;
bool is_tracking_object_moves_;
- bool is_taking_snapshot_;
base::Mutex profiler_mutex_;
std::unique_ptr<SamplingHeapProfiler> sampling_heap_profiler_;
std::vector<std::pair<v8::HeapProfiler::BuildEmbedderGraphCallback, void*>>
diff --git a/deps/v8/src/profiler/heap-snapshot-generator.cc b/deps/v8/src/profiler/heap-snapshot-generator.cc
index b2bf61a813..0c5af20b01 100644
--- a/deps/v8/src/profiler/heap-snapshot-generator.cc
+++ b/deps/v8/src/profiler/heap-snapshot-generator.cc
@@ -8,6 +8,7 @@
#include "src/api/api-inl.h"
#include "src/codegen/assembler-inl.h"
+#include "src/common/globals.h"
#include "src/debug/debug.h"
#include "src/handles/global-handles.h"
#include "src/heap/combined-heap.h"
@@ -187,10 +188,14 @@ HeapSnapshot::HeapSnapshot(HeapProfiler* profiler, bool global_objects_as_roots)
treat_global_objects_as_roots_(global_objects_as_roots) {
// It is very important to keep objects that form a heap snapshot
// as small as possible. Check assumptions about data structure sizes.
- STATIC_ASSERT((kSystemPointerSize == 4 && sizeof(HeapGraphEdge) == 12) ||
- (kSystemPointerSize == 8 && sizeof(HeapGraphEdge) == 24));
- STATIC_ASSERT((kSystemPointerSize == 4 && sizeof(HeapEntry) == 28) ||
- (kSystemPointerSize == 8 && sizeof(HeapEntry) == 40));
+ STATIC_ASSERT(kSystemPointerSize != 4 || sizeof(HeapGraphEdge) == 12);
+ STATIC_ASSERT(kSystemPointerSize != 8 || sizeof(HeapGraphEdge) == 24);
+ STATIC_ASSERT(kSystemPointerSize != 4 || sizeof(HeapEntry) == 32);
+#if V8_CC_MSVC
+ STATIC_ASSERT(kSystemPointerSize != 8 || sizeof(HeapEntry) == 48);
+#else // !V8_CC_MSVC
+ STATIC_ASSERT(kSystemPointerSize != 8 || sizeof(HeapEntry) == 40);
+#endif // !V8_CC_MSVC
memset(&gc_subroot_entries_, 0, sizeof(gc_subroot_entries_));
}
@@ -1937,9 +1942,11 @@ HeapEntry* EmbedderGraphEntriesAllocator::AllocateEntry(HeapThing ptr) {
(lookup_address) ? heap_object_map_->FindOrAddEntry(lookup_address, 0)
: static_cast<SnapshotObjectId>(
reinterpret_cast<uintptr_t>(node) << 1);
- return snapshot_->AddEntry(EmbedderGraphNodeType(node),
- EmbedderGraphNodeName(names_, node), id,
- static_cast<int>(size), 0);
+ auto* heap_entry = snapshot_->AddEntry(EmbedderGraphNodeType(node),
+ EmbedderGraphNodeName(names_, node),
+ id, static_cast<int>(size), 0);
+ heap_entry->set_detachedness(node->GetDetachedness());
+ return heap_entry;
}
NativeObjectsExplorer::NativeObjectsExplorer(
@@ -1952,32 +1959,49 @@ NativeObjectsExplorer::NativeObjectsExplorer(
embedder_graph_entries_allocator_(
new EmbedderGraphEntriesAllocator(snapshot)) {}
+void NativeObjectsExplorer::MergeNodeIntoEntry(
+ HeapEntry* entry, EmbedderGraph::Node* original_node,
+ EmbedderGraph::Node* wrapper_node) {
+ // The wrapper node may be an embedder node (for testing purposes) or a V8
+ // node (production code).
+ if (!wrapper_node->IsEmbedderNode()) {
+ // For V8 nodes only we can add a lookup.
+ EmbedderGraphImpl::V8NodeImpl* v8_node =
+ static_cast<EmbedderGraphImpl::V8NodeImpl*>(wrapper_node);
+ Object object = v8_node->GetObject();
+ DCHECK(!object.IsSmi());
+ if (original_node->GetNativeObject()) {
+ HeapObject heap_object = HeapObject::cast(object);
+ heap_object_map_->AddMergedNativeEntry(original_node->GetNativeObject(),
+ heap_object.address());
+ DCHECK_EQ(entry->id(), heap_object_map_->FindMergedNativeEntry(
+ original_node->GetNativeObject()));
+ }
+ }
+ entry->set_detachedness(original_node->GetDetachedness());
+ entry->set_name(MergeNames(
+ names_, EmbedderGraphNodeName(names_, original_node), entry->name()));
+ entry->set_type(EmbedderGraphNodeType(original_node));
+}
+
HeapEntry* NativeObjectsExplorer::EntryForEmbedderGraphNode(
EmbedderGraphImpl::Node* node) {
- EmbedderGraphImpl::Node* wrapper = node->WrapperNode();
- NativeObject native_object = node->GetNativeObject();
- if (wrapper) {
- node = wrapper;
+ // Return the entry for the wrapper node if present.
+ if (node->WrapperNode()) {
+ node = node->WrapperNode();
}
+ // Node is EmbedderNode.
if (node->IsEmbedderNode()) {
return generator_->FindOrAddEntry(node,
embedder_graph_entries_allocator_.get());
- } else {
- EmbedderGraphImpl::V8NodeImpl* v8_node =
- static_cast<EmbedderGraphImpl::V8NodeImpl*>(node);
- Object object = v8_node->GetObject();
- if (object.IsSmi()) return nullptr;
- HeapEntry* entry = generator_->FindEntry(
- reinterpret_cast<void*>(Object::cast(object).ptr()));
- if (native_object) {
- HeapObject heap_object = HeapObject::cast(object);
- heap_object_map_->AddMergedNativeEntry(native_object,
- heap_object.address());
- DCHECK_EQ(entry->id(),
- heap_object_map_->FindMergedNativeEntry(native_object));
- }
- return entry;
}
+ // Node is V8NodeImpl.
+ Object object =
+ static_cast<EmbedderGraphImpl::V8NodeImpl*>(node)->GetObject();
+ if (object.IsSmi()) return nullptr;
+ auto* entry = generator_->FindEntry(
+ reinterpret_cast<void*>(Object::cast(object).ptr()));
+ return entry;
}
bool NativeObjectsExplorer::IterateAndExtractReferences(
@@ -1991,25 +2015,25 @@ bool NativeObjectsExplorer::IterateAndExtractReferences(
EmbedderGraphImpl graph;
snapshot_->profiler()->BuildEmbedderGraph(isolate_, &graph);
for (const auto& node : graph.nodes()) {
- if (node->IsRootNode()) {
- snapshot_->root()->SetIndexedAutoIndexReference(
- HeapGraphEdge::kElement, EntryForEmbedderGraphNode(node.get()));
- }
- // Adjust the name and the type of the V8 wrapper node.
- auto wrapper = node->WrapperNode();
- if (wrapper) {
- HeapEntry* wrapper_entry = EntryForEmbedderGraphNode(wrapper);
- wrapper_entry->set_name(
- MergeNames(names_, EmbedderGraphNodeName(names_, node.get()),
- wrapper_entry->name()));
- wrapper_entry->set_type(EmbedderGraphNodeType(node.get()));
+ // Only add embedder nodes as V8 nodes have been added already by the
+ // V8HeapExplorer.
+ if (!node->IsEmbedderNode()) continue;
+
+ if (auto* entry = EntryForEmbedderGraphNode(node.get())) {
+ if (node->IsRootNode()) {
+ snapshot_->root()->SetIndexedAutoIndexReference(
+ HeapGraphEdge::kElement, entry);
+ }
+ if (node->WrapperNode()) {
+ MergeNodeIntoEntry(entry, node.get(), node->WrapperNode());
+ }
}
}
// Fill edges of the graph.
for (const auto& edge : graph.edges()) {
- HeapEntry* from = EntryForEmbedderGraphNode(edge.from);
// |from| and |to| can be nullptr if the corresponding node is a V8 node
// pointing to a Smi.
+ HeapEntry* from = EntryForEmbedderGraphNode(edge.from);
if (!from) continue;
HeapEntry* to = EntryForEmbedderGraphNode(edge.to);
if (!to) continue;
@@ -2125,6 +2149,11 @@ bool HeapSnapshotGenerator::FillReferences() {
}
template<int bytes> struct MaxDecimalDigitsIn;
+template <>
+struct MaxDecimalDigitsIn<1> {
+ static const int kSigned = 3;
+ static const int kUnsigned = 3;
+};
template<> struct MaxDecimalDigitsIn<4> {
static const int kSigned = 11;
static const int kUnsigned = 10;
@@ -2224,8 +2253,8 @@ class OutputStreamWriter {
// type, name|index, to_node.
const int HeapSnapshotJSONSerializer::kEdgeFieldsCount = 3;
-// type, name, id, self_size, edge_count, trace_node_id.
-const int HeapSnapshotJSONSerializer::kNodeFieldsCount = 6;
+// type, name, id, self_size, edge_count, trace_node_id, detachedness.
+const int HeapSnapshotJSONSerializer::kNodeFieldsCount = 7;
void HeapSnapshotJSONSerializer::Serialize(v8::OutputStream* stream) {
if (AllocationTracker* allocation_tracker =
@@ -2298,6 +2327,11 @@ namespace {
template<size_t size> struct ToUnsigned;
+template <>
+struct ToUnsigned<1> {
+ using Type = uint8_t;
+};
+
template<> struct ToUnsigned<4> {
using Type = uint32_t;
};
@@ -2371,11 +2405,12 @@ void HeapSnapshotJSONSerializer::SerializeEdges() {
}
void HeapSnapshotJSONSerializer::SerializeNode(const HeapEntry* entry) {
- // The buffer needs space for 4 unsigned ints, 1 size_t, 5 commas, \n and \0
+ // The buffer needs space for 5 unsigned ints, 1 size_t, 1 uint8_t, 7 commas,
+ // \n and \0
static const int kBufferSize =
5 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT
- + MaxDecimalDigitsIn<sizeof(size_t)>::kUnsigned // NOLINT
- + 6 + 1 + 1;
+ + MaxDecimalDigitsIn<sizeof(size_t)>::kUnsigned // NOLINT
+ + MaxDecimalDigitsIn<sizeof(uint8_t)>::kUnsigned + 7 + 1 + 1;
EmbeddedVector<char, kBufferSize> buffer;
int buffer_pos = 0;
if (to_node_index(entry) != 0) {
@@ -2392,6 +2427,8 @@ void HeapSnapshotJSONSerializer::SerializeNode(const HeapEntry* entry) {
buffer_pos = utoa(entry->children_count(), buffer, buffer_pos);
buffer[buffer_pos++] = ',';
buffer_pos = utoa(entry->trace_node_id(), buffer, buffer_pos);
+ buffer[buffer_pos++] = ',';
+ buffer_pos = utoa(entry->detachedness(), buffer, buffer_pos);
buffer[buffer_pos++] = '\n';
buffer[buffer_pos++] = '\0';
writer_->AddString(buffer.begin());
@@ -2421,7 +2458,8 @@ void HeapSnapshotJSONSerializer::SerializeSnapshot() {
JSON_S("id") ","
JSON_S("self_size") ","
JSON_S("edge_count") ","
- JSON_S("trace_node_id")) ","
+ JSON_S("trace_node_id") ","
+ JSON_S("detachedness")) ","
JSON_S("node_types") ":" JSON_A(
JSON_A(
JSON_S("hidden") ","
diff --git a/deps/v8/src/profiler/heap-snapshot-generator.h b/deps/v8/src/profiler/heap-snapshot-generator.h
index f17d3f9ed6..fcf253ea35 100644
--- a/deps/v8/src/profiler/heap-snapshot-generator.h
+++ b/deps/v8/src/profiler/heap-snapshot-generator.h
@@ -133,6 +133,11 @@ class HeapEntry {
V8_INLINE HeapGraphEdge* child(int i);
V8_INLINE Isolate* isolate() const;
+ void set_detachedness(v8::EmbedderGraph::Node::Detachedness value) {
+ detachedness_ = static_cast<uint8_t>(value);
+ }
+ uint8_t detachedness() const { return detachedness_; }
+
void SetIndexedReference(
HeapGraphEdge::Type type, int index, HeapEntry* entry);
void SetNamedReference(
@@ -161,7 +166,12 @@ class HeapEntry {
unsigned children_count_;
unsigned children_end_index_;
};
+#ifdef V8_TARGET_ARCH_64_BIT
+ size_t self_size_ : 48;
+#else // !V8_TARGET_ARCH_64_BIT
size_t self_size_;
+#endif // !V8_TARGET_ARCH_64_BIT
+ uint8_t detachedness_ = 0;
HeapSnapshot* snapshot_;
const char* name_;
SnapshotObjectId id_;
@@ -457,7 +467,11 @@ class NativeObjectsExplorer {
bool IterateAndExtractReferences(HeapSnapshotGenerator* generator);
private:
+ // Returns an entry for a given node, where node may be a V8 node or an
+ // embedder node. Returns the coresponding wrapper node if present.
HeapEntry* EntryForEmbedderGraphNode(EmbedderGraph::Node* node);
+ void MergeNodeIntoEntry(HeapEntry* entry, EmbedderGraph::Node* original_node,
+ EmbedderGraph::Node* wrapper_node);
Isolate* isolate_;
HeapSnapshot* snapshot_;
diff --git a/deps/v8/src/profiler/profile-generator.cc b/deps/v8/src/profiler/profile-generator.cc
index b38a67771b..cf448fcd20 100644
--- a/deps/v8/src/profiler/profile-generator.cc
+++ b/deps/v8/src/profiler/profile-generator.cc
@@ -10,6 +10,7 @@
#include "src/objects/shared-function-info-inl.h"
#include "src/profiler/cpu-profiler.h"
#include "src/profiler/profile-generator-inl.h"
+#include "src/profiler/profiler-stats.h"
#include "src/tracing/trace-event.h"
#include "src/tracing/traced-value.h"
@@ -331,8 +332,7 @@ void ProfileNode::Print(int indent) const {
if (entry_->resource_name()[0] != '\0')
base::OS::Print(" %s:%d", entry_->resource_name(), entry_->line_number());
base::OS::Print("\n");
- for (size_t i = 0; i < deopt_infos_.size(); ++i) {
- const CpuProfileDeoptInfo& info = deopt_infos_[i];
+ for (const CpuProfileDeoptInfo& info : deopt_infos_) {
base::OS::Print(
"%*s;;; deopted at script_id: %d position: %zu with reason '%s'.\n",
indent + 10, "", info.stack[0].script_id, info.stack[0].position,
@@ -398,14 +398,12 @@ ProfileNode* ProfileTree::AddPathFromEnd(const std::vector<CodeEntry*>& path,
ProfileNode* ProfileTree::AddPathFromEnd(const ProfileStackTrace& path,
int src_line, bool update_stats,
- ProfilingMode mode,
- ContextFilter* context_filter) {
+ ProfilingMode mode) {
ProfileNode* node = root_;
CodeEntry* last_entry = nullptr;
int parent_line_number = v8::CpuProfileNode::kNoLineNumberInfo;
for (auto it = path.rbegin(); it != path.rend(); ++it) {
if (it->entry.code_entry == nullptr) continue;
- if (context_filter && !context_filter->Accept(*it)) continue;
last_entry = (*it).entry.code_entry;
node = node->FindOrAddChild((*it).entry.code_entry, parent_line_number);
parent_line_number = mode == ProfilingMode::kCallerLineNumbers
@@ -465,21 +463,6 @@ void ProfileTree::TraverseDepthFirst(Callback* callback) {
}
}
-bool ContextFilter::Accept(const ProfileStackFrame& frame) {
- // If a frame should always be included in profiles (e.g. metadata frames),
- // skip the context check.
- if (!frame.filterable) return true;
-
- // Strip heap object tag from frame.
- return (frame.native_context & ~kHeapObjectTag) == native_context_address_;
-}
-
-void ContextFilter::OnMoveEvent(Address from_address, Address to_address) {
- if (native_context_address() != from_address) return;
-
- set_native_context_address(to_address);
-}
-
using v8::tracing::TracedValue;
std::atomic<uint32_t> CpuProfile::last_id_;
@@ -502,13 +485,6 @@ CpuProfile::CpuProfile(CpuProfiler* profiler, const char* title,
value->SetDouble("startTime", start_time_.since_origin().InMicroseconds());
TRACE_EVENT_SAMPLE_WITH_ID1(TRACE_DISABLED_BY_DEFAULT("v8.cpu_profiler"),
"Profile", id_, "data", std::move(value));
-
- if (options_.has_filter_context()) {
- DisallowHeapAllocation no_gc;
- i::Address raw_filter_context =
- reinterpret_cast<i::Address>(options_.raw_filter_context());
- context_filter_ = std::make_unique<ContextFilter>(raw_filter_context);
- }
}
bool CpuProfile::CheckSubsample(base::TimeDelta source_sampling_interval) {
@@ -533,8 +509,8 @@ void CpuProfile::AddPath(base::TimeTicks timestamp,
bool update_stats, base::TimeDelta sampling_interval) {
if (!CheckSubsample(sampling_interval)) return;
- ProfileNode* top_frame_node = top_down_.AddPathFromEnd(
- path, src_line, update_stats, options_.mode(), context_filter_.get());
+ ProfileNode* top_frame_node =
+ top_down_.AddPathFromEnd(path, src_line, update_stats, options_.mode());
bool should_record_sample =
!timestamp.IsNull() && timestamp >= start_time_ &&
@@ -646,8 +622,6 @@ void CpuProfile::StreamPendingTraceEvents() {
void CpuProfile::FinishProfile() {
end_time_ = base::TimeTicks::HighResolutionNow();
- // Stop tracking context movements after profiling stops.
- context_filter_ = nullptr;
StreamPendingTraceEvents();
auto value = TracedValue::Create();
// The endTime timestamp is not converted to Perfetto's clock domain and will
@@ -661,9 +635,11 @@ void CpuProfile::FinishProfile() {
"ProfileChunk", id_, "data", std::move(value));
}
-void CpuProfile::Print() {
+void CpuProfile::Print() const {
base::OS::Print("[Top down]:\n");
top_down_.Print();
+ ProfilerStats::Instance()->Print();
+ ProfilerStats::Instance()->Clear();
}
CodeMap::CodeMap() = default;
@@ -857,17 +833,6 @@ void CpuProfilesCollection::AddPathToCurrentProfiles(
current_profiles_semaphore_.Signal();
}
-void CpuProfilesCollection::UpdateNativeContextAddressForCurrentProfiles(
- Address from, Address to) {
- current_profiles_semaphore_.Wait();
- for (const std::unique_ptr<CpuProfile>& profile : current_profiles_) {
- if (auto* context_filter = profile->context_filter()) {
- context_filter->OnMoveEvent(from, to);
- }
- }
- current_profiles_semaphore_.Signal();
-}
-
ProfileGenerator::ProfileGenerator(CpuProfilesCollection* profiles,
CodeMap* code_map)
: profiles_(profiles), code_map_(code_map) {}
@@ -894,9 +859,7 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
// that a callback calls itself.
stack_trace.push_back({{FindEntry(reinterpret_cast<Address>(
sample.external_callback_entry)),
- no_line_info},
- reinterpret_cast<Address>(sample.top_context),
- true});
+ no_line_info}});
} else {
Address attributed_pc = reinterpret_cast<Address>(sample.pc);
Address pc_entry_instruction_start = kNullAddress;
@@ -922,9 +885,7 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
src_line = pc_entry->line_number();
}
src_line_not_found = false;
- stack_trace.push_back({{pc_entry, src_line},
- reinterpret_cast<Address>(sample.top_context),
- true});
+ stack_trace.push_back({{pc_entry, src_line}});
if (pc_entry->builtin_id() == Builtins::kFunctionPrototypeApply ||
pc_entry->builtin_id() == Builtins::kFunctionPrototypeCall) {
@@ -935,10 +896,10 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
// former case we don't so we simply replace the frame with
// 'unresolved' entry.
if (!sample.has_external_callback) {
+ ProfilerStats::Instance()->AddReason(
+ ProfilerStats::Reason::kInCallOrApply);
stack_trace.push_back(
- {{CodeEntry::unresolved_entry(), no_line_info},
- kNullAddress,
- true});
+ {{CodeEntry::unresolved_entry(), no_line_info}});
}
}
}
@@ -946,7 +907,6 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
for (unsigned i = 0; i < sample.frames_count; ++i) {
Address stack_pos = reinterpret_cast<Address>(sample.stack[i]);
- Address native_context = reinterpret_cast<Address>(sample.contexts[i]);
Address instruction_start = kNullAddress;
CodeEntry* entry = FindEntry(stack_pos, &instruction_start);
int line_number = no_line_info;
@@ -959,10 +919,7 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
if (inline_stack) {
int most_inlined_frame_line_number = entry->GetSourceLine(pc_offset);
for (auto entry : *inline_stack) {
- // Set the native context of inlined frames to be equal to that of
- // their parent. This is safe, as functions cannot inline themselves
- // into a parent from another native context.
- stack_trace.push_back({entry, native_context, true});
+ stack_trace.push_back({entry});
}
// This is a bit of a messy hack. The line number for the most-inlined
@@ -993,7 +950,7 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
// so we use it instead of pushing entry to stack_trace.
if (inline_stack) continue;
}
- stack_trace.push_back({{entry, line_number}, native_context, true});
+ stack_trace.push_back({{entry, line_number}});
}
}
@@ -1007,8 +964,13 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
}
// If no frames were symbolized, put the VM state entry in.
if (no_symbolized_entries) {
- stack_trace.push_back(
- {{EntryForVMState(sample.state), no_line_info}, kNullAddress, false});
+ if (sample.pc == nullptr) {
+ ProfilerStats::Instance()->AddReason(ProfilerStats::Reason::kNullPC);
+ } else {
+ ProfilerStats::Instance()->AddReason(
+ ProfilerStats::Reason::kNoSymbolizedFrames);
+ }
+ stack_trace.push_back({{EntryForVMState(sample.state), no_line_info}});
}
}
@@ -1017,10 +979,6 @@ void ProfileGenerator::SymbolizeTickSample(const TickSample& sample) {
sample.sampling_interval);
}
-void ProfileGenerator::UpdateNativeContextAddress(Address from, Address to) {
- profiles_->UpdateNativeContextAddressForCurrentProfiles(from, to);
-}
-
CodeEntry* ProfileGenerator::EntryForVMState(StateTag tag) {
switch (tag) {
case GC:
diff --git a/deps/v8/src/profiler/profile-generator.h b/deps/v8/src/profiler/profile-generator.h
index 1f9d5370ae..0852ee7802 100644
--- a/deps/v8/src/profiler/profile-generator.h
+++ b/deps/v8/src/profiler/profile-generator.h
@@ -230,35 +230,10 @@ struct CodeEntryAndLineNumber {
struct ProfileStackFrame {
CodeEntryAndLineNumber entry;
- Address native_context;
- bool filterable; // If true, the frame should be filtered by context (if a
- // filter is present).
};
typedef std::vector<ProfileStackFrame> ProfileStackTrace;
-// Filters stack frames from sources other than a target native context.
-class ContextFilter {
- public:
- explicit ContextFilter(Address native_context_address)
- : native_context_address_(native_context_address) {}
-
- // Returns true if the stack frame passes a context check.
- bool Accept(const ProfileStackFrame&);
-
- // Invoked when a native context has changed address.
- void OnMoveEvent(Address from_address, Address to_address);
-
- // Update the context's tracked address based on VM-thread events.
- void set_native_context_address(Address address) {
- native_context_address_ = address;
- }
- Address native_context_address() const { return native_context_address_; }
-
- private:
- Address native_context_address_;
-};
-
class ProfileTree;
class V8_EXPORT_PRIVATE ProfileNode {
@@ -343,14 +318,11 @@ class V8_EXPORT_PRIVATE ProfileTree {
const ProfileStackTrace& path,
int src_line = v8::CpuProfileNode::kNoLineNumberInfo,
bool update_stats = true,
- ProfilingMode mode = ProfilingMode::kLeafNodeLineNumbers,
- ContextFilter* context_filter = nullptr);
+ ProfilingMode mode = ProfilingMode::kLeafNodeLineNumbers);
ProfileNode* root() const { return root_; }
unsigned next_node_id() { return next_node_id_++; }
- void Print() {
- root_->Print(0);
- }
+ void Print() const { root_->Print(0); }
Isolate* isolate() const { return isolate_; }
@@ -408,18 +380,16 @@ class CpuProfile {
base::TimeTicks start_time() const { return start_time_; }
base::TimeTicks end_time() const { return end_time_; }
CpuProfiler* cpu_profiler() const { return profiler_; }
- ContextFilter* context_filter() const { return context_filter_.get(); }
void UpdateTicksScale();
- V8_EXPORT_PRIVATE void Print();
+ V8_EXPORT_PRIVATE void Print() const;
private:
void StreamPendingTraceEvents();
const char* title_;
const CpuProfilingOptions options_;
- std::unique_ptr<ContextFilter> context_filter_;
base::TimeTicks start_time_;
base::TimeTicks end_time_;
std::deque<SampleInfo> samples_;
@@ -498,9 +468,6 @@ class V8_EXPORT_PRIVATE CpuProfilesCollection {
bool update_stats,
base::TimeDelta sampling_interval);
- // Called from profile generator thread.
- void UpdateNativeContextAddressForCurrentProfiles(Address from, Address to);
-
// Limits the number of profiles that can be simultaneously collected.
static const int kMaxSimultaneousProfiles = 100;
@@ -525,8 +492,6 @@ class V8_EXPORT_PRIVATE ProfileGenerator {
// profiles in the CpuProfilesCollection.
void SymbolizeTickSample(const TickSample& sample);
- void UpdateNativeContextAddress(Address from, Address to);
-
CodeMap* code_map() { return code_map_; }
private:
diff --git a/deps/v8/src/profiler/profiler-listener.cc b/deps/v8/src/profiler/profiler-listener.cc
index 60eddfd5ae..a477f9ad0b 100644
--- a/deps/v8/src/profiler/profiler-listener.cc
+++ b/deps/v8/src/profiler/profiler-listener.cc
@@ -258,13 +258,6 @@ void ProfilerListener::CodeMoveEvent(AbstractCode from, AbstractCode to) {
DispatchCodeEvent(evt_rec);
}
-void ProfilerListener::NativeContextMoveEvent(Address from, Address to) {
- CodeEventsContainer evt_rec(CodeEventRecord::NATIVE_CONTEXT_MOVE);
- evt_rec.NativeContextMoveEventRecord_.from_address = from;
- evt_rec.NativeContextMoveEventRecord_.to_address = to;
- DispatchCodeEvent(evt_rec);
-}
-
void ProfilerListener::CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) {
CodeEventsContainer evt_rec(CodeEventRecord::CODE_DISABLE_OPT);
diff --git a/deps/v8/src/profiler/profiler-listener.h b/deps/v8/src/profiler/profiler-listener.h
index 47b61de4b9..7cdf8e09b4 100644
--- a/deps/v8/src/profiler/profiler-listener.h
+++ b/deps/v8/src/profiler/profiler-listener.h
@@ -50,7 +50,6 @@ class V8_EXPORT_PRIVATE ProfilerListener : public CodeEventListener {
Handle<String> source) override;
void CodeMoveEvent(AbstractCode from, AbstractCode to) override;
void SharedFunctionInfoMoveEvent(Address from, Address to) override {}
- void NativeContextMoveEvent(Address from, Address to) override;
void CodeMovingGCEvent() override {}
void CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) override;
diff --git a/deps/v8/src/profiler/profiler-stats.cc b/deps/v8/src/profiler/profiler-stats.cc
new file mode 100644
index 0000000000..308fdf4dd9
--- /dev/null
+++ b/deps/v8/src/profiler/profiler-stats.cc
@@ -0,0 +1,55 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/profiler/profiler-stats.h"
+
+#include <algorithm>
+
+#include "src/base/platform/platform.h"
+
+namespace v8 {
+namespace internal {
+
+void ProfilerStats::AddReason(Reason reason) {
+ counts_[reason].fetch_add(1, std::memory_order_relaxed);
+}
+
+void ProfilerStats::Clear() {
+ for (int i = 0; i < Reason::kNumberOfReasons; i++) {
+ counts_[i].store(0, std::memory_order_relaxed);
+ }
+}
+
+void ProfilerStats::Print() const {
+ base::OS::Print("ProfilerStats:\n");
+ for (int i = 0; i < Reason::kNumberOfReasons; i++) {
+ base::OS::Print(" %-30s\t\t %d\n", ReasonToString(static_cast<Reason>(i)),
+ counts_[i].load(std::memory_order_relaxed));
+ }
+}
+
+// static
+const char* ProfilerStats::ReasonToString(Reason reason) {
+ switch (reason) {
+ case kTickBufferFull:
+ return "kTickBufferFull";
+ case kIsolateNotLocked:
+ return "kIsolateNotLocked";
+ case kSimulatorFillRegistersFailed:
+ return "kSimulatorFillRegistersFailed";
+ case kNoFrameRegion:
+ return "kNoFrameRegion";
+ case kInCallOrApply:
+ return "kInCallOrApply";
+ case kNoSymbolizedFrames:
+ return "kNoSymbolizedFrames";
+ case kNullPC:
+ return "kNullPC";
+ case kNumberOfReasons:
+ return "kNumberOfReasons";
+ }
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/profiler/profiler-stats.h b/deps/v8/src/profiler/profiler-stats.h
new file mode 100644
index 0000000000..7f19b047f0
--- /dev/null
+++ b/deps/v8/src/profiler/profiler-stats.h
@@ -0,0 +1,49 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_PROFILER_PROFILER_STATS_H_
+#define V8_PROFILER_PROFILER_STATS_H_
+
+#include <atomic>
+
+namespace v8 {
+namespace internal {
+
+// Stats are used to diagnose the reasons for dropped or unnattributed frames.
+class ProfilerStats {
+ public:
+ enum Reason {
+ // Reasons we fail to record a TickSample.
+ kTickBufferFull,
+ kIsolateNotLocked,
+ // These all generate a TickSample.
+ kSimulatorFillRegistersFailed,
+ kNoFrameRegion,
+ kInCallOrApply,
+ kNoSymbolizedFrames,
+ kNullPC,
+
+ kNumberOfReasons,
+ };
+
+ static ProfilerStats* Instance() {
+ static ProfilerStats stats;
+ return &stats;
+ }
+
+ void AddReason(Reason reason);
+ void Clear();
+ void Print() const;
+
+ private:
+ ProfilerStats() = default;
+ static const char* ReasonToString(Reason reason);
+
+ std::atomic_int counts_[Reason::kNumberOfReasons] = {};
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_PROFILER_PROFILER_STATS_H_
diff --git a/deps/v8/src/profiler/tick-sample.cc b/deps/v8/src/profiler/tick-sample.cc
index 1de13445de..45fc911856 100644
--- a/deps/v8/src/profiler/tick-sample.cc
+++ b/deps/v8/src/profiler/tick-sample.cc
@@ -12,6 +12,7 @@
#include "src/execution/vm-state-inl.h"
#include "src/heap/heap-inl.h" // For Heap::code_range.
#include "src/logging/counters.h"
+#include "src/profiler/profiler-stats.h"
#include "src/sanitizer/asan.h"
#include "src/sanitizer/msan.h"
@@ -143,22 +144,6 @@ bool SimulatorHelper::FillRegisters(Isolate* isolate,
}
#endif // USE_SIMULATOR
-// Returns the native context for a JavaScript frame. If the frame wasn't a
-// JavaScript frame, it'll return kNullAddress.
-Address ScrapeNativeContextAddress(Heap* heap, Address context_address) {
-#if !defined(V8_TARGET_ARCH_IA32) && !defined(V8_TARGET_ARCH_X64)
- return kNullAddress;
-#else
- DCHECK_EQ(heap->gc_state(), Heap::NOT_IN_GC);
-
- // If the value is tagged, we're looking at a JavaScript frame.
- if (!HAS_STRONG_HEAP_OBJECT_TAG(context_address)) return kNullAddress;
-
- i::Object object(context_address);
- return i::Context::cast(object).map().native_context().ptr();
-#endif
-}
-
} // namespace
DISABLE_ASAN void TickSample::Init(Isolate* v8_isolate,
@@ -171,8 +156,7 @@ DISABLE_ASAN void TickSample::Init(Isolate* v8_isolate,
SampleInfo info;
RegisterState regs = reg_state;
if (!GetStackSample(v8_isolate, &regs, record_c_entry_frame, stack,
- kMaxFramesCount, &info, use_simulator_reg_state,
- contexts)) {
+ kMaxFramesCount, &info, use_simulator_reg_state)) {
// It is executing JS but failed to collect a stack trace.
// Mark the sample as spoiled.
pc = nullptr;
@@ -183,7 +167,6 @@ DISABLE_ASAN void TickSample::Init(Isolate* v8_isolate,
pc = regs.pc;
frames_count = static_cast<unsigned>(info.frames_count);
has_external_callback = info.external_callback_entry != nullptr;
- top_context = info.top_context;
if (has_external_callback) {
external_callback_entry = info.external_callback_entry;
} else if (frames_count) {
@@ -210,12 +193,11 @@ bool TickSample::GetStackSample(Isolate* v8_isolate, RegisterState* regs,
RecordCEntryFrame record_c_entry_frame,
void** frames, size_t frames_limit,
v8::SampleInfo* sample_info,
- bool use_simulator_reg_state, void** contexts) {
+ bool use_simulator_reg_state) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
sample_info->frames_count = 0;
sample_info->vm_state = isolate->current_vm_state();
sample_info->external_callback_entry = nullptr;
- sample_info->top_context = nullptr;
if (sample_info->vm_state == GC) return true;
i::Address js_entry_sp = isolate->js_entry_sp();
@@ -223,7 +205,11 @@ bool TickSample::GetStackSample(Isolate* v8_isolate, RegisterState* regs,
#if defined(USE_SIMULATOR)
if (use_simulator_reg_state) {
- if (!i::SimulatorHelper::FillRegisters(isolate, regs)) return false;
+ if (!i::SimulatorHelper::FillRegisters(isolate, regs)) {
+ i::ProfilerStats::Instance()->AddReason(
+ i::ProfilerStats::Reason::kSimulatorFillRegistersFailed);
+ return false;
+ }
}
#else
USE(use_simulator_reg_state);
@@ -232,11 +218,15 @@ bool TickSample::GetStackSample(Isolate* v8_isolate, RegisterState* regs,
// Check whether we interrupted setup/teardown of a stack frame in JS code.
// Avoid this check for C++ code, as that would trigger false positives.
+ // TODO(petermarshall): Code range is always null on ia32 so this check for
+ // IsNoFrameRegion will never actually run there.
if (regs->pc &&
isolate->heap()->memory_allocator()->code_range().contains(
reinterpret_cast<i::Address>(regs->pc)) &&
IsNoFrameRegion(reinterpret_cast<i::Address>(regs->pc))) {
// The frame is not setup, so it'd be hard to iterate the stack. Bailout.
+ i::ProfilerStats::Instance()->AddReason(
+ i::ProfilerStats::Reason::kNoFrameRegion);
return false;
}
@@ -260,14 +250,6 @@ bool TickSample::GetStackSample(Isolate* v8_isolate, RegisterState* regs,
reinterpret_cast<i::Address>(regs->lr),
js_entry_sp);
- i::Address top_context_address = it.top_context_address();
- if (top_context_address != i::kNullAddress) {
- sample_info->top_context = reinterpret_cast<void*>(
- i::ScrapeNativeContextAddress(isolate->heap(), top_context_address));
- } else {
- sample_info->top_context = nullptr;
- }
-
if (it.done()) return true;
size_t i = 0;
@@ -275,46 +257,19 @@ bool TickSample::GetStackSample(Isolate* v8_isolate, RegisterState* regs,
(it.top_frame_type() == internal::StackFrame::EXIT ||
it.top_frame_type() == internal::StackFrame::BUILTIN_EXIT)) {
frames[i] = reinterpret_cast<void*>(isolate->c_function());
- if (contexts) contexts[i] = sample_info->top_context;
i++;
}
- // If we couldn't get a context address from the top frame due to execution
- // being in a callback, borrow it from the next context on the stack.
- bool borrows_top_context = it.top_frame_type() == i::StackFrame::EXIT ||
- it.top_frame_type() == i::StackFrame::BUILTIN_EXIT;
-
i::RuntimeCallTimer* timer =
isolate->counters()->runtime_call_stats()->current_timer();
for (; !it.done() && i < frames_limit; it.Advance()) {
while (timer && reinterpret_cast<i::Address>(timer) < it.frame()->fp() &&
i < frames_limit) {
- if (contexts) contexts[i] = nullptr;
frames[i++] = reinterpret_cast<void*>(timer->counter());
timer = timer->parent();
}
if (i == frames_limit) break;
- // Attempt to read the native context associated with the frame from the
- // heap for standard frames.
- if (it.frame()->is_standard() && (contexts || borrows_top_context)) {
- i::Address context_address = base::Memory<i::Address>(
- it.frame()->fp() + i::StandardFrameConstants::kContextOffset);
- i::Address native_context_address =
- i::ScrapeNativeContextAddress(isolate->heap(), context_address);
- if (contexts)
- contexts[i] = reinterpret_cast<void*>(native_context_address);
-
- if (borrows_top_context) {
- DCHECK(!sample_info->top_context);
- sample_info->top_context =
- reinterpret_cast<void*>(native_context_address);
- }
- } else if (contexts) {
- contexts[i] = nullptr;
- }
- borrows_top_context = false;
-
if (it.frame()->is_interpreted()) {
// For interpreted frames use the bytecode array pointer as the pc.
i::InterpretedFrame* frame =
diff --git a/deps/v8/src/profiler/tick-sample.h b/deps/v8/src/profiler/tick-sample.h
index 37ae1e9d06..69cedef0ba 100644
--- a/deps/v8/src/profiler/tick-sample.h
+++ b/deps/v8/src/profiler/tick-sample.h
@@ -69,8 +69,7 @@ struct V8_EXPORT TickSample {
RecordCEntryFrame record_c_entry_frame,
void** frames, size_t frames_limit,
v8::SampleInfo* sample_info,
- bool use_simulator_reg_state = true,
- void** contexts = nullptr);
+ bool use_simulator_reg_state = true);
void print() const;
@@ -83,8 +82,6 @@ struct V8_EXPORT TickSample {
static const unsigned kMaxFramesCountLog2 = 8;
static const unsigned kMaxFramesCount = (1 << kMaxFramesCountLog2) - 1;
void* stack[kMaxFramesCount]; // Call stack.
- void* contexts[kMaxFramesCount]; // Stack of associated native contexts.
- void* top_context = nullptr; // Address of the incumbent native context.
unsigned frames_count : kMaxFramesCountLog2; // Number of captured frames.
bool has_external_callback : 1;
bool update_stats : 1; // Whether the sample should update aggregated stats.
diff --git a/deps/v8/src/regexp/experimental/experimental-bytecode.cc b/deps/v8/src/regexp/experimental/experimental-bytecode.cc
new file mode 100644
index 0000000000..d61bc3afd1
--- /dev/null
+++ b/deps/v8/src/regexp/experimental/experimental-bytecode.cc
@@ -0,0 +1,107 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/regexp/experimental/experimental-bytecode.h"
+
+#include <iomanip>
+
+namespace v8 {
+namespace internal {
+
+namespace {
+
+std::ostream& PrintAsciiOrHex(std::ostream& os, uc16 c) {
+ if (c < 128 && std::isprint(c)) {
+ os << static_cast<char>(c);
+ } else {
+ os << "0x" << std::hex << static_cast<int>(c);
+ }
+ return os;
+}
+
+} // namespace
+
+std::ostream& operator<<(std::ostream& os, const RegExpInstruction& inst) {
+ switch (inst.opcode) {
+ case RegExpInstruction::CONSUME_RANGE: {
+ os << "CONSUME_RANGE [";
+ PrintAsciiOrHex(os, inst.payload.consume_range.min);
+ os << ", ";
+ PrintAsciiOrHex(os, inst.payload.consume_range.max);
+ os << "]";
+ break;
+ }
+ case RegExpInstruction::ASSERTION:
+ os << "ASSERTION ";
+ switch (inst.payload.assertion_type) {
+ case RegExpAssertion::START_OF_INPUT:
+ os << "START_OF_INPUT";
+ break;
+ case RegExpAssertion::END_OF_INPUT:
+ os << "END_OF_INPUT";
+ break;
+ case RegExpAssertion::START_OF_LINE:
+ os << "START_OF_LINE";
+ break;
+ case RegExpAssertion::END_OF_LINE:
+ os << "END_OF_LINE";
+ break;
+ case RegExpAssertion::BOUNDARY:
+ os << "BOUNDARY";
+ break;
+ case RegExpAssertion::NON_BOUNDARY:
+ os << "NON_BOUNDARY";
+ break;
+ }
+ break;
+ case RegExpInstruction::FORK:
+ os << "FORK " << inst.payload.pc;
+ break;
+ case RegExpInstruction::JMP:
+ os << "JMP " << inst.payload.pc;
+ break;
+ case RegExpInstruction::ACCEPT:
+ os << "ACCEPT";
+ break;
+ case RegExpInstruction::SET_REGISTER_TO_CP:
+ os << "SET_REGISTER_TO_CP " << inst.payload.register_index;
+ break;
+ case RegExpInstruction::CLEAR_REGISTER:
+ os << "CLEAR_REGISTER " << inst.payload.register_index;
+ break;
+ }
+ return os;
+}
+
+namespace {
+
+// The maximum number of digits required to display a non-negative number < n
+// in base 10.
+int DigitsRequiredBelow(int n) {
+ DCHECK_GE(n, 0);
+
+ int result = 1;
+ for (int i = 10; i < n; i *= 10) {
+ result += 1;
+ }
+ return result;
+}
+
+} // namespace
+
+std::ostream& operator<<(std::ostream& os,
+ Vector<const RegExpInstruction> insts) {
+ int inst_num = insts.length();
+ int line_digit_num = DigitsRequiredBelow(inst_num);
+
+ for (int i = 0; i != inst_num; ++i) {
+ const RegExpInstruction& inst = insts[i];
+ os << std::setfill('0') << std::setw(line_digit_num) << i << ": " << inst
+ << std::endl;
+ }
+ return os;
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/regexp/experimental/experimental-bytecode.h b/deps/v8/src/regexp/experimental/experimental-bytecode.h
new file mode 100644
index 0000000000..3cb65828c5
--- /dev/null
+++ b/deps/v8/src/regexp/experimental/experimental-bytecode.h
@@ -0,0 +1,210 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_BYTECODE_H_
+#define V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_BYTECODE_H_
+
+#include <ios>
+
+#include "src/regexp/regexp-ast.h"
+#include "src/utils/vector.h"
+
+// ----------------------------------------------------------------------------
+// Definition and semantics of the EXPERIMENTAL bytecode.
+// Background:
+// - Russ Cox's blog post series on regular expression matching, in particular
+// https://swtch.com/~rsc/regexp/regexp2.html
+// - The re2 regular regexp library: https://github.com/google/re2
+//
+// This comment describes the bytecode used by the experimental regexp engine
+// and its abstract semantics in terms of a VM. An implementation of the
+// semantics that avoids exponential runtime can be found in `NfaInterpreter`.
+//
+// The experimental bytecode describes a non-deterministic finite automaton. It
+// runs on a multithreaded virtual machine (VM), i.e. in several threads
+// concurrently. (These "threads" don't need to be actual operating system
+// threads.) Apart from a list of threads, the VM maintains an immutable
+// shared input string which threads can read from. Each thread is given by a
+// program counter (PC, index of the current instruction), a fixed number of
+// registers of indices into the input string, and a monotonically increasing
+// index which represents the current position within the input string.
+//
+// For the precise encoding of the instruction set, see the definition `struct
+// RegExpInstruction` below. Currently we support the following instructions:
+// - CONSUME_RANGE: Check whether the codepoint of the current character is
+// contained in a non-empty closed interval [min, max] specified in the
+// instruction payload. Abort this thread if false, otherwise advance the
+// input position by 1 and continue with the next instruction.
+// - ACCEPT: Stop this thread and signify the end of a match at the current
+// input position.
+// - FORK: If executed by a thread t, spawn a new thread t0 whose register
+// values and input position agree with those of t, but whose PC value is set
+// to the value specified in the instruction payload. The register values of
+// t and t0 agree directly after the FORK, but they can diverge. Thread t
+// continues with the instruction directly after the current FORK
+// instruction.
+// - JMP: Instead of incrementing the PC value after execution of this
+// instruction by 1, set PC of this thread to the value specified in the
+// instruction payload and continue there.
+// - SET_REGISTER_TO_CP: Set a register specified in the paylod to the current
+// position (CP) within the input, then continue with the next instruction.
+// - CLEAR_REGISTER: Clear the register specified in the payload by resetting
+// it to the initial value -1.
+//
+// Special care must be exercised with respect to thread priority. It is
+// possible that more than one thread executes an ACCEPT statement. The output
+// of the program is given by the contents of the matching thread's registers,
+// so this is ambiguous in case of multiple matches. To resolve the ambiguity,
+// every implementation of the VM must output the match that a backtracking
+// implementation would output (i.e. behave the same as Irregexp).
+//
+// A backtracking implementation of the VM maintains a stack of postponed
+// threads. Upon encountering a FORK statement, this VM will create a copy of
+// the current thread, set the copy's PC value according to the instruction
+// payload, and push it to the stack of postponed threads. The VM will then
+// continue execution of the current thread.
+//
+// If at some point a thread t executes a MATCH statement, the VM stops and
+// outputs the registers of t. Postponed threads are discarded. On the other
+// hand, if a thread t is aborted because some input character didn't pass a
+// check, then the VM pops the topmost postponed thread and continues execution
+// with this thread. If there are no postponed threads, then the VM outputs
+// failure, i.e. no matches.
+//
+// Equivalently, we can describe the behavior of the backtracking VM in terms
+// of priority: Threads are linearly ordered by priority, and matches generated
+// by threads with high priority must be preferred over matches generated by
+// threads with low priority, regardless of the chronological order in which
+// matches were found. If a thread t executes a FORK statement and spawns a
+// thread t0, then the priority of t0 is such that the following holds:
+// * t0 < t, i.e. t0 has lower priority than t.
+// * For all threads u such that u != t and u != t0, we have t0 < u iff t < u,
+// i.e. the t0 compares to other threads the same as t.
+// For example, if there are currently 3 threads s, t, u such that s < t < u,
+// then after t executes a fork, the thread priorities will be s < t0 < t < u.
+
+namespace v8 {
+namespace internal {
+
+// Bytecode format.
+// Currently very simple fixed-size: The opcode is encoded in the first 4
+// bytes, the payload takes another 4 bytes.
+struct RegExpInstruction {
+ enum Opcode : int32_t {
+ ACCEPT,
+ ASSERTION,
+ CLEAR_REGISTER,
+ CONSUME_RANGE,
+ FORK,
+ JMP,
+ SET_REGISTER_TO_CP,
+ };
+
+ struct Uc16Range {
+ uc16 min; // Inclusive.
+ uc16 max; // Inclusive.
+ };
+
+ static RegExpInstruction ConsumeRange(Uc16Range consume_range) {
+ RegExpInstruction result;
+ result.opcode = CONSUME_RANGE;
+ result.payload.consume_range = consume_range;
+ return result;
+ }
+
+ static RegExpInstruction ConsumeAnyChar() {
+ return ConsumeRange(Uc16Range{0x0000, 0xFFFF});
+ }
+
+ static RegExpInstruction Fail() {
+ // This is encoded as the empty CONSUME_RANGE of characters 0xFFFF <= c <=
+ // 0x0000.
+ return ConsumeRange(Uc16Range{0xFFFF, 0x0000});
+ }
+
+ static RegExpInstruction Fork(int32_t alt_index) {
+ RegExpInstruction result;
+ result.opcode = FORK;
+ result.payload.pc = alt_index;
+ return result;
+ }
+
+ static RegExpInstruction Jmp(int32_t alt_index) {
+ RegExpInstruction result;
+ result.opcode = JMP;
+ result.payload.pc = alt_index;
+ return result;
+ }
+
+ static RegExpInstruction Accept() {
+ RegExpInstruction result;
+ result.opcode = ACCEPT;
+ return result;
+ }
+
+ static RegExpInstruction SetRegisterToCp(int32_t register_index) {
+ RegExpInstruction result;
+ result.opcode = SET_REGISTER_TO_CP;
+ result.payload.register_index = register_index;
+ return result;
+ }
+
+ static RegExpInstruction ClearRegister(int32_t register_index) {
+ RegExpInstruction result;
+ result.opcode = CLEAR_REGISTER;
+ result.payload.register_index = register_index;
+ return result;
+ }
+
+ static RegExpInstruction Assertion(RegExpAssertion::AssertionType t) {
+ RegExpInstruction result;
+ result.opcode = ASSERTION;
+ result.payload.assertion_type = t;
+ return result;
+ }
+
+ Opcode opcode;
+ union {
+ // Payload of CONSUME_RANGE:
+ Uc16Range consume_range;
+ // Payload of FORK and JMP, the next/forked program counter (pc):
+ int32_t pc;
+ // Payload of SET_REGISTER_TO_CP and CLEAR_REGISTER:
+ int32_t register_index;
+ // Payload of ASSERTION:
+ RegExpAssertion::AssertionType assertion_type;
+ } payload;
+ STATIC_ASSERT(sizeof(payload) == 4);
+};
+STATIC_ASSERT(sizeof(RegExpInstruction) == 8);
+// TODO(mbid,v8:10765): This is rather wasteful. We can fit the opcode in 2-3
+// bits, so the remaining 29/30 bits can be used as payload. Problem: The
+// payload of CONSUME_RANGE consists of two 16-bit values `min` and `max`, so
+// this wouldn't fit. We could encode the payload of a CONSUME_RANGE
+// instruction by the start of the interval and its length instead, and then
+// only allows lengths that fit into 14/13 bits. A longer range can then be
+// encoded as a disjunction of smaller ranges.
+//
+// Another thought: CONSUME_RANGEs are only valid if the payloads are such that
+// min <= max. Thus there are
+//
+// 2^16 + 2^16 - 1 + ... + 1
+// = 2^16 * (2^16 + 1) / 2
+// = 2^31 + 2^15
+//
+// valid payloads for a CONSUME_RANGE instruction. If we want to fit
+// instructions into 4 bytes, we would still have almost 2^31 instructions left
+// over if we encode everything as tight as possible. For example, we could
+// use another 2^29 values for JMP, another 2^29 for FORK, 1 value for ACCEPT,
+// and then still have almost 2^30 instructions left over for something like
+// zero-width assertions and captures.
+
+std::ostream& operator<<(std::ostream& os, const RegExpInstruction& inst);
+std::ostream& operator<<(std::ostream& os,
+ Vector<const RegExpInstruction> insts);
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_BYTECODE_H_
diff --git a/deps/v8/src/regexp/experimental/experimental-compiler.cc b/deps/v8/src/regexp/experimental/experimental-compiler.cc
new file mode 100644
index 0000000000..615f7566f4
--- /dev/null
+++ b/deps/v8/src/regexp/experimental/experimental-compiler.cc
@@ -0,0 +1,616 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/regexp/experimental/experimental-compiler.h"
+
+#include "src/regexp/experimental/experimental.h"
+#include "src/zone/zone-list-inl.h"
+
+namespace v8 {
+namespace internal {
+
+namespace {
+
+// TODO(mbid, v8:10765): Currently the experimental engine doesn't support
+// UTF-16, but this shouldn't be too hard to implement.
+constexpr uc32 kMaxSupportedCodepoint = 0xFFFFu;
+
+class CanBeHandledVisitor final : private RegExpVisitor {
+ // Visitor to implement `ExperimentalRegExp::CanBeHandled`.
+ public:
+ static bool Check(RegExpTree* tree, JSRegExp::Flags flags,
+ int capture_count) {
+ if (!AreSuitableFlags(flags)) return false;
+ CanBeHandledVisitor visitor;
+ tree->Accept(&visitor, nullptr);
+ return visitor.result_;
+ }
+
+ private:
+ CanBeHandledVisitor() = default;
+
+ static bool AreSuitableFlags(JSRegExp::Flags flags) {
+ // TODO(mbid, v8:10765): We should be able to support all flags in the
+ // future.
+ static constexpr JSRegExp::Flags kAllowedFlags =
+ JSRegExp::kGlobal | JSRegExp::kSticky | JSRegExp::kMultiline |
+ JSRegExp::kDotAll;
+ // We support Unicode iff kUnicode is among the supported flags.
+ STATIC_ASSERT(ExperimentalRegExp::kSupportsUnicode ==
+ ((kAllowedFlags & JSRegExp::kUnicode) != 0));
+ return (flags & ~kAllowedFlags) == 0;
+ }
+
+ void* VisitDisjunction(RegExpDisjunction* node, void*) override {
+ for (RegExpTree* alt : *node->alternatives()) {
+ alt->Accept(this, nullptr);
+ if (!result_) {
+ return nullptr;
+ }
+ }
+ return nullptr;
+ }
+
+ void* VisitAlternative(RegExpAlternative* node, void*) override {
+ for (RegExpTree* child : *node->nodes()) {
+ child->Accept(this, nullptr);
+ if (!result_) {
+ return nullptr;
+ }
+ }
+ return nullptr;
+ }
+
+ void* VisitCharacterClass(RegExpCharacterClass* node, void*) override {
+ result_ = result_ && AreSuitableFlags(node->flags());
+ return nullptr;
+ }
+
+ void* VisitAssertion(RegExpAssertion* node, void*) override {
+ result_ = result_ && AreSuitableFlags(node->flags());
+ return nullptr;
+ }
+
+ void* VisitAtom(RegExpAtom* node, void*) override {
+ result_ = result_ && AreSuitableFlags(node->flags());
+ return nullptr;
+ }
+
+ void* VisitText(RegExpText* node, void*) override {
+ for (TextElement& el : *node->elements()) {
+ el.tree()->Accept(this, nullptr);
+ if (!result_) {
+ return nullptr;
+ }
+ }
+ return nullptr;
+ }
+
+ void* VisitQuantifier(RegExpQuantifier* node, void*) override {
+ // Finite but large values of `min()` and `max()` are bad for the
+ // breadth-first engine because finite (optional) repetition is dealt with
+ // by replicating the bytecode of the body of the quantifier. The number
+ // of replicatons grows exponentially in how deeply quantifiers are nested.
+ // `replication_factor_` keeps track of how often the current node will
+ // have to be replicated in the generated bytecode, and we don't allow this
+ // to exceed some small value.
+ static constexpr int kMaxReplicationFactor = 16;
+
+ // First we rule out values for min and max that are too big even before
+ // taking into account the ambient replication_factor_. This also guards
+ // against overflows in `local_replication` or `replication_factor_`.
+ if (node->min() > kMaxReplicationFactor ||
+ (node->max() != RegExpTree::kInfinity &&
+ node->max() > kMaxReplicationFactor)) {
+ result_ = false;
+ return nullptr;
+ }
+
+ // Save the current replication factor so that it can be restored if we
+ // return with `result_ == true`.
+ int before_replication_factor = replication_factor_;
+
+ int local_replication;
+ if (node->max() == RegExpTree::kInfinity) {
+ local_replication = node->min() + 1;
+ } else {
+ local_replication = node->max();
+ }
+
+ replication_factor_ *= local_replication;
+ if (replication_factor_ > kMaxReplicationFactor) {
+ result_ = false;
+ return nullptr;
+ }
+
+ switch (node->quantifier_type()) {
+ case RegExpQuantifier::GREEDY:
+ case RegExpQuantifier::NON_GREEDY:
+ break;
+ case RegExpQuantifier::POSSESSIVE:
+ // TODO(mbid, v8:10765): It's not clear to me whether this can be
+ // supported in breadth-first mode. Re2 doesn't support it.
+ result_ = false;
+ return nullptr;
+ }
+
+ node->body()->Accept(this, nullptr);
+ replication_factor_ = before_replication_factor;
+ return nullptr;
+ }
+
+ void* VisitCapture(RegExpCapture* node, void*) override {
+ node->body()->Accept(this, nullptr);
+ return nullptr;
+ }
+
+ void* VisitGroup(RegExpGroup* node, void*) override {
+ node->body()->Accept(this, nullptr);
+ return nullptr;
+ }
+
+ void* VisitLookaround(RegExpLookaround* node, void*) override {
+ // TODO(mbid, v8:10765): This will be hard to support, but not impossible I
+ // think. See product automata.
+ result_ = false;
+ return nullptr;
+ }
+
+ void* VisitBackReference(RegExpBackReference* node, void*) override {
+ // This can't be implemented without backtracking.
+ result_ = false;
+ return nullptr;
+ }
+
+ void* VisitEmpty(RegExpEmpty* node, void*) override { return nullptr; }
+
+ private:
+ // See comment in `VisitQuantifier`:
+ int replication_factor_ = 1;
+
+ bool result_ = true;
+};
+
+} // namespace
+
+bool ExperimentalRegExpCompiler::CanBeHandled(RegExpTree* tree,
+ JSRegExp::Flags flags,
+ int capture_count) {
+ DCHECK(FLAG_enable_experimental_regexp_engine);
+ return CanBeHandledVisitor::Check(tree, flags, capture_count);
+}
+
+namespace {
+
+// A label in bytecode with known address.
+class Label {
+ public:
+ explicit Label(int index) : index_(index) { DCHECK_GE(index_, 0); }
+
+ int index() { return index_; }
+
+ // Friend functions because `label.AddForkTo(code, zone)` reads like we're
+ // adding code to where `label` is defined, but we're adding a fork with
+ // target `label` at the end of `code`.
+ friend void AddForkTo(Label target, ZoneList<RegExpInstruction>& code,
+ Zone* zone) {
+ code.Add(RegExpInstruction::Fork(target.index_), zone);
+ }
+
+ friend void AddJmpTo(Label target, ZoneList<RegExpInstruction>& code,
+ Zone* zone) {
+ code.Add(RegExpInstruction::Jmp(target.index_), zone);
+ }
+
+ private:
+ int index_;
+};
+
+// A label in bytecode whose address is not known yet. The address *must* be
+// `Bind` before the deferred label object goes out of scope, and the deferred
+// label object *must not* be used after it was defined. (Use the `Label`
+// object returned by `Bind` instead.)
+struct DeferredLabel {
+ // Implemented as a linked list through the `payload.pc` of FORK and JMP
+ // instructions.
+ public:
+ DeferredLabel() = default;
+ ~DeferredLabel() { DCHECK_EQ(patch_list_begin_, kLabelWasDefined); }
+
+ friend void AddForkTo(DeferredLabel& target,
+ ZoneList<RegExpInstruction>& code, Zone* zone) {
+ DCHECK_NE(target.patch_list_begin_, DeferredLabel::kLabelWasDefined);
+ int new_list_begin = code.length();
+ DCHECK_GE(new_list_begin, 0);
+ code.Add(RegExpInstruction::Fork(target.patch_list_begin_), zone);
+ target.patch_list_begin_ = new_list_begin;
+ }
+
+ friend void AddJmpTo(DeferredLabel& target, ZoneList<RegExpInstruction>& code,
+ Zone* zone) {
+ DCHECK_NE(target.patch_list_begin_, DeferredLabel::kLabelWasDefined);
+ int new_list_begin = code.length();
+ DCHECK_GE(new_list_begin, 0);
+ code.Add(RegExpInstruction::Jmp(target.patch_list_begin_), zone);
+ target.patch_list_begin_ = new_list_begin;
+ }
+
+ // Define the deferred label as referring to the next instruction that will
+ // be pushed to `code`. Consumes the DeferredLabel object and returns a
+ // Label object.
+ Label Bind(ZoneList<RegExpInstruction>& code) && {
+ DCHECK_NE(patch_list_begin_, kLabelWasDefined);
+
+ int index = code.length();
+
+ while (patch_list_begin_ != kEmptyList) {
+ RegExpInstruction& inst = code[patch_list_begin_];
+ DCHECK(inst.opcode == RegExpInstruction::FORK ||
+ inst.opcode == RegExpInstruction::JMP);
+
+ patch_list_begin_ = inst.payload.pc;
+ inst.payload.pc = index;
+ }
+
+ patch_list_begin_ = kLabelWasDefined;
+ return Label(index);
+ }
+
+ private:
+ static constexpr int kEmptyList = -1;
+ static constexpr int kLabelWasDefined = -2;
+ int patch_list_begin_ = kEmptyList;
+
+ // Don't copy, don't move. Moving could be implemented, but it's not
+ // needed anywhere.
+ DISALLOW_COPY_AND_ASSIGN(DeferredLabel);
+};
+
+class CompileVisitor : private RegExpVisitor {
+ public:
+ static ZoneList<RegExpInstruction> Compile(RegExpTree* tree,
+ JSRegExp::Flags flags,
+ Zone* zone) {
+ CompileVisitor compiler(zone);
+
+ if ((flags & JSRegExp::kSticky) == 0 && !tree->IsAnchoredAtStart()) {
+ // The match is not anchored, i.e. may start at any input position, so we
+ // emit a preamble corresponding to /.*?/. This skips an arbitrary
+ // prefix in the input non-greedily.
+ compiler.CompileNonGreedyStar([&]() {
+ compiler.code_.Add(RegExpInstruction::ConsumeAnyChar(), zone);
+ });
+ }
+
+ compiler.code_.Add(RegExpInstruction::SetRegisterToCp(0), zone);
+ tree->Accept(&compiler, nullptr);
+ compiler.code_.Add(RegExpInstruction::SetRegisterToCp(1), zone);
+ compiler.code_.Add(RegExpInstruction::Accept(), zone);
+
+ return std::move(compiler.code_);
+ }
+
+ private:
+ // TODO(mbid,v8:10765): Use some upper bound for code_ capacity computed from
+ // the `tree` size we're going to compile?
+ explicit CompileVisitor(Zone* zone) : zone_(zone), code_(0, zone) {}
+
+ // Generate a disjunction of code fragments compiled by a function `alt_gen`.
+ // `alt_gen` is called repeatedly with argument `int i = 0, 1, ..., alt_num -
+ // 1` and should push code corresponding to the ith alternative onto `code_`.
+ template <class F>
+ void CompileDisjunction(int alt_num, F&& gen_alt) {
+ // An alternative a1 | ... | an is compiled into
+ //
+ // FORK tail1
+ // <a1>
+ // JMP end
+ // tail1:
+ // FORK tail2
+ // <a2>
+ // JMP end
+ // tail2:
+ // ...
+ // ...
+ // tail{n -1}:
+ // <an>
+ // end:
+ //
+ // By the semantics of the FORK instruction (see above at definition and
+ // semantics), a forked thread has lower priority than the thread that
+ // spawned it. This means that with the code we're generating here, the
+ // thread matching the alternative a1 has indeed highest priority, followed
+ // by the thread for a2 and so on.
+
+ if (alt_num == 0) {
+ // The empty disjunction. This can never match.
+ code_.Add(RegExpInstruction::Fail(), zone_);
+ return;
+ }
+
+ DeferredLabel end;
+
+ for (int i = 0; i != alt_num - 1; ++i) {
+ DeferredLabel tail;
+ AddForkTo(tail, code_, zone_);
+ gen_alt(i);
+ AddJmpTo(end, code_, zone_);
+ std::move(tail).Bind(code_);
+ }
+
+ gen_alt(alt_num - 1);
+
+ std::move(end).Bind(code_);
+ }
+
+ void* VisitDisjunction(RegExpDisjunction* node, void*) override {
+ ZoneList<RegExpTree*>& alts = *node->alternatives();
+ CompileDisjunction(alts.length(),
+ [&](int i) { alts[i]->Accept(this, nullptr); });
+ return nullptr;
+ }
+
+ void* VisitAlternative(RegExpAlternative* node, void*) override {
+ for (RegExpTree* child : *node->nodes()) {
+ child->Accept(this, nullptr);
+ }
+ return nullptr;
+ }
+
+ void* VisitAssertion(RegExpAssertion* node, void*) override {
+ code_.Add(RegExpInstruction::Assertion(node->assertion_type()), zone_);
+ return nullptr;
+ }
+
+ void* VisitCharacterClass(RegExpCharacterClass* node, void*) override {
+ // A character class is compiled as Disjunction over its `CharacterRange`s.
+ ZoneList<CharacterRange>* ranges = node->ranges(zone_);
+ CharacterRange::Canonicalize(ranges);
+ if (node->is_negated()) {
+ // The complement of a disjoint, non-adjacent (i.e. `Canonicalize`d)
+ // union of k intervals is a union of at most k + 1 intervals.
+ ZoneList<CharacterRange>* negated =
+ zone_->New<ZoneList<CharacterRange>>(ranges->length() + 1, zone_);
+ CharacterRange::Negate(ranges, negated, zone_);
+ DCHECK_LE(negated->length(), ranges->length() + 1);
+ ranges = negated;
+ }
+
+ CompileDisjunction(ranges->length(), [&](int i) {
+ // We don't support utf16 for now, so only ranges that can be specified
+ // by (complements of) ranges with uc16 bounds.
+ STATIC_ASSERT(kMaxSupportedCodepoint <= std::numeric_limits<uc16>::max());
+
+ uc32 from = (*ranges)[i].from();
+ DCHECK_LE(from, kMaxSupportedCodepoint);
+ uc16 from_uc16 = static_cast<uc16>(from);
+
+ uc32 to = (*ranges)[i].to();
+ DCHECK_IMPLIES(to > kMaxSupportedCodepoint, to == String::kMaxCodePoint);
+ uc16 to_uc16 = static_cast<uc16>(std::min(to, kMaxSupportedCodepoint));
+
+ RegExpInstruction::Uc16Range range{from_uc16, to_uc16};
+ code_.Add(RegExpInstruction::ConsumeRange(range), zone_);
+ });
+ return nullptr;
+ }
+
+ void* VisitAtom(RegExpAtom* node, void*) override {
+ for (uc16 c : node->data()) {
+ code_.Add(
+ RegExpInstruction::ConsumeRange(RegExpInstruction::Uc16Range{c, c}),
+ zone_);
+ }
+ return nullptr;
+ }
+
+ void ClearRegisters(Interval indices) {
+ if (indices.is_empty()) return;
+ DCHECK_EQ(indices.from() % 2, 0);
+ DCHECK_EQ(indices.to() % 2, 1);
+ for (int i = indices.from(); i <= indices.to(); i += 2) {
+ // It suffices to clear the register containing the `begin` of a capture
+ // because this indicates that the capture is undefined, regardless of
+ // the value in the `end` register.
+ code_.Add(RegExpInstruction::ClearRegister(i), zone_);
+ }
+ }
+
+ // Emit bytecode corresponding to /<emit_body>*/.
+ template <class F>
+ void CompileGreedyStar(F&& emit_body) {
+ // This is compiled into
+ //
+ // begin:
+ // FORK end
+ // <body>
+ // JMP begin
+ // end:
+ // ...
+ //
+ // This is greedy because a forked thread has lower priority than the
+ // thread that spawned it.
+ Label begin(code_.length());
+ DeferredLabel end;
+
+ AddForkTo(end, code_, zone_);
+ emit_body();
+ AddJmpTo(begin, code_, zone_);
+
+ std::move(end).Bind(code_);
+ }
+
+ // Emit bytecode corresponding to /<emit_body>*?/.
+ template <class F>
+ void CompileNonGreedyStar(F&& emit_body) {
+ // This is compiled into
+ //
+ // FORK body
+ // JMP end
+ // body:
+ // <body>
+ // FORK body
+ // end:
+ // ...
+
+ Label body(code_.length() + 2);
+ DeferredLabel end;
+
+ AddForkTo(body, code_, zone_);
+ AddJmpTo(end, code_, zone_);
+
+ DCHECK_EQ(body.index(), code_.length());
+
+ emit_body();
+ AddForkTo(body, code_, zone_);
+
+ std::move(end).Bind(code_);
+ }
+
+ // Emit bytecode corresponding to /<emit_body>{0, max_repetition_num}/.
+ template <class F>
+ void CompileGreedyRepetition(F&& emit_body, int max_repetition_num) {
+ // This is compiled into
+ //
+ // FORK end
+ // <body>
+ // FORK end
+ // <body>
+ // ...
+ // ...
+ // FORK end
+ // <body>
+ // end:
+ // ...
+
+ DeferredLabel end;
+ for (int i = 0; i != max_repetition_num; ++i) {
+ AddForkTo(end, code_, zone_);
+ emit_body();
+ }
+ std::move(end).Bind(code_);
+ }
+
+ // Emit bytecode corresponding to /<emit_body>{0, max_repetition_num}?/.
+ template <class F>
+ void CompileNonGreedyRepetition(F&& emit_body, int max_repetition_num) {
+ // This is compiled into
+ //
+ // FORK body0
+ // JMP end
+ // body0:
+ // <body>
+ // FORK body1
+ // JMP end
+ // body1:
+ // <body>
+ // ...
+ // ...
+ // body{max_repetition_num - 1}:
+ // <body>
+ // end:
+ // ...
+
+ DeferredLabel end;
+ for (int i = 0; i != max_repetition_num; ++i) {
+ Label body(code_.length() + 2);
+ AddForkTo(body, code_, zone_);
+ AddJmpTo(end, code_, zone_);
+
+ DCHECK_EQ(body.index(), code_.length());
+
+ emit_body();
+ }
+ std::move(end).Bind(code_);
+ }
+
+ void* VisitQuantifier(RegExpQuantifier* node, void*) override {
+ // Emit the body, but clear registers occuring in body first.
+ //
+ // TODO(mbid,v8:10765): It's not always necessary to a) capture registers
+ // and b) clear them. For example, we don't have to capture anything for
+ // the first 4 repetitions if node->min() >= 5, and then we don't have to
+ // clear registers in the first node->min() repetitions.
+ // Later, and if node->min() == 0, we don't have to clear registers before
+ // the first optional repetition.
+ Interval body_registers = node->body()->CaptureRegisters();
+ auto emit_body = [&]() {
+ ClearRegisters(body_registers);
+ node->body()->Accept(this, nullptr);
+ };
+
+ // First repeat the body `min()` times.
+ for (int i = 0; i != node->min(); ++i) emit_body();
+
+ switch (node->quantifier_type()) {
+ case RegExpQuantifier::POSSESSIVE:
+ UNREACHABLE();
+ case RegExpQuantifier::GREEDY: {
+ if (node->max() == RegExpTree::kInfinity) {
+ CompileGreedyStar(emit_body);
+ } else {
+ DCHECK_NE(node->max(), RegExpTree::kInfinity);
+ CompileGreedyRepetition(emit_body, node->max() - node->min());
+ }
+ break;
+ }
+ case RegExpQuantifier::NON_GREEDY: {
+ if (node->max() == RegExpTree::kInfinity) {
+ CompileNonGreedyStar(emit_body);
+ } else {
+ DCHECK_NE(node->max(), RegExpTree::kInfinity);
+ CompileNonGreedyRepetition(emit_body, node->max() - node->min());
+ }
+ }
+ }
+ return nullptr;
+ }
+
+ void* VisitCapture(RegExpCapture* node, void*) override {
+ int index = node->index();
+ int start_register = RegExpCapture::StartRegister(index);
+ int end_register = RegExpCapture::EndRegister(index);
+ code_.Add(RegExpInstruction::SetRegisterToCp(start_register), zone_);
+ node->body()->Accept(this, nullptr);
+ code_.Add(RegExpInstruction::SetRegisterToCp(end_register), zone_);
+ return nullptr;
+ }
+
+ void* VisitGroup(RegExpGroup* node, void*) override {
+ node->body()->Accept(this, nullptr);
+ return nullptr;
+ }
+
+ void* VisitLookaround(RegExpLookaround* node, void*) override {
+ // TODO(mbid,v8:10765): Support this case.
+ UNREACHABLE();
+ }
+
+ void* VisitBackReference(RegExpBackReference* node, void*) override {
+ UNREACHABLE();
+ }
+
+ void* VisitEmpty(RegExpEmpty* node, void*) override { return nullptr; }
+
+ void* VisitText(RegExpText* node, void*) override {
+ for (TextElement& text_el : *node->elements()) {
+ text_el.tree()->Accept(this, nullptr);
+ }
+ return nullptr;
+ }
+
+ private:
+ Zone* zone_;
+ ZoneList<RegExpInstruction> code_;
+};
+
+} // namespace
+
+ZoneList<RegExpInstruction> ExperimentalRegExpCompiler::Compile(
+ RegExpTree* tree, JSRegExp::Flags flags, Zone* zone) {
+ return CompileVisitor::Compile(tree, flags, zone);
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/regexp/experimental/experimental-compiler.h b/deps/v8/src/regexp/experimental/experimental-compiler.h
new file mode 100644
index 0000000000..87abcd3917
--- /dev/null
+++ b/deps/v8/src/regexp/experimental/experimental-compiler.h
@@ -0,0 +1,34 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_COMPILER_H_
+#define V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_COMPILER_H_
+
+#include "src/regexp/experimental/experimental-bytecode.h"
+#include "src/regexp/regexp-ast.h"
+#include "src/zone/zone-list.h"
+
+namespace v8 {
+namespace internal {
+
+class ExperimentalRegExpCompiler final : public AllStatic {
+ public:
+ // Checks whether a given RegExpTree can be compiled into an experimental
+ // bytecode program. This mostly amounts to the absence of back references,
+ // but see the definition.
+ // TODO(mbid,v8:10765): Currently more things are not handled, e.g. some
+ // quantifiers and unicode.
+ static bool CanBeHandled(RegExpTree* tree, JSRegExp::Flags flags,
+ int capture_count);
+ // Compile regexp into a bytecode program. The regexp must be handlable by
+ // the experimental engine; see`CanBeHandled`. The program is returned as a
+ // ZoneList backed by the same Zone that is used in the RegExpTree argument.
+ static ZoneList<RegExpInstruction> Compile(RegExpTree* tree,
+ JSRegExp::Flags flags, Zone* zone);
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_COMPILER_H_
diff --git a/deps/v8/src/regexp/experimental/experimental-interpreter.cc b/deps/v8/src/regexp/experimental/experimental-interpreter.cc
new file mode 100644
index 0000000000..8db93ca746
--- /dev/null
+++ b/deps/v8/src/regexp/experimental/experimental-interpreter.cc
@@ -0,0 +1,454 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/regexp/experimental/experimental-interpreter.h"
+
+#include "src/base/optional.h"
+#include "src/regexp/experimental/experimental.h"
+#include "src/strings/char-predicates-inl.h"
+#include "src/zone/zone-allocator.h"
+#include "src/zone/zone-list-inl.h"
+
+namespace v8 {
+namespace internal {
+
+namespace {
+
+constexpr int kUndefinedRegisterValue = -1;
+
+template <class Character>
+bool SatisfiesAssertion(RegExpAssertion::AssertionType type,
+ Vector<const Character> context, int position) {
+ DCHECK_LE(position, context.length());
+ DCHECK_GE(position, 0);
+
+ switch (type) {
+ case RegExpAssertion::START_OF_INPUT:
+ return position == 0;
+ case RegExpAssertion::END_OF_INPUT:
+ return position == context.length();
+ case RegExpAssertion::START_OF_LINE:
+ if (position == 0) return true;
+ return unibrow::IsLineTerminator(context[position - 1]);
+ case RegExpAssertion::END_OF_LINE:
+ if (position == context.length()) return true;
+ return unibrow::IsLineTerminator(context[position]);
+ case RegExpAssertion::BOUNDARY:
+ if (context.length() == 0) {
+ return false;
+ } else if (position == 0) {
+ return IsRegExpWord(context[position]);
+ } else if (position == context.length()) {
+ return IsRegExpWord(context[position - 1]);
+ } else {
+ return IsRegExpWord(context[position - 1]) !=
+ IsRegExpWord(context[position]);
+ }
+ case RegExpAssertion::NON_BOUNDARY:
+ return !SatisfiesAssertion(RegExpAssertion::BOUNDARY, context, position);
+ }
+}
+
+template <class Character>
+class NfaInterpreter {
+ // Executes a bytecode program in breadth-first mode, without backtracking.
+ // `Character` can be instantiated with `uint8_t` or `uc16` for one byte or
+ // two byte input strings.
+ //
+ // In contrast to the backtracking implementation, this has linear time
+ // complexity in the length of the input string. Breadth-first mode means
+ // that threads are executed in lockstep with respect to their input
+ // position, i.e. the threads share a common input index. This is similar
+ // to breadth-first simulation of a non-deterministic finite automaton (nfa),
+ // hence the name of the class.
+ //
+ // To follow the semantics of a backtracking VM implementation, we have to be
+ // careful about whether we stop execution when a thread executes ACCEPT.
+ // For example, consider execution of the bytecode generated by the regexp
+ //
+ // r = /abc|..|[a-c]{10,}/
+ //
+ // on input "abcccccccccccccc". Clearly the three alternatives
+ // - /abc/
+ // - /../
+ // - /[a-c]{10,}/
+ // all match this input. A backtracking implementation will report "abc" as
+ // match, because it explores the first alternative before the others.
+ //
+ // However, if we execute breadth first, then we execute the 3 threads
+ // - t1, which tries to match /abc/
+ // - t2, which tries to match /../
+ // - t3, which tries to match /[a-c]{10,}/
+ // in lockstep i.e. by iterating over the input and feeding all threads one
+ // character at a time. t2 will execute an ACCEPT after two characters,
+ // while t1 will only execute ACCEPT after three characters. Thus we find a
+ // match for the second alternative before a match of the first alternative.
+ //
+ // This shows that we cannot always stop searching as soon as some thread t
+ // executes ACCEPT: If there is a thread u with higher priority than t, then
+ // it must be finished first. If u produces a match, then we can discard the
+ // match of t because matches produced by threads with higher priority are
+ // preferred over matches of threads with lower priority. On the other hand,
+ // we are allowed to abort all threads with lower priority than t if t
+ // produces a match: Such threads can only produce worse matches. In the
+ // example above, we can abort t3 after two characters because of t2's match.
+ //
+ // Thus the interpreter keeps track of a priority-ordered list of threads.
+ // If a thread ACCEPTs, all threads with lower priority are discarded, and
+ // the search continues with the threads with higher priority. If no threads
+ // with high priority are left, we return the match that was produced by the
+ // ACCEPTing thread with highest priority.
+ public:
+ NfaInterpreter(Vector<const RegExpInstruction> bytecode,
+ int register_count_per_match, Vector<const Character> input,
+ int32_t input_index, Zone* zone)
+ : bytecode_(bytecode),
+ register_count_per_match_(register_count_per_match),
+ input_(input),
+ input_index_(input_index),
+ pc_last_input_index_(zone->NewArray<int>(bytecode.length()),
+ bytecode.length()),
+ active_threads_(0, zone),
+ blocked_threads_(0, zone),
+ register_array_allocator_(zone),
+ best_match_registers_(base::nullopt),
+ zone_(zone) {
+ DCHECK(!bytecode_.empty());
+ DCHECK_GE(input_index_, 0);
+ DCHECK_LE(input_index_, input_.length());
+
+ std::fill(pc_last_input_index_.begin(), pc_last_input_index_.end(), -1);
+ }
+
+ // Finds matches and writes their concatenated capture registers to
+ // `output_registers`. `output_registers[i]` has to be valid for all i <
+ // output_register_count. The search continues until all remaining matches
+ // have been found or there is no space left in `output_registers`. Returns
+ // the number of matches found.
+ int FindMatches(int32_t* output_registers, int output_register_count) {
+ const int max_match_num = output_register_count / register_count_per_match_;
+
+ int match_num = 0;
+ while (match_num != max_match_num) {
+ FindNextMatch();
+ if (!FoundMatch()) break;
+ Vector<int> registers = *best_match_registers_;
+
+ output_registers =
+ std::copy(registers.begin(), registers.end(), output_registers);
+ ++match_num;
+
+ const int match_begin = registers[0];
+ const int match_end = registers[1];
+ DCHECK_LE(match_begin, match_end);
+ const int match_length = match_end - match_begin;
+ if (match_length != 0) {
+ SetInputIndex(match_end);
+ } else if (match_end == input_.length()) {
+ // Zero-length match, input exhausted.
+ SetInputIndex(match_end);
+ break;
+ } else {
+ // Zero-length match, more input. We don't want to report more matches
+ // here endlessly, so we advance by 1.
+ SetInputIndex(match_end + 1);
+
+ // TODO(mbid,v8:10765): If we're in unicode mode, we have to advance to
+ // the next codepoint, not to the next code unit. See also
+ // `RegExpUtils::AdvanceStringIndex`.
+ STATIC_ASSERT(!ExperimentalRegExp::kSupportsUnicode);
+ }
+ }
+
+ return match_num;
+ }
+
+ private:
+ // The state of a "thread" executing experimental regexp bytecode. (Not to
+ // be confused with an OS thread.)
+ struct InterpreterThread {
+ // This thread's program counter, i.e. the index within `bytecode_` of the
+ // next instruction to be executed.
+ int pc;
+ // Pointer to the array of registers, which is always size
+ // `register_count_per_match_`. Should be deallocated with
+ // `register_array_allocator_`.
+ int* register_array_begin;
+ };
+
+ // Change the current input index for future calls to `FindNextMatch`.
+ void SetInputIndex(int new_input_index) {
+ DCHECK_GE(input_index_, 0);
+ DCHECK_LE(input_index_, input_.length());
+
+ input_index_ = new_input_index;
+ }
+
+ // Find the next match and return the corresponding capture registers and
+ // write its capture registers to `best_match_registers_`. The search starts
+ // at the current `input_index_`.
+ void FindNextMatch() {
+ DCHECK(active_threads_.is_empty());
+ // TODO(mbid,v8:10765): Can we get around resetting `pc_last_input_index_`
+ // here? As long as
+ //
+ // pc_last_input_index_[pc] < input_index_
+ //
+ // for all possible program counters pc that are reachable without input
+ // from pc = 0 and
+ //
+ // pc_last_input_index_[k] <= input_index_
+ //
+ // for all k > 0 hold I think everything should be fine. Maybe we can do
+ // something about this in `SetInputIndex`.
+ std::fill(pc_last_input_index_.begin(), pc_last_input_index_.end(), -1);
+
+ // Clean up left-over data from a previous call to FindNextMatch.
+ for (InterpreterThread t : blocked_threads_) {
+ DestroyThread(t);
+ }
+ blocked_threads_.DropAndClear();
+
+ for (InterpreterThread t : active_threads_) {
+ DestroyThread(t);
+ }
+ active_threads_.DropAndClear();
+
+ if (best_match_registers_.has_value()) {
+ FreeRegisterArray(best_match_registers_->begin());
+ best_match_registers_ = base::nullopt;
+ }
+
+ // All threads start at bytecode 0.
+ active_threads_.Add(
+ InterpreterThread{0, NewRegisterArray(kUndefinedRegisterValue)}, zone_);
+ // Run the initial thread, potentially forking new threads, until every
+ // thread is blocked without further input.
+ RunActiveThreads();
+
+ // We stop if one of the following conditions hold:
+ // - We have exhausted the entire input.
+ // - We have found a match at some point, and there are no remaining
+ // threads with higher priority than the thread that produced the match.
+ // Threads with low priority have been aborted earlier, and the remaining
+ // threads are blocked here, so the latter simply means that
+ // `blocked_threads_` is empty.
+ while (input_index_ != input_.length() &&
+ !(FoundMatch() && blocked_threads_.is_empty())) {
+ DCHECK(active_threads_.is_empty());
+ uc16 input_char = input_[input_index_];
+ ++input_index_;
+
+ // We unblock all blocked_threads_ by feeding them the input char.
+ FlushBlockedThreads(input_char);
+
+ // Run all threads until they block or accept.
+ RunActiveThreads();
+ }
+ }
+
+ // Run an active thread `t` until it executes a CONSUME_RANGE or ACCEPT
+ // instruction, or its PC value was already processed.
+ // - If processing of `t` can't continue because of CONSUME_RANGE, it is
+ // pushed on `blocked_threads_`.
+ // - If `t` executes ACCEPT, set `best_match` according to `t.match_begin` and
+ // the current input index. All remaining `active_threads_` are discarded.
+ void RunActiveThread(InterpreterThread t) {
+ while (true) {
+ if (IsPcProcessed(t.pc)) return;
+ MarkPcProcessed(t.pc);
+
+ RegExpInstruction inst = bytecode_[t.pc];
+ switch (inst.opcode) {
+ case RegExpInstruction::CONSUME_RANGE: {
+ blocked_threads_.Add(t, zone_);
+ return;
+ }
+ case RegExpInstruction::ASSERTION:
+ if (!SatisfiesAssertion(inst.payload.assertion_type, input_,
+ input_index_)) {
+ DestroyThread(t);
+ return;
+ }
+ ++t.pc;
+ break;
+ case RegExpInstruction::FORK: {
+ InterpreterThread fork{inst.payload.pc,
+ NewRegisterArrayUninitialized()};
+ Vector<int> fork_registers = GetRegisterArray(fork);
+ Vector<int> t_registers = GetRegisterArray(t);
+ DCHECK_EQ(fork_registers.length(), t_registers.length());
+ std::copy(t_registers.begin(), t_registers.end(),
+ fork_registers.begin());
+ active_threads_.Add(fork, zone_);
+
+ ++t.pc;
+ break;
+ }
+ case RegExpInstruction::JMP:
+ t.pc = inst.payload.pc;
+ break;
+ case RegExpInstruction::ACCEPT:
+ if (best_match_registers_.has_value()) {
+ FreeRegisterArray(best_match_registers_->begin());
+ }
+ best_match_registers_ = GetRegisterArray(t);
+
+ for (InterpreterThread s : active_threads_) {
+ FreeRegisterArray(s.register_array_begin);
+ }
+ active_threads_.DropAndClear();
+ return;
+ case RegExpInstruction::SET_REGISTER_TO_CP:
+ GetRegisterArray(t)[inst.payload.register_index] = input_index_;
+ ++t.pc;
+ break;
+ case RegExpInstruction::CLEAR_REGISTER:
+ GetRegisterArray(t)[inst.payload.register_index] =
+ kUndefinedRegisterValue;
+ ++t.pc;
+ break;
+ }
+ }
+ }
+
+ // Run each active thread until it can't continue without further input.
+ // `active_threads_` is empty afterwards. `blocked_threads_` are sorted from
+ // low to high priority.
+ void RunActiveThreads() {
+ while (!active_threads_.is_empty()) {
+ RunActiveThread(active_threads_.RemoveLast());
+ }
+ }
+
+ // Unblock all blocked_threads_ by feeding them an `input_char`. Should only
+ // be called with `input_index_` pointing to the character *after*
+ // `input_char` so that `pc_last_input_index_` is updated correctly.
+ void FlushBlockedThreads(uc16 input_char) {
+ // The threads in blocked_threads_ are sorted from high to low priority,
+ // but active_threads_ needs to be sorted from low to high priority, so we
+ // need to activate blocked threads in reverse order.
+ for (int i = blocked_threads_.length() - 1; i >= 0; --i) {
+ InterpreterThread t = blocked_threads_[i];
+ RegExpInstruction inst = bytecode_[t.pc];
+ DCHECK_EQ(inst.opcode, RegExpInstruction::CONSUME_RANGE);
+ RegExpInstruction::Uc16Range range = inst.payload.consume_range;
+ if (input_char >= range.min && input_char <= range.max) {
+ ++t.pc;
+ active_threads_.Add(t, zone_);
+ } else {
+ DestroyThread(t);
+ }
+ }
+ blocked_threads_.DropAndClear();
+ }
+
+ bool FoundMatch() const { return best_match_registers_.has_value(); }
+
+ Vector<int> GetRegisterArray(InterpreterThread t) {
+ return Vector<int>(t.register_array_begin, register_count_per_match_);
+ }
+
+ int* NewRegisterArrayUninitialized() {
+ return register_array_allocator_.allocate(register_count_per_match_);
+ }
+
+ int* NewRegisterArray(int fill_value) {
+ int* array_begin = NewRegisterArrayUninitialized();
+ int* array_end = array_begin + register_count_per_match_;
+ std::fill(array_begin, array_end, fill_value);
+ return array_begin;
+ }
+
+ void FreeRegisterArray(int* register_array_begin) {
+ register_array_allocator_.deallocate(register_array_begin,
+ register_count_per_match_);
+ }
+
+ void DestroyThread(InterpreterThread t) {
+ FreeRegisterArray(t.register_array_begin);
+ }
+
+ // It is redundant to have two threads t, t0 execute at the same PC value,
+ // because one of t, t0 matches iff the other does. We can thus discard
+ // the one with lower priority. We check whether a thread executed at some
+ // PC value by recording for every possible value of PC what the value of
+ // input_index_ was the last time a thread executed at PC. If a thread
+ // tries to continue execution at a PC value that we have seen before at
+ // the current input index, we abort it. (We execute threads with higher
+ // priority first, so the second thread is guaranteed to have lower
+ // priority.)
+ //
+ // Check whether we've seen an active thread with a given pc value since the
+ // last increment of `input_index_`.
+ bool IsPcProcessed(int pc) {
+ DCHECK_LE(pc_last_input_index_[pc], input_index_);
+ return pc_last_input_index_[pc] == input_index_;
+ }
+
+ // Mark a pc as having been processed since the last increment of
+ // `input_index_`.
+ void MarkPcProcessed(int pc) {
+ DCHECK_LE(pc_last_input_index_[pc], input_index_);
+ pc_last_input_index_[pc] = input_index_;
+ }
+
+ const Vector<const RegExpInstruction> bytecode_;
+
+ // Number of registers used per thread.
+ const int register_count_per_match_;
+
+ const Vector<const Character> input_;
+ int input_index_;
+
+ // pc_last_input_index_[k] records the value of input_index_ the last
+ // time a thread t such that t.pc == k was activated, i.e. put on
+ // active_threads_. Thus pc_last_input_index.size() == bytecode.size(). See
+ // also `RunActiveThread`.
+ Vector<int> pc_last_input_index_;
+
+ // Active threads can potentially (but not necessarily) continue without
+ // input. Sorted from low to high priority.
+ ZoneList<InterpreterThread> active_threads_;
+
+ // The pc of a blocked thread points to an instruction that consumes a
+ // character. Sorted from high to low priority (so the opposite of
+ // `active_threads_`).
+ ZoneList<InterpreterThread> blocked_threads_;
+
+ // RecyclingZoneAllocator maintains a linked list through freed allocations
+ // for reuse if possible.
+ RecyclingZoneAllocator<int> register_array_allocator_;
+
+ // The register array of the best match found so far during the current
+ // search. If several threads ACCEPTed, then this will be the register array
+ // of the accepting thread with highest priority. Should be deallocated with
+ // `register_array_allocator_`.
+ base::Optional<Vector<int>> best_match_registers_;
+
+ Zone* zone_;
+};
+
+} // namespace
+
+int ExperimentalRegExpInterpreter::FindMatchesNfaOneByte(
+ Vector<const RegExpInstruction> bytecode, int register_count_per_match,
+ Vector<const uint8_t> input, int start_index, int32_t* output_registers,
+ int output_register_count, Zone* zone) {
+ NfaInterpreter<uint8_t> interpreter(bytecode, register_count_per_match, input,
+ start_index, zone);
+ return interpreter.FindMatches(output_registers, output_register_count);
+}
+
+int ExperimentalRegExpInterpreter::FindMatchesNfaTwoByte(
+ Vector<const RegExpInstruction> bytecode, int register_count_per_match,
+ Vector<const uc16> input, int start_index, int32_t* output_registers,
+ int output_register_count, Zone* zone) {
+ NfaInterpreter<uc16> interpreter(bytecode, register_count_per_match, input,
+ start_index, zone);
+ return interpreter.FindMatches(output_registers, output_register_count);
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/src/regexp/experimental/experimental-interpreter.h b/deps/v8/src/regexp/experimental/experimental-interpreter.h
new file mode 100644
index 0000000000..32bff001b1
--- /dev/null
+++ b/deps/v8/src/regexp/experimental/experimental-interpreter.h
@@ -0,0 +1,38 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_INTERPRETER_H_
+#define V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_INTERPRETER_H_
+
+#include "src/regexp/experimental/experimental-bytecode.h"
+#include "src/utils/vector.h"
+
+namespace v8 {
+namespace internal {
+
+class Zone;
+
+class ExperimentalRegExpInterpreter final : public AllStatic {
+ public:
+ // Executes a bytecode program in breadth-first NFA mode, without
+ // backtracking, to find matching substrings. Trys to find up to
+ // `max_match_num` matches in `input`, starting at `start_index`. Returns
+ // the actual number of matches found. The boundaires of matching subranges
+ // are written to `matches_out`. Provided in variants for one-byte and
+ // two-byte strings.
+ static int FindMatchesNfaOneByte(Vector<const RegExpInstruction> bytecode,
+ int capture_count,
+ Vector<const uint8_t> input, int start_index,
+ int32_t* output_registers,
+ int output_register_count, Zone* zone);
+ static int FindMatchesNfaTwoByte(Vector<const RegExpInstruction> bytecode,
+ int capture_count, Vector<const uc16> input,
+ int start_index, int32_t* output_registers,
+ int output_register_count, Zone* zone);
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_INTERPRETER_H_
diff --git a/deps/v8/src/regexp/experimental/experimental.cc b/deps/v8/src/regexp/experimental/experimental.cc
index 7bdb0d0349..dc919f56c2 100644
--- a/deps/v8/src/regexp/experimental/experimental.cc
+++ b/deps/v8/src/regexp/experimental/experimental.cc
@@ -4,123 +4,142 @@
#include "src/regexp/experimental/experimental.h"
-#include <vector>
-
#include "src/objects/js-regexp-inl.h"
+#include "src/regexp/experimental/experimental-compiler.h"
+#include "src/regexp/experimental/experimental-interpreter.h"
+#include "src/regexp/regexp-parser.h"
+#include "src/utils/ostreams.h"
namespace v8 {
namespace internal {
+bool ExperimentalRegExp::CanBeHandled(RegExpTree* tree, JSRegExp::Flags flags,
+ int capture_count) {
+ return ExperimentalRegExpCompiler::CanBeHandled(tree, flags, capture_count);
+}
+
void ExperimentalRegExp::Initialize(Isolate* isolate, Handle<JSRegExp> re,
Handle<String> source,
JSRegExp::Flags flags, int capture_count) {
+ DCHECK(FLAG_enable_experimental_regexp_engine);
if (FLAG_trace_experimental_regexp_engine) {
- std::cout << "Using experimental regexp engine for: " << *source
- << std::endl;
+ StdoutStream{} << "Initializing experimental regexp " << *source
+ << std::endl;
}
isolate->factory()->SetRegExpExperimentalData(re, source, flags,
capture_count);
}
-bool ExperimentalRegExp::IsCompiled(Handle<JSRegExp> re) {
- return re->DataAt(JSRegExp::kExperimentalPatternIndex).IsString();
+bool ExperimentalRegExp::IsCompiled(Handle<JSRegExp> re, Isolate* isolate) {
+ DCHECK(FLAG_enable_experimental_regexp_engine);
+
+ DCHECK_EQ(re->TypeTag(), JSRegExp::EXPERIMENTAL);
+#ifdef VERIFY_HEAP
+ re->JSRegExpVerify(isolate);
+#endif
+
+ return re->DataAt(JSRegExp::kIrregexpLatin1BytecodeIndex) !=
+ Smi::FromInt(JSRegExp::kUninitializedValue);
}
-void ExperimentalRegExp::Compile(Isolate* isolate, Handle<JSRegExp> re) {
+bool ExperimentalRegExp::Compile(Isolate* isolate, Handle<JSRegExp> re) {
DCHECK_EQ(re->TypeTag(), JSRegExp::EXPERIMENTAL);
- // TODO(mbid,v8:10765): Actually compile here.
- Handle<FixedArray> data =
- Handle<FixedArray>(FixedArray::cast(re->data()), isolate);
+#ifdef VERIFY_HEAP
+ re->JSRegExpVerify(isolate);
+#endif
+
+ Handle<String> source(re->Pattern(), isolate);
+ if (FLAG_trace_experimental_regexp_engine) {
+ StdoutStream{} << "Compiling experimental regexp " << *source << std::endl;
+ }
+
+ Zone zone(isolate->allocator(), ZONE_NAME);
+
+ // Parse and compile the regexp source.
+ RegExpCompileData parse_result;
+ JSRegExp::Flags flags = re->GetFlags();
+ FlatStringReader reader(isolate, source);
+ DCHECK(!isolate->has_pending_exception());
+
+ bool parse_success =
+ RegExpParser::ParseRegExp(isolate, &zone, &reader, flags, &parse_result);
+ if (!parse_success) {
+ // The pattern was already parsed successfully during initialization, so
+ // the only way parsing can fail now is because of stack overflow.
+ CHECK_EQ(parse_result.error, RegExpError::kStackOverflow);
+ USE(RegExp::ThrowRegExpException(isolate, re, source, parse_result.error));
+ return false;
+ }
+
+ ZoneList<RegExpInstruction> bytecode =
+ ExperimentalRegExpCompiler::Compile(parse_result.tree, flags, &zone);
+
+ int byte_length = sizeof(RegExpInstruction) * bytecode.length();
+ Handle<ByteArray> bytecode_byte_array =
+ isolate->factory()->NewByteArray(byte_length);
+ MemCopy(bytecode_byte_array->GetDataStartAddress(), bytecode.begin(),
+ byte_length);
+
+ re->SetDataAt(JSRegExp::kIrregexpLatin1BytecodeIndex, *bytecode_byte_array);
+ re->SetDataAt(JSRegExp::kIrregexpUC16BytecodeIndex, *bytecode_byte_array);
+
Handle<Code> trampoline = BUILTIN_CODE(isolate, RegExpExperimentalTrampoline);
+ re->SetDataAt(JSRegExp::kIrregexpLatin1CodeIndex, *trampoline);
+ re->SetDataAt(JSRegExp::kIrregexpUC16CodeIndex, *trampoline);
- data->set(JSRegExp::kIrregexpLatin1CodeIndex, *trampoline);
- data->set(JSRegExp::kIrregexpUC16CodeIndex, *trampoline);
+ re->SetCaptureNameMap(parse_result.capture_name_map);
- data->set(JSRegExp::kExperimentalPatternIndex,
- data->get(JSRegExp::kSourceIndex));
+ return true;
}
-struct match_range {
- int32_t begin;
- int32_t end;
-};
+Vector<RegExpInstruction> AsInstructionSequence(ByteArray raw_bytes) {
+ RegExpInstruction* inst_begin =
+ reinterpret_cast<RegExpInstruction*>(raw_bytes.GetDataStartAddress());
+ int inst_num = raw_bytes.length() / sizeof(RegExpInstruction);
+ DCHECK_EQ(sizeof(RegExpInstruction) * inst_num, raw_bytes.length());
+ return Vector<RegExpInstruction>(inst_begin, inst_num);
+}
// Returns the number of matches.
-int32_t ExperimentalRegExp::ExecRaw(JSRegExp regexp, String subject,
- int32_t* output_registers,
+int32_t ExperimentalRegExp::ExecRaw(Isolate* isolate, JSRegExp regexp,
+ String subject, int32_t* output_registers,
int32_t output_register_count,
int32_t subject_index) {
- String needle =
- String::cast(regexp.DataAt(JSRegExp::kExperimentalPatternIndex));
+ DisallowHeapAllocation no_gc;
+
+ DCHECK(FLAG_enable_experimental_regexp_engine);
if (FLAG_trace_experimental_regexp_engine) {
- std::cout << "Searching for " << output_register_count / 2
- << " occurences of " << needle << " in " << subject << std::endl;
+ String source = String::cast(regexp.DataAt(JSRegExp::kSourceIndex));
+ StdoutStream{} << "Executing experimental regexp " << source << std::endl;
}
- DCHECK(needle.IsFlat());
- DCHECK(subject.IsFlat());
+ Vector<RegExpInstruction> bytecode = AsInstructionSequence(
+ ByteArray::cast(regexp.DataAt(JSRegExp::kIrregexpLatin1BytecodeIndex)));
- const int needle_len = needle.length();
- const int subject_len = subject.length();
-
- DCHECK_GT(needle_len, 0);
-
- DCHECK_EQ(output_register_count % 2, 0);
-
- if (subject_index + needle_len > subject_len) {
- return 0;
+ if (FLAG_print_regexp_bytecode) {
+ StdoutStream{} << "Bytecode:" << std::endl;
+ StdoutStream{} << bytecode << std::endl;
}
- match_range* matches = reinterpret_cast<match_range*>(output_registers);
- const int32_t max_match_num = output_register_count / 2;
+ int register_count_per_match =
+ JSRegExp::RegistersForCaptureCount(regexp.CaptureCount());
- // `state_num` does not overflow because the max length of strings is
- // strictly less than INT_MAX.
- const int state_num = needle_len + 1;
- const int start_state = 0;
- const int accepting_state = needle_len;
- // TODO(mbid,v8:10765): We probably don't want to allocate a new vector here
- // in every execution.
- std::vector<int8_t> in_state(state_num, false);
- in_state[start_state] = true;
-
- DisallowHeapAllocation no_gc;
- String::FlatContent needle_content = needle.GetFlatContent(no_gc);
+ DCHECK(subject.IsFlat());
String::FlatContent subject_content = subject.GetFlatContent(no_gc);
- DCHECK(needle_content.IsFlat());
- DCHECK(subject_content.IsFlat());
-
- int32_t match_num = 0;
- while (subject_index != subject_len && match_num != max_match_num) {
- uc16 subject_char = subject_content.Get(subject_index);
-
- for (int needle_index = needle_len - 1; needle_index >= 0; --needle_index) {
- uc16 needle_char = needle_content.Get(needle_index);
- if (in_state[needle_index] && needle_char == subject_char) {
- in_state[needle_index + 1] = true;
- } else {
- in_state[needle_index + 1] = false;
- }
- }
- if (in_state[accepting_state]) {
- match_range& match = matches[match_num];
- match.end = subject_index + 1;
- match.begin = match.end - needle_len;
- if (FLAG_trace_experimental_regexp_engine) {
- std::cout << "Found match at [" << match.begin << ", " << match.end
- << ")" << std::endl;
- }
- ++match_num;
- in_state.assign(state_num, false);
- in_state[start_state] = true;
- }
- ++subject_index;
- }
+ Zone zone(isolate->allocator(), ZONE_NAME);
- return match_num;
+ if (subject_content.IsOneByte()) {
+ return ExperimentalRegExpInterpreter::FindMatchesNfaOneByte(
+ bytecode, register_count_per_match, subject_content.ToOneByteVector(),
+ subject_index, output_registers, output_register_count, &zone);
+ } else {
+ return ExperimentalRegExpInterpreter::FindMatchesNfaTwoByte(
+ bytecode, register_count_per_match, subject_content.ToUC16Vector(),
+ subject_index, output_registers, output_register_count, &zone);
+ }
}
int32_t ExperimentalRegExp::MatchForCallFromJs(
@@ -128,6 +147,8 @@ int32_t ExperimentalRegExp::MatchForCallFromJs(
Address input_end, int* output_registers, int32_t output_register_count,
Address backtrack_stack, RegExp::CallOrigin call_origin, Isolate* isolate,
Address regexp) {
+ DCHECK(FLAG_enable_experimental_regexp_engine);
+
DCHECK_NOT_NULL(isolate);
DCHECK_NOT_NULL(output_registers);
DCHECK(call_origin == RegExp::CallOrigin::kFromJs);
@@ -141,28 +162,42 @@ int32_t ExperimentalRegExp::MatchForCallFromJs(
JSRegExp regexp_obj = JSRegExp::cast(Object(regexp));
- return ExecRaw(regexp_obj, subject_string, output_registers,
+ return ExecRaw(isolate, regexp_obj, subject_string, output_registers,
output_register_count, start_position);
}
MaybeHandle<Object> ExperimentalRegExp::Exec(
Isolate* isolate, Handle<JSRegExp> regexp, Handle<String> subject,
int subject_index, Handle<RegExpMatchInfo> last_match_info) {
- regexp->DataAt(JSRegExp::kExperimentalPatternIndex);
- if (!IsCompiled(regexp)) {
- Compile(isolate, regexp);
- }
+ DCHECK(FLAG_enable_experimental_regexp_engine);
- subject = String::Flatten(isolate, subject);
+ DCHECK_EQ(regexp->TypeTag(), JSRegExp::EXPERIMENTAL);
+#ifdef VERIFY_HEAP
+ regexp->JSRegExpVerify(isolate);
+#endif
- match_range match;
+ if (!IsCompiled(regexp, isolate) && !Compile(isolate, regexp)) {
+ DCHECK(isolate->has_pending_exception());
+ return MaybeHandle<Object>();
+ }
- int32_t* output_registers = &match.begin;
- int32_t output_register_count = sizeof(match_range) / sizeof(int32_t);
+ DCHECK(IsCompiled(regexp, isolate));
+
+ subject = String::Flatten(isolate, subject);
int capture_count = regexp->CaptureCount();
+ int output_register_count = JSRegExp::RegistersForCaptureCount(capture_count);
+
+ int32_t* output_registers;
+ std::unique_ptr<int32_t[]> output_registers_release;
+ if (output_register_count <= Isolate::kJSRegexpStaticOffsetsVectorSize) {
+ output_registers = isolate->jsregexp_static_offsets_vector();
+ } else {
+ output_registers = NewArray<int32_t>(output_register_count);
+ output_registers_release.reset(output_registers);
+ }
- int num_matches = ExecRaw(*regexp, *subject, output_registers,
+ int num_matches = ExecRaw(isolate, *regexp, *subject, output_registers,
output_register_count, subject_index);
if (num_matches == 0) {
diff --git a/deps/v8/src/regexp/experimental/experimental.h b/deps/v8/src/regexp/experimental/experimental.h
index 96c5b3c441..02f535f621 100644
--- a/deps/v8/src/regexp/experimental/experimental.h
+++ b/deps/v8/src/regexp/experimental/experimental.h
@@ -12,12 +12,21 @@ namespace internal {
class ExperimentalRegExp final : public AllStatic {
public:
- // Initialization & Compilation:
+ // Initialization & Compilation
+ // -------------------------------------------------------------------------
+ // Check whether a parsed regexp pattern can be compiled and executed by the
+ // EXPERIMENTAL engine.
+ // TODO(mbid, v8:10765): This walks the RegExpTree, but it could also be
+ // checked on the fly in the parser. Not done currently because walking the
+ // AST again is more flexible and less error prone (but less performant).
+ static bool CanBeHandled(RegExpTree* tree, JSRegExp::Flags flags,
+ int capture_count);
static void Initialize(Isolate* isolate, Handle<JSRegExp> re,
Handle<String> pattern, JSRegExp::Flags flags,
int capture_count);
- static bool IsCompiled(Handle<JSRegExp> re);
- static void Compile(Isolate* isolate, Handle<JSRegExp> re);
+ static bool IsCompiled(Handle<JSRegExp> re, Isolate* isolate);
+ V8_WARN_UNUSED_RESULT
+ static bool Compile(Isolate* isolate, Handle<JSRegExp> re);
// Execution:
static int32_t MatchForCallFromJs(Address subject, int32_t start_position,
@@ -30,9 +39,11 @@ class ExperimentalRegExp final : public AllStatic {
static MaybeHandle<Object> Exec(Isolate* isolate, Handle<JSRegExp> regexp,
Handle<String> subject, int index,
Handle<RegExpMatchInfo> last_match_info);
- static int32_t ExecRaw(JSRegExp regexp, String subject,
+ static int32_t ExecRaw(Isolate* isolate, JSRegExp regexp, String subject,
int32_t* output_registers,
int32_t output_register_count, int32_t subject_index);
+
+ static constexpr bool kSupportsUnicode = false;
};
} // namespace internal
diff --git a/deps/v8/src/regexp/ppc/OWNERS b/deps/v8/src/regexp/ppc/OWNERS
index 6d1a8fc472..6edd45a6ef 100644
--- a/deps/v8/src/regexp/ppc/OWNERS
+++ b/deps/v8/src/regexp/ppc/OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com \ No newline at end of file
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/src/regexp/regexp-ast.h b/deps/v8/src/regexp/regexp-ast.h
index 63b80a3404..73c3eb70b5 100644
--- a/deps/v8/src/regexp/regexp-ast.h
+++ b/deps/v8/src/regexp/regexp-ast.h
@@ -443,11 +443,12 @@ class RegExpQuantifier final : public RegExpTree {
bool IsQuantifier() override;
int min_match() override { return min_match_; }
int max_match() override { return max_match_; }
- int min() { return min_; }
- int max() { return max_; }
- bool is_possessive() { return quantifier_type_ == POSSESSIVE; }
+ int min() const { return min_; }
+ int max() const { return max_; }
+ QuantifierType quantifier_type() const { return quantifier_type_; }
+ bool is_possessive() const { return quantifier_type_ == POSSESSIVE; }
bool is_non_greedy() { return quantifier_type_ == NON_GREEDY; }
- bool is_greedy() { return quantifier_type_ == GREEDY; }
+ bool is_greedy() const { return quantifier_type_ == GREEDY; }
RegExpTree* body() { return body_; }
private:
diff --git a/deps/v8/src/regexp/regexp-compiler-tonode.cc b/deps/v8/src/regexp/regexp-compiler-tonode.cc
index f91543f4de..90e3ecffab 100644
--- a/deps/v8/src/regexp/regexp-compiler-tonode.cc
+++ b/deps/v8/src/regexp/regexp-compiler-tonode.cc
@@ -199,25 +199,24 @@ ZoneList<CharacterRange>* ToCanonicalZoneList(
}
void AddBmpCharacters(RegExpCompiler* compiler, ChoiceNode* result,
- RegExpNode* on_success, UnicodeRangeSplitter* splitter) {
+ RegExpNode* on_success, UnicodeRangeSplitter* splitter,
+ JSRegExp::Flags flags) {
ZoneList<CharacterRange>* bmp =
ToCanonicalZoneList(splitter->bmp(), compiler->zone());
if (bmp == nullptr) return;
- JSRegExp::Flags default_flags = JSRegExp::Flags();
result->AddAlternative(GuardedAlternative(TextNode::CreateForCharacterRanges(
- compiler->zone(), bmp, compiler->read_backward(), on_success,
- default_flags)));
+ compiler->zone(), bmp, compiler->read_backward(), on_success, flags)));
}
void AddNonBmpSurrogatePairs(RegExpCompiler* compiler, ChoiceNode* result,
RegExpNode* on_success,
- UnicodeRangeSplitter* splitter) {
+ UnicodeRangeSplitter* splitter,
+ JSRegExp::Flags flags) {
ZoneList<CharacterRange>* non_bmp =
ToCanonicalZoneList(splitter->non_bmp(), compiler->zone());
if (non_bmp == nullptr) return;
DCHECK(!compiler->one_byte());
Zone* zone = compiler->zone();
- JSRegExp::Flags default_flags = JSRegExp::Flags();
CharacterRange::Canonicalize(non_bmp);
for (int i = 0; i < non_bmp->length(); i++) {
// Match surrogate pair.
@@ -237,7 +236,7 @@ void AddNonBmpSurrogatePairs(RegExpCompiler* compiler, ChoiceNode* result,
GuardedAlternative(TextNode::CreateForSurrogatePair(
zone, CharacterRange::Singleton(from_l),
CharacterRange::Range(from_t, to_t), compiler->read_backward(),
- on_success, default_flags)));
+ on_success, flags)));
} else {
if (from_t != kTrailSurrogateStart) {
// Add [from_l][from_t-\udfff]
@@ -245,7 +244,7 @@ void AddNonBmpSurrogatePairs(RegExpCompiler* compiler, ChoiceNode* result,
GuardedAlternative(TextNode::CreateForSurrogatePair(
zone, CharacterRange::Singleton(from_l),
CharacterRange::Range(from_t, kTrailSurrogateEnd),
- compiler->read_backward(), on_success, default_flags)));
+ compiler->read_backward(), on_success, flags)));
from_l++;
}
if (to_t != kTrailSurrogateEnd) {
@@ -254,7 +253,7 @@ void AddNonBmpSurrogatePairs(RegExpCompiler* compiler, ChoiceNode* result,
GuardedAlternative(TextNode::CreateForSurrogatePair(
zone, CharacterRange::Singleton(to_l),
CharacterRange::Range(kTrailSurrogateStart, to_t),
- compiler->read_backward(), on_success, default_flags)));
+ compiler->read_backward(), on_success, flags)));
to_l--;
}
if (from_l <= to_l) {
@@ -263,7 +262,7 @@ void AddNonBmpSurrogatePairs(RegExpCompiler* compiler, ChoiceNode* result,
GuardedAlternative(TextNode::CreateForSurrogatePair(
zone, CharacterRange::Range(from_l, to_l),
CharacterRange::Range(kTrailSurrogateStart, kTrailSurrogateEnd),
- compiler->read_backward(), on_success, default_flags)));
+ compiler->read_backward(), on_success, flags)));
}
}
}
@@ -302,8 +301,8 @@ RegExpNode* MatchAndNegativeLookaroundInReadDirection(
void AddLoneLeadSurrogates(RegExpCompiler* compiler, ChoiceNode* result,
RegExpNode* on_success,
- UnicodeRangeSplitter* splitter) {
- JSRegExp::Flags default_flags = JSRegExp::Flags();
+ UnicodeRangeSplitter* splitter,
+ JSRegExp::Flags flags) {
ZoneList<CharacterRange>* lead_surrogates =
ToCanonicalZoneList(splitter->lead_surrogates(), compiler->zone());
if (lead_surrogates == nullptr) return;
@@ -317,22 +316,20 @@ void AddLoneLeadSurrogates(RegExpCompiler* compiler, ChoiceNode* result,
// Reading backward. Assert that reading forward, there is no trail
// surrogate, and then backward match the lead surrogate.
match = NegativeLookaroundAgainstReadDirectionAndMatch(
- compiler, trail_surrogates, lead_surrogates, on_success, true,
- default_flags);
+ compiler, trail_surrogates, lead_surrogates, on_success, true, flags);
} else {
// Reading forward. Forward match the lead surrogate and assert that
// no trail surrogate follows.
match = MatchAndNegativeLookaroundInReadDirection(
- compiler, lead_surrogates, trail_surrogates, on_success, false,
- default_flags);
+ compiler, lead_surrogates, trail_surrogates, on_success, false, flags);
}
result->AddAlternative(GuardedAlternative(match));
}
void AddLoneTrailSurrogates(RegExpCompiler* compiler, ChoiceNode* result,
RegExpNode* on_success,
- UnicodeRangeSplitter* splitter) {
- JSRegExp::Flags default_flags = JSRegExp::Flags();
+ UnicodeRangeSplitter* splitter,
+ JSRegExp::Flags flags) {
ZoneList<CharacterRange>* trail_surrogates =
ToCanonicalZoneList(splitter->trail_surrogates(), compiler->zone());
if (trail_surrogates == nullptr) return;
@@ -346,14 +343,12 @@ void AddLoneTrailSurrogates(RegExpCompiler* compiler, ChoiceNode* result,
// Reading backward. Backward match the trail surrogate and assert that no
// lead surrogate precedes it.
match = MatchAndNegativeLookaroundInReadDirection(
- compiler, trail_surrogates, lead_surrogates, on_success, true,
- default_flags);
+ compiler, trail_surrogates, lead_surrogates, on_success, true, flags);
} else {
// Reading forward. Assert that reading backward, there is no lead
// surrogate, and then forward match the trail surrogate.
match = NegativeLookaroundAgainstReadDirectionAndMatch(
- compiler, lead_surrogates, trail_surrogates, on_success, false,
- default_flags);
+ compiler, lead_surrogates, trail_surrogates, on_success, false, flags);
}
result->AddAlternative(GuardedAlternative(match));
}
@@ -436,10 +431,10 @@ RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler,
} else {
ChoiceNode* result = zone->New<ChoiceNode>(2, zone);
UnicodeRangeSplitter splitter(ranges);
- AddBmpCharacters(compiler, result, on_success, &splitter);
- AddNonBmpSurrogatePairs(compiler, result, on_success, &splitter);
- AddLoneLeadSurrogates(compiler, result, on_success, &splitter);
- AddLoneTrailSurrogates(compiler, result, on_success, &splitter);
+ AddBmpCharacters(compiler, result, on_success, &splitter, flags_);
+ AddNonBmpSurrogatePairs(compiler, result, on_success, &splitter, flags_);
+ AddLoneLeadSurrogates(compiler, result, on_success, &splitter, flags_);
+ AddLoneTrailSurrogates(compiler, result, on_success, &splitter, flags_);
static constexpr int kMaxRangesToInline = 32; // Arbitrary.
if (ranges->length() > kMaxRangesToInline) result->SetDoNotInline();
return result;
diff --git a/deps/v8/src/regexp/regexp.cc b/deps/v8/src/regexp/regexp.cc
index f304bfbb6d..569acdab48 100644
--- a/deps/v8/src/regexp/regexp.cc
+++ b/deps/v8/src/regexp/regexp.cc
@@ -37,6 +37,16 @@ class RegExpImpl final : public AllStatic {
Handle<String> pattern, JSRegExp::Flags flags,
int capture_count, uint32_t backtrack_limit);
+ // Prepare a RegExp for being executed one or more times (using
+ // IrregexpExecOnce) on the subject.
+ // This ensures that the regexp is compiled for the subject, and that
+ // the subject is flat.
+ // Returns the number of integer spaces required by IrregexpExecOnce
+ // as its "registers" argument. If the regexp cannot be compiled,
+ // an exception is set as pending, and this function returns negative.
+ static int IrregexpPrepare(Isolate* isolate, Handle<JSRegExp> regexp,
+ Handle<String> subject);
+
static void AtomCompile(Isolate* isolate, Handle<JSRegExp> re,
Handle<String> pattern, JSRegExp::Flags flags,
Handle<String> match_pattern);
@@ -83,18 +93,15 @@ class RegExpImpl final : public AllStatic {
// For acting on the JSRegExp data FixedArray.
static int IrregexpMaxRegisterCount(FixedArray re);
static void SetIrregexpMaxRegisterCount(FixedArray re, int value);
- static void SetIrregexpCaptureNameMap(FixedArray re,
- Handle<FixedArray> value);
static int IrregexpNumberOfCaptures(FixedArray re);
static ByteArray IrregexpByteCode(FixedArray re, bool is_one_byte);
static Code IrregexpNativeCode(FixedArray re, bool is_one_byte);
};
-V8_WARN_UNUSED_RESULT
-static inline MaybeHandle<Object> ThrowRegExpException(Isolate* isolate,
- Handle<JSRegExp> re,
- Handle<String> pattern,
- RegExpError error) {
+MaybeHandle<Object> RegExp::ThrowRegExpException(Isolate* isolate,
+ Handle<JSRegExp> re,
+ Handle<String> pattern,
+ RegExpError error) {
Vector<const char> error_data = CStrVector(RegExpErrorString(error));
Handle<String> error_text =
isolate->factory()
@@ -106,8 +113,8 @@ static inline MaybeHandle<Object> ThrowRegExpException(Isolate* isolate,
Object);
}
-inline void ThrowRegExpException(Isolate* isolate, Handle<JSRegExp> re,
- RegExpError error_text) {
+void RegExp::ThrowRegExpException(Isolate* isolate, Handle<JSRegExp> re,
+ RegExpError error_text) {
USE(ThrowRegExpException(isolate, re, Handle<String>(re->Pattern(), isolate),
error_text));
}
@@ -169,18 +176,17 @@ MaybeHandle<Object> RegExp::Compile(Isolate* isolate, Handle<JSRegExp> re,
if (!RegExpParser::ParseRegExp(isolate, &zone, &reader, flags,
&parse_result)) {
// Throw an exception if we fail to parse the pattern.
- return ThrowRegExpException(isolate, re, pattern, parse_result.error);
+ return RegExp::ThrowRegExpException(isolate, re, pattern,
+ parse_result.error);
}
bool has_been_compiled = false;
- if (FLAG_enable_experimental_regexp_engine && parse_result.simple &&
- !IgnoreCase(flags) && !IsSticky(flags)) {
- // Parse-tree is a single atom that is equal to the pattern. For now we let
- // the experimental regexp engine deal with this case instead of string
- // search via ATOM (modulo some performance-related heuristic).
- int capture_count = 0;
- ExperimentalRegExp::Initialize(isolate, re, pattern, flags, capture_count);
+ if (FLAG_enable_experimental_regexp_engine &&
+ ExperimentalRegExp::CanBeHandled(parse_result.tree, flags,
+ parse_result.capture_count)) {
+ ExperimentalRegExp::Initialize(isolate, re, pattern, flags,
+ parse_result.capture_count);
has_been_compiled = true;
} else if (parse_result.simple && !IgnoreCase(flags) && !IsSticky(flags) &&
!HasFewDifferentCharacters(pattern)) {
@@ -218,6 +224,30 @@ MaybeHandle<Object> RegExp::Compile(Isolate* isolate, Handle<JSRegExp> re,
}
// static
+bool RegExp::EnsureFullyCompiled(Isolate* isolate, Handle<JSRegExp> re,
+ Handle<String> subject) {
+ switch (re->TypeTag()) {
+ case JSRegExp::NOT_COMPILED:
+ UNREACHABLE();
+ case JSRegExp::ATOM:
+ return true;
+ case JSRegExp::IRREGEXP:
+ if (RegExpImpl::IrregexpPrepare(isolate, re, subject) == -1) {
+ DCHECK(isolate->has_pending_exception());
+ return false;
+ }
+ return true;
+ case JSRegExp::EXPERIMENTAL:
+ if (!ExperimentalRegExp::IsCompiled(re, isolate) &&
+ !ExperimentalRegExp::Compile(isolate, re)) {
+ DCHECK(isolate->has_pending_exception());
+ return false;
+ }
+ return true;
+ }
+}
+
+// static
MaybeHandle<Object> RegExp::Exec(Isolate* isolate, Handle<JSRegExp> regexp,
Handle<String> subject, int index,
Handle<RegExpMatchInfo> last_match_info) {
@@ -409,7 +439,7 @@ bool RegExpImpl::CompileIrregexp(Isolate* isolate, Handle<JSRegExp> re,
&compile_data)) {
// Throw an exception if we fail to parse the pattern.
// THIS SHOULD NOT HAPPEN. We already pre-parsed it successfully once.
- USE(ThrowRegExpException(isolate, re, pattern, compile_data.error));
+ USE(RegExp::ThrowRegExpException(isolate, re, pattern, compile_data.error));
return false;
}
// The compilation target is a kBytecode if we're interpreting all regexp
@@ -425,7 +455,7 @@ bool RegExpImpl::CompileIrregexp(Isolate* isolate, Handle<JSRegExp> re,
is_one_byte, re->BacktrackLimit());
if (!compilation_succeeded) {
DCHECK(compile_data.error != RegExpError::kNone);
- ThrowRegExpException(isolate, re, compile_data.error);
+ RegExp::ThrowRegExpException(isolate, re, compile_data.error);
return false;
}
@@ -447,7 +477,7 @@ bool RegExpImpl::CompileIrregexp(Isolate* isolate, Handle<JSRegExp> re,
BUILTIN_CODE(isolate, RegExpInterpreterTrampoline);
data->set(JSRegExp::code_index(is_one_byte), *trampoline);
}
- SetIrregexpCaptureNameMap(*data, compile_data.capture_name_map);
+ re->SetCaptureNameMap(compile_data.capture_name_map);
int register_max = IrregexpMaxRegisterCount(*data);
if (compile_data.register_count > register_max) {
SetIrregexpMaxRegisterCount(*data, compile_data.register_count);
@@ -473,15 +503,6 @@ void RegExpImpl::SetIrregexpMaxRegisterCount(FixedArray re, int value) {
re.set(JSRegExp::kIrregexpMaxRegisterCountIndex, Smi::FromInt(value));
}
-void RegExpImpl::SetIrregexpCaptureNameMap(FixedArray re,
- Handle<FixedArray> value) {
- if (value.is_null()) {
- re.set(JSRegExp::kIrregexpCaptureNameMapIndex, Smi::zero());
- } else {
- re.set(JSRegExp::kIrregexpCaptureNameMapIndex, *value);
- }
-}
-
int RegExpImpl::IrregexpNumberOfCaptures(FixedArray re) {
return Smi::ToInt(re.get(JSRegExp::kIrregexpCaptureCountIndex));
}
@@ -504,8 +525,8 @@ void RegExpImpl::IrregexpInitialize(Isolate* isolate, Handle<JSRegExp> re,
}
// static
-int RegExp::IrregexpPrepare(Isolate* isolate, Handle<JSRegExp> regexp,
- Handle<String> subject) {
+int RegExpImpl::IrregexpPrepare(Isolate* isolate, Handle<JSRegExp> regexp,
+ Handle<String> subject) {
DCHECK(subject->IsFlat());
// Check representation of the underlying storage.
@@ -619,7 +640,8 @@ MaybeHandle<Object> RegExpImpl::IrregexpExec(
}
// Prepare space for the return values.
- int required_registers = RegExp::IrregexpPrepare(isolate, regexp, subject);
+ int required_registers =
+ RegExpImpl::IrregexpPrepare(isolate, regexp, subject);
if (required_registers < 0) {
// Compiling failed with an exception.
DCHECK(isolate->has_pending_exception());
@@ -881,43 +903,53 @@ RegExpGlobalCache::RegExpGlobalCache(Handle<JSRegExp> regexp,
regexp_(regexp),
subject_(subject),
isolate_(isolate) {
- bool interpreted = regexp->ShouldProduceBytecode();
+ DCHECK(IsGlobal(regexp->GetFlags()));
switch (regexp_->TypeTag()) {
case JSRegExp::NOT_COMPILED:
UNREACHABLE();
- case JSRegExp::EXPERIMENTAL:
- // TODO(mbid,v8:10765): At the moment experimental regexps can't deal with
- // captures; this should change in the future.
case JSRegExp::ATOM: {
+ // ATOM regexps do not have a global loop, so we search for one match at
+ // a time.
static const int kAtomRegistersPerMatch = 2;
registers_per_match_ = kAtomRegistersPerMatch;
- // There is no distinction between interpreted and native for atom
- // regexps.
- interpreted = false;
+ register_array_size_ = registers_per_match_;
break;
}
- case JSRegExp::IRREGEXP:
+ case JSRegExp::IRREGEXP: {
registers_per_match_ =
- RegExp::IrregexpPrepare(isolate_, regexp_, subject_);
+ RegExpImpl::IrregexpPrepare(isolate_, regexp_, subject_);
if (registers_per_match_ < 0) {
num_matches_ = -1; // Signal exception.
return;
}
+ if (regexp->ShouldProduceBytecode()) {
+ // Global loop in interpreted regexp is not implemented. We choose the
+ // size of the offsets vector so that it can only store one match.
+ register_array_size_ = registers_per_match_;
+ max_matches_ = 1;
+ } else {
+ register_array_size_ = Max(registers_per_match_,
+ Isolate::kJSRegexpStaticOffsetsVectorSize);
+ }
+ break;
+ }
+ case JSRegExp::EXPERIMENTAL: {
+ if (!ExperimentalRegExp::IsCompiled(regexp, isolate_) &&
+ !ExperimentalRegExp::Compile(isolate_, regexp)) {
+ DCHECK(isolate->has_pending_exception());
+ num_matches_ = -1; // Signal exception.
+ return;
+ }
+ registers_per_match_ =
+ JSRegExp::RegistersForCaptureCount(regexp->CaptureCount());
+ register_array_size_ =
+ Max(registers_per_match_, Isolate::kJSRegexpStaticOffsetsVectorSize);
break;
+ }
}
- DCHECK(IsGlobal(regexp->GetFlags()));
- if (!interpreted) {
- register_array_size_ =
- Max(registers_per_match_, Isolate::kJSRegexpStaticOffsetsVectorSize);
- max_matches_ = register_array_size_ / registers_per_match_;
- } else {
- // Global loop in interpreted regexp is not implemented. We choose
- // the size of the offsets vector so that it can only store one match.
- register_array_size_ = registers_per_match_;
- max_matches_ = 1;
- }
+ max_matches_ = register_array_size_ / registers_per_match_;
if (register_array_size_ > Isolate::kJSRegexpStaticOffsetsVectorSize) {
register_array_ = NewArray<int32_t>(register_array_size_);
@@ -979,13 +1011,11 @@ int32_t* RegExpGlobalCache::FetchNext() {
register_array_, register_array_size_);
break;
case JSRegExp::EXPERIMENTAL: {
- if (!ExperimentalRegExp::IsCompiled(regexp_)) {
- ExperimentalRegExp::Compile(isolate_, regexp_);
- }
+ DCHECK(ExperimentalRegExp::IsCompiled(regexp_, isolate_));
DisallowHeapAllocation no_gc;
- num_matches_ =
- ExperimentalRegExp::ExecRaw(*regexp_, *subject_, register_array_,
- register_array_size_, last_end_index);
+ num_matches_ = ExperimentalRegExp::ExecRaw(
+ isolate_, *regexp_, *subject_, register_array_,
+ register_array_size_, last_end_index);
break;
}
case JSRegExp::IRREGEXP: {
diff --git a/deps/v8/src/regexp/regexp.h b/deps/v8/src/regexp/regexp.h
index 3a5d9e2962..a6a3a8f003 100644
--- a/deps/v8/src/regexp/regexp.h
+++ b/deps/v8/src/regexp/regexp.h
@@ -74,6 +74,13 @@ class RegExp final : public AllStatic {
Isolate* isolate, Handle<JSRegExp> re, Handle<String> pattern,
JSRegExp::Flags flags, uint32_t backtrack_limit);
+ // Ensures that a regexp is fully compiled and ready to be executed on a
+ // subject string. Returns true on success. Return false on failure, and
+ // then an exception will be pending.
+ V8_WARN_UNUSED_RESULT static bool EnsureFullyCompiled(Isolate* isolate,
+ Handle<JSRegExp> re,
+ Handle<String> subject);
+
enum CallOrigin : int {
kFromRuntime = 0,
kFromJs = 1,
@@ -97,16 +104,6 @@ class RegExp final : public AllStatic {
RE_EXCEPTION = kInternalRegExpException,
};
- // Prepare a RegExp for being executed one or more times (using
- // IrregexpExecOnce) on the subject.
- // This ensures that the regexp is compiled for the subject, and that
- // the subject is flat.
- // Returns the number of integer spaces required by IrregexpExecOnce
- // as its "registers" argument. If the regexp cannot be compiled,
- // an exception is set as pending, and this function returns negative.
- static int IrregexpPrepare(Isolate* isolate, Handle<JSRegExp> regexp,
- Handle<String> subject);
-
// Set last match info. If match is nullptr, then setting captures is
// omitted.
static Handle<RegExpMatchInfo> SetLastMatchInfo(
@@ -124,6 +121,14 @@ class RegExp final : public AllStatic {
RegExpNode* node);
static const int kRegExpTooLargeToOptimize = 20 * KB;
+
+ V8_WARN_UNUSED_RESULT
+ static MaybeHandle<Object> ThrowRegExpException(Isolate* isolate,
+ Handle<JSRegExp> re,
+ Handle<String> pattern,
+ RegExpError error);
+ static void ThrowRegExpException(Isolate* isolate, Handle<JSRegExp> re,
+ RegExpError error_text);
};
// Uses a special global mode of irregexp-generated code to perform a global
diff --git a/deps/v8/src/runtime/runtime-bigint.cc b/deps/v8/src/runtime/runtime-bigint.cc
index 8f065740d7..a9b21c19bd 100644
--- a/deps/v8/src/runtime/runtime-bigint.cc
+++ b/deps/v8/src/runtime/runtime-bigint.cc
@@ -39,9 +39,11 @@ RUNTIME_FUNCTION(Runtime_BigIntCompareToString) {
CONVERT_ARG_HANDLE_CHECKED(Smi, mode, 0);
CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 1);
CONVERT_ARG_HANDLE_CHECKED(String, rhs, 2);
- bool result =
- ComparisonResultToBool(static_cast<Operation>(mode->value()),
- BigInt::CompareToString(isolate, lhs, rhs));
+ Maybe<ComparisonResult> maybe_result =
+ BigInt::CompareToString(isolate, lhs, rhs);
+ MAYBE_RETURN(maybe_result, ReadOnlyRoots(isolate).exception());
+ bool result = ComparisonResultToBool(static_cast<Operation>(mode->value()),
+ maybe_result.FromJust());
return *isolate->factory()->ToBoolean(result);
}
@@ -68,8 +70,9 @@ RUNTIME_FUNCTION(Runtime_BigIntEqualToString) {
DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 0);
CONVERT_ARG_HANDLE_CHECKED(String, rhs, 1);
- bool result = BigInt::EqualToString(isolate, lhs, rhs);
- return *isolate->factory()->ToBoolean(result);
+ Maybe<bool> maybe_result = BigInt::EqualToString(isolate, lhs, rhs);
+ MAYBE_RETURN(maybe_result, ReadOnlyRoots(isolate).exception());
+ return *isolate->factory()->ToBoolean(maybe_result.FromJust());
}
RUNTIME_FUNCTION(Runtime_BigIntToBoolean) {
diff --git a/deps/v8/src/runtime/runtime-compiler.cc b/deps/v8/src/runtime/runtime-compiler.cc
index 7e23d6c717..c20d2d69f2 100644
--- a/deps/v8/src/runtime/runtime-compiler.cc
+++ b/deps/v8/src/runtime/runtime-compiler.cc
@@ -5,6 +5,7 @@
#include "src/asmjs/asm-js.h"
#include "src/codegen/compilation-cache.h"
#include "src/codegen/compiler.h"
+#include "src/common/assert-scope.h"
#include "src/common/message-template.h"
#include "src/compiler-dispatcher/optimizing-compile-dispatcher.h"
#include "src/deoptimizer/deoptimizer.h"
@@ -59,21 +60,39 @@ RUNTIME_FUNCTION(Runtime_CompileLazy) {
namespace {
+inline bool MaybeSpawnNativeContextIndependentCompilationJob() {
+ return FLAG_turbo_nci && !FLAG_turbo_nci_as_midtier;
+}
+
Object CompileOptimized(Isolate* isolate, Handle<JSFunction> function,
ConcurrencyMode mode) {
StackLimitCheck check(isolate);
if (check.JsHasOverflowed(kStackSpaceRequiredForCompilation * KB)) {
return isolate->StackOverflow();
}
- if (!Compiler::CompileOptimized(function, mode, CodeKindForTopTier())) {
+
+ // Compile for the next tier.
+ if (!Compiler::CompileOptimized(function, mode, function->NextTier())) {
return ReadOnlyRoots(isolate).exception();
}
- if (ShouldSpawnExtraNativeContextIndependentCompilationJob()) {
- if (!Compiler::CompileOptimized(function, mode,
- CodeKind::NATIVE_CONTEXT_INDEPENDENT)) {
- return ReadOnlyRoots(isolate).exception();
+
+ // Possibly compile for NCI caching.
+ if (MaybeSpawnNativeContextIndependentCompilationJob()) {
+ // The first optimization request does not trigger NCI compilation,
+ // since we try to avoid compiling Code that remains unused in the future.
+ // Repeated optimization (possibly in different native contexts) is taken
+ // as a signal that this SFI will continue to be used in the future, thus
+ // we trigger NCI compilation.
+ if (function->shared().has_optimized_at_least_once()) {
+ if (!Compiler::CompileOptimized(function, mode,
+ CodeKind::NATIVE_CONTEXT_INDEPENDENT)) {
+ return ReadOnlyRoots(isolate).exception();
+ }
+ } else {
+ function->shared().set_has_optimized_at_least_once(true);
}
}
+
DCHECK(function->is_compiled());
return function->code();
}
@@ -167,6 +186,7 @@ RUNTIME_FUNCTION(Runtime_NotifyDeoptimized) {
DCHECK(CodeKindCanDeoptimize(deoptimizer->compiled_code()->kind()));
DCHECK(deoptimizer->compiled_code()->is_turbofanned());
DCHECK(AllowHeapAllocation::IsAllowed());
+ DCHECK(AllowGarbageCollection::IsAllowed());
DCHECK(isolate->context().is_null());
TimerEventScope<TimerEventDeoptimizeCode> timer(isolate);
diff --git a/deps/v8/src/runtime/runtime-interpreter.cc b/deps/v8/src/runtime/runtime-interpreter.cc
index 1632554130..7cb9b067cf 100644
--- a/deps/v8/src/runtime/runtime-interpreter.cc
+++ b/deps/v8/src/runtime/runtime-interpreter.cc
@@ -60,7 +60,7 @@ void PrintRegisters(Isolate* isolate, std::ostream& os, bool is_input,
if ((is_input && interpreter::Bytecodes::ReadsAccumulator(bytecode)) ||
(!is_input && interpreter::Bytecodes::WritesAccumulator(bytecode))) {
os << " [ " << kAccumulator << kArrowDirection;
- accumulator->ShortPrint();
+ accumulator->ShortPrint(os);
os << " ]" << std::endl;
}
diff --git a/deps/v8/src/runtime/runtime-object.cc b/deps/v8/src/runtime/runtime-object.cc
index a147991c32..41dea0fe44 100644
--- a/deps/v8/src/runtime/runtime-object.cc
+++ b/deps/v8/src/runtime/runtime-object.cc
@@ -24,21 +24,25 @@ namespace v8 {
namespace internal {
MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate,
- Handle<Object> object,
+ Handle<Object> holder,
Handle<Object> key,
- bool* is_found_out) {
- if (object->IsNullOrUndefined(isolate)) {
- ErrorUtils::ThrowLoadFromNullOrUndefined(isolate, object, key);
+ Handle<Object> receiver,
+ bool* is_found) {
+ if (receiver.is_null()) {
+ receiver = holder;
+ }
+ if (holder->IsNullOrUndefined(isolate)) {
+ ErrorUtils::ThrowLoadFromNullOrUndefined(isolate, holder, key);
return MaybeHandle<Object>();
}
bool success = false;
LookupIterator::Key lookup_key(isolate, key, &success);
if (!success) return MaybeHandle<Object>();
- LookupIterator it(isolate, object, lookup_key);
+ LookupIterator it = LookupIterator(isolate, receiver, lookup_key, holder);
MaybeHandle<Object> result = Object::GetProperty(&it);
- if (is_found_out) *is_found_out = it.IsFound();
+ if (is_found) *is_found = it.IsFound();
if (!it.IsFound() && key->IsSymbol() &&
Symbol::cast(*key).is_private_name()) {
@@ -52,12 +56,12 @@ MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate,
: name_string;
THROW_NEW_ERROR(isolate,
NewTypeError(MessageTemplate::kInvalidPrivateBrand,
- class_name, object),
+ class_name, holder),
Object);
}
THROW_NEW_ERROR(isolate,
NewTypeError(MessageTemplate::kInvalidPrivateMemberRead,
- name_string, object),
+ name_string, holder),
Object);
}
return result;
@@ -582,11 +586,16 @@ RUNTIME_FUNCTION(Runtime_JSReceiverSetPrototypeOfDontThrow) {
RUNTIME_FUNCTION(Runtime_GetProperty) {
HandleScope scope(isolate);
- DCHECK_EQ(2, args.length());
- CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0);
+ DCHECK(args.length() == 3 || args.length() == 2);
+ CONVERT_ARG_HANDLE_CHECKED(Object, holder_obj, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1);
+ Handle<Object> receiver_obj = holder_obj;
+ if (args.length() == 3) {
+ CHECK(args[2].IsObject());
+ receiver_obj = args.at<Object>(2);
+ }
- // Fast cases for getting named properties of the receiver JSObject
+ // Fast cases for getting named properties of the holder JSObject
// itself.
//
// The global proxy objects has to be excluded since LookupOwn on
@@ -604,18 +613,18 @@ RUNTIME_FUNCTION(Runtime_GetProperty) {
if (key_obj->IsString() && String::cast(*key_obj).AsArrayIndex(&index)) {
key_obj = isolate->factory()->NewNumberFromUint(index);
}
- if (receiver_obj->IsJSObject()) {
- if (!receiver_obj->IsJSGlobalProxy() &&
- !receiver_obj->IsAccessCheckNeeded() && key_obj->IsName()) {
- Handle<JSObject> receiver = Handle<JSObject>::cast(receiver_obj);
+ if (holder_obj->IsJSObject()) {
+ if (!holder_obj->IsJSGlobalProxy() && !holder_obj->IsAccessCheckNeeded() &&
+ key_obj->IsName()) {
+ Handle<JSObject> holder = Handle<JSObject>::cast(holder_obj);
Handle<Name> key = Handle<Name>::cast(key_obj);
key_obj = key = isolate->factory()->InternalizeName(key);
DisallowHeapAllocation no_allocation;
- if (receiver->IsJSGlobalObject()) {
+ if (holder->IsJSGlobalObject()) {
// Attempt dictionary lookup.
GlobalDictionary dictionary =
- JSGlobalObject::cast(*receiver).global_dictionary();
+ JSGlobalObject::cast(*holder).global_dictionary();
InternalIndex entry = dictionary.FindEntry(isolate, key);
if (entry.is_found()) {
PropertyCell cell = dictionary.CellAt(entry);
@@ -625,9 +634,9 @@ RUNTIME_FUNCTION(Runtime_GetProperty) {
// If value is the hole (meaning, absent) do the general lookup.
}
}
- } else if (!receiver->HasFastProperties()) {
+ } else if (!holder->HasFastProperties()) {
// Attempt dictionary lookup.
- NameDictionary dictionary = receiver->property_dictionary();
+ NameDictionary dictionary = holder->property_dictionary();
InternalIndex entry = dictionary.FindEntry(isolate, key);
if ((entry.is_found()) &&
(dictionary.DetailsAt(entry).kind() == kData)) {
@@ -641,7 +650,7 @@ RUNTIME_FUNCTION(Runtime_GetProperty) {
// transition elements to FAST_*_ELEMENTS to avoid excessive boxing of
// doubles for those future calls in the case that the elements would
// become PACKED_DOUBLE_ELEMENTS.
- Handle<JSObject> js_object = Handle<JSObject>::cast(receiver_obj);
+ Handle<JSObject> js_object = Handle<JSObject>::cast(holder_obj);
ElementsKind elements_kind = js_object->GetElementsKind();
if (IsDoubleElementsKind(elements_kind)) {
if (Smi::ToInt(*key_obj) >= js_object->elements().length()) {
@@ -654,9 +663,9 @@ RUNTIME_FUNCTION(Runtime_GetProperty) {
!IsFastElementsKind(elements_kind));
}
}
- } else if (receiver_obj->IsString() && key_obj->IsSmi()) {
+ } else if (holder_obj->IsString() && key_obj->IsSmi()) {
// Fast case for string indexing using [] with a smi index.
- Handle<String> str = Handle<String>::cast(receiver_obj);
+ Handle<String> str = Handle<String>::cast(holder_obj);
int index = Handle<Smi>::cast(key_obj)->value();
if (index >= 0 && index < str->length()) {
Factory* factory = isolate->factory();
@@ -667,7 +676,8 @@ RUNTIME_FUNCTION(Runtime_GetProperty) {
// Fall back to GetObjectProperty.
RETURN_RESULT_OR_FAILURE(
- isolate, Runtime::GetObjectProperty(isolate, receiver_obj, key_obj));
+ isolate,
+ Runtime::GetObjectProperty(isolate, holder_obj, key_obj, receiver_obj));
}
RUNTIME_FUNCTION(Runtime_SetKeyedProperty) {
@@ -1137,7 +1147,7 @@ RUNTIME_FUNCTION(Runtime_ToLength) {
RETURN_RESULT_OR_FAILURE(isolate, Object::ToLength(isolate, input));
}
-RUNTIME_FUNCTION(Runtime_ToStringRT) {
+RUNTIME_FUNCTION(Runtime_ToString) {
HandleScope scope(isolate);
DCHECK_EQ(1, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
diff --git a/deps/v8/src/runtime/runtime-regexp.cc b/deps/v8/src/runtime/runtime-regexp.cc
index a1ec296731..994d6e3710 100644
--- a/deps/v8/src/runtime/runtime-regexp.cc
+++ b/deps/v8/src/runtime/runtime-regexp.cc
@@ -322,7 +322,7 @@ bool CompiledReplacement::Compile(Isolate* isolate, Handle<JSRegExp> regexp,
FixedArray capture_name_map;
if (capture_count > 0) {
- DCHECK_EQ(regexp->TypeTag(), JSRegExp::IRREGEXP);
+ DCHECK(JSRegExp::TypeSupportsCaptures(regexp->TypeTag()));
Object maybe_capture_name_map = regexp->CaptureNameMap();
if (maybe_capture_name_map.IsFixedArray()) {
capture_name_map = FixedArray::cast(maybe_capture_name_map);
@@ -611,13 +611,9 @@ V8_WARN_UNUSED_RESULT static Object StringReplaceGlobalRegExpWithString(
int capture_count = regexp->CaptureCount();
int subject_length = subject->length();
- JSRegExp::Type typeTag = regexp->TypeTag();
- if (typeTag == JSRegExp::IRREGEXP) {
- // Ensure the RegExp is compiled so we can access the capture-name map.
- if (RegExp::IrregexpPrepare(isolate, regexp, subject) == -1) {
- DCHECK(isolate->has_pending_exception());
- return ReadOnlyRoots(isolate).exception();
- }
+ // Ensure the RegExp is compiled so we can access the capture-name map.
+ if (!RegExp::EnsureFullyCompiled(isolate, regexp, subject)) {
+ return ReadOnlyRoots(isolate).exception();
}
// CompiledReplacement uses zone allocation.
@@ -627,7 +623,7 @@ V8_WARN_UNUSED_RESULT static Object StringReplaceGlobalRegExpWithString(
isolate, regexp, replacement, capture_count, subject_length);
// Shortcut for simple non-regexp global replacements
- if (typeTag == JSRegExp::ATOM && simple_replace) {
+ if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) {
if (subject->IsOneByteRepresentation() &&
replacement->IsOneByteRepresentation()) {
return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>(
@@ -891,7 +887,7 @@ class MatchInfoBackedMatch : public String::Match {
: isolate_(isolate), match_info_(match_info) {
subject_ = String::Flatten(isolate, subject);
- if (regexp->TypeTag() == JSRegExp::IRREGEXP) {
+ if (JSRegExp::TypeSupportsCaptures(regexp->TypeTag())) {
Object o = regexp->CaptureNameMap();
has_named_captures_ = o.IsFixedArray();
if (has_named_captures_) {
@@ -1460,8 +1456,7 @@ RUNTIME_FUNCTION(Runtime_StringReplaceNonGlobalRegExpWithFunction) {
bool has_named_captures = false;
Handle<FixedArray> capture_map;
if (m > 1) {
- // The existence of capture groups implies IRREGEXP kind.
- DCHECK_EQ(regexp->TypeTag(), JSRegExp::IRREGEXP);
+ DCHECK(JSRegExp::TypeSupportsCaptures(regexp->TypeTag()));
Object maybe_capture_map = regexp->CaptureNameMap();
if (maybe_capture_map.IsFixedArray()) {
diff --git a/deps/v8/src/runtime/runtime-scopes.cc b/deps/v8/src/runtime/runtime-scopes.cc
index efe3404303..36a48ae513 100644
--- a/deps/v8/src/runtime/runtime-scopes.cc
+++ b/deps/v8/src/runtime/runtime-scopes.cc
@@ -18,8 +18,8 @@
#include "src/objects/module-inl.h"
#include "src/objects/smi.h"
#include "src/runtime/runtime-utils.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
-#include "torque-generated/exported-class-definitions-tq.h"
+#include "torque-generated/exported-class-definitions-inl.h"
+#include "torque-generated/exported-class-definitions.h"
namespace v8 {
namespace internal {
@@ -379,12 +379,16 @@ std::unique_ptr<Handle<Object>[]> GetCallerArguments(Isolate* isolate,
return param_data;
} else {
+#ifdef V8_NO_ARGUMENTS_ADAPTOR
+ int args_count = frame->GetActualArgumentCount();
+#else
if (it.frame()->has_adapted_arguments()) {
it.AdvanceOneFrame();
DCHECK(it.frame()->is_arguments_adaptor());
}
frame = it.frame();
int args_count = frame->ComputeParametersCount();
+#endif
*total_argc = args_count;
std::unique_ptr<Handle<Object>[]> param_data(
diff --git a/deps/v8/src/runtime/runtime-test.cc b/deps/v8/src/runtime/runtime-test.cc
index 2570385f66..66e522e72e 100644
--- a/deps/v8/src/runtime/runtime-test.cc
+++ b/deps/v8/src/runtime/runtime-test.cc
@@ -26,6 +26,7 @@
#include "src/logging/counters.h"
#include "src/objects/heap-object-inl.h"
#include "src/objects/js-array-inl.h"
+#include "src/objects/js-function-inl.h"
#include "src/objects/js-regexp-inl.h"
#include "src/objects/smi.h"
#include "src/snapshot/snapshot.h"
@@ -1159,7 +1160,10 @@ RUNTIME_FUNCTION(Runtime_IsWasmCode) {
SealHandleScope shs(isolate);
DCHECK_EQ(1, args.length());
CONVERT_ARG_CHECKED(JSFunction, function, 0);
- bool is_js_to_wasm = function.code().kind() == CodeKind::JS_TO_WASM_FUNCTION;
+ bool is_js_to_wasm =
+ function.code().kind() == CodeKind::JS_TO_WASM_FUNCTION ||
+ (function.code().is_builtin() &&
+ function.code().builtin_index() == Builtins::kGenericJSToWasmWrapper);
return isolate->heap()->ToBoolean(is_js_to_wasm);
}
@@ -1252,6 +1256,28 @@ RUNTIME_FUNCTION(Runtime_RegexpHasNativeCode) {
return isolate->heap()->ToBoolean(result);
}
+RUNTIME_FUNCTION(Runtime_RegexpTypeTag) {
+ HandleScope shs(isolate);
+ DCHECK_EQ(1, args.length());
+ CONVERT_ARG_CHECKED(JSRegExp, regexp, 0);
+ const char* type_str;
+ switch (regexp.TypeTag()) {
+ case JSRegExp::NOT_COMPILED:
+ type_str = "NOT_COMPILED";
+ break;
+ case JSRegExp::ATOM:
+ type_str = "ATOM";
+ break;
+ case JSRegExp::IRREGEXP:
+ type_str = "IRREGEXP";
+ break;
+ case JSRegExp::EXPERIMENTAL:
+ type_str = "EXPERIMENTAL";
+ break;
+ }
+ return *isolate->factory()->NewStringFromAsciiChecked(type_str);
+}
+
#define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name) \
RUNTIME_FUNCTION(Runtime_Has##Name) { \
CONVERT_ARG_CHECKED(JSObject, obj, 0); \
@@ -1576,7 +1602,6 @@ RUNTIME_FUNCTION(Runtime_EnableCodeLoggingForTesting) {
Handle<String> source) final {}
void CodeMoveEvent(AbstractCode from, AbstractCode to) final {}
void SharedFunctionInfoMoveEvent(Address from, Address to) final {}
- void NativeContextMoveEvent(Address from, Address to) final {}
void CodeMovingGCEvent() final {}
void CodeDisableOptEvent(Handle<AbstractCode> code,
Handle<SharedFunctionInfo> shared) final {}
diff --git a/deps/v8/src/runtime/runtime-wasm.cc b/deps/v8/src/runtime/runtime-wasm.cc
index a2fb4b36f4..04cb59393f 100644
--- a/deps/v8/src/runtime/runtime-wasm.cc
+++ b/deps/v8/src/runtime/runtime-wasm.cc
@@ -23,6 +23,7 @@
#include "src/wasm/wasm-debug.h"
#include "src/wasm/wasm-engine.h"
#include "src/wasm/wasm-objects.h"
+#include "src/wasm/wasm-subtyping.h"
#include "src/wasm/wasm-value.h"
namespace v8 {
@@ -87,20 +88,23 @@ Object ThrowWasmError(Isolate* isolate, MessageTemplate message) {
}
} // namespace
-RUNTIME_FUNCTION(Runtime_WasmIsValidFuncRefValue) {
+RUNTIME_FUNCTION(Runtime_WasmIsValidRefValue) {
// This code is called from wrappers, so the "thread is wasm" flag is not set.
DCHECK(!trap_handler::IsThreadInWasm());
HandleScope scope(isolate);
- DCHECK_EQ(1, args.length());
- CONVERT_ARG_HANDLE_CHECKED(Object, function, 0);
+ DCHECK_EQ(3, args.length());
+ CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0)
+ CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
+ // Make sure ValueType fits properly in a Smi.
+ STATIC_ASSERT(wasm::ValueType::kLastUsedBit + 1 <= kSmiValueSize);
+ CONVERT_SMI_ARG_CHECKED(raw_type, 2);
- if (function->IsNull(isolate)) {
- return Smi::FromInt(true);
- }
- if (WasmExternalFunction::IsWasmExternalFunction(*function)) {
- return Smi::FromInt(true);
- }
- return Smi::FromInt(false);
+ wasm::ValueType type = wasm::ValueType::FromRawBitField(raw_type);
+ const char* error_message;
+
+ bool result = internal::wasm::TypecheckJSObject(isolate, instance->module(),
+ value, type, &error_message);
+ return Smi::FromInt(result);
}
RUNTIME_FUNCTION(Runtime_WasmMemoryGrow) {
@@ -331,7 +335,11 @@ RUNTIME_FUNCTION(Runtime_WasmFunctionTableGet) {
auto table = handle(
WasmTableObject::cast(instance->tables().get(table_index)), isolate);
// We only use the runtime call for lazily initialized function references.
- DCHECK_EQ(table->type(), wasm::kWasmFuncRef);
+ DCHECK(
+ table->instance().IsUndefined()
+ ? table->type() == wasm::kWasmFuncRef
+ : IsSubtypeOf(table->type(), wasm::kWasmFuncRef,
+ WasmInstanceObject::cast(table->instance()).module()));
if (!WasmTableObject::IsInBounds(isolate, table, entry_index)) {
return ThrowWasmError(isolate, MessageTemplate::kWasmTrapTableOutOfBounds);
@@ -354,7 +362,11 @@ RUNTIME_FUNCTION(Runtime_WasmFunctionTableSet) {
auto table = handle(
WasmTableObject::cast(instance->tables().get(table_index)), isolate);
// We only use the runtime call for function references.
- DCHECK_EQ(table->type(), wasm::kWasmFuncRef);
+ DCHECK(
+ table->instance().IsUndefined()
+ ? table->type() == wasm::kWasmFuncRef
+ : IsSubtypeOf(table->type(), wasm::kWasmFuncRef,
+ WasmInstanceObject::cast(table->instance()).module()));
if (!WasmTableObject::IsInBounds(isolate, table, entry_index)) {
return ThrowWasmError(isolate, MessageTemplate::kWasmTrapTableOutOfBounds);
diff --git a/deps/v8/src/runtime/runtime.h b/deps/v8/src/runtime/runtime.h
index 2772409cdb..667b1f0045 100644
--- a/deps/v8/src/runtime/runtime.h
+++ b/deps/v8/src/runtime/runtime.h
@@ -11,6 +11,7 @@
#include "src/base/bit-field.h"
#include "src/base/platform/time.h"
#include "src/common/globals.h"
+#include "src/handles/handles.h"
#include "src/objects/elements-kind.h"
#include "src/strings/unicode.h"
#include "src/utils/allocation.h"
@@ -304,7 +305,7 @@ namespace internal {
F(GetFunctionName, 1, 1) \
F(GetOwnPropertyDescriptor, 2, 1) \
F(GetOwnPropertyKeys, 2, 1) \
- F(GetProperty, 2, 1) \
+ F(GetProperty, -1 /* [2, 3] */, 1) \
F(HasFastPackedElements, 1, 1) \
F(HasInPrototypeChain, 2, 1) \
I(HasProperty, 2, 1) \
@@ -341,7 +342,7 @@ namespace internal {
I(ToNumber, 1, 1) \
F(ToNumeric, 1, 1) \
I(ToObject, 1, 1) \
- I(ToStringRT, 1, 1) \
+ I(ToString, 1, 1) \
F(TryMigrateInstance, 1, 1)
#define FOR_EACH_INTRINSIC_OPERATORS(F, I) \
@@ -516,6 +517,7 @@ namespace internal {
F(IsWasmTrapHandlerEnabled, 0, 1) \
F(RegexpHasBytecode, 2, 1) \
F(RegexpHasNativeCode, 2, 1) \
+ F(RegexpTypeTag, 1, 1) \
F(MapIteratorProtector, 0, 1) \
F(NeverOptimizeFunction, 1, 1) \
F(NotifyContextDisposed, 0, 1) \
@@ -575,7 +577,7 @@ namespace internal {
F(WasmTableCopy, 6, 1) \
F(WasmTableGrow, 3, 1) \
F(WasmTableFill, 4, 1) \
- F(WasmIsValidFuncRefValue, 1, 1) \
+ F(WasmIsValidRefValue, 3, 1) \
F(WasmCompileLazy, 2, 1) \
F(WasmTriggerTierUp, 1, 1) \
F(WasmDebugBreak, 0, 1) \
@@ -603,6 +605,8 @@ namespace internal {
F(LoadGlobalIC_Slow, 3, 1) \
F(LoadIC_Miss, 4, 1) \
F(LoadNoFeedbackIC_Miss, 4, 1) \
+ F(LoadWithReceiverIC_Miss, 5, 1) \
+ F(LoadWithReceiverNoFeedbackIC_Miss, 3, 1) \
F(LoadPropertyWithInterceptor, 5, 1) \
F(StoreCallbackProperty, 5, 1) \
F(StoreGlobalIC_Miss, 4, 1) \
@@ -753,9 +757,11 @@ class Runtime : public AllStatic {
Handle<Object> value, StoreOrigin store_origin,
Maybe<ShouldThrow> should_throw = Nothing<ShouldThrow>());
+ // When "receiver" is not passed, it defaults to "holder".
V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static MaybeHandle<Object>
- GetObjectProperty(Isolate* isolate, Handle<Object> object, Handle<Object> key,
- bool* is_found_out = nullptr);
+ GetObjectProperty(Isolate* isolate, Handle<Object> holder, Handle<Object> key,
+ Handle<Object> receiver = Handle<Object>(),
+ bool* is_found = nullptr);
V8_WARN_UNUSED_RESULT static MaybeHandle<Object> HasProperty(
Isolate* isolate, Handle<Object> object, Handle<Object> key);
diff --git a/deps/v8/src/snapshot/OWNERS b/deps/v8/src/snapshot/OWNERS
index 921cf7986e..6fa7f3441c 100644
--- a/deps/v8/src/snapshot/OWNERS
+++ b/deps/v8/src/snapshot/OWNERS
@@ -1,6 +1,6 @@
delphick@chromium.org
jgruber@chromium.org
+leszeks@chromium.org
verwaest@chromium.org
-yangguo@chromium.org
# COMPONENT: Blink>JavaScript>Runtime
diff --git a/deps/v8/src/snapshot/code-serializer.cc b/deps/v8/src/snapshot/code-serializer.cc
index f91683d2e4..5eec7668a2 100644
--- a/deps/v8/src/snapshot/code-serializer.cc
+++ b/deps/v8/src/snapshot/code-serializer.cc
@@ -66,7 +66,7 @@ ScriptCompiler::CachedData* CodeSerializer::Serialize(
Handle<String> source(String::cast(script->source()), isolate);
CodeSerializer cs(isolate, SerializedCodeData::SourceHash(
source, script->origin_options()));
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
cs.reference_map()->AddAttachedReference(
reinterpret_cast<void*>(source->ptr()));
ScriptData* script_data = cs.SerializeSharedFunctionInfo(info);
@@ -88,7 +88,7 @@ ScriptCompiler::CachedData* CodeSerializer::Serialize(
ScriptData* CodeSerializer::SerializeSharedFunctionInfo(
Handle<SharedFunctionInfo> info) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
VisitRootPointer(Root::kHandleScope, nullptr,
FullObjectSlot(info.location()));
@@ -384,7 +384,7 @@ MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize(
SharedFunctionInfo::EnsureSourcePositionsAvailable(isolate,
shared_info);
}
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
int line_num =
script->GetLineNumber(shared_info->StartPosition()) + 1;
int column_num =
@@ -407,7 +407,7 @@ MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize(
SerializedCodeData::SerializedCodeData(const std::vector<byte>* payload,
const CodeSerializer* cs) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
std::vector<Reservation> reservations = cs->EncodeReservations();
// Calculate sizes.
@@ -520,7 +520,7 @@ SerializedCodeData::SerializedCodeData(ScriptData* data)
SerializedCodeData SerializedCodeData::FromCachedData(
ScriptData* cached_data, uint32_t expected_source_hash,
SanityCheckResult* rejection_result) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
SerializedCodeData scd(cached_data);
*rejection_result = scd.SanityCheck(expected_source_hash);
if (*rejection_result != CHECK_SUCCESS) {
diff --git a/deps/v8/src/snapshot/context-deserializer.cc b/deps/v8/src/snapshot/context-deserializer.cc
index b6b6da54f9..ae0865ee28 100644
--- a/deps/v8/src/snapshot/context-deserializer.cc
+++ b/deps/v8/src/snapshot/context-deserializer.cc
@@ -42,7 +42,7 @@ MaybeHandle<Object> ContextDeserializer::Deserialize(
Handle<Object> result;
{
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
// Keep track of the code space start and end pointers in case new
// code objects were unserialized
CodeSpace* code_space = isolate->heap()->code_space();
@@ -83,18 +83,15 @@ void ContextDeserializer::SetupOffHeapArrayBufferBackingStores() {
void ContextDeserializer::DeserializeEmbedderFields(
v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer) {
if (!source()->HasMore() || source()->Get() != kEmbedderFieldsData) return;
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
DisallowJavascriptExecution no_js(isolate());
DisallowCompilation no_compile(isolate());
DCHECK_NOT_NULL(embedder_fields_deserializer.callback);
for (int code = source()->Get(); code != kSynchronize;
code = source()->Get()) {
HandleScope scope(isolate());
- int space = code & kSpaceMask;
- DCHECK_LE(space, kNumberOfSpaces);
- DCHECK_EQ(code - space, kNewObject);
- Handle<JSObject> obj(JSObject::cast(GetBackReferencedObject(
- static_cast<SnapshotSpace>(space))),
+ SnapshotSpace space = NewObject::Decode(code);
+ Handle<JSObject> obj(JSObject::cast(GetBackReferencedObject(space)),
isolate());
int index = source()->GetInt();
int size = source()->GetInt();
diff --git a/deps/v8/src/snapshot/context-serializer.cc b/deps/v8/src/snapshot/context-serializer.cc
index 41047aee7b..931ee64176 100644
--- a/deps/v8/src/snapshot/context-serializer.cc
+++ b/deps/v8/src/snapshot/context-serializer.cc
@@ -24,7 +24,7 @@ class SanitizeNativeContextScope final {
public:
SanitizeNativeContextScope(Isolate* isolate, NativeContext native_context,
bool allow_active_isolate_for_testing,
- const DisallowHeapAllocation& no_gc)
+ const DisallowGarbageCollection& no_gc)
: isolate_(isolate),
native_context_(native_context),
microtask_queue_(native_context.microtask_queue()),
@@ -82,7 +82,7 @@ ContextSerializer::~ContextSerializer() {
}
void ContextSerializer::Serialize(Context* o,
- const DisallowHeapAllocation& no_gc) {
+ const DisallowGarbageCollection& no_gc) {
context_ = *o;
DCHECK(context_.IsNativeContext());
@@ -212,7 +212,7 @@ bool ContextSerializer::SerializeJSObjectWithEmbedderFields(Object obj) {
CHECK_GT(embedder_fields_count, 0);
DCHECK(!js_obj.NeedsRehashing());
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
DisallowJavascriptExecution no_js(isolate());
DisallowCompilation no_compile(isolate());
diff --git a/deps/v8/src/snapshot/context-serializer.h b/deps/v8/src/snapshot/context-serializer.h
index 68850ed609..af8de77d80 100644
--- a/deps/v8/src/snapshot/context-serializer.h
+++ b/deps/v8/src/snapshot/context-serializer.h
@@ -23,7 +23,7 @@ class V8_EXPORT_PRIVATE ContextSerializer : public Serializer {
~ContextSerializer() override;
// Serialize the objects reachable from a single object pointer.
- void Serialize(Context* o, const DisallowHeapAllocation& no_gc);
+ void Serialize(Context* o, const DisallowGarbageCollection& no_gc);
bool can_be_rehashed() const { return can_be_rehashed_; }
diff --git a/deps/v8/src/snapshot/deserializer-allocator.cc b/deps/v8/src/snapshot/deserializer-allocator.cc
index a05ef6693c..7ad49b0867 100644
--- a/deps/v8/src/snapshot/deserializer-allocator.cc
+++ b/deps/v8/src/snapshot/deserializer-allocator.cc
@@ -64,6 +64,22 @@ Address DeserializerAllocator::AllocateRaw(SnapshotSpace space, int size) {
}
Address DeserializerAllocator::Allocate(SnapshotSpace space, int size) {
+#ifdef DEBUG
+ if (previous_allocation_start_ != kNullAddress) {
+ // Make sure that the previous allocation is initialized sufficiently to
+ // be iterated over by the GC.
+ Address object_address = previous_allocation_start_;
+ Address previous_allocation_end =
+ previous_allocation_start_ + previous_allocation_size_;
+ while (object_address != previous_allocation_end) {
+ int object_size = HeapObject::FromAddress(object_address).Size();
+ DCHECK_GT(object_size, 0);
+ DCHECK_LE(object_address + object_size, previous_allocation_end);
+ object_address += object_size;
+ }
+ }
+#endif
+
Address address;
HeapObject obj;
// TODO(steveblackburn) Note that the third party heap allocates objects
@@ -80,9 +96,9 @@ Address DeserializerAllocator::Allocate(SnapshotSpace space, int size) {
// abstracting away the details of the memory allocator from this code.
// At each allocation, the regular allocator performs allocation,
// and a fixed-sized table is used to track and fix all back references.
- if (V8_ENABLE_THIRD_PARTY_HEAP_BOOL) return AllocateRaw(space, size);
-
- if (next_alignment_ != kWordAligned) {
+ if (V8_ENABLE_THIRD_PARTY_HEAP_BOOL) {
+ address = AllocateRaw(space, size);
+ } else if (next_alignment_ != kWordAligned) {
const int reserved = size + Heap::GetMaximumFillToAlign(next_alignment_);
address = AllocateRaw(space, reserved);
obj = HeapObject::FromAddress(address);
@@ -95,10 +111,16 @@ Address DeserializerAllocator::Allocate(SnapshotSpace space, int size) {
obj = Heap::AlignWithFiller(roots_, obj, size, reserved, next_alignment_);
address = obj.address();
next_alignment_ = kWordAligned;
- return address;
} else {
- return AllocateRaw(space, size);
+ address = AllocateRaw(space, size);
}
+
+#ifdef DEBUG
+ previous_allocation_start_ = address;
+ previous_allocation_size_ = size;
+#endif
+
+ return address;
}
void DeserializerAllocator::MoveToNextChunk(SnapshotSpace space) {
diff --git a/deps/v8/src/snapshot/deserializer-allocator.h b/deps/v8/src/snapshot/deserializer-allocator.h
index 17d76b6402..403e386fda 100644
--- a/deps/v8/src/snapshot/deserializer-allocator.h
+++ b/deps/v8/src/snapshot/deserializer-allocator.h
@@ -37,20 +37,6 @@ class DeserializerAllocator final {
next_alignment_ = static_cast<AllocationAlignment>(alignment);
}
- void set_next_reference_is_weak(bool next_reference_is_weak) {
- next_reference_is_weak_ = next_reference_is_weak;
- }
-
- bool GetAndClearNextReferenceIsWeak() {
- bool saved = next_reference_is_weak_;
- next_reference_is_weak_ = false;
- return saved;
- }
-
-#ifdef DEBUG
- bool next_reference_is_weak() const { return next_reference_is_weak_; }
-#endif
-
HeapObject GetMap(uint32_t index);
HeapObject GetLargeObject(uint32_t index);
HeapObject GetObject(SnapshotSpace space, uint32_t chunk_index,
@@ -87,9 +73,14 @@ class DeserializerAllocator final {
uint32_t current_chunk_[kNumberOfPreallocatedSpaces];
Address high_water_[kNumberOfPreallocatedSpaces];
+#ifdef DEBUG
+ // Record the previous object allocated for DCHECKs.
+ Address previous_allocation_start_ = kNullAddress;
+ int previous_allocation_size_ = 0;
+#endif
+
// The alignment of the next allocation.
AllocationAlignment next_alignment_ = kWordAligned;
- bool next_reference_is_weak_ = false;
// All required maps are pre-allocated during reservation. {next_map_index_}
// stores the index of the next map to return from allocation.
diff --git a/deps/v8/src/snapshot/deserializer.cc b/deps/v8/src/snapshot/deserializer.cc
index 1faf72d144..132af570b3 100644
--- a/deps/v8/src/snapshot/deserializer.cc
+++ b/deps/v8/src/snapshot/deserializer.cc
@@ -7,6 +7,7 @@
#include "src/base/logging.h"
#include "src/codegen/assembler-inl.h"
#include "src/common/external-pointer.h"
+#include "src/common/globals.h"
#include "src/execution/isolate.h"
#include "src/heap/heap-inl.h"
#include "src/heap/heap-write-barrier-inl.h"
@@ -25,6 +26,7 @@
#include "src/objects/string.h"
#include "src/roots/roots.h"
#include "src/snapshot/embedded/embedded-data.h"
+#include "src/snapshot/serializer-deserializer.h"
#include "src/snapshot/snapshot.h"
#include "src/tracing/trace-event.h"
#include "src/tracing/traced-value.h"
@@ -34,14 +36,14 @@ namespace internal {
template <typename TSlot>
TSlot Deserializer::Write(TSlot dest, MaybeObject value) {
- DCHECK(!allocator()->next_reference_is_weak());
+ DCHECK(!next_reference_is_weak_);
dest.store(value);
return dest + 1;
}
template <typename TSlot>
TSlot Deserializer::WriteAddress(TSlot dest, Address value) {
- DCHECK(!allocator()->next_reference_is_weak());
+ DCHECK(!next_reference_is_weak_);
memcpy(dest.ToVoidPtr(), &value, kSystemPointerSize);
STATIC_ASSERT(IsAligned(kSystemPointerSize, TSlot::kSlotDataSize));
return dest + (kSystemPointerSize / TSlot::kSlotDataSize);
@@ -50,7 +52,7 @@ TSlot Deserializer::WriteAddress(TSlot dest, Address value) {
template <typename TSlot>
TSlot Deserializer::WriteExternalPointer(TSlot dest, Address value) {
value = EncodeExternalPointer(isolate(), value);
- DCHECK(!allocator()->next_reference_is_weak());
+ DCHECK(!next_reference_is_weak_);
memcpy(dest.ToVoidPtr(), &value, kExternalPointerSize);
STATIC_ASSERT(IsAligned(kExternalPointerSize, TSlot::kSlotDataSize));
return dest + (kExternalPointerSize / TSlot::kSlotDataSize);
@@ -101,10 +103,7 @@ Deserializer::~Deserializer() {
// process. It is also called on the body of each function.
void Deserializer::VisitRootPointers(Root root, const char* description,
FullObjectSlot start, FullObjectSlot end) {
- // We are reading to a location outside of JS heap, so pass kNew to avoid
- // triggering write barriers.
- ReadData(FullMaybeObjectSlot(start), FullMaybeObjectSlot(end),
- SnapshotSpace::kNew, kNullAddress);
+ ReadData(FullMaybeObjectSlot(start), FullMaybeObjectSlot(end), kNullAddress);
}
void Deserializer::Synchronize(VisitorSynchronization::SyncTag tag) {
@@ -113,47 +112,16 @@ void Deserializer::Synchronize(VisitorSynchronization::SyncTag tag) {
}
void Deserializer::DeserializeDeferredObjects() {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
for (int code = source_.Get(); code != kSynchronize; code = source_.Get()) {
- switch (code) {
- case kAlignmentPrefix:
- case kAlignmentPrefix + 1:
- case kAlignmentPrefix + 2: {
- int alignment = code - (SerializerDeserializer::kAlignmentPrefix - 1);
- allocator()->SetAlignment(static_cast<AllocationAlignment>(alignment));
- break;
- }
- default: {
- const int space_number = code & kSpaceMask;
- DCHECK_LE(space_number, kNumberOfSpaces);
- DCHECK_EQ(code - space_number, kNewObject);
- SnapshotSpace space = static_cast<SnapshotSpace>(space_number);
- HeapObject object = GetBackReferencedObject(space);
- int size = source_.GetInt() << kTaggedSizeLog2;
- Address obj_address = object.address();
- // Object's map is already initialized, now read the rest.
- MaybeObjectSlot start(obj_address + kTaggedSize);
- MaybeObjectSlot end(obj_address + size);
- bool filled = ReadData(start, end, space, obj_address);
- CHECK(filled);
- DCHECK(CanBeDeferred(object));
- PostProcessNewObject(object, space);
- }
- }
- }
-
- // When the deserialization of maps are deferred, they will be created
- // as filler maps, and we postpone the post processing until the maps
- // are also deserialized.
- for (const auto& pair : fillers_to_post_process_) {
- DCHECK(!pair.first.IsFiller());
- PostProcessNewObject(pair.first, pair.second);
+ SnapshotSpace space = NewObject::Decode(code);
+ ReadObject(space);
}
}
void Deserializer::LogNewMapEvents() {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
for (Map map : new_maps_) {
DCHECK(FLAG_trace_maps);
LOG(isolate(), MapCreate(map));
@@ -162,7 +130,7 @@ void Deserializer::LogNewMapEvents() {
}
void Deserializer::LogScriptEvents(Script script) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
LOG(isolate(),
ScriptEvent(Logger::ScriptEventType::kDeserialize, script.id()));
LOG(isolate(), ScriptDetails(script));
@@ -191,14 +159,10 @@ uint32_t StringTableInsertionKey::ComputeHashField(String string) {
HeapObject Deserializer::PostProcessNewObject(HeapObject obj,
SnapshotSpace space) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
if ((FLAG_rehash_snapshot && can_rehash_) || deserializing_user_code()) {
- if (obj.IsFiller()) {
- DCHECK_EQ(fillers_to_post_process_.find(obj),
- fillers_to_post_process_.end());
- fillers_to_post_process_.insert({obj, space});
- } else if (obj.IsString()) {
+ if (obj.IsString()) {
// Uninitialize hash field as we need to recompute the hash.
String string = String::cast(obj);
string.set_hash_field(String::kEmptyHashField);
@@ -330,6 +294,14 @@ HeapObject Deserializer::PostProcessNewObject(HeapObject obj,
return obj;
}
+HeapObjectReferenceType Deserializer::GetAndResetNextReferenceType() {
+ HeapObjectReferenceType type = next_reference_is_weak_
+ ? HeapObjectReferenceType::WEAK
+ : HeapObjectReferenceType::STRONG;
+ next_reference_is_weak_ = false;
+ return type;
+}
+
HeapObject Deserializer::GetBackReferencedObject(SnapshotSpace space) {
HeapObject obj;
switch (space) {
@@ -371,20 +343,39 @@ HeapObject Deserializer::GetBackReferencedObject(SnapshotSpace space) {
HeapObject Deserializer::ReadObject() {
MaybeObject object;
- // We are reading to a location outside of JS heap, so pass kNew to avoid
- // triggering write barriers.
- bool filled =
- ReadData(FullMaybeObjectSlot(&object), FullMaybeObjectSlot(&object + 1),
- SnapshotSpace::kNew, kNullAddress);
- CHECK(filled);
+ ReadData(FullMaybeObjectSlot(&object), FullMaybeObjectSlot(&object + 1),
+ kNullAddress);
return object.GetHeapObjectAssumeStrong();
}
HeapObject Deserializer::ReadObject(SnapshotSpace space) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
const int size = source_.GetInt() << kObjectAlignmentBits;
+ // The map can't be a forward ref. If you want the map to be a forward ref,
+ // then you're probably serializing the meta-map, in which case you want to
+ // use the kNewMetaMap bytecode.
+ DCHECK_NE(source()->Peek(), kRegisterPendingForwardRef);
+ Map map = Map::cast(ReadObject());
+
+ // The serializer allocated the object now, so the next bytecodes might be an
+ // alignment prefix and/or a next chunk
+ if (base::IsInRange<byte, byte>(source()->Peek(), kAlignmentPrefix,
+ kAlignmentPrefix + 2)) {
+ int alignment = source()->Get() - (kAlignmentPrefix - 1);
+ allocator()->SetAlignment(static_cast<AllocationAlignment>(alignment));
+ }
+ if (source()->Peek() == kNextChunk) {
+ source()->Advance(1);
+ // The next byte is the space for the next chunk -- it should match the
+ // current space.
+ // TODO(leszeks): Remove the next chunk space entirely.
+ DCHECK_EQ(static_cast<SnapshotSpace>(source()->Peek()), space);
+ source()->Advance(1);
+ allocator()->MoveToNextChunk(space);
+ }
+
Address address = allocator()->Allocate(space, size);
HeapObject obj = HeapObject::FromAddress(address);
@@ -392,10 +383,9 @@ HeapObject Deserializer::ReadObject(SnapshotSpace space) {
MaybeObjectSlot current(address);
MaybeObjectSlot limit(address + size);
- if (ReadData(current, limit, space, address)) {
- // Only post process if object content has not been deferred.
- obj = PostProcessNewObject(obj, space);
- }
+ current.store(MaybeObject::FromObject(map));
+ ReadData(current + 1, limit, address);
+ obj = PostProcessNewObject(obj, space);
#ifdef DEBUG
if (obj.IsCode()) {
@@ -408,15 +398,34 @@ HeapObject Deserializer::ReadObject(SnapshotSpace space) {
return obj;
}
-void Deserializer::ReadCodeObjectBody(SnapshotSpace space,
- Address code_object_address) {
+HeapObject Deserializer::ReadMetaMap() {
+ DisallowHeapAllocation no_gc;
+
+ const SnapshotSpace space = SnapshotSpace::kReadOnlyHeap;
+ const int size = Map::kSize;
+
+ Address address = allocator()->Allocate(space, size);
+ HeapObject obj = HeapObject::FromAddress(address);
+
+ isolate()->heap()->OnAllocationEvent(obj, size);
+ MaybeObjectSlot current(address);
+ MaybeObjectSlot limit(address + size);
+
+ current.store(MaybeObject(current.address() + kHeapObjectTag));
+ // Set the instance-type manually, to allow backrefs to read it.
+ Map::unchecked_cast(obj).set_instance_type(MAP_TYPE);
+ ReadData(current + 1, limit, address);
+
+ return obj;
+}
+
+void Deserializer::ReadCodeObjectBody(Address code_object_address) {
// At this point the code object is already allocated, its map field is
// initialized and its raw data fields and code stream are also read.
// Now we read the rest of code header's fields.
MaybeObjectSlot current(code_object_address + HeapObject::kHeaderSize);
MaybeObjectSlot limit(code_object_address + Code::kDataStart);
- bool filled = ReadData(current, limit, space, code_object_address);
- CHECK(filled);
+ ReadData(current, limit, code_object_address);
// Now iterate RelocInfos the same way it was done by the serialzier and
// deserialize respective data into RelocInfos.
@@ -508,284 +517,322 @@ TSlot Deserializer::ReadRepeatedObject(TSlot current, int repeat_count) {
return current;
}
-static void NoExternalReferencesCallback() {
+namespace {
+
+void NoExternalReferencesCallback() {
// The following check will trigger if a function or object template
// with references to native functions have been deserialized from
// snapshot, but no actual external references were provided when the
// isolate was created.
- CHECK_WITH_MSG(false, "No external references provided via API");
+ FATAL("No external references provided via API");
}
+// Template used by the below CASE_RANGE macro to statically verify that the
+// given number of cases matches the number of expected cases for that bytecode.
+template <int byte_code_count, int expected>
+constexpr byte VerifyBytecodeCount(byte bytecode) {
+ STATIC_ASSERT(byte_code_count == expected);
+ return bytecode;
+}
+
+} // namespace
+
+// Helper macro (and its implementation detail) for specifying a range of cases.
+// Use as "case CASE_RANGE(byte_code, num_bytecodes):"
+#define CASE_RANGE(byte_code, num_bytecodes) \
+ CASE_R##num_bytecodes( \
+ (VerifyBytecodeCount<byte_code##Count, num_bytecodes>(byte_code)))
+#define CASE_R1(byte_code) byte_code
+#define CASE_R2(byte_code) CASE_R1(byte_code) : case CASE_R1(byte_code + 1)
+#define CASE_R3(byte_code) CASE_R2(byte_code) : case CASE_R1(byte_code + 2)
+#define CASE_R4(byte_code) CASE_R2(byte_code) : case CASE_R2(byte_code + 2)
+#define CASE_R8(byte_code) CASE_R4(byte_code) : case CASE_R4(byte_code + 4)
+#define CASE_R16(byte_code) CASE_R8(byte_code) : case CASE_R8(byte_code + 8)
+#define CASE_R32(byte_code) CASE_R16(byte_code) : case CASE_R16(byte_code + 16)
+
+// This generates a case range for all the spaces.
+#define CASE_RANGE_ALL_SPACES(bytecode) \
+ SpaceEncoder<bytecode>::Encode(SnapshotSpace::kOld) \
+ : case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kCode) \
+ : case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kMap) \
+ : case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kLargeObject) \
+ : case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kReadOnlyHeap)
+
template <typename TSlot>
-bool Deserializer::ReadData(TSlot current, TSlot limit,
- SnapshotSpace source_space,
+void Deserializer::ReadData(TSlot current, TSlot limit,
Address current_object_address) {
- // Write barrier support costs around 1% in startup time. In fact there
- // are no new space objects in current boot snapshots, so it's not needed,
- // but that may change.
- bool write_barrier_needed =
- (current_object_address != kNullAddress &&
- source_space != SnapshotSpace::kNew &&
- source_space != SnapshotSpace::kCode && !FLAG_disable_write_barriers);
while (current < limit) {
byte data = source_.Get();
- switch (data) {
-#define CASE_STATEMENT(bytecode, snapshot_space) \
- case bytecode + static_cast<int>(snapshot_space): \
- STATIC_ASSERT((static_cast<int>(snapshot_space) & ~kSpaceMask) == 0);
-
-#define CASE_BODY(bytecode, space_number_if_any) \
- current = ReadDataCase<TSlot, bytecode, space_number_if_any>( \
- current, current_object_address, data, write_barrier_needed); \
- break;
-
-// This generates a case and a body for the new space (which has to do extra
-// write barrier handling) and handles the other spaces with fall-through cases
-// and one body.
-#define ALL_SPACES(bytecode) \
- CASE_STATEMENT(bytecode, SnapshotSpace::kNew) \
- CASE_BODY(bytecode, SnapshotSpace::kNew) \
- CASE_STATEMENT(bytecode, SnapshotSpace::kOld) \
- V8_FALLTHROUGH; \
- CASE_STATEMENT(bytecode, SnapshotSpace::kCode) \
- V8_FALLTHROUGH; \
- CASE_STATEMENT(bytecode, SnapshotSpace::kMap) \
- V8_FALLTHROUGH; \
- CASE_STATEMENT(bytecode, SnapshotSpace::kLargeObject) \
- V8_FALLTHROUGH; \
- CASE_STATEMENT(bytecode, SnapshotSpace::kReadOnlyHeap) \
- CASE_BODY(bytecode, kAnyOldSpace)
-
-#define FOUR_CASES(byte_code) \
- case byte_code: \
- case byte_code + 1: \
- case byte_code + 2: \
- case byte_code + 3:
-
-#define SIXTEEN_CASES(byte_code) \
- FOUR_CASES(byte_code) \
- FOUR_CASES(byte_code + 4) \
- FOUR_CASES(byte_code + 8) \
- FOUR_CASES(byte_code + 12)
-
-#define SINGLE_CASE(bytecode, space) \
- CASE_STATEMENT(bytecode, space) \
- CASE_BODY(bytecode, space)
-
- // Deserialize a new object and write a pointer to it to the current
- // object.
- ALL_SPACES(kNewObject)
- // Find a recently deserialized object using its offset from the current
- // allocation point and write a pointer to it to the current object.
- ALL_SPACES(kBackref)
- // Find an object in the roots array and write a pointer to it to the
- // current object.
- SINGLE_CASE(kRootArray, SnapshotSpace::kReadOnlyHeap)
- // Find an object in the startup object cache and write a pointer to it
- // to the current object.
- SINGLE_CASE(kStartupObjectCache, SnapshotSpace::kReadOnlyHeap)
- // Find an object in the read-only object cache and write a pointer to it
- // to the current object.
- SINGLE_CASE(kReadOnlyObjectCache, SnapshotSpace::kReadOnlyHeap)
- // Find an object in the attached references and write a pointer to it to
- // the current object.
- SINGLE_CASE(kAttachedReference, SnapshotSpace::kReadOnlyHeap)
-
-#undef CASE_STATEMENT
-#undef CASE_BODY
-#undef ALL_SPACES
-
- // Find an external reference and write a pointer to it to the current
- // object.
- case kSandboxedExternalReference:
- case kExternalReference: {
- Address address = ReadExternalReferenceCase();
- if (V8_HEAP_SANDBOX_BOOL && data == kSandboxedExternalReference) {
- current = WriteExternalPointer(current, address);
- } else {
- DCHECK(!V8_HEAP_SANDBOX_BOOL);
- current = WriteAddress(current, address);
- }
- break;
- }
+ current = ReadSingleBytecodeData(data, current, current_object_address);
+ }
+ CHECK_EQ(limit, current);
+}
- case kInternalReference:
- case kOffHeapTarget: {
- // These bytecodes are expected only during RelocInfo iteration.
- UNREACHABLE();
- break;
- }
+template <typename TSlot>
+TSlot Deserializer::ReadSingleBytecodeData(byte data, TSlot current,
+ Address current_object_address) {
+ switch (data) {
+ // Deserialize a new object and write a pointer to it to the current
+ // object.
+ case CASE_RANGE_ALL_SPACES(kNewObject): {
+ SnapshotSpace space = NewObject::Decode(data);
+ // Save the reference type before recursing down into reading the object.
+ HeapObjectReferenceType ref_type = GetAndResetNextReferenceType();
+ HeapObject heap_object = ReadObject(space);
+ DCHECK(!Heap::InYoungGeneration(heap_object));
+ return Write(current, HeapObjectReference::From(heap_object, ref_type));
+ }
- case kNop:
- break;
+ // Find a recently deserialized object using its offset from the current
+ // allocation point and write a pointer to it to the current object.
+ case CASE_RANGE_ALL_SPACES(kBackref): {
+ SnapshotSpace space = BackRef::Decode(data);
+ HeapObject heap_object = GetBackReferencedObject(space);
+ DCHECK(!Heap::InYoungGeneration(heap_object));
+ return Write(current, HeapObjectReference::From(
+ heap_object, GetAndResetNextReferenceType()));
+ }
- case kNextChunk: {
- int space = source_.Get();
- allocator()->MoveToNextChunk(static_cast<SnapshotSpace>(space));
- break;
- }
+ // Find an object in the roots array and write a pointer to it to the
+ // current object.
+ case kRootArray: {
+ int id = source_.GetInt();
+ RootIndex root_index = static_cast<RootIndex>(id);
+ HeapObject heap_object = HeapObject::cast(isolate()->root(root_index));
+ DCHECK(!Heap::InYoungGeneration(heap_object));
+ hot_objects_.Add(heap_object);
+ return Write(current, HeapObjectReference::From(
+ heap_object, GetAndResetNextReferenceType()));
+ }
- case kDeferred: {
- // Deferred can only occur right after the heap object header.
- DCHECK_EQ(current.address(), current_object_address + kTaggedSize);
- HeapObject obj = HeapObject::FromAddress(current_object_address);
- // If the deferred object is a map, its instance type may be used
- // during deserialization. Initialize it with a temporary value.
- if (obj.IsMap()) Map::cast(obj).set_instance_type(FILLER_TYPE);
- current = limit;
- return false;
- }
+ // Find an object in the startup object cache and write a pointer to it to
+ // the current object.
+ case kStartupObjectCache: {
+ int cache_index = source_.GetInt();
+ HeapObject heap_object =
+ HeapObject::cast(isolate()->startup_object_cache()->at(cache_index));
+ DCHECK(!Heap::InYoungGeneration(heap_object));
+ return Write(current, HeapObjectReference::From(
+ heap_object, GetAndResetNextReferenceType()));
+ }
- case kSynchronize:
- // If we get here then that indicates that you have a mismatch between
- // the number of GC roots when serializing and deserializing.
- UNREACHABLE();
-
- // Deserialize raw data of variable length.
- case kVariableRawData: {
- int size_in_bytes = source_.GetInt();
- DCHECK(IsAligned(size_in_bytes, kTaggedSize));
- source_.CopyRaw(current.ToVoidPtr(), size_in_bytes);
- current = TSlot(current.address() + size_in_bytes);
- break;
- }
+ // Find an object in the read-only object cache and write a pointer to it
+ // to the current object.
+ case kReadOnlyObjectCache: {
+ int cache_index = source_.GetInt();
+ HeapObject heap_object = HeapObject::cast(
+ isolate()->read_only_heap()->cached_read_only_object(cache_index));
+ DCHECK(!Heap::InYoungGeneration(heap_object));
+ return Write(current, HeapObjectReference::From(
+ heap_object, GetAndResetNextReferenceType()));
+ }
- // Deserialize raw code directly into the body of the code object.
- case kVariableRawCode: {
- // VariableRawCode can only occur right after the heap object header.
- DCHECK_EQ(current.address(), current_object_address + kTaggedSize);
- int size_in_bytes = source_.GetInt();
- DCHECK(IsAligned(size_in_bytes, kTaggedSize));
- source_.CopyRaw(
- reinterpret_cast<void*>(current_object_address + Code::kDataStart),
- size_in_bytes);
- // Deserialize tagged fields in the code object header and reloc infos.
- ReadCodeObjectBody(source_space, current_object_address);
- // Set current to the code object end.
- current = TSlot(current.address() + Code::kDataStart -
- HeapObject::kHeaderSize + size_in_bytes);
- CHECK_EQ(current, limit);
- break;
- }
+ // Deserialize a new meta-map and write a pointer to it to the current
+ // object.
+ case kNewMetaMap: {
+ HeapObject heap_object = ReadMetaMap();
+ DCHECK(!Heap::InYoungGeneration(heap_object));
+ return Write(current, HeapObjectReference::Strong(heap_object));
+ }
- case kVariableRepeat: {
- int repeats = DecodeVariableRepeatCount(source_.GetInt());
- current = ReadRepeatedObject(current, repeats);
- break;
+ // Find an external reference and write a pointer to it to the current
+ // object.
+ case kSandboxedExternalReference:
+ case kExternalReference: {
+ Address address = ReadExternalReferenceCase();
+ if (V8_HEAP_SANDBOX_BOOL && data == kSandboxedExternalReference) {
+ return WriteExternalPointer(current, address);
+ } else {
+ DCHECK(!V8_HEAP_SANDBOX_BOOL);
+ return WriteAddress(current, address);
}
+ }
- case kOffHeapBackingStore: {
- AlwaysAllocateScope scope(isolate()->heap());
- int byte_length = source_.GetInt();
- std::unique_ptr<BackingStore> backing_store = BackingStore::Allocate(
- isolate(), byte_length, SharedFlag::kNotShared,
- InitializedFlag::kUninitialized);
- CHECK_NOT_NULL(backing_store);
- source_.CopyRaw(backing_store->buffer_start(), byte_length);
- backing_stores_.push_back(std::move(backing_store));
- break;
+ case kInternalReference:
+ case kOffHeapTarget:
+ // These bytecodes are expected only during RelocInfo iteration.
+ UNREACHABLE();
+
+ // Find an object in the attached references and write a pointer to it to
+ // the current object.
+ case kAttachedReference: {
+ int index = source_.GetInt();
+ HeapObjectReference ref = HeapObjectReference::From(
+ *attached_objects_[index], GetAndResetNextReferenceType());
+
+ // This is the only case where we might encounter new space objects, so
+ // maybe emit a write barrier before returning the updated slot.
+ TSlot ret = Write(current, ref);
+ if (Heap::InYoungGeneration(ref)) {
+ HeapObject current_object =
+ HeapObject::FromAddress(current_object_address);
+ GenerationalBarrier(current_object, MaybeObjectSlot(current.address()),
+ ref);
}
+ return ret;
+ }
- case kSandboxedApiReference:
- case kApiReference: {
- uint32_t reference_id = static_cast<uint32_t>(source_.GetInt());
- Address address;
- if (isolate()->api_external_references()) {
- DCHECK_WITH_MSG(
- reference_id < num_api_references_,
- "too few external references provided through the API");
- address = static_cast<Address>(
- isolate()->api_external_references()[reference_id]);
- } else {
- address = reinterpret_cast<Address>(NoExternalReferencesCallback);
- }
- if (V8_HEAP_SANDBOX_BOOL && data == kSandboxedApiReference) {
- current = WriteExternalPointer(current, address);
- } else {
- DCHECK(!V8_HEAP_SANDBOX_BOOL);
- current = WriteAddress(current, address);
- }
- break;
+ case kNop:
+ return current;
+
+ // NextChunk should only be seen during object allocation.
+ case kNextChunk:
+ UNREACHABLE();
+
+ case kRegisterPendingForwardRef: {
+ DCHECK_NE(current_object_address, kNullAddress);
+ HeapObject obj = HeapObject::FromAddress(current_object_address);
+ HeapObjectReferenceType ref_type = GetAndResetNextReferenceType();
+ unresolved_forward_refs_.emplace_back(
+ obj, current.address() - current_object_address, ref_type);
+ num_unresolved_forward_refs_++;
+ return current + 1;
+ }
+
+ case kResolvePendingForwardRef: {
+ // Pending forward refs can only be resolved after the heap object's map
+ // field is deserialized; currently they only appear immediately after
+ // the map field.
+ DCHECK_EQ(current.address(), current_object_address + kTaggedSize);
+ HeapObject obj = HeapObject::FromAddress(current_object_address);
+ int index = source_.GetInt();
+ auto& forward_ref = unresolved_forward_refs_[index];
+ TaggedField<MaybeObject>::store(
+ forward_ref.object, forward_ref.offset,
+ HeapObjectReference::From(obj, forward_ref.ref_type));
+ num_unresolved_forward_refs_--;
+ if (num_unresolved_forward_refs_ == 0) {
+ // If there's no more pending fields, clear the entire pending field
+ // vector.
+ unresolved_forward_refs_.clear();
+ } else {
+ // Otherwise, at least clear the pending field.
+ forward_ref.object = HeapObject();
}
+ return current;
+ }
- case kClearedWeakReference:
- current = Write(current, HeapObjectReference::ClearedValue(isolate()));
- break;
-
- case kWeakPrefix:
- DCHECK(!allocator()->next_reference_is_weak());
- allocator()->set_next_reference_is_weak(true);
- break;
-
- case kAlignmentPrefix:
- case kAlignmentPrefix + 1:
- case kAlignmentPrefix + 2: {
- int alignment = data - (SerializerDeserializer::kAlignmentPrefix - 1);
- allocator()->SetAlignment(static_cast<AllocationAlignment>(alignment));
- break;
+ case kSynchronize:
+ // If we get here then that indicates that you have a mismatch between
+ // the number of GC roots when serializing and deserializing.
+ UNREACHABLE();
+
+ // Deserialize raw data of variable length.
+ case kVariableRawData: {
+ int size_in_bytes = source_.GetInt();
+ DCHECK(IsAligned(size_in_bytes, kTaggedSize));
+ source_.CopyRaw(current.ToVoidPtr(), size_in_bytes);
+ return TSlot(current.address() + size_in_bytes);
+ }
+
+ // Deserialize raw code directly into the body of the code object.
+ case kVariableRawCode: {
+ // VariableRawCode can only occur right after the heap object header.
+ DCHECK_EQ(current.address(), current_object_address + kTaggedSize);
+ int size_in_bytes = source_.GetInt();
+ DCHECK(IsAligned(size_in_bytes, kTaggedSize));
+ source_.CopyRaw(
+ reinterpret_cast<void*>(current_object_address + Code::kDataStart),
+ size_in_bytes);
+ // Deserialize tagged fields in the code object header and reloc infos.
+ ReadCodeObjectBody(current_object_address);
+ // Set current to the code object end.
+ return TSlot(current.address() + Code::kDataStart -
+ HeapObject::kHeaderSize + size_in_bytes);
+ }
+
+ case kVariableRepeat: {
+ int repeats = VariableRepeatCount::Decode(source_.GetInt());
+ return ReadRepeatedObject(current, repeats);
+ }
+
+ case kOffHeapBackingStore: {
+ AlwaysAllocateScope scope(isolate()->heap());
+ int byte_length = source_.GetInt();
+ std::unique_ptr<BackingStore> backing_store =
+ BackingStore::Allocate(isolate(), byte_length, SharedFlag::kNotShared,
+ InitializedFlag::kUninitialized);
+ CHECK_NOT_NULL(backing_store);
+ source_.CopyRaw(backing_store->buffer_start(), byte_length);
+ backing_stores_.push_back(std::move(backing_store));
+ return current;
+ }
+
+ case kSandboxedApiReference:
+ case kApiReference: {
+ uint32_t reference_id = static_cast<uint32_t>(source_.GetInt());
+ Address address;
+ if (isolate()->api_external_references()) {
+ DCHECK_WITH_MSG(reference_id < num_api_references_,
+ "too few external references provided through the API");
+ address = static_cast<Address>(
+ isolate()->api_external_references()[reference_id]);
+ } else {
+ address = reinterpret_cast<Address>(NoExternalReferencesCallback);
}
+ if (V8_HEAP_SANDBOX_BOOL && data == kSandboxedApiReference) {
+ return WriteExternalPointer(current, address);
+ } else {
+ DCHECK(!V8_HEAP_SANDBOX_BOOL);
+ return WriteAddress(current, address);
+ }
+ }
+
+ case kClearedWeakReference:
+ return Write(current, HeapObjectReference::ClearedValue(isolate()));
+
+ case kWeakPrefix: {
+ // We shouldn't have two weak prefixes in a row.
+ DCHECK(!next_reference_is_weak_);
+ // We shouldn't have weak refs without a current object.
+ DCHECK_NE(current_object_address, kNullAddress);
+ next_reference_is_weak_ = true;
+ return current;
+ }
- // First kNumberOfRootArrayConstants roots are guaranteed to be in
+ case CASE_RANGE(kAlignmentPrefix, 3): {
+ int alignment = data - (SerializerDeserializer::kAlignmentPrefix - 1);
+ allocator()->SetAlignment(static_cast<AllocationAlignment>(alignment));
+ return current;
+ }
+
+ case CASE_RANGE(kRootArrayConstants, 32): {
+ // First kRootArrayConstantsCount roots are guaranteed to be in
// the old space.
- STATIC_ASSERT(
- static_cast<int>(RootIndex::kFirstImmortalImmovableRoot) == 0);
- STATIC_ASSERT(kNumberOfRootArrayConstants <=
+ STATIC_ASSERT(static_cast<int>(RootIndex::kFirstImmortalImmovableRoot) ==
+ 0);
+ STATIC_ASSERT(kRootArrayConstantsCount <=
static_cast<int>(RootIndex::kLastImmortalImmovableRoot));
- STATIC_ASSERT(kNumberOfRootArrayConstants == 32);
- SIXTEEN_CASES(kRootArrayConstants)
- SIXTEEN_CASES(kRootArrayConstants + 16) {
- int id = data & kRootArrayConstantsMask;
- RootIndex root_index = static_cast<RootIndex>(id);
- MaybeObject object =
- MaybeObject(ReadOnlyRoots(isolate()).at(root_index));
- DCHECK(!Heap::InYoungGeneration(object));
- current = Write(current, object);
- break;
- }
- STATIC_ASSERT(kNumberOfHotObjects == 8);
- FOUR_CASES(kHotObject)
- FOUR_CASES(kHotObject + 4) {
- int index = data & kHotObjectMask;
- Object hot_object = hot_objects_.Get(index);
- MaybeObject hot_maybe_object = MaybeObject::FromObject(hot_object);
- if (allocator()->GetAndClearNextReferenceIsWeak()) {
- hot_maybe_object = MaybeObject::MakeWeak(hot_maybe_object);
- }
- // Don't update current pointer here as it may be needed for write
- // barrier.
- Write(current, hot_maybe_object);
- if (write_barrier_needed && Heap::InYoungGeneration(hot_object)) {
- HeapObject current_object =
- HeapObject::FromAddress(current_object_address);
- GenerationalBarrier(current_object,
- MaybeObjectSlot(current.address()),
- hot_maybe_object);
- }
- ++current;
- break;
- }
+ RootIndex root_index = RootArrayConstant::Decode(data);
+ MaybeObject object = MaybeObject(ReadOnlyRoots(isolate()).at(root_index));
+ DCHECK(!Heap::InYoungGeneration(object));
+ return Write(current, object);
+ }
+ case CASE_RANGE(kHotObject, 8): {
+ int index = HotObject::Decode(data);
+ HeapObject hot_object = hot_objects_.Get(index);
+ DCHECK(!Heap::InYoungGeneration(hot_object));
+ return Write(current, HeapObjectReference::From(
+ hot_object, GetAndResetNextReferenceType()));
+ }
+
+ case CASE_RANGE(kFixedRawData, 32): {
// Deserialize raw data of fixed length from 1 to 32 times kTaggedSize.
- STATIC_ASSERT(kNumberOfFixedRawData == 32);
- SIXTEEN_CASES(kFixedRawData)
- SIXTEEN_CASES(kFixedRawData + 16) {
- int size_in_tagged = data - kFixedRawDataStart;
- source_.CopyRaw(current.ToVoidPtr(), size_in_tagged * kTaggedSize);
-
- int size_in_bytes = size_in_tagged * kTaggedSize;
- int size_in_slots = size_in_bytes / TSlot::kSlotDataSize;
- DCHECK(IsAligned(size_in_bytes, TSlot::kSlotDataSize));
- current += size_in_slots;
- break;
- }
+ int size_in_tagged = FixedRawDataWithSize::Decode(data);
+ source_.CopyRaw(current.ToVoidPtr(), size_in_tagged * kTaggedSize);
- STATIC_ASSERT(kNumberOfFixedRepeat == 16);
- SIXTEEN_CASES(kFixedRepeat) {
- int repeats = DecodeFixedRepeatCount(data);
- current = ReadRepeatedObject(current, repeats);
- break;
- }
+ int size_in_bytes = size_in_tagged * kTaggedSize;
+ int size_in_slots = size_in_bytes / TSlot::kSlotDataSize;
+ DCHECK(IsAligned(size_in_bytes, TSlot::kSlotDataSize));
+ return current + size_in_slots;
+ }
+
+ case CASE_RANGE(kFixedRepeat, 16): {
+ int repeats = FixedRepeatWithCount::Decode(data);
+ return ReadRepeatedObject(current, repeats);
+ }
#ifdef DEBUG
#define UNUSED_CASE(byte_code) \
@@ -794,80 +841,28 @@ bool Deserializer::ReadData(TSlot current, TSlot limit,
UNUSED_SERIALIZER_BYTE_CODES(UNUSED_CASE)
#endif
#undef UNUSED_CASE
-
-#undef SIXTEEN_CASES
-#undef FOUR_CASES
-#undef SINGLE_CASE
- }
}
- CHECK_EQ(limit, current);
- return true;
+
+ // The above switch, including UNUSED_SERIALIZER_BYTE_CODES, covers all
+ // possible bytecodes; but, clang doesn't realize this, so we have an explicit
+ // UNREACHABLE here too.
+ UNREACHABLE();
}
+#undef CASE_RANGE_ALL_SPACES
+#undef CASE_RANGE
+#undef CASE_R32
+#undef CASE_R16
+#undef CASE_R8
+#undef CASE_R4
+#undef CASE_R3
+#undef CASE_R2
+#undef CASE_R1
+
Address Deserializer::ReadExternalReferenceCase() {
uint32_t reference_id = static_cast<uint32_t>(source_.GetInt());
return isolate()->external_reference_table()->address(reference_id);
}
-template <typename TSlot, SerializerDeserializer::Bytecode bytecode,
- SnapshotSpace space_number_if_any>
-TSlot Deserializer::ReadDataCase(TSlot current, Address current_object_address,
- byte data, bool write_barrier_needed) {
- bool emit_write_barrier = false;
- SnapshotSpace space = static_cast<SnapshotSpace>(
- space_number_if_any == kAnyOldSpace
- ? static_cast<SnapshotSpace>(data & kSpaceMask)
- : space_number_if_any);
- HeapObject heap_object;
- HeapObjectReferenceType reference_type =
- allocator()->GetAndClearNextReferenceIsWeak()
- ? HeapObjectReferenceType::WEAK
- : HeapObjectReferenceType::STRONG;
-
- if (bytecode == kNewObject) {
- heap_object = ReadObject(space);
- emit_write_barrier = (space == SnapshotSpace::kNew);
- } else if (bytecode == kBackref) {
- heap_object = GetBackReferencedObject(space);
- emit_write_barrier = (space == SnapshotSpace::kNew);
- } else if (bytecode == kRootArray) {
- int id = source_.GetInt();
- RootIndex root_index = static_cast<RootIndex>(id);
- heap_object = HeapObject::cast(isolate()->root(root_index));
- emit_write_barrier = Heap::InYoungGeneration(heap_object);
- hot_objects_.Add(heap_object);
- } else if (bytecode == kReadOnlyObjectCache) {
- int cache_index = source_.GetInt();
- heap_object = HeapObject::cast(
- isolate()->read_only_heap()->cached_read_only_object(cache_index));
- DCHECK(!Heap::InYoungGeneration(heap_object));
- emit_write_barrier = false;
- } else if (bytecode == kStartupObjectCache) {
- int cache_index = source_.GetInt();
- heap_object =
- HeapObject::cast(isolate()->startup_object_cache()->at(cache_index));
- emit_write_barrier = Heap::InYoungGeneration(heap_object);
- } else {
- DCHECK_EQ(bytecode, kAttachedReference);
- int index = source_.GetInt();
- heap_object = *attached_objects_[index];
- emit_write_barrier = Heap::InYoungGeneration(heap_object);
- }
- HeapObjectReference heap_object_ref =
- reference_type == HeapObjectReferenceType::STRONG
- ? HeapObjectReference::Strong(heap_object)
- : HeapObjectReference::Weak(heap_object);
- // Don't update current pointer here as it may be needed for write barrier.
- Write(current, heap_object_ref);
- if (emit_write_barrier && write_barrier_needed) {
- DCHECK_IMPLIES(FLAG_disable_write_barriers, !write_barrier_needed);
- HeapObject host_object = HeapObject::FromAddress(current_object_address);
- SLOW_DCHECK(isolate()->heap()->Contains(host_object));
- GenerationalBarrier(host_object, MaybeObjectSlot(current.address()),
- heap_object_ref);
- }
- return current + 1;
-}
-
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/snapshot/deserializer.h b/deps/v8/src/snapshot/deserializer.h
index 2e762cab70..ae410bacd3 100644
--- a/deps/v8/src/snapshot/deserializer.h
+++ b/deps/v8/src/snapshot/deserializer.h
@@ -8,6 +8,7 @@
#include <utility>
#include <vector>
+#include "src/common/globals.h"
#include "src/objects/allocation-site.h"
#include "src/objects/api-callbacks.h"
#include "src/objects/backing-store.h"
@@ -126,33 +127,37 @@ class V8_EXPORT_PRIVATE Deserializer : public SerializerDeserializer {
inline TSlot Write(TSlot dest, MaybeObject value);
template <typename TSlot>
+ inline TSlot Write(TSlot dest, HeapObject value,
+ HeapObjectReferenceType type);
+
+ template <typename TSlot>
inline TSlot WriteAddress(TSlot dest, Address value);
template <typename TSlot>
inline TSlot WriteExternalPointer(TSlot dest, Address value);
- // Fills in some heap data in an area from start to end (non-inclusive). The
- // space id is used for the write barrier. The object_address is the address
- // of the object we are writing into, or nullptr if we are not writing into an
- // object, i.e. if we are writing a series of tagged values that are not on
- // the heap. Return false if the object content has been deferred.
+ // Fills in some heap data in an area from start to end (non-inclusive). The
+ // object_address is the address of the object we are writing into, or nullptr
+ // if we are not writing into an object, i.e. if we are writing a series of
+ // tagged values that are not on the heap.
template <typename TSlot>
- bool ReadData(TSlot start, TSlot end, SnapshotSpace space,
- Address object_address);
+ void ReadData(TSlot start, TSlot end, Address object_address);
- // A helper function for ReadData, templatized on the bytecode for efficiency.
- // Returns the new value of {current}.
- template <typename TSlot, Bytecode bytecode,
- SnapshotSpace space_number_if_any>
- inline TSlot ReadDataCase(TSlot current, Address current_object_address,
- byte data, bool write_barrier_needed);
+ // Helper for ReadData which reads the given bytecode and fills in some heap
+ // data into the given slot. May fill in zero or multiple slots, so it returns
+ // the next unfilled slot.
+ template <typename TSlot>
+ TSlot ReadSingleBytecodeData(byte data, TSlot current,
+ Address object_address);
// A helper function for ReadData for reading external references.
inline Address ReadExternalReferenceCase();
HeapObject ReadObject(SnapshotSpace space_number);
- void ReadCodeObjectBody(SnapshotSpace space_number,
- Address code_object_address);
+ HeapObject ReadMetaMap();
+ void ReadCodeObjectBody(Address code_object_address);
+
+ HeapObjectReferenceType GetAndResetNextReferenceType();
protected:
HeapObject ReadObject();
@@ -190,17 +195,32 @@ class V8_EXPORT_PRIVATE Deserializer : public SerializerDeserializer {
std::vector<Handle<JSArrayBuffer>> new_off_heap_array_buffers_;
std::vector<std::shared_ptr<BackingStore>> backing_stores_;
+ // Unresolved forward references (registered with kRegisterPendingForwardRef)
+ // are collected in order as (object, field offset) pairs. The subsequent
+ // forward ref resolution (with kResolvePendingForwardRef) accesses this
+ // vector by index.
+ //
+ // The vector is cleared when there are no more unresolved forward refs.
+ struct UnresolvedForwardRef {
+ UnresolvedForwardRef(HeapObject object, int offset,
+ HeapObjectReferenceType ref_type)
+ : object(object), offset(offset), ref_type(ref_type) {}
+
+ HeapObject object;
+ int offset;
+ HeapObjectReferenceType ref_type;
+ };
+ std::vector<UnresolvedForwardRef> unresolved_forward_refs_;
+ int num_unresolved_forward_refs_ = 0;
+
DeserializerAllocator allocator_;
const bool deserializing_user_code_;
+ bool next_reference_is_weak_ = false;
+
// TODO(6593): generalize rehashing, and remove this flag.
bool can_rehash_;
std::vector<HeapObject> to_rehash_;
- // Store the objects whose maps are deferred and thus initialized as filler
- // maps during deserialization, so that they can be processed later when the
- // maps become available.
- std::unordered_map<HeapObject, SnapshotSpace, Object::Hasher>
- fillers_to_post_process_;
#ifdef DEBUG
uint32_t num_api_references_;
diff --git a/deps/v8/src/snapshot/embedded/embedded-file-writer.cc b/deps/v8/src/snapshot/embedded/embedded-file-writer.cc
index 2f7f42bf81..8a3e248d6b 100644
--- a/deps/v8/src/snapshot/embedded/embedded-file-writer.cc
+++ b/deps/v8/src/snapshot/embedded/embedded-file-writer.cc
@@ -4,9 +4,11 @@
#include "src/snapshot/embedded/embedded-file-writer.h"
+#include <algorithm>
#include <cinttypes>
#include "src/codegen/source-position-table.h"
+#include "src/flags/flags.h" // For ENABLE_CONTROL_FLOW_INTEGRITY_BOOL
#include "src/objects/code-inl.h"
namespace v8 {
@@ -34,7 +36,6 @@ void EmbeddedFileWriter::WriteBuiltin(PlatformEmbeddedFileWriterBase* w,
w->DeclareFunctionBegin(builtin_symbol.begin(),
blob->InstructionSizeOfBuiltin(builtin_id));
const std::vector<byte>& current_positions = source_positions_[builtin_id];
-
// The code below interleaves bytes of assembly code for the builtin
// function with source positions at the appropriate offsets.
Vector<const byte> vpos(current_positions.data(), current_positions.size());
@@ -45,24 +46,42 @@ void EmbeddedFileWriter::WriteBuiltin(PlatformEmbeddedFileWriterBase* w,
CHECK(positions.done()); // Release builds must not contain debug infos.
#endif
+ // Some builtins (ArgumentsAdaptorTrampoline and JSConstructStubGeneric) have
+ // entry points located in the middle of them, we need to store their
+ // addresses since they are part of the list of allowed return addresses in
+ // the deoptimizer.
+ const std::vector<LabelInfo>& current_labels = label_info_[builtin_id];
+ auto label = current_labels.begin();
+
const uint8_t* data = reinterpret_cast<const uint8_t*>(
blob->InstructionStartOfBuiltin(builtin_id));
uint32_t size = blob->PaddedInstructionSizeOfBuiltin(builtin_id);
uint32_t i = 0;
- uint32_t next_offset =
+ uint32_t next_source_pos_offset =
static_cast<uint32_t>(positions.done() ? size : positions.code_offset());
+ uint32_t next_label_offset = static_cast<uint32_t>(
+ (label == current_labels.end()) ? size : label->offset);
+ uint32_t next_offset = 0;
while (i < size) {
- if (i == next_offset) {
+ if (i == next_source_pos_offset) {
// Write source directive.
w->SourceInfo(positions.source_position().ExternalFileId(),
GetExternallyCompiledFilename(
positions.source_position().ExternalFileId()),
positions.source_position().ExternalLine());
positions.Advance();
- next_offset = static_cast<uint32_t>(
+ next_source_pos_offset = static_cast<uint32_t>(
positions.done() ? size : positions.code_offset());
+ CHECK_GE(next_source_pos_offset, i);
+ }
+ if (i == next_label_offset) {
+ WriteBuiltinLabels(w, label->name);
+ label++;
+ next_label_offset = static_cast<uint32_t>(
+ (label == current_labels.end()) ? size : label->offset);
+ CHECK_GE(next_label_offset, i);
}
- CHECK_GE(next_offset, i);
+ next_offset = std::min(next_source_pos_offset, next_label_offset);
WriteBinaryContentsAsInlineAssembly(w, data + i, next_offset - i);
i = next_offset;
}
@@ -70,6 +89,15 @@ void EmbeddedFileWriter::WriteBuiltin(PlatformEmbeddedFileWriterBase* w,
w->DeclareFunctionEnd(builtin_symbol.begin());
}
+void EmbeddedFileWriter::WriteBuiltinLabels(PlatformEmbeddedFileWriterBase* w,
+ std::string name) const {
+ if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
+ w->DeclareSymbolGlobal(name.c_str());
+ }
+
+ w->DeclareLabel(name.c_str());
+}
+
void EmbeddedFileWriter::WriteFileEpilogue(PlatformEmbeddedFileWriterBase* w,
const i::EmbeddedData* blob) const {
{
@@ -237,5 +265,15 @@ void EmbeddedFileWriter::PrepareBuiltinSourcePositionMap(Builtins* builtins) {
}
}
+void EmbeddedFileWriter::PrepareBuiltinLabelInfoMap(
+ int create_offset, int invoke_offset, int arguments_adaptor_offset) {
+ label_info_[Builtins::kJSConstructStubGeneric].push_back(
+ {create_offset, "construct_stub_create_deopt_addr"});
+ label_info_[Builtins::kJSConstructStubGeneric].push_back(
+ {invoke_offset, "construct_stub_invoke_deopt_addr"});
+ label_info_[Builtins::kArgumentsAdaptorTrampoline].push_back(
+ {arguments_adaptor_offset, "arguments_adaptor_deopt_addr"});
+}
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/snapshot/embedded/embedded-file-writer.h b/deps/v8/src/snapshot/embedded/embedded-file-writer.h
index f7fd0239f7..f1ca04170a 100644
--- a/deps/v8/src/snapshot/embedded/embedded-file-writer.h
+++ b/deps/v8/src/snapshot/embedded/embedded-file-writer.h
@@ -23,6 +23,11 @@ namespace internal {
static constexpr char kDefaultEmbeddedVariant[] = "Default";
+struct LabelInfo {
+ int offset;
+ std::string name;
+};
+
// Detailed source-code information about builtins can only be obtained by
// registration on the isolate during compilation.
class EmbeddedFileWriterInterface {
@@ -36,6 +41,9 @@ class EmbeddedFileWriterInterface {
// compiled builtin Code objects with trampolines.
virtual void PrepareBuiltinSourcePositionMap(Builtins* builtins) = 0;
+ virtual void PrepareBuiltinLabelInfoMap(int create_offset, int invoke_offset,
+ int arguments_adaptor_offset) = 0;
+
#if defined(V8_OS_WIN64)
virtual void SetBuiltinUnwindData(
int builtin_index,
@@ -60,6 +68,9 @@ class EmbeddedFileWriter : public EmbeddedFileWriterInterface {
void PrepareBuiltinSourcePositionMap(Builtins* builtins) override;
+ void PrepareBuiltinLabelInfoMap(int create_offset, int invoke_create,
+ int arguments_adaptor_offset) override;
+
#if defined(V8_OS_WIN64)
void SetBuiltinUnwindData(
int builtin_index,
@@ -172,6 +183,9 @@ class EmbeddedFileWriter : public EmbeddedFileWriterInterface {
void WriteBuiltin(PlatformEmbeddedFileWriterBase* w,
const i::EmbeddedData* blob, const int builtin_id) const;
+ void WriteBuiltinLabels(PlatformEmbeddedFileWriterBase* w,
+ std::string name) const;
+
void WriteInstructionStreams(PlatformEmbeddedFileWriterBase* w,
const i::EmbeddedData* blob) const {
w->Comment("The embedded blob data starts here. It contains the builtin");
@@ -210,6 +224,7 @@ class EmbeddedFileWriter : public EmbeddedFileWriterInterface {
private:
std::vector<byte> source_positions_[Builtins::builtin_count];
+ std::vector<LabelInfo> label_info_[Builtins::builtin_count];
#if defined(V8_OS_WIN64)
win64_unwindinfo::BuiltinUnwindInfo unwind_infos_[Builtins::builtin_count];
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.cc b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.cc
index ebb78477b6..1c823ef421 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.cc
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.cc
@@ -57,7 +57,9 @@ void PlatformEmbeddedFileWriterAIX::DeclarePointerToSymbol(const char* name,
}
void PlatformEmbeddedFileWriterAIX::DeclareSymbolGlobal(const char* name) {
- fprintf(fp_, ".globl %s\n", name);
+ // These symbols are not visible outside of the final binary, this allows for
+ // reduced binary size, and less work for the dynamic linker.
+ fprintf(fp_, ".globl %s, hidden\n", name);
}
void PlatformEmbeddedFileWriterAIX::AlignToCodeAlignment() {
@@ -73,7 +75,9 @@ void PlatformEmbeddedFileWriterAIX::Comment(const char* string) {
}
void PlatformEmbeddedFileWriterAIX::DeclareLabel(const char* name) {
- DeclareSymbolGlobal(name);
+ // .global is required on AIX, if the label is used/referenced in another file
+ // later to be linked.
+ fprintf(fp_, ".globl %s\n", name);
fprintf(fp_, "%s:\n", name);
}
@@ -86,7 +90,9 @@ void PlatformEmbeddedFileWriterAIX::SourceInfo(int fileid, const char* filename,
void PlatformEmbeddedFileWriterAIX::DeclareFunctionBegin(const char* name,
uint32_t size) {
Newline();
- DeclareSymbolGlobal(name);
+ if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
+ DeclareSymbolGlobal(name);
+ }
fprintf(fp_, ".csect %s[DS]\n", name); // function descriptor
fprintf(fp_, "%s:\n", name);
fprintf(fp_, ".llong .%s, 0, 0\n", name);
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.h b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.h
index 2c709e0a30..7a9d7e92b3 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.h
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-aix.h
@@ -31,6 +31,7 @@ class PlatformEmbeddedFileWriterAIX : public PlatformEmbeddedFileWriterBase {
void DeclareUint32(const char* name, uint32_t value) override;
void DeclarePointerToSymbol(const char* name, const char* target) override;
+ void DeclareSymbolGlobal(const char* name) override;
void DeclareLabel(const char* name) override;
void SourceInfo(int fileid, const char* filename, int line) override;
@@ -48,9 +49,6 @@ class PlatformEmbeddedFileWriterAIX : public PlatformEmbeddedFileWriterBase {
DataDirective ByteChunkDataDirective() const override;
private:
- void DeclareSymbolGlobal(const char* name);
-
- private:
const EmbeddedTargetArch target_arch_;
const EmbeddedTargetOs target_os_;
};
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-base.h b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-base.h
index b8709cb932..d2345b3545 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-base.h
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-base.h
@@ -9,6 +9,8 @@
#include <cstdio> // For FILE.
#include <memory>
+#include "src/flags/flags.h" // For ENABLE_CONTROL_FLOW_INTEGRITY_BOOL
+
namespace v8 {
namespace internal {
@@ -60,6 +62,7 @@ class PlatformEmbeddedFileWriterBase {
virtual void DeclareUint32(const char* name, uint32_t value) = 0;
virtual void DeclarePointerToSymbol(const char* name, const char* target) = 0;
+ virtual void DeclareSymbolGlobal(const char* name) = 0;
virtual void DeclareLabel(const char* name) = 0;
virtual void SourceInfo(int fileid, const char* filename, int line) = 0;
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc
index 7e779ec6e5..070aaf51b6 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.cc
@@ -67,6 +67,9 @@ void PlatformEmbeddedFileWriterGeneric::DeclarePointerToSymbol(
void PlatformEmbeddedFileWriterGeneric::DeclareSymbolGlobal(const char* name) {
fprintf(fp_, ".global %s%s\n", SYMBOL_PREFIX, name);
+ // These symbols are not visible outside of the final binary, this allows for
+ // reduced binary size, and less work for the dynamic linker.
+ fprintf(fp_, ".hidden %s\n", name);
}
void PlatformEmbeddedFileWriterGeneric::AlignToCodeAlignment() {
@@ -97,6 +100,10 @@ void PlatformEmbeddedFileWriterGeneric::SourceInfo(int fileid,
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionBegin(const char* name,
uint32_t size) {
+ if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
+ DeclareSymbolGlobal(name);
+ }
+
DeclareLabel(name);
if (target_arch_ == EmbeddedTargetArch::kArm ||
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.h b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.h
index 4d8284f31f..e9bf439108 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.h
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-generic.h
@@ -33,6 +33,7 @@ class PlatformEmbeddedFileWriterGeneric
void DeclareUint32(const char* name, uint32_t value) override;
void DeclarePointerToSymbol(const char* name, const char* target) override;
+ void DeclareSymbolGlobal(const char* name) override;
void DeclareLabel(const char* name) override;
void SourceInfo(int fileid, const char* filename, int line) override;
@@ -50,9 +51,6 @@ class PlatformEmbeddedFileWriterGeneric
DataDirective ByteChunkDataDirective() const override;
private:
- void DeclareSymbolGlobal(const char* name);
-
- private:
const EmbeddedTargetArch target_arch_;
const EmbeddedTargetOs target_os_;
};
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.cc b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.cc
index a094a81ee2..9c5bf7049d 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.cc
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.cc
@@ -81,6 +81,10 @@ void PlatformEmbeddedFileWriterMac::SourceInfo(int fileid, const char* filename,
// TODO(mmarchini): investigate emitting size annotations for OS X
void PlatformEmbeddedFileWriterMac::DeclareFunctionBegin(const char* name,
uint32_t size) {
+ if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
+ DeclareSymbolGlobal(name);
+ }
+
DeclareLabel(name);
// TODO(mvstanton): Investigate the proper incantations to mark the label as
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.h b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.h
index 79f8fdf587..e6d0760033 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.h
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-mac.h
@@ -31,6 +31,7 @@ class PlatformEmbeddedFileWriterMac : public PlatformEmbeddedFileWriterBase {
void DeclareUint32(const char* name, uint32_t value) override;
void DeclarePointerToSymbol(const char* name, const char* target) override;
+ void DeclareSymbolGlobal(const char* name) override;
void DeclareLabel(const char* name) override;
void SourceInfo(int fileid, const char* filename, int line) override;
@@ -46,9 +47,6 @@ class PlatformEmbeddedFileWriterMac : public PlatformEmbeddedFileWriterBase {
int IndentedDataDirective(DataDirective directive) override;
private:
- void DeclareSymbolGlobal(const char* name);
-
- private:
const EmbeddedTargetArch target_arch_;
const EmbeddedTargetOs target_os_;
};
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc
index 3811ced3df..310da35a7e 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc
@@ -502,8 +502,12 @@ void PlatformEmbeddedFileWriterWin::SourceInfo(int fileid, const char* filename,
// TODO(mmarchini): investigate emitting size annotations for Windows
void PlatformEmbeddedFileWriterWin::DeclareFunctionBegin(const char* name,
uint32_t size) {
+ if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
+ DeclareSymbolGlobal(name);
+ }
+
if (target_arch_ == EmbeddedTargetArch::kArm64) {
- fprintf(fp_, "\n%s%s FUNCTION\n", SYMBOL_PREFIX, name);
+ fprintf(fp_, "%s%s FUNCTION\n", SYMBOL_PREFIX, name);
} else {
fprintf(fp_, "%s%s PROC\n", SYMBOL_PREFIX, name);
diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.h b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.h
index 0fcb48dc30..d14828eb4b 100644
--- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.h
+++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.h
@@ -30,6 +30,7 @@ class PlatformEmbeddedFileWriterWin : public PlatformEmbeddedFileWriterBase {
void DeclareUint32(const char* name, uint32_t value) override;
void DeclarePointerToSymbol(const char* name, const char* target) override;
+ void DeclareSymbolGlobal(const char* name) override;
void DeclareLabel(const char* name) override;
void SourceInfo(int fileid, const char* filename, int line) override;
@@ -65,7 +66,6 @@ class PlatformEmbeddedFileWriterWin : public PlatformEmbeddedFileWriterBase {
const void* unwind_infos) override;
private:
- void DeclareSymbolGlobal(const char* name);
const char* DirectiveAsString(DataDirective directive);
private:
diff --git a/deps/v8/src/snapshot/object-deserializer.cc b/deps/v8/src/snapshot/object-deserializer.cc
index 3348f2a797..e8bc45a4a2 100644
--- a/deps/v8/src/snapshot/object-deserializer.cc
+++ b/deps/v8/src/snapshot/object-deserializer.cc
@@ -47,7 +47,7 @@ MaybeHandle<HeapObject> ObjectDeserializer::Deserialize(Isolate* isolate) {
HandleScope scope(isolate);
Handle<HeapObject> result;
{
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
Object root;
VisitRootPointer(Root::kStartupObjectCache, nullptr, FullObjectSlot(&root));
DeserializeDeferredObjects();
@@ -85,7 +85,7 @@ void ObjectDeserializer::CommitPostProcessedObjects() {
}
void ObjectDeserializer::LinkAllocationSites() {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
Heap* heap = isolate()->heap();
// Allocation sites are present in the snapshot, and must be linked into
// a list at deserialization time.
diff --git a/deps/v8/src/snapshot/read-only-deserializer.cc b/deps/v8/src/snapshot/read-only-deserializer.cc
index 7c8c44d9ea..7d1ff90b8c 100644
--- a/deps/v8/src/snapshot/read-only-deserializer.cc
+++ b/deps/v8/src/snapshot/read-only-deserializer.cc
@@ -35,7 +35,7 @@ void ReadOnlyDeserializer::DeserializeInto(Isolate* isolate) {
DCHECK(!isolate->builtins()->is_initialized());
{
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
ReadOnlyRoots roots(isolate);
roots.Iterate(this);
diff --git a/deps/v8/src/snapshot/read-only-serializer.cc b/deps/v8/src/snapshot/read-only-serializer.cc
index 9bc8f105d1..4b852c0656 100644
--- a/deps/v8/src/snapshot/read-only-serializer.cc
+++ b/deps/v8/src/snapshot/read-only-serializer.cc
@@ -86,12 +86,9 @@ bool ReadOnlySerializer::MustBeDeferred(HeapObject object) {
// be saved without problems.
return false;
}
- // Just defer everything except for Map objects until all required roots are
- // serialized. Some objects may have special alignment requirements, that may
- // not be fulfilled during deserialization until few first root objects are
- // serialized. But we must serialize Map objects since deserializer checks
- // that these root objects are indeed Maps.
- return !object.IsMap();
+ // Defer objects with special alignment requirements until the filler roots
+ // are serialized.
+ return HeapObject::RequiredAlignment(object.map()) != kWordAligned;
}
bool ReadOnlySerializer::SerializeUsingReadOnlyObjectCache(
diff --git a/deps/v8/src/snapshot/references.h b/deps/v8/src/snapshot/references.h
index 84cf30f980..eed4def1ef 100644
--- a/deps/v8/src/snapshot/references.h
+++ b/deps/v8/src/snapshot/references.h
@@ -15,9 +15,8 @@ namespace internal {
// TODO(goszczycki): Move this somewhere every file in src/snapshot can use it.
// The spaces suported by the serializer. Spaces after LO_SPACE (NEW_LO_SPACE
// and CODE_LO_SPACE) are not supported.
-enum class SnapshotSpace {
+enum class SnapshotSpace : byte {
kReadOnlyHeap = RO_SPACE,
- kNew = NEW_SPACE,
kOld = OLD_SPACE,
kCode = CODE_SPACE,
kMap = MAP_SPACE,
diff --git a/deps/v8/src/snapshot/serializer-deserializer.cc b/deps/v8/src/snapshot/serializer-deserializer.cc
index 37fb2636ce..c6aa762f1f 100644
--- a/deps/v8/src/snapshot/serializer-deserializer.cc
+++ b/deps/v8/src/snapshot/serializer-deserializer.cc
@@ -30,14 +30,13 @@ void SerializerDeserializer::Iterate(Isolate* isolate, RootVisitor* visitor) {
}
bool SerializerDeserializer::CanBeDeferred(HeapObject o) {
- // ArrayBuffer instances are serialized by first re-assigning a index
- // to the backing store field, then serializing the object, and then
- // storing the actual backing store address again (and the same for the
- // ArrayBufferExtension). If serialization of the object itself is deferred,
- // the real backing store address is written into the snapshot, which cannot
- // be processed when deserializing.
- return !o.IsString() && !o.IsScript() && !o.IsJSTypedArray() &&
- !o.IsJSArrayBuffer();
+ // Maps cannot be deferred as objects are expected to have a valid map
+ // immediately. Internalized strings cannot be deferred as they might be
+ // converted to thin strings during post processing, at which point forward
+ // references to the now-thin string will already have been written.
+ // TODO(leszeks): Could we defer string serialization if forward references
+ // were resolved after object post processing?
+ return !o.IsMap() && !o.IsInternalizedString();
}
void SerializerDeserializer::RestoreExternalReferenceRedirectors(
diff --git a/deps/v8/src/snapshot/serializer-deserializer.h b/deps/v8/src/snapshot/serializer-deserializer.h
index d9d62d89f0..c6c381192e 100644
--- a/deps/v8/src/snapshot/serializer-deserializer.h
+++ b/deps/v8/src/snapshot/serializer-deserializer.h
@@ -5,6 +5,7 @@
#ifndef V8_SNAPSHOT_SERIALIZER_DESERIALIZER_H_
#define V8_SNAPSHOT_SERIALIZER_DESERIALIZER_H_
+#include "src/common/assert-scope.h"
#include "src/objects/visitors.h"
#include "src/snapshot/references.h"
@@ -27,13 +28,13 @@ class SerializerDeserializer : public RootVisitor {
HotObjectsList() = default;
void Add(HeapObject object) {
- DCHECK(!AllowHeapAllocation::IsAllowed());
+ DCHECK(!AllowGarbageCollection::IsAllowed());
circular_queue_[index_] = object;
index_ = (index_ + 1) & kSizeMask;
}
HeapObject Get(int index) {
- DCHECK(!AllowHeapAllocation::IsAllowed());
+ DCHECK(!AllowGarbageCollection::IsAllowed());
DCHECK(!circular_queue_[index].is_null());
return circular_queue_[index];
}
@@ -41,7 +42,7 @@ class SerializerDeserializer : public RootVisitor {
static const int kNotFound = -1;
int Find(HeapObject object) {
- DCHECK(!AllowHeapAllocation::IsAllowed());
+ DCHECK(!AllowGarbageCollection::IsAllowed());
for (int i = 0; i < kSize; i++) {
if (circular_queue_[i] == object) return i;
}
@@ -66,17 +67,14 @@ class SerializerDeserializer : public RootVisitor {
void RestoreExternalReferenceRedirectors(
Isolate* isolate, const std::vector<CallHandlerInfo>& call_handler_infos);
- static const int kNumberOfPreallocatedSpaces =
- static_cast<int>(SnapshotSpace::kNumberOfPreallocatedSpaces);
-
static const int kNumberOfSpaces =
static_cast<int>(SnapshotSpace::kNumberOfSpaces);
// clang-format off
#define UNUSED_SERIALIZER_BYTE_CODES(V) \
- V(0x06) V(0x07) V(0x0e) V(0x0f) \
- /* Free range 0x28..0x2f */ \
- V(0x28) V(0x29) V(0x2a) V(0x2b) V(0x2c) V(0x2d) V(0x2e) V(0x2f) \
+ V(0x05) V(0x06) V(0x07) V(0x0d) V(0x0e) V(0x0f) \
+ /* Free range 0x2a..0x2f */ \
+ V(0x2a) V(0x2b) V(0x2c) V(0x2d) V(0x2e) V(0x2f) \
/* Free range 0x30..0x3f */ \
V(0x30) V(0x31) V(0x32) V(0x33) V(0x34) V(0x35) V(0x36) V(0x37) \
V(0x38) V(0x39) V(0x3a) V(0x3b) V(0x3c) V(0x3d) V(0x3e) V(0x3f) \
@@ -105,33 +103,31 @@ class SerializerDeserializer : public RootVisitor {
// The static assert below will trigger when the number of preallocated spaces
// changed. If that happens, update the kNewObject and kBackref bytecode
// ranges in the comments below.
- STATIC_ASSERT(6 == kNumberOfSpaces);
- static const int kSpaceMask = 7;
- STATIC_ASSERT(kNumberOfSpaces <= kSpaceMask + 1);
+ STATIC_ASSERT(5 == kNumberOfSpaces);
// First 32 root array items.
- static const int kNumberOfRootArrayConstants = 0x20;
- static const int kRootArrayConstantsMask = 0x1f;
+ static const int kRootArrayConstantsCount = 0x20;
// 32 common raw data lengths.
- static const int kNumberOfFixedRawData = 0x20;
-
+ static const int kFixedRawDataCount = 0x20;
// 16 repeats lengths.
- static const int kNumberOfFixedRepeat = 0x10;
+ static const int kFixedRepeatCount = 0x10;
// 8 hot (recently seen or back-referenced) objects with optional skip.
- static const int kNumberOfHotObjects = 8;
- STATIC_ASSERT(kNumberOfHotObjects == HotObjectsList::kSize);
- static const int kHotObjectMask = 0x07;
+ static const int kHotObjectCount = 8;
+ STATIC_ASSERT(kHotObjectCount == HotObjectsList::kSize);
+
+ // 3 alignment prefixes
+ static const int kAlignmentPrefixCount = 3;
- enum Bytecode {
+ enum Bytecode : byte {
//
// ---------- byte code range 0x00..0x0f ----------
//
- // 0x00..0x05 Allocate new object, in specified space.
+ // 0x00..0x04 Allocate new object, in specified space.
kNewObject = 0x00,
- // 0x08..0x0d Reference to previous object from specified space.
+ // 0x08..0x0c Reference to previous object from specified space.
kBackref = 0x08,
//
@@ -150,16 +146,14 @@ class SerializerDeserializer : public RootVisitor {
kNop,
// Move to next reserved chunk.
kNextChunk,
- // Deferring object content.
- kDeferred,
- // 3 alignment prefixes 0x17..0x19
- kAlignmentPrefix = 0x17,
+ // 3 alignment prefixes 0x16..0x18
+ kAlignmentPrefix = 0x16,
// A tag emitted at strategic points in the snapshot to delineate sections.
// If the deserializer does not find these at the expected moments then it
// is an indication that the snapshot and the VM do not fit together.
// Examine the build process for architecture, version or configuration
// mismatches.
- kSynchronize = 0x1a,
+ kSynchronize = 0x19,
// Repeats of variable length.
kVariableRepeat,
// Used for embedder-allocated backing stores for TypedArrays.
@@ -186,6 +180,19 @@ class SerializerDeserializer : public RootVisitor {
kWeakPrefix,
// Encodes an off-heap instruction stream target.
kOffHeapTarget,
+ // Registers the current slot as a "pending" forward reference, to be later
+ // filled by a corresponding resolution bytecode.
+ kRegisterPendingForwardRef,
+ // Resolves an existing "pending" forward reference to point to the current
+ // object.
+ kResolvePendingForwardRef,
+ // Special construction bytecode for the metamap. In theory we could re-use
+ // forward-references for this, but then the forward reference would be
+ // registered during object map deserialization, before the object is
+ // allocated, so there wouldn't be a allocated object whose map field we can
+ // register as the pending field. We could either hack around this, or
+ // simply introduce this new bytecode.
+ kNewMetaMap,
//
// ---------- byte code range 0x40..0x7f ----------
@@ -196,7 +203,6 @@ class SerializerDeserializer : public RootVisitor {
// 0x60..0x7f
kFixedRawData = 0x60,
- kFixedRawDataStart = kFixedRawData - 1,
//
// ---------- byte code range 0x80..0x9f ----------
@@ -209,6 +215,44 @@ class SerializerDeserializer : public RootVisitor {
kHotObject = 0x90,
};
+ // Helper class for encoding and decoding a value into and from a bytecode.
+ //
+ // The value is encoded by allocating an entire bytecode range, and encoding
+ // the value as an index in that range, starting at kMinValue; thus the range
+ // of values
+ // [kMinValue, kMinValue + 1, ... , kMaxValue]
+ // is encoded as
+ // [kBytecode, kBytecode + 1, ... , kBytecode + (N - 1)]
+ // where N is the number of values, i.e. kMaxValue - kMinValue + 1.
+ template <Bytecode kBytecode, int kMinValue, int kMaxValue,
+ typename TValue = int>
+ struct BytecodeValueEncoder {
+ STATIC_ASSERT((kBytecode + kMaxValue - kMinValue) <= kMaxUInt8);
+
+ static constexpr bool IsEncodable(TValue value) {
+ return base::IsInRange(static_cast<int>(value), kMinValue, kMaxValue);
+ }
+
+ static constexpr byte Encode(TValue value) {
+ CONSTEXPR_DCHECK(IsEncodable(value));
+ return static_cast<byte>(kBytecode + static_cast<int>(value) - kMinValue);
+ }
+
+ static constexpr TValue Decode(byte bytecode) {
+ CONSTEXPR_DCHECK(base::IsInRange(bytecode,
+ Encode(static_cast<TValue>(kMinValue)),
+ Encode(static_cast<TValue>(kMaxValue))));
+ return static_cast<TValue>(bytecode - kBytecode + kMinValue);
+ }
+ };
+
+ template <Bytecode bytecode>
+ using SpaceEncoder =
+ BytecodeValueEncoder<bytecode, 0, kNumberOfSpaces - 1, SnapshotSpace>;
+
+ using NewObject = SpaceEncoder<kNewObject>;
+ using BackRef = SpaceEncoder<kBackref>;
+
//
// Some other constants.
//
@@ -217,38 +261,47 @@ class SerializerDeserializer : public RootVisitor {
// Sentinel after a new object to indicate that double alignment is needed.
static const int kDoubleAlignmentSentinel = 0;
+ // Raw data size encoding helpers.
+ static const int kFirstEncodableFixedRawDataSize = 1;
+ static const int kLastEncodableFixedRawDataSize =
+ kFirstEncodableFixedRawDataSize + kFixedRawDataCount - 1;
+
+ using FixedRawDataWithSize =
+ BytecodeValueEncoder<kFixedRawData, kFirstEncodableFixedRawDataSize,
+ kLastEncodableFixedRawDataSize>;
+
// Repeat count encoding helpers.
static const int kFirstEncodableRepeatCount = 2;
static const int kLastEncodableFixedRepeatCount =
- kFirstEncodableRepeatCount + kNumberOfFixedRepeat - 1;
+ kFirstEncodableRepeatCount + kFixedRepeatCount - 1;
static const int kFirstEncodableVariableRepeatCount =
kLastEncodableFixedRepeatCount + 1;
- // Encodes repeat count into a fixed repeat bytecode.
- static int EncodeFixedRepeat(int repeat_count) {
- DCHECK(base::IsInRange(repeat_count, kFirstEncodableRepeatCount,
- kLastEncodableFixedRepeatCount));
- return kFixedRepeat + repeat_count - kFirstEncodableRepeatCount;
- }
-
- // Decodes repeat count from a fixed repeat bytecode.
- static int DecodeFixedRepeatCount(int bytecode) {
- DCHECK(base::IsInRange(bytecode, kFixedRepeat + 0,
- kFixedRepeat + kNumberOfFixedRepeat));
- return bytecode - kFixedRepeat + kFirstEncodableRepeatCount;
- }
-
- // Encodes repeat count into a serialized variable repeat count value.
- static int EncodeVariableRepeatCount(int repeat_count) {
- DCHECK_LE(kFirstEncodableVariableRepeatCount, repeat_count);
- return repeat_count - kFirstEncodableVariableRepeatCount;
- }
-
- // Decodes repeat count from a serialized variable repeat count value.
- static int DecodeVariableRepeatCount(int value) {
- DCHECK_LE(0, value);
- return value + kFirstEncodableVariableRepeatCount;
- }
+ using FixedRepeatWithCount =
+ BytecodeValueEncoder<kFixedRepeat, kFirstEncodableRepeatCount,
+ kLastEncodableFixedRepeatCount>;
+
+ // Encodes/decodes repeat count into a serialized variable repeat count
+ // value.
+ struct VariableRepeatCount {
+ static constexpr bool IsEncodable(int repeat_count) {
+ return repeat_count >= kFirstEncodableVariableRepeatCount;
+ }
+
+ static constexpr int Encode(int repeat_count) {
+ CONSTEXPR_DCHECK(IsEncodable(repeat_count));
+ return repeat_count - kFirstEncodableVariableRepeatCount;
+ }
+
+ static constexpr int Decode(int value) {
+ return value + kFirstEncodableVariableRepeatCount;
+ }
+ };
+
+ using RootArrayConstant =
+ BytecodeValueEncoder<kRootArrayConstants, 0, kRootArrayConstantsCount - 1,
+ RootIndex>;
+ using HotObject = BytecodeValueEncoder<kHotObject, 0, kHotObjectCount - 1>;
// ---------- member variable ----------
HotObjectsList hot_objects_;
diff --git a/deps/v8/src/snapshot/serializer.cc b/deps/v8/src/snapshot/serializer.cc
index 6a29a8df2f..4a18383e45 100644
--- a/deps/v8/src/snapshot/serializer.cc
+++ b/deps/v8/src/snapshot/serializer.cc
@@ -5,6 +5,7 @@
#include "src/snapshot/serializer.h"
#include "src/codegen/assembler-inl.h"
+#include "src/common/globals.h"
#include "src/heap/heap-inl.h" // For Space::identity().
#include "src/heap/memory-chunk-inl.h"
#include "src/heap/read-only-heap.h"
@@ -70,6 +71,9 @@ void Serializer::OutputStatistics(const char* name) {
}
void Serializer::SerializeDeferredObjects() {
+ if (FLAG_trace_serializer) {
+ PrintF("Serializing deferred objects\n");
+ }
while (!deferred_objects_.empty()) {
HeapObject obj = deferred_objects_.back();
deferred_objects_.pop_back();
@@ -123,13 +127,13 @@ bool Serializer::SerializeHotObject(HeapObject obj) {
// Encode a reference to a hot object by its index in the working set.
int index = hot_objects_.Find(obj);
if (index == HotObjectsList::kNotFound) return false;
- DCHECK(index >= 0 && index < kNumberOfHotObjects);
+ DCHECK(index >= 0 && index < kHotObjectCount);
if (FLAG_trace_serializer) {
PrintF(" Encoding hot object %d:", index);
obj.ShortPrint();
PrintF("\n");
}
- sink_.Put(kHotObject + index, "HotObject");
+ sink_.Put(HotObject::Encode(index), "HotObject");
return true;
}
@@ -157,12 +161,23 @@ bool Serializer::SerializeBackReference(HeapObject obj) {
PutAlignmentPrefix(obj);
SnapshotSpace space = reference.space();
- sink_.Put(kBackref + static_cast<int>(space), "BackRef");
+ sink_.Put(BackRef::Encode(space), "BackRef");
PutBackReference(obj, reference);
}
return true;
}
+bool Serializer::SerializePendingObject(HeapObject obj) {
+ PendingObjectReference pending_obj =
+ forward_refs_per_pending_object_.find(obj);
+ if (pending_obj == forward_refs_per_pending_object_.end()) {
+ return false;
+ }
+
+ PutPendingForwardReferenceTo(pending_obj);
+ return true;
+}
+
bool Serializer::ObjectIsBytecodeHandler(HeapObject obj) const {
if (!obj.IsCode()) return false;
return (Code::cast(obj).kind() == CodeKind::BYTECODE_HANDLER);
@@ -179,12 +194,12 @@ void Serializer::PutRoot(RootIndex root, HeapObject object) {
// Assert that the first 32 root array items are a conscious choice. They are
// chosen so that the most common ones can be encoded more efficiently.
STATIC_ASSERT(static_cast<int>(RootIndex::kArgumentsMarker) ==
- kNumberOfRootArrayConstants - 1);
+ kRootArrayConstantsCount - 1);
// TODO(ulan): Check that it works with young large objects.
- if (root_index < kNumberOfRootArrayConstants &&
+ if (root_index < kRootArrayConstantsCount &&
!Heap::InYoungGeneration(object)) {
- sink_.Put(kRootArrayConstants + root_index, "RootConstant");
+ sink_.Put(RootArrayConstant::Encode(root), "RootConstant");
} else {
sink_.Put(kRootArray, "RootSerialization");
sink_.PutInt(root_index, "root_index");
@@ -200,13 +215,11 @@ void Serializer::PutSmiRoot(FullObjectSlot slot) {
STATIC_ASSERT(decltype(slot)::kSlotDataSize == kSystemPointerSize);
static constexpr int bytes_to_output = decltype(slot)::kSlotDataSize;
static constexpr int size_in_tagged = bytes_to_output >> kTaggedSizeLog2;
- sink_.PutSection(kFixedRawDataStart + size_in_tagged, "Smi");
+ sink_.Put(FixedRawDataWithSize::Encode(size_in_tagged), "Smi");
Address raw_value = Smi::cast(*slot).ptr();
const byte* raw_value_as_bytes = reinterpret_cast<const byte*>(&raw_value);
- for (size_t i = 0; i < bytes_to_output; i++) {
- sink_.Put(raw_value_as_bytes[i], "Byte");
- }
+ sink_.PutRaw(raw_value_as_bytes, bytes_to_output, "Bytes");
}
void Serializer::PutBackReference(HeapObject object,
@@ -249,18 +262,62 @@ int Serializer::PutAlignmentPrefix(HeapObject object) {
void Serializer::PutNextChunk(SnapshotSpace space) {
sink_.Put(kNextChunk, "NextChunk");
- sink_.Put(static_cast<int>(space), "NextChunkSpace");
+ sink_.Put(static_cast<byte>(space), "NextChunkSpace");
}
void Serializer::PutRepeat(int repeat_count) {
if (repeat_count <= kLastEncodableFixedRepeatCount) {
- sink_.Put(EncodeFixedRepeat(repeat_count), "FixedRepeat");
+ sink_.Put(FixedRepeatWithCount::Encode(repeat_count), "FixedRepeat");
} else {
sink_.Put(kVariableRepeat, "VariableRepeat");
- sink_.PutInt(EncodeVariableRepeatCount(repeat_count), "repeat count");
+ sink_.PutInt(VariableRepeatCount::Encode(repeat_count), "repeat count");
+ }
+}
+
+void Serializer::PutPendingForwardReferenceTo(
+ PendingObjectReference reference) {
+ sink_.Put(kRegisterPendingForwardRef, "RegisterPendingForwardRef");
+ unresolved_forward_refs_++;
+ // Register the current slot with the pending object.
+ int forward_ref_id = next_forward_ref_id_++;
+ reference->second.push_back(forward_ref_id);
+}
+
+void Serializer::ResolvePendingForwardReference(int forward_reference_id) {
+ sink_.Put(kResolvePendingForwardRef, "ResolvePendingForwardRef");
+ sink_.PutInt(forward_reference_id, "with this index");
+ unresolved_forward_refs_--;
+
+ // If there are no more unresolved forward refs, reset the forward ref id to
+ // zero so that future forward refs compress better.
+ if (unresolved_forward_refs_ == 0) {
+ next_forward_ref_id_ = 0;
}
}
+Serializer::PendingObjectReference Serializer::RegisterObjectIsPending(
+ HeapObject obj) {
+ // Add the given object to the pending objects -> forward refs map.
+ auto forward_refs_entry_insertion =
+ forward_refs_per_pending_object_.emplace(obj, std::vector<int>());
+
+ // If the above emplace didn't actually add the object, then the object must
+ // already have been registered pending by deferring. It might not be in the
+ // deferred objects queue though, since it may be the very object we just
+ // popped off that queue, so just check that it can be deferred.
+ DCHECK_IMPLIES(!forward_refs_entry_insertion.second, CanBeDeferred(obj));
+
+ // return the iterator into the map as the reference.
+ return forward_refs_entry_insertion.first;
+}
+
+void Serializer::ResolvePendingObject(Serializer::PendingObjectReference ref) {
+ for (int index : ref->second) {
+ ResolvePendingForwardReference(index);
+ }
+ forward_refs_per_pending_object_.erase(ref);
+}
+
void Serializer::Pad(int padding_offset) {
// The non-branching GetInt will read up to 3 bytes too far, so we need
// to pad the snapshot to make sure we don't read over the end.
@@ -299,24 +356,51 @@ void Serializer::ObjectSerializer::SerializePrologue(SnapshotSpace space,
CodeNameEvent(object_.address(), sink_->Position(), code_name));
}
- const int space_number = static_cast<int>(space);
SerializerReference back_reference;
- if (space == SnapshotSpace::kLargeObject) {
- sink_->Put(kNewObject + space_number, "NewLargeObject");
- sink_->PutInt(size >> kObjectAlignmentBits, "ObjectSizeInWords");
- CHECK(!object_.IsCode());
- back_reference = serializer_->allocator()->AllocateLargeObject(size);
- } else if (space == SnapshotSpace::kMap) {
- DCHECK_EQ(Map::kSize, size);
- back_reference = serializer_->allocator()->AllocateMap();
- sink_->Put(kNewObject + space_number, "NewMap");
- // This is redundant, but we include it anyways.
- sink_->PutInt(size >> kObjectAlignmentBits, "ObjectSizeInWords");
+ if (map == object_) {
+ DCHECK_EQ(object_, ReadOnlyRoots(serializer_->isolate()).meta_map());
+ DCHECK_EQ(space, SnapshotSpace::kReadOnlyHeap);
+ sink_->Put(kNewMetaMap, "NewMetaMap");
+
+ DCHECK_EQ(size, Map::kSize);
+ back_reference = serializer_->allocator()->Allocate(space, size);
} else {
- int fill = serializer_->PutAlignmentPrefix(object_);
- back_reference = serializer_->allocator()->Allocate(space, size + fill);
- sink_->Put(kNewObject + space_number, "NewObject");
+ sink_->Put(NewObject::Encode(space), "NewObject");
+
+ // TODO(leszeks): Skip this when the map has a fixed size.
sink_->PutInt(size >> kObjectAlignmentBits, "ObjectSizeInWords");
+
+ // Until the space for the object is allocated, it is considered "pending".
+ auto pending_object_ref = serializer_->RegisterObjectIsPending(object_);
+
+ // Serialize map (first word of the object) before anything else, so that
+ // the deserializer can access it when allocating. Make sure that the map
+ // isn't a pending object.
+ DCHECK_EQ(serializer_->forward_refs_per_pending_object_.count(map), 0);
+ DCHECK(map.IsMap());
+ serializer_->SerializeObject(map);
+
+ // Make sure the map serialization didn't accidentally recursively serialize
+ // this object.
+ DCHECK(!serializer_->reference_map()
+ ->LookupReference(reinterpret_cast<void*>(object_.ptr()))
+ .is_valid());
+
+ // Allocate the object after the map is serialized.
+ if (space == SnapshotSpace::kLargeObject) {
+ CHECK(!object_.IsCode());
+ back_reference = serializer_->allocator()->AllocateLargeObject(size);
+ } else if (space == SnapshotSpace::kMap) {
+ back_reference = serializer_->allocator()->AllocateMap();
+ DCHECK_EQ(Map::kSize, size);
+ } else {
+ int fill = serializer_->PutAlignmentPrefix(object_);
+ back_reference = serializer_->allocator()->Allocate(space, size + fill);
+ }
+
+ // Now that the object is allocated, we can resolve pending references to
+ // it.
+ serializer_->ResolvePendingObject(pending_object_ref);
}
#ifdef OBJECT_PRINT
@@ -328,9 +412,6 @@ void Serializer::ObjectSerializer::SerializePrologue(SnapshotSpace space,
// Mark this object as already serialized.
serializer_->reference_map()->Add(reinterpret_cast<void*>(object_.ptr()),
back_reference);
-
- // Serialize the map (first word of the object).
- serializer_->SerializeObject(map);
}
uint32_t Serializer::ObjectSerializer::SerializeBackingStore(
@@ -464,9 +545,9 @@ void Serializer::ObjectSerializer::SerializeExternalStringAsSequentialString() {
sink_->PutInt(bytes_to_output, "length");
// Serialize string header (except for map).
- uint8_t* string_start = reinterpret_cast<uint8_t*>(string.address());
+ byte* string_start = reinterpret_cast<byte*>(string.address());
for (int i = HeapObject::kHeaderSize; i < SeqString::kHeaderSize; i++) {
- sink_->PutSection(string_start[i], "StringHeader");
+ sink_->Put(string_start[i], "StringHeader");
}
// Serialize string content.
@@ -476,7 +557,8 @@ void Serializer::ObjectSerializer::SerializeExternalStringAsSequentialString() {
// maybe left-over bytes that need to be padded.
int padding_size = allocation_size - SeqString::kHeaderSize - content_size;
DCHECK(0 <= padding_size && padding_size < kObjectAlignment);
- for (int i = 0; i < padding_size; i++) sink_->PutSection(0, "StringPadding");
+ for (int i = 0; i < padding_size; i++)
+ sink_->Put(static_cast<byte>(0), "StringPadding");
}
// Clear and later restore the next link in the weak cell or allocation site.
@@ -507,6 +589,26 @@ class UnlinkWeakNextScope {
};
void Serializer::ObjectSerializer::Serialize() {
+ RecursionScope recursion(serializer_);
+
+ // Defer objects as "pending" if they cannot be serialized now, or if we
+ // exceed a certain recursion depth. Some objects cannot be deferred
+ if ((recursion.ExceedsMaximum() && CanBeDeferred(object_)) ||
+ serializer_->MustBeDeferred(object_)) {
+ DCHECK(CanBeDeferred(object_));
+ if (FLAG_trace_serializer) {
+ PrintF(" Deferring heap object: ");
+ object_.ShortPrint();
+ PrintF("\n");
+ }
+ // Deferred objects are considered "pending".
+ PendingObjectReference pending_obj =
+ serializer_->RegisterObjectIsPending(object_);
+ serializer_->PutPendingForwardReferenceTo(pending_obj);
+ serializer_->QueueDeferredObject(object_);
+ return;
+ }
+
if (FLAG_trace_serializer) {
PrintF(" Encoding heap object: ");
object_.ShortPrint();
@@ -560,7 +662,7 @@ SnapshotSpace GetSnapshotSpace(HeapObject object) {
} else if (object.IsMap()) {
return SnapshotSpace::kMap;
} else {
- return SnapshotSpace::kNew; // avoid new/young distinction in TPH
+ return SnapshotSpace::kOld; // avoid new/young distinction in TPH
}
} else if (ReadOnlyHeap::Contains(object)) {
return SnapshotSpace::kReadOnlyHeap;
@@ -595,44 +697,27 @@ void Serializer::ObjectSerializer::SerializeObject() {
CHECK_EQ(0, bytes_processed_so_far_);
bytes_processed_so_far_ = kTaggedSize;
- RecursionScope recursion(serializer_);
- // Objects that are immediately post processed during deserialization
- // cannot be deferred, since post processing requires the object content.
- if ((recursion.ExceedsMaximum() && CanBeDeferred(object_)) ||
- serializer_->MustBeDeferred(object_)) {
- serializer_->QueueDeferredObject(object_);
- sink_->Put(kDeferred, "Deferring object content");
- return;
- }
-
SerializeContent(map, size);
}
void Serializer::ObjectSerializer::SerializeDeferred() {
- if (FLAG_trace_serializer) {
- PrintF(" Encoding deferred heap object: ");
- object_.ShortPrint();
- PrintF("\n");
- }
-
- int size = object_.Size();
- Map map = object_.map();
SerializerReference back_reference =
serializer_->reference_map()->LookupReference(
reinterpret_cast<void*>(object_.ptr()));
- DCHECK(back_reference.is_back_reference());
- // Serialize the rest of the object.
- CHECK_EQ(0, bytes_processed_so_far_);
- bytes_processed_so_far_ = kTaggedSize;
-
- serializer_->PutAlignmentPrefix(object_);
- sink_->Put(kNewObject + static_cast<int>(back_reference.space()),
- "deferred object");
- serializer_->PutBackReference(object_, back_reference);
- sink_->PutInt(size >> kTaggedSizeLog2, "deferred object size");
+ if (back_reference.is_valid()) {
+ if (FLAG_trace_serializer) {
+ PrintF(" Deferred heap object ");
+ object_.ShortPrint();
+ PrintF(" was already serialized\n");
+ }
+ return;
+ }
- SerializeContent(map, size);
+ if (FLAG_trace_serializer) {
+ PrintF(" Encoding deferred heap object\n");
+ }
+ Serialize();
}
void Serializer::ObjectSerializer::SerializeContent(Map map, int size) {
@@ -659,7 +744,7 @@ void Serializer::ObjectSerializer::VisitPointers(HeapObject host,
void Serializer::ObjectSerializer::VisitPointers(HeapObject host,
MaybeObjectSlot start,
MaybeObjectSlot end) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
MaybeObjectSlot current = start;
while (current < end) {
@@ -680,10 +765,22 @@ void Serializer::ObjectSerializer::VisitPointers(HeapObject host,
HeapObjectReferenceType reference_type;
while (current < end &&
(*current)->GetHeapObject(&current_contents, &reference_type)) {
+ // Write a weak prefix if we need it. This has to be done before the
+ // potential pending object serialization.
+ if (reference_type == HeapObjectReferenceType::WEAK) {
+ sink_->Put(kWeakPrefix, "WeakReference");
+ }
+
+ if (serializer_->SerializePendingObject(current_contents)) {
+ bytes_processed_so_far_ += kTaggedSize;
+ ++current;
+ continue;
+ }
+
RootIndex root_index;
// Compute repeat count and write repeat prefix if applicable.
// Repeats are not subject to the write barrier so we can only use
- // immortal immovable root members. They are never in new space.
+ // immortal immovable root members.
MaybeObjectSlot repeat_end = current + 1;
if (repeat_end < end &&
serializer_->root_index_map()->Lookup(current_contents,
@@ -704,9 +801,6 @@ void Serializer::ObjectSerializer::VisitPointers(HeapObject host,
++current;
}
// Now write the object itself.
- if (reference_type == HeapObjectReferenceType::WEAK) {
- sink_->Put(kWeakPrefix, "WeakReference");
- }
serializer_->SerializeObject(current_contents);
}
}
@@ -741,9 +835,9 @@ void Serializer::ObjectSerializer::OutputExternalReference(Address target,
// references verbatim.
CHECK(serializer_->allow_unknown_external_references_for_testing());
CHECK(IsAligned(target_size, kObjectAlignment));
- CHECK_LE(target_size, kNumberOfFixedRawData * kTaggedSize);
+ CHECK_LE(target_size, kFixedRawDataCount * kTaggedSize);
int size_in_tagged = target_size >> kTaggedSizeLog2;
- sink_->PutSection(kFixedRawDataStart + size_in_tagged, "FixedRawData");
+ sink_->Put(FixedRawDataWithSize::Encode(size_in_tagged), "FixedRawData");
sink_->PutRaw(reinterpret_cast<byte*>(&target), target_size, "Bytes");
} else if (encoded_reference.is_from_api()) {
if (V8_HEAP_SANDBOX_BOOL && sandboxify) {
@@ -856,9 +950,9 @@ void Serializer::ObjectSerializer::OutputRawData(Address up_to) {
if (bytes_to_output != 0) {
DCHECK(to_skip == bytes_to_output);
if (IsAligned(bytes_to_output, kObjectAlignment) &&
- bytes_to_output <= kNumberOfFixedRawData * kTaggedSize) {
+ bytes_to_output <= kFixedRawDataCount * kTaggedSize) {
int size_in_tagged = bytes_to_output >> kTaggedSizeLog2;
- sink_->PutSection(kFixedRawDataStart + size_in_tagged, "FixedRawData");
+ sink_->Put(FixedRawDataWithSize::Encode(size_in_tagged), "FixedRawData");
} else {
sink_->Put(kVariableRawData, "VariableRawData");
sink_->PutInt(bytes_to_output, "length");
diff --git a/deps/v8/src/snapshot/serializer.h b/deps/v8/src/snapshot/serializer.h
index be748de562..87f02f5c42 100644
--- a/deps/v8/src/snapshot/serializer.h
+++ b/deps/v8/src/snapshot/serializer.h
@@ -176,6 +176,9 @@ class Serializer : public SerializerDeserializer {
Isolate* isolate() const { return isolate_; }
protected:
+ using PendingObjectReference =
+ std::map<HeapObject, std::vector<int>>::iterator;
+
class ObjectSerializer;
class RecursionScope {
public:
@@ -210,6 +213,13 @@ class Serializer : public SerializerDeserializer {
void PutNextChunk(SnapshotSpace space);
void PutRepeat(int repeat_count);
+ // Emit a marker noting that this slot is a forward reference to the an
+ // object which has not yet been serialized.
+ void PutPendingForwardReferenceTo(PendingObjectReference reference);
+ // Resolve the given previously registered forward reference to the current
+ // object.
+ void ResolvePendingForwardReference(int obj);
+
// Returns true if the object was successfully serialized as a root.
bool SerializeRoot(HeapObject obj);
@@ -219,6 +229,9 @@ class Serializer : public SerializerDeserializer {
// Returns true if the object was successfully serialized as back reference.
bool SerializeBackReference(HeapObject obj);
+ // Returns true if the object was successfully serialized as pending object.
+ bool SerializePendingObject(HeapObject obj);
+
// Returns true if the given heap object is a bytecode handler code object.
bool ObjectIsBytecodeHandler(HeapObject obj) const;
@@ -241,11 +254,19 @@ class Serializer : public SerializerDeserializer {
Code CopyCode(Code code);
void QueueDeferredObject(HeapObject obj) {
- DCHECK(reference_map_.LookupReference(reinterpret_cast<void*>(obj.ptr()))
- .is_back_reference());
+ DCHECK(!reference_map_.LookupReference(reinterpret_cast<void*>(obj.ptr()))
+ .is_valid());
deferred_objects_.push_back(obj);
}
+ // Register that the the given object shouldn't be immediately serialized, but
+ // will be serialized later and any references to it should be pending forward
+ // references.
+ PendingObjectReference RegisterObjectIsPending(HeapObject obj);
+
+ // Resolve the given pending object reference with the current object.
+ void ResolvePendingObject(PendingObjectReference ref);
+
void OutputStatistics(const char* name);
#ifdef OBJECT_PRINT
@@ -273,6 +294,10 @@ class Serializer : public SerializerDeserializer {
}
private:
+ // Disallow GC during serialization.
+ // TODO(leszeks, v8:10815): Remove this constraint.
+ DisallowHeapAllocation no_gc;
+
Isolate* isolate_;
SerializerReferenceMap reference_map_;
ExternalReferenceEncoder external_reference_encoder_;
@@ -280,6 +305,22 @@ class Serializer : public SerializerDeserializer {
std::unique_ptr<CodeAddressMap> code_address_map_;
std::vector<byte> code_buffer_;
std::vector<HeapObject> deferred_objects_; // To handle stack overflow.
+
+ // Objects which have started being serialized, but haven't yet been allocated
+ // with the allocator, are considered "pending". References to them don't have
+ // an allocation to backref to, so instead they are registered as pending
+ // forward references, which are resolved once the object is allocated.
+ //
+ // Forward references are registered in a deterministic order, and can
+ // therefore be identified by an incrementing integer index, which is
+ // effectively an index into a vector of the currently registered forward
+ // refs. The references in this vector might not be resolved in order, so we
+ // can only clear it (and reset the indices) when there are no unresolved
+ // forward refs remaining.
+ int next_forward_ref_id_ = 0;
+ int unresolved_forward_refs_ = 0;
+ std::map<HeapObject, std::vector<int>> forward_refs_per_pending_object_;
+
int recursion_depth_ = 0;
const Snapshot::SerializerFlags flags_;
SerializerAllocator allocator_;
diff --git a/deps/v8/src/snapshot/snapshot-data.cc b/deps/v8/src/snapshot/snapshot-data.cc
index b6dccf2af5..870945cdce 100644
--- a/deps/v8/src/snapshot/snapshot-data.cc
+++ b/deps/v8/src/snapshot/snapshot-data.cc
@@ -25,7 +25,7 @@ void SerializedData::AllocateData(uint32_t size) {
constexpr uint32_t SerializedData::kMagicNumber;
SnapshotData::SnapshotData(const Serializer* serializer) {
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
std::vector<Reservation> reservations = serializer->EncodeReservations();
const std::vector<byte>* payload = serializer->Payload();
diff --git a/deps/v8/src/snapshot/snapshot-source-sink.cc b/deps/v8/src/snapshot/snapshot-source-sink.cc
index e39e2b393c..6395c90e1f 100644
--- a/deps/v8/src/snapshot/snapshot-source-sink.cc
+++ b/deps/v8/src/snapshot/snapshot-source-sink.cc
@@ -20,13 +20,12 @@ void SnapshotByteSink::PutInt(uintptr_t integer, const char* description) {
if (integer > 0xFFFF) bytes = 3;
if (integer > 0xFFFFFF) bytes = 4;
integer |= (bytes - 1);
- Put(static_cast<int>(integer & 0xFF), "IntPart1");
- if (bytes > 1) Put(static_cast<int>((integer >> 8) & 0xFF), "IntPart2");
- if (bytes > 2) Put(static_cast<int>((integer >> 16) & 0xFF), "IntPart3");
- if (bytes > 3) Put(static_cast<int>((integer >> 24) & 0xFF), "IntPart4");
+ Put(static_cast<byte>(integer & 0xFF), "IntPart1");
+ if (bytes > 1) Put(static_cast<byte>((integer >> 8) & 0xFF), "IntPart2");
+ if (bytes > 2) Put(static_cast<byte>((integer >> 16) & 0xFF), "IntPart3");
+ if (bytes > 3) Put(static_cast<byte>((integer >> 24) & 0xFF), "IntPart4");
}
-
void SnapshotByteSink::PutRaw(const byte* data, int number_of_bytes,
const char* description) {
data_.insert(data_.end(), data, data + number_of_bytes);
diff --git a/deps/v8/src/snapshot/snapshot-source-sink.h b/deps/v8/src/snapshot/snapshot-source-sink.h
index eb4427a75f..9d44678679 100644
--- a/deps/v8/src/snapshot/snapshot-source-sink.h
+++ b/deps/v8/src/snapshot/snapshot-source-sink.h
@@ -39,6 +39,11 @@ class SnapshotByteSource final {
return data_[position_++];
}
+ byte Peek() const {
+ DCHECK(position_ < length_);
+ return data_[position_];
+ }
+
void Advance(int by) { position_ += by; }
void CopyRaw(void* to, int number_of_bytes) {
@@ -81,11 +86,10 @@ class SnapshotByteSource final {
DISALLOW_COPY_AND_ASSIGN(SnapshotByteSource);
};
-
/**
* Sink to write snapshot files to.
*
- * Subclasses must implement actual storage or i/o.
+ * Users must implement actual storage or i/o.
*/
class SnapshotByteSink {
public:
@@ -96,11 +100,6 @@ class SnapshotByteSink {
void Put(byte b, const char* description) { data_.push_back(b); }
- void PutSection(int b, const char* description) {
- DCHECK_LE(b, kMaxUInt8);
- Put(static_cast<byte>(b), description);
- }
-
void PutInt(uintptr_t integer, const char* description);
void PutRaw(const byte* data, int number_of_bytes, const char* description);
diff --git a/deps/v8/src/snapshot/snapshot.cc b/deps/v8/src/snapshot/snapshot.cc
index de413c8c13..7e3f072659 100644
--- a/deps/v8/src/snapshot/snapshot.cc
+++ b/deps/v8/src/snapshot/snapshot.cc
@@ -7,7 +7,9 @@
#include "src/snapshot/snapshot.h"
#include "src/base/platform/platform.h"
+#include "src/common/assert-scope.h"
#include "src/execution/isolate-inl.h"
+#include "src/heap/safepoint.h"
#include "src/init/bootstrapper.h"
#include "src/logging/counters.h"
#include "src/objects/code-kind.h"
@@ -280,7 +282,7 @@ void Snapshot::SerializeDeserializeAndVerifyForTesting(
// Test serialization.
{
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
Snapshot::SerializerFlags flags(
Snapshot::kAllowUnknownExternalReferencesForTesting |
@@ -347,10 +349,17 @@ v8::StartupData Snapshot::Create(
Isolate* isolate, std::vector<Context>* contexts,
const std::vector<SerializeInternalFieldsCallback>&
embedder_fields_serializers,
- const DisallowHeapAllocation& no_gc, SerializerFlags flags) {
+ const DisallowGarbageCollection& no_gc, SerializerFlags flags) {
DCHECK_EQ(contexts->size(), embedder_fields_serializers.size());
DCHECK_GT(contexts->size(), 0);
+ // Enter a safepoint so that the heap is safe to iterate.
+ // TODO(leszeks): This safepoint's scope could be tightened to just string
+ // table iteration, as that iteration relies on there not being any concurrent
+ // threads mutating the string table. But, there's currently no harm in
+ // holding it for the entire snapshot serialization.
+ SafepointScope safepoint(isolate->heap());
+
ReadOnlySerializer read_only_serializer(isolate, flags);
read_only_serializer.SerializeReadOnlyRoots();
@@ -395,7 +404,7 @@ v8::StartupData Snapshot::Create(
// static
v8::StartupData Snapshot::Create(Isolate* isolate, Context default_context,
- const DisallowHeapAllocation& no_gc,
+ const DisallowGarbageCollection& no_gc,
SerializerFlags flags) {
std::vector<Context> contexts{default_context};
std::vector<SerializeInternalFieldsCallback> callbacks{{}};
diff --git a/deps/v8/src/snapshot/snapshot.h b/deps/v8/src/snapshot/snapshot.h
index 016e51799b..0e510f0096 100644
--- a/deps/v8/src/snapshot/snapshot.h
+++ b/deps/v8/src/snapshot/snapshot.h
@@ -55,13 +55,13 @@ class Snapshot : public AllStatic {
Isolate* isolate, std::vector<Context>* contexts,
const std::vector<SerializeInternalFieldsCallback>&
embedder_fields_serializers,
- const DisallowHeapAllocation& no_gc,
+ const DisallowGarbageCollection& no_gc,
SerializerFlags flags = kDefaultSerializerFlags);
// Convenience helper for the above when only serializing a single context.
static v8::StartupData Create(
Isolate* isolate, Context default_context,
- const DisallowHeapAllocation& no_gc,
+ const DisallowGarbageCollection& no_gc,
SerializerFlags flags = kDefaultSerializerFlags);
// ---------------- Deserialization -----------------------------------------
diff --git a/deps/v8/src/snapshot/startup-deserializer.cc b/deps/v8/src/snapshot/startup-deserializer.cc
index 0baeb01c05..3288aff509 100644
--- a/deps/v8/src/snapshot/startup-deserializer.cc
+++ b/deps/v8/src/snapshot/startup-deserializer.cc
@@ -31,7 +31,7 @@ void StartupDeserializer::DeserializeInto(Isolate* isolate) {
DCHECK(!isolate->builtins()->is_initialized());
{
- DisallowHeapAllocation no_gc;
+ DisallowGarbageCollection no_gc;
isolate->heap()->IterateSmiRoots(this);
isolate->heap()->IterateRoots(
this,
diff --git a/deps/v8/src/snapshot/startup-serializer.cc b/deps/v8/src/snapshot/startup-serializer.cc
index 1531700574..8606f6a019 100644
--- a/deps/v8/src/snapshot/startup-serializer.cc
+++ b/deps/v8/src/snapshot/startup-serializer.cc
@@ -26,7 +26,7 @@ namespace {
class SanitizeIsolateScope final {
public:
SanitizeIsolateScope(Isolate* isolate, bool allow_active_isolate_for_testing,
- const DisallowHeapAllocation& no_gc)
+ const DisallowGarbageCollection& no_gc)
: isolate_(isolate),
feedback_vectors_for_profiling_tools_(
isolate->heap()->feedback_vectors_for_profiling_tools()),
@@ -239,7 +239,7 @@ void StartupSerializer::SerializeStringTable(StringTable* string_table) {
}
void StartupSerializer::SerializeStrongReferences(
- const DisallowHeapAllocation& no_gc) {
+ const DisallowGarbageCollection& no_gc) {
Isolate* isolate = this->isolate();
// No active threads.
CHECK_NULL(isolate->thread_manager()->FirstThreadStateInUse());
diff --git a/deps/v8/src/snapshot/startup-serializer.h b/deps/v8/src/snapshot/startup-serializer.h
index 7a447b8f96..d13d5d224e 100644
--- a/deps/v8/src/snapshot/startup-serializer.h
+++ b/deps/v8/src/snapshot/startup-serializer.h
@@ -27,7 +27,7 @@ class V8_EXPORT_PRIVATE StartupSerializer : public RootsSerializer {
// 2) Builtins and bytecode handlers
// 3) Startup object cache
// 4) Weak references (e.g. the string table)
- void SerializeStrongReferences(const DisallowHeapAllocation& no_gc);
+ void SerializeStrongReferences(const DisallowGarbageCollection& no_gc);
void SerializeWeakReferencesAndDeferred();
// If |obj| can be serialized in the read-only snapshot then add it to the
diff --git a/deps/v8/src/strings/char-predicates-inl.h b/deps/v8/src/strings/char-predicates-inl.h
index bb2cd55d9f..2dc7e50925 100644
--- a/deps/v8/src/strings/char-predicates-inl.h
+++ b/deps/v8/src/strings/char-predicates-inl.h
@@ -69,14 +69,8 @@ inline constexpr uc32 ToAsciiLower(uc32 c) {
return c | (IsAsciiUpper(c) << 5);
}
-inline constexpr bool IsRegExpWord(uc16 c) {
- return base::IsInRange(AsciiAlphaToLower(c), 'a', 'z') || IsDecimalDigit(c) ||
- (c == '_');
-}
-
-inline constexpr bool IsRegExpNewline(uc16 c) {
- // CR LF LS PS
- return c != 0x000A && c != 0x000D && c != 0x2028 && c != 0x2029;
+inline constexpr bool IsRegExpWord(uc32 c) {
+ return IsAlphaNumeric(c) || c == '_';
}
// Constexpr cache table for character flags.
diff --git a/deps/v8/src/strings/char-predicates.h b/deps/v8/src/strings/char-predicates.h
index 0262048ec7..1df20e072a 100644
--- a/deps/v8/src/strings/char-predicates.h
+++ b/deps/v8/src/strings/char-predicates.h
@@ -24,7 +24,6 @@ inline constexpr bool IsHexDigit(uc32 c);
inline constexpr bool IsOctalDigit(uc32 c);
inline constexpr bool IsBinaryDigit(uc32 c);
inline constexpr bool IsRegExpWord(uc32 c);
-inline constexpr bool IsRegExpNewline(uc32 c);
inline constexpr bool IsAsciiLower(uc32 ch);
inline constexpr bool IsAsciiUpper(uc32 ch);
diff --git a/deps/v8/src/strings/string-builder-inl.h b/deps/v8/src/strings/string-builder-inl.h
index 630b66ab20..eecb9c4ae3 100644
--- a/deps/v8/src/strings/string-builder-inl.h
+++ b/deps/v8/src/strings/string-builder-inl.h
@@ -262,13 +262,13 @@ class IncrementalStringBuilder {
V8_INLINE Handle<String> accumulator() { return accumulator_; }
V8_INLINE void set_accumulator(Handle<String> string) {
- *accumulator_.location() = string->ptr();
+ accumulator_.PatchValue(*string);
}
V8_INLINE Handle<String> current_part() { return current_part_; }
V8_INLINE void set_current_part(Handle<String> string) {
- *current_part_.location() = string->ptr();
+ current_part_.PatchValue(*string);
}
// Add the current part to the accumulator.
diff --git a/deps/v8/src/strings/string-search.h b/deps/v8/src/strings/string-search.h
index 1d5800ebcf..d10a80882c 100644
--- a/deps/v8/src/strings/string-search.h
+++ b/deps/v8/src/strings/string-search.h
@@ -196,6 +196,15 @@ inline int FindFirstCharacter(Vector<const PatternChar> pattern,
const PatternChar pattern_first_char = pattern[0];
const int max_n = (subject.length() - pattern.length() + 1);
+ if (sizeof(SubjectChar) == 2 && pattern_first_char == 0) {
+ // Special-case looking for the 0 char in other than one-byte strings.
+ // memchr mostly fails in this case due to every other byte being 0 in text
+ // that is mostly ascii characters.
+ for (int i = index; i < max_n; ++i) {
+ if (subject[i] == 0) return i;
+ }
+ return -1;
+ }
const uint8_t search_byte = GetHighestValueByte(pattern_first_char);
const SubjectChar search_char = static_cast<SubjectChar>(pattern_first_char);
int pos = index;
diff --git a/deps/v8/src/torque/class-debug-reader-generator.cc b/deps/v8/src/torque/class-debug-reader-generator.cc
index b89ec85d80..8a0575cc57 100644
--- a/deps/v8/src/torque/class-debug-reader-generator.cc
+++ b/deps/v8/src/torque/class-debug-reader-generator.cc
@@ -532,7 +532,7 @@ void GenerateClassDebugReader(const ClassType& type, std::ostream& h_contents,
void ImplementationVisitor::GenerateClassDebugReaders(
const std::string& output_directory) {
- const std::string file_name = "class-debug-readers-tq";
+ const std::string file_name = "class-debug-readers";
std::stringstream h_contents;
std::stringstream cc_contents;
h_contents << "// Provides the ability to read object properties in\n";
diff --git a/deps/v8/src/torque/implementation-visitor.cc b/deps/v8/src/torque/implementation-visitor.cc
index ca1ffc0e75..2f2881fd07 100644
--- a/deps/v8/src/torque/implementation-visitor.cc
+++ b/deps/v8/src/torque/implementation-visitor.cc
@@ -3124,13 +3124,13 @@ std::string MachineTypeString(const Type* type) {
void ImplementationVisitor::GenerateBuiltinDefinitionsAndInterfaceDescriptors(
const std::string& output_directory) {
std::stringstream builtin_definitions;
- std::string builtin_definitions_file_name = "builtin-definitions-tq.h";
+ std::string builtin_definitions_file_name = "builtin-definitions.h";
// This file contains plain interface descriptor definitions and has to be
// included in the middle of interface-descriptors.h. Thus it is not a normal
// header file and uses the .inc suffix instead of the .h suffix.
std::stringstream interface_descriptors;
- std::string interface_descriptors_file_name = "interface-descriptors-tq.inc";
+ std::string interface_descriptors_file_name = "interface-descriptors.inc";
{
IncludeGuardScope builtin_definitions_include_guard(
builtin_definitions, builtin_definitions_file_name);
@@ -3420,7 +3420,7 @@ void GenerateClassExport(const ClassType* type, std::ostream& header,
void ImplementationVisitor::GenerateClassFieldOffsets(
const std::string& output_directory) {
std::stringstream header;
- std::string file_name = "field-offsets-tq.h";
+ std::string file_name = "field-offsets.h";
{
IncludeGuardScope include_guard(header, file_name);
@@ -3471,7 +3471,7 @@ void ImplementationVisitor::GenerateClassFieldOffsets(
void ImplementationVisitor::GenerateBitFields(
const std::string& output_directory) {
std::stringstream header;
- std::string file_name = "bit-fields-tq.h";
+ std::string file_name = "bit-fields.h";
{
IncludeGuardScope include_guard(header, file_name);
header << "#include \"src/base/bit-field.h\"\n\n";
@@ -4037,10 +4037,10 @@ void EmitClassDefinitionHeadersIncludes(const std::string& basename,
header << "#include \"src/objects/objects.h\"\n";
header << "#include \"src/objects/heap-object.h\"\n";
header << "#include \"src/objects/smi.h\"\n";
- header << "#include \"torque-generated/field-offsets-tq.h\"\n";
+ header << "#include \"torque-generated/field-offsets.h\"\n";
header << "#include <type_traits>\n\n";
- inline_header << "#include \"torque-generated/class-definitions-tq.h\"\n";
+ inline_header << "#include \"torque-generated/class-definitions.h\"\n";
inline_header << "#include \"src/objects/js-function.h\"\n";
inline_header << "#include \"src/objects/js-objects.h\"\n";
inline_header << "#include \"src/objects/js-promise.h\"\n";
@@ -4086,7 +4086,7 @@ void ImplementationVisitor::GenerateClassDefinitions(
std::stringstream implementation;
std::stringstream factory_header;
std::stringstream factory_impl;
- std::string basename = "class-definitions-tq";
+ std::string basename = "class-definitions";
std::string internal_basename = "internal-" + basename;
std::string exported_basename = "exported-" + basename;
std::string file_basename = output_directory + "/" + basename;
@@ -4094,7 +4094,7 @@ void ImplementationVisitor::GenerateClassDefinitions(
output_directory + "/" + internal_basename;
std::string exported_file_basename =
output_directory + "/" + exported_basename;
- std::string factory_basename = "factory-tq";
+ std::string factory_basename = "factory";
std::string factory_file_basename = output_directory + "/" + factory_basename;
{
@@ -4115,17 +4115,17 @@ void ImplementationVisitor::GenerateClassDefinitions(
IncludeGuardScope exported_inline_header_guard(
inline_exported_header, exported_basename + "-inl.h");
- internal_header << "#include \"torque-generated/class-definitions-tq.h\"\n";
+ internal_header << "#include \"torque-generated/class-definitions.h\"\n";
internal_header << "#include \"src/objects/fixed-array.h\"\n";
inline_internal_header
- << "#include \"torque-generated/internal-class-definitions-tq.h\"\n";
+ << "#include \"torque-generated/internal-class-definitions.h\"\n";
inline_internal_header
- << "#include \"torque-generated/class-definitions-tq-inl.h\"\n";
+ << "#include \"torque-generated/class-definitions-inl.h\"\n";
exported_header << "#include \"src/objects/fixed-array.h\"\n";
- exported_header << "#include \"torque-generated/class-definitions-tq.h\"\n";
+ exported_header << "#include \"torque-generated/class-definitions.h\"\n";
inline_exported_header
- << "#include \"torque-generated/exported-class-definitions-tq.h\"\n";
+ << "#include \"torque-generated/exported-class-definitions.h\"\n";
inline_exported_header << "#include \"src/objects/fixed-array-inl.h\"\n";
EmitClassDefinitionHeadersIncludes(basename, external_header,
@@ -4165,26 +4165,23 @@ void ImplementationVisitor::GenerateClassDefinitions(
factory_impl << "#include \"src/heap/heap.h\"\n";
factory_impl << "#include \"src/heap/heap-inl.h\"\n";
factory_impl << "#include \"src/execution/isolate.h\"\n\n";
- factory_impl
- << "#include "
- "\"torque-generated/internal-class-definitions-tq-inl.h\"\n\n";
- factory_impl
- << "#include "
- "\"torque-generated/exported-class-definitions-tq-inl.h\"\n\n";
+ factory_impl << "#include "
+ "\"torque-generated/internal-class-definitions-inl.h\"\n\n";
+ factory_impl << "#include "
+ "\"torque-generated/exported-class-definitions-inl.h\"\n\n";
NamespaceScope factory_impl_namespaces(factory_impl, {"v8", "internal"});
factory_impl << "\n";
- implementation
- << "#include \"torque-generated/class-definitions-tq.h\"\n\n";
- implementation << "#include \"torque-generated/class-verifiers-tq.h\"\n\n";
+ implementation << "#include \"torque-generated/class-definitions.h\"\n\n";
+ implementation << "#include \"torque-generated/class-verifiers.h\"\n\n";
implementation
<< "#include \"src/objects/class-definitions-tq-deps-inl.h\"\n\n";
implementation
<< "#include "
- "\"torque-generated/internal-class-definitions-tq-inl.h\"\n\n";
+ "\"torque-generated/internal-class-definitions-inl.h\"\n\n";
implementation
<< "#include "
- "\"torque-generated/exported-class-definitions-tq-inl.h\"\n\n";
+ "\"torque-generated/exported-class-definitions-inl.h\"\n\n";
NamespaceScope implementation_namespaces(implementation,
{"v8", "internal"});
@@ -4339,16 +4336,16 @@ void GeneratePrintDefinitionsForClass(std::ostream& impl, const ClassType* type,
void ImplementationVisitor::GeneratePrintDefinitions(
const std::string& output_directory) {
std::stringstream impl;
- std::string file_name = "objects-printer-tq.cc";
+ std::string file_name = "objects-printer.cc";
{
IfDefScope object_print(impl, "OBJECT_PRINT");
impl << "#include \"src/objects/objects.h\"\n\n";
impl << "#include <iosfwd>\n\n";
impl << "#include "
- "\"torque-generated/internal-class-definitions-tq-inl.h\"\n";
+ "\"torque-generated/internal-class-definitions-inl.h\"\n";
impl << "#include "
- "\"torque-generated/exported-class-definitions-tq-inl.h\"\n";
+ "\"torque-generated/exported-class-definitions-inl.h\"\n";
impl << "#include \"src/objects/struct-inl.h\"\n\n";
impl << "#include \"src/objects/template-objects-inl.h\"\n\n";
@@ -4420,7 +4417,7 @@ base::Optional<std::string> MatchSimpleBodyDescriptor(const ClassType* type) {
void ImplementationVisitor::GenerateBodyDescriptors(
const std::string& output_directory) {
- std::string file_name = "objects-body-descriptors-tq-inl.inc";
+ std::string file_name = "objects-body-descriptors-inl.inc";
std::stringstream h_contents;
for (const ClassType* type : TypeOracle::GetClasses()) {
@@ -4656,7 +4653,7 @@ void GenerateClassFieldVerifier(const std::string& class_name,
void ImplementationVisitor::GenerateClassVerifiers(
const std::string& output_directory) {
- std::string file_name = "class-verifiers-tq";
+ std::string file_name = "class-verifiers";
std::stringstream h_contents;
std::stringstream cc_contents;
{
@@ -4671,9 +4668,9 @@ void ImplementationVisitor::GenerateClassVerifiers(
}
cc_contents << "#include \"torque-generated/" << file_name << ".h\"\n";
cc_contents << "#include "
- "\"torque-generated/internal-class-definitions-tq-inl.h\"\n";
+ "\"torque-generated/internal-class-definitions-inl.h\"\n";
cc_contents << "#include "
- "\"torque-generated/exported-class-definitions-tq-inl.h\"\n";
+ "\"torque-generated/exported-class-definitions-inl.h\"\n";
IncludeObjectMacrosScope object_macros(cc_contents);
@@ -4743,7 +4740,7 @@ void ImplementationVisitor::GenerateClassVerifiers(
void ImplementationVisitor::GenerateEnumVerifiers(
const std::string& output_directory) {
- std::string file_name = "enum-verifiers-tq";
+ std::string file_name = "enum-verifiers";
std::stringstream cc_contents;
{
cc_contents << "#include \"src/compiler/code-assembler.h\"\n";
@@ -4775,7 +4772,7 @@ void ImplementationVisitor::GenerateEnumVerifiers(
void ImplementationVisitor::GenerateExportedMacrosAssembler(
const std::string& output_directory) {
- std::string file_name = "exported-macros-assembler-tq";
+ std::string file_name = "exported-macros-assembler";
std::stringstream h_contents;
std::stringstream cc_contents;
{
@@ -4783,11 +4780,11 @@ void ImplementationVisitor::GenerateExportedMacrosAssembler(
h_contents << "#include \"src/compiler/code-assembler.h\"\n";
h_contents << "#include \"src/execution/frames.h\"\n";
- h_contents << "#include \"torque-generated/csa-types-tq.h\"\n";
+ h_contents << "#include \"torque-generated/csa-types.h\"\n";
h_contents
- << "#include \"torque-generated/internal-class-definitions-tq.h\"\n";
+ << "#include \"torque-generated/internal-class-definitions.h\"\n";
h_contents
- << "#include \"torque-generated/exported-class-definitions-tq.h\"\n";
+ << "#include \"torque-generated/exported-class-definitions.h\"\n";
cc_contents << "#include \"src/objects/fixed-array-inl.h\"\n";
cc_contents << "#include \"src/objects/free-space.h\"\n";
cc_contents << "#include \"src/objects/js-regexp-string-iterator.h\"\n";
@@ -4862,7 +4859,7 @@ void ImplementationVisitor::GenerateExportedMacrosAssembler(
void ImplementationVisitor::GenerateCSATypes(
const std::string& output_directory) {
- std::string file_name = "csa-types-tq";
+ std::string file_name = "csa-types";
std::stringstream h_contents;
{
IncludeGuardScope include_guard(h_contents, file_name + ".h");
diff --git a/deps/v8/src/torque/instance-type-generator.cc b/deps/v8/src/torque/instance-type-generator.cc
index 2b53383f61..cb45a7d801 100644
--- a/deps/v8/src/torque/instance-type-generator.cc
+++ b/deps/v8/src/torque/instance-type-generator.cc
@@ -372,7 +372,7 @@ void PrintInstanceTypes(InstanceTypeTree* root, std::ostream& definitions,
void ImplementationVisitor::GenerateInstanceTypes(
const std::string& output_directory) {
std::stringstream header;
- std::string file_name = "instance-types-tq.h";
+ std::string file_name = "instance-types.h";
{
IncludeGuardScope guard(header, file_name);
diff --git a/deps/v8/src/torque/torque-parser.cc b/deps/v8/src/torque/torque-parser.cc
index 14fdd97b18..51778161d9 100644
--- a/deps/v8/src/torque/torque-parser.cc
+++ b/deps/v8/src/torque/torque-parser.cc
@@ -965,8 +965,17 @@ base::Optional<ParseResult> MakeClassDeclaration(
std::vector<Declaration*> result;
result.push_back(MakeNode<ClassDeclaration>(
- name, flags, std::move(extends), std::move(generates), std::move(methods),
- fields, MakeInstanceTypeConstraints(annotations)));
+ name, flags, extends, std::move(generates), std::move(methods), fields,
+ MakeInstanceTypeConstraints(annotations)));
+
+ Identifier* constexpr_name =
+ MakeNode<Identifier>(CONSTEXPR_TYPE_PREFIX + name->value);
+ constexpr_name->pos = name->pos;
+ TypeExpression* constexpr_extends = AddConstexpr(extends);
+ TypeDeclaration* constexpr_decl = MakeNode<AbstractTypeDeclaration>(
+ constexpr_name, transient, constexpr_extends, name->value);
+ constexpr_decl->pos = name->pos;
+ result.push_back(constexpr_decl);
if ((flags & ClassFlag::kDoNotGenerateCast) == 0 &&
(flags & ClassFlag::kIsShape) == 0) {
diff --git a/deps/v8/src/torque/types.cc b/deps/v8/src/torque/types.cc
index 4260e8e4cb..df35c46300 100644
--- a/deps/v8/src/torque/types.cc
+++ b/deps/v8/src/torque/types.cc
@@ -74,10 +74,7 @@ std::string Type::SimpleName() const {
std::string Type::HandlifiedCppTypeName() const {
if (IsSubtypeOf(TypeOracle::GetSmiType())) return "int";
if (IsSubtypeOf(TypeOracle::GetTaggedType())) {
- base::Optional<const ClassType*> class_type = ClassSupertype();
- std::string type =
- class_type ? (*class_type)->GetGeneratedTNodeTypeName() : "Object";
- return "Handle<" + type + ">";
+ return "Handle<" + ConstexprVersion()->GetGeneratedTypeName() + ">";
} else {
return ConstexprVersion()->GetGeneratedTypeName();
}
diff --git a/deps/v8/src/utils/allocation.cc b/deps/v8/src/utils/allocation.cc
index 022ac82ea6..6169acbfd6 100644
--- a/deps/v8/src/utils/allocation.cc
+++ b/deps/v8/src/utils/allocation.cc
@@ -213,17 +213,15 @@ bool OnCriticalMemoryPressure(size_t length) {
VirtualMemory::VirtualMemory() = default;
VirtualMemory::VirtualMemory(v8::PageAllocator* page_allocator, size_t size,
- void* hint, size_t alignment, JitPermission jit)
+ void* hint, size_t alignment)
: page_allocator_(page_allocator) {
DCHECK_NOT_NULL(page_allocator);
DCHECK(IsAligned(size, page_allocator_->CommitPageSize()));
size_t page_size = page_allocator_->AllocatePageSize();
alignment = RoundUp(alignment, page_size);
- PageAllocator::Permission permissions =
- jit == kMapAsJittable ? PageAllocator::kNoAccessWillJitLater
- : PageAllocator::kNoAccess;
- Address address = reinterpret_cast<Address>(AllocatePages(
- page_allocator_, hint, RoundUp(size, page_size), alignment, permissions));
+ Address address = reinterpret_cast<Address>(
+ AllocatePages(page_allocator_, hint, RoundUp(size, page_size), alignment,
+ PageAllocator::kNoAccess));
if (address != kNullAddress) {
DCHECK(IsAligned(address, alignment));
region_ = base::AddressRegion(address, size);
diff --git a/deps/v8/src/utils/allocation.h b/deps/v8/src/utils/allocation.h
index a82012310b..7106b1c749 100644
--- a/deps/v8/src/utils/allocation.h
+++ b/deps/v8/src/utils/allocation.h
@@ -156,8 +156,6 @@ V8_EXPORT_PRIVATE bool OnCriticalMemoryPressure(size_t length);
// Represents and controls an area of reserved memory.
class VirtualMemory final {
public:
- enum JitPermission { kNoJit, kMapAsJittable };
-
// Empty VirtualMemory object, controlling no reserved memory.
V8_EXPORT_PRIVATE VirtualMemory();
@@ -166,8 +164,8 @@ class VirtualMemory final {
// size. The |size| must be aligned with |page_allocator|'s commit page size.
// This may not be at the position returned by address().
V8_EXPORT_PRIVATE VirtualMemory(v8::PageAllocator* page_allocator,
- size_t size, void* hint, size_t alignment = 1,
- JitPermission jit = kNoJit);
+ size_t size, void* hint,
+ size_t alignment = 1);
// Construct a virtual memory by assigning it some already mapped address
// and size.
diff --git a/deps/v8/src/utils/identity-map.cc b/deps/v8/src/utils/identity-map.cc
index e940b04395..909c175007 100644
--- a/deps/v8/src/utils/identity-map.cc
+++ b/deps/v8/src/utils/identity-map.cc
@@ -5,6 +5,7 @@
#include "src/utils/identity-map.h"
#include "src/base/functional.h"
+#include "src/base/logging.h"
#include "src/heap/heap.h"
#include "src/roots/roots-inl.h"
@@ -23,10 +24,12 @@ IdentityMapBase::~IdentityMapBase() {
void IdentityMapBase::Clear() {
if (keys_) {
DCHECK(!is_iterable());
- heap_->UnregisterStrongRoots(FullObjectSlot(keys_));
+ DCHECK_NOT_NULL(strong_roots_entry_);
+ heap_->UnregisterStrongRoots(strong_roots_entry_);
DeletePointerArray(reinterpret_cast<void**>(keys_), capacity_);
DeletePointerArray(values_, capacity_);
keys_ = nullptr;
+ strong_roots_entry_ = nullptr;
values_ = nullptr;
size_ = 0;
capacity_ = 0;
@@ -164,8 +167,8 @@ IdentityMapBase::RawEntry IdentityMapBase::GetEntry(Address key) {
values_ = NewPointerArray(capacity_);
memset(values_, 0, sizeof(void*) * capacity_);
- heap_->RegisterStrongRoots(FullObjectSlot(keys_),
- FullObjectSlot(keys_ + capacity_));
+ strong_roots_entry_ = heap_->RegisterStrongRoots(
+ FullObjectSlot(keys_), FullObjectSlot(keys_ + capacity_));
}
int index = LookupOrInsert(key);
return &values_[index];
@@ -284,9 +287,9 @@ void IdentityMapBase::Resize(int new_capacity) {
}
// Unregister old keys and register new keys.
- heap_->UnregisterStrongRoots(FullObjectSlot(old_keys));
- heap_->RegisterStrongRoots(FullObjectSlot(keys_),
- FullObjectSlot(keys_ + capacity_));
+ DCHECK_NOT_NULL(strong_roots_entry_);
+ heap_->UpdateStrongRoots(strong_roots_entry_, FullObjectSlot(keys_),
+ FullObjectSlot(keys_ + capacity_));
// Delete old storage;
DeletePointerArray(reinterpret_cast<void**>(old_keys), old_capacity);
diff --git a/deps/v8/src/utils/identity-map.h b/deps/v8/src/utils/identity-map.h
index a8d7b40bc2..362a3decfa 100644
--- a/deps/v8/src/utils/identity-map.h
+++ b/deps/v8/src/utils/identity-map.h
@@ -14,6 +14,7 @@ namespace internal {
// Forward declarations.
class Heap;
+class StrongRootsEntry;
// Base class of identity maps contains shared code for all template
// instantions.
@@ -38,6 +39,7 @@ class V8_EXPORT_PRIVATE IdentityMapBase {
capacity_(0),
mask_(0),
keys_(nullptr),
+ strong_roots_entry_(nullptr),
values_(nullptr),
is_iterable_(false) {}
virtual ~IdentityMapBase();
@@ -76,6 +78,7 @@ class V8_EXPORT_PRIVATE IdentityMapBase {
int capacity_;
int mask_;
Address* keys_;
+ StrongRootsEntry* strong_roots_entry_;
void** values_;
bool is_iterable_;
diff --git a/deps/v8/src/utils/utils.h b/deps/v8/src/utils/utils.h
index 2c7bb70bbd..7ec0dd2c00 100644
--- a/deps/v8/src/utils/utils.h
+++ b/deps/v8/src/utils/utils.h
@@ -505,6 +505,10 @@ class FeedbackSlot {
V8_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& os,
FeedbackSlot);
+ FeedbackSlot WithOffset(int offset) const {
+ return FeedbackSlot(id_ + offset);
+ }
+
private:
static const int kInvalidSlot = -1;
diff --git a/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h b/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h
index 14227ef50e..b4966c012b 100644
--- a/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h
+++ b/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h
@@ -5,6 +5,7 @@
#ifndef V8_WASM_BASELINE_ARM_LIFTOFF_ASSEMBLER_ARM_H_
#define V8_WASM_BASELINE_ARM_LIFTOFF_ASSEMBLER_ARM_H_
+#include "src/heap/memory-chunk.h"
#include "src/wasm/baseline/liftoff-assembler.h"
#include "src/wasm/baseline/liftoff-register.h"
@@ -272,6 +273,8 @@ inline void Store(LiftoffAssembler* assm, LiftoffRegister src, MemOperand dst,
#endif
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kOptRef:
+ case ValueType::kRef:
assm->str(src.gp(), dst);
break;
case ValueType::kI64:
@@ -303,6 +306,8 @@ inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, MemOperand src,
ValueType type) {
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kOptRef:
+ case ValueType::kRef:
assm->ldr(dst.gp(), src);
break;
case ValueType::kI64:
@@ -497,13 +502,7 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
}
bool LiftoffAssembler::NeedsAlignment(ValueType type) {
- switch (type.kind()) {
- case ValueType::kS128:
- return true;
- default:
- // No alignment because all other types are kStackSlotSize.
- return false;
- }
+ return (type.kind() == ValueType::kS128 || type.is_reference_type());
}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
@@ -661,6 +660,29 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
offset_imm, LoadType::kI32Load, pinned);
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ STATIC_ASSERT(kTaggedSize == kInt32Size);
+ // Store the value.
+ MemOperand dst_op(dst_addr, offset_imm);
+ str(src.gp(), dst_op);
+ // The write barrier.
+ Label write_barrier;
+ Label exit;
+ CheckPageFlag(dst_addr, MemoryChunk::kPointersFromHereAreInterestingMask, ne,
+ &write_barrier);
+ b(&exit);
+ bind(&write_barrier);
+ JumpIfSmi(src.gp(), &exit);
+ CheckPageFlag(src.gp(), MemoryChunk::kPointersToHereAreInterestingMask, eq,
+ &exit);
+ CallRecordWriteStub(dst_addr, Operand(offset_imm), EMIT_REMEMBERED_SET,
+ kSaveFPRegs, wasm::WasmCode::kRecordWrite);
+ bind(&exit);
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
@@ -1283,7 +1305,7 @@ void LiftoffAssembler::MoveStackValue(uint32_t dst_offset, uint32_t src_offset,
void LiftoffAssembler::Move(Register dst, Register src, ValueType type) {
DCHECK_NE(dst, src);
- DCHECK_EQ(type, kWasmI32);
+ DCHECK(type == kWasmI32 || type.is_reference_type());
TurboAssembler::Move(dst, src);
}
@@ -2256,7 +2278,7 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
}
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
UseScratchRegisterScope temps(this);
@@ -2311,6 +2333,54 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
vsqrt(dst.high_fp(), src.high_fp());
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintp(dst.low_fp(), src.low_fp());
+ vrintp(dst.high_fp(), src.high_fp());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintm(dst.low_fp(), src.low_fp());
+ vrintm(dst.high_fp(), src.high_fp());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintz(dst.low_fp(), src.low_fp());
+ vrintz(dst.high_fp(), src.high_fp());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintn(dst.low_fp(), src.low_fp());
+ vrintn(dst.high_fp(), src.high_fp());
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
vadd(dst.low_fp(), lhs.low_fp(), rhs.low_fp());
@@ -2359,6 +2429,38 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
liftoff::MinOrMax::kMax);
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ QwNeonRegister dest = liftoff::GetSimd128Register(dst);
+ QwNeonRegister left = liftoff::GetSimd128Register(lhs);
+ QwNeonRegister right = liftoff::GetSimd128Register(rhs);
+
+ if (dst != rhs) {
+ vmov(dest, left);
+ }
+
+ VFPCompareAndSetFlags(right.low(), left.low());
+ vmov(dest.low(), right.low(), mi);
+ VFPCompareAndSetFlags(right.high(), left.high());
+ vmov(dest.high(), right.high(), mi);
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ QwNeonRegister dest = liftoff::GetSimd128Register(dst);
+ QwNeonRegister left = liftoff::GetSimd128Register(lhs);
+ QwNeonRegister right = liftoff::GetSimd128Register(rhs);
+
+ if (dst != rhs) {
+ vmov(dest, left);
+ }
+
+ VFPCompareAndSetFlags(right.low(), left.low());
+ vmov(dest.low(), right.low(), gt);
+ VFPCompareAndSetFlags(right.high(), left.high());
+ vmov(dest.high(), right.high(), gt);
+}
+
void LiftoffAssembler::emit_f32x4_splat(LiftoffRegister dst,
LiftoffRegister src) {
vdup(Neon32, liftoff::GetSimd128Register(dst), src.fp(), 0);
@@ -2406,6 +2508,54 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
vsqrt(dst_high.high(), src_high.high());
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintp(NeonS32, liftoff::GetSimd128Register(dst),
+ liftoff::GetSimd128Register(src));
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintm(NeonS32, liftoff::GetSimd128Register(dst),
+ liftoff::GetSimd128Register(src));
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintz(NeonS32, liftoff::GetSimd128Register(dst),
+ liftoff::GetSimd128Register(src));
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ if (!CpuFeatures::IsSupported(ARMv8)) {
+ return false;
+ }
+
+ CpuFeatureScope scope(this, ARMv8);
+ vrintn(NeonS32, liftoff::GetSimd128Register(dst),
+ liftoff::GetSimd128Register(src));
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
vadd(liftoff::GetSimd128Register(dst), liftoff::GetSimd128Register(lhs),
@@ -2454,6 +2604,44 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
liftoff::GetSimd128Register(rhs));
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ UseScratchRegisterScope temps(this);
+
+ QwNeonRegister tmp = liftoff::GetSimd128Register(dst);
+ if (dst == lhs || dst == rhs) {
+ tmp = temps.AcquireQ();
+ }
+
+ QwNeonRegister left = liftoff::GetSimd128Register(lhs);
+ QwNeonRegister right = liftoff::GetSimd128Register(rhs);
+ vcgt(tmp, left, right);
+ vbsl(tmp, right, left);
+
+ if (dst == lhs || dst == rhs) {
+ vmov(liftoff::GetSimd128Register(dst), tmp);
+ }
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ UseScratchRegisterScope temps(this);
+
+ QwNeonRegister tmp = liftoff::GetSimd128Register(dst);
+ if (dst == lhs || dst == rhs) {
+ tmp = temps.AcquireQ();
+ }
+
+ QwNeonRegister left = liftoff::GetSimd128Register(lhs);
+ QwNeonRegister right = liftoff::GetSimd128Register(rhs);
+ vcgt(tmp, right, left);
+ vbsl(tmp, right, left);
+
+ if (dst == lhs || dst == rhs) {
+ vmov(liftoff::GetSimd128Register(dst), tmp);
+ }
+}
+
void LiftoffAssembler::emit_i64x2_splat(LiftoffRegister dst,
LiftoffRegister src) {
Simd128Register dst_simd = liftoff::GetSimd128Register(dst);
@@ -2488,8 +2676,8 @@ void LiftoffAssembler::emit_i64x2_neg(LiftoffRegister dst,
QwNeonRegister zero =
dst == src ? temps.AcquireQ() : liftoff::GetSimd128Register(dst);
vmov(zero, uint64_t{0});
- vqsub(NeonS64, liftoff::GetSimd128Register(dst), zero,
- liftoff::GetSimd128Register(src));
+ vsub(Neon64, liftoff::GetSimd128Register(dst), zero,
+ liftoff::GetSimd128Register(src));
}
void LiftoffAssembler::emit_i64x2_shl(LiftoffRegister dst, LiftoffRegister lhs,
@@ -2918,7 +3106,7 @@ void LiftoffAssembler::emit_i16x8_replace_lane(LiftoffRegister dst,
imm_lane_idx);
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
@@ -3575,6 +3763,11 @@ void LiftoffAssembler::CallC(const wasm::FunctionSig* sig,
case ValueType::kF64:
vstr(args->fp(), MemOperand(sp, arg_bytes));
break;
+ case ValueType::kS128:
+ vstr(args->low_fp(), MemOperand(sp, arg_bytes));
+ vstr(args->high_fp(),
+ MemOperand(sp, arg_bytes + 2 * kSystemPointerSize));
+ break;
default:
UNREACHABLE();
}
@@ -3618,6 +3811,10 @@ void LiftoffAssembler::CallC(const wasm::FunctionSig* sig,
case ValueType::kF64:
vldr(result_reg->fp(), MemOperand(sp));
break;
+ case ValueType::kS128:
+ vld1(Neon8, NeonListOperand(result_reg->low_fp(), 2),
+ NeonMemOperand(sp));
+ break;
default:
UNREACHABLE();
}
diff --git a/deps/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h b/deps/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h
index 219261a665..4fe3abc544 100644
--- a/deps/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h
+++ b/deps/v8/src/wasm/baseline/arm64/liftoff-assembler-arm64.h
@@ -5,6 +5,7 @@
#ifndef V8_WASM_BASELINE_ARM64_LIFTOFF_ASSEMBLER_ARM64_H_
#define V8_WASM_BASELINE_ARM64_LIFTOFF_ASSEMBLER_ARM64_H_
+#include "src/heap/memory-chunk.h"
#include "src/wasm/baseline/liftoff-assembler.h"
namespace v8 {
@@ -50,6 +51,8 @@ inline CPURegister GetRegFromType(const LiftoffRegister& reg, ValueType type) {
case ValueType::kI32:
return reg.gp().W();
case ValueType::kI64:
+ case ValueType::kRef:
+ case ValueType::kOptRef:
return reg.gp().X();
case ValueType::kF32:
return reg.fp().S();
@@ -276,13 +279,7 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
}
bool LiftoffAssembler::NeedsAlignment(ValueType type) {
- switch (type.kind()) {
- case ValueType::kS128:
- return true;
- default:
- // No alignment because all other types are kStackSlotSize.
- return false;
- }
+ return type.kind() == ValueType::kS128 || type.is_reference_type();
}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
@@ -342,6 +339,31 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
LoadTaggedPointerField(dst, src_op);
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ // Store the value.
+ MemOperand dst_op(dst_addr, offset_imm);
+ StoreTaggedField(src.gp(), dst_op);
+ // The write barrier.
+ Label write_barrier;
+ Label exit;
+ CheckPageFlag(dst_addr, MemoryChunk::kPointersFromHereAreInterestingMask, eq,
+ &write_barrier);
+ b(&exit);
+ bind(&write_barrier);
+ JumpIfSmi(src.gp(), &exit);
+ if (COMPRESS_POINTERS_BOOL) {
+ DecompressTaggedPointer(src.gp(), src.gp());
+ }
+ CheckPageFlag(src.gp(), MemoryChunk::kPointersToHereAreInterestingMask, ne,
+ &exit);
+ CallRecordWriteStub(dst_addr, Operand(offset_imm), EMIT_REMEMBERED_SET,
+ kSaveFPRegs, wasm::WasmCode::kRecordWrite);
+ bind(&exit);
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
@@ -735,7 +757,7 @@ void LiftoffAssembler::Move(Register dst, Register src, ValueType type) {
if (type == kWasmI32) {
Mov(dst.W(), src.W());
} else {
- DCHECK_EQ(kWasmI64, type);
+ DCHECK(kWasmI64 == type || type.is_reference_type());
Mov(dst.X(), src.X());
}
}
@@ -1500,7 +1522,7 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
}
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
Tbl(dst.fp().V16B(), lhs.fp().V16B(), rhs.fp().V16B());
@@ -1542,6 +1564,30 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
Fsqrt(dst.fp().V2D(), src.fp().V2D());
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintp(dst.fp().V2D(), src.fp().V2D());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintm(dst.fp().V2D(), src.fp().V2D());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintz(dst.fp().V2D(), src.fp().V2D());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintn(dst.fp().V2D(), src.fp().V2D());
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
Fadd(dst.fp().V2D(), lhs.fp().V2D(), rhs.fp().V2D());
@@ -1572,6 +1618,40 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
Fmax(dst.fp().V2D(), lhs.fp().V2D(), rhs.fp().V2D());
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ UseScratchRegisterScope temps(this);
+
+ VRegister tmp = dst.fp();
+ if (dst == lhs || dst == rhs) {
+ tmp = temps.AcquireV(kFormat2D);
+ }
+
+ Fcmgt(tmp.V2D(), lhs.fp().V2D(), rhs.fp().V2D());
+ Bsl(tmp.V16B(), rhs.fp().V16B(), lhs.fp().V16B());
+
+ if (dst == lhs || dst == rhs) {
+ Mov(dst.fp().V2D(), tmp);
+ }
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ UseScratchRegisterScope temps(this);
+
+ VRegister tmp = dst.fp();
+ if (dst == lhs || dst == rhs) {
+ tmp = temps.AcquireV(kFormat2D);
+ }
+
+ Fcmgt(tmp.V2D(), rhs.fp().V2D(), lhs.fp().V2D());
+ Bsl(tmp.V16B(), rhs.fp().V16B(), lhs.fp().V16B());
+
+ if (dst == lhs || dst == rhs) {
+ Mov(dst.fp().V2D(), tmp);
+ }
+}
+
void LiftoffAssembler::emit_f32x4_splat(LiftoffRegister dst,
LiftoffRegister src) {
Dup(dst.fp().V4S(), src.fp().S(), 0);
@@ -1608,6 +1688,30 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
Fsqrt(dst.fp().V4S(), src.fp().V4S());
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintp(dst.fp().V4S(), src.fp().V4S());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintm(dst.fp().V4S(), src.fp().V4S());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintz(dst.fp().V4S(), src.fp().V4S());
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ Frintn(dst.fp().V4S(), src.fp().V4S());
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
Fadd(dst.fp().V4S(), lhs.fp().V4S(), rhs.fp().V4S());
@@ -1638,6 +1742,40 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
Fmax(dst.fp().V4S(), lhs.fp().V4S(), rhs.fp().V4S());
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ UseScratchRegisterScope temps(this);
+
+ VRegister tmp = dst.fp();
+ if (dst == lhs || dst == rhs) {
+ tmp = temps.AcquireV(kFormat4S);
+ }
+
+ Fcmgt(tmp.V4S(), lhs.fp().V4S(), rhs.fp().V4S());
+ Bsl(tmp.V16B(), rhs.fp().V16B(), lhs.fp().V16B());
+
+ if (dst == lhs || dst == rhs) {
+ Mov(dst.fp().V4S(), tmp);
+ }
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ UseScratchRegisterScope temps(this);
+
+ VRegister tmp = dst.fp();
+ if (dst == lhs || dst == rhs) {
+ tmp = temps.AcquireV(kFormat4S);
+ }
+
+ Fcmgt(tmp.V4S(), rhs.fp().V4S(), lhs.fp().V4S());
+ Bsl(tmp.V16B(), rhs.fp().V16B(), lhs.fp().V16B());
+
+ if (dst == lhs || dst == rhs) {
+ Mov(dst.fp().V4S(), tmp);
+ }
+}
+
void LiftoffAssembler::emit_i64x2_splat(LiftoffRegister dst,
LiftoffRegister src) {
Dup(dst.fp().V2D(), src.gp().X());
@@ -2025,7 +2163,7 @@ void LiftoffAssembler::emit_i16x8_max_u(LiftoffRegister dst,
Umax(dst.fp().V8H(), lhs.fp().V8H(), rhs.fp().V8H());
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
diff --git a/deps/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h b/deps/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h
index 82b5d90777..3c2fccc997 100644
--- a/deps/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h
+++ b/deps/v8/src/wasm/baseline/ia32/liftoff-assembler-ia32.h
@@ -6,6 +6,7 @@
#define V8_WASM_BASELINE_IA32_LIFTOFF_ASSEMBLER_IA32_H_
#include "src/codegen/assembler.h"
+#include "src/heap/memory-chunk.h"
#include "src/wasm/baseline/liftoff-assembler.h"
#include "src/wasm/simd-shuffle.h"
#include "src/wasm/value-type.h"
@@ -42,6 +43,8 @@ inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Register base,
Operand src(base, offset);
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kOptRef:
+ case ValueType::kRef:
assm->mov(dst.gp(), src);
break;
case ValueType::kI64:
@@ -229,7 +232,9 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
return type.element_size_bytes();
}
-bool LiftoffAssembler::NeedsAlignment(ValueType type) { return false; }
+bool LiftoffAssembler::NeedsAlignment(ValueType type) {
+ return type.is_reference_type();
+}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
RelocInfo::Mode rmode) {
@@ -287,6 +292,34 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
static_cast<uint32_t>(offset_imm), LoadType::kI32Load, pinned);
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ DCHECK_GE(offset_imm, 0);
+ DCHECK_LE(offset_imm, std::numeric_limits<int32_t>::max());
+ STATIC_ASSERT(kTaggedSize == kInt32Size);
+ Register scratch = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
+ Operand dst_op = Operand(dst_addr, offset_imm);
+ mov(dst_op, src.gp());
+
+ Label write_barrier;
+ Label exit;
+ CheckPageFlag(dst_addr, scratch,
+ MemoryChunk::kPointersFromHereAreInterestingMask, not_zero,
+ &write_barrier, Label::kNear);
+ jmp(&exit, Label::kNear);
+ bind(&write_barrier);
+ JumpIfSmi(src.gp(), &exit, Label::kNear);
+ CheckPageFlag(src.gp(), scratch,
+ MemoryChunk::kPointersToHereAreInterestingMask, zero, &exit,
+ Label::kNear);
+ lea(scratch, dst_op);
+ CallRecordWriteStub(dst_addr, scratch, EMIT_REMEMBERED_SET, kSaveFPRegs,
+ wasm::WasmCode::kRecordWrite);
+ bind(&exit);
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
@@ -890,6 +923,16 @@ void LiftoffAssembler::AtomicCompareExchange(
Register expected_reg = is_64_bit_op ? expected.low_gp() : expected.gp();
Register result_reg = expected_reg;
+ // The cmpxchg instruction uses eax to store the old value of the
+ // compare-exchange primitive. Therefore we have to spill the register and
+ // move any use to another register.
+ ClearRegister(eax, {&dst_addr, &value_reg},
+ LiftoffRegList::ForRegs(dst_addr, value_reg, expected_reg));
+ if (expected_reg != eax) {
+ mov(eax, expected_reg);
+ expected_reg = eax;
+ }
+
bool is_byte_store = type.size() == 1;
LiftoffRegList pinned =
LiftoffRegList::ForRegs(dst_addr, value_reg, expected_reg);
@@ -903,13 +946,6 @@ void LiftoffAssembler::AtomicCompareExchange(
pinned.clear(LiftoffRegister(value_reg));
}
- // The cmpxchg instruction uses eax to store the old value of the
- // compare-exchange primitive. Therefore we have to spill the register and
- // move any use to another register.
- ClearRegister(eax, {&dst_addr, &value_reg}, pinned);
- if (expected_reg != eax) {
- mov(eax, expected_reg);
- }
Operand dst_op = Operand(dst_addr, offset_imm);
@@ -1028,7 +1064,7 @@ void LiftoffAssembler::MoveStackValue(uint32_t dst_offset, uint32_t src_offset,
void LiftoffAssembler::Move(Register dst, Register src, ValueType type) {
DCHECK_NE(dst, src);
- DCHECK_EQ(kWasmI32, type);
+ DCHECK(kWasmI32 == type || type.is_reference_type());
mov(dst, src);
}
@@ -1050,6 +1086,8 @@ void LiftoffAssembler::Spill(int offset, LiftoffRegister reg, ValueType type) {
Operand dst = liftoff::GetStackSlot(offset);
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kOptRef:
+ case ValueType::kRef:
mov(dst, reg.gp());
break;
case ValueType::kI64:
@@ -2645,7 +2683,7 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
}
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
@@ -2704,11 +2742,10 @@ void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
mov(esp, tmp.gp());
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
- XMMRegister mask =
- GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(lhs, rhs)).fp();
+ XMMRegister mask = liftoff::kScratchDoubleReg;
// Out-of-range indices should return 0, add 112 (0x70) so that any value > 15
// saturates to 128 (top bit set), so pshufb will zero that lane.
TurboAssembler::Move(mask, uint32_t{0x70707070});
@@ -2853,7 +2890,7 @@ void LiftoffAssembler::emit_i16x8_gt_u(LiftoffRegister dst, LiftoffRegister lhs,
ref = liftoff::kScratchDoubleReg;
}
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpmaxuw, &Assembler::pmaxuw>(
- this, dst, lhs, rhs);
+ this, dst, lhs, rhs, SSE4_1);
Pcmpeqw(dst.fp(), ref);
Pcmpeqw(liftoff::kScratchDoubleReg, liftoff::kScratchDoubleReg);
Pxor(dst.fp(), liftoff::kScratchDoubleReg);
@@ -2912,7 +2949,7 @@ void LiftoffAssembler::emit_i32x4_gt_u(LiftoffRegister dst, LiftoffRegister lhs,
ref = liftoff::kScratchDoubleReg;
}
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpmaxud, &Assembler::pmaxud>(
- this, dst, lhs, rhs);
+ this, dst, lhs, rhs, SSE4_1);
Pcmpeqd(dst.fp(), ref);
Pcmpeqd(liftoff::kScratchDoubleReg, liftoff::kScratchDoubleReg);
Pxor(dst.fp(), liftoff::kScratchDoubleReg);
@@ -3157,7 +3194,8 @@ void LiftoffAssembler::emit_i8x16_shri_u(LiftoffRegister dst,
Register tmp = GetUnusedRegister(kGpReg, {}).gp();
// Perform 16-bit shift, then mask away high bits.
uint8_t shift = rhs & 7;
- Psrlw(dst.fp(), lhs.fp(), byte{shift});
+ liftoff::EmitSimdShiftOpImm<&Assembler::vpsrlw, &Assembler::psrlw, 3>(
+ this, dst, lhs, rhs);
uint8_t bmask = 0xff >> shift;
uint32_t mask = bmask << 24 | bmask << 16 | bmask << 8 | bmask;
@@ -3593,7 +3631,15 @@ void LiftoffAssembler::emit_i64x2_shr_s(LiftoffRegister dst,
Psllq(tmp, tmp, 63);
Psrlq(tmp, tmp, shift);
- Psrlq(dst.fp(), lhs.fp(), shift);
+ if (CpuFeatures::IsSupported(AVX)) {
+ CpuFeatureScope scope(this, AVX);
+ vpsrlq(dst.fp(), lhs.fp(), shift);
+ } else {
+ if (dst != lhs) {
+ movaps(dst.fp(), lhs.fp());
+ }
+ psrlq(dst.fp(), shift);
+ }
Pxor(dst.fp(), tmp);
Psubq(dst.fp(), tmp);
}
@@ -3608,7 +3654,8 @@ void LiftoffAssembler::emit_i64x2_shri_s(LiftoffRegister dst,
Psllq(tmp, tmp, 63);
Psrlq(tmp, tmp, shift);
- Psrlq(dst.fp(), lhs.fp(), shift);
+ liftoff::EmitSimdShiftOpImm<&Assembler::vpsrlq, &Assembler::psrlq, 6>(
+ this, dst, lhs, rhs);
Pxor(dst.fp(), tmp);
Psubq(dst.fp(), tmp);
}
@@ -3696,6 +3743,34 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
Sqrtps(dst.fp(), src.fp());
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundUp);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundDown);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundToZero);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundToNearest);
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
liftoff::EmitSimdCommutativeBinOp<&Assembler::vaddps, &Assembler::addps>(
@@ -3779,6 +3854,20 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
Andnps(dst.fp(), liftoff::kScratchDoubleReg);
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way minps works, pmin(a, b) = minps(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vminps, &Assembler::minps>(
+ this, dst, rhs, lhs);
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way maxps works, pmax(a, b) = maxps(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vmaxps, &Assembler::maxps>(
+ this, dst, rhs, lhs);
+}
+
void LiftoffAssembler::emit_f64x2_abs(LiftoffRegister dst,
LiftoffRegister src) {
if (dst.fp() == src.fp()) {
@@ -3810,6 +3899,34 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
Sqrtpd(dst.fp(), src.fp());
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundUp);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundDown);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundToZero);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundToNearest);
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
liftoff::EmitSimdCommutativeBinOp<&Assembler::vaddpd, &Assembler::addpd>(
@@ -3893,6 +4010,20 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
Andnpd(dst.fp(), liftoff::kScratchDoubleReg);
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way minpd works, pmin(a, b) = minpd(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vminpd, &Assembler::minpd>(
+ this, dst, rhs, lhs);
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way maxpd works, pmax(a, b) = maxpd(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vmaxpd, &Assembler::maxpd>(
+ this, dst, rhs, lhs);
+}
+
void LiftoffAssembler::emit_i32x4_sconvert_f32x4(LiftoffRegister dst,
LiftoffRegister src) {
// NAN->0
diff --git a/deps/v8/src/wasm/baseline/liftoff-assembler.cc b/deps/v8/src/wasm/baseline/liftoff-assembler.cc
index 164325867e..e219025e53 100644
--- a/deps/v8/src/wasm/baseline/liftoff-assembler.cc
+++ b/deps/v8/src/wasm/baseline/liftoff-assembler.cc
@@ -488,6 +488,35 @@ void LiftoffAssembler::CacheState::Split(const CacheState& source) {
*this = source;
}
+void LiftoffAssembler::CacheState::DefineSafepoint(Safepoint& safepoint) {
+ for (auto slot : stack_state) {
+ DCHECK(!slot.is_reg());
+
+ if (slot.type().is_reference_type()) {
+ // index = 0 is for the stack slot at 'fp + kFixedFrameSizeAboveFp -
+ // kSystemPointerSize', the location of the current stack slot is 'fp -
+ // slot.offset()'. The index we need is therefore '(fp +
+ // kFixedFrameSizeAboveFp - kSystemPointerSize) - (fp - slot.offset())' =
+ // 'slot.offset() + kFixedFrameSizeAboveFp - kSystemPointerSize'.
+ auto index =
+ (slot.offset() + StandardFrameConstants::kFixedFrameSizeAboveFp -
+ kSystemPointerSize) /
+ kSystemPointerSize;
+ safepoint.DefinePointerSlot(index);
+ }
+ }
+}
+
+int LiftoffAssembler::GetTotalFrameSlotCountForGC() const {
+ // The GC does not care about the actual number of spill slots, just about
+ // the number of references that could be there in the spilling area. Note
+ // that the offset of the first spill slot is kSystemPointerSize and not
+ // '0'. Therefore we don't have to add '+1' here.
+ return (max_used_spill_offset_ +
+ StandardFrameConstants::kFixedFrameSizeAboveFp) /
+ kSystemPointerSize;
+}
+
namespace {
constexpr AssemblerOptions DefaultLiftoffOptions() {
@@ -578,6 +607,28 @@ void LiftoffAssembler::PrepareLoopArgs(int num) {
}
}
+void LiftoffAssembler::MaterializeMergedConstants(uint32_t arity) {
+ // Materialize constants on top of the stack ({arity} many), and locals.
+ VarState* stack_base = cache_state_.stack_state.data();
+ for (auto slots :
+ {VectorOf(stack_base + cache_state_.stack_state.size() - arity, arity),
+ VectorOf(stack_base, num_locals())}) {
+ for (VarState& slot : slots) {
+ if (!slot.is_const()) continue;
+ RegClass rc = reg_class_for(slot.type());
+ if (cache_state_.has_unused_register(rc)) {
+ LiftoffRegister reg = cache_state_.unused_register(rc);
+ LoadConstant(reg, slot.constant());
+ cache_state_.inc_used(reg);
+ slot.MakeRegister(reg);
+ } else {
+ Spill(slot.offset(), slot.constant());
+ slot.MakeStack();
+ }
+ }
+ }
+}
+
void LiftoffAssembler::MergeFullStackWith(const CacheState& target,
const CacheState& source) {
DCHECK_EQ(source.stack_height(), target.stack_height());
@@ -720,6 +771,7 @@ void LiftoffAssembler::PrepareBuiltinCall(
LiftoffRegList param_regs;
PrepareStackTransfers(sig, call_descriptor, params.begin(), &stack_slots,
&stack_transfers, &param_regs);
+ SpillAllRegisters();
// Create all the slots.
// Builtin stack parameters are pushed in reversed order.
stack_slots.Reverse();
@@ -729,7 +781,6 @@ void LiftoffAssembler::PrepareBuiltinCall(
// Reset register use counters.
cache_state_.reset_used_registers();
- SpillAllRegisters();
}
void LiftoffAssembler::PrepareCall(const FunctionSig* sig,
diff --git a/deps/v8/src/wasm/baseline/liftoff-assembler.h b/deps/v8/src/wasm/baseline/liftoff-assembler.h
index be17b192db..e2bd99841f 100644
--- a/deps/v8/src/wasm/baseline/liftoff-assembler.h
+++ b/deps/v8/src/wasm/baseline/liftoff-assembler.h
@@ -135,6 +135,8 @@ class LiftoffAssembler : public TurboAssembler {
// Disallow copy construction.
CacheState(const CacheState&) = delete;
+ void DefineSafepoint(Safepoint& safepoint);
+
base::SmallVector<VarState, 8> stack_state;
LiftoffRegList used_registers;
uint32_t register_use_count[kAfterMaxLiftoffRegCode] = {0};
@@ -381,6 +383,8 @@ class LiftoffAssembler : public TurboAssembler {
return SpillOneRegister(candidates, pinned);
}
+ void MaterializeMergedConstants(uint32_t arity);
+
void MergeFullStackWith(const CacheState& target, const CacheState& source);
void MergeStackWith(const CacheState& target, uint32_t arity);
@@ -481,6 +485,8 @@ class LiftoffAssembler : public TurboAssembler {
inline void LoadTaggedPointer(Register dst, Register src_addr,
Register offset_reg, int32_t offset_imm,
LiftoffRegList pinned);
+ inline void StoreTaggedPointer(Register dst_addr, int32_t offset_imm,
+ LiftoffRegister src, LiftoffRegList pinned);
inline void Load(LiftoffRegister dst, Register src_addr, Register offset_reg,
uint32_t offset_imm, LoadType type, LiftoffRegList pinned,
uint32_t* protected_load_pc = nullptr,
@@ -755,10 +761,10 @@ class LiftoffAssembler : public TurboAssembler {
Register offset_reg, uint32_t offset_imm,
LoadType type, LoadTransformationKind transform,
uint32_t* protected_load_pc);
- inline void emit_s8x16_shuffle(LiftoffRegister dst, LiftoffRegister lhs,
+ inline void emit_i8x16_shuffle(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs, const uint8_t shuffle[16],
bool is_swizzle);
- inline void emit_s8x16_swizzle(LiftoffRegister dst, LiftoffRegister lhs,
+ inline void emit_i8x16_swizzle(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs);
inline void emit_i8x16_splat(LiftoffRegister dst, LiftoffRegister src);
inline void emit_i16x8_splat(LiftoffRegister dst, LiftoffRegister src);
@@ -964,6 +970,10 @@ class LiftoffAssembler : public TurboAssembler {
inline void emit_f32x4_abs(LiftoffRegister dst, LiftoffRegister src);
inline void emit_f32x4_neg(LiftoffRegister dst, LiftoffRegister src);
inline void emit_f32x4_sqrt(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f32x4_ceil(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f32x4_floor(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f32x4_trunc(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f32x4_nearest_int(LiftoffRegister dst, LiftoffRegister src);
inline void emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs);
inline void emit_f32x4_sub(LiftoffRegister dst, LiftoffRegister lhs,
@@ -976,9 +986,17 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister rhs);
inline void emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs);
+ inline void emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs);
+ inline void emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs);
inline void emit_f64x2_abs(LiftoffRegister dst, LiftoffRegister src);
inline void emit_f64x2_neg(LiftoffRegister dst, LiftoffRegister src);
inline void emit_f64x2_sqrt(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f64x2_ceil(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f64x2_floor(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f64x2_trunc(LiftoffRegister dst, LiftoffRegister src);
+ inline bool emit_f64x2_nearest_int(LiftoffRegister dst, LiftoffRegister src);
inline void emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs);
inline void emit_f64x2_sub(LiftoffRegister dst, LiftoffRegister lhs,
@@ -991,6 +1009,10 @@ class LiftoffAssembler : public TurboAssembler {
LiftoffRegister rhs);
inline void emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs);
+ inline void emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs);
+ inline void emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs);
inline void emit_i32x4_sconvert_f32x4(LiftoffRegister dst,
LiftoffRegister src);
inline void emit_i32x4_uconvert_f32x4(LiftoffRegister dst,
@@ -1117,10 +1139,7 @@ class LiftoffAssembler : public TurboAssembler {
uint32_t num_locals() const { return num_locals_; }
void set_num_locals(uint32_t num_locals);
- int GetTotalFrameSlotCount() const {
- // TODO(zhin): Temporary for migration from index to offset.
- return ((max_used_spill_offset_ + kStackSlotSize - 1) / kStackSlotSize);
- }
+ int GetTotalFrameSlotCountForGC() const;
int GetTotalFrameSize() const { return max_used_spill_offset_; }
diff --git a/deps/v8/src/wasm/baseline/liftoff-compiler.cc b/deps/v8/src/wasm/baseline/liftoff-compiler.cc
index c4cb012e81..447be8cdae 100644
--- a/deps/v8/src/wasm/baseline/liftoff-compiler.cc
+++ b/deps/v8/src/wasm/baseline/liftoff-compiler.cc
@@ -7,6 +7,7 @@
#include "src/base/optional.h"
#include "src/codegen/assembler-inl.h"
// TODO(clemensb): Remove dependences on compiler stuff.
+#include "src/codegen/external-reference.h"
#include "src/codegen/interface-descriptors.h"
#include "src/codegen/machine-type.h"
#include "src/codegen/macro-assembler-inl.h"
@@ -120,11 +121,17 @@ compiler::CallDescriptor* GetLoweredCallDescriptor(
: call_desc;
}
-constexpr ValueType kSupportedTypesArr[] = {kWasmI32, kWasmI64, kWasmF32,
- kWasmF64, kWasmS128};
+constexpr ValueType kSupportedTypesArr[] = {
+ kWasmI32, kWasmI64, kWasmF32, kWasmF64,
+ kWasmS128, kWasmExternRef, kWasmFuncRef};
constexpr Vector<const ValueType> kSupportedTypes =
ArrayVector(kSupportedTypesArr);
+constexpr ValueType kSupportedTypesWithoutRefsArr[] = {
+ kWasmI32, kWasmI64, kWasmF32, kWasmF64, kWasmS128};
+constexpr Vector<const ValueType> kSupportedTypesWithoutRefs =
+ ArrayVector(kSupportedTypesWithoutRefsArr);
+
constexpr Condition GetCompareCondition(WasmOpcode opcode) {
switch (opcode) {
case kExprI32Eq:
@@ -333,7 +340,7 @@ class LiftoffCompiler {
std::unique_ptr<AssemblerBuffer> buffer,
DebugSideTableBuilder* debug_sidetable_builder,
ForDebugging for_debugging, int func_index,
- Vector<int> breakpoints = {})
+ Vector<int> breakpoints = {}, int dead_breakpoint = 0)
: asm_(std::move(buffer)),
descriptor_(
GetLoweredCallDescriptor(compilation_zone, call_descriptor)),
@@ -347,7 +354,8 @@ class LiftoffCompiler {
compilation_zone_(compilation_zone),
safepoint_table_builder_(compilation_zone_),
next_breakpoint_ptr_(breakpoints.begin()),
- next_breakpoint_end_(breakpoints.end()) {
+ next_breakpoint_end_(breakpoints.end()),
+ dead_breakpoint_(dead_breakpoint) {
if (breakpoints.empty()) {
next_breakpoint_ptr_ = next_breakpoint_end_ = nullptr;
}
@@ -370,8 +378,8 @@ class LiftoffCompiler {
Vector<const uint8_t>::cast(VectorOf(protected_instructions_)));
}
- uint32_t GetTotalFrameSlotCount() const {
- return __ GetTotalFrameSlotCount();
+ uint32_t GetTotalFrameSlotCountForGC() const {
+ return __ GetTotalFrameSlotCountForGC();
}
void unsupported(FullDecoder* decoder, LiftoffBailoutReason reason,
@@ -534,7 +542,7 @@ class LiftoffCompiler {
void TierUpFunction(FullDecoder* decoder) {
__ CallRuntimeStub(WasmCode::kWasmTriggerTierUp);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
+ DefineSafepoint();
}
void TraceFunctionEntry(FullDecoder* decoder) {
@@ -543,13 +551,16 @@ class LiftoffCompiler {
source_position_table_builder_.AddPosition(
__ pc_offset(), SourcePosition(decoder->position()), false);
__ CallRuntimeStub(WasmCode::kWasmTraceEnter);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
+ DefineSafepoint();
}
void StartFunctionBody(FullDecoder* decoder, Control* block) {
for (uint32_t i = 0; i < __ num_locals(); ++i) {
- if (!CheckSupportedType(decoder, kSupportedTypes, __ local_type(i),
- "param"))
+ if (!CheckSupportedType(decoder,
+ FLAG_liftoff_extern_ref
+ ? kSupportedTypes
+ : kSupportedTypesWithoutRefs,
+ __ local_type(i), "param"))
return;
}
@@ -610,6 +621,25 @@ class LiftoffCompiler {
}
}
+ if (FLAG_liftoff_extern_ref) {
+ // Initialize all reference type locals with ref.null.
+ for (uint32_t param_idx = num_params; param_idx < __ num_locals();
+ ++param_idx) {
+ ValueType type = decoder->local_type(param_idx);
+ if (type.is_reference_type()) {
+ Register isolate_root = __ GetUnusedRegister(kGpReg, {}).gp();
+ // We can re-use the isolate_root register as result register.
+ Register result = isolate_root;
+
+ LOAD_INSTANCE_FIELD(isolate_root, IsolateRoot, kSystemPointerSize);
+ __ LoadTaggedPointer(
+ result, isolate_root, no_reg,
+ IsolateData::root_slot_offset(RootIndex::kNullValue), {});
+ __ Spill(__ cache_state()->stack_state.back().offset(),
+ LiftoffRegister(result), type);
+ }
+ }
+ }
DCHECK_EQ(__ num_locals(), __ cache_state()->stack_height());
if (V8_UNLIKELY(debug_sidetable_builder_)) {
@@ -637,21 +667,24 @@ class LiftoffCompiler {
kInt32Size * declared_function_index(env_->module, func_index_);
// Get the number of calls and update it.
- LiftoffRegister number_of_calls =
+ LiftoffRegister old_number_of_calls =
pinned.set(__ GetUnusedRegister(kGpReg, pinned));
- __ Load(number_of_calls, array_address.gp(), no_reg, offset,
+ LiftoffRegister new_number_of_calls =
+ pinned.set(__ GetUnusedRegister(kGpReg, pinned));
+ __ Load(old_number_of_calls, array_address.gp(), no_reg, offset,
LoadType::kI32Load, pinned);
- __ emit_i32_addi(number_of_calls.gp(), number_of_calls.gp(), 1);
- __ Store(array_address.gp(), no_reg, offset, number_of_calls,
+ __ emit_i32_addi(new_number_of_calls.gp(), old_number_of_calls.gp(), 1);
+ __ Store(array_address.gp(), no_reg, offset, new_number_of_calls,
StoreType::kI32Store, pinned);
// Emit the runtime call if necessary.
Label no_tierup;
- constexpr int kTierUpLimit = 5;
- __ emit_i32_addi(number_of_calls.gp(), number_of_calls.gp(),
- -kTierUpLimit);
+ // Check if the number of calls is a power of 2.
+ __ emit_i32_and(old_number_of_calls.gp(), old_number_of_calls.gp(),
+ new_number_of_calls.gp());
// Unary "unequal" means "different from zero".
- __ emit_cond_jump(kUnequal, &no_tierup, kWasmI32, number_of_calls.gp());
+ __ emit_cond_jump(kUnequal, &no_tierup, kWasmI32,
+ old_number_of_calls.gp());
TierUpFunction(decoder);
__ bind(&no_tierup);
}
@@ -724,11 +757,12 @@ class LiftoffCompiler {
source_position_table_builder_.AddPosition(
__ pc_offset(), SourcePosition(ool->position), true);
__ CallRuntimeStub(ool->stub);
+ // TODO(ahaas): Define a proper safepoint here.
+ safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
DCHECK_EQ(!debug_sidetable_builder_, !ool->debug_sidetable_entry_builder);
if (V8_UNLIKELY(ool->debug_sidetable_entry_builder)) {
ool->debug_sidetable_entry_builder->set_pc_offset(__ pc_offset());
}
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
DCHECK_EQ(ool->continuation.get()->is_bound(), is_stack_check);
if (!ool->regs_to_save.is_empty()) __ PopRegisters(ool->regs_to_save);
if (is_stack_check) {
@@ -752,7 +786,7 @@ class LiftoffCompiler {
__ PatchPrepareStackFrame(pc_offset_stack_frame_construction_,
__ GetTotalFrameSize());
__ FinishCode();
- safepoint_table_builder_.Emit(&asm_, __ GetTotalFrameSlotCount());
+ safepoint_table_builder_.Emit(&asm_, __ GetTotalFrameSlotCountForGC());
__ MaybeEmitOutOfLineConstantPool();
// The previous calls may have also generated a bailout.
DidAssemblerBailout(decoder);
@@ -787,6 +821,18 @@ class LiftoffCompiler {
}
}
}
+ if (dead_breakpoint_ == decoder->position()) {
+ DCHECK(!next_breakpoint_ptr_ ||
+ *next_breakpoint_ptr_ != dead_breakpoint_);
+ // The top frame is paused at this position, but the breakpoint was
+ // removed. Adding a dead breakpoint here ensures that the source position
+ // exists, and that the offset to the return address is the same as in the
+ // old code.
+ Label cont;
+ __ emit_jump(&cont);
+ EmitBreakpoint(decoder);
+ __ bind(&cont);
+ }
}
void NextInstruction(FullDecoder* decoder, WasmOpcode opcode) {
@@ -809,8 +855,9 @@ class LiftoffCompiler {
source_position_table_builder_.AddPosition(
__ pc_offset(), SourcePosition(decoder->position()), true);
__ CallRuntimeStub(WasmCode::kWasmDebugBreak);
- RegisterDebugSideTableEntry(DebugSideTableBuilder::kAllowRegisters);
+ // TODO(ahaas): Define a proper safepoint here.
safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
+ RegisterDebugSideTableEntry(DebugSideTableBuilder::kAllowRegisters);
}
void Block(FullDecoder* decoder, Control* block) {}
@@ -1178,6 +1225,9 @@ class LiftoffCompiler {
__ emit_type_conversion(kExprI64UConvertI32, dst, c_call_dst,
nullptr);
});
+ case kExprRefIsNull:
+ unsupported(decoder, kRefTypes, "ref_is_null");
+ return;
default:
UNREACHABLE();
}
@@ -1581,8 +1631,20 @@ class LiftoffCompiler {
__ PushRegister(kWasmF64, reg);
}
- void RefNull(FullDecoder* decoder, Value* result) {
- unsupported(decoder, kRefTypes, "ref_null");
+ void RefNull(FullDecoder* decoder, ValueType type, Value*) {
+ if (!FLAG_liftoff_extern_ref) {
+ unsupported(decoder, kRefTypes, "ref_null");
+ return;
+ }
+ Register isolate_root = __ GetUnusedRegister(kGpReg, {}).gp();
+ // We can re-use the isolate_root register as result register.
+ Register result = isolate_root;
+
+ LOAD_INSTANCE_FIELD(isolate_root, IsolateRoot, kSystemPointerSize);
+ __ LoadTaggedPointer(result, isolate_root, no_reg,
+ IsolateData::root_slot_offset(RootIndex::kNullValue),
+ {});
+ __ PushRegister(type, LiftoffRegister(result));
}
void RefFunc(FullDecoder* decoder, uint32_t function_index, Value* result) {
@@ -1631,7 +1693,7 @@ class LiftoffCompiler {
source_position_table_builder_.AddPosition(
__ pc_offset(), SourcePosition(decoder->position()), false);
__ CallRuntimeStub(WasmCode::kWasmTraceExit);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
+ DefineSafepoint();
__ DeallocateStackSlot(sizeof(int64_t));
}
@@ -1752,8 +1814,32 @@ class LiftoffCompiler {
void GlobalGet(FullDecoder* decoder, Value* result,
const GlobalIndexImmediate<validate>& imm) {
const auto* global = &env_->module->globals[imm.index];
- if (!CheckSupportedType(decoder, kSupportedTypes, global->type, "global"))
+ if (!CheckSupportedType(decoder,
+ FLAG_liftoff_extern_ref
+ ? kSupportedTypes
+ : kSupportedTypesWithoutRefs,
+ global->type, "global")) {
return;
+ }
+
+ if (global->type.is_reference_type()) {
+ if (global->mutability && global->imported) {
+ unsupported(decoder, kRefTypes, "imported mutable globals");
+ return;
+ }
+
+ LiftoffRegList pinned;
+ Register globals_buffer =
+ pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
+ LOAD_TAGGED_PTR_INSTANCE_FIELD(globals_buffer, TaggedGlobalsBuffer);
+ Register value = pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
+ __ LoadTaggedPointer(value, globals_buffer, no_reg,
+ wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(
+ imm.global->offset),
+ pinned);
+ __ PushRegister(global->type, LiftoffRegister(value));
+ return;
+ }
LiftoffRegList pinned;
uint32_t offset = 0;
Register addr = GetGlobalBaseAndOffset(global, &pinned, &offset);
@@ -1767,8 +1853,31 @@ class LiftoffCompiler {
void GlobalSet(FullDecoder* decoder, const Value& value,
const GlobalIndexImmediate<validate>& imm) {
auto* global = &env_->module->globals[imm.index];
- if (!CheckSupportedType(decoder, kSupportedTypes, global->type, "global"))
+ if (!CheckSupportedType(decoder,
+ FLAG_liftoff_extern_ref
+ ? kSupportedTypes
+ : kSupportedTypesWithoutRefs,
+ global->type, "global")) {
return;
+ }
+
+ if (global->type.is_reference_type()) {
+ if (global->mutability && global->imported) {
+ unsupported(decoder, kRefTypes, "imported mutable globals");
+ return;
+ }
+
+ LiftoffRegList pinned;
+ Register globals_buffer =
+ pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
+ LOAD_TAGGED_PTR_INSTANCE_FIELD(globals_buffer, TaggedGlobalsBuffer);
+ LiftoffRegister value = pinned.set(__ PopToRegister(pinned));
+ __ StoreTaggedPointer(globals_buffer,
+ wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(
+ imm.global->offset),
+ value, pinned);
+ return;
+ }
LiftoffRegList pinned;
uint32_t offset = 0;
Register addr = GetGlobalBaseAndOffset(global, &pinned, &offset);
@@ -1840,6 +1949,14 @@ class LiftoffCompiler {
}
void BrIf(FullDecoder* decoder, const Value& /* cond */, uint32_t depth) {
+ // Before branching, materialize all constants. This avoids repeatedly
+ // materializing them for each conditional branch.
+ // TODO(clemensb): Do the same for br_table.
+ if (depth != decoder->control_depth() - 1) {
+ __ MaterializeMergedConstants(
+ decoder->control_at(depth)->br_merge()->arity);
+ }
+
Label cont_false;
Register value = __ PopToRegister().gp();
@@ -1978,10 +2095,14 @@ class LiftoffCompiler {
// Returns true if the memory access is statically known to be out of bounds
// (a jump to the trap was generated then); return false otherwise.
bool BoundsCheckMem(FullDecoder* decoder, uint32_t access_size,
- uint32_t offset, Register index, LiftoffRegList pinned,
+ uint64_t offset, Register index, LiftoffRegList pinned,
ForceCheck force_check) {
+ // If the offset does not fit in a uintptr_t, this can never succeed on this
+ // machine.
const bool statically_oob =
- !base::IsInBounds<uint64_t>(offset, access_size, env_->max_memory_size);
+ offset > std::numeric_limits<uintptr_t>::max() ||
+ !base::IsInBounds<uintptr_t>(offset, access_size,
+ env_->max_memory_size);
if (!force_check && !statically_oob &&
(!FLAG_wasm_bounds_checks || env_->use_trap_handler)) {
@@ -2001,7 +2122,7 @@ class LiftoffCompiler {
return true;
}
- uint64_t end_offset = uint64_t{offset} + access_size - 1u;
+ uintptr_t end_offset = offset + access_size - 1u;
// If the end offset is larger than the smallest memory, dynamically check
// the end offset against the actual memory size, which is not known at
@@ -2011,12 +2132,7 @@ class LiftoffCompiler {
Register mem_size = __ GetUnusedRegister(kGpReg, pinned).gp();
LOAD_INSTANCE_FIELD(mem_size, MemorySize, kSystemPointerSize);
- if (kSystemPointerSize == 8) {
- __ LoadConstant(end_offset_reg, WasmValue(end_offset));
- } else {
- __ LoadConstant(end_offset_reg,
- WasmValue(static_cast<uint32_t>(end_offset)));
- }
+ __ LoadConstant(end_offset_reg, WasmValue::ForUintPtr(end_offset));
if (end_offset >= env_->min_memory_size) {
__ emit_cond_jump(kUnsignedGreaterEqual, trap_label,
@@ -2100,7 +2216,7 @@ class LiftoffCompiler {
source_position_table_builder_.AddPosition(__ pc_offset(),
SourcePosition(position), false);
__ CallRuntimeStub(WasmCode::kWasmTraceMemory);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
+ DefineSafepoint();
__ DeallocateStackSlot(sizeof(MemoryTracingInfo));
}
@@ -2276,8 +2392,8 @@ class LiftoffCompiler {
if (input.gp() != param_reg) __ Move(param_reg, input.gp(), kWasmI32);
__ CallRuntimeStub(WasmCode::kWasmMemoryGrow);
+ DefineSafepoint();
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
if (kReturnRegister0 != result.gp()) {
__ Move(result.gp(), kReturnRegister0, kWasmI32);
@@ -2382,14 +2498,29 @@ class LiftoffCompiler {
}
}
+ void EmitSimdFloatRoundingOpWithCFallback(
+ bool (LiftoffAssembler::*emit_fn)(LiftoffRegister, LiftoffRegister),
+ ExternalReference (*ext_ref)()) {
+ static constexpr RegClass rc = reg_class_for(kWasmS128);
+ LiftoffRegister src = __ PopToRegister();
+ LiftoffRegister dst = __ GetUnusedRegister(rc, {src}, {});
+ if (!(asm_.*emit_fn)(dst, src)) {
+ // Return v128 via stack for ARM.
+ ValueType sig_v_s_reps[] = {kWasmS128};
+ FunctionSig sig_v_s(0, 1, sig_v_s_reps);
+ GenerateCCall(&dst, &sig_v_s, kWasmS128, &src, ext_ref());
+ }
+ __ PushRegister(kWasmS128, dst);
+ }
+
void SimdOp(FullDecoder* decoder, WasmOpcode opcode, Vector<Value> args,
Value* result) {
if (!CpuFeatures::SupportsWasmSimd128()) {
return unsupported(decoder, kSimd, "simd");
}
switch (opcode) {
- case wasm::kExprS8x16Swizzle:
- return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_s8x16_swizzle);
+ case wasm::kExprI8x16Swizzle:
+ return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_i8x16_swizzle);
case wasm::kExprI8x16Splat:
return EmitUnOp<kI32, kS128>(&LiftoffAssembler::emit_i8x16_splat);
case wasm::kExprI16x8Splat:
@@ -2648,6 +2779,22 @@ class LiftoffCompiler {
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_neg);
case wasm::kExprF32x4Sqrt:
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_sqrt);
+ case wasm::kExprF32x4Ceil:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f32x4_ceil,
+ &ExternalReference::wasm_f32x4_ceil);
+ case wasm::kExprF32x4Floor:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f32x4_floor,
+ ExternalReference::wasm_f32x4_floor);
+ case wasm::kExprF32x4Trunc:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f32x4_trunc,
+ ExternalReference::wasm_f32x4_trunc);
+ case wasm::kExprF32x4NearestInt:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f32x4_nearest_int,
+ ExternalReference::wasm_f32x4_nearest_int);
case wasm::kExprF32x4Add:
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_add);
case wasm::kExprF32x4Sub:
@@ -2660,12 +2807,32 @@ class LiftoffCompiler {
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_min);
case wasm::kExprF32x4Max:
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_max);
+ case wasm::kExprF32x4Pmin:
+ return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_pmin);
+ case wasm::kExprF32x4Pmax:
+ return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f32x4_pmax);
case wasm::kExprF64x2Abs:
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_abs);
case wasm::kExprF64x2Neg:
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_neg);
case wasm::kExprF64x2Sqrt:
return EmitUnOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_sqrt);
+ case wasm::kExprF64x2Ceil:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f64x2_ceil,
+ &ExternalReference::wasm_f64x2_ceil);
+ case wasm::kExprF64x2Floor:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f64x2_floor,
+ ExternalReference::wasm_f64x2_floor);
+ case wasm::kExprF64x2Trunc:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f64x2_trunc,
+ ExternalReference::wasm_f64x2_trunc);
+ case wasm::kExprF64x2NearestInt:
+ return EmitSimdFloatRoundingOpWithCFallback(
+ &LiftoffAssembler::emit_f64x2_nearest_int,
+ ExternalReference::wasm_f64x2_nearest_int);
case wasm::kExprF64x2Add:
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_add);
case wasm::kExprF64x2Sub:
@@ -2678,6 +2845,10 @@ class LiftoffCompiler {
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_min);
case wasm::kExprF64x2Max:
return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_max);
+ case wasm::kExprF64x2Pmin:
+ return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_pmin);
+ case wasm::kExprF64x2Pmax:
+ return EmitBinOp<kS128, kS128>(&LiftoffAssembler::emit_f64x2_pmax);
case wasm::kExprI32x4SConvertF32x4:
return EmitUnOp<kS128, kS128>(
&LiftoffAssembler::emit_i32x4_sconvert_f32x4);
@@ -2832,6 +3003,9 @@ class LiftoffCompiler {
void S128Const(FullDecoder* decoder, const Simd128Immediate<validate>& imm,
Value* result) {
+ if (!CpuFeatures::SupportsWasmSimd128()) {
+ return unsupported(decoder, kSimd, "simd");
+ }
constexpr RegClass result_rc = reg_class_for(ValueType::kS128);
LiftoffRegister dst = __ GetUnusedRegister(result_rc, {});
bool all_zeroes = std::all_of(std::begin(imm.value), std::end(imm.value),
@@ -2853,6 +3027,9 @@ class LiftoffCompiler {
const Simd128Immediate<validate>& imm,
const Value& input0, const Value& input1,
Value* result) {
+ if (!CpuFeatures::SupportsWasmSimd128()) {
+ return unsupported(decoder, kSimd, "simd");
+ }
static constexpr RegClass result_rc = reg_class_for(ValueType::kS128);
LiftoffRegister rhs = __ PopToRegister();
LiftoffRegister lhs = __ PopToRegister(LiftoffRegList::ForRegs(rhs));
@@ -2867,7 +3044,7 @@ class LiftoffCompiler {
if (needs_swap) {
std::swap(lhs, rhs);
}
- __ LiftoffAssembler::emit_s8x16_shuffle(dst, lhs, rhs, shuffle, is_swizzle);
+ __ LiftoffAssembler::emit_i8x16_shuffle(dst, lhs, rhs, shuffle, is_swizzle);
__ PushRegister(kWasmS128, dst);
}
@@ -3061,7 +3238,14 @@ class LiftoffCompiler {
uint32_t offset = imm.offset;
index_reg = AddMemoryMasking(index_reg, &offset, &pinned);
- if (offset != 0) __ emit_i32_addi(index_reg, index_reg, offset);
+ Register index_plus_offset = index_reg;
+ if (offset) {
+ if (__ cache_state()->is_used(LiftoffRegister(index_reg))) {
+ index_plus_offset =
+ pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
+ }
+ __ emit_i32_addi(index_plus_offset, index_reg, offset);
+ }
LiftoffAssembler::VarState timeout =
__ cache_state()->stack_state.end()[-1];
@@ -3071,7 +3255,7 @@ class LiftoffCompiler {
// We have to set the correct register for the index. It may have changed
// above in {AddMemoryMasking}.
- index.MakeRegister(LiftoffRegister(index_reg));
+ index.MakeRegister(LiftoffRegister(index_plus_offset));
WasmCode::RuntimeStubId target;
compiler::CallDescriptor* call_descriptor;
@@ -3107,12 +3291,11 @@ class LiftoffCompiler {
__ PrepareBuiltinCall(&sig, call_descriptor,
{index, expected_value, timeout});
__ CallRuntimeStub(target);
-
+ DefineSafepoint();
// Pop parameters from the value stack.
__ cache_state()->stack_state.pop_back(3);
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
__ PushRegister(kWasmI32, LiftoffRegister(kReturnRegister0));
}
@@ -3120,32 +3303,41 @@ class LiftoffCompiler {
void AtomicNotify(FullDecoder* decoder,
const MemoryAccessImmediate<validate>& imm) {
LiftoffRegList pinned;
- LiftoffRegister count = pinned.set(__ PopToRegister());
- Register index = pinned.set(__ PopToRegister(pinned)).gp();
+ Register index_reg = pinned.set(__ PeekToRegister(1, pinned)).gp();
if (BoundsCheckMem(decoder, kWasmI32.element_size_bytes(), imm.offset,
- index, pinned, kDoForceCheck)) {
+ index_reg, pinned, kDoForceCheck)) {
return;
}
- AlignmentCheckMem(decoder, kWasmI32.element_size_bytes(), imm.offset, index,
- pinned);
+ AlignmentCheckMem(decoder, kWasmI32.element_size_bytes(), imm.offset,
+ index_reg, pinned);
uint32_t offset = imm.offset;
- index = AddMemoryMasking(index, &offset, &pinned);
- if (offset) __ emit_i32_addi(index, index, offset);
+ index_reg = AddMemoryMasking(index_reg, &offset, &pinned);
+ Register index_plus_offset = index_reg;
+ if (offset) {
+ if (__ cache_state()->is_used(LiftoffRegister(index_reg))) {
+ index_plus_offset =
+ pinned.set(__ GetUnusedRegister(kGpReg, pinned)).gp();
+ }
+ __ emit_i32_addi(index_plus_offset, index_reg, offset);
+ }
- // TODO(ahaas): Use PrepareCall to prepare parameters.
- __ SpillAllRegisters();
+ ValueType sig_reps[] = {kWasmI32, kWasmI32, kWasmI32};
+ FunctionSig sig(1, 2, sig_reps);
+ auto call_descriptor =
+ GetBuiltinCallDescriptor<WasmAtomicNotifyDescriptor>(compilation_zone_);
- WasmAtomicNotifyDescriptor descriptor;
- DCHECK_EQ(0, descriptor.GetStackParameterCount());
- DCHECK_EQ(2, descriptor.GetRegisterParameterCount());
- __ ParallelRegisterMove(
- {{descriptor.GetRegisterParameter(0), index, kWasmI32},
- {descriptor.GetRegisterParameter(1), count, kWasmI32}});
+ LiftoffAssembler::VarState count = __ cache_state()->stack_state.end()[-1];
+ LiftoffAssembler::VarState index = __ cache_state()->stack_state.end()[-2];
+ index.MakeRegister(LiftoffRegister(index_plus_offset));
+ __ PrepareBuiltinCall(&sig, call_descriptor, {index, count});
__ CallRuntimeStub(WasmCode::kWasmAtomicNotify);
+ DefineSafepoint();
+ // Pop parameters from the value stack.
+ __ cache_state()->stack_state.pop_back(2);
+
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
__ PushRegister(kWasmI32, LiftoffRegister(kReturnRegister0));
}
@@ -3415,12 +3607,12 @@ class LiftoffCompiler {
__ PrepareBuiltinCall(&sig, call_descriptor,
{dst, src, size, table_index, segment_index});
__ CallRuntimeStub(target);
+ DefineSafepoint();
// Pop parameters from the value stack.
__ cache_state()->stack_state.pop_back(3);
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
}
void ElemDrop(FullDecoder* decoder, const ElemDropImmediate<validate>& imm) {
@@ -3485,12 +3677,12 @@ class LiftoffCompiler {
__ PrepareBuiltinCall(&sig, call_descriptor,
{dst, src, size, table_dst_index, table_src_index});
__ CallRuntimeStub(target);
+ DefineSafepoint();
// Pop parameters from the value stack.
__ cache_state()->stack_state.pop_back(3);
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
}
void TableGrow(FullDecoder* decoder, const TableIndexImmediate<validate>& imm,
@@ -3613,8 +3805,15 @@ class LiftoffCompiler {
const CallFunctionImmediate<validate>& imm,
const Value args[], Value returns[], CallKind call_kind) {
for (ValueType ret : imm.sig->returns()) {
- if (!CheckSupportedType(decoder, kSupportedTypes, ret, "return")) {
- return;
+ if (!CheckSupportedType(decoder,
+ FLAG_liftoff_extern_ref
+ ? kSupportedTypes
+ : kSupportedTypesWithoutRefs,
+ ret, "return")) {
+ // TODO(7581): Remove this once reference-types are full supported.
+ if (!ret.is_reference_type()) {
+ return;
+ }
}
}
@@ -3675,8 +3874,8 @@ class LiftoffCompiler {
}
}
+ DefineSafepoint();
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
__ FinishCall(imm.sig, call_descriptor);
}
@@ -3688,7 +3887,11 @@ class LiftoffCompiler {
return unsupported(decoder, kRefTypes, "table index != 0");
}
for (ValueType ret : imm.sig->returns()) {
- if (!CheckSupportedType(decoder, kSupportedTypes, ret, "return")) {
+ if (!CheckSupportedType(decoder,
+ FLAG_liftoff_extern_ref
+ ? kSupportedTypes
+ : kSupportedTypesWithoutRefs,
+ ret, "return")) {
return;
}
}
@@ -3812,8 +4015,8 @@ class LiftoffCompiler {
__ CallIndirect(imm.sig, call_descriptor, target);
}
+ DefineSafepoint();
RegisterDebugSideTableEntry(DebugSideTableBuilder::kDidSpill);
- safepoint_table_builder_.DefineSafepoint(&asm_, Safepoint::kNoLazyDeopt);
__ FinishCall(imm.sig, call_descriptor);
}
@@ -3850,6 +4053,10 @@ class LiftoffCompiler {
int* next_breakpoint_ptr_ = nullptr;
int* next_breakpoint_end_ = nullptr;
+ // Introduce a dead breakpoint to ensure that the calculation of the return
+ // address in OSR is correct.
+ int dead_breakpoint_ = 0;
+
bool has_outstanding_op() const {
return outstanding_op_ != kNoOutstandingOp;
}
@@ -3869,6 +4076,12 @@ class LiftoffCompiler {
os << "\n";
}
+ void DefineSafepoint() {
+ Safepoint safepoint = safepoint_table_builder_.DefineSafepoint(
+ &asm_, Safepoint::kNoLazyDeopt);
+ __ cache_state()->DefineSafepoint(safepoint);
+ }
+
DISALLOW_IMPLICIT_CONSTRUCTORS(LiftoffCompiler);
};
@@ -3878,7 +4091,7 @@ WasmCompilationResult ExecuteLiftoffCompilation(
AccountingAllocator* allocator, CompilationEnv* env,
const FunctionBody& func_body, int func_index, ForDebugging for_debugging,
Counters* counters, WasmFeatures* detected, Vector<int> breakpoints,
- std::unique_ptr<DebugSideTable>* debug_sidetable) {
+ std::unique_ptr<DebugSideTable>* debug_sidetable, int dead_breakpoint) {
int func_body_size = static_cast<int>(func_body.end - func_body.start);
TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("v8.wasm.detailed"),
"wasm.CompileBaseline", "func_index", func_index, "body_size",
@@ -3905,11 +4118,15 @@ WasmCompilationResult ExecuteLiftoffCompilation(
WasmFullDecoder<Decoder::kValidate, LiftoffCompiler> decoder(
&zone, env->module, env->enabled_features, detected, func_body,
call_descriptor, env, &zone, instruction_buffer->CreateView(),
- debug_sidetable_builder.get(), for_debugging, func_index, breakpoints);
+ debug_sidetable_builder.get(), for_debugging, func_index, breakpoints,
+ dead_breakpoint);
decoder.Decode();
liftoff_compile_time_scope.reset();
LiftoffCompiler* compiler = &decoder.interface();
- if (decoder.failed()) compiler->OnFirstError(&decoder);
+ if (decoder.failed()) {
+ compiler->OnFirstError(&decoder);
+ return WasmCompilationResult{};
+ }
if (counters) {
// Check that the histogram for the bailout reasons has the correct size.
@@ -3935,7 +4152,7 @@ WasmCompilationResult ExecuteLiftoffCompilation(
result.instr_buffer = instruction_buffer->ReleaseBuffer();
result.source_positions = compiler->GetSourcePositionTable();
result.protected_instructions_data = compiler->GetProtectedInstructionsData();
- result.frame_slot_count = compiler->GetTotalFrameSlotCount();
+ result.frame_slot_count = compiler->GetTotalFrameSlotCountForGC();
result.tagged_parameter_slots = call_descriptor->GetTaggedParameterSlots();
result.func_index = func_index;
result.result_tier = ExecutionTier::kLiftoff;
diff --git a/deps/v8/src/wasm/baseline/liftoff-compiler.h b/deps/v8/src/wasm/baseline/liftoff-compiler.h
index fed4032a97..177ca7b78f 100644
--- a/deps/v8/src/wasm/baseline/liftoff-compiler.h
+++ b/deps/v8/src/wasm/baseline/liftoff-compiler.h
@@ -56,7 +56,8 @@ enum LiftoffBailoutReason : int8_t {
V8_EXPORT_PRIVATE WasmCompilationResult ExecuteLiftoffCompilation(
AccountingAllocator*, CompilationEnv*, const FunctionBody&, int func_index,
ForDebugging, Counters*, WasmFeatures* detected_features,
- Vector<int> breakpoints = {}, std::unique_ptr<DebugSideTable>* = nullptr);
+ Vector<int> breakpoints = {}, std::unique_ptr<DebugSideTable>* = nullptr,
+ int dead_breakpoint = 0);
V8_EXPORT_PRIVATE std::unique_ptr<DebugSideTable> GenerateLiftoffDebugSideTable(
AccountingAllocator*, CompilationEnv*, const FunctionBody&, int func_index);
diff --git a/deps/v8/src/wasm/baseline/liftoff-register.h b/deps/v8/src/wasm/baseline/liftoff-register.h
index 92fecda7fa..49aac008f0 100644
--- a/deps/v8/src/wasm/baseline/liftoff-register.h
+++ b/deps/v8/src/wasm/baseline/liftoff-register.h
@@ -64,6 +64,9 @@ static inline constexpr RegClass reg_class_for(ValueType::Kind kind) {
return kNeedI64RegPair ? kGpRegPair : kGpReg;
case ValueType::kS128:
return kNeedS128RegPair ? kFpRegPair : kFpReg;
+ case ValueType::kRef:
+ case ValueType::kOptRef:
+ return kGpReg;
default:
return kNoReg; // unsupported type
}
diff --git a/deps/v8/src/wasm/baseline/mips/liftoff-assembler-mips.h b/deps/v8/src/wasm/baseline/mips/liftoff-assembler-mips.h
index bb376cbbda..97b8487848 100644
--- a/deps/v8/src/wasm/baseline/mips/liftoff-assembler-mips.h
+++ b/deps/v8/src/wasm/baseline/mips/liftoff-assembler-mips.h
@@ -61,6 +61,8 @@ inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Register base,
MemOperand src(base, offset);
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kRef:
+ case ValueType::kOptRef:
assm->lw(dst.gp(), src);
break;
case ValueType::kI64:
@@ -330,13 +332,7 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
}
bool LiftoffAssembler::NeedsAlignment(ValueType type) {
- switch (type.kind()) {
- case ValueType::kS128:
- return true;
- default:
- // No alignment because all other types are kStackSlotSize.
- return false;
- }
+ return type.kind() == ValueType::kS128 || type.is_reference_type();
}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
@@ -395,6 +391,13 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
static_cast<uint32_t>(offset_imm), LoadType::kI32Load, pinned);
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ bailout(kRefTypes, "GlobalSet");
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
@@ -651,6 +654,8 @@ void LiftoffAssembler::Spill(int offset, LiftoffRegister reg, ValueType type) {
MemOperand dst = liftoff::GetStackSlot(offset);
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kRef:
+ case ValueType::kOptRef:
sw(reg.gp(), dst);
break;
case ValueType::kI64:
@@ -701,6 +706,8 @@ void LiftoffAssembler::Fill(LiftoffRegister reg, int offset, ValueType type) {
MemOperand src = liftoff::GetStackSlot(offset);
switch (type.kind()) {
case ValueType::kI32:
+ case ValueType::kRef:
+ case ValueType::kOptRef:
lw(reg.gp(), src);
break;
case ValueType::kI64:
@@ -1608,18 +1615,18 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
bailout(kSimd, "load extend and load splat unimplemented");
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
bool is_swizzle) {
- bailout(kSimd, "emit_s8x16_shuffle");
+ bailout(kSimd, "emit_i8x16_shuffle");
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
- bailout(kSimd, "emit_s8x16_swizzle");
+ bailout(kSimd, "emit_i8x16_swizzle");
}
void LiftoffAssembler::emit_i8x16_splat(LiftoffRegister dst,
@@ -2207,6 +2214,26 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
bailout(kSimd, "emit_f32x4_sqrt");
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
bailout(kSimd, "emit_f32x4_add");
@@ -2237,6 +2264,16 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
bailout(kSimd, "emit_f32x4_max");
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "emit_f32x4_pmin");
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "emit_f32x4_pmax");
+}
+
void LiftoffAssembler::emit_f64x2_abs(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "emit_f64x2_abs");
@@ -2252,6 +2289,26 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
bailout(kSimd, "emit_f64x2_sqrt");
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ return false;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
bailout(kSimd, "emit_f64x2_add");
@@ -2282,6 +2339,16 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
bailout(kSimd, "emit_f64x2_max");
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "emit_f64x2_pmin");
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "emit_f64x2_pmax");
+}
+
void LiftoffAssembler::emit_i32x4_sconvert_f32x4(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kSimd, "emit_i32x4_sconvert_f32x4");
diff --git a/deps/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h b/deps/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h
index b4e357033c..4c6c1fe1ce 100644
--- a/deps/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h
+++ b/deps/v8/src/wasm/baseline/mips64/liftoff-assembler-mips64.h
@@ -46,17 +46,35 @@ inline MemOperand GetStackSlot(int offset) { return MemOperand(fp, -offset); }
inline MemOperand GetInstanceOperand() { return GetStackSlot(kInstanceOffset); }
+inline MemOperand GetMemOp(LiftoffAssembler* assm, Register addr,
+ Register offset, uint32_t offset_imm) {
+ if (is_uint31(offset_imm)) {
+ if (offset == no_reg) return MemOperand(addr, offset_imm);
+ assm->daddu(kScratchReg, addr, offset);
+ return MemOperand(kScratchReg, offset_imm);
+ }
+ // Offset immediate does not fit in 31 bits.
+ assm->li(kScratchReg, offset_imm);
+ assm->daddu(kScratchReg, kScratchReg, addr);
+ if (offset != no_reg) {
+ assm->daddu(kScratchReg, kScratchReg, offset);
+ }
+ return MemOperand(kScratchReg, 0);
+}
+
inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, MemOperand src,
ValueType type) {
switch (type.kind()) {
case ValueType::kI32:
- assm->lw(dst.gp(), src);
+ assm->Lw(dst.gp(), src);
break;
case ValueType::kI64:
- assm->ld(dst.gp(), src);
+ case ValueType::kRef:
+ case ValueType::kOptRef:
+ assm->Ld(dst.gp(), src);
break;
case ValueType::kF32:
- assm->lwc1(dst.fp(), src);
+ assm->Lwc1(dst.fp(), src);
break;
case ValueType::kF64:
assm->Ldc1(dst.fp(), src);
@@ -85,6 +103,9 @@ inline void Store(LiftoffAssembler* assm, Register base, int32_t offset,
case ValueType::kF64:
assm->Usdc1(src.fp(), dst, t8);
break;
+ case ValueType::kS128:
+ assm->st_b(src.fp().toW(), dst);
+ break;
default:
UNREACHABLE();
}
@@ -295,13 +316,7 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
}
bool LiftoffAssembler::NeedsAlignment(ValueType type) {
- switch (type.kind()) {
- case ValueType::kS128:
- return true;
- default:
- // No alignment because all other types are kStackSlotSize.
- return false;
- }
+ return type.kind() == ValueType::kS128 || type.is_reference_type();
}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
@@ -327,12 +342,12 @@ void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
void LiftoffAssembler::LoadFromInstance(Register dst, uint32_t offset,
int size) {
DCHECK_LE(offset, kMaxInt);
- ld(dst, liftoff::GetInstanceOperand());
+ Ld(dst, liftoff::GetInstanceOperand());
DCHECK(size == 4 || size == 8);
if (size == 4) {
- lw(dst, MemOperand(dst, offset));
+ Lw(dst, MemOperand(dst, offset));
} else {
- ld(dst, MemOperand(dst, offset));
+ Ld(dst, MemOperand(dst, offset));
}
}
@@ -342,11 +357,11 @@ void LiftoffAssembler::LoadTaggedPointerFromInstance(Register dst,
}
void LiftoffAssembler::SpillInstance(Register instance) {
- sd(instance, liftoff::GetInstanceOperand());
+ Sd(instance, liftoff::GetInstanceOperand());
}
void LiftoffAssembler::FillInstanceInto(Register dst) {
- ld(dst, liftoff::GetInstanceOperand());
+ Ld(dst, liftoff::GetInstanceOperand());
}
void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
@@ -359,27 +374,28 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
static_cast<uint32_t>(offset_imm), LoadType::kI64Load, pinned);
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ bailout(kRefTypes, "GlobalSet");
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
uint32_t* protected_load_pc, bool is_load_mem) {
- Register src = no_reg;
- if (offset_reg != no_reg) {
- src = GetUnusedRegister(kGpReg, pinned).gp();
- emit_ptrsize_add(src, src_addr, offset_reg);
- }
- MemOperand src_op = (offset_reg != no_reg) ? MemOperand(src, offset_imm)
- : MemOperand(src_addr, offset_imm);
+ MemOperand src_op = liftoff::GetMemOp(this, src_addr, offset_reg, offset_imm);
if (protected_load_pc) *protected_load_pc = pc_offset();
switch (type.value()) {
case LoadType::kI32Load8U:
case LoadType::kI64Load8U:
- lbu(dst.gp(), src_op);
+ Lbu(dst.gp(), src_op);
break;
case LoadType::kI32Load8S:
case LoadType::kI64Load8S:
- lb(dst.gp(), src_op);
+ Lb(dst.gp(), src_op);
break;
case LoadType::kI32Load16U:
case LoadType::kI64Load16U:
@@ -424,16 +440,7 @@ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg,
uint32_t offset_imm, LiftoffRegister src,
StoreType type, LiftoffRegList pinned,
uint32_t* protected_store_pc, bool is_store_mem) {
- Register dst = no_reg;
- MemOperand dst_op = MemOperand(dst_addr, offset_imm);
- if (offset_reg != no_reg) {
- if (is_store_mem) {
- pinned.set(src);
- }
- dst = GetUnusedRegister(kGpReg, pinned).gp();
- emit_ptrsize_add(dst, dst_addr, offset_reg);
- dst_op = MemOperand(dst, offset_imm);
- }
+ MemOperand dst_op = liftoff::GetMemOp(this, dst_addr, offset_reg, offset_imm);
#if defined(V8_TARGET_BIG_ENDIAN)
if (is_store_mem) {
@@ -452,7 +459,7 @@ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg,
switch (type.value()) {
case StoreType::kI32Store8:
case StoreType::kI64Store8:
- sb(src.gp(), dst_op);
+ Sb(src.gp(), dst_op);
break;
case StoreType::kI32Store16:
case StoreType::kI64Store16:
@@ -588,6 +595,8 @@ void LiftoffAssembler::Spill(int offset, LiftoffRegister reg, ValueType type) {
Sw(reg.gp(), dst);
break;
case ValueType::kI64:
+ case ValueType::kRef:
+ case ValueType::kOptRef:
Sd(reg.gp(), dst);
break;
case ValueType::kF32:
@@ -611,13 +620,15 @@ void LiftoffAssembler::Spill(int offset, WasmValue value) {
case ValueType::kI32: {
LiftoffRegister tmp = GetUnusedRegister(kGpReg, {});
TurboAssembler::li(tmp.gp(), Operand(value.to_i32()));
- sw(tmp.gp(), dst);
+ Sw(tmp.gp(), dst);
break;
}
- case ValueType::kI64: {
+ case ValueType::kI64:
+ case ValueType::kRef:
+ case ValueType::kOptRef: {
LiftoffRegister tmp = GetUnusedRegister(kGpReg, {});
TurboAssembler::li(tmp.gp(), value.to_i64());
- sd(tmp.gp(), dst);
+ Sd(tmp.gp(), dst);
break;
}
default:
@@ -634,6 +645,8 @@ void LiftoffAssembler::Fill(LiftoffRegister reg, int offset, ValueType type) {
Lw(reg.gp(), src);
break;
case ValueType::kI64:
+ case ValueType::kRef:
+ case ValueType::kOptRef:
Ld(reg.gp(), src);
break;
case ValueType::kF32:
@@ -792,8 +805,7 @@ bool LiftoffAssembler::emit_i32_popcnt(Register dst, Register src) {
I32_SHIFTOP(name, instruction##v) \
void LiftoffAssembler::emit_i32_##name##i(Register dst, Register src, \
int amount) { \
- DCHECK(is_uint5(amount)); \
- instruction(dst, src, amount); \
+ instruction(dst, src, amount & 31); \
}
I32_SHIFTOP_I(shl, sll)
@@ -892,7 +904,7 @@ I64_BINOP_I(xor, Xor)
I64_SHIFTOP(name, instruction##v) \
void LiftoffAssembler::emit_i64_##name##i(LiftoffRegister dst, \
LiftoffRegister src, int amount) { \
- DCHECK(is_uint6(amount)); \
+ amount &= 63; \
if (amount < 32) \
instruction(dst.gp(), src.gp(), amount); \
else \
@@ -907,7 +919,7 @@ I64_SHIFTOP_I(shr, dsrl)
#undef I64_SHIFTOP_I
void LiftoffAssembler::emit_u32_to_intptr(Register dst, Register src) {
- addu(dst, src, zero_reg);
+ Dext(dst, src, 0, 32);
}
void LiftoffAssembler::emit_f32_neg(DoubleRegister dst, DoubleRegister src) {
@@ -1493,7 +1505,7 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
}
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
@@ -1526,7 +1538,7 @@ void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
vshf_b(dst_msa, rhs_msa, lhs_msa);
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
MSARegister dst_msa = dst.fp().toW();
@@ -2190,6 +2202,30 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
fsqrt_w(dst.fp().toW(), src.fp().toW());
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundW(dst.fp().toW(), src.fp().toW(), kRoundToPlusInf);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundW(dst.fp().toW(), src.fp().toW(), kRoundToMinusInf);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundW(dst.fp().toW(), src.fp().toW(), kRoundToZero);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundW(dst.fp().toW(), src.fp().toW(), kRoundToNearest);
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
fadd_w(dst.fp().toW(), lhs.fp().toW(), rhs.fp().toW());
@@ -2250,6 +2286,26 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
bsel_v(dst_msa, scratch0, scratch1);
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ MSARegister dst_msa = dst.fp().toW();
+ MSARegister lhs_msa = lhs.fp().toW();
+ MSARegister rhs_msa = rhs.fp().toW();
+ // dst = rhs < lhs ? rhs : lhs
+ fclt_w(dst_msa, rhs_msa, lhs_msa);
+ bsel_v(dst_msa, lhs_msa, rhs_msa);
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ MSARegister dst_msa = dst.fp().toW();
+ MSARegister lhs_msa = lhs.fp().toW();
+ MSARegister rhs_msa = rhs.fp().toW();
+ // dst = lhs < rhs ? rhs : lhs
+ fclt_w(dst_msa, lhs_msa, rhs_msa);
+ bsel_v(dst_msa, lhs_msa, rhs_msa);
+}
+
void LiftoffAssembler::emit_f64x2_abs(LiftoffRegister dst,
LiftoffRegister src) {
bclri_d(dst.fp().toW(), src.fp().toW(), 63);
@@ -2265,6 +2321,30 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
fsqrt_d(dst.fp().toW(), src.fp().toW());
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundD(dst.fp().toW(), src.fp().toW(), kRoundToPlusInf);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundD(dst.fp().toW(), src.fp().toW(), kRoundToMinusInf);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundD(dst.fp().toW(), src.fp().toW(), kRoundToZero);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ MSARoundD(dst.fp().toW(), src.fp().toW(), kRoundToNearest);
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
fadd_d(dst.fp().toW(), lhs.fp().toW(), rhs.fp().toW());
@@ -2325,6 +2405,26 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
bsel_v(dst_msa, scratch0, scratch1);
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ MSARegister dst_msa = dst.fp().toW();
+ MSARegister lhs_msa = lhs.fp().toW();
+ MSARegister rhs_msa = rhs.fp().toW();
+ // dst = rhs < lhs ? rhs : lhs
+ fclt_d(dst_msa, rhs_msa, lhs_msa);
+ bsel_v(dst_msa, lhs_msa, rhs_msa);
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ MSARegister dst_msa = dst.fp().toW();
+ MSARegister lhs_msa = lhs.fp().toW();
+ MSARegister rhs_msa = rhs.fp().toW();
+ // dst = lhs < rhs ? rhs : lhs
+ fclt_d(dst_msa, lhs_msa, rhs_msa);
+ bsel_v(dst_msa, lhs_msa, rhs_msa);
+}
+
void LiftoffAssembler::emit_i32x4_sconvert_f32x4(LiftoffRegister dst,
LiftoffRegister src) {
ftrunc_s_w(dst.fp().toW(), src.fp().toW());
@@ -2661,7 +2761,7 @@ void LiftoffAssembler::CallC(const wasm::FunctionSig* sig,
const LiftoffRegister* rets,
ValueType out_argument_type, int stack_bytes,
ExternalReference ext_ref) {
- daddiu(sp, sp, -stack_bytes);
+ Daddu(sp, sp, -stack_bytes);
int arg_bytes = 0;
for (ValueType param_type : sig->parameters()) {
@@ -2696,7 +2796,7 @@ void LiftoffAssembler::CallC(const wasm::FunctionSig* sig,
liftoff::Load(this, *next_result_reg, MemOperand(sp, 0), out_argument_type);
}
- daddiu(sp, sp, stack_bytes);
+ Daddu(sp, sp, stack_bytes);
}
void LiftoffAssembler::CallNativeWasmCode(Address addr) {
@@ -2734,12 +2834,12 @@ void LiftoffAssembler::CallRuntimeStub(WasmCode::RuntimeStubId sid) {
}
void LiftoffAssembler::AllocateStackSlot(Register addr, uint32_t size) {
- daddiu(sp, sp, -size);
+ Daddu(sp, sp, -size);
TurboAssembler::Move(addr, sp);
}
void LiftoffAssembler::DeallocateStackSlot(uint32_t size) {
- daddiu(sp, sp, size);
+ Daddu(sp, sp, size);
}
void LiftoffStackSlots::Construct() {
@@ -2748,12 +2848,12 @@ void LiftoffStackSlots::Construct() {
switch (src.loc()) {
case LiftoffAssembler::VarState::kStack:
if (src.type() != kWasmS128) {
- asm_->ld(kScratchReg, liftoff::GetStackSlot(slot.src_offset_));
+ asm_->Ld(kScratchReg, liftoff::GetStackSlot(slot.src_offset_));
asm_->push(kScratchReg);
} else {
- asm_->ld(kScratchReg, liftoff::GetStackSlot(slot.src_offset_ - 8));
+ asm_->Ld(kScratchReg, liftoff::GetStackSlot(slot.src_offset_ - 8));
asm_->push(kScratchReg);
- asm_->ld(kScratchReg, liftoff::GetStackSlot(slot.src_offset_));
+ asm_->Ld(kScratchReg, liftoff::GetStackSlot(slot.src_offset_));
asm_->push(kScratchReg);
}
break;
diff --git a/deps/v8/src/wasm/baseline/ppc/OWNERS b/deps/v8/src/wasm/baseline/ppc/OWNERS
index 85b6cb38f0..6edd45a6ef 100644
--- a/deps/v8/src/wasm/baseline/ppc/OWNERS
+++ b/deps/v8/src/wasm/baseline/ppc/OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h b/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h
index 6129a25e9f..ef7b720ea9 100644
--- a/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h
+++ b/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h
@@ -80,13 +80,7 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
}
bool LiftoffAssembler::NeedsAlignment(ValueType type) {
- switch (type.kind()) {
- case ValueType::kS128:
- return true;
- default:
- // No alignment because all other types are kStackSlotSize.
- return false;
- }
+ return (type.kind() == ValueType::kS128 || type.is_reference_type());
}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
@@ -119,6 +113,13 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
bailout(kUnsupportedArchitecture, "LoadTaggedPointer");
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ bailout(kRefTypes, "GlobalSet");
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
@@ -564,10 +565,10 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
bailout(kSimd, "Load transform unimplemented");
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
- bailout(kUnsupportedArchitecture, "emit_s8x16_swizzle");
+ bailout(kUnsupportedArchitecture, "emit_i8x16_swizzle");
}
void LiftoffAssembler::emit_f64x2_splat(LiftoffRegister dst,
@@ -603,6 +604,30 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
bailout(kUnsupportedArchitecture, "emit_f64x2sqrt");
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.ceil");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.floor");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.trunc");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.nearest_int");
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
bailout(kUnsupportedArchitecture, "emit_f64x2add");
@@ -633,6 +658,16 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
bailout(kUnsupportedArchitecture, "emit_f64x2max");
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmin unimplemented");
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmax unimplemented");
+}
+
void LiftoffAssembler::emit_f32x4_splat(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kUnsupportedArchitecture, "emit_f32x4_splat");
@@ -666,6 +701,30 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
bailout(kUnsupportedArchitecture, "emit_f32x4sqrt");
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.ceil");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.floor");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.trunc");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.nearest_int");
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
bailout(kUnsupportedArchitecture, "emit_f32x4add");
@@ -696,6 +755,16 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
bailout(kUnsupportedArchitecture, "emit_f32x4max");
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmin unimplemented");
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmax unimplemented");
+}
+
void LiftoffAssembler::emit_i64x2_splat(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kUnsupportedArchitecture, "emit_i64x2splat");
@@ -1014,12 +1083,12 @@ void LiftoffAssembler::emit_i16x8_extract_lane_s(LiftoffRegister dst,
bailout(kUnsupportedArchitecture, "emit_i16x8extractlane_s");
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
bool is_swizzle) {
- bailout(kSimd, "s8x16_shuffle");
+ bailout(kSimd, "i8x16_shuffle");
}
void LiftoffAssembler::emit_i8x16_splat(LiftoffRegister dst,
diff --git a/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h b/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h
index d4dba5d182..dc6ce2f0b3 100644
--- a/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h
+++ b/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h
@@ -79,13 +79,7 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
}
bool LiftoffAssembler::NeedsAlignment(ValueType type) {
- switch (type.kind()) {
- case ValueType::kS128:
- return true;
- default:
- // No alignment because all other types are kStackSlotSize.
- return false;
- }
+ return (type.kind() == ValueType::kS128 || type.is_reference_type());
}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
@@ -118,6 +112,13 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
bailout(kUnsupportedArchitecture, "LoadTaggedPointer");
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ bailout(kRefTypes, "GlobalSet");
+}
+
void LiftoffAssembler::Load(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned,
@@ -568,10 +569,10 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
bailout(kSimd, "Load transform unimplemented");
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
- bailout(kUnsupportedArchitecture, "emit_s8x16_swizzle");
+ bailout(kUnsupportedArchitecture, "emit_i8x16_swizzle");
}
void LiftoffAssembler::emit_f64x2_splat(LiftoffRegister dst,
@@ -607,6 +608,30 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
bailout(kUnsupportedArchitecture, "emit_f64x2sqrt");
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.ceil");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.floor");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.trunc");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f64x2.nearest_int");
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
bailout(kUnsupportedArchitecture, "emit_f64x2add");
@@ -637,6 +662,16 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
bailout(kUnsupportedArchitecture, "emit_f64x2max");
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmin unimplemented");
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmax unimplemented");
+}
+
void LiftoffAssembler::emit_f32x4_splat(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kUnsupportedArchitecture, "emit_f32x4_splat");
@@ -670,6 +705,30 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
bailout(kUnsupportedArchitecture, "emit_f32x4sqrt");
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.ceil");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.floor");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.trunc");
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ bailout(kSimd, "f32x4.nearest_int");
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
bailout(kUnsupportedArchitecture, "emit_f32x4add");
@@ -700,6 +759,16 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
bailout(kUnsupportedArchitecture, "emit_f32x4max");
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmin unimplemented");
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ bailout(kSimd, "pmax unimplemented");
+}
+
void LiftoffAssembler::emit_i64x2_splat(LiftoffRegister dst,
LiftoffRegister src) {
bailout(kUnsupportedArchitecture, "emit_i64x2splat");
@@ -1018,12 +1087,12 @@ void LiftoffAssembler::emit_i16x8_extract_lane_s(LiftoffRegister dst,
bailout(kUnsupportedArchitecture, "emit_i16x8extractlane_s");
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
bool is_swizzle) {
- bailout(kSimd, "s8x16_shuffle");
+ bailout(kSimd, "i8x16_shuffle");
}
void LiftoffAssembler::emit_i8x16_splat(LiftoffRegister dst,
diff --git a/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h b/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
index 74835afe3f..713a1ce72a 100644
--- a/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
+++ b/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
@@ -6,6 +6,7 @@
#define V8_WASM_BASELINE_X64_LIFTOFF_ASSEMBLER_X64_H_
#include "src/codegen/assembler.h"
+#include "src/heap/memory-chunk.h"
#include "src/wasm/baseline/liftoff-assembler.h"
#include "src/wasm/simd-shuffle.h"
@@ -62,6 +63,8 @@ inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Operand src,
assm->movl(dst.gp(), src);
break;
case ValueType::kI64:
+ case ValueType::kOptRef:
+ case ValueType::kRef:
assm->movq(dst.gp(), src);
break;
case ValueType::kF32:
@@ -201,7 +204,9 @@ int LiftoffAssembler::SlotSizeForType(ValueType type) {
return type.element_size_bytes();
}
-bool LiftoffAssembler::NeedsAlignment(ValueType type) { return false; }
+bool LiftoffAssembler::NeedsAlignment(ValueType type) {
+ return type.is_reference_type();
+}
void LiftoffAssembler::LoadConstant(LiftoffRegister reg, WasmValue value,
RelocInfo::Mode rmode) {
@@ -271,6 +276,36 @@ void LiftoffAssembler::LoadTaggedPointer(Register dst, Register src_addr,
LoadTaggedPointerField(dst, src_op);
}
+void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
+ int32_t offset_imm,
+ LiftoffRegister src,
+ LiftoffRegList pinned) {
+ DCHECK_GE(offset_imm, 0);
+ Register scratch = pinned.set(GetUnusedRegister(kGpReg, pinned)).gp();
+ Operand dst_op = liftoff::GetMemOp(this, dst_addr, no_reg,
+ static_cast<uint32_t>(offset_imm));
+ StoreTaggedField(dst_op, src.gp());
+
+ Label write_barrier;
+ Label exit;
+ CheckPageFlag(dst_addr, scratch,
+ MemoryChunk::kPointersFromHereAreInterestingMask, not_zero,
+ &write_barrier, Label::kNear);
+ jmp(&exit, Label::kNear);
+ bind(&write_barrier);
+ JumpIfSmi(src.gp(), &exit, Label::kNear);
+ if (COMPRESS_POINTERS_BOOL) {
+ DecompressTaggedPointer(src.gp(), src.gp());
+ }
+ CheckPageFlag(src.gp(), scratch,
+ MemoryChunk::kPointersToHereAreInterestingMask, zero, &exit,
+ Label::kNear);
+ leaq(scratch, dst_op);
+ CallRecordWriteStub(dst_addr, scratch, EMIT_REMEMBERED_SET, kSaveFPRegs,
+ wasm::WasmCode::kRecordWrite);
+ bind(&exit);
+}
+
void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
Register offset_reg, uint32_t offset_imm,
LoadType type, LiftoffRegList pinned) {
@@ -746,7 +781,7 @@ void LiftoffAssembler::Move(Register dst, Register src, ValueType type) {
if (type == kWasmI32) {
movl(dst, src);
} else {
- DCHECK_EQ(kWasmI64, type);
+ DCHECK(kWasmI64 == type || type.is_reference_type());
movq(dst, src);
}
}
@@ -772,6 +807,8 @@ void LiftoffAssembler::Spill(int offset, LiftoffRegister reg, ValueType type) {
movl(dst, reg.gp());
break;
case ValueType::kI64:
+ case ValueType::kOptRef:
+ case ValueType::kRef:
movq(dst, reg.gp());
break;
case ValueType::kF32:
@@ -2276,7 +2313,7 @@ void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
}
}
-void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs,
const uint8_t shuffle[16],
@@ -2333,11 +2370,10 @@ void LiftoffAssembler::emit_s8x16_shuffle(LiftoffRegister dst,
Por(dst.fp(), kScratchDoubleReg);
}
-void LiftoffAssembler::emit_s8x16_swizzle(LiftoffRegister dst,
+void LiftoffAssembler::emit_i8x16_swizzle(LiftoffRegister dst,
LiftoffRegister lhs,
LiftoffRegister rhs) {
- XMMRegister mask =
- GetUnusedRegister(kFpReg, LiftoffRegList::ForRegs(lhs, rhs)).fp();
+ XMMRegister mask = kScratchDoubleReg;
// Out-of-range indices should return 0, add 112 (0x70) so that any value > 15
// saturates to 128 (top bit set), so pshufb will zero that lane.
TurboAssembler::Move(mask, uint32_t{0x70707070});
@@ -2417,7 +2453,7 @@ void LiftoffAssembler::emit_i8x16_gt_u(LiftoffRegister dst, LiftoffRegister lhs,
ref = kScratchDoubleReg;
}
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpmaxub, &Assembler::pmaxub>(
- this, dst, lhs, rhs);
+ this, dst, lhs, rhs, SSE4_1);
Pcmpeqb(dst.fp(), ref);
Pcmpeqb(kScratchDoubleReg, kScratchDoubleReg);
Pxor(dst.fp(), kScratchDoubleReg);
@@ -2535,7 +2571,7 @@ void LiftoffAssembler::emit_i32x4_gt_u(LiftoffRegister dst, LiftoffRegister lhs,
ref = kScratchDoubleReg;
}
liftoff::EmitSimdCommutativeBinOp<&Assembler::vpmaxud, &Assembler::pmaxud>(
- this, dst, lhs, rhs);
+ this, dst, lhs, rhs, SSE4_1);
Pcmpeqd(dst.fp(), ref);
Pcmpeqd(kScratchDoubleReg, kScratchDoubleReg);
Pxor(dst.fp(), kScratchDoubleReg);
@@ -3288,6 +3324,34 @@ void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
Sqrtps(dst.fp(), src.fp());
}
+bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundUp);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundDown);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundToZero);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundps(dst.fp(), src.fp(), kRoundToNearest);
+ return true;
+}
+
void LiftoffAssembler::emit_f32x4_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
liftoff::EmitSimdCommutativeBinOp<&Assembler::vaddps, &Assembler::addps>(
@@ -3371,6 +3435,20 @@ void LiftoffAssembler::emit_f32x4_max(LiftoffRegister dst, LiftoffRegister lhs,
Andnps(dst.fp(), kScratchDoubleReg);
}
+void LiftoffAssembler::emit_f32x4_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way minps works, pmin(a, b) = minps(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vminps, &Assembler::minps>(
+ this, dst, rhs, lhs);
+}
+
+void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way maxps works, pmax(a, b) = maxps(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vmaxps, &Assembler::maxps>(
+ this, dst, rhs, lhs);
+}
+
void LiftoffAssembler::emit_f64x2_abs(LiftoffRegister dst,
LiftoffRegister src) {
if (dst.fp() == src.fp()) {
@@ -3402,6 +3480,34 @@ void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
Sqrtpd(dst.fp(), src.fp());
}
+bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundUp);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundDown);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundToZero);
+ return true;
+}
+
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+ LiftoffRegister src) {
+ DCHECK(CpuFeatures::IsSupported(SSE4_1));
+ Roundpd(dst.fp(), src.fp(), kRoundToNearest);
+ return true;
+}
+
void LiftoffAssembler::emit_f64x2_add(LiftoffRegister dst, LiftoffRegister lhs,
LiftoffRegister rhs) {
liftoff::EmitSimdCommutativeBinOp<&Assembler::vaddpd, &Assembler::addpd>(
@@ -3485,6 +3591,20 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
Andnpd(dst.fp(), kScratchDoubleReg);
}
+void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way minpd works, pmin(a, b) = minpd(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vminpd, &Assembler::minpd>(
+ this, dst, rhs, lhs);
+}
+
+void LiftoffAssembler::emit_f64x2_pmax(LiftoffRegister dst, LiftoffRegister lhs,
+ LiftoffRegister rhs) {
+ // Due to the way maxpd works, pmax(a, b) = maxpd(b, a).
+ liftoff::EmitSimdNonCommutativeBinOp<&Assembler::vmaxpd, &Assembler::maxpd>(
+ this, dst, rhs, lhs);
+}
+
void LiftoffAssembler::emit_i32x4_sconvert_f32x4(LiftoffRegister dst,
LiftoffRegister src) {
// NAN->0
diff --git a/deps/v8/src/wasm/c-api.cc b/deps/v8/src/wasm/c-api.cc
index 56b91b65d8..0bb6552943 100644
--- a/deps/v8/src/wasm/c-api.cc
+++ b/deps/v8/src/wasm/c-api.cc
@@ -1380,12 +1380,13 @@ i::Address CallTargetFromCache(i::Object cached_call_target) {
void PrepareFunctionData(i::Isolate* isolate,
i::Handle<i::WasmExportedFunctionData> function_data,
- const i::wasm::FunctionSig* sig) {
+ const i::wasm::FunctionSig* sig,
+ const i::wasm::WasmModule* module) {
// If the data is already populated, return immediately.
if (!function_data->c_wrapper_code().IsSmi()) return;
// Compile wrapper code.
i::Handle<i::Code> wrapper_code =
- i::compiler::CompileCWasmEntry(isolate, sig);
+ i::compiler::CompileCWasmEntry(isolate, sig, module);
function_data->set_c_wrapper_code(*wrapper_code);
// Compute packed args size.
function_data->set_packed_args_size(
@@ -1526,7 +1527,7 @@ auto Func::call(const Val args[], Val results[]) const -> own<Trap> {
// Caching {sig} would give a ~10% reduction in overhead.
const i::wasm::FunctionSig* sig =
instance->module()->functions[function_index].sig;
- PrepareFunctionData(isolate, function_data, sig);
+ PrepareFunctionData(isolate, function_data, sig, instance->module());
i::Handle<i::Code> wrapper_code = i::Handle<i::Code>(
i::Code::cast(function_data->c_wrapper_code()), isolate);
i::Address call_target =
@@ -1686,7 +1687,8 @@ auto Global::make(Store* store_abs, const GlobalType* type, const Val& val)
bool is_mutable = (type->mutability() == VAR);
const int32_t offset = 0;
i::Handle<i::WasmGlobalObject> obj =
- i::WasmGlobalObject::New(isolate, i::MaybeHandle<i::JSArrayBuffer>(),
+ i::WasmGlobalObject::New(isolate, i::Handle<i::WasmInstanceObject>(),
+ i::MaybeHandle<i::JSArrayBuffer>(),
i::MaybeHandle<i::FixedArray>(), i_type, offset,
is_mutable)
.ToHandleChecked();
@@ -1808,7 +1810,8 @@ auto Table::make(Store* store_abs, const TableType* type, const Ref* ref)
i::Handle<i::FixedArray> backing_store;
i::Handle<i::WasmTableObject> table_obj = i::WasmTableObject::New(
- isolate, i_type, minimum, has_maximum, maximum, &backing_store);
+ isolate, i::Handle<i::WasmInstanceObject>(), i_type, minimum, has_maximum,
+ maximum, &backing_store);
if (ref) {
i::Handle<i::JSReceiver> init = impl(ref)->v8_object();
@@ -1899,8 +1902,8 @@ auto Memory::make(Store* store_abs, const MemoryType* type) -> own<Memory> {
const Limits& limits = type->limits();
uint32_t minimum = limits.min;
- // The max_initial_mem_pages limit is only spec'ed for JS embeddings,
- // so we'll directly use the maximum pages limit here.
+ // The max_mem_pages limit is only spec'ed for JS embeddings, so we'll
+ // directly use the maximum pages limit here.
if (minimum > i::wasm::kSpecMaxMemoryPages) return nullptr;
uint32_t maximum = limits.max;
if (maximum != Limits(0).max) {
diff --git a/deps/v8/src/wasm/compilation-environment.h b/deps/v8/src/wasm/compilation-environment.h
index 7009267b1b..d730161ad1 100644
--- a/deps/v8/src/wasm/compilation-environment.h
+++ b/deps/v8/src/wasm/compilation-environment.h
@@ -52,17 +52,21 @@ struct CompilationEnv {
// The smallest size of any memory that could be used with this module, in
// bytes.
- const uint64_t min_memory_size;
+ const uintptr_t min_memory_size;
// The largest size of any memory that could be used with this module, in
// bytes.
- const uint64_t max_memory_size;
+ const uintptr_t max_memory_size;
// Features enabled for this compilation.
const WasmFeatures enabled_features;
const LowerSimd lower_simd;
+ static constexpr uint32_t kMaxMemoryPagesAtRuntime =
+ std::min(kV8MaxWasmMemoryPages,
+ std::numeric_limits<uintptr_t>::max() / kWasmPageSize);
+
constexpr CompilationEnv(const WasmModule* module,
UseTrapHandler use_trap_handler,
RuntimeExceptionSupport runtime_exception_support,
@@ -71,12 +75,16 @@ struct CompilationEnv {
: module(module),
use_trap_handler(use_trap_handler),
runtime_exception_support(runtime_exception_support),
- min_memory_size(module ? module->initial_pages * uint64_t{kWasmPageSize}
- : 0),
- max_memory_size((module && module->has_maximum_pages
- ? module->maximum_pages
- : max_initial_mem_pages()) *
+ // During execution, the memory can never be bigger than what fits in a
+ // uintptr_t.
+ min_memory_size(std::min(kMaxMemoryPagesAtRuntime,
+ module ? module->initial_pages : 0) *
uint64_t{kWasmPageSize}),
+ max_memory_size(static_cast<uintptr_t>(
+ std::min(kMaxMemoryPagesAtRuntime,
+ module && module->has_maximum_pages ? module->maximum_pages
+ : max_mem_pages()) *
+ uint64_t{kWasmPageSize})),
enabled_features(enabled_features),
lower_simd(lower_simd) {}
};
@@ -94,6 +102,7 @@ class WireBytesStorage {
// order. If tier up is off, both events are delivered right after each other.
enum class CompilationEvent : uint8_t {
kFinishedBaselineCompilation,
+ kFinishedExportWrappers,
kFinishedTopTierCompilation,
kFailedCompilation,
kFinishedRecompilation
@@ -119,12 +128,12 @@ class V8_EXPORT_PRIVATE CompilationState {
void InitializeAfterDeserialization();
- // Wait until baseline compilation finished, or compilation failed.
- void WaitForBaselineFinished();
-
// Wait until top tier compilation finished, or compilation failed.
void WaitForTopTierFinished();
+ // Set a higher priority for the compilation job.
+ void SetHighPriority();
+
bool failed() const;
bool baseline_compilation_finished() const;
bool top_tier_compilation_finished() const;
diff --git a/deps/v8/src/wasm/decoder.h b/deps/v8/src/wasm/decoder.h
index 7eed78dcbf..86cec955b9 100644
--- a/deps/v8/src/wasm/decoder.h
+++ b/deps/v8/src/wasm/decoder.h
@@ -196,6 +196,13 @@ class Decoder {
return read_leb<int32_t, kValidate, kAdvancePc, kTrace>(pc_, &length, name);
}
+ // Reads a LEB128 variable-length unsigned 64-bit integer and advances {pc_}.
+ uint64_t consume_u64v(const char* name = nullptr) {
+ uint32_t length = 0;
+ return read_leb<uint64_t, kValidate, kAdvancePc, kTrace>(pc_, &length,
+ name);
+ }
+
// Consume {size} bytes and send them to the bit bucket, advancing {pc_}.
void consume_bytes(uint32_t size, const char* name = "skip") {
// Only trace if the name is not null.
diff --git a/deps/v8/src/wasm/function-body-decoder-impl.h b/deps/v8/src/wasm/function-body-decoder-impl.h
index cb54e46d64..42b36f359b 100644
--- a/deps/v8/src/wasm/function-body-decoder-impl.h
+++ b/deps/v8/src/wasm/function-body-decoder-impl.h
@@ -150,11 +150,11 @@ HeapType read_heap_type(Decoder* decoder, const byte* pc,
uint8_t uint_7_mask = 0x7F;
uint8_t code = static_cast<ValueTypeCode>(heap_index) & uint_7_mask;
switch (code) {
- case kLocalFuncRef:
- case kLocalExnRef:
- case kLocalEqRef:
- case kLocalExternRef:
- case kLocalI31Ref: {
+ case kFuncRefCode:
+ case kExnRefCode:
+ case kEqRefCode:
+ case kExternRefCode:
+ case kI31RefCode: {
HeapType result = HeapType::from_code(code);
if (!VALIDATE(enabled.contains(feature_for_heap_type(result)))) {
decoder->errorf(
@@ -205,13 +205,14 @@ ValueType read_value_type(Decoder* decoder, const byte* pc,
}
ValueTypeCode code = static_cast<ValueTypeCode>(val);
switch (code) {
- case kLocalFuncRef:
- case kLocalExnRef:
- case kLocalEqRef:
- case kLocalExternRef:
- case kLocalI31Ref: {
+ case kFuncRefCode:
+ case kExnRefCode:
+ case kEqRefCode:
+ case kExternRefCode:
+ case kI31RefCode: {
HeapType heap_type = HeapType::from_code(code);
- ValueType result = ValueType::Ref(heap_type, kNullable);
+ ValueType result = ValueType::Ref(
+ heap_type, code == kI31RefCode ? kNonNullable : kNullable);
if (!VALIDATE(enabled.contains(feature_for_heap_type(heap_type)))) {
decoder->errorf(
pc, "invalid value type '%s', enable with --experimental-wasm-%s",
@@ -221,20 +222,20 @@ ValueType read_value_type(Decoder* decoder, const byte* pc,
}
return result;
}
- case kLocalI32:
+ case kI32Code:
return kWasmI32;
- case kLocalI64:
+ case kI64Code:
return kWasmI64;
- case kLocalF32:
+ case kF32Code:
return kWasmF32;
- case kLocalF64:
+ case kF64Code:
return kWasmF64;
- case kLocalRef:
- case kLocalOptRef: {
- Nullability nullability = code == kLocalOptRef ? kNullable : kNonNullable;
+ case kRefCode:
+ case kOptRefCode: {
+ Nullability nullability = code == kOptRefCode ? kNullable : kNonNullable;
if (!VALIDATE(enabled.has_typed_funcref())) {
decoder->errorf(pc,
- "Invalid type 'ref%s', enable with "
+ "Invalid type '(ref%s <heaptype>)', enable with "
"--experimental-wasm-typed-funcref",
nullability == kNullable ? " null" : "");
return kWasmBottom;
@@ -245,7 +246,7 @@ ValueType read_value_type(Decoder* decoder, const byte* pc,
return heap_type.is_bottom() ? kWasmBottom
: ValueType::Ref(heap_type, nullability);
}
- case kLocalRtt: {
+ case kRttCode: {
if (!VALIDATE(enabled.has_gc())) {
decoder->error(
pc, "invalid value type 'rtt', enable with --experimental-wasm-gc");
@@ -254,13 +255,11 @@ ValueType read_value_type(Decoder* decoder, const byte* pc,
uint32_t depth_length;
uint32_t depth =
decoder->read_u32v<validate>(pc + 1, &depth_length, "depth");
- // TODO(7748): Introduce a proper limit.
- const uint32_t kMaxRttSubtypingDepth = 7;
- if (!VALIDATE(depth <= kMaxRttSubtypingDepth)) {
+ if (!VALIDATE(depth <= kV8MaxRttSubtypingDepth)) {
decoder->errorf(pc,
"subtyping depth %u is greater than the maximum depth "
"%u supported by V8",
- depth, kMaxRttSubtypingDepth);
+ depth, kV8MaxRttSubtypingDepth);
return kWasmBottom;
}
HeapType heap_type = read_heap_type<validate>(
@@ -269,23 +268,24 @@ ValueType read_value_type(Decoder* decoder, const byte* pc,
return heap_type.is_bottom() ? kWasmBottom
: ValueType::Rtt(heap_type, depth);
}
- case kLocalS128:
+ case kS128Code: {
if (!VALIDATE(enabled.has_simd())) {
decoder->error(pc,
- "invalid value type 'Simd128', enable with "
+ "invalid value type 's128', enable with "
"--experimental-wasm-simd");
return kWasmBottom;
}
return kWasmS128;
- case kLocalVoid:
- case kLocalI8:
- case kLocalI16:
- // Although these types are included in ValueType, they are technically
- // not value types and are only used in specific contexts. The caller of
- // this function is responsible to check for them separately.
- break;
- }
- // Malformed modules specifying invalid types can get here.
+ }
+ // Although these codes are included in ValueTypeCode, they technically
+ // do not correspond to value types and are only used in specific
+ // contexts. The caller of this function is responsible for handling them.
+ case kVoidCode:
+ case kI8Code:
+ case kI16Code:
+ return kWasmBottom;
+ }
+ // Anything that doesn't match an enumeration value is an invalid type code.
return kWasmBottom;
}
} // namespace value_type_reader
@@ -402,7 +402,7 @@ struct BlockTypeImmediate {
int64_t block_type =
decoder->read_i33v<validate>(pc, &length, "block type");
if (block_type < 0) {
- if ((static_cast<uint8_t>(block_type) & byte{0x7f}) == kLocalVoid) return;
+ if ((static_cast<uint8_t>(block_type) & byte{0x7f}) == kVoidCode) return;
type = value_type_reader::read_value_type<validate>(decoder, pc, &length,
enabled);
if (!VALIDATE(type != kWasmBottom)) {
@@ -488,7 +488,7 @@ struct MemoryIndexImmediate {
template <Decoder::ValidateFlag validate>
struct TableIndexImmediate {
uint32_t index = 0;
- unsigned length = 1;
+ uint32_t length = 1;
inline TableIndexImmediate() = default;
inline TableIndexImmediate(Decoder* decoder, const byte* pc) {
index = decoder->read_u32v<validate>(pc, &length, "table index");
@@ -875,7 +875,7 @@ struct ControlBase {
F(I64Const, Value* result, int64_t value) \
F(F32Const, Value* result, float value) \
F(F64Const, Value* result, double value) \
- F(RefNull, Value* result) \
+ F(RefNull, ValueType type, Value* result) \
F(RefFunc, uint32_t function_index, Value* result) \
F(RefAsNonNull, const Value& arg, Value* result) \
F(Drop, const Value& value) \
@@ -1002,7 +1002,8 @@ class WasmDecoder : public Decoder {
Zone* zone() const { return local_types_.get_allocator().zone(); }
uint32_t num_locals() const {
- return static_cast<uint32_t>(local_types_.size());
+ DCHECK_EQ(num_locals_, local_types_.size());
+ return num_locals_;
}
ValueType local_type(uint32_t index) const { return local_types_[index]; }
@@ -1011,12 +1012,13 @@ class WasmDecoder : public Decoder {
DCHECK_NOT_NULL(sig_);
DCHECK_EQ(0, this->local_types_.size());
local_types_.assign(sig_->parameters().begin(), sig_->parameters().end());
+ num_locals_ = static_cast<uint32_t>(sig_->parameters().size());
}
// Decodes local definitions in the current decoder.
// Returns true iff locals are found.
// Writes the total length of decoded locals in 'total_length'.
- // If insert_postion is present, the decoded locals will be inserted into the
+ // If insert_position is present, the decoded locals will be inserted into the
// 'local_types_' of this decoder. Otherwise, this function is used just to
// check validity and determine the encoding length of the locals in bytes.
// The decoder's pc is not advanced. If no locals are found (i.e., no
@@ -1072,6 +1074,7 @@ class WasmDecoder : public Decoder {
// Move the insertion iterator to the end of the newly inserted locals.
insert_iterator =
local_types_.insert(insert_iterator, count, type) + count;
+ num_locals_ += count;
}
}
DCHECK(ok());
@@ -1239,12 +1242,13 @@ class WasmDecoder : public Decoder {
inline bool Validate(const byte* pc, CallIndirectImmediate<validate>& imm) {
if (!VALIDATE(imm.table_index < module_->tables.size())) {
- error("function table has to exist to execute call_indirect");
+ error("call_indirect: table index immediate out of bounds");
return false;
}
- if (!VALIDATE(IsSubtypeOf(module_->tables[imm.table_index].type,
- kWasmFuncRef, module_))) {
- error("table of call_indirect must be of a function type");
+ ValueType table_type = module_->tables[imm.table_index].type;
+ if (!VALIDATE(IsSubtypeOf(table_type, kWasmFuncRef, module_))) {
+ errorf(pc, "call_indirect: immediate table #%u is not of a function type",
+ imm.table_index);
return false;
}
if (!Complete(imm)) {
@@ -1253,12 +1257,11 @@ class WasmDecoder : public Decoder {
}
// Check that the dynamic signature for this call is a subtype of the static
// type of the table the function is defined in.
- if (!VALIDATE(IsSubtypeOf(ValueType::Ref(imm.sig_index, kNonNullable),
- module_->tables[imm.table_index].type,
- module_))) {
+ ValueType immediate_type = ValueType::Ref(imm.sig_index, kNonNullable);
+ if (!VALIDATE(IsSubtypeOf(immediate_type, table_type, module_))) {
errorf(pc,
- "call_indirect: Signature of function %u is not a subtype of "
- "table %u",
+ "call_indirect: Immediate signature #%u is not a subtype of "
+ "immediate table #%u",
imm.sig_index, imm.table_index);
}
return true;
@@ -1654,7 +1657,7 @@ class WasmDecoder : public Decoder {
}
// Shuffles require a byte per lane, or 16 immediate bytes.
case kExprS128Const:
- case kExprS8x16Shuffle:
+ case kExprI8x16Shuffle:
return 1 + length + kSimd128Size;
default:
decoder->error(pc, "invalid SIMD opcode");
@@ -1899,6 +1902,10 @@ class WasmDecoder : public Decoder {
// needed (see {zone()} accessor below).
ZoneVector<ValueType> local_types_;
+ // Cached value, for speed (yes, it's measurably faster to load this value
+ // than to load the start and end pointer from a vector, subtract and shift).
+ uint32_t num_locals_ = 0;
+
const WasmModule* module_;
const WasmFeatures enabled_;
WasmFeatures* detected_;
@@ -1942,13 +1949,12 @@ class WasmFullDecoder : public WasmDecoder<validate> {
: WasmDecoder<validate>(zone, module, enabled, detected, body.sig,
body.start, body.end, body.offset),
interface_(std::forward<InterfaceArgs>(interface_args)...),
- stack_(zone),
control_(zone) {}
Interface& interface() { return interface_; }
bool Decode() {
- DCHECK(stack_.empty());
+ DCHECK_EQ(stack_end_, stack_);
DCHECK(control_.empty());
DCHECK_LE(this->pc_, this->end_);
DCHECK_EQ(this->num_locals(), 0);
@@ -1957,34 +1963,33 @@ class WasmFullDecoder : public WasmDecoder<validate> {
uint32_t params_count = static_cast<uint32_t>(this->num_locals());
uint32_t locals_length;
this->DecodeLocals(this->pc(), &locals_length, params_count);
+ this->consume_bytes(locals_length);
for (uint32_t index = params_count; index < this->num_locals(); index++) {
if (!VALIDATE(this->local_type(index).is_defaultable())) {
this->errorf(
this->pc(),
"Cannot define function-level local of non-defaultable type %s",
this->local_type(index).name().c_str());
+ return this->TraceFailed();
}
}
- this->consume_bytes(locals_length);
CALL_INTERFACE(StartFunction);
DecodeFunctionBody();
- if (!this->failed()) CALL_INTERFACE(FinishFunction);
+ if (this->failed()) return TraceFailed();
- // Generate a better error message whether the unterminated control
- // structure is the function body block or an innner structure.
if (!VALIDATE(control_.empty())) {
if (control_.size() > 1) {
this->error(control_.back().pc, "unterminated control structure");
- } else if (control_.size() == 1) {
+ } else {
this->error("function body must end with \"end\" opcode");
}
+ return TraceFailed();
}
+ CALL_INTERFACE(FinishFunction);
+ if (this->failed()) return TraceFailed();
- if (!VALIDATE(this->ok())) return this->TraceFailed();
-
- TRACE("wasm-decode %s\n\n", VALIDATE(this->ok()) ? "ok" : "failed");
-
+ TRACE("wasm-decode ok\n\n");
return true;
}
@@ -2021,14 +2026,15 @@ class WasmFullDecoder : public WasmDecoder<validate> {
}
inline uint32_t stack_size() const {
- DCHECK_GE(kMaxUInt32, stack_.size());
- return static_cast<uint32_t>(stack_.size());
+ DCHECK_GE(stack_end_, stack_);
+ DCHECK_GE(kMaxUInt32, stack_end_ - stack_);
+ return static_cast<uint32_t>(stack_end_ - stack_);
}
inline Value* stack_value(uint32_t depth) {
DCHECK_LT(0, depth);
- DCHECK_GE(stack_.size(), depth);
- return &*(stack_.end() - depth);
+ DCHECK_GE(stack_size(), depth);
+ return stack_end_ - depth;
}
void SetSucceedingCodeDynamicallyUnreachable() {
@@ -2042,8 +2048,15 @@ class WasmFullDecoder : public WasmDecoder<validate> {
private:
Interface interface_;
- ZoneVector<Value> stack_; // stack of values.
- ZoneVector<Control> control_; // stack of blocks, loops, and ifs.
+ // The value stack, stored as individual pointers for maximum performance.
+ Value* stack_ = nullptr;
+ Value* stack_end_ = nullptr;
+ Value* stack_capacity_end_ = nullptr;
+ ASSERT_TRIVIALLY_COPYABLE(Value);
+
+ // stack of blocks, loops, and ifs.
+ ZoneVector<Control> control_;
+
// Controls whether code should be generated for the current block (basically
// a cache for {ok() && control_.back().reachable()}).
bool current_code_reachable_ = true;
@@ -2139,7 +2152,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
if (!c.reachable()) Append("%c", c.unreachable() ? '*' : '#');
}
Append(" | ");
- for (size_t i = 0; i < decoder_->stack_.size(); ++i) {
+ for (size_t i = 0; i < decoder_->stack_size(); ++i) {
Value& val = decoder_->stack_[i];
WasmOpcode val_opcode = static_cast<WasmOpcode>(*val.pc);
if (WasmOpcodes::IsPrefixOpcode(val_opcode)) {
@@ -2269,7 +2282,8 @@ class WasmFullDecoder : public WasmDecoder<validate> {
}
c->kind = kControlTryCatch;
FallThruTo(c);
- stack_.erase(stack_.begin() + c->stack_depth, stack_.end());
+ DCHECK_LE(stack_ + c->stack_depth, stack_end_);
+ stack_end_ = stack_ + c->stack_depth;
c->reachability = control_at(1)->innerReachability();
current_code_reachable_ = this->ok() && c->reachable();
Value* exception = Push(kWasmExnRef);
@@ -2290,7 +2304,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// graph builder interface work out of the box. We should introduce
// special handling for both and do minimal/no stack mutation here.
for (size_t i = 0; i < value_count; ++i) Push(sig->GetParam(i));
- Vector<Value> values(stack_.data() + c->stack_depth, value_count);
+ Vector<Value> values(stack_ + c->stack_depth, value_count);
TypeCheckBranchResult check_result = TypeCheckBranch(c, true);
if (this->failed()) return 0;
if (V8_LIKELY(check_result == kReachableBranch)) {
@@ -2435,6 +2449,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
if (c->is_let()) {
this->local_types_.erase(this->local_types_.begin(),
this->local_types_.begin() + c->locals_count);
+ this->num_locals_ -= c->locals_count;
CALL_INTERFACE_IF_REACHABLE(DeallocateLocals, c->locals_count);
}
if (!TypeCheckFallThru()) return 0;
@@ -2625,8 +2640,9 @@ class WasmFullDecoder : public WasmDecoder<validate> {
CHECK_PROTOTYPE_OPCODE(reftypes);
HeapTypeImmediate<validate> imm(this->enabled_, this, this->pc_ + 1);
if (!this->Validate(this->pc_ + 1, imm)) return 0;
- Value* value = Push(ValueType::Ref(imm.type, kNullable));
- CALL_INTERFACE_IF_REACHABLE(RefNull, value);
+ ValueType type = ValueType::Ref(imm.type, kNullable);
+ Value* value = Push(type);
+ CALL_INTERFACE_IF_REACHABLE(RefNull, type, value);
return 1 + imm.length;
}
@@ -3078,6 +3094,11 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// Decode the function body.
while (this->pc_ < this->end_) {
+ // Most operations only grow the stack by at least one element (unary and
+ // binary operations, local.get, constants, ...). Thus check that there is
+ // enough space for those operations centrally, and avoid any bounds
+ // checks in those operations.
+ EnsureStackSpace(1);
uint8_t first_byte = *this->pc_;
WasmOpcode opcode = static_cast<WasmOpcode>(first_byte);
CALL_INTERFACE_IF_REACHABLE(NextInstruction, opcode);
@@ -3094,7 +3115,8 @@ class WasmFullDecoder : public WasmDecoder<validate> {
void EndControl() {
DCHECK(!control_.empty());
Control* current = &control_.back();
- stack_.erase(stack_.begin() + current->stack_depth, stack_.end());
+ DCHECK_LE(stack_ + current->stack_depth, stack_end_);
+ stack_end_ = stack_ + current->stack_depth;
CALL_INTERFACE_IF_REACHABLE(EndControl, current);
current->reachability = kUnreachable;
current_code_reachable_ = false;
@@ -3281,7 +3303,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
int br_arity = static_cast<int>(result_types.size());
if (V8_LIKELY(!control_.back().unreachable())) {
int available =
- static_cast<int>(stack_.size()) - control_.back().stack_depth;
+ static_cast<int>(stack_size()) - control_.back().stack_depth;
// There have to be enough values on the stack.
if (!VALIDATE(available >= br_arity)) {
this->errorf(this->pc_,
@@ -3290,7 +3312,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
br_arity, startrel(control_.back().pc), available);
return false;
}
- Value* stack_values = &*(stack_.end() - br_arity);
+ Value* stack_values = stack_end_ - br_arity;
// Type-check the topmost br_arity values on the stack.
for (int i = 0; i < br_arity; ++i) {
Value& val = stack_values[i];
@@ -3380,7 +3402,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
case kExprI16x8ReplaceLane:
case kExprI8x16ReplaceLane:
return SimdReplaceLane(opcode, kWasmI32, opcode_length);
- case kExprS8x16Shuffle:
+ case kExprI8x16Shuffle:
return Simd8x16ShuffleOp(opcode_length);
case kExprS128LoadMem:
return DecodeLoadMem(LoadType::kS128Load, opcode_length);
@@ -3400,41 +3422,41 @@ class WasmFullDecoder : public WasmDecoder<validate> {
return DecodeLoadTransformMem(LoadType::kI64Load,
LoadTransformationKind::kZeroExtend,
opcode_length);
- case kExprS8x16LoadSplat:
+ case kExprS128Load8Splat:
return DecodeLoadTransformMem(LoadType::kI32Load8S,
LoadTransformationKind::kSplat,
opcode_length);
- case kExprS16x8LoadSplat:
+ case kExprS128Load16Splat:
return DecodeLoadTransformMem(LoadType::kI32Load16S,
LoadTransformationKind::kSplat,
opcode_length);
- case kExprS32x4LoadSplat:
+ case kExprS128Load32Splat:
return DecodeLoadTransformMem(
LoadType::kI32Load, LoadTransformationKind::kSplat, opcode_length);
- case kExprS64x2LoadSplat:
+ case kExprS128Load64Splat:
return DecodeLoadTransformMem(
LoadType::kI64Load, LoadTransformationKind::kSplat, opcode_length);
- case kExprI16x8Load8x8S:
+ case kExprS128Load8x8S:
return DecodeLoadTransformMem(LoadType::kI32Load8S,
LoadTransformationKind::kExtend,
opcode_length);
- case kExprI16x8Load8x8U:
+ case kExprS128Load8x8U:
return DecodeLoadTransformMem(LoadType::kI32Load8U,
LoadTransformationKind::kExtend,
opcode_length);
- case kExprI32x4Load16x4S:
+ case kExprS128Load16x4S:
return DecodeLoadTransformMem(LoadType::kI32Load16S,
LoadTransformationKind::kExtend,
opcode_length);
- case kExprI32x4Load16x4U:
+ case kExprS128Load16x4U:
return DecodeLoadTransformMem(LoadType::kI32Load16U,
LoadTransformationKind::kExtend,
opcode_length);
- case kExprI64x2Load32x2S:
+ case kExprS128Load32x2S:
return DecodeLoadTransformMem(LoadType::kI64Load32S,
LoadTransformationKind::kExtend,
opcode_length);
- case kExprI64x2Load32x2U:
+ case kExprS128Load32x2U:
return DecodeLoadTransformMem(LoadType::kI64Load32U,
LoadTransformationKind::kExtend,
opcode_length);
@@ -3996,43 +4018,69 @@ class WasmFullDecoder : public WasmDecoder<validate> {
if (return_count > 1) {
this->detected_->Add(kFeature_mv);
}
- DCHECK_GE(stack_.size(), return_count);
+ DCHECK_GE(stack_size(), return_count);
Vector<Value> return_values =
- return_count == 0
- ? Vector<Value>{}
- : Vector<Value>{&*(stack_.end() - return_count), return_count};
+ Vector<Value>{stack_end_ - return_count, return_count};
CALL_INTERFACE_IF_REACHABLE(DoReturn, return_values);
}
+ V8_INLINE void EnsureStackSpace(int slots_needed) {
+ if (V8_LIKELY(stack_capacity_end_ - stack_end_ >= slots_needed)) return;
+ GrowStackSpace(slots_needed);
+ }
+
+ V8_NOINLINE void GrowStackSpace(int slots_needed) {
+ size_t new_stack_capacity =
+ std::max(size_t{8},
+ base::bits::RoundUpToPowerOfTwo(stack_size() + slots_needed));
+ Value* new_stack =
+ this->zone()->template NewArray<Value>(new_stack_capacity);
+ if (stack_) {
+ std::copy(stack_, stack_end_, new_stack);
+ this->zone()->DeleteArray(stack_, stack_capacity_end_ - stack_);
+ }
+ stack_end_ = new_stack + (stack_end_ - stack_);
+ stack_ = new_stack;
+ stack_capacity_end_ = new_stack + new_stack_capacity;
+ }
+
V8_INLINE Value* Push(ValueType type) {
DCHECK_NE(kWasmStmt, type);
- stack_.emplace_back(this->pc_, type);
- return &stack_.back();
+ // {EnsureStackSpace} should have been called before, either in the central
+ // decoding loop, or individually if more than one element is pushed.
+ DCHECK_GT(stack_capacity_end_, stack_end_);
+ *stack_end_ = Value{this->pc_, type};
+ ++stack_end_;
+ return stack_end_ - 1;
}
void PushMergeValues(Control* c, Merge<Value>* merge) {
DCHECK_EQ(c, &control_.back());
DCHECK(merge == &c->start_merge || merge == &c->end_merge);
- stack_.erase(stack_.begin() + c->stack_depth, stack_.end());
+ DCHECK_LE(stack_ + c->stack_depth, stack_end_);
+ stack_end_ = stack_ + c->stack_depth;
if (merge->arity == 1) {
- stack_.push_back(merge->vals.first);
+ // {EnsureStackSpace} should have been called before in the central
+ // decoding loop.
+ DCHECK_GT(stack_capacity_end_, stack_end_);
+ *stack_end_++ = merge->vals.first;
} else {
+ EnsureStackSpace(merge->arity);
for (uint32_t i = 0; i < merge->arity; i++) {
- stack_.push_back(merge->vals.array[i]);
+ *stack_end_++ = merge->vals.array[i];
}
}
- DCHECK_EQ(c->stack_depth + merge->arity, stack_.size());
+ DCHECK_EQ(c->stack_depth + merge->arity, stack_size());
}
Value* PushReturns(const FunctionSig* sig) {
size_t return_count = sig->return_count();
- if (return_count == 0) return nullptr;
- size_t old_size = stack_.size();
+ EnsureStackSpace(static_cast<int>(return_count));
for (size_t i = 0; i < return_count; ++i) {
Push(sig->GetReturn(i));
}
- return stack_.data() + old_size;
+ return stack_end_ - return_count;
}
// We do not inline these functions because doing so causes a large binary
@@ -4062,16 +4110,16 @@ class WasmFullDecoder : public WasmDecoder<validate> {
V8_INLINE Value Pop(int index) {
DCHECK(!control_.empty());
uint32_t limit = control_.back().stack_depth;
- if (stack_.size() <= limit) {
+ if (stack_size() <= limit) {
// Popping past the current control start in reachable code.
if (!VALIDATE(control_.back().unreachable())) {
NotEnoughArgumentsError(index);
}
return UnreachableValue(this->pc_);
}
- Value val = stack_.back();
- stack_.pop_back();
- return val;
+ DCHECK_LT(stack_, stack_end_);
+ stack_end_--;
+ return *stack_end_;
}
// Pops values from the stack, as defined by {merge}. Thereby we type-check
@@ -4105,10 +4153,10 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// and a CHECK makes the whole function unreachable.
static_assert(validate, "Call this function only within VALIDATE");
DCHECK(merge == &c->start_merge || merge == &c->end_merge);
- DCHECK_GE(stack_.size(), c->stack_depth + merge->arity);
+ DCHECK_GE(stack_size(), c->stack_depth + merge->arity);
// The computation of {stack_values} is only valid if {merge->arity} is >0.
DCHECK_LT(0, merge->arity);
- Value* stack_values = &*(stack_.end() - merge->arity);
+ Value* stack_values = stack_end_ - merge->arity;
// Typecheck the topmost {merge->arity} values on the stack.
for (uint32_t i = 0; i < merge->arity; ++i) {
Value& val = stack_values[i];
@@ -4145,8 +4193,8 @@ class WasmFullDecoder : public WasmDecoder<validate> {
Control& c = control_.back();
if (V8_LIKELY(c.reachable())) {
uint32_t expected = c.end_merge.arity;
- DCHECK_GE(stack_.size(), c.stack_depth);
- uint32_t actual = static_cast<uint32_t>(stack_.size()) - c.stack_depth;
+ DCHECK_GE(stack_size(), c.stack_depth);
+ uint32_t actual = stack_size() - c.stack_depth;
// Fallthrus must match the arity of the control exactly.
if (!VALIDATE(actual == expected)) {
this->errorf(
@@ -4165,7 +4213,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// stack, if some stack values are missing to match the block signature.
Merge<Value>& merge = c.end_merge;
int arity = static_cast<int>(merge.arity);
- int available = static_cast<int>(stack_.size()) - c.stack_depth;
+ int available = static_cast<int>(stack_size()) - c.stack_depth;
// For fallthrus, not more than the needed values should be available.
if (!VALIDATE(available <= arity)) {
this->errorf(
@@ -4194,9 +4242,9 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// more.
uint32_t expected = c->br_merge()->arity;
if (expected == 0) return kReachableBranch; // Fast path.
- DCHECK_GE(stack_.size(), control_.back().stack_depth);
+ DCHECK_GE(stack_size(), control_.back().stack_depth);
uint32_t actual =
- static_cast<uint32_t>(stack_.size()) - control_.back().stack_depth;
+ static_cast<uint32_t>(stack_size()) - control_.back().stack_depth;
if (!VALIDATE(actual >= expected)) {
this->errorf(
this->pc_,
@@ -4220,7 +4268,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// Returns must have at least the number of values expected; can have more.
int num_available =
- static_cast<int>(stack_.size()) - control_.back().stack_depth;
+ static_cast<int>(stack_size()) - control_.back().stack_depth;
if (!VALIDATE(num_available >= num_returns)) {
this->errorf(this->pc_,
"expected %u elements on the stack for return, found %u",
@@ -4230,7 +4278,7 @@ class WasmFullDecoder : public WasmDecoder<validate> {
// Typecheck the topmost {num_returns} values on the stack.
// This line requires num_returns > 0.
- Value* stack_values = &*(stack_.end() - num_returns);
+ Value* stack_values = stack_end_ - num_returns;
for (int i = 0; i < num_returns; ++i) {
Value& val = stack_values[i];
ValueType expected_type = this->sig_->GetReturn(i);
diff --git a/deps/v8/src/wasm/function-body-decoder.cc b/deps/v8/src/wasm/function-body-decoder.cc
index f0887506d4..a7471c3a7b 100644
--- a/deps/v8/src/wasm/function-body-decoder.cc
+++ b/deps/v8/src/wasm/function-body-decoder.cc
@@ -210,7 +210,7 @@ bool PrintRawWasmCode(AccountingAllocator* allocator, const FunctionBody& body,
// TODO(7748) Update this for gc and ref types if needed
switch (i.pc()[1]) {
#define CASE_LOCAL_TYPE(local_name, type_name) \
- case kLocal##local_name: \
+ case k##local_name##Code: \
os << " kWasm" #type_name ","; \
break;
diff --git a/deps/v8/src/wasm/function-compiler.cc b/deps/v8/src/wasm/function-compiler.cc
index 22cae5f668..8b41a90992 100644
--- a/deps/v8/src/wasm/function-compiler.cc
+++ b/deps/v8/src/wasm/function-compiler.cc
@@ -267,16 +267,25 @@ void WasmCompilationUnit::CompileWasmFunction(Isolate* isolate,
namespace {
bool UseGenericWrapper(const FunctionSig* sig) {
-// Work only for 0 and 1 int32 param case for now.
+// Work only for int32 parameters and 1 or 0 return value for now.
#if V8_TARGET_ARCH_X64
- if (sig->parameters().size() > 1) {
+ if (sig->returns().size() > 1) {
return false;
}
- if (sig->parameters().size() == 1 &&
- sig->GetParam(0).kind() != ValueType::kI32) {
+ if (sig->returns().size() == 1 &&
+ sig->GetReturn(0).kind() != ValueType::kI32 &&
+ sig->GetReturn(0).kind() != ValueType::kI64 &&
+ sig->GetReturn(0).kind() != ValueType::kF32 &&
+ sig->GetReturn(0).kind() != ValueType::kF64) {
return false;
}
- return FLAG_wasm_generic_wrapper && sig->returns().empty();
+ for (ValueType type : sig->parameters()) {
+ if (type.kind() != ValueType::kI32 && type.kind() != ValueType::kI64 &&
+ type.kind() != ValueType::kF32 && type.kind() != ValueType::kF64) {
+ return false;
+ }
+ }
+ return FLAG_wasm_generic_wrapper;
#else
return false;
#endif
@@ -285,14 +294,15 @@ bool UseGenericWrapper(const FunctionSig* sig) {
JSToWasmWrapperCompilationUnit::JSToWasmWrapperCompilationUnit(
Isolate* isolate, WasmEngine* wasm_engine, const FunctionSig* sig,
- bool is_import, const WasmFeatures& enabled_features)
+ const WasmModule* module, bool is_import,
+ const WasmFeatures& enabled_features)
: is_import_(is_import),
sig_(sig),
use_generic_wrapper_(UseGenericWrapper(sig) && !is_import),
- job_(use_generic_wrapper_
- ? nullptr
- : compiler::NewJSToWasmCompilationJob(
- isolate, wasm_engine, sig, is_import, enabled_features)) {}
+ job_(use_generic_wrapper_ ? nullptr
+ : compiler::NewJSToWasmCompilationJob(
+ isolate, wasm_engine, sig, module,
+ is_import, enabled_features)) {}
JSToWasmWrapperCompilationUnit::~JSToWasmWrapperCompilationUnit() = default;
@@ -324,11 +334,12 @@ Handle<Code> JSToWasmWrapperCompilationUnit::Finalize(Isolate* isolate) {
// static
Handle<Code> JSToWasmWrapperCompilationUnit::CompileJSToWasmWrapper(
- Isolate* isolate, const FunctionSig* sig, bool is_import) {
+ Isolate* isolate, const FunctionSig* sig, const WasmModule* module,
+ bool is_import) {
// Run the compilation unit synchronously.
WasmFeatures enabled_features = WasmFeatures::FromIsolate(isolate);
JSToWasmWrapperCompilationUnit unit(isolate, isolate->wasm_engine(), sig,
- is_import, enabled_features);
+ module, is_import, enabled_features);
unit.Execute();
return unit.Finalize(isolate);
}
diff --git a/deps/v8/src/wasm/function-compiler.h b/deps/v8/src/wasm/function-compiler.h
index 380a74795e..3d232773e3 100644
--- a/deps/v8/src/wasm/function-compiler.h
+++ b/deps/v8/src/wasm/function-compiler.h
@@ -114,7 +114,8 @@ STATIC_ASSERT(sizeof(WasmCompilationUnit) <= 2 * kSystemPointerSize);
class V8_EXPORT_PRIVATE JSToWasmWrapperCompilationUnit final {
public:
JSToWasmWrapperCompilationUnit(Isolate* isolate, WasmEngine* wasm_engine,
- const FunctionSig* sig, bool is_import,
+ const FunctionSig* sig,
+ const wasm::WasmModule* module, bool is_import,
const WasmFeatures& enabled_features);
~JSToWasmWrapperCompilationUnit();
@@ -127,6 +128,7 @@ class V8_EXPORT_PRIVATE JSToWasmWrapperCompilationUnit final {
// Run a compilation unit synchronously.
static Handle<Code> CompileJSToWasmWrapper(Isolate* isolate,
const FunctionSig* sig,
+ const WasmModule* module,
bool is_import);
private:
diff --git a/deps/v8/src/wasm/graph-builder-interface.cc b/deps/v8/src/wasm/graph-builder-interface.cc
index 56c3223b4b..3fc6b066bb 100644
--- a/deps/v8/src/wasm/graph-builder-interface.cc
+++ b/deps/v8/src/wasm/graph-builder-interface.cc
@@ -268,7 +268,7 @@ class WasmGraphBuildingInterface {
result->node = builder_->Simd128Constant(imm.value);
}
- void RefNull(FullDecoder* decoder, Value* result) {
+ void RefNull(FullDecoder* decoder, ValueType type, Value* result) {
result->node = builder_->RefNull();
}
@@ -941,6 +941,7 @@ class WasmGraphBuildingInterface {
}
TFNode* DefaultValue(ValueType type) {
+ DCHECK(type.is_defaultable());
switch (type.kind()) {
case ValueType::kI8:
case ValueType::kI16:
diff --git a/deps/v8/src/wasm/module-compiler.cc b/deps/v8/src/wasm/module-compiler.cc
index 10c50b53b1..967e092b5b 100644
--- a/deps/v8/src/wasm/module-compiler.cc
+++ b/deps/v8/src/wasm/module-compiler.cc
@@ -7,7 +7,7 @@
#include <algorithm>
#include <queue>
-#include "src/api/api.h"
+#include "src/api/api-inl.h"
#include "src/asmjs/asm-js.h"
#include "src/base/enum-set.h"
#include "src/base/optional.h"
@@ -190,7 +190,8 @@ enum CompileBaselineOnly : bool {
// runs empty.
class CompilationUnitQueues {
public:
- explicit CompilationUnitQueues(int max_tasks) : queues_(max_tasks) {
+ explicit CompilationUnitQueues(int max_tasks, int num_declared_functions)
+ : queues_(max_tasks), top_tier_priority_units_queues_(max_tasks) {
DCHECK_LT(0, max_tasks);
for (int task_id = 0; task_id < max_tasks; ++task_id) {
queues_[task_id].next_steal_task_id = next_task_id(task_id);
@@ -198,6 +199,12 @@ class CompilationUnitQueues {
for (auto& atomic_counter : num_units_) {
std::atomic_init(&atomic_counter, size_t{0});
}
+
+ treated_ = std::make_unique<std::atomic<bool>[]>(num_declared_functions);
+
+ for (int i = 0; i < num_declared_functions; i++) {
+ std::atomic_init(&treated_.get()[i], false);
+ }
}
base::Optional<WasmCompilationUnit> GetNextUnit(
@@ -257,6 +264,25 @@ class CompilationUnitQueues {
}
}
+ void AddTopTierPriorityUnit(WasmCompilationUnit unit, size_t priority) {
+ // Add to the individual queues in a round-robin fashion. No special care is
+ // taken to balance them; they will be balanced by work stealing. We use
+ // the same counter for this reason.
+ int queue_to_add = next_queue_to_add.load(std::memory_order_relaxed);
+ while (!next_queue_to_add.compare_exchange_weak(
+ queue_to_add, next_task_id(queue_to_add), std::memory_order_relaxed)) {
+ // Retry with updated {queue_to_add}.
+ }
+
+ TopTierPriorityUnitsQueue* queue =
+ &top_tier_priority_units_queues_[queue_to_add];
+ base::MutexGuard guard(&queue->mutex);
+
+ num_priority_units_.fetch_add(1, std::memory_order_relaxed);
+ num_units_[kTopTier].fetch_add(1, std::memory_order_relaxed);
+ queue->units.emplace(priority, unit);
+ }
+
// Get the current total number of units in all queues. This is only a
// momentary snapshot, it's not guaranteed that {GetNextUnit} returns a unit
// if this method returns non-zero.
@@ -299,6 +325,18 @@ class CompilationUnitQueues {
}
};
+ struct TopTierPriorityUnit {
+ TopTierPriorityUnit(int priority, WasmCompilationUnit unit)
+ : priority(priority), unit(unit) {}
+
+ size_t priority;
+ WasmCompilationUnit unit;
+
+ bool operator<(const TopTierPriorityUnit& other) const {
+ return priority < other.priority;
+ }
+ };
+
struct BigUnitsQueue {
BigUnitsQueue() {
for (auto& atomic : has_units) std::atomic_init(&atomic, false);
@@ -313,10 +351,23 @@ class CompilationUnitQueues {
std::priority_queue<BigUnit> units[kNumTiers];
};
+ struct TopTierPriorityUnitsQueue {
+ base::Mutex mutex;
+
+ // Protected by {mutex}:
+ std::priority_queue<TopTierPriorityUnit> units;
+ int next_steal_task_id;
+ // End of fields protected by {mutex}.
+ };
+
std::vector<Queue> queues_;
BigUnitsQueue big_units_queue_;
+ std::vector<TopTierPriorityUnitsQueue> top_tier_priority_units_queues_;
+
std::atomic<size_t> num_units_[kNumTiers];
+ std::atomic<size_t> num_priority_units_{0};
+ std::unique_ptr<std::atomic<bool>[]> treated_;
std::atomic<int> next_queue_to_add{0};
int next_task_id(int task_id) const {
@@ -333,10 +384,19 @@ class CompilationUnitQueues {
base::Optional<WasmCompilationUnit> GetNextUnitOfTier(int task_id, int tier) {
Queue* queue = &queues_[task_id];
- // First check whether there is a big unit of that tier. Execute that first.
+
+ // First check whether there is a priority unit. Execute that
+ // first.
+ if (tier == kTopTier) {
+ if (auto unit = GetTopTierPriorityUnit(task_id)) {
+ return unit;
+ }
+ }
+
+ // Then check whether there is a big unit of that tier.
if (auto unit = GetBigUnitOfTier(tier)) return unit;
- // Then check whether our own queue has a unit of the wanted tier. If
+ // Finally check whether our own queue has a unit of the wanted tier. If
// so, return it, otherwise get the task id to steal from.
int steal_task_id;
{
@@ -379,6 +439,46 @@ class CompilationUnitQueues {
return unit;
}
+ base::Optional<WasmCompilationUnit> GetTopTierPriorityUnit(int task_id) {
+ // Fast-path without locking.
+ if (num_priority_units_.load(std::memory_order_relaxed) == 0) {
+ return {};
+ }
+
+ TopTierPriorityUnitsQueue* queue =
+ &top_tier_priority_units_queues_[task_id];
+
+ int steal_task_id;
+ {
+ base::MutexGuard mutex_guard(&queue->mutex);
+ while (!queue->units.empty()) {
+ auto unit = queue->units.top().unit;
+ queue->units.pop();
+ num_priority_units_.fetch_sub(1, std::memory_order_relaxed);
+
+ if (!treated_[unit.func_index()].exchange(true,
+ std::memory_order_relaxed)) {
+ return unit;
+ }
+ num_units_[kTopTier].fetch_sub(1, std::memory_order_relaxed);
+ }
+ steal_task_id = queue->next_steal_task_id;
+ }
+
+ // Try to steal from all other queues. If this succeeds, return one of the
+ // stolen units.
+ size_t steal_trials = queues_.size();
+ for (; steal_trials > 0;
+ --steal_trials, steal_task_id = next_task_id(steal_task_id)) {
+ if (steal_task_id == task_id) continue;
+ if (auto unit = StealTopTierPriorityUnit(task_id, steal_task_id)) {
+ return unit;
+ }
+ }
+
+ return {};
+ }
+
// Steal units of {wanted_tier} from {steal_from_task_id} to {task_id}. Return
// first stolen unit (rest put in queue of {task_id}), or {nullopt} if
// {steal_from_task_id} had no units of {wanted_tier}.
@@ -405,6 +505,39 @@ class CompilationUnitQueues {
queue->next_steal_task_id = next_task_id(steal_from_task_id);
return returned_unit;
}
+
+ // Steal one priority unit from {steal_from_task_id} to {task_id}. Return
+ // stolen unit, or {nullopt} if {steal_from_task_id} had no priority units.
+ base::Optional<WasmCompilationUnit> StealTopTierPriorityUnit(
+ int task_id, int steal_from_task_id) {
+ DCHECK_NE(task_id, steal_from_task_id);
+
+ base::Optional<WasmCompilationUnit> returned_unit;
+ {
+ TopTierPriorityUnitsQueue* steal_queue =
+ &top_tier_priority_units_queues_[steal_from_task_id];
+ base::MutexGuard guard(&steal_queue->mutex);
+ while (true) {
+ if (steal_queue->units.empty()) return {};
+
+ auto unit = steal_queue->units.top().unit;
+ steal_queue->units.pop();
+ num_priority_units_.fetch_sub(1, std::memory_order_relaxed);
+
+ if (!treated_[unit.func_index()].exchange(true,
+ std::memory_order_relaxed)) {
+ returned_unit = unit;
+ break;
+ }
+ num_units_[kTopTier].fetch_sub(1, std::memory_order_relaxed);
+ }
+ }
+ TopTierPriorityUnitsQueue* queue =
+ &top_tier_priority_units_queues_[task_id];
+ base::MutexGuard guard(&queue->mutex);
+ queue->next_steal_task_id = next_task_id(steal_from_task_id);
+ return returned_unit;
+ }
};
// {JobHandle} is not thread safe in general (at least both the
@@ -457,7 +590,8 @@ class CompilationStateImpl {
// Initialize compilation progress. Set compilation tiers to expect for
// baseline and top tier compilation. Must be set before {AddCompilationUnits}
// is invoked which triggers background compilation.
- void InitializeCompilationProgress(bool lazy_module, int num_wrappers);
+ void InitializeCompilationProgress(bool lazy_module, int num_import_wrappers,
+ int num_export_wrappers);
// Initialize the compilation progress after deserialization. This is needed
// for recompilation (e.g. for tier down) to work later.
@@ -483,6 +617,7 @@ class CompilationStateImpl {
Vector<std::shared_ptr<JSToWasmWrapperCompilationUnit>>
js_to_wasm_wrapper_units);
void AddTopTierCompilationUnit(WasmCompilationUnit);
+ void AddTopTierPriorityCompilationUnit(WasmCompilationUnit, size_t);
base::Optional<WasmCompilationUnit> GetNextCompilationUnit(
int task_id, CompileBaselineOnly baseline_only);
@@ -495,6 +630,7 @@ class CompilationStateImpl {
void OnFinishedJSToWasmWrapperUnits(int num);
int GetFreeCompileTaskId();
+ int GetUnpublishedUnitsLimits(int task_id);
void OnCompilationStopped(int task_id, const WasmFeatures& detected);
void PublishDetectedFeatures(Isolate*);
// Ensure that a compilation job is running, and increase its concurrency if
@@ -505,7 +641,9 @@ class CompilationStateImpl {
void SetError();
- void WaitForBaselineFinished();
+ void WaitForCompilationEvent(CompilationEvent event);
+
+ void SetHighPriority() { has_priority_ = true; }
bool failed() const {
return compile_failed_.load(std::memory_order_relaxed);
@@ -513,7 +651,8 @@ class CompilationStateImpl {
bool baseline_compilation_finished() const {
base::MutexGuard guard(&callbacks_mutex_);
- return outstanding_baseline_units_ == 0;
+ return outstanding_baseline_units_ == 0 &&
+ outstanding_export_wrappers_ == 0;
}
bool top_tier_compilation_finished() const {
@@ -558,8 +697,17 @@ class CompilationStateImpl {
std::atomic<bool> compile_failed_{false};
// The atomic counter is shared with the compilation job. It's increased if
- // more units are added, and decreased when the queue drops to zero.
- std::shared_ptr<std::atomic<int>> current_compile_concurrency_ =
+ // more units are added, and decreased when the queue drops to zero. Hence
+ // it's an approximation of the current number of available units in the
+ // queue, but it's not updated after popping a single unit, because that
+ // would create too much contention.
+ // This counter is not used for synchronization, hence relaxed memory ordering
+ // can be used. The thread that increases the counter is the same that calls
+ // {NotifyConcurrencyIncrease} later. The only reduction of the counter is a
+ // drop to zero after a worker does not find any unit in the queue, and after
+ // that drop another check is executed to ensure that any left-over units are
+ // still processed.
+ std::shared_ptr<std::atomic<int>> scheduled_units_approximation_ =
std::make_shared<std::atomic<int>>(0);
const int max_compile_concurrency_ = 0;
@@ -572,6 +720,8 @@ class CompilationStateImpl {
std::vector<std::shared_ptr<JSToWasmWrapperCompilationUnit>>
js_to_wasm_wrapper_units_;
+ bool has_priority_ = false;
+
// This mutex protects all information of this {CompilationStateImpl} which is
// being accessed concurrently.
mutable base::Mutex mutex_;
@@ -579,9 +729,6 @@ class CompilationStateImpl {
//////////////////////////////////////////////////////////////////////////////
// Protected by {mutex_}:
- // Set of unused task ids; <= {max_compile_concurrency_} many.
- std::vector<int> available_task_ids_;
-
std::shared_ptr<ThreadSafeJobHandle> current_compile_job_;
// Features detected to be used in this module. Features can be detected
@@ -611,6 +758,7 @@ class CompilationStateImpl {
base::EnumSet<CompilationEvent> finished_events_;
int outstanding_baseline_units_ = 0;
+ int outstanding_export_wrappers_ = 0;
int outstanding_top_tier_functions_ = 0;
std::vector<uint8_t> compilation_progress_;
@@ -667,6 +815,9 @@ void UpdateFeatureUseCounts(Isolate* isolate, const WasmFeatures& detected) {
} // namespace
+// static
+constexpr uint32_t CompilationEnv::kMaxMemoryPagesAtRuntime;
+
//////////////////////////////////////////////////////
// PIMPL implementation of {CompilationState}.
@@ -690,10 +841,6 @@ void CompilationState::AddCallback(CompilationState::callback_t callback) {
return Impl(this)->AddCallback(std::move(callback));
}
-void CompilationState::WaitForBaselineFinished() {
- Impl(this)->WaitForBaselineFinished();
-}
-
void CompilationState::WaitForTopTierFinished() {
// TODO(clemensb): Contribute to compilation while waiting.
auto top_tier_finished_semaphore = std::make_shared<base::Semaphore>(0);
@@ -706,6 +853,8 @@ void CompilationState::WaitForTopTierFinished() {
top_tier_finished_semaphore->Wait();
}
+void CompilationState::SetHighPriority() { Impl(this)->SetHighPriority(); }
+
void CompilationState::InitializeAfterDeserialization() {
Impl(this)->InitializeCompilationProgressAfterDeserialization();
}
@@ -1053,7 +1202,14 @@ void TriggerTierUp(Isolate* isolate, NativeModule* native_module,
Impl(native_module->compilation_state());
WasmCompilationUnit tiering_unit{func_index, ExecutionTier::kTurbofan,
kNoDebugging};
- compilation_state->AddTopTierCompilationUnit(tiering_unit);
+
+ uint32_t* call_array = native_module->num_liftoff_function_calls_array();
+ int offset =
+ wasm::declared_function_index(native_module->module(), func_index);
+
+ size_t priority =
+ base::Relaxed_Load(reinterpret_cast<int*>(&call_array[offset]));
+ compilation_state->AddTopTierPriorityCompilationUnit(tiering_unit, priority);
}
namespace {
@@ -1114,13 +1270,18 @@ CompilationExecutionResult ExecuteCompilationUnits(
std::shared_ptr<WireBytesStorage> wire_bytes;
std::shared_ptr<const WasmModule> module;
WasmEngine* wasm_engine;
- int task_id;
+ // The Jobs API guarantees that {GetTaskId} is less than the number of
+ // workers, and that the number of workers is less than or equal to the max
+ // compile concurrency, which makes the task_id safe to use as an index into
+ // the worker queues.
+ int task_id = delegate ? delegate->GetTaskId() : 0;
+ int unpublished_units_limit;
base::Optional<WasmCompilationUnit> unit;
WasmFeatures detected_features = WasmFeatures::None();
auto stop = [&detected_features,
- &task_id](BackgroundCompileScope& compile_scope) {
+ task_id](BackgroundCompileScope& compile_scope) {
compile_scope.compilation_state()->OnCompilationStopped(task_id,
detected_features);
};
@@ -1135,7 +1296,8 @@ CompilationExecutionResult ExecuteCompilationUnits(
wire_bytes = compilation_state->GetWireBytesStorage();
module = compile_scope.native_module()->shared_module();
wasm_engine = compile_scope.native_module()->engine();
- task_id = compilation_state->GetFreeCompileTaskId();
+ unpublished_units_limit =
+ compilation_state->GetUnpublishedUnitsLimits(task_id);
unit = compilation_state->GetNextCompilationUnit(task_id, baseline_only);
if (!unit) {
stop(compile_scope);
@@ -1217,7 +1379,11 @@ CompilationExecutionResult ExecuteCompilationUnits(
// units. If we compiled Liftoff before, we need to publish them anyway
// to ensure fast completion of baseline compilation, if we compiled
// TurboFan before, we publish to reduce peak memory consumption.
- if (unit->tier() == ExecutionTier::kTurbofan) {
+ // Also publish after finishing a certain amount of units, to avoid
+ // contention when all threads publish at the end.
+ if (unit->tier() == ExecutionTier::kTurbofan ||
+ static_cast<int>(results_to_publish.size()) >=
+ unpublished_units_limit) {
publish_results(&compile_scope);
}
}
@@ -1243,8 +1409,8 @@ int AddExportWrapperUnits(Isolate* isolate, WasmEngine* wasm_engine,
JSToWasmWrapperKey key(function.imported, *function.sig);
if (keys.insert(key).second) {
auto unit = std::make_shared<JSToWasmWrapperCompilationUnit>(
- isolate, wasm_engine, function.sig, function.imported,
- enabled_features);
+ isolate, wasm_engine, function.sig, native_module->module(),
+ function.imported, enabled_features);
builder->AddJSToWasmWrapperUnit(std::move(unit));
}
}
@@ -1261,7 +1427,8 @@ int AddImportWrapperUnits(NativeModule* native_module,
int num_imported_functions = native_module->num_imported_functions();
for (int func_index = 0; func_index < num_imported_functions; func_index++) {
const FunctionSig* sig = native_module->module()->functions[func_index].sig;
- if (!IsJSCompatibleSignature(sig, native_module->enabled_features())) {
+ if (!IsJSCompatibleSignature(sig, native_module->module(),
+ native_module->enabled_features())) {
continue;
}
WasmImportWrapperCache::CacheKey key(
@@ -1311,7 +1478,7 @@ void InitializeCompilationUnits(Isolate* isolate, NativeModule* native_module) {
AddExportWrapperUnits(isolate, isolate->wasm_engine(), native_module,
&builder, WasmFeatures::FromIsolate(isolate));
compilation_state->InitializeCompilationProgress(
- lazy_module, num_import_wrappers + num_export_wrappers);
+ lazy_module, num_import_wrappers, num_export_wrappers);
builder.Commit();
}
@@ -1369,7 +1536,7 @@ class CompilationTimeCallback {
false, // deserialized
FLAG_wasm_lazy_compilation, // lazy
true, // success
- native_module->generated_code_size(), // code_size_in_bytes
+ native_module->liftoff_code_size(), // code_size_in_bytes
native_module->liftoff_bailout_count(), // liftoff_bailout_count
duration.InMicroseconds() // wall_clock_time_in_us
};
@@ -1380,9 +1547,9 @@ class CompilationTimeCallback {
histogram->AddSample(static_cast<int>(duration.InMicroseconds()));
v8::metrics::WasmModuleTieredUp event{
- FLAG_wasm_lazy_compilation, // lazy
- native_module->generated_code_size(), // code_size_in_bytes
- duration.InMicroseconds() // wall_clock_time_in_us
+ FLAG_wasm_lazy_compilation, // lazy
+ native_module->turbofan_code_size(), // code_size_in_bytes
+ duration.InMicroseconds() // wall_clock_time_in_us
};
metrics_recorder_->DelayMainThreadEvent(event, context_id_);
}
@@ -1394,7 +1561,7 @@ class CompilationTimeCallback {
false, // deserialized
FLAG_wasm_lazy_compilation, // lazy
false, // success
- native_module->generated_code_size(), // code_size_in_bytes
+ native_module->liftoff_code_size(), // code_size_in_bytes
native_module->liftoff_bailout_count(), // liftoff_bailout_count
duration.InMicroseconds() // wall_clock_time_in_us
};
@@ -1414,7 +1581,8 @@ class CompilationTimeCallback {
void CompileNativeModule(Isolate* isolate,
v8::metrics::Recorder::ContextId context_id,
ErrorThrower* thrower, const WasmModule* wasm_module,
- std::shared_ptr<NativeModule> native_module) {
+ std::shared_ptr<NativeModule> native_module,
+ Handle<FixedArray>* export_wrappers_out) {
CHECK(!FLAG_jitless);
ModuleWireBytes wire_bytes(native_module->wire_bytes());
const bool lazy_module = IsLazyModule(wasm_module);
@@ -1444,7 +1612,26 @@ void CompileNativeModule(Isolate* isolate,
// Initialize the compilation units and kick off background compile tasks.
InitializeCompilationUnits(isolate, native_module.get());
- compilation_state->WaitForBaselineFinished();
+ compilation_state->WaitForCompilationEvent(
+ CompilationEvent::kFinishedExportWrappers);
+
+ if (compilation_state->failed()) {
+ DCHECK_IMPLIES(lazy_module, !FLAG_wasm_lazy_validation);
+ ValidateSequentially(wasm_module, native_module.get(), isolate->counters(),
+ isolate->allocator(), thrower, lazy_module);
+ CHECK(thrower->error());
+ return;
+ }
+
+ if (!FLAG_predictable) {
+ // For predictable mode, do not finalize wrappers yet to make sure we catch
+ // validation errors first.
+ compilation_state->FinalizeJSToWasmWrappers(
+ isolate, native_module->module(), export_wrappers_out);
+ }
+
+ compilation_state->WaitForCompilationEvent(
+ CompilationEvent::kFinishedBaselineCompilation);
compilation_state->PublishDetectedFeatures(isolate);
@@ -1453,6 +1640,9 @@ void CompileNativeModule(Isolate* isolate,
ValidateSequentially(wasm_module, native_module.get(), isolate->counters(),
isolate->allocator(), thrower, lazy_module);
CHECK(thrower->error());
+ } else if (FLAG_predictable) {
+ compilation_state->FinalizeJSToWasmWrappers(
+ isolate, native_module->module(), export_wrappers_out);
}
}
@@ -1462,11 +1652,12 @@ class BackgroundCompileJob : public JobTask {
explicit BackgroundCompileJob(
std::shared_ptr<BackgroundCompileToken> token,
std::shared_ptr<Counters> async_counters,
- std::shared_ptr<std::atomic<int>> current_concurrency,
- int max_concurrency)
+ std::shared_ptr<std::atomic<int>> scheduled_units_approximation,
+ size_t max_concurrency)
: token_(std::move(token)),
async_counters_(std::move(async_counters)),
- current_concurrency_(std::move(current_concurrency)),
+ scheduled_units_approximation_(
+ std::move(scheduled_units_approximation)),
max_concurrency_(max_concurrency) {}
void Run(JobDelegate* delegate) override {
@@ -1474,33 +1665,36 @@ class BackgroundCompileJob : public JobTask {
kBaselineOrTopTier) == kYield) {
return;
}
- // Otherwise we didn't find any more units to execute. Reduce the available
- // concurrency to zero, but then check whether any more units were added in
- // the meantime, and increase back if necessary.
- current_concurrency_->store(0);
- {
- BackgroundCompileScope scope(token_);
- if (scope.cancelled()) return;
- size_t outstanding_units =
- scope.compilation_state()->NumOutstandingCompilations();
- if (outstanding_units == 0) return;
- // On a race between this thread and the thread which scheduled the units,
- // this might increase concurrency more than needed, which is fine. It
- // will be reduced again when the first task finds no more work to do.
- scope.compilation_state()->ScheduleCompileJobForNewUnits(
- static_cast<int>(outstanding_units));
- }
- }
-
- size_t GetMaxConcurrency() const override {
- return std::min(max_concurrency_, current_concurrency_->load());
+ // Otherwise we didn't find any more units to execute. Reduce the atomic
+ // counter of the approximated number of available units to zero, but then
+ // check whether any more units were added in the meantime, and increase
+ // back if necessary.
+ scheduled_units_approximation_->store(0, std::memory_order_relaxed);
+
+ BackgroundCompileScope scope(token_);
+ if (scope.cancelled()) return;
+ size_t outstanding_units =
+ scope.compilation_state()->NumOutstandingCompilations();
+ if (outstanding_units == 0) return;
+ // On a race between this thread and the thread which scheduled the units,
+ // this might increase concurrency more than needed, which is fine. It
+ // will be reduced again when the first task finds no more work to do.
+ scope.compilation_state()->ScheduleCompileJobForNewUnits(
+ static_cast<int>(outstanding_units));
+ }
+
+ size_t GetMaxConcurrency(size_t worker_count) const override {
+ // {current_concurrency_} does not reflect the units that running workers
+ // are processing, thus add the current worker count to that number.
+ return std::min(max_concurrency_,
+ worker_count + scheduled_units_approximation_->load());
}
private:
const std::shared_ptr<BackgroundCompileToken> token_;
const std::shared_ptr<Counters> async_counters_;
- const std::shared_ptr<std::atomic<int>> current_concurrency_;
- const int max_concurrency_;
+ const std::shared_ptr<std::atomic<int>> scheduled_units_approximation_;
+ const size_t max_concurrency_;
};
} // namespace
@@ -1541,10 +1735,13 @@ std::shared_ptr<NativeModule> CompileToNativeModule(
native_module = isolate->wasm_engine()->NewNativeModule(
isolate, enabled, module, code_size_estimate);
native_module->SetWireBytes(std::move(wire_bytes_copy));
+ // Sync compilation is user blocking, so we increase the priority.
+ native_module->compilation_state()->SetHighPriority();
v8::metrics::Recorder::ContextId context_id =
isolate->GetOrRegisterRecorderContextId(isolate->native_context());
- CompileNativeModule(isolate, context_id, thrower, wasm_module, native_module);
+ CompileNativeModule(isolate, context_id, thrower, wasm_module, native_module,
+ export_wrappers_out);
bool cache_hit = !isolate->wasm_engine()->UpdateNativeModuleCache(
thrower->error(), &native_module, isolate);
if (thrower->error()) return {};
@@ -1553,9 +1750,6 @@ std::shared_ptr<NativeModule> CompileToNativeModule(
CompileJsToWasmWrappers(isolate, wasm_module, export_wrappers_out);
return native_module;
}
- Impl(native_module->compilation_state())
- ->FinalizeJSToWasmWrappers(isolate, native_module->module(),
- export_wrappers_out);
// Ensure that the code objects are logged before returning.
isolate->wasm_engine()->LogOutstandingCodesForIsolate(isolate);
@@ -1568,6 +1762,7 @@ void RecompileNativeModule(NativeModule* native_module,
// Install a callback to notify us once background recompilation finished.
auto recompilation_finished_semaphore = std::make_shared<base::Semaphore>(0);
auto* compilation_state = Impl(native_module->compilation_state());
+
// The callback captures a shared ptr to the semaphore.
// Initialize the compilation units and kick off background compile tasks.
compilation_state->InitializeRecompilation(
@@ -1587,7 +1782,7 @@ void RecompileNativeModule(NativeModule* native_module,
AsyncCompileJob::AsyncCompileJob(
Isolate* isolate, const WasmFeatures& enabled,
std::unique_ptr<byte[]> bytes_copy, size_t length, Handle<Context> context,
- const char* api_method_name,
+ Handle<Context> incumbent_context, const char* api_method_name,
std::shared_ptr<CompilationResultResolver> resolver)
: isolate_(isolate),
api_method_name_(api_method_name),
@@ -1606,8 +1801,10 @@ AsyncCompileJob::AsyncCompileJob(
foreground_task_runner_ = platform->GetForegroundTaskRunner(v8_isolate);
native_context_ =
isolate->global_handles()->Create(context->native_context());
+ incumbent_context_ = isolate->global_handles()->Create(*incumbent_context);
DCHECK(native_context_->IsNativeContext());
context_id_ = isolate->GetOrRegisterRecorderContextId(native_context_);
+ metrics_event_.async = true;
}
void AsyncCompileJob::Start() {
@@ -1698,6 +1895,7 @@ AsyncCompileJob::~AsyncCompileJob() {
if (stream_) stream_->NotifyCompilationEnded();
CancelPendingForegroundTask();
isolate_->global_handles()->Destroy(native_context_.location());
+ isolate_->global_handles()->Destroy(incumbent_context_.location());
if (!module_object_.is_null()) {
isolate_->global_handles()->Destroy(module_object_.location());
}
@@ -1774,7 +1972,7 @@ void AsyncCompileJob::FinishCompile(bool is_after_cache_hit) {
is_after_deserialization, // deserialized
wasm_lazy_compilation_, // lazy
!compilation_state->failed(), // success
- native_module_->generated_code_size(), // code_size_in_bytes
+ native_module_->liftoff_code_size(), // code_size_in_bytes
native_module_->liftoff_bailout_count(), // liftoff_bailout_count
duration.InMicroseconds() // wall_clock_time_in_us
};
@@ -1846,6 +2044,11 @@ void AsyncCompileJob::AsyncCompileFailed() {
void AsyncCompileJob::AsyncCompileSucceeded(Handle<WasmModuleObject> result) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.wasm.detailed"),
"wasm.OnCompilationSucceeded");
+ // We have to make sure that an "incumbent context" is available in case
+ // the module's start function calls out to Blink.
+ Local<v8::Context> backup_incumbent_context =
+ Utils::ToLocal(incumbent_context_);
+ v8::Context::BackupIncumbentScope incumbent(backup_incumbent_context);
resolver_->OnCompilationSucceeded(result);
}
@@ -1856,8 +2059,13 @@ class AsyncCompileJob::CompilationStateCallback {
void operator()(CompilationEvent event) {
// This callback is only being called from a foreground task.
switch (event) {
- case CompilationEvent::kFinishedBaselineCompilation:
+ case CompilationEvent::kFinishedExportWrappers:
+ // Even if baseline compilation units finish first, we trigger the
+ // "kFinishedExportWrappers" event first.
DCHECK(!last_event_.has_value());
+ break;
+ case CompilationEvent::kFinishedBaselineCompilation:
+ DCHECK_EQ(CompilationEvent::kFinishedExportWrappers, last_event_);
if (job_->DecrementAndCheckFinisherCount()) {
// Install the native module in the cache, or reuse a conflicting one.
// If we get a conflicting module, wait until we are back in the
@@ -1877,7 +2085,8 @@ class AsyncCompileJob::CompilationStateCallback {
// here.
break;
case CompilationEvent::kFailedCompilation:
- DCHECK(!last_event_.has_value());
+ DCHECK(!last_event_.has_value() ||
+ last_event_ == CompilationEvent::kFinishedExportWrappers);
if (job_->DecrementAndCheckFinisherCount()) {
// Don't update {job_->native_module_} to avoid data races with other
// compilation threads. Use a copy of the shared pointer instead.
@@ -2273,6 +2482,16 @@ void AsyncStreamingProcessor::FinishAsyncCompileJobWithError(
// of the AsyncCompileJob to DecodeFail.
job_->background_task_manager_.CancelAndWait();
+ // Record event metrics.
+ auto duration = base::TimeTicks::Now() - job_->start_time_;
+ job_->metrics_event_.success = false;
+ job_->metrics_event_.streamed = true;
+ job_->metrics_event_.module_size_in_bytes = job_->wire_bytes_.length();
+ job_->metrics_event_.function_count = num_functions_;
+ job_->metrics_event_.wall_clock_time_in_us = duration.InMicroseconds();
+ job_->isolate_->metrics_recorder()->DelayMainThreadEvent(job_->metrics_event_,
+ job_->context_id_);
+
// Check if there is already a CompiledModule, in which case we have to clean
// up the CompilationStateImpl as well.
if (job_->native_module_) {
@@ -2402,7 +2621,7 @@ bool AsyncStreamingProcessor::ProcessCodeSectionHeader(
job_->isolate_, wasm_engine_, native_module,
compilation_unit_builder_.get(), job_->enabled_features_);
compilation_state->InitializeCompilationProgress(
- lazy_module, num_import_wrappers + num_export_wrappers);
+ lazy_module, num_import_wrappers, num_export_wrappers);
return true;
}
@@ -2484,6 +2703,16 @@ void AsyncStreamingProcessor::OnFinishedStream(OwnedVector<uint8_t> bytes) {
job_->wire_bytes_ = ModuleWireBytes(bytes.as_vector());
job_->bytes_copy_ = bytes.ReleaseData();
+ // Record event metrics.
+ auto duration = base::TimeTicks::Now() - job_->start_time_;
+ job_->metrics_event_.success = true;
+ job_->metrics_event_.streamed = true;
+ job_->metrics_event_.module_size_in_bytes = job_->wire_bytes_.length();
+ job_->metrics_event_.function_count = num_functions_;
+ job_->metrics_event_.wall_clock_time_in_us = duration.InMicroseconds();
+ job_->isolate_->metrics_recorder()->DelayMainThreadEvent(job_->metrics_event_,
+ job_->context_id_);
+
if (prefix_cache_hit_) {
// Restart as an asynchronous, non-streaming compilation. Most likely
// {PrepareAndStartCompile} will get the native module from the cache.
@@ -2596,14 +2825,8 @@ CompilationStateImpl::CompilationStateImpl(
max_compile_concurrency_(std::max(GetMaxCompileConcurrency(), 1)),
// Add one to the allowed number of parallel tasks, because the foreground
// task sometimes also contributes.
- compilation_unit_queues_(max_compile_concurrency_ + 1),
- available_task_ids_(max_compile_concurrency_ + 1) {
- for (int i = 0; i <= max_compile_concurrency_; ++i) {
- // Ids are popped on task creation, so reverse this list. This ensures that
- // the first background task gets id 0.
- available_task_ids_[i] = max_compile_concurrency_ - i;
- }
-}
+ compilation_unit_queues_(max_compile_concurrency_ + 1,
+ native_module->num_functions()) {}
void CompilationStateImpl::CancelCompilation() {
background_compile_token_->Cancel();
@@ -2612,14 +2835,15 @@ void CompilationStateImpl::CancelCompilation() {
callbacks_.clear();
}
-void CompilationStateImpl::InitializeCompilationProgress(bool lazy_module,
- int num_wrappers) {
+void CompilationStateImpl::InitializeCompilationProgress(
+ bool lazy_module, int num_import_wrappers, int num_export_wrappers) {
DCHECK(!failed());
auto enabled_features = native_module_->enabled_features();
auto* module = native_module_->module();
base::MutexGuard guard(&callbacks_mutex_);
DCHECK_EQ(0, outstanding_baseline_units_);
+ DCHECK_EQ(0, outstanding_export_wrappers_);
DCHECK_EQ(0, outstanding_top_tier_functions_);
compilation_progress_.reserve(module->num_declared_functions);
int start = module->num_imported_functions;
@@ -2669,7 +2893,8 @@ void CompilationStateImpl::InitializeCompilationProgress(bool lazy_module,
DCHECK_IMPLIES(lazy_module, outstanding_top_tier_functions_ == 0);
DCHECK_LE(0, outstanding_baseline_units_);
DCHECK_LE(outstanding_baseline_units_, outstanding_top_tier_functions_);
- outstanding_baseline_units_ += num_wrappers;
+ outstanding_baseline_units_ += num_import_wrappers;
+ outstanding_export_wrappers_ = num_export_wrappers;
// Trigger callbacks if module needs no baseline or top tier compilation. This
// can be the case for an empty or fully lazy module.
@@ -2693,8 +2918,26 @@ void CompilationStateImpl::InitializeRecompilation(
CompilationState::callback_t recompilation_finished_callback) {
DCHECK(!failed());
- // Generate necessary compilation units on the fly.
- CompilationUnitBuilder builder(native_module_);
+ // Hold the mutex as long as possible, to synchronize between multiple
+ // recompilations that are triggered at the same time (e.g. when the profiler
+ // is disabled).
+ base::Optional<base::MutexGuard> guard(&callbacks_mutex_);
+
+ // For now, we cannot contribute to compilation here, because this would bump
+ // the number of workers above the expected maximum concurrency. This can be
+ // fixed once we grow the number of compilation unit queues dynamically.
+ // TODO(clemensb): Contribute to compilation once the queues grow dynamically.
+ while (outstanding_recompilation_functions_ > 0) {
+ auto semaphore = std::make_shared<base::Semaphore>(0);
+ callbacks_.emplace_back([semaphore](CompilationEvent event) {
+ if (event == CompilationEvent::kFinishedRecompilation) {
+ semaphore->Signal();
+ }
+ });
+ guard.reset();
+ semaphore->Wait();
+ guard.emplace(&callbacks_mutex_);
+ }
// Information about compilation progress is shared between this class and the
// NativeModule. Before updating information here, consult the NativeModule to
@@ -2706,54 +2949,51 @@ void CompilationStateImpl::InitializeRecompilation(
std::vector<int> recompile_function_indexes =
native_module_->FindFunctionsToRecompile(new_tiering_state);
- {
- base::MutexGuard guard(&callbacks_mutex_);
-
- callbacks_.emplace_back(std::move(recompilation_finished_callback));
- tiering_state_ = new_tiering_state;
-
- // If compilation progress is not initialized yet, then compilation didn't
- // start yet, and new code will be kept tiered-down from the start. For
- // streaming compilation, there is a special path to tier down later, when
- // the module is complete. In any case, we don't need to recompile here.
- if (compilation_progress_.size() > 0) {
- const WasmModule* module = native_module_->module();
- DCHECK_EQ(module->num_declared_functions, compilation_progress_.size());
- DCHECK_GE(module->num_declared_functions,
- recompile_function_indexes.size());
- outstanding_recompilation_functions_ =
- static_cast<int>(recompile_function_indexes.size());
- // Restart recompilation if another recompilation is already happening.
- for (auto& progress : compilation_progress_) {
- progress = MissingRecompilationField::update(progress, false);
- }
- auto new_tier = new_tiering_state == kTieredDown
- ? ExecutionTier::kLiftoff
- : ExecutionTier::kTurbofan;
- int imported = module->num_imported_functions;
- for (int function_index : recompile_function_indexes) {
- DCHECK_LE(imported, function_index);
- int slot_index = function_index - imported;
- auto& progress = compilation_progress_[slot_index];
- progress = MissingRecompilationField::update(progress, true);
- builder.AddRecompilationUnit(function_index, new_tier);
- }
- }
-
- // Trigger callback if module needs no recompilation.
- if (outstanding_recompilation_functions_ == 0) {
- TriggerCallbacks(base::EnumSet<CompilationEvent>(
- {CompilationEvent::kFinishedRecompilation}));
- }
+ callbacks_.emplace_back(std::move(recompilation_finished_callback));
+ tiering_state_ = new_tiering_state;
+
+ // If compilation progress is not initialized yet, then compilation didn't
+ // start yet, and new code will be kept tiered-down from the start. For
+ // streaming compilation, there is a special path to tier down later, when
+ // the module is complete. In any case, we don't need to recompile here.
+ if (compilation_progress_.size() > 0) {
+ const WasmModule* module = native_module_->module();
+ DCHECK_EQ(module->num_declared_functions, compilation_progress_.size());
+ DCHECK_GE(module->num_declared_functions,
+ recompile_function_indexes.size());
+ outstanding_recompilation_functions_ =
+ static_cast<int>(recompile_function_indexes.size());
+ // Restart recompilation if another recompilation is already happening.
+ for (auto& progress : compilation_progress_) {
+ progress = MissingRecompilationField::update(progress, false);
+ }
+ auto new_tier = new_tiering_state == kTieredDown ? ExecutionTier::kLiftoff
+ : ExecutionTier::kTurbofan;
+ int imported = module->num_imported_functions;
+ // Generate necessary compilation units on the fly.
+ CompilationUnitBuilder builder(native_module_);
+ for (int function_index : recompile_function_indexes) {
+ DCHECK_LE(imported, function_index);
+ int slot_index = function_index - imported;
+ auto& progress = compilation_progress_[slot_index];
+ progress = MissingRecompilationField::update(progress, true);
+ builder.AddRecompilationUnit(function_index, new_tier);
+ }
+ builder.Commit();
+ }
+
+ // Trigger callback if module needs no recompilation.
+ if (outstanding_recompilation_functions_ == 0) {
+ TriggerCallbacks(base::EnumSet<CompilationEvent>(
+ {CompilationEvent::kFinishedRecompilation}));
}
-
- builder.Commit();
}
void CompilationStateImpl::AddCallback(CompilationState::callback_t callback) {
base::MutexGuard callbacks_guard(&callbacks_mutex_);
// Immediately trigger events that already happened.
- for (auto event : {CompilationEvent::kFinishedBaselineCompilation,
+ for (auto event : {CompilationEvent::kFinishedExportWrappers,
+ CompilationEvent::kFinishedBaselineCompilation,
CompilationEvent::kFinishedTopTierCompilation,
CompilationEvent::kFailedCompilation}) {
if (finished_events_.contains(event)) {
@@ -2790,6 +3030,12 @@ void CompilationStateImpl::AddTopTierCompilationUnit(WasmCompilationUnit unit) {
AddCompilationUnits({}, {&unit, 1}, {});
}
+void CompilationStateImpl::AddTopTierPriorityCompilationUnit(
+ WasmCompilationUnit unit, size_t priority) {
+ compilation_unit_queues_.AddTopTierPriorityUnit(unit, priority);
+ ScheduleCompileJobForNewUnits(1);
+}
+
std::shared_ptr<JSToWasmWrapperCompilationUnit>
CompilationStateImpl::GetNextJSToWasmWrapperCompilationUnit() {
int wrapper_id =
@@ -2836,7 +3082,7 @@ void CompilationStateImpl::OnFinishedUnits(Vector<WasmCode*> code_vector) {
// In case of no outstanding compilation units we can return early.
// This is especially important for lazy modules that were deserialized.
// Compilation progress was not set up in these cases.
- if (outstanding_baseline_units_ == 0 &&
+ if (outstanding_baseline_units_ == 0 && outstanding_export_wrappers_ == 0 &&
outstanding_top_tier_functions_ == 0 &&
outstanding_recompilation_functions_ == 0) {
return;
@@ -2925,8 +3171,8 @@ void CompilationStateImpl::OnFinishedUnits(Vector<WasmCode*> code_vector) {
void CompilationStateImpl::OnFinishedJSToWasmWrapperUnits(int num) {
if (num == 0) return;
base::MutexGuard guard(&callbacks_mutex_);
- DCHECK_GE(outstanding_baseline_units_, num);
- outstanding_baseline_units_ -= num;
+ DCHECK_GE(outstanding_export_wrappers_, num);
+ outstanding_export_wrappers_ -= num;
TriggerCallbacks();
}
@@ -2934,10 +3180,13 @@ void CompilationStateImpl::TriggerCallbacks(
base::EnumSet<CompilationEvent> triggered_events) {
DCHECK(!callbacks_mutex_.TryLock());
- if (outstanding_baseline_units_ == 0) {
- triggered_events.Add(CompilationEvent::kFinishedBaselineCompilation);
- if (outstanding_top_tier_functions_ == 0) {
- triggered_events.Add(CompilationEvent::kFinishedTopTierCompilation);
+ if (outstanding_export_wrappers_ == 0) {
+ triggered_events.Add(CompilationEvent::kFinishedExportWrappers);
+ if (outstanding_baseline_units_ == 0) {
+ triggered_events.Add(CompilationEvent::kFinishedBaselineCompilation);
+ if (outstanding_top_tier_functions_ == 0) {
+ triggered_events.Add(CompilationEvent::kFinishedTopTierCompilation);
+ }
}
}
@@ -2958,6 +3207,8 @@ void CompilationStateImpl::TriggerCallbacks(
for (auto event :
{std::make_pair(CompilationEvent::kFailedCompilation,
"wasm.CompilationFailed"),
+ std::make_pair(CompilationEvent::kFinishedExportWrappers,
+ "wasm.ExportWrappersFinished"),
std::make_pair(CompilationEvent::kFinishedBaselineCompilation,
"wasm.BaselineFinished"),
std::make_pair(CompilationEvent::kFinishedTopTierCompilation,
@@ -2971,7 +3222,7 @@ void CompilationStateImpl::TriggerCallbacks(
}
}
- if (outstanding_baseline_units_ == 0 &&
+ if (outstanding_baseline_units_ == 0 && outstanding_export_wrappers_ == 0 &&
outstanding_top_tier_functions_ == 0 &&
outstanding_recompilation_functions_ == 0) {
// Clear the callbacks because no more events will be delivered.
@@ -2979,26 +3230,25 @@ void CompilationStateImpl::TriggerCallbacks(
}
}
-int CompilationStateImpl::GetFreeCompileTaskId() {
- base::MutexGuard guard(&mutex_);
- if (V8_UNLIKELY(available_task_ids_.empty())) {
- FATAL(
- "The platform is running the compile job with more concurrency than "
- "returned by {GetMaxConcurrency()}.");
- }
- int id = available_task_ids_.back();
- available_task_ids_.pop_back();
- return id;
+int CompilationStateImpl::GetUnpublishedUnitsLimits(int task_id) {
+ // We want background threads to publish regularly (to avoid contention when
+ // they are all publishing at the end). On the other side, each publishing has
+ // some overhead (part of it for synchronizing between threads), so it should
+ // not happen *too* often.
+ // Thus aim for 4-8 publishes per thread, but distribute it such that
+ // publishing is likely to happen at different times.
+ int units_per_thread =
+ static_cast<int>(native_module_->module()->num_declared_functions /
+ max_compile_concurrency_);
+ int min = units_per_thread / 8;
+ // Return something between {min} and {2*min}, but not smaller than {10}.
+ return std::max(10, min + (min * task_id / max_compile_concurrency_));
}
void CompilationStateImpl::OnCompilationStopped(int task_id,
const WasmFeatures& detected) {
DCHECK_GE(max_compile_concurrency_, task_id);
base::MutexGuard guard(&mutex_);
- DCHECK_EQ(0, std::count(available_task_ids_.begin(),
- available_task_ids_.end(), task_id));
- available_task_ids_.push_back(task_id);
- DCHECK_GE(max_compile_concurrency_ + 1, available_task_ids_.size());
detected_features_.Add(detected);
}
@@ -3011,16 +3261,13 @@ void CompilationStateImpl::PublishDetectedFeatures(Isolate* isolate) {
}
void CompilationStateImpl::ScheduleCompileJobForNewUnits(int new_units) {
- // Increase the {current_compile_concurrency_} counter and remember the old
+ // Increase the {scheduled_units_approximation_} counter and remember the old
// value to check whether it increased towards {max_compile_concurrency_}.
// In that case, we need to notify the compile job about the increased
// concurrency.
DCHECK_LT(0, new_units);
- int old_units = current_compile_concurrency_->load();
- while (!current_compile_concurrency_->compare_exchange_weak(
- old_units, old_units + new_units)) {
- // Retry with updated {old_units}.
- }
+ int old_units = scheduled_units_approximation_->fetch_add(
+ new_units, std::memory_order_relaxed);
bool concurrency_increased = old_units < max_compile_concurrency_;
base::MutexGuard guard(&mutex_);
@@ -3035,13 +3282,18 @@ void CompilationStateImpl::ScheduleCompileJobForNewUnits(int new_units) {
std::unique_ptr<JobTask> new_compile_job =
std::make_unique<BackgroundCompileJob>(
background_compile_token_, async_counters_,
- current_compile_concurrency_, max_compile_concurrency_);
+ scheduled_units_approximation_, max_compile_concurrency_);
// TODO(wasm): Lower priority for TurboFan-only jobs.
std::shared_ptr<JobHandle> handle = V8::GetCurrentPlatform()->PostJob(
- TaskPriority::kUserVisible, std::move(new_compile_job));
+ has_priority_ ? TaskPriority::kUserBlocking : TaskPriority::kUserVisible,
+ std::move(new_compile_job));
native_module_->engine()->ShepherdCompileJobHandle(handle);
current_compile_job_ =
std::make_unique<ThreadSafeJobHandle>(std::move(handle));
+
+ // Reset the priority. Later uses of the compilation state, e.g. for
+ // debugging, should compile with the default priority again.
+ has_priority_ = false;
}
size_t CompilationStateImpl::NumOutstandingCompilations() const {
@@ -3055,9 +3307,7 @@ size_t CompilationStateImpl::NumOutstandingCompilations() const {
}
void CompilationStateImpl::SetError() {
- bool expected = false;
- if (!compile_failed_.compare_exchange_strong(expected, true,
- std::memory_order_relaxed)) {
+ if (compile_failed_.exchange(true, std::memory_order_relaxed)) {
return; // Already failed before.
}
@@ -3065,23 +3315,24 @@ void CompilationStateImpl::SetError() {
TriggerCallbacks();
}
-void CompilationStateImpl::WaitForBaselineFinished() {
- auto baseline_finished_semaphore = std::make_shared<base::Semaphore>(0);
- AddCallback([baseline_finished_semaphore](CompilationEvent event) {
- if (event == CompilationEvent::kFinishedBaselineCompilation ||
- event == CompilationEvent::kFailedCompilation) {
- baseline_finished_semaphore->Signal();
- }
- });
+void CompilationStateImpl::WaitForCompilationEvent(
+ CompilationEvent expect_event) {
+ auto compilation_event_semaphore = std::make_shared<base::Semaphore>(0);
+ base::EnumSet<CompilationEvent> events{expect_event,
+ CompilationEvent::kFailedCompilation};
+ {
+ base::MutexGuard callbacks_guard(&callbacks_mutex_);
+ if (finished_events_.contains_any(events)) return;
+ callbacks_.emplace_back(
+ [compilation_event_semaphore, events](CompilationEvent event) {
+ if (events.contains(event)) compilation_event_semaphore->Signal();
+ });
+ }
- // Execute baseline compilation units, as long as there are any available.
constexpr JobDelegate* kNoDelegate = nullptr;
ExecuteCompilationUnits(background_compile_token_, async_counters_.get(),
kNoDelegate, kBaselineOnly);
-
- // Now wait until baseline compilation finished (other threads might still be
- // running baseline units).
- baseline_finished_semaphore->Wait();
+ compilation_event_semaphore->Wait();
}
namespace {
@@ -3111,7 +3362,10 @@ class CompileJSToWasmWrapperJob final : public JobTask {
}
}
- size_t GetMaxConcurrency() const override {
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
+ // {outstanding_units_} includes the units that other workers are currently
+ // working on, so we can safely ignore the {worker_count} and just return
+ // the current number of outstanding units.
return std::min(max_concurrency_,
outstanding_units_.load(std::memory_order_relaxed));
}
@@ -3140,8 +3394,8 @@ void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,
JSToWasmWrapperKey key(function.imported, *function.sig);
if (queue.insert(key)) {
auto unit = std::make_unique<JSToWasmWrapperCompilationUnit>(
- isolate, isolate->wasm_engine(), function.sig, function.imported,
- enabled_features);
+ isolate, isolate->wasm_engine(), function.sig, module,
+ function.imported, enabled_features);
compilation_units.emplace(key, std::move(unit));
}
}
diff --git a/deps/v8/src/wasm/module-compiler.h b/deps/v8/src/wasm/module-compiler.h
index 6f1032c32c..6206d11986 100644
--- a/deps/v8/src/wasm/module-compiler.h
+++ b/deps/v8/src/wasm/module-compiler.h
@@ -9,9 +9,9 @@
#include <functional>
#include <memory>
-#include "include/v8-metrics.h"
#include "src/base/optional.h"
#include "src/common/globals.h"
+#include "src/logging/metrics.h"
#include "src/tasks/cancelable-task.h"
#include "src/wasm/compilation-environment.h"
#include "src/wasm/wasm-features.h"
@@ -114,7 +114,8 @@ class AsyncCompileJob {
public:
AsyncCompileJob(Isolate* isolate, const WasmFeatures& enabled_features,
std::unique_ptr<byte[]> bytes_copy, size_t length,
- Handle<Context> context, const char* api_method_name,
+ Handle<Context> context, Handle<Context> incumbent_context,
+ const char* api_method_name,
std::shared_ptr<CompilationResultResolver> resolver);
~AsyncCompileJob();
@@ -212,7 +213,9 @@ class AsyncCompileJob {
// {native_module_}).
ModuleWireBytes wire_bytes_;
Handle<NativeContext> native_context_;
+ Handle<Context> incumbent_context_;
v8::metrics::Recorder::ContextId context_id_;
+ v8::metrics::WasmModuleDecoded metrics_event_;
const std::shared_ptr<CompilationResultResolver> resolver_;
Handle<WasmModuleObject> module_object_;
diff --git a/deps/v8/src/wasm/module-decoder.cc b/deps/v8/src/wasm/module-decoder.cc
index b62c6981c4..dea4e1cb69 100644
--- a/deps/v8/src/wasm/module-decoder.cc
+++ b/deps/v8/src/wasm/module-decoder.cc
@@ -266,27 +266,6 @@ class WasmSectionIterator {
}
};
-class AutoSubmitMetrics : public v8::metrics::WasmModuleDecoded {
- public:
- AutoSubmitMetrics(std::shared_ptr<metrics::Recorder> recorder,
- v8::metrics::Recorder::ContextId context_id)
- : recorder_(std::move(recorder)),
- context_id_(context_id),
- timed_scope_(this,
- &v8::metrics::WasmModuleDecoded::wall_clock_time_in_us) {}
-
- ~AutoSubmitMetrics() {
- timed_scope_.Stop();
- recorder_->DelayMainThreadEvent<v8::metrics::WasmModuleDecoded>(
- *this, context_id_);
- }
-
- private:
- std::shared_ptr<metrics::Recorder> recorder_;
- v8::metrics::Recorder::ContextId context_id_;
- metrics::TimedScope<v8::metrics::WasmModuleDecoded> timed_scope_;
-};
-
} // namespace
// The main logic for decoding the bytes of a module.
@@ -295,19 +274,19 @@ class ModuleDecoderImpl : public Decoder {
explicit ModuleDecoderImpl(const WasmFeatures& enabled, ModuleOrigin origin)
: Decoder(nullptr, nullptr),
enabled_features_(enabled),
- origin_(FLAG_assume_asmjs_origin ? kAsmJsSloppyOrigin : origin) {}
+ origin_(origin) {}
ModuleDecoderImpl(const WasmFeatures& enabled, const byte* module_start,
const byte* module_end, ModuleOrigin origin)
: Decoder(module_start, module_end),
enabled_features_(enabled),
- origin_(FLAG_assume_asmjs_origin ? kAsmJsSloppyOrigin : origin) {
+ module_start_(module_start),
+ module_end_(module_end),
+ origin_(origin) {
if (end_ < start_) {
error(start_, "end is less than start");
end_ = start_;
}
- module_start_ = module_start;
- module_end_ = module_end;
}
void onFirstError() override {
@@ -561,7 +540,9 @@ class ModuleDecoderImpl : public Decoder {
}
case kWasmStructTypeCode: {
if (!enabled_features_.has_gc()) {
- errorf(pc(), "struct types are part of the GC proposal");
+ errorf(pc(),
+ "invalid struct type definition, enable with "
+ "--experimental-wasm-gc");
break;
}
const StructType* s = consume_struct(module_->signature_zone.get());
@@ -572,7 +553,9 @@ class ModuleDecoderImpl : public Decoder {
}
case kWasmArrayTypeCode: {
if (!enabled_features_.has_gc()) {
- errorf(pc(), "array types are part of the GC proposal");
+ errorf(pc(),
+ "invalid array type definition, enable with "
+ "--experimental-wasm-gc");
break;
}
const ArrayType* type = consume_array(module_->signature_zone.get());
@@ -632,7 +615,14 @@ class ModuleDecoderImpl : public Decoder {
module_->tables.emplace_back();
WasmTable* table = &module_->tables.back();
table->imported = true;
+ const byte* type_position = pc();
ValueType type = consume_reference_type();
+ if (!WasmTable::IsValidTableType(type, module_.get())) {
+ error(type_position,
+ "Currently, only nullable exnref, externref, and "
+ "function references are allowed as table types");
+ break;
+ }
table->type = type;
uint8_t flags = validate_table_flags("element count");
consume_resizable_limits(
@@ -646,10 +636,10 @@ class ModuleDecoderImpl : public Decoder {
// ===== Imported memory =============================================
if (!AddMemory(module_.get())) break;
uint8_t flags = validate_memory_flags(&module_->has_shared_memory);
- consume_resizable_limits(
- "memory", "pages", max_initial_mem_pages(),
- &module_->initial_pages, &module_->has_maximum_pages,
- max_maximum_mem_pages(), &module_->maximum_pages, flags);
+ consume_resizable_limits("memory", "pages", max_mem_pages(),
+ &module_->initial_pages,
+ &module_->has_maximum_pages, max_mem_pages(),
+ &module_->maximum_pages, flags);
break;
}
case kExternalGlobal: {
@@ -724,12 +714,14 @@ class ModuleDecoderImpl : public Decoder {
module_->tables.emplace_back();
WasmTable* table = &module_->tables.back();
const byte* type_position = pc();
- table->type = consume_reference_type();
- if (!table->type.is_nullable()) {
- // TODO(7748): Implement other table types.
+ ValueType table_type = consume_reference_type();
+ if (!WasmTable::IsValidTableType(table_type, module_.get())) {
error(type_position,
- "Currently, only nullable references are allowed as table types");
+ "Currently, only nullable exnref, externref, and "
+ "function references are allowed as table types");
+ continue;
}
+ table->type = table_type;
uint8_t flags = validate_table_flags("table elements");
consume_resizable_limits(
"table elements", "elements", std::numeric_limits<uint32_t>::max(),
@@ -744,10 +736,10 @@ class ModuleDecoderImpl : public Decoder {
for (uint32_t i = 0; ok() && i < memory_count; i++) {
if (!AddMemory(module_.get())) break;
uint8_t flags = validate_memory_flags(&module_->has_shared_memory);
- consume_resizable_limits(
- "memory", "pages", max_initial_mem_pages(), &module_->initial_pages,
- &module_->has_maximum_pages, max_maximum_mem_pages(),
- &module_->maximum_pages, flags);
+ consume_resizable_limits("memory", "pages", max_mem_pages(),
+ &module_->initial_pages,
+ &module_->has_maximum_pages, max_mem_pages(),
+ &module_->maximum_pages, flags);
}
}
@@ -761,7 +753,10 @@ class ModuleDecoderImpl : public Decoder {
module_->globals.push_back(
{kWasmStmt, false, WasmInitExpr(), {0}, false, false});
WasmGlobal* global = &module_->globals.back();
- DecodeGlobalInModule(module_.get(), i + imported_globals, global);
+ global->type = consume_value_type();
+ global->mutability = consume_mutability();
+ global->init =
+ consume_init_expr(module_.get(), global->type, imported_globals + i);
}
if (ok()) CalculateGlobalOffsets(module_.get());
}
@@ -1212,13 +1207,6 @@ class ModuleDecoderImpl : public Decoder {
CalculateGlobalOffsets(module_.get());
}
- if (metrics_) {
- metrics_->success = ok() && !intermediate_error_.has_error();
- metrics_->module_size_in_bytes = end() - start();
- metrics_->function_count = module_->num_declared_functions;
- metrics_.reset();
- }
-
ModuleResult result = toResult(std::move(module_));
if (verify_functions && result.ok() && intermediate_error_.has_error()) {
// Copy error message and location.
@@ -1262,13 +1250,6 @@ class ModuleDecoderImpl : public Decoder {
if (FLAG_dump_wasm_module) DumpModule(orig_bytes);
if (decoder.failed()) {
- if (metrics_) {
- metrics_->success = false;
- metrics_->module_size_in_bytes = orig_bytes.length();
- metrics_->function_count = module_->num_declared_functions;
- metrics_.reset();
- }
-
return decoder.toResult<std::unique_ptr<WasmModule>>(nullptr);
}
@@ -1305,9 +1286,8 @@ class ModuleDecoderImpl : public Decoder {
return ok() ? result : nullptr;
}
- WasmInitExpr DecodeInitExpr(const byte* start) {
- pc_ = start;
- return consume_init_expr(nullptr, kWasmStmt);
+ WasmInitExpr DecodeInitExprForTesting() {
+ return consume_init_expr(nullptr, kWasmStmt, 0);
}
const std::shared_ptr<WasmModule>& shared_module() const { return module_; }
@@ -1322,37 +1302,11 @@ class ModuleDecoderImpl : public Decoder {
counters_ = counters;
}
- void EnableMetricsRecording(
- std::shared_ptr<metrics::Recorder> metrics_recorder,
- v8::metrics::Recorder::ContextId context_id,
- DecodingMethod decoding_method) {
- metrics_ = std::make_unique<AutoSubmitMetrics>(std::move(metrics_recorder),
- context_id);
- switch (decoding_method) {
- case DecodingMethod::kSync:
- break;
- case DecodingMethod::kAsync:
- metrics_->async = true;
- break;
- case DecodingMethod::kSyncStream:
- metrics_->streamed = true;
- break;
- case DecodingMethod::kAsyncStream:
- metrics_->async = true;
- metrics_->streamed = true;
- break;
- case DecodingMethod::kDeserialize:
- // TODO(ecmziegler): verify if we need to add a deserialized metric flag
- // in the next UKM update.
- break;
- }
- }
-
private:
const WasmFeatures enabled_features_;
std::shared_ptr<WasmModule> module_;
- const byte* module_start_;
- const byte* module_end_;
+ const byte* module_start_ = nullptr;
+ const byte* module_end_ = nullptr;
Counters* counters_ = nullptr;
// The type section is the first section in a module.
uint8_t next_ordered_section_ = kFirstSectionInModule;
@@ -1373,7 +1327,6 @@ class ModuleDecoderImpl : public Decoder {
// reporting once the whole type section is parsed.
std::unordered_map<uint32_t, int> deferred_check_type_index_;
ModuleOrigin origin_;
- std::unique_ptr<AutoSubmitMetrics> metrics_;
ValueType TypeOf(const WasmInitExpr& expr) {
switch (expr.kind()) {
@@ -1450,30 +1403,6 @@ class ModuleDecoderImpl : public Decoder {
}
}
- // Decodes a single global entry inside a module starting at {pc_}.
- void DecodeGlobalInModule(WasmModule* module, uint32_t index,
- WasmGlobal* global) {
- global->type = consume_value_type();
- global->mutability = consume_mutability();
- const byte* pos = pc();
- global->init = consume_init_expr(module, global->type);
- if (global->init.kind() == WasmInitExpr::kGlobalGet) {
- uint32_t other_index = global->init.immediate().index;
- if (other_index >= index) {
- errorf(pos,
- "invalid global index in init expression, "
- "index %u, other_index %u",
- index, other_index);
- } else if (module->globals[other_index].type != global->type) {
- errorf(pos,
- "type mismatch in global initialization "
- "(from global #%u), expected %s, got %s",
- other_index, global->type.name().c_str(),
- module->globals[other_index].type.name().c_str());
- }
- }
- }
-
// Calculate individual global offsets and total size of globals table.
void CalculateGlobalOffsets(WasmModule* module) {
uint32_t untagged_offset = 0;
@@ -1594,33 +1523,44 @@ class ModuleDecoderImpl : public Decoder {
}
uint8_t validate_table_flags(const char* name) {
- uint8_t flags = consume_u8("resizable limits flags");
- const byte* pos = pc();
- if (flags & 0xFE) {
- errorf(pos - 1, "invalid %s limits flags", name);
+ uint8_t flags = consume_u8("table limits flags");
+ STATIC_ASSERT(kNoMaximum < kWithMaximum);
+ if (V8_UNLIKELY(flags > kWithMaximum)) {
+ errorf(pc() - 1, "invalid %s limits flags", name);
}
return flags;
}
uint8_t validate_memory_flags(bool* has_shared_memory) {
- uint8_t flags = consume_u8("resizable limits flags");
- const byte* pos = pc();
+ uint8_t flags = consume_u8("memory limits flags");
*has_shared_memory = false;
- if (enabled_features_.has_threads()) {
- if (flags & 0xFC) {
- errorf(pos - 1, "invalid memory limits flags");
- } else if (flags == 3) {
- DCHECK_NOT_NULL(has_shared_memory);
+ switch (flags) {
+ case kNoMaximum:
+ case kWithMaximum:
+ break;
+ case kSharedNoMaximum:
+ case kSharedWithMaximum:
+ if (!enabled_features_.has_threads()) {
+ errorf(pc() - 1,
+ "invalid memory limits flags (enable via "
+ "--experimental-wasm-threads)");
+ }
*has_shared_memory = true;
- } else if (flags == 2) {
- errorf(pos - 1,
- "memory limits flags should have maximum defined if shared is "
- "true");
- }
- } else {
- if (flags & 0xFE) {
- errorf(pos - 1, "invalid memory limits flags");
- }
+ // V8 does not support shared memory without a maximum.
+ if (flags == kSharedNoMaximum) {
+ errorf(pc() - 1,
+ "memory limits flags must have maximum defined if shared is "
+ "true");
+ }
+ break;
+ case kMemory64NoMaximum:
+ case kMemory64WithMaximum:
+ if (!enabled_features_.has_memory64()) {
+ errorf(pc() - 1,
+ "invalid memory limits flags (enable via "
+ "--experimental-wasm-memory64)");
+ }
+ break;
}
return flags;
}
@@ -1630,27 +1570,36 @@ class ModuleDecoderImpl : public Decoder {
bool* has_max, uint32_t max_maximum,
uint32_t* maximum, uint8_t flags) {
const byte* pos = pc();
- *initial = consume_u32v("initial size");
- *has_max = false;
- if (*initial > max_initial) {
+ // For memory64 we need to read the numbers as LEB-encoded 64-bit unsigned
+ // integer. All V8 limits are still within uint32_t range though.
+ const bool is_memory64 =
+ flags == kMemory64NoMaximum || flags == kMemory64WithMaximum;
+ uint64_t initial_64 = is_memory64 ? consume_u64v("initial size")
+ : consume_u32v("initial size");
+ if (initial_64 > max_initial) {
errorf(pos,
- "initial %s size (%u %s) is larger than implementation limit (%u)",
- name, *initial, units, max_initial);
+ "initial %s size (%" PRIu64
+ " %s) is larger than implementation limit (%u)",
+ name, initial_64, units, max_initial);
}
+ *initial = static_cast<uint32_t>(initial_64);
if (flags & 1) {
*has_max = true;
pos = pc();
- *maximum = consume_u32v("maximum size");
- if (*maximum > max_maximum) {
- errorf(
- pos,
- "maximum %s size (%u %s) is larger than implementation limit (%u)",
- name, *maximum, units, max_maximum);
+ uint64_t maximum_64 = is_memory64 ? consume_u64v("maximum size")
+ : consume_u32v("maximum size");
+ if (maximum_64 > max_maximum) {
+ errorf(pos,
+ "maximum %s size (%" PRIu64
+ " %s) is larger than implementation limit (%u)",
+ name, maximum_64, units, max_maximum);
}
- if (*maximum < *initial) {
- errorf(pos, "maximum %s size (%u %s) is less than initial (%u %s)",
- name, *maximum, units, *initial, units);
+ if (maximum_64 < *initial) {
+ errorf(pos,
+ "maximum %s size (%" PRIu64 " %s) is less than initial (%u %s)",
+ name, maximum_64, units, *initial, units);
}
+ *maximum = static_cast<uint32_t>(maximum_64);
} else {
*has_max = false;
*maximum = max_initial;
@@ -1682,7 +1631,8 @@ class ModuleDecoderImpl : public Decoder {
return true;
}
- WasmInitExpr consume_init_expr(WasmModule* module, ValueType expected) {
+ WasmInitExpr consume_init_expr(WasmModule* module, ValueType expected,
+ size_t current_global_index) {
constexpr Decoder::ValidateFlag validate = Decoder::kValidate;
WasmOpcode opcode = kExprNop;
std::vector<WasmInitExpr> stack;
@@ -1693,14 +1643,26 @@ class ModuleDecoderImpl : public Decoder {
case kExprGlobalGet: {
GlobalIndexImmediate<validate> imm(this, pc() + 1);
len = 1 + imm.length;
- if (V8_UNLIKELY(module->globals.size() <= imm.index)) {
+ // We use 'capacity' over 'size' because we might be
+ // mid-DecodeGlobalSection().
+ if (V8_UNLIKELY(imm.index >= module->globals.capacity())) {
error(pc() + 1, "global index is out of bounds");
return {};
}
+ if (V8_UNLIKELY(imm.index >= current_global_index)) {
+ errorf(pc() + 1, "global #%u is not defined yet", imm.index);
+ return {};
+ }
WasmGlobal* global = &module->globals[imm.index];
- if (V8_UNLIKELY(global->mutability || !global->imported)) {
+ if (V8_UNLIKELY(global->mutability)) {
error(pc() + 1,
- "only immutable imported globals can be used in initializer "
+ "mutable globals cannot be used in initializer "
+ "expressions");
+ return {};
+ }
+ if (V8_UNLIKELY(!global->imported && !enabled_features_.has_gc())) {
+ error(pc() + 1,
+ "non-imported globals cannot be used in initializer "
"expressions");
return {};
}
@@ -1890,10 +1852,10 @@ class ModuleDecoderImpl : public Decoder {
ValueType consume_storage_type() {
uint8_t opcode = read_u8<kValidate>(this->pc());
switch (opcode) {
- case kLocalI8:
+ case kI8Code:
consume_bytes(1, "i8");
return kWasmI8;
- case kLocalI16:
+ case kI16Code:
consume_bytes(1, "i16");
return kWasmI16;
default:
@@ -1903,11 +1865,14 @@ class ModuleDecoderImpl : public Decoder {
}
// Reads a reference type for tables and element segment headers.
- // Note that, unless extensions are enabled, only funcref is allowed.
+ // Unless extensions are enabled, only funcref is allowed.
+ // TODO(manoskouk): Replace this with consume_value_type (and checks against
+ // the returned type at callsites as needed) once the
+ // 'reftypes' proposal is standardized.
ValueType consume_reference_type() {
if (!enabled_features_.has_reftypes()) {
uint8_t ref_type = consume_u8("reference type");
- if (ref_type != kLocalFuncRef) {
+ if (ref_type != kFuncRefCode) {
error(pc_ - 1,
"invalid table type. Consider using experimental flags.");
return kWasmBottom;
@@ -1955,8 +1920,7 @@ class ModuleDecoderImpl : public Decoder {
}
const StructType* consume_struct(Zone* zone) {
- // TODO(7748): Introduce a proper maximum.
- uint32_t field_count = consume_count("field count", 999);
+ uint32_t field_count = consume_count("field count", kV8MaxWasmStructFields);
if (failed()) return nullptr;
ValueType* fields = zone->NewArray<ValueType>(field_count);
bool* mutabilities = zone->NewArray<bool>(field_count);
@@ -2076,7 +2040,8 @@ class ModuleDecoderImpl : public Decoder {
}
if (*status == WasmElemSegment::kStatusActive) {
- *offset = consume_init_expr(module_.get(), kWasmI32);
+ *offset = consume_init_expr(module_.get(), kWasmI32,
+ module_.get()->globals.size());
if (offset->kind() == WasmInitExpr::kNone) {
// Failed to parse offset initializer, return early.
return;
@@ -2132,10 +2097,11 @@ class ModuleDecoderImpl : public Decoder {
}
// We know now that the flag is valid. Time to read the rest.
+ size_t num_globals = module_.get()->globals.size();
if (flag == SegmentFlags::kActiveNoIndex) {
*is_active = true;
*index = 0;
- *offset = consume_init_expr(module_.get(), kWasmI32);
+ *offset = consume_init_expr(module_.get(), kWasmI32, num_globals);
return;
}
if (flag == SegmentFlags::kPassive) {
@@ -2145,7 +2111,7 @@ class ModuleDecoderImpl : public Decoder {
if (flag == SegmentFlags::kActiveWithIndex) {
*is_active = true;
*index = consume_u32v("memory index");
- *offset = consume_init_expr(module_.get(), kWasmI32);
+ *offset = consume_init_expr(module_.get(), kWasmI32, num_globals);
}
}
@@ -2205,9 +2171,28 @@ ModuleResult DecodeWasmModule(
// Signatures are stored in zone memory, which have the same lifetime
// as the {module}.
ModuleDecoderImpl decoder(enabled, module_start, module_end, origin);
- decoder.EnableMetricsRecording(std::move(metrics_recorder), context_id,
- decoding_method);
- return decoder.DecodeModule(counters, allocator, verify_functions);
+ v8::metrics::WasmModuleDecoded metrics_event;
+ metrics::TimedScope<v8::metrics::WasmModuleDecoded> metrics_event_scope(
+ &metrics_event, &v8::metrics::WasmModuleDecoded::wall_clock_time_in_us);
+ ModuleResult result =
+ decoder.DecodeModule(counters, allocator, verify_functions);
+
+ // Record event metrics.
+ metrics_event_scope.Stop();
+ metrics_event.success = decoder.ok() && result.ok();
+ metrics_event.async = decoding_method == DecodingMethod::kAsync ||
+ decoding_method == DecodingMethod::kAsyncStream;
+ metrics_event.streamed = decoding_method == DecodingMethod::kSyncStream ||
+ decoding_method == DecodingMethod::kAsyncStream;
+ if (result.ok()) {
+ metrics_event.function_count = result.value()->num_declared_functions;
+ } else if (auto&& module = decoder.shared_module()) {
+ metrics_event.function_count = module->num_declared_functions;
+ }
+ metrics_event.module_size_in_bytes = size;
+ metrics_recorder->DelayMainThreadEvent(metrics_event, context_id);
+
+ return result;
}
ModuleDecoder::ModuleDecoder(const WasmFeatures& enabled)
@@ -2225,8 +2210,6 @@ void ModuleDecoder::StartDecoding(
ModuleOrigin origin) {
DCHECK_NULL(impl_);
impl_.reset(new ModuleDecoderImpl(enabled_features_, origin));
- impl_->EnableMetricsRecording(std::move(metrics_recorder), context_id,
- DecodingMethod::kAsyncStream);
impl_->StartDecoding(counters, allocator);
}
@@ -2282,7 +2265,7 @@ WasmInitExpr DecodeWasmInitExprForTesting(const WasmFeatures& enabled,
const byte* start, const byte* end) {
AccountingAllocator allocator;
ModuleDecoderImpl decoder(enabled, start, end, kWasmOrigin);
- return decoder.DecodeInitExpr(start);
+ return decoder.DecodeInitExprForTesting();
}
FunctionResult DecodeWasmFunctionForTesting(
diff --git a/deps/v8/src/wasm/module-instantiate.cc b/deps/v8/src/wasm/module-instantiate.cc
index ed37c66cbf..d31bafb294 100644
--- a/deps/v8/src/wasm/module-instantiate.cc
+++ b/deps/v8/src/wasm/module-instantiate.cc
@@ -4,6 +4,7 @@
#include "src/wasm/module-instantiate.h"
+#include "src/api/api.h"
#include "src/asmjs/asm-js.h"
#include "src/logging/counters.h"
#include "src/logging/metrics.h"
@@ -560,8 +561,8 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
for (int i = module_->num_imported_tables; i < table_count; i++) {
const WasmTable& table = module_->tables[i];
Handle<WasmTableObject> table_obj = WasmTableObject::New(
- isolate_, table.type, table.initial_size, table.has_maximum_size,
- table.maximum_size, nullptr);
+ isolate_, instance, table.type, table.initial_size,
+ table.has_maximum_size, table.maximum_size, nullptr);
tables->set(i, *table_obj);
}
instance->set_tables(*tables);
@@ -575,7 +576,7 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
// iteration below.
for (int i = 1; i < table_count; ++i) {
const WasmTable& table = module_->tables[i];
- if (table.type.is_reference_to(HeapType::kFunc)) {
+ if (IsSubtypeOf(table.type, kWasmFuncRef, module_)) {
Handle<WasmIndirectFunctionTable> table_obj =
WasmIndirectFunctionTable::New(isolate_, table.initial_size);
tables->set(i, *table_obj);
@@ -716,12 +717,28 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
auto& function = module_->functions[start_index];
Handle<Code> wrapper_code =
JSToWasmWrapperCompilationUnit::CompileJSToWasmWrapper(
- isolate_, function.sig, function.imported);
+ isolate_, function.sig, module_, function.imported);
// TODO(clemensb): Don't generate an exported function for the start
// function. Use CWasmEntry instead.
start_function_ = WasmExportedFunction::New(
isolate_, instance, start_index,
static_cast<int>(function.sig->parameter_count()), wrapper_code);
+
+ if (function.imported) {
+ ImportedFunctionEntry entry(instance, module_->start_function_index);
+ Object callable = entry.maybe_callable();
+ if (callable.IsJSFunction()) {
+ // If the start function was imported and calls into Blink, we have
+ // to pretend that the V8 API was used to enter its correct context.
+ // To get that context to {ExecuteStartFunction} below, we install it
+ // as the context of the wrapper we just compiled. That's a bit of a
+ // hack because it's not really the wrapper's context, only its wrapped
+ // target's context, but the end result is the same, and since the
+ // start function wrapper doesn't leak, neither does this
+ // implementation detail.
+ start_function_->set_context(JSFunction::cast(callable).context());
+ }
+ }
}
DCHECK(!isolate_->has_pending_exception());
@@ -740,10 +757,18 @@ bool InstanceBuilder::ExecuteStartFunction() {
if (start_function_.is_null()) return true; // No start function.
HandleScope scope(isolate_);
+ // In case the start function calls out to Blink, we have to make sure that
+ // the correct "entered context" is available. This is the equivalent of
+ // v8::Context::Enter() and must happen in addition to the function call
+ // sequence doing the compiled version of "isolate->set_context(...)".
+ HandleScopeImplementer* hsi = isolate_->handle_scope_implementer();
+ hsi->EnterContext(start_function_->context());
+
// Call the JS function.
Handle<Object> undefined = isolate_->factory()->undefined_value();
MaybeHandle<Object> retval =
Execution::Call(isolate_, start_function_, undefined, 0, nullptr);
+ hsi->LeaveContext();
if (retval.is_null()) {
DCHECK(isolate_->has_pending_exception());
@@ -1007,8 +1032,8 @@ bool InstanceBuilder::ProcessImportedFunction(
}
auto js_receiver = Handle<JSReceiver>::cast(value);
const FunctionSig* expected_sig = module_->functions[func_index].sig;
- auto resolved =
- compiler::ResolveWasmImportCall(js_receiver, expected_sig, enabled_);
+ auto resolved = compiler::ResolveWasmImportCall(js_receiver, expected_sig,
+ module_, enabled_);
compiler::WasmImportCallKind kind = resolved.first;
js_receiver = resolved.second;
switch (kind) {
@@ -1091,9 +1116,9 @@ bool InstanceBuilder::InitializeImportedIndirectFunctionTable(
MaybeHandle<WasmInstanceObject> maybe_target_instance;
int function_index;
MaybeHandle<WasmJSFunction> maybe_js_function;
- WasmTableObject::GetFunctionTableEntry(isolate_, table_object, i, &is_valid,
- &is_null, &maybe_target_instance,
- &function_index, &maybe_js_function);
+ WasmTableObject::GetFunctionTableEntry(
+ isolate_, module_, table_object, i, &is_valid, &is_null,
+ &maybe_target_instance, &function_index, &maybe_js_function);
if (!is_valid) {
thrower_->LinkError("table import %d[%d] is not a wasm function",
import_index, i);
@@ -1167,13 +1192,19 @@ bool InstanceBuilder::ProcessImportedTable(Handle<WasmInstanceObject> instance,
}
}
- if (table.type != table_object->type()) {
+ const WasmModule* table_type_module =
+ !table_object->instance().IsUndefined()
+ ? WasmInstanceObject::cast(table_object->instance()).module()
+ : instance->module();
+
+ if (!EquivalentTypes(table.type, table_object->type(), module_,
+ table_type_module)) {
ReportLinkError("imported table does not match the expected type",
import_index, module_name, import_name);
return false;
}
- if (table.type.is_reference_to(HeapType::kFunc) &&
+ if (IsSubtypeOf(table.type, kWasmFuncRef, module_) &&
!InitializeImportedIndirectFunctionTable(instance, table_index,
import_index, table_object)) {
return false;
@@ -1246,10 +1277,17 @@ bool InstanceBuilder::ProcessImportedWasmGlobalObject(
return false;
}
- bool is_sub_type =
- IsSubtypeOf(global_object->type(), global.type, instance->module());
- bool is_same_type = global_object->type() == global.type;
- bool valid_type = global.mutability ? is_same_type : is_sub_type;
+ const WasmModule* global_type_module =
+ !global_object->instance().IsUndefined()
+ ? WasmInstanceObject::cast(global_object->instance()).module()
+ : instance->module();
+
+ bool valid_type =
+ global.mutability
+ ? EquivalentTypes(global_object->type(), global.type,
+ global_type_module, instance->module())
+ : IsSubtypeOf(global_object->type(), global.type, global_type_module,
+ instance->module());
if (!valid_type) {
ReportLinkError("imported global does not match the expected type",
@@ -1309,6 +1347,18 @@ bool InstanceBuilder::ProcessImportedGlobal(Handle<WasmInstanceObject> instance,
module_name, import_name);
return false;
}
+
+ // SIMD proposal allows modules to define an imported v128 global, and only
+ // supports importing a WebAssembly.Global object for this global, but also
+ // defines constructing a WebAssembly.Global of v128 to be a TypeError.
+ // We *should* never hit this case in the JS API, but the module should should
+ // be allowed to declare such a global (no validation error).
+ if (global.type == kWasmS128 && !value->IsWasmGlobalObject()) {
+ ReportLinkError("global import of type v128 must be a WebAssembly.Global",
+ import_index, module_name, import_name);
+ return false;
+ }
+
if (is_asmjs_module(module_)) {
// Accepting {JSFunction} on top of just primitive values here is a
// workaround to support legacy asm.js code with broken binding. Note
@@ -1340,14 +1390,11 @@ bool InstanceBuilder::ProcessImportedGlobal(Handle<WasmInstanceObject> instance,
}
if (global.type.is_reference_type()) {
- if (global.type.is_reference_to(HeapType::kFunc)) {
- if (!value->IsNull(isolate_) &&
- !WasmExportedFunction::IsWasmExportedFunction(*value)) {
- ReportLinkError(
- "imported funcref global must be null or an exported function",
- import_index, module_name, import_name);
- return false;
- }
+ const char* error_message;
+ if (!wasm::TypecheckJSObject(isolate_, module_, value, global.type,
+ &error_message)) {
+ ReportLinkError(error_message, global_index, module_name, import_name);
+ return false;
}
WriteGlobalExternRef(global, value);
return true;
@@ -1363,8 +1410,10 @@ bool InstanceBuilder::ProcessImportedGlobal(Handle<WasmInstanceObject> instance,
return true;
}
- ReportLinkError("global import must be a number or WebAssembly.Global object",
- import_index, module_name, import_name);
+ ReportLinkError(
+ "global import must be a number, valid Wasm reference, or "
+ "WebAssembly.Global object",
+ import_index, module_name, import_name);
return false;
}
@@ -1390,7 +1439,8 @@ void InstanceBuilder::CompileImportWrappers(
auto js_receiver = Handle<JSReceiver>::cast(value);
uint32_t func_index = module_->import_table[index].index;
const FunctionSig* sig = module_->functions[func_index].sig;
- auto resolved = compiler::ResolveWasmImportCall(js_receiver, sig, enabled_);
+ auto resolved =
+ compiler::ResolveWasmImportCall(js_receiver, sig, module_, enabled_);
compiler::WasmImportCallKind kind = resolved.first;
if (kind == compiler::WasmImportCallKind::kWasmToWasm ||
kind == compiler::WasmImportCallKind::kLinkError ||
@@ -1495,7 +1545,7 @@ int InstanceBuilder::ProcessImports(Handle<WasmInstanceObject> instance) {
}
Handle<WasmExceptionObject> imported_exception =
Handle<WasmExceptionObject>::cast(value);
- if (!imported_exception->IsSignatureEqual(
+ if (!imported_exception->MatchesSignature(
module_->exceptions[import.index].sig)) {
ReportLinkError("imported exception does not match the expected type",
index, module_name, import_name);
@@ -1650,10 +1700,9 @@ void InstanceBuilder::InitGlobals(Handle<WasmInstanceObject> instance) {
// Allocate memory for a module instance as a new JSArrayBuffer.
bool InstanceBuilder::AllocateMemory() {
uint32_t initial_pages = module_->initial_pages;
- uint32_t maximum_pages = module_->has_maximum_pages
- ? module_->maximum_pages
- : wasm::max_maximum_mem_pages();
- if (initial_pages > max_initial_mem_pages()) {
+ uint32_t maximum_pages =
+ module_->has_maximum_pages ? module_->maximum_pages : max_mem_pages();
+ if (initial_pages > max_mem_pages()) {
thrower_->RangeError("Out of memory: wasm memory too large");
return false;
}
@@ -1805,8 +1854,9 @@ void InstanceBuilder::ProcessExports(Handle<WasmInstanceObject> instance) {
// Since the global's array untagged_buffer is always provided,
// allocation should never fail.
Handle<WasmGlobalObject> global_obj =
- WasmGlobalObject::New(isolate_, untagged_buffer, tagged_buffer,
- global.type, offset, global.mutability)
+ WasmGlobalObject::New(isolate_, instance, untagged_buffer,
+ tagged_buffer, global.type, offset,
+ global.mutability)
.ToHandleChecked();
desc.set_value(global_obj);
break;
@@ -1854,7 +1904,7 @@ void InstanceBuilder::InitializeIndirectFunctionTables(
for (int i = 0; i < static_cast<int>(module_->tables.size()); ++i) {
const WasmTable& table = module_->tables[i];
- if (table.type.is_reference_to(HeapType::kFunc)) {
+ if (IsSubtypeOf(table.type, kWasmFuncRef, module_)) {
WasmInstanceObject::EnsureIndirectFunctionTableWithMinimumSize(
instance, i, table.initial_size);
}
@@ -1885,7 +1935,7 @@ bool LoadElemSegmentImpl(Isolate* isolate, Handle<WasmInstanceObject> instance,
int entry_index = static_cast<int>(dst + i);
if (func_index == WasmElemSegment::kNullIndex) {
- if (table_object->type().is_reference_to(HeapType::kFunc)) {
+ if (IsSubtypeOf(table_object->type(), kWasmFuncRef, module)) {
IndirectFunctionTableEntry(instance, table_index, entry_index).clear();
}
WasmTableObject::Set(isolate, table_object, entry_index,
@@ -1896,8 +1946,7 @@ bool LoadElemSegmentImpl(Isolate* isolate, Handle<WasmInstanceObject> instance,
const WasmFunction* function = &module->functions[func_index];
// Update the local dispatch table first if necessary.
- // TODO(9495): Make sure tables work with all function types.
- if (table_object->type().is_reference_to(HeapType::kFunc)) {
+ if (IsSubtypeOf(table_object->type(), kWasmFuncRef, module)) {
uint32_t sig_id = module->signature_ids[function->sig_index];
IndirectFunctionTableEntry(instance, table_index, entry_index)
.Set(sig_id, instance, func_index);
@@ -1972,7 +2021,7 @@ void InstanceBuilder::LoadTableSegments(Handle<WasmInstanceObject> instance) {
int table_count = static_cast<int>(module_->tables.size());
for (int index = 0; index < table_count; ++index) {
- if (module_->tables[index].type.is_reference_to(HeapType::kFunc)) {
+ if (IsSubtypeOf(module_->tables[index].type, kWasmFuncRef, module_)) {
auto table_object = handle(
WasmTableObject::cast(instance->tables().get(index)), isolate_);
diff --git a/deps/v8/src/wasm/struct-types.h b/deps/v8/src/wasm/struct-types.h
index e6e174dd7d..33af7de6bd 100644
--- a/deps/v8/src/wasm/struct-types.h
+++ b/deps/v8/src/wasm/struct-types.h
@@ -62,10 +62,11 @@ class StructType : public ZoneObject {
return field_offsets_[index - 1];
}
uint32_t total_fields_size() const {
- return field_offsets_[field_count() - 1];
+ return field_count() == 0 ? 0 : field_offsets_[field_count() - 1];
}
void InitializeOffsets() {
+ if (field_count() == 0) return;
uint32_t offset = field(0).element_size_bytes();
for (uint32_t i = 1; i < field_count(); i++) {
uint32_t field_size = field(i).element_size_bytes();
@@ -102,17 +103,17 @@ class StructType : public ZoneObject {
private:
const uint32_t field_count_;
- Zone* zone_;
+ Zone* const zone_;
uint32_t cursor_;
- ValueType* buffer_;
- bool* mutabilities_;
+ ValueType* const buffer_;
+ bool* const mutabilities_;
};
private:
- uint32_t field_count_;
- uint32_t* field_offsets_;
- const ValueType* reps_;
- const bool* mutabilities_;
+ const uint32_t field_count_;
+ uint32_t* const field_offsets_;
+ const ValueType* const reps_;
+ const bool* const mutabilities_;
};
class ArrayType : public ZoneObject {
diff --git a/deps/v8/src/wasm/value-type.h b/deps/v8/src/wasm/value-type.h
index 963b7b60c2..2e9a2a8d06 100644
--- a/deps/v8/src/wasm/value-type.h
+++ b/deps/v8/src/wasm/value-type.h
@@ -43,6 +43,12 @@ class Simd128;
V(OptRef, kSystemPointerSizeLog2, OptRef, TaggedPointer, 'n', "ref null") \
V(Bottom, -1, Void, None, '*', "<bot>")
+// Represents a WebAssembly heap type, as per the typed-funcref and gc
+// proposals.
+// The underlying Representation enumeration encodes heap types as follows:
+// a number t < kV8MaxWasmTypes represents the type defined in the module at
+// index t. Numbers directly beyond that represent the generic heap types. The
+// next number represents the bottom heap type (internal use).
class HeapType {
public:
enum Representation : uint32_t {
@@ -58,19 +64,19 @@ class HeapType {
// Internal use only; defined in the public section to make it easy to
// check that they are defined correctly:
static constexpr Representation kFirstSentinel = kFunc;
- static constexpr Representation kLastSentinel = kBottom;
+ static constexpr Representation kLastSentinel = kI31;
static constexpr HeapType from_code(uint8_t code) {
switch (code) {
- case ValueTypeCode::kLocalFuncRef:
+ case ValueTypeCode::kFuncRefCode:
return HeapType(kFunc);
- case ValueTypeCode::kLocalExternRef:
+ case ValueTypeCode::kExternRefCode:
return HeapType(kExtern);
- case ValueTypeCode::kLocalEqRef:
+ case ValueTypeCode::kEqRefCode:
return HeapType(kEq);
- case ValueTypeCode::kLocalExnRef:
+ case ValueTypeCode::kExnRefCode:
return HeapType(kExn);
- case ValueTypeCode::kLocalI31Ref:
+ case ValueTypeCode::kI31RefCode:
return HeapType(kI31);
default:
return HeapType(kBottom);
@@ -90,6 +96,14 @@ class HeapType {
return representation_ != other.representation_;
}
+ constexpr bool operator==(Representation other) const {
+ return representation_ == other;
+ }
+
+ constexpr bool operator!=(Representation other) const {
+ return representation_ != other;
+ }
+
constexpr Representation representation() const { return representation_; }
constexpr uint32_t ref_index() const {
CONSTEXPR_DCHECK(is_index());
@@ -121,21 +135,22 @@ class HeapType {
}
}
+ // Returns the code that represents this heap type in the wasm binary format.
constexpr int32_t code() const {
- // kLocal* codes represent the first byte of the LEB128 encoding. To get the
+ // Type codes represent the first byte of the LEB128 encoding. To get the
// int32 represented by a code, we need to sign-extend it from 7 to 32 bits.
int32_t mask = 0xFFFFFF80;
switch (representation_) {
case kFunc:
- return mask | kLocalFuncRef;
+ return mask | kFuncRefCode;
case kExn:
- return mask | kLocalExnRef;
+ return mask | kExnRefCode;
case kExtern:
- return mask | kLocalExternRef;
+ return mask | kExternRefCode;
case kEq:
- return mask | kLocalEqRef;
+ return mask | kEqRefCode;
case kI31:
- return mask | kLocalI31Ref;
+ return mask | kI31RefCode;
default:
return static_cast<int32_t>(representation_);
}
@@ -144,13 +159,17 @@ class HeapType {
private:
friend class ValueType;
Representation representation_;
- constexpr bool is_valid() const {
- return !is_bottom() && representation_ <= kLastSentinel;
- }
+ constexpr bool is_valid() const { return representation_ <= kLastSentinel; }
};
enum Nullability : bool { kNonNullable, kNullable };
+// A ValueType is encoded by three components: A Kind, a heap representation
+// (for reference types), and an inheritance depth (for rtts only). Those are
+// encoded into 32 bits using base::BitField. The underlying Kind enumeration
+// includes four elements which do not strictly correspond to value types: the
+// two packed types i8 and i16, the type of void blocks (stmt), and a bottom
+// value (for internal use).
class ValueType {
public:
enum Kind : uint8_t {
@@ -197,8 +216,7 @@ class ValueType {
return ValueType(KindField::encode(kind));
}
static constexpr ValueType Ref(uint32_t heap_type, Nullability nullability) {
- CONSTEXPR_DCHECK(heap_type != HeapType::kBottom &&
- HeapType(heap_type).is_valid());
+ CONSTEXPR_DCHECK(HeapType(heap_type).is_valid());
return ValueType(
KindField::encode(nullability == kNullable ? kOptRef : kRef) |
HeapTypeField::encode(heap_type));
@@ -209,8 +227,7 @@ class ValueType {
static constexpr ValueType Rtt(uint32_t heap_type,
uint8_t inheritance_depth) {
- CONSTEXPR_DCHECK(heap_type != HeapType::kBottom &&
- HeapType(heap_type).is_valid());
+ CONSTEXPR_DCHECK(HeapType(heap_type).is_valid());
return ValueType(KindField::encode(kRtt) |
HeapTypeField::encode(heap_type) |
DepthField::encode(inheritance_depth));
@@ -220,6 +237,7 @@ class ValueType {
return Rtt(heap_type.representation(), inheritance_depth);
}
+ // Useful when deserializing a type stored in a runtime object.
static constexpr ValueType FromRawBitField(uint32_t bit_field) {
return ValueType(bit_field);
}
@@ -242,8 +260,13 @@ class ValueType {
return heap_type().ref_index();
}
+ // Useful when serializing this type to store it into a runtime object.
constexpr uint32_t raw_bit_field() const { return bit_field_; }
+ static constexpr size_t bit_field_offset() {
+ return offsetof(ValueType, bit_field_);
+ }
+
constexpr int element_size_log2() const {
constexpr int8_t kElementSizeLog2[] = {
#define ELEM_SIZE_LOG2(kind, log2Size, ...) log2Size,
@@ -293,40 +316,48 @@ class ValueType {
return machine_type().representation();
}
+ // Returns the first byte of this type's representation in the wasm binary
+ // format.
+ // For compatibility with the reftypes and exception-handling proposals, this
+ // function prioritizes shorthand encodings
+ // (e.g., Ref(HeapType::kFunc, kNullable).value_type_code will return
+ // kFuncrefCode and not kOptRefCode).
constexpr ValueTypeCode value_type_code() const {
CONSTEXPR_DCHECK(kind() != kBottom);
switch (kind()) {
case kOptRef:
switch (heap_representation()) {
case HeapType::kFunc:
- return kLocalFuncRef;
+ return kFuncRefCode;
case HeapType::kExtern:
- return kLocalExternRef;
+ return kExternRefCode;
case HeapType::kEq:
- return kLocalEqRef;
+ return kEqRefCode;
case HeapType::kExn:
- return kLocalExnRef;
+ return kExnRefCode;
default:
- return kLocalOptRef;
+ return kOptRefCode;
}
case kRef:
- if (heap_representation() == HeapType::kI31) return kLocalI31Ref;
- return kLocalRef;
+ if (heap_representation() == HeapType::kI31) return kI31RefCode;
+ return kRefCode;
case kStmt:
- return kLocalVoid;
+ return kVoidCode;
case kRtt:
- return kLocalRtt;
+ return kRttCode;
#define NUMERIC_TYPE_CASE(kind, ...) \
case k##kind: \
- return kLocal##kind;
+ return k##kind##Code;
FOREACH_NUMERIC_VALUE_TYPE(NUMERIC_TYPE_CASE)
#undef NUMERIC_TYPE_CASE
case kBottom:
// Unreachable code
- return kLocalVoid;
+ return kVoidCode;
}
}
+ // Returns true iff the heap type is needed to encode this type in the wasm
+ // binary format, taking into account available type shorthands.
constexpr bool encoding_needs_heap_type() const {
return (kind() == kRef && heap_representation() != HeapType::kI31) ||
kind() == kRtt ||
@@ -394,10 +425,26 @@ class ValueType {
return buf.str();
}
+ static constexpr int kLastUsedBit = 30;
+
private:
- using KindField = base::BitField<Kind, 0, 5>;
- using HeapTypeField = base::BitField<uint32_t, 5, 20>;
- using DepthField = base::BitField<uint8_t, 25, 7>;
+ // We only use 31 bits so ValueType fits in a Smi. This can be changed if
+ // needed.
+ static constexpr int kKindBits = 5;
+ static constexpr int kHeapTypeBits = 20;
+ static constexpr int kDepthBits = 6;
+ STATIC_ASSERT(kV8MaxWasmTypes < (1u << kHeapTypeBits));
+ // Note: we currently conservatively allow only 5 bits, but have room to
+ // store 6, so we can raise the limit if needed.
+ STATIC_ASSERT(kV8MaxRttSubtypingDepth < (1u << kDepthBits));
+ using KindField = base::BitField<Kind, 0, kKindBits>;
+ using HeapTypeField = KindField::Next<uint32_t, kHeapTypeBits>;
+ using DepthField = HeapTypeField::Next<uint8_t, kDepthBits>;
+
+ // This is implemented defensively against field order changes.
+ STATIC_ASSERT(kLastUsedBit == std::max(KindField::kLastUsedBit,
+ std::max(HeapTypeField::kLastUsedBit,
+ DepthField::kLastUsedBit)));
constexpr explicit ValueType(uint32_t bit_field) : bit_field_(bit_field) {}
@@ -409,6 +456,7 @@ class ValueType {
#undef TYPE_NAME
};
+ CONSTEXPR_DCHECK(kind() < arraysize(kTypeName));
return kTypeName[kind()];
}
@@ -427,6 +475,7 @@ inline std::ostream& operator<<(std::ostream& oss, ValueType type) {
return oss << type.name();
}
+// Precomputed primitive types.
constexpr ValueType kWasmI32 = ValueType::Primitive(ValueType::kI32);
constexpr ValueType kWasmI64 = ValueType::Primitive(ValueType::kI64);
constexpr ValueType kWasmF32 = ValueType::Primitive(ValueType::kF32);
diff --git a/deps/v8/src/wasm/wasm-code-manager.cc b/deps/v8/src/wasm/wasm-code-manager.cc
index fc657d634d..9511e15ff4 100644
--- a/deps/v8/src/wasm/wasm-code-manager.cc
+++ b/deps/v8/src/wasm/wasm-code-manager.cc
@@ -501,6 +501,9 @@ void WasmCodeAllocator::OptionalLock::Lock(WasmCodeAllocator* allocator) {
allocator->mutex_.Lock();
}
+// static
+constexpr size_t WasmCodeAllocator::kMaxCodeSpaceSize;
+
WasmCodeAllocator::WasmCodeAllocator(WasmCodeManager* code_manager,
VirtualMemory code_space,
std::shared_ptr<Counters> async_counters)
@@ -604,7 +607,7 @@ size_t ReservationSize(size_t code_size_estimate, int num_declared_functions,
total_reserved / 4));
// Limit by the maximum supported code space size.
- return std::min(kMaxWasmCodeSpaceSize, reserve_size);
+ return std::min(WasmCodeAllocator::kMaxCodeSpaceSize, reserve_size);
}
} // namespace
@@ -672,13 +675,13 @@ Vector<byte> WasmCodeAllocator::AllocateForCodeInRegion(
// start is already committed (or we start at the beginning of a page).
// The end needs to be committed all through the end of the page.
if (commit_start < commit_end) {
- committed_code_space_.fetch_add(commit_end - commit_start);
- // Committed code cannot grow bigger than maximum code space size.
- DCHECK_LE(committed_code_space_.load(), kMaxWasmCodeMemory);
for (base::AddressRegion split_range : SplitRangeByReservationsIfNeeded(
{commit_start, commit_end - commit_start}, owned_code_space_)) {
code_manager_->Commit(split_range);
}
+ committed_code_space_.fetch_add(commit_end - commit_start);
+ // Committed code cannot grow bigger than maximum code space size.
+ DCHECK_LE(committed_code_space_.load(), FLAG_wasm_max_code_space * MB);
}
DCHECK(IsAligned(code_space.begin(), kCodeAlignment));
allocated_code_space_.Merge(code_space);
@@ -748,25 +751,33 @@ void WasmCodeAllocator::FreeCode(Vector<WasmCode* const> codes) {
}
freed_code_size_.fetch_add(code_size);
- // Merge {freed_regions} into {freed_code_space_} and discard full pages.
- base::MutexGuard guard(&mutex_);
+ // Merge {freed_regions} into {freed_code_space_} and put all ranges of full
+ // pages to decommit into {regions_to_decommit} (decommitting is expensive,
+ // so try to merge regions before decommitting).
+ DisjointAllocationPool regions_to_decommit;
PageAllocator* allocator = GetPlatformPageAllocator();
size_t commit_page_size = allocator->CommitPageSize();
- for (auto region : freed_regions.regions()) {
- auto merged_region = freed_code_space_.Merge(region);
- Address discard_start =
- std::max(RoundUp(merged_region.begin(), commit_page_size),
- RoundDown(region.begin(), commit_page_size));
- Address discard_end =
- std::min(RoundDown(merged_region.end(), commit_page_size),
- RoundUp(region.end(), commit_page_size));
- if (discard_start >= discard_end) continue;
- size_t discard_size = discard_end - discard_start;
- size_t old_committed = committed_code_space_.fetch_sub(discard_size);
- DCHECK_GE(old_committed, discard_size);
+ {
+ base::MutexGuard guard(&mutex_);
+ for (auto region : freed_regions.regions()) {
+ auto merged_region = freed_code_space_.Merge(region);
+ Address discard_start =
+ std::max(RoundUp(merged_region.begin(), commit_page_size),
+ RoundDown(region.begin(), commit_page_size));
+ Address discard_end =
+ std::min(RoundDown(merged_region.end(), commit_page_size),
+ RoundUp(region.end(), commit_page_size));
+ if (discard_start >= discard_end) continue;
+ regions_to_decommit.Merge({discard_start, discard_end - discard_start});
+ }
+ }
+
+ for (auto region : regions_to_decommit.regions()) {
+ size_t old_committed = committed_code_space_.fetch_sub(region.size());
+ DCHECK_GE(old_committed, region.size());
USE(old_committed);
- for (base::AddressRegion split_range : SplitRangeByReservationsIfNeeded(
- {discard_start, discard_size}, owned_code_space_)) {
+ for (base::AddressRegion split_range :
+ SplitRangeByReservationsIfNeeded(region, owned_code_space_)) {
code_manager_->Decommit(split_range);
}
}
@@ -807,6 +818,11 @@ NativeModule::NativeModule(WasmEngine* engine, const WasmFeatures& enabled,
std::make_unique<WasmCode*[]>(module_->num_declared_functions);
num_liftoff_function_calls_ =
std::make_unique<uint32_t[]>(module_->num_declared_functions);
+
+ // Start counter at 4 to avoid runtime calls for smaller numbers.
+ constexpr int kCounterStart = 4;
+ std::fill_n(num_liftoff_function_calls_.get(),
+ module_->num_declared_functions, kCounterStart);
}
code_allocator_.Init(this);
}
@@ -838,10 +854,13 @@ void NativeModule::ReserveCodeTableForTesting(uint32_t max_functions) {
void NativeModule::LogWasmCodes(Isolate* isolate) {
if (!WasmCode::ShouldBeLogged(isolate)) return;
+ TRACE_EVENT1("v8.wasm", "wasm.LogWasmCodes", "num_functions",
+ module_->num_declared_functions);
+
// TODO(titzer): we skip the logging of the import wrappers
// here, but they should be included somehow.
- int start = module()->num_imported_functions;
- int end = start + module()->num_declared_functions;
+ int start = module_->num_imported_functions;
+ int end = start + module_->num_declared_functions;
WasmCodeRefScope code_ref_scope;
for (int func_index = start; func_index < end; ++func_index) {
if (WasmCode* code = GetCode(func_index)) code->LogCode(isolate);
@@ -1001,6 +1020,7 @@ std::unique_ptr<WasmCode> NativeModule::AddCodeWithCodeSpace(
Vector<uint8_t> dst_code_bytes, const JumpTablesRef& jump_tables) {
Vector<byte> reloc_info{desc.buffer + desc.buffer_size - desc.reloc_size,
static_cast<size_t>(desc.reloc_size)};
+ UpdateCodeSize(desc.instr_size, tier, for_debugging);
// TODO(jgruber,v8:8758): Remove this translation. It exists only because
// CodeDesc contains real offsets but WasmCode expects an offset of 0 to mean
@@ -1045,6 +1065,10 @@ std::unique_ptr<WasmCode> NativeModule::AddCodeWithCodeSpace(
// Flush the i-cache after relocation.
FlushInstructionCache(dst_code_bytes.begin(), dst_code_bytes.size());
+ // Liftoff code will not be relocated or serialized, thus do not store any
+ // relocation information.
+ if (tier == ExecutionTier::kLiftoff) reloc_info = {};
+
std::unique_ptr<WasmCode> code{new WasmCode{
this, index, dst_code_bytes, stack_slots, tagged_parameter_slots,
safepoint_table_offset, handler_table_offset, constant_pool_offset,
@@ -1151,6 +1175,7 @@ WasmCode* NativeModule::AddDeserializedCode(
// CodeSpaceWriteScope is provided by the caller.
Vector<uint8_t> dst_code_bytes =
code_allocator_.AllocateForCode(this, instructions.size());
+ UpdateCodeSize(dst_code_bytes.size(), tier, kNoDebugging);
memcpy(dst_code_bytes.begin(), instructions.begin(), instructions.size());
std::unique_ptr<WasmCode> code{new WasmCode{
@@ -1207,6 +1232,7 @@ WasmCode* NativeModule::CreateEmptyJumpTableInRegion(
Vector<uint8_t> code_space = code_allocator_.AllocateForCodeInRegion(
this, jump_table_size, region, allocator_lock);
DCHECK(!code_space.empty());
+ UpdateCodeSize(jump_table_size, ExecutionTier::kNone, kNoDebugging);
CODE_SPACE_WRITE_SCOPE
ZapCode(reinterpret_cast<Address>(code_space.begin()), code_space.size());
std::unique_ptr<WasmCode> code{
@@ -1229,6 +1255,15 @@ WasmCode* NativeModule::CreateEmptyJumpTableInRegion(
return PublishCode(std::move(code));
}
+void NativeModule::UpdateCodeSize(size_t size, ExecutionTier tier,
+ ForDebugging for_debugging) {
+ if (for_debugging != kNoDebugging) return;
+ // Count jump tables (ExecutionTier::kNone) for both Liftoff and TurboFan as
+ // this is shared code.
+ if (tier != ExecutionTier::kTurbofan) liftoff_code_size_.fetch_add(size);
+ if (tier != ExecutionTier::kLiftoff) turbofan_code_size_.fetch_add(size);
+}
+
void NativeModule::PatchJumpTablesLocked(uint32_t slot_index, Address target) {
// The caller must hold the {allocation_mutex_}, thus we fail to lock it here.
DCHECK(!allocation_mutex_.TryLock());
@@ -1433,7 +1468,7 @@ NativeModule::JumpTablesRef NativeModule::FindJumpTablesForRegion(
size_t max_distance = std::max(
code_region.end() > table_start ? code_region.end() - table_start : 0,
table_end > code_region.begin() ? table_end - code_region.begin() : 0);
- return max_distance < kMaxWasmCodeSpaceSize;
+ return max_distance < WasmCodeAllocator::kMaxCodeSpaceSize;
};
// Fast path: Try to use {main_jump_table_} and {main_far_jump_table_}.
@@ -1501,7 +1536,8 @@ WasmCode::RuntimeStubId NativeModule::GetRuntimeStubId(Address target) const {
base::MutexGuard guard(&allocation_mutex_);
for (auto& code_space_data : code_space_data_) {
- if (code_space_data.far_jump_table->contains(target)) {
+ if (code_space_data.far_jump_table != nullptr &&
+ code_space_data.far_jump_table->contains(target)) {
uint32_t offset = static_cast<uint32_t>(
target - code_space_data.far_jump_table->instruction_start());
uint32_t index = JumpTableAssembler::FarJumpSlotOffsetToIndex(offset);
@@ -1532,7 +1568,7 @@ NativeModule::~NativeModule() {
WasmCodeManager::WasmCodeManager(size_t max_committed)
: max_committed_code_space_(max_committed),
critical_committed_code_space_(max_committed / 2) {
- DCHECK_LE(max_committed, kMaxWasmCodeMemory);
+ DCHECK_LE(max_committed, FLAG_wasm_max_code_space * MB);
}
#if defined(V8_OS_WIN64)
@@ -1610,11 +1646,7 @@ VirtualMemory WasmCodeManager::TryAllocate(size_t size, void* hint) {
if (!BackingStore::ReserveAddressSpace(size)) return {};
if (hint == nullptr) hint = page_allocator->GetRandomMmapAddr();
- // When we start exposing Wasm in jitless mode, then the jitless flag
- // will have to determine whether we set kMapAsJittable or not.
- DCHECK(!FLAG_jitless);
- VirtualMemory mem(page_allocator, size, hint, allocate_page_size,
- VirtualMemory::kMapAsJittable);
+ VirtualMemory mem(page_allocator, size, hint, allocate_page_size);
if (!mem.IsReserved()) {
BackingStore::ReleaseReservation(size);
return {};
diff --git a/deps/v8/src/wasm/wasm-code-manager.h b/deps/v8/src/wasm/wasm-code-manager.h
index 905449d63e..5e8ed5475b 100644
--- a/deps/v8/src/wasm/wasm-code-manager.h
+++ b/deps/v8/src/wasm/wasm-code-manager.h
@@ -366,6 +366,17 @@ const char* GetWasmCodeKindAsString(WasmCode::Kind);
// Manages the code reservations and allocations of a single {NativeModule}.
class WasmCodeAllocator {
public:
+#if V8_TARGET_ARCH_ARM64
+ // ARM64 only supports direct calls within a 128 MB range.
+ static constexpr size_t kMaxCodeSpaceSize = 128 * MB;
+#else
+ // Use 1024 MB limit for code spaces on other platforms. This is smaller than
+ // the total allowed code space (kMaxWasmCodeMemory) to avoid unnecessarily
+ // big reservations, and to ensure that distances within a code space fit
+ // within a 32-bit signed integer.
+ static constexpr size_t kMaxCodeSpaceSize = 1024 * MB;
+#endif
+
// {OptionalLock} is passed between {WasmCodeAllocator} and {NativeModule} to
// indicate that the lock on the {WasmCodeAllocator} is already taken. It's
// optional to allow to also call methods without holding the lock.
@@ -585,6 +596,8 @@ class V8_EXPORT_PRIVATE NativeModule final {
return code_allocator_.generated_code_size();
}
size_t liftoff_bailout_count() const { return liftoff_bailout_count_.load(); }
+ size_t liftoff_code_size() const { return liftoff_code_size_.load(); }
+ size_t turbofan_code_size() const { return turbofan_code_size_.load(); }
WasmEngine* engine() const { return engine_; }
bool HasWireBytes() const {
@@ -686,6 +699,8 @@ class V8_EXPORT_PRIVATE NativeModule final {
int jump_table_size, base::AddressRegion,
const WasmCodeAllocator::OptionalLock&);
+ void UpdateCodeSize(size_t, ExecutionTier, ForDebugging);
+
// Hold the {allocation_mutex_} when calling one of these methods.
// {slot_index} is the index in the declared functions, i.e. function index
// minus the number of imported functions.
@@ -777,6 +792,8 @@ class V8_EXPORT_PRIVATE NativeModule final {
UseTrapHandler use_trap_handler_ = kNoTrapHandler;
bool lazy_compile_frozen_ = false;
std::atomic<size_t> liftoff_bailout_count_{0};
+ std::atomic<size_t> liftoff_code_size_{0};
+ std::atomic<size_t> turbofan_code_size_{0};
DISALLOW_COPY_AND_ASSIGN(NativeModule);
};
diff --git a/deps/v8/src/wasm/wasm-constants.h b/deps/v8/src/wasm/wasm-constants.h
index 79a4be55bd..4e701599fc 100644
--- a/deps/v8/src/wasm/wasm-constants.h
+++ b/deps/v8/src/wasm/wasm-constants.h
@@ -21,26 +21,26 @@ constexpr uint32_t kWasmVersion = 0x01;
// Binary encoding of value and heap types.
enum ValueTypeCode : uint8_t {
// Current wasm types
- kLocalVoid = 0x40,
- kLocalI32 = 0x7f,
- kLocalI64 = 0x7e,
- kLocalF32 = 0x7d,
- kLocalF64 = 0x7c,
+ kVoidCode = 0x40,
+ kI32Code = 0x7f,
+ kI64Code = 0x7e,
+ kF32Code = 0x7d,
+ kF64Code = 0x7c,
// Simd proposal
- kLocalS128 = 0x7b,
+ kS128Code = 0x7b,
// reftypes, typed-funcref, and GC proposals
- kLocalI8 = 0x7a,
- kLocalI16 = 0x79,
- kLocalFuncRef = 0x70,
- kLocalExternRef = 0x6f,
- // kLocalAny = 0x6e, // TODO(7748): Implement
- kLocalEqRef = 0x6d,
- kLocalOptRef = 0x6c,
- kLocalRef = 0x6b,
- kLocalI31Ref = 0x6a,
- kLocalRtt = 0x69,
+ kI8Code = 0x7a,
+ kI16Code = 0x79,
+ kFuncRefCode = 0x70,
+ kExternRefCode = 0x6f,
+ // kAnyCode = 0x6e, // TODO(7748): Implement
+ kEqRefCode = 0x6d,
+ kOptRefCode = 0x6c,
+ kRefCode = 0x6b,
+ kI31RefCode = 0x6a,
+ kRttCode = 0x69,
// Exception handling proposal
- kLocalExnRef = 0x68,
+ kExnRefCode = 0x68,
};
// Binary encoding of other types.
constexpr uint8_t kWasmFunctionTypeCode = 0x60;
@@ -56,14 +56,13 @@ enum ImportExportKindCode : uint8_t {
kExternalException = 4
};
-// Binary encoding of maximum and shared flags for memories.
-enum MaximumFlag : uint8_t { kNoMaximumFlag = 0, kHasMaximumFlag = 1 };
-
-enum MemoryFlags : uint8_t {
- kNoMaximum = 0,
- kMaximum = 1,
- kSharedNoMaximum = 2,
- kSharedAndMaximum = 3
+enum LimitsFlags : uint8_t {
+ kNoMaximum = 0x00, // Also valid for table limits.
+ kWithMaximum = 0x01, // Also valid for table limits.
+ kSharedNoMaximum = 0x02, // Only valid for memory limits.
+ kSharedWithMaximum = 0x03, // Only valid for memory limits.
+ kMemory64NoMaximum = 0x04, // Only valid for memory limits.
+ kMemory64WithMaximum = 0x05 // Only valid for memory limits.
};
// Flags for data and element segments.
diff --git a/deps/v8/src/wasm/wasm-debug-evaluate.cc b/deps/v8/src/wasm/wasm-debug-evaluate.cc
index b794e08978..d8abe49679 100644
--- a/deps/v8/src/wasm/wasm-debug-evaluate.cc
+++ b/deps/v8/src/wasm/wasm-debug-evaluate.cc
@@ -405,8 +405,8 @@ Maybe<std::string> DebugEvaluateImpl(
Handle<WasmExportedFunction>::cast(entry_point_obj);
// TODO(wasm): Cache this code.
- Handle<Code> wasm_entry =
- compiler::CompileCWasmEntry(isolate, entry_point->sig());
+ Handle<Code> wasm_entry = compiler::CompileCWasmEntry(
+ isolate, entry_point->sig(), debuggee_instance->module());
CWasmArgumentsPacker packer(4 /* uint32_t return value, no parameters. */);
Execution::CallWasm(isolate, wasm_entry, entry_point->GetWasmCallTarget(),
diff --git a/deps/v8/src/wasm/wasm-debug.cc b/deps/v8/src/wasm/wasm-debug.cc
index 725d443633..d05caa4144 100644
--- a/deps/v8/src/wasm/wasm-debug.cc
+++ b/deps/v8/src/wasm/wasm-debug.cc
@@ -19,11 +19,13 @@
#include "src/wasm/baseline/liftoff-compiler.h"
#include "src/wasm/baseline/liftoff-register.h"
#include "src/wasm/module-decoder.h"
+#include "src/wasm/value-type.h"
#include "src/wasm/wasm-code-manager.h"
#include "src/wasm/wasm-limits.h"
#include "src/wasm/wasm-module.h"
#include "src/wasm/wasm-objects-inl.h"
#include "src/wasm/wasm-opcodes-inl.h"
+#include "src/wasm/wasm-subtyping.h"
#include "src/wasm/wasm-value.h"
#include "src/zone/accounting-allocator.h"
@@ -60,7 +62,8 @@ MaybeHandle<JSObject> CreateFunctionTablesObject(
for (int table_index = 0; table_index < tables->length(); ++table_index) {
auto func_table =
handle(WasmTableObject::cast(tables->get(table_index)), isolate);
- if (!func_table->type().is_reference_to(HeapType::kFunc)) continue;
+ if (!IsSubtypeOf(func_table->type(), kWasmFuncRef, instance->module()))
+ continue;
Handle<String> table_name;
if (!WasmInstanceObject::GetTableNameOrNull(isolate, instance, table_index)
@@ -129,6 +132,12 @@ Handle<Object> WasmValueToValueObject(Isolate* isolate, WasmValue value) {
memcpy(bytes->GetDataStartAddress(), &val, sizeof(val));
break;
}
+ case ValueType::kS128: {
+ Simd128 s128 = value.to_s128();
+ bytes = isolate->factory()->NewByteArray(kSimd128Size);
+ memcpy(bytes->GetDataStartAddress(), s128.bytes(), kSimd128Size);
+ break;
+ }
case ValueType::kOptRef: {
if (value.type().is_reference_to(HeapType::kExtern)) {
return isolate->factory()->NewWasmValue(
@@ -402,8 +411,25 @@ class DebugInfoImpl {
return local_names_->GetName(func_index, local_index);
}
- WasmCode* RecompileLiftoffWithBreakpoints(int func_index,
- Vector<int> offsets) {
+ // If the top frame is a Wasm frame and its position is not in the list of
+ // breakpoints, return that position. Return 0 otherwise.
+ // This is used to generate a "dead breakpoint" in Liftoff, which is necessary
+ // for OSR to find the correct return address.
+ int DeadBreakpoint(int func_index, std::vector<int>& breakpoints,
+ Isolate* isolate) {
+ StackTraceFrameIterator it(isolate);
+ if (it.done() || !it.is_wasm()) return 0;
+ WasmFrame* frame = WasmFrame::cast(it.frame());
+ const auto& function = native_module_->module()->functions[func_index];
+ int offset = frame->position() - function.code.offset();
+ if (std::binary_search(breakpoints.begin(), breakpoints.end(), offset)) {
+ return 0;
+ }
+ return offset;
+ }
+
+ WasmCode* RecompileLiftoffWithBreakpoints(int func_index, Vector<int> offsets,
+ int dead_breakpoint) {
DCHECK(!mutex_.TryLock()); // Mutex is held externally.
// Recompile the function with Liftoff, setting the new breakpoints.
// Not thread-safe. The caller is responsible for locking {mutex_}.
@@ -422,7 +448,8 @@ class DebugInfoImpl {
WasmFeatures unused_detected;
WasmCompilationResult result = ExecuteLiftoffCompilation(
native_module_->engine()->allocator(), &env, body, func_index,
- for_debugging, counters, &unused_detected, offsets, &debug_sidetable);
+ for_debugging, counters, &unused_detected, offsets, &debug_sidetable,
+ dead_breakpoint);
// Liftoff compilation failure is a FATAL error. We rely on complete Liftoff
// support for debugging.
if (!result.succeeded()) FATAL("Liftoff compilation failed");
@@ -432,8 +459,11 @@ class DebugInfoImpl {
native_module_->AddCompiledCode(std::move(result)));
DCHECK(new_code->is_inspectable());
- DCHECK_EQ(0, debug_side_tables_.count(new_code));
- debug_side_tables_.emplace(new_code, std::move(debug_sidetable));
+ {
+ base::MutexGuard lock(&debug_side_tables_mutex_);
+ DCHECK_EQ(0, debug_side_tables_.count(new_code));
+ debug_side_tables_.emplace(new_code, std::move(debug_sidetable));
+ }
return new_code;
}
@@ -479,8 +509,10 @@ class DebugInfoImpl {
new_code = native_module_->GetCode(func_index);
} else {
all_breakpoints.insert(insertion_point, offset);
- new_code = RecompileLiftoffWithBreakpoints(func_index,
- VectorOf(all_breakpoints));
+ int dead_breakpoint =
+ DeadBreakpoint(func_index, all_breakpoints, isolate);
+ new_code = RecompileLiftoffWithBreakpoints(
+ func_index, VectorOf(all_breakpoints), dead_breakpoint);
}
UpdateReturnAddresses(isolate, new_code, isolate_data.stepping_frame);
}
@@ -497,10 +529,11 @@ class DebugInfoImpl {
}
void UpdateBreakpoints(int func_index, Vector<int> breakpoints,
- Isolate* isolate, StackFrameId stepping_frame) {
+ Isolate* isolate, StackFrameId stepping_frame,
+ int dead_breakpoint) {
DCHECK(!mutex_.TryLock()); // Mutex is held externally.
- WasmCode* new_code =
- RecompileLiftoffWithBreakpoints(func_index, breakpoints);
+ WasmCode* new_code = RecompileLiftoffWithBreakpoints(
+ func_index, breakpoints, dead_breakpoint);
UpdateReturnAddresses(isolate, new_code, stepping_frame);
}
@@ -512,7 +545,7 @@ class DebugInfoImpl {
// Generate an additional source position for the current byte offset.
base::MutexGuard guard(&mutex_);
WasmCode* new_code = RecompileLiftoffWithBreakpoints(
- frame->function_index(), VectorOf(&offset, 1));
+ frame->function_index(), VectorOf(&offset, 1), 0);
UpdateReturnAddress(frame, new_code, return_location);
}
@@ -558,18 +591,6 @@ class DebugInfoImpl {
}
void RemoveBreakpoint(int func_index, int position, Isolate* isolate) {
- // TODO(thibaudm): Cannot remove the breakpoint we are currently paused at,
- // because the new code would be missing the call instruction and the
- // corresponding source position that we rely on for OSR.
- StackTraceFrameIterator it(isolate);
- if (!it.done() && it.is_wasm()) {
- WasmFrame* frame = WasmFrame::cast(it.frame());
- if (static_cast<int32_t>(frame->function_index()) == func_index &&
- frame->position() == position) {
- return;
- }
- }
-
// Put the code ref scope outside of the mutex, so we don't unnecessarily
// hold the mutex while freeing code.
WasmCodeRefScope wasm_code_ref_scope;
@@ -595,19 +616,20 @@ class DebugInfoImpl {
// If the breakpoint is still set in another isolate, don't remove it.
DCHECK(std::is_sorted(remaining.begin(), remaining.end()));
if (std::binary_search(remaining.begin(), remaining.end(), offset)) return;
+ int dead_breakpoint = DeadBreakpoint(func_index, remaining, isolate);
UpdateBreakpoints(func_index, VectorOf(remaining), isolate,
- isolate_data.stepping_frame);
+ isolate_data.stepping_frame, dead_breakpoint);
}
void RemoveDebugSideTables(Vector<WasmCode* const> codes) {
- base::MutexGuard guard(&mutex_);
+ base::MutexGuard guard(&debug_side_tables_mutex_);
for (auto* code : codes) {
debug_side_tables_.erase(code);
}
}
DebugSideTable* GetDebugSideTableIfExists(const WasmCode* code) const {
- base::MutexGuard guard(&mutex_);
+ base::MutexGuard guard(&debug_side_tables_mutex_);
auto it = debug_side_tables_.find(code);
return it == debug_side_tables_.end() ? nullptr : it->second.get();
}
@@ -640,7 +662,7 @@ class DebugInfoImpl {
std::vector<int>& removed = entry.second;
std::vector<int> remaining = FindAllBreakpoints(func_index);
if (HasRemovedBreakpoints(removed, remaining)) {
- RecompileLiftoffWithBreakpoints(func_index, VectorOf(remaining));
+ RecompileLiftoffWithBreakpoints(func_index, VectorOf(remaining), 0);
}
}
}
@@ -677,7 +699,7 @@ class DebugInfoImpl {
{
// Only hold the mutex temporarily. We can't hold it while generating the
// debug side table, because compilation takes the {NativeModule} lock.
- base::MutexGuard guard(&mutex_);
+ base::MutexGuard guard(&debug_side_tables_mutex_);
auto it = debug_side_tables_.find(code);
if (it != debug_side_tables_.end()) return it->second.get();
}
@@ -698,7 +720,7 @@ class DebugInfoImpl {
// Check cache again, maybe another thread concurrently generated a debug
// side table already.
{
- base::MutexGuard guard(&mutex_);
+ base::MutexGuard guard(&debug_side_tables_mutex_);
auto& slot = debug_side_tables_[code];
if (slot != nullptr) return slot.get();
slot = std::move(debug_side_table);
@@ -743,16 +765,26 @@ class DebugInfoImpl {
? WasmValue(ReadUnalignedValue<uint32_t>(gp_addr(reg.gp())))
: WasmValue(ReadUnalignedValue<uint64_t>(gp_addr(reg.gp())));
}
- // TODO(clemensb/zhin): Fix this for SIMD.
DCHECK(reg.is_fp() || reg.is_fp_pair());
- if (reg.is_fp_pair()) UNIMPLEMENTED();
+ // ifdef here to workaround unreachable code for is_fp_pair.
+#ifdef V8_TARGET_ARCH_ARM
+ int code = reg.is_fp_pair() ? reg.low_fp().code() : reg.fp().code();
+#else
+ int code = reg.fp().code();
+#endif
Address spilled_addr =
debug_break_fp +
- WasmDebugBreakFrameConstants::GetPushedFpRegisterOffset(
- reg.fp().code());
- return type == kWasmF32
- ? WasmValue(ReadUnalignedValue<float>(spilled_addr))
- : WasmValue(ReadUnalignedValue<double>(spilled_addr));
+ WasmDebugBreakFrameConstants::GetPushedFpRegisterOffset(code);
+ if (type == kWasmF32) {
+ return WasmValue(ReadUnalignedValue<float>(spilled_addr));
+ } else if (type == kWasmF64) {
+ return WasmValue(ReadUnalignedValue<double>(spilled_addr));
+ } else if (type == kWasmS128) {
+ return WasmValue(Simd128(ReadUnalignedValue<int16>(spilled_addr)));
+ } else {
+ // All other cases should have been handled above.
+ UNREACHABLE();
+ }
}
// Otherwise load the value from the stack.
@@ -767,6 +799,9 @@ class DebugInfoImpl {
return WasmValue(ReadUnalignedValue<float>(stack_address));
case ValueType::kF64:
return WasmValue(ReadUnalignedValue<double>(stack_address));
+ case ValueType::kS128: {
+ return WasmValue(Simd128(ReadUnalignedValue<int16>(stack_address)));
+ }
default:
UNIMPLEMENTED();
}
@@ -837,13 +872,15 @@ class DebugInfoImpl {
NativeModule* const native_module_;
- // {mutex_} protects all fields below.
- mutable base::Mutex mutex_;
+ mutable base::Mutex debug_side_tables_mutex_;
// DebugSideTable per code object, lazily initialized.
std::unordered_map<const WasmCode*, std::unique_ptr<DebugSideTable>>
debug_side_tables_;
+ // {mutex_} protects all fields below.
+ mutable base::Mutex mutex_;
+
// Names of locals, lazily decoded from the wire bytes.
std::unique_ptr<LocalNames> local_names_;
diff --git a/deps/v8/src/wasm/wasm-engine.cc b/deps/v8/src/wasm/wasm-engine.cc
index b38d1aeecb..9699516c27 100644
--- a/deps/v8/src/wasm/wasm-engine.cc
+++ b/deps/v8/src/wasm/wasm-engine.cc
@@ -117,15 +117,9 @@ class WasmGCForegroundTask : public CancelableTask {
void RunInternal() final {
WasmEngine* engine = isolate_->wasm_engine();
- // If the foreground task is executing, there is no wasm code active. Just
- // report an empty set of live wasm code.
-#ifdef ENABLE_SLOW_DCHECKS
- for (StackFrameIterator it(isolate_); !it.done(); it.Advance()) {
- DCHECK_NE(StackFrame::WASM, it.frame()->type());
- }
-#endif
- CheckNoArchivedThreads(isolate_);
- engine->ReportLiveCodeForGC(isolate_, Vector<WasmCode*>{});
+ // The stack can contain live frames, for instance when this is invoked
+ // during a pause or a breakpoint.
+ engine->ReportLiveCodeFromStackForGC(isolate_);
}
private:
@@ -865,9 +859,10 @@ AsyncCompileJob* WasmEngine::CreateAsyncCompileJob(
std::unique_ptr<byte[]> bytes_copy, size_t length, Handle<Context> context,
const char* api_method_name,
std::shared_ptr<CompilationResultResolver> resolver) {
- AsyncCompileJob* job =
- new AsyncCompileJob(isolate, enabled, std::move(bytes_copy), length,
- context, api_method_name, std::move(resolver));
+ Handle<Context> incumbent_context = isolate->GetIncumbentContext();
+ AsyncCompileJob* job = new AsyncCompileJob(
+ isolate, enabled, std::move(bytes_copy), length, context,
+ incumbent_context, api_method_name, std::move(resolver));
// Pass ownership to the unique_ptr in {async_compile_jobs_}.
base::MutexGuard guard(&mutex_);
async_compile_jobs_[job] = std::unique_ptr<AsyncCompileJob>(job);
@@ -1041,6 +1036,8 @@ void WasmEngine::LogOutstandingCodesForIsolate(Isolate* isolate) {
DCHECK_EQ(1, isolates_.count(isolate));
code_to_log.swap(isolates_[isolate]->code_to_log);
}
+ TRACE_EVENT1("v8.wasm", "wasm.LogCode", "num_code_objects",
+ code_to_log.size());
if (code_to_log.empty()) return;
for (WasmCode* code : code_to_log) {
code->LogCode(isolate);
@@ -1372,8 +1369,8 @@ void WasmEngine::TriggerGC(int8_t gc_sequence_index) {
}
}
TRACE_CODE_GC(
- "Starting GC. Total number of potentially dead code objects: %zu\n",
- current_gc_info_->dead_code.size());
+ "Starting GC (nr %d). Number of potentially dead code objects: %zu\n",
+ current_gc_info_->gc_sequence_index, current_gc_info_->dead_code.size());
// Ensure that there are outstanding isolates that will eventually finish this
// GC. If there are no outstanding isolates, we finish the GC immediately.
PotentiallyFinishCurrentGC();
@@ -1448,18 +1445,12 @@ std::shared_ptr<WasmEngine> WasmEngine::GetWasmEngine() {
return *GetSharedWasmEngine();
}
-// {max_initial_mem_pages} is declared in wasm-limits.h.
-uint32_t max_initial_mem_pages() {
+// {max_mem_pages} is declared in wasm-limits.h.
+uint32_t max_mem_pages() {
STATIC_ASSERT(kV8MaxWasmMemoryPages <= kMaxUInt32);
return std::min(uint32_t{kV8MaxWasmMemoryPages}, FLAG_wasm_max_mem_pages);
}
-uint32_t max_maximum_mem_pages() {
- STATIC_ASSERT(kV8MaxWasmMemoryPages <= kMaxUInt32);
- return std::min(uint32_t{kV8MaxWasmMemoryPages},
- FLAG_wasm_max_mem_pages_growth);
-}
-
// {max_table_init_entries} is declared in wasm-limits.h.
uint32_t max_table_init_entries() {
return std::min(uint32_t{kV8MaxWasmTableInitEntries},
diff --git a/deps/v8/src/wasm/wasm-feature-flags.h b/deps/v8/src/wasm/wasm-feature-flags.h
index c3206bcd55..a536a8706d 100644
--- a/deps/v8/src/wasm/wasm-feature-flags.h
+++ b/deps/v8/src/wasm/wasm-feature-flags.h
@@ -15,16 +15,6 @@
/* V8 side owner: clemensb */ \
V(eh, "exception handling opcodes", false) \
\
- /* Fixed-width SIMD operations. */ \
- /* https://github.com/webassembly/simd */ \
- /* V8 side owner: gdeepti */ \
- V(simd, "SIMD opcodes", false) \
- \
- /* Tail call / return call proposal. */ \
- /* https://github.com/webassembly/tail-call */ \
- /* V8 side owner: fgm */ \
- V(return_call, "return call opcodes", false) \
- \
/* No official proposal (yet?). */ \
/* V8 side owner: clemensb */ \
V(compilation_hints, "compilation hints section", false) \
@@ -38,7 +28,12 @@
/* Typed function references proposal. */ \
/* Official proposal: https://github.com/WebAssembly/function-references */ \
/* V8 side owner: ahaas */ \
- V(typed_funcref, "typed function references", false)
+ V(typed_funcref, "typed function references", false) \
+ \
+ /* Memory64 proposal. */ \
+ /* https://github.com/WebAssembly/memory64 */ \
+ /* V8 side owner: clemensb */ \
+ V(memory64, "memory64", false)
// #############################################################################
// Staged features (disabled by default, but enabled via --wasm-staging (also
@@ -55,6 +50,18 @@
/* Staged in v7.8. */ \
V(reftypes, "reference type opcodes", false) \
\
+ /* Tail call / return call proposal. */ \
+ /* https://github.com/webassembly/tail-call */ \
+ /* V8 side owner: thibaudm */ \
+ /* Staged in v8.7 * */ \
+ V(return_call, "return call opcodes", false) \
+ \
+ /* Fixed-width SIMD operations. */ \
+ /* https://github.com/webassembly/simd */ \
+ /* V8 side owner: gdeepti, zhin */ \
+ /* Staged in v8.7 * */ \
+ V(simd, "SIMD opcodes", false) \
+ \
/* Threads proposal. */ \
/* https://github.com/webassembly/threads */ \
/* NOTE: This is enabled via chromium flag on desktop systems since v7.4 */ \
diff --git a/deps/v8/src/wasm/wasm-js.cc b/deps/v8/src/wasm/wasm-js.cc
index 30efa45ebf..16f4c5d3f9 100644
--- a/deps/v8/src/wasm/wasm-js.cc
+++ b/deps/v8/src/wasm/wasm-js.cc
@@ -1108,9 +1108,10 @@ void WebAssemblyTable(const v8::FunctionCallbackInfo<v8::Value>& args) {
}
i::Handle<i::FixedArray> fixed_array;
- i::Handle<i::JSObject> table_obj = i::WasmTableObject::New(
- i_isolate, type, static_cast<uint32_t>(initial), has_maximum,
- static_cast<uint32_t>(maximum), &fixed_array);
+ i::Handle<i::JSObject> table_obj =
+ i::WasmTableObject::New(i_isolate, i::Handle<i::WasmInstanceObject>(),
+ type, static_cast<uint32_t>(initial), has_maximum,
+ static_cast<uint32_t>(maximum), &fixed_array);
v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
return_value.Set(Utils::ToLocal(table_obj));
}
@@ -1133,15 +1134,14 @@ void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
int64_t initial = 0;
if (!GetInitialOrMinimumProperty(isolate, &thrower, context, descriptor,
- &initial, 0,
- i::wasm::max_initial_mem_pages())) {
+ &initial, 0, i::wasm::max_mem_pages())) {
return;
}
// The descriptor's 'maximum'.
int64_t maximum = -1;
if (!GetOptionalIntegerProperty(isolate, &thrower, context, descriptor,
v8_str(isolate, "maximum"), nullptr, &maximum,
- initial, i::wasm::max_maximum_mem_pages())) {
+ initial, i::wasm::max_mem_pages())) {
return;
}
@@ -1213,9 +1213,9 @@ bool GetValueType(Isolate* isolate, MaybeLocal<Value> maybe,
} else if (enabled_features.has_reftypes() &&
string->StringEquals(v8_str(isolate, "externref"))) {
*type = i::wasm::kWasmExternRef;
- // The JS api spec uses 'anyfunc' instead of 'funcref'.
} else if (enabled_features.has_reftypes() &&
string->StringEquals(v8_str(isolate, "anyfunc"))) {
+ // The JS api spec uses 'anyfunc' instead of 'funcref'.
*type = i::wasm::kWasmFuncRef;
} else if (enabled_features.has_eh() &&
string->StringEquals(v8_str(isolate, "exnref"))) {
@@ -1279,7 +1279,8 @@ void WebAssemblyGlobal(const v8::FunctionCallbackInfo<v8::Value>& args) {
const uint32_t offset = 0;
i::MaybeHandle<i::WasmGlobalObject> maybe_global_obj =
- i::WasmGlobalObject::New(i_isolate, i::MaybeHandle<i::JSArrayBuffer>(),
+ i::WasmGlobalObject::New(i_isolate, i::Handle<i::WasmInstanceObject>(),
+ i::MaybeHandle<i::JSArrayBuffer>(),
i::MaybeHandle<i::FixedArray>(), type, offset,
is_mutable);
@@ -1684,7 +1685,9 @@ void WebAssemblyTableSet(const v8::FunctionCallbackInfo<v8::Value>& args) {
i::Handle<i::Object> element = Utils::OpenHandle(*args[1]);
if (!i::WasmTableObject::IsValidElement(i_isolate, table_object, element)) {
- thrower.TypeError("Argument 1 must be null or a WebAssembly function");
+ thrower.TypeError(
+ "Argument 1 must be null or a WebAssembly function of type compatible "
+ "to 'this'");
return;
}
i::WasmTableObject::Set(i_isolate, table_object, index, element);
@@ -1726,8 +1729,8 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
}
uint64_t max_size64 = receiver->maximum_pages();
- if (max_size64 > uint64_t{i::wasm::max_maximum_mem_pages()}) {
- max_size64 = i::wasm::max_maximum_mem_pages();
+ if (max_size64 > uint64_t{i::wasm::max_mem_pages()}) {
+ max_size64 = i::wasm::max_mem_pages();
}
i::Handle<i::JSArrayBuffer> old_buffer(receiver->array_buffer(), i_isolate);
@@ -1820,7 +1823,6 @@ void WebAssemblyGlobalGetValueCommon(
auto enabled_features = i::wasm::WasmFeatures::FromIsolate(i_isolate);
if (enabled_features.has_bigint()) {
Local<BigInt> value = BigInt::New(isolate, receiver->GetI64());
-
return_value.Set(value);
} else {
thrower.TypeError("Can't get the value of i64 WebAssembly.Global");
diff --git a/deps/v8/src/wasm/wasm-limits.h b/deps/v8/src/wasm/wasm-limits.h
index cb6817ab51..e525c7f07d 100644
--- a/deps/v8/src/wasm/wasm-limits.h
+++ b/deps/v8/src/wasm/wasm-limits.h
@@ -31,8 +31,8 @@ constexpr size_t kV8MaxWasmExceptions = 1000000;
constexpr size_t kV8MaxWasmExceptionTypes = 1000000;
constexpr size_t kV8MaxWasmDataSegments = 100000;
// This indicates the maximum memory size our implementation supports.
-// Don't use this limit directly; use {max_initial_mem_pages()} instead
-// to take the spec'ed limit as well as command line flag into account.
+// Don't use this limit directly; use {max_mem_pages()} instead to take the
+// spec'ed limit as well as command line flag into account.
constexpr size_t kV8MaxWasmMemoryPages = 65536; // = 4 GiB
constexpr size_t kV8MaxWasmStringSize = 100000;
constexpr size_t kV8MaxWasmModuleSize = 1024 * 1024 * 1024; // = 1 GiB
@@ -48,6 +48,10 @@ constexpr size_t kV8MaxWasmTableInitEntries = 10000000;
constexpr size_t kV8MaxWasmTables = 1;
constexpr size_t kV8MaxWasmMemories = 1;
+// GC proposal. These limits are not standardized yet.
+constexpr size_t kV8MaxWasmStructFields = 999;
+constexpr uint32_t kV8MaxRttSubtypingDepth = 31;
+
static_assert(kV8MaxWasmTableSize <= 4294967295, // 2^32 - 1
"v8 should not exceed WebAssembly's non-web embedding limits");
static_assert(kV8MaxWasmTableInitEntries <= kV8MaxWasmTableSize,
@@ -61,13 +65,12 @@ constexpr uint64_t kWasmMaxHeapOffset =
// Defined in wasm-engine.cc.
// TODO(wasm): Make this size_t for wasm64. Currently the --wasm-max-mem-pages
// flag is only uint32_t.
-V8_EXPORT_PRIVATE uint32_t max_initial_mem_pages();
-V8_EXPORT_PRIVATE uint32_t max_maximum_mem_pages();
+V8_EXPORT_PRIVATE uint32_t max_mem_pages();
uint32_t max_table_init_entries();
size_t max_module_size();
inline uint64_t max_mem_bytes() {
- return uint64_t{max_maximum_mem_pages()} * kWasmPageSize;
+ return uint64_t{max_mem_pages()} * kWasmPageSize;
}
} // namespace wasm
diff --git a/deps/v8/src/wasm/wasm-module-builder.cc b/deps/v8/src/wasm/wasm-module-builder.cc
index 64338c3d39..de895e6429 100644
--- a/deps/v8/src/wasm/wasm-module-builder.cc
+++ b/deps/v8/src/wasm/wasm-module-builder.cc
@@ -598,7 +598,7 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer* buffer) const {
buffer->write_size(tables_.size());
for (const WasmTable& table : tables_) {
buffer->write_u8(table.type.value_type_code());
- buffer->write_u8(table.has_maximum ? kHasMaximumFlag : kNoMaximumFlag);
+ buffer->write_u8(table.has_maximum ? kWithMaximum : kNoMaximum);
buffer->write_size(table.min_size);
if (table.has_maximum) buffer->write_size(table.max_size);
}
@@ -610,11 +610,10 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer* buffer) const {
size_t start = EmitSection(kMemorySectionCode, buffer);
buffer->write_u8(1); // memory count
if (has_shared_memory_) {
- buffer->write_u8(has_max_memory_size_ ? MemoryFlags::kSharedAndMaximum
- : MemoryFlags::kSharedNoMaximum);
+ buffer->write_u8(has_max_memory_size_ ? kSharedWithMaximum
+ : kSharedNoMaximum);
} else {
- buffer->write_u8(has_max_memory_size_ ? MemoryFlags::kMaximum
- : MemoryFlags::kNoMaximum);
+ buffer->write_u8(has_max_memory_size_ ? kWithMaximum : kNoMaximum);
}
buffer->write_u32v(min_memory_size_);
if (has_max_memory_size_) {
diff --git a/deps/v8/src/wasm/wasm-module.cc b/deps/v8/src/wasm/wasm-module.cc
index 37d0c48a46..51b2ebcd93 100644
--- a/deps/v8/src/wasm/wasm-module.cc
+++ b/deps/v8/src/wasm/wasm-module.cc
@@ -137,7 +137,7 @@ void LazilyGeneratedNames::AddForTesting(int function_index,
AsmJsOffsetInformation::AsmJsOffsetInformation(
Vector<const byte> encoded_offsets)
- : encoded_offsets_(OwnedVector<uint8_t>::Of(encoded_offsets)) {}
+ : encoded_offsets_(OwnedVector<const uint8_t>::Of(encoded_offsets)) {}
AsmJsOffsetInformation::~AsmJsOffsetInformation() = default;
@@ -218,16 +218,7 @@ std::ostream& operator<<(std::ostream& os, const WasmFunctionName& name) {
}
WasmModule::WasmModule(std::unique_ptr<Zone> signature_zone)
- : signature_zone(std::move(signature_zone)),
- subtyping_cache(this->signature_zone.get() == nullptr
- ? nullptr
- : new ZoneUnorderedSet<std::pair<uint32_t, uint32_t>>(
- this->signature_zone.get())),
- type_equivalence_cache(
- this->signature_zone.get() == nullptr
- ? nullptr
- : new ZoneUnorderedSet<std::pair<uint32_t, uint32_t>>(
- this->signature_zone.get())) {}
+ : signature_zone(std::move(signature_zone)) {}
bool IsWasmCodegenAllowed(Isolate* isolate, Handle<Context> context) {
// TODO(wasm): Once wasm has its own CSP policy, we should introduce a
@@ -333,9 +324,7 @@ Handle<JSObject> GetTypeForTable(Isolate* isolate, ValueType type,
// place and then use that constant everywhere.
element = factory->InternalizeUtf8String("anyfunc");
} else {
- DCHECK(WasmFeatures::FromFlags().has_reftypes() &&
- type.is_reference_to(HeapType::kExtern));
- element = factory->InternalizeUtf8String("externref");
+ element = factory->InternalizeUtf8String(VectorOf(type.name()));
}
Handle<JSFunction> object_function = isolate->object_function();
diff --git a/deps/v8/src/wasm/wasm-module.h b/deps/v8/src/wasm/wasm-module.h
index 5b8a01f072..2ffc92e390 100644
--- a/deps/v8/src/wasm/wasm-module.h
+++ b/deps/v8/src/wasm/wasm-module.h
@@ -15,7 +15,6 @@
#include "src/wasm/struct-types.h"
#include "src/wasm/wasm-constants.h"
#include "src/wasm/wasm-opcodes.h"
-#include "src/zone/zone-containers.h"
namespace v8 {
@@ -101,17 +100,6 @@ struct WasmDataSegment {
bool active = true; // true if copied automatically during instantiation.
};
-// Static representation of a wasm indirect call table.
-struct WasmTable {
- MOVE_ONLY_WITH_DEFAULT_CONSTRUCTORS(WasmTable);
- ValueType type = kWasmStmt; // table type.
- uint32_t initial_size = 0; // initial table size.
- uint32_t maximum_size = 0; // maximum table size.
- bool has_maximum_size = false; // true if there is a maximum size.
- bool imported = false; // true if imported.
- bool exported = false; // true if exported.
-};
-
// Static representation of wasm element segment (table initializer).
struct WasmElemSegment {
MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(WasmElemSegment);
@@ -269,6 +257,8 @@ struct V8_EXPORT_PRIVATE WasmDebugSymbols {
WireBytesRef external_url;
};
+struct WasmTable;
+
// Static representation of a module.
struct V8_EXPORT_PRIVATE WasmModule {
std::unique_ptr<Zone> signature_zone;
@@ -334,28 +324,6 @@ struct V8_EXPORT_PRIVATE WasmModule {
bool has_array(uint32_t index) const {
return index < types.size() && type_kinds[index] == kWasmArrayTypeCode;
}
- base::RecursiveMutex* type_cache_mutex() const { return &type_cache_mutex_; }
- bool is_cached_subtype(uint32_t subtype, uint32_t supertype) const {
- return subtyping_cache->count(std::make_pair(subtype, supertype)) == 1;
- }
- void cache_subtype(uint32_t subtype, uint32_t supertype) const {
- subtyping_cache->emplace(subtype, supertype);
- }
- void uncache_subtype(uint32_t subtype, uint32_t supertype) const {
- subtyping_cache->erase(std::make_pair(subtype, supertype));
- }
- bool is_cached_equivalent_type(uint32_t type1, uint32_t type2) const {
- if (type1 > type2) std::swap(type1, type2);
- return type_equivalence_cache->count(std::make_pair(type1, type2)) == 1;
- }
- void cache_type_equivalence(uint32_t type1, uint32_t type2) const {
- if (type1 > type2) std::swap(type1, type2);
- type_equivalence_cache->emplace(type1, type2);
- }
- void uncache_type_equivalence(uint32_t type1, uint32_t type2) const {
- if (type1 > type2) std::swap(type1, type2);
- type_equivalence_cache->erase(std::make_pair(type1, type2));
- }
std::vector<WasmFunction> functions;
std::vector<WasmDataSegment> data_segments;
@@ -378,20 +346,33 @@ struct V8_EXPORT_PRIVATE WasmModule {
explicit WasmModule(std::unique_ptr<Zone> signature_zone = nullptr);
private:
- // Cache for discovered subtyping pairs.
- std::unique_ptr<ZoneUnorderedSet<std::pair<uint32_t, uint32_t>>>
- subtyping_cache;
- // Cache for discovered equivalent type pairs.
- // Indexes are stored in increasing order.
- std::unique_ptr<ZoneUnorderedSet<std::pair<uint32_t, uint32_t>>>
- type_equivalence_cache;
- // The above two caches are used from background compile jobs, so they
- // must be protected from concurrent modifications:
- mutable base::RecursiveMutex type_cache_mutex_;
-
DISALLOW_COPY_AND_ASSIGN(WasmModule);
};
+// Static representation of a wasm indirect call table.
+struct WasmTable {
+ MOVE_ONLY_WITH_DEFAULT_CONSTRUCTORS(WasmTable);
+
+ // 'module' can be nullptr
+ // TODO(9495): Update this function as more table types are supported, or
+ // remove it completely when all reference types are allowed.
+ static bool IsValidTableType(ValueType type, const WasmModule* module) {
+ if (!type.is_nullable()) return false;
+ HeapType heap_type = type.heap_type();
+ return heap_type == HeapType::kFunc || heap_type == HeapType::kExtern ||
+ heap_type == HeapType::kExn ||
+ (module != nullptr && heap_type.is_index() &&
+ module->has_signature(heap_type.ref_index()));
+ }
+
+ ValueType type = kWasmStmt; // table type.
+ uint32_t initial_size = 0; // initial table size.
+ uint32_t maximum_size = 0; // maximum table size.
+ bool has_maximum_size = false; // true if there is a maximum size.
+ bool imported = false; // true if imported.
+ bool exported = false; // true if exported.
+};
+
inline bool is_asmjs_module(const WasmModule* module) {
return module->origin != kWasmOrigin;
}
diff --git a/deps/v8/src/wasm/wasm-objects-inl.h b/deps/v8/src/wasm/wasm-objects-inl.h
index da4a1c2b5e..984c6d0f5b 100644
--- a/deps/v8/src/wasm/wasm-objects-inl.h
+++ b/deps/v8/src/wasm/wasm-objects-inl.h
@@ -13,6 +13,7 @@
#include "src/objects/foreign-inl.h"
#include "src/objects/heap-number-inl.h"
#include "src/objects/js-array-buffer-inl.h"
+#include "src/objects/js-function-inl.h"
#include "src/objects/js-objects-inl.h"
#include "src/objects/managed.h"
#include "src/objects/oddball-inl.h"
@@ -108,6 +109,7 @@ bool WasmModuleObject::is_asm_js() {
}
// WasmTableObject
+ACCESSORS(WasmTableObject, instance, HeapObject, kInstanceOffset)
ACCESSORS(WasmTableObject, entries, FixedArray, kEntriesOffset)
SMI_ACCESSORS(WasmTableObject, current_length, kCurrentLengthOffset)
ACCESSORS(WasmTableObject, maximum_length, Object, kMaximumLengthOffset)
@@ -120,6 +122,7 @@ SMI_ACCESSORS(WasmMemoryObject, maximum_pages, kMaximumPagesOffset)
OPTIONAL_ACCESSORS(WasmMemoryObject, instances, WeakArrayList, kInstancesOffset)
// WasmGlobalObject
+ACCESSORS(WasmGlobalObject, instance, HeapObject, kInstanceOffset)
ACCESSORS(WasmGlobalObject, untagged_buffer, JSArrayBuffer,
kUntaggedBufferOffset)
ACCESSORS(WasmGlobalObject, tagged_buffer, FixedArray, kTaggedBufferOffset)
@@ -130,7 +133,7 @@ SMI_ACCESSORS(WasmGlobalObject, raw_type, kRawTypeOffset)
SMI_ACCESSORS(WasmGlobalObject, is_mutable, kIsMutableOffset)
wasm::ValueType WasmGlobalObject::type() const {
- return wasm::ValueType::FromRawBitField(raw_type());
+ return wasm::ValueType::FromRawBitField(static_cast<uint32_t>(raw_type()));
}
void WasmGlobalObject::set_type(wasm::ValueType value) {
set_raw_type(static_cast<int>(value.raw_bit_field()));
@@ -330,7 +333,7 @@ ACCESSORS(WasmExportedFunctionData, c_wrapper_code, Object, kCWrapperCodeOffset)
ACCESSORS(WasmExportedFunctionData, wasm_call_target, Object,
kWasmCallTargetOffset)
SMI_ACCESSORS(WasmExportedFunctionData, packed_args_size, kPackedArgsSizeOffset)
-SMI_ACCESSORS(WasmExportedFunctionData, signature_type, kSignatureTypeOffset)
+ACCESSORS(WasmExportedFunctionData, signature, Foreign, kSignatureOffset)
// WasmJSFunction
WasmJSFunction::WasmJSFunction(Address ptr) : JSFunction(ptr) {
diff --git a/deps/v8/src/wasm/wasm-objects.cc b/deps/v8/src/wasm/wasm-objects.cc
index 5205153d8c..cf78ab5ff3 100644
--- a/deps/v8/src/wasm/wasm-objects.cc
+++ b/deps/v8/src/wasm/wasm-objects.cc
@@ -27,6 +27,7 @@
#include "src/wasm/wasm-limits.h"
#include "src/wasm/wasm-module.h"
#include "src/wasm/wasm-objects-inl.h"
+#include "src/wasm/wasm-subtyping.h"
#include "src/wasm/wasm-value.h"
#define TRACE_IFT(...) \
@@ -256,13 +257,16 @@ Vector<const uint8_t> WasmModuleObject::GetRawFunctionName(
return Vector<const uint8_t>::cast(name);
}
-Handle<WasmTableObject> WasmTableObject::New(Isolate* isolate,
- wasm::ValueType type,
- uint32_t initial, bool has_maximum,
- uint32_t maximum,
- Handle<FixedArray>* entries) {
+Handle<WasmTableObject> WasmTableObject::New(
+ Isolate* isolate, Handle<WasmInstanceObject> instance, wasm::ValueType type,
+ uint32_t initial, bool has_maximum, uint32_t maximum,
+ Handle<FixedArray>* entries) {
// TODO(7748): Make this work with other types when spec clears up.
- CHECK(type.is_nullable());
+ {
+ const WasmModule* module =
+ instance.is_null() ? nullptr : instance->module();
+ CHECK(wasm::WasmTable::IsValidTableType(type, module));
+ }
Handle<FixedArray> backing_store = isolate->factory()->NewFixedArray(initial);
Object null = ReadOnlyRoots(isolate).null_value();
@@ -283,6 +287,7 @@ Handle<WasmTableObject> WasmTableObject::New(Isolate* isolate,
isolate->factory()->NewJSObject(table_ctor));
DisallowHeapAllocation no_gc;
+ if (!instance.is_null()) table_obj->set_instance(*instance);
table_obj->set_entries(*backing_store);
table_obj->set_current_length(initial);
table_obj->set_maximum_length(*max);
@@ -387,34 +392,20 @@ bool WasmTableObject::IsInBounds(Isolate* isolate,
bool WasmTableObject::IsValidElement(Isolate* isolate,
Handle<WasmTableObject> table,
Handle<Object> entry) {
- // Anyref and exnref tables take everything.
- if (table->type().is_reference_to(wasm::HeapType::kExtern) ||
- table->type().is_reference_to(wasm::HeapType::kExn)) {
- return true;
- }
- // FuncRef tables can store {null}, {WasmExportedFunction}, {WasmJSFunction},
- // or {WasmCapiFunction} objects.
- if (entry->IsNull(isolate)) return true;
- return WasmExportedFunction::IsWasmExportedFunction(*entry) ||
- WasmJSFunction::IsWasmJSFunction(*entry) ||
- WasmCapiFunction::IsWasmCapiFunction(*entry);
-}
-
-void WasmTableObject::Set(Isolate* isolate, Handle<WasmTableObject> table,
- uint32_t index, Handle<Object> entry) {
- // Callers need to perform bounds checks, type check, and error handling.
- DCHECK(IsInBounds(isolate, table, index));
- DCHECK(IsValidElement(isolate, table, entry));
-
- Handle<FixedArray> entries(table->entries(), isolate);
- // The FixedArray is addressed with int's.
- int entry_index = static_cast<int>(index);
- if (table->type().is_reference_to(wasm::HeapType::kExtern) ||
- table->type().is_reference_to(wasm::HeapType::kExn)) {
- entries->set(entry_index, *entry);
- return;
- }
-
+ const char* error_message;
+ const WasmModule* module =
+ !table->instance().IsUndefined()
+ ? WasmInstanceObject::cast(table->instance()).module()
+ : nullptr;
+ return wasm::TypecheckJSObject(isolate, module, entry, table->type(),
+ &error_message);
+}
+
+void WasmTableObject::SetFunctionTableEntry(Isolate* isolate,
+ Handle<WasmTableObject> table,
+ Handle<FixedArray> entries,
+ int entry_index,
+ Handle<Object> entry) {
if (entry->IsNull(isolate)) {
ClearDispatchTables(isolate, table, entry_index); // Degenerate case.
entries->set(entry_index, ReadOnlyRoots(isolate).null_value());
@@ -442,6 +433,44 @@ void WasmTableObject::Set(Isolate* isolate, Handle<WasmTableObject> table,
entries->set(entry_index, *entry);
}
+void WasmTableObject::Set(Isolate* isolate, Handle<WasmTableObject> table,
+ uint32_t index, Handle<Object> entry) {
+ // Callers need to perform bounds checks, type check, and error handling.
+ DCHECK(IsInBounds(isolate, table, index));
+ DCHECK(IsValidElement(isolate, table, entry));
+
+ Handle<FixedArray> entries(table->entries(), isolate);
+ // The FixedArray is addressed with int's.
+ int entry_index = static_cast<int>(index);
+
+ switch (table->type().heap_representation()) {
+ case wasm::HeapType::kExtern:
+ case wasm::HeapType::kExn:
+ entries->set(entry_index, *entry);
+ return;
+ case wasm::HeapType::kFunc:
+ SetFunctionTableEntry(isolate, table, entries, entry_index, entry);
+ return;
+ case wasm::HeapType::kEq:
+ case wasm::HeapType::kI31:
+ // TODO(7748): Implement once we have a story for struct/arrays/i31ref in
+ // JS.
+ UNIMPLEMENTED();
+ case wasm::HeapType::kBottom:
+ UNREACHABLE();
+ default:
+ DCHECK(!table->instance().IsUndefined());
+ if (WasmInstanceObject::cast(table->instance())
+ .module()
+ ->has_signature(entry_index)) {
+ SetFunctionTableEntry(isolate, table, entries, entry_index, entry);
+ return;
+ }
+ // TODO(7748): Implement once we have a story for struct/arrays in JS.
+ UNIMPLEMENTED();
+ }
+}
+
Handle<Object> WasmTableObject::Get(Isolate* isolate,
Handle<WasmTableObject> table,
uint32_t index) {
@@ -454,21 +483,42 @@ Handle<Object> WasmTableObject::Get(Isolate* isolate,
Handle<Object> entry(entries->get(entry_index), isolate);
- // First we handle the easy externref and exnref table case.
- if (table->type().is_reference_to(wasm::HeapType::kExtern) ||
- table->type().is_reference_to(wasm::HeapType::kExn)) {
- return entry;
- }
-
- // Now we handle the funcref case.
- if (WasmExportedFunction::IsWasmExportedFunction(*entry) ||
- WasmJSFunction::IsWasmJSFunction(*entry) ||
- WasmCapiFunction::IsWasmCapiFunction(*entry)) {
+ if (entry->IsNull(isolate)) {
return entry;
}
- if (entry->IsNull(isolate)) {
- return entry;
+ switch (table->type().heap_representation()) {
+ case wasm::HeapType::kExtern:
+ case wasm::HeapType::kExn:
+ return entry;
+ case wasm::HeapType::kFunc:
+ if (WasmExportedFunction::IsWasmExportedFunction(*entry) ||
+ WasmJSFunction::IsWasmJSFunction(*entry) ||
+ WasmCapiFunction::IsWasmCapiFunction(*entry)) {
+ return entry;
+ }
+ break;
+ case wasm::HeapType::kEq:
+ case wasm::HeapType::kI31:
+ // TODO(7748): Implement once we have a story for struct/arrays/i31ref in
+ // JS.
+ UNIMPLEMENTED();
+ case wasm::HeapType::kBottom:
+ UNREACHABLE();
+ default:
+ DCHECK(!table->instance().IsUndefined());
+ if (WasmInstanceObject::cast(table->instance())
+ .module()
+ ->has_signature(entry_index)) {
+ if (WasmExportedFunction::IsWasmExportedFunction(*entry) ||
+ WasmJSFunction::IsWasmJSFunction(*entry) ||
+ WasmCapiFunction::IsWasmCapiFunction(*entry)) {
+ return entry;
+ }
+ break;
+ }
+ // TODO(7748): Implement once we have a story for struct/arrays in JS.
+ UNIMPLEMENTED();
}
// {entry} is not a valid entry in the table. It has to be a placeholder
@@ -631,10 +681,11 @@ void WasmTableObject::SetFunctionTablePlaceholder(
}
void WasmTableObject::GetFunctionTableEntry(
- Isolate* isolate, Handle<WasmTableObject> table, int entry_index,
- bool* is_valid, bool* is_null, MaybeHandle<WasmInstanceObject>* instance,
- int* function_index, MaybeHandle<WasmJSFunction>* maybe_js_function) {
- DCHECK(table->type().is_reference_to(wasm::HeapType::kFunc));
+ Isolate* isolate, const WasmModule* module, Handle<WasmTableObject> table,
+ int entry_index, bool* is_valid, bool* is_null,
+ MaybeHandle<WasmInstanceObject>* instance, int* function_index,
+ MaybeHandle<WasmJSFunction>* maybe_js_function) {
+ DCHECK(wasm::IsSubtypeOf(table->type(), wasm::kWasmFuncRef, module));
DCHECK_LT(entry_index, table->current_length());
// We initialize {is_valid} with {true}. We may change it later.
*is_valid = true;
@@ -863,16 +914,15 @@ int32_t WasmMemoryObject::Grow(Isolate* isolate,
if (old_buffer->is_asmjs_memory()) return -1;
// Checks for maximum memory size.
- uint32_t maximum_pages = wasm::max_maximum_mem_pages();
+ uint32_t maximum_pages = wasm::max_mem_pages();
if (memory_object->has_maximum_pages()) {
maximum_pages = std::min(
maximum_pages, static_cast<uint32_t>(memory_object->maximum_pages()));
}
- DCHECK_GE(wasm::max_maximum_mem_pages(), maximum_pages);
size_t old_size = old_buffer->byte_length();
DCHECK_EQ(0, old_size % wasm::kWasmPageSize);
size_t old_pages = old_size / wasm::kWasmPageSize;
- CHECK_GE(wasm::max_maximum_mem_pages(), old_pages);
+ CHECK_GE(wasm::max_mem_pages(), old_pages);
if (pages > maximum_pages - old_pages) return -1;
std::shared_ptr<BackingStore> backing_store = old_buffer->GetBackingStore();
if (!backing_store) return -1;
@@ -940,7 +990,8 @@ int32_t WasmMemoryObject::Grow(Isolate* isolate,
// static
MaybeHandle<WasmGlobalObject> WasmGlobalObject::New(
- Isolate* isolate, MaybeHandle<JSArrayBuffer> maybe_untagged_buffer,
+ Isolate* isolate, Handle<WasmInstanceObject> instance,
+ MaybeHandle<JSArrayBuffer> maybe_untagged_buffer,
MaybeHandle<FixedArray> maybe_tagged_buffer, wasm::ValueType type,
int32_t offset, bool is_mutable) {
Handle<JSFunction> global_ctor(
@@ -950,8 +1001,7 @@ MaybeHandle<WasmGlobalObject> WasmGlobalObject::New(
{
// Disallow GC until all fields have acceptable types.
DisallowHeapAllocation no_gc;
-
- global_obj->set_raw_type(0);
+ if (!instance.is_null()) global_obj->set_instance(*instance);
global_obj->set_type(type);
global_obj->set_offset(offset);
global_obj->set_is_mutable(is_mutable);
@@ -1091,7 +1141,7 @@ void ImportedFunctionEntry::SetWasmToWasm(WasmInstanceObject instance,
WasmInstanceObject ImportedFunctionEntry::instance() {
// The imported reference entry is either a target instance or a tuple
// of this instance and the target callable.
- Object value = instance_->imported_function_refs().get(index_);
+ Object value = object_ref();
if (value.IsWasmInstanceObject()) {
return WasmInstanceObject::cast(value);
}
@@ -1099,6 +1149,15 @@ WasmInstanceObject ImportedFunctionEntry::instance() {
return WasmInstanceObject::cast(tuple.value1());
}
+// Returns an empty Object() if no callable is available, a JSReceiver
+// otherwise.
+Object ImportedFunctionEntry::maybe_callable() {
+ Object value = object_ref();
+ if (!value.IsTuple2()) return Object();
+ Tuple2 tuple = Tuple2::cast(value);
+ return JSReceiver::cast(tuple.value2());
+}
+
JSReceiver ImportedFunctionEntry::callable() {
return JSReceiver::cast(Tuple2::cast(object_ref()).value2());
}
@@ -1395,7 +1454,7 @@ WasmInstanceObject::GetOrCreateWasmExternalFunction(
// this signature. We compile it and store the wrapper in the module for
// later use.
wrapper = wasm::JSToWasmWrapperCompilationUnit::CompileJSToWasmWrapper(
- isolate, function.sig, function.imported);
+ isolate, function.sig, instance->module(), function.imported);
module_object->export_wrappers().set(wrapper_index, *wrapper);
}
result = Handle<WasmExternalFunction>::cast(WasmExportedFunction::New(
@@ -1443,7 +1502,8 @@ void WasmInstanceObject::ImportWasmJSFunctionIntoTable(
instance->module_object().native_module();
// TODO(wasm): Cache and reuse wrapper code.
const wasm::WasmFeatures enabled = native_module->enabled_features();
- auto resolved = compiler::ResolveWasmImportCall(callable, sig, enabled);
+ auto resolved = compiler::ResolveWasmImportCall(
+ callable, sig, instance->module(), enabled);
compiler::WasmImportCallKind kind = resolved.first;
callable = resolved.second; // Update to ultimate target.
DCHECK_NE(compiler::WasmImportCallKind::kLinkError, kind);
@@ -1614,7 +1674,7 @@ Handle<WasmExceptionObject> WasmExceptionObject::New(
return exception;
}
-bool WasmExceptionObject::IsSignatureEqual(const wasm::FunctionSig* sig) {
+bool WasmExceptionObject::MatchesSignature(const wasm::FunctionSig* sig) {
DCHECK_EQ(0, sig->return_count());
DCHECK_LE(sig->parameter_count(), std::numeric_limits<int>::max());
int sig_size = static_cast<int>(sig->parameter_count());
@@ -1627,7 +1687,7 @@ bool WasmExceptionObject::IsSignatureEqual(const wasm::FunctionSig* sig) {
return true;
}
-bool WasmCapiFunction::IsSignatureEqual(const wasm::FunctionSig* sig) const {
+bool WasmCapiFunction::MatchesSignature(const wasm::FunctionSig* sig) const {
// TODO(jkummerow): Unify with "SignatureHelper" in c-api.cc.
int param_count = static_cast<int>(sig->parameter_count());
int result_count = static_cast<int>(sig->return_count());
@@ -1814,6 +1874,9 @@ Handle<WasmExportedFunction> WasmExportedFunction::New(
DCHECK_GE(kMaxInt, jump_table_diff);
jump_table_offset = static_cast<int>(jump_table_diff);
}
+ const wasm::FunctionSig* sig = instance->module()->functions[func_index].sig;
+ Handle<Foreign> sig_foreign =
+ isolate->factory()->NewForeign(reinterpret_cast<Address>(sig));
Handle<WasmExportedFunctionData> function_data =
Handle<WasmExportedFunctionData>::cast(isolate->factory()->NewStruct(
WASM_EXPORTED_FUNCTION_DATA_TYPE, AllocationType::kOld));
@@ -1824,9 +1887,7 @@ Handle<WasmExportedFunction> WasmExportedFunction::New(
function_data->set_c_wrapper_code(Smi::zero(), SKIP_WRITE_BARRIER);
function_data->set_wasm_call_target(Smi::zero(), SKIP_WRITE_BARRIER);
function_data->set_packed_args_size(0);
- const wasm::FunctionSig* sig = instance->module()->functions[func_index].sig;
- sig->parameters().empty() ? function_data->set_signature_type(0)
- : function_data->set_signature_type(1);
+ function_data->set_signature(*sig_foreign);
MaybeHandle<String> maybe_name;
bool is_asm_js_module = instance->module_object().is_asm_js();
@@ -1911,7 +1972,7 @@ Handle<WasmJSFunction> WasmJSFunction::New(Isolate* isolate,
// TODO(wasm): Think about caching and sharing the JS-to-JS wrappers per
// signature instead of compiling a new one for every instantiation.
Handle<Code> wrapper_code =
- compiler::CompileJSToJSWrapper(isolate, sig).ToHandleChecked();
+ compiler::CompileJSToJSWrapper(isolate, sig, nullptr).ToHandleChecked();
Handle<WasmJSFunctionData> function_data =
Handle<WasmJSFunctionData>::cast(isolate->factory()->NewStruct(
WASM_JS_FUNCTION_DATA_TYPE, AllocationType::kOld));
@@ -2007,6 +2068,119 @@ Handle<AsmWasmData> AsmWasmData::New(
return result;
}
+namespace wasm {
+
+bool TypecheckJSObject(Isolate* isolate, const WasmModule* module,
+ Handle<Object> value, ValueType expected,
+ const char** error_message) {
+ DCHECK(expected.is_reference_type());
+ switch (expected.kind()) {
+ case ValueType::kOptRef:
+ if (value->IsNull(isolate)) return true;
+ V8_FALLTHROUGH;
+ case ValueType::kRef:
+ switch (expected.heap_representation()) {
+ case HeapType::kFunc: {
+ if (!(WasmExternalFunction::IsWasmExternalFunction(*value) ||
+ WasmCapiFunction::IsWasmCapiFunction(*value))) {
+ *error_message =
+ "function-typed object must be null (if nullable) or a Wasm "
+ "function object";
+ return false;
+ }
+ return true;
+ }
+ case HeapType::kExtern:
+ case HeapType::kExn:
+ return true;
+ case HeapType::kEq: {
+ // TODO(7748): Change this when we have a decision on the JS API for
+ // structs/arrays.
+ Handle<Name> key = isolate->factory()->wasm_wrapped_object_symbol();
+ LookupIterator it(isolate, value, key,
+ LookupIterator::OWN_SKIP_INTERCEPTOR);
+ if (it.state() == LookupIterator::DATA) return true;
+ *error_message =
+ "eqref object must be null (if nullable) or wrapped with wasm "
+ "object wrapper";
+ return false;
+ }
+ case HeapType::kI31:
+ // TODO(7748): Implement when the JS API for i31ref is decided on.
+ *error_message = "Assigning JS objects to i31ref not supported yet.";
+ return false;
+ default:
+ // Tables defined outside a module can't refer to user-defined types.
+ if (module == nullptr) return false;
+ DCHECK(module->has_type(expected.ref_index()));
+ if (module->has_signature(expected.ref_index())) {
+ if (WasmExportedFunction::IsWasmExportedFunction(*value)) {
+ WasmExportedFunction function =
+ WasmExportedFunction::cast(*value);
+ const WasmModule* exporting_module = function.instance().module();
+ ValueType real_type = ValueType::Ref(
+ exporting_module->functions[function.function_index()]
+ .sig_index,
+ kNonNullable);
+ if (!IsSubtypeOf(real_type, expected, exporting_module, module)) {
+ *error_message =
+ "assigned exported function has to be a subtype of the "
+ "expected type";
+ return false;
+ }
+ return true;
+ }
+
+ if (WasmJSFunction::IsWasmJSFunction(*value)) {
+ // Since a WasmJSFunction cannot refer to indexed types (definable
+ // only in a module), we do not need to use EquivalentTypes().
+ if (!WasmJSFunction::cast(*value).MatchesSignature(
+ module->signature(expected.ref_index()))) {
+ *error_message =
+ "assigned WasmJSFunction has to be a subtype of the "
+ "expected type";
+ return false;
+ }
+ return true;
+ }
+
+ if (WasmCapiFunction::IsWasmCapiFunction(*value)) {
+ if (!WasmCapiFunction::cast(*value).MatchesSignature(
+ module->signature(expected.ref_index()))) {
+ // Since a WasmCapiFunction cannot refer to indexed types
+ // (definable in a module), we don't need to invoke
+ // IsEquivalentType();
+ *error_message =
+ "assigned WasmCapiFunction has to be a subtype of the "
+ "expected type";
+ return false;
+ }
+ return true;
+ }
+
+ *error_message =
+ "function-typed object must be null (if nullable) or a Wasm "
+ "function object";
+
+ return false;
+ }
+ // TODO(7748): Implement when the JS API for structs/arrays is decided
+ // on.
+ *error_message =
+ "Assigning to struct/array globals not supported yet.";
+ return false;
+ }
+ case ValueType::kRtt:
+ // TODO(7748): Implement when the JS API for rtts is decided on.
+ *error_message = "Assigning to rtt globals not supported yet.";
+ return false;
+ default:
+ UNREACHABLE();
+ }
+}
+
+} // namespace wasm
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/src/wasm/wasm-objects.h b/deps/v8/src/wasm/wasm-objects.h
index 21a53824b1..d269c8df4f 100644
--- a/deps/v8/src/wasm/wasm-objects.h
+++ b/deps/v8/src/wasm/wasm-objects.h
@@ -16,7 +16,7 @@
#include "src/objects/objects.h"
#include "src/wasm/struct-types.h"
#include "src/wasm/value-type.h"
-#include "torque-generated/class-definitions-tq.h"
+#include "torque-generated/class-definitions.h"
// Has to be the last include (doesn't have include guards)
#include "src/objects/object-macros.h"
@@ -24,16 +24,11 @@
namespace v8 {
namespace internal {
namespace wasm {
-struct CompilationEnv;
class InterpretedFrame;
-struct InterpretedFrameDeleter;
class NativeModule;
-class SignatureMap;
class WasmCode;
struct WasmException;
-class WasmFeatures;
struct WasmGlobal;
-class WasmInterpreter;
struct WasmModule;
class WasmValue;
class WireBytesRef;
@@ -113,6 +108,7 @@ class ImportedFunctionEntry {
WasmInstanceObject instance();
JSReceiver callable();
+ Object maybe_callable();
Object object_ref();
Address target();
@@ -196,6 +192,11 @@ class V8_EXPORT_PRIVATE WasmTableObject : public JSObject {
public:
DECL_CAST(WasmTableObject)
+ // The instance in which this WasmTableObject is defined.
+ // This field is undefined if the global is defined outside any Wasm module,
+ // i.e., through the JS API (WebAssembly.Table).
+ // Because it might be undefined, we declare it as a HeapObject.
+ DECL_ACCESSORS(instance, HeapObject)
// The entries array is at least as big as {current_length()}, but might be
// bigger to make future growth more efficient.
DECL_ACCESSORS(entries, FixedArray)
@@ -217,9 +218,10 @@ class V8_EXPORT_PRIVATE WasmTableObject : public JSObject {
static int Grow(Isolate* isolate, Handle<WasmTableObject> table,
uint32_t count, Handle<Object> init_value);
- static Handle<WasmTableObject> New(Isolate* isolate, wasm::ValueType type,
- uint32_t initial, bool has_maximum,
- uint32_t maximum,
+ static Handle<WasmTableObject> New(Isolate* isolate,
+ Handle<WasmInstanceObject> instance,
+ wasm::ValueType type, uint32_t initial,
+ bool has_maximum, uint32_t maximum,
Handle<FixedArray>* entries);
static void AddDispatchTable(Isolate* isolate, Handle<WasmTableObject> table,
@@ -270,10 +272,17 @@ class V8_EXPORT_PRIVATE WasmTableObject : public JSObject {
// through the out parameters {is_valid}, {is_null}, {instance},
// {function_index}, and {maybe_js_function}.
static void GetFunctionTableEntry(
- Isolate* isolate, Handle<WasmTableObject> table, int entry_index,
- bool* is_valid, bool* is_null, MaybeHandle<WasmInstanceObject>* instance,
+ Isolate* isolate, const wasm::WasmModule* module,
+ Handle<WasmTableObject> table, int entry_index, bool* is_valid,
+ bool* is_null, MaybeHandle<WasmInstanceObject>* instance,
int* function_index, MaybeHandle<WasmJSFunction>* maybe_js_function);
+ private:
+ static void SetFunctionTableEntry(Isolate* isolate,
+ Handle<WasmTableObject> table,
+ Handle<FixedArray> entries, int entry_index,
+ Handle<Object> entry);
+
OBJECT_CONSTRUCTORS(WasmTableObject, JSObject);
};
@@ -320,6 +329,11 @@ class WasmGlobalObject : public JSObject {
public:
DECL_CAST(WasmGlobalObject)
+ // The instance in which this WasmGlobalObject is defined.
+ // This field is undefined if the global is defined outside any Wasm module,
+ // i.e., through the JS API (WebAssembly.Global).
+ // Because it might be undefined, we declare it as a HeapObject.
+ DECL_ACCESSORS(instance, HeapObject)
DECL_ACCESSORS(untagged_buffer, JSArrayBuffer)
DECL_ACCESSORS(tagged_buffer, FixedArray)
DECL_INT32_ACCESSORS(offset)
@@ -337,7 +351,8 @@ class WasmGlobalObject : public JSObject {
TORQUE_GENERATED_WASM_GLOBAL_OBJECT_FIELDS)
V8_EXPORT_PRIVATE static MaybeHandle<WasmGlobalObject> New(
- Isolate* isolate, MaybeHandle<JSArrayBuffer> maybe_untagged_buffer,
+ Isolate* isolate, Handle<WasmInstanceObject> instance,
+ MaybeHandle<JSArrayBuffer> maybe_untagged_buffer,
MaybeHandle<FixedArray> maybe_tagged_buffer, wasm::ValueType type,
int32_t offset, bool is_mutable);
@@ -604,7 +619,7 @@ class WasmExceptionObject : public JSObject {
// Checks whether the given {sig} has the same parameter types as the
// serialized signature stored within this exception object.
- bool IsSignatureEqual(const wasm::FunctionSig* sig);
+ bool MatchesSignature(const wasm::FunctionSig* sig);
static Handle<WasmExceptionObject> New(Isolate* isolate,
const wasm::FunctionSig* sig,
@@ -688,7 +703,7 @@ class WasmCapiFunction : public JSFunction {
PodArray<wasm::ValueType> GetSerializedSignature() const;
// Checks whether the given {sig} has the same parameter types as the
// serialized signature stored within this C-API function object.
- bool IsSignatureEqual(const wasm::FunctionSig* sig) const;
+ bool MatchesSignature(const wasm::FunctionSig* sig) const;
DECL_CAST(WasmCapiFunction)
OBJECT_CONSTRUCTORS(WasmCapiFunction, JSFunction);
@@ -768,7 +783,7 @@ class WasmExportedFunctionData : public Struct {
DECL_ACCESSORS(c_wrapper_code, Object)
DECL_ACCESSORS(wasm_call_target, Object)
DECL_INT_ACCESSORS(packed_args_size)
- DECL_INT_ACCESSORS(signature_type)
+ DECL_ACCESSORS(signature, Foreign)
DECL_CAST(WasmExportedFunctionData)
@@ -956,6 +971,9 @@ Handle<Map> AllocateSubRtt(Isolate* isolate,
Handle<WasmInstanceObject> instance, uint32_t type,
Handle<Map> parent);
+bool TypecheckJSObject(Isolate* isolate, const WasmModule* module,
+ Handle<Object> value, ValueType expected,
+ const char** error_message);
} // namespace wasm
} // namespace internal
diff --git a/deps/v8/src/wasm/wasm-objects.tq b/deps/v8/src/wasm/wasm-objects.tq
index 789c67e099..bd1fdfd783 100644
--- a/deps/v8/src/wasm/wasm-objects.tq
+++ b/deps/v8/src/wasm/wasm-objects.tq
@@ -2,6 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+type PodArrayOfWasmValueType extends ByteArray
+constexpr 'PodArray<wasm::ValueType>';
+type ManagedWasmNativeModule extends Foreign
+constexpr 'Managed<wasm::NativeModule>';
+type WasmValueType extends uint8 constexpr 'wasm::ValueType::Kind';
+
extern class WasmInstanceObject extends JSObject;
extern class WasmExportedFunctionData extends Struct {
@@ -14,7 +20,7 @@ extern class WasmExportedFunctionData extends Struct {
c_wrapper_code: Object;
wasm_call_target: Smi|Foreign;
packed_args_size: Smi;
- signature_type: Smi;
+ signature: Foreign;
}
extern class WasmJSFunctionData extends Struct {
@@ -22,14 +28,14 @@ extern class WasmJSFunctionData extends Struct {
wrapper_code: Code;
serialized_return_count: Smi;
serialized_parameter_count: Smi;
- serialized_signature: ByteArray; // PodArray<wasm::ValueType>
+ serialized_signature: PodArrayOfWasmValueType;
}
extern class WasmCapiFunctionData extends Struct {
call_target: RawPtr;
embedder_data: Foreign; // Managed<wasm::FuncData>
wrapper_code: Code;
- serialized_signature: ByteArray; // PodArray<wasm::ValueType>
+ serialized_signature: PodArrayOfWasmValueType;
}
extern class WasmIndirectFunctionTable extends Struct {
@@ -51,12 +57,13 @@ extern class WasmExceptionTag extends Struct {
}
extern class WasmModuleObject extends JSObject {
- native_module: Foreign;
+ native_module: ManagedWasmNativeModule;
export_wrappers: FixedArray;
script: Script;
}
extern class WasmTableObject extends JSObject {
+ instance: WasmInstanceObject|Undefined;
entries: FixedArray;
current_length: Smi;
maximum_length: Smi|HeapNumber|Undefined;
@@ -70,9 +77,8 @@ extern class WasmMemoryObject extends JSObject {
instances: WeakArrayList|Undefined;
}
-type WasmValueType extends uint8 constexpr 'wasm::ValueType::Kind';
-
extern class WasmGlobalObject extends JSObject {
+ instance: WasmInstanceObject|Undefined;
untagged_buffer: JSArrayBuffer|Undefined;
tagged_buffer: FixedArray|Undefined;
offset: Smi;
@@ -81,14 +87,14 @@ extern class WasmGlobalObject extends JSObject {
}
extern class WasmExceptionObject extends JSObject {
- serialized_signature: ByteArray; // PodArray<wasm::ValueType>
+ serialized_signature: PodArrayOfWasmValueType;
exception_tag: HeapObject;
}
type WasmExportedFunction extends JSFunction;
extern class AsmWasmData extends Struct {
- managed_native_module: Foreign; // Managed<wasm::NativeModule>
+ managed_native_module: ManagedWasmNativeModule;
export_wrappers: FixedArray;
uses_bitset: HeapNumber;
}
diff --git a/deps/v8/src/wasm/wasm-opcodes-inl.h b/deps/v8/src/wasm/wasm-opcodes-inl.h
index de1aeeb4b0..e050d12947 100644
--- a/deps/v8/src/wasm/wasm-opcodes-inl.h
+++ b/deps/v8/src/wasm/wasm-opcodes-inl.h
@@ -35,7 +35,6 @@ namespace wasm {
#define CASE_S64x2_OP(name, str) CASE_OP(S64x2##name, "s64x2." str)
#define CASE_S32x4_OP(name, str) CASE_OP(S32x4##name, "s32x4." str)
#define CASE_S16x8_OP(name, str) CASE_OP(S16x8##name, "s16x8." str)
-#define CASE_S8x16_OP(name, str) CASE_OP(S8x16##name, "s8x16." str)
#define CASE_V64x2_OP(name, str) CASE_OP(V64x2##name, "v64x2." str)
#define CASE_V32x4_OP(name, str) CASE_OP(V32x4##name, "v32x4." str)
#define CASE_V16x8_OP(name, str) CASE_OP(V16x8##name, "v16x8." str)
@@ -295,8 +294,8 @@ constexpr const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
CASE_S128_OP(Not, "not")
CASE_S128_OP(Select, "select")
CASE_S128_OP(AndNot, "andnot")
- CASE_S8x16_OP(Swizzle, "swizzle")
- CASE_S8x16_OP(Shuffle, "shuffle")
+ CASE_I8x16_OP(Swizzle, "swizzle")
+ CASE_I8x16_OP(Shuffle, "shuffle")
CASE_SIMDV_OP(AnyTrue, "any_true")
CASE_SIMDV_OP(AllTrue, "all_true")
CASE_V64x2_OP(AnyTrue, "any_true")
@@ -306,16 +305,16 @@ constexpr const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
CASE_S128_OP(LoadMem32Zero, "load32_zero")
CASE_S128_OP(LoadMem64Zero, "load64_zero")
- CASE_S8x16_OP(LoadSplat, "load_splat")
- CASE_S16x8_OP(LoadSplat, "load_splat")
- CASE_S32x4_OP(LoadSplat, "load_splat")
- CASE_S64x2_OP(LoadSplat, "load_splat")
- CASE_I16x8_OP(Load8x8S, "load8x8_s")
- CASE_I16x8_OP(Load8x8U, "load8x8_u")
- CASE_I32x4_OP(Load16x4S, "load16x4_s")
- CASE_I32x4_OP(Load16x4U, "load16x4_u")
- CASE_I64x2_OP(Load32x2S, "load32x2_s")
- CASE_I64x2_OP(Load32x2U, "load32x2_u")
+ CASE_S128_OP(Load8Splat, "load8_splat")
+ CASE_S128_OP(Load16Splat, "load16_splat")
+ CASE_S128_OP(Load32Splat, "load32_splat")
+ CASE_S128_OP(Load64Splat, "load64_splat")
+ CASE_S128_OP(Load8x8S, "load8x8_s")
+ CASE_S128_OP(Load8x8U, "load8x8_u")
+ CASE_S128_OP(Load16x4S, "load16x4_s")
+ CASE_S128_OP(Load16x4U, "load16x4_u")
+ CASE_S128_OP(Load32x2S, "load32x2_s")
+ CASE_S128_OP(Load32x2U, "load32x2_u")
CASE_I8x16_OP(RoundingAverageU, "avgr_u")
CASE_I16x8_OP(RoundingAverageU, "avgr_u")
@@ -413,7 +412,6 @@ constexpr const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
#undef CASE_S64x2_OP
#undef CASE_S32x4_OP
#undef CASE_S16x8_OP
-#undef CASE_S8x16_OP
#undef CASE_INT_OP
#undef CASE_FLOAT_OP
#undef CASE_ALL_OP
diff --git a/deps/v8/src/wasm/wasm-opcodes.cc b/deps/v8/src/wasm/wasm-opcodes.cc
index df3e87f49c..cdd3c8d11c 100644
--- a/deps/v8/src/wasm/wasm-opcodes.cc
+++ b/deps/v8/src/wasm/wasm-opcodes.cc
@@ -8,6 +8,7 @@
#include "src/codegen/signature.h"
#include "src/wasm/wasm-features.h"
+#include "src/wasm/wasm-module.h"
#include "src/wasm/wasm-opcodes-inl.h"
namespace v8 {
@@ -27,29 +28,25 @@ std::ostream& operator<<(std::ostream& os, const FunctionSig& sig) {
return os;
}
-bool IsJSCompatibleSignature(const FunctionSig* sig,
+// TODO(7748): Once we have a story for JS interaction of structs/arrays, this
+// function should become independent of module. Remove 'module' parameter in
+// this function as well as all transitive callees that no longer need it
+// (In essence, revert
+// https://chromium-review.googlesource.com/c/v8/v8/+/2413251).
+bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmModule* module,
const WasmFeatures& enabled_features) {
if (!enabled_features.has_mv() && sig->return_count() > 1) {
return false;
}
for (auto type : sig->all()) {
- if (!enabled_features.has_bigint() && type == kWasmI64) {
+ // TODO(7748): Allow structs, arrays, rtts and i31s when their
+ // JS-interaction is decided on.
+ if ((type == kWasmI64 && !enabled_features.has_bigint()) ||
+ type == kWasmS128 || type.is_reference_to(HeapType::kI31) ||
+ (type.has_index() && !module->has_signature(type.ref_index())) ||
+ type.is_rtt()) {
return false;
}
-
- if (type == kWasmS128) return false;
-
- if (type.is_object_reference_type()) {
- uint32_t representation = type.heap_representation();
- // TODO(7748): Once there's a story for JS interop for struct/array types,
- // allow them here.
- if (!(representation == HeapType::kExtern ||
- representation == HeapType::kExn ||
- representation == HeapType::kFunc ||
- representation == HeapType::kEq)) {
- return false;
- }
- }
}
return true;
}
diff --git a/deps/v8/src/wasm/wasm-opcodes.h b/deps/v8/src/wasm/wasm-opcodes.h
index d5e78a8cf1..04767f53a2 100644
--- a/deps/v8/src/wasm/wasm-opcodes.h
+++ b/deps/v8/src/wasm/wasm-opcodes.h
@@ -18,9 +18,11 @@ namespace internal {
namespace wasm {
class WasmFeatures;
+struct WasmModule;
std::ostream& operator<<(std::ostream& os, const FunctionSig& function);
-bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
+bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmModule* module,
+ const WasmFeatures&);
// Control expressions and blocks.
#define FOREACH_CONTROL_OPCODE(V) \
@@ -275,24 +277,24 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
#define FOREACH_SIMD_MEM_OPCODE(V) \
V(S128LoadMem, 0xfd00, s_i) \
- V(I16x8Load8x8S, 0xfd01, s_i) \
- V(I16x8Load8x8U, 0xfd02, s_i) \
- V(I32x4Load16x4S, 0xfd03, s_i) \
- V(I32x4Load16x4U, 0xfd04, s_i) \
- V(I64x2Load32x2S, 0xfd05, s_i) \
- V(I64x2Load32x2U, 0xfd06, s_i) \
- V(S8x16LoadSplat, 0xfd07, s_i) \
- V(S16x8LoadSplat, 0xfd08, s_i) \
- V(S32x4LoadSplat, 0xfd09, s_i) \
- V(S64x2LoadSplat, 0xfd0a, s_i) \
+ V(S128Load8x8S, 0xfd01, s_i) \
+ V(S128Load8x8U, 0xfd02, s_i) \
+ V(S128Load16x4S, 0xfd03, s_i) \
+ V(S128Load16x4U, 0xfd04, s_i) \
+ V(S128Load32x2S, 0xfd05, s_i) \
+ V(S128Load32x2U, 0xfd06, s_i) \
+ V(S128Load8Splat, 0xfd07, s_i) \
+ V(S128Load16Splat, 0xfd08, s_i) \
+ V(S128Load32Splat, 0xfd09, s_i) \
+ V(S128Load64Splat, 0xfd0a, s_i) \
V(S128StoreMem, 0xfd0b, v_is)
#define FOREACH_SIMD_CONST_OPCODE(V) V(S128Const, 0xfd0c, _)
-#define FOREACH_SIMD_MASK_OPERAND_OPCODE(V) V(S8x16Shuffle, 0xfd0d, s_ss)
+#define FOREACH_SIMD_MASK_OPERAND_OPCODE(V) V(I8x16Shuffle, 0xfd0d, s_ss)
#define FOREACH_SIMD_MVP_0_OPERAND_OPCODE(V) \
- V(S8x16Swizzle, 0xfd0e, s_ss) \
+ V(I8x16Swizzle, 0xfd0e, s_ss) \
V(I8x16Splat, 0xfd0f, s_i) \
V(I16x8Splat, 0xfd10, s_i) \
V(I32x4Splat, 0xfd11, s_i) \
@@ -351,6 +353,7 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
V(I8x16Neg, 0xfd61, s_s) \
V(V8x16AnyTrue, 0xfd62, i_s) \
V(V8x16AllTrue, 0xfd63, i_s) \
+ V(I8x16BitMask, 0xfd64, i_s) \
V(I8x16SConvertI16x8, 0xfd65, s_ss) \
V(I8x16UConvertI16x8, 0xfd66, s_ss) \
V(I8x16Shl, 0xfd6b, s_si) \
@@ -371,6 +374,7 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
V(I16x8Neg, 0xfd81, s_s) \
V(V16x8AnyTrue, 0xfd82, i_s) \
V(V16x8AllTrue, 0xfd83, i_s) \
+ V(I16x8BitMask, 0xfd84, i_s) \
V(I16x8SConvertI32x4, 0xfd85, s_ss) \
V(I16x8UConvertI32x4, 0xfd86, s_ss) \
V(I16x8SConvertI8x16Low, 0xfd87, s_s) \
@@ -396,6 +400,7 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
V(I32x4Neg, 0xfda1, s_s) \
V(V32x4AnyTrue, 0xfda2, i_s) \
V(V32x4AllTrue, 0xfda3, i_s) \
+ V(I32x4BitMask, 0xfda4, i_s) \
V(I32x4SConvertI16x8Low, 0xfda7, s_s) \
V(I32x4SConvertI16x8High, 0xfda8, s_s) \
V(I32x4UConvertI16x8Low, 0xfda9, s_s) \
@@ -426,6 +431,8 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
V(F32x4Div, 0xfde7, s_ss) \
V(F32x4Min, 0xfde8, s_ss) \
V(F32x4Max, 0xfde9, s_ss) \
+ V(F32x4Pmin, 0xfdea, s_ss) \
+ V(F32x4Pmax, 0xfdeb, s_ss) \
V(F64x2Abs, 0xfdec, s_s) \
V(F64x2Neg, 0xfded, s_s) \
V(F64x2Sqrt, 0xfdef, s_s) \
@@ -435,10 +442,20 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
V(F64x2Div, 0xfdf3, s_ss) \
V(F64x2Min, 0xfdf4, s_ss) \
V(F64x2Max, 0xfdf5, s_ss) \
+ V(F64x2Pmin, 0xfdf6, s_ss) \
+ V(F64x2Pmax, 0xfdf7, s_ss) \
V(I32x4SConvertF32x4, 0xfdf8, s_s) \
V(I32x4UConvertF32x4, 0xfdf9, s_s) \
V(F32x4SConvertI32x4, 0xfdfa, s_s) \
- V(F32x4UConvertI32x4, 0xfdfb, s_s)
+ V(F32x4UConvertI32x4, 0xfdfb, s_s) \
+ V(F32x4Ceil, 0xfdd8, s_s) \
+ V(F32x4Floor, 0xfdd9, s_s) \
+ V(F32x4Trunc, 0xfdda, s_s) \
+ V(F32x4NearestInt, 0xfddb, s_s) \
+ V(F64x2Ceil, 0xfddc, s_s) \
+ V(F64x2Floor, 0xfddd, s_s) \
+ V(F64x2Trunc, 0xfdde, s_s) \
+ V(F64x2NearestInt, 0xfddf, s_s)
#define FOREACH_SIMD_POST_MVP_MEM_OPCODE(V) \
V(S128LoadMem32Zero, 0xfdfc, s_i) \
@@ -446,9 +463,6 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
#define FOREACH_SIMD_POST_MVP_OPCODE(V) \
V(I8x16Mul, 0xfd75, s_ss) \
- V(I8x16BitMask, 0xfd64, i_s) \
- V(I16x8BitMask, 0xfd84, i_s) \
- V(I32x4BitMask, 0xfda4, i_s) \
V(V64x2AnyTrue, 0xfdc2, i_s) \
V(V64x2AllTrue, 0xfdc3, i_s) \
V(I64x2Eq, 0xfdc0, s_ss) \
@@ -474,19 +488,7 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmFeatures&);
V(I32x4DotI16x8S, 0xfdba, s_ss) \
V(F32x4AddHoriz, 0xfdb2, s_ss) \
V(F32x4RecipApprox, 0xfdb3, s_s) \
- V(F32x4RecipSqrtApprox, 0xfdbc, s_s) \
- V(F32x4Pmin, 0xfdea, s_ss) \
- V(F32x4Pmax, 0xfdeb, s_ss) \
- V(F32x4Ceil, 0xfdd8, s_s) \
- V(F32x4Floor, 0xfdd9, s_s) \
- V(F32x4Trunc, 0xfdda, s_s) \
- V(F32x4NearestInt, 0xfddb, s_s) \
- V(F64x2Pmin, 0xfdf6, s_ss) \
- V(F64x2Pmax, 0xfdf7, s_ss) \
- V(F64x2Ceil, 0xfddc, s_s) \
- V(F64x2Floor, 0xfddd, s_s) \
- V(F64x2Trunc, 0xfdde, s_s) \
- V(F64x2NearestInt, 0xfddf, s_s)
+ V(F32x4RecipSqrtApprox, 0xfdbc, s_s)
#define FOREACH_SIMD_1_OPERAND_1_PARAM_OPCODE(V) \
V(I8x16ExtractLaneS, 0xfd15, _) \
diff --git a/deps/v8/src/wasm/wasm-subtyping.cc b/deps/v8/src/wasm/wasm-subtyping.cc
index 554f8270e1..630c1aa628 100644
--- a/deps/v8/src/wasm/wasm-subtyping.cc
+++ b/deps/v8/src/wasm/wasm-subtyping.cc
@@ -6,6 +6,7 @@
#include "src/base/platform/mutex.h"
#include "src/wasm/wasm-module.h"
+#include "src/zone/zone-containers.h"
namespace v8 {
namespace internal {
@@ -13,63 +14,148 @@ namespace wasm {
namespace {
-bool IsEquivalent(ValueType type1, ValueType type2, const WasmModule* module);
+using CacheKey =
+ std::tuple<uint32_t, uint32_t, const WasmModule*, const WasmModule*>;
-bool IsArrayTypeEquivalent(uint32_t type_index_1, uint32_t type_index_2,
- const WasmModule* module) {
- if (module->type_kinds[type_index_1] != kWasmArrayTypeCode ||
- module->type_kinds[type_index_2] != kWasmArrayTypeCode) {
- return false;
+struct CacheKeyHasher {
+ size_t operator()(CacheKey key) const {
+ static constexpr size_t large_prime = 14887;
+ return std::get<0>(key) + (std::get<1>(key) * large_prime) +
+ (reinterpret_cast<size_t>(std::get<2>(key)) * large_prime *
+ large_prime) +
+ (reinterpret_cast<size_t>(std::get<3>(key)) * large_prime *
+ large_prime * large_prime);
+ }
+};
+
+class TypeJudgementCache {
+ public:
+ TypeJudgementCache()
+ : zone_(new AccountingAllocator(), "type judgement zone"),
+ subtyping_cache_(&zone_),
+ type_equivalence_cache_(&zone_) {}
+
+ static TypeJudgementCache* instance() {
+ static base::LazyInstance<TypeJudgementCache>::type instance_ =
+ LAZY_INSTANCE_INITIALIZER;
+ return instance_.Pointer();
+ }
+
+ base::RecursiveMutex* type_cache_mutex() { return &type_cache_mutex_; }
+ bool is_cached_subtype(uint32_t subtype, uint32_t supertype,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) const {
+ return subtyping_cache_.count(std::make_tuple(
+ subtype, supertype, sub_module, super_module)) == 1;
+ }
+ void cache_subtype(uint32_t subtype, uint32_t supertype,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ subtyping_cache_.emplace(subtype, supertype, sub_module, super_module);
+ }
+ void uncache_subtype(uint32_t subtype, uint32_t supertype,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ subtyping_cache_.erase(
+ std::make_tuple(subtype, supertype, sub_module, super_module));
+ }
+ bool is_cached_equivalent_type(uint32_t type1, uint32_t type2,
+ const WasmModule* module1,
+ const WasmModule* module2) const {
+ if (type1 > type2) std::swap(type1, type2);
+ if (reinterpret_cast<uintptr_t>(module1) >
+ reinterpret_cast<uintptr_t>(module2)) {
+ std::swap(module1, module2);
+ }
+ return type_equivalence_cache_.count(
+ std::make_tuple(type1, type2, module1, module2)) == 1;
+ }
+ void cache_type_equivalence(uint32_t type1, uint32_t type2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ if (type1 > type2) std::swap(type1, type2);
+ if (reinterpret_cast<uintptr_t>(module1) >
+ reinterpret_cast<uintptr_t>(module2)) {
+ std::swap(module1, module2);
+ }
+ type_equivalence_cache_.emplace(type1, type2, module1, module2);
+ }
+ void uncache_type_equivalence(uint32_t type1, uint32_t type2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ if (type1 > type2) std::swap(type1, type2);
+ if (reinterpret_cast<uintptr_t>(module1) >
+ reinterpret_cast<uintptr_t>(module2)) {
+ std::swap(module1, module2);
+ }
+ type_equivalence_cache_.erase(
+ std::make_tuple(type1, type2, module1, module2));
}
- const ArrayType* sub_array = module->types[type_index_1].array_type;
- const ArrayType* super_array = module->types[type_index_2].array_type;
+ private:
+ Zone zone_;
+ ZoneUnorderedSet<CacheKey, CacheKeyHasher>
+ // Cache for discovered subtyping pairs.
+ subtyping_cache_,
+ // Cache for discovered equivalent type pairs.
+ // Indexes and modules are stored in increasing order.
+ type_equivalence_cache_;
+ // The above two caches are used from background compile jobs, so they
+ // must be protected from concurrent modifications:
+ base::RecursiveMutex type_cache_mutex_;
+};
+
+bool ArrayEquivalentIndices(uint32_t type_index_1, uint32_t type_index_2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ const ArrayType* sub_array = module1->types[type_index_1].array_type;
+ const ArrayType* super_array = module2->types[type_index_2].array_type;
if (sub_array->mutability() != super_array->mutability()) return false;
// Temporarily cache type equivalence for the recursive call.
- module->cache_type_equivalence(type_index_1, type_index_2);
- if (IsEquivalent(sub_array->element_type(), super_array->element_type(),
- module)) {
+ TypeJudgementCache::instance()->cache_type_equivalence(
+ type_index_1, type_index_2, module1, module2);
+ if (EquivalentTypes(sub_array->element_type(), super_array->element_type(),
+ module1, module2)) {
return true;
} else {
- module->uncache_type_equivalence(type_index_1, type_index_2);
+ TypeJudgementCache::instance()->uncache_type_equivalence(
+ type_index_1, type_index_2, module1, module2);
// TODO(7748): Consider caching negative results as well.
return false;
}
}
-bool IsStructTypeEquivalent(uint32_t type_index_1, uint32_t type_index_2,
- const WasmModule* module) {
- if (module->type_kinds[type_index_1] != kWasmStructTypeCode ||
- module->type_kinds[type_index_2] != kWasmStructTypeCode) {
- return false;
- }
- const StructType* sub_struct = module->types[type_index_1].struct_type;
- const StructType* super_struct = module->types[type_index_2].struct_type;
+bool StructEquivalentIndices(uint32_t type_index_1, uint32_t type_index_2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ const StructType* sub_struct = module1->types[type_index_1].struct_type;
+ const StructType* super_struct = module2->types[type_index_2].struct_type;
if (sub_struct->field_count() != super_struct->field_count()) {
return false;
}
// Temporarily cache type equivalence for the recursive call.
- module->cache_type_equivalence(type_index_1, type_index_2);
+ TypeJudgementCache::instance()->cache_type_equivalence(
+ type_index_1, type_index_2, module1, module2);
for (uint32_t i = 0; i < sub_struct->field_count(); i++) {
if (sub_struct->mutability(i) != super_struct->mutability(i) ||
- !IsEquivalent(sub_struct->field(i), super_struct->field(i), module)) {
- module->uncache_type_equivalence(type_index_1, type_index_2);
+ !EquivalentTypes(sub_struct->field(i), super_struct->field(i), module1,
+ module2)) {
+ TypeJudgementCache::instance()->uncache_type_equivalence(
+ type_index_1, type_index_2, module1, module2);
return false;
}
}
return true;
}
-bool IsFunctionTypeEquivalent(uint32_t type_index_1, uint32_t type_index_2,
- const WasmModule* module) {
- if (module->type_kinds[type_index_1] != kWasmFunctionTypeCode ||
- module->type_kinds[type_index_2] != kWasmFunctionTypeCode) {
- return false;
- }
- const FunctionSig* sig1 = module->types[type_index_1].function_sig;
- const FunctionSig* sig2 = module->types[type_index_2].function_sig;
+
+bool FunctionEquivalentIndices(uint32_t type_index_1, uint32_t type_index_2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ const FunctionSig* sig1 = module1->types[type_index_1].function_sig;
+ const FunctionSig* sig2 = module2->types[type_index_2].function_sig;
if (sig1->parameter_count() != sig2->parameter_count() ||
sig1->return_count() != sig2->return_count()) {
@@ -80,138 +166,206 @@ bool IsFunctionTypeEquivalent(uint32_t type_index_1, uint32_t type_index_2,
auto iter2 = sig2->all();
// Temporarily cache type equivalence for the recursive call.
- module->cache_type_equivalence(type_index_1, type_index_2);
+ TypeJudgementCache::instance()->cache_type_equivalence(
+ type_index_1, type_index_2, module1, module2);
for (int i = 0; i < iter1.size(); i++) {
- if (iter1[i] != iter2[i]) {
- module->uncache_type_equivalence(type_index_1, type_index_2);
+ if (!EquivalentTypes(iter1[i], iter2[i], module1, module2)) {
+ TypeJudgementCache::instance()->uncache_type_equivalence(
+ type_index_1, type_index_2, module1, module2);
return false;
}
}
return true;
}
-bool IsEquivalent(ValueType type1, ValueType type2, const WasmModule* module) {
- if (type1 == type2) return true;
- if (type1.kind() != type2.kind()) return false;
- // At this point, the types can only be both rtts, refs, or optrefs,
- // but with different indexed types.
+V8_INLINE bool EquivalentIndices(uint32_t index1, uint32_t index2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ DCHECK(index1 != index2 || module1 != module2);
+ uint8_t kind1 = module1->type_kinds[index1];
- // Rtts need to have the same depth.
- if (type1.has_depth() && type1.depth() != type2.depth()) return false;
- // In all three cases, the indexed types have to be equivalent.
- if (module->is_cached_equivalent_type(type1.ref_index(), type2.ref_index())) {
+ if (kind1 != module2->type_kinds[index2]) return false;
+
+ base::RecursiveMutexGuard type_cache_access(
+ TypeJudgementCache::instance()->type_cache_mutex());
+ if (TypeJudgementCache::instance()->is_cached_equivalent_type(
+ index1, index2, module1, module2)) {
return true;
}
- return IsArrayTypeEquivalent(type1.ref_index(), type2.ref_index(), module) ||
- IsStructTypeEquivalent(type1.ref_index(), type2.ref_index(), module) ||
- IsFunctionTypeEquivalent(type1.ref_index(), type2.ref_index(), module);
-}
-bool IsStructSubtype(uint32_t subtype_index, uint32_t supertype_index,
- const WasmModule* module) {
- if (module->type_kinds[subtype_index] != kWasmStructTypeCode ||
- module->type_kinds[supertype_index] != kWasmStructTypeCode) {
- return false;
+ if (kind1 == kWasmStructTypeCode) {
+ return StructEquivalentIndices(index1, index2, module1, module2);
+ } else if (kind1 == kWasmArrayTypeCode) {
+ return ArrayEquivalentIndices(index1, index2, module1, module2);
+ } else {
+ DCHECK_EQ(kind1, kWasmFunctionTypeCode);
+ return FunctionEquivalentIndices(index1, index2, module1, module2);
}
- const StructType* sub_struct = module->types[subtype_index].struct_type;
- const StructType* super_struct = module->types[supertype_index].struct_type;
+}
+
+bool StructIsSubtypeOf(uint32_t subtype_index, uint32_t supertype_index,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ const StructType* sub_struct = sub_module->types[subtype_index].struct_type;
+ const StructType* super_struct =
+ super_module->types[supertype_index].struct_type;
if (sub_struct->field_count() < super_struct->field_count()) {
return false;
}
- module->cache_subtype(subtype_index, supertype_index);
+ TypeJudgementCache::instance()->cache_subtype(subtype_index, supertype_index,
+ sub_module, super_module);
for (uint32_t i = 0; i < super_struct->field_count(); i++) {
bool sub_mut = sub_struct->mutability(i);
bool super_mut = super_struct->mutability(i);
if (sub_mut != super_mut ||
(sub_mut &&
- !IsEquivalent(sub_struct->field(i), super_struct->field(i), module)) ||
- (!sub_mut &&
- !IsSubtypeOf(sub_struct->field(i), super_struct->field(i), module))) {
- module->uncache_subtype(subtype_index, supertype_index);
+ !EquivalentTypes(sub_struct->field(i), super_struct->field(i),
+ sub_module, super_module)) ||
+ (!sub_mut && !IsSubtypeOf(sub_struct->field(i), super_struct->field(i),
+ sub_module, super_module))) {
+ TypeJudgementCache::instance()->uncache_subtype(
+ subtype_index, supertype_index, sub_module, super_module);
return false;
}
}
return true;
}
-bool IsArraySubtype(uint32_t subtype_index, uint32_t supertype_index,
- const WasmModule* module) {
- if (module->type_kinds[subtype_index] != kWasmArrayTypeCode ||
- module->type_kinds[supertype_index] != kWasmArrayTypeCode) {
- return false;
- }
- const ArrayType* sub_array = module->types[subtype_index].array_type;
- const ArrayType* super_array = module->types[supertype_index].array_type;
+bool ArrayIsSubtypeOf(uint32_t subtype_index, uint32_t supertype_index,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ const ArrayType* sub_array = sub_module->types[subtype_index].array_type;
+ const ArrayType* super_array =
+ super_module->types[supertype_index].array_type;
bool sub_mut = sub_array->mutability();
bool super_mut = super_array->mutability();
- module->cache_subtype(subtype_index, supertype_index);
+ TypeJudgementCache::instance()->cache_subtype(subtype_index, supertype_index,
+ sub_module, super_module);
if (sub_mut != super_mut ||
- (sub_mut && !IsEquivalent(sub_array->element_type(),
- super_array->element_type(), module)) ||
- (!sub_mut && !IsSubtypeOf(sub_array->element_type(),
- super_array->element_type(), module))) {
- module->uncache_subtype(subtype_index, supertype_index);
+ (sub_mut &&
+ !EquivalentTypes(sub_array->element_type(), super_array->element_type(),
+ sub_module, super_module)) ||
+ (!sub_mut &&
+ !IsSubtypeOf(sub_array->element_type(), super_array->element_type(),
+ sub_module, super_module))) {
+ TypeJudgementCache::instance()->uncache_subtype(
+ subtype_index, supertype_index, sub_module, super_module);
return false;
} else {
return true;
}
}
-// TODO(7748): Expand this with function subtyping.
-bool IsFunctionSubtype(uint32_t subtype_index, uint32_t supertype_index,
- const WasmModule* module) {
- return IsFunctionTypeEquivalent(subtype_index, supertype_index, module);
+// TODO(7748): Expand this with function subtyping once the hiccups
+// with 'exact types' have been cleared.
+bool FunctionIsSubtypeOf(uint32_t subtype_index, uint32_t supertype_index,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ return FunctionEquivalentIndices(subtype_index, supertype_index, sub_module,
+ super_module);
}
} // namespace
// TODO(7748): Extend this with any-heap subtyping.
-V8_NOINLINE V8_EXPORT_PRIVATE bool IsSubtypeOfImpl(ValueType subtype,
- ValueType supertype,
- const WasmModule* module) {
- bool compatible_references = (subtype.kind() == ValueType::kOptRef &&
- supertype.kind() == ValueType::kOptRef) ||
- (subtype.kind() == ValueType::kRef &&
- (supertype.kind() == ValueType::kOptRef ||
- supertype.kind() == ValueType::kRef));
+V8_NOINLINE V8_EXPORT_PRIVATE bool IsSubtypeOfImpl(
+ ValueType subtype, ValueType supertype, const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ DCHECK(subtype != supertype || sub_module != super_module);
+
+ // This function checks for subtyping based on the kind of subtype.
+
+ if (!subtype.is_reference_type()) return subtype == supertype;
+
+ if (subtype.kind() == ValueType::kRtt) {
+ return subtype.heap_type().is_generic()
+ ? subtype == supertype
+ : (supertype.kind() == ValueType::kRtt &&
+ subtype.depth() == supertype.depth() &&
+ EquivalentIndices(subtype.ref_index(), supertype.ref_index(),
+ sub_module, super_module));
+ }
+
+ DCHECK(subtype.is_object_reference_type());
+
+ bool compatible_references = subtype.kind() == ValueType::kOptRef
+ ? supertype.kind() == ValueType::kOptRef
+ : supertype.is_object_reference_type();
if (!compatible_references) return false;
+ DCHECK(supertype.is_object_reference_type());
+
+ // Now check that sub_heap and super_heap are subtype-related.
+
HeapType sub_heap = subtype.heap_type();
HeapType super_heap = supertype.heap_type();
- if (sub_heap == super_heap) {
+ if (sub_heap.representation() == HeapType::kI31 &&
+ super_heap.representation() == HeapType::kEq) {
return true;
}
- // eqref is a supertype of i31ref, array, and struct types.
+ if (sub_heap.is_generic()) return sub_heap == super_heap;
+
+ DCHECK(sub_heap.is_index());
+ uint32_t sub_index = sub_heap.ref_index();
+ DCHECK(sub_module->has_type(sub_index));
+
if (super_heap.representation() == HeapType::kEq) {
- return (sub_heap.is_index() &&
- !module->has_signature(sub_heap.ref_index())) ||
- sub_heap.representation() == HeapType::kI31;
+ return !sub_module->has_signature(sub_heap.ref_index());
}
-
- // funcref is a supertype of all function types.
if (super_heap.representation() == HeapType::kFunc) {
- return sub_heap.is_index() && module->has_signature(sub_heap.ref_index());
+ return sub_module->has_signature(sub_heap.ref_index());
}
+ if (super_heap.is_generic()) return false;
- // At the moment, generic heap types are not subtyping-related otherwise.
- if (sub_heap.is_generic() || super_heap.is_generic()) {
- return false;
- }
+ DCHECK(super_heap.is_index());
+ uint32_t super_index = super_heap.ref_index();
+ DCHECK(super_module->has_type(super_index));
+
+ uint8_t sub_kind = sub_module->type_kinds[sub_index];
+
+ if (sub_kind != super_module->type_kinds[super_index]) return false;
// Accessing the caches for subtyping and equivalence from multiple background
// threads is protected by a lock.
- base::RecursiveMutexGuard type_cache_access(module->type_cache_mutex());
- if (module->is_cached_subtype(sub_heap.ref_index(), super_heap.ref_index())) {
+ base::RecursiveMutexGuard type_cache_access(
+ TypeJudgementCache::instance()->type_cache_mutex());
+ if (TypeJudgementCache::instance()->is_cached_subtype(
+ sub_index, super_index, sub_module, super_module)) {
return true;
}
- return IsStructSubtype(sub_heap.ref_index(), super_heap.ref_index(),
- module) ||
- IsArraySubtype(sub_heap.ref_index(), super_heap.ref_index(), module) ||
- IsFunctionSubtype(sub_heap.ref_index(), super_heap.ref_index(),
- module);
+
+ if (sub_kind == kWasmStructTypeCode) {
+ return StructIsSubtypeOf(sub_index, super_index, sub_module, super_module);
+ } else if (sub_kind == kWasmArrayTypeCode) {
+ return ArrayIsSubtypeOf(sub_index, super_index, sub_module, super_module);
+ } else {
+ DCHECK_EQ(sub_kind, kWasmFunctionTypeCode);
+ return FunctionIsSubtypeOf(sub_index, super_index, sub_module,
+ super_module);
+ }
+}
+
+V8_NOINLINE bool EquivalentTypes(ValueType type1, ValueType type2,
+ const WasmModule* module1,
+ const WasmModule* module2) {
+ if (type1 == type2 && module1 == module2) return true;
+ if (!type1.has_index()) return type1 == type2;
+ if (type1.kind() != type2.kind()) return false;
+
+ DCHECK(type1.has_index() && type2.has_index() &&
+ (type1 != type2 || module1 != module2));
+
+ DCHECK_IMPLIES(type1.has_depth(), type2.has_depth()); // Due to 'if' above
+ if (type1.has_depth() && type1.depth() != type2.depth()) return false;
+
+ DCHECK(type1.has_index() && module1->has_type(type1.ref_index()) &&
+ type2.has_index() && module2->has_type(type2.ref_index()));
+
+ return EquivalentIndices(type1.ref_index(), type2.ref_index(), module1,
+ module2);
}
ValueType CommonSubtype(ValueType a, ValueType b, const WasmModule* module) {
diff --git a/deps/v8/src/wasm/wasm-subtyping.h b/deps/v8/src/wasm/wasm-subtyping.h
index c162dd3ad4..bc3fe9e834 100644
--- a/deps/v8/src/wasm/wasm-subtyping.h
+++ b/deps/v8/src/wasm/wasm-subtyping.h
@@ -12,21 +12,66 @@ namespace internal {
namespace wasm {
struct WasmModule;
-V8_NOINLINE V8_EXPORT_PRIVATE bool IsSubtypeOfImpl(ValueType subtype,
- ValueType supertype,
- const WasmModule* module);
-// The subtyping between value types is described by the following rules:
-// - All types are a supertype of bottom.
-// - All reference types, except funcref, are subtypes of eqref.
+V8_NOINLINE V8_EXPORT_PRIVATE bool IsSubtypeOfImpl(
+ ValueType subtype, ValueType supertype, const WasmModule* sub_module,
+ const WasmModule* super_module);
+
+// Checks if type1, defined in module1, is equivalent with type2, defined in
+// module2.
+// Type equivalence (~) is described by the following rules (structural
+// equivalence):
+// - Two numeric types are equivalent if they are equal.
+// - optref(ht1) ~ optref(ht2) iff ht1 ~ ht2.
+// - ref(ht1) ~ ref(ht2) iff ht1 ~ ht2.
+// - rtt(d1, ht1) ~ rtt(d2, ht2) iff (d1 = d2 and ht1 ~ ht2).
+// For heap types, the following rules hold:
+// - Two generic heap types are equivalent iff they are equal.
+// - Two structs are equivalent iff they contain the same number of fields and
+// these are pairwise equivalent.
+// - Two functions are equivalent iff they contain the same number of parameters
+// and returns and these are pairwise equivalent.
+// - Two arrays are equivalent iff their underlying types are equivalent.
+V8_NOINLINE bool EquivalentTypes(ValueType type1, ValueType type2,
+ const WasmModule* module1,
+ const WasmModule* module2);
+
+// Checks if subtype, defined in module1, is a subtype of supertype, defined in
+// module2.
+// Subtyping between value types is described by the following rules
+// (structural subtyping):
+// - numeric types are subtype-related iff they are equal.
// - optref(ht1) <: optref(ht2) iff ht1 <: ht2.
// - ref(ht1) <: ref/optref(ht2) iff ht1 <: ht2.
+// - rtt1 <: rtt2 iff rtt1 ~ rtt2.
+// For heap types, the following subtyping rules hold:
+// - Each generic heap type is a subtype of itself.
+// - All functions are subtypes of func.
+// - i31, structs and arrays are subtypes of eq.
+// - Struct subtyping: Subtype must have at least as many fields as supertype,
+// covariance for immutable fields, equivalence for mutable fields.
+// - Array subtyping (mutable only) is the equivalence relation.
+// - Function subtyping is the equivalence relation (note: this rule might
+// change in the future to include type variance).
+V8_INLINE bool IsSubtypeOf(ValueType subtype, ValueType supertype,
+ const WasmModule* sub_module,
+ const WasmModule* super_module) {
+ if (subtype == supertype && sub_module == super_module) return true;
+ return IsSubtypeOfImpl(subtype, supertype, sub_module, super_module);
+}
+
+// Checks if 'subtype' is a subtype of 'supertype' (both defined in module).
V8_INLINE bool IsSubtypeOf(ValueType subtype, ValueType supertype,
const WasmModule* module) {
+ // If the types are trivially identical, exit early.
if (V8_LIKELY(subtype == supertype)) return true;
- return IsSubtypeOfImpl(subtype, supertype, module);
+ return IsSubtypeOfImpl(subtype, supertype, module, module);
}
+// Returns the weakest type that is a subtype of both a and b
+// (which is currently always one of a, b, or kWasmBottom).
+// TODO(manoskouk): Update this once we have settled on a type system for
+// reference types.
ValueType CommonSubtype(ValueType a, ValueType b, const WasmModule* module);
} // namespace wasm
diff --git a/deps/v8/src/wasm/wasm-value.h b/deps/v8/src/wasm/wasm-value.h
index 5189eb8676..3926a4c7e9 100644
--- a/deps/v8/src/wasm/wasm-value.h
+++ b/deps/v8/src/wasm/wasm-value.h
@@ -44,6 +44,8 @@ class Simd128 {
FOREACH_SIMD_TYPE(DEFINE_SIMD_TYPE_SPECIFIC_METHODS)
#undef DEFINE_SIMD_TYPE_SPECIFIC_METHODS
+ const uint8_t* bytes() { return val_; }
+
private:
uint8_t val_[16] = {0};
};
@@ -104,6 +106,12 @@ class WasmValue {
template <typename T>
inline T to_unchecked() const;
+ static WasmValue ForUintPtr(uintptr_t value) {
+ using type =
+ std::conditional<kSystemPointerSize == 8, uint64_t, uint32_t>::type;
+ return WasmValue{type{value}};
+ }
+
private:
ValueType type_;
uint8_t bit_pattern_[16];
diff --git a/deps/v8/src/zone/accounting-allocator.cc b/deps/v8/src/zone/accounting-allocator.cc
index 7b040b85d9..69485eca65 100644
--- a/deps/v8/src/zone/accounting-allocator.cc
+++ b/deps/v8/src/zone/accounting-allocator.cc
@@ -108,7 +108,6 @@ void AccountingAllocator::ReturnSegment(Segment* segment,
segment->ZapHeader();
if (COMPRESS_ZONES_BOOL && supports_compression) {
CHECK(FreePages(bounded_page_allocator_.get(), segment, segment_size));
-
} else {
free(segment);
}
diff --git a/deps/v8/src/zone/zone.h b/deps/v8/src/zone/zone.h
index 54c3966ee5..aa76091621 100644
--- a/deps/v8/src/zone/zone.h
+++ b/deps/v8/src/zone/zone.h
@@ -104,8 +104,7 @@ class V8_EXPORT_PRIVATE Zone final {
// associated with the T type.
template <typename T, typename... Args>
T* New(Args&&... args) {
- size_t size = RoundUp(sizeof(T), kAlignmentInBytes);
- void* memory = Allocate<T>(size);
+ void* memory = Allocate<T>(sizeof(T));
return new (memory) T(std::forward<Args>(args)...);
}
diff --git a/deps/v8/test/benchmarks/benchmarks.status b/deps/v8/test/benchmarks/benchmarks.status
index 127375f26f..046e4ae9fb 100644
--- a/deps/v8/test/benchmarks/benchmarks.status
+++ b/deps/v8/test/benchmarks/benchmarks.status
@@ -42,16 +42,21 @@
['variant in [jitless, nooptimization, stress]', {
# Slow tests.
'kraken/ai-astar': [PASS, SLOW],
+ 'kraken/imaging-darkroom': [PASS, SLOW],
'kraken/imaging-desaturate': [PASS, SLOW],
'octane/code-load': [PASS, SLOW],
'octane/crypto': [PASS, SLOW],
+ 'octane/earley-boyer': [PASS, SLOW],
'octane/gbemu-part1': [PASS, SLOW],
+ 'octane/navier-stokes': [PASS, SLOW],
'octane/pdfjs': [PASS, SLOW],
'octane/regexp': [PASS, SLOW],
}],
['variant == stress', {
# Too slow for stress mode.
+ 'kraken/imaging-desaturate' : [PASS, ['mode == debug', SKIP]],
+ 'kraken/imaging-gaussian-blur' : [PASS, ['mode == debug', SKIP]],
'octane/mandreel': [SKIP],
'octane/typescript': [SKIP],
@@ -61,9 +66,16 @@
['variant == jitless', {
# Too slow for jitless mode.
+ 'kraken/imaging-desaturate' : [PASS, ['mode == debug', SKIP]],
+ 'kraken/imaging-gaussian-blur' : [PASS, ['mode == debug', SKIP]],
'octane/zlib': [SKIP],
}],
+['variant == nooptimization and mode == debug', {
+ # Too slow for nooptimization mode and debug.
+ 'kraken/imaging-gaussian-blur': [SKIP],
+}],
+
['variant == stress_incremental_marking', {
# Too slow for stress_incremental_marking.
'octane/box2d': [SKIP],
diff --git a/deps/v8/test/cctest/BUILD.gn b/deps/v8/test/cctest/BUILD.gn
index 35a22344fb..d2a1c1fad5 100644
--- a/deps/v8/test/cctest/BUILD.gn
+++ b/deps/v8/test/cctest/BUILD.gn
@@ -60,6 +60,12 @@ v8_header_set("cctest_headers") {
sources = [ "cctest.h" ]
}
+config("cctest_sources_config") {
+ if (is_clang) {
+ cflags = [ "-Wno-string-concatenation" ]
+ }
+}
+
v8_source_set("cctest_sources") {
testonly = true
@@ -209,6 +215,7 @@ v8_source_set("cctest_sources") {
"test-debug.cc",
"test-decls.cc",
"test-deoptimization.cc",
+ "test-descriptor-array.cc",
"test-dictionary.cc",
"test-diy-fp.cc",
"test-double.cc",
@@ -267,7 +274,6 @@ v8_source_set("cctest_sources") {
"test-unboxed-doubles.cc",
"test-unscopables-hidden-prototype.cc",
"test-unwinder-code-pages.cc",
- "test-unwinder.cc",
"test-usecounters.cc",
"test-utils.cc",
"test-version.cc",
@@ -304,6 +310,7 @@ v8_source_set("cctest_sources") {
"wasm/test-wasm-debug-evaluate.cc",
"wasm/test-wasm-debug-evaluate.h",
"wasm/test-wasm-import-wrapper-cache.cc",
+ "wasm/test-wasm-metrics.cc",
"wasm/test-wasm-serialization.cc",
"wasm/test-wasm-shared-engine.cc",
"wasm/test-wasm-stack.cc",
@@ -402,6 +409,7 @@ v8_source_set("cctest_sources") {
"../..:external_config",
"../..:internal_config_base",
"../..:v8_tracing_config",
+ ":cctest_sources_config",
]
public_deps = [
diff --git a/deps/v8/test/cctest/OWNERS b/deps/v8/test/cctest/OWNERS
index c11f42d6c9..d2464494fa 100644
--- a/deps/v8/test/cctest/OWNERS
+++ b/deps/v8/test/cctest/OWNERS
@@ -1 +1,3 @@
per-file *profile*=alph@chromium.org
+per-file test-debug-helper.cc=seth.brenith@microsoft.com
+per-file test-v8windbg.cc=seth.brenith@microsoft.com
diff --git a/deps/v8/test/cctest/cctest.cc b/deps/v8/test/cctest/cctest.cc
index 9913429671..7fce7444b8 100644
--- a/deps/v8/test/cctest/cctest.cc
+++ b/deps/v8/test/cctest/cctest.cc
@@ -25,14 +25,15 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include "include/v8.h"
#include "test/cctest/cctest.h"
#include "include/libplatform/libplatform.h"
+#include "include/v8.h"
#include "src/codegen/compiler.h"
#include "src/codegen/optimized-compilation-info.h"
#include "src/compiler/pipeline.h"
#include "src/debug/debug.h"
+#include "src/flags/flags.h"
#include "src/objects/objects-inl.h"
#include "src/trap-handler/trap-handler.h"
#include "test/cctest/print-extension.h"
@@ -129,8 +130,19 @@ i::ReadOnlyHeap* CcTest::read_only_heap() {
return i_isolate()->read_only_heap();
}
-void CcTest::CollectGarbage(i::AllocationSpace space) {
- heap()->CollectGarbage(space, i::GarbageCollectionReason::kTesting);
+void CcTest::AddGlobalFunction(v8::Local<v8::Context> env, const char* name,
+ v8::FunctionCallback callback) {
+ v8::Local<v8::FunctionTemplate> func_template =
+ v8::FunctionTemplate::New(isolate_, callback);
+ v8::Local<v8::Function> func =
+ func_template->GetFunction(env).ToLocalChecked();
+ func->SetName(v8_str(name));
+ env->Global()->Set(env, v8_str(name), func).FromJust();
+}
+
+void CcTest::CollectGarbage(i::AllocationSpace space, i::Isolate* isolate) {
+ i::Isolate* iso = isolate ? isolate : i_isolate();
+ iso->heap()->CollectGarbage(space, i::GarbageCollectionReason::kTesting);
}
void CcTest::CollectAllGarbage(i::Isolate* isolate) {
@@ -305,19 +317,11 @@ int main(int argc, char* argv[]) {
#endif // V8_CC_MSVC
#endif // V8_OS_WIN
- // hack to print cctest specific flags
- for (int i = 1; i < argc; i++) {
- char* arg = argv[i];
- if ((strcmp(arg, "--help") == 0) || (strcmp(arg, "-h") == 0)) {
- printf("Usage: %s [--list] [[V8_FLAGS] CCTEST]\n", argv[0]);
- printf("\n");
- printf("Options:\n");
- printf(" --list: list all cctests\n");
- printf(" CCTEST: cctest identfier returned by --list\n");
- printf(" D8_FLAGS: see d8 output below\n");
- printf("\n\n");
- }
- }
+ std::string usage = "Usage: " + std::string(argv[0]) + " [--list]" +
+ " [[V8_FLAGS] CCTEST]\n\n" + "Options:\n" +
+ " --list: list all cctests\n" +
+ " CCTEST: cctest identfier returned by --list\n" +
+ " V8_FLAGS: see V8 options below\n\n\n";
#ifdef V8_USE_PERFETTO
// Set up the in-process backend that the tracing controller will connect to.
@@ -329,7 +333,9 @@ int main(int argc, char* argv[]) {
v8::V8::InitializeICUDefaultLocation(argv[0]);
std::unique_ptr<v8::Platform> platform(v8::platform::NewDefaultPlatform());
v8::V8::InitializePlatform(platform.get());
- v8::internal::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
+ using HelpOptions = v8::internal::FlagList::HelpOptions;
+ v8::internal::FlagList::SetFlagsFromCommandLine(
+ &argc, argv, true, HelpOptions(HelpOptions::kExit, usage.c_str()));
v8::V8::Initialize();
v8::V8::InitializeExternalStartupData(argv[0]);
diff --git a/deps/v8/test/cctest/cctest.h b/deps/v8/test/cctest/cctest.h
index 42afe75cb7..8d86b8b338 100644
--- a/deps/v8/test/cctest/cctest.h
+++ b/deps/v8/test/cctest/cctest.h
@@ -137,7 +137,10 @@ class CcTest {
static i::Heap* heap();
static i::ReadOnlyHeap* read_only_heap();
- static void CollectGarbage(i::AllocationSpace space);
+ static void AddGlobalFunction(v8::Local<v8::Context> env, const char* name,
+ v8::FunctionCallback callback);
+ static void CollectGarbage(i::AllocationSpace space,
+ i::Isolate* isolate = nullptr);
static void CollectAllGarbage(i::Isolate* isolate = nullptr);
static void CollectAllAvailableGarbage(i::Isolate* isolate = nullptr);
static void PreciseCollectAllGarbage(i::Isolate* isolate = nullptr);
@@ -317,7 +320,7 @@ class LocalContext {
v8::Context* operator*() { return operator->(); }
bool IsReady() { return !context_.IsEmpty(); }
- v8::Local<v8::Context> local() {
+ v8::Local<v8::Context> local() const {
return v8::Local<v8::Context>::New(isolate_, context_);
}
@@ -644,6 +647,8 @@ class ManualGCScope {
ManualGCScope()
: flag_concurrent_marking_(i::FLAG_concurrent_marking),
flag_concurrent_sweeping_(i::FLAG_concurrent_sweeping),
+ flag_stress_concurrent_allocation_(
+ i::FLAG_stress_concurrent_allocation),
flag_stress_incremental_marking_(i::FLAG_stress_incremental_marking),
flag_parallel_marking_(i::FLAG_parallel_marking),
flag_detect_ineffective_gcs_near_heap_limit_(
@@ -651,6 +656,7 @@ class ManualGCScope {
i::FLAG_concurrent_marking = false;
i::FLAG_concurrent_sweeping = false;
i::FLAG_stress_incremental_marking = false;
+ i::FLAG_stress_concurrent_allocation = false;
// Parallel marking has a dependency on concurrent marking.
i::FLAG_parallel_marking = false;
i::FLAG_detect_ineffective_gcs_near_heap_limit = false;
@@ -658,6 +664,7 @@ class ManualGCScope {
~ManualGCScope() {
i::FLAG_concurrent_marking = flag_concurrent_marking_;
i::FLAG_concurrent_sweeping = flag_concurrent_sweeping_;
+ i::FLAG_stress_concurrent_allocation = flag_stress_concurrent_allocation_;
i::FLAG_stress_incremental_marking = flag_stress_incremental_marking_;
i::FLAG_parallel_marking = flag_parallel_marking_;
i::FLAG_detect_ineffective_gcs_near_heap_limit =
@@ -667,6 +674,7 @@ class ManualGCScope {
private:
bool flag_concurrent_marking_;
bool flag_concurrent_sweeping_;
+ bool flag_stress_concurrent_allocation_;
bool flag_stress_incremental_marking_;
bool flag_parallel_marking_;
bool flag_detect_ineffective_gcs_near_heap_limit_;
diff --git a/deps/v8/test/cctest/cctest.status b/deps/v8/test/cctest/cctest.status
index 1f93ec28c2..4f00dea457 100644
--- a/deps/v8/test/cctest/cctest.status
+++ b/deps/v8/test/cctest/cctest.status
@@ -130,14 +130,6 @@
}],
##############################################################################
-['(arch != ia32 and arch != x64)', {
- # BUG(v8:9860). We can only safely read the native context for a frame on
- # ia32 and x64.
- 'test-cpu-profiler/ContextFilterMovedNativeContext': [FAIL],
- 'test-cpu-profiler/ContextIsolation': [FAIL],
-}],
-
-##############################################################################
['tsan == True', {
# BUG(v8:9869) TSAN considers SIGPROF an asynchronous signal, and will call
# into the handler after the stack has drifted from the context on the
@@ -395,6 +387,13 @@
# TODO(ppc): Implement load/store reverse byte instructions
'test-run-wasm-simd/RunWasm_SimdLoadStoreLoad': [SKIP],
'test-run-wasm-simd/RunWasm_SimdLoadStoreLoad_turbofan': [SKIP],
+ # TODO(miladfarca): remove once aix gcc bug is fixed.
+ # gcc on aix has a bug when using ceilf or truncf:
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97086
+ 'test-run-wasm-simd/RunWasm_F32x4Ceil_interpreter': [SKIP],
+ 'test-run-wasm-simd/RunWasm_F32x4Trunc_interpreter': [SKIP],
+ 'test-run-wasm-simd/RunWasm_F64x2Ceil_interpreter': [SKIP],
+ 'test-run-wasm-simd/RunWasm_F64x2Trunc_interpreter': [SKIP],
}], # 'system == aix or (arch == ppc64 and byteorder == big)'
@@ -472,14 +471,22 @@
##############################################################################
# The stack unwinder API is only supported on x64, arm64 and arm.
-['arch != x64 and arch != arm64', {
- 'test-unwinder/*': [SKIP]
-}],
-
['arch != x64 and arch != arm64 and arch != arm', {
'test-unwinder-code-pages/*': [SKIP]
}],
+# TODO(solanes, v8:10833): Re-enable these tests or create specific ones for
+# Arm. They are disabled because the stack is not being set up the way it does
+# in the wild.
+['arch == arm64 or arch == arm', {
+ 'test-unwinder-code-pages/Unwind_CodeObjectPCInMiddle_Success_CodePagesAPI': [SKIP],
+ 'test-unwinder-code-pages/Unwind_JSEntryBeforeFrame_Fail_CodePagesAPI': [SKIP],
+ 'test-unwinder-code-pages/Unwind_OneJSFrame_Success_CodePagesAPI': [SKIP],
+ 'test-unwinder-code-pages/Unwind_TwoJSFrames_Success_CodePagesAPI': [SKIP],
+ 'test-unwinder-code-pages/Unwind_StackBounds_Basic_CodePagesAPI': [SKIP],
+ 'test-unwinder-code-pages/Unwind_StackBounds_WithUnwinding_CodePagesAPI': [SKIP],
+}],
+
##############################################################################
['lite_mode or variant == jitless', {
@@ -496,7 +503,6 @@
'test-jump-table-assembler/*': [SKIP],
'test-gc/*': [SKIP],
'test-grow-memory/*': [SKIP],
- 'test-liftoff-inspection/*': [SKIP],
'test-run-wasm-64/*': [SKIP],
'test-run-wasm-asmjs/*': [SKIP],
'test-run-wasm-atomics64/*': [SKIP],
@@ -516,6 +522,7 @@
'test-wasm-codegen/*': [SKIP],
'test-wasm-debug-evaluate/*': [SKIP],
'test-wasm-import-wrapper-cache/*': [SKIP],
+ 'test-wasm-metrics/*': [SKIP],
'test-wasm-serialization/*': [SKIP],
'test-wasm-shared-engine/*': [SKIP],
'test-wasm-stack/*': [SKIP],
@@ -569,8 +576,6 @@
'test-run-variables/*': [SKIP],
'test-serialize/*': [SKIP],
'test-torque/*': [SKIP],
- 'test-unwinder/PCIsInV8_InCodeOrEmbeddedRange': [SKIP],
- 'test-unwinder/PCIsInV8_LargeCodeObject': [SKIP],
'test-unwinder-code-pages/PCIsInV8_LargeCodeObject_CodePagesAPI': [SKIP],
# Field representation tracking is disabled in jitless mode.
@@ -638,6 +643,9 @@
'test-macro-assembler-arm/ExtractLane': [PASS, ['arch == arm and not simulator_run', SKIP]],
'test-macro-assembler-arm/LoadAndStoreWithRepresentation': [PASS, ['arch == arm and not simulator_run', SKIP]],
'test-macro-assembler-arm/ReplaceLane': [PASS, ['arch == arm and not simulator_run', SKIP]],
+
+ # Too slow on arm64 simulator on Mac.
+ 'test-cpu-profiler/MultipleIsolates': [PASS, ['arch == arm64 and system == macos and simulator_run', SKIP]],
}], # variant == jitless
##############################################################################
@@ -664,7 +672,7 @@
}],
################################################################################
-['variant == nci or variant == nci_as_highest_tier', {
+['variant == nci or variant == nci_as_midtier', {
# Optimizes and deopts differently than TurboFan.
'test-api/FastApiCalls': [SKIP],
'test-cpu-profiler/Deopt*': [SKIP],
@@ -681,6 +689,6 @@
# NCI code currently does not use the feedback vector's optimized code cache.
'test-compiler/OptimizedCodeSharing1': [SKIP],
-}], # variant == nci or variant == nci_as_highest_tier
+}], # variant == nci or variant == nci_as_midtier
]
diff --git a/deps/v8/test/cctest/compiler/serializer-tester.cc b/deps/v8/test/cctest/compiler/serializer-tester.cc
index 404529e71e..d870c4f074 100644
--- a/deps/v8/test/cctest/compiler/serializer-tester.cc
+++ b/deps/v8/test/cctest/compiler/serializer-tester.cc
@@ -22,6 +22,10 @@ SerializerTester::SerializerTester(const char* source)
: canonical_(main_isolate()) {
// The tests only make sense in the context of concurrent compilation.
FLAG_concurrent_inlining = true;
+ // --local-heaps is enabled by default, but some bots disable it.
+ // Ensure that it is enabled here because we have reverse implication
+ // from --no-local-heaps to --no-concurrent-inlining.
+ if (!FLAG_local_heaps) FLAG_local_heaps = true;
// The tests don't make sense when optimizations are turned off.
FLAG_opt = true;
// We need the IC to feed it to the serializer.
@@ -31,6 +35,7 @@ SerializerTester::SerializerTester(const char* source)
// We need allocation of executable memory for the compilation.
FLAG_jitless = false;
FLAG_allow_natives_syntax = true;
+ FlagList::EnforceFlagImplications();
std::string function_string = "(function() { ";
function_string += source;
diff --git a/deps/v8/test/cctest/compiler/test-js-context-specialization.cc b/deps/v8/test/cctest/compiler/test-js-context-specialization.cc
index a29d9e3d0b..079923967c 100644
--- a/deps/v8/test/cctest/compiler/test-js-context-specialization.cc
+++ b/deps/v8/test/cctest/compiler/test-js-context-specialization.cc
@@ -33,7 +33,7 @@ class ContextSpecializationTester : public HandleAndZoneScope {
simplified_(main_zone()),
jsgraph_(main_isolate(), graph(), common(), &javascript_, &simplified_,
&machine_),
- reducer_(main_zone(), graph(), &tick_counter_),
+ reducer_(main_zone(), graph(), &tick_counter_, &js_heap_broker_),
js_heap_broker_(main_isolate(), main_zone()),
spec_(&reducer_, jsgraph(), &js_heap_broker_, context,
MaybeHandle<JSFunction>()) {}
diff --git a/deps/v8/test/cctest/compiler/test-js-typed-lowering.cc b/deps/v8/test/cctest/compiler/test-js-typed-lowering.cc
index 1bd8706ba5..65725cca37 100644
--- a/deps/v8/test/cctest/compiler/test-js-typed-lowering.cc
+++ b/deps/v8/test/cctest/compiler/test-js-typed-lowering.cc
@@ -93,8 +93,8 @@ class JSTypedLoweringTester : public HandleAndZoneScope {
CHECK(!heap_copy_reducer.Reduce(node).Changed());
JSGraph jsgraph(main_isolate(), &graph, &common, &javascript, &simplified,
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(main_zone(), &graph, &tick_counter);
+ GraphReducer graph_reducer(main_zone(), &graph, &tick_counter,
+ &js_heap_broker);
JSTypedLowering reducer(&graph_reducer, &jsgraph, &js_heap_broker,
main_zone());
Reduction reduction = reducer.Reduce(node);
diff --git a/deps/v8/test/cctest/compiler/test-machine-operator-reducer.cc b/deps/v8/test/cctest/compiler/test-machine-operator-reducer.cc
index e68b5a1315..8c70bb7a8e 100644
--- a/deps/v8/test/cctest/compiler/test-machine-operator-reducer.cc
+++ b/deps/v8/test/cctest/compiler/test-machine-operator-reducer.cc
@@ -88,7 +88,8 @@ class ReducerTester : public HandleAndZoneScope {
javascript(main_zone()),
jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine),
maxuint32(Constant<int32_t>(kMaxUInt32)),
- graph_reducer(main_zone(), &graph, &tick_counter, jsgraph.Dead()) {
+ graph_reducer(main_zone(), &graph, &tick_counter, nullptr,
+ jsgraph.Dead()) {
Node* s = graph.NewNode(common.Start(num_parameters));
graph.SetStart(s);
}
diff --git a/deps/v8/test/cctest/compiler/test-run-calls-to-external-references.cc b/deps/v8/test/cctest/compiler/test-run-calls-to-external-references.cc
index 966946ef99..5944fc9155 100644
--- a/deps/v8/test/cctest/compiler/test-run-calls-to-external-references.cc
+++ b/deps/v8/test/cctest/compiler/test-run-calls-to-external-references.cc
@@ -2,6 +2,7 @@
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
+#include "src/codegen/external-reference.h"
#include "src/objects/objects-inl.h"
#include "src/wasm/wasm-external-refs.h"
#include "test/cctest/cctest.h"
@@ -373,6 +374,565 @@ TEST(RunCallFloat64Pow) {
ValueHelper::float64_vector());
}
+#ifdef V8_ENABLE_FP_PARAMS_IN_C_LINKAGE
+
+template <typename T>
+MachineType MachineTypeForCType() {
+ UNREACHABLE();
+}
+
+template <>
+MachineType MachineTypeForCType<int32_t>() {
+ return MachineType::Int32();
+}
+
+template <>
+MachineType MachineTypeForCType<double>() {
+ return MachineType::Float64();
+}
+
+template <>
+MachineType MachineTypeForCType<float>() {
+ return MachineType::Float32();
+}
+
+#define SIGNATURE_TYPES_END(TYPE, IDX, VALUE) MachineTypeForCType<TYPE>()
+#define SIGNATURE_TYPES(TYPE, IDX, VALUE) SIGNATURE_TYPES_END(TYPE, IDX, VALUE),
+
+#define PARAM_PAIRS_END(TYPE, IDX, VALUE) \
+ std::make_pair(MachineTypeForCType<TYPE>(), m.Parameter(IDX))
+
+#define PARAM_PAIRS(TYPE, IDX, VALUE) PARAM_PAIRS_END(TYPE, IDX, VALUE),
+
+#define CALL_ARGS_END(TYPE, IDX, VALUE) static_cast<TYPE>(VALUE)
+#define CALL_ARGS(TYPE, IDX, VALUE) CALL_ARGS_END(TYPE, IDX, VALUE),
+
+#define COMPARE_ARG_I_END(TYPE, IDX, VALUE) (arg##IDX == VALUE)
+#define COMPARE_ARG_I(TYPE, IDX, VALUE) COMPARE_ARG_I_END(TYPE, IDX, VALUE)&&
+
+#define SIGNATURE_TEST(NAME, SIGNATURE, FUNC) \
+ TEST(NAME) { \
+ RawMachineAssemblerTester<int64_t> m(SIGNATURE(SIGNATURE_TYPES)); \
+ \
+ Address func_address = FUNCTION_ADDR(&FUNC); \
+ ExternalReference::Type dummy_type = ExternalReference::BUILTIN_CALL; \
+ ApiFunction func(func_address); \
+ ExternalReference ref = ExternalReference::Create(&func, dummy_type); \
+ \
+ Node* function = m.ExternalConstant(ref); \
+ m.Return(m.CallCFunction(function, MachineType::Int64(), \
+ SIGNATURE(PARAM_PAIRS))); \
+ \
+ int64_t c = m.Call(SIGNATURE(CALL_ARGS)); \
+ CHECK_EQ(c, 42); \
+ }
+
+#define MIXED_SIGNATURE_SIMPLE(V) \
+ V(int32_t, 0, 0) \
+ V(double, 1, 1.5) \
+ V##_END(int32_t, 2, 2)
+
+int64_t test_api_func_simple(int32_t arg0, double arg1, int32_t arg2) {
+ CHECK(MIXED_SIGNATURE_SIMPLE(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureSimple, MIXED_SIGNATURE_SIMPLE,
+ test_api_func_simple)
+
+#define MIXED_SIGNATURE(V) \
+ V(int32_t, 0, 0) \
+ V(double, 1, 1.5) \
+ V(int32_t, 2, 2) \
+ V(double, 3, 3.5) \
+ V(int32_t, 4, 4) \
+ V(double, 5, 5.5) \
+ V(int32_t, 6, 6) \
+ V(double, 7, 7.5) \
+ V(int32_t, 8, 8) \
+ V(double, 9, 9.5) \
+ V##_END(int32_t, 10, 10)
+
+int64_t test_api_func(int32_t arg0, double arg1, int32_t arg2, double arg3,
+ int32_t arg4, double arg5, int32_t arg6, double arg7,
+ int32_t arg8, double arg9, int32_t arg10) {
+ CHECK(MIXED_SIGNATURE(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignature, MIXED_SIGNATURE, test_api_func)
+
+#define MIXED_SIGNATURE_DOUBLE_INT(V) \
+ V(double, 0, 0.5) \
+ V(double, 1, 1.5) \
+ V(double, 2, 2.5) \
+ V(double, 3, 3.5) \
+ V(double, 4, 4.5) \
+ V(double, 5, 5.5) \
+ V(double, 6, 6.5) \
+ V(double, 7, 7.5) \
+ V(double, 8, 8.5) \
+ V(double, 9, 9.5) \
+ V(int32_t, 10, 10) \
+ V(int32_t, 11, 11) \
+ V(int32_t, 12, 12) \
+ V(int32_t, 13, 13) \
+ V(int32_t, 14, 14) \
+ V(int32_t, 15, 15) \
+ V(int32_t, 16, 16) \
+ V(int32_t, 17, 17) \
+ V(int32_t, 18, 18) \
+ V##_END(int32_t, 19, 19)
+
+int64_t func_mixed_double_int(double arg0, double arg1, double arg2,
+ double arg3, double arg4, double arg5,
+ double arg6, double arg7, double arg8,
+ double arg9, int32_t arg10, int32_t arg11,
+ int32_t arg12, int32_t arg13, int32_t arg14,
+ int32_t arg15, int32_t arg16, int32_t arg17,
+ int32_t arg18, int32_t arg19) {
+ CHECK(MIXED_SIGNATURE_DOUBLE_INT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureDoubleInt, MIXED_SIGNATURE_DOUBLE_INT,
+ func_mixed_double_int)
+
+#define MIXED_SIGNATURE_INT_DOUBLE(V) \
+ V(int32_t, 0, 0) \
+ V(int32_t, 1, 1) \
+ V(int32_t, 2, 2) \
+ V(int32_t, 3, 3) \
+ V(int32_t, 4, 4) \
+ V(int32_t, 5, 5) \
+ V(int32_t, 6, 6) \
+ V(int32_t, 7, 7) \
+ V(int32_t, 8, 8) \
+ V(int32_t, 9, 9) \
+ V(double, 10, 10.5) \
+ V(double, 11, 11.5) \
+ V(double, 12, 12.5) \
+ V(double, 13, 13.5) \
+ V(double, 14, 14.5) \
+ V(double, 15, 15.5) \
+ V(double, 16, 16.5) \
+ V(double, 17, 17.5) \
+ V(double, 18, 18.5) \
+ V##_END(double, 19, 19.5)
+
+int64_t func_mixed_int_double(int32_t arg0, int32_t arg1, int32_t arg2,
+ int32_t arg3, int32_t arg4, int32_t arg5,
+ int32_t arg6, int32_t arg7, int32_t arg8,
+ int32_t arg9, double arg10, double arg11,
+ double arg12, double arg13, double arg14,
+ double arg15, double arg16, double arg17,
+ double arg18, double arg19) {
+ CHECK(MIXED_SIGNATURE_INT_DOUBLE(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureIntDouble, MIXED_SIGNATURE_INT_DOUBLE,
+ func_mixed_int_double)
+
+#define MIXED_SIGNATURE_INT_DOUBLE_ALT(V) \
+ V(int32_t, 0, 0) \
+ V(double, 1, 1.5) \
+ V(int32_t, 2, 2) \
+ V(double, 3, 3.5) \
+ V(int32_t, 4, 4) \
+ V(double, 5, 5.5) \
+ V(int32_t, 6, 6) \
+ V(double, 7, 7.5) \
+ V(int32_t, 8, 8) \
+ V(double, 9, 9.5) \
+ V(int32_t, 10, 10) \
+ V(double, 11, 11.5) \
+ V(int32_t, 12, 12) \
+ V(double, 13, 13.5) \
+ V(int32_t, 14, 14) \
+ V(double, 15, 15.5) \
+ V(int32_t, 16, 16) \
+ V(double, 17, 17.5) \
+ V(int32_t, 18, 18) \
+ V##_END(double, 19, 19.5)
+
+int64_t func_mixed_int_double_alt(int32_t arg0, double arg1, int32_t arg2,
+ double arg3, int32_t arg4, double arg5,
+ int32_t arg6, double arg7, int32_t arg8,
+ double arg9, int32_t arg10, double arg11,
+ int32_t arg12, double arg13, int32_t arg14,
+ double arg15, int32_t arg16, double arg17,
+ int32_t arg18, double arg19) {
+ CHECK(MIXED_SIGNATURE_INT_DOUBLE_ALT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureIntDoubleAlt,
+ MIXED_SIGNATURE_INT_DOUBLE_ALT, func_mixed_int_double_alt)
+
+#define SIGNATURE_ONLY_DOUBLE(V) \
+ V(double, 0, 0.5) \
+ V(double, 1, 1.5) \
+ V(double, 2, 2.5) \
+ V(double, 3, 3.5) \
+ V(double, 4, 4.5) \
+ V(double, 5, 5.5) \
+ V(double, 6, 6.5) \
+ V(double, 7, 7.5) \
+ V(double, 8, 8.5) \
+ V##_END(double, 9, 9.5)
+
+int64_t func_only_double(double arg0, double arg1, double arg2, double arg3,
+ double arg4, double arg5, double arg6, double arg7,
+ double arg8, double arg9) {
+ CHECK(SIGNATURE_ONLY_DOUBLE(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithSignatureOnlyDouble, SIGNATURE_ONLY_DOUBLE,
+ func_only_double)
+
+#define SIGNATURE_ONLY_DOUBLE_20(V) \
+ V(double, 0, 0.5) \
+ V(double, 1, 1.5) \
+ V(double, 2, 2.5) \
+ V(double, 3, 3.5) \
+ V(double, 4, 4.5) \
+ V(double, 5, 5.5) \
+ V(double, 6, 6.5) \
+ V(double, 7, 7.5) \
+ V(double, 8, 8.5) \
+ V(double, 9, 9.5) \
+ V(double, 10, 10.5) \
+ V(double, 11, 11.5) \
+ V(double, 12, 12.5) \
+ V(double, 13, 13.5) \
+ V(double, 14, 14.5) \
+ V(double, 15, 15.5) \
+ V(double, 16, 16.5) \
+ V(double, 17, 17.5) \
+ V(double, 18, 18.5) \
+ V##_END(double, 19, 19.5)
+
+int64_t func_only_double_20(double arg0, double arg1, double arg2, double arg3,
+ double arg4, double arg5, double arg6, double arg7,
+ double arg8, double arg9, double arg10,
+ double arg11, double arg12, double arg13,
+ double arg14, double arg15, double arg16,
+ double arg17, double arg18, double arg19) {
+ CHECK(SIGNATURE_ONLY_DOUBLE_20(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithSignatureOnlyDouble20, SIGNATURE_ONLY_DOUBLE_20,
+ func_only_double_20)
+
+#define SIGNATURE_ONLY_INT(V) \
+ V(int32_t, 0, 0) \
+ V(int32_t, 1, 1) \
+ V(int32_t, 2, 2) \
+ V(int32_t, 3, 3) \
+ V(int32_t, 4, 4) \
+ V(int32_t, 5, 5) \
+ V(int32_t, 6, 6) \
+ V(int32_t, 7, 7) \
+ V(int32_t, 8, 8) \
+ V##_END(int32_t, 9, 9)
+
+int64_t func_only_int(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3,
+ int32_t arg4, int32_t arg5, int32_t arg6, int32_t arg7,
+ int32_t arg8, int32_t arg9) {
+ CHECK(SIGNATURE_ONLY_INT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithSignatureOnlyInt, SIGNATURE_ONLY_INT, func_only_int)
+
+#define SIGNATURE_ONLY_INT_20(V) \
+ V(int32_t, 0, 0) \
+ V(int32_t, 1, 1) \
+ V(int32_t, 2, 2) \
+ V(int32_t, 3, 3) \
+ V(int32_t, 4, 4) \
+ V(int32_t, 5, 5) \
+ V(int32_t, 6, 6) \
+ V(int32_t, 7, 7) \
+ V(int32_t, 8, 8) \
+ V(int32_t, 9, 9) \
+ V(int32_t, 10, 10) \
+ V(int32_t, 11, 11) \
+ V(int32_t, 12, 12) \
+ V(int32_t, 13, 13) \
+ V(int32_t, 14, 14) \
+ V(int32_t, 15, 15) \
+ V(int32_t, 16, 16) \
+ V(int32_t, 17, 17) \
+ V(int32_t, 18, 18) \
+ V##_END(int32_t, 19, 19)
+
+int64_t func_only_int_20(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3,
+ int32_t arg4, int32_t arg5, int32_t arg6, int32_t arg7,
+ int32_t arg8, int32_t arg9, int32_t arg10,
+ int32_t arg11, int32_t arg12, int32_t arg13,
+ int32_t arg14, int32_t arg15, int32_t arg16,
+ int32_t arg17, int32_t arg18, int32_t arg19) {
+ CHECK(SIGNATURE_ONLY_INT_20(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithSignatureOnlyInt20, SIGNATURE_ONLY_INT_20,
+ func_only_int_20)
+
+#define MIXED_SIGNATURE_SIMPLE_FLOAT(V) \
+ V(int32_t, 0, 0) \
+ V(float, 1, 1.5) \
+ V##_END(int32_t, 2, 2)
+
+int64_t test_api_func_simple_float(int32_t arg0, float arg1, int32_t arg2) {
+ CHECK(MIXED_SIGNATURE_SIMPLE_FLOAT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureSimpleFloat,
+ MIXED_SIGNATURE_SIMPLE_FLOAT, test_api_func_simple_float)
+
+#define MIXED_SIGNATURE_FLOAT(V) \
+ V(int32_t, 0, 0) \
+ V(float, 1, 1.5) \
+ V(int32_t, 2, 2) \
+ V(float, 3, 3.5) \
+ V(int32_t, 4, 4) \
+ V(float, 5, 5.5) \
+ V(int32_t, 6, 6) \
+ V(float, 7, 7.5) \
+ V(int32_t, 8, 8) \
+ V(float, 9, 9.5) \
+ V##_END(int32_t, 10, 10)
+
+int64_t test_api_func_float(int32_t arg0, float arg1, int32_t arg2, float arg3,
+ int32_t arg4, float arg5, int32_t arg6, float arg7,
+ int32_t arg8, float arg9, int32_t arg10) {
+ CHECK(MIXED_SIGNATURE_FLOAT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureFloat, MIXED_SIGNATURE_FLOAT,
+ test_api_func_float)
+
+#define MIXED_SIGNATURE_INT_FLOAT_ALT(V) \
+ V(int32_t, 0, 0) \
+ V(float, 1, 1.5) \
+ V(int32_t, 2, 2) \
+ V(float, 3, 3.5) \
+ V(int32_t, 4, 4) \
+ V(float, 5, 5.5) \
+ V(int32_t, 6, 6) \
+ V(float, 7, 7.5) \
+ V(int32_t, 8, 8) \
+ V(float, 9, 9.5) \
+ V(int32_t, 10, 10) \
+ V(float, 11, 11.5) \
+ V(int32_t, 12, 12) \
+ V(float, 13, 13.5) \
+ V(int32_t, 14, 14) \
+ V(float, 15, 15.5) \
+ V(int32_t, 16, 16) \
+ V(float, 17, 17.5) \
+ V(int32_t, 18, 18) \
+ V##_END(float, 19, 19.5)
+
+int64_t func_mixed_int_float_alt(int32_t arg0, float arg1, int32_t arg2,
+ float arg3, int32_t arg4, float arg5,
+ int32_t arg6, float arg7, int32_t arg8,
+ float arg9, int32_t arg10, float arg11,
+ int32_t arg12, float arg13, int32_t arg14,
+ float arg15, int32_t arg16, float arg17,
+ int32_t arg18, float arg19) {
+ CHECK(MIXED_SIGNATURE_INT_FLOAT_ALT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureIntFloatAlt,
+ MIXED_SIGNATURE_INT_FLOAT_ALT, func_mixed_int_float_alt)
+
+#define SIGNATURE_ONLY_FLOAT_20(V) \
+ V(float, 0, 0.5) \
+ V(float, 1, 1.5) \
+ V(float, 2, 2.5) \
+ V(float, 3, 3.5) \
+ V(float, 4, 4.5) \
+ V(float, 5, 5.5) \
+ V(float, 6, 6.5) \
+ V(float, 7, 7.5) \
+ V(float, 8, 8.5) \
+ V(float, 9, 9.5) \
+ V(float, 10, 10.5) \
+ V(float, 11, 11.5) \
+ V(float, 12, 12.5) \
+ V(float, 13, 13.5) \
+ V(float, 14, 14.5) \
+ V(float, 15, 15.5) \
+ V(float, 16, 16.5) \
+ V(float, 17, 17.5) \
+ V(float, 18, 18.5) \
+ V##_END(float, 19, 19.5)
+
+int64_t func_only_float_20(float arg0, float arg1, float arg2, float arg3,
+ float arg4, float arg5, float arg6, float arg7,
+ float arg8, float arg9, float arg10, float arg11,
+ float arg12, float arg13, float arg14, float arg15,
+ float arg16, float arg17, float arg18, float arg19) {
+ CHECK(SIGNATURE_ONLY_FLOAT_20(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithSignatureOnlyFloat20, SIGNATURE_ONLY_FLOAT_20,
+ func_only_float_20)
+
+#define MIXED_SIGNATURE_FLOAT_INT(V) \
+ V(float, 0, 0.5) \
+ V(float, 1, 1.5) \
+ V(float, 2, 2.5) \
+ V(float, 3, 3.5) \
+ V(float, 4, 4.5) \
+ V(float, 5, 5.5) \
+ V(float, 6, 6.5) \
+ V(float, 7, 7.5) \
+ V(float, 8, 8.5) \
+ V(float, 9, 9.5) \
+ V(int32_t, 10, 10) \
+ V(int32_t, 11, 11) \
+ V(int32_t, 12, 12) \
+ V(int32_t, 13, 13) \
+ V(int32_t, 14, 14) \
+ V(int32_t, 15, 15) \
+ V(int32_t, 16, 16) \
+ V(int32_t, 17, 17) \
+ V(int32_t, 18, 18) \
+ V##_END(int32_t, 19, 19)
+
+int64_t func_mixed_float_int(float arg0, float arg1, float arg2, float arg3,
+ float arg4, float arg5, float arg6, float arg7,
+ float arg8, float arg9, int32_t arg10,
+ int32_t arg11, int32_t arg12, int32_t arg13,
+ int32_t arg14, int32_t arg15, int32_t arg16,
+ int32_t arg17, int32_t arg18, int32_t arg19) {
+ CHECK(MIXED_SIGNATURE_FLOAT_INT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureFloatInt, MIXED_SIGNATURE_FLOAT_INT,
+ func_mixed_float_int)
+
+#define MIXED_SIGNATURE_INT_FLOAT(V) \
+ V(int32_t, 0, 0) \
+ V(int32_t, 1, 1) \
+ V(int32_t, 2, 2) \
+ V(int32_t, 3, 3) \
+ V(int32_t, 4, 4) \
+ V(int32_t, 5, 5) \
+ V(int32_t, 6, 6) \
+ V(int32_t, 7, 7) \
+ V(int32_t, 8, 8) \
+ V(int32_t, 9, 9) \
+ V(float, 10, 10.5) \
+ V(float, 11, 11.5) \
+ V(float, 12, 12.5) \
+ V(float, 13, 13.5) \
+ V(float, 14, 14.5) \
+ V(float, 15, 15.5) \
+ V(float, 16, 16.5) \
+ V(float, 17, 17.5) \
+ V(float, 18, 18.5) \
+ V##_END(float, 19, 19.5)
+
+int64_t func_mixed_int_float(int32_t arg0, int32_t arg1, int32_t arg2,
+ int32_t arg3, int32_t arg4, int32_t arg5,
+ int32_t arg6, int32_t arg7, int32_t arg8,
+ int32_t arg9, float arg10, float arg11,
+ float arg12, float arg13, float arg14, float arg15,
+ float arg16, float arg17, float arg18,
+ float arg19) {
+ CHECK(MIXED_SIGNATURE_INT_FLOAT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureIntFloat, MIXED_SIGNATURE_INT_FLOAT,
+ func_mixed_int_float)
+
+#define MIXED_SIGNATURE_FLOAT_DOUBLE(V) \
+ V(float, 0, 0.5) \
+ V(float, 1, 1.5) \
+ V(float, 2, 2.5) \
+ V(float, 3, 3.5) \
+ V(float, 4, 4.5) \
+ V(float, 5, 5.5) \
+ V(float, 6, 6.5) \
+ V(float, 7, 7.5) \
+ V(float, 8, 8.5) \
+ V(float, 9, 9.5) \
+ V(double, 10, 10.7) \
+ V(double, 11, 11.7) \
+ V(double, 12, 12.7) \
+ V(double, 13, 13.7) \
+ V(double, 14, 14.7) \
+ V(double, 15, 15.7) \
+ V(double, 16, 16.7) \
+ V(double, 17, 17.7) \
+ V(double, 18, 18.7) \
+ V##_END(double, 19, 19.7)
+
+int64_t func_mixed_float_double(float arg0, float arg1, float arg2, float arg3,
+ float arg4, float arg5, float arg6, float arg7,
+ float arg8, float arg9, double arg10,
+ double arg11, double arg12, double arg13,
+ double arg14, double arg15, double arg16,
+ double arg17, double arg18, double arg19) {
+ CHECK(MIXED_SIGNATURE_FLOAT_DOUBLE(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureFloatDouble,
+ MIXED_SIGNATURE_FLOAT_DOUBLE, func_mixed_float_double)
+
+#define MIXED_SIGNATURE_DOUBLE_FLOAT(V) \
+ V(double, 0, 0.7) \
+ V(double, 1, 1.7) \
+ V(double, 2, 2.7) \
+ V(double, 3, 3.7) \
+ V(double, 4, 4.7) \
+ V(double, 5, 5.7) \
+ V(double, 6, 6.7) \
+ V(double, 7, 7.7) \
+ V(double, 8, 8.7) \
+ V(double, 9, 9.7) \
+ V(float, 10, 10.5) \
+ V(float, 11, 11.5) \
+ V(float, 12, 12.5) \
+ V(float, 13, 13.5) \
+ V(float, 14, 14.5) \
+ V(float, 15, 15.5) \
+ V(float, 16, 16.5) \
+ V(float, 17, 17.5) \
+ V(float, 18, 18.5) \
+ V##_END(float, 19, 19.5)
+
+int64_t func_mixed_double_float(double arg0, double arg1, double arg2,
+ double arg3, double arg4, double arg5,
+ double arg6, double arg7, double arg8,
+ double arg9, float arg10, float arg11,
+ float arg12, float arg13, float arg14,
+ float arg15, float arg16, float arg17,
+ float arg18, float arg19) {
+ CHECK(MIXED_SIGNATURE_DOUBLE_FLOAT(COMPARE_ARG_I));
+ return 42;
+}
+
+SIGNATURE_TEST(RunCallWithMixedSignatureDoubleFloat,
+ MIXED_SIGNATURE_DOUBLE_FLOAT, func_mixed_double_float)
+
+#endif // V8_ENABLE_FP_PARAMS_IN_C_LINKAGE
+
} // namespace compiler
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/heap/heap-tester.h b/deps/v8/test/cctest/heap/heap-tester.h
index af4ddaa084..92ee4d7055 100644
--- a/deps/v8/test/cctest/heap/heap-tester.h
+++ b/deps/v8/test/cctest/heap/heap-tester.h
@@ -11,6 +11,7 @@
// Tests that should have access to private methods of {v8::internal::Heap}.
// Those tests need to be defined using HEAP_TEST(Name) { ... }.
#define HEAP_TEST_METHODS(V) \
+ V(CodeLargeObjectSpace) \
V(CompactionFullAbortedPage) \
V(CompactionPartiallyAbortedPage) \
V(CompactionPartiallyAbortedPageIntraAbortedPointers) \
@@ -61,7 +62,8 @@
V(WriteBarrier_Marking) \
V(WriteBarrier_MarkingExtension) \
V(WriteBarriersInCopyJSObject) \
- V(DoNotEvacuatePinnedPages)
+ V(DoNotEvacuatePinnedPages) \
+ V(ObjectStartBitmap)
#define HEAP_TEST(Name) \
CcTest register_test_##Name(v8::internal::heap::HeapTester::Test##Name, \
diff --git a/deps/v8/test/cctest/heap/heap-utils.cc b/deps/v8/test/cctest/heap/heap-utils.cc
index e6c13137dc..f8c47a6a73 100644
--- a/deps/v8/test/cctest/heap/heap-utils.cc
+++ b/deps/v8/test/cctest/heap/heap-utils.cc
@@ -4,6 +4,7 @@
#include "test/cctest/heap/heap-utils.h"
+#include "src/base/platform/mutex.h"
#include "src/execution/isolate.h"
#include "src/heap/factory.h"
#include "src/heap/heap-inl.h"
@@ -17,11 +18,17 @@ namespace v8 {
namespace internal {
namespace heap {
-void InvokeScavenge() { CcTest::CollectGarbage(i::NEW_SPACE); }
+void InvokeScavenge(Isolate* isolate) {
+ CcTest::CollectGarbage(i::NEW_SPACE, isolate);
+}
-void InvokeMarkSweep() { CcTest::CollectAllGarbage(); }
+void InvokeMarkSweep(Isolate* isolate) { CcTest::CollectAllGarbage(isolate); }
void SealCurrentObjects(Heap* heap) {
+ // If you see this check failing, disable the flag at the start of your test:
+ // FLAG_stress_concurrent_allocation = false;
+ // Background thread allocating concurrently interferes with this function.
+ CHECK(!FLAG_stress_concurrent_allocation);
CcTest::CollectAllGarbage();
CcTest::CollectAllGarbage();
heap->mark_compact_collector()->EnsureSweepingCompleted();
@@ -87,9 +94,7 @@ std::vector<Handle<FixedArray>> CreatePadding(Heap* heap, int padding_size,
int overall_free_memory = static_cast<int>(heap->old_space()->Available());
CHECK(padding_size <= overall_free_memory || overall_free_memory == 0);
} else {
- int overall_free_memory =
- static_cast<int>(*heap->new_space()->allocation_limit_address() -
- *heap->new_space()->allocation_top_address());
+ int overall_free_memory = static_cast<int>(heap->new_space()->Available());
CHECK(padding_size <= overall_free_memory || overall_free_memory == 0);
}
while (free_memory > 0) {
@@ -151,6 +156,10 @@ bool FillCurrentPageButNBytes(v8::internal::NewSpace* space, int extra_bytes,
void SimulateFullSpace(v8::internal::NewSpace* space,
std::vector<Handle<FixedArray>>* out_handles) {
+ // If you see this check failing, disable the flag at the start of your test:
+ // FLAG_stress_concurrent_allocation = false;
+ // Background thread allocating concurrently interferes with this function.
+ CHECK(!FLAG_stress_concurrent_allocation);
while (heap::FillCurrentPage(space, out_handles) || space->AddFreshPage()) {
}
}
@@ -187,7 +196,10 @@ void SimulateIncrementalMarking(i::Heap* heap, bool force_completion) {
}
void SimulateFullSpace(v8::internal::PagedSpace* space) {
- SafepointScope scope(space->heap());
+ // If you see this check failing, disable the flag at the start of your test:
+ // FLAG_stress_concurrent_allocation = false;
+ // Background thread allocating concurrently interferes with this function.
+ CHECK(!FLAG_stress_concurrent_allocation);
CodeSpaceMemoryModificationScope modification_scope(space->heap());
i::MarkCompactCollector* collector = space->heap()->mark_compact_collector();
if (collector->sweeping_in_progress()) {
@@ -224,6 +236,7 @@ void ForceEvacuationCandidate(Page* page) {
int remaining = static_cast<int>(limit - top);
space->heap()->CreateFillerObjectAt(top, remaining,
ClearRecordedSlots::kNo);
+ base::MutexGuard guard(space->mutex());
space->FreeLinearAllocationArea();
}
}
@@ -233,6 +246,24 @@ bool InCorrectGeneration(HeapObject object) {
: i::Heap::InYoungGeneration(object);
}
+void EnsureFlagLocalHeapsEnabled() {
+ // Avoid data race in concurrent thread by only setting the flag to true if
+ // not already enabled.
+ if (!FLAG_local_heaps) FLAG_local_heaps = true;
+}
+
+void GrowNewSpace(Heap* heap) {
+ SafepointScope scope(heap);
+ heap->new_space()->Grow();
+}
+
+void GrowNewSpaceToMaximumCapacity(Heap* heap) {
+ SafepointScope scope(heap);
+ while (!heap->new_space()->IsAtMaximumCapacity()) {
+ heap->new_space()->Grow();
+ }
+}
+
} // namespace heap
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/heap/heap-utils.h b/deps/v8/test/cctest/heap/heap-utils.h
index 79a36c7ec5..6225b89ecc 100644
--- a/deps/v8/test/cctest/heap/heap-utils.h
+++ b/deps/v8/test/cctest/heap/heap-utils.h
@@ -66,9 +66,15 @@ void GcAndSweep(Heap* heap, AllocationSpace space);
void ForceEvacuationCandidate(Page* page);
-void InvokeScavenge();
+void InvokeScavenge(Isolate* isolate = nullptr);
-void InvokeMarkSweep();
+void InvokeMarkSweep(Isolate* isolate = nullptr);
+
+void EnsureFlagLocalHeapsEnabled();
+
+void GrowNewSpace(Heap* heap);
+
+void GrowNewSpaceToMaximumCapacity(Heap* heap);
template <typename GlobalOrPersistent>
bool InYoungGeneration(v8::Isolate* isolate, const GlobalOrPersistent& global) {
diff --git a/deps/v8/test/cctest/heap/test-alloc.cc b/deps/v8/test/cctest/heap/test-alloc.cc
index d92375d362..d50287ee30 100644
--- a/deps/v8/test/cctest/heap/test-alloc.cc
+++ b/deps/v8/test/cctest/heap/test-alloc.cc
@@ -96,6 +96,8 @@ Handle<Object> HeapTester::TestAllocateAfterFailures() {
HEAP_TEST(StressHandles) {
+ // For TestAllocateAfterFailures.
+ FLAG_stress_concurrent_allocation = false;
v8::HandleScope scope(CcTest::isolate());
v8::Local<v8::Context> env = v8::Context::New(CcTest::isolate());
env->Enter();
@@ -128,6 +130,8 @@ Handle<AccessorInfo> TestAccessorInfo(
TEST(StressJS) {
+ // For TestAllocateAfterFailures in TestGetter.
+ FLAG_stress_concurrent_allocation = false;
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
v8::HandleScope scope(CcTest::isolate());
diff --git a/deps/v8/test/cctest/heap/test-concurrent-allocation.cc b/deps/v8/test/cctest/heap/test-concurrent-allocation.cc
index 73629454e8..b83b55551a 100644
--- a/deps/v8/test/cctest/heap/test-concurrent-allocation.cc
+++ b/deps/v8/test/cctest/heap/test-concurrent-allocation.cc
@@ -8,6 +8,10 @@
#include "src/base/platform/condition-variable.h"
#include "src/base/platform/mutex.h"
#include "src/base/platform/semaphore.h"
+#include "src/codegen/assembler-inl.h"
+#include "src/codegen/assembler.h"
+#include "src/codegen/macro-assembler-inl.h"
+#include "src/codegen/macro-assembler.h"
#include "src/common/globals.h"
#include "src/handles/handles-inl.h"
#include "src/handles/local-handles-inl.h"
@@ -250,5 +254,143 @@ UNINITIALIZED_TEST(ConcurrentBlackAllocation) {
isolate->Dispose();
}
+class ConcurrentWriteBarrierThread final : public v8::base::Thread {
+ public:
+ explicit ConcurrentWriteBarrierThread(Heap* heap, FixedArray fixed_array,
+ HeapObject value)
+ : v8::base::Thread(base::Thread::Options("ThreadWithLocalHeap")),
+ heap_(heap),
+ fixed_array_(fixed_array),
+ value_(value) {}
+
+ void Run() override {
+ LocalHeap local_heap(heap_);
+ fixed_array_.set(0, value_);
+ }
+
+ Heap* heap_;
+ FixedArray fixed_array_;
+ HeapObject value_;
+};
+
+UNINITIALIZED_TEST(ConcurrentWriteBarrier) {
+ if (!FLAG_concurrent_marking) {
+ // The test requires concurrent marking barrier.
+ return;
+ }
+ ManualGCScope manual_gc_scope;
+ FLAG_concurrent_allocation = true;
+ FLAG_local_heaps = true;
+
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
+ Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
+ Heap* heap = i_isolate->heap();
+
+ FixedArray fixed_array;
+ HeapObject value;
+ {
+ HandleScope handle_scope(i_isolate);
+ Handle<FixedArray> fixed_array_handle(
+ i_isolate->factory()->NewFixedArray(1));
+ Handle<HeapNumber> value_handle(
+ i_isolate->factory()->NewHeapNumber<AllocationType::kOld>(1.1));
+ fixed_array = *fixed_array_handle;
+ value = *value_handle;
+ }
+ heap->StartIncrementalMarking(i::Heap::kNoGCFlags,
+ i::GarbageCollectionReason::kTesting);
+ CHECK(heap->incremental_marking()->marking_state()->IsWhite(value));
+
+ auto thread =
+ std::make_unique<ConcurrentWriteBarrierThread>(heap, fixed_array, value);
+ CHECK(thread->Start());
+
+ thread->Join();
+
+ CHECK(heap->incremental_marking()->marking_state()->IsBlackOrGrey(value));
+ heap::InvokeMarkSweep(i_isolate);
+
+ isolate->Dispose();
+}
+
+class ConcurrentRecordRelocSlotThread final : public v8::base::Thread {
+ public:
+ explicit ConcurrentRecordRelocSlotThread(Heap* heap, Code code,
+ HeapObject value)
+ : v8::base::Thread(base::Thread::Options("ThreadWithLocalHeap")),
+ heap_(heap),
+ code_(code),
+ value_(value) {}
+
+ void Run() override {
+ LocalHeap local_heap(heap_);
+ int mode_mask = RelocInfo::EmbeddedObjectModeMask();
+ for (RelocIterator it(code_, mode_mask); !it.done(); it.next()) {
+ DCHECK(RelocInfo::IsEmbeddedObjectMode(it.rinfo()->rmode()));
+ it.rinfo()->set_target_object(heap_, value_);
+ }
+ }
+
+ Heap* heap_;
+ Code code_;
+ HeapObject value_;
+};
+
+UNINITIALIZED_TEST(ConcurrentRecordRelocSlot) {
+ if (!FLAG_concurrent_marking) {
+ // The test requires concurrent marking barrier.
+ return;
+ }
+ FLAG_manual_evacuation_candidates_selection = true;
+ ManualGCScope manual_gc_scope;
+ FLAG_concurrent_allocation = true;
+ FLAG_local_heaps = true;
+
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
+ Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
+ Heap* heap = i_isolate->heap();
+
+ Code code;
+ HeapObject value;
+ {
+ HandleScope handle_scope(i_isolate);
+ i::byte buffer[i::Assembler::kDefaultBufferSize];
+ MacroAssembler masm(i_isolate, v8::internal::CodeObjectRequired::kYes,
+ ExternalAssemblerBuffer(buffer, sizeof(buffer)));
+ masm.Push(ReadOnlyRoots(heap).undefined_value_handle());
+ CodeDesc desc;
+ masm.GetCode(i_isolate, &desc);
+ Handle<Code> code_handle =
+ Factory::CodeBuilder(i_isolate, desc, CodeKind::STUB).Build();
+ heap::AbandonCurrentlyFreeMemory(heap->old_space());
+ Handle<HeapNumber> value_handle(
+ i_isolate->factory()->NewHeapNumber<AllocationType::kOld>(1.1));
+ heap::ForceEvacuationCandidate(Page::FromHeapObject(*value_handle));
+ code = *code_handle;
+ value = *value_handle;
+ }
+ heap->StartIncrementalMarking(i::Heap::kNoGCFlags,
+ i::GarbageCollectionReason::kTesting);
+ CHECK(heap->incremental_marking()->marking_state()->IsWhite(value));
+
+ {
+ CodeSpaceMemoryModificationScope modification_scope(heap);
+ auto thread =
+ std::make_unique<ConcurrentRecordRelocSlotThread>(heap, code, value);
+ CHECK(thread->Start());
+
+ thread->Join();
+ }
+
+ CHECK(heap->incremental_marking()->marking_state()->IsBlackOrGrey(value));
+ heap::InvokeMarkSweep(i_isolate);
+
+ isolate->Dispose();
+}
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/heap/test-embedder-tracing.cc b/deps/v8/test/cctest/heap/test-embedder-tracing.cc
index 36142f6561..70778f51ee 100644
--- a/deps/v8/test/cctest/heap/test-embedder-tracing.cc
+++ b/deps/v8/test/cctest/heap/test-embedder-tracing.cc
@@ -455,7 +455,7 @@ TEST(TracedGlobalToUnmodifiedJSObjectDiesOnMarkSweep) {
CcTest::InitializeVM();
TracedGlobalTest(
CcTest::isolate(), ConstructJSObject,
- [](const TracedGlobal<v8::Object>& global) {}, InvokeMarkSweep,
+ [](const TracedGlobal<v8::Object>& global) {}, [] { InvokeMarkSweep(); },
SurvivalMode::kDies);
}
@@ -469,7 +469,7 @@ TEST(TracedGlobalToUnmodifiedJSObjectSurvivesMarkSweepWhenHeldAliveOtherwise) {
v8::HandleScope scope(isolate);
strong_global = v8::Global<v8::Object>(isolate, global.Get(isolate));
},
- InvokeMarkSweep, SurvivalMode::kSurvives);
+ []() { InvokeMarkSweep(); }, SurvivalMode::kSurvives);
}
TEST(TracedGlobalToUnmodifiedJSObjectSurvivesScavenge) {
@@ -478,7 +478,7 @@ TEST(TracedGlobalToUnmodifiedJSObjectSurvivesScavenge) {
CcTest::InitializeVM();
TracedGlobalTest(
CcTest::isolate(), ConstructJSObject,
- [](const TracedGlobal<v8::Object>& global) {}, InvokeScavenge,
+ [](const TracedGlobal<v8::Object>& global) {}, []() { InvokeScavenge(); },
SurvivalMode::kSurvives);
}
@@ -492,7 +492,7 @@ TEST(TracedGlobalToUnmodifiedJSObjectSurvivesScavengeWhenExcludedFromRoots) {
tracer.ConsiderTracedGlobalAsRoot(false);
TracedGlobalTest(
CcTest::isolate(), ConstructJSObject,
- [](const TracedGlobal<v8::Object>& global) {}, InvokeScavenge,
+ [](const TracedGlobal<v8::Object>& global) {}, []() { InvokeScavenge(); },
SurvivalMode::kSurvives);
}
@@ -506,7 +506,7 @@ TEST(TracedGlobalToUnmodifiedJSApiObjectSurvivesScavengePerDefault) {
tracer.ConsiderTracedGlobalAsRoot(true);
TracedGlobalTest(
CcTest::isolate(), ConstructJSApiObject<TracedGlobal<v8::Object>>,
- [](const TracedGlobal<v8::Object>& global) {}, InvokeScavenge,
+ [](const TracedGlobal<v8::Object>& global) {}, []() { InvokeScavenge(); },
SurvivalMode::kSurvives);
}
@@ -520,7 +520,7 @@ TEST(TracedGlobalToUnmodifiedJSApiObjectDiesOnScavengeWhenExcludedFromRoots) {
tracer.ConsiderTracedGlobalAsRoot(false);
TracedGlobalTest(
CcTest::isolate(), ConstructJSApiObject<TracedGlobal<v8::Object>>,
- [](const TracedGlobal<v8::Object>& global) {}, InvokeScavenge,
+ [](const TracedGlobal<v8::Object>& global) {}, []() { InvokeScavenge(); },
SurvivalMode::kDies);
}
diff --git a/deps/v8/test/cctest/heap/test-heap.cc b/deps/v8/test/cctest/heap/test-heap.cc
index 669a1d85f9..1856417825 100644
--- a/deps/v8/test/cctest/heap/test-heap.cc
+++ b/deps/v8/test/cctest/heap/test-heap.cc
@@ -546,7 +546,7 @@ TEST(WeakGlobalUnmodifiedApiHandlesScavenge) {
}
TEST(WeakGlobalHandlesMark) {
- FLAG_stress_incremental_marking = false;
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
@@ -1215,6 +1215,47 @@ HEAP_TEST(Regress10560) {
}
}
+UNINITIALIZED_TEST(Regress10843) {
+ FLAG_max_semi_space_size = 2;
+ FLAG_min_semi_space_size = 2;
+ FLAG_max_old_space_size = 8;
+ FLAG_always_compact = true;
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
+ Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
+ Factory* factory = i_isolate->factory();
+ Heap* heap = i_isolate->heap();
+ bool callback_was_invoked = false;
+
+ heap->AddNearHeapLimitCallback(
+ [](void* data, size_t current_heap_limit,
+ size_t initial_heap_limit) -> size_t {
+ *reinterpret_cast<bool*>(data) = true;
+ return current_heap_limit * 2;
+ },
+ &callback_was_invoked);
+
+ {
+ HandleScope scope(i_isolate);
+ std::vector<Handle<FixedArray>> arrays;
+ for (int i = 0; i < 140; i++) {
+ arrays.push_back(factory->NewFixedArray(10000));
+ }
+ CcTest::CollectAllGarbage(i_isolate);
+ CcTest::CollectAllGarbage(i_isolate);
+ for (int i = 0; i < 40; i++) {
+ arrays.push_back(factory->NewFixedArray(10000));
+ }
+ CcTest::CollectAllGarbage(i_isolate);
+ for (int i = 0; i < 100; i++) {
+ arrays.push_back(factory->NewFixedArray(10000));
+ }
+ CHECK(callback_was_invoked);
+ }
+ isolate->Dispose();
+}
+
// Tests that spill slots from optimized code don't have weak pointers.
TEST(Regress10774) {
i::FLAG_allow_natives_syntax = true;
@@ -1281,6 +1322,7 @@ TEST(TestOptimizeAfterBytecodeFlushingCandidate) {
i::FLAG_incremental_marking = true;
i::FLAG_flush_bytecode = true;
i::FLAG_allow_natives_syntax = true;
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
@@ -1593,6 +1635,7 @@ TEST(TestInternalWeakLists) {
TEST(TestSizeOfRegExpCode) {
if (!FLAG_regexp_optimization) return;
+ FLAG_stress_concurrent_allocation = false;
v8::V8::Initialize();
@@ -1650,6 +1693,7 @@ TEST(TestSizeOfRegExpCode) {
HEAP_TEST(TestSizeOfObjects) {
+ FLAG_stress_concurrent_allocation = false;
v8::V8::Initialize();
Isolate* isolate = CcTest::i_isolate();
Heap* heap = CcTest::heap();
@@ -1820,6 +1864,8 @@ static Address AlignOldSpace(AllocationAlignment alignment, int offset) {
// Test the case where allocation must be done from the free list, so filler
// may precede or follow the object.
TEST(TestAlignedOverAllocation) {
+ if (FLAG_stress_concurrent_allocation) return;
+ ManualGCScope manual_gc_scope;
Heap* heap = CcTest::heap();
// Test checks for fillers before and behind objects and requires a fresh
// page and empty free list.
@@ -1943,7 +1989,7 @@ TEST(GrowAndShrinkNewSpace) {
// Avoid shrinking new space in GC epilogue. This can happen if allocation
// throughput samples have been taken while executing the benchmark.
FLAG_predictable = true;
-
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
Heap* heap = CcTest::heap();
NewSpace* new_space = heap->new_space();
@@ -1960,7 +2006,7 @@ TEST(GrowAndShrinkNewSpace) {
// Explicitly growing should double the space capacity.
size_t old_capacity, new_capacity;
old_capacity = new_space->TotalCapacity();
- new_space->Grow();
+ GrowNewSpace(heap);
new_capacity = new_space->TotalCapacity();
CHECK_EQ(2 * old_capacity, new_capacity);
@@ -1999,6 +2045,7 @@ TEST(GrowAndShrinkNewSpace) {
TEST(CollectingAllAvailableGarbageShrinksNewSpace) {
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
Heap* heap = CcTest::heap();
if (heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) {
@@ -2009,7 +2056,7 @@ TEST(CollectingAllAvailableGarbageShrinksNewSpace) {
NewSpace* new_space = heap->new_space();
size_t old_capacity, new_capacity;
old_capacity = new_space->TotalCapacity();
- new_space->Grow();
+ GrowNewSpace(heap);
new_capacity = new_space->TotalCapacity();
CHECK_EQ(2 * old_capacity, new_capacity);
{
@@ -2393,6 +2440,7 @@ TEST(IdleNotificationFinishMarking) {
TEST(OptimizedAllocationAlwaysInNewSpace) {
if (FLAG_single_generation) return;
FLAG_allow_natives_syntax = true;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
if (!CcTest::i_isolate()->use_optimizer() || FLAG_always_opt) return;
if (FLAG_gc_global || FLAG_stress_compaction ||
@@ -2438,10 +2486,7 @@ TEST(OptimizedPretenuringAllocationFolding) {
return;
v8::HandleScope scope(CcTest::isolate());
v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
- // Grow new space unitl maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2492,10 +2537,7 @@ TEST(OptimizedPretenuringObjectArrayLiterals) {
}
v8::HandleScope scope(CcTest::isolate());
- // Grow new space unitl maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2534,10 +2576,7 @@ TEST(OptimizedPretenuringNestedInObjectProperties) {
}
v8::HandleScope scope(CcTest::isolate());
- // Grow new space until maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
// Keep the nested literal alive while its root is freed
i::ScopedVector<char> source(1024);
@@ -2578,11 +2617,7 @@ TEST(OptimizedPretenuringMixedInObjectProperties) {
return;
v8::HandleScope scope(CcTest::isolate());
- // Grow new space unitl maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
-
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2637,10 +2672,7 @@ TEST(OptimizedPretenuringDoubleArrayProperties) {
return;
v8::HandleScope scope(CcTest::isolate());
- // Grow new space until maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2679,10 +2711,7 @@ TEST(OptimizedPretenuringDoubleArrayLiterals) {
return;
v8::HandleScope scope(CcTest::isolate());
- // Grow new space until maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2720,10 +2749,7 @@ TEST(OptimizedPretenuringNestedMixedArrayLiterals) {
return;
v8::HandleScope scope(CcTest::isolate());
v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
- // Grow new space unitl maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2773,10 +2799,7 @@ TEST(OptimizedPretenuringNestedObjectLiterals) {
return;
v8::HandleScope scope(CcTest::isolate());
v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
- // Grow new space unitl maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -2826,10 +2849,7 @@ TEST(OptimizedPretenuringNestedDoubleLiterals) {
return;
v8::HandleScope scope(CcTest::isolate());
v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext();
- // Grow new space unitl maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -5024,6 +5044,7 @@ TEST(Regress388880) {
if (!FLAG_incremental_marking) return;
FLAG_stress_incremental_marking = false;
FLAG_expose_gc = true;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Isolate* isolate = CcTest::i_isolate();
@@ -5324,6 +5345,7 @@ TEST(NewSpaceAllocationCounter) {
TEST(OldSpaceAllocationCounter) {
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Isolate* isolate = CcTest::i_isolate();
@@ -5543,7 +5565,7 @@ HEAP_TEST(Regress587004) {
}
HEAP_TEST(Regress589413) {
- if (!FLAG_incremental_marking) return;
+ if (!FLAG_incremental_marking || FLAG_stress_concurrent_allocation) return;
FLAG_stress_compaction = true;
FLAG_manual_evacuation_candidates_selection = true;
FLAG_parallel_compaction = false;
@@ -5779,6 +5801,7 @@ Handle<FixedArray> ShrinkArrayAndCheckSize(Heap* heap, int length) {
}
TEST(Regress609761) {
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -5788,6 +5811,7 @@ TEST(Regress609761) {
}
TEST(LiveBytes) {
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -5797,6 +5821,7 @@ TEST(LiveBytes) {
TEST(Regress615489) {
if (!FLAG_incremental_marking) return;
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -5905,6 +5930,7 @@ TEST(Regress631969) {
TEST(LeftTrimFixedArrayInBlackArea) {
if (!FLAG_incremental_marking) return;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -5945,6 +5971,7 @@ TEST(LeftTrimFixedArrayInBlackArea) {
TEST(ContinuousLeftTrimFixedArrayInBlackArea) {
if (!FLAG_incremental_marking) return;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -6013,6 +6040,7 @@ TEST(ContinuousLeftTrimFixedArrayInBlackArea) {
TEST(ContinuousRightTrimFixedArrayInBlackArea) {
if (!FLAG_incremental_marking) return;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -6221,6 +6249,7 @@ static size_t GetRememberedSetSize(HeapObject obj) {
TEST(RememberedSet_InsertOnWriteBarrier) {
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
@@ -6248,6 +6277,7 @@ TEST(RememberedSet_InsertOnWriteBarrier) {
TEST(RememberedSet_InsertInLargePage) {
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
@@ -6274,6 +6304,7 @@ TEST(RememberedSet_InsertInLargePage) {
TEST(RememberedSet_InsertOnPromotingObjectToOld) {
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
@@ -6303,6 +6334,7 @@ TEST(RememberedSet_InsertOnPromotingObjectToOld) {
TEST(RememberedSet_RemoveStaleOnScavenge) {
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
@@ -6342,7 +6374,7 @@ TEST(RememberedSet_RemoveStaleOnScavenge) {
// that compaction has happened and otherwise relies on code's self-validation.
TEST(RememberedSet_OldToOld) {
if (FLAG_stress_incremental_marking) return;
-
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
@@ -6459,7 +6491,7 @@ TEST(RememberedSetRemoveRange) {
HEAP_TEST(Regress670675) {
if (!FLAG_incremental_marking) return;
- FLAG_stress_incremental_marking = false;
+ ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
Heap* heap = CcTest::heap();
@@ -6657,7 +6689,8 @@ UNINITIALIZED_TEST(OutOfMemory) {
UNINITIALIZED_TEST(OutOfMemoryIneffectiveGC) {
if (!FLAG_detect_ineffective_gcs_near_heap_limit) return;
- if (FLAG_stress_incremental_marking) return;
+ if (FLAG_stress_incremental_marking || FLAG_stress_concurrent_allocation)
+ return;
#ifdef VERIFY_HEAP
if (FLAG_verify_heap) return;
#endif
@@ -6733,6 +6766,7 @@ HEAP_TEST(Regress779503) {
// that it currently processes because it might allocate over the currently
// processed slot.
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
const int kArraySize = 2048;
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
@@ -7145,7 +7179,7 @@ TEST(Regress978156) {
}
TEST(GarbageCollectionWithLocalHeap) {
- FLAG_local_heaps = true;
+ EnsureFlagLocalHeapsEnabled();
ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
@@ -7158,7 +7192,6 @@ TEST(GarbageCollectionWithLocalHeap) {
}
TEST(Regress10698) {
- ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
Heap* heap = CcTest::i_isolate()->heap();
Factory* factory = CcTest::i_isolate()->factory();
@@ -7180,6 +7213,66 @@ TEST(Regress10698) {
filler.set_map_after_allocation(*factory->one_pointer_filler_map());
}
+class TestAllocationTracker : public HeapObjectAllocationTracker {
+ public:
+ explicit TestAllocationTracker(int expected_size)
+ : expected_size_(expected_size) {}
+
+ void AllocationEvent(Address addr, int size) {
+ CHECK(expected_size_ == size);
+ address_ = addr;
+ }
+
+ Address address() { return address_; }
+
+ private:
+ int expected_size_;
+ Address address_;
+};
+
+HEAP_TEST(CodeLargeObjectSpace) {
+ Heap* heap = CcTest::heap();
+ int size_in_bytes = kMaxRegularHeapObjectSize + kSystemPointerSize;
+ TestAllocationTracker allocation_tracker{size_in_bytes};
+ heap->AddHeapObjectAllocationTracker(&allocation_tracker);
+
+ AllocationResult allocation = heap->AllocateRaw(
+ size_in_bytes, AllocationType::kCode, AllocationOrigin::kGeneratedCode,
+ AllocationAlignment::kCodeAligned);
+
+ CHECK(allocation.ToAddress() == allocation_tracker.address());
+ heap->CreateFillerObjectAt(allocation.ToAddress(), size_in_bytes,
+ ClearRecordedSlots::kNo);
+ heap->RemoveHeapObjectAllocationTracker(&allocation_tracker);
+}
+
+TEST(Regress10900) {
+ FLAG_always_compact = true;
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ Heap* heap = isolate->heap();
+ Factory* factory = isolate->factory();
+ HandleScope handle_scope(isolate);
+ i::byte buffer[i::Assembler::kDefaultBufferSize];
+ MacroAssembler masm(isolate, v8::internal::CodeObjectRequired::kYes,
+ ExternalAssemblerBuffer(buffer, sizeof(buffer)));
+ masm.Push(ReadOnlyRoots(heap).undefined_value_handle());
+ CodeDesc desc;
+ masm.GetCode(isolate, &desc);
+ Handle<Code> code =
+ Factory::CodeBuilder(isolate, desc, CodeKind::STUB).Build();
+ {
+ // Generate multiple code pages.
+ CodeSpaceMemoryModificationScope modification_scope(isolate->heap());
+ for (int i = 0; i < 100; i++) {
+ factory->CopyCode(code);
+ }
+ }
+ // Force garbage collection that compacts code pages and triggers
+ // an assertion in Isolate::AddCodeMemoryRange before the bug fix.
+ CcTest::CollectAllAvailableGarbage();
+}
+
} // namespace heap
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/heap/test-incremental-marking.cc b/deps/v8/test/cctest/heap/test-incremental-marking.cc
index 998209bfe0..d65bc703b5 100644
--- a/deps/v8/test/cctest/heap/test-incremental-marking.cc
+++ b/deps/v8/test/cctest/heap/test-incremental-marking.cc
@@ -100,6 +100,7 @@ class MockPlatform : public TestPlatform {
TEST(IncrementalMarkingUsingTasks) {
if (!i::FLAG_incremental_marking) return;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
FLAG_stress_incremental_marking = false;
CcTest::InitializeVM();
MockPlatform platform;
diff --git a/deps/v8/test/cctest/heap/test-invalidated-slots.cc b/deps/v8/test/cctest/heap/test-invalidated-slots.cc
index c597fe839d..9683331904 100644
--- a/deps/v8/test/cctest/heap/test-invalidated-slots.cc
+++ b/deps/v8/test/cctest/heap/test-invalidated-slots.cc
@@ -48,6 +48,7 @@ Page* HeapTester::AllocateByteArraysOnPage(
}
HEAP_TEST(InvalidatedSlotsNoInvalidatedRanges) {
+ FLAG_stress_concurrent_allocation = false; // For AllocateByteArraysOnPage.
CcTest::InitializeVM();
Heap* heap = CcTest::heap();
std::vector<ByteArray> byte_arrays;
@@ -63,6 +64,7 @@ HEAP_TEST(InvalidatedSlotsNoInvalidatedRanges) {
}
HEAP_TEST(InvalidatedSlotsSomeInvalidatedRanges) {
+ FLAG_stress_concurrent_allocation = false; // For AllocateByteArraysOnPage.
CcTest::InitializeVM();
Heap* heap = CcTest::heap();
std::vector<ByteArray> byte_arrays;
@@ -87,6 +89,7 @@ HEAP_TEST(InvalidatedSlotsSomeInvalidatedRanges) {
}
HEAP_TEST(InvalidatedSlotsAllInvalidatedRanges) {
+ FLAG_stress_concurrent_allocation = false; // For AllocateByteArraysOnPage.
CcTest::InitializeVM();
Heap* heap = CcTest::heap();
std::vector<ByteArray> byte_arrays;
@@ -156,6 +159,7 @@ HEAP_TEST(InvalidatedSlotsEvacuationCandidate) {
}
HEAP_TEST(InvalidatedSlotsResetObjectRegression) {
+ FLAG_stress_concurrent_allocation = false; // For AllocateByteArraysOnPage.
CcTest::InitializeVM();
Heap* heap = CcTest::heap();
std::vector<ByteArray> byte_arrays;
diff --git a/deps/v8/test/cctest/heap/test-mark-compact.cc b/deps/v8/test/cctest/heap/test-mark-compact.cc
index 6097b41c47..e705427f27 100644
--- a/deps/v8/test/cctest/heap/test-mark-compact.cc
+++ b/deps/v8/test/cctest/heap/test-mark-compact.cc
@@ -53,6 +53,7 @@ namespace heap {
TEST(Promotion) {
if (FLAG_single_generation) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
{
@@ -74,6 +75,7 @@ TEST(Promotion) {
HEAP_TEST(NoPromotion) {
if (FLAG_always_promote_young_mc) return;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
// Page promotion allows pages to be moved to old space even in the case of
// OOM scenarios.
FLAG_page_promotion = false;
@@ -249,6 +251,44 @@ HEAP_TEST(DoNotEvacuatePinnedPages) {
}
}
+HEAP_TEST(ObjectStartBitmap) {
+ if (!FLAG_single_generation || !FLAG_conservative_stack_scanning) return;
+
+#if V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ v8::HandleScope sc(CcTest::isolate());
+
+ Heap* heap = isolate->heap();
+ heap::SealCurrentObjects(heap);
+
+ auto* factory = isolate->factory();
+ HeapObject obj = *factory->NewStringFromStaticChars("hello");
+ HeapObject obj2 = *factory->NewStringFromStaticChars("world");
+ Page* page = Page::FromAddress(obj.ptr());
+
+ CHECK(page->object_start_bitmap()->CheckBit(obj.address()));
+ CHECK(page->object_start_bitmap()->CheckBit(obj2.address()));
+
+ Address obj_inner_ptr = obj.ptr() + 2;
+ CHECK(page->object_start_bitmap()->FindBasePtr(obj_inner_ptr) ==
+ obj.address());
+
+ Address obj2_inner_ptr = obj2.ptr() + 2;
+ CHECK(page->object_start_bitmap()->FindBasePtr(obj2_inner_ptr) ==
+ obj2.address());
+
+ CcTest::CollectAllGarbage();
+
+ CHECK((obj).IsString());
+ CHECK((obj2).IsString());
+ CHECK(page->object_start_bitmap()->CheckBit(obj.address()));
+ CHECK(page->object_start_bitmap()->CheckBit(obj2.address()));
+
+#endif
+}
+
// TODO(1600): compaction of map space is temporary removed from GC.
#if 0
static Handle<Map> CreateMap(Isolate* isolate) {
@@ -387,6 +427,7 @@ UNINITIALIZED_TEST(RegressJoinThreadsOnIsolateDeinit) {
}
TEST(Regress5829) {
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
v8::HandleScope sc(CcTest::isolate());
diff --git a/deps/v8/test/cctest/heap/test-page-promotion.cc b/deps/v8/test/cctest/heap/test-page-promotion.cc
index 7f4c020458..848132d1e6 100644
--- a/deps/v8/test/cctest/heap/test-page-promotion.cc
+++ b/deps/v8/test/cctest/heap/test-page-promotion.cc
@@ -139,7 +139,7 @@ UNINITIALIZED_HEAP_TEST(Regress658718) {
v8::Context::New(isolate)->Enter();
Heap* heap = i_isolate->heap();
heap->delay_sweeper_tasks_for_testing_ = true;
- heap->new_space()->Grow();
+ GrowNewSpace(heap);
{
v8::HandleScope inner_handle_scope(isolate);
std::vector<Handle<FixedArray>> handles;
diff --git a/deps/v8/test/cctest/heap/test-spaces.cc b/deps/v8/test/cctest/heap/test-spaces.cc
index 7b79526b1f..5106086e8d 100644
--- a/deps/v8/test/cctest/heap/test-spaces.cc
+++ b/deps/v8/test/cctest/heap/test-spaces.cc
@@ -57,6 +57,9 @@ class TestMemoryAllocatorScope {
PageAllocator* page_allocator = nullptr)
: isolate_(isolate),
old_allocator_(std::move(isolate->heap()->memory_allocator_)) {
+ // Save the code pages for restoring them later on because the constructor
+ // of MemoryAllocator will change them.
+ isolate->GetCodePages()->swap(code_pages_);
isolate->heap()->memory_allocator_.reset(
new MemoryAllocator(isolate, max_capacity, code_range_size));
if (page_allocator != nullptr) {
@@ -69,12 +72,13 @@ class TestMemoryAllocatorScope {
~TestMemoryAllocatorScope() {
isolate_->heap()->memory_allocator()->TearDown();
isolate_->heap()->memory_allocator_.swap(old_allocator_);
+ isolate_->GetCodePages()->swap(code_pages_);
}
private:
Isolate* isolate_;
std::unique_ptr<MemoryAllocator> old_allocator_;
-
+ std::vector<MemoryRange> code_pages_;
DISALLOW_COPY_AND_ASSIGN(TestMemoryAllocatorScope);
};
@@ -565,6 +569,7 @@ UNINITIALIZED_TEST(InlineAllocationObserverCadence) {
}
HEAP_TEST(Regress777177) {
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Heap* heap = isolate->heap();
@@ -613,9 +618,7 @@ HEAP_TEST(Regress791582) {
Heap* heap = isolate->heap();
HandleScope scope(isolate);
NewSpace* new_space = heap->new_space();
- if (new_space->TotalCapacity() < new_space->MaximumCapacity()) {
- new_space->Grow();
- }
+ GrowNewSpace(heap);
int until_page_end = static_cast<int>(new_space->limit() - new_space->top());
@@ -650,6 +653,7 @@ HEAP_TEST(Regress791582) {
TEST(ShrinkPageToHighWaterMarkFreeSpaceEnd) {
FLAG_stress_incremental_marking = false;
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
HandleScope scope(isolate);
@@ -678,6 +682,7 @@ TEST(ShrinkPageToHighWaterMarkFreeSpaceEnd) {
}
TEST(ShrinkPageToHighWaterMarkNoFiller) {
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
HandleScope scope(isolate);
@@ -700,6 +705,7 @@ TEST(ShrinkPageToHighWaterMarkNoFiller) {
}
TEST(ShrinkPageToHighWaterMarkOneWordFiller) {
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
HandleScope scope(isolate);
@@ -727,6 +733,7 @@ TEST(ShrinkPageToHighWaterMarkOneWordFiller) {
}
TEST(ShrinkPageToHighWaterMarkTwoWordFiller) {
+ FLAG_stress_concurrent_allocation = false; // For SealCurrentObjects.
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
HandleScope scope(isolate);
diff --git a/deps/v8/test/cctest/heap/test-unmapper.cc b/deps/v8/test/cctest/heap/test-unmapper.cc
index 1cfd0628d0..fa4768bd72 100644
--- a/deps/v8/test/cctest/heap/test-unmapper.cc
+++ b/deps/v8/test/cctest/heap/test-unmapper.cc
@@ -51,6 +51,7 @@ class MockPlatformForUnmapper : public TestPlatform {
};
TEST(EagerUnmappingInCollectAllAvailableGarbage) {
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
CcTest::InitializeVM();
MockPlatformForUnmapper platform;
Heap* heap = CcTest::heap();
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/ArrayLiterals.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/ArrayLiterals.golden
index 98d2c6c61f..b79efa765e 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/ArrayLiterals.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/ArrayLiterals.golden
@@ -123,7 +123,7 @@ bytecode array length: 8
bytecodes: [
/* 42 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(37),
B(Star), R(0),
- /* 52 S> */ B(CreateArrayFromIterable),
+ /* 64 S> */ B(CreateArrayFromIterable),
/* 68 S> */ B(Return),
]
constant pool: [
@@ -146,7 +146,7 @@ bytecodes: [
B(Star), R(2),
B(LdaConstant), U8(2),
/* 67 S> */ B(Star), R(1),
- B(GetIterator), R(0), U8(2), U8(4),
+ /* 67 E> */ B(GetIterator), R(0), U8(2), U8(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
B(Star), R(4),
@@ -188,7 +188,7 @@ bytecode array length: 24
bytecodes: [
/* 42 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(37),
B(Star), R(0),
- /* 52 S> */ B(CreateArrayFromIterable),
+ /* 64 S> */ B(CreateArrayFromIterable),
B(Star), R(2),
B(LdaNamedProperty), R(2), U8(1), U8(1),
B(Star), R(1),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/CallAndSpread.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/CallAndSpread.golden
index 293ad72957..f6fdf0b35d 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/CallAndSpread.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/CallAndSpread.golden
@@ -77,7 +77,7 @@ bytecodes: [
B(Star), R(3),
/* 49 S> */ B(CreateArrayLiteral), U8(4), U8(5), U8(37),
B(Star), R(7),
- B(GetIterator), R(7), U8(6), U8(8),
+ /* 49 E> */ B(GetIterator), R(7), U8(6), U8(8),
B(Mov), R(0), R(2),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
index e8d53c3ff3..36915d6c5e 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
@@ -100,7 +100,7 @@ snippet: "
"
frame size: 14
parameter count: 1
-bytecode array length: 232
+bytecode array length: 236
bytecodes: [
/* 48 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(37),
B(Star), R(2),
@@ -149,6 +149,8 @@ bytecodes: [
B(Star), R(0),
/* 63 S> */ B(CreateEmptyArrayLiteral), U8(15),
B(Star), R(11),
+ B(Ldar), R(6),
+ B(JumpIfToBooleanTrue), U8(44),
B(LdaZero),
B(Star), R(12),
B(LdaTrue),
@@ -211,8 +213,8 @@ constant pool: [
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
]
handlers: [
- [34, 162, 170],
- [186, 207, 209],
+ [34, 166, 174],
+ [190, 211, 213],
]
---
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/NewAndSpread.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/NewAndSpread.golden
index d0ab8d1281..115585c727 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/NewAndSpread.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/NewAndSpread.golden
@@ -111,7 +111,7 @@ bytecodes: [
B(Star), R(2),
/* 101 S> */ B(CreateArrayLiteral), U8(5), U8(1), U8(37),
B(Star), R(6),
- B(GetIterator), R(6), U8(2), U8(4),
+ /* 101 E> */ B(GetIterator), R(6), U8(2), U8(4),
B(Mov), R(4), R(1),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateAccessorAccess.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateAccessorAccess.golden
index 78b08a41f8..7e925f9c91 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateAccessorAccess.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateAccessorAccess.golden
@@ -84,7 +84,7 @@ bytecodes: [
B(Mov), R(this), R(0),
B(Mov), R(context), R(2),
/* 48 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
- /* 53 S> */ B(Wide), B(LdaSmi), I16(267),
+ /* 53 S> */ B(Wide), B(LdaSmi), I16(268),
B(Star), R(3),
B(LdaConstant), U8(0),
B(Star), R(4),
@@ -115,7 +115,7 @@ bytecodes: [
B(Mov), R(this), R(0),
B(Mov), R(context), R(2),
/* 41 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
- /* 46 S> */ B(Wide), B(LdaSmi), I16(266),
+ /* 46 S> */ B(Wide), B(LdaSmi), I16(267),
B(Star), R(3),
B(LdaConstant), U8(0),
B(Star), R(4),
@@ -146,7 +146,7 @@ bytecodes: [
B(Mov), R(this), R(0),
B(Mov), R(context), R(2),
/* 48 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
- /* 53 S> */ B(Wide), B(LdaSmi), I16(267),
+ /* 53 S> */ B(Wide), B(LdaSmi), I16(268),
B(Star), R(3),
B(LdaConstant), U8(0),
B(Star), R(4),
@@ -177,7 +177,7 @@ bytecodes: [
B(Mov), R(this), R(0),
B(Mov), R(context), R(2),
/* 41 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
- /* 46 S> */ B(Wide), B(LdaSmi), I16(266),
+ /* 46 S> */ B(Wide), B(LdaSmi), I16(267),
B(Star), R(4),
B(LdaConstant), U8(0),
B(Star), R(5),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateMethodAccess.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateMethodAccess.golden
index 8413da93a8..a36806c05b 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateMethodAccess.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/PrivateMethodAccess.golden
@@ -57,7 +57,7 @@ bytecodes: [
B(Mov), R(this), R(0),
B(Mov), R(context), R(2),
/* 44 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
- /* 49 S> */ B(Wide), B(LdaSmi), I16(265),
+ /* 49 S> */ B(Wide), B(LdaSmi), I16(266),
B(Star), R(3),
B(LdaConstant), U8(0),
B(Star), R(4),
@@ -89,7 +89,7 @@ bytecodes: [
B(Mov), R(this), R(0),
B(Mov), R(context), R(2),
/* 44 E> */ B(CallRuntime), U16(Runtime::kAddPrivateBrand), R(0), U8(3),
- /* 49 S> */ B(Wide), B(LdaSmi), I16(265),
+ /* 49 S> */ B(Wide), B(LdaSmi), I16(266),
B(Star), R(3),
B(LdaConstant), U8(0),
B(Star), R(4),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden
index 6d5bb4a58f..47f3280126 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden
@@ -25,7 +25,7 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(1),
B(JumpIfTrue), U8(18),
- B(Wide), B(LdaSmi), I16(263),
+ B(Wide), B(LdaSmi), I16(264),
B(Star), R(2),
B(LdaConstant), U8(0),
B(Star), R(3),
@@ -56,7 +56,7 @@ frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
- /* 56 S> */ B(Wide), B(LdaSmi), I16(265),
+ /* 56 S> */ B(Wide), B(LdaSmi), I16(266),
B(Star), R(0),
B(LdaConstant), U8(0),
B(Star), R(1),
@@ -83,7 +83,7 @@ frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
- /* 56 S> */ B(Wide), B(LdaSmi), I16(265),
+ /* 56 S> */ B(Wide), B(LdaSmi), I16(266),
B(Star), R(0),
B(LdaConstant), U8(0),
B(Star), R(1),
@@ -122,7 +122,7 @@ bytecodes: [
/* 94 E> */ B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(18),
- B(Wide), B(LdaSmi), I16(263),
+ B(Wide), B(LdaSmi), I16(264),
B(Star), R(2),
B(LdaConstant), U8(0),
B(Star), R(3),
@@ -144,7 +144,7 @@ bytecodes: [
/* 109 E> */ B(TestReferenceEqual), R(this),
B(Mov), R(this), R(1),
B(JumpIfTrue), U8(18),
- B(Wide), B(LdaSmi), I16(264),
+ B(Wide), B(LdaSmi), I16(265),
B(Star), R(3),
B(LdaConstant), U8(0),
B(Star), R(4),
@@ -159,7 +159,7 @@ bytecodes: [
/* 133 E> */ B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(18),
- B(Wide), B(LdaSmi), I16(263),
+ B(Wide), B(LdaSmi), I16(264),
B(Star), R(2),
B(LdaConstant), U8(0),
B(Star), R(3),
@@ -189,7 +189,7 @@ frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
- /* 60 S> */ B(Wide), B(LdaSmi), I16(267),
+ /* 60 S> */ B(Wide), B(LdaSmi), I16(268),
B(Star), R(0),
B(LdaConstant), U8(0),
B(Star), R(1),
@@ -215,7 +215,7 @@ frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
- /* 53 S> */ B(Wide), B(LdaSmi), I16(266),
+ /* 53 S> */ B(Wide), B(LdaSmi), I16(267),
B(Star), R(0),
B(LdaConstant), U8(0),
B(Star), R(1),
@@ -241,7 +241,7 @@ frame size: 2
parameter count: 1
bytecode array length: 16
bytecodes: [
- /* 60 S> */ B(Wide), B(LdaSmi), I16(267),
+ /* 60 S> */ B(Wide), B(LdaSmi), I16(268),
B(Star), R(0),
B(LdaConstant), U8(0),
B(Star), R(1),
@@ -267,7 +267,7 @@ frame size: 3
parameter count: 1
bytecode array length: 16
bytecodes: [
- /* 46 S> */ B(Wide), B(LdaSmi), I16(266),
+ /* 46 S> */ B(Wide), B(LdaSmi), I16(267),
B(Star), R(1),
B(LdaConstant), U8(0),
B(Star), R(2),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/SuperCallAndSpread.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/SuperCallAndSpread.golden
index 4124d91274..a316cfdceb 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/SuperCallAndSpread.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/SuperCallAndSpread.golden
@@ -108,7 +108,7 @@ bytecodes: [
B(Ldar), R(6),
B(Inc), U8(3),
/* 152 S> */ B(Star), R(6),
- B(GetIterator), R(3), U8(4), U8(6),
+ /* 152 E> */ B(GetIterator), R(3), U8(4), U8(6),
B(Mov), R(1), R(4),
B(JumpIfJSReceiver), U8(7),
B(CallRuntime), U16(Runtime::kThrowSymbolIteratorInvalid), R(0), U8(0),
diff --git a/deps/v8/test/cctest/interpreter/bytecode_expectations/WideRegisters.golden b/deps/v8/test/cctest/interpreter/bytecode_expectations/WideRegisters.golden
index afbe8e89a4..39a21f7b50 100644
--- a/deps/v8/test/cctest/interpreter/bytecode_expectations/WideRegisters.golden
+++ b/deps/v8/test/cctest/interpreter/bytecode_expectations/WideRegisters.golden
@@ -169,7 +169,7 @@ snippet: "
"
frame size: 157
parameter count: 1
-bytecode array length: 546
+bytecode array length: 548
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -418,7 +418,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
@@ -658,7 +658,7 @@ snippet: "
"
frame size: 157
parameter count: 1
-bytecode array length: 548
+bytecode array length: 550
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -907,7 +907,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
@@ -1147,7 +1147,7 @@ snippet: "
"
frame size: 157
parameter count: 1
-bytecode array length: 554
+bytecode array length: 556
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -1396,7 +1396,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
@@ -1642,7 +1642,7 @@ snippet: "
"
frame size: 157
parameter count: 1
-bytecode array length: 575
+bytecode array length: 577
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -1891,7 +1891,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
@@ -2143,7 +2143,7 @@ snippet: "
"
frame size: 158
parameter count: 1
-bytecode array length: 591
+bytecode array length: 593
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -2392,7 +2392,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
@@ -2649,7 +2649,7 @@ snippet: "
"
frame size: 163
parameter count: 1
-bytecode array length: 622
+bytecode array length: 624
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -2898,7 +2898,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
@@ -3162,7 +3162,7 @@ snippet: "
"
frame size: 159
parameter count: 1
-bytecode array length: 589
+bytecode array length: 591
bytecodes: [
/* 43 S> */ B(LdaZero),
B(Star), R(0),
@@ -3411,7 +3411,7 @@ bytecodes: [
/* 1643 S> */ B(LdaZero),
B(Star), R(122),
/* 1657 S> */ B(LdaZero),
- B(Star), R(123),
+ B(Wide), B(Star), R16(123),
/* 1671 S> */ B(LdaZero),
B(Wide), B(Star), R16(124),
/* 1685 S> */ B(LdaZero),
diff --git a/deps/v8/test/cctest/libplatform/test-tracing.cc b/deps/v8/test/cctest/libplatform/test-tracing.cc
index 77c7c5744e..0d552c42b0 100644
--- a/deps/v8/test/cctest/libplatform/test-tracing.cc
+++ b/deps/v8/test/cctest/libplatform/test-tracing.cc
@@ -477,8 +477,7 @@ class TraceWritingThread : public base::Thread {
tracing_controller_(tracing_controller) {}
void Run() override {
- running_.store(true);
- while (running_.load()) {
+ while (!stopped_.load()) {
TRACE_EVENT0("v8", "v8.Test");
tracing_controller_->AddTraceEvent('A', nullptr, "v8", "", 1, 1, 0,
nullptr, nullptr, nullptr, nullptr, 0);
@@ -488,10 +487,10 @@ class TraceWritingThread : public base::Thread {
}
}
- void Stop() { running_.store(false); }
+ void Stop() { stopped_.store(true); }
private:
- std::atomic_bool running_{false};
+ std::atomic_bool stopped_{false};
v8::platform::tracing::TracingController* tracing_controller_;
};
diff --git a/deps/v8/test/cctest/test-api-interceptors.cc b/deps/v8/test/cctest/test-api-interceptors.cc
index e1b2444d91..812768b461 100644
--- a/deps/v8/test/cctest/test-api-interceptors.cc
+++ b/deps/v8/test/cctest/test-api-interceptors.cc
@@ -4715,8 +4715,8 @@ THREADED_TEST(GetOwnPropertyNamesWithInterceptor) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
- obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7));
- obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42));
+ obj_template->Set(isolate, "7", v8::Integer::New(isolate, 7));
+ obj_template->Set(isolate, "x", v8::Integer::New(isolate, 42));
obj_template->SetHandler(v8::IndexedPropertyHandlerConfiguration(
nullptr, nullptr, nullptr, nullptr, IndexedPropertyEnumerator));
obj_template->SetHandler(v8::NamedPropertyHandlerConfiguration(
@@ -4781,8 +4781,8 @@ THREADED_TEST(GetOwnPropertyNamesWithIndexedInterceptorExceptions_regress4026) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
- obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7));
- obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42));
+ obj_template->Set(isolate, "7", v8::Integer::New(isolate, 7));
+ obj_template->Set(isolate, "x", v8::Integer::New(isolate, 42));
// First just try a failing indexed interceptor.
obj_template->SetHandler(v8::IndexedPropertyHandlerConfiguration(
nullptr, nullptr, nullptr, nullptr, IndexedPropertyEnumeratorException));
@@ -4827,8 +4827,8 @@ THREADED_TEST(GetOwnPropertyNamesWithNamedInterceptorExceptions_regress4026) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
- obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7));
- obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42));
+ obj_template->Set(isolate, "7", v8::Integer::New(isolate, 7));
+ obj_template->Set(isolate, "x", v8::Integer::New(isolate, 42));
// First just try a failing indexed interceptor.
obj_template->SetHandler(v8::NamedPropertyHandlerConfiguration(
nullptr, nullptr, nullptr, nullptr, NamedPropertyEnumeratorException));
diff --git a/deps/v8/test/cctest/test-api-stack-traces.cc b/deps/v8/test/cctest/test-api-stack-traces.cc
index cc6795ba51..0df2c22564 100644
--- a/deps/v8/test/cctest/test-api-stack-traces.cc
+++ b/deps/v8/test/cctest/test-api-stack-traces.cc
@@ -287,7 +287,7 @@ TEST(CaptureStackTrace) {
v8::HandleScope scope(isolate);
v8::Local<v8::String> origin = v8_str("capture-stack-trace-test");
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("AnalyzeStackInNativeCode"),
+ templ->Set(isolate, "AnalyzeStackInNativeCode",
v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode));
LocalContext context(nullptr, templ);
@@ -625,7 +625,7 @@ TEST(SourceURLInStackTrace) {
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
templ->Set(
- v8_str("AnalyzeStackOfEvalWithSourceURL"),
+ isolate, "AnalyzeStackOfEvalWithSourceURL",
v8::FunctionTemplate::New(isolate, AnalyzeStackOfEvalWithSourceURL));
LocalContext context(nullptr, templ);
@@ -666,7 +666,7 @@ TEST(ScriptIdInStackTrace) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("AnalyzeScriptIdInStack"),
+ templ->Set(isolate, "AnalyzeScriptIdInStack",
v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack));
LocalContext context(nullptr, templ);
@@ -702,7 +702,7 @@ TEST(InlineScriptWithSourceURLInStackTrace) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"),
+ templ->Set(isolate, "AnalyzeStackOfInlineScriptWithSourceURL",
v8::FunctionTemplate::New(
CcTest::isolate(), AnalyzeStackOfInlineScriptWithSourceURL));
LocalContext context(nullptr, templ);
@@ -746,7 +746,7 @@ TEST(DynamicWithSourceURLInStackTrace) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"),
+ templ->Set(isolate, "AnalyzeStackOfDynamicScriptWithSourceURL",
v8::FunctionTemplate::New(
CcTest::isolate(), AnalyzeStackOfDynamicScriptWithSourceURL));
LocalContext context(nullptr, templ);
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc
index 982573d421..cd291aa524 100644
--- a/deps/v8/test/cctest/test-api.cc
+++ b/deps/v8/test/cctest/test-api.cc
@@ -289,8 +289,8 @@ THREADED_TEST(ReceiverSignature) {
v8::FunctionTemplate::New(isolate);
// Install properties.
v8::Local<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate();
- fun_proto->Set(v8_str("prop_sig"), callback_sig);
- fun_proto->Set(v8_str("prop"), callback);
+ fun_proto->Set(isolate, "prop_sig", callback_sig);
+ fun_proto->Set(isolate, "prop", callback);
fun_proto->SetAccessorProperty(
v8_str("accessor_sig"), callback_sig, callback_sig);
fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback);
@@ -302,8 +302,8 @@ THREADED_TEST(ReceiverSignature) {
// Instance template with properties.
v8::Local<v8::ObjectTemplate> direct_instance_templ =
direct_sub_fun->InstanceTemplate();
- direct_instance_templ->Set(v8_str("prop_sig"), callback_sig);
- direct_instance_templ->Set(v8_str("prop"), callback);
+ direct_instance_templ->Set(isolate, "prop_sig", callback_sig);
+ direct_instance_templ->Set(isolate, "prop", callback);
direct_instance_templ->SetAccessorProperty(v8_str("accessor_sig"),
callback_sig, callback_sig);
direct_instance_templ->SetAccessorProperty(v8_str("accessor"), callback,
@@ -509,7 +509,7 @@ THREADED_TEST(ScriptUsingStringResource) {
Local<Value> value = script->Run(env.local()).ToLocalChecked();
CHECK(value->IsNumber());
CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
- CHECK(source->IsExternal());
+ CHECK(source->IsExternalTwoByte());
CHECK_EQ(resource,
static_cast<TestResource*>(source->GetExternalStringResource()));
String::Encoding encoding = String::UNKNOWN_ENCODING;
@@ -568,7 +568,7 @@ THREADED_TEST(ScriptMakingExternalString) {
// Trigger GCs so that the newly allocated string moves to old gen.
CcTest::CollectGarbage(i::NEW_SPACE); // in survivor space now
CcTest::CollectGarbage(i::NEW_SPACE); // in old gen now
- CHECK(!source->IsExternal());
+ CHECK(!source->IsExternalTwoByte());
CHECK(!source->IsExternalOneByte());
String::Encoding encoding = String::UNKNOWN_ENCODING;
CHECK(!source->GetExternalStringResourceBase(&encoding));
@@ -685,6 +685,7 @@ TEST(MakingExternalOneByteStringConditions) {
TEST(MakingExternalUnalignedOneByteString) {
+ i::FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
@@ -2027,7 +2028,7 @@ THREADED_TEST(ObjectTemplate) {
Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate, fun);
templ1->Set(isolate, "x", v8_num(10));
templ1->Set(isolate, "y", v8_num(13));
- templ1->Set(v8_str("foo"), acc);
+ templ1->Set(isolate, "foo", acc);
Local<v8::Object> instance1 =
templ1->NewInstance(env.local()).ToLocalChecked();
CHECK(class_name->StrictEquals(instance1->GetConstructorName()));
@@ -2043,7 +2044,7 @@ THREADED_TEST(ObjectTemplate) {
Local<ObjectTemplate> templ2 = fun2->InstanceTemplate();
templ2->Set(isolate, "a", v8_num(12));
templ2->Set(isolate, "b", templ1);
- templ2->Set(v8_str("bar"), acc);
+ templ2->Set(isolate, "bar", acc);
templ2->SetAccessorProperty(v8_str("acc"), acc);
Local<v8::Object> instance2 =
templ2->NewInstance(env.local()).ToLocalChecked();
@@ -2250,6 +2251,69 @@ static void TestObjectTemplateInheritedWithoutInstanceTemplate(
}
}
+THREADED_TEST(TestDataTypeChecks) {
+ LocalContext env;
+ v8::Isolate* isolate = CcTest::isolate();
+ v8::HandleScope scope(isolate);
+
+ v8::Local<v8::Data> values[] = {
+ v8::Undefined(isolate),
+ v8::Null(isolate),
+ v8::True(isolate),
+ v8::Integer::New(isolate, 10),
+ v8::Number::New(isolate, 3.14),
+ v8::BigInt::NewFromUnsigned(isolate, 10),
+ v8::Symbol::New(isolate),
+ v8::String::NewFromUtf8Literal(isolate, "hello"),
+ };
+ for (auto x : values) {
+ CHECK(!x->IsModule());
+ CHECK(x->IsValue());
+ CHECK(!x->IsPrivate());
+ CHECK(!x->IsObjectTemplate());
+ CHECK(!x->IsFunctionTemplate());
+ v8::Local<v8::Value>::Cast(x);
+ }
+
+ v8::ScriptOrigin origin(
+ v8_str(""), Local<v8::Integer>(), Local<v8::Integer>(),
+ Local<v8::Boolean>(), Local<v8::Integer>(), Local<v8::Value>(),
+ Local<v8::Boolean>(), Local<v8::Boolean>(), True(isolate));
+ v8::ScriptCompiler::Source source(v8::String::NewFromUtf8Literal(isolate, ""),
+ origin);
+ v8::Local<v8::Data> module =
+ v8::ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ CHECK(module->IsModule());
+ CHECK(!module->IsValue());
+ CHECK(!module->IsPrivate());
+ CHECK(!module->IsObjectTemplate());
+ CHECK(!module->IsFunctionTemplate());
+ v8::Local<v8::Module>::Cast(module);
+
+ v8::Local<v8::Data> p = v8::Private::New(isolate);
+ CHECK(!p->IsModule());
+ CHECK(!p->IsValue());
+ CHECK(p->IsPrivate());
+ CHECK(!p->IsObjectTemplate());
+ CHECK(!p->IsFunctionTemplate());
+ CHECK(!(*reinterpret_cast<Local<Value>*>(&p))->IsSymbol());
+ v8::Local<v8::Private>::Cast(p);
+
+ v8::Local<v8::Data> otmpl = v8::ObjectTemplate::New(isolate);
+ CHECK(!otmpl->IsModule());
+ CHECK(!otmpl->IsValue());
+ CHECK(!otmpl->IsPrivate());
+ CHECK(otmpl->IsObjectTemplate());
+ CHECK(!otmpl->IsFunctionTemplate());
+
+ v8::Local<v8::Data> ftmpl = v8::FunctionTemplate::New(isolate);
+ CHECK(!ftmpl->IsModule());
+ CHECK(!ftmpl->IsValue());
+ CHECK(!ftmpl->IsPrivate());
+ CHECK(!ftmpl->IsObjectTemplate());
+ CHECK(ftmpl->IsFunctionTemplate());
+}
+
THREADED_TEST(TestObjectTemplateInheritedWithPrototype1) {
TestObjectTemplateInheritedWithoutInstanceTemplate(
Constructor_GetFunction_NewInstance);
@@ -2664,9 +2728,9 @@ THREADED_TEST(DeepCrossLanguageRecursion) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
v8::Local<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
- global->Set(v8_str("callScriptRecursively"),
+ global->Set(isolate, "callScriptRecursively",
v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall));
- global->Set(v8_str("callFunctionRecursively"),
+ global->Set(isolate, "callFunctionRecursively",
v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall));
LocalContext env(nullptr, global);
@@ -2726,7 +2790,7 @@ THREADED_TEST(FunctionPrototype) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate);
- Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321));
+ Foo->PrototypeTemplate()->Set(isolate, "plak", v8_num(321));
LocalContext env;
CHECK(env->Global()
->Set(env.local(), v8_str("Foo"),
@@ -4960,7 +5024,7 @@ THREADED_TEST(Vector) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> global = ObjectTemplate::New(isolate);
- global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF));
+ global->Set(isolate, "f", v8::FunctionTemplate::New(isolate, HandleF));
LocalContext context(nullptr, global);
const char* fun = "f()";
@@ -5467,7 +5531,7 @@ THREADED_TEST(APICatch) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("ThrowFromC"),
+ templ->Set(isolate, "ThrowFromC",
v8::FunctionTemplate::New(isolate, ThrowFromC));
LocalContext context(nullptr, templ);
CompileRun(
@@ -5488,7 +5552,7 @@ THREADED_TEST(APIThrowTryCatch) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("ThrowFromC"),
+ templ->Set(isolate, "ThrowFromC",
v8::FunctionTemplate::New(isolate, ThrowFromC));
LocalContext context(nullptr, templ);
v8::TryCatch try_catch(isolate);
@@ -5508,7 +5572,7 @@ TEST(TryCatchInTryFinally) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("CCatcher"), v8::FunctionTemplate::New(isolate, CCatcher));
+ templ->Set(isolate, "CCatcher", v8::FunctionTemplate::New(isolate, CCatcher));
LocalContext context(nullptr, templ);
Local<Value> result = CompileRun(
"try {"
@@ -5673,7 +5737,7 @@ TEST(APIThrowMessage) {
v8::HandleScope scope(isolate);
isolate->AddMessageListener(receive_message);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("ThrowFromC"),
+ templ->Set(isolate, "ThrowFromC",
v8::FunctionTemplate::New(isolate, ThrowFromC));
LocalContext context(nullptr, templ);
CompileRun("ThrowFromC();");
@@ -5688,7 +5752,7 @@ TEST(APIThrowMessageAndVerboseTryCatch) {
v8::HandleScope scope(isolate);
isolate->AddMessageListener(receive_message);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("ThrowFromC"),
+ templ->Set(isolate, "ThrowFromC",
v8::FunctionTemplate::New(isolate, ThrowFromC));
LocalContext context(nullptr, templ);
v8::TryCatch try_catch(isolate);
@@ -5720,7 +5784,7 @@ THREADED_TEST(ExternalScriptException) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("ThrowFromC"),
+ templ->Set(isolate, "ThrowFromC",
v8::FunctionTemplate::New(isolate, ThrowFromC));
LocalContext context(nullptr, templ);
@@ -5828,8 +5892,8 @@ TEST(ExceptionOrder) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("check"), v8::FunctionTemplate::New(isolate, JSCheck));
- templ->Set(v8_str("CThrowCountDown"),
+ templ->Set(isolate, "check", v8::FunctionTemplate::New(isolate, JSCheck));
+ templ->Set(isolate, "CThrowCountDown",
v8::FunctionTemplate::New(isolate, CThrowCountDown));
LocalContext context(nullptr, templ);
CompileRun(
@@ -5895,7 +5959,7 @@ THREADED_TEST(ThrowValues) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue));
+ templ->Set(isolate, "Throw", v8::FunctionTemplate::New(isolate, ThrowValue));
LocalContext context(nullptr, templ);
v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast(
CompileRun("function Run(obj) {"
@@ -6088,7 +6152,7 @@ TEST(TryCatchMixedNesting) {
v8::V8::Initialize();
v8::TryCatch try_catch(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("TryCatchMixedNestingHelper"),
+ templ->Set(isolate, "TryCatchMixedNestingHelper",
v8::FunctionTemplate::New(isolate, TryCatchMixedNestingHelper));
LocalContext context(nullptr, templ);
CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1);
@@ -6110,7 +6174,7 @@ TEST(TryCatchNative) {
v8::V8::Initialize();
v8::TryCatch try_catch(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("TryCatchNativeHelper"),
+ templ->Set(isolate, "TryCatchNativeHelper",
v8::FunctionTemplate::New(isolate, TryCatchNativeHelper));
LocalContext context(nullptr, templ);
CompileRun("TryCatchNativeHelper();");
@@ -6135,7 +6199,7 @@ TEST(TryCatchNativeReset) {
v8::V8::Initialize();
v8::TryCatch try_catch(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("TryCatchNativeResetHelper"),
+ templ->Set(isolate, "TryCatchNativeResetHelper",
v8::FunctionTemplate::New(isolate, TryCatchNativeResetHelper));
LocalContext context(nullptr, templ);
CompileRun("TryCatchNativeResetHelper();");
@@ -6711,7 +6775,7 @@ THREADED_TEST(MultiContexts) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
v8::Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("dummy"),
+ templ->Set(isolate, "dummy",
v8::FunctionTemplate::New(isolate, DummyCallHandler));
Local<String> password = v8_str("Password");
@@ -7057,7 +7121,7 @@ THREADED_TEST(GlobalObjectTemplate) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope handle_scope(isolate);
Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate);
- global_template->Set(v8_str("JSNI_Log"),
+ global_template->Set(isolate, "JSNI_Log",
v8::FunctionTemplate::New(isolate, HandleLogDelegator));
v8::Local<Context> context = Context::New(isolate, nullptr, global_template);
Context::Scope context_scope(context);
@@ -7597,7 +7661,7 @@ static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
}
static void IndependentWeakHandle(bool global_gc, bool interlinked) {
- i::FLAG_stress_incremental_marking = false;
+ ManualGCScope manual_gc_scope;
// Parallel scavenge introduces too much fragmentation.
i::FLAG_parallel_scavenge = false;
v8::Isolate* iso = CcTest::isolate();
@@ -7903,7 +7967,7 @@ THREADED_TEST(Arguments) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
v8::Local<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
- global->Set(v8_str("f"),
+ global->Set(isolate, "f",
v8::FunctionTemplate::New(isolate, ArgumentsTestCallback));
LocalContext context(nullptr, global);
args_fun = context->Global()
@@ -8949,7 +9013,7 @@ TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
- templ->Set(v8_str("CEvaluate"),
+ templ->Set(isolate, "CEvaluate",
v8::FunctionTemplate::New(isolate, CEvaluate));
LocalContext context(nullptr, templ);
v8::TryCatch try_catch(isolate);
@@ -9970,7 +10034,7 @@ THREADED_TEST(AccessControlGetOwnPropertyNames) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
- obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
+ obj_template->Set(isolate, "x", v8::Integer::New(isolate, 42));
obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
// Add an accessor accessible by cross-domain JS code.
@@ -10245,8 +10309,8 @@ THREADED_TEST(InstanceProperties) {
Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
Local<ObjectTemplate> instance = t->InstanceTemplate();
- instance->Set(v8_str("x"), v8_num(42));
- instance->Set(v8_str("f"),
+ instance->Set(isolate, "x", v8_num(42));
+ instance->Set(isolate, "f",
v8::FunctionTemplate::New(isolate, InstanceFunctionCallback));
Local<Value> o = t->GetFunction(context.local())
@@ -10336,10 +10400,10 @@ THREADED_TEST(GlobalObjectInstanceProperties) {
t->InstanceTemplate()->SetHandler(
v8::NamedPropertyHandlerConfiguration(GlobalObjectInstancePropertiesGet));
Local<ObjectTemplate> instance_template = t->InstanceTemplate();
- instance_template->Set(v8_str("x"), v8_num(42));
- instance_template->Set(v8_str("f"),
- v8::FunctionTemplate::New(isolate,
- InstanceFunctionCallback));
+ instance_template->Set(isolate, "x", v8_num(42));
+ instance_template->Set(
+ isolate, "f",
+ v8::FunctionTemplate::New(isolate, InstanceFunctionCallback));
// The script to check how TurboFan compiles missing global function
// invocations. function g is not defined and should throw on call.
@@ -10561,11 +10625,10 @@ THREADED_TEST(ShadowObject) {
Local<ObjectTemplate> proto = t->PrototypeTemplate();
Local<ObjectTemplate> instance = t->InstanceTemplate();
- proto->Set(v8_str("f"),
- v8::FunctionTemplate::New(isolate,
- ShadowFunctionCallback,
+ proto->Set(isolate, "f",
+ v8::FunctionTemplate::New(isolate, ShadowFunctionCallback,
Local<Value>()));
- proto->Set(v8_str("x"), v8_num(12));
+ proto->Set(isolate, "x", v8_num(12));
instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter);
@@ -10699,13 +10762,13 @@ THREADED_TEST(SetPrototype) {
v8::HandleScope handle_scope(isolate);
Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
- t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0));
+ t0->InstanceTemplate()->Set(isolate, "x", v8_num(0));
Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
- t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1));
+ t1->InstanceTemplate()->Set(isolate, "y", v8_num(1));
Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
- t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2));
+ t2->InstanceTemplate()->Set(isolate, "z", v8_num(2));
Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate);
- t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3));
+ t3->InstanceTemplate()->Set(isolate, "u", v8_num(3));
Local<v8::Object> o0 = t0->GetFunction(context.local())
.ToLocalChecked()
@@ -10797,16 +10860,16 @@ THREADED_TEST(Regress91517) {
v8::HandleScope handle_scope(isolate);
Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
- t1->InstanceTemplate()->Set(v8_str("foo"), v8_num(1));
+ t1->InstanceTemplate()->Set(isolate, "foo", v8_num(1));
Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
- t2->InstanceTemplate()->Set(v8_str("fuz1"), v8_num(2));
- t2->InstanceTemplate()->Set(v8_str("objects"),
+ t2->InstanceTemplate()->Set(isolate, "fuz1", v8_num(2));
+ t2->InstanceTemplate()->Set(isolate, "objects",
v8::ObjectTemplate::New(isolate));
- t2->InstanceTemplate()->Set(v8_str("fuz2"), v8_num(2));
+ t2->InstanceTemplate()->Set(isolate, "fuz2", v8_num(2));
Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate);
- t3->InstanceTemplate()->Set(v8_str("boo"), v8_num(3));
+ t3->InstanceTemplate()->Set(isolate, "boo", v8_num(3));
Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate);
- t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4));
+ t4->InstanceTemplate()->Set(isolate, "baz", v8_num(4));
// Force dictionary-based properties.
i::ScopedVector<char> name_buf(1024);
@@ -10859,7 +10922,7 @@ THREADED_TEST(FunctionReadOnlyPrototype) {
v8::HandleScope handle_scope(isolate);
Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
- t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42));
+ t1->PrototypeTemplate()->Set(isolate, "x", v8::Integer::New(isolate, 42));
t1->ReadOnlyPrototype();
CHECK(context->Global()
->Set(context.local(), v8_str("func1"),
@@ -10881,7 +10944,7 @@ THREADED_TEST(FunctionReadOnlyPrototype) {
.FromJust());
Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
- t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42));
+ t2->PrototypeTemplate()->Set(isolate, "x", v8::Integer::New(isolate, 42));
CHECK(context->Global()
->Set(context.local(), v8_str("func2"),
t2->GetFunction(context.local()).ToLocalChecked())
@@ -11829,7 +11892,7 @@ THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) {
isolate, FastApiCallback_TrivialSignature, v8_str("method_data"),
v8::Local<v8::Signature>());
v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
- proto_templ->Set(v8_str("method"), method_templ);
+ proto_templ->Set(isolate, "method", method_templ);
v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
InterceptorCallICFastApi, nullptr, nullptr, nullptr, nullptr,
@@ -11864,7 +11927,7 @@ THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) {
isolate, FastApiCallback_TrivialSignature, v8_str("method_data"),
v8::Local<v8::Signature>());
v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
- proto_templ->Set(v8_str("method"), method_templ);
+ proto_templ->Set(isolate, "method", method_templ);
v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
USE(templ);
LocalContext context;
@@ -13746,6 +13809,7 @@ static void event_handler(const v8::JitCodeEvent* event) {
UNINITIALIZED_TEST(SetJitCodeEventHandler) {
i::FLAG_stress_compaction = true;
i::FLAG_incremental_marking = false;
+ i::FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
if (i::FLAG_never_compact) return;
const char* script =
"function bar() {"
@@ -14041,7 +14105,7 @@ THREADED_TEST(CallbackFunctionName) {
v8::Isolate* isolate = context->GetIsolate();
v8::HandleScope scope(isolate);
Local<ObjectTemplate> t = ObjectTemplate::New(isolate);
- t->Set(v8_str("asdf"),
+ t->Set(isolate, "asdf",
v8::FunctionTemplate::New(isolate, FunctionNameCallback));
CHECK(context->Global()
->Set(context.local(), v8_str("obj"),
@@ -14445,7 +14509,7 @@ THREADED_TEST(AccessChecksReenabledCorrectly) {
v8::HandleScope scope(isolate);
Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
templ->SetAccessCheckCallback(AccessAlwaysBlocked);
- templ->Set(v8_str("a"), v8_str("a"));
+ templ->Set(isolate, "a", v8_str("a"));
// Add more than 8 (see kMaxFastProperties) properties
// so that the constructor will force copying map.
// Cannot sprintf, gcc complains unsafety.
@@ -16731,10 +16795,11 @@ class VisitorImpl : public v8::ExternalResourceVisitor {
}
~VisitorImpl() override = default;
void VisitExternalString(v8::Local<v8::String> string) override {
- if (!string->IsExternal()) {
- CHECK(string->IsExternalOneByte());
+ if (string->IsExternalOneByte()) {
+ CHECK(!string->IsExternalTwoByte());
return;
}
+ CHECK(string->IsExternalTwoByte());
v8::String::ExternalStringResource* resource =
string->GetExternalStringResource();
CHECK(resource);
@@ -16773,7 +16838,7 @@ TEST(ExternalizeOldSpaceTwoByteCons) {
AsciiToTwoByteString("Romeo Montague Juliet Capulet"));
cons->MakeExternal(resource);
- CHECK(cons->IsExternal());
+ CHECK(cons->IsExternalTwoByte());
CHECK_EQ(resource, cons->GetExternalStringResource());
String::Encoding encoding;
CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding));
@@ -16840,10 +16905,10 @@ TEST(VisitExternalStrings) {
CHECK(string3_i->IsInternalizedString());
// We need to add usages for string* to avoid warnings in GCC 4.7
- CHECK(string0->IsExternal());
- CHECK(string1->IsExternal());
- CHECK(string2->IsExternal());
- CHECK(string3->IsExternal());
+ CHECK(string0->IsExternalTwoByte());
+ CHECK(string1->IsExternalTwoByte());
+ CHECK(string2->IsExternalTwoByte());
+ CHECK(string3->IsExternalTwoByte());
VisitorImpl visitor(resource);
isolate->VisitExternalResources(&visitor);
@@ -17906,6 +17971,8 @@ TEST(GCCallbacksWithData) {
}
TEST(GCCallbacks) {
+ // For SimulateFullSpace in PrologueCallbackAlloc and EpilogueCallbackAlloc.
+ i::FLAG_stress_concurrent_allocation = false;
LocalContext context;
v8::Isolate* isolate = context->GetIsolate();
gc_callbacks_isolate = isolate;
@@ -21582,7 +21649,7 @@ class RequestInterruptTestWithMethodCall
void TestBody() override {
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
v8::Local<v8::Template> proto = t->PrototypeTemplate();
- proto->Set(v8_str("shouldContinue"),
+ proto->Set(isolate_, "shouldContinue",
FunctionTemplate::New(isolate_, ShouldContinueCallback,
v8::External::New(isolate_, this)));
CHECK(env_->Global()
@@ -21647,7 +21714,7 @@ class RequestInterruptTestWithMethodCallAndInterceptor
void TestBody() override {
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
v8::Local<v8::Template> proto = t->PrototypeTemplate();
- proto->Set(v8_str("shouldContinue"),
+ proto->Set(isolate_, "shouldContinue",
FunctionTemplate::New(isolate_, ShouldContinueCallback,
v8::External::New(isolate_, this)));
v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate();
@@ -26201,7 +26268,7 @@ TEST(GlobalTemplateWithDoubleProperty) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
- global->Set(v8_str("double"), v8_num(3.14));
+ global->Set(isolate, "double", v8_num(3.14));
v8::Local<v8::Context> context = v8::Context::New(isolate, nullptr, global);
@@ -26692,42 +26759,6 @@ TEST(BigIntAPI) {
}
}
-TEST(TestGetUnwindState) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
-
-// Ignore deprecation warnings so that we can keep the tests for now.
-// TODO(petermarshall): Remove this once the deprecated API is gone.
-#if __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
-#endif
- v8::UnwindState unwind_state = isolate->GetUnwindState();
-#if __clang__
-#pragma clang diagnostic pop
-#endif
- v8::MemoryRange builtins_range = unwind_state.embedded_code_range;
-
- // Check that each off-heap builtin is within the builtins code range.
- for (int id = 0; id < i::Builtins::builtin_count; id++) {
- if (!i::Builtins::IsIsolateIndependent(id)) continue;
- i::Code builtin = i_isolate->builtins()->builtin(id);
- i::Address start = builtin.InstructionStart();
- i::Address end = start + builtin.InstructionSize();
-
- i::Address builtins_start =
- reinterpret_cast<i::Address>(builtins_range.start);
- CHECK(start >= builtins_start &&
- end < builtins_start + builtins_range.length_in_bytes);
- }
-
- v8::JSEntryStub js_entry_stub = unwind_state.js_entry_stub;
-
- CHECK_EQ(i_isolate->heap()->builtin(i::Builtins::kJSEntry).InstructionStart(),
- reinterpret_cast<i::Address>(js_entry_stub.code.start));
-}
-
TEST(GetJSEntryStubs) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
@@ -27615,7 +27646,7 @@ bool SetupTest(v8::Local<v8::Value> initial_value, LocalContext* env,
v8::Local<v8::ObjectTemplate> object_template =
v8::ObjectTemplate::New(isolate);
object_template->SetInternalFieldCount(kV8WrapperObjectIndex + 1);
- object_template->Set(v8_str("api_func"), checker_templ);
+ object_template->Set(isolate, "api_func", checker_templ);
v8::Local<v8::Object> object =
object_template->NewInstance(env->local()).ToLocalChecked();
@@ -28256,6 +28287,7 @@ TEST(TriggerDelayedMainThreadMetricsEvent) {
using v8::Context;
using v8::Local;
using v8::MaybeLocal;
+ i::FLAG_stress_concurrent_allocation = false;
// Set up isolate and context.
v8::Isolate* iso = CcTest::isolate();
@@ -28281,7 +28313,9 @@ TEST(TriggerDelayedMainThreadMetricsEvent) {
CHECK_EQ(recorder->count_, 0); // Unchanged.
CHECK_EQ(recorder->time_in_us_, -1); // Unchanged.
v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1100));
- v8::platform::PumpMessageLoop(v8::internal::V8::GetCurrentPlatform(), iso);
+ while (v8::platform::PumpMessageLoop(v8::internal::V8::GetCurrentPlatform(),
+ iso)) {
+ }
CHECK_EQ(recorder->count_, 1); // Increased.
CHECK_GT(recorder->time_in_us_, 100);
}
@@ -28292,7 +28326,9 @@ TEST(TriggerDelayedMainThreadMetricsEvent) {
// invalid.
i_iso->metrics_recorder()->DelayMainThreadEvent(event, context_id);
v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1100));
- v8::platform::PumpMessageLoop(v8::internal::V8::GetCurrentPlatform(), iso);
+ while (v8::platform::PumpMessageLoop(v8::internal::V8::GetCurrentPlatform(),
+ iso)) {
+ }
CHECK_EQ(recorder->count_, 1); // Unchanged.
}
diff --git a/deps/v8/test/cctest/test-assembler-x64.cc b/deps/v8/test/cctest/test-assembler-x64.cc
index df73e335ce..bfc40a1a1c 100644
--- a/deps/v8/test/cctest/test-assembler-x64.cc
+++ b/deps/v8/test/cctest/test-assembler-x64.cc
@@ -817,7 +817,7 @@ TEST(StackAlignmentForSSE2) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> global_template =
v8::ObjectTemplate::New(isolate);
- global_template->Set(v8_str("do_sse2"),
+ global_template->Set(isolate, "do_sse2",
v8::FunctionTemplate::New(isolate, DoSSE2));
LocalContext env(nullptr, global_template);
diff --git a/deps/v8/test/cctest/test-code-stub-assembler.cc b/deps/v8/test/cctest/test-code-stub-assembler.cc
index f79b848dc1..3b8ced8a4a 100644
--- a/deps/v8/test/cctest/test-code-stub-assembler.cc
+++ b/deps/v8/test/cctest/test-code-stub-assembler.cc
@@ -1938,12 +1938,15 @@ TEST(PopAndReturnConstant) {
const int kNumParams = 4;
const int kNumProgrammaticParams = 2;
- CodeAssemblerTester asm_tester(isolate, kNumParams - kNumProgrammaticParams);
+ CodeAssemblerTester asm_tester(
+ isolate,
+ kNumParams - kNumProgrammaticParams + 1); // Include receiver.
CodeStubAssembler m(asm_tester.state());
// Call a function that return |kNumProgramaticParams| parameters in addition
// to those specified by the static descriptor. |kNumProgramaticParams| is
// specified as a constant.
+ CSA_CHECK(&m, m.SmiEqual(m.CAST(m.Parameter(2)), m.SmiConstant(5678)));
m.PopAndReturn(m.Int32Constant(kNumProgrammaticParams),
m.SmiConstant(Smi::FromInt(1234)));
@@ -1951,7 +1954,7 @@ TEST(PopAndReturnConstant) {
Handle<Object> result;
for (int test_count = 0; test_count < 100; ++test_count) {
result = ft.Call(isolate->factory()->undefined_value(),
- Handle<Smi>(Smi::FromInt(1234), isolate),
+ Handle<Smi>(Smi::FromInt(5678), isolate),
isolate->factory()->undefined_value(),
isolate->factory()->undefined_value())
.ToHandleChecked();
@@ -1964,22 +1967,26 @@ TEST(PopAndReturnVariable) {
const int kNumParams = 4;
const int kNumProgrammaticParams = 2;
- CodeAssemblerTester asm_tester(isolate, kNumParams - kNumProgrammaticParams);
+ CodeAssemblerTester asm_tester(
+ isolate,
+ kNumParams - kNumProgrammaticParams + 1); // Include receiver.
CodeStubAssembler m(asm_tester.state());
// Call a function that return |kNumProgramaticParams| parameters in addition
// to those specified by the static descriptor. |kNumProgramaticParams| is
- // passed in as a parameter to the function so that it can't be recongized as
+ // passed in as a parameter to the function so that it can't be recognized as
// a constant.
- m.PopAndReturn(m.SmiUntag(m.Parameter(1)), m.SmiConstant(Smi::FromInt(1234)));
+ CSA_CHECK(&m, m.SmiEqual(m.CAST(m.Parameter(2)), m.SmiConstant(5678)));
+ m.PopAndReturn(m.SmiUntag(m.CAST(m.Parameter(1))),
+ m.SmiConstant(Smi::FromInt(1234)));
FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
Handle<Object> result;
for (int test_count = 0; test_count < 100; ++test_count) {
- result = ft.Call(isolate->factory()->undefined_value(),
- Handle<Smi>(Smi::FromInt(1234), isolate),
+ result = ft.Call(Handle<Smi>(Smi::FromInt(kNumProgrammaticParams), isolate),
+ Handle<Smi>(Smi::FromInt(5678), isolate),
isolate->factory()->undefined_value(),
- Handle<Smi>(Smi::FromInt(kNumProgrammaticParams), isolate))
+ isolate->factory()->undefined_value())
.ToHandleChecked();
CHECK_EQ(1234, Handle<Smi>::cast(result)->value());
}
diff --git a/deps/v8/test/cctest/test-compiler.cc b/deps/v8/test/cctest/test-compiler.cc
index e6feddf021..a2c73fb301 100644
--- a/deps/v8/test/cctest/test-compiler.cc
+++ b/deps/v8/test/cctest/test-compiler.cc
@@ -972,7 +972,8 @@ TEST(DecideToPretenureDuringCompilation) {
// compilation.
if (!i::FLAG_opt || i::FLAG_always_opt || i::FLAG_minor_mc ||
i::FLAG_stress_incremental_marking || i::FLAG_optimize_for_size ||
- i::FLAG_turbo_nci || i::FLAG_turbo_nci_as_highest_tier) {
+ i::FLAG_turbo_nci || i::FLAG_turbo_nci_as_midtier ||
+ i::FLAG_stress_concurrent_allocation) {
return;
}
diff --git a/deps/v8/test/cctest/test-concurrent-descriptor-array.cc b/deps/v8/test/cctest/test-concurrent-descriptor-array.cc
index 83763b4140..97f3f5dc94 100644
--- a/deps/v8/test/cctest/test-concurrent-descriptor-array.cc
+++ b/deps/v8/test/cctest/test-concurrent-descriptor-array.cc
@@ -70,8 +70,8 @@ class ConcurrentSearchThread final : public v8::base::Thread {
// Uses linear search on a flat object, with up to 8 elements.
TEST(LinearSearchFlatObject) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> ph = isolate->NewPersistentHandles();
@@ -122,8 +122,8 @@ TEST(LinearSearchFlatObject) {
// Uses linear search on a flat object, which has more than 8 elements.
TEST(LinearSearchFlatObject_ManyElements) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> ph = isolate->NewPersistentHandles();
diff --git a/deps/v8/test/cctest/test-concurrent-prototype.cc b/deps/v8/test/cctest/test-concurrent-prototype.cc
index 4fe7c14b0a..65029add71 100644
--- a/deps/v8/test/cctest/test-concurrent-prototype.cc
+++ b/deps/v8/test/cctest/test-concurrent-prototype.cc
@@ -68,8 +68,8 @@ class ConcurrentSearchThread final : public v8::base::Thread {
// Test to search on a background thread, while the main thread is idle.
TEST(ProtoWalkBackground) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> ph = isolate->NewPersistentHandles();
@@ -108,8 +108,8 @@ TEST(ProtoWalkBackground) {
// Test to search on a background thread, while the main thread modifies the
// descriptor array.
TEST(ProtoWalkBackground_DescriptorArrayWrite) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> ph = isolate->NewPersistentHandles();
@@ -155,8 +155,8 @@ TEST(ProtoWalkBackground_DescriptorArrayWrite) {
}
TEST(ProtoWalkBackground_PrototypeChainWrite) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> ph = isolate->NewPersistentHandles();
diff --git a/deps/v8/test/cctest/test-cpu-profiler.cc b/deps/v8/test/cctest/test-cpu-profiler.cc
index 5d85310179..84c4ee08fe 100644
--- a/deps/v8/test/cctest/test-cpu-profiler.cc
+++ b/deps/v8/test/cctest/test-cpu-profiler.cc
@@ -450,8 +450,7 @@ class ProfilerHelper {
v8::Local<v8::Function> function, v8::Local<v8::Value> argv[], int argc,
unsigned min_js_samples = 0, unsigned min_external_samples = 0,
ProfilingMode mode = ProfilingMode::kLeafNodeLineNumbers,
- unsigned max_samples = v8::CpuProfilingOptions::kNoSampleLimit,
- v8::Local<v8::Context> context = v8::Local<v8::Context>());
+ unsigned max_samples = v8::CpuProfilingOptions::kNoSampleLimit);
v8::CpuProfiler* profiler() { return profiler_; }
@@ -464,12 +463,11 @@ v8::CpuProfile* ProfilerHelper::Run(v8::Local<v8::Function> function,
v8::Local<v8::Value> argv[], int argc,
unsigned min_js_samples,
unsigned min_external_samples,
- ProfilingMode mode, unsigned max_samples,
- v8::Local<v8::Context> context) {
+ ProfilingMode mode, unsigned max_samples) {
v8::Local<v8::String> profile_name = v8_str("my_profile");
profiler_->SetSamplingInterval(100);
- profiler_->StartProfiling(profile_name, {mode, max_samples, 0, context});
+ profiler_->StartProfiling(profile_name, {mode, max_samples, 0});
v8::internal::CpuProfiler* iprofiler =
reinterpret_cast<v8::internal::CpuProfiler*>(profiler_);
@@ -996,7 +994,7 @@ TEST(NativeMethodUninitializedIC) {
v8::Local<v8::Signature> signature =
v8::Signature::New(isolate, func_template);
proto_template->Set(
- v8_str("fooMethod"),
+ isolate, "fooMethod",
v8::FunctionTemplate::New(isolate, &TestApiCallbacks::Callback, data,
signature, 0));
@@ -1037,7 +1035,7 @@ TEST(NativeMethodMonomorphicIC) {
v8::Local<v8::Signature> signature =
v8::Signature::New(isolate, func_template);
proto_template->Set(
- v8_str("fooMethod"),
+ isolate, "fooMethod",
v8::FunctionTemplate::New(isolate, &TestApiCallbacks::Callback, data,
signature, 0));
@@ -1245,7 +1243,7 @@ static const char* call_function_test_source =
" } while (Date.now() - start < duration);\n"
"}";
-// Test that if we sampled thread when it was inside FunctionCall buitin then
+// Test that if we sampled thread when it was inside FunctionCall builtin then
// its caller frame will be '(unresolved function)' as we have no reliable way
// to resolve it.
//
@@ -2111,9 +2109,7 @@ TEST(FunctionDetails) {
"script_b", true);
script_b->Run(env).ToLocalChecked();
const v8::CpuProfile* profile = i::ProfilerExtension::last_profile;
- const v8::CpuProfileNode* current = profile->GetTopDownRoot();
- reinterpret_cast<ProfileNode*>(const_cast<v8::CpuProfileNode*>(current))
- ->Print(0);
+ reinterpret_cast<const i::CpuProfile*>(profile)->Print();
// The tree should look like this:
// 0 (root) 0 #1
// 0 "" 19 #2 no reason script_b:1
@@ -2189,9 +2185,7 @@ TEST(FunctionDetailsInlining) {
script_a->Run(env).ToLocalChecked();
const v8::CpuProfile* profile = i::ProfilerExtension::last_profile;
- const v8::CpuProfileNode* current = profile->GetTopDownRoot();
- reinterpret_cast<ProfileNode*>(const_cast<v8::CpuProfileNode*>(current))
- ->Print(0);
+ reinterpret_cast<const i::CpuProfile*>(profile)->Print();
// The tree should look like this:
// 0 (root) 0 #1
// 5 (program) 0 #6
@@ -2218,6 +2212,84 @@ TEST(FunctionDetailsInlining) {
script_b->GetUnboundScript()->GetId(), 1, 14, alpha);
}
+static const char* pre_profiling_osr_script = R"(
+ function whenPass(pass, optDuration) {
+ if (pass == 5) startProfiling();
+ }
+ function hot(optDuration, deoptDuration) {
+ const startTime = Date.now();
+ %PrepareFunctionForOptimization(hot);
+ for (let pass = 0; pass <= optDuration + deoptDuration; pass++) {
+ // Let a few passes go by to ensure we have enough feeback info
+ if (pass == 3) %OptimizeOsr();
+ // Force deoptimization. %DeoptimizeNow and %DeoptimizeFunction don't
+ // doptimize OSRs.
+ if (pass == optDuration) whenPass = () => {};
+ whenPass(pass, optDuration);
+ for (let i = 0; i < 1e5; i++) {
+ for (let j = 0; j < 1000; j++) {
+ x = Math.random() * j;
+ }
+ if ((Date.now() - startTime) > pass) break;
+ }
+ }
+ }
+ function notHot(optDuration, deoptDuration) {
+ hot(optDuration, deoptDuration);
+ stopProfiling()
+ }
+ )";
+
+// Testing profiling of OSR code that was OSR optimized before profiling
+// started. Currently the behavior is not quite right so we're currently
+// testing a deopt event being sent to the sampling thread for a function
+// it knows nothing about. This deopt does mean we start getting samples
+// for hot so we expect some samples, just fewer than for notHot.
+//
+// We should get something like:
+// 0 (root):0 3 0 #1
+// 12 (garbage collector):0 3 0 #5
+// 5 notHot:22 0 4 #2
+// 85 hot:5 0 4 #6
+// 0 whenPass:2 0 4 #3
+// 0 startProfiling:0 2 0 #4
+//
+// But currently get something like:
+// 0 (root):0 3 0 #1
+// 12 (garbage collector):0 3 0 #5
+// 57 notHot:22 0 4 #2
+// 33 hot:5 0 4 #6
+// 0 whenPass:2 0 4 #3
+// 0 startProfiling:0 2 0 #4
+
+TEST(StartProfilingAfterOsr) {
+ i::FLAG_allow_natives_syntax = true;
+ v8::HandleScope scope(CcTest::isolate());
+ v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
+ v8::Context::Scope context_scope(env);
+ ProfilerHelper helper(env);
+ CompileRun(pre_profiling_osr_script);
+ v8::Local<v8::Function> function = GetFunction(env, "notHot");
+
+ int32_t profiling_optimized_ms = 80;
+ int32_t profiling_deoptimized_ms = 40;
+ v8::Local<v8::Value> args[] = {
+ v8::Integer::New(env->GetIsolate(), profiling_optimized_ms),
+ v8::Integer::New(env->GetIsolate(), profiling_deoptimized_ms)};
+ function->Call(env, env->Global(), arraysize(args), args).ToLocalChecked();
+ const v8::CpuProfile* profile = i::ProfilerExtension::last_profile;
+ CHECK(profile);
+ reinterpret_cast<const i::CpuProfile*>(profile)->Print();
+
+ const CpuProfileNode* root = profile->GetTopDownRoot();
+ const v8::CpuProfileNode* notHotNode = GetChild(env, root, "notHot");
+ const v8::CpuProfileNode* hotNode = GetChild(env, notHotNode, "hot");
+ USE(hotNode);
+ // If/when OSR sampling is fixed the following CHECK_GT could/should be
+ // uncommented and the node = node line deleted.
+ // CHECK_GT(hotNode->GetHitCount(), notHotNode->GetHitCount());
+}
+
TEST(DontStopOnFinishedProfileDelete) {
v8::HandleScope scope(CcTest::isolate());
v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
@@ -3096,6 +3168,99 @@ TEST(MultipleIsolates) {
thread2.Join();
}
+// Varying called function frame sizes increases the chance of something going
+// wrong if sampling an unlocked frame. We also prevent optimization to prevent
+// inlining so each function call has its own frame.
+const char* varying_frame_size_script = R"(
+ %NeverOptimizeFunction(maybeYield);
+ %NeverOptimizeFunction(bar);
+ %NeverOptimizeFunction(foo);
+ function maybeYield(n) {
+ YieldIsolate(Math.random() > yieldLimit);
+ }
+ function bar(a, b, c, d) {
+ maybeYield(Math.random());
+ return a.length + b.length + c.length + d.length;
+ }
+ function foo(timeLimit, yieldProbability) {
+ yieldLimit = 1 - yieldProbability;
+ const startTime = Date.now();
+ for (let i = 0; i < 1e6; i++) {
+ maybeYield(1);
+ bar("Hickory", "Dickory", "Doc", "Mouse");
+ YieldIsolate(Math.random() > 0.999);
+ if ((Date.now() - startTime) > timeLimit) break;
+ }
+ }
+ )";
+
+class UnlockingThread : public v8::base::Thread {
+ public:
+ explicit UnlockingThread(v8::Local<v8::Context> env)
+ : Thread(Options("UnlockingThread")), env_(CcTest::isolate(), env) {}
+
+ void Run() override {
+ v8::Isolate* isolate = CcTest::isolate();
+ v8::Locker locker(isolate);
+ v8::Isolate::Scope isolate_scope(isolate);
+ v8::HandleScope scope(isolate);
+ v8::Local<v8::Context> env = v8::Local<v8::Context>::New(isolate, env_);
+ Profile(env);
+ }
+
+ static void Profile(v8::Local<v8::Context> env) {
+ v8::Isolate* isolate = CcTest::isolate();
+ v8::Context::Scope context_scope(env);
+ v8::CpuProfiler* profiler = v8::CpuProfiler::New(isolate);
+ profiler->SetSamplingInterval(200);
+ v8::Local<v8::String> profile_name = v8_str("1");
+ profiler->StartProfiling(profile_name);
+ int32_t time_limit = 200;
+ double yield_probability = 0.001;
+ v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, time_limit),
+ v8::Number::New(isolate, yield_probability)};
+ v8::Local<v8::Function> function = GetFunction(env, "foo");
+ function->Call(env, env->Global(), arraysize(args), args).ToLocalChecked();
+ profiler->StopProfiling(profile_name);
+ profiler->Dispose();
+ }
+
+ private:
+ v8::Persistent<v8::Context> env_;
+};
+
+// Checking for crashes with multiple thread/single Isolate profiling.
+TEST(MultipleThreadsSingleIsolate) {
+ i::FLAG_allow_natives_syntax = true;
+ v8::Isolate* isolate = CcTest::isolate();
+ v8::Locker locker(isolate);
+ v8::HandleScope scope(isolate);
+ v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
+ v8::Context::Scope context_scope(env);
+ CcTest::AddGlobalFunction(
+ env, "YieldIsolate", [](const v8::FunctionCallbackInfo<v8::Value>& info) {
+ v8::Isolate* isolate = info.GetIsolate();
+ if (!info[0]->IsTrue()) return;
+ v8::Unlocker unlocker(isolate);
+ v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1));
+ });
+
+ CompileRun(varying_frame_size_script);
+ UnlockingThread thread1(env);
+ UnlockingThread thread2(env);
+
+ CHECK(thread1.Start());
+ CHECK(thread2.Start());
+
+ // For good measure, profile on our own thread
+ UnlockingThread::Profile(env);
+ {
+ v8::Unlocker unlocker(isolate);
+ thread1.Join();
+ thread2.Join();
+ }
+}
+
// Tests that StopProfiling doesn't wait for the next sample tick in order to
// stop, but rather exits early before a given wait threshold.
TEST(FastStopProfiling) {
@@ -3450,140 +3615,6 @@ TEST(Bug9151StaleCodeEntries) {
CHECK(callback);
}
-// Tests that functions from other contexts aren't recorded when filtering for
-// another context.
-TEST(ContextIsolation) {
- i::FLAG_allow_natives_syntax = true;
- LocalContext execution_env;
- i::HandleScope scope(CcTest::i_isolate());
-
- // Install CollectSample callback for more deterministic sampling.
- v8::Local<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(
- execution_env.local()->GetIsolate(), CallCollectSample);
- v8::Local<v8::Function> func =
- func_template->GetFunction(execution_env.local()).ToLocalChecked();
- func->SetName(v8_str("CallCollectSample"));
- execution_env->Global()
- ->Set(execution_env.local(), v8_str("CallCollectSample"), func)
- .FromJust();
-
- ProfilerHelper helper(execution_env.local());
- CompileRun(R"(
- function optimized() {
- CallCollectSample();
- }
-
- function unoptimized() {
- CallCollectSample();
- }
-
- function start() {
- // Test optimized functions
- %PrepareFunctionForOptimization(optimized);
- optimized();
- optimized();
- %OptimizeFunctionOnNextCall(optimized);
- optimized();
-
- // Test unoptimized functions
- %NeverOptimizeFunction(unoptimized);
- unoptimized();
-
- // Test callback
- CallCollectSample();
- }
- )");
- v8::Local<v8::Function> function =
- GetFunction(execution_env.local(), "start");
-
- v8::CpuProfile* same_context_profile = helper.Run(
- function, nullptr, 0, 0, 0, v8::CpuProfilingMode::kLeafNodeLineNumbers,
- v8::CpuProfilingOptions::kNoSampleLimit, execution_env.local());
- const v8::CpuProfileNode* root = same_context_profile->GetTopDownRoot();
- const v8::CpuProfileNode* start_node = FindChild(root, "start");
- CHECK(start_node);
- const v8::CpuProfileNode* optimized_node = FindChild(start_node, "optimized");
- CHECK(optimized_node);
- const v8::CpuProfileNode* unoptimized_node =
- FindChild(start_node, "unoptimized");
- CHECK(unoptimized_node);
- const v8::CpuProfileNode* callback_node =
- FindChild(start_node, "CallCollectSample");
- CHECK(callback_node);
-
- {
- LocalContext filter_env;
- v8::CpuProfile* diff_context_profile = helper.Run(
- function, nullptr, 0, 0, 0, v8::CpuProfilingMode::kLeafNodeLineNumbers,
- v8::CpuProfilingOptions::kNoSampleLimit, filter_env.local());
- const v8::CpuProfileNode* diff_root =
- diff_context_profile->GetTopDownRoot();
- // Ensure that no children were recorded (including callbacks, builtins).
- CHECK(!FindChild(diff_root, "start"));
- }
-}
-
-// Tests that when a native context that's being filtered is moved, we continue
-// to track its execution.
-TEST(ContextFilterMovedNativeContext) {
- i::FLAG_allow_natives_syntax = true;
- i::FLAG_manual_evacuation_candidates_selection = true;
- LocalContext env;
- i::HandleScope scope(CcTest::i_isolate());
-
- {
- // Install CollectSample callback for more deterministic sampling.
- v8::Local<v8::FunctionTemplate> sample_func_template =
- v8::FunctionTemplate::New(env.local()->GetIsolate(), CallCollectSample);
- v8::Local<v8::Function> sample_func =
- sample_func_template->GetFunction(env.local()).ToLocalChecked();
- sample_func->SetName(v8_str("CallCollectSample"));
- env->Global()
- ->Set(env.local(), v8_str("CallCollectSample"), sample_func)
- .FromJust();
-
- // Install a function that triggers the native context to be moved.
- v8::Local<v8::FunctionTemplate> move_func_template =
- v8::FunctionTemplate::New(
- env.local()->GetIsolate(),
- [](const v8::FunctionCallbackInfo<v8::Value>& info) {
- i::Isolate* isolate =
- reinterpret_cast<i::Isolate*>(info.GetIsolate());
- i::heap::ForceEvacuationCandidate(
- i::Page::FromHeapObject(isolate->raw_native_context()));
- CcTest::CollectAllGarbage();
- });
- v8::Local<v8::Function> move_func =
- move_func_template->GetFunction(env.local()).ToLocalChecked();
- move_func->SetName(v8_str("ForceNativeContextMove"));
- env->Global()
- ->Set(env.local(), v8_str("ForceNativeContextMove"), move_func)
- .FromJust();
-
- ProfilerHelper helper(env.local());
- CompileRun(R"(
- function start() {
- ForceNativeContextMove();
- CallCollectSample();
- }
- )");
- v8::Local<v8::Function> function = GetFunction(env.local(), "start");
-
- v8::CpuProfile* profile = helper.Run(
- function, nullptr, 0, 0, 0, v8::CpuProfilingMode::kLeafNodeLineNumbers,
- v8::CpuProfilingOptions::kNoSampleLimit, env.local());
- const v8::CpuProfileNode* root = profile->GetTopDownRoot();
- const v8::CpuProfileNode* start_node = FindChild(root, "start");
- CHECK(start_node);
-
- // Verify that after moving the native context, CallCollectSample is still
- // recorded.
- const v8::CpuProfileNode* callback_node =
- FindChild(start_node, "CallCollectSample");
- CHECK(callback_node);
- }
-}
-
enum class EntryCountMode { kAll, kOnlyInlined };
// Count the number of unique source positions.
diff --git a/deps/v8/test/cctest/test-debug-helper.cc b/deps/v8/test/cctest/test-debug-helper.cc
index 30f72add58..043df87584 100644
--- a/deps/v8/test/cctest/test-debug-helper.cc
+++ b/deps/v8/test/cctest/test-debug-helper.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "src/api/api-inl.h"
+#include "src/execution/frames-inl.h"
#include "src/flags/flags.h"
#include "src/heap/read-only-spaces.h"
#include "src/heap/spaces.h"
@@ -34,7 +35,7 @@ class MemoryFailureRegion {
// Implement the memory-reading callback. This one just fetches memory from the
// current process, but a real implementation for a debugging extension would
// fetch memory from the debuggee process or crash dump.
-d::MemoryAccessResult ReadMemory(uintptr_t address, uint8_t* destination,
+d::MemoryAccessResult ReadMemory(uintptr_t address, void* destination,
size_t byte_count) {
if (address >= memory_fail_start && address <= memory_fail_end) {
// Simulate failure to read debuggee memory.
@@ -410,5 +411,44 @@ TEST(ListObjectClasses) {
CHECK_NE(class_set.find("v8::internal::JSRegExp"), class_set.end());
}
+static void FrameIterationCheck(
+ v8::Local<v8::String> name,
+ const v8::PropertyCallbackInfo<v8::Value>& info) {
+ i::StackFrameIterator iter(reinterpret_cast<i::Isolate*>(info.GetIsolate()));
+ for (int i = 0; !iter.done(); i++) {
+ i::StackFrame* frame = iter.frame();
+ CHECK(i != 0 || (frame->type() == i::StackFrame::EXIT));
+ d::StackFrameResultPtr props = d::GetStackFrame(frame->fp(), &ReadMemory);
+ if (frame->is_java_script()) {
+ JavaScriptFrame* js_frame = JavaScriptFrame::cast(frame);
+ CHECK_EQ(props->num_properties, 1);
+ CheckProp(*props->properties[0], "v8::internal::JSFunction",
+ "currently_executing_jsfunction", js_frame->function().ptr());
+ } else {
+ CHECK_EQ(props->num_properties, 0);
+ }
+ iter.Advance();
+ }
+}
+
+THREADED_TEST(GetFrameStack) {
+ LocalContext env;
+ v8::Isolate* isolate = env->GetIsolate();
+ v8::HandleScope scope(isolate);
+ v8::Local<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate);
+ obj->SetAccessor(v8_str("xxx"), FrameIterationCheck);
+ CHECK(env->Global()
+ ->Set(env.local(), v8_str("obj"),
+ obj->NewInstance(env.local()).ToLocalChecked())
+ .FromJust());
+ v8::Script::Compile(env.local(), v8_str("function foo() {"
+ " return obj.xxx;"
+ "}"
+ "foo();"))
+ .ToLocalChecked()
+ ->Run(env.local())
+ .ToLocalChecked();
+}
+
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/test-debug.cc b/deps/v8/test/cctest/test-debug.cc
index 2054e32c58..2c0329a8f5 100644
--- a/deps/v8/test/cctest/test-debug.cc
+++ b/deps/v8/test/cctest/test-debug.cc
@@ -3945,34 +3945,58 @@ class ArchiveRestoreThread : public v8::base::Thread,
break_count_(0) {}
void Run() override {
- v8::Locker locker(isolate_);
- isolate_->Enter();
-
- v8::HandleScope scope(isolate_);
- v8::Local<v8::Context> context = v8::Context::New(isolate_);
- v8::Context::Scope context_scope(context);
-
- v8::Local<v8::Function> test = CompileFunction(isolate_,
- "function test(n) {\n"
- " debugger;\n"
- " return n + 1;\n"
- "}\n",
- "test");
-
- debug_->SetDebugDelegate(this);
- v8::internal::DisableBreak enable_break(debug_, false);
+ {
+ v8::Locker locker(isolate_);
+ v8::Isolate::Scope i_scope(isolate_);
+
+ v8::HandleScope scope(isolate_);
+ v8::Local<v8::Context> context = v8::Context::New(isolate_);
+ v8::Context::Scope context_scope(context);
+ auto callback = [](const v8::FunctionCallbackInfo<v8::Value>& info) {
+ v8::Local<v8::Value> value = info.Data();
+ CHECK(value->IsExternal());
+ auto art = static_cast<ArchiveRestoreThread*>(
+ v8::Local<v8::External>::Cast(value)->Value());
+ art->MaybeSpawnChildThread();
+ };
+ v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(
+ isolate_, callback, v8::External::New(isolate_, this));
+ CHECK(context->Global()
+ ->Set(context, v8_str("maybeSpawnChildThread"),
+ fun->GetFunction(context).ToLocalChecked())
+ .FromJust());
+
+ v8::Local<v8::Function> test =
+ CompileFunction(isolate_,
+ "function test(n) {\n"
+ " debugger;\n"
+ " nest();\n"
+ " middle();\n"
+ " return n + 1;\n"
+ " function middle() {\n"
+ " debugger;\n"
+ " nest();\n"
+ " Date.now();\n"
+ " }\n"
+ " function nest() {\n"
+ " maybeSpawnChildThread();\n"
+ " }\n"
+ "}\n",
+ "test");
- v8::Local<v8::Value> args[1] = {v8::Integer::New(isolate_, spawn_count_)};
+ debug_->SetDebugDelegate(this);
+ v8::internal::DisableBreak enable_break(debug_, false);
- int result = test->Call(context, context->Global(), 1, args)
- .ToLocalChecked()
- ->Int32Value(context)
- .FromJust();
+ v8::Local<v8::Value> args[1] = {v8::Integer::New(isolate_, spawn_count_)};
- // Verify that test(spawn_count_) returned spawn_count_ + 1.
- CHECK_EQ(spawn_count_ + 1, result);
+ int result = test->Call(context, context->Global(), 1, args)
+ .ToLocalChecked()
+ ->Int32Value(context)
+ .FromJust();
- isolate_->Exit();
+ // Verify that test(spawn_count_) returned spawn_count_ + 1.
+ CHECK_EQ(spawn_count_ + 1, result);
+ }
}
void BreakProgramRequested(
@@ -3985,9 +4009,12 @@ class ArchiveRestoreThread : public v8::base::Thread,
i::PrintF("ArchiveRestoreThread #%d hit breakpoint at line %d\n",
spawn_count_, location.GetLineNumber());
- switch (location.GetLineNumber()) {
- case 1: // debugger;
- CHECK_EQ(break_count_, 0);
+ const int expectedLineNumber[] = {1, 2, 3, 6, 4};
+ CHECK_EQ(expectedLineNumber[break_count_], location.GetLineNumber());
+ switch (break_count_) {
+ case 0: // debugger;
+ case 1: // nest();
+ case 2: // middle();
// Attempt to stop on the next line after the first debugger
// statement. If debug->{Archive,Restore}Debug() improperly reset
@@ -3999,12 +4026,25 @@ class ArchiveRestoreThread : public v8::base::Thread,
// that the parent thread correctly archived and restored the
// state necessary to stop on the next line. If not, then control
// will simply continue past the `return n + 1` statement.
+ //
+ // A real world multi-threading app would probably never unlock the
+ // Isolate at a break point as that adds a thread switch point while
+ // debugging where none existed in the application and a
+ // multi-threaded should be able to count on not thread switching
+ // over a certain range of instructions.
MaybeSpawnChildThread();
break;
- case 2: // return n + 1;
- CHECK_EQ(break_count_, 1);
+ case 3: // debugger; in middle();
+ // Attempt to stop on the next line after the first debugger
+ // statement. If debug->{Archive,Restore}Debug() improperly reset
+ // thread-local debug information, the debugger will fail to stop
+ // before the test function returns.
+ debug_->PrepareStep(StepOut);
+ break;
+
+ case 4: // return n + 1;
break;
default:
@@ -4033,8 +4073,8 @@ class ArchiveRestoreThread : public v8::base::Thread,
// This is the most important check in this test, since
// child.GetBreakCount() will return 1 if the debugger fails to stop
- // on the `return n + 1` line after the grandchild thread returns.
- CHECK_EQ(child.GetBreakCount(), 2);
+ // on the `next()` line after the grandchild thread returns.
+ CHECK_EQ(child.GetBreakCount(), 5);
}
}
@@ -4048,18 +4088,14 @@ class ArchiveRestoreThread : public v8::base::Thread,
};
TEST(DebugArchiveRestore) {
- v8::Isolate::CreateParams create_params;
- create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
- v8::Isolate* isolate = v8::Isolate::New(create_params);
+ v8::Isolate* isolate = CcTest::isolate();
- ArchiveRestoreThread thread(isolate, 5);
+ ArchiveRestoreThread thread(isolate, 4);
// Instead of calling thread.Start() and thread.Join() here, we call
// thread.Run() directly, to make sure we exercise archive/restore
// logic on the *current* thread as well as other threads.
thread.Run();
- CHECK_EQ(thread.GetBreakCount(), 2);
-
- isolate->Dispose();
+ CHECK_EQ(thread.GetBreakCount(), 5);
}
class DebugEventExpectNoException : public v8::debug::DebugDelegate {
@@ -4222,6 +4258,7 @@ size_t NearHeapLimitCallback(void* data, size_t current_heap_limit,
}
UNINITIALIZED_TEST(DebugSetOutOfMemoryListener) {
+ i::FLAG_stress_concurrent_allocation = false;
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
create_params.constraints.set_max_old_generation_size_in_bytes(10 * i::MB);
diff --git a/deps/v8/test/cctest/test-descriptor-array.cc b/deps/v8/test/cctest/test-descriptor-array.cc
new file mode 100644
index 0000000000..7db189d812
--- /dev/null
+++ b/deps/v8/test/cctest/test-descriptor-array.cc
@@ -0,0 +1,424 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/base/logging.h"
+#include "src/codegen/code-stub-assembler.h"
+#include "src/common/globals.h"
+#include "src/objects/descriptor-array.h"
+#include "src/objects/property-details.h"
+#include "src/objects/string-inl.h"
+#include "src/objects/transitions-inl.h"
+#include "test/cctest/cctest.h"
+#include "test/cctest/compiler/code-assembler-tester.h"
+#include "test/cctest/compiler/function-tester.h"
+#include "test/cctest/test-transitions.h"
+
+namespace v8 {
+namespace internal {
+
+namespace {
+
+using Label = compiler::CodeAssemblerLabel;
+template <class T>
+using TVariable = compiler::TypedCodeAssemblerVariable<T>;
+
+Handle<Name> NewNameWithHash(Isolate* isolate, const char* str, uint32_t hash,
+ bool is_integer) {
+ uint32_t hash_field = hash << Name::kHashShift;
+
+ static_assert(Name::kNofHashBitFields == 2, "This test needs updating");
+ static_assert(Name::kHashNotComputedMask == 1, "This test needs updating");
+ static_assert(Name::kIsNotIntegerIndexMask == 2, "This test needs updating");
+
+ if (!is_integer) {
+ hash_field |= Name::kIsNotIntegerIndexMask;
+ }
+ Handle<Name> name = isolate->factory()->NewOneByteInternalizedString(
+ OneByteVector(str), hash_field);
+ name->set_hash_field(hash_field);
+ CHECK(name->IsUniqueName());
+ return name;
+}
+
+template <typename... Args>
+MaybeHandle<Object> Call(Isolate* isolate, Handle<JSFunction> function,
+ Args... args) {
+ const int nof_args = sizeof...(Args);
+ Handle<Object> call_args[] = {args...};
+ Handle<Object> receiver = isolate->factory()->undefined_value();
+ return Execution::Call(isolate, function, receiver, nof_args, call_args);
+}
+
+void CheckDescriptorArrayLookups(Isolate* isolate, Handle<Map> map,
+ std::vector<Handle<Name>>& names,
+ Handle<JSFunction> csa_lookup) {
+ // Test C++ implementation.
+ {
+ DisallowHeapAllocation no_gc;
+ DescriptorArray descriptors = map->instance_descriptors();
+ DCHECK(descriptors.IsSortedNoDuplicates());
+ int nof_descriptors = descriptors.number_of_descriptors();
+
+ for (size_t i = 0; i < names.size(); ++i) {
+ Name name = *names[i];
+ InternalIndex index = descriptors.Search(name, nof_descriptors, false);
+ CHECK(index.is_found());
+ CHECK_EQ(i, index.as_uint32());
+ }
+ }
+
+ // Test CSA implementation.
+ if (!FLAG_jitless) {
+ for (size_t i = 0; i < names.size(); ++i) {
+ Handle<Object> name_index =
+ Call(isolate, csa_lookup, map, names[i]).ToHandleChecked();
+ CHECK(name_index->IsSmi());
+ CHECK_EQ(DescriptorArray::ToKeyIndex(static_cast<int>(i)),
+ Smi::ToInt(*name_index));
+ }
+ }
+}
+
+void CheckTransitionArrayLookups(Isolate* isolate,
+ Handle<TransitionArray> transitions,
+ std::vector<Handle<Map>>& maps,
+ Handle<JSFunction> csa_lookup) {
+ // Test C++ implementation.
+ {
+ DisallowHeapAllocation no_gc;
+ DCHECK(transitions->IsSortedNoDuplicates());
+
+ for (size_t i = 0; i < maps.size(); ++i) {
+ Map expected_map = *maps[i];
+ Name name =
+ expected_map.instance_descriptors().GetKey(expected_map.LastAdded());
+
+ Map map = transitions->SearchAndGetTargetForTesting(PropertyKind::kData,
+ name, NONE);
+ CHECK(!map.is_null());
+ CHECK_EQ(expected_map, map);
+ }
+ }
+
+ // Test CSA implementation.
+ if (!FLAG_jitless) {
+ for (size_t i = 0; i < maps.size(); ++i) {
+ Handle<Map> expected_map = maps[i];
+ Handle<Name> name(expected_map->instance_descriptors().GetKey(
+ expected_map->LastAdded()),
+ isolate);
+
+ Handle<Object> transition_map =
+ Call(isolate, csa_lookup, transitions, name).ToHandleChecked();
+ CHECK(transition_map->IsMap());
+ CHECK_EQ(*expected_map, *transition_map);
+ }
+ }
+}
+
+// Creates function with (Map, Name) arguments. Returns Smi with the index of
+// the name value of the found descriptor (DescriptorArray::ToKeyIndex())
+// or null otherwise.
+Handle<JSFunction> CreateCsaDescriptorArrayLookup(Isolate* isolate) {
+ // We are not allowed to generate code in jitless mode.
+ if (FLAG_jitless) return Handle<JSFunction>();
+
+ // Preallocate handle for the result in the current handle scope.
+ Handle<JSFunction> result_function(JSFunction{}, isolate);
+
+ const int kNumParams = 2;
+
+ compiler::CodeAssemblerTester asm_tester(
+ isolate, kNumParams + 1, // +1 to include receiver.
+ CodeKind::STUB);
+ {
+ CodeStubAssembler m(asm_tester.state());
+
+ TNode<Map> map = m.CAST(m.Parameter(1));
+ TNode<Name> unique_name = m.CAST(m.Parameter(2));
+
+ Label passed(&m), failed(&m);
+ Label if_found(&m), if_not_found(&m);
+ TVariable<IntPtrT> var_name_index(&m);
+
+ TNode<Uint32T> bit_field3 = m.LoadMapBitField3(map);
+ TNode<DescriptorArray> descriptors = m.LoadMapDescriptors(map);
+
+ m.DescriptorLookup(unique_name, descriptors, bit_field3, &if_found,
+ &var_name_index, &if_not_found);
+
+ m.BIND(&if_found);
+ m.Return(m.SmiTag(var_name_index.value()));
+
+ m.BIND(&if_not_found);
+ m.Return(m.NullConstant());
+ }
+
+ {
+ compiler::FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+ // Copy function value to a handle created in the outer handle scope.
+ result_function.PatchValue(*ft.function);
+ }
+
+ return result_function;
+}
+
+// Creates function with (TransitionArray, Name) arguments. Returns transition
+// map if transition is found or null otherwise.
+Handle<JSFunction> CreateCsaTransitionArrayLookup(Isolate* isolate) {
+ // We are not allowed to generate code in jitless mode.
+ if (FLAG_jitless) return Handle<JSFunction>();
+
+ // Preallocate handle for the result in the current handle scope.
+ Handle<JSFunction> result_function(JSFunction{}, isolate);
+
+ const int kNumParams = 2;
+ compiler::CodeAssemblerTester asm_tester(
+ isolate, kNumParams + 1, // +1 to include receiver.
+ CodeKind::STUB);
+ {
+ CodeStubAssembler m(asm_tester.state());
+
+ TNode<TransitionArray> transitions = m.CAST(m.Parameter(1));
+ TNode<Name> unique_name = m.CAST(m.Parameter(2));
+
+ Label passed(&m), failed(&m);
+ Label if_found(&m), if_not_found(&m);
+ TVariable<IntPtrT> var_name_index(&m);
+
+ m.TransitionLookup(unique_name, transitions, &if_found, &var_name_index,
+ &if_not_found);
+
+ m.BIND(&if_found);
+ {
+ STATIC_ASSERT(kData == 0);
+ STATIC_ASSERT(NONE == 0);
+ const int kKeyToTargetOffset = (TransitionArray::kEntryTargetIndex -
+ TransitionArray::kEntryKeyIndex) *
+ kTaggedSize;
+ TNode<Map> transition_map = m.CAST(m.GetHeapObjectAssumeWeak(
+ m.LoadArrayElement(transitions, WeakFixedArray::kHeaderSize,
+ var_name_index.value(), kKeyToTargetOffset)));
+ m.Return(transition_map);
+ }
+
+ m.BIND(&if_not_found);
+ m.Return(m.NullConstant());
+ }
+
+ {
+ compiler::FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+ // Copy function value to a handle created in the outer handle scope.
+ result_function.PatchValue(*ft.function);
+ }
+
+ return result_function;
+}
+
+} // namespace
+
+TEST(DescriptorArrayHashCollisionMassive) {
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ HandleScope handle_scope(isolate);
+
+ static_assert(Name::kNofHashBitFields == 2, "This test needs updating");
+
+ std::vector<Handle<Name>> names;
+
+ // Use the same hash value for all names.
+ uint32_t hash =
+ static_cast<uint32_t>(isolate->GenerateIdentityHash(Name::kHashBitMask));
+
+ for (int i = 0; i < kMaxNumberOfDescriptors / 2; ++i) {
+ // Add pairs of names having the same base hash value but having different
+ // values of is_integer bit.
+ bool first_is_integer = (i & 1) != 0;
+ bool second_is_integer = (i & 2) != 0;
+
+ names.push_back(NewNameWithHash(isolate, "a", hash, first_is_integer));
+ names.push_back(NewNameWithHash(isolate, "b", hash, second_is_integer));
+ }
+
+ // Create descriptor array with the created names by appending fields to some
+ // map. DescriptorArray marking relies on the fact that it's attached to an
+ // owning map.
+ Handle<Map> map = Map::Create(isolate, 0);
+
+ Handle<FieldType> any_type = FieldType::Any(isolate);
+
+ for (size_t i = 0; i < names.size(); ++i) {
+ map = Map::CopyWithField(isolate, map, names[i], any_type, NONE,
+ PropertyConstness::kMutable,
+ Representation::Tagged(), OMIT_TRANSITION)
+ .ToHandleChecked();
+ }
+
+ Handle<JSFunction> csa_lookup = CreateCsaDescriptorArrayLookup(isolate);
+
+ CheckDescriptorArrayLookups(isolate, map, names, csa_lookup);
+
+ // Sort descriptor array and check it again.
+ map->instance_descriptors().Sort();
+ CheckDescriptorArrayLookups(isolate, map, names, csa_lookup);
+}
+
+TEST(DescriptorArrayHashCollision) {
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ HandleScope handle_scope(isolate);
+
+ static_assert(Name::kNofHashBitFields == 2, "This test needs updating");
+
+ std::vector<Handle<Name>> names;
+ uint32_t hash = 0;
+
+ for (int i = 0; i < kMaxNumberOfDescriptors / 2; ++i) {
+ if (i % 2 == 0) {
+ // Change hash value for every pair of names.
+ hash = static_cast<uint32_t>(
+ isolate->GenerateIdentityHash(Name::kHashBitMask));
+ }
+
+ // Add pairs of names having the same base hash value but having different
+ // values of is_integer bit.
+ bool first_is_integer = (i & 1) != 0;
+ bool second_is_integer = (i & 2) != 0;
+
+ names.push_back(NewNameWithHash(isolate, "a", hash, first_is_integer));
+ names.push_back(NewNameWithHash(isolate, "b", hash, second_is_integer));
+ }
+
+ // Create descriptor array with the created names by appending fields to some
+ // map. DescriptorArray marking relies on the fact that it's attached to an
+ // owning map.
+ Handle<Map> map = Map::Create(isolate, 0);
+
+ Handle<FieldType> any_type = FieldType::Any(isolate);
+
+ for (size_t i = 0; i < names.size(); ++i) {
+ map = Map::CopyWithField(isolate, map, names[i], any_type, NONE,
+ PropertyConstness::kMutable,
+ Representation::Tagged(), OMIT_TRANSITION)
+ .ToHandleChecked();
+ }
+
+ Handle<JSFunction> csa_lookup = CreateCsaDescriptorArrayLookup(isolate);
+
+ CheckDescriptorArrayLookups(isolate, map, names, csa_lookup);
+
+ // Sort descriptor array and check it again.
+ map->instance_descriptors().Sort();
+ CheckDescriptorArrayLookups(isolate, map, names, csa_lookup);
+}
+
+TEST(TransitionArrayHashCollisionMassive) {
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ HandleScope handle_scope(isolate);
+
+ static_assert(Name::kNofHashBitFields == 2, "This test needs updating");
+
+ std::vector<Handle<Name>> names;
+
+ // Use the same hash value for all names.
+ uint32_t hash =
+ static_cast<uint32_t>(isolate->GenerateIdentityHash(Name::kHashBitMask));
+
+ for (int i = 0; i < TransitionsAccessor::kMaxNumberOfTransitions / 2; ++i) {
+ // Add pairs of names having the same base hash value but having different
+ // values of is_integer bit.
+ bool first_is_integer = (i & 1) != 0;
+ bool second_is_integer = (i & 2) != 0;
+
+ names.push_back(NewNameWithHash(isolate, "a", hash, first_is_integer));
+ names.push_back(NewNameWithHash(isolate, "b", hash, second_is_integer));
+ }
+
+ // Create transitions for each name.
+ Handle<Map> root_map = Map::Create(isolate, 0);
+
+ std::vector<Handle<Map>> maps;
+
+ Handle<FieldType> any_type = FieldType::Any(isolate);
+
+ for (size_t i = 0; i < names.size(); ++i) {
+ Handle<Map> map =
+ Map::CopyWithField(isolate, root_map, names[i], any_type, NONE,
+ PropertyConstness::kMutable,
+ Representation::Tagged(), INSERT_TRANSITION)
+ .ToHandleChecked();
+ maps.push_back(map);
+ }
+
+ Handle<JSFunction> csa_lookup = CreateCsaTransitionArrayLookup(isolate);
+
+ Handle<TransitionArray> transition_array(
+ TestTransitionsAccessor(isolate, root_map).transitions(), isolate);
+
+ CheckTransitionArrayLookups(isolate, transition_array, maps, csa_lookup);
+
+ // Sort transition array and check it again.
+ transition_array->Sort();
+ CheckTransitionArrayLookups(isolate, transition_array, maps, csa_lookup);
+}
+
+TEST(TransitionArrayHashCollision) {
+ CcTest::InitializeVM();
+ Isolate* isolate = CcTest::i_isolate();
+ HandleScope handle_scope(isolate);
+
+ static_assert(Name::kNofHashBitFields == 2, "This test needs updating");
+
+ std::vector<Handle<Name>> names;
+
+ // Use the same hash value for all names.
+ uint32_t hash =
+ static_cast<uint32_t>(isolate->GenerateIdentityHash(Name::kHashBitMask));
+
+ for (int i = 0; i < TransitionsAccessor::kMaxNumberOfTransitions / 2; ++i) {
+ if (i % 2 == 0) {
+ // Change hash value for every pair of names.
+ hash = static_cast<uint32_t>(
+ isolate->GenerateIdentityHash(Name::kHashBitMask));
+ }
+ // Add pairs of names having the same base hash value but having different
+ // values of is_integer bit.
+ bool first_is_integer = (i & 1) != 0;
+ bool second_is_integer = (i & 2) != 0;
+
+ names.push_back(NewNameWithHash(isolate, "a", hash, first_is_integer));
+ names.push_back(NewNameWithHash(isolate, "b", hash, second_is_integer));
+ }
+
+ // Create transitions for each name.
+ Handle<Map> root_map = Map::Create(isolate, 0);
+
+ std::vector<Handle<Map>> maps;
+
+ Handle<FieldType> any_type = FieldType::Any(isolate);
+
+ for (size_t i = 0; i < names.size(); ++i) {
+ Handle<Map> map =
+ Map::CopyWithField(isolate, root_map, names[i], any_type, NONE,
+ PropertyConstness::kMutable,
+ Representation::Tagged(), INSERT_TRANSITION)
+ .ToHandleChecked();
+ maps.push_back(map);
+ }
+
+ Handle<JSFunction> csa_lookup = CreateCsaTransitionArrayLookup(isolate);
+
+ Handle<TransitionArray> transition_array(
+ TestTransitionsAccessor(isolate, root_map).transitions(), isolate);
+
+ CheckTransitionArrayLookups(isolate, transition_array, maps, csa_lookup);
+
+ // Sort transition array and check it again.
+ transition_array->Sort();
+ CheckTransitionArrayLookups(isolate, transition_array, maps, csa_lookup);
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/test/cctest/test-dictionary.cc b/deps/v8/test/cctest/test-dictionary.cc
index 6bce496315..d8f0686a58 100644
--- a/deps/v8/test/cctest/test-dictionary.cc
+++ b/deps/v8/test/cctest/test-dictionary.cc
@@ -297,6 +297,8 @@ static void TestHashMapDoesNotCauseGC(Handle<HashMap> table) {
TEST(ObjectHashTableCausesGC) {
i::FLAG_stress_compaction = false;
+ // For SimulateFullSpace in TestHashMapDoesNotCauseGC.
+ i::FLAG_stress_concurrent_allocation = false;
LocalContext context;
v8::HandleScope scope(context->GetIsolate());
Isolate* isolate = CcTest::i_isolate();
diff --git a/deps/v8/test/cctest/test-disasm-ia32.cc b/deps/v8/test/cctest/test-disasm-ia32.cc
index 7892544dd9..fae6bf072f 100644
--- a/deps/v8/test/cctest/test-disasm-ia32.cc
+++ b/deps/v8/test/cctest/test-disasm-ia32.cc
@@ -687,6 +687,8 @@ TEST(DisasmIa320) {
__ vsqrtps(xmm1, Operand(ebx, ecx, times_4, 10000));
__ vrsqrtps(xmm1, xmm0);
__ vrsqrtps(xmm1, Operand(ebx, ecx, times_4, 10000));
+ __ vmovups(xmm0, xmm1);
+ __ vmovups(xmm0, Operand(edx, 4));
__ vmovaps(xmm0, xmm1);
__ vmovapd(xmm0, xmm1);
__ vmovapd(xmm0, Operand(ebx, ecx, times_4, 10000));
diff --git a/deps/v8/test/cctest/test-field-type-tracking.cc b/deps/v8/test/cctest/test-field-type-tracking.cc
index a9fa5898bf..2f59d7bff8 100644
--- a/deps/v8/test/cctest/test-field-type-tracking.cc
+++ b/deps/v8/test/cctest/test-field-type-tracking.cc
@@ -1038,7 +1038,8 @@ namespace {
// where "p2A" and "p2B" differ only in the attributes.
//
void TestReconfigureDataFieldAttribute_GeneralizeField(
- const CRFTData& from, const CRFTData& to, const CRFTData& expected) {
+ const CRFTData& from, const CRFTData& to, const CRFTData& expected,
+ bool expected_deprecation) {
Isolate* isolate = CcTest::i_isolate();
Expectations expectations(isolate);
@@ -1107,24 +1108,29 @@ void TestReconfigureDataFieldAttribute_GeneralizeField(
CHECK_NE(*map2, *new_map);
CHECK(expectations2.Check(*map2));
- // |map| should be deprecated and |new_map| should match new expectations.
for (int i = kSplitProp; i < kPropCount; i++) {
expectations.SetDataField(i, expected.constness, expected.representation,
expected.type);
}
- CHECK(map->is_deprecated());
- CHECK(!code_field_type->marked_for_deoptimization());
- CHECK(!code_field_repr->marked_for_deoptimization());
- CHECK(!code_field_const->marked_for_deoptimization());
- CHECK_NE(*map, *new_map);
+ if (expected_deprecation) {
+ // |map| should be deprecated and |new_map| should match new expectations.
+ CHECK(map->is_deprecated());
+ CHECK(!code_field_type->marked_for_deoptimization());
+ CHECK(!code_field_repr->marked_for_deoptimization());
+ CHECK(!code_field_const->marked_for_deoptimization());
+ CHECK_NE(*map, *new_map);
- CHECK(!new_map->is_deprecated());
- CHECK(expectations.Check(*new_map));
+ CHECK(!new_map->is_deprecated());
+ CHECK(expectations.Check(*new_map));
- // Update deprecated |map|, it should become |new_map|.
- Handle<Map> updated_map = Map::Update(isolate, map);
- CHECK_EQ(*new_map, *updated_map);
- CheckMigrationTarget(isolate, *map, *updated_map);
+ // Update deprecated |map|, it should become |new_map|.
+ Handle<Map> updated_map = Map::Update(isolate, map);
+ CHECK_EQ(*new_map, *updated_map);
+ CheckMigrationTarget(isolate, *map, *updated_map);
+ } else {
+ CHECK(!map->is_deprecated());
+ CHECK(expectations.Check(*map));
+ }
}
// This test ensures that trivial field generalization (from HeapObject to
@@ -1240,22 +1246,22 @@ TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToDouble) {
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kConst, Representation::Smi(), any_type},
{PropertyConstness::kConst, Representation::Double(), any_type},
- {PropertyConstness::kConst, Representation::Double(), any_type});
+ {PropertyConstness::kConst, Representation::Double(), any_type}, true);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kConst, Representation::Smi(), any_type},
{PropertyConstness::kMutable, Representation::Double(), any_type},
- {PropertyConstness::kMutable, Representation::Double(), any_type});
+ {PropertyConstness::kMutable, Representation::Double(), any_type}, true);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::Smi(), any_type},
{PropertyConstness::kConst, Representation::Double(), any_type},
- {PropertyConstness::kMutable, Representation::Double(), any_type});
+ {PropertyConstness::kMutable, Representation::Double(), any_type}, true);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::Smi(), any_type},
{PropertyConstness::kMutable, Representation::Double(), any_type},
- {PropertyConstness::kMutable, Representation::Double(), any_type});
+ {PropertyConstness::kMutable, Representation::Double(), any_type}, true);
}
TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToTagged) {
@@ -1270,22 +1276,26 @@ TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToTagged) {
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kConst, Representation::Smi(), any_type},
{PropertyConstness::kConst, Representation::HeapObject(), value_type},
- {PropertyConstness::kConst, Representation::Tagged(), any_type});
+ {PropertyConstness::kConst, Representation::Tagged(), any_type},
+ !FLAG_modify_field_representation_inplace);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kConst, Representation::Smi(), any_type},
{PropertyConstness::kMutable, Representation::HeapObject(), value_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ !FLAG_modify_field_representation_inplace);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::Smi(), any_type},
{PropertyConstness::kConst, Representation::HeapObject(), value_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ !FLAG_modify_field_representation_inplace);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::Smi(), any_type},
{PropertyConstness::kMutable, Representation::HeapObject(), value_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ !FLAG_modify_field_representation_inplace);
}
TEST(ReconfigureDataFieldAttribute_GeneralizeDoubleFieldToTagged) {
@@ -1300,22 +1310,26 @@ TEST(ReconfigureDataFieldAttribute_GeneralizeDoubleFieldToTagged) {
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kConst, Representation::Double(), any_type},
{PropertyConstness::kConst, Representation::HeapObject(), value_type},
- {PropertyConstness::kConst, Representation::Tagged(), any_type});
+ {PropertyConstness::kConst, Representation::Tagged(), any_type},
+ FLAG_unbox_double_fields || !FLAG_modify_field_representation_inplace);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kConst, Representation::Double(), any_type},
{PropertyConstness::kMutable, Representation::HeapObject(), value_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ FLAG_unbox_double_fields || !FLAG_modify_field_representation_inplace);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::Double(), any_type},
{PropertyConstness::kConst, Representation::HeapObject(), value_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ FLAG_unbox_double_fields || !FLAG_modify_field_representation_inplace);
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::Double(), any_type},
{PropertyConstness::kMutable, Representation::HeapObject(), value_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ FLAG_unbox_double_fields || !FLAG_modify_field_representation_inplace);
}
TEST(ReconfigureDataFieldAttribute_GeneralizeHeapObjFieldToHeapObj) {
@@ -1401,7 +1415,8 @@ TEST(ReconfigureDataFieldAttribute_GeneralizeHeapObjectFieldToTagged) {
TestReconfigureDataFieldAttribute_GeneralizeField(
{PropertyConstness::kMutable, Representation::HeapObject(), value_type},
{PropertyConstness::kMutable, Representation::Smi(), any_type},
- {PropertyConstness::kMutable, Representation::Tagged(), any_type});
+ {PropertyConstness::kMutable, Representation::Tagged(), any_type},
+ !FLAG_modify_field_representation_inplace);
}
// Checks that given |map| is deprecated and that it updates to given |new_map|
diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc
index 76b8e8eddf..9eff4cbfc1 100644
--- a/deps/v8/test/cctest/test-heap-profiler.cc
+++ b/deps/v8/test/cctest/test-heap-profiler.cc
@@ -55,6 +55,7 @@ using i::ArrayVector;
using i::SourceLocation;
using i::Vector;
using v8::base::Optional;
+using v8::internal::heap::GrowNewSpaceToMaximumCapacity;
namespace {
@@ -1263,6 +1264,9 @@ static TestStatsStream GetHeapStatsUpdate(
TEST(HeapSnapshotObjectsStats) {
+ // Concurrent allocation might break results
+ v8::internal::FLAG_stress_concurrent_allocation = false;
+
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
@@ -2442,27 +2446,18 @@ bool HasWeakGlobalHandle() {
}
-static void PersistentHandleCallback(
- const v8::WeakCallbackInfo<v8::Persistent<v8::Object> >& data) {
- data.GetParameter()->Reset();
-}
-
-
TEST(WeakGlobalHandle) {
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
CHECK(!HasWeakGlobalHandle());
- v8::Persistent<v8::Object> handle;
+ v8::Global<v8::Object> handle;
handle.Reset(env->GetIsolate(), v8::Object::New(env->GetIsolate()));
- handle.SetWeak(&handle, PersistentHandleCallback,
- v8::WeakCallbackType::kParameter);
+ handle.SetWeak();
CHECK(HasWeakGlobalHandle());
- CcTest::CollectAllGarbage();
- EmptyMessageQueues(env->GetIsolate());
}
@@ -3893,7 +3888,8 @@ TEST(SamplingHeapProfilerPretenuredInlineAllocations) {
CcTest::InitializeVM();
if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_opt) return;
if (i::FLAG_gc_global || i::FLAG_stress_compaction ||
- i::FLAG_stress_incremental_marking) {
+ i::FLAG_stress_incremental_marking ||
+ i::FLAG_stress_concurrent_allocation) {
return;
}
@@ -3904,10 +3900,7 @@ TEST(SamplingHeapProfilerPretenuredInlineAllocations) {
// Suppress randomness to avoid flakiness in tests.
v8::internal::FLAG_sampling_heap_profiler_suppress_randomness = true;
- // Grow new space until maximum capacity reached.
- while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
- CcTest::heap()->new_space()->Grow();
- }
+ GrowNewSpaceToMaximumCapacity(CcTest::heap());
i::ScopedVector<char> source(1024);
i::SNPrintF(source,
@@ -4126,40 +4119,3 @@ TEST(Bug8373_2) {
heap_profiler->StopTrackingHeapObjects();
}
-
-TEST(HeapSnapshotDeleteDuringTakeSnapshot) {
- // Check that a heap snapshot can be deleted during GC while another one
- // is being taken.
-
- LocalContext env;
- v8::HandleScope scope(env->GetIsolate());
- v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
- int gc_calls = 0;
- v8::Global<v8::Object> handle;
-
- {
- struct WeakData {
- const v8::HeapSnapshot* snapshot;
- int* gc_calls;
- v8::Global<v8::Object>* handle;
- };
- WeakData* data =
- new WeakData{heap_profiler->TakeHeapSnapshot(), &gc_calls, &handle};
-
- v8::HandleScope scope(env->GetIsolate());
- handle.Reset(env->GetIsolate(), v8::Object::New(env->GetIsolate()));
- handle.SetWeak(
- data,
- [](const v8::WeakCallbackInfo<WeakData>& data) {
- std::unique_ptr<WeakData> weakdata{data.GetParameter()};
- const_cast<v8::HeapSnapshot*>(weakdata->snapshot)->Delete();
- ++*weakdata->gc_calls;
- weakdata->handle->Reset();
- },
- v8::WeakCallbackType::kParameter);
- }
- CHECK_EQ(gc_calls, 0);
-
- CHECK(ValidateSnapshot(heap_profiler->TakeHeapSnapshot()));
- CHECK_EQ(gc_calls, 1);
-}
diff --git a/deps/v8/test/cctest/test-local-handles.cc b/deps/v8/test/cctest/test-local-handles.cc
index ffe2e64afb..8d1d08fa93 100644
--- a/deps/v8/test/cctest/test-local-handles.cc
+++ b/deps/v8/test/cctest/test-local-handles.cc
@@ -69,8 +69,8 @@ class LocalHandlesThread final : public v8::base::Thread {
};
TEST(CreateLocalHandles) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
Address object = kNullAddress;
@@ -97,8 +97,8 @@ TEST(CreateLocalHandles) {
}
TEST(CreateLocalHandlesWithoutLocalHandleScope) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
{
@@ -108,8 +108,8 @@ TEST(CreateLocalHandlesWithoutLocalHandleScope) {
}
TEST(DereferenceLocalHandle) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
// Create a PersistentHandle to create the LocalHandle, and thus not have a
diff --git a/deps/v8/test/cctest/test-log.cc b/deps/v8/test/cctest/test-log.cc
index 2daa69103a..d39b6d7331 100644
--- a/deps/v8/test/cctest/test-log.cc
+++ b/deps/v8/test/cctest/test-log.cc
@@ -48,12 +48,10 @@ using v8::internal::Logger;
namespace {
-
#define SETUP_FLAGS() \
- bool saved_log = i::FLAG_log; \
- bool saved_prof = i::FLAG_prof; \
i::FLAG_log = true; \
i::FLAG_prof = true; \
+ i::FLAG_log_code = true; \
i::FLAG_logfile = i::Log::kLogToTemporaryFile; \
i::FLAG_logfile_per_isolate = false
@@ -69,10 +67,8 @@ static std::vector<std::string> Split(const std::string& s, char delimiter) {
class ScopedLoggerInitializer {
public:
- ScopedLoggerInitializer(bool saved_log, bool saved_prof, v8::Isolate* isolate)
- : saved_log_(saved_log),
- saved_prof_(saved_prof),
- temp_file_(nullptr),
+ explicit ScopedLoggerInitializer(v8::Isolate* isolate)
+ : temp_file_(nullptr),
isolate_(isolate),
isolate_scope_(isolate),
scope_(isolate),
@@ -83,10 +79,8 @@ class ScopedLoggerInitializer {
~ScopedLoggerInitializer() {
env_->Exit();
- logger_->TearDown();
- if (temp_file_ != nullptr) fclose(temp_file_);
- i::FLAG_prof = saved_prof_;
- i::FLAG_log = saved_log_;
+ FILE* log_file = logger_->TearDownAndGetLogFile();
+ if (log_file != nullptr) fclose(log_file);
}
v8::Local<v8::Context>& env() { return env_; }
@@ -203,15 +197,12 @@ class ScopedLoggerInitializer {
private:
FILE* StopLoggingGetTempFile() {
- temp_file_ = logger_->TearDown();
+ temp_file_ = logger_->TearDownAndGetLogFile();
CHECK(temp_file_);
- fflush(temp_file_);
rewind(temp_file_);
return temp_file_;
}
- const bool saved_log_;
- const bool saved_prof_;
FILE* temp_file_;
v8::Isolate* isolate_;
v8::Isolate::Scope isolate_scope_;
@@ -331,7 +322,7 @@ UNINITIALIZED_TEST(LogCallbacks) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
v8::Local<v8::FunctionTemplate> obj = v8::Local<v8::FunctionTemplate>::New(
isolate, v8::FunctionTemplate::New(isolate));
@@ -384,7 +375,7 @@ UNINITIALIZED_TEST(LogAccessorCallbacks) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
v8::Local<v8::FunctionTemplate> obj = v8::Local<v8::FunctionTemplate>::New(
isolate, v8::FunctionTemplate::New(isolate));
@@ -436,7 +427,7 @@ UNINITIALIZED_TEST(LogVersion) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
logger.StopLogging();
i::EmbeddedVector<char, 100> line_buffer;
@@ -477,7 +468,7 @@ UNINITIALIZED_TEST(Issue539892) {
FakeCodeEventLogger code_event_logger(reinterpret_cast<i::Isolate*>(isolate));
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
logger.logger()->AddCodeEventListener(&code_event_logger);
// Function with a really large name.
@@ -513,14 +504,16 @@ UNINITIALIZED_TEST(Issue539892) {
UNINITIALIZED_TEST(LogAll) {
SETUP_FLAGS();
i::FLAG_log_all = true;
+ i::FLAG_log_api = true;
i::FLAG_turbo_inlining = false;
+ i::FLAG_log_internal_timer_events = true;
i::FLAG_allow_natives_syntax = true;
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
const char* source_text = R"(
function testAddFn(a,b) {
@@ -574,7 +567,7 @@ UNINITIALIZED_TEST(LogInterpretedFramesNativeStack) {
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
const char* source_text =
"function testLogInterpretedFramesNativeStack(a,b) { return a + b };"
@@ -608,7 +601,7 @@ UNINITIALIZED_TEST(LogInterpretedFramesNativeStackWithSerialization) {
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
has_cache = cache != nullptr;
v8::ScriptCompiler::CompileOptions options =
@@ -814,7 +807,7 @@ UNINITIALIZED_TEST(TraceMaps) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
// Try to create many different kind of maps to make sure the logging won't
// crash. More detailed tests are implemented separately.
const char* source_text = R"(
@@ -907,7 +900,7 @@ UNINITIALIZED_TEST(LogMapsDetailsStartup) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
logger.StopLogging();
ValidateMapDetailsLogging(isolate, &logger);
}
@@ -1003,7 +996,7 @@ UNINITIALIZED_TEST(LogMapsDetailsCode) {
[1,2,3].helper();
)";
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
CompileRunChecked(isolate, source);
logger.StopLogging();
ValidateMapDetailsLogging(isolate, &logger);
@@ -1027,7 +1020,7 @@ UNINITIALIZED_TEST(LogMapsDetailsContexts) {
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
// Use the default context.
CompileRunChecked(isolate, "{a:1}");
// Create additional contexts.
@@ -1055,7 +1048,7 @@ UNINITIALIZED_TEST(ConsoleTimeEvents) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
// Test that console time events are properly logged
const char* source_text =
"console.time();"
@@ -1091,7 +1084,7 @@ UNINITIALIZED_TEST(LogFunctionEvents) {
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
// Run some warmup code to help ignoring existing log entries.
CompileRun(
@@ -1175,7 +1168,7 @@ UNINITIALIZED_TEST(BuiltinsNotLoggedAsLazyCompile) {
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer logger(saved_log, saved_prof, isolate);
+ ScopedLoggerInitializer logger(isolate);
logger.LogCodeObjects();
logger.LogCompiledFunctions();
diff --git a/deps/v8/test/cctest/test-persistent-handles.cc b/deps/v8/test/cctest/test-persistent-handles.cc
index 9c765cb2b4..8805f9307a 100644
--- a/deps/v8/test/cctest/test-persistent-handles.cc
+++ b/deps/v8/test/cctest/test-persistent-handles.cc
@@ -74,8 +74,8 @@ class PersistentHandlesThread final : public v8::base::Thread {
};
TEST(CreatePersistentHandles) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> ph = isolate->NewPersistentHandles();
@@ -110,8 +110,8 @@ TEST(CreatePersistentHandles) {
}
TEST(DereferencePersistentHandle) {
+ heap::EnsureFlagLocalHeapsEnabled();
CcTest::InitializeVM();
- FLAG_local_heaps = true;
Isolate* isolate = CcTest::i_isolate();
std::unique_ptr<PersistentHandles> phs = isolate->NewPersistentHandles();
diff --git a/deps/v8/test/cctest/test-platform.cc b/deps/v8/test/cctest/test-platform.cc
index e4ab19f05f..0298e73dc9 100644
--- a/deps/v8/test/cctest/test-platform.cc
+++ b/deps/v8/test/cctest/test-platform.cc
@@ -49,7 +49,7 @@ TEST(StackAlignment) {
v8::HandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> global_template =
v8::ObjectTemplate::New(isolate);
- global_template->Set(v8_str("get_stack_pointer"),
+ global_template->Set(isolate, "get_stack_pointer",
v8::FunctionTemplate::New(isolate, GetStackPointer));
LocalContext env(nullptr, global_template);
diff --git a/deps/v8/test/cctest/test-profile-generator.cc b/deps/v8/test/cctest/test-profile-generator.cc
index ac0537652c..2144bf8e98 100644
--- a/deps/v8/test/cctest/test-profile-generator.cc
+++ b/deps/v8/test/cctest/test-profile-generator.cc
@@ -200,9 +200,7 @@ TEST(ProfileTreeAddPathFromEndWithLineNumbers) {
ProfileTree tree(CcTest::i_isolate());
ProfileTreeTestHelper helper(&tree);
- ProfileStackTrace path = {{{&c, 5}, kNullAddress, false},
- {{&b, 3}, kNullAddress, false},
- {{&a, 1}, kNullAddress, false}};
+ ProfileStackTrace path = {{{&c, 5}}, {{&b, 3}}, {{&a, 1}}};
tree.AddPathFromEnd(path, v8::CpuProfileNode::kNoLineNumberInfo, true,
v8::CpuProfilingMode::kCallerLineNumbers);
diff --git a/deps/v8/test/cctest/test-regexp.cc b/deps/v8/test/cctest/test-regexp.cc
index 35ac17d4aa..16301fd609 100644
--- a/deps/v8/test/cctest/test-regexp.cc
+++ b/deps/v8/test/cctest/test-regexp.cc
@@ -477,35 +477,25 @@ TEST(Errors) {
ExpectError("\\ka", kInvalidNamedReference, true);
}
+static bool IsDigit(uc32 c) { return ('0' <= c && c <= '9'); }
-static bool IsDigit(uc16 c) {
- return ('0' <= c && c <= '9');
-}
-
-
-static bool NotDigit(uc16 c) {
- return !IsDigit(c);
-}
-
+static bool NotDigit(uc32 c) { return !IsDigit(c); }
-static bool IsWhiteSpaceOrLineTerminator(uc16 c) {
+static bool IsWhiteSpaceOrLineTerminator(uc32 c) {
// According to ECMA 5.1, 15.10.2.12 the CharacterClassEscape \s includes
// WhiteSpace (7.2) and LineTerminator (7.3) values.
return v8::internal::IsWhiteSpaceOrLineTerminator(c);
}
-
-static bool NotWhiteSpaceNorLineTermiantor(uc16 c) {
+static bool NotWhiteSpaceNorLineTermiantor(uc32 c) {
return !IsWhiteSpaceOrLineTerminator(c);
}
+static bool NotWord(uc32 c) { return !IsRegExpWord(c); }
-static bool NotWord(uc16 c) {
- return !IsRegExpWord(c);
-}
-
+static bool NotLineTerminator(uc32 c) { return !unibrow::IsLineTerminator(c); }
-static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) {
+static void TestCharacterClassEscapes(uc32 c, bool(pred)(uc32 c)) {
Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME);
ZoneList<CharacterRange>* ranges =
zone.New<ZoneList<CharacterRange>>(2, &zone);
@@ -520,9 +510,8 @@ static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) {
}
}
-
TEST(CharacterClassEscapes) {
- TestCharacterClassEscapes('.', IsRegExpNewline);
+ TestCharacterClassEscapes('.', NotLineTerminator);
TestCharacterClassEscapes('d', IsDigit);
TestCharacterClassEscapes('D', NotDigit);
TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator);
diff --git a/deps/v8/test/cctest/test-sampler-api.cc b/deps/v8/test/cctest/test-sampler-api.cc
index 7197101d41..5ffa1e0544 100644
--- a/deps/v8/test/cctest/test-sampler-api.cc
+++ b/deps/v8/test/cctest/test-sampler-api.cc
@@ -45,7 +45,7 @@ class SamplingTestHelper {
instance_ = this;
v8::HandleScope scope(isolate_);
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate_);
- global->Set(v8_str("CollectSample"),
+ global->Set(isolate_, "CollectSample",
v8::FunctionTemplate::New(isolate_, CollectSample));
LocalContext env(isolate_, nullptr, global);
isolate_->SetJitCodeEventHandler(v8::kJitCodeEventDefault,
diff --git a/deps/v8/test/cctest/test-serialize.cc b/deps/v8/test/cctest/test-serialize.cc
index 70c15003fa..52c71befad 100644
--- a/deps/v8/test/cctest/test-serialize.cc
+++ b/deps/v8/test/cctest/test-serialize.cc
@@ -26,21 +26,21 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <signal.h>
-
#include <sys/stat.h>
-#include "src/init/v8.h"
-
#include "src/api/api-inl.h"
#include "src/codegen/assembler-inl.h"
#include "src/codegen/compilation-cache.h"
#include "src/codegen/compiler.h"
#include "src/codegen/macro-assembler-inl.h"
+#include "src/common/assert-scope.h"
#include "src/debug/debug.h"
#include "src/heap/heap-inl.h"
#include "src/heap/read-only-heap.h"
+#include "src/heap/safepoint.h"
#include "src/heap/spaces.h"
#include "src/init/bootstrapper.h"
+#include "src/init/v8.h"
#include "src/interpreter/interpreter.h"
#include "src/numbers/hash-seed-inl.h"
#include "src/objects/js-array-buffer-inl.h"
@@ -171,7 +171,9 @@ static StartupBlobs Serialize(v8::Isolate* isolate) {
internal_isolate->heap()->CollectAllAvailableGarbage(
i::GarbageCollectionReason::kTesting);
- DisallowHeapAllocation no_gc;
+ SafepointScope safepoint(internal_isolate->heap());
+
+ DisallowGarbageCollection no_gc;
ReadOnlySerializer read_only_serializer(internal_isolate,
Snapshot::kDefaultSerializerFlags);
read_only_serializer.SerializeReadOnlyRoots();
@@ -382,7 +384,9 @@ static void SerializeContext(Vector<const byte>* startup_blob_out,
env.Reset();
- DisallowHeapAllocation no_gc;
+ SafepointScope safepoint(heap);
+
+ DisallowGarbageCollection no_gc;
SnapshotByteSink read_only_sink;
ReadOnlySerializer read_only_serializer(isolate,
Snapshot::kDefaultSerializerFlags);
@@ -532,7 +536,9 @@ static void SerializeCustomContext(Vector<const byte>* startup_blob_out,
env.Reset();
- DisallowHeapAllocation no_gc;
+ SafepointScope safepoint(isolate->heap());
+
+ DisallowGarbageCollection no_gc;
SnapshotByteSink read_only_sink;
ReadOnlySerializer read_only_serializer(isolate,
Snapshot::kDefaultSerializerFlags);
@@ -716,7 +722,8 @@ UNINITIALIZED_TEST(CustomSnapshotDataBlobOverwriteGlobal) {
v8::Local<v8::ObjectTemplate> global_template =
v8::ObjectTemplate::New(isolate1);
global_template->Set(
- v8_str("f"), v8::FunctionTemplate::New(isolate1, UnreachableCallback));
+ isolate1, "f",
+ v8::FunctionTemplate::New(isolate1, UnreachableCallback));
v8::Local<v8::Context> context =
v8::Context::New(isolate1, nullptr, global_template);
v8::Context::Scope c_scope(context);
@@ -1483,6 +1490,54 @@ UNINITIALIZED_TEST(CustomSnapshotDataBlobWithWarmup) {
FreeCurrentEmbeddedBlob();
}
+namespace {
+v8::StartupData CreateCustomSnapshotWithKeep() {
+ v8::SnapshotCreator creator;
+ v8::Isolate* isolate = creator.GetIsolate();
+ {
+ v8::HandleScope handle_scope(isolate);
+ {
+ v8::Local<v8::Context> context = v8::Context::New(isolate);
+ v8::Context::Scope context_scope(context);
+ v8::Local<v8::String> source_str = v8_str(
+ "function f() { return Math.abs(1); }\n"
+ "function g() { return String.raw(1); }");
+ v8::ScriptOrigin origin(v8_str("test"));
+ v8::ScriptCompiler::Source source(source_str, origin);
+ CompileRun(isolate->GetCurrentContext(), &source,
+ v8::ScriptCompiler::kEagerCompile);
+ creator.SetDefaultContext(context);
+ }
+ }
+ return creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kKeep);
+}
+} // namespace
+
+UNINITIALIZED_TEST(CustomSnapshotDataBlobWithKeep) {
+ DisableAlwaysOpt();
+ DisableEmbeddedBlobRefcounting();
+ v8::StartupData blob = CreateCustomSnapshotWithKeep();
+
+ {
+ v8::Isolate::CreateParams params;
+ params.snapshot_blob = &blob;
+ params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ // Test-appropriate equivalent of v8::Isolate::New.
+ v8::Isolate* isolate = TestSerializer::NewIsolate(params);
+ {
+ v8::Isolate::Scope isolate_scope(isolate);
+ v8::HandleScope handle_scope(isolate);
+ v8::Local<v8::Context> context = v8::Context::New(isolate);
+ v8::Context::Scope context_scope(context);
+ CHECK(IsCompiled("f"));
+ CHECK(IsCompiled("g"));
+ }
+ isolate->Dispose();
+ }
+ delete[] blob.data;
+ FreeCurrentEmbeddedBlob();
+}
+
UNINITIALIZED_TEST(CustomSnapshotDataBlobImmortalImmovableRoots) {
DisableAlwaysOpt();
// Flood the startup snapshot with shared function infos. If they are
@@ -1528,7 +1583,7 @@ TEST(TestThatAlwaysFails) {
int CountBuiltins() {
// Check that we have not deserialized any additional builtin.
HeapObjectIterator iterator(CcTest::heap());
- DisallowHeapAllocation no_allocation;
+ DisallowGarbageCollection no_allocation;
int counter = 0;
for (HeapObject obj = iterator.Next(); !obj.is_null();
obj = iterator.Next()) {
@@ -2809,8 +2864,12 @@ UNINITIALIZED_TEST(SnapshotCreatorExternalReferences) {
ExpectInt32("f()", 42);
ExpectString("one_byte", "one_byte");
ExpectString("two_byte", "two_byte");
- CHECK(CompileRun("one_byte").As<v8::String>()->IsExternalOneByte());
- CHECK(CompileRun("two_byte").As<v8::String>()->IsExternal());
+ v8::Local<v8::String> one_byte = CompileRun("one_byte").As<v8::String>();
+ v8::Local<v8::String> two_byte = CompileRun("two_byte").As<v8::String>();
+ CHECK(one_byte->IsExternalOneByte());
+ CHECK(!one_byte->IsExternalTwoByte());
+ CHECK(!two_byte->IsExternalOneByte());
+ CHECK(two_byte->IsExternalTwoByte());
}
isolate->Dispose();
}
@@ -3180,7 +3239,7 @@ UNINITIALIZED_TEST(SnapshotCreatorTemplates) {
v8::External::New(isolate, &serialized_static_field);
v8::Local<v8::FunctionTemplate> callback =
v8::FunctionTemplate::New(isolate, SerializedCallback, external);
- global_template->Set(v8_str("f"), callback);
+ global_template->Set(isolate, "f", callback);
v8::Local<v8::Context> context =
v8::Context::New(isolate, no_extension, global_template);
creator.SetDefaultContext(context);
@@ -3337,6 +3396,12 @@ UNINITIALIZED_TEST(SnapshotCreatorAddData) {
DisableEmbeddedBlobRefcounting();
v8::StartupData blob;
+ // i::PerformCastCheck(Data*) should compile and be no-op
+ {
+ v8::Local<v8::Data> data;
+ i::PerformCastCheck(*data);
+ }
+
{
v8::SnapshotCreator creator;
v8::Isolate* isolate = creator.GetIsolate();
@@ -3577,7 +3642,7 @@ UNINITIALIZED_TEST(SnapshotCreatorIncludeGlobalProxy) {
v8::ObjectTemplate::New(isolate);
v8::Local<v8::FunctionTemplate> callback =
v8::FunctionTemplate::New(isolate, SerializedCallback);
- global_template->Set(v8_str("f"), callback);
+ global_template->Set(isolate, "f", callback);
global_template->SetHandler(v8::NamedPropertyHandlerConfiguration(
NamedPropertyGetterForSerialization));
v8::Local<v8::Context> context =
@@ -3604,7 +3669,7 @@ UNINITIALIZED_TEST(SnapshotCreatorIncludeGlobalProxy) {
v8::Local<v8::FunctionTemplate> callback =
v8::FunctionTemplate::New(isolate, SerializedCallback);
global_template->SetInternalFieldCount(3);
- global_template->Set(v8_str("f"), callback);
+ global_template->Set(isolate, "f", callback);
global_template->SetHandler(v8::NamedPropertyHandlerConfiguration(
NamedPropertyGetterForSerialization));
global_template->SetAccessor(v8_str("y"), AccessorForSerialization);
diff --git a/deps/v8/test/cctest/test-strings.cc b/deps/v8/test/cctest/test-strings.cc
index f48b1f6baf..d6ae62adfc 100644
--- a/deps/v8/test/cctest/test-strings.cc
+++ b/deps/v8/test/cctest/test-strings.cc
@@ -1749,6 +1749,7 @@ TEST(ExternalStringIndexOf) {
#define GC_INSIDE_NEW_STRING_FROM_UTF8_SUB_STRING(NAME, STRING) \
TEST(GCInsideNewStringFromUtf8SubStringWith##NAME) { \
+ FLAG_stress_concurrent_allocation = false; /* For SimulateFullSpace. */ \
CcTest::InitializeVM(); \
LocalContext context; \
v8::HandleScope scope(CcTest::isolate()); \
diff --git a/deps/v8/test/cctest/test-transitions.h b/deps/v8/test/cctest/test-transitions.h
index d30f8cf2b5..6db1c641e4 100644
--- a/deps/v8/test/cctest/test-transitions.h
+++ b/deps/v8/test/cctest/test-transitions.h
@@ -27,6 +27,8 @@ class TestTransitionsAccessor : public TransitionsAccessor {
}
int Capacity() { return TransitionsAccessor::Capacity(); }
+
+ TransitionArray transitions() { return TransitionsAccessor::transitions(); }
};
} // namespace internal
diff --git a/deps/v8/test/cctest/test-unwinder-code-pages.cc b/deps/v8/test/cctest/test-unwinder-code-pages.cc
index 7d9eef6f6b..fec8bc0163 100644
--- a/deps/v8/test/cctest/test-unwinder-code-pages.cc
+++ b/deps/v8/test/cctest/test-unwinder-code-pages.cc
@@ -17,6 +17,9 @@ namespace test_unwinder_code_pages {
static const void* fake_stack_base = nullptr;
+#define CHECK_EQ_STACK_REGISTER(stack_value, register_value) \
+ CHECK_EQ(reinterpret_cast<void*>(stack_value), register_value)
+
TEST(Unwind_BadState_Fail_CodePagesAPI) {
JSEntryStubs entry_stubs; // Fields are intialized to nullptr.
RegisterState register_state;
@@ -32,6 +35,7 @@ TEST(Unwind_BadState_Fail_CodePagesAPI) {
CHECK_NULL(register_state.pc);
}
+// Unwind a middle JS frame (i.e not the JSEntry one).
TEST(Unwind_BuiltinPCInMiddle_Success_CodePagesAPI) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
@@ -44,11 +48,16 @@ TEST(Unwind_BuiltinPCInMiddle_Success_CodePagesAPI) {
CHECK_LE(pages_length, arraysize(code_pages));
RegisterState register_state;
+ // {stack} here mocks the stack, where the top of the stack (i.e the lowest
+ // addresses) are represented by lower indices.
uintptr_t stack[3];
void* stack_base = stack + arraysize(stack);
- stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP (rbp).
+ // Index on the stack for the topmost fp (i.e the one right before the C++
+ // frame).
+ const int topmost_fp_index = 0;
+ stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP.
stack[1] = 202; // Return address into C++ code.
- stack[2] = 303; // The SP points here in the caller's frame.
+ stack[2] = reinterpret_cast<uintptr_t>(stack + 2); // saved SP.
register_state.sp = stack;
register_state.fp = stack;
@@ -63,9 +72,9 @@ TEST(Unwind_BuiltinPCInMiddle_Success_CodePagesAPI) {
bool unwound = v8::Unwinder::TryUnwindV8Frames(
entry_stubs, pages_length, code_pages, &register_state, stack_base);
CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(202), register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 1], register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 2], register_state.sp);
}
// The unwinder should be able to unwind even if we haven't properly set up the
@@ -98,9 +107,12 @@ TEST(Unwind_BuiltinPCAtStart_Success_CodePagesAPI) {
// Return address into JS code. It doesn't matter that this is not actually in
// JSEntry, because we only check that for the top frame.
stack[1] = reinterpret_cast<uintptr_t>(code + 10);
- stack[2] = reinterpret_cast<uintptr_t>(stack + 5); // saved FP (rbp).
+ // Index on the stack for the topmost fp (i.e the one right before the C++
+ // frame).
+ const int topmost_fp_index = 2;
+ stack[2] = reinterpret_cast<uintptr_t>(stack + 5); // saved FP.
stack[3] = 303; // Return address into C++ code.
- stack[4] = 404;
+ stack[4] = reinterpret_cast<uintptr_t>(stack + 4);
stack[5] = 505;
register_state.sp = stack;
@@ -115,9 +127,9 @@ TEST(Unwind_BuiltinPCAtStart_Success_CodePagesAPI) {
entry_stubs, pages_length, code_pages, &register_state, stack_base);
CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 5), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 4), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(303), register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 1], register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 2], register_state.sp);
}
const char* foo_source = R"(
@@ -160,9 +172,12 @@ TEST(Unwind_CodeObjectPCInMiddle_Success_CodePagesAPI) {
uintptr_t stack[3];
void* stack_base = stack + arraysize(stack);
- stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP (rbp).
+ // Index on the stack for the topmost fp (i.e the one right before the C++
+ // frame).
+ const int topmost_fp_index = 0;
+ stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP.
stack[1] = 202; // Return address into C++ code.
- stack[2] = 303; // The SP points here in the caller's frame.
+ stack[2] = reinterpret_cast<uintptr_t>(stack + 2); // saved SP.
register_state.sp = stack;
register_state.fp = stack;
@@ -200,9 +215,9 @@ TEST(Unwind_CodeObjectPCInMiddle_Success_CodePagesAPI) {
bool unwound = v8::Unwinder::TryUnwindV8Frames(
entry_stubs, pages_length, code_pages, &register_state, stack_base);
CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(202), register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 1], register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 2], register_state.sp);
}
// If the PC is within JSEntry but we haven't set up the frame yet, then we
@@ -232,36 +247,39 @@ TEST(Unwind_JSEntryBeforeFrame_Fail_CodePagesAPI) {
stack[2] = 121;
stack[3] = 131;
stack[4] = 141;
- stack[5] = 151;
+ stack[5] = 151; // Here's where the saved fp would be. We are not going to be
+ // unwinding so we do not need to set it up correctly.
stack[6] = 100; // Return address into C++ code.
- stack[7] = 303; // The SP points here in the caller's frame.
+ stack[7] = 303; // Here's where the saved SP would be.
stack[8] = 404;
stack[9] = 505;
- register_state.sp = stack + 5;
- register_state.fp = stack + 9;
+ register_state.sp = &stack[5];
+ register_state.fp = &stack[9];
// Put the current PC inside of JSEntry, before the frame is set up.
- register_state.pc = code + 12;
+ uintptr_t* jsentry_pc_value = code + 12;
+ register_state.pc = jsentry_pc_value;
bool unwound = v8::Unwinder::TryUnwindV8Frames(
entry_stubs, pages_length, code_pages, &register_state, stack_base);
CHECK(!unwound);
// The register state should not change when unwinding fails.
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 5), register_state.sp);
- CHECK_EQ(code + 12, register_state.pc);
+ CHECK_EQ_STACK_REGISTER(&stack[9], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(&stack[5], register_state.sp);
+ CHECK_EQ(jsentry_pc_value, register_state.pc);
// Change the PC to a few instructions later, after the frame is set up.
- register_state.pc = code + 16;
+ jsentry_pc_value = code + 16;
+ register_state.pc = jsentry_pc_value;
unwound = v8::Unwinder::TryUnwindV8Frames(
entry_stubs, pages_length, code_pages, &register_state, stack_base);
// TODO(petermarshall): More precisely check position within JSEntry rather
// than just assuming the frame is unreadable.
CHECK(!unwound);
// The register state should not change when unwinding fails.
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 5), register_state.sp);
- CHECK_EQ(code + 16, register_state.pc);
+ CHECK_EQ_STACK_REGISTER(&stack[9], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(&stack[5], register_state.sp);
+ CHECK_EQ(jsentry_pc_value, register_state.pc);
}
TEST(Unwind_OneJSFrame_Success_CodePagesAPI) {
@@ -288,9 +306,12 @@ TEST(Unwind_OneJSFrame_Success_CodePagesAPI) {
stack[2] = 121;
stack[3] = 131;
stack[4] = 141;
- stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP (rbp).
+ // Index on the stack for the topmost fp (i.e the one right before the C++
+ // frame).
+ const int topmost_fp_index = 5;
+ stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP.
stack[6] = 100; // Return address into C++ code.
- stack[7] = 303; // The SP points here in the caller's frame.
+ stack[7] = reinterpret_cast<uintptr_t>(stack + 7); // saved SP.
stack[8] = 404;
stack[9] = 505;
@@ -304,9 +325,9 @@ TEST(Unwind_OneJSFrame_Success_CodePagesAPI) {
entry_stubs, pages_length, code_pages, &register_state, stack_base);
CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 7), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(100), register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 1], register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 2], register_state.sp);
}
// Creates a fake stack with two JS frames on top of a C++ frame and checks that
@@ -333,13 +354,16 @@ TEST(Unwind_TwoJSFrames_Success_CodePagesAPI) {
void* stack_base = stack + arraysize(stack);
stack[0] = 101;
stack[1] = 111;
- stack[2] = reinterpret_cast<uintptr_t>(stack + 5); // saved FP (rbp).
+ stack[2] = reinterpret_cast<uintptr_t>(stack + 5); // saved FP.
// The fake return address is in the JS code range.
stack[3] = reinterpret_cast<uintptr_t>(code + 10);
stack[4] = 141;
- stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP (rbp).
+ // Index on the stack for the topmost fp (i.e the one right before the C++
+ // frame).
+ const int topmost_fp_index = 5;
+ stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP.
stack[6] = 100; // Return address into C++ code.
- stack[7] = 303; // The SP points here in the caller's frame.
+ stack[7] = reinterpret_cast<uintptr_t>(stack + 7); // saved SP.
stack[8] = 404;
stack[9] = 505;
@@ -353,9 +377,9 @@ TEST(Unwind_TwoJSFrames_Success_CodePagesAPI) {
entry_stubs, pages_length, code_pages, &register_state, stack_base);
CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 7), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(100), register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index], register_state.fp);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 1], register_state.pc);
+ CHECK_EQ_STACK_REGISTER(stack[topmost_fp_index + 2], register_state.sp);
}
// If the PC is in JSEntry then the frame might not be set up correctly, meaning
@@ -400,9 +424,9 @@ TEST(Unwind_StackBounds_Basic_CodePagesAPI) {
code_pages[0].length_in_bytes = code_length * sizeof(uintptr_t);
uintptr_t stack[3];
- stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP (rbp).
+ stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP.
stack[1] = 202; // Return address into C++ code.
- stack[2] = 303; // The SP points here in the caller's frame.
+ stack[2] = 303; // saved SP.
register_state.sp = stack;
register_state.fp = stack;
@@ -446,9 +470,9 @@ TEST(Unwind_StackBounds_WithUnwinding_CodePagesAPI) {
stack[2] = 121;
stack[3] = 131;
stack[4] = 141;
- stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP (rbp).
+ stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP.
stack[6] = reinterpret_cast<uintptr_t>(code + 20); // JS code.
- stack[7] = 303; // The SP points here in the caller's frame.
+ stack[7] = 303; // saved SP.
stack[8] = 404;
stack[9] = reinterpret_cast<uintptr_t>(stack) +
(12 * sizeof(uintptr_t)); // saved FP (OOB).
@@ -665,6 +689,8 @@ TEST(Unwind_TwoNestedFunctions_CodePagesAPI) {
UnwinderTestHelper helper(test_script);
}
#endif
+
+#undef CHECK_EQ_STACK_REGISTER
} // namespace test_unwinder_code_pages
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/test-unwinder.cc b/deps/v8/test/cctest/test-unwinder.cc
deleted file mode 100644
index ee70e6abb9..0000000000
--- a/deps/v8/test/cctest/test-unwinder.cc
+++ /dev/null
@@ -1,634 +0,0 @@
-// Copyright 2018 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "include/v8.h"
-
-#include "src/api/api-inl.h"
-#include "src/builtins/builtins.h"
-#include "src/execution/isolate.h"
-#include "src/execution/pointer-authentication.h"
-#include "src/heap/spaces.h"
-#include "src/objects/code-inl.h"
-#include "test/cctest/cctest.h"
-
-namespace v8 {
-namespace internal {
-namespace test_unwinder {
-
-static const void* fake_stack_base = nullptr;
-
-// Ignore deprecation warnings so that we can keep the tests for now.
-// TODO(petermarshall): Delete all the tests here when the old API is removed to
-// reduce the duplication.
-#if __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
-#endif
-
-TEST(Unwind_BadState_Fail) {
- UnwindState unwind_state; // Fields are intialized to nullptr.
- RegisterState register_state;
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- fake_stack_base);
- CHECK(!unwound);
- // The register state should not change when unwinding fails.
- CHECK_NULL(register_state.fp);
- CHECK_NULL(register_state.sp);
- CHECK_NULL(register_state.pc);
-}
-
-void StorePc(uintptr_t stack[], int index, uintptr_t pc) {
- Address sp = reinterpret_cast<Address>(&stack[index]) + kSystemPointerSize;
- stack[index] = PointerAuthentication::SignPCWithSP(pc, sp);
-}
-
-TEST(Unwind_BuiltinPCInMiddle_Success) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- uintptr_t stack[3];
- void* stack_base = stack + arraysize(stack);
- stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP (rbp).
- StorePc(stack, 1, 202); // Return address into C++ code.
- stack[2] = 303; // The SP points here in the caller's frame.
-
- register_state.sp = stack;
- register_state.fp = stack;
-
- // Put the current PC inside of a valid builtin.
- Code builtin = i_isolate->builtins()->builtin(Builtins::kStringEqual);
- const uintptr_t offset = 40;
- CHECK_LT(offset, builtin.InstructionSize());
- register_state.pc =
- reinterpret_cast<void*>(builtin.InstructionStart() + offset);
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
- CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(202), register_state.pc);
-}
-
-// The unwinder should be able to unwind even if we haven't properly set up the
-// current frame, as long as there is another JS frame underneath us (i.e. as
-// long as the PC isn't in JSEntry). This test puts the PC at the start
-// of a JS builtin and creates a fake JSEntry frame before it on the stack. The
-// unwinder should be able to unwind to the C++ frame before the JSEntry frame.
-TEST(Unwind_BuiltinPCAtStart_Success) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- const size_t code_length = 40;
- uintptr_t code[code_length] = {0};
- unwind_state.code_range.start = code;
- unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t);
-
- uintptr_t stack[6];
- void* stack_base = stack + arraysize(stack);
- stack[0] = 101;
- // Return address into JS code. It doesn't matter that this is not actually in
- // JSEntry, because we only check that for the top frame.
- StorePc(stack, 1, reinterpret_cast<uintptr_t>(code + 10));
- stack[2] = reinterpret_cast<uintptr_t>(stack + 5); // saved FP (rbp).
- StorePc(stack, 3, 303); // Return address into C++ code.
- stack[4] = 404;
- stack[5] = 505;
-
- register_state.sp = stack;
- register_state.fp = stack + 2; // FP to the JSEntry frame.
-
- // Put the current PC at the start of a valid builtin, so that we are setting
- // up the frame.
- Code builtin = i_isolate->builtins()->builtin(Builtins::kStringEqual);
- register_state.pc = reinterpret_cast<void*>(builtin.InstructionStart());
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
-
- CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 5), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 4), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(303), register_state.pc);
-}
-
-const char* foo_source = R"(
- function foo(a, b) {
- let x = a * b;
- let y = x ^ b;
- let z = y / a;
- return x + y - z;
- };
- %PrepareFunctionForOptimization(foo);
- foo(1, 2);
- foo(1, 2);
- %OptimizeFunctionOnNextCall(foo);
- foo(1, 2);
-)";
-
-// Check that we can unwind when the pc is within an optimized code object on
-// the V8 heap.
-TEST(Unwind_CodeObjectPCInMiddle_Success) {
- FLAG_allow_natives_syntax = true;
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
- HandleScope scope(i_isolate);
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- uintptr_t stack[3];
- void* stack_base = stack + arraysize(stack);
- stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP (rbp).
- StorePc(stack, 1, 202); // Return address into C++ code.
- stack[2] = 303; // The SP points here in the caller's frame.
-
- register_state.sp = stack;
- register_state.fp = stack;
-
- // Create an on-heap code object. Make sure we run the function so that it is
- // compiled and not just marked for lazy compilation.
- CompileRun(foo_source);
- v8::Local<v8::Function> local_foo = v8::Local<v8::Function>::Cast(
- env.local()->Global()->Get(env.local(), v8_str("foo")).ToLocalChecked());
- Handle<JSFunction> foo =
- Handle<JSFunction>::cast(v8::Utils::OpenHandle(*local_foo));
-
- // Put the current PC inside of the created code object.
- AbstractCode abstract_code = foo->abstract_code();
- // We don't produce optimized code when run with --no-opt.
- if (!abstract_code.IsCode() && FLAG_opt == false) return;
- CHECK(abstract_code.IsCode());
-
- Code code = abstract_code.GetCode();
- // We don't want the offset too early or it could be the `push rbp`
- // instruction (which is not at the start of generated code, because the lazy
- // deopt check happens before frame setup).
- const uintptr_t offset = code.InstructionSize() - 20;
- CHECK_LT(offset, code.InstructionSize());
- Address pc = code.InstructionStart() + offset;
- register_state.pc = reinterpret_cast<void*>(pc);
-
- // Check that the created code is within the code range that we get from the
- // API.
- Address start = reinterpret_cast<Address>(unwind_state.code_range.start);
- CHECK(pc >= start && pc < start + unwind_state.code_range.length_in_bytes);
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
- CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 2), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(202), register_state.pc);
-}
-
-// If the PC is within JSEntry but we haven't set up the frame yet, then we
-// cannot unwind.
-TEST(Unwind_JSEntryBeforeFrame_Fail) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- const size_t code_length = 40;
- uintptr_t code[code_length] = {0};
- unwind_state.code_range.start = code;
- unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t);
-
- // Pretend that it takes 5 instructions to set up the frame in JSEntry.
- unwind_state.js_entry_stub.code.start = code + 10;
- unwind_state.js_entry_stub.code.length_in_bytes = 10 * sizeof(uintptr_t);
-
- uintptr_t stack[10];
- void* stack_base = stack + arraysize(stack);
- stack[0] = 101;
- stack[1] = 111;
- stack[2] = 121;
- stack[3] = 131;
- stack[4] = 141;
- stack[5] = 151;
- StorePc(stack, 6, 100); // Return address into C++ code.
- stack[7] = 303; // The SP points here in the caller's frame.
- stack[8] = 404;
- stack[9] = 505;
-
- register_state.sp = stack + 5;
- register_state.fp = stack + 9;
-
- // Put the current PC inside of JSEntry, before the frame is set up.
- register_state.pc = code + 12;
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
- CHECK(!unwound);
- // The register state should not change when unwinding fails.
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 5), register_state.sp);
- CHECK_EQ(code + 12, register_state.pc);
-
- // Change the PC to a few instructions later, after the frame is set up.
- register_state.pc = code + 16;
- unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
- // TODO(petermarshall): More precisely check position within JSEntry rather
- // than just assuming the frame is unreadable.
- CHECK(!unwound);
- // The register state should not change when unwinding fails.
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 5), register_state.sp);
- CHECK_EQ(code + 16, register_state.pc);
-}
-
-TEST(Unwind_OneJSFrame_Success) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- // Use a fake code range so that we can initialize it to 0s.
- const size_t code_length = 40;
- uintptr_t code[code_length] = {0};
- unwind_state.code_range.start = code;
- unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t);
-
- // Our fake stack has two frames - one C++ frame and one JS frame (on top).
- // The stack grows from high addresses to low addresses.
- uintptr_t stack[10];
- void* stack_base = stack + arraysize(stack);
- stack[0] = 101;
- stack[1] = 111;
- stack[2] = 121;
- stack[3] = 131;
- stack[4] = 141;
- stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP (rbp).
- StorePc(stack, 6, 100); // Return address into C++ code.
- stack[7] = 303; // The SP points here in the caller's frame.
- stack[8] = 404;
- stack[9] = 505;
-
- register_state.sp = stack;
- register_state.fp = stack + 5;
-
- // Put the current PC inside of the code range so it looks valid.
- register_state.pc = code + 30;
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
-
- CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 7), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(100), register_state.pc);
-}
-
-// Creates a fake stack with two JS frames on top of a C++ frame and checks that
-// the unwinder correctly unwinds past the JS frames and returns the C++ frame's
-// details.
-TEST(Unwind_TwoJSFrames_Success) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- // Use a fake code range so that we can initialize it to 0s.
- const size_t code_length = 40;
- uintptr_t code[code_length] = {0};
- unwind_state.code_range.start = code;
- unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t);
-
- // Our fake stack has three frames - one C++ frame and two JS frames (on top).
- // The stack grows from high addresses to low addresses.
- uintptr_t stack[10];
- void* stack_base = stack + arraysize(stack);
- stack[0] = 101;
- stack[1] = 111;
- stack[2] = reinterpret_cast<uintptr_t>(stack + 5); // saved FP (rbp).
- // The fake return address is in the JS code range.
- StorePc(stack, 3, reinterpret_cast<uintptr_t>(code + 10));
- stack[4] = 141;
- stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP (rbp).
- StorePc(stack, 6, 100); // Return address into C++ code.
- stack[7] = 303; // The SP points here in the caller's frame.
- stack[8] = 404;
- stack[9] = 505;
-
- register_state.sp = stack;
- register_state.fp = stack + 2;
-
- // Put the current PC inside of the code range so it looks valid.
- register_state.pc = code + 30;
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
-
- CHECK(unwound);
- CHECK_EQ(reinterpret_cast<void*>(stack + 9), register_state.fp);
- CHECK_EQ(reinterpret_cast<void*>(stack + 7), register_state.sp);
- CHECK_EQ(reinterpret_cast<void*>(100), register_state.pc);
-}
-
-// If the PC is in JSEntry then the frame might not be set up correctly, meaning
-// we can't unwind the stack properly.
-TEST(Unwind_JSEntry_Fail) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- Code js_entry = i_isolate->heap()->builtin(Builtins::kJSEntry);
- byte* start = reinterpret_cast<byte*>(js_entry.InstructionStart());
- register_state.pc = start + 10;
-
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- fake_stack_base);
- CHECK(!unwound);
- // The register state should not change when unwinding fails.
- CHECK_NULL(register_state.fp);
- CHECK_NULL(register_state.sp);
- CHECK_EQ(start + 10, register_state.pc);
-}
-
-TEST(Unwind_StackBounds_Basic) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- const size_t code_length = 10;
- uintptr_t code[code_length] = {0};
- unwind_state.code_range.start = code;
- unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t);
-
- uintptr_t stack[3];
- stack[0] = reinterpret_cast<uintptr_t>(stack + 2); // saved FP (rbp).
- StorePc(stack, 1, 202); // Return address into C++ code.
- stack[2] = 303; // The SP points here in the caller's frame.
-
- register_state.sp = stack;
- register_state.fp = stack;
- register_state.pc = code;
-
- void* wrong_stack_base = reinterpret_cast<void*>(
- reinterpret_cast<uintptr_t>(stack) - sizeof(uintptr_t));
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- wrong_stack_base);
- CHECK(!unwound);
-
- // Correct the stack base and unwinding should succeed.
- void* correct_stack_base = stack + arraysize(stack);
- unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- correct_stack_base);
- CHECK(unwound);
-}
-
-TEST(Unwind_StackBounds_WithUnwinding) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
- RegisterState register_state;
-
- // Use a fake code range so that we can initialize it to 0s.
- const size_t code_length = 40;
- uintptr_t code[code_length] = {0};
- unwind_state.code_range.start = code;
- unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t);
-
- // Our fake stack has two frames - one C++ frame and one JS frame (on top).
- // The stack grows from high addresses to low addresses.
- uintptr_t stack[11];
- void* stack_base = stack + arraysize(stack);
- stack[0] = 101;
- stack[1] = 111;
- stack[2] = 121;
- stack[3] = 131;
- stack[4] = 141;
- stack[5] = reinterpret_cast<uintptr_t>(stack + 9); // saved FP (rbp).
- StorePc(stack, 6, reinterpret_cast<uintptr_t>(code + 20)); // JS code.
- stack[7] = 303; // The SP points here in the caller's frame.
- stack[8] = 404;
- stack[9] = reinterpret_cast<uintptr_t>(stack) +
- (12 * sizeof(uintptr_t)); // saved FP (OOB).
- StorePc(stack, 10, reinterpret_cast<uintptr_t>(code + 20)); // JS code.
-
- register_state.sp = stack;
- register_state.fp = stack + 5;
-
- // Put the current PC inside of the code range so it looks valid.
- register_state.pc = code + 30;
-
- // Unwind will fail because stack[9] FP points outside of the stack.
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
- CHECK(!unwound);
-
- // Change the return address so that it is not in range. We will not range
- // check the stack[9] FP value because we have finished unwinding and the
- // contents of rbp does not necessarily have to be the FP in this case.
- StorePc(stack, 10, 202);
- unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, &register_state,
- stack_base);
- CHECK(unwound);
-}
-
-TEST(PCIsInV8_BadState_Fail) {
- UnwindState unwind_state;
- void* pc = nullptr;
-
- CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc));
-}
-
-TEST(PCIsInV8_ValidStateNullPC_Fail) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
- void* pc = nullptr;
-
- CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc));
-}
-
-void TestRangeBoundaries(const UnwindState& unwind_state, byte* range_start,
- size_t range_length) {
- void* pc = range_start - 1;
- CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = range_start;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = range_start + 1;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = range_start + range_length - 1;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = range_start + range_length;
- CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = range_start + range_length + 1;
- CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc));
-}
-
-TEST(PCIsInV8_InCodeOrEmbeddedRange) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
-
- UnwindState unwind_state = isolate->GetUnwindState();
-
- byte* code_range_start = const_cast<byte*>(
- reinterpret_cast<const byte*>(unwind_state.code_range.start));
- size_t code_range_length = unwind_state.code_range.length_in_bytes;
- TestRangeBoundaries(unwind_state, code_range_start, code_range_length);
-
- byte* embedded_range_start = const_cast<byte*>(
- reinterpret_cast<const byte*>(unwind_state.embedded_code_range.start));
- size_t embedded_range_length =
- unwind_state.embedded_code_range.length_in_bytes;
- TestRangeBoundaries(unwind_state, embedded_range_start,
- embedded_range_length);
-}
-
-// PCIsInV8 doesn't check if the PC is in JSEntry directly. It's assumed that
-// the CodeRange or EmbeddedCodeRange contain JSEntry.
-TEST(PCIsInV8_InJSEntryRange) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
-
- UnwindState unwind_state = isolate->GetUnwindState();
-
- Code js_entry = i_isolate->heap()->builtin(Builtins::kJSEntry);
- byte* start = reinterpret_cast<byte*>(js_entry.InstructionStart());
- size_t length = js_entry.InstructionSize();
-
- void* pc = start;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = start + 1;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
- pc = start + length - 1;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
-}
-
-// Large code objects can be allocated in large object space. Check that this is
-// inside the CodeRange.
-TEST(PCIsInV8_LargeCodeObject) {
- FLAG_allow_natives_syntax = true;
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
- HandleScope scope(i_isolate);
-
- UnwindState unwind_state = isolate->GetUnwindState();
-
- // Create a big function that ends up in CODE_LO_SPACE.
- const int instruction_size = Page::kPageSize + 1;
- STATIC_ASSERT(instruction_size > kMaxRegularHeapObjectSize);
- std::unique_ptr<byte[]> instructions(new byte[instruction_size]);
-
- CodeDesc desc;
- desc.buffer = instructions.get();
- desc.buffer_size = instruction_size;
- desc.instr_size = instruction_size;
- desc.reloc_size = 0;
- desc.constant_pool_size = 0;
- desc.unwinding_info = nullptr;
- desc.unwinding_info_size = 0;
- desc.origin = nullptr;
- Handle<Code> foo_code =
- Factory::CodeBuilder(i_isolate, desc, CodeKind::WASM_FUNCTION).Build();
-
- CHECK(i_isolate->heap()->InSpace(*foo_code, CODE_LO_SPACE));
- byte* start = reinterpret_cast<byte*>(foo_code->InstructionStart());
-
- void* pc = start;
- CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc));
-}
-
-#ifdef USE_SIMULATOR
-// TODO(v8:10026): Make this also work without the simulator. The part that
-// needs modifications is getting the RegisterState.
-class UnwinderTestHelper {
- public:
- explicit UnwinderTestHelper(const std::string& test_function)
- : isolate_(CcTest::isolate()) {
- CHECK(!instance_);
- instance_ = this;
- v8::HandleScope scope(isolate_);
- v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate_);
- global->Set(v8_str("TryUnwind"),
- v8::FunctionTemplate::New(isolate_, TryUnwind));
- LocalContext env(isolate_, nullptr, global);
- CompileRun(v8_str(test_function.c_str()));
- }
-
- ~UnwinderTestHelper() { instance_ = nullptr; }
-
- private:
- static void TryUnwind(const v8::FunctionCallbackInfo<v8::Value>& args) {
- instance_->DoTryUnwind();
- }
-
- void DoTryUnwind() {
- // Set up RegisterState.
- v8::RegisterState register_state;
- SimulatorHelper simulator_helper;
- if (!simulator_helper.Init(isolate_)) return;
- simulator_helper.FillRegisters(&register_state);
- // At this point, the PC will point to a Redirection object, which is not
- // in V8 as far as the unwinder is concerned. To make this work, point to
- // the return address, which is in V8, instead.
- register_state.pc = register_state.lr;
-
- UnwindState unwind_state = isolate_->GetUnwindState();
- void* stack_base = reinterpret_cast<void*>(0xffffffffffffffffL);
- bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state,
- &register_state, stack_base);
- // Check that we have successfully unwound past js_entry_sp.
- CHECK(unwound);
- CHECK_GT(register_state.sp,
- reinterpret_cast<void*>(CcTest::i_isolate()->js_entry_sp()));
- }
-
- v8::Isolate* isolate_;
-
- static UnwinderTestHelper* instance_;
-};
-
-UnwinderTestHelper* UnwinderTestHelper::instance_;
-
-TEST(Unwind_TwoNestedFunctions) {
- i::FLAG_allow_natives_syntax = true;
- const char* test_script =
- "function test_unwinder_api_inner() {"
- " TryUnwind();"
- " return 0;"
- "}"
- "function test_unwinder_api_outer() {"
- " return test_unwinder_api_inner();"
- "}"
- "%NeverOptimizeFunction(test_unwinder_api_inner);"
- "%NeverOptimizeFunction(test_unwinder_api_outer);"
- "test_unwinder_api_outer();";
-
- UnwinderTestHelper helper(test_script);
-}
-#endif
-
-#if __clang__
-#pragma clang diagnostic pop
-#endif
-
-} // namespace test_unwinder
-} // namespace internal
-} // namespace v8
diff --git a/deps/v8/test/cctest/test-weakmaps.cc b/deps/v8/test/cctest/test-weakmaps.cc
index 5e166c9f5c..1288c4f49d 100644
--- a/deps/v8/test/cctest/test-weakmaps.cc
+++ b/deps/v8/test/cctest/test-weakmaps.cc
@@ -231,6 +231,7 @@ TEST(WeakMapScavenge) {
TEST(Regress2060a) {
if (i::FLAG_never_compact) return;
FLAG_always_compact = true;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
LocalContext context;
Isolate* isolate = GetIsolateFrom(&context);
Factory* factory = isolate->factory();
@@ -272,6 +273,7 @@ TEST(Regress2060b) {
#ifdef VERIFY_HEAP
FLAG_verify_heap = true;
#endif
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
LocalContext context;
Isolate* isolate = GetIsolateFrom(&context);
diff --git a/deps/v8/test/cctest/test-weaksets.cc b/deps/v8/test/cctest/test-weaksets.cc
index 1ab219205f..60dab5246c 100644
--- a/deps/v8/test/cctest/test-weaksets.cc
+++ b/deps/v8/test/cctest/test-weaksets.cc
@@ -165,6 +165,7 @@ TEST(WeakSet_Shrinking) {
TEST(WeakSet_Regress2060a) {
if (i::FLAG_never_compact) return;
FLAG_always_compact = true;
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
LocalContext context;
Isolate* isolate = GetIsolateFrom(&context);
Factory* factory = isolate->factory();
@@ -206,6 +207,7 @@ TEST(WeakSet_Regress2060b) {
#ifdef VERIFY_HEAP
FLAG_verify_heap = true;
#endif
+ FLAG_stress_concurrent_allocation = false; // For SimulateFullSpace.
LocalContext context;
Isolate* isolate = GetIsolateFrom(&context);
diff --git a/deps/v8/test/cctest/torque/test-torque.cc b/deps/v8/test/cctest/torque/test-torque.cc
index af45e58556..aa836289b5 100644
--- a/deps/v8/test/cctest/torque/test-torque.cc
+++ b/deps/v8/test/cctest/torque/test-torque.cc
@@ -19,7 +19,7 @@
#include "src/strings/char-predicates.h"
#include "test/cctest/compiler/code-assembler-tester.h"
#include "test/cctest/compiler/function-tester.h"
-#include "torque-generated/exported-class-definitions-tq-inl.h"
+#include "torque-generated/exported-class-definitions-inl.h"
namespace v8 {
namespace internal {
@@ -673,12 +673,12 @@ TEST(TestBitFieldStore) {
Isolate* isolate(CcTest::i_isolate());
i::HandleScope scope(isolate);
const int kNumParams = 1;
- CodeAssemblerTester asm_tester(isolate, kNumParams);
+ CodeAssemblerTester asm_tester(isolate, kNumParams + 1); // Include receiver.
TestTorqueAssembler m(asm_tester.state());
{
// Untag the parameters to get a plain integer value.
- TNode<Uint8T> val =
- m.UncheckedCast<Uint8T>(m.Unsigned(m.SmiToInt32(m.Parameter(0))));
+ TNode<Uint8T> val = m.UncheckedCast<Uint8T>(
+ m.Unsigned(m.SmiToInt32(m.CAST(m.Parameter(1)))));
m.TestBitFieldStore(val);
m.Return(m.UndefinedConstant());
diff --git a/deps/v8/test/cctest/wasm/test-c-wasm-entry.cc b/deps/v8/test/cctest/wasm/test-c-wasm-entry.cc
index 6940e14f4f..3ee0830001 100644
--- a/deps/v8/test/cctest/wasm/test-c-wasm-entry.cc
+++ b/deps/v8/test/cctest/wasm/test-c-wasm-entry.cc
@@ -39,7 +39,8 @@ class CWasmEntryArgTester {
std::vector<uint8_t> code{wasm_function_bytes};
runner_.Build(code.data(), code.data() + code.size());
wasm_code_ = runner_.builder().GetFunctionCode(0);
- c_wasm_entry_ = compiler::CompileCWasmEntry(isolate_, sig_);
+ c_wasm_entry_ = compiler::CompileCWasmEntry(
+ isolate_, sig_, wasm_code_->native_module()->module());
}
template <typename... Rest>
diff --git a/deps/v8/test/cctest/wasm/test-gc.cc b/deps/v8/test/cctest/wasm/test-gc.cc
index f0c8b3d8cf..8454e8bb35 100644
--- a/deps/v8/test/cctest/wasm/test-gc.cc
+++ b/deps/v8/test/cctest/wasm/test-gc.cc
@@ -101,11 +101,12 @@ class WasmGCTester {
void CallFunctionImpl(uint32_t function_index, const FunctionSig* sig,
CWasmArgumentsPacker* packer) {
WasmCodeRefScope scope;
- NativeModule* module = instance_->module_object().native_module();
- WasmCode* code = module->GetCode(function_index);
+ NativeModule* native_module = instance_->module_object().native_module();
+ WasmCode* code = native_module->GetCode(function_index);
Address wasm_call_target = code->instruction_start();
Handle<Object> object_ref = instance_;
- Handle<Code> c_wasm_entry = compiler::CompileCWasmEntry(isolate_, sig);
+ Handle<Code> c_wasm_entry =
+ compiler::CompileCWasmEntry(isolate_, sig, native_module->module());
Execution::CallWasm(isolate_, c_wasm_entry, wasm_call_target, object_ref,
packer->argv());
}
@@ -180,9 +181,12 @@ TEST(WasmBasicStruct) {
WasmGCTester tester;
const byte type_index =
tester.DefineStruct({F(kWasmI32, true), F(kWasmI32, true)});
- ValueType kRefTypes[] = {ref(type_index)};
+ const byte empty_struct_index = tester.DefineStruct({});
+ ValueType kRefType = ref(type_index);
+ ValueType kEmptyStructType = ref(empty_struct_index);
ValueType kOptRefType = optref(type_index);
- FunctionSig sig_q_v(1, 0, kRefTypes);
+ FunctionSig sig_q_v(1, 0, &kRefType);
+ FunctionSig sig_qe_v(1, 0, &kEmptyStructType);
// Test struct.new and struct.get.
const byte kGet1 = tester.DefineFunction(
@@ -209,6 +213,13 @@ TEST(WasmBasicStruct) {
WASM_RTT_CANON(type_index)),
kExprEnd});
+ // Test struct.new, returning reference to an empty struct.
+ const byte kGetEmptyStruct = tester.DefineFunction(
+ &sig_qe_v, {},
+ {WASM_STRUCT_NEW_WITH_RTT(empty_struct_index,
+ WASM_RTT_CANON(empty_struct_index)),
+ kExprEnd});
+
// Test struct.set, struct refs types in locals.
const byte j_local_index = 0;
const byte j_field_index = 0;
@@ -229,6 +240,9 @@ TEST(WasmBasicStruct) {
tester.CheckResult(kGet1, 42);
tester.CheckResult(kGet2, 64);
CHECK(tester.GetResultObject(kGetStruct).ToHandleChecked()->IsWasmStruct());
+ CHECK(tester.GetResultObject(kGetEmptyStruct)
+ .ToHandleChecked()
+ ->IsWasmStruct());
tester.CheckResult(kSet, -99);
}
@@ -318,7 +332,7 @@ TEST(BrOnCast) {
WASM_GET_GLOBAL(rtt_index))),
WASM_GET_LOCAL(1),
// The struct is not an i31, so this branch isn't taken.
- WASM_BR_ON_CAST(0, WASM_RTT_CANON(kLocalI31Ref)),
+ WASM_BR_ON_CAST(0, WASM_RTT_CANON(kI31RefCode)),
WASM_SET_LOCAL(0, WASM_I32V(222)), // Final result.
// This branch is taken.
WASM_BR_ON_CAST(0, WASM_GET_GLOBAL(rtt_index)),
@@ -337,7 +351,7 @@ TEST(BrOnCast) {
WASM_BR_ON_CAST(0, WASM_GET_GLOBAL(rtt_index)),
WASM_SET_LOCAL(0, WASM_I32V(222)), // Final result.
// This branch is taken.
- WASM_BR_ON_CAST(0, WASM_RTT_CANON(kLocalI31Ref)),
+ WASM_BR_ON_CAST(0, WASM_RTT_CANON(kI31RefCode)),
// Not executed due to the branch.
WASM_DROP, WASM_SET_LOCAL(0, WASM_I32V(333))),
WASM_GET_LOCAL(0), kExprEnd});
@@ -347,7 +361,7 @@ TEST(BrOnCast) {
{WASM_BLOCK(WASM_SET_LOCAL(0, WASM_I32V(111)),
WASM_GET_LOCAL(1), // Put a nullref onto the value stack.
// Neither of these branches is taken for nullref.
- WASM_BR_ON_CAST(0, WASM_RTT_CANON(kLocalI31Ref)),
+ WASM_BR_ON_CAST(0, WASM_RTT_CANON(kI31RefCode)),
WASM_SET_LOCAL(0, WASM_I32V(222)),
WASM_BR_ON_CAST(0, WASM_GET_GLOBAL(rtt_index)), WASM_DROP,
WASM_SET_LOCAL(0, WASM_I32V(333))), // Final result.
@@ -503,7 +517,7 @@ TEST(WasmLetInstruction) {
const byte kLetTest1 = tester.DefineFunction(
tester.sigs.i_v(), {},
{WASM_LET_1_I(
- WASM_SEQ(kLocalRef, type_index),
+ WASM_SEQ(kRefCode, type_index),
WASM_STRUCT_NEW_WITH_RTT(type_index, WASM_I32V(42), WASM_I32V(52),
WASM_RTT_CANON(type_index)),
WASM_STRUCT_GET(type_index, let_field_index,
@@ -514,8 +528,8 @@ TEST(WasmLetInstruction) {
const byte kLetTest2 = tester.DefineFunction(
tester.sigs.i_v(), {},
{WASM_LET_2_I(
- kLocalI32, WASM_I32_ADD(WASM_I32V(42), WASM_I32V(-32)),
- WASM_SEQ(kLocalRef, type_index),
+ kI32Code, WASM_I32_ADD(WASM_I32V(42), WASM_I32V(-32)),
+ WASM_SEQ(kRefCode, type_index),
WASM_STRUCT_NEW_WITH_RTT(type_index, WASM_I32V(42), WASM_I32V(52),
WASM_RTT_CANON(type_index)),
WASM_I32_MUL(WASM_STRUCT_GET(type_index, let_2_field_index,
@@ -527,7 +541,7 @@ TEST(WasmLetInstruction) {
tester.sigs.i_i(), {kWasmI32},
{WASM_SET_LOCAL(1, WASM_I32V(100)),
WASM_LET_2_I(
- kLocalI32, WASM_I32V(1), kLocalI32, WASM_I32V(10),
+ kI32Code, WASM_I32V(1), kI32Code, WASM_I32V(10),
WASM_I32_SUB(WASM_I32_ADD(WASM_GET_LOCAL(0), // 1st let-local
WASM_GET_LOCAL(2)), // Parameter
WASM_I32_ADD(WASM_GET_LOCAL(1), // 2nd let-local
@@ -539,7 +553,7 @@ TEST(WasmLetInstruction) {
const byte kLetTestErase = tester.DefineFunction(
tester.sigs.i_v(), {kWasmI32},
{WASM_SET_LOCAL(let_erase_local_index, WASM_I32V(0)),
- WASM_LET_1_V(kLocalI32, WASM_I32V(1), WASM_NOP),
+ WASM_LET_1_V(kI32Code, WASM_I32V(1), WASM_NOP),
WASM_GET_LOCAL(let_erase_local_index), kExprEnd});
// The result should be 0 and not 1, as local_get(0) refers to the original
// local.
@@ -728,15 +742,15 @@ TEST(BasicRTT) {
{WASM_RTT_SUB(subtype_index, WASM_RTT_CANON(type_index)), kExprEnd});
const byte kRttSubGeneric = tester.DefineFunction(
&sig_t3_v, {},
- {WASM_RTT_SUB(type_index, WASM_RTT_CANON(kLocalEqRef)), kExprEnd});
+ {WASM_RTT_SUB(type_index, WASM_RTT_CANON(kEqRefCode)), kExprEnd});
const byte kStructWithRtt = tester.DefineFunction(
&sig_q_v, {},
{WASM_STRUCT_NEW_WITH_RTT(type_index, WASM_I32V(42),
WASM_RTT_CANON(type_index)),
kExprEnd});
const int kFieldIndex = 1;
- const int kLocalStructIndex = 1; // Shifted in 'let' block.
- const int kLocalRttIndex = 0; // Let-bound, hence first local.
+ const int kStructIndexCode = 1; // Shifted in 'let' block.
+ const int kRttIndexCode = 0; // Let-bound, hence first local.
// This implements the following function:
// var local_struct: type0;
// let (local_rtt = rtt.sub(rtt.canon(type0), type1) in {
@@ -750,18 +764,18 @@ TEST(BasicRTT) {
{WASM_LET_1_I(
WASM_RTT(2, subtype_index),
WASM_RTT_SUB(subtype_index, WASM_RTT_CANON(type_index)),
- WASM_SET_LOCAL(kLocalStructIndex,
+ WASM_SET_LOCAL(kStructIndexCode,
WASM_STRUCT_NEW_WITH_RTT(
subtype_index, WASM_I32V(11), WASM_I32V(42),
- WASM_GET_LOCAL(kLocalRttIndex))),
+ WASM_GET_LOCAL(kRttIndexCode))),
WASM_I32_ADD(
WASM_REF_TEST(type_index, subtype_index,
- WASM_GET_LOCAL(kLocalStructIndex),
- WASM_GET_LOCAL(kLocalRttIndex)),
+ WASM_GET_LOCAL(kStructIndexCode),
+ WASM_GET_LOCAL(kRttIndexCode)),
WASM_STRUCT_GET(subtype_index, kFieldIndex,
WASM_REF_CAST(type_index, subtype_index,
- WASM_GET_LOCAL(kLocalStructIndex),
- WASM_GET_LOCAL(kLocalRttIndex)))),
+ WASM_GET_LOCAL(kStructIndexCode),
+ WASM_GET_LOCAL(kRttIndexCode)))),
kExprEnd)});
tester.CompileModule();
@@ -852,12 +866,12 @@ TEST(FunctionRefs) {
FunctionSig sig_rtt2(1, 0, &rtt2);
const byte rtt_sub = tester.DefineFunction(
&sig_rtt2, {},
- {WASM_RTT_SUB(sig_index, WASM_RTT_CANON(kLocalFuncRef)), kExprEnd});
+ {WASM_RTT_SUB(sig_index, WASM_RTT_CANON(kFuncRefCode)), kExprEnd});
const byte cast = tester.DefineFunction(
&sig_func, {kWasmFuncRef},
{WASM_SET_LOCAL(0, WASM_REF_FUNC(func_index)),
- WASM_REF_CAST(kLocalFuncRef, sig_index, WASM_GET_LOCAL(0),
+ WASM_REF_CAST(kFuncRefCode, sig_index, WASM_GET_LOCAL(0),
WASM_RTT_CANON(sig_index)),
kExprEnd});
@@ -867,7 +881,7 @@ TEST(FunctionRefs) {
const byte test = tester.DefineFunction(
tester.sigs.i_v(), {kWasmFuncRef},
{WASM_SET_LOCAL(0, WASM_REF_FUNC(func_index)),
- WASM_REF_TEST(kLocalFuncRef, other_sig_index, WASM_GET_LOCAL(0),
+ WASM_REF_TEST(kFuncRefCode, other_sig_index, WASM_GET_LOCAL(0),
WASM_RTT_CANON(other_sig_index)),
kExprEnd});
@@ -976,9 +990,9 @@ TEST(I31Casts) {
const byte kTestAndCastSuccess = tester.DefineFunction(
tester.sigs.i_v(), {kWasmEqRef},
{WASM_SET_LOCAL(0, WASM_I31_NEW(WASM_I32V(42))),
- WASM_I32_ADD(WASM_REF_TEST(kLocalEqRef, kLocalI31Ref, WASM_GET_LOCAL(0),
+ WASM_I32_ADD(WASM_REF_TEST(kEqRefCode, kI31RefCode, WASM_GET_LOCAL(0),
WASM_GET_GLOBAL(i31_rtt)),
- WASM_I31_GET_S(WASM_REF_CAST(kLocalEqRef, kLocalI31Ref,
+ WASM_I31_GET_S(WASM_REF_CAST(kEqRefCode, kI31RefCode,
WASM_GET_LOCAL(0),
WASM_GET_GLOBAL(i31_rtt)))),
kExprEnd});
@@ -987,11 +1001,11 @@ TEST(I31Casts) {
const byte kTestFalse = tester.DefineFunction(
tester.sigs.i_v(), {},
{WASM_I32_ADD(
- WASM_REF_TEST(kLocalEqRef, kLocalI31Ref,
+ WASM_REF_TEST(kEqRefCode, kI31RefCode,
WASM_STRUCT_NEW_WITH_RTT(struct_type, WASM_I32V(42),
WASM_GET_GLOBAL(struct_rtt)),
WASM_GET_GLOBAL(i31_rtt)),
- WASM_REF_TEST(kLocalEqRef, struct_type, WASM_I31_NEW(WASM_I32V(23)),
+ WASM_REF_TEST(kEqRefCode, struct_type, WASM_I31_NEW(WASM_I32V(23)),
WASM_GET_GLOBAL(struct_rtt))),
kExprEnd});
// Tries to cast an i31ref to a struct, which should trap.
@@ -1000,7 +1014,7 @@ TEST(I31Casts) {
{},
{WASM_STRUCT_GET(
struct_type, 0,
- WASM_REF_CAST(kLocalEqRef, struct_type, WASM_I31_NEW(WASM_I32V(42)),
+ WASM_REF_CAST(kEqRefCode, struct_type, WASM_I31_NEW(WASM_I32V(42)),
WASM_GET_GLOBAL(struct_rtt))),
kExprEnd});
// Tries to cast a struct to i31ref, which should trap.
@@ -1008,7 +1022,7 @@ TEST(I31Casts) {
tester.sigs.i_i(), // Argument and return value ignored
{},
{WASM_I31_GET_S(
- WASM_REF_CAST(kLocalEqRef, kLocalI31Ref,
+ WASM_REF_CAST(kEqRefCode, kI31RefCode,
WASM_STRUCT_NEW_WITH_RTT(struct_type, WASM_I32V(42),
WASM_GET_GLOBAL(struct_rtt)),
WASM_GET_GLOBAL(i31_rtt))),
@@ -1020,6 +1034,20 @@ TEST(I31Casts) {
tester.CheckHasThrown(kCastStructToI31, 0);
}
+TEST(GlobalInitReferencingGlobal) {
+ WasmGCTester tester;
+ const byte from = tester.AddGlobal(kWasmI32, false, WasmInitExpr(42));
+ const byte to =
+ tester.AddGlobal(kWasmI32, false, WasmInitExpr::GlobalGet(from));
+
+ const byte func = tester.DefineFunction(tester.sigs.i_v(), {},
+ {WASM_GET_GLOBAL(to), kExprEnd});
+
+ tester.CompileModule();
+
+ tester.CheckResult(func, 42);
+}
+
TEST(JsAccess) {
WasmGCTester tester;
const byte type_index = tester.DefineStruct({F(wasm::kWasmI32, true)});
@@ -1044,7 +1072,7 @@ TEST(JsAccess) {
tester.DefineExportedFunction(
"consumer", &sig_i_q,
{WASM_STRUCT_GET(type_index, 0,
- WASM_REF_CAST(kLocalEqRef, type_index, WASM_GET_LOCAL(0),
+ WASM_REF_CAST(kEqRefCode, type_index, WASM_GET_LOCAL(0),
WASM_RTT_CANON(type_index))),
kExprEnd});
@@ -1059,10 +1087,20 @@ TEST(JsAccess) {
isolate->clear_pending_exception();
maybe_result = tester.CallExportedFunction("producer", 0, nullptr);
+ if (maybe_result.is_null()) {
+ FATAL("Calling 'producer' failed: %s",
+ *v8::String::Utf8Value(reinterpret_cast<v8::Isolate*>(isolate),
+ try_catch.Message()->Get()));
+ }
{
Handle<Object> args[] = {maybe_result.ToHandleChecked()};
maybe_result = tester.CallExportedFunction("consumer", 1, args);
}
+ if (maybe_result.is_null()) {
+ FATAL("Calling 'consumer' failed: %s",
+ *v8::String::Utf8Value(reinterpret_cast<v8::Isolate*>(isolate),
+ try_catch.Message()->Get()));
+ }
Handle<Object> result = maybe_result.ToHandleChecked();
CHECK(result->IsSmi());
CHECK_EQ(42, Smi::cast(*result).value());
diff --git a/deps/v8/test/cctest/wasm/test-jump-table-assembler.cc b/deps/v8/test/cctest/wasm/test-jump-table-assembler.cc
index a0dd4cc33b..31662ee24d 100644
--- a/deps/v8/test/cctest/wasm/test-jump-table-assembler.cc
+++ b/deps/v8/test/cctest/wasm/test-jump-table-assembler.cc
@@ -42,12 +42,20 @@ constexpr size_t kThunkBufferSize = 4 * KB;
#endif
#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64
+// We need the branches (from CompileJumpTableThunk) to be within near-call
+// range of the jump table slots. The address hint to AllocateAssemblerBuffer
+// is not reliable enough to guarantee that we can always achieve this with
+// separate allocations, so we generate all code in a single
+// kMaxCodeMemory-sized chunk.
+constexpr size_t kAssemblerBufferSize = WasmCodeAllocator::kMaxCodeSpaceSize;
constexpr uint32_t kAvailableBufferSlots =
- (kMaxWasmCodeSpaceSize - kJumpTableSize) / kThunkBufferSize;
+ (WasmCodeAllocator::kMaxCodeSpaceSize - kJumpTableSize) / kThunkBufferSize;
constexpr uint32_t kBufferSlotStartOffset =
RoundUp<kThunkBufferSize>(kJumpTableSize);
#else
+constexpr size_t kAssemblerBufferSize = kJumpTableSize;
constexpr uint32_t kAvailableBufferSlots = 0;
+constexpr uint32_t kBufferSlotStartOffset = 0;
#endif
Address AllocateJumpTableThunk(
@@ -227,19 +235,9 @@ TEST(JumpTablePatchingStress) {
constexpr int kNumberOfRunnerThreads = 5;
constexpr int kNumberOfPatcherThreads = 3;
-#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64
- // We need the branches (from CompileJumpTableThunk) to be within near-call
- // range of the jump table slots. The address hint to AllocateAssemblerBuffer
- // is not reliable enough to guarantee that we can always achieve this with
- // separate allocations, so for Arm64 we generate all code in a single
- // kMaxMasmCodeMemory-sized chunk.
- STATIC_ASSERT(kMaxWasmCodeSpaceSize >= kJumpTableSize);
- auto buffer = AllocateAssemblerBuffer(kMaxWasmCodeSpaceSize);
+ STATIC_ASSERT(kAssemblerBufferSize >= kJumpTableSize);
+ auto buffer = AllocateAssemblerBuffer(kAssemblerBufferSize);
byte* thunk_slot_buffer = buffer->start() + kBufferSlotStartOffset;
-#else
- auto buffer = AllocateAssemblerBuffer(kJumpTableSize);
- byte* thunk_slot_buffer = nullptr;
-#endif
std::bitset<kAvailableBufferSlots> used_thunk_slots;
buffer->MakeWritableAndExecutable();
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc b/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc
index eb877da432..640aac53ae 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc
@@ -90,7 +90,7 @@ TEST(Run_WasmBlocksN) {
byte expected = static_cast<byte>(30 + nops);
memset(code, kExprNop, sizeof(code));
code[0] = kExprBlock;
- code[1] = kLocalI32;
+ code[1] = kI32Code;
code[2 + nops] = kExprI32Const;
code[2 + nops + 1] = expected;
code[2 + nops + 2] = kExprEnd;
@@ -111,7 +111,7 @@ TEST(Run_WasmBlockBreakN) {
for (int index = 0; index < nops; index++) {
memset(code, kExprNop, sizeof(code));
code[0] = kExprBlock;
- code[1] = kLocalI32;
+ code[1] = kI32Code;
code[sizeof(code) - 1] = kExprEnd;
int expected = run++;
@@ -347,7 +347,7 @@ TEST(MemoryGrowInvalidSize) {
TEST(ReferenceTypeLocals) {
{
WasmRunner<int32_t> r(TestExecutionTier::kInterpreter);
- BUILD(r, WASM_REF_IS_NULL(WASM_REF_NULL(kLocalExternRef)));
+ BUILD(r, WASM_REF_IS_NULL(WASM_REF_NULL(kExternRefCode)));
CHECK_EQ(1, r.Call());
}
{
@@ -360,7 +360,7 @@ TEST(ReferenceTypeLocals) {
WasmRunner<int32_t> r(TestExecutionTier::kInterpreter);
r.AllocateLocal(kWasmExternRef);
BUILD(r,
- WASM_REF_IS_NULL(WASM_TEE_LOCAL(0, WASM_REF_NULL(kLocalExternRef))));
+ WASM_REF_IS_NULL(WASM_TEE_LOCAL(0, WASM_REF_NULL(kExternRefCode))));
CHECK_EQ(1, r.Call());
}
}
@@ -486,6 +486,18 @@ TEST(Regress1111015) {
BUILD(r, WASM_BLOCK_I(WASM_RETURN_CALL_FUNCTION0(f.function_index()),
kExprDrop));
BUILD(f, WASM_I32V(0));
+}
+
+TEST(Regress1092130) {
+ WasmRunner<uint32_t> r(TestExecutionTier::kInterpreter);
+ TestSignatures sigs;
+ byte sig_v_i = r.builder().AddSignature(sigs.v_i());
+ BUILD(r, WASM_I32V(0),
+ WASM_IF_ELSE_I(
+ WASM_I32V(0),
+ WASM_SEQ(WASM_UNREACHABLE, WASM_BLOCK_X(sig_v_i, WASM_NOP)),
+ WASM_I32V(0)),
+ WASM_DROP);
r.Call();
}
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-module.cc b/deps/v8/test/cctest/wasm/test-run-wasm-module.cc
index 5dae2cd453..24d0164b41 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-module.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-module.cc
@@ -814,7 +814,7 @@ TEST(InitDataAtTheUpperLimit) {
kMemorySectionCode, // --
U32V_1(4), // section size
ENTRY_COUNT(1), // --
- kHasMaximumFlag, // --
+ kWithMaximum, // --
1, // initial size
2, // maximum size
kDataSectionCode, // --
@@ -850,7 +850,7 @@ TEST(EmptyMemoryNonEmptyDataSegment) {
kMemorySectionCode, // --
U32V_1(4), // section size
ENTRY_COUNT(1), // --
- kHasMaximumFlag, // --
+ kWithMaximum, // --
0, // initial size
0, // maximum size
kDataSectionCode, // --
@@ -884,7 +884,7 @@ TEST(EmptyMemoryEmptyDataSegment) {
kMemorySectionCode, // --
U32V_1(4), // section size
ENTRY_COUNT(1), // --
- kHasMaximumFlag, // --
+ kWithMaximum, // --
0, // initial size
0, // maximum size
kDataSectionCode, // --
@@ -919,7 +919,7 @@ TEST(MemoryWithOOBEmptyDataSegment) {
kMemorySectionCode, // --
U32V_1(4), // section size
ENTRY_COUNT(1), // --
- kHasMaximumFlag, // --
+ kWithMaximum, // --
1, // initial size
1, // maximum size
kDataSectionCode, // --
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-simd-liftoff.cc b/deps/v8/test/cctest/wasm/test-run-wasm-simd-liftoff.cc
index 1c00c404b9..7192ff2405 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-simd-liftoff.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-simd-liftoff.cc
@@ -108,7 +108,7 @@ WASM_SIMD_LIFTOFF_TEST(REGRESS_1088273) {
// A test to exercise logic in Liftoff's implementation of shuffle. The
// implementation in Liftoff is a bit more tricky due to shuffle requiring
// adjacent registers in ARM/ARM64.
-WASM_SIMD_LIFTOFF_TEST(S8x16Shuffle) {
+WASM_SIMD_LIFTOFF_TEST(I8x16Shuffle) {
WasmRunner<int32_t> r(TestExecutionTier::kLiftoff, kNoLowerSimd);
// Temps to use up registers and force non-adjacent registers for shuffle.
byte local0 = r.AllocateLocal(kWasmS128);
@@ -127,7 +127,7 @@ WASM_SIMD_LIFTOFF_TEST(S8x16Shuffle) {
// Output global holding a kWasmS128.
byte* output = r.builder().AddGlobal<byte>(kWasmS128);
- // s8x16_shuffle(lhs, rhs, pattern) will take the last element of rhs and
+ // i8x16_shuffle(lhs, rhs, pattern) will take the last element of rhs and
// place it into the last lane of lhs.
std::array<byte, 16> pattern = {
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 31}};
@@ -137,8 +137,8 @@ WASM_SIMD_LIFTOFF_TEST(S8x16Shuffle) {
WASM_SET_LOCAL(local1, WASM_GET_GLOBAL(0)), // local1 is in v1
WASM_GET_GLOBAL(0), // global0 is in v2
WASM_GET_LOCAL(local0), // local0 is in v0
- WASM_SET_GLOBAL(2, WASM_SIMD_S8x16_SHUFFLE_OP(
- kExprS8x16Shuffle, pattern, WASM_NOP, WASM_NOP)),
+ WASM_SET_GLOBAL(2, WASM_SIMD_I8x16_SHUFFLE_OP(
+ kExprI8x16Shuffle, pattern, WASM_NOP, WASM_NOP)),
WASM_ONE);
r.Call();
@@ -153,7 +153,7 @@ WASM_SIMD_LIFTOFF_TEST(S8x16Shuffle) {
// Exercise logic in Liftoff's implementation of shuffle when inputs to the
// shuffle are the same register.
-WASM_SIMD_LIFTOFF_TEST(S8x16Shuffle_SingleOperand) {
+WASM_SIMD_LIFTOFF_TEST(I8x16Shuffle_SingleOperand) {
WasmRunner<int32_t> r(TestExecutionTier::kLiftoff, kNoLowerSimd);
byte local0 = r.AllocateLocal(kWasmS128);
@@ -173,8 +173,8 @@ WASM_SIMD_LIFTOFF_TEST(S8x16Shuffle_SingleOperand) {
// Set up locals so shuffle is called with non-adjacent registers v2 and v0.
BUILD(r, WASM_SET_LOCAL(local0, WASM_GET_GLOBAL(0)), WASM_GET_LOCAL(local0),
WASM_GET_LOCAL(local0),
- WASM_SET_GLOBAL(1, WASM_SIMD_S8x16_SHUFFLE_OP(
- kExprS8x16Shuffle, pattern, WASM_NOP, WASM_NOP)),
+ WASM_SET_GLOBAL(1, WASM_SIMD_I8x16_SHUFFLE_OP(
+ kExprI8x16Shuffle, pattern, WASM_NOP, WASM_NOP)),
WASM_ONE);
r.Call();
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-simd-scalar-lowering.cc b/deps/v8/test/cctest/wasm/test-run-wasm-simd-scalar-lowering.cc
index 571658f6d1..013ca93a1b 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-simd-scalar-lowering.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-simd-scalar-lowering.cc
@@ -7,6 +7,7 @@
#include "test/cctest/cctest.h"
#include "test/cctest/wasm/wasm-run-utils.h"
#include "test/common/wasm/flag-utils.h"
+#include "test/common/wasm/test-signatures.h"
#include "test/common/wasm/wasm-macro-gen.h"
namespace v8 {
@@ -42,6 +43,236 @@ WASM_SIMD_TEST(I8x16ToF32x4) {
CHECK_EQ(expected, actual);
}
+WASM_SIMD_TEST(F64x2_Call_Return) {
+ // Check that calling a function with i16x8 arguments, and returns i16x8, is
+ // correctly lowered. The signature of the functions are always lowered to 4
+ // Word32, so each i16x8 needs to be correctly converted.
+ TestSignatures sigs;
+ WasmRunner<double, double, double> r(execution_tier, lower_simd);
+
+ WasmFunctionCompiler& fn = r.NewFunction(sigs.s_ss());
+ BUILD(fn,
+ WASM_SIMD_BINOP(kExprF64x2Min, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
+
+ byte c1[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ byte c2[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f};
+
+ BUILD(r,
+ WASM_SIMD_F64x2_EXTRACT_LANE(
+ 0, WASM_CALL_FUNCTION(fn.function_index(), WASM_SIMD_CONSTANT(c1),
+ WASM_SIMD_CONSTANT(c2))));
+ CHECK_EQ(0, r.Call(double{0}, bit_cast<double>(0x7fefffffffffffff)));
+}
+
+WASM_SIMD_TEST(F32x4_Call_Return) {
+ // Check that functions that return F32x4 are correctly lowered into 4 int32
+ // nodes. The signature of such functions are always lowered to 4 Word32, and
+ // if the last operation before the return was a f32x4, it will need to be
+ // bitcasted from float to int.
+ TestSignatures sigs;
+ WasmRunner<float, float> r(execution_tier, lower_simd);
+
+ // A simple function that just calls f32x4.neg on the param.
+ WasmFunctionCompiler& fn = r.NewFunction(sigs.s_s());
+ BUILD(fn, WASM_SIMD_UNOP(kExprF32x4Neg, WASM_GET_LOCAL(0)));
+
+ // TODO(v8:10507)
+ // Use i32x4 splat since scalar lowering has a problem with f32x4 as a param
+ // to a function call, the lowering is not correct yet.
+ BUILD(r,
+ WASM_SIMD_F32x4_EXTRACT_LANE(
+ 0, WASM_CALL_FUNCTION(fn.function_index(),
+ WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(0)))));
+ CHECK_EQ(-1.0, r.Call(1));
+}
+
+WASM_SIMD_TEST(I8x16_Call_Return) {
+ // Check that calling a function with i8x16 arguments, and returns i8x16, is
+ // correctly lowered. The signature of the functions are always lowered to 4
+ // Word32, so each i8x16 needs to be correctly converted.
+ TestSignatures sigs;
+ WasmRunner<uint32_t, uint32_t> r(execution_tier, lower_simd);
+
+ WasmFunctionCompiler& fn = r.NewFunction(sigs.s_ss());
+ BUILD(fn,
+ WASM_SIMD_BINOP(kExprI8x16Add, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
+
+ BUILD(r,
+ WASM_SIMD_I8x16_EXTRACT_LANE(
+ 0, WASM_CALL_FUNCTION(fn.function_index(),
+ WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(0)))));
+ CHECK_EQ(2, r.Call(1));
+}
+
+WASM_SIMD_TEST(I16x8_Call_Return) {
+ // Check that calling a function with i16x8 arguments, and returns i16x8, is
+ // correctly lowered. The signature of the functions are always lowered to 4
+ // Word32, so each i16x8 needs to be correctly converted.
+ TestSignatures sigs;
+ WasmRunner<uint32_t, uint32_t> r(execution_tier, lower_simd);
+
+ WasmFunctionCompiler& fn = r.NewFunction(sigs.s_ss());
+ BUILD(fn,
+ WASM_SIMD_BINOP(kExprI16x8Add, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
+
+ BUILD(r,
+ WASM_SIMD_I16x8_EXTRACT_LANE(
+ 0, WASM_CALL_FUNCTION(fn.function_index(),
+ WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(0)))));
+ CHECK_EQ(2, r.Call(1));
+}
+
+WASM_SIMD_TEST(I64x2_Call_Return) {
+ // Check that calling a function with i64x2 arguments, and returns i64x2, is
+ // correctly lowered. The signature of the functions are always lowered to 4
+ // Word32, so each i64x2 needs to be correctly converted.
+ TestSignatures sigs;
+ WasmRunner<uint64_t, uint64_t> r(execution_tier, lower_simd);
+
+ WasmFunctionCompiler& fn = r.NewFunction(sigs.s_ss());
+ BUILD(fn,
+ WASM_SIMD_BINOP(kExprI64x2Add, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
+
+ BUILD(r,
+ WASM_SIMD_I64x2_EXTRACT_LANE(
+ 0, WASM_CALL_FUNCTION(fn.function_index(),
+ WASM_SIMD_I64x2_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_I64x2_SPLAT(WASM_GET_LOCAL(0)))));
+ CHECK_EQ(2, r.Call(1));
+}
+
+WASM_SIMD_TEST(I8x16Eq_ToTest_S128Const) {
+ // Test implementation of S128Const in scalar lowering, this test case was
+ // causing a crash.
+ TestSignatures sigs;
+ WasmRunner<uint32_t> r(execution_tier, lower_simd);
+
+ byte c1[16] = {0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40};
+ byte c2[16] = {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02};
+ byte c3[16] = {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ BUILD(r,
+ WASM_SIMD_BINOP(kExprI8x16Eq, WASM_SIMD_CONSTANT(c1),
+ WASM_SIMD_CONSTANT(c2)),
+ WASM_SIMD_CONSTANT(c3), WASM_SIMD_OP(kExprI8x16Eq),
+ WASM_SIMD_OP(kExprI8x16ExtractLaneS), TO_BYTE(4));
+ CHECK_EQ(0xffffffff, r.Call());
+}
+
+WASM_SIMD_TEST(F32x4_S128Const) {
+ // Test that S128Const lowering is done correctly when it is used as an input
+ // into a f32x4 operation. This was triggering a CHECK failure in the
+ // register-allocator-verifier.
+ TestSignatures sigs;
+ WasmRunner<float> r(execution_tier, lower_simd);
+
+ // f32x4(1.0, 2.0, 3.0, 4.0)
+ byte c1[16] = {0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40,
+ 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40};
+ // f32x4(5.0, 6.0, 7.0, 8.0)
+ byte c2[16] = {0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40,
+ 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41};
+
+ BUILD(r,
+ WASM_SIMD_BINOP(kExprF32x4Min, WASM_SIMD_CONSTANT(c1),
+ WASM_SIMD_CONSTANT(c2)),
+ WASM_SIMD_OP(kExprF32x4ExtractLane), TO_BYTE(0));
+ CHECK_EQ(1.0, r.Call());
+}
+
+WASM_SIMD_TEST(AllTrue_DifferentShapes) {
+ // Test all_true lowring with splats of different shapes.
+ {
+ WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
+
+ BUILD(r, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_OP(kExprV8x16AllTrue));
+
+ CHECK_EQ(0, r.Call(0x00FF00FF));
+ }
+
+ {
+ WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
+
+ BUILD(r, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_OP(kExprV16x8AllTrue));
+
+ CHECK_EQ(0, r.Call(0x000000FF));
+ }
+
+ // Check float input to all_true.
+ {
+ WasmRunner<int32_t, float> r(execution_tier, lower_simd);
+
+ BUILD(r, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_OP(kExprV16x8AllTrue));
+
+ CHECK_EQ(1, r.Call(0x000F000F));
+ }
+}
+
+WASM_SIMD_TEST(AnyTrue_DifferentShapes) {
+ // Test any_true lowring with splats of different shapes.
+ {
+ WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
+
+ BUILD(r, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_OP(kExprV8x16AnyTrue));
+
+ CHECK_EQ(0, r.Call(0x00000000));
+ }
+
+ {
+ WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
+
+ BUILD(r, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_OP(kExprV16x8AnyTrue));
+
+ CHECK_EQ(1, r.Call(0x000000FF));
+ }
+
+ // Check float input to any_true.
+ {
+ WasmRunner<int32_t, float> r(execution_tier, lower_simd);
+
+ BUILD(r, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(0)),
+ WASM_SIMD_OP(kExprV8x16AnyTrue));
+
+ CHECK_EQ(0, r.Call(0x00000000));
+ }
+}
+
+WASM_SIMD_TEST(V128_I64_PARAMS) {
+ // This test exercises interaction between simd and int64 lowering. The
+ // parameter indices were not correctly lowered because simd lowered a v128 in
+ // the function signature into 4 word32, and int64 was still treating it as 1
+ // parameter.
+ WasmRunner<uint64_t, uint64_t> r(execution_tier, lower_simd);
+
+ FunctionSig::Builder builder(r.zone(), 1, 2);
+ builder.AddParam(kWasmS128);
+ builder.AddParam(kWasmI64);
+ builder.AddReturn(kWasmS128);
+ FunctionSig* sig = builder.Build();
+ WasmFunctionCompiler& fn = r.NewFunction(sig);
+
+ // Build a function that has both V128 and I64 arguments.
+ BUILD(fn,
+ WASM_SIMD_I64x2_REPLACE_LANE(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
+
+ BUILD(r, WASM_SIMD_I64x2_EXTRACT_LANE(
+ 0, WASM_SIMD_I64x2_SPLAT(WASM_GET_LOCAL(0))));
+
+ CHECK_EQ(0, r.Call(0));
+}
+
} // namespace test_run_wasm_simd
} // namespace wasm
} // namespace internal
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-simd.cc b/deps/v8/test/cctest/wasm/test-run-wasm-simd.cc
index c22c402184..8fdcabf44e 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-simd.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-simd.cc
@@ -604,8 +604,9 @@ void CheckFloatResult(float x, float y, float expected, float actual,
static constexpr uint32_t nan_test_array[] = {
// Bit patterns of quiet NaNs and signaling NaNs, with or without
// additional payload.
- 0x7FC00000, 0xFFC00000, 0x7FFFFFFF, 0x7F800000, 0xFF800000, 0x7F876543,
- 0xFF876543,
+ 0x7FC00000, 0xFFC00000, 0x7FFFFFFF, 0xFFFFFFFF, 0x7F876543, 0xFF876543,
+ // NaN with top payload bit unset.
+ 0x7FA00000,
// Both Infinities.
0x7F800000, 0xFF800000,
// Some "normal" numbers, 1 and -1.
@@ -679,33 +680,22 @@ WASM_SIMD_TEST(F32x4RecipSqrtApprox) {
base::RecipSqrt, false /* !exact */);
}
-// TODO(v8:10553) Prototyping floating-point rounding instructions.
-#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X || \
- V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || \
- V8_TARGET_ARCH_MIPS64
WASM_SIMD_TEST_NO_LOWERING(F32x4Ceil) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF32x4UnOpTest(execution_tier, lower_simd, kExprF32x4Ceil, ceilf, true);
}
WASM_SIMD_TEST_NO_LOWERING(F32x4Floor) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF32x4UnOpTest(execution_tier, lower_simd, kExprF32x4Floor, floorf, true);
}
WASM_SIMD_TEST_NO_LOWERING(F32x4Trunc) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF32x4UnOpTest(execution_tier, lower_simd, kExprF32x4Trunc, truncf, true);
}
WASM_SIMD_TEST_NO_LOWERING(F32x4NearestInt) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF32x4UnOpTest(execution_tier, lower_simd, kExprF32x4NearestInt, nearbyintf,
true);
}
-#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X ||
- // V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS ||
- // V8_TARGET_ARCH_MIPS64
void RunF32x4BinOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
WasmOpcode opcode, FloatBinOp expected_op) {
@@ -774,22 +764,13 @@ WASM_SIMD_TEST(F32x4Max) {
RunF32x4BinOpTest(execution_tier, lower_simd, kExprF32x4Max, JSMax);
}
-// TODO(v8:10501) Prototyping pmin and pmax instructions.
-#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
- V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_MIPS || \
- V8_TARGET_ARCH_MIPS64
WASM_SIMD_TEST_NO_LOWERING(F32x4Pmin) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF32x4BinOpTest(execution_tier, lower_simd, kExprF32x4Pmin, Minimum);
}
WASM_SIMD_TEST_NO_LOWERING(F32x4Pmax) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF32x4BinOpTest(execution_tier, lower_simd, kExprF32x4Pmax, Maximum);
}
-#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 ||
- // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_MIPS ||
- // V8_TARGET_ARCH_MIPS64
void RunF32x4CompareOpTest(TestExecutionTier execution_tier,
LowerSimd lower_simd, WasmOpcode opcode,
@@ -898,7 +879,7 @@ WASM_SIMD_TEST_NO_LOWERING(F32x4Qfms) {
}
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
-WASM_SIMD_TEST_NO_LOWERING(I64x2Splat) {
+WASM_SIMD_TEST(I64x2Splat) {
WasmRunner<int32_t, int64_t> r(execution_tier, lower_simd);
// Set up a global to hold output vector.
int64_t* g = r.builder().AddGlobal<int64_t>(kWasmS128);
@@ -916,7 +897,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Splat) {
}
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2ExtractLane) {
+WASM_SIMD_TEST(I64x2ExtractLane) {
WasmRunner<int64_t> r(execution_tier, lower_simd);
r.AllocateLocal(kWasmI64);
r.AllocateLocal(kWasmS128);
@@ -929,7 +910,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2ExtractLane) {
CHECK_EQ(0xFFFFFFFFFF, r.Call());
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2ReplaceLane) {
+WASM_SIMD_TEST(I64x2ReplaceLane) {
WasmRunner<int32_t> r(execution_tier, lower_simd);
// Set up a global to hold input/output vector.
int64_t* g = r.builder().AddGlobal<int64_t>(kWasmS128);
@@ -969,7 +950,7 @@ void RunI64x2UnOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
}
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Neg) {
+WASM_SIMD_TEST(I64x2Neg) {
RunI64x2UnOpTest(execution_tier, lower_simd, kExprI64x2Neg,
base::NegateWithWraparound);
}
@@ -1006,17 +987,17 @@ void RunI64x2ShiftOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
}
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Shl) {
+WASM_SIMD_TEST(I64x2Shl) {
RunI64x2ShiftOpTest(execution_tier, lower_simd, kExprI64x2Shl,
LogicalShiftLeft);
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2ShrS) {
+WASM_SIMD_TEST(I64x2ShrS) {
RunI64x2ShiftOpTest(execution_tier, lower_simd, kExprI64x2ShrS,
ArithmeticShiftRight);
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2ShrU) {
+WASM_SIMD_TEST(I64x2ShrU) {
RunI64x2ShiftOpTest(execution_tier, lower_simd, kExprI64x2ShrU,
LogicalShiftRight);
}
@@ -1048,12 +1029,12 @@ void RunI64x2BinOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
}
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Add) {
+WASM_SIMD_TEST(I64x2Add) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2Add,
base::AddWithWraparound);
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Sub) {
+WASM_SIMD_TEST(I64x2Sub) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2Sub,
base::SubWithWraparound);
}
@@ -1102,7 +1083,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2GeU) {
}
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
-WASM_SIMD_TEST_NO_LOWERING(F64x2Splat) {
+WASM_SIMD_TEST(F64x2Splat) {
WasmRunner<int32_t, double> r(execution_tier, lower_simd);
// Set up a global to hold output vector.
double* g = r.builder().AddGlobal<double>(kWasmS128);
@@ -1124,7 +1105,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2Splat) {
}
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2ExtractLane) {
+WASM_SIMD_TEST(F64x2ExtractLane) {
WasmRunner<double, double> r(execution_tier, lower_simd);
byte param1 = 0;
byte temp1 = r.AllocateLocal(kWasmF64);
@@ -1146,7 +1127,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2ExtractLane) {
}
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2ReplaceLane) {
+WASM_SIMD_TEST(F64x2ReplaceLane) {
WasmRunner<int32_t> r(execution_tier, lower_simd);
// Set up globals to hold input/output vector.
double* g0 = r.builder().AddGlobal<double>(kWasmS128);
@@ -1169,9 +1150,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2ReplaceLane) {
CHECK_EQ(1., ReadLittleEndianValue<double>(&g1[1]));
}
-#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X || \
- V8_TARGET_ARCH_MIPS64
-WASM_SIMD_TEST_NO_LOWERING(F64x2ExtractLaneWithI64x2) {
+WASM_SIMD_TEST(F64x2ExtractLaneWithI64x2) {
WasmRunner<int64_t> r(execution_tier, lower_simd);
BUILD(r, WASM_IF_ELSE_L(
WASM_F64_EQ(WASM_SIMD_F64x2_EXTRACT_LANE(
@@ -1181,7 +1160,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2ExtractLaneWithI64x2) {
CHECK_EQ(1, r.Call());
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2ExtractWithF64x2) {
+WASM_SIMD_TEST(I64x2ExtractWithF64x2) {
WasmRunner<int64_t> r(execution_tier, lower_simd);
BUILD(r, WASM_IF_ELSE_L(
WASM_I64_EQ(WASM_SIMD_I64x2_EXTRACT_LANE(
@@ -1190,8 +1169,6 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2ExtractWithF64x2) {
WASM_I64V(1), WASM_I64V(0)));
CHECK_EQ(1, r.Call());
}
-#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X ||
- // V8_TARGET_ARCH_MIPS64
bool IsExtreme(double x) {
double abs_x = std::fabs(x);
@@ -1307,43 +1284,34 @@ void RunF64x2UnOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
}
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Abs) {
+WASM_SIMD_TEST(F64x2Abs) {
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Abs, std::abs);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Neg) {
+WASM_SIMD_TEST(F64x2Neg) {
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Neg, Negate);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Sqrt) {
+WASM_SIMD_TEST(F64x2Sqrt) {
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Sqrt, Sqrt);
}
-// TODO(v8:10553) Prototyping floating-point rounding instructions.
-#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X || \
- V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS64
WASM_SIMD_TEST_NO_LOWERING(F64x2Ceil) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Ceil, ceil, true);
}
WASM_SIMD_TEST_NO_LOWERING(F64x2Floor) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Floor, floor, true);
}
WASM_SIMD_TEST_NO_LOWERING(F64x2Trunc) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Trunc, trunc, true);
}
WASM_SIMD_TEST_NO_LOWERING(F64x2NearestInt) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2NearestInt, nearbyint,
true);
}
-#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X ||
- // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS64
void RunF64x2BinOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
WasmOpcode opcode, DoubleBinOp expected_op) {
@@ -1392,38 +1360,29 @@ void RunF64x2BinOpTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
#undef FOR_FLOAT64_NAN_INPUTS
-WASM_SIMD_TEST_NO_LOWERING(F64x2Add) {
+WASM_SIMD_TEST(F64x2Add) {
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Add, Add);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Sub) {
+WASM_SIMD_TEST(F64x2Sub) {
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Sub, Sub);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Mul) {
+WASM_SIMD_TEST(F64x2Mul) {
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Mul, Mul);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Div) {
+WASM_SIMD_TEST(F64x2Div) {
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Div, Div);
}
-// TODO(v8:10501) Prototyping pmin and pmax instructions.
-#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
- V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_MIPS || \
- V8_TARGET_ARCH_MIPS64
WASM_SIMD_TEST_NO_LOWERING(F64x2Pmin) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Pmin, Minimum);
}
WASM_SIMD_TEST_NO_LOWERING(F64x2Pmax) {
- FLAG_SCOPE(wasm_simd_post_mvp);
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Pmax, Maximum);
}
-#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 ||
- // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_MIPS ||
- // V8_TARGET_ARCH_MIPS64
void RunF64x2CompareOpTest(TestExecutionTier execution_tier,
LowerSimd lower_simd, WasmOpcode opcode,
@@ -1461,39 +1420,39 @@ void RunF64x2CompareOpTest(TestExecutionTier execution_tier,
}
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Eq) {
+WASM_SIMD_TEST(F64x2Eq) {
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Eq, Equal);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Ne) {
+WASM_SIMD_TEST(F64x2Ne) {
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Ne, NotEqual);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Gt) {
+WASM_SIMD_TEST(F64x2Gt) {
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Gt, Greater);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Ge) {
+WASM_SIMD_TEST(F64x2Ge) {
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Ge, GreaterEqual);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Lt) {
+WASM_SIMD_TEST(F64x2Lt) {
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Lt, Less);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Le) {
+WASM_SIMD_TEST(F64x2Le) {
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Le, LessEqual);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Min) {
+WASM_SIMD_TEST(F64x2Min) {
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Min, JSMin);
}
-WASM_SIMD_TEST_NO_LOWERING(F64x2Max) {
+WASM_SIMD_TEST(F64x2Max) {
RunF64x2BinOpTest(execution_tier, lower_simd, kExprF64x2Max, JSMax);
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Mul) {
+WASM_SIMD_TEST(I64x2Mul) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2Mul,
base::MulWithWraparound);
}
@@ -1670,10 +1629,7 @@ WASM_SIMD_TEST(I16x8ReplaceLane) {
}
}
-#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_IA32 || \
- V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
WASM_SIMD_TEST(I8x16BitMask) {
- FLAG_SCOPE(wasm_simd_post_mvp);
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
byte value1 = r.AllocateLocal(kWasmS128);
@@ -1693,7 +1649,6 @@ WASM_SIMD_TEST(I8x16BitMask) {
}
WASM_SIMD_TEST(I16x8BitMask) {
- FLAG_SCOPE(wasm_simd_post_mvp);
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
byte value1 = r.AllocateLocal(kWasmS128);
@@ -1713,7 +1668,6 @@ WASM_SIMD_TEST(I16x8BitMask) {
}
WASM_SIMD_TEST(I32x4BitMask) {
- FLAG_SCOPE(wasm_simd_post_mvp);
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
byte value1 = r.AllocateLocal(kWasmS128);
@@ -1731,8 +1685,6 @@ WASM_SIMD_TEST(I32x4BitMask) {
CHECK_EQ(actual, expected);
}
}
-#endif // V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_IA32 ||
- // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
WASM_SIMD_TEST(I8x16Splat) {
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
@@ -2713,9 +2665,9 @@ void RunBinaryLaneOpTest(
WriteLittleEndianValue<T>(&src0[i], i);
WriteLittleEndianValue<T>(&src1[i], kElems + i);
}
- if (simd_op == kExprS8x16Shuffle) {
+ if (simd_op == kExprI8x16Shuffle) {
BUILD(r,
- WASM_SET_GLOBAL(0, WASM_SIMD_S8x16_SHUFFLE_OP(simd_op, expected,
+ WASM_SET_GLOBAL(0, WASM_SIMD_I8x16_SHUFFLE_OP(simd_op, expected,
WASM_GET_GLOBAL(0),
WASM_GET_GLOBAL(1))),
WASM_ONE);
@@ -2887,7 +2839,7 @@ ShuffleMap test_shuffles = {
WASM_SIMD_TEST(Name) { \
ShuffleMap::const_iterator it = test_shuffles.find(k##Name); \
DCHECK_NE(it, test_shuffles.end()); \
- RunShuffleOpTest(execution_tier, lower_simd, kExprS8x16Shuffle, \
+ RunShuffleOpTest(execution_tier, lower_simd, kExprI8x16Shuffle, \
it->second); \
}
SHUFFLE_LIST(SHUFFLE_TEST)
@@ -2900,7 +2852,7 @@ WASM_SIMD_TEST(S8x16Blend) {
for (int bias = 1; bias < kSimd128Size; bias++) {
for (int i = 0; i < bias; i++) expected[i] = i;
for (int i = bias; i < kSimd128Size; i++) expected[i] = i + kSimd128Size;
- RunShuffleOpTest(execution_tier, lower_simd, kExprS8x16Shuffle, expected);
+ RunShuffleOpTest(execution_tier, lower_simd, kExprI8x16Shuffle, expected);
}
}
@@ -2918,7 +2870,7 @@ WASM_SIMD_TEST(S8x16Concat) {
for (int j = 0; j < n; ++j) {
expected[i++] = j + kSimd128Size;
}
- RunShuffleOpTest(execution_tier, lower_simd, kExprS8x16Shuffle, expected);
+ RunShuffleOpTest(execution_tier, lower_simd, kExprI8x16Shuffle, expected);
}
}
@@ -2946,7 +2898,7 @@ static constexpr SwizzleTestArgs swizzle_test_args[] = {
static constexpr Vector<const SwizzleTestArgs> swizzle_test_vector =
ArrayVector(swizzle_test_args);
-WASM_SIMD_TEST(S8x16Swizzle) {
+WASM_SIMD_TEST(I8x16Swizzle) {
// RunBinaryLaneOpTest set up the two globals to be consecutive integers,
// [0-15] and [16-31]. Using [0-15] as the indices will not sufficiently test
// swizzle since the expected result is a no-op, using [16-31] will result in
@@ -2958,7 +2910,7 @@ WASM_SIMD_TEST(S8x16Swizzle) {
uint8_t* src1 = r.builder().AddGlobal<uint8_t>(kWasmS128);
BUILD(
r,
- WASM_SET_GLOBAL(0, WASM_SIMD_BINOP(kExprS8x16Swizzle, WASM_GET_GLOBAL(1),
+ WASM_SET_GLOBAL(0, WASM_SIMD_BINOP(kExprI8x16Swizzle, WASM_GET_GLOBAL(1),
WASM_GET_GLOBAL(2))),
WASM_ONE);
@@ -2993,18 +2945,18 @@ const Shuffle& GetRandomTestShuffle(v8::base::RandomNumberGenerator* rng) {
// Test shuffles that are random combinations of 3 test shuffles. Completely
// random shuffles almost always generate the slow general shuffle code, so
// don't exercise as many code paths.
-WASM_SIMD_TEST(S8x16ShuffleFuzz) {
+WASM_SIMD_TEST(I8x16ShuffleFuzz) {
v8::base::RandomNumberGenerator* rng = CcTest::random_number_generator();
static const int kTests = 100;
for (int i = 0; i < kTests; ++i) {
auto shuffle = Combine(GetRandomTestShuffle(rng), GetRandomTestShuffle(rng),
GetRandomTestShuffle(rng));
- RunShuffleOpTest(execution_tier, lower_simd, kExprS8x16Shuffle, shuffle);
+ RunShuffleOpTest(execution_tier, lower_simd, kExprI8x16Shuffle, shuffle);
}
}
void AppendShuffle(const Shuffle& shuffle, std::vector<byte>* buffer) {
- byte opcode[] = {WASM_SIMD_OP(kExprS8x16Shuffle)};
+ byte opcode[] = {WASM_SIMD_OP(kExprI8x16Shuffle)};
for (size_t i = 0; i < arraysize(opcode); ++i) buffer->push_back(opcode[i]);
for (size_t i = 0; i < kSimd128Size; ++i) buffer->push_back((shuffle[i]));
}
@@ -3459,7 +3411,7 @@ WASM_SIMD_TEST(SimdLoadStoreLoadMemargOffset) {
// Test a multi-byte opcode with offset values that encode into valid opcodes.
// This is to exercise decoding logic and make sure we get the lengths right.
-WASM_SIMD_TEST(S8x16LoadSplatOffset) {
+WASM_SIMD_TEST(S128Load8SplatOffset) {
// This offset is [82, 22] when encoded, which contains valid opcodes.
constexpr int offset = 4354;
WasmRunner<int32_t> r(execution_tier, lower_simd);
@@ -3467,7 +3419,7 @@ WASM_SIMD_TEST(S8x16LoadSplatOffset) {
int8_t* global = r.builder().AddGlobal<int8_t>(kWasmS128);
BUILD(r,
WASM_SET_GLOBAL(
- 0, WASM_SIMD_LOAD_OP_OFFSET(kExprS8x16LoadSplat, WASM_I32V(0),
+ 0, WASM_SIMD_LOAD_OP_OFFSET(kExprS128Load8Splat, WASM_I32V(0),
U32V_2(offset))),
WASM_ONE);
@@ -3517,20 +3469,20 @@ void RunLoadSplatTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
}
}
-WASM_SIMD_TEST(S8x16LoadSplat) {
- RunLoadSplatTest<int8_t>(execution_tier, lower_simd, kExprS8x16LoadSplat);
+WASM_SIMD_TEST(S128Load8Splat) {
+ RunLoadSplatTest<int8_t>(execution_tier, lower_simd, kExprS128Load8Splat);
}
-WASM_SIMD_TEST(S16x8LoadSplat) {
- RunLoadSplatTest<int16_t>(execution_tier, lower_simd, kExprS16x8LoadSplat);
+WASM_SIMD_TEST(S128Load16Splat) {
+ RunLoadSplatTest<int16_t>(execution_tier, lower_simd, kExprS128Load16Splat);
}
-WASM_SIMD_TEST(S32x4LoadSplat) {
- RunLoadSplatTest<int32_t>(execution_tier, lower_simd, kExprS32x4LoadSplat);
+WASM_SIMD_TEST(S128Load32Splat) {
+ RunLoadSplatTest<int32_t>(execution_tier, lower_simd, kExprS128Load32Splat);
}
-WASM_SIMD_TEST_NO_LOWERING(S64x2LoadSplat) {
- RunLoadSplatTest<int64_t>(execution_tier, lower_simd, kExprS64x2LoadSplat);
+WASM_SIMD_TEST_NO_LOWERING(S128Load64Splat) {
+ RunLoadSplatTest<int64_t>(execution_tier, lower_simd, kExprS128Load64Splat);
}
template <typename S, typename T>
@@ -3608,37 +3560,37 @@ void RunLoadExtendTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
}
}
-WASM_SIMD_TEST(I16x8Load8x8U) {
+WASM_SIMD_TEST(S128Load8x8U) {
RunLoadExtendTest<uint8_t, uint16_t>(execution_tier, lower_simd,
- kExprI16x8Load8x8U);
+ kExprS128Load8x8U);
}
-WASM_SIMD_TEST(I16x8Load8x8S) {
+WASM_SIMD_TEST(S128Load8x8S) {
RunLoadExtendTest<int8_t, int16_t>(execution_tier, lower_simd,
- kExprI16x8Load8x8S);
+ kExprS128Load8x8S);
}
-WASM_SIMD_TEST(I32x4Load16x4U) {
+WASM_SIMD_TEST(S128Load16x4U) {
RunLoadExtendTest<uint16_t, uint32_t>(execution_tier, lower_simd,
- kExprI32x4Load16x4U);
+ kExprS128Load16x4U);
}
-WASM_SIMD_TEST(I32x4Load16x4S) {
+WASM_SIMD_TEST(S128Load16x4S) {
RunLoadExtendTest<int16_t, int32_t>(execution_tier, lower_simd,
- kExprI32x4Load16x4S);
+ kExprS128Load16x4S);
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Load32x2U) {
+WASM_SIMD_TEST(S128Load32x2U) {
RunLoadExtendTest<uint32_t, uint64_t>(execution_tier, lower_simd,
- kExprI64x2Load32x2U);
+ kExprS128Load32x2U);
}
-WASM_SIMD_TEST_NO_LOWERING(I64x2Load32x2S) {
+WASM_SIMD_TEST(S128Load32x2S) {
RunLoadExtendTest<int32_t, int64_t>(execution_tier, lower_simd,
- kExprI64x2Load32x2S);
+ kExprS128Load32x2S);
}
// TODO(v8:10713): Prototyping v128.load32_zero and v128.load64_zero.
-#if V8_TARGET_ARCH_X64
+#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
template <typename S>
void RunLoadZeroTest(TestExecutionTier execution_tier, LowerSimd lower_simd,
WasmOpcode op) {
@@ -3670,7 +3622,7 @@ WASM_SIMD_TEST_NO_LOWERING(S128LoadMem32Zero) {
WASM_SIMD_TEST_NO_LOWERING(S128LoadMem64Zero) {
RunLoadZeroTest<int64_t>(execution_tier, lower_simd, kExprS128LoadMem64Zero);
}
-#endif // V8_TARGET_ARCH_X64
+#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
#define WASM_SIMD_ANYTRUE_TEST(format, lanes, max, param_type) \
WASM_SIMD_TEST(S##format##AnyTrue) { \
@@ -3946,7 +3898,7 @@ WASM_EXTRACT_I16x8_TEST(S, UINT16) WASM_EXTRACT_I16x8_TEST(I, INT16)
#undef WASM_SIMD_I8x16_EXTRACT_LANE
#undef WASM_SIMD_I8x16_EXTRACT_LANE_U
#undef WASM_SIMD_I8x16_REPLACE_LANE
-#undef WASM_SIMD_S8x16_SHUFFLE_OP
+#undef WASM_SIMD_I8x16_SHUFFLE_OP
#undef WASM_SIMD_LOAD_MEM
#undef WASM_SIMD_LOAD_MEM_OFFSET
#undef WASM_SIMD_STORE_MEM
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm.cc b/deps/v8/test/cctest/wasm/test-run-wasm.cc
index 580ddc9441..d96cd96874 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm.cc
@@ -600,28 +600,28 @@ WASM_EXEC_TEST(IfElse_P) {
WASM_EXEC_TEST(If_empty1) {
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
- BUILD(r, WASM_GET_LOCAL(0), kExprIf, kLocalVoid, kExprEnd, WASM_GET_LOCAL(1));
+ BUILD(r, WASM_GET_LOCAL(0), kExprIf, kVoidCode, kExprEnd, WASM_GET_LOCAL(1));
FOR_UINT32_INPUTS(i) { CHECK_EQ(i, r.Call(i - 9, i)); }
}
WASM_EXEC_TEST(IfElse_empty1) {
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
- BUILD(r, WASM_GET_LOCAL(0), kExprIf, kLocalVoid, kExprElse, kExprEnd,
+ BUILD(r, WASM_GET_LOCAL(0), kExprIf, kVoidCode, kExprElse, kExprEnd,
WASM_GET_LOCAL(1));
FOR_UINT32_INPUTS(i) { CHECK_EQ(i, r.Call(i - 8, i)); }
}
WASM_EXEC_TEST(IfElse_empty2) {
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
- BUILD(r, WASM_GET_LOCAL(0), kExprIf, kLocalVoid, WASM_NOP, kExprElse,
- kExprEnd, WASM_GET_LOCAL(1));
+ BUILD(r, WASM_GET_LOCAL(0), kExprIf, kVoidCode, WASM_NOP, kExprElse, kExprEnd,
+ WASM_GET_LOCAL(1));
FOR_UINT32_INPUTS(i) { CHECK_EQ(i, r.Call(i - 7, i)); }
}
WASM_EXEC_TEST(IfElse_empty3) {
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
- BUILD(r, WASM_GET_LOCAL(0), kExprIf, kLocalVoid, kExprElse, WASM_NOP,
- kExprEnd, WASM_GET_LOCAL(1));
+ BUILD(r, WASM_GET_LOCAL(0), kExprIf, kVoidCode, kExprElse, WASM_NOP, kExprEnd,
+ WASM_GET_LOCAL(1));
FOR_UINT32_INPUTS(i) { CHECK_EQ(i, r.Call(i - 6, i)); }
}
@@ -1226,7 +1226,7 @@ WASM_EXEC_TEST(BrIfEmpty) {
WASM_EXEC_TEST(Block_empty) {
WasmRunner<int32_t, int32_t> r(execution_tier);
- BUILD(r, kExprBlock, kLocalVoid, kExprEnd, WASM_GET_LOCAL(0));
+ BUILD(r, kExprBlock, kVoidCode, kExprEnd, WASM_GET_LOCAL(0));
FOR_INT32_INPUTS(i) { CHECK_EQ(i, r.Call(i)); }
}
@@ -1287,7 +1287,7 @@ WASM_EXEC_TEST(Block_If_P) {
WASM_EXEC_TEST(Loop_empty) {
WasmRunner<int32_t, int32_t> r(execution_tier);
- BUILD(r, kExprLoop, kLocalVoid, kExprEnd, WASM_GET_LOCAL(0));
+ BUILD(r, kExprLoop, kVoidCode, kExprEnd, WASM_GET_LOCAL(0));
FOR_INT32_INPUTS(i) { CHECK_EQ(i, r.Call(i)); }
}
@@ -1817,12 +1817,12 @@ WASM_EXEC_TEST(CheckMachIntsZero) {
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
BUILD(r, // --
- /**/ kExprLoop, kLocalVoid, // --
+ /**/ kExprLoop, kVoidCode, // --
/* */ kExprLocalGet, 0, // --
- /* */ kExprIf, kLocalVoid, // --
+ /* */ kExprIf, kVoidCode, // --
/* */ kExprLocalGet, 0, // --
/* */ kExprI32LoadMem, 0, 0, // --
- /* */ kExprIf, kLocalVoid, // --
+ /* */ kExprIf, kVoidCode, // --
/* */ kExprI32Const, 127, // --
/* */ kExprReturn, // --
/* */ kExprEnd, // --
@@ -3374,7 +3374,7 @@ WASM_EXEC_TEST(BrToLoopWithValue) {
// Subtracts <1> times 3 from <0> and returns the result.
BUILD(r,
// loop i32
- kExprLoop, kLocalI32,
+ kExprLoop, kI32Code,
// decrement <0> by 3.
WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I32V_1(3))),
// decrement <1> by 1.
@@ -3392,7 +3392,7 @@ WASM_EXEC_TEST(BrToLoopWithoutValue) {
// This was broken in the interpreter, see http://crbug.com/715454
WasmRunner<int32_t, int32_t> r(execution_tier);
BUILD(
- r, kExprLoop, kLocalI32, // loop i32
+ r, kExprLoop, kI32Code, // loop i32
WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_ONE)), // dec <0>
WASM_BR_IF(0, WASM_GET_LOCAL(0)), // br_if <0> != 0
kExprUnreachable, // unreachable
@@ -3778,7 +3778,7 @@ TEST(Regression_1085507) {
WasmRunner<int32_t> r(TestExecutionTier::kInterpreter);
TestSignatures sigs;
uint32_t sig_v_i = r.builder().AddSignature(sigs.v_i());
- BUILD(r, WASM_I32V_1(0), kExprIf, kLocalVoid, WASM_UNREACHABLE,
+ BUILD(r, WASM_I32V_1(0), kExprIf, kVoidCode, WASM_UNREACHABLE,
WASM_BLOCK_X(sig_v_i, kExprDrop), kExprElse, kExprEnd, WASM_I32V_1(0));
}
diff --git a/deps/v8/test/cctest/wasm/test-streaming-compilation.cc b/deps/v8/test/cctest/wasm/test-streaming-compilation.cc
index 3ae7ce6815..0f594e63fc 100644
--- a/deps/v8/test/cctest/wasm/test-streaming-compilation.cc
+++ b/deps/v8/test/cctest/wasm/test-streaming-compilation.cc
@@ -111,6 +111,7 @@ class MockPlatform final : public TestPlatform {
}
void Join() override { orig_handle_->Join(); }
void Cancel() override { orig_handle_->Cancel(); }
+ bool IsCompleted() override { return orig_handle_->IsCompleted(); }
bool IsRunning() override { return orig_handle_->IsRunning(); }
private:
@@ -493,20 +494,20 @@ STREAM_TEST(TestErrorInCodeSectionDetectedByModuleDecoder) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 2), // section size
- U32V_1(2), // !!! invalid function count !!!
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 2), // section size
+ U32V_1(2), // !!! invalid function count !!!
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -532,20 +533,20 @@ STREAM_TEST(TestErrorInCodeSectionDetectedByStreamingDecoder) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 3), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -577,18 +578,18 @@ STREAM_TEST(TestErrorInCodeSectionDetectedByCompiler) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
U32V_1(1 + arraysize(code) * 2 +
arraysize(invalid_code)), // section size
U32V_1(3), // functions count
@@ -635,14 +636,14 @@ STREAM_TEST(TestAbortWithinSection1) {
STREAM_TEST(TestAbortWithinSection2) {
StreamTester tester;
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
// Function section is not yet complete.
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -655,11 +656,11 @@ STREAM_TEST(TestAbortWithinSection2) {
STREAM_TEST(TestAbortAfterSection) {
StreamTester tester;
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
};
tester.OnBytesReceived(bytes, arraysize(bytes));
tester.RunCompilerTasks();
@@ -672,20 +673,20 @@ STREAM_TEST(TestAbortAfterSection) {
STREAM_TEST(TestAbortAfterFunctionsCount1) {
StreamTester tester;
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(20), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(20), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
tester.RunCompilerTasks();
@@ -698,20 +699,20 @@ STREAM_TEST(TestAbortAfterFunctionsCount1) {
STREAM_TEST(TestAbortAfterFunctionsCount2) {
StreamTester tester;
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(20), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(20), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
tester.stream()->Abort();
@@ -730,20 +731,20 @@ STREAM_TEST(TestAbortAfterFunctionGotCompiled1) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(20), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(20), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
tester.OnBytesReceived(code, arraysize(code));
@@ -764,20 +765,20 @@ STREAM_TEST(TestAbortAfterFunctionGotCompiled2) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(20), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(20), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
tester.OnBytesReceived(code, arraysize(code));
@@ -796,20 +797,20 @@ STREAM_TEST(TestAbortAfterCodeSection1) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 3), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -832,20 +833,20 @@ STREAM_TEST(TestAbortAfterCodeSection2) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 3), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -872,18 +873,18 @@ STREAM_TEST(TestAbortAfterCompilationError1) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
U32V_1(1 + arraysize(code) * 2 +
arraysize(invalid_code)), // section size
U32V_1(3), // functions count
@@ -914,18 +915,18 @@ STREAM_TEST(TestAbortAfterCompilationError2) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
U32V_1(1 + arraysize(code) * 2 +
arraysize(invalid_code)), // section size
U32V_1(3), // functions count
@@ -985,20 +986,20 @@ STREAM_TEST(TestModuleWithMultipleFunctions) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 3), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -1021,20 +1022,20 @@ STREAM_TEST(TestModuleWithDataSection) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 3), // section size
+ U32V_1(3), // functions count
};
const uint8_t data_section[] = {
@@ -1080,28 +1081,28 @@ STREAM_TEST(TestModuleWithErrorAfterDataSection) {
StreamTester tester;
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 1), // section size
- U32V_1(1), // functions count
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(6), // section size
- U32V_1(1), // functions count
- U32V_1(4), // body size
- U32V_1(0), // locals count
- kExprLocalGet, // some code
- 0, // some code
- kExprEnd, // some code
- kDataSectionCode, // section code
- U32V_1(1), // section size
- U32V_1(0), // data segment count
- kUnknownSectionCode, // section code
- U32V_1(1), // invalid section size
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 1), // section size
+ U32V_1(1), // functions count
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(6), // section size
+ U32V_1(1), // functions count
+ U32V_1(4), // body size
+ U32V_1(0), // locals count
+ kExprLocalGet, // some code
+ 0, // some code
+ kExprEnd, // some code
+ kDataSectionCode, // section code
+ U32V_1(1), // section size
+ U32V_1(0), // data segment count
+ kUnknownSectionCode, // section code
+ U32V_1(1), // invalid section size
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -1148,17 +1149,17 @@ STREAM_TEST(TestFunctionSectionWithoutCodeSection) {
StreamTester tester;
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -1184,20 +1185,20 @@ STREAM_TEST(TestSetModuleCompiledCallback) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 3), // section size
- U32V_1(3), // functions count
- 0, // signature index
- 0, // signature index
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(1 + arraysize(code) * 3), // section size
- U32V_1(3), // functions count
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 3), // section size
+ U32V_1(3), // functions count
+ 0, // signature index
+ 0, // signature index
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(1 + arraysize(code) * 3), // section size
+ U32V_1(3), // functions count
};
tester.OnBytesReceived(bytes, arraysize(bytes));
@@ -1214,21 +1215,21 @@ STREAM_TEST(TestSetModuleCompiledCallback) {
// section is not present at the time the error is detected.
STREAM_TEST(TestCompileErrorFunctionName) {
const uint8_t bytes_module_with_code[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(2), // section size
- U32V_1(1), // functions count
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(4), // section size
- U32V_1(1), // functions count
- 2, // body size
- 0, // local definitions count
- kExprNop, // body
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(2), // section size
+ U32V_1(1), // functions count
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(4), // section size
+ U32V_1(1), // functions count
+ 2, // body size
+ 0, // local definitions count
+ kExprNop, // body
};
const uint8_t bytes_names[] = {
@@ -1277,17 +1278,17 @@ STREAM_TEST(TestSetModuleCodeSection) {
};
const uint8_t bytes[] = {
- WASM_MODULE_HEADER, // module header
- kTypeSectionCode, // section code
- U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
- U32V_1(1), // type count
- SIG_ENTRY_x_x(kLocalI32, kLocalI32), // signature entry
- kFunctionSectionCode, // section code
- U32V_1(1 + 1), // section size
- U32V_1(1), // functions count
- 0, // signature index
- kCodeSectionCode, // section code
- U32V_1(arraysize(code)), // section size
+ WASM_MODULE_HEADER, // module header
+ kTypeSectionCode, // section code
+ U32V_1(1 + SIZEOF_SIG_ENTRY_x_x), // section size
+ U32V_1(1), // type count
+ SIG_ENTRY_x_x(kI32Code, kI32Code), // signature entry
+ kFunctionSectionCode, // section code
+ U32V_1(1 + 1), // section size
+ U32V_1(1), // functions count
+ 0, // signature index
+ kCodeSectionCode, // section code
+ U32V_1(arraysize(code)), // section size
};
tester.OnBytesReceived(bytes, arraysize(bytes));
diff --git a/deps/v8/test/cctest/wasm/test-wasm-breakpoints.cc b/deps/v8/test/cctest/wasm/test-wasm-breakpoints.cc
index 624449b444..7e52bc84d7 100644
--- a/deps/v8/test/cctest/wasm/test-wasm-breakpoints.cc
+++ b/deps/v8/test/cctest/wasm/test-wasm-breakpoints.cc
@@ -574,6 +574,13 @@ WASM_COMPILED_EXEC_TEST(WasmBreakInPostMVP) {
CHECK_EQ(kReturn, GetIntReturnValue(retval));
}
+WASM_COMPILED_EXEC_TEST(Regress10889) {
+ FLAG_SCOPE(print_wasm_code);
+ WasmRunner<int> runner(execution_tier);
+ BUILD(runner, WASM_I32V_1(0));
+ SetBreakpoint(&runner, runner.function_index(), 1, 1);
+}
+
} // namespace wasm
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/cctest/wasm/test-wasm-metrics.cc b/deps/v8/test/cctest/wasm/test-wasm-metrics.cc
new file mode 100644
index 0000000000..b05a4e88b1
--- /dev/null
+++ b/deps/v8/test/cctest/wasm/test-wasm-metrics.cc
@@ -0,0 +1,330 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+
+#include "include/v8-metrics.h"
+#include "src/api/api-inl.h"
+#include "src/wasm/wasm-module-builder.h"
+#include "test/cctest/cctest.h"
+#include "test/common/wasm/flag-utils.h"
+#include "test/common/wasm/test-signatures.h"
+#include "test/common/wasm/wasm-macro-gen.h"
+#include "test/common/wasm/wasm-module-runner.h"
+
+namespace v8 {
+namespace internal {
+namespace wasm {
+
+namespace {
+
+class MockPlatform final : public TestPlatform {
+ public:
+ MockPlatform() : task_runner_(std::make_shared<MockTaskRunner>()) {
+ // Now that it's completely constructed, make this the current platform.
+ i::V8::SetPlatformForTesting(this);
+ }
+
+ ~MockPlatform() override {
+ for (auto* job_handle : job_handles_) job_handle->ResetPlatform();
+ }
+
+ std::unique_ptr<v8::JobHandle> PostJob(
+ v8::TaskPriority priority,
+ std::unique_ptr<v8::JobTask> job_task) override {
+ auto orig_job_handle = TestPlatform::PostJob(priority, std::move(job_task));
+ auto job_handle =
+ std::make_unique<MockJobHandle>(std::move(orig_job_handle), this);
+ job_handles_.insert(job_handle.get());
+ return job_handle;
+ }
+
+ std::shared_ptr<TaskRunner> GetForegroundTaskRunner(
+ v8::Isolate* isolate) override {
+ return task_runner_;
+ }
+
+ void CallOnWorkerThread(std::unique_ptr<v8::Task> task) override {
+ task_runner_->PostTask(std::move(task));
+ }
+
+ bool IdleTasksEnabled(v8::Isolate* isolate) override { return false; }
+
+ void ExecuteTasks() {
+ for (auto* job_handle : job_handles_) {
+ if (job_handle->IsRunning()) job_handle->Join();
+ }
+ task_runner_->ExecuteTasks();
+ }
+
+ private:
+ class MockTaskRunner final : public TaskRunner {
+ public:
+ void PostTask(std::unique_ptr<v8::Task> task) override {
+ base::MutexGuard lock_scope(&tasks_lock_);
+ tasks_.push(std::move(task));
+ }
+
+ void PostDelayedTask(std::unique_ptr<Task> task,
+ double delay_in_seconds) override {
+ base::MutexGuard lock_scope(&tasks_lock_);
+ tasks_.push(std::move(task));
+ }
+
+ void PostIdleTask(std::unique_ptr<IdleTask> task) override {
+ UNREACHABLE();
+ }
+
+ bool IdleTasksEnabled() override { return false; }
+
+ void ExecuteTasks() {
+ std::queue<std::unique_ptr<v8::Task>> tasks;
+ {
+ base::MutexGuard lock_scope(&tasks_lock_);
+ tasks.swap(tasks_);
+ }
+ while (!tasks.empty()) {
+ std::unique_ptr<Task> task = std::move(tasks.front());
+ tasks.pop();
+ task->Run();
+ }
+ }
+
+ private:
+ base::Mutex tasks_lock_;
+ // We do not execute tasks concurrently, so we only need one list of tasks.
+ std::queue<std::unique_ptr<v8::Task>> tasks_;
+ };
+
+ class MockJobHandle : public JobHandle {
+ public:
+ explicit MockJobHandle(std::unique_ptr<JobHandle> orig_handle,
+ MockPlatform* platform)
+ : orig_handle_(std::move(orig_handle)), platform_(platform) {}
+
+ ~MockJobHandle() {
+ if (platform_) platform_->job_handles_.erase(this);
+ }
+
+ void ResetPlatform() { platform_ = nullptr; }
+
+ void NotifyConcurrencyIncrease() override {
+ orig_handle_->NotifyConcurrencyIncrease();
+ }
+ void Join() override { orig_handle_->Join(); }
+ void Cancel() override { orig_handle_->Cancel(); }
+ bool IsRunning() override { return orig_handle_->IsRunning(); }
+ bool IsCompleted() override { return orig_handle_->IsCompleted(); }
+
+ private:
+ std::unique_ptr<JobHandle> orig_handle_;
+ MockPlatform* platform_;
+ };
+
+ std::shared_ptr<MockTaskRunner> task_runner_;
+ std::unordered_set<MockJobHandle*> job_handles_;
+};
+
+enum class CompilationStatus {
+ kPending,
+ kFinished,
+ kFailed,
+};
+
+class TestInstantiateResolver : public InstantiationResultResolver {
+ public:
+ TestInstantiateResolver(CompilationStatus* status, std::string* error_message)
+ : status_(status), error_message_(error_message) {}
+
+ void OnInstantiationSucceeded(
+ i::Handle<i::WasmInstanceObject> instance) override {
+ *status_ = CompilationStatus::kFinished;
+ }
+
+ void OnInstantiationFailed(i::Handle<i::Object> error_reason) override {
+ *status_ = CompilationStatus::kFailed;
+ Handle<String> str =
+ Object::ToString(CcTest::i_isolate(), error_reason).ToHandleChecked();
+ error_message_->assign(str->ToCString().get());
+ }
+
+ private:
+ CompilationStatus* const status_;
+ std::string* const error_message_;
+};
+
+class TestCompileResolver : public CompilationResultResolver {
+ public:
+ TestCompileResolver(CompilationStatus* status, std::string* error_message,
+ Isolate* isolate,
+ std::shared_ptr<NativeModule>* native_module)
+ : status_(status),
+ error_message_(error_message),
+ isolate_(isolate),
+ native_module_(native_module) {}
+
+ void OnCompilationSucceeded(i::Handle<i::WasmModuleObject> module) override {
+ if (!module.is_null()) {
+ *native_module_ = module->shared_native_module();
+ isolate_->wasm_engine()->AsyncInstantiate(
+ isolate_,
+ std::make_unique<TestInstantiateResolver>(status_, error_message_),
+ module, MaybeHandle<JSReceiver>());
+ }
+ }
+
+ void OnCompilationFailed(i::Handle<i::Object> error_reason) override {
+ *status_ = CompilationStatus::kFailed;
+ Handle<String> str =
+ Object::ToString(CcTest::i_isolate(), error_reason).ToHandleChecked();
+ error_message_->assign(str->ToCString().get());
+ }
+
+ private:
+ CompilationStatus* const status_;
+ std::string* const error_message_;
+ Isolate* isolate_;
+ std::shared_ptr<NativeModule>* const native_module_;
+};
+
+} // namespace
+
+#define COMPILE_TEST(name) \
+ void RunCompile_##name(); \
+ TEST(Sync##name) { \
+ i::FlagScope<bool> sync_scope(&i::FLAG_wasm_async_compilation, false); \
+ RunCompile_##name(); \
+ } \
+ \
+ TEST(Async##name) { RunCompile_##name(); } \
+ \
+ TEST(Streaming##name) { \
+ i::FlagScope<bool> streaming_scope(&i::FLAG_wasm_test_streaming, true); \
+ RunCompile_##name(); \
+ } \
+ void RunCompile_##name()
+
+class MetricsRecorder : public v8::metrics::Recorder {
+ public:
+ std::vector<v8::metrics::WasmModuleDecoded> module_decoded_;
+ std::vector<v8::metrics::WasmModuleCompiled> module_compiled_;
+ std::vector<v8::metrics::WasmModuleInstantiated> module_instantiated_;
+ std::vector<v8::metrics::WasmModuleTieredUp> module_tiered_up_;
+
+ void AddMainThreadEvent(const v8::metrics::WasmModuleDecoded& event,
+ v8::metrics::Recorder::ContextId id) override {
+ CHECK(!id.IsEmpty());
+ module_decoded_.emplace_back(event);
+ }
+ void AddMainThreadEvent(const v8::metrics::WasmModuleCompiled& event,
+ v8::metrics::Recorder::ContextId id) override {
+ CHECK(!id.IsEmpty());
+ module_compiled_.emplace_back(event);
+ }
+ void AddMainThreadEvent(const v8::metrics::WasmModuleInstantiated& event,
+ v8::metrics::Recorder::ContextId id) override {
+ CHECK(!id.IsEmpty());
+ module_instantiated_.emplace_back(event);
+ }
+ void AddMainThreadEvent(const v8::metrics::WasmModuleTieredUp& event,
+ v8::metrics::Recorder::ContextId id) override {
+ CHECK(!id.IsEmpty());
+ module_tiered_up_.emplace_back(event);
+ }
+};
+
+COMPILE_TEST(TestEventMetrics) {
+ MockPlatform platform;
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ CHECK_EQ(V8::GetCurrentPlatform(), &platform);
+ HandleScope scope(isolate);
+ testing::SetupIsolateForWasmModule(isolate);
+ std::shared_ptr<MetricsRecorder> recorder =
+ std::make_shared<MetricsRecorder>();
+ CcTest::isolate()->SetMetricsRecorder(recorder);
+
+ TestSignatures sigs;
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+
+ WasmModuleBuilder* builder = zone.New<WasmModuleBuilder>(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
+ f->builder()->AddExport(CStrVector("main"), f);
+ byte code[] = {WASM_I32V_2(0)};
+ f->EmitCode(code, sizeof(code));
+ f->Emit(kExprEnd);
+ ZoneBuffer buffer(&zone);
+ builder->WriteTo(&buffer);
+
+ auto enabled_features = WasmFeatures::FromIsolate(isolate);
+ CompilationStatus status = CompilationStatus::kPending;
+ std::string error_message;
+ std::shared_ptr<NativeModule> native_module;
+ isolate->wasm_engine()->AsyncCompile(
+ isolate, enabled_features,
+ std::make_shared<TestCompileResolver>(&status, &error_message, isolate,
+ &native_module),
+ ModuleWireBytes(buffer.begin(), buffer.end()), true,
+ "CompileAndInstantiateWasmModuleForTesting");
+
+ // Finish compilation tasks.
+ while (status == CompilationStatus::kPending) {
+ platform.ExecuteTasks();
+ }
+ platform.ExecuteTasks(); // Complete pending tasks beyond compilation.
+ CHECK_EQ(CompilationStatus::kFinished, status);
+
+ CHECK_EQ(1, recorder->module_decoded_.size());
+ CHECK(recorder->module_decoded_.back().success);
+ CHECK_EQ(i::FLAG_wasm_async_compilation,
+ recorder->module_decoded_.back().async);
+ CHECK_EQ(i::FLAG_wasm_test_streaming,
+ recorder->module_decoded_.back().streamed);
+ CHECK_EQ(buffer.size(),
+ recorder->module_decoded_.back().module_size_in_bytes);
+ CHECK_EQ(1, recorder->module_decoded_.back().function_count);
+ CHECK_LE(0, recorder->module_decoded_.back().wall_clock_time_in_us);
+
+ CHECK_EQ(1, recorder->module_compiled_.size());
+ CHECK(recorder->module_compiled_.back().success);
+ CHECK_EQ(i::FLAG_wasm_async_compilation,
+ recorder->module_compiled_.back().async);
+ CHECK_EQ(i::FLAG_wasm_test_streaming,
+ recorder->module_compiled_.back().streamed);
+ CHECK(!recorder->module_compiled_.back().cached);
+ CHECK(!recorder->module_compiled_.back().deserialized);
+ CHECK(!recorder->module_compiled_.back().lazy);
+ CHECK_LT(0, recorder->module_compiled_.back().code_size_in_bytes);
+ // We currently cannot ensure that no code is attributed to Liftoff after the
+ // WasmModuleCompiled event has been emitted. We therefore only assume the
+ // liftoff_code_size() to be an upper limit for the reported size.
+ CHECK_GE(native_module->liftoff_code_size(),
+ recorder->module_compiled_.back().code_size_in_bytes);
+ CHECK_GE(native_module->generated_code_size(),
+ recorder->module_compiled_.back().code_size_in_bytes);
+ CHECK_EQ(0, recorder->module_compiled_.back().liftoff_bailout_count);
+ CHECK_LE(0, recorder->module_compiled_.back().wall_clock_time_in_us);
+
+ CHECK_EQ(1, recorder->module_instantiated_.size());
+ CHECK(recorder->module_instantiated_.back().success);
+ // We currently don't support true async instantiation.
+ CHECK(!recorder->module_instantiated_.back().async);
+ CHECK_EQ(0, recorder->module_instantiated_.back().imported_function_count);
+ CHECK_LE(0, recorder->module_instantiated_.back().wall_clock_time_in_us);
+
+ CHECK_EQ(1, recorder->module_tiered_up_.size());
+ CHECK(!recorder->module_tiered_up_.back().lazy);
+ CHECK_LT(0, recorder->module_tiered_up_.back().code_size_in_bytes);
+ CHECK_GE(native_module->turbofan_code_size(),
+ recorder->module_tiered_up_.back().code_size_in_bytes);
+ CHECK_GE(native_module->generated_code_size(),
+ recorder->module_tiered_up_.back().code_size_in_bytes);
+ CHECK_GE(native_module->committed_code_space(),
+ recorder->module_tiered_up_.back().code_size_in_bytes);
+ CHECK_LE(0, recorder->module_tiered_up_.back().wall_clock_time_in_us);
+}
+
+} // namespace wasm
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/test/cctest/wasm/test-wasm-shared-engine.cc b/deps/v8/test/cctest/wasm/test-wasm-shared-engine.cc
index 2d69f17368..b7f3a8d83e 100644
--- a/deps/v8/test/cctest/wasm/test-wasm-shared-engine.cc
+++ b/deps/v8/test/cctest/wasm/test-wasm-shared-engine.cc
@@ -26,8 +26,6 @@ namespace test_wasm_shared_engine {
// shared between multiple Isolates, sharing the underlying generated code.
class SharedEngine {
public:
- explicit SharedEngine(size_t max_committed = kMaxWasmCodeMemory)
- : wasm_engine_(std::make_unique<WasmEngine>()) {}
~SharedEngine() {
// Ensure no remaining uses exist.
CHECK(wasm_engine_.unique());
@@ -44,7 +42,7 @@ class SharedEngine {
std::shared_ptr<WasmEngine> ExportEngineForSharing() { return wasm_engine_; }
private:
- std::shared_ptr<WasmEngine> wasm_engine_;
+ std::shared_ptr<WasmEngine> wasm_engine_ = std::make_unique<WasmEngine>();
};
// Helper type definition representing a WebAssembly module shared between
diff --git a/deps/v8/test/cctest/wasm/wasm-run-utils.cc b/deps/v8/test/cctest/wasm/wasm-run-utils.cc
index 6a9ba23d64..ea37eb4023 100644
--- a/deps/v8/test/cctest/wasm/wasm-run-utils.cc
+++ b/deps/v8/test/cctest/wasm/wasm-run-utils.cc
@@ -50,7 +50,8 @@ TestingModuleBuilder::TestingModuleBuilder(
// Manually compile an import wrapper and insert it into the instance.
CodeSpaceMemoryModificationScope modification_scope(isolate_->heap());
auto resolved = compiler::ResolveWasmImportCall(
- maybe_import->js_function, maybe_import->sig, enabled_features_);
+ maybe_import->js_function, maybe_import->sig,
+ instance_object_->module(), enabled_features_);
compiler::WasmImportCallKind kind = resolved.first;
Handle<JSReceiver> callable = resolved.second;
WasmImportWrapperCache::ModificationScope cache_scope(
@@ -170,7 +171,7 @@ Handle<JSFunction> TestingModuleBuilder::WrapCode(uint32_t index) {
void TestingModuleBuilder::AddIndirectFunctionTable(
const uint16_t* function_indexes, uint32_t table_size) {
- auto instance = instance_object();
+ Handle<WasmInstanceObject> instance = instance_object();
uint32_t table_index = static_cast<uint32_t>(test_module_->tables.size());
test_module_->tables.emplace_back();
WasmTable& table = test_module_->tables.back();
@@ -196,7 +197,7 @@ void TestingModuleBuilder::AddIndirectFunctionTable(
WasmInstanceObject::EnsureIndirectFunctionTableWithMinimumSize(
instance_object(), table_index, table_size);
Handle<WasmTableObject> table_obj =
- WasmTableObject::New(isolate_, table.type, table.initial_size,
+ WasmTableObject::New(isolate_, instance, table.type, table.initial_size,
table.has_maximum_size, table.maximum_size, nullptr);
WasmTableObject::AddDispatchTable(isolate_, table_obj, instance_object_,
diff --git a/deps/v8/test/common/wasm/test-signatures.h b/deps/v8/test/common/wasm/test-signatures.h
index c361bb5c45..c7429c23e2 100644
--- a/deps/v8/test/common/wasm/test-signatures.h
+++ b/deps/v8/test/common/wasm/test-signatures.h
@@ -48,6 +48,8 @@ class TestSignatures {
sig_v_e(0, 1, kExternRefTypes4),
sig_v_c(0, 1, kFuncTypes4),
sig_s_i(1, 1, kSimd128IntTypes4),
+ sig_s_s(1, 1, kSimd128Types4),
+ sig_s_ss(1, 2, kSimd128Types4),
sig_ii_v(2, 0, kIntTypes4),
sig_iii_v(3, 0, kIntTypes4) {
// I used C++ and you won't believe what happened next....
@@ -62,6 +64,7 @@ class TestSignatures {
for (int i = 1; i < 4; i++) kIntDoubleTypes4[i] = kWasmF64;
for (int i = 1; i < 4; i++) kIntExternRefTypes4[i] = kWasmExternRef;
for (int i = 1; i < 4; i++) kIntFuncRefTypes4[i] = kWasmFuncRef;
+ for (int i = 0; i < 4; i++) kSimd128Types4[i] = kWasmS128;
for (int i = 1; i < 4; i++) kIntSimd128Types4[i] = kWasmS128;
for (int i = 0; i < 4; i++) kSimd128IntTypes4[i] = kWasmS128;
kIntLongTypes4[0] = kWasmI32;
@@ -109,6 +112,8 @@ class TestSignatures {
FunctionSig* v_e() { return &sig_v_e; }
FunctionSig* v_c() { return &sig_v_c; }
FunctionSig* s_i() { return &sig_s_i; }
+ FunctionSig* s_s() { return &sig_s_s; }
+ FunctionSig* s_ss() { return &sig_s_ss; }
FunctionSig* ii_v() { return &sig_ii_v; }
FunctionSig* iii_v() { return &sig_iii_v; }
@@ -134,6 +139,7 @@ class TestSignatures {
ValueType kIntDoubleTypes4[4];
ValueType kIntExternRefTypes4[4];
ValueType kIntFuncRefTypes4[4];
+ ValueType kSimd128Types4[4];
ValueType kIntSimd128Types4[4];
ValueType kSimd128IntTypes4[4];
@@ -173,6 +179,8 @@ class TestSignatures {
FunctionSig sig_v_e;
FunctionSig sig_v_c;
FunctionSig sig_s_i;
+ FunctionSig sig_s_s;
+ FunctionSig sig_s_ss;
FunctionSig sig_ii_v;
FunctionSig sig_iii_v;
diff --git a/deps/v8/test/common/wasm/wasm-interpreter.cc b/deps/v8/test/common/wasm/wasm-interpreter.cc
index cc89577cae..b1d57bdd65 100644
--- a/deps/v8/test/common/wasm/wasm-interpreter.cc
+++ b/deps/v8/test/common/wasm/wasm-interpreter.cc
@@ -847,7 +847,7 @@ class SideTable : public ZoneObject {
Control* c = &control_stack.back();
copy_unreachable();
TRACE("control @%u: Else\n", i.pc_offset());
- if (!control_parent().unreachable) {
+ if (!unreachable) {
c->end_label->Ref(i.pc(), stack_height);
}
DCHECK_NOT_NULL(c->else_label);
@@ -883,7 +883,7 @@ class SideTable : public ZoneObject {
exception_stack.pop_back();
copy_unreachable();
TRACE("control @%u: Catch\n", i.pc_offset());
- if (!control_parent().unreachable) {
+ if (!unreachable) {
c->end_label->Ref(i.pc(), stack_height);
}
DCHECK_NOT_NULL(c->else_label);
@@ -2562,7 +2562,7 @@ class WasmInterpreterInternals {
*len += 16;
return true;
}
- case kExprS8x16Swizzle: {
+ case kExprI8x16Swizzle: {
int16 v2 = Pop().to_s128().to_i8x16();
int16 v1 = Pop().to_s128().to_i8x16();
int16 res;
@@ -2574,7 +2574,7 @@ class WasmInterpreterInternals {
Push(WasmValue(Simd128(res)));
return true;
}
- case kExprS8x16Shuffle: {
+ case kExprI8x16Shuffle: {
Simd128Immediate<Decoder::kNoValidate> imm(decoder,
code->at(pc + *len));
*len += 16;
@@ -2631,43 +2631,43 @@ class WasmInterpreterInternals {
QFM_CASE(F64x2Qfma, f64x2, float2, 2, +)
QFM_CASE(F64x2Qfms, f64x2, float2, 2, -)
#undef QFM_CASE
- case kExprS8x16LoadSplat: {
+ case kExprS128Load8Splat: {
return DoSimdLoadSplat<int16, int32_t, int8_t>(
decoder, code, pc, len, MachineRepresentation::kWord8);
}
- case kExprS16x8LoadSplat: {
+ case kExprS128Load16Splat: {
return DoSimdLoadSplat<int8, int32_t, int16_t>(
decoder, code, pc, len, MachineRepresentation::kWord16);
}
- case kExprS32x4LoadSplat: {
+ case kExprS128Load32Splat: {
return DoSimdLoadSplat<int4, int32_t, int32_t>(
decoder, code, pc, len, MachineRepresentation::kWord32);
}
- case kExprS64x2LoadSplat: {
+ case kExprS128Load64Splat: {
return DoSimdLoadSplat<int2, int64_t, int64_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
- case kExprI16x8Load8x8S: {
+ case kExprS128Load8x8S: {
return DoSimdLoadExtend<int8, int16_t, int8_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
- case kExprI16x8Load8x8U: {
+ case kExprS128Load8x8U: {
return DoSimdLoadExtend<int8, uint16_t, uint8_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
- case kExprI32x4Load16x4S: {
+ case kExprS128Load16x4S: {
return DoSimdLoadExtend<int4, int32_t, int16_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
- case kExprI32x4Load16x4U: {
+ case kExprS128Load16x4U: {
return DoSimdLoadExtend<int4, uint32_t, uint16_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
- case kExprI64x2Load32x2S: {
+ case kExprS128Load32x2S: {
return DoSimdLoadExtend<int2, int64_t, int32_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
- case kExprI64x2Load32x2U: {
+ case kExprS128Load32x2U: {
return DoSimdLoadExtend<int2, uint64_t, uint32_t>(
decoder, code, pc, len, MachineRepresentation::kWord64);
}
@@ -3268,6 +3268,9 @@ class WasmInterpreterInternals {
} break;
case kExprReturnCall: {
+ // Make return calls more expensive, so that return call recursions
+ // don't cause a timeout.
+ if (max > 0) max = std::max(0, max - 100);
CallFunctionImmediate<Decoder::kNoValidate> imm(&decoder,
code->at(pc + 1));
InterpreterCode* target = codemap_.GetCode(imm.index);
@@ -3280,6 +3283,9 @@ class WasmInterpreterInternals {
} break;
case kExprReturnCallIndirect: {
+ // Make return calls more expensive, so that return call recursions
+ // don't cause a timeout.
+ if (max > 0) max = std::max(0, max - 100);
CallIndirectImmediate<Decoder::kNoValidate> imm(
WasmFeatures::All(), &decoder, code->at(pc + 1));
uint32_t entry_index = Pop().to<uint32_t>();
diff --git a/deps/v8/test/common/wasm/wasm-macro-gen.h b/deps/v8/test/common/wasm/wasm-macro-gen.h
index 2950d4b95e..f888922410 100644
--- a/deps/v8/test/common/wasm/wasm-macro-gen.h
+++ b/deps/v8/test/common/wasm/wasm-macro-gen.h
@@ -67,6 +67,18 @@
static_cast<byte>((((x) >> 21) & MASK_7) | 0x80), \
static_cast<byte>((((x) >> 28) & MASK_7))
+#define U64V_10(x) \
+ static_cast<uint8_t>((uint64_t{x} & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 7) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 14) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 21) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 28) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 35) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 42) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 49) & MASK_7) | 0x80), \
+ static_cast<uint8_t>(((uint64_t{x} >> 56) & MASK_7) | 0x80), \
+ static_cast<uint8_t>((uint64_t{x} >> 63) & MASK_7)
+
// Convenience macros for building Wasm bytecode directly into a byte array.
//------------------------------------------------------------------------------
@@ -84,15 +96,15 @@
#define WASM_HEAP_TYPE(heap_type) static_cast<byte>((heap_type).code() & 0x7f)
-#define WASM_REF_TYPE(type) \
- (type).kind() == ValueType::kRef ? kLocalRef : kLocalOptRef, \
+#define WASM_REF_TYPE(type) \
+ (type).kind() == ValueType::kRef ? kRefCode : kOptRefCode, \
WASM_HEAP_TYPE((type).heap_type())
-#define WASM_BLOCK(...) kExprBlock, kLocalVoid, __VA_ARGS__, kExprEnd
-#define WASM_BLOCK_I(...) kExprBlock, kLocalI32, __VA_ARGS__, kExprEnd
-#define WASM_BLOCK_L(...) kExprBlock, kLocalI64, __VA_ARGS__, kExprEnd
-#define WASM_BLOCK_F(...) kExprBlock, kLocalF32, __VA_ARGS__, kExprEnd
-#define WASM_BLOCK_D(...) kExprBlock, kLocalF64, __VA_ARGS__, kExprEnd
+#define WASM_BLOCK(...) kExprBlock, kVoidCode, __VA_ARGS__, kExprEnd
+#define WASM_BLOCK_I(...) kExprBlock, kI32Code, __VA_ARGS__, kExprEnd
+#define WASM_BLOCK_L(...) kExprBlock, kI64Code, __VA_ARGS__, kExprEnd
+#define WASM_BLOCK_F(...) kExprBlock, kF32Code, __VA_ARGS__, kExprEnd
+#define WASM_BLOCK_D(...) kExprBlock, kF64Code, __VA_ARGS__, kExprEnd
#define WASM_BLOCK_T(t, ...) \
kExprBlock, static_cast<byte>((t).value_type_code()), __VA_ARGS__, kExprEnd
@@ -102,13 +114,13 @@
#define WASM_BLOCK_X(index, ...) \
kExprBlock, static_cast<byte>(index), __VA_ARGS__, kExprEnd
-#define WASM_INFINITE_LOOP kExprLoop, kLocalVoid, kExprBr, DEPTH_0, kExprEnd
+#define WASM_INFINITE_LOOP kExprLoop, kVoidCode, kExprBr, DEPTH_0, kExprEnd
-#define WASM_LOOP(...) kExprLoop, kLocalVoid, __VA_ARGS__, kExprEnd
-#define WASM_LOOP_I(...) kExprLoop, kLocalI32, __VA_ARGS__, kExprEnd
-#define WASM_LOOP_L(...) kExprLoop, kLocalI64, __VA_ARGS__, kExprEnd
-#define WASM_LOOP_F(...) kExprLoop, kLocalF32, __VA_ARGS__, kExprEnd
-#define WASM_LOOP_D(...) kExprLoop, kLocalF64, __VA_ARGS__, kExprEnd
+#define WASM_LOOP(...) kExprLoop, kVoidCode, __VA_ARGS__, kExprEnd
+#define WASM_LOOP_I(...) kExprLoop, kI32Code, __VA_ARGS__, kExprEnd
+#define WASM_LOOP_L(...) kExprLoop, kI64Code, __VA_ARGS__, kExprEnd
+#define WASM_LOOP_F(...) kExprLoop, kF32Code, __VA_ARGS__, kExprEnd
+#define WASM_LOOP_D(...) kExprLoop, kF64Code, __VA_ARGS__, kExprEnd
#define WASM_LOOP_T(t, ...) \
kExprLoop, static_cast<byte>((t).value_type_code()), __VA_ARGS__, kExprEnd
@@ -118,7 +130,7 @@
#define WASM_LOOP_X(index, ...) \
kExprLoop, static_cast<byte>(index), __VA_ARGS__, kExprEnd
-#define WASM_IF(cond, ...) cond, kExprIf, kLocalVoid, __VA_ARGS__, kExprEnd
+#define WASM_IF(cond, ...) cond, kExprIf, kVoidCode, __VA_ARGS__, kExprEnd
#define WASM_IF_T(t, cond, ...) \
cond, kExprIf, static_cast<byte>((t).value_type_code()), __VA_ARGS__, kExprEnd
@@ -130,16 +142,16 @@
cond, kExprIf, static_cast<byte>(index), __VA_ARGS__, kExprEnd
#define WASM_IF_ELSE(cond, tstmt, fstmt) \
- cond, kExprIf, kLocalVoid, tstmt, kExprElse, fstmt, kExprEnd
+ cond, kExprIf, kVoidCode, tstmt, kExprElse, fstmt, kExprEnd
#define WASM_IF_ELSE_I(cond, tstmt, fstmt) \
- cond, kExprIf, kLocalI32, tstmt, kExprElse, fstmt, kExprEnd
+ cond, kExprIf, kI32Code, tstmt, kExprElse, fstmt, kExprEnd
#define WASM_IF_ELSE_L(cond, tstmt, fstmt) \
- cond, kExprIf, kLocalI64, tstmt, kExprElse, fstmt, kExprEnd
+ cond, kExprIf, kI64Code, tstmt, kExprElse, fstmt, kExprEnd
#define WASM_IF_ELSE_F(cond, tstmt, fstmt) \
- cond, kExprIf, kLocalF32, tstmt, kExprElse, fstmt, kExprEnd
+ cond, kExprIf, kF32Code, tstmt, kExprElse, fstmt, kExprEnd
#define WASM_IF_ELSE_D(cond, tstmt, fstmt) \
- cond, kExprIf, kLocalF64, tstmt, kExprElse, fstmt, kExprEnd
+ cond, kExprIf, kF64Code, tstmt, kExprElse, fstmt, kExprEnd
#define WASM_IF_ELSE_T(t, cond, tstmt, fstmt) \
cond, kExprIf, static_cast<byte>((t).value_type_code()), tstmt, kExprElse, \
@@ -159,17 +171,17 @@
#define WASM_SELECT(tval, fval, cond) tval, fval, cond, kExprSelect
#define WASM_SELECT_I(tval, fval, cond) \
- tval, fval, cond, kExprSelectWithType, U32V_1(1), kLocalI32
+ tval, fval, cond, kExprSelectWithType, U32V_1(1), kI32Code
#define WASM_SELECT_L(tval, fval, cond) \
- tval, fval, cond, kExprSelectWithType, U32V_1(1), kLocalI64
+ tval, fval, cond, kExprSelectWithType, U32V_1(1), kI64Code
#define WASM_SELECT_F(tval, fval, cond) \
- tval, fval, cond, kExprSelectWithType, U32V_1(1), kLocalF32
+ tval, fval, cond, kExprSelectWithType, U32V_1(1), kF32Code
#define WASM_SELECT_D(tval, fval, cond) \
- tval, fval, cond, kExprSelectWithType, U32V_1(1), kLocalF64
+ tval, fval, cond, kExprSelectWithType, U32V_1(1), kF64Code
#define WASM_SELECT_R(tval, fval, cond) \
- tval, fval, cond, kExprSelectWithType, U32V_1(1), kLocalExternRef
+ tval, fval, cond, kExprSelectWithType, U32V_1(1), kExternRefCode
#define WASM_SELECT_A(tval, fval, cond) \
- tval, fval, cond, kExprSelectWithType, U32V_1(1), kLocalFuncRef
+ tval, fval, cond, kExprSelectWithType, U32V_1(1), kFuncRefCode
#define WASM_RETURN0 kExprReturn
#define WASM_RETURN1(val) val, kExprReturn
@@ -209,6 +221,24 @@
#define WASM_NO_LOCALS 0
+//------------------------------------------------------------------------------
+// Helpers for encoding sections and other fields with length prefix.
+//------------------------------------------------------------------------------
+
+template <typename... Args>
+std::integral_constant<size_t, sizeof...(Args)> CountArgsHelper(Args...);
+#define COUNT_ARGS(...) (decltype(CountArgsHelper(__VA_ARGS__))::value)
+
+template <size_t num>
+struct CheckLEB1 : std::integral_constant<size_t, num> {
+ static_assert(num <= I32V_MAX(1), "LEB range check");
+};
+#define CHECK_LEB1(num) CheckLEB1<num>::value
+
+#define ADD_COUNT(...) CHECK_LEB1(COUNT_ARGS(__VA_ARGS__)), __VA_ARGS__
+
+#define SECTION(name, ...) k##name##SectionCode, ADD_COUNT(__VA_ARGS__)
+
namespace v8 {
namespace internal {
namespace wasm {
@@ -472,7 +502,7 @@ inline WasmOpcode LoadStoreOpcodeOf(MachineType type, bool store) {
#define WASM_ARRAY_LEN(typeidx, array) \
array, WASM_GC_OP(kExprArrayLen), static_cast<byte>(typeidx)
-#define WASM_RTT(depth, typeidx) kLocalRtt, U32V_1(depth), U32V_1(typeidx)
+#define WASM_RTT(depth, typeidx) kRttCode, U32V_1(depth), U32V_1(typeidx)
#define WASM_RTT_CANON(typeidx) \
WASM_GC_OP(kExprRttCanon), static_cast<byte>(typeidx)
#define WASM_RTT_SUB(typeidx, supertype) \
@@ -500,18 +530,18 @@ inline WasmOpcode LoadStoreOpcodeOf(MachineType type, bool store) {
__VA_ARGS__, func_ref, kExprReturnCallRef
// shift locals by 1; let (locals[0]: local_type) = value in ...
-#define WASM_LET_1_V(local_type, value, ...) \
- value, kExprLet, kLocalVoid, U32V_1(1), U32V_1(1), local_type, __VA_ARGS__, \
+#define WASM_LET_1_V(local_type, value, ...) \
+ value, kExprLet, kVoidCode, U32V_1(1), U32V_1(1), local_type, __VA_ARGS__, \
kExprEnd
-#define WASM_LET_1_I(local_type, value, ...) \
- value, kExprLet, kLocalI32, U32V_1(1), U32V_1(1), local_type, __VA_ARGS__, \
+#define WASM_LET_1_I(local_type, value, ...) \
+ value, kExprLet, kI32Code, U32V_1(1), U32V_1(1), local_type, __VA_ARGS__, \
kExprEnd
// shift locals by 2;
// let (locals[0]: local_type_1) = value_1,
// (locals[1]: local_type_2) = value_2
// in ...
-#define WASM_LET_2_I(local_type_1, value_1, local_type_2, value_2, ...) \
- value_1, value_2, kExprLet, kLocalI32, U32V_1(2), U32V_1(1), local_type_1, \
+#define WASM_LET_2_I(local_type_1, value_1, local_type_2, value_2, ...) \
+ value_1, value_2, kExprLet, kI32Code, U32V_1(2), U32V_1(1), local_type_1, \
U32V_1(1), local_type_2, __VA_ARGS__, kExprEnd
#define WASM_NOT(x) x, kExprI32Eqz
@@ -520,9 +550,9 @@ inline WasmOpcode LoadStoreOpcodeOf(MachineType type, bool store) {
//------------------------------------------------------------------------------
// Constructs that are composed of multiple bytecodes.
//------------------------------------------------------------------------------
-#define WASM_WHILE(x, y) \
- kExprLoop, kLocalVoid, x, kExprIf, kLocalVoid, y, kExprBr, DEPTH_1, \
- kExprEnd, kExprEnd
+#define WASM_WHILE(x, y) \
+ kExprLoop, kVoidCode, x, kExprIf, kVoidCode, y, kExprBr, DEPTH_1, kExprEnd, \
+ kExprEnd
#define WASM_INC_LOCAL(index) \
kExprLocalGet, static_cast<byte>(index), kExprI32Const, 1, kExprI32Add, \
kExprLocalTee, static_cast<byte>(index)
@@ -757,7 +787,7 @@ inline WasmOpcode LoadStoreOpcodeOf(MachineType type, bool store) {
val, cond, kExprBrIf, static_cast<byte>(depth)
#define WASM_BRV_IFD(depth, val, cond) \
val, cond, kExprBrIf, static_cast<byte>(depth), kExprDrop
-#define WASM_IFB(cond, ...) cond, kExprIf, kLocalVoid, __VA_ARGS__, kExprEnd
+#define WASM_IFB(cond, ...) cond, kExprIf, kVoidCode, __VA_ARGS__, kExprEnd
#define WASM_BR_TABLEV(val, key, count, ...) \
val, key, kExprBrTable, U32V_1(count), __VA_ARGS__
@@ -850,7 +880,7 @@ inline WasmOpcode LoadStoreOpcodeOf(MachineType type, bool store) {
#define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \
x, y, WASM_SIMD_OP(kExprI8x16ReplaceLane), TO_BYTE(lane)
-#define WASM_SIMD_S8x16_SHUFFLE_OP(opcode, m, x, y) \
+#define WASM_SIMD_I8x16_SHUFFLE_OP(opcode, m, x, y) \
x, y, WASM_SIMD_OP(opcode), TO_BYTE(m[0]), TO_BYTE(m[1]), TO_BYTE(m[2]), \
TO_BYTE(m[3]), TO_BYTE(m[4]), TO_BYTE(m[5]), TO_BYTE(m[6]), \
TO_BYTE(m[7]), TO_BYTE(m[8]), TO_BYTE(m[9]), TO_BYTE(m[10]), \
diff --git a/deps/v8/test/common/wasm/wasm-module-runner.cc b/deps/v8/test/common/wasm/wasm-module-runner.cc
index 2d1fbeaed8..e2d8cde531 100644
--- a/deps/v8/test/common/wasm/wasm-module-runner.cc
+++ b/deps/v8/test/common/wasm/wasm-module-runner.cc
@@ -41,12 +41,11 @@ MaybeHandle<WasmInstanceObject> CompileAndInstantiateForTesting(
isolate, thrower, module.ToHandleChecked(), {}, {});
}
-std::unique_ptr<WasmValue[]> MakeDefaultArguments(Isolate* isolate,
- const FunctionSig* sig) {
+OwnedVector<WasmValue> MakeDefaultInterpreterArguments(Isolate* isolate,
+ const FunctionSig* sig) {
size_t param_count = sig->parameter_count();
- auto arguments = std::make_unique<WasmValue[]>(param_count);
+ auto arguments = OwnedVector<WasmValue>::New(param_count);
- // Fill the parameters up with default values.
for (size_t i = 0; i < param_count; ++i) {
switch (sig->GetParam(i).kind()) {
case ValueType::kI32:
@@ -61,6 +60,9 @@ std::unique_ptr<WasmValue[]> MakeDefaultArguments(Isolate* isolate,
case ValueType::kF64:
arguments[i] = WasmValue(0.0);
break;
+ case ValueType::kS128:
+ arguments[i] = WasmValue(Simd128{});
+ break;
case ValueType::kOptRef:
arguments[i] =
WasmValue(Handle<Object>::cast(isolate->factory()->null_value()));
@@ -71,7 +73,40 @@ std::unique_ptr<WasmValue[]> MakeDefaultArguments(Isolate* isolate,
case ValueType::kI16:
case ValueType::kStmt:
case ValueType::kBottom:
+ UNREACHABLE();
+ }
+ }
+
+ return arguments;
+}
+
+OwnedVector<Handle<Object>> MakeDefaultArguments(Isolate* isolate,
+ const FunctionSig* sig) {
+ size_t param_count = sig->parameter_count();
+ auto arguments = OwnedVector<Handle<Object>>::New(param_count);
+
+ for (size_t i = 0; i < param_count; ++i) {
+ switch (sig->GetParam(i).kind()) {
+ case ValueType::kI32:
+ case ValueType::kF32:
+ case ValueType::kF64:
case ValueType::kS128:
+ // Argument here for kS128 does not matter as we should error out before
+ // hitting this case.
+ arguments[i] = handle(Smi::zero(), isolate);
+ break;
+ case ValueType::kI64:
+ arguments[i] = BigInt::FromInt64(isolate, 0);
+ break;
+ case ValueType::kOptRef:
+ arguments[i] = isolate->factory()->null_value();
+ break;
+ case ValueType::kRef:
+ case ValueType::kRtt:
+ case ValueType::kI8:
+ case ValueType::kI16:
+ case ValueType::kStmt:
+ case ValueType::kBottom:
UNREACHABLE();
}
}
@@ -200,6 +235,9 @@ int32_t CallWasmFunctionForTesting(Isolate* isolate,
if (result->IsHeapNumber()) {
return static_cast<int32_t>(HeapNumber::cast(*result).value());
}
+ if (result->IsBigInt()) {
+ return static_cast<int32_t>(BigInt::cast(*result).AsInt64());
+ }
return -1;
}
diff --git a/deps/v8/test/common/wasm/wasm-module-runner.h b/deps/v8/test/common/wasm/wasm-module-runner.h
index 8b5657d89d..cf1f74756c 100644
--- a/deps/v8/test/common/wasm/wasm-module-runner.h
+++ b/deps/v8/test/common/wasm/wasm-module-runner.h
@@ -99,9 +99,17 @@ WasmInterpretationResult InterpretWasmModule(
Isolate* isolate, Handle<WasmInstanceObject> instance,
int32_t function_index, WasmValue* args);
-// Generate an array of default arguments for the given signature.
-std::unique_ptr<WasmValue[]> MakeDefaultArguments(Isolate* isolate,
- const FunctionSig* sig);
+// Generate an array of default arguments for the given signature, to be used in
+// the interpreter.
+OwnedVector<WasmValue> MakeDefaultInterpreterArguments(Isolate* isolate,
+ const FunctionSig* sig);
+
+// Generate an array of default arguments for the given signature, to be used
+// when calling compiled code. Make sure that the arguments match the ones
+// returned by {MakeDefaultInterpreterArguments}, otherwise fuzzers will report
+// differences between interpreter and compiled code.
+OwnedVector<Handle<Object>> MakeDefaultArguments(Isolate* isolate,
+ const FunctionSig* sig);
// Install function map, module symbol for testing
void SetupIsolateForWasmModule(Isolate* isolate);
diff --git a/deps/v8/test/debugger/debugger.status b/deps/v8/test/debugger/debugger.status
index 417a2af8e8..434d46cc9c 100644
--- a/deps/v8/test/debugger/debugger.status
+++ b/deps/v8/test/debugger/debugger.status
@@ -136,11 +136,11 @@
}], # lite_mode or variant == jitless
##############################################################################
-['variant == turboprop or variant == nci or variant == nci_as_highest_tier', {
+['variant == turboprop or variant == nci or variant == nci_as_midtier', {
# Deopts differently than TurboFan.
'debug/debug-optimize': [SKIP],
'debug/debug-compile-optimized': [SKIP],
-}], # variant == turboprop or variant == nci or variant == nci_as_highest_tier
+}], # variant == turboprop or variant == nci or variant == nci_as_midtier
##############################################################################
# Liftoff needs to be enabled before running these tests.
diff --git a/deps/v8/test/fuzzer/fuzzer-support.cc b/deps/v8/test/fuzzer/fuzzer-support.cc
index 6235ea5f82..06294b9f7e 100644
--- a/deps/v8/test/fuzzer/fuzzer-support.cc
+++ b/deps/v8/test/fuzzer/fuzzer-support.cc
@@ -9,8 +9,8 @@
#include <string.h>
#include "include/libplatform/libplatform.h"
-
#include "src/flags/flags.h"
+#include "src/trap-handler/trap-handler.h"
namespace v8_fuzzer {
@@ -61,6 +61,12 @@ std::unique_ptr<FuzzerSupport> FuzzerSupport::fuzzer_support_;
// static
void FuzzerSupport::InitializeFuzzerSupport(int* argc, char*** argv) {
+ if (V8_TRAP_HANDLER_SUPPORTED && i::FLAG_wasm_trap_handler) {
+ constexpr bool kUseDefaultTrapHandler = true;
+ if (!v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultTrapHandler)) {
+ FATAL("Could not register trap handler");
+ }
+ }
DCHECK_NULL(FuzzerSupport::fuzzer_support_);
FuzzerSupport::fuzzer_support_ =
std::make_unique<v8_fuzzer::FuzzerSupport>(argc, argv);
diff --git a/deps/v8/test/fuzzer/wasm-async.cc b/deps/v8/test/fuzzer/wasm-async.cc
index 3e121298e0..5afe483136 100644
--- a/deps/v8/test/fuzzer/wasm-async.cc
+++ b/deps/v8/test/fuzzer/wasm-async.cc
@@ -45,6 +45,14 @@ class AsyncFuzzerResolver : public i::wasm::CompilationResultResolver {
};
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ // We explicitly enable staged WebAssembly features here to increase fuzzer
+ // coverage. For libfuzzer fuzzers it is not possible that the fuzzer enables
+ // the flag by itself.
+#define ENABLE_STAGED_FEATURES(feat, desc, val) \
+ i::FlagScope<bool> enable_##feat(&i::FLAG_experimental_wasm_##feat, true);
+ FOREACH_WASM_STAGING_FEATURE_FLAG(ENABLE_STAGED_FEATURES)
+#undef ENABLE_STAGED_FEATURES
+
FlagScope<bool> turn_on_async_compile(
&v8::internal::FLAG_wasm_async_compilation, true);
FlagScope<uint32_t> max_mem_flag_scope(&v8::internal::FLAG_wasm_max_mem_pages,
diff --git a/deps/v8/test/fuzzer/wasm-compile.cc b/deps/v8/test/fuzzer/wasm-compile.cc
index 84f7bd4c0f..8cace3230e 100644
--- a/deps/v8/test/fuzzer/wasm-compile.cc
+++ b/deps/v8/test/fuzzer/wasm-compile.cc
@@ -274,13 +274,13 @@ class WasmGenerator {
case kExprI64AtomicXor:
case kExprI64AtomicExchange:
case kExprI64AtomicCompareExchange:
- case kExprI16x8Load8x8S:
- case kExprI16x8Load8x8U:
- case kExprI32x4Load16x4S:
- case kExprI32x4Load16x4U:
- case kExprI64x2Load32x2S:
- case kExprI64x2Load32x2U:
- case kExprS64x2LoadSplat:
+ case kExprS128Load8x8S:
+ case kExprS128Load8x8U:
+ case kExprS128Load16x4S:
+ case kExprS128Load16x4U:
+ case kExprS128Load32x2S:
+ case kExprS128Load32x2U:
+ case kExprS128Load64Splat:
return 3;
case kExprI32LoadMem:
case kExprI64LoadMem32S:
@@ -307,7 +307,7 @@ class WasmGenerator {
case kExprI64AtomicXor32U:
case kExprI64AtomicExchange32U:
case kExprI64AtomicCompareExchange32U:
- case kExprS32x4LoadSplat:
+ case kExprS128Load32Splat:
return 2;
case kExprI32LoadMem16S:
case kExprI32LoadMem16U:
@@ -333,7 +333,7 @@ class WasmGenerator {
case kExprI64AtomicXor16U:
case kExprI64AtomicExchange16U:
case kExprI64AtomicCompareExchange16U:
- case kExprS16x8LoadSplat:
+ case kExprS128Load16Splat:
return 1;
case kExprI32LoadMem8S:
case kExprI32LoadMem8U:
@@ -359,7 +359,7 @@ class WasmGenerator {
case kExprI64AtomicXor8U:
case kExprI64AtomicExchange8U:
case kExprI64AtomicCompareExchange8U:
- case kExprS8x16LoadSplat:
+ case kExprS128Load8Splat:
return 0;
default:
return 0;
@@ -418,7 +418,7 @@ class WasmGenerator {
void simd_shuffle(DataRange* data) {
Generate<ValueType::kS128, ValueType::kS128>(data);
- builder_->EmitWithPrefix(kExprS8x16Shuffle);
+ builder_->EmitWithPrefix(kExprI8x16Shuffle);
for (int i = 0; i < kSimd128Size; i++) {
builder_->EmitByte(static_cast<uint8_t>(data->get<byte>() % 32));
}
@@ -1443,6 +1443,14 @@ void WasmGenerator::Generate<ValueType::kS128>(DataRange* data) {
ValueType::kS128>,
&WasmGenerator::op_with_prefix<kExprF32x4Max, ValueType::kS128,
ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF32x4Pmin, ValueType::kS128,
+ ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF32x4Pmax, ValueType::kS128,
+ ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF32x4Ceil, ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF32x4Floor, ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF32x4Trunc, ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF32x4NearestInt, ValueType::kS128>,
&WasmGenerator::op_with_prefix<kExprF64x2Splat, ValueType::kF64>,
&WasmGenerator::op_with_prefix<kExprF64x2Eq, ValueType::kS128,
@@ -1472,6 +1480,14 @@ void WasmGenerator::Generate<ValueType::kS128>(DataRange* data) {
ValueType::kS128>,
&WasmGenerator::op_with_prefix<kExprF64x2Max, ValueType::kS128,
ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF64x2Pmin, ValueType::kS128,
+ ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF64x2Pmax, ValueType::kS128,
+ ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF64x2Ceil, ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF64x2Floor, ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF64x2Trunc, ValueType::kS128>,
+ &WasmGenerator::op_with_prefix<kExprF64x2NearestInt, ValueType::kS128>,
&WasmGenerator::op_with_prefix<kExprI32x4SConvertF32x4, ValueType::kS128>,
&WasmGenerator::op_with_prefix<kExprI32x4UConvertF32x4, ValueType::kS128>,
@@ -1517,20 +1533,20 @@ void WasmGenerator::Generate<ValueType::kS128>(DataRange* data) {
ValueType::kS128, ValueType::kS128>,
&WasmGenerator::simd_shuffle,
- &WasmGenerator::op_with_prefix<kExprS8x16Swizzle, ValueType::kS128,
+ &WasmGenerator::op_with_prefix<kExprI8x16Swizzle, ValueType::kS128,
ValueType::kS128>,
&WasmGenerator::memop<kExprS128LoadMem>,
- &WasmGenerator::memop<kExprI16x8Load8x8S>,
- &WasmGenerator::memop<kExprI16x8Load8x8U>,
- &WasmGenerator::memop<kExprI32x4Load16x4S>,
- &WasmGenerator::memop<kExprI32x4Load16x4U>,
- &WasmGenerator::memop<kExprI64x2Load32x2S>,
- &WasmGenerator::memop<kExprI64x2Load32x2U>,
- &WasmGenerator::memop<kExprS8x16LoadSplat>,
- &WasmGenerator::memop<kExprS16x8LoadSplat>,
- &WasmGenerator::memop<kExprS32x4LoadSplat>,
- &WasmGenerator::memop<kExprS64x2LoadSplat>};
+ &WasmGenerator::memop<kExprS128Load8x8S>,
+ &WasmGenerator::memop<kExprS128Load8x8U>,
+ &WasmGenerator::memop<kExprS128Load16x4S>,
+ &WasmGenerator::memop<kExprS128Load16x4U>,
+ &WasmGenerator::memop<kExprS128Load32x2S>,
+ &WasmGenerator::memop<kExprS128Load32x2U>,
+ &WasmGenerator::memop<kExprS128Load8Splat>,
+ &WasmGenerator::memop<kExprS128Load16Splat>,
+ &WasmGenerator::memop<kExprS128Load32Splat>,
+ &WasmGenerator::memop<kExprS128Load64Splat>};
GenerateOneOf(alternatives, data);
}
@@ -1726,7 +1742,6 @@ class WasmCompileFuzzer : public WasmExecutionFuzzer {
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
constexpr bool require_valid = true;
EXPERIMENTAL_FLAG_SCOPE(reftypes);
- EXPERIMENTAL_FLAG_SCOPE(return_call);
WasmCompileFuzzer().FuzzWasmModule({data, size}, require_valid);
return 0;
}
diff --git a/deps/v8/test/fuzzer/wasm-fuzzer-common.cc b/deps/v8/test/fuzzer/wasm-fuzzer-common.cc
index a5197010eb..3bc2ae5348 100644
--- a/deps/v8/test/fuzzer/wasm-fuzzer-common.cc
+++ b/deps/v8/test/fuzzer/wasm-fuzzer-common.cc
@@ -55,13 +55,14 @@ void InterpretAndExecuteModule(i::Isolate* isolate,
return;
}
- std::unique_ptr<WasmValue[]> arguments =
- testing::MakeDefaultArguments(isolate, main_function->sig());
+ OwnedVector<WasmValue> arguments =
+ testing::MakeDefaultInterpreterArguments(isolate, main_function->sig());
// Now interpret.
testing::WasmInterpretationResult interpreter_result =
- testing::InterpretWasmModule(
- isolate, instance, main_function->function_index(), arguments.get());
+ testing::InterpretWasmModule(isolate, instance,
+ main_function->function_index(),
+ arguments.begin());
if (interpreter_result.failed()) return;
// The WebAssembly spec allows the sign bit of NaN to be non-deterministic.
@@ -82,9 +83,13 @@ void InterpretAndExecuteModule(i::Isolate* isolate,
.ToHandle(&instance));
}
+ OwnedVector<Handle<Object>> compiled_args =
+ testing::MakeDefaultArguments(isolate, main_function->sig());
+
bool exception = false;
int32_t result_compiled = testing::CallWasmFunctionForTesting(
- isolate, instance, "main", 0, nullptr, &exception);
+ isolate, instance, "main", static_cast<int>(compiled_args.size()),
+ compiled_args.begin(), &exception);
if (interpreter_result.trapped() != exception) {
const char* exception_text[] = {"no exception", "exception"};
FATAL("interpreter: %s; compiled: %s",
@@ -118,6 +123,8 @@ const char* ValueTypeToConstantName(ValueType type) {
return "kWasmF32";
case ValueType::kF64:
return "kWasmF64";
+ case ValueType::kS128:
+ return "kWasmS128";
case ValueType::kOptRef:
switch (type.heap_representation()) {
case HeapType::kExtern:
@@ -265,9 +272,11 @@ void GenerateTestCase(Isolate* isolate, ModuleWireBytes wire_bytes,
for (size_t pos = 0, count = 1, locals = decls.type_list.size();
pos < locals; pos += count, count = 1) {
ValueType type = decls.type_list[pos];
- while (pos + count < locals && decls.type_list[pos + count] == type)
+ while (pos + count < locals && decls.type_list[pos + count] == type) {
++count;
- os << ".addLocals({" << type.name() << "_count: " << count << "})";
+ }
+ os << ".addLocals(" << ValueTypeToConstantName(type) << ", " << count
+ << ")";
}
os << "\n";
}
@@ -305,12 +314,6 @@ void WasmExecutionFuzzer::FuzzWasmModule(Vector<const uint8_t> data,
FlagScope<bool> enable_##feat(&FLAG_experimental_wasm_##feat, true);
FOREACH_WASM_STAGING_FEATURE_FLAG(ENABLE_STAGED_FEATURES)
#undef ENABLE_STAGED_FEATURES
- // SIMD is not included in staging yet, so we enable it here for fuzzing.
- EXPERIMENTAL_FLAG_SCOPE(simd);
- // TODO(v8:10308): Bitmask was merged into proposal after 84 cut, so it was
- // left gated by this flag. In order to fuzz it, we need this flag. This
- // should be removed once we move bitmask out of post mvp.
- FLAG_SCOPE(wasm_simd_post_mvp);
// Strictly enforce the input size limit. Note that setting "max_len" on the
// fuzzer target is not enough, since different fuzzers are used and not all
diff --git a/deps/v8/test/fuzzer/wasm.cc b/deps/v8/test/fuzzer/wasm.cc
index 1230a7d46d..aaa958c4d5 100644
--- a/deps/v8/test/fuzzer/wasm.cc
+++ b/deps/v8/test/fuzzer/wasm.cc
@@ -32,8 +32,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// We reduce the maximum memory size and table size of WebAssembly instances
// to avoid OOMs in the fuzzer.
i::FlagScope<uint32_t> max_mem_flag_scope(&i::FLAG_wasm_max_mem_pages, 32);
- i::FlagScope<uint32_t> max_mem_growth_flag_scope(
- &i::FLAG_wasm_max_mem_pages_growth, 32);
i::FlagScope<uint32_t> max_table_size_scope(&i::FLAG_wasm_max_table_size,
100);
v8_fuzzer::FuzzerSupport* support = v8_fuzzer::FuzzerSupport::Get();
diff --git a/deps/v8/test/fuzzer/wasm/regress-1127717.wasm b/deps/v8/test/fuzzer/wasm/regress-1127717.wasm
new file mode 100644
index 0000000000..61673ea8f1
--- /dev/null
+++ b/deps/v8/test/fuzzer/wasm/regress-1127717.wasm
Binary files differ
diff --git a/deps/v8/test/fuzzilli/libreprl.c b/deps/v8/test/fuzzilli/libreprl.c
index 5201023a7a..4483d44a8c 100644
--- a/deps/v8/test/fuzzilli/libreprl.c
+++ b/deps/v8/test/fuzzilli/libreprl.c
@@ -15,14 +15,19 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
#include <errno.h>
#include <fcntl.h>
-#include <inttypes.h>
#include <poll.h>
#include <signal.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/mman.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -31,14 +36,13 @@
#include "libreprl.h"
-// Well-known file descriptor numbers for fuzzer <-> fuzzee communication on child process side.
-#define CRFD 100
-#define CWFD 101
-#define DRFD 102
-#define DWFD 103
+// Well-known file descriptor numbers for reprl <-> child communication, child process side
+#define REPRL_CHILD_CTRL_IN 100
+#define REPRL_CHILD_CTRL_OUT 101
+#define REPRL_CHILD_DATA_IN 102
+#define REPRL_CHILD_DATA_OUT 103
-#define CHECK_SUCCESS(cond) if((cond) < 0) { perror(#cond); abort(); }
-#define CHECK(cond) if(!(cond)) { fprintf(stderr, "(" #cond ") failed!"); abort(); }
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
static uint64_t current_millis()
{
@@ -47,173 +51,430 @@ static uint64_t current_millis()
return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}
-int reprl_spawn_child(char** argv, char** envp, struct reprl_child_process* child)
+static char** copy_string_array(const char** orig)
{
- // We need to make sure that our fds don't end up being 100 - 104.
- if (fcntl(CRFD, F_GETFD) == -1) {
- int devnull = open("/dev/null", O_RDWR);
- dup2(devnull, CRFD);
- dup2(devnull, CWFD);
- dup2(devnull, DRFD);
- dup2(devnull, DWFD);
- close(devnull);
+ size_t num_entries = 0;
+ for (const char** current = orig; *current; current++) {
+ num_entries += 1;
+ }
+ char** copy = calloc(num_entries + 1, sizeof(char*));
+ for (size_t i = 0; i < num_entries; i++) {
+ copy[i] = strdup(orig[i]);
}
+ return copy;
+}
- int crpipe[2] = { 0, 0 }; // control channel child -> fuzzer
- int cwpipe[2] = { 0, 0 }; // control channel fuzzer -> child
- int drpipe[2] = { 0, 0 }; // data channel child -> fuzzer
- int dwpipe[2] = { 0, 0 }; // data channel fuzzer -> child
-
- int res = 0;
- res |= pipe(crpipe);
- res |= pipe(cwpipe);
- res |= pipe(drpipe);
- res |= pipe(dwpipe);
- if (res != 0) {
- if (crpipe[0] != 0) { close(crpipe[0]); close(crpipe[1]); }
- if (cwpipe[0] != 0) { close(cwpipe[0]); close(cwpipe[1]); }
- if (drpipe[0] != 0) { close(drpipe[0]); close(drpipe[1]); }
- if (dwpipe[0] != 0) { close(dwpipe[0]); close(dwpipe[1]); }
- fprintf(stderr, "[REPRL] Could not setup pipes for communication with child: %s\n", strerror(errno));
- return -1;
+static void free_string_array(char** arr)
+{
+ if (!arr) return;
+ for (char** current = arr; *current; current++) {
+ free(*current);
+ }
+ free(arr);
+}
+
+// A unidirectional communication channel for larger amounts of data, up to a maximum size (REPRL_MAX_DATA_SIZE).
+// Implemented as a (RAM-backed) file for which the file descriptor is shared with the child process and which is mapped into our address space.
+struct data_channel {
+ // File descriptor of the underlying file. Directly shared with the child process.
+ int fd;
+ // Memory mapping of the file, always of size REPRL_MAX_DATA_SIZE.
+ char* mapping;
+};
+
+struct reprl_context {
+ // Whether reprl_initialize has been successfully performed on this context.
+ int initialized;
+
+ // Read file descriptor of the control pipe. Only valid if a child process is running (i.e. pid is nonzero).
+ int ctrl_in;
+ // Write file descriptor of the control pipe. Only valid if a child process is running (i.e. pid is nonzero).
+ int ctrl_out;
+
+ // Data channel REPRL -> Child
+ struct data_channel* data_in;
+ // Data channel Child -> REPRL
+ struct data_channel* data_out;
+
+ // Optional data channel for the child's stdout and stderr.
+ struct data_channel* stdout;
+ struct data_channel* stderr;
+
+ // PID of the child process. Will be zero if no child process is currently running.
+ int pid;
+
+ // Arguments and environment for the child process.
+ char** argv;
+ char** envp;
+
+ // A malloc'd string containing a description of the last error that occurred.
+ char* last_error;
+};
+
+static int reprl_error(struct reprl_context* ctx, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ free(ctx->last_error);
+ vasprintf(&ctx->last_error, format, args);
+ return -1;
+}
+
+static struct data_channel* reprl_create_data_channel(struct reprl_context* ctx)
+{
+#ifdef __linux__
+ int fd = memfd_create("REPRL_DATA_CHANNEL", MFD_CLOEXEC);
+#else
+ char path[] = "/tmp/reprl_data_channel_XXXXXXXX";
+ if (mktemp(path) < 0) {
+ reprl_error(ctx, "Failed to create temporary filename for data channel: %s", strerror(errno));
+ return NULL;
+ }
+ int fd = open(path, O_RDWR | O_CREAT| O_CLOEXEC);
+ unlink(path);
+#endif
+ if (fd == -1 || ftruncate(fd, REPRL_MAX_DATA_SIZE) != 0) {
+ reprl_error(ctx, "Failed to create data channel file: %s", strerror(errno));
+ return NULL;
+ }
+ char* mapping = mmap(0, REPRL_MAX_DATA_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (mapping == MAP_FAILED) {
+ reprl_error(ctx, "Failed to mmap data channel file: %s", strerror(errno));
+ return NULL;
}
- child->crfd = crpipe[0];
- child->cwfd = cwpipe[1];
- child->drfd = drpipe[0];
- child->dwfd = dwpipe[1];
+ struct data_channel* channel = malloc(sizeof(struct data_channel));
+ channel->fd = fd;
+ channel->mapping = mapping;
+ return channel;
+}
+
+static void reprl_destroy_data_channel(struct reprl_context* ctx, struct data_channel* channel)
+{
+ if (!channel) return;
+ close(channel->fd);
+ munmap(channel->mapping, REPRL_MAX_DATA_SIZE);
+ free(channel);
+}
- int flags;
- flags = fcntl(child->drfd, F_GETFL, 0);
- fcntl(child->drfd, F_SETFL, flags | O_NONBLOCK);
+static void reprl_child_terminated(struct reprl_context* ctx)
+{
+ if (!ctx->pid) return;
+ ctx->pid = 0;
+ close(ctx->ctrl_in);
+ close(ctx->ctrl_out);
+}
- fcntl(child->crfd, F_SETFD, FD_CLOEXEC);
- fcntl(child->cwfd, F_SETFD, FD_CLOEXEC);
- fcntl(child->drfd, F_SETFD, FD_CLOEXEC);
- fcntl(child->dwfd, F_SETFD, FD_CLOEXEC);
+static void reprl_terminate_child(struct reprl_context* ctx)
+{
+ if (!ctx->pid) return;
+ int status;
+ kill(ctx->pid, SIGKILL);
+ waitpid(ctx->pid, &status, 0);
+ reprl_child_terminated(ctx);
+}
+
+static int reprl_spawn_child(struct reprl_context* ctx)
+{
+ // This is also a good time to ensure the data channel backing files don't grow too large.
+ ftruncate(ctx->data_in->fd, REPRL_MAX_DATA_SIZE);
+ ftruncate(ctx->data_out->fd, REPRL_MAX_DATA_SIZE);
+ if (ctx->stdout) ftruncate(ctx->stdout->fd, REPRL_MAX_DATA_SIZE);
+ if (ctx->stderr) ftruncate(ctx->stderr->fd, REPRL_MAX_DATA_SIZE);
+
+ int crpipe[2] = { 0, 0 }; // control pipe child -> reprl
+ int cwpipe[2] = { 0, 0 }; // control pipe reprl -> child
+
+ if (pipe(crpipe) != 0) {
+ return reprl_error(ctx, "Could not create pipe for REPRL communication: %s", strerror(errno));
+ }
+ if (pipe(cwpipe) != 0) {
+ close(crpipe[0]);
+ close(crpipe[1]);
+ return reprl_error(ctx, "Could not create pipe for REPRL communication: %s", strerror(errno));
+ }
+
+ ctx->ctrl_in = crpipe[0];
+ ctx->ctrl_out = cwpipe[1];
+ fcntl(ctx->ctrl_in, F_SETFD, FD_CLOEXEC);
+ fcntl(ctx->ctrl_out, F_SETFD, FD_CLOEXEC);
int pid = fork();
if (pid == 0) {
- dup2(cwpipe[0], CRFD);
- dup2(crpipe[1], CWFD);
- dup2(dwpipe[0], DRFD);
- dup2(drpipe[1], DWFD);
+ dup2(cwpipe[0], REPRL_CHILD_CTRL_IN);
+ dup2(crpipe[1], REPRL_CHILD_CTRL_OUT);
close(cwpipe[0]);
close(crpipe[1]);
- close(dwpipe[0]);
- close(drpipe[1]);
+
+ dup2(ctx->data_out->fd, REPRL_CHILD_DATA_IN);
+ dup2(ctx->data_in->fd, REPRL_CHILD_DATA_OUT);
int devnull = open("/dev/null", O_RDWR);
dup2(devnull, 0);
- dup2(devnull, 1);
- dup2(devnull, 2);
+ if (ctx->stdout) dup2(ctx->stdout->fd, 1);
+ else dup2(devnull, 1);
+ if (ctx->stderr) dup2(ctx->stderr->fd, 2);
+ else dup2(devnull, 2);
close(devnull);
- execve(argv[0], argv, envp);
- fprintf(stderr, "[REPRL] Failed to spawn child process\n");
+ // close all other FDs. We try to use FD_CLOEXEC everywhere, but let's be extra sure we don't leak any fds to the child.
+ int tablesize = getdtablesize();
+ for (int i = 3; i < tablesize; i++) {
+ if (i == REPRL_CHILD_CTRL_IN || i == REPRL_CHILD_CTRL_OUT || i == REPRL_CHILD_DATA_IN || i == REPRL_CHILD_DATA_OUT) {
+ continue;
+ }
+ close(i);
+ }
+
+ execve(ctx->argv[0], ctx->argv, ctx->envp);
+
+ fprintf(stderr, "Failed to execute child process %s: %s\n", ctx->argv[0], strerror(errno));
+ fflush(stderr);
_exit(-1);
- } else if (pid < 0) {
- fprintf(stderr, "[REPRL] Failed to fork\n");
- return -1;
}
close(crpipe[1]);
close(cwpipe[0]);
- close(drpipe[1]);
- close(dwpipe[0]);
-
- child->pid = pid;
-
- int helo;
- if (read(child->crfd, &helo, 4) != 4 || write(child->cwfd, &helo, 4) != 4) {
- fprintf(stderr, "[REPRL] Failed to communicate with child process\n");
- close(child->crfd);
- close(child->cwfd);
- close(child->drfd);
- close(child->dwfd);
- int status;
- kill(pid, SIGKILL);
- waitpid(pid, &status, 0);
- return -1;
+
+ if (pid < 0) {
+ close(ctx->ctrl_in);
+ close(ctx->ctrl_out);
+ return reprl_error(ctx, "Failed to fork: %s", strerror(errno));
+ }
+ ctx->pid = pid;
+
+ char helo[4] = { 0 };
+ if (read(ctx->ctrl_in, helo, 4) != 4) {
+ reprl_terminate_child(ctx);
+ return reprl_error(ctx, "Did not receive HELO message from child");
+ }
+
+ if (strncmp(helo, "HELO", 4) != 0) {
+ reprl_terminate_child(ctx);
+ return reprl_error(ctx, "Received invalid HELO message from child");
+ }
+
+ if (write(ctx->ctrl_out, helo, 4) != 4) {
+ reprl_terminate_child(ctx);
+ return reprl_error(ctx, "Failed to send HELO reply message to child");
}
return 0;
}
-static char* fetch_output(int fd, size_t* outsize)
+struct reprl_context* reprl_create_context()
{
- ssize_t rv;
- *outsize = 0;
- size_t remaining = 0x1000;
- char* outbuf = malloc(remaining + 1);
+ struct reprl_context* ctx = malloc(sizeof(struct reprl_context));
+ memset(ctx, 0, sizeof(struct reprl_context));
+ return ctx;
+}
- do {
- rv = read(fd, outbuf + *outsize, remaining);
- if (rv == -1) {
- if (errno != EAGAIN && errno != EWOULDBLOCK) {
- fprintf(stderr, "[REPRL] Error while receiving data: %s\n", strerror(errno));
- }
- break;
- }
+int reprl_initialize_context(struct reprl_context* ctx, const char** argv, const char** envp, int capture_stdout, int capture_stderr)
+{
+ if (ctx->initialized) {
+ return reprl_error(ctx, "Context is already initialized");
+ }
- *outsize += rv;
- remaining -= rv;
+ // We need to ignore SIGPIPE since we could end up writing to a pipe after our child process has exited.
+ signal(SIGPIPE, SIG_IGN);
- if (remaining == 0) {
- remaining = *outsize;
- outbuf = realloc(outbuf, *outsize * 2 + 1);
- if (!outbuf) {
- fprintf(stderr, "[REPRL] Could not allocate output buffer");
- _exit(-1);
- }
- }
- } while (rv > 0);
+ ctx->argv = copy_string_array(argv);
+ ctx->envp = copy_string_array(envp);
- outbuf[*outsize] = 0;
+ ctx->data_in = reprl_create_data_channel(ctx);
+ ctx->data_out = reprl_create_data_channel(ctx);
+ if (capture_stdout) {
+ ctx->stdout = reprl_create_data_channel(ctx);
+ }
+ if (capture_stderr) {
+ ctx->stderr = reprl_create_data_channel(ctx);
+ }
+ if (!ctx->data_in || !ctx->data_out || (capture_stdout && !ctx->stdout) || (capture_stderr && !ctx->stderr)) {
+ // Proper error message will have been set by reprl_create_data_channel
+ return -1;
+ }
- return outbuf;
+ ctx->initialized = 1;
+ return 0;
}
-// Execute one script, wait for its completion, and return the result.
-int reprl_execute_script(int pid, int crfd, int cwfd, int drfd, int dwfd, int timeout, const char* script, int64_t script_length, struct reprl_result* result)
+void reprl_destroy_context(struct reprl_context* ctx)
{
- uint64_t start_time = current_millis();
+ reprl_terminate_child(ctx);
- if (write(cwfd, "exec", 4) != 4 ||
- write(cwfd, &script_length, 8) != 8) {
- fprintf(stderr, "[REPRL] Failed to send command to child process\n");
- return -1;
+ free_string_array(ctx->argv);
+ free_string_array(ctx->envp);
+
+ reprl_destroy_data_channel(ctx, ctx->data_in);
+ reprl_destroy_data_channel(ctx, ctx->data_out);
+ reprl_destroy_data_channel(ctx, ctx->stdout);
+ reprl_destroy_data_channel(ctx, ctx->stderr);
+
+ free(ctx->last_error);
+ free(ctx);
+}
+
+int reprl_execute(struct reprl_context* ctx, const char* script, uint64_t script_length, uint64_t timeout, uint64_t* execution_time, int fresh_instance)
+{
+ if (!ctx->initialized) {
+ return reprl_error(ctx, "REPRL context is not initialized");
+ }
+ if (script_length > REPRL_MAX_DATA_SIZE) {
+ return reprl_error(ctx, "Script too large");
}
- int64_t remaining = script_length;
- while (remaining > 0) {
- ssize_t rv = write(dwfd, script, remaining);
- if (rv <= 0) {
- fprintf(stderr, "[REPRL] Failed to send script to child process\n");
- return -1;
+ // Terminate any existing instance if requested.
+ if (fresh_instance && ctx->pid) {
+ reprl_terminate_child(ctx);
+ }
+
+ // Reset file position so the child can simply read(2) and write(2) to these fds.
+ lseek(ctx->data_out->fd, 0, SEEK_SET);
+ lseek(ctx->data_in->fd, 0, SEEK_SET);
+ if (ctx->stdout) {
+ lseek(ctx->stdout->fd, 0, SEEK_SET);
+ }
+ if (ctx->stderr) {
+ lseek(ctx->stderr->fd, 0, SEEK_SET);
+ }
+
+ // Spawn a new instance if necessary.
+ if (!ctx->pid) {
+ int r = reprl_spawn_child(ctx);
+ if (r != 0) return r;
+ }
+
+ // Copy the script to the data channel.
+ memcpy(ctx->data_out->mapping, script, script_length);
+
+ // Tell child to execute the script.
+ if (write(ctx->ctrl_out, "exec", 4) != 4 ||
+ write(ctx->ctrl_out, &script_length, 8) != 8) {
+ // These can fail if the child unexpectedly terminated between executions.
+ // Check for that here to be able to provide a better error message.
+ int status;
+ if (waitpid(ctx->pid, &status, WNOHANG) == ctx->pid) {
+ reprl_child_terminated(ctx);
+ if (WIFEXITED(status)) {
+ return reprl_error(ctx, "Child unexpectedly exited with status %i between executions", WEXITSTATUS(status));
+ } else {
+ return reprl_error(ctx, "Child unexpectedly terminated with signal %i between executions", WTERMSIG(status));
+ }
}
- remaining -= rv;
- script += rv;
- }
-
- struct pollfd fds = {.fd = crfd, .events = POLLIN, .revents = 0};
- if (poll(&fds, 1, timeout) != 1) {
- kill(pid, SIGKILL);
- waitpid(pid, &result->status, 0);
- result->child_died = 1;
- } else {
- result->child_died = 0;
- ssize_t rv = read(crfd, &result->status, 4);
- if (rv != 4) {
- // This should not happen...
- kill(pid, SIGKILL);
- waitpid(pid, &result->status, 0);
- result->child_died = 1;
+ return reprl_error(ctx, "Failed to send command to child process: %s", strerror(errno));
+ }
+
+ // Wait for child to finish execution (or crash).
+ uint64_t start_time = current_millis();
+ struct pollfd fds = {.fd = ctx->ctrl_in, .events = POLLIN, .revents = 0};
+ int res = poll(&fds, 1, (int)timeout);
+ *execution_time = current_millis() - start_time;
+ if (res == 0) {
+ // Execution timed out. Kill child and return a timeout status.
+ reprl_terminate_child(ctx);
+ return 1 << 16;
+ } else if (res != 1) {
+ // An error occurred.
+ // We expect all signal handlers to be installed with SA_RESTART, so receiving EINTR here is unexpected and thus also an error.
+ return reprl_error(ctx, "Failed to poll: %s", strerror(errno));
+ }
+
+ // Poll succeeded, so there must be something to read now (either the status or EOF).
+ int status;
+ ssize_t rv = read(ctx->ctrl_in, &status, 4);
+ if (rv < 0) {
+ return reprl_error(ctx, "Failed to read from control pipe: %s", strerror(errno));
+ } else if (rv != 4) {
+ // Most likely, the child process crashed and closed the write end of the control pipe.
+ // Unfortunately, there probably is nothing that guarantees that waitpid() will immediately succeed now,
+ // and we also don't want to block here. So just retry waitpid() a few times...
+ int success = 0;
+ do {
+ success = waitpid(ctx->pid, &status, WNOHANG) == ctx->pid;
+ if (!success) usleep(10);
+ } while (!success && current_millis() - start_time < timeout);
+
+ if (!success) {
+ // Wait failed, so something weird must have happened. Maybe somehow the control pipe was closed without the child exiting?
+ // Probably the best we can do is kill the child and return an error.
+ reprl_terminate_child(ctx);
+ return reprl_error(ctx, "Child in weird state after execution");
+ }
+
+ // Cleanup any state related to this child process.
+ reprl_child_terminated(ctx);
+
+ if (WIFEXITED(status)) {
+ status = WEXITSTATUS(status) << 8;
+ } else if (WIFSIGNALED(status)) {
+ status = WTERMSIG(status);
+ } else {
+ // This shouldn't happen, since we don't specify WUNTRACED for waitpid...
+ return reprl_error(ctx, "Waitpid returned unexpected child state %i", status);
}
}
- result->output = fetch_output(drfd, &result->output_size);
- result->exec_time = current_millis() - start_time;
+ // The status must be a positive number, see the status encoding format below.
+ // We also don't allow the child process to indicate a timeout. If we wanted,
+ // we could treat it as an error if the upper bits are set.
+ status &= 0xffff;
- return 0;
+ return status;
+}
+
+/// The 32bit REPRL exit status as returned by reprl_execute has the following format:
+/// [ 00000000 | did_timeout | exit_code | terminating_signal ]
+/// Only one of did_timeout, exit_code, or terminating_signal may be set at one time.
+int RIFSIGNALED(int status)
+{
+ return (status & 0xff) != 0;
+}
+
+int RIFEXITED(int status)
+{
+ return !RIFSIGNALED(status) && !RIFTIMEDOUT(status);
+}
+
+int RIFTIMEDOUT(int status)
+{
+ return (status & 0xff0000) != 0;
+}
+
+int RTERMSIG(int status)
+{
+ return status & 0xff;
+}
+
+int REXITSTATUS(int status)
+{
+ return (status >> 8) & 0xff;
+}
+
+static const char* fetch_data_channel_content(struct data_channel* channel)
+{
+ if (!channel) return "";
+ size_t pos = lseek(channel->fd, 0, SEEK_CUR);
+ pos = MIN(pos, REPRL_MAX_DATA_SIZE - 1);
+ channel->mapping[pos] = 0;
+ return channel->mapping;
+}
+
+const char* reprl_fetch_fuzzout(struct reprl_context* ctx)
+{
+ return fetch_data_channel_content(ctx->data_in);
+}
+
+const char* reprl_fetch_stdout(struct reprl_context* ctx)
+{
+ return fetch_data_channel_content(ctx->stdout);
+}
+
+const char* reprl_fetch_stderr(struct reprl_context* ctx)
+{
+ return fetch_data_channel_content(ctx->stderr);
+}
+
+const char* reprl_get_last_error(struct reprl_context* ctx)
+{
+ return ctx->last_error;
}
diff --git a/deps/v8/test/fuzzilli/libreprl.h b/deps/v8/test/fuzzilli/libreprl.h
index 5eee493e20..1b9cc062dd 100644
--- a/deps/v8/test/fuzzilli/libreprl.h
+++ b/deps/v8/test/fuzzilli/libreprl.h
@@ -18,37 +18,100 @@
#ifndef __LIBREPRL_H__
#define __LIBREPRL_H__
+#include <stdint.h>
#include <sys/types.h>
-struct reprl_child_process {
- // Read file descriptor of the control pipe.
- int crfd;
- // Write file descriptor of the control pipe.
- int cwfd;
- // Read file descriptor of the data pipe.
- int drfd;
- // Write file descriptor of the data pipe.
- int dwfd;
- // PID of the child process.
- int pid;
-};
-
-struct reprl_result {
- int child_died;
- int status;
- unsigned long exec_time;
- char* output;
- size_t output_size;
-};
-
-// Spawn a child process implementing the REPRL protocol.
-int reprl_spawn_child(char** argv, char** envp,
- struct reprl_child_process* child);
-
-// Execute the provided script in the child process, wait for its completion,
-// and return the result.
-int reprl_execute_script(int pid, int crfd, int cwfd, int drfd, int dwfd,
- int timeout, const char* script, int64_t script_length,
- struct reprl_result* result);
+/// Maximum size for data transferred through REPRL. In particular, this is the
+/// maximum size of scripts that can be executed. Currently, this is 16MB.
+/// Executing a 16MB script file is very likely to take longer than the typical
+/// timeout, so the limit on script size shouldn't be a problem in practice.
+#define REPRL_MAX_DATA_SIZE (16 << 20)
+
+/// Opaque struct representing a REPRL execution context.
+struct reprl_context;
+
+/// Allocates a new REPRL context.
+/// @return an uninitialzed REPRL context
+struct reprl_context* reprl_create_context();
+
+/// Initializes a REPRL context.
+/// @param ctx An uninitialized context
+/// @param argv The argv vector for the child processes
+/// @param envp The envp vector for the child processes
+/// @param capture_stdout Whether this REPRL context should capture the child's
+/// stdout
+/// @param capture_stderr Whether this REPRL context should capture the child's
+/// stderr
+/// @return zero in case of no errors, otherwise a negative value
+int reprl_initialize_context(struct reprl_context* ctx, const char** argv,
+ const char** envp, int capture_stdout,
+ int capture_stderr);
+
+/// Destroys a REPRL context, freeing all resources held by it.
+/// @param ctx The context to destroy
+void reprl_destroy_context(struct reprl_context* ctx);
+
+/// Executes the provided script in the target process, wait for its completion,
+/// and return the result. If necessary, or if fresh_instance is true, this will
+/// automatically spawn a new instance of the target process.
+///
+/// @param ctx The REPRL context
+/// @param script The script to execute
+/// @param script_length The size of the script in bytes
+/// @param timeout The maximum allowed execution time in milliseconds
+/// @param execution_time A pointer to which, if execution succeeds, the
+/// execution time in milliseconds is written to
+/// @param fresh_instance if true, forces the creation of a new instance of the
+/// target
+/// @return A REPRL exit status (see below) or a negative number in case of an
+/// error
+int reprl_execute(struct reprl_context* ctx, const char* script,
+ uint64_t script_length, uint64_t timeout,
+ uint64_t* execution_time, int fresh_instance);
+
+/// Returns true if the execution terminated due to a signal.
+int RIFSIGNALED(int status);
+
+/// Returns true if the execution finished normally.
+int RIFEXITED(int status);
+
+/// Returns true if the execution terminated due to a timeout.
+int RIFTIMEDOUT(int status);
+
+/// Returns the terminating signal in case RIFSIGNALED is true.
+int RTERMSIG(int status);
+
+/// Returns the exit status in case RIFEXITED is true.
+int REXITSTATUS(int status);
+
+/// Returns the stdout data of the last successful execution if the context is
+/// capturing stdout, otherwise an empty string. The output is limited to
+/// REPRL_MAX_FAST_IO_SIZE (currently 16MB).
+/// @param ctx The REPRL context
+/// @return A string pointer which is owned by the REPRL context and thus should
+/// not be freed by the caller
+const char* reprl_fetch_stdout(struct reprl_context* ctx);
+
+/// Returns the stderr data of the last successful execution if the context is
+/// capturing stderr, otherwise an empty string. The output is limited to
+/// REPRL_MAX_FAST_IO_SIZE (currently 16MB).
+/// @param ctx The REPRL context
+/// @return A string pointer which is owned by the REPRL context and thus should
+/// not be freed by the caller
+const char* reprl_fetch_stderr(struct reprl_context* ctx);
+
+/// Returns the fuzzout data of the last successful execution.
+/// The output is limited to REPRL_MAX_FAST_IO_SIZE (currently 16MB).
+/// @param ctx The REPRL context
+/// @return A string pointer which is owned by the REPRL context and thus should
+/// not be freed by the caller
+const char* reprl_fetch_fuzzout(struct reprl_context* ctx);
+
+/// Returns a string describing the last error that occurred in the given
+/// context.
+/// @param ctx The REPRL context
+/// @return A string pointer which is owned by the REPRL context and thus should
+/// not be freed by the caller
+const char* reprl_get_last_error(struct reprl_context* ctx);
#endif
diff --git a/deps/v8/test/fuzzilli/main.cc b/deps/v8/test/fuzzilli/main.cc
index da3986b6fb..8af9788d63 100644
--- a/deps/v8/test/fuzzilli/main.cc
+++ b/deps/v8/test/fuzzilli/main.cc
@@ -3,16 +3,58 @@
// found in the LICENSE file.
extern "C" {
+
+#include <stdio.h>
+#include <string.h>
+
#include "libreprl.h"
-}
-int main() {
- struct reprl_child_process child;
- char* env[] = {nullptr};
- char prog[] = "./out.gn/x64.debug/d8";
- char*(argv[]) = {prog, nullptr};
- if (reprl_spawn_child(argv, env, &child) == -1) return -1;
- // struct reprl_result res;
- // reprl_execute_script(child.pid, child.crfd, child.cwfd, child.drfd,
- // child.dwfd, 1, ,,&res);
+
+int main(int argc, char** argv) {
+ struct reprl_context* ctx = reprl_create_context();
+
+ const char* env[] = {nullptr};
+ const char* prog = argc > 1 ? argv[1] : "./out.gn/x64.debug/d8";
+ const char* args[] = {prog, nullptr};
+ if (reprl_initialize_context(ctx, args, env, 1, 1) != 0) {
+ printf("REPRL initialization failed\n");
+ return -1;
+ }
+
+ uint64_t exec_time;
+
+ // Basic functionality test
+ const char* code = "let greeting = \"Hello World!\";";
+ if (reprl_execute(ctx, code, strlen(code), 1000, &exec_time, 0) != 0) {
+ printf("Execution of \"%s\" failed\n", code);
+ printf("Is %s the path to d8 built with v8_fuzzilli=true?\n", prog);
+ return -1;
+ }
+
+ // Verify that runtime exceptions can be detected
+ code = "throw 'failure';";
+ if (reprl_execute(ctx, code, strlen(code), 1000, &exec_time, 0) == 0) {
+ printf("Execution of \"%s\" unexpectedly succeeded\n", code);
+ return -1;
+ }
+
+ // Verify that existing state is property reset between executions
+ code = "globalProp = 42; Object.prototype.foo = \"bar\";";
+ if (reprl_execute(ctx, code, strlen(code), 1000, &exec_time, 0) != 0) {
+ printf("Execution of \"%s\" failed\n", code);
+ return -1;
+ }
+ code = "if (typeof(globalProp) !== 'undefined') throw 'failure'";
+ if (reprl_execute(ctx, code, strlen(code), 1000, &exec_time, 0) != 0) {
+ printf("Execution of \"%s\" failed\n", code);
+ return -1;
+ }
+ code = "if (typeof(Object.prototype.foo) !== 'undefined') throw 'failure'";
+ if (reprl_execute(ctx, code, strlen(code), 1000, &exec_time, 0) != 0) {
+ printf("Execution of \"%s\" failed\n", code);
+ return -1;
+ }
+
+ puts("OK");
return 0;
}
+}
diff --git a/deps/v8/test/inspector/BUILD.gn b/deps/v8/test/inspector/BUILD.gn
index 94e6f29752..f2faf8bc21 100644
--- a/deps/v8/test/inspector/BUILD.gn
+++ b/deps/v8/test/inspector/BUILD.gn
@@ -32,6 +32,7 @@ v8_executable("inspector-test") {
data = [
"console/",
+ "counters/",
"cpu-profiler/",
"debugger/",
"heap-profiler/",
diff --git a/deps/v8/test/inspector/counters/collection-expected.txt b/deps/v8/test/inspector/counters/collection-expected.txt
new file mode 100644
index 0000000000..36ade78130
--- /dev/null
+++ b/deps/v8/test/inspector/counters/collection-expected.txt
@@ -0,0 +1,2 @@
+Test Counters collection using Profiler.getCounters.
+PASSED
diff --git a/deps/v8/test/inspector/counters/collection.js b/deps/v8/test/inspector/counters/collection.js
new file mode 100644
index 0000000000..1412956ee6
--- /dev/null
+++ b/deps/v8/test/inspector/counters/collection.js
@@ -0,0 +1,83 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} = InspectorTest.start(
+ 'Test Counters collection using Profiler.getCounters.');
+
+var source =
+`
+function fib(x) {
+ if (x < 2) return 1;
+ return fib(x-1) + fib(x-2);
+}
+fib(5);
+`;
+
+function buildCounterMap(result) {
+ let counterMap = new Map();
+
+ let counters = result.result.result;
+ for (const {name, value} of counters) {
+ counterMap.set(name, value);
+ }
+
+ return counterMap;
+}
+
+function compareCounterMaps(counterMap, counterMap2) {
+ // Check for counters that are present in the first map but are not found
+ // in the the second map
+ for (let counter of counterMap.keys()) {
+ if (!counterMap2.has(counter)) {
+ InspectorTest.log(`Counter ${counter} is missing`);
+ return false;
+ }
+ }
+
+ // Check for the counter value changes
+ let counterValueIncreased = false;
+ for (let [counter, value2] of counterMap2) {
+ let value = counterMap.get(counter);
+ if (value !== undefined) {
+ if (value2 < value) {
+ InspectorTest.log(`Counter ${counter} value decreased: ${value} -> ${value2}`);
+ return false;
+ }
+ if (value2 > value) {
+ counterValueIncreased = true;
+ }
+ }
+ }
+
+ if (!counterValueIncreased && counterMap.size === counterMap2.size) {
+ InspectorTest.log(`No counter values has increased or added`);
+ return false;
+ }
+
+ return true;
+}
+
+(async function test() {
+ await Protocol.Runtime.enable();
+ await Protocol.Profiler.enableCounters();
+
+ let counterMap = buildCounterMap(await Protocol.Profiler.getCounters());
+
+ await Protocol.Runtime.evaluate({ expression: source, sourceURL: arguments.callee.name, persistScript: true });
+
+ let counterMap2 = buildCounterMap(await Protocol.Profiler.getCounters());
+ const check1 = compareCounterMaps(counterMap, counterMap2);
+
+ await Protocol.Runtime.evaluate({ expression: source, sourceURL: arguments.callee.name, persistScript: true });
+
+ let counterMap3 = buildCounterMap(await Protocol.Profiler.getCounters());
+ const check2 = compareCounterMaps(counterMap2, counterMap3);
+
+ await Protocol.Profiler.disableCounters();
+ await Protocol.Runtime.disable();
+
+ InspectorTest.log(check1 && check2 ? 'PASSED' : 'FAILED');
+
+ InspectorTest.completeTest();
+})().catch(e => InspectorTest.log('caught: ' + e));
diff --git a/deps/v8/test/inspector/counters/enable-disable-expected.txt b/deps/v8/test/inspector/counters/enable-disable-expected.txt
new file mode 100644
index 0000000000..8d80a763b8
--- /dev/null
+++ b/deps/v8/test/inspector/counters/enable-disable-expected.txt
@@ -0,0 +1,6 @@
+Test Counters collection enabling and disabling.
+Expected error: "Counters collection is not enabled."
+Expected error: "Counters collection already enabled."
+Some counters reported
+Expected error: "Counters collection is not enabled."
+Less counters reported
diff --git a/deps/v8/test/inspector/counters/enable-disable.js b/deps/v8/test/inspector/counters/enable-disable.js
new file mode 100644
index 0000000000..ffc6518864
--- /dev/null
+++ b/deps/v8/test/inspector/counters/enable-disable.js
@@ -0,0 +1,51 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} = InspectorTest.start(
+ 'Test Counters collection enabling and disabling.');
+
+var source =
+`
+function fib(x) {
+ if (x < 2) return 1;
+ return fib(x-1) + fib(x-2);
+}
+fib(5);
+`;
+
+function logErrorMessage(result) {
+ InspectorTest.log('Expected error: "' + result.error.message + '"');
+}
+
+(async function test() {
+ await Protocol.Runtime.enable();
+
+ // This should fail with "not enabled" error.
+ logErrorMessage(await Protocol.Profiler.getCounters());
+
+ // This should fail with "already enabled" error.
+ await Protocol.Profiler.enableCounters();
+ logErrorMessage(await Protocol.Profiler.enableCounters());
+
+ // The result should not be empty.
+ await Protocol.Runtime.evaluate({ expression: source, sourceURL: arguments.callee.name, persistScript: true });
+ const counters = (await Protocol.Profiler.getCounters()).result.result;
+ if (counters.length > 0)
+ InspectorTest.log('Some counters reported');
+ await Protocol.Profiler.disableCounters();
+
+ // This should fail with "not enabled" error too.
+ logErrorMessage(await Protocol.Profiler.getCounters());
+
+ // The result should not be empty and have smaller amount of counters than
+ // the first result.
+ await Protocol.Profiler.enableCounters();
+ const counters2 = (await Protocol.Profiler.getCounters()).result.result;
+ if (counters2.length > 0 && counters2.length < counters.length)
+ InspectorTest.log('Less counters reported');
+ await Protocol.Profiler.disableCounters();
+
+ await Protocol.Runtime.disable();
+ InspectorTest.completeTest();
+})().catch(e => InspectorTest.log('caught: ' + e));
diff --git a/deps/v8/test/inspector/debugger/wasm-get-breakable-locations-byte-offsets.js b/deps/v8/test/inspector/debugger/wasm-get-breakable-locations-byte-offsets.js
index e615a962e0..cad39c0704 100644
--- a/deps/v8/test/inspector/debugger/wasm-get-breakable-locations-byte-offsets.js
+++ b/deps/v8/test/inspector/debugger/wasm-get-breakable-locations-byte-offsets.js
@@ -12,7 +12,7 @@ var builder = new WasmModuleBuilder();
// clang-format off
var func_idx = builder.addFunction('helper', kSig_v_v)
- .addLocals({ i32_count: 1 })
+ .addLocals(kWasmI32, 1 )
.addBody([
kExprNop,
kExprI32Const, 12,
diff --git a/deps/v8/test/inspector/debugger/wasm-scope-info-expected.txt b/deps/v8/test/inspector/debugger/wasm-scope-info-expected.txt
index 49a4cd0291..0cb6cb7ff3 100644
--- a/deps/v8/test/inspector/debugger/wasm-scope-info-expected.txt
+++ b/deps/v8/test/inspector/debugger/wasm-scope-info-expected.txt
@@ -4,14 +4,14 @@ Waiting for wasm script to be parsed.
Got wasm script!
Setting breakpoint on first instruction of second function
{
- columnNumber : 143
+ columnNumber : 145
lineNumber : 0
scriptId : <scriptId>
}
Paused:
-Script wasm://wasm/e7879e16 byte offset 143: Wasm opcode 0x41
+Script wasm://wasm/e1bff2da byte offset 145: Wasm opcode 0x41
Scope:
-at func (0:143):
+at func (0:145):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -24,6 +24,7 @@ at func (0:143):
var1: 0 (i32)
i64_local: 0 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -41,9 +42,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 145: Wasm opcode 0x21
+Script wasm://wasm/e1bff2da byte offset 147: Wasm opcode 0x21
Scope:
-at func (0:145):
+at func (0:147):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -56,6 +57,7 @@ at func (0:145):
var1: 0 (i32)
i64_local: 0 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 11 (i32)
at call_func (0:132):
@@ -74,9 +76,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 147: Wasm opcode 0x41
+Script wasm://wasm/e1bff2da byte offset 149: Wasm opcode 0x41
Scope:
-at func (0:147):
+at func (0:149):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -89,6 +91,7 @@ at func (0:147):
var1: 0 (i32)
i64_local: 0 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -106,9 +109,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 149: Wasm opcode 0x21
+Script wasm://wasm/e1bff2da byte offset 151: Wasm opcode 0x21
Scope:
-at func (0:149):
+at func (0:151):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -121,6 +124,7 @@ at func (0:149):
var1: 0 (i32)
i64_local: 0 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 47 (i32)
at call_func (0:132):
@@ -139,9 +143,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 151: Wasm opcode 0x42
+Script wasm://wasm/e1bff2da byte offset 153: Wasm opcode 0x42
Scope:
-at func (0:151):
+at func (0:153):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -154,6 +158,7 @@ at func (0:151):
var1: 47 (i32)
i64_local: 0 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -171,9 +176,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 162: Wasm opcode 0x21
+Script wasm://wasm/e1bff2da byte offset 164: Wasm opcode 0x21
Scope:
-at func (0:162):
+at func (0:164):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -186,6 +191,7 @@ at func (0:162):
var1: 47 (i32)
i64_local: 0 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 9223372036854775807 (i64)
at call_func (0:132):
@@ -204,9 +210,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 164: Wasm opcode 0x42
+Script wasm://wasm/e1bff2da byte offset 166: Wasm opcode 0x42
Scope:
-at func (0:164):
+at func (0:166):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -219,6 +225,7 @@ at func (0:164):
var1: 47 (i32)
i64_local: 9223372036854775807 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -236,9 +243,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 175: Wasm opcode 0x21
+Script wasm://wasm/e1bff2da byte offset 177: Wasm opcode 0x21
Scope:
-at func (0:175):
+at func (0:177):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -251,6 +258,7 @@ at func (0:175):
var1: 47 (i32)
i64_local: 9223372036854775807 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: -9223372036854775808 (i64)
at call_func (0:132):
@@ -269,9 +277,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 177: Wasm opcode 0x41
+Script wasm://wasm/e1bff2da byte offset 179: Wasm opcode 0x41
Scope:
-at func (0:177):
+at func (0:179):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -284,6 +292,7 @@ at func (0:177):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -301,9 +310,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 179: Wasm opcode 0xb8
+Script wasm://wasm/e1bff2da byte offset 181: Wasm opcode 0xb8
Scope:
-at func (0:179):
+at func (0:181):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -316,6 +325,7 @@ at func (0:179):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 1 (i32)
at call_func (0:132):
@@ -334,9 +344,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 180: Wasm opcode 0x41
+Script wasm://wasm/e1bff2da byte offset 182: Wasm opcode 0x41
Scope:
-at func (0:180):
+at func (0:182):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -349,6 +359,7 @@ at func (0:180):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 1 (f64)
at call_func (0:132):
@@ -367,9 +378,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 182: Wasm opcode 0xb8
+Script wasm://wasm/e1bff2da byte offset 184: Wasm opcode 0xb8
Scope:
-at func (0:182):
+at func (0:184):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -382,6 +393,7 @@ at func (0:182):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 1 (f64)
1: 7 (i32)
@@ -401,9 +413,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 183: Wasm opcode 0xa3
+Script wasm://wasm/e1bff2da byte offset 185: Wasm opcode 0xa3
Scope:
-at func (0:183):
+at func (0:185):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -416,6 +428,7 @@ at func (0:183):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 1 (f64)
1: 7 (f64)
@@ -435,9 +448,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 184: Wasm opcode 0x21
+Script wasm://wasm/e1bff2da byte offset 186: Wasm opcode 0x21
Scope:
-at func (0:184):
+at func (0:186):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -450,6 +463,7 @@ at func (0:184):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 0.14285714285714285 (f64)
at call_func (0:132):
@@ -468,9 +482,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 186: Wasm opcode 0x41
+Script wasm://wasm/e1bff2da byte offset 188: Wasm opcode 0x41
Scope:
-at func (0:186):
+at func (0:188):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -483,6 +497,7 @@ at func (0:186):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0.14285714285714285 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -500,9 +515,77 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 188: Wasm opcode 0x24
+Script wasm://wasm/e1bff2da byte offset 190: Wasm opcode 0xfd
Scope:
-at func (0:188):
+at func (0:190):
+ - scope (module):
+ instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
+ exported_memory: Uint8Array(65536)
+ function tables:
+ exported_table: js_func: function js_func() { [native code] }, anonymous: function () { [native code] }, call_func: function 0() { [native code] }
+ globals: "exported_global": 0 (i32)
+ - scope (local):
+ 0: 0 (f64)
+ i32Arg: 11 (i32)
+ var1: 47 (i32)
+ i64_local: -9223372036854775808 (i64)
+ unicode☼f64: 0.14285714285714285 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
+ - scope (wasm-expression-stack):
+ 0: 23 (i32)
+at call_func (0:132):
+ - scope (module):
+ instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
+ exported_memory: Uint8Array(65536)
+ function tables:
+ exported_table: js_func: function js_func() { [native code] }, anonymous: function () { [native code] }, call_func: function 0() { [native code] }
+ globals: "exported_global": 0 (i32)
+ - scope (local):
+ var0: 4 (i32)
+ var1: 7.199999809265137 (f32)
+ - scope (wasm-expression-stack):
+at (anonymous) (0:17):
+ - scope (global):
+ -- skipped globals
+
+Paused:
+Script wasm://wasm/e1bff2da byte offset 192: Wasm opcode 0x21
+Scope:
+at func (0:192):
+ - scope (module):
+ instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
+ exported_memory: Uint8Array(65536)
+ function tables:
+ exported_table: js_func: function js_func() { [native code] }, anonymous: function () { [native code] }, call_func: function 0() { [native code] }
+ globals: "exported_global": 0 (i32)
+ - scope (local):
+ 0: 0 (f64)
+ i32Arg: 11 (i32)
+ var1: 47 (i32)
+ i64_local: -9223372036854775808 (i64)
+ unicode☼f64: 0.14285714285714285 (f64)
+ var6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (v128)
+ - scope (wasm-expression-stack):
+ 0: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
+at call_func (0:132):
+ - scope (module):
+ instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
+ exported_memory: Uint8Array(65536)
+ function tables:
+ exported_table: js_func: function js_func() { [native code] }, anonymous: function () { [native code] }, call_func: function 0() { [native code] }
+ globals: "exported_global": 0 (i32)
+ - scope (local):
+ var0: 4 (i32)
+ var1: 7.199999809265137 (f32)
+ - scope (wasm-expression-stack):
+at (anonymous) (0:17):
+ - scope (global):
+ -- skipped globals
+
+Paused:
+Script wasm://wasm/e1bff2da byte offset 194: Wasm opcode 0x41
+Scope:
+at func (0:194):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -515,6 +598,40 @@ at func (0:188):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0.14285714285714285 (f64)
+ var6: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
+ - scope (wasm-expression-stack):
+at call_func (0:132):
+ - scope (module):
+ instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
+ exported_memory: Uint8Array(65536)
+ function tables:
+ exported_table: js_func: function js_func() { [native code] }, anonymous: function () { [native code] }, call_func: function 0() { [native code] }
+ globals: "exported_global": 0 (i32)
+ - scope (local):
+ var0: 4 (i32)
+ var1: 7.199999809265137 (f32)
+ - scope (wasm-expression-stack):
+at (anonymous) (0:17):
+ - scope (global):
+ -- skipped globals
+
+Paused:
+Script wasm://wasm/e1bff2da byte offset 196: Wasm opcode 0x24
+Scope:
+at func (0:196):
+ - scope (module):
+ instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
+ exported_memory: Uint8Array(65536)
+ function tables:
+ exported_table: js_func: function js_func() { [native code] }, anonymous: function () { [native code] }, call_func: function 0() { [native code] }
+ globals: "exported_global": 0 (i32)
+ - scope (local):
+ 0: 0 (f64)
+ i32Arg: 11 (i32)
+ var1: 47 (i32)
+ i64_local: -9223372036854775808 (i64)
+ unicode☼f64: 0.14285714285714285 (f64)
+ var6: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 15 (i32)
at call_func (0:132):
@@ -533,9 +650,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 190: Wasm opcode 0x0b
+Script wasm://wasm/e1bff2da byte offset 198: Wasm opcode 0x0b
Scope:
-at func (0:190):
+at func (0:198):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -548,6 +665,7 @@ at func (0:190):
var1: 47 (i32)
i64_local: -9223372036854775808 (i64)
unicode☼f64: 0.14285714285714285 (f64)
+ var6: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
at call_func (0:132):
- scope (module):
@@ -565,7 +683,7 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/e7879e16 byte offset 134: Wasm opcode 0x0b
+Script wasm://wasm/e1bff2da byte offset 134: Wasm opcode 0x0b
Scope:
at call_func (0:134):
- scope (module):
diff --git a/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff-expected.txt b/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff-expected.txt
index a421af0fdd..65fb8f42ca 100644
--- a/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff-expected.txt
+++ b/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff-expected.txt
@@ -4,14 +4,14 @@ Waiting for wasm script to be parsed.
Got wasm script!
Setting breakpoint on line 2 (first instruction) of third function
{
- columnNumber : 159
+ columnNumber : 167
lineNumber : 0
scriptId : <scriptId>
}
Paused:
-Script wasm://wasm/7f06385e byte offset 159: Wasm opcode 0x20
+Script wasm://wasm/ed01bcee byte offset 167: Wasm opcode 0x20
Scope:
-at C (interpreted) (0:159):
+at C (interpreted) (0:167):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -22,7 +22,7 @@ at C (interpreted) (0:159):
i32_arg: 42 (i32)
i32_local: 0 (i32)
- scope (wasm-expression-stack):
-at B (liftoff) (0:150):
+at B (liftoff) (0:158):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -35,6 +35,7 @@ at B (liftoff) (0:150):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
1: 3 (i32)
@@ -53,9 +54,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 161: Wasm opcode 0x24
+Script wasm://wasm/ed01bcee byte offset 169: Wasm opcode 0x24
Scope:
-at C (interpreted) (0:161):
+at C (interpreted) (0:169):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -67,7 +68,7 @@ at C (interpreted) (0:161):
i32_local: 0 (i32)
- scope (wasm-expression-stack):
0: 42 (i32)
-at B (liftoff) (0:150):
+at B (liftoff) (0:158):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -80,6 +81,7 @@ at B (liftoff) (0:150):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
1: 3 (i32)
@@ -98,9 +100,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 163: Wasm opcode 0x41
+Script wasm://wasm/ed01bcee byte offset 171: Wasm opcode 0x41
Scope:
-at C (interpreted) (0:163):
+at C (interpreted) (0:171):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -111,7 +113,7 @@ at C (interpreted) (0:163):
i32_arg: 42 (i32)
i32_local: 0 (i32)
- scope (wasm-expression-stack):
-at B (liftoff) (0:150):
+at B (liftoff) (0:158):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -124,6 +126,7 @@ at B (liftoff) (0:150):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
1: 3 (i32)
@@ -142,9 +145,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 165: Wasm opcode 0x21
+Script wasm://wasm/ed01bcee byte offset 173: Wasm opcode 0x21
Scope:
-at C (interpreted) (0:165):
+at C (interpreted) (0:173):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -156,7 +159,7 @@ at C (interpreted) (0:165):
i32_local: 0 (i32)
- scope (wasm-expression-stack):
0: 47 (i32)
-at B (liftoff) (0:150):
+at B (liftoff) (0:158):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -169,6 +172,7 @@ at B (liftoff) (0:150):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
1: 3 (i32)
@@ -187,9 +191,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 167: Wasm opcode 0x0b
+Script wasm://wasm/ed01bcee byte offset 175: Wasm opcode 0x0b
Scope:
-at C (interpreted) (0:167):
+at C (interpreted) (0:175):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -200,7 +204,7 @@ at C (interpreted) (0:167):
i32_arg: 42 (i32)
i32_local: 47 (i32)
- scope (wasm-expression-stack):
-at B (liftoff) (0:150):
+at B (liftoff) (0:158):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -213,6 +217,7 @@ at B (liftoff) (0:150):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
1: 3 (i32)
@@ -231,9 +236,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 152: Wasm opcode 0x1a
+Script wasm://wasm/ed01bcee byte offset 160: Wasm opcode 0x1a
Scope:
-at B (liftoff) (0:152):
+at B (liftoff) (0:160):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -246,6 +251,7 @@ at B (liftoff) (0:152):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
1: 3 (i32)
@@ -264,9 +270,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 153: Wasm opcode 0x1a
+Script wasm://wasm/ed01bcee byte offset 161: Wasm opcode 0x1a
Scope:
-at B (liftoff) (0:153):
+at B (liftoff) (0:161):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -279,6 +285,7 @@ at B (liftoff) (0:153):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
0: 42 (i32)
at A (liftoff) (0:128):
@@ -296,9 +303,9 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 154: Wasm opcode 0x0b
+Script wasm://wasm/ed01bcee byte offset 162: Wasm opcode 0x0b
Scope:
-at B (liftoff) (0:154):
+at B (liftoff) (0:162):
- scope (module):
instance: exports: "exported_global" (Global), "exported_memory" (Memory), "exported_table" (Table), "main" (Function)
exported_memory: Uint8Array(65536)
@@ -311,6 +318,7 @@ at B (liftoff) (0:154):
i32_local: 0 (i32)
f32_local: 7.199999809265137 (f32)
var5: 0 (f32)
+ v128_local: 17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 (v128)
- scope (wasm-expression-stack):
at A (liftoff) (0:128):
- scope (module):
@@ -327,7 +335,7 @@ at (anonymous) (0:17):
-- skipped globals
Paused:
-Script wasm://wasm/7f06385e byte offset 130: Wasm opcode 0x0b
+Script wasm://wasm/ed01bcee byte offset 130: Wasm opcode 0x0b
Scope:
at A (liftoff) (0:130):
- scope (module):
diff --git a/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff.js b/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff.js
index 845c93ca86..7a5f8f4edc 100644
--- a/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff.js
+++ b/deps/v8/test/inspector/debugger/wasm-scope-info-liftoff.js
@@ -2,7 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --experimental-wasm-type-reflection
+// Flags: --experimental-wasm-type-reflection --experimental-wasm-simd
+// SIMD in Liftoff only works with these cpu features, force them on.
+// Flags: --enable-sse3 --enable-ssse3 --enable-sse4-1
utils.load('test/inspector/wasm-inspector-test.js');
@@ -80,13 +82,17 @@ async function instantiateWasm() {
])
.exportAs('main');
- builder.addFunction('B (liftoff)', kSig_v_i)
- .addLocals(
- {i32_count: 1, f32_count: 4},
- ['i32_arg', 'i32_local', 'f32_local', '0', '0'])
+ builder.addFunction('B (liftoff)', kSig_v_i, ['i32_arg'])
+ .addLocals(kWasmI32, 1, ['i32_local'])
+ .addLocals(kWasmF32, 4, ['f32_local', '0', '0'])
+ .addLocals(kWasmS128, 1, ['v128_local'])
.addBody([
// Load a parameter and a constant onto the operand stack.
kExprLocalGet, 0, kExprI32Const, 3,
+ // Set local 6 to v128 i32.x4 23, 23, 23, 23.
+ kExprI32Const, 23,
+ kSimdPrefix, kExprI32x4Splat,
+ kExprLocalSet, 6,
// Set local 2 to 7.2.
...wasmF32Const(7.2), kExprLocalSet, 2,
// Call function 'C', forwarding param 0.
@@ -96,8 +102,8 @@ async function instantiateWasm() {
]);
// A third function which will be stepped through.
- let func = builder.addFunction('C (interpreted)', kSig_v_i)
- .addLocals({i32_count: 1}, ['i32_arg', 'i32_local'])
+ let func = builder.addFunction('C (interpreted)', kSig_v_i, ['i32_arg'])
+ .addLocals(kWasmI32, 1, ['i32_local'])
.addBody([
// Set global 0 to param 0.
kExprLocalGet, 0, kExprGlobalSet, 0,
diff --git a/deps/v8/test/inspector/debugger/wasm-scope-info.js b/deps/v8/test/inspector/debugger/wasm-scope-info.js
index 7731e6b587..b1b270edfc 100644
--- a/deps/v8/test/inspector/debugger/wasm-scope-info.js
+++ b/deps/v8/test/inspector/debugger/wasm-scope-info.js
@@ -2,7 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --experimental-wasm-type-reflection
+// Flags: --experimental-wasm-type-reflection --experimental-wasm-simd
+// SIMD in Liftoff only works with these cpu features, force them on.
+// Flags: --enable-sse3 --enable-ssse3 --enable-sse4-1
utils.load('test/inspector/wasm-inspector-test.js');
@@ -74,36 +76,42 @@ async function instantiateWasm() {
// Add a function without breakpoint, to check that locals are shown
// correctly in compiled code.
- const main = builder.addFunction('call_func', kSig_v_i).addLocals({f32_count: 1}).addBody([
- // Set local 1 to 7.2.
- ...wasmF32Const(7.2), kExprLocalSet, 1,
- // Call function 'func', forwarding param 0.
- kExprLocalGet, 0, kExprCallFunction, 1
- ]).exportAs('main');
+ const main = builder.addFunction('call_func', kSig_v_i).addLocals(kWasmF32, 1)
+ .addBody([
+ // Set local 1 to 7.2.
+ ...wasmF32Const(7.2), kExprLocalSet, 1,
+ // Call function 'func', forwarding param 0.
+ kExprLocalGet, 0, kExprCallFunction, 1
+ ]).exportAs('main');
// A second function which will be stepped through.
- const func = builder.addFunction('func', kSig_v_i)
- .addLocals(
- {i32_count: 1, i64_count: 1, f64_count: 3},
- ['i32Arg', undefined, 'i64_local', 'unicode☼f64', '0', '0'])
- .addBody([
- // Set param 0 to 11.
- kExprI32Const, 11, kExprLocalSet, 0,
- // Set local 1 to 47.
- kExprI32Const, 47, kExprLocalSet, 1,
- // Set local 2 to 0x7FFFFFFFFFFFFFFF (max i64).
- kExprI64Const, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
- kExprLocalSet, 2,
- // Set local 2 to 0x8000000000000000 (min i64).
- kExprI64Const, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f,
- kExprLocalSet, 2,
- // Set local 3 to 1/7.
- kExprI32Const, 1, kExprF64UConvertI32, kExprI32Const, 7,
- kExprF64UConvertI32, kExprF64Div, kExprLocalSet, 3,
-
- // Set global 0 to 15
- kExprI32Const, 15, kExprGlobalSet, 0,
- ]);
+ const func = builder.addFunction('func', kSig_v_i, ['i32Arg'])
+ .addLocals(kWasmI32, 1)
+ .addLocals(kWasmI64, 1, ['i64_local'])
+ .addLocals(kWasmF64, 3, ['unicode☼f64', '0', '0'])
+ .addLocals(kWasmS128, 1)
+ .addBody([
+ // Set param 0 to 11.
+ kExprI32Const, 11, kExprLocalSet, 0,
+ // Set local 1 to 47.
+ kExprI32Const, 47, kExprLocalSet, 1,
+ // Set local 2 to 0x7FFFFFFFFFFFFFFF (max i64).
+ kExprI64Const, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
+ kExprLocalSet, 2,
+ // Set local 2 to 0x8000000000000000 (min i64).
+ kExprI64Const, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f,
+ kExprLocalSet, 2,
+ // Set local 3 to 1/7.
+ kExprI32Const, 1, kExprF64UConvertI32, kExprI32Const, 7,
+ kExprF64UConvertI32, kExprF64Div, kExprLocalSet, 3,
+ // Set local 6 to [23, 23, 23, 23]
+ kExprI32Const, 23,
+ kSimdPrefix, kExprI32x4Splat,
+ kExprLocalSet, 6,
+
+ // Set global 0 to 15
+ kExprI32Const, 15, kExprGlobalSet, 0,
+ ]);
// Append function to table to test function table output.
builder.appendToTable([main.index]);
@@ -114,8 +122,10 @@ async function instantiateWasm() {
function addWasmJSToTable() {
// Create WasmJS functions to test the function tables output.
const js_func = function js_func() { return 7; };
- const wasmjs_func = new WebAssembly.Function({parameters:[], results:['i32']}, js_func);
- const wasmjs_anonymous_func = new WebAssembly.Function({parameters:[], results:['i32']}, _ => 7);
+ const wasmjs_func = new WebAssembly.Function(
+ {parameters:[], results:['i32']}, js_func);
+ const wasmjs_anonymous_func = new WebAssembly.Function(
+ {parameters:[], results:['i32']}, _ => 7);
instance.exports.exported_table.set(0, wasmjs_func);
instance.exports.exported_table.set(1, wasmjs_anonymous_func);
@@ -123,7 +133,8 @@ async function instantiateWasm() {
InspectorTest.log('Calling instantiate function.');
await WasmInspectorTest.instantiate(moduleBytes);
- await WasmInspectorTest.evalWithUrl(`(${addWasmJSToTable})()`, 'populateTable');
+ await WasmInspectorTest.evalWithUrl(`(${addWasmJSToTable})()`,
+ 'populateTable');
}
function printIfFailure(message) {
diff --git a/deps/v8/test/inspector/debugger/wasm-set-breakpoint-breaks-on-first-breakable-location.js b/deps/v8/test/inspector/debugger/wasm-set-breakpoint-breaks-on-first-breakable-location.js
index 8071e03731..2627e87cfd 100644
--- a/deps/v8/test/inspector/debugger/wasm-set-breakpoint-breaks-on-first-breakable-location.js
+++ b/deps/v8/test/inspector/debugger/wasm-set-breakpoint-breaks-on-first-breakable-location.js
@@ -11,7 +11,7 @@ var builder = new WasmModuleBuilder();
// clang-format off
var func_idx = builder.addFunction('helper', kSig_v_v)
- .addLocals({ i32_count: 1 })
+ .addLocals(kWasmI32, 1)
.addBody([
kExprNop,
kExprI32Const, 12,
diff --git a/deps/v8/test/inspector/debugger/wasm-step-after-trap.js b/deps/v8/test/inspector/debugger/wasm-step-after-trap.js
index 7d396c5e1c..52c57fd1fa 100644
--- a/deps/v8/test/inspector/debugger/wasm-step-after-trap.js
+++ b/deps/v8/test/inspector/debugger/wasm-step-after-trap.js
@@ -11,9 +11,8 @@ session.setupScriptMap();
const builder = new WasmModuleBuilder();
// Create a function which computes the div of the first two arguments.
-builder.addFunction('div', kSig_i_iii)
- .addLocals(
- {i32_count: 2}, ['a', 'b', 'unused', 'local_zero', 'local_const_11'])
+builder.addFunction('div', kSig_i_iii, ['a', 'b', 'unused'])
+ .addLocals(kWasmI32, 2, ['local_zero', 'local_const_11'])
.addBody([
kExprI32Const, 11, // const 11
kExprLocalSet, 4, // set local #4 ('local_const_11')
diff --git a/deps/v8/test/inspector/debugger/wasm-stepping-liftoff.js b/deps/v8/test/inspector/debugger/wasm-stepping-liftoff.js
index fa8af06159..c8dbedef5c 100644
--- a/deps/v8/test/inspector/debugger/wasm-stepping-liftoff.js
+++ b/deps/v8/test/inspector/debugger/wasm-stepping-liftoff.js
@@ -34,7 +34,7 @@ var func_b = builder.addFunction('wasm_B', kSig_v_i)
.exportAs('main');
let fact = builder.addFunction('fact', kSig_i_i)
- .addLocals({i32_count: 1})
+ .addLocals(kWasmI32, 1)
.addBody([
// clang-format off
kExprLocalGet, 0,
diff --git a/deps/v8/test/inspector/heap-profiler/console-retaining-path.js b/deps/v8/test/inspector/heap-profiler/console-retaining-path.js
index 7021e7f6e6..d378258f32 100644
--- a/deps/v8/test/inspector/heap-profiler/console-retaining-path.js
+++ b/deps/v8/test/inspector/heap-profiler/console-retaining-path.js
@@ -7,7 +7,7 @@ let {session, contextGroup, Protocol} = InspectorTest.start(
const kNodeName = 1;
const kNodeEdgeCount = 4;
-const kNodeSize = 6;
+const kNodeSize = 7;
const kEdgeName = 1;
const kEdgeTarget = 2;
const kEdgeSize = 3;
diff --git a/deps/v8/test/inspector/inspector-test.cc b/deps/v8/test/inspector/inspector-test.cc
index 5946418665..ac56ac9242 100644
--- a/deps/v8/test/inspector/inspector-test.cc
+++ b/deps/v8/test/inspector/inspector-test.cc
@@ -306,54 +306,54 @@ class UtilsExtension : public IsolateData::SetupGlobalTask {
void Run(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> global) override {
v8::Local<v8::ObjectTemplate> utils = v8::ObjectTemplate::New(isolate);
- utils->Set(ToV8String(isolate, "print"),
+ utils->Set(isolate, "print",
v8::FunctionTemplate::New(isolate, &UtilsExtension::Print));
- utils->Set(ToV8String(isolate, "quit"),
+ utils->Set(isolate, "quit",
v8::FunctionTemplate::New(isolate, &UtilsExtension::Quit));
- utils->Set(ToV8String(isolate, "setlocale"),
+ utils->Set(isolate, "setlocale",
v8::FunctionTemplate::New(isolate, &UtilsExtension::Setlocale));
- utils->Set(ToV8String(isolate, "read"),
+ utils->Set(isolate, "read",
v8::FunctionTemplate::New(isolate, &UtilsExtension::Read));
- utils->Set(ToV8String(isolate, "load"),
+ utils->Set(isolate, "load",
v8::FunctionTemplate::New(isolate, &UtilsExtension::Load));
- utils->Set(ToV8String(isolate, "compileAndRunWithOrigin"),
+ utils->Set(isolate, "compileAndRunWithOrigin",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::CompileAndRunWithOrigin));
- utils->Set(ToV8String(isolate, "setCurrentTimeMSForTest"),
+ utils->Set(isolate, "setCurrentTimeMSForTest",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::SetCurrentTimeMSForTest));
- utils->Set(ToV8String(isolate, "setMemoryInfoForTest"),
+ utils->Set(isolate, "setMemoryInfoForTest",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::SetMemoryInfoForTest));
- utils->Set(ToV8String(isolate, "schedulePauseOnNextStatement"),
+ utils->Set(isolate, "schedulePauseOnNextStatement",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::SchedulePauseOnNextStatement));
- utils->Set(ToV8String(isolate, "cancelPauseOnNextStatement"),
+ utils->Set(isolate, "cancelPauseOnNextStatement",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::CancelPauseOnNextStatement));
- utils->Set(ToV8String(isolate, "setLogConsoleApiMessageCalls"),
+ utils->Set(isolate, "setLogConsoleApiMessageCalls",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::SetLogConsoleApiMessageCalls));
utils->Set(
- ToV8String(isolate, "setLogMaxAsyncCallStackDepthChanged"),
+ isolate, "setLogMaxAsyncCallStackDepthChanged",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::SetLogMaxAsyncCallStackDepthChanged));
- utils->Set(ToV8String(isolate, "createContextGroup"),
+ utils->Set(isolate, "createContextGroup",
v8::FunctionTemplate::New(isolate,
&UtilsExtension::CreateContextGroup));
utils->Set(
- ToV8String(isolate, "resetContextGroup"),
+ isolate, "resetContextGroup",
v8::FunctionTemplate::New(isolate, &UtilsExtension::ResetContextGroup));
utils->Set(
- ToV8String(isolate, "connectSession"),
+ isolate, "connectSession",
v8::FunctionTemplate::New(isolate, &UtilsExtension::ConnectSession));
utils->Set(
- ToV8String(isolate, "disconnectSession"),
+ isolate, "disconnectSession",
v8::FunctionTemplate::New(isolate, &UtilsExtension::DisconnectSession));
- utils->Set(ToV8String(isolate, "sendMessageToBackend"),
+ utils->Set(isolate, "sendMessageToBackend",
v8::FunctionTemplate::New(
isolate, &UtilsExtension::SendMessageToBackend));
- global->Set(ToV8String(isolate, "utils"), utils);
+ global->Set(isolate, "utils", utils);
}
static void set_backend_task_runner(TaskRunner* runner) {
@@ -714,66 +714,66 @@ class InspectorExtension : public IsolateData::SetupGlobalTask {
void Run(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> global) override {
v8::Local<v8::ObjectTemplate> inspector = v8::ObjectTemplate::New(isolate);
- inspector->Set(ToV8String(isolate, "fireContextCreated"),
+ inspector->Set(isolate, "fireContextCreated",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::FireContextCreated));
- inspector->Set(ToV8String(isolate, "fireContextDestroyed"),
+ inspector->Set(isolate, "fireContextDestroyed",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::FireContextDestroyed));
inspector->Set(
- ToV8String(isolate, "freeContext"),
+ isolate, "freeContext",
v8::FunctionTemplate::New(isolate, &InspectorExtension::FreeContext));
- inspector->Set(ToV8String(isolate, "addInspectedObject"),
+ inspector->Set(isolate, "addInspectedObject",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::AddInspectedObject));
- inspector->Set(ToV8String(isolate, "setMaxAsyncTaskStacks"),
+ inspector->Set(isolate, "setMaxAsyncTaskStacks",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::SetMaxAsyncTaskStacks));
inspector->Set(
- ToV8String(isolate, "dumpAsyncTaskStacksStateForTest"),
+ isolate, "dumpAsyncTaskStacksStateForTest",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::DumpAsyncTaskStacksStateForTest));
inspector->Set(
- ToV8String(isolate, "breakProgram"),
+ isolate, "breakProgram",
v8::FunctionTemplate::New(isolate, &InspectorExtension::BreakProgram));
inspector->Set(
- ToV8String(isolate, "createObjectWithStrictCheck"),
+ isolate, "createObjectWithStrictCheck",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::CreateObjectWithStrictCheck));
- inspector->Set(ToV8String(isolate, "callWithScheduledBreak"),
+ inspector->Set(isolate, "callWithScheduledBreak",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::CallWithScheduledBreak));
- inspector->Set(ToV8String(isolate, "allowAccessorFormatting"),
+ inspector->Set(isolate, "allowAccessorFormatting",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::AllowAccessorFormatting));
inspector->Set(
- ToV8String(isolate, "markObjectAsNotInspectable"),
+ isolate, "markObjectAsNotInspectable",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::MarkObjectAsNotInspectable));
- inspector->Set(ToV8String(isolate, "createObjectWithAccessor"),
+ inspector->Set(isolate, "createObjectWithAccessor",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::CreateObjectWithAccessor));
- inspector->Set(ToV8String(isolate, "storeCurrentStackTrace"),
+ inspector->Set(isolate, "storeCurrentStackTrace",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::StoreCurrentStackTrace));
- inspector->Set(ToV8String(isolate, "externalAsyncTaskStarted"),
+ inspector->Set(isolate, "externalAsyncTaskStarted",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::ExternalAsyncTaskStarted));
inspector->Set(
- ToV8String(isolate, "externalAsyncTaskFinished"),
+ isolate, "externalAsyncTaskFinished",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::ExternalAsyncTaskFinished));
- inspector->Set(ToV8String(isolate, "scheduleWithAsyncStack"),
+ inspector->Set(isolate, "scheduleWithAsyncStack",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::ScheduleWithAsyncStack));
inspector->Set(
- ToV8String(isolate, "setAllowCodeGenerationFromStrings"),
+ isolate, "setAllowCodeGenerationFromStrings",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::SetAllowCodeGenerationFromStrings));
- inspector->Set(ToV8String(isolate, "setResourceNamePrefix"),
+ inspector->Set(isolate, "setResourceNamePrefix",
v8::FunctionTemplate::New(
isolate, &InspectorExtension::SetResourceNamePrefix));
- global->Set(ToV8String(isolate, "inspector"), inspector);
+ global->Set(isolate, "inspector", inspector);
}
private:
@@ -1057,6 +1057,7 @@ int main(int argc, char* argv[]) {
v8::V8::InitializeICUDefaultLocation(argv[0]);
std::unique_ptr<v8::Platform> platform(v8::platform::NewDefaultPlatform());
v8::V8::InitializePlatform(platform.get());
+ v8::internal::FLAG_abort_on_contradictory_flags = true;
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
v8::V8::InitializeExternalStartupData(argv[0]);
v8::V8::Initialize();
diff --git a/deps/v8/test/inspector/inspector.status b/deps/v8/test/inspector/inspector.status
index 8d1ec37bb5..e7a69f9402 100644
--- a/deps/v8/test/inspector/inspector.status
+++ b/deps/v8/test/inspector/inspector.status
@@ -22,6 +22,13 @@
}], # ALWAYS
##############################################################################
+['arch == x64 and mode == debug', {
+ # Flaky tests: https://crbug.com/v8/10876
+ 'debugger/pause-on-oom-extrawide': [PASS, FAIL],
+ 'debugger/pause-on-oom-wide': [PASS, FAIL],
+}], # 'arch == x64 and mode == debug'
+
+##############################################################################
['system == android', {
# https://crbug.com/v8/8197
'debugger/get-possible-breakpoints-class-fields': [SKIP],
@@ -92,6 +99,11 @@
'*': [SKIP], # only relevant for mjsunit tests.
}],
+################################################################################
+['variant == stress', {
+ '*': [SKIP], # only relevant for mjsunit tests.
+}],
+
##############################################################################
['tsan == True', {
# TSan handles SIGPROF incorrectly (https://crbug.com/v8/9869).
diff --git a/deps/v8/test/inspector/runtime-call-stats/collection.js b/deps/v8/test/inspector/runtime-call-stats/collection.js
index b3cadc5c3f..a3a680e11b 100644
--- a/deps/v8/test/inspector/runtime-call-stats/collection.js
+++ b/deps/v8/test/inspector/runtime-call-stats/collection.js
@@ -1,4 +1,4 @@
-// Copyright 2019 the V8 project authors. All rights reserved.
+// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/deps/v8/test/inspector/runtime-call-stats/enable-disable-expected.txt b/deps/v8/test/inspector/runtime-call-stats/enable-disable-expected.txt
index 0ee15dbedf..4ba4feeb23 100644
--- a/deps/v8/test/inspector/runtime-call-stats/enable-disable-expected.txt
+++ b/deps/v8/test/inspector/runtime-call-stats/enable-disable-expected.txt
@@ -1,6 +1,5 @@
-Test RunTimeCallStats collection enabling and disabling.
-Expected error: "RuntimeCallStats collection is not enabled."
-Expected error: "RuntimeCallStats collection already enabled."
+Test Runtime Call Stats collection enabling and disabling.
+Expected error: "Runtime Call Stats collection is not enabled."
+Expected error: "Runtime Call Stats collection is already enabled."
Some counters reported
-Expected error: "RuntimeCallStats collection is not enabled."
-Less counters reported
+Expected error: "Runtime Call Stats collection is not enabled."
diff --git a/deps/v8/test/inspector/runtime-call-stats/enable-disable.js b/deps/v8/test/inspector/runtime-call-stats/enable-disable.js
index 3dde945a01..81ea070f7a 100644
--- a/deps/v8/test/inspector/runtime-call-stats/enable-disable.js
+++ b/deps/v8/test/inspector/runtime-call-stats/enable-disable.js
@@ -1,51 +1,51 @@
-// Copyright 2019 the V8 project authors. All rights reserved.
+// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
let {session, contextGroup, Protocol} = InspectorTest.start(
- 'Test RunTimeCallStats collection enabling and disabling.');
+ 'Test Runtime Call Stats collection enabling and disabling.');
var source =
`
function fib(x) {
- if (x < 2) return 1;
- return fib(x-1) + fib(x-2);
+if (x < 2) return 1;
+return fib(x-1) + fib(x-2);
}
fib(5);
`;
function logErrorMessage(result) {
- InspectorTest.log('Expected error: "' + result.error.message + '"');
+InspectorTest.log('Expected error: "' + result.error.message + '"');
}
(async function test() {
- await Protocol.Runtime.enable();
-
- // This should fail with "not enabled" error.
- logErrorMessage(await Protocol.Profiler.getRuntimeCallStats());
-
- // This should fail with "already enabled" error.
- await Protocol.Profiler.enableRuntimeCallStats();
- logErrorMessage(await Protocol.Profiler.enableRuntimeCallStats());
-
- // The result should not be empty.
- await Protocol.Runtime.evaluate({ expression: source, sourceURL: arguments.callee.name, persistScript: true });
- const counters = (await Protocol.Profiler.getRuntimeCallStats()).result.result;
- if (counters.length > 0)
- InspectorTest.log('Some counters reported');
- await Protocol.Profiler.disableRuntimeCallStats();
-
- // This should fail with "not enabled" error too.
- logErrorMessage(await Protocol.Profiler.getRuntimeCallStats());
-
- // The result should not be empty and have smaller amount of counters than
- // the first result.
- await Protocol.Profiler.enableRuntimeCallStats();
- const counters2 = (await Protocol.Profiler.getRuntimeCallStats()).result.result;
- if (counters2.length > 0 && counters2.length < counters.length)
- InspectorTest.log('Less counters reported');
- await Protocol.Profiler.disableRuntimeCallStats();
-
- await Protocol.Runtime.disable();
- InspectorTest.completeTest();
+await Protocol.Runtime.enable();
+
+// This should fail with "not enabled" error.
+logErrorMessage(await Protocol.Profiler.getRuntimeCallStats());
+
+// This should fail with "already enabled" error.
+await Protocol.Profiler.enableRuntimeCallStats();
+logErrorMessage(await Protocol.Profiler.enableRuntimeCallStats());
+
+// The result should not be empty.
+await Protocol.Runtime.evaluate({ expression: source, sourceURL: arguments.callee.name, persistScript: true });
+const counters = (await Protocol.Profiler.getRuntimeCallStats()).result.result;
+if (counters.length > 0)
+ InspectorTest.log('Some counters reported');
+await Protocol.Profiler.disableRuntimeCallStats();
+
+// This should fail with "not enabled" error too.
+logErrorMessage(await Protocol.Profiler.getRuntimeCallStats());
+
+// The result should not be empty and have smaller amount of counters than
+// the first result.
+await Protocol.Profiler.enableRuntimeCallStats();
+const counters2 = (await Protocol.Profiler.getRuntimeCallStats()).result.result;
+if (counters2.length > 0 && counters2.length < counters.length)
+ InspectorTest.log('Less counters reported');
+await Protocol.Profiler.disableRuntimeCallStats();
+
+await Protocol.Runtime.disable();
+InspectorTest.completeTest();
})().catch(e => InspectorTest.log('caught: ' + e));
diff --git a/deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache-expected.txt b/deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache-expected.txt
new file mode 100644
index 0000000000..c52b590858
--- /dev/null
+++ b/deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache-expected.txt
@@ -0,0 +1,24 @@
+Tests that Runtime.evaluate's REPL mode correctly interacts with the compliation cache (crbug.com/1108021)
+Prefill the cache with non-REPL mode script
+{
+ id : <messageId>
+ result : {
+ result : {
+ description : 8
+ type : number
+ value : 8
+ }
+ }
+}
+REPL mode scripts always return a Promise.
+The first script only returns "8" instead. When the inspector doesn't find a promise (due to a cache hit), it would respond with "undefined".
+{
+ id : <messageId>
+ result : {
+ result : {
+ description : 8
+ type : number
+ value : 8
+ }
+ }
+}
diff --git a/deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache.js b/deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache.js
new file mode 100644
index 0000000000..986660e71f
--- /dev/null
+++ b/deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache.js
@@ -0,0 +1,23 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {Protocol} = InspectorTest.start(
+ "Tests that Runtime.evaluate's REPL mode correctly interacts with the compliation cache (crbug.com/1108021)");
+
+(async function() {
+ InspectorTest.log('Prefill the cache with non-REPL mode script');
+ InspectorTest.logMessage(await Protocol.Runtime.evaluate({
+ expression: '5 + 3',
+ replMode: false,
+ }));
+
+ InspectorTest.log('REPL mode scripts always return a Promise.')
+ InspectorTest.log('The first script only returns "8" instead. When the inspector doesn\'t find a promise (due to a cache hit), it would respond with "undefined".');
+ InspectorTest.logMessage(await Protocol.Runtime.evaluate({
+ expression: '5 + 3',
+ replMode: true,
+ }));
+
+ InspectorTest.completeTest();
+})();
diff --git a/deps/v8/test/intl/intl.status b/deps/v8/test/intl/intl.status
index d96ffea076..ee54c92461 100644
--- a/deps/v8/test/intl/intl.status
+++ b/deps/v8/test/intl/intl.status
@@ -29,10 +29,6 @@
[ALWAYS, {
# TODO(jochen): The following test is flaky.
'overrides/caching': [PASS, FAIL],
-
- # https://code.google.com/p/v8/issues/detail?id=7481
- 'collator/check-kf-option': [FAIL],
- 'collator/check-kn-option': [FAIL],
}], # ALWAYS
['variant == no_wasm_traps', {
@@ -55,6 +51,7 @@
# Android's ICU data file does not have the Chinese/Japanese dictionary
# required for the test to pass.
'break-iterator/zh-break': [SKIP],
+ 'segmenter/word-containing': [SKIP],
# Unable to change locale on Android:
'relative-time-format/default-locale-fr-CA': [SKIP],
'relative-time-format/default-locale-pt-BR': [SKIP],
diff --git a/deps/v8/test/intl/regress-10438.js b/deps/v8/test/intl/regress-10438.js
index 0aafe4d700..a1bdf36f70 100644
--- a/deps/v8/test/intl/regress-10438.js
+++ b/deps/v8/test/intl/regress-10438.js
@@ -44,10 +44,10 @@ assertThrows(
() => (new Intl.DateTimeFormat(
"en", {timeStyle: "short", fractionalSecondDigits: 3})),
TypeError,
- "Invalid option : timeStyle");
+ "Can't set option fractionalSecondDigits when timeStyle is used");
assertThrows(
() => (new Intl.DateTimeFormat(
"en", {dateStyle: "short", fractionalSecondDigits: 3})),
TypeError,
- "Invalid option : dateStyle");
+ "Can't set option fractionalSecondDigits when dateStyle is used");
diff --git a/deps/v8/test/intl/regress-10613.js b/deps/v8/test/intl/regress-10613.js
index 1b15f3415c..55e04e9c91 100644
--- a/deps/v8/test/intl/regress-10613.js
+++ b/deps/v8/test/intl/regress-10613.js
@@ -14,6 +14,7 @@ let opt = {
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
+ fractionalSecondDigits: 2,
};
let keys = Object.keys(opt);
@@ -25,10 +26,10 @@ testTimeStyle.timeStyle = 'long';
for (key of keys) {
assertThrows(
() => new Intl.DateTimeFormat('en', testDateStyle),
- TypeError, "Invalid option : dateStyle");
+ TypeError, "Can't set option " + key + " when dateStyle is used");
assertThrows(
() => new Intl.DateTimeFormat('en', testTimeStyle),
- TypeError, "Invalid option : timeStyle");
+ TypeError, "Can't set option " + key + " when timeStyle is used");
testDateStyle[key] = undefined;
testTimeStyle[key] = undefined;
}
diff --git a/deps/v8/test/intl/regress-10836.js b/deps/v8/test/intl/regress-10836.js
new file mode 100644
index 0000000000..fe85eaf221
--- /dev/null
+++ b/deps/v8/test/intl/regress-10836.js
@@ -0,0 +1,45 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Verify the order of resolvedOptions()
+let df = new Intl.DateTimeFormat("en", {
+ weekday: "narrow",
+ era: "narrow",
+ year: "2-digit",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ fractionalSecondDigits: 2,
+ timeZoneName: "short"});
+let resolvedOptionsKeys = Object.keys(df.resolvedOptions()).join(":");
+
+assertEquals(
+ "locale:calendar:numberingSystem:timeZone:hourCycle:hour12:weekday:era:" +
+ "year:month:day:hour:minute:second:fractionalSecondDigits:timeZoneName",
+ resolvedOptionsKeys);
+
+// Verify the order of reading the options.
+
+let read = [];
+let options = {
+ get second() {
+ read.push("second");
+ return undefined;
+ },
+ get fractionalSecondDigits() {
+ read.push("fractionalSecondDigits");
+ return undefined;
+ },
+ get timeZoneName() {
+ read.push("timeZoneName");
+ return undefined;
+ }
+};
+
+df = new Intl.DateTimeFormat("en", options);
+assertEquals(
+ "second:fractionalSecondDigits:second:fractionalSecondDigits:timeZoneName",
+ read.join(":"));
diff --git a/deps/v8/test/intl/regress-1121156.js b/deps/v8/test/intl/regress-1121156.js
new file mode 100644
index 0000000000..cf0f245c3a
--- /dev/null
+++ b/deps/v8/test/intl/regress-1121156.js
@@ -0,0 +1,11 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-intl-segmenter --expose-gc
+
+let segmenter = new Intl.Segmenter();
+let segments = segmenter.segment(undefined);
+for (let seg of segments) {
+ segments = gc(); // free segments and call gc.
+}
diff --git a/deps/v8/test/intl/regress-1130489.js b/deps/v8/test/intl/regress-1130489.js
new file mode 100644
index 0000000000..bc169f9afb
--- /dev/null
+++ b/deps/v8/test/intl/regress-1130489.js
@@ -0,0 +1,30 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+function runNearStackLimit(f) {
+ function t() {
+ try {
+ return t();
+ } catch (e) {
+ return f();
+ }
+ }
+ try {
+ return t();
+ } catch (e) {}
+}
+
+const str = 'hello';
+const locale = new Intl.Locale('ja-u-co-eor-kf-lower-kn-false');
+
+function test(getLocaleFromCollator) {
+ const localeInCollator = getLocaleFromCollator(locale);
+ const temp = str("en");
+}
+
+runNearStackLimit(() => {
+ return test(args => {
+ new Intl.Collator(locale).resolvedOptions().locale;
+ })}
+);
diff --git a/deps/v8/test/intl/regress-1132641.js b/deps/v8/test/intl/regress-1132641.js
new file mode 100644
index 0000000000..3a052a0667
--- /dev/null
+++ b/deps/v8/test/intl/regress-1132641.js
@@ -0,0 +1,8 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Test invalid timezones under US/... won't cause crash.
+assertThrows(() => {
+ new Intl.DateTimeFormat("en" , { timeZone: "US/Alaska0" });},
+ RangeError);
diff --git a/deps/v8/test/intl/regress-9084.js b/deps/v8/test/intl/regress-9084.js
new file mode 100644
index 0000000000..2974d8b845
--- /dev/null
+++ b/deps/v8/test/intl/regress-9084.js
@@ -0,0 +1,10 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+["zh", "zh-CN", "zh-Hans", "zh-Hans-CN"].forEach((l) => {
+ assertEquals(
+ l,
+ (new Intl.Collator(
+ l, {localeMatcher: "lookup"} )).resolvedOptions().locale);
+});
diff --git a/deps/v8/test/js-perf-test/SuperIC.json b/deps/v8/test/js-perf-test/SuperIC.json
new file mode 100644
index 0000000000..cc97396778
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC.json
@@ -0,0 +1,364 @@
+{
+ "owners": ["marja@chromium.org"],
+ "name": "SuperIC",
+ "run_count": 3,
+ "run_count_arm": 1,
+ "run_count_arm64": 1,
+ "timeout": 120,
+ "timeout_arm64": 240,
+ "units": "score",
+ "total": true,
+ "resources": ["base.js"],
+ "tests": [
+ {
+ "name": "Monomorphic",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["monomorphic"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["monomorphic.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["monomorphic.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Monomorphic-MegaReceivers",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["monomorphic-mega-receivers"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Polymorphic-Mixin",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["polymorphic-mixin"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Polymorphic-Mixin-MegaReceivers",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["polymorphic-mixin-mega-receivers"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Megamorphic-Mixin",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["polymorphic-mixin"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Monomorphic-Getter",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["monomorphic-getter"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["monomorphic-getter.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic-getter.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["monomorphic-getter.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic-getter.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Monomorphic-MegaReceivers-Getter",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["monomorphic-mega-receivers-getter"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers-getter.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers-getter.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers-getter.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["monomorphic-mega-receivers-getter.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Polymorphic-Mixin-Getter",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["polymorphic-mixin-getter"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-getter.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-getter.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-getter.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-getter.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Polymorphic-Mixin-MegaReceivers-Getter",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["polymorphic-mixin-mega-receivers-getter"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers-getter.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers-getter.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers-getter.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["polymorphic-mixin-mega-receivers-getter.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ },
+ {
+ "name": "Megamorphic-Mixin-Getter",
+ "path": ["SuperIC"],
+ "results_regexp": "^%s\\(Score\\): (.+)$",
+ "test_flags": ["polymorphic-mixin-getter"],
+ "tests": [
+ {
+ "name": "baseline",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin-getter.js"],
+ "test_flags": ["baseline"]
+ },
+ {
+ "name": "baseline-noopt",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin-getter.js"],
+ "test_flags": ["baseline-noopt"],
+ "flags": ["--noopt"]
+ },
+ {
+ "name": "superic",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin-getter.js"],
+ "test_flags": ["superic"],
+ "flags": ["--super-ic"]
+ },
+ {
+ "name": "superic-noopt",
+ "main": "run.js",
+ "resources": ["megamorphic-mixin-getter.js"],
+ "test_flags": ["superic-noopt"],
+ "flags": ["--super-ic", "--noopt"]
+ }
+ ]
+ }
+ ]
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin-getter.js b/deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin-getter.js
new file mode 100644
index 0000000000..17264e68c8
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin-getter.js
@@ -0,0 +1,43 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS,
+ runBenchmark)
+]);
+
+function createSubclass() {
+ class A {
+ get super_prop() {
+ return 10;
+ }
+ };
+ class B extends A {
+ test() {
+ return super.super_prop;
+ }
+ };
+ return B;
+}
+
+const NO_CLASSES = 10;
+let objects = [];
+for (let i = 0; i < NO_CLASSES; ++i) {
+ const klass = createSubclass();
+ objects.push(new klass());
+}
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin.js b/deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin.js
new file mode 100644
index 0000000000..bd59bba19e
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin.js
@@ -0,0 +1,40 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS,
+ runBenchmark)
+]);
+
+function createSubclass() {
+ class A { };
+ A.prototype.super_prop = 10;
+ class B extends A {
+ test() {
+ return super.super_prop;
+ }
+ };
+ return B;
+}
+
+const NO_CLASSES = 10;
+let objects = [];
+for (let i = 0; i < NO_CLASSES; ++i) {
+ const klass = createSubclass();
+ objects.push(new klass());
+}
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/monomorphic-getter.js b/deps/v8/test/js-perf-test/SuperIC/monomorphic-getter.js
new file mode 100644
index 0000000000..7d35ef1008
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/monomorphic-getter.js
@@ -0,0 +1,35 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS, runBenchmark)
+]);
+
+class A {
+ get super_prop() {
+ return 10;
+ }
+};
+
+class B extends A {
+ test() {
+ return super.super_prop;
+ }
+};
+
+const objects = [new B(), new B(), new B(), new B()];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers-getter.js b/deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers-getter.js
new file mode 100644
index 0000000000..31845a1b46
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers-getter.js
@@ -0,0 +1,57 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS, runBenchmark)
+]);
+
+class A {
+ get super_prop() {
+ return 10;
+ }
+};
+
+class B extends A {
+ test() {
+ return super.super_prop;
+ }
+};
+
+class C0 extends B { };
+class C1 extends B { };
+class C2 extends B { };
+class C3 extends B { };
+class C4 extends B { };
+class C5 extends B { };
+class C6 extends B { };
+class C7 extends B { };
+class C8 extends B { };
+class C9 extends B { };
+
+const objects = [
+ new C0(),
+ new C1(),
+ new C2(),
+ new C3(),
+ new C4(),
+ new C5(),
+ new C6(),
+ new C7(),
+ new C8(),
+ new C9(),
+];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers.js b/deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers.js
new file mode 100644
index 0000000000..00ed665ad9
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers.js
@@ -0,0 +1,55 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS,
+ runBenchmark)
+]);
+
+class A { };
+A.prototype.super_prop = 10;
+
+class B extends A {
+ test() {
+ return super.super_prop;
+ }
+};
+
+class C0 extends B { };
+class C1 extends B { };
+class C2 extends B { };
+class C3 extends B { };
+class C4 extends B { };
+class C5 extends B { };
+class C6 extends B { };
+class C7 extends B { };
+class C8 extends B { };
+class C9 extends B { };
+
+const objects = [
+ new C0(),
+ new C1(),
+ new C2(),
+ new C3(),
+ new C4(),
+ new C5(),
+ new C6(),
+ new C7(),
+ new C8(),
+ new C9(),
+];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/monomorphic.js b/deps/v8/test/js-perf-test/SuperIC/monomorphic.js
new file mode 100644
index 0000000000..3b48fcb62a
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/monomorphic.js
@@ -0,0 +1,32 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS, runBenchmark)
+]);
+
+class A { };
+A.prototype.super_prop = 10;
+
+class B extends A {
+ test() {
+ return super.super_prop;
+ }
+};
+
+const objects = [new B(), new B(), new B(), new B()];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-getter.js b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-getter.js
new file mode 100644
index 0000000000..3413630575
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-getter.js
@@ -0,0 +1,44 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS,
+ runBenchmark)
+]);
+
+function createSubclass() {
+ class A {
+ get super_prop() {
+ return 10;
+ }
+ };
+ class B extends A {
+ test() {
+ return super.super_prop;
+ }
+ };
+ return B;
+}
+
+const b1 = createSubclass();
+const b2 = createSubclass();
+
+const objects = [
+ new b1(),
+ new b2()
+];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers-getter.js b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers-getter.js
new file mode 100644
index 0000000000..5d60e3687a
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers-getter.js
@@ -0,0 +1,63 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS, runBenchmark)
+]);
+
+
+function createSubclass() {
+ class A {
+ get super_prop() {
+ return 10;
+ }
+ };
+ class B extends A {
+ test() {
+ return super.super_prop;
+ }
+ };
+ return B;
+}
+
+const b1 = createSubclass();
+const b2 = createSubclass();
+
+class C0 extends b1 { };
+class C1 extends b2 { };
+class C2 extends b1 { };
+class C3 extends b2 { };
+class C4 extends b1 { };
+class C5 extends b2 { };
+class C6 extends b1 { };
+class C7 extends b2 { };
+class C8 extends b1 { };
+class C9 extends b2 { };
+
+const objects = [
+ new C0(),
+ new C1(),
+ new C2(),
+ new C3(),
+ new C4(),
+ new C5(),
+ new C6(),
+ new C7(),
+ new C8(),
+ new C9(),
+];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers.js b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers.js
new file mode 100644
index 0000000000..0e115bf6f9
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers.js
@@ -0,0 +1,59 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS, runBenchmark)
+]);
+
+function createSubclass() {
+ class A { };
+ A.prototype.super_prop = 10;
+ class B extends A {
+ test() {
+ return super.super_prop;
+ }
+ };
+ return B;
+}
+
+const b1 = createSubclass();
+const b2 = createSubclass();
+
+class C0 extends b1 { };
+class C1 extends b2 { };
+class C2 extends b1 { };
+class C3 extends b2 { };
+class C4 extends b1 { };
+class C5 extends b2 { };
+class C6 extends b1 { };
+class C7 extends b2 { };
+class C8 extends b1 { };
+class C9 extends b2 { };
+
+const objects = [
+ new C0(),
+ new C1(),
+ new C2(),
+ new C3(),
+ new C4(),
+ new C5(),
+ new C6(),
+ new C7(),
+ new C8(),
+ new C9(),
+];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin.js b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin.js
new file mode 100644
index 0000000000..e9b797a0b7
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin.js
@@ -0,0 +1,41 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const DETERMINISTIC_RUNS = 10000;
+new BenchmarkSuite(BENCHMARK_NAME, [1000], [
+ new Benchmark(BENCHMARK_NAME, false, false, DETERMINISTIC_RUNS,
+ runBenchmark)
+]);
+
+function createSubclass() {
+ class A { };
+ A.prototype.super_prop = 10;
+ class B extends A {
+ test() {
+ return super.super_prop;
+ }
+ };
+ return B;
+}
+
+const b1 = createSubclass();
+const b2 = createSubclass();
+
+const objects = [
+ new b1(),
+ new b2()
+];
+
+let ix = 0;
+const EXPECTED_VALUE = 10;
+
+function runBenchmark() {
+ const r = objects[ix].test();
+ if (r != EXPECTED_VALUE) {
+ throw new Error("Test error");
+ }
+ if (++ix == objects.length) {
+ ix = 0;
+ }
+}
diff --git a/deps/v8/test/js-perf-test/SuperIC/run.js b/deps/v8/test/js-perf-test/SuperIC/run.js
new file mode 100644
index 0000000000..64e306a79d
--- /dev/null
+++ b/deps/v8/test/js-perf-test/SuperIC/run.js
@@ -0,0 +1,24 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+load('../base.js');
+
+BENCHMARK_NAME = arguments[1];
+load(arguments[0] + '.js');
+
+var success = true;
+
+function PrintResult(name, result) {
+ print(name + '(Score): ' + result);
+}
+
+function PrintError(name, error) {
+ PrintResult(name, error);
+ success = false;
+}
+
+BenchmarkSuite.config.doWarmup = false;
+BenchmarkSuite.config.doDeterministic = true;
+
+BenchmarkSuite.RunSuites({NotifyResult: PrintResult, NotifyError: PrintError});
diff --git a/deps/v8/test/message/mjsunit/fail/assert-in-promise-fail-recursive.out b/deps/v8/test/message/mjsunit/fail/assert-in-promise-fail-recursive.out
index 870a249b84..9f051b526c 100644
--- a/deps/v8/test/message/mjsunit/fail/assert-in-promise-fail-recursive.out
+++ b/deps/v8/test/message/mjsunit/fail/assert-in-promise-fail-recursive.out
@@ -9,4 +9,3 @@ Error: WebAssembly.compile(): Argument 0 must be a buffer source
at *%(basename)s:12:9
1 pending unhandled Promise rejection(s) detected.
-
diff --git a/deps/v8/test/message/wasm-trace-memory-liftoff.js b/deps/v8/test/message/wasm-trace-memory-liftoff.js
index 05c30a219e..ad1b9e4042 100644
--- a/deps/v8/test/message/wasm-trace-memory-liftoff.js
+++ b/deps/v8/test/message/wasm-trace-memory-liftoff.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --no-stress-opt --trace-wasm-memory --liftoff --no-future
+// Flags: --no-stress-opt --trace-wasm-memory --liftoff
// Flags: --no-wasm-tier-up --experimental-wasm-simd
// Flags: --enable-sse3 --enable-sse4-1
diff --git a/deps/v8/test/message/wasm-trace-memory.js b/deps/v8/test/message/wasm-trace-memory.js
index b268c63106..b31dbb8e1f 100644
--- a/deps/v8/test/message/wasm-trace-memory.js
+++ b/deps/v8/test/message/wasm-trace-memory.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --no-stress-opt --trace-wasm-memory --no-liftoff --no-future
+// Flags: --no-stress-opt --trace-wasm-memory --no-liftoff
// Flags: --experimental-wasm-simd
load("test/mjsunit/wasm/wasm-module-builder.js");
diff --git a/deps/v8/test/mjsunit/BUILD.gn b/deps/v8/test/mjsunit/BUILD.gn
index f48c0bba5e..f6259de56c 100644
--- a/deps/v8/test/mjsunit/BUILD.gn
+++ b/deps/v8/test/mjsunit/BUILD.gn
@@ -12,19 +12,21 @@ group("v8_mjsunit") {
data = [
"./",
+ "../../tools/arguments.js",
"../../tools/clusterfuzz/v8_mock.js",
"../../tools/clusterfuzz/v8_mock_archs.js",
"../../tools/clusterfuzz/v8_mock_webassembly.js",
- "../../tools/codemap.js",
- "../../tools/consarray.js",
- "../../tools/csvparser.js",
- "../../tools/logreader.js",
- "../../tools/arguments.js",
- "../../tools/profile.js",
- "../../tools/profile_view.js",
- "../../tools/profviz/composer.js",
- "../../tools/splaytree.js",
- "../../tools/tickprocessor.js",
- "../../tools/dumpcpp.js",
+ "../../tools/codemap.mjs",
+ "../../tools/consarray.mjs",
+ "../../tools/csvparser.mjs",
+ "../../tools/logreader.mjs",
+ "../../tools/arguments.mjs",
+ "../../tools/profile.mjs",
+ "../../tools/profile_view.mjs",
+ "../../tools/splaytree.mjs",
+ "../../tools/tickprocessor.mjs",
+ "../../tools/system-analyzer/log/log.mjs",
+ "../../tools/system-analyzer/timeline.mjs",
+ "../../tools/dumpcpp.mjs",
]
}
diff --git a/deps/v8/test/mjsunit/asm/regress-1069173.js b/deps/v8/test/mjsunit/asm/regress-1069173.js
new file mode 100644
index 0000000000..d4160463a6
--- /dev/null
+++ b/deps/v8/test/mjsunit/asm/regress-1069173.js
@@ -0,0 +1,18 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function foo() {
+ "use asm";
+ const v = -0;
+ function bar() {
+ return v;
+ }
+ return { d: bar };
+}
+
+var m = foo();
+assertEquals(-Infinity, 1 / m.d());
+assertTrue(%IsAsmWasmCode(foo));
diff --git a/deps/v8/test/mjsunit/call-lhs-web-compat-early-errors.js b/deps/v8/test/mjsunit/call-lhs-web-compat-early-errors.js
new file mode 100644
index 0000000000..3ac1cbe4d6
--- /dev/null
+++ b/deps/v8/test/mjsunit/call-lhs-web-compat-early-errors.js
@@ -0,0 +1,69 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Will be used in the tests
+function foo() {}
+
+function wrapInLazyFunction(s) {
+ // Use an async function, since some tests use the await keyword.
+ return "async function test() { " + s + "}";
+}
+
+function wrapInEagerFunction(s) {
+ // Use an async function, since some tests use the await keyword. Await the
+ // result, so that we get the error right away.
+ return "await (async function test() { " + s + "})();";
+}
+
+function assertEarlyError(s) {
+ assertThrows(wrapInLazyFunction(s), SyntaxError);
+}
+
+function assertLateError(s) {
+ assertDoesNotThrow(wrapInLazyFunction(s));
+ assertThrows(wrapInEagerFunction(s), ReferenceError);
+}
+
+// Web compatibility:
+assertLateError("foo() = 0;");
+assertLateError("foo()++;");
+assertLateError("foo()--;");
+assertLateError("++foo();");
+assertLateError("--foo();");
+assertLateError("foo() = 1;");
+assertLateError("foo() += 1;");
+assertLateError("foo() -= 1;");
+assertLateError("foo() *= 1;");
+assertLateError("foo() /= 1;");
+assertLateError("for (foo() = 0; ; ) {}");
+assertLateError("for ( ; ; foo() = 0) {}");
+assertLateError("for (foo() of []) {}");
+assertLateError("for (foo() in {}) {}");
+assertLateError("for await (foo() of []) {}");
+
+// These are early errors though:
+assertEarlyError("for (let foo() = 0; ;) {}");
+assertEarlyError("for (const foo() = 0; ;) {}");
+assertEarlyError("for (var foo() = 0; ;) {}");
+
+// Modern language features:
+// Tagged templates
+assertEarlyError("foo() `foo` ++;");
+assertEarlyError("foo() `foo` --;");
+assertEarlyError("++ foo() `foo`;");
+assertEarlyError("-- foo() `foo`;");
+assertEarlyError("foo() `foo` = 1;");
+assertEarlyError("foo() `foo` += 1;");
+assertEarlyError("foo() `foo` -= 1;");
+assertEarlyError("foo() `foo` *= 1;");
+assertEarlyError("foo() `foo` /= 1;");
+assertEarlyError("for (foo() `foo` = 0; ; ) {}");
+assertEarlyError("for (; ; foo() `foo` = 0) {}");
+
+// Logical assignment
+assertEarlyError("foo() &&= 1;");
+assertEarlyError("foo() ||= 1;");
+assertEarlyError("foo() ??= 1;");
+assertEarlyError("for (foo() &&= 0; ;) {}");
+assertEarlyError("for ( ; ; foo() &&= 0) {}");
diff --git a/deps/v8/test/mjsunit/check-bounds-array-index.js b/deps/v8/test/mjsunit/check-bounds-array-index.js
index c5b849b8c0..8367a4c81c 100644
--- a/deps/v8/test/mjsunit/check-bounds-array-index.js
+++ b/deps/v8/test/mjsunit/check-bounds-array-index.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
//
// Flags: --allow-natives-syntax --opt --no-always-opt
+// Flags: --no-stress-flush-bytecode
let arr = [1, 2, 3];
diff --git a/deps/v8/test/mjsunit/check-bounds-string-from-char-code-at.js b/deps/v8/test/mjsunit/check-bounds-string-from-char-code-at.js
index 3fc2cf17ac..210edf944e 100644
--- a/deps/v8/test/mjsunit/check-bounds-string-from-char-code-at.js
+++ b/deps/v8/test/mjsunit/check-bounds-string-from-char-code-at.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
//
// Flags: --allow-natives-syntax --opt --no-always-opt
+// Flags: --no-stress-flush-bytecode
let string = "foobar";
diff --git a/deps/v8/test/mjsunit/compiler/consecutive-addition.js b/deps/v8/test/mjsunit/compiler/consecutive-addition.js
new file mode 100644
index 0000000000..cc07144e7d
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/consecutive-addition.js
@@ -0,0 +1,30 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function f1(n) {
+ var a = n + 2;
+ return a + 3;
+}
+
+%PrepareFunctionForOptimization(f1);
+assertEquals(f1(1), 6);
+assertEquals(f1(2), 7);
+%OptimizeFunctionOnNextCall(f1);
+assertEquals(f1(13), 18);
+assertEquals(f1(14), 19);
+
+function f2(n, odd) {
+ var a = n + 2;
+ if (odd) return a;
+ return a + 3;
+}
+
+%PrepareFunctionForOptimization(f2);
+assertEquals(f2(1, true), 3);
+assertEquals(f2(2, false), 7);
+%OptimizeFunctionOnNextCall(f2);
+assertEquals(f2(13, true), 15);
+assertEquals(f2(14, false), 19);
diff --git a/deps/v8/test/mjsunit/compiler/native-context-specialization-hole-check.js b/deps/v8/test/mjsunit/compiler/native-context-specialization-hole-check.js
index 94b30db2d0..8d5b3ab94c 100644
--- a/deps/v8/test/mjsunit/compiler/native-context-specialization-hole-check.js
+++ b/deps/v8/test/mjsunit/compiler/native-context-specialization-hole-check.js
@@ -38,7 +38,7 @@ function f() {
arr[500] = 20;
arr[10] = arr[50];
}
-%EnsureFeedbackVectorForFunction(f);
+%PrepareFunctionForOptimization(f);
function g() {
f();
diff --git a/deps/v8/test/mjsunit/compiler/regress-1126771.js b/deps/v8/test/mjsunit/compiler/regress-1126771.js
new file mode 100644
index 0000000000..5440e96d94
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/regress-1126771.js
@@ -0,0 +1,45 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+let __callGC;
+(function () {
+ __callGC = function() {};
+})();
+
+var __v_5 = {};
+var __v_9 = {x: {}};
+
+function main() {
+ function __f_6() { this.elms = new Array(); }
+ __f_6.prototype.size = function () { return this.elms.length; };
+ function __f_7() { this.v = new __f_6(); }
+ __f_7.prototype.add = function (__v_25) { this.v.elms.push(__v_25); };
+ __f_7.prototype.size = function () { return this.v.size(); };
+ __f_7.prototype.execute = function () {
+ for (var __v_28 = 0; __v_28 < this.size(); __v_28++) {
+ delete __v_9[__v_9, 538276];
+ __callGC();
+ }
+ };
+ var __v_22 = new __f_7();
+ for (var __v_23 = 0; __v_23 < 10; __v_23++) {
+ try {
+ if (__v_5 != null && typeof __v_5 == "object") {
+ try {
+ Object.defineProperty(__v_5, 807285, {get: function() {}});
+ } catch (e) {}
+ }
+ __v_22.add();
+ } catch (e) {}
+ }
+ __v_22.execute();
+}
+
+%PrepareFunctionForOptimization(main);
+main();
+main();
+%OptimizeFunctionOnNextCall(main);
+main();
diff --git a/deps/v8/test/mjsunit/compiler/regress-1127405.js b/deps/v8/test/mjsunit/compiler/regress-1127405.js
new file mode 100644
index 0000000000..cf872cbd72
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/regress-1127405.js
@@ -0,0 +1,18 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+// Flags: --no-analyze-environment-liveness --no-use-ic --assert-types
+
+const symbol = Symbol();
+
+function foo(x) {
+ try { x[symbol] = 42 } catch (e) {}
+ new Number();
+}
+
+%PrepareFunctionForOptimization(foo);
+foo({});
+%OptimizeFunctionOnNextCall(foo);
+foo({});
diff --git a/deps/v8/test/mjsunit/compiler/serializer-dead-after-jump.js b/deps/v8/test/mjsunit/compiler/serializer-dead-after-jump.js
index 5f47d4174b..b147530ba0 100644
--- a/deps/v8/test/mjsunit/compiler/serializer-dead-after-jump.js
+++ b/deps/v8/test/mjsunit/compiler/serializer-dead-after-jump.js
@@ -16,6 +16,7 @@ function main(b, ret) {
return ret;
} else {
x.foo = 42;
+ out = x; // Prevent x's new map from dying too early.
return f(y);
}
}
diff --git a/deps/v8/test/mjsunit/compiler/serializer-dead-after-return.js b/deps/v8/test/mjsunit/compiler/serializer-dead-after-return.js
index d8d65eb5cf..6e321d5c1d 100644
--- a/deps/v8/test/mjsunit/compiler/serializer-dead-after-return.js
+++ b/deps/v8/test/mjsunit/compiler/serializer-dead-after-return.js
@@ -15,6 +15,7 @@ function main(b, ret) {
if (b) return ret;
x.foo = 42;
+ out = x; // Prevent x's new map from dying too early.
return f(y);
}
diff --git a/deps/v8/test/mjsunit/constant-folding-2.js b/deps/v8/test/mjsunit/constant-folding-2.js
index 68b05fd7c4..9b3a625cbe 100644
--- a/deps/v8/test/mjsunit/constant-folding-2.js
+++ b/deps/v8/test/mjsunit/constant-folding-2.js
@@ -27,6 +27,7 @@
// Flags: --allow-natives-syntax --nostress-opt --opt
+// Flags: --no-stress-flush-bytecode
function test(f, iterations) {
%PrepareFunctionForOptimization(f);
diff --git a/deps/v8/test/mjsunit/destruct-array-spread-done.js b/deps/v8/test/mjsunit/destruct-array-spread-done.js
new file mode 100644
index 0000000000..62f47d3ce2
--- /dev/null
+++ b/deps/v8/test/mjsunit/destruct-array-spread-done.js
@@ -0,0 +1,26 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+let called = 0
+const it = {
+ [Symbol.iterator]() {
+ return this;
+ },
+ next() {
+ called += 1;
+ return {
+ value: 42,
+ done: true,
+ };
+ },
+};
+
+const [a, b, ...c] = it;
+
+assertEquals(called, 1);
+assertEquals(a, undefined);
+assertEquals(b, undefined);
+assertEquals(c.length, 0);
diff --git a/deps/v8/test/mjsunit/ensure-growing-store-learns.js b/deps/v8/test/mjsunit/ensure-growing-store-learns.js
index 5340919472..ba5e5ae5a9 100644
--- a/deps/v8/test/mjsunit/ensure-growing-store-learns.js
+++ b/deps/v8/test/mjsunit/ensure-growing-store-learns.js
@@ -2,8 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --allow-natives-syntax --noverify-heap --noenable-slow-asserts
-// Flags: --opt --no-always-opt
+// Overwrite the value for --noverify-heap and
+// --noenable-slow-asserts, which the test runner already set to true before.
+// Due to flag contradiction checking, this requires
+// --allow-overwriting-for-next-flag to avoid an error.
+// Flags: --allow-overwriting-for-next-flag --noverify-heap
+// Flags: --allow-overwriting-for-next-flag --noenable-slow-asserts
+// Flags: --allow-natives-syntax --opt --no-always-opt
// --noverify-heap and --noenable-slow-asserts are set because the test is too
// slow with it on.
diff --git a/deps/v8/test/mjsunit/es6/object-assign.js b/deps/v8/test/mjsunit/es6/object-assign.js
index 2573e3d3c7..9c8e349ac4 100644
--- a/deps/v8/test/mjsunit/es6/object-assign.js
+++ b/deps/v8/test/mjsunit/es6/object-assign.js
@@ -226,3 +226,20 @@ assertSame(Object.assign(o, {}), o);
assertEquals(log, ["get a", "get b", "get c", "get sym1", "get sym2"]);
})();
+
+(function global_object() {
+ let source = {
+ global1: "global1",
+ get global2() { return "global2" },
+ };
+ let result = Object.assign(globalThis, source);
+ assertTrue(result === globalThis);
+ assertTrue(result.global1 === source.global1);
+ assertTrue(result.global2 === source.global2);
+
+ let target = {};
+ result = Object.assign(target, globalThis);
+ assertTrue(result === target);
+ assertTrue(result.global1 === source.global1);
+ assertTrue(result.global2 === source.global2);
+})();
diff --git a/deps/v8/test/mjsunit/es6/super-ic.js b/deps/v8/test/mjsunit/es6/super-ic.js
new file mode 100644
index 0000000000..60f6a2394a
--- /dev/null
+++ b/deps/v8/test/mjsunit/es6/super-ic.js
@@ -0,0 +1,456 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --super-ic
+
+function forceDictionaryMode(obj) {
+ for (let i = 0; i < 2000; ++i) {
+ obj["prop" + i] = "prop_value";
+ }
+}
+
+(function TestHomeObjectPrototypeNull() {
+ class A {}
+
+ class B extends A {
+ bar() {
+ return super.y;
+ }
+ };
+
+ let o = new B();
+ B.prototype.__proto__ = null;
+ assertThrows(() => { o.bar(); });
+})();
+
+(function TestMonomorphic() {
+ class A {}
+ A.prototype.bar = "wrong value: A.prototype.bar";
+
+ class B extends A {};
+ B.prototype.bar = "correct value";
+
+ class C extends B {};
+
+ class D extends C {
+ foo() { return super.bar; }
+ }
+ D.prototype.bar = "wrong value: D.prototype.bar";
+
+ let o = new D();
+ o.bar = "wrong value: o.bar";
+ for (let i = 0; i < 100; ++i) {
+ const r = o.foo();
+ assertEquals("correct value", r);
+ }
+})();
+
+(function TestMonomorphicWithGetter() {
+ class A {}
+ A.prototype.bar = "wrong value: A.prototype.bar";
+
+ class B extends A {
+ get bar() {
+ return this.test_value;
+ }
+ };
+
+ class C extends B {}
+
+ class D extends C {
+ foo() {
+ const b = super.bar;
+ return b;
+ }
+ }
+ D.prototype.bar = "wrong value: D.prototype.bar";
+
+ let o = new D();
+ o.bar = "wrong value: o.bar";
+ o.test_value = "correct value";
+ for (let i = 0; i < 1000; ++i) {
+ const r = o.foo();
+ assertEquals("correct value", r);
+ }
+})();
+
+(function TestPolymorphic() {
+ class A {}
+ A.prototype.bar = "wrong value: A.prototype.bar";
+
+ class B extends A {}
+ B.prototype.bar = "correct value";
+
+ class C extends B {}
+
+ class D extends C {
+ foo() { return super.bar; }
+ }
+ D.prototype.bar = "wrong value: D.prototype.bar";
+
+ const o = new D();
+
+ // Create objects which will act as the "home object's prototype" later.
+ const prototypes = [{"a": 0}, {"b": 0}];
+ for (let i = 0; i < prototypes.length; ++i) {
+ prototypes[i].__proto__ = B.prototype;
+ }
+
+ for (let i = 0; i < 1000; ++i) {
+ D.prototype.__proto__ = prototypes[i % prototypes.length];
+ const r = o.foo();
+ assertEquals("correct value", r);
+ }
+})();
+
+(function TestPolymorphicWithGetter() {
+ class A {}
+ A.prototype.bar = "wrong value: A.prototype.bar";
+
+ class B extends A {
+ get bar() {
+ return this.test_value;
+ }
+ };
+
+ class C extends B {}
+
+ class D extends C {
+ foo() { return super.bar; }
+ }
+ D.prototype.bar = "wrong value: D.prototype.bar";
+
+ const o = new D();
+ o.test_value = "correct value";
+
+ // Create objects which will act as the "home object's prototype" later.
+ const prototypes = [{"a": 0}, {"b": 0}];
+ for (let i = 0; i < prototypes.length; ++i) {
+ prototypes[i].__proto__ = B.prototype;
+ }
+
+ for (let i = 0; i < 1000; ++i) {
+ D.prototype.__proto__ = prototypes[i % prototypes.length];
+ const r = o.foo();
+ assertEquals("correct value", r);
+ }
+})();
+
+(function TestMegamorphic() {
+ class A {}
+ A.prototype.bar = "wrong value: A.prototype.bar";
+
+ class B extends A {}
+ B.prototype.bar = "correct value";
+
+ class C extends B {}
+
+ class D extends C {
+ foo() { return super.bar; }
+ }
+ D.prototype.bar = "wrong value: D.prototype.bar";
+
+ const o = new D();
+
+ // Create objects which will act as the "home object's prototype" later.
+ const prototypes = [{"a": 0}, {"b": 0}, {"c": 0}, {"d": 0}, {"e": 0},
+ {"f": 0}, {"g": 0}, {"e": 0}];
+
+ for (let i = 0; i < prototypes.length; ++i) {
+ prototypes[i].__proto__ = B.prototype;
+ }
+
+ for (let i = 0; i < 1000; ++i) {
+ D.prototype.__proto__ = prototypes[i % prototypes.length];
+ const r = o.foo();
+ assertEquals("correct value", r);
+ }
+})();
+
+(function TestMegamorphicWithGetter() {
+ class A {}
+ A.prototype.bar = "wrong value: A.prototype.bar";
+
+ class B extends A {
+ get bar() {
+ return this.test_value;
+ }
+ };
+
+ class C extends B {}
+
+ class D extends C {
+ foo() { return super.bar;}
+ }
+ D.prototype.bar = "wrong value: D.prototype.bar";
+
+ const o = new D();
+ o.test_value = "correct value";
+
+ // Create objects which will act as the "home object's prototype" later.
+ const prototypes = [{"a": 0}, {"b": 0}, {"c": 0}, {"d": 0}, {"e": 0},
+ {"f": 0}, {"g": 0}, {"e": 0}];
+ for (let i = 0; i < prototypes.length; ++i) {
+ prototypes[i].__proto__ = B.prototype;
+ }
+
+ for (let i = 0; i < 1000; ++i) {
+ D.prototype.__proto__ = prototypes[i % prototypes.length];
+ const r = o.foo();
+ assertEquals("correct value", r);
+ }
+})();
+
+(function TestHolderHandledCorrectlyAfterOptimization() {
+ class A {
+ m() { return "m return value"; }
+ get boom() { return this.m; }
+ }
+ class B extends A { f() { return super.boom() } }
+
+ %PrepareFunctionForOptimization(B.prototype.f);
+ const r1 = new B().f();
+ assertEquals("m return value", r1);
+ const r2 = new B().f();
+ assertEquals("m return value", r2);
+})();
+
+(function TestHolderHandledCorrectlyAfterOptimization2() {
+ class A {
+ m() { return "m return value"; }
+ get boom() { return this.m; }
+ }
+ class Middle1 extends A {}
+ class Middle2 extends Middle1 {}
+ class B extends Middle2 { f() { return super.boom() } }
+
+ %PrepareFunctionForOptimization(B.prototype.f);
+ const r1 = new B().f();
+ assertEquals("m return value", r1);
+ const r2 = new B().f();
+ assertEquals("m return value", r2);
+})();
+
+(function TestStubCacheConfusion() {
+ // Regression test for using the wrong stub from the stub cache.
+
+ class A {};
+ A.prototype.foo = "foo from A.prototype";
+
+ class B extends A {
+ m() { return super.foo; }
+ }
+
+ // Create objects which will act as receivers for the method call. All of
+ // them will have a different map.
+ class C0 extends B { foo = "foo from C0"; };
+ class C1 extends B { foo = "foo from C1"; };
+ class C2 extends B { foo = "foo from C2"; };
+ class C3 extends B { foo = "foo from C3"; };
+ class C4 extends B { foo = "foo from C4"; };
+ class C5 extends B { foo = "foo from C5"; };
+ class C6 extends B { foo = "foo from C6"; };
+ class C7 extends B { foo = "foo from C7"; };
+ class C8 extends B { foo = "foo from C8"; };
+ class C9 extends B { foo = "foo from C9"; };
+
+ let receivers = [
+ new C0(), new C1(), new C2(), new C3(), new C4(), new C5(), new C6(), new C7(),
+ new C8(), new C9()
+ ];
+
+ // Fill the stub cache with handlers which access "foo" from the receivers.
+ function getfoo(o) {
+ return o.foo;
+ }
+
+ for (let i = 0; i < 1000; ++i) {
+ getfoo(receivers[i % receivers.length]);
+ }
+
+ // Create objects which will act as the "home object's prototype" later.
+ const prototypes = [{"a": "prop in prototypes[0]"},
+ {"b": "prop in prototypes[1]"},
+ {"c": "prop in prototypes[2]"},
+ {"d": "prop in prototypes[3]"},
+ {"e": "prop in prototypes[4]"},
+ {"f": "prop in prototypes[5]"},
+ {"g": "prop in prototypes[6]"},
+ {"h": "prop in prototypes[7]"},
+ {"i": "prop in prototypes[8]"},
+ {"j": "prop in prototypes[9]"}];
+ for (let i = 0; i < prototypes.length; ++i) {
+ prototypes[i].__proto__ = A.prototype;
+ }
+
+ for (let i = 0; i < 1000; ++i) {
+ // Make the property load for "super.foo" megamorphic in terms of the home
+ // object's prototype.
+ B.prototype.__proto__ = prototypes[i % prototypes.length];
+ const r = receivers[i % receivers.length].m();
+ // The bug was that we used the same handlers which were accessing "foo"
+ // from the receivers, instead of accessing "foo" from the home object's
+ // prototype.
+ assertEquals("foo from A.prototype", r);
+ }
+})();
+
+(function TestLengthConfusion() {
+ // Regression test for confusion between bound function length and array
+ // length.
+ class A {};
+
+ class B extends A {
+ m() {
+ return super.length;
+ }
+ }
+
+ // Create a "home object proto" object which is a bound function.
+ let home_object_proto = (function() {}).bind({});
+ forceDictionaryMode(home_object_proto);
+ B.prototype.__proto__ = home_object_proto;
+
+ assertEquals(0, home_object_proto.length);
+
+ for (let i = 0; i < 1000; ++i) {
+ const r = B.prototype.m.call([1, 2]);
+ // The bug was that here we retrieved the length of the receiver array
+ // instead of the home object's __proto__.
+ assertEquals(home_object_proto.length, r);
+ }
+})();
+
+(function TestSuperInsideArrowFunction() {
+ class A {};
+ A.prototype.foo = "correct value";
+
+ class B extends A {
+ m() {
+ const bar = () => {
+ return super.foo;
+ }
+ return bar();
+ }
+
+ n() {
+ const bar = () => {
+ return super.foo;
+ }
+ return bar;
+ }
+ };
+
+ assertEquals(A.prototype.foo, (new B).m());
+ assertEquals(A.prototype.foo, (new B).n()());
+})();
+
+// Regression test for a receiver vs lookup start object confusion.
+(function TestProxyAsLookupStartObject1() {
+ class A {}
+ class B extends A {
+ bar() {
+ return super.foo;
+ }
+ }
+
+ const o = new B();
+ B.prototype.__proto__ = new Proxy({}, {});
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(undefined, o.bar());
+ }
+})();
+
+(function TestProxyAsLookupStartObject2() {
+ class A {}
+ class B extends A {
+ bar() {
+ return super.foo;
+ }
+ }
+
+ const o = new B();
+ forceDictionaryMode(o);
+ o.foo = "wrong value";
+ B.prototype.__proto__ = new Proxy({}, {});
+
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(undefined, o.bar());
+ }
+})();
+
+(function TestProxyAsLookupStartObject3() {
+ class A {}
+ class B extends A {
+ bar() {
+ return super.foo;
+ }
+ }
+
+ const o = new B();
+ B.prototype.__proto__ = new Proxy({}, {});
+ B.prototype.__proto__.foo = "correct value";
+
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(B.prototype.__proto__.foo, o.bar());
+ }
+})();
+
+(function TestDictionaryModeHomeObjectProto1() {
+ class A {}
+ forceDictionaryMode(A.prototype);
+ A.prototype.foo = "correct value";
+ class B extends A {
+ bar() {
+ return super.foo;
+ }
+ }
+ const o = new B();
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(A.prototype.foo, o.bar());
+ }
+})();
+
+(function TestDictionaryModeHomeObjectProto2() {
+ class A {}
+ A.prototype.foo = "correct value";
+ class B extends A {};
+ forceDictionaryMode(B.prototype);
+ class C extends B {
+ bar() {
+ return super.foo;
+ }
+ }
+ const o = new C();
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(A.prototype.foo, o.bar());
+ }
+})();
+
+(function TestHomeObjectProtoIsGlobalThis() {
+ class A {};
+ class B extends A {
+ bar() { return super.foo; }
+ }
+ B.prototype.__proto__ = globalThis;
+
+ const o = new B();
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(undefined, o.bar());
+ }
+})();
+
+// Regression test for (mis)using the prototype validity cell mechanism.
+(function TestLoadFromDictionaryModePrototype() {
+ const obj1 = {};
+ const obj2 = {__proto__: obj1};
+ forceDictionaryMode(obj1);
+
+ for (let i = 0; i < 1000; ++i) {
+ assertEquals(undefined, obj1.x);
+ }
+
+ obj1.x = "added";
+ assertEquals("added", obj1.x);
+})();
diff --git a/deps/v8/test/mjsunit/es6/unicode-regexp-ignore-case-noi18n.js b/deps/v8/test/mjsunit/es6/unicode-regexp-ignore-case-noi18n.js
index 8f110e1d21..268cf1655c 100644
--- a/deps/v8/test/mjsunit/es6/unicode-regexp-ignore-case-noi18n.js
+++ b/deps/v8/test/mjsunit/es6/unicode-regexp-ignore-case-noi18n.js
@@ -2,6 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// ASCII case folding with two-byte subject string.
+assertTrue(/[a]/ui.test("\u{20a0}a"));
+assertTrue(/[a]/ui.test("\u{20a0}A"));
+assertTrue(/[A]/ui.test("\u{20a0}a"));
+assertTrue(/[A]/ui.test("\u{20a0}A"));
+
// Non-unicode use toUpperCase mappings.
assertFalse(/[\u00e5]/i.test("\u212b"));
assertFalse(/[\u212b]/i.test("\u00e5\u1234"));
@@ -29,24 +35,20 @@ assertFalse(/\u{10400}/ui.test("\u{10428}"));
assertFalse(/\ud801\udc00/ui.test("\u{10428}"));
assertFalse(/[\u{10428}]/ui.test("\u{10400}"));
assertFalse(/[\ud801\udc28]/ui.test("\u{10400}"));
+assertEquals(["\uff21\u{10400}"],
+ /[\uff40-\u{10428}]+/ui.exec("\uff21\u{10400}abc"));
// TODO(v8:10120): Investigate why these don't behave as expected.
{
- // assertEquals(["\uff21\u{10400}"],
- // /[\uff40-\u{10428}]+/ui.exec("\uff21\u{10400}abc"));
- assertEquals(["\u{10400}"],
- /[\uff40-\u{10428}]+/ui.exec("\uff21\u{10400}abc"));
-}
-{
+ // Should be:
// assertEquals(["abc"], /[^\uff40-\u{10428}]+/ui.exec("\uff21\u{10400}abc\uff23"));
+ //
+ // But is:
assertEquals(["\u{ff21}"], /[^\uff40-\u{10428}]+/ui.exec("\uff21\u{10400}abc\uff23"));
}
-{
- // assertEquals(["\uff53\u24bb"],
- // /[\u24d5-\uff33]+/ui.exec("\uff54\uff53\u24bb\u24ba"));
- assertEquals(null,
- /[\u24d5-\uff33]+/ui.exec("\uff54\uff53\u24bb\u24ba"));
-}
+
+assertEquals(["\uff53\u24bb"],
+ /[\u24d5-\uff33]+/ui.exec("\uff54\uff53\u24bb\u24ba"));
// Full mappings are ignored.
assertFalse(/\u00df/ui.test("SS"));
diff --git a/deps/v8/test/mjsunit/es8/object-values.js b/deps/v8/test/mjsunit/es8/object-values.js
index b66e4af7d3..c70886febc 100644
--- a/deps/v8/test/mjsunit/es8/object-values.js
+++ b/deps/v8/test/mjsunit/es8/object-values.js
@@ -276,3 +276,9 @@ TestMutateDuringEnumeration();
assertEquals(result1, result2, `slow Object.values() with ${kind}`);
}
})();
+
+
+(function TestGlobalObject() {
+ let values = Object.values(globalThis);
+ assertTrue(values.length > 0);
+})();
diff --git a/deps/v8/test/mjsunit/harmony/modules-import-15-top-level-await.mjs b/deps/v8/test/mjsunit/harmony/modules-import-15-top-level-await.mjs
index 1feb3dae27..ab1f0e44dd 100644
--- a/deps/v8/test/mjsunit/harmony/modules-import-15-top-level-await.mjs
+++ b/deps/v8/test/mjsunit/harmony/modules-import-15-top-level-await.mjs
@@ -48,7 +48,7 @@ async function test3() {
let x = await import('nonexistent-file.mjs');
%AbortJS('failure: should be unreachable');
} catch(e) {
- assertTrue(e.startsWith('Error reading'));
+ assertTrue(e.startsWith('d8: Error reading'));
ran = true;
}
}
diff --git a/deps/v8/test/mjsunit/harmony/modules-import-15.mjs b/deps/v8/test/mjsunit/harmony/modules-import-15.mjs
index 8b313d6017..9fad3f99aa 100644
--- a/deps/v8/test/mjsunit/harmony/modules-import-15.mjs
+++ b/deps/v8/test/mjsunit/harmony/modules-import-15.mjs
@@ -50,7 +50,7 @@ async function test3() {
let x = await import('nonexistent-file.mjs');
%AbortJS('failure: should be unreachable');
} catch(e) {
- assertTrue(e.startsWith('Error reading'));
+ assertTrue(e.startsWith('d8: Error reading'));
ran = true;
}
}
diff --git a/deps/v8/test/mjsunit/harmony/to-string.js b/deps/v8/test/mjsunit/harmony/to-string.js
index e0589e0d82..dfe36c2dd9 100644
--- a/deps/v8/test/mjsunit/harmony/to-string.js
+++ b/deps/v8/test/mjsunit/harmony/to-string.js
@@ -4,51 +4,51 @@
// Flags: --allow-natives-syntax
-assertEquals("1", %ToStringRT(1));
-assertEquals("1", %_ToStringRT(1));
+assertEquals("1", %ToString(1));
+assertEquals("1", %_ToString(1));
-assertEquals("0.5", %ToStringRT(.5));
-assertEquals("0.5", %_ToStringRT(.5));
+assertEquals("0.5", %ToString(.5));
+assertEquals("0.5", %_ToString(.5));
-assertEquals("null", %ToStringRT(null));
-assertEquals("null", %_ToStringRT(null));
+assertEquals("null", %ToString(null));
+assertEquals("null", %_ToString(null));
-assertEquals("true", %ToStringRT(true));
-assertEquals("true", %_ToStringRT(true));
+assertEquals("true", %ToString(true));
+assertEquals("true", %_ToString(true));
-assertEquals("false", %ToStringRT(false));
-assertEquals("false", %_ToStringRT(false));
+assertEquals("false", %ToString(false));
+assertEquals("false", %_ToString(false));
-assertEquals("undefined", %ToStringRT(undefined));
-assertEquals("undefined", %_ToStringRT(undefined));
+assertEquals("undefined", %ToString(undefined));
+assertEquals("undefined", %_ToString(undefined));
-assertEquals("random text", %ToStringRT("random text"));
-assertEquals("random text", %_ToStringRT("random text"));
+assertEquals("random text", %ToString("random text"));
+assertEquals("random text", %_ToString("random text"));
-assertThrows(function() { %ToStringRT(Symbol.toPrimitive) }, TypeError);
-assertThrows(function() { %_ToStringRT(Symbol.toPrimitive) }, TypeError);
+assertThrows(function() { %ToString(Symbol.toPrimitive) }, TypeError);
+assertThrows(function() { %_ToString(Symbol.toPrimitive) }, TypeError);
var a = { toString: function() { return "xyz" }};
-assertEquals("xyz", %ToStringRT(a));
-assertEquals("xyz", %_ToStringRT(a));
+assertEquals("xyz", %ToString(a));
+assertEquals("xyz", %_ToString(a));
var b = { valueOf: function() { return 42 }};
-assertEquals("[object Object]", %ToStringRT(b));
-assertEquals("[object Object]", %_ToStringRT(b));
+assertEquals("[object Object]", %ToString(b));
+assertEquals("[object Object]", %_ToString(b));
var c = {
toString: function() { return "x"},
valueOf: function() { return 123 }
};
-assertEquals("x", %ToStringRT(c));
-assertEquals("x", %_ToStringRT(c));
+assertEquals("x", %ToString(c));
+assertEquals("x", %_ToString(c));
var d = {
[Symbol.toPrimitive]: function(hint) { return hint }
};
-assertEquals("string", %ToStringRT(d));
-assertEquals("string", %_ToStringRT(d));
+assertEquals("string", %ToString(d));
+assertEquals("string", %_ToString(d));
var e = new Date(0);
-assertEquals(e.toString(), %ToStringRT(e));
-assertEquals(e.toString(), %_ToStringRT(e));
+assertEquals(e.toString(), %ToString(e));
+assertEquals(e.toString(), %_ToString(e));
diff --git a/deps/v8/test/mjsunit/harmony/typedarray-set-length-detach.js b/deps/v8/test/mjsunit/harmony/typedarray-set-length-detach.js
new file mode 100644
index 0000000000..4f1d588ee7
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/typedarray-set-length-detach.js
@@ -0,0 +1,19 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+
+let ta = new Int32Array(10);
+assertThrows(() => {
+ ta.set({
+ get length() {
+ %ArrayBufferDetach(ta.buffer);
+ return 1;
+ },
+ get 0() {
+ return 100;
+ },
+ });
+}, TypeError);
diff --git a/deps/v8/test/mjsunit/math-floor-of-div-nosudiv.js b/deps/v8/test/mjsunit/math-floor-of-div-nosudiv.js
index 9b977849af..158cc5b924 100644
--- a/deps/v8/test/mjsunit/math-floor-of-div-nosudiv.js
+++ b/deps/v8/test/mjsunit/math-floor-of-div-nosudiv.js
@@ -26,6 +26,7 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --allow-natives-syntax --noenable-sudiv --noenable-armv8
+// Flags: --opt --noturbo-inlining
// Use this function as reference. Make sure it is not inlined.
function div(a, b) {
diff --git a/deps/v8/test/mjsunit/math-floor-of-div.js b/deps/v8/test/mjsunit/math-floor-of-div.js
index 1c695a47f8..d3dd587e87 100644
--- a/deps/v8/test/mjsunit/math-floor-of-div.js
+++ b/deps/v8/test/mjsunit/math-floor-of-div.js
@@ -25,7 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Flags: --allow-natives-syntax --enable-sudiv
+// Flags: --allow-natives-syntax --enable-sudiv --opt --noturbo-inlining
// Use this function as reference. Make sure it is not inlined.
function div(a, b) {
diff --git a/deps/v8/test/mjsunit/mjsunit.status b/deps/v8/test/mjsunit/mjsunit.status
index 9e16c4b738..b95bc69760 100644
--- a/deps/v8/test/mjsunit/mjsunit.status
+++ b/deps/v8/test/mjsunit/mjsunit.status
@@ -41,6 +41,10 @@
##############################################################################
# Open bugs.
+ # https://crbug.com/v8/10929
+ 'wasm/externref-liftoff' : [SKIP],
+ 'wasm/externref-globals-liftoff' : [SKIP],
+
# BUG(v8:2989).
'regress/regress-2989': [FAIL, NO_VARIANTS, ['lite_mode == True', SKIP]],
@@ -56,9 +60,6 @@
# BUG(v8:8169)
'external-backing-store-gc': [SKIP],
- # BUG(v8:9260)
- 'tools/profviz': [SKIP],
-
# Issue 9380: Memory leaks of shared WebAssembly.Memory objects
'wasm/shared-memory-worker-gc': [SKIP],
@@ -77,6 +78,9 @@
'wasm/shared-memory-worker-explicit-gc-stress': [PASS, SLOW],
'wasm/shared-memory-worker-gc-stress': [PASS, SLOW],
+ # https://crbug.com/1129854
+ 'tools/log': ['arch == arm or arch == arm64', SKIP],
+
##############################################################################
# Tests where variants make no sense.
'd8/enable-tracing': [PASS, NO_VARIANTS],
@@ -125,13 +129,16 @@
'asm/poppler/*': [PASS, SLOW, NO_VARIANTS],
'asm/sqlite3/*': [PASS, SLOW, NO_VARIANTS],
'compiler/regress-9017': [PASS, SLOW],
- 'es6/promise-all-overflow-2': [PASS, SLOW, ['arch != x64', SKIP]],
- 'harmony/promise-any-overflow-2': [PASS, SLOW, ['arch != x64', SKIP]],
'copy-on-write-assert': [PASS, SLOW],
+ 'es6/promise-all-overflow-2': [PASS, SLOW, ['arch != x64', SKIP]],
'es6/typedarray-construct-offset-not-smi': [PASS, SLOW],
+ 'harmony/promise-any-overflow-2': [PASS, SLOW, ['arch != x64', SKIP]],
+ 'harmony/sharedarraybuffer-worker-gc-stress': [PASS, SLOW],
'harmony/futex': [PASS, SLOW],
'harmony/regexp-property-script-extensions': [PASS, SLOW],
'ignition/regress-672027': [PASS, SLOW],
+ 'large-object-literal-slow-elements': [PASS, SLOW],
+ 'math-floor-of-div': [PASS, SLOW],
'md5': [PASS, SLOW],
'readonly': [PASS, SLOW],
'regress/regress-1122': [PASS, SLOW],
@@ -141,10 +148,12 @@
'regress/regress-crbug-808192': [PASS, SLOW, NO_VARIANTS, ['arch not in (ia32, x64)', SKIP]],
'regress/regress-crbug-918301': [PASS, SLOW, NO_VARIANTS, ['mode != release or dcheck_always_on', SKIP], ['(arch == arm or arch == arm64) and simulator_run', SKIP], ['tsan', SKIP]],
'regress/wasm/regress-810973': [PASS, SLOW],
+ 'sealed-array-reduce': [PASS, SLOW],
'string-replace-gc': [PASS, SLOW],
'wasm/asm-wasm-f32': [PASS, SLOW],
'wasm/asm-wasm-f64': [PASS, SLOW],
'wasm/embenchen/*': [PASS, SLOW],
+ 'wasm/futex': [PASS, SLOW],
'wasm/grow-memory': [PASS, SLOW],
'wasm/unreachable-validation': [PASS, SLOW],
'wasm/atomics-stress': [PASS, SLOW, NO_VARIANTS, ['mode != release or dcheck_always_on', SKIP], ['tsan', SKIP]],
@@ -255,6 +264,7 @@
'regress/regress-crbug-137689': [SKIP],
'regress/regress-trap-allocation-memento': [SKIP],
'regress/regress-2249': [SKIP],
+ 'regress/regress-3709': [SKIP],
'regress/regress-4121': [SKIP],
'regress/regress-6989': [SKIP],
'compare-known-objects-slow': [SKIP],
@@ -278,7 +288,7 @@
'regress/regress-91008': [PASS, NO_VARIANTS],
'regress/regress-transcendental': [PASS, ['arch == arm64', NO_VARIANTS]],
'compiler/osr-regress-max-locals': [PASS, NO_VARIANTS],
- 'math-floor-of-div': [PASS, NO_VARIANTS],
+ 'math-floor-of-div': [PASS, SLOW, NO_VARIANTS],
'unicodelctest': [PASS, NO_VARIANTS],
'unicodelctest-no-optimization': [PASS, NO_VARIANTS],
@@ -298,8 +308,6 @@
# Slow tests.
'array-constructor': [PASS, SLOW],
'json': [PASS, SLOW],
- 'large-object-literal-slow-elements': [PASS, SLOW],
- 'harmony/sharedarraybuffer-worker-gc-stress': [PASS, SLOW],
# BUG(v8:4779): Crashes flakily with stress mode on arm64.
'array-splice': [PASS, SLOW, ['arch == arm64', NO_VARIANTS]],
@@ -345,6 +353,7 @@
'asm/call-annotation': [SKIP],
'asm/global-imports': [SKIP],
'asm/regress-1027595': [SKIP],
+ 'asm/regress-1069173': [SKIP],
'asm/regress-913822': [SKIP],
'asm/regress-937650': [SKIP],
'asm/regress-9531': [SKIP],
@@ -376,17 +385,6 @@
'regexp-tier-up-multiple': [SKIP],
'regress/regress-996234': [SKIP],
- # Tests that depend on optimization (beyond doing assertOptimized).
- 'compiler/is-being-interpreted-*': [SKIP],
- 'compiler/serializer-accessors': [SKIP],
- 'compiler/serializer-apply': [SKIP],
- 'compiler/serializer-call': [SKIP],
- 'compiler/serializer-dead-after-jump': [SKIP],
- 'compiler/serializer-dead-after-return': [SKIP],
- 'compiler/serializer-transition-propagation': [SKIP],
- 'regress/regress-1049982-1': [SKIP],
- 'regress/regress-1049982-2': [SKIP],
-
# These tests check that we can trace the compiler.
'tools/compiler-trace-flags': [SKIP],
'tools/compiler-trace-flags-wasm': [SKIP],
@@ -419,17 +417,18 @@
# noi18n build cannot parse characters in supplementary plane.
'harmony/regexp-named-captures': [FAIL],
- # noi18n cannot turn on ICU backend for Date
- 'icu-date-to-string': [SKIP],
- 'icu-date-lord-howe': [SKIP],
- 'tzoffset-transition-apia': [SKIP],
- 'tzoffset-transition-lord-howe': [SKIP],
- 'tzoffset-transition-moscow': [SKIP],
- 'tzoffset-transition-new-york': [SKIP],
- 'tzoffset-seoul': [SKIP],
+ # noi18n cannot turn on ICU backend for Date. Anything goes as long as we
+ # don't crash.
+ 'icu-date-to-string': [PASS,FAIL],
+ 'icu-date-lord-howe': [PASS,FAIL],
+ 'tzoffset-transition-apia': [PASS,FAIL],
+ 'tzoffset-transition-lord-howe': [PASS,FAIL],
+ 'tzoffset-transition-moscow': [PASS,FAIL],
+ 'tzoffset-transition-new-york': [PASS,FAIL],
+ 'tzoffset-seoul': [PASS,FAIL],
# noi18n is required for Intl
- 'regress/regress-crbug-1052647': [SKIP],
+ 'regress/regress-crbug-1052647': [PASS,FAIL],
}], # 'no_i18n'
##############################################################################
@@ -510,7 +509,6 @@
'generated-transition-stub': [PASS, SLOW],
'json2': [PASS, SLOW],
'math-floor-of-div-nosudiv': [PASS, SLOW],
- 'math-floor-of-div': [PASS, SLOW],
'messages': [PASS, SLOW],
'regress/regress-2790': [PASS, SLOW],
'regress/regress-331444': [PASS, SLOW],
@@ -536,6 +534,7 @@
['arch == arm64 and simulator_run', {
'compiler/osr-big': [PASS, SLOW],
'regress/regress-454725': [PASS, SLOW],
+ 'json': [PASS, SLOW],
'try': [PASS, SLOW],
'non-extensible-array-reduce': [PASS, SLOW],
}], # 'arch == arm64 and simulator_run'
@@ -546,7 +545,6 @@
# Pass but take too long with the simulator in debug mode.
'array-sort': [PASS, SLOW],
'regexp-global': [SKIP],
- 'math-floor-of-div': [PASS, SLOW],
'math-floor-of-div-nosudiv': [PASS, SLOW],
'unicodelctest': [PASS, SLOW],
'unicodelctest-no-optimization': [PASS, SLOW],
@@ -1078,6 +1076,9 @@
# Tests that depend on optimization (beyond doing assertOptimized).
'regress/regress-1049982-1': [SKIP],
'regress/regress-1049982-2': [SKIP],
+ # Wasm serialization relies on TurboFan to be available, hence does not work
+ # in the 'nooptimization' variant.
+ 'regress/wasm/regress-7785': [SKIP],
}], # variant == nooptimization
##############################################################################
@@ -1148,7 +1149,6 @@
##############################################################################
['variant == turboprop', {
# Deopts differently than TurboFan.
- 'parallel-optimize-disabled': [SKIP],
'compiler/native-context-specialization-hole-check': [SKIP],
'compiler/number-comparison-truncations': [SKIP],
'compiler/redundancy-elimination': [SKIP],
@@ -1177,10 +1177,6 @@
'regress/regress-1049982-2': [SKIP],
'es6/iterator-eager-deopt': [SKIP],
- # interrupt_budget overrides don't work with TurboProp.
- 'interrupt-budget-override': [SKIP],
- 'never-optimize': [SKIP],
-
# In turboprop we reuse the optimized code on soft deopt. The following tests
# test for a soft deopt and they won't work in TurboProp.
'deopt-recursive-soft-once': [SKIP],
@@ -1201,6 +1197,9 @@
# TODO(mythria): Reenable this when the cl that migrates deprecated maps
# lands
'regress/regress-932953': [FAIL],
+
+ # https://crbug.com/v8/10894
+ 'math-floor-of-div': [SLOW],
}], # variant == turboprop
##############################################################################
@@ -1303,7 +1302,7 @@
}], # variant == slow_path
################################################################################
-['variant == nci or variant == nci_as_highest_tier', {
+['variant == nci or variant == nci_as_midtier', {
# Deopts differently than TurboFan.
# Deoptimization support is still incomplete in general, since deopts can
# only happen when explicitly requested by tests. NCI code objects are then
@@ -1391,10 +1390,10 @@
'optimized-array-some': [SKIP],
'optimized-filter': [SKIP],
'optimized-map': [SKIP],
- 'parallel-optimize-disabled': [SKIP],
'regress/regress-1016450': [SKIP],
'regress/regress-1034449': [SKIP],
'regress/regress-1073440': [SKIP],
+ 'regress/regress-1112155': [SKIP],
'regress/regress-347914': [SKIP],
'regress/regress-3709': [SKIP],
'regress/regress-385565': [SKIP],
@@ -1436,6 +1435,24 @@
'compiler/serializer-feedback-propagation-1': [SKIP],
'compiler/serializer-feedback-propagation-2': [SKIP],
'compiler/serializer-transition-propagation': [SKIP],
-}], # variant == nci or variant == nci_as_highest_tier
+}], # variant == nci or variant == nci_as_midtier
+
+['((arch == mipsel or arch == mips64el or arch == mips or arch == mips64) and not simd_mips) or (arch in [ppc64, s390x])', {
+ # Requires scalar lowering for 64x2 SIMD instructions, which are not
+ # implemented yet.
+ # Also skip tests on archs that don't support SIMD and lowering doesn't yet work correctly.
+ # Condition copied from cctest.status.
+ 'regress/wasm/regress-10831': [SKIP],
+}], # ((arch == mipsel or arch == mips64el or arch == mips or arch == mips64) and not simd_mips) or (arch in [ppc64, s390x])
+
+##############################################################################
+['variant == stress_sampling', {
+ # https://bugs.chromium.org/p/v8/issues/detail?id=10915
+ 'harmony/weakrefs/stress-finalizationregistry-dirty-enqueue': [SKIP],
+ 'regress/regress-484544': [SKIP],
+ 'regress/regress-543994': [SKIP],
+ 'regress/regress-crbug-1041232': [SKIP],
+ 'regress/regress-set-flags-stress-compact': [SKIP],
+}], # variant == stress_sampling
]
diff --git a/deps/v8/test/mjsunit/parallel-optimize-disabled.js b/deps/v8/test/mjsunit/parallel-optimize-disabled.js
deleted file mode 100644
index 631c3817d0..0000000000
--- a/deps/v8/test/mjsunit/parallel-optimize-disabled.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Flags: --concurrent-recompilation --turbo-inlining
-// Flags: --allow-natives-syntax --no-always-opt
-
-if (!%IsConcurrentRecompilationSupported()) {
- print("Concurrent recompilation is disabled. Skipping this test.");
- quit();
-}
-
-function g() { // g() cannot be optimized.
- const x = 1;
- // TODO(adamk): Is this test still testing anything?
- // x++;
-}
-
-function f(x) {
- g();
-}
-
-%PrepareFunctionForOptimization(f);
-%PrepareFunctionForOptimization(g);
-f();
-f();
-%OptimizeFunctionOnNextCall(f);
-%OptimizeFunctionOnNextCall(g, "concurrent");
-f(0); // g() is disabled for optimization on inlining attempt.
-// Attempt to optimize g() should not run into any assertion.
-assertUnoptimized(g, "sync");
diff --git a/deps/v8/test/mjsunit/random-bit-correlations.js b/deps/v8/test/mjsunit/random-bit-correlations.js
index 2ac84c54a7..b7e2a3c0fe 100644
--- a/deps/v8/test/mjsunit/random-bit-correlations.js
+++ b/deps/v8/test/mjsunit/random-bit-correlations.js
@@ -2,7 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --random-seed=20 --nostress-opt --noalways-opt --predictable
+// Overwrite the random seed provided by the test runner to make this test less
+// flaky. Due to flag contradiction checking, this requires
+// --allow-overwriting-for-next-flag to avoid an error.
+// Flags: --allow-overwriting-for-next-flag --random-seed=20
+// Flags: --nostress-opt --noalways-opt --predictable
(function() {
var kHistory = 2;
diff --git a/deps/v8/test/mjsunit/regexp-backtrack-limit.js b/deps/v8/test/mjsunit/regexp-backtrack-limit.js
index 4cd743784d..6cf1cafbe2 100644
--- a/deps/v8/test/mjsunit/regexp-backtrack-limit.js
+++ b/deps/v8/test/mjsunit/regexp-backtrack-limit.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --allow-natives-syntax
+// Flags: --allow-natives-syntax --no-enable-experimental-regexp-engine
const kNoBacktrackLimit = 0; // To match JSRegExp::kNoBacktrackLimit.
const re0 = %NewRegExpWithBacktrackLimit("(\\d+)+x", "", kNoBacktrackLimit);
diff --git a/deps/v8/test/mjsunit/regexp-experimental.js b/deps/v8/test/mjsunit/regexp-experimental.js
new file mode 100644
index 0000000000..469da37d7f
--- /dev/null
+++ b/deps/v8/test/mjsunit/regexp-experimental.js
@@ -0,0 +1,98 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --enable-experimental-regexp-engine
+
+function Test(regexp, subject, expectedResult, expectedLastIndex) {
+ assertEquals(%RegexpTypeTag(regexp), "EXPERIMENTAL");
+ var result = regexp.exec(subject);
+ if (result instanceof Array && expectedResult instanceof Array) {
+ assertArrayEquals(expectedResult, result);
+ } else {
+ assertEquals(expectedResult, result);
+ }
+ assertEquals(expectedLastIndex, regexp.lastIndex);
+}
+
+// The empty regexp.
+Test(new RegExp(""), "asdf", [""], 0);
+
+// Plain patterns without special operators.
+Test(/asdf1/, "123asdf1xyz", ["asdf1"], 0);
+// Escaped operators, otherwise plain string:
+Test(/\*\.\(\[\]\?/, "123*.([]?123", ["*.([]?"], 0);
+// Some two byte values:
+Test(/쁰d섊/, "123쁰d섊abc", ["쁰d섊"], 0);
+// A pattern with surrogates but without unicode flag:
+Test(/💩f/, "123💩f", ["💩f"], 0);
+
+// Disjunctions.
+Test(/asdf|123/, "xyz123asdf", ["123"], 0);
+Test(/asdf|123|fj|f|a/, "da123", ["a"], 0);
+Test(/|123/, "123", [""], 0);
+
+// Character ranges.
+Test(/[abc]/, "123asdf", ["a"], 0);
+Test(/[0-9]/, "asdf123xyz", ["1"], 0);
+Test(/[^0-9]/, "123!xyz", ["!"], 0);
+Test(/\w\d/, "?a??a3!!!", ["a3"], 0);
+// [💩] without unicode flag is a character range matching one of the two
+// surrogate characters that make up 💩. The leading surrogate is 0xD83D.
+Test(/[💩]/, "f💩", [String.fromCodePoint(0xD83D)], 0);
+
+// Greedy and non-greedy quantifiers.
+Test(/x*/, "asdfxk", [""], 0);
+Test(/xx*a/, "xxa", ["xxa"], 0);
+Test(/x*[xa]/, "xxaa", ["xxa"], 0);
+Test(/x*?[xa]/, "xxaa", ["x"], 0);
+Test(/x*?a/, "xxaa", ["xxa"], 0);
+Test(/x+a/, "axxa", ["xxa"], 0);
+Test(/x+?[ax]/, "axxa", ["xx"], 0);
+Test(/xx?[xa]/, "xxaa", ["xxa"], 0);
+Test(/xx??[xa]/, "xxaa", ["xx"], 0);
+Test(/xx??a/, "xxaa", ["xxa"], 0);
+Test(/x{4}/, "xxxxxxxxx", ["xxxx"], 0);
+Test(/x{4,}/, "xxxxxxxxx", ["xxxxxxxxx"], 0);
+Test(/x{4,}?/, "xxxxxxxxx", ["xxxx"], 0);
+Test(/x{2,4}/, "xxxxxxxxx", ["xxxx"], 0);
+Test(/x{2,4}?/, "xxxxxxxxx", ["xx"], 0);
+
+// Non-capturing groups and nested operators.
+Test(/(?:)/, "asdf", [""], 0);
+Test(/(?:asdf)/, "123asdfxyz", ["asdf"], 0);
+Test(/(?:asdf)|123/, "xyz123asdf", ["123"], 0);
+Test(/asdf(?:[0-9]|(?:xy|x)*)*/, "kkkasdf5xyx8xyyky", ["asdf5xyx8xy"], 0);
+
+// Capturing groups.
+Test(/()/, "asdf", ["", ""], 0);
+Test(/(123)/, "asdf123xyz", ["123", "123"], 0);
+Test(/asdf(123)xyz/, "asdf123xyz", ["asdf123xyz", "123"], 0);
+Test(/(123|xyz)/, "123", ["123", "123"], 0);
+Test(/(123|xyz)/, "xyz", ["xyz", "xyz"], 0);
+Test(/(123)|(xyz)/, "123", ["123", "123", undefined], 0);
+Test(/(123)|(xyz)/, "xyz", ["xyz", undefined, "xyz"], 0);
+Test(/(?:(123)|(xyz))*/, "xyz123", ["xyz123", "123", undefined], 0);
+Test(/((123)|(xyz)*)*/, "xyz123xyz", ["xyz123xyz", "xyz", undefined, "xyz"], 0);
+
+// Assertions.
+Test(/asdf\b/, "asdf---", ["asdf"], 0);
+Test(/asdf\b/, "asdfg", null, 0);
+Test(/asd[fg]\B/, "asdf asdgg", ["asdg"], 0);
+Test(/^asd[fg]/, "asdf asdgg", ["asdf"], 0);
+Test(/asd[fg]$/, "asdf asdg", ["asdg"], 0);
+
+// The global flag.
+Test(/asdf/g, "fjasdfkkasdf", ["asdf"], 6);
+
+// The sticky flag.
+var r = /asdf/y;
+r.lastIndex = 2;
+Test(r, "fjasdfkkasdf", ["asdf"], 6);
+
+// The multiline flag.
+Test(/^a/m, "x\na", ["a"], 0);
+Test(/x$/m, "x\na", ["x"], 0);
+
+// The dotall flag.
+Test(/asdf.xyz/s, "asdf\nxyz", ["asdf\nxyz"], 0);
diff --git a/deps/v8/test/mjsunit/regexp-tier-up-multiple.js b/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
index 7325b341d0..3d161c40e8 100644
--- a/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
+++ b/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
@@ -6,6 +6,7 @@
// RegExp.prototype.replace with a function as an argument.
// Flags: --regexp-tier-up --regexp-tier-up-ticks=5
// Flags: --allow-natives-syntax --no-force-slow-path --no-regexp-interpret-all
+// Flags: --no-enable-experimental-regexp-engine
const kLatin1 = true;
const kUnicode = false;
diff --git a/deps/v8/test/mjsunit/regexp-tier-up.js b/deps/v8/test/mjsunit/regexp-tier-up.js
index 6269128f53..762c24b7b5 100644
--- a/deps/v8/test/mjsunit/regexp-tier-up.js
+++ b/deps/v8/test/mjsunit/regexp-tier-up.js
@@ -6,6 +6,7 @@
// RegExp.prototype.replace with a function as an argument.
// Flags: --regexp-tier-up --regexp-tier-up-ticks=1
// Flags: --allow-natives-syntax --no-force-slow-path --no-regexp-interpret-all
+// Flags: --no-enable-experimental-regexp-engine
const kLatin1 = true;
const kUnicode = false;
diff --git a/deps/v8/test/mjsunit/regress-1120905.js b/deps/v8/test/mjsunit/regress-1120905.js
new file mode 100644
index 0000000000..63f4d04be6
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress-1120905.js
@@ -0,0 +1,30 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function O() {}
+O.prototype.f = f;
+O.prototype.g = g;
+
+function f() {
+ return g.arguments;
+}
+
+function g(x) {
+ return this.f(2 - x, "any");
+}
+
+var o = new O();
+function foo(x) {
+ return o.g(x, "z");
+}
+
+for (var i = 0; i < 35; i++) foo();
+
+var result = (
+ %PrepareFunctionForOptimization(foo),foo(), foo(),
+ %OptimizeFunctionOnNextCall(foo), foo()
+);
+assertEquals(result[1], "z");
diff --git a/deps/v8/test/mjsunit/regress/regress-1034449.js b/deps/v8/test/mjsunit/regress/regress-1034449.js
index c4af2a4a60..6c22ecd099 100644
--- a/deps/v8/test/mjsunit/regress/regress-1034449.js
+++ b/deps/v8/test/mjsunit/regress/regress-1034449.js
@@ -3,6 +3,7 @@
// found in the LICENSE file.
// Flags: --allow-natives-syntax --opt --no-always-opt
+// Flags: --no-stress-flush-bytecode
function f(len) {
return new Array(len);
diff --git a/deps/v8/test/mjsunit/regress/regress-10802.js b/deps/v8/test/mjsunit/regress/regress-10802.js
new file mode 100644
index 0000000000..2036def22a
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-10802.js
@@ -0,0 +1,12 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const arr = new Uint8Array([1, 2, 3]);
+
+function mapper(x) {
+ arr[1] = 182;
+ return x + 1;
+}
+
+assertArrayEquals([2, 3, 4], Uint16Array.from(arr, mapper));
diff --git a/deps/v8/test/mjsunit/regress/regress-1112155.js b/deps/v8/test/mjsunit/regress/regress-1112155.js
new file mode 100644
index 0000000000..ada3b847a7
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1112155.js
@@ -0,0 +1,32 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --dynamic-map-checks --allow-natives-syntax --opt --no-always-opt
+
+function f(v) {
+ return v.b;
+}
+var v = { a: 10, b: 10.23 };
+%PrepareFunctionForOptimization(f);
+f(v);
+%OptimizeFunctionOnNextCall(f);
+f(v);
+assertOptimized(f);
+v.b = {x: 20};
+assertEquals(f(v).x, 20);
+// Must deoptimize because of field-rep changes for field 'b'
+assertUnoptimized(f);
+
+function f0(v) {
+ return v.b;
+}
+var v0 = { b: 10.23 };
+%PrepareFunctionForOptimization(f0);
+f0(v0);
+// Transition the field to an Smi field.
+v0.b = {};
+v0.b = 0;
+%OptimizeFunctionOnNextCall(f0);
+f0(v0);
+assertEquals(f0(v0), 0);
diff --git a/deps/v8/test/mjsunit/regress/regress-1123379.js b/deps/v8/test/mjsunit/regress/regress-1123379.js
new file mode 100644
index 0000000000..43a155e0b6
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1123379.js
@@ -0,0 +1,16 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --noanalyze-environment-liveness --interrupt-budget=1000
+
+for (let __v_1 = 0; __v_1 < 5000; __v_1++) {
+ try {
+ [].reduce(function () {});
+ } catch (__v_2) {}
+}
+
+__v_5 = {
+ get: function () {
+ }
+};
diff --git a/deps/v8/test/mjsunit/regress/regress-1125871.js b/deps/v8/test/mjsunit/regress/regress-1125871.js
new file mode 100644
index 0000000000..b062961dd8
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1125871.js
@@ -0,0 +1,25 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --dynamic-map-checks --opt --no-always-opt
+
+function bar(obj) {
+ // Add two dummy loads to make sure obj.b is in the same slot index as obj.a
+ // in foo.
+ obj.y;
+ obj.x;
+ return obj.b
+}
+
+function foo(obj) {
+ bar(obj);
+ return obj.a;
+}
+
+var obj = { a: 10, b: 20};
+%PrepareFunctionForOptimization(foo);
+%EnsureFeedbackVectorForFunction(bar);
+foo(obj);
+%OptimizeFunctionOnNextCall(foo);
+assertEquals(10, foo(obj));
diff --git a/deps/v8/test/mjsunit/regress/regress-1132111.js b/deps/v8/test/mjsunit/regress/regress-1132111.js
deleted file mode 100644
index 1dd1b58806..0000000000
--- a/deps/v8/test/mjsunit/regress/regress-1132111.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2020 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Public function field with computed name
-eval(`
- buggy = ((bug = new class { [0] = x => 1337.0; }) => bug);
-`);
-
-// Public method with computed name
-eval(`
- buggy = ((bug = new class { [0](x) { return 1337.0}; }) => bug);
-`);
-
-// Private function field with computed name
-eval(`
- buggy = ((bug = new class { #foo = x => 1337.0; }) => bug);
-`);
-
-// Private method with computed name
-eval(`
- buggy = ((bug = new class { #foo(x) { return 1337.0; } }) => bug);
-`);
diff --git a/deps/v8/test/mjsunit/regress/regress-1143772.js b/deps/v8/test/mjsunit/regress/regress-1143772.js
new file mode 100644
index 0000000000..40bc494d45
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1143772.js
@@ -0,0 +1,71 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --allow-natives-syntax
+
+(function() {
+ // Only run this test if doubles are transitioned in-place to tagged.
+ let x = {};
+ x.a = 0.1;
+ let y = {};
+ y.a = {};
+ if (!%HaveSameMap(x, y)) return;
+
+ // m1: {}
+ let m1 = {};
+
+ // m2: {a:d}
+ let m2 = {};
+ assertTrue(%HaveSameMap(m2, m1));
+ m2.a = 13.37;
+
+ // m3: {a:d, b:s}
+ let m3 = {};
+ m3.a = 13.37;
+ assertTrue(%HaveSameMap(m3, m2));
+ m3.b = 1;
+
+ // m4: {a:d, b:s, c:h}
+ let m4 = {};
+ m4.a = 13.37;
+ m4.b = 1;
+ assertTrue(%HaveSameMap(m4, m3));
+ m4.c = {};
+
+ // m4_2 == m4
+ let m4_2 = {};
+ m4_2.a = 13.37;
+ m4_2.b = 1;
+ m4_2.c = {};
+ assertTrue(%HaveSameMap(m4_2, m4));
+
+ // m5: {a:d, b:d}
+ let m5 = {};
+ m5.a = 13.37;
+ assertTrue(%HaveSameMap(m5, m2));
+ m5.b = 13.37;
+ assertFalse(%HaveSameMap(m5, m3));
+
+ // At this point, Map3 and Map4 are both deprecated. Map2 transitions to
+ // Map5. Map5 is the migration target for Map3.
+ assertFalse(%HaveSameMap(m5, m3));
+
+ // m6: {a:d, b:d, c:d}
+ let m6 = {};
+ m6.a = 13.37;
+ assertTrue(%HaveSameMap(m6, m2));
+ m6.b = 13.37;
+ assertTrue(%HaveSameMap(m6, m5));
+ m6.c = 13.37
+
+ // Make m7: {a:d, b:d, c:t}
+ let m7 = m4_2;
+ assertTrue(%HaveSameMap(m7, m4));
+ // Map4 is deprecated, so this property access triggers a Map migration.
+ // With in-place map updates and no double unboxing, this should end up
+ // migrating to Map6, and updating it in-place.
+ m7.c;
+ assertFalse(%HaveSameMap(m7, m4));
+ assertTrue(%HaveSameMap(m6, m7));
+})();
diff --git a/deps/v8/test/mjsunit/regress/regress-1156.js b/deps/v8/test/mjsunit/regress/regress-1156.js
deleted file mode 100644
index 344657816c..0000000000
--- a/deps/v8/test/mjsunit/regress/regress-1156.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2011 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Flags: --allow-natives-syntax
-
-// Test that we do not crash we invoke builtins from optimized code that
-// is then deoptimized.
-
-function foo(a) {
- delete a[1];
- delete a[2];
- delete a[3];
- delete a[4];
- delete a[5];
- return void 0;
-}
-
-function call_and_deopt() {
- var b = [1,2,3];
- foo(b);
- foo(b);
- %DeoptimizeFunction(foo);
-}
-
-call_and_deopt();
diff --git a/deps/v8/test/mjsunit/regress/regress-356053.js b/deps/v8/test/mjsunit/regress/regress-356053.js
index 2695c48fd1..ea84973d8e 100644
--- a/deps/v8/test/mjsunit/regress/regress-356053.js
+++ b/deps/v8/test/mjsunit/regress/regress-356053.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --noconcurrent-recompilation --expose-gc --allow-natives-syntax
+// Flags: --expose-gc --allow-natives-syntax
// Flags: --concurrent-recompilation --block-concurrent-recompilation
gc();
diff --git a/deps/v8/test/mjsunit/regress/regress-411210.js b/deps/v8/test/mjsunit/regress/regress-411210.js
index 2dbc5ff70c..b977beb3c8 100644
--- a/deps/v8/test/mjsunit/regress/regress-411210.js
+++ b/deps/v8/test/mjsunit/regress/regress-411210.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --allow-natives-syntax --gc-interval=439 --random-seed=-423594851
+// Flags: --allow-natives-syntax --gc-interval=439
var __v_3;
function __f_2() {
diff --git a/deps/v8/test/mjsunit/regress/regress-487981.js b/deps/v8/test/mjsunit/regress/regress-487981.js
index f548944ba7..65266dcfa4 100644
--- a/deps/v8/test/mjsunit/regress/regress-487981.js
+++ b/deps/v8/test/mjsunit/regress/regress-487981.js
@@ -4,7 +4,7 @@
// Flags: --allow-natives-syntax --stress-compaction
-// To reliably reproduce the crash use --verify-heap --random-seed=-133185440
+// To reliably reproduce the crash use --verify-heap
function __f_2(o) {
return o.field.b.x;
diff --git a/deps/v8/test/mjsunit/regress/regress-6288.js b/deps/v8/test/mjsunit/regress/regress-6288.js
index 5f550c31c8..1df666f230 100644
--- a/deps/v8/test/mjsunit/regress/regress-6288.js
+++ b/deps/v8/test/mjsunit/regress/regress-6288.js
@@ -5,9 +5,9 @@
// Environment Variables: LC_ALL=pt-BR.UTF8
// The data files packaged with d8 currently have Brazillian Portuguese
-// DateTimeFormat but not Collation
+// DateTimeFormat and Collation
if (this.Intl) {
- assertEquals('pt', Intl.Collator().resolvedOptions().locale);
+ assertEquals('pt-BR', Intl.Collator().resolvedOptions().locale);
assertEquals('pt-BR', Intl.DateTimeFormat().resolvedOptions().locale);
}
diff --git a/deps/v8/test/mjsunit/regress/regress-740694.js b/deps/v8/test/mjsunit/regress/regress-740694.js
index 6f31fef0c7..dbe6db916c 100644
--- a/deps/v8/test/mjsunit/regress/regress-740694.js
+++ b/deps/v8/test/mjsunit/regress/regress-740694.js
@@ -18,5 +18,5 @@ var promise = __f_0();
promise.then(assertUnreachable,
err => { done = true; error = err });
%PerformMicrotaskCheckpoint();
-assertTrue(error.startsWith('Error reading'));
+assertTrue(error.startsWith('d8: Error reading'));
assertTrue(done);
diff --git a/deps/v8/test/mjsunit/regress/regress-8265.js b/deps/v8/test/mjsunit/regress/regress-8265.js
index ffe6191c9f..0be0926012 100644
--- a/deps/v8/test/mjsunit/regress/regress-8265.js
+++ b/deps/v8/test/mjsunit/regress/regress-8265.js
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --random-seed=1
-
for (let i = 0; i < 54; ++i) Math.random();
let sum = 0;
for (let i = 0; i < 10; ++i)
diff --git a/deps/v8/test/mjsunit/regress/regress-863810.js b/deps/v8/test/mjsunit/regress/regress-863810.js
index 07c0599231..841909a207 100644
--- a/deps/v8/test/mjsunit/regress/regress-863810.js
+++ b/deps/v8/test/mjsunit/regress/regress-863810.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --no-liftoff --no-future --debug-code
+// Flags: --no-liftoff --debug-code
load('test/mjsunit/wasm/wasm-module-builder.js');
diff --git a/deps/v8/test/mjsunit/regress/regress-883059.js b/deps/v8/test/mjsunit/regress/regress-883059.js
index ed70feddb4..d7be11038b 100644
--- a/deps/v8/test/mjsunit/regress/regress-883059.js
+++ b/deps/v8/test/mjsunit/regress/regress-883059.js
@@ -2,6 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --random-seed=-1595876594 --disable-in-process-stack-traces --no-lazy
+// Flags: --disable-in-process-stack-traces --no-lazy
var __v_47 = ({[__v_46]: __f_52}) => { var __v_46 = 'b'; return __f_52; };
diff --git a/deps/v8/test/mjsunit/regress/regress-9832.js b/deps/v8/test/mjsunit/regress/regress-9832.js
index 41a8c38f0d..eedd628718 100644
--- a/deps/v8/test/mjsunit/regress/regress-9832.js
+++ b/deps/v8/test/mjsunit/regress/regress-9832.js
@@ -15,7 +15,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
kExprI32Add,
]).exportFunc();
builder.addFunction("main", kSig_i_i)
- .addLocals({except_count: 1})
+ .addLocals(kWasmExnRef, 1)
.addBody([
kExprTry, kWasmStmt,
kExprLocalGet, 0,
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1027025.js b/deps/v8/test/mjsunit/regress/regress-crbug-1027025.js
index ecf51b6ebd..40cb47565e 100644
--- a/deps/v8/test/mjsunit/regress/regress-crbug-1027025.js
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-1027025.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --future --no-lazy-feedback-allocation
+// Flags: --no-lazy-feedback-allocation
// This test ensures that KeyedAccessStoreMode gets computed correctly for cases when there are multiple Smi Handlers in the FeedbackNexus
function __f_11(b) {
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-664506.js b/deps/v8/test/mjsunit/regress/regress-crbug-664506.js
index b0bf5e7591..44ae933027 100644
--- a/deps/v8/test/mjsunit/regress/regress-crbug-664506.js
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-664506.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --expose-gc --predictable --random-seed=-1109634722
+// Flags: --expose-gc --predictable
gc();
gc();
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-882233-2.js b/deps/v8/test/mjsunit/regress/regress-crbug-882233-2.js
index b79ac2ab29..ae6396ea65 100644
--- a/deps/v8/test/mjsunit/regress/regress-crbug-882233-2.js
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-882233-2.js
@@ -9,6 +9,7 @@
function shift_array() {
let array = [];
Object.defineProperty(array, 'length', {writable : false});
+ out = array; // Prevent array's map from dying too early.
return array.shift();
}
@@ -23,6 +24,7 @@ assertOptimized(shift_array);
function shift_object() {
let object = { length: 0 };
Object.defineProperty(object, 'length', {writable : false});
+ out = object; // Prevent object's map from dying too early.
return object.shift();
}
diff --git a/deps/v8/test/mjsunit/regress/regress-v8-9656.js b/deps/v8/test/mjsunit/regress/regress-v8-9656.js
index 98779b18f9..c28463572e 100644
--- a/deps/v8/test/mjsunit/regress/regress-v8-9656.js
+++ b/deps/v8/test/mjsunit/regress/regress-v8-9656.js
@@ -2,7 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --allow-natives-syntax
+// Flags: --allow-natives-syntax --no-flush-bytecode
+// Flags: --no-stress-flush-bytecode
// Files: test/mjsunit/code-coverage-utils.js
%DebugToggleBlockCoverage(true);
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-02256.js b/deps/v8/test/mjsunit/regress/wasm/regress-02256.js
index 63da0cc10b..aaf508f2bd 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-02256.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-02256.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// Flags: --random-seed=891196975 --expose-gc --allow-natives-syntax
+// Flags: --expose-gc --allow-natives-syntax
// Flags: --gc-interval=207 --stress-compaction --validate-asm
// Flags: --opt --no-always-opt
//
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-02256b.js b/deps/v8/test/mjsunit/regress/wasm/regress-02256b.js
index 249e96dfef..a9619c5359 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-02256b.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-02256b.js
@@ -2,9 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// Flags: --random-seed=891196975 --expose-gc --allow-natives-syntax
-// Flags: --gc-interval=207 --stress-compaction --validate-asm
-// Flags: --opt --no-always-opt
+// Flags: --expose-gc --allow-natives-syntax --gc-interval=207
+// Flags: --stress-compaction --validate-asm --opt --no-always-opt
//
// /v8/test/mjsunit/wasm/grow-memory.js
// /v8/test/mjsunit/regress/regress-540.js
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-02862.js b/deps/v8/test/mjsunit/regress/wasm/regress-02862.js
index 92ed1cd6c9..d6c5e07536 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-02862.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-02862.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --random-seed=1557792826 --expose-gc --invoke-weak-callbacks --omit-quit --gc-interval=469 --validate-asm
+// Flags: --expose-gc --invoke-weak-callbacks --omit-quit --gc-interval=469 --validate-asm
function nop() {}
var __v_42 = {};
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1014798.js b/deps/v8/test/mjsunit/regress/wasm/regress-1014798.js
index 98f0314b99..cfc3d9d9c8 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1014798.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1014798.js
@@ -6,9 +6,9 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
builder.addFunction('main', kSig_i_iii)
- .addLocals({f32_count: 4})
- .addLocals({i64_count: 1})
- .addLocals({f32_count: 2})
+ .addLocals(kWasmF32, 4)
+ .addLocals(kWasmI64, 1)
+ .addLocals(kWasmF32, 2)
.addBodyWithEnd([
kExprI64Const, 0,
kExprLocalGet, 3,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1026680.js b/deps/v8/test/mjsunit/regress/wasm/regress-1026680.js
index 5d2e4335c8..d2835a5006 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1026680.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1026680.js
@@ -19,7 +19,7 @@ kExprEnd, // @5
]);
// Generate function 2 (out of 2).
builder.addFunction(undefined, 1 /* sig */)
- .addLocals({f32_count: 1}).addLocals({i32_count: 13})
+ .addLocals(kWasmF32, 1).addLocals(kWasmI32, 13)
.addBodyWithEnd([
// signature: v_v
// body:
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1027410.js b/deps/v8/test/mjsunit/regress/wasm/regress-1027410.js
index dd9a2f40b8..b353b7a94a 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1027410.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1027410.js
@@ -18,7 +18,7 @@ kExprEnd, // @3
]);
// Generate function 2 (out of 2).
builder.addFunction(undefined, 1 /* sig */)
- .addLocals({f64_count: 8})
+ .addLocals(kWasmF64, 8)
.addBodyWithEnd([
// signature: d_v
// body:
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1054466.js b/deps/v8/test/mjsunit/regress/wasm/regress-1054466.js
index 41b8ee2335..2c35add9ad 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1054466.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1054466.js
@@ -10,7 +10,7 @@ const builder = new WasmModuleBuilder();
builder.addType(makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]));
// Generate function 1 (out of 1).
builder.addFunction(undefined, 0 /* sig */)
- .addLocals({i32_count: 2}).addLocals({f32_count: 2})
+ .addLocals(kWasmI32, 2).addLocals(kWasmF32, 2)
.addBodyWithEnd([
// signature: i_iii
// body:
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1070078.js b/deps/v8/test/mjsunit/regress/wasm/regress-1070078.js
index 8df2e35e65..5301c5747d 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1070078.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1070078.js
@@ -23,12 +23,12 @@ builder.addFunction(undefined, 0 /* sig */).addBodyWithEnd([
kSimdPrefix, kExprI8x16Splat, // i8x16.splat
kExprI32Const, 0x19, // i32.const
kSimdPrefix, kExprI8x16Splat, // i8x16.splat
- kSimdPrefix, kExprS8x16Shuffle,
+ kSimdPrefix, kExprI8x16Shuffle,
0x00, 0x00, 0x17, 0x00, 0x04, 0x04, 0x04, 0x04,
- 0x04, 0x10, 0x01, 0x00, 0x04, 0x04, 0x04, 0x04, // s8x16.shuffle
- kSimdPrefix, kExprS8x16Shuffle,
+ 0x04, 0x10, 0x01, 0x00, 0x04, 0x04, 0x04, 0x04, // i8x16.shuffle
+ kSimdPrefix, kExprI8x16Shuffle,
0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // s8x16.shuffle
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // i8x16.shuffle
kSimdPrefix, kExprI8x16LeU, // i8x16.le_u
kSimdPrefix, kExprV8x16AnyTrue, // v8x16.any_true
kExprMemoryGrow, 0x00, // memory.grow
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1074586.js b/deps/v8/test/mjsunit/regress/wasm/regress-1074586.js
index ae25e3c261..eec0a46432 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1074586.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1074586.js
@@ -12,7 +12,7 @@ builder.addGlobal(kWasmI32, 1);
const sig = builder.addType(makeSig([kWasmI32, kWasmI64, kWasmI64, kWasmI64], [kWasmF32]));
// Generate function 1 (out of 3).
builder.addFunction(undefined, sig)
- .addLocals({i32_count: 57}).addLocals({i64_count: 11})
+ .addLocals(kWasmI32, 57).addLocals(kWasmI64, 11)
.addBodyWithEnd([
// signature: f_illl
// body:
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1075953.js b/deps/v8/test/mjsunit/regress/wasm/regress-1075953.js
index 12f8ba661a..413630d1b0 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1075953.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1075953.js
@@ -11,7 +11,7 @@ builder.addMemory(1, 1, false, true);
const sig = builder.addType(makeSig([], [kWasmI32]));
builder.addFunction(undefined, sig)
- .addLocals({i32_count: 1002}).addLocals({i64_count: 3})
+ .addLocals(kWasmI32, 1002).addLocals(kWasmI64, 3)
.addBodyWithEnd([
// signature: i_v
// body:
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1079449.js b/deps/v8/test/mjsunit/regress/wasm/regress-1079449.js
index 65e964552d..c7e63244d1 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1079449.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1079449.js
@@ -16,10 +16,10 @@ const sig = builder.addType(makeSig(
[kWasmI64]));
// Generate function 2 (out of 3).
builder.addFunction(undefined, sig)
- .addLocals({f32_count: 10})
- .addLocals({i32_count: 4})
- .addLocals({f64_count: 1})
- .addLocals({i32_count: 15})
+ .addLocals(kWasmF32, 10)
+ .addLocals(kWasmI32, 4)
+ .addLocals(kWasmF64, 1)
+ .addLocals(kWasmI32, 15)
.addBodyWithEnd([
// signature: v_liliiiiiilll
// body:
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-10831.js b/deps/v8/test/mjsunit/regress/wasm/regress-10831.js
new file mode 100644
index 0000000000..0f562ee87d
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-10831.js
@@ -0,0 +1,47 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-simd --enable-sse3 --enable-ssse3 --enable-sse4-1
+
+load('test/mjsunit/wasm/wasm-module-builder.js');
+
+// This test is shrunk from a test case provided at https://crbug.com/v8/10831.
+// This exercises a aligned-load bug in ia32. Some SIMD operations were using
+// instructions that required aligned operands (like movaps and movapd), but we
+// don't have the right memory alignment yet, see https://crbug.com/v8/9198,
+// resulting in a SIGSEGV when running the generated code.
+const builder = new WasmModuleBuilder();
+builder.addType(makeSig([], [kWasmI32]));
+// Generate function 1 (out of 1).
+builder.addFunction(undefined, 0 /* sig */)
+ .addBodyWithEnd([
+// signature: i_v
+// body:
+kExprI32Const, 0xfc, 0xb6, 0xed, 0x02, // i32.const
+kSimdPrefix, kExprI8x16Splat, // i8x16.splat
+kExprI32Const, 0xfc, 0x00, // i32.const
+kSimdPrefix, kExprI8x16Splat, // i8x16.splat
+kSimdPrefix, kExprI64x2Sub, 0x01, // i64x2.sub
+kExprI32Const, 0x00, // i32.const
+kSimdPrefix, kExprI8x16Splat, // i8x16.splat
+kExprI32Const, 0x81, 0x96, 0xf0, 0xe3, 0x07, // i32.const
+kSimdPrefix, kExprI8x16Splat, // i8x16.splat
+kSimdPrefix, kExprF64x2Max, 0x01, // f64x2.max
+kSimdPrefix, kExprI64x2Sub, 0x01, // i64x2.sub
+kExprI32Const, 0x00, // i32.const
+kSimdPrefix, kExprI8x16Splat, // i8x16.splat
+kExprI32Const, 0x00, // i32.const
+kExprI32Const, 0x0b, // i32.const
+kExprI32LtU, // i32.lt_u
+kSimdPrefix, kExprI8x16ReplaceLane, 0x00, // i8x16.replace_lane
+kExprI32Const, 0xfc, 0xf8, 0x01, // i32.const
+kSimdPrefix, kExprI8x16Splat, // i8x16.splat
+kSimdPrefix, kExprF64x2Max, 0x01, // f64x2.max
+kSimdPrefix, kExprI16x8MaxS, 0x01, // i16x8.max_s
+kSimdPrefix, kExprV8x16AllTrue, // v8x16.all_true
+kExprEnd, // end @70
+]);
+builder.addExport('main', 0);
+const instance = builder.instantiate();
+print(instance.exports.main());
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-10898.js b/deps/v8/test/mjsunit/regress/wasm/regress-10898.js
new file mode 100644
index 0000000000..61c8c72104
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-10898.js
@@ -0,0 +1,44 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --wasm-staging
+
+load('test/mjsunit/wasm/wasm-module-builder.js');
+
+const builder = new WasmModuleBuilder();
+builder.addMemory(1, 1, false, true);
+builder.addDataSegment(2, [0x12, 0x00, 0x1c]);
+builder.addDataSegment(17,
+ [0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0xc2, 0x00, 0xb33, 0x03, 0xf6, 0x0e]);
+builder.addDataSegment(41,
+ [0x00, 0xdb, 0xa6, 0xa6, 0x00, 0xe9, 0x1c, 0x06, 0xac]);
+builder.addDataSegment(57, [0x00, 0x00, 0x00, 0x00, 0xda, 0xc0, 0xbe]);
+builder.addType(makeSig([kWasmI32], [kWasmI32]));
+builder.addType(makeSig([kWasmF32], [kWasmF32]));
+builder.addType(makeSig([kWasmF64], [kWasmF64]));
+// Generate function 1 (out of 3).
+builder.addFunction(undefined, 0 /* sig */)
+ .addBodyWithEnd([
+// signature: i_i
+// body:
+kExprF32Const, 0x00, 0x00, 0x00, 0x00, // f32.const
+kExprF32Const, 0x00, 0x00, 0x00, 0x00, // f32.const
+kExprF32Le, // f32.le
+kExprLocalTee, 0x00, // local.tee
+kExprI32Const, 0xff, 0x00, // i32.const
+kAtomicPrefix, kExprAtomicNotify, 0x02, 0x03, // atomic.notify
+kExprI32LoadMem16S, 0x00, 0x02, // i32.load16_s
+kExprIf, kWasmStmt, // if @28
+ kExprLocalGet, 0x00, // local.get
+ kExprReturn, // return
+kExprElse, // else @33
+ kExprUnreachable, // unreachable
+ kExprEnd, // end @35
+kExprUnreachable, // unreachable
+kExprEnd, // end @37
+]);
+builder.addExport('func_194', 0);
+let instance = builder.instantiate();
+
+assertEquals(1, instance.exports.func_194(0));
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1116019.js b/deps/v8/test/mjsunit/regress/wasm/regress-1116019.js
index e803e08f27..e37a6da8c9 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-1116019.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1116019.js
@@ -15,7 +15,7 @@ builder.addFunction(undefined, 0 /* sig */)
// signature: i_v
// body:
kExprI32Const, 0x00, // i32.const
-kSimdPrefix, kExprI16x8Load8x8U, 0x03, 0xff, 0xff, 0x3f, // i16x8.load8x8_u
+kSimdPrefix, kExprS128Load8x8U, 0x03, 0xff, 0xff, 0x3f, // i16x8.load8x8_u
kSimdPrefix, kExprI16x8ExtractLaneS, 0,
kExprEnd, // end @371
]).exportAs('main');
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1125951.js b/deps/v8/test/mjsunit/regress/wasm/regress-1125951.js
new file mode 100644
index 0000000000..74d4c67ec3
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1125951.js
@@ -0,0 +1,20 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --expose-wasm --liftoff --no-wasm-tier-up --print-code --wasm-staging
+// Flags: --experimental-wasm-threads
+
+load("test/mjsunit/wasm/wasm-module-builder.js");
+
+(function testPrintCode() {
+ let builder = new WasmModuleBuilder();
+ builder.addMemory(1, undefined, false);
+ builder
+ .addFunction('main', makeSig([kWasmI32, kWasmI32, kWasmF64], [kWasmI32]))
+ .addBody([
+ kExprLocalGet, 0, kExprLocalGet, 1, kExprI64UConvertI32, kExprLocalGet,
+ 2, kExprI64SConvertF64, kAtomicPrefix, kExprI64AtomicWait, 0, 0
+ ]);
+ builder.instantiate();
+})();
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1137608.js b/deps/v8/test/mjsunit/regress/wasm/regress-1137608.js
new file mode 100644
index 0000000000..5011dced2f
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1137608.js
@@ -0,0 +1,46 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --no-liftoff --experimental-wasm-return-call --experimental-wasm-threads
+
+load("test/mjsunit/wasm/wasm-module-builder.js");
+
+(function Regress1137608() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig0 = builder.addType(kSig_i_iii);
+ let sig1 = builder.addType(makeSig([kWasmF64, kWasmF64, kWasmI32,
+ kWasmI32, kWasmI32, kWasmF32, kWasmI32, kWasmF64, kWasmI32, kWasmF32,
+ kWasmI32, kWasmF32, kWasmI32, kWasmF64, kWasmI32], [kWasmI32]));
+ let main = builder.addFunction("main", sig0)
+ .addBody([
+ kExprI64Const, 0,
+ kExprF64UConvertI64,
+ kExprF64Const, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
+ kExprF64Const, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+ kExprF64Mul,
+ kExprI32Const, 0,
+ kExprF64Const, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ kExprF64StoreMem, 0x00, 0xb0, 0xe0, 0xc0, 0x81, 0x03,
+ kExprI32Const, 0,
+ kExprI32Const, 0,
+ kExprI32Const, 0,
+ kExprF32Const, 0x00, 0x00, 0x00, 0x00,
+ kExprI32Const, 0,
+ kExprF64Const, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ kExprI32Const, 0,
+ kExprF32Const, 0x00, 0x00, 0x00, 0x00,
+ kExprI32Const, 0,
+ kExprF32Const, 0x00, 0x00, 0x00, 0x00,
+ kExprI32Const, 0,
+ kExprF64Const, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ kExprI32Const, 0,
+ kExprI32Const, 2,
+ kExprReturnCallIndirect, sig1, kTableZero]).exportFunc();
+ builder.addFunction("f", sig1).addBody([kExprI32Const, 0]);
+ builder.addTable(kWasmAnyFunc, 4, 4);
+ builder.addMemory(16, 32, false, true);
+ let module = new WebAssembly.Module(builder.toBuffer());
+ let instance = new WebAssembly.Instance(module);
+})();
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1140549.js b/deps/v8/test/mjsunit/regress/wasm/regress-1140549.js
new file mode 100644
index 0000000000..65191e1962
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1140549.js
@@ -0,0 +1,25 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --wasm-staging
+
+load('test/mjsunit/wasm/wasm-module-builder.js');
+
+const builder = new WasmModuleBuilder();
+builder.addMemory(16, 32, false, true);
+builder.addType(makeSig([], []));
+builder.addFunction(undefined, 0 /* sig */)
+ .addBodyWithEnd([
+// signature: v_v
+// body:
+kExprI32Const, 0x00,
+kExprI32Const, 0x00,
+kExprI32Const, 0x00,
+kAtomicPrefix, kExprI32AtomicCompareExchange8U, 0x00, 0xc3, 0x01,
+kExprDrop,
+kExprEnd, // end @193
+]);
+builder.addExport('main', 0);
+const instance = builder.instantiate();
+print(instance.exports.main(1, 2, 3));
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-666741.js b/deps/v8/test/mjsunit/regress/wasm/regress-666741.js
index 0f9ae9a607..2fff1bec79 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-666741.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-666741.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// Flags: --random-seed=-1101427159 --enable-slow-asserts --expose-wasm
+// Flags: --enable-slow-asserts --expose-wasm
(function __f_7() {
assertThrows(() => new WebAssembly.Memory({initial: 79199}), RangeError);
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-7508.js b/deps/v8/test/mjsunit/regress/wasm/regress-7508.js
index 1c02060957..4b7af2a32c 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-7508.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-7508.js
@@ -5,7 +5,7 @@
load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
-builder.addFunction(undefined, kSig_v_v).addLocals({i64_count: 1}).addBody([
+builder.addFunction(undefined, kSig_v_v).addLocals(kWasmI64, 1).addBody([
kExprI64Const, 0xeb, 0xd7, 0xaf, 0xdf,
0xbe, 0xfd, 0xfa, 0xf5, 0x6b, // i64.const
kExprI32Const, 0, // i32.const
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-7565.js b/deps/v8/test/mjsunit/regress/wasm/regress-7565.js
index 3b97fe8615..7b6e00a867 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-7565.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-7565.js
@@ -6,7 +6,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
sig0 = makeSig([], [kWasmI32]);
-builder.addFunction(undefined, sig0).addLocals({i64_count: 1}).addBody([
+builder.addFunction(undefined, sig0).addLocals(kWasmI64, 1).addBody([
kExprLoop, kWasmI32, // loop i32
kExprF32Const, 0x00, 0x00, 0x00, 0x00, // f32.const 0 --> f32:0
kExprLocalGet, 0x00, // get_local 0 --> i64:0
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-7579.js b/deps/v8/test/mjsunit/regress/wasm/regress-7579.js
index da774b00f1..bd0d2d7cd3 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-7579.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-7579.js
@@ -49,7 +49,7 @@ assertEquals(1, instance.exports.main());
const builder2 = new WasmModuleBuilder();
sig0 = makeSig([], [kWasmI32]);
-builder2.addFunction(undefined, sig0).addLocals({i64_count: 1}).addBody([
+builder2.addFunction(undefined, sig0).addLocals(kWasmI64, 1).addBody([
kExprLoop, kWasmI32, // loop i32
kExprLocalGet, 0, // get_local 3
kExprF32SConvertI64, // f32.sconvert/i64
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-763697.js b/deps/v8/test/mjsunit/regress/wasm/regress-763697.js
index 5f36d42c8d..f9da32a694 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-763697.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-763697.js
@@ -9,6 +9,6 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
let builder = new WasmModuleBuilder();
builder.addFunction("main", kSig_i_i)
.addBody([kExprLocalGet, 0])
- .addLocals({s128_count: 1});
+ .addLocals(kWasmS128, 1)
assertFalse(WebAssembly.validate(builder.toBuffer()));
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-7785.js b/deps/v8/test/mjsunit/regress/wasm/regress-7785.js
index c387342f4d..f392ff3f3d 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-7785.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-7785.js
@@ -2,7 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --allow-natives-syntax --experimental-wasm-reftypes
+// The test needs --wasm-tier-up because we can't serialize and deserialize
+// Liftoff code.
+// Flags: --allow-natives-syntax --experimental-wasm-reftypes --wasm-tier-up
load("test/mjsunit/wasm/wasm-module-builder.js");
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-808848.js b/deps/v8/test/mjsunit/regress/wasm/regress-808848.js
index 21374e9cff..a911eba847 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-808848.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-808848.js
@@ -41,7 +41,7 @@ builder.addImport('mod', 'get', kSig_i_v);
builder.addImport('mod', 'call', kSig_v_i);
builder.
addFunction('main', kSig_v_v).
- addLocals({i32_count: kNumLocals}).
+ addLocals(kWasmI32, kNumLocals).
addBody(body).
exportAs('main');
let m1_bytes = builder.toBuffer();
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-819869.js b/deps/v8/test/mjsunit/regress/wasm/regress-819869.js
index a32928ab0c..1682b1f173 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-819869.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-819869.js
@@ -6,6 +6,6 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
var builder = new WasmModuleBuilder();
builder.addFunction(undefined, kSig_i_i)
- .addLocals({i32_count: 0xffffffff})
+ .addLocals(kWasmI32, 0xffffffff)
.addBody([]);
assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-854050.js b/deps/v8/test/mjsunit/regress/wasm/regress-854050.js
index 7130595870..bf170c5d63 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-854050.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-854050.js
@@ -6,7 +6,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
builder.addFunction(undefined, makeSig([kWasmI32, kWasmF32], []))
- .addLocals({i32_count: 7})
+ .addLocals(kWasmI32, 7)
.addBody([
kExprLocalGet, 0, // get_local
kExprI32Const, 0, // i32.const 0
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-864509.js b/deps/v8/test/mjsunit/regress/wasm/regress-864509.js
index b18c6619d4..3310eca69f 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-864509.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-864509.js
@@ -32,7 +32,7 @@ const gen_i32_code = [
kExprI32Const, 1, // i32.const 1
kExprI32Add // i32.add --> 2nd param
];
-builder.addFunction(undefined, kSig_v_v).addLocals({i32_count: 1}).addBody([
+builder.addFunction(undefined, kSig_v_v).addLocals(kWasmI32, 1).addBody([
// Generate six values on the stack, then six more to force the other six on
// the stack.
...wasmI32Const(0), // i32.const 0
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-9017.js b/deps/v8/test/mjsunit/regress/wasm/regress-9017.js
index 7a8930a146..4fb790ec73 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-9017.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-9017.js
@@ -16,7 +16,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
var builder = new WasmModuleBuilder();
var func_idx = builder.addFunction('helper', kSig_i_v)
- .addLocals({i32_count: 1})
+ .addLocals(kWasmI32, 1)
.addBody([
kExprI32Const, 0x01,
]).index;
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-905815.js b/deps/v8/test/mjsunit/regress/wasm/regress-905815.js
index b49881f472..21f32180bd 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-905815.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-905815.js
@@ -13,7 +13,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
kExprEnd, // @1
]);
builder.addFunction(undefined, 1 /* sig */)
- .addLocals({i32_count: 65})
+ .addLocals(kWasmI32, 65)
.addBodyWithEnd([
kExprLoop, kWasmStmt, // @3
kSimdPrefix,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-910824.js b/deps/v8/test/mjsunit/regress/wasm/regress-910824.js
index 6101f8ca81..6a2dac79e5 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-910824.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-910824.js
@@ -9,7 +9,7 @@ builder.addGlobal(kWasmI32, 1);
builder.addGlobal(kWasmF32, 1);
builder.addType(makeSig([kWasmI32, kWasmF32, kWasmF32, kWasmF64], [kWasmI32]));
builder.addFunction(undefined, 0 /* sig */)
- .addLocals({i32_count: 504})
+ .addLocals(kWasmI32, 504)
.addBody([
kExprGlobalGet, 0x00,
kExprLocalSet, 0x04,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-917588.js b/deps/v8/test/mjsunit/regress/wasm/regress-917588.js
index b07814415e..2e75cdfe9d 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-917588.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-917588.js
@@ -7,7 +7,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
const sig = builder.addType(makeSig([], [kWasmF64]));
builder.addFunction(undefined, sig)
- .addLocals({f32_count: 5}).addLocals({f64_count: 3})
+ .addLocals(kWasmF32, 5).addLocals(kWasmF64, 3)
.addBody([
kExprBlock, kWasmF64,
kExprF64Const, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-918284.js b/deps/v8/test/mjsunit/regress/wasm/regress-918284.js
index 16de9caabd..3eb631d381 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-918284.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-918284.js
@@ -6,7 +6,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
builder.addFunction(undefined, kSig_i_i)
- .addLocals({i32_count: 7})
+ .addLocals(kWasmI32, 7)
.addBody([
kExprI32Const, 0,
kExprIf, kWasmI32, // @11 i32
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-918917.js b/deps/v8/test/mjsunit/regress/wasm/regress-918917.js
index 3660244cda..8f9d38eacc 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-918917.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-918917.js
@@ -6,7 +6,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
builder.addFunction(undefined, kSig_v_v)
- .addLocals({i32_count: 1}).addLocals({f32_count: 1}).addLocals({f64_count: 1})
+ .addLocals(kWasmI32, 1).addLocals(kWasmF32, 1).addLocals(kWasmF64, 1)
.addBody([
kExprLocalGet, 1,
kExprLocalGet, 2,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-919308.js b/deps/v8/test/mjsunit/regress/wasm/regress-919308.js
index e2f0426702..8d498939a8 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-919308.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-919308.js
@@ -6,7 +6,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
builder.addFunction(undefined, kSig_i_i)
- .addLocals({i32_count: 5})
+ .addLocals(kWasmI32, 5)
.addBody([
kExprLocalGet, 0, // --> 1
kExprIf, kWasmI32,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-922432.js b/deps/v8/test/mjsunit/regress/wasm/regress-922432.js
index d5aee0d332..26a004652a 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-922432.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-922432.js
@@ -9,7 +9,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
(function TestTruncatedBrOnExnInLoop() {
let builder = new WasmModuleBuilder();
let fun = builder.addFunction(undefined, kSig_v_v)
- .addLocals({except_count: 1})
+ .addLocals(kWasmExnRef, 1)
.addBody([
kExprLoop, kWasmStmt,
kExprLocalGet, 0,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-922670.js b/deps/v8/test/mjsunit/regress/wasm/regress-922670.js
index 96a17bebba..e9dd2159b9 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-922670.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-922670.js
@@ -7,7 +7,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
const sig = builder.addType(makeSig([kWasmI32], []));
builder.addFunction(undefined, sig)
- .addLocals({i64_count: 1})
+ .addLocals(kWasmI64, 1)
.addBody([
kExprLoop, kWasmI32,
kExprLocalGet, 1,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-922933.js b/deps/v8/test/mjsunit/regress/wasm/regress-922933.js
index 6d0286d95a..aabe001392 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-922933.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-922933.js
@@ -7,7 +7,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
const sig = builder.addType(makeSig([kWasmI64], [kWasmI64]));
builder.addFunction(undefined, sig)
- .addLocals({i32_count: 14}).addLocals({i64_count: 17}).addLocals({f32_count: 14})
+ .addLocals(kWasmI32, 14).addLocals(kWasmI64, 17).addLocals(kWasmF32, 14)
.addBody([
kExprBlock, kWasmStmt,
kExprBr, 0x00,
diff --git a/deps/v8/test/mjsunit/sloppy-arguments-property-access.js b/deps/v8/test/mjsunit/sloppy-arguments-property-access.js
new file mode 100644
index 0000000000..abcc01de98
--- /dev/null
+++ b/deps/v8/test/mjsunit/sloppy-arguments-property-access.js
@@ -0,0 +1,67 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function sloppyArgumentsGenerator(a,b) {
+ arguments[7] = 88;
+ return arguments;
+}
+
+function testLoad() {
+ let a = sloppyArgumentsGenerator(66,55,45,77);
+ for (let i=0;i<2;++i) {
+ assertEquals(a[0], 66);
+ }
+ for (let i=0;i<2;++i) {
+ assertEquals(a[2], 45);
+ }
+ for (let i=0;i<2;++i) {
+ assertEquals(a[10], undefined);
+ }
+ for (let i=0;i<2;++i) {
+ assertEquals(a[6], undefined);
+ }
+ for (let i=0;i<2;++i) {
+ assertEquals(a[7], 88);
+ }
+ delete a[0];
+ for (let i=0;i<2;++i) {
+ assertEquals(a[0], undefined);
+ }
+}
+
+function testHas() {
+ let a = sloppyArgumentsGenerator(66,55,45,77);
+ for (let i=0;i<2;++i) {
+ assertTrue(0 in a);
+ }
+ for (let i=0;i<2;++i) {
+ assertTrue(2 in a);
+ }
+ for (let i=0;i<2;++i) {
+ assertFalse(10 in a);
+ }
+ for (let i=0;i<2;++i) {
+ assertFalse(6 in a);
+ }
+ for (let i=0;i<2;++i) {
+ assertTrue(7 in a);
+ }
+ delete a[0];
+ for (let i=0;i<2;++i) {
+ assertFalse(0 in a);
+ }
+}
+
+// Test once without type feedback vector
+testLoad();
+testHas();
+
+%EnsureFeedbackVectorForFunction(testLoad);
+%EnsureFeedbackVectorForFunction(testHas);
+
+// Test again with type feedback vector
+testLoad();
+testHas();
diff --git a/deps/v8/test/mjsunit/string-case.js b/deps/v8/test/mjsunit/string-case.js
index b6934eb705..4bc169cad3 100644
--- a/deps/v8/test/mjsunit/string-case.js
+++ b/deps/v8/test/mjsunit/string-case.js
@@ -25,8 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Flags: --random-seed=17 --allow-natives-syntax
-// Flags: --expose-externalize-string
+// Flags: --allow-natives-syntax --expose-externalize-string
assertEquals("ΚΟΣΜΟΣ ΚΟΣΜΟΣ".toLowerCase(), "κοσμος κοσμος");
diff --git a/deps/v8/test/mjsunit/tools/codemap.js b/deps/v8/test/mjsunit/tools/codemap.mjs
index 33d7e4e087..f1150fe364 100644
--- a/deps/v8/test/mjsunit/tools/codemap.js
+++ b/deps/v8/test/mjsunit/tools/codemap.mjs
@@ -25,9 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load Splay tree and CodeMap implementations from <project root>/tools.
-// Files: tools/splaytree.js tools/codemap.js
-
+import { CodeMap } from "../../../tools/codemap.mjs";
function newCodeEntry(size, name) {
return new CodeMap.CodeEntry(size, name);
diff --git a/deps/v8/test/mjsunit/tools/consarray.js b/deps/v8/test/mjsunit/tools/consarray.mjs
index 8b2c59beac..c3cdf90277 100644
--- a/deps/v8/test/mjsunit/tools/consarray.js
+++ b/deps/v8/test/mjsunit/tools/consarray.mjs
@@ -25,9 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load ConsArray implementation from <project root>/tools.
-// Files: tools/consarray.js
-
+import { ConsArray } from "../../../tools/consarray.mjs";
var arr1 = new ConsArray();
assertTrue(arr1.atEnd());
diff --git a/deps/v8/test/mjsunit/tools/csvparser.js b/deps/v8/test/mjsunit/tools/csvparser.mjs
index 91eb3e45b5..bb128e8bb5 100644
--- a/deps/v8/test/mjsunit/tools/csvparser.js
+++ b/deps/v8/test/mjsunit/tools/csvparser.mjs
@@ -25,8 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load CSV parser implementation from <project root>/tools.
-// Files: tools/csvparser.js
+import { CsvParser } from "../../../tools/csvparser.mjs";
var parser = new CsvParser();
diff --git a/deps/v8/test/mjsunit/tools/dumpcpp.js b/deps/v8/test/mjsunit/tools/dumpcpp.mjs
index 2d9f17971f..596049c9ce 100644
--- a/deps/v8/test/mjsunit/tools/dumpcpp.js
+++ b/deps/v8/test/mjsunit/tools/dumpcpp.mjs
@@ -2,12 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Load implementations from <project root>/tools.
-// Files: tools/splaytree.js tools/codemap.js tools/csvparser.js
-// Files: tools/consarray.js tools/profile.js tools/profile_view.js
-// Files: tools/logreader.js tools/arguments.js tools/tickprocessor.js
-// Files: tools/dumpcpp.js
-// Env: TEST_FILE_NAME
+import {
+ CppProcessor, UnixCppEntriesProvider
+ } from "../../../tools/dumpcpp.mjs" ;
(function testProcessSharedLibrary() {
var oldLoadSymbols = UnixCppEntriesProvider.prototype.loadSymbols;
diff --git a/deps/v8/test/mjsunit/tools/foozzie.js b/deps/v8/test/mjsunit/tools/foozzie.js
index bae1c49ea5..d5298593f5 100644
--- a/deps/v8/test/mjsunit/tools/foozzie.js
+++ b/deps/v8/test/mjsunit/tools/foozzie.js
@@ -107,3 +107,8 @@ function callPow(v) {
const unoptimized = callPow(6996);
%OptimizeFunctionOnNextCall(callPow);
assertEquals(unoptimized, callPow(6996));
+
+// Test mocked Atomics.waitAsync.
+let then_called = false;
+Atomics.waitAsync().value.then(() => {then_called = true;});
+assertEquals(true, then_called);
diff --git a/deps/v8/test/mjsunit/tools/log.js b/deps/v8/test/mjsunit/tools/log.js
new file mode 100644
index 0000000000..4989923530
--- /dev/null
+++ b/deps/v8/test/mjsunit/tools/log.js
@@ -0,0 +1,25 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --logfile='+' --log --log-code --no-stress-opt
+
+function testFunctionWithFunnyName(o) {
+ return o.a;
+}
+
+(function testLoopWithFunnyName() {
+ const o = {a:1};
+ let result = 0;
+ for (let i = 0; i < 1000; i++) {
+ result += testFunctionWithFunnyName(o);
+ }
+})();
+
+const log = d8.log.getAndStop();
+
+// Check that we have a minimally working log file.
+assertTrue(log.length > 0);
+assertTrue(log.indexOf('v8-version') == 0);
+assertTrue(log.indexOf('testFunctionWithFunnyName') >= 10);
+assertTrue(log.indexOf('testLoopWithFunnyName') >= 10);
diff --git a/deps/v8/test/mjsunit/tools/log_two_byte.js b/deps/v8/test/mjsunit/tools/log_two_byte.js
new file mode 100644
index 0000000000..5e6f89fe16
--- /dev/null
+++ b/deps/v8/test/mjsunit/tools/log_two_byte.js
@@ -0,0 +1,39 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --logfile='+' --log --log-code --log-function-events --no-stress-opt
+
+let twoByteName = "twoByteName_🍕"
+let o = {
+ [twoByteName](obj) {
+ return obj.a
+ }
+}
+function testFunctionWithFunnyName(o) {
+ return o.a;
+}
+
+(function testLoopWithFunnyName() {
+ let object = {a:1};
+ let result = 0;
+ for (let i = 0; i < 1000; i++) {
+ result += o[twoByteName](object);
+ }
+ console.log(result);
+ console.log(twoByteName);
+
+})();
+
+var __v_3 = {};
+({})['foobar\u2653'] = null;
+eval('__v_3 = function foobar() { return foobar };');
+__v_3();
+
+const log = d8.log.getAndStop();
+// Check that we have a minimally working log file.
+assertTrue(log.length > 0);
+assertTrue(log.indexOf('v8-version') == 0);
+assertTrue(log.indexOf('testFunctionWithFunnyName') >= 10);
+assertTrue(log.indexOf("twoByteName") >= 10);
+assertTrue(log.indexOf('testLoopWithFunnyName') >= 10);
diff --git a/deps/v8/test/mjsunit/tools/profile.js b/deps/v8/test/mjsunit/tools/profile.mjs
index c9d2da78dc..a98978122d 100644
--- a/deps/v8/test/mjsunit/tools/profile.js
+++ b/deps/v8/test/mjsunit/tools/profile.mjs
@@ -25,9 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load source code files from <project root>/tools.
-// Files: tools/splaytree.js tools/codemap.js tools/consarray.js tools/profile.js
-
+import { Profile } from "../../../tools/profile.mjs";
function stackToString(stack) {
return stack.join(' -> ');
diff --git a/deps/v8/test/mjsunit/tools/profile_view.js b/deps/v8/test/mjsunit/tools/profile_view.mjs
index d62205be16..77219d2541 100644
--- a/deps/v8/test/mjsunit/tools/profile_view.js
+++ b/deps/v8/test/mjsunit/tools/profile_view.mjs
@@ -25,9 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load source code files from <project root>/tools.
-// Files: tools/codemap.js tools/consarray.js tools/profile.js
-// Files: tools/profile_view.js
+import { ProfileView } from "../../../tools/profile_view.mjs";
function createNode(name, time, opt_parent) {
diff --git a/deps/v8/test/mjsunit/tools/profviz-test.default b/deps/v8/test/mjsunit/tools/profviz-test.default
deleted file mode 100644
index 0c33e11abd..0000000000
--- a/deps/v8/test/mjsunit/tools/profviz-test.default
+++ /dev/null
@@ -1,1566 +0,0 @@
-[
- "set yrange [0:24.5]",
- "set xlabel \"execution time in ms\"",
- "set xrange [2.4204999999999997:141.1669999999999]",
- "set style fill pattern 2 bo 1",
- "set style rect fs solid 1 noborder",
- "set style line 1 lt 1 lw 1 lc rgb \"#000000\"",
- "set border 15 lw 0.2",
- "set style line 2 lt 1 lw 1 lc rgb \"#9944CC\"",
- "set xtics out nomirror",
- "unset key",
- "set object 1 rect from 87.51699999999991, 7 to 87.60371656249991, 3 fc rgb \"#9944CC\"",
- "set object 2 rect from 110.7114999999999, 7 to 110.7982165624999, 3 fc rgb \"#9944CC\"",
- "set object 3 rect from 133.5129999999999, 7 to 133.59971656249988, 3 fc rgb \"#9944CC\"",
- "set object 4 rect from 61.49249999999995, 7 to 61.57921656249995, 5.020618556701031 fc rgb \"#9944CC\"",
- "set object 5 rect from 101.40849999999992, 7 to 101.49521656249992, 5.103092783505154 fc rgb \"#9944CC\"",
- "set object 6 rect from 57.242999999999974, 7 to 57.329716562499975, 6.766323024054983 fc rgb \"#9944CC\"",
- "set object 7 rect from 58.751499999999965, 7 to 58.838216562499966, 6.766323024054983 fc rgb \"#9944CC\"",
- "set object 8 rect from 60.72499999999996, 7 to 60.81171656249996, 6.766323024054983 fc rgb \"#9944CC\"",
- "set ytics out nomirror (\"execution (59.6%%)\" 12.5, \"external (0.2%%)\" 13.5, \"compile unopt (3.1%%)\" 14.5, \"recompile sync (6.6%%)\" 15.5, \"recompile async (11.6%%)\" 16.5, \"compile eval (0.0%%)\" 17.5, \"parse (9.9%%)\" 18.5, \"preparse (0.6%%)\" 19.5, \"lazy parse (2.9%%)\" 20.5, \"gc scavenge (1.6%%)\" 21.5, \"gc compaction (3.3%%)\" 22.5, \"gc context (0.0%%)\" 23.5, \"code kind color coding\" 11, \"code kind in execution\" 10, \"top 8 js stack frames\" 9, \"pause times\" 0, \"max deopt size: 9.1 kB\" 7)",
- "set object 9 rect from 42.11000000000001, 12.83 to 42.28050000000001, 12.17 fc rgb \"#000000\"",
- "set object 10 rect from 42.298000000000016, 12.83 to 42.30000000000002, 12.17 fc rgb \"#000000\"",
- "set object 11 rect from 42.31450000000002, 12.83 to 42.62700000000002, 12.17 fc rgb \"#000000\"",
- "set object 12 rect from 42.656500000000015, 12.83 to 42.66150000000002, 12.17 fc rgb \"#000000\"",
- "set object 13 rect from 42.70600000000002, 12.83 to 42.747000000000014, 12.17 fc rgb \"#000000\"",
- "set object 14 rect from 42.763500000000015, 12.83 to 42.76550000000001, 12.17 fc rgb \"#000000\"",
- "set object 15 rect from 42.795000000000016, 12.83 to 42.812500000000014, 12.17 fc rgb \"#000000\"",
- "set object 16 rect from 42.83300000000001, 12.83 to 42.844000000000015, 12.17 fc rgb \"#000000\"",
- "set object 17 rect from 42.858500000000014, 12.83 to 42.85950000000001, 12.17 fc rgb \"#000000\"",
- "set object 18 rect from 42.88200000000001, 12.83 to 43.60550000000001, 12.17 fc rgb \"#000000\"",
- "set object 19 rect from 43.62000000000002, 12.83 to 43.622000000000014, 12.17 fc rgb \"#000000\"",
- "set object 20 rect from 43.632500000000014, 12.83 to 44.796000000000014, 12.17 fc rgb \"#000000\"",
- "set object 21 rect from 44.81150000000002, 12.83 to 44.812500000000014, 12.17 fc rgb \"#000000\"",
- "set object 22 rect from 44.82200000000002, 12.83 to 44.84500000000001, 12.17 fc rgb \"#000000\"",
- "set object 23 rect from 44.87150000000002, 12.83 to 44.87550000000002, 12.17 fc rgb \"#000000\"",
- "set object 24 rect from 44.917000000000016, 12.83 to 44.996000000000016, 12.17 fc rgb \"#000000\"",
- "set object 25 rect from 45.00850000000001, 12.83 to 45.01150000000001, 12.17 fc rgb \"#000000\"",
- "set object 26 rect from 45.02900000000001, 12.83 to 45.04700000000001, 12.17 fc rgb \"#000000\"",
- "set object 27 rect from 45.06450000000002, 12.83 to 45.068500000000014, 12.17 fc rgb \"#000000\"",
- "set object 28 rect from 45.08700000000001, 12.83 to 45.09600000000001, 12.17 fc rgb \"#000000\"",
- "set object 29 rect from 45.107500000000016, 12.83 to 45.110500000000016, 12.17 fc rgb \"#000000\"",
- "set object 30 rect from 45.13500000000002, 12.83 to 45.14400000000002, 12.17 fc rgb \"#000000\"",
- "set object 31 rect from 45.16150000000002, 12.83 to 45.32050000000002, 12.17 fc rgb \"#000000\"",
- "set object 32 rect from 45.33700000000002, 12.83 to 45.34000000000002, 12.17 fc rgb \"#000000\"",
- "set object 33 rect from 45.361500000000014, 12.83 to 45.38750000000002, 12.17 fc rgb \"#000000\"",
- "set object 34 rect from 45.402000000000015, 12.83 to 45.405000000000015, 12.17 fc rgb \"#000000\"",
- "set object 35 rect from 45.41750000000002, 12.83 to 45.43250000000002, 12.17 fc rgb \"#000000\"",
- "set object 36 rect from 45.442000000000014, 12.83 to 45.49750000000001, 12.17 fc rgb \"#000000\"",
- "set object 37 rect from 45.55900000000001, 12.83 to 45.56900000000001, 12.17 fc rgb \"#000000\"",
- "set object 38 rect from 45.626500000000014, 12.83 to 45.66050000000001, 12.17 fc rgb \"#000000\"",
- "set object 39 rect from 45.70300000000001, 12.83 to 45.71200000000001, 12.17 fc rgb \"#000000\"",
- "set object 40 rect from 45.76150000000001, 12.83 to 45.79350000000001, 12.17 fc rgb \"#000000\"",
- "set object 41 rect from 45.81700000000001, 12.83 to 45.82000000000001, 12.17 fc rgb \"#000000\"",
- "set object 42 rect from 45.84850000000001, 12.83 to 45.86950000000001, 12.17 fc rgb \"#000000\"",
- "set object 43 rect from 45.92300000000001, 12.83 to 45.93000000000001, 12.17 fc rgb \"#000000\"",
- "set object 44 rect from 45.97850000000001, 12.83 to 45.99450000000001, 12.17 fc rgb \"#000000\"",
- "set object 45 rect from 46.060500000000005, 12.83 to 46.08650000000001, 12.17 fc rgb \"#000000\"",
- "set object 46 rect from 46.13100000000001, 12.83 to 46.18500000000001, 12.17 fc rgb \"#000000\"",
- "set object 47 rect from 46.28150000000001, 12.83 to 46.291500000000006, 12.17 fc rgb \"#000000\"",
- "set object 48 rect from 46.37200000000001, 12.83 to 46.550000000000004, 12.17 fc rgb \"#000000\"",
- "set object 49 rect from 46.5915, 12.83 to 46.59550000000001, 12.17 fc rgb \"#000000\"",
- "set object 50 rect from 46.621, 12.83 to 46.65500000000001, 12.17 fc rgb \"#000000\"",
- "set object 51 rect from 46.691500000000005, 12.83 to 46.694500000000005, 12.17 fc rgb \"#000000\"",
- "set object 52 rect from 46.74, 12.83 to 46.861000000000004, 12.17 fc rgb \"#000000\"",
- "set object 53 rect from 46.8935, 12.83 to 46.8975, 12.17 fc rgb \"#000000\"",
- "set object 54 rect from 46.9925, 12.83 to 47.039500000000004, 12.17 fc rgb \"#000000\"",
- "set object 55 rect from 47.049, 12.83 to 47.0765, 12.17 fc rgb \"#000000\"",
- "set object 56 rect from 47.135000000000005, 12.83 to 47.141, 12.17 fc rgb \"#000000\"",
- "set object 57 rect from 47.3935, 12.83 to 47.4125, 12.17 fc rgb \"#000000\"",
- "set object 58 rect from 47.465, 12.83 to 47.472, 12.17 fc rgb \"#000000\"",
- "set object 59 rect from 47.5235, 12.83 to 49.454499999999996, 12.17 fc rgb \"#000000\"",
- "set object 60 rect from 49.467, 12.83 to 49.469, 12.17 fc rgb \"#000000\"",
- "set object 61 rect from 49.4955, 12.83 to 49.6855, 12.17 fc rgb \"#000000\"",
- "set object 62 rect from 49.726, 12.83 to 49.732, 12.17 fc rgb \"#000000\"",
- "set object 63 rect from 49.780499999999996, 12.83 to 49.799499999999995, 12.17 fc rgb \"#000000\"",
- "set object 64 rect from 49.812999999999995, 12.83 to 49.814, 12.17 fc rgb \"#000000\"",
- "set object 65 rect from 49.82449999999999, 12.83 to 49.851, 12.17 fc rgb \"#000000\"",
- "set object 66 rect from 49.8685, 12.83 to 49.894499999999994, 12.17 fc rgb \"#000000\"",
- "set object 67 rect from 49.9695, 12.83 to 50.083999999999996, 12.17 fc rgb \"#000000\"",
- "set object 68 rect from 50.14149999999999, 12.83 to 50.147499999999994, 12.17 fc rgb \"#000000\"",
- "set object 69 rect from 50.20799999999999, 12.83 to 50.29299999999999, 12.17 fc rgb \"#000000\"",
- "set object 70 rect from 50.31249999999999, 12.83 to 50.314499999999995, 12.17 fc rgb \"#000000\"",
- "set object 71 rect from 50.32899999999999, 12.83 to 50.36699999999999, 12.17 fc rgb \"#000000\"",
- "set object 72 rect from 50.39849999999999, 12.83 to 50.40249999999999, 12.17 fc rgb \"#000000\"",
- "set object 73 rect from 50.43099999999999, 12.83 to 50.54899999999999, 12.17 fc rgb \"#000000\"",
- "set object 74 rect from 50.62049999999999, 12.83 to 50.62949999999999, 12.17 fc rgb \"#000000\"",
- "set object 75 rect from 51.02349999999999, 12.83 to 51.27549999999999, 12.17 fc rgb \"#000000\"",
- "set object 76 rect from 51.29099999999999, 12.83 to 51.292999999999985, 12.17 fc rgb \"#000000\"",
- "set object 77 rect from 51.30249999999999, 12.83 to 51.52249999999999, 12.17 fc rgb \"#000000\"",
- "set object 78 rect from 51.56899999999999, 12.83 to 51.57499999999999, 12.17 fc rgb \"#000000\"",
- "set object 79 rect from 51.78349999999999, 12.83 to 51.87299999999998, 12.17 fc rgb \"#000000\"",
- "set object 80 rect from 51.89049999999999, 12.83 to 51.89349999999999, 12.17 fc rgb \"#000000\"",
- "set object 81 rect from 51.91599999999998, 12.83 to 52.115999999999985, 12.17 fc rgb \"#000000\"",
- "set object 82 rect from 52.13449999999999, 12.83 to 52.13749999999999, 12.17 fc rgb \"#000000\"",
- "set object 83 rect from 52.15399999999998, 12.83 to 52.286999999999985, 12.17 fc rgb \"#000000\"",
- "set object 84 rect from 52.300499999999985, 12.83 to 52.30249999999998, 12.17 fc rgb \"#000000\"",
- "set object 85 rect from 52.31499999999998, 12.83 to 52.362999999999985, 12.17 fc rgb \"#000000\"",
- "set object 86 rect from 52.404499999999985, 12.83 to 52.40949999999998, 12.17 fc rgb \"#000000\"",
- "set object 87 rect from 52.448999999999984, 12.83 to 54.55999999999998, 12.17 fc rgb \"#000000\"",
- "set object 88 rect from 54.951999999999984, 12.83 to 55.48599999999998, 12.17 fc rgb \"#000000\"",
- "set object 89 rect from 55.66249999999998, 12.83 to 55.79999999999998, 12.17 fc rgb \"#000000\"",
- "set object 90 rect from 56.198999999999984, 12.83 to 56.25149999999998, 12.17 fc rgb \"#000000\"",
- "set object 91 rect from 56.52499999999998, 12.83 to 56.55699999999998, 12.17 fc rgb \"#000000\"",
- "set object 92 rect from 56.634499999999974, 12.83 to 56.63999999999998, 12.17 fc rgb \"#000000\"",
- "set object 93 rect from 56.69449999999998, 12.83 to 56.746499999999976, 12.17 fc rgb \"#000000\"",
- "set object 94 rect from 56.845999999999975, 12.83 to 56.85849999999998, 12.17 fc rgb \"#000000\"",
- "set object 95 rect from 56.97649999999997, 12.83 to 57.03599999999997, 12.17 fc rgb \"#000000\"",
- "set object 96 rect from 57.205999999999975, 12.83 to 57.27249999999997, 12.17 fc rgb \"#000000\"",
- "set object 97 rect from 57.33299999999997, 12.83 to 57.565999999999974, 12.17 fc rgb \"#000000\"",
- "set object 98 rect from 57.64849999999997, 12.83 to 57.878499999999974, 12.17 fc rgb \"#000000\"",
- "set object 99 rect from 57.934999999999974, 12.83 to 57.97299999999997, 12.17 fc rgb \"#000000\"",
- "set object 100 rect from 58.07699999999997, 12.83 to 58.09149999999997, 12.17 fc rgb \"#000000\"",
- "set object 101 rect from 58.12149999999997, 12.83 to 58.14299999999997, 12.17 fc rgb \"#000000\"",
- "set object 102 rect from 58.17349999999997, 12.83 to 58.17499999999997, 12.17 fc rgb \"#000000\"",
- "set object 103 rect from 58.21549999999997, 12.83 to 58.23599999999997, 12.17 fc rgb \"#000000\"",
- "set object 104 rect from 58.275499999999965, 12.83 to 58.27599999999997, 12.17 fc rgb \"#000000\"",
- "set object 105 rect from 58.300499999999964, 12.83 to 58.30299999999997, 12.17 fc rgb \"#000000\"",
- "set object 106 rect from 58.316999999999965, 12.83 to 58.409499999999966, 12.17 fc rgb \"#000000\"",
- "set object 107 rect from 58.58699999999997, 12.83 to 58.589499999999965, 12.17 fc rgb \"#000000\"",
- "set object 108 rect from 58.65749999999996, 12.83 to 58.92499999999996, 12.17 fc rgb \"#000000\"",
- "set object 109 rect from 59.02199999999996, 12.83 to 59.02349999999996, 12.17 fc rgb \"#000000\"",
- "set object 110 rect from 59.042999999999964, 12.83 to 59.641499999999965, 12.17 fc rgb \"#000000\"",
- "set object 111 rect from 59.69699999999996, 12.83 to 59.89099999999996, 12.17 fc rgb \"#000000\"",
- "set object 112 rect from 59.93649999999996, 12.83 to 60.04699999999996, 12.17 fc rgb \"#000000\"",
- "set object 113 rect from 60.08349999999996, 12.83 to 60.17149999999996, 12.17 fc rgb \"#000000\"",
- "set object 114 rect from 60.54849999999996, 12.83 to 60.55099999999995, 12.17 fc rgb \"#000000\"",
- "set object 115 rect from 60.65699999999996, 12.83 to 60.91649999999996, 12.17 fc rgb \"#000000\"",
- "set object 116 rect from 61.253999999999955, 12.83 to 61.31249999999996, 12.17 fc rgb \"#000000\"",
- "set object 117 rect from 61.464999999999954, 12.83 to 62.16149999999996, 12.17 fc rgb \"#000000\"",
- "set object 118 rect from 62.548999999999964, 12.83 to 62.62699999999996, 12.17 fc rgb \"#000000\"",
- "set object 119 rect from 63.024999999999956, 12.83 to 63.14749999999995, 12.17 fc rgb \"#000000\"",
- "set object 120 rect from 63.41299999999995, 12.83 to 64.40899999999996, 12.17 fc rgb \"#000000\"",
- "set object 121 rect from 64.61749999999995, 12.83 to 65.56449999999995, 12.17 fc rgb \"#000000\"",
- "set object 122 rect from 65.61699999999995, 12.83 to 67.34249999999994, 12.17 fc rgb \"#000000\"",
- "set object 123 rect from 67.45099999999994, 12.83 to 67.45549999999994, 12.17 fc rgb \"#000000\"",
- "set object 124 rect from 67.48749999999995, 12.83 to 67.53599999999994, 12.17 fc rgb \"#000000\"",
- "set object 125 rect from 67.57649999999995, 12.83 to 67.57799999999995, 12.17 fc rgb \"#000000\"",
- "set object 126 rect from 67.59199999999996, 12.83 to 68.70599999999996, 12.17 fc rgb \"#000000\"",
- "set object 127 rect from 68.76649999999995, 12.83 to 69.10849999999995, 12.17 fc rgb \"#000000\"",
- "set object 128 rect from 69.49599999999995, 12.83 to 70.31749999999994, 12.17 fc rgb \"#000000\"",
- "set object 129 rect from 70.33949999999994, 12.83 to 70.34449999999994, 12.17 fc rgb \"#000000\"",
- "set object 130 rect from 70.35799999999995, 12.83 to 70.40899999999993, 12.17 fc rgb \"#000000\"",
- "set object 131 rect from 70.58649999999994, 12.83 to 72.22199999999995, 12.17 fc rgb \"#000000\"",
- "set object 132 rect from 72.28049999999995, 12.83 to 74.40699999999995, 12.17 fc rgb \"#000000\"",
- "set object 133 rect from 74.63849999999994, 12.83 to 75.04799999999994, 12.17 fc rgb \"#000000\"",
- "set object 134 rect from 75.20099999999994, 12.83 to 75.41849999999994, 12.17 fc rgb \"#000000\"",
- "set object 135 rect from 75.46799999999995, 12.83 to 78.16449999999993, 12.17 fc rgb \"#000000\"",
- "set object 136 rect from 78.23649999999994, 12.83 to 80.90399999999994, 12.17 fc rgb \"#000000\"",
- "set object 137 rect from 80.95049999999993, 12.83 to 83.58349999999993, 12.17 fc rgb \"#000000\"",
- "set object 138 rect from 83.63999999999993, 12.83 to 84.09549999999993, 12.17 fc rgb \"#000000\"",
- "set object 139 rect from 84.84549999999993, 12.83 to 84.91749999999993, 12.17 fc rgb \"#000000\"",
- "set object 140 rect from 85.13799999999992, 12.83 to 85.37849999999993, 12.17 fc rgb \"#000000\"",
- "set object 141 rect from 86.05649999999993, 12.83 to 86.75549999999993, 12.17 fc rgb \"#000000\"",
- "set object 142 rect from 87.27399999999992, 12.83 to 87.27549999999992, 12.17 fc rgb \"#000000\"",
- "set object 143 rect from 87.36899999999991, 12.83 to 88.75199999999992, 12.17 fc rgb \"#000000\"",
- "set object 144 rect from 88.82299999999992, 12.83 to 88.83949999999992, 12.17 fc rgb \"#000000\"",
- "set object 145 rect from 89.21399999999991, 12.83 to 91.90999999999991, 12.17 fc rgb \"#000000\"",
- "set object 146 rect from 91.96649999999993, 12.83 to 94.55599999999993, 12.17 fc rgb \"#000000\"",
- "set object 147 rect from 94.6054999999999, 12.83 to 97.20749999999991, 12.17 fc rgb \"#000000\"",
- "set object 148 rect from 97.26099999999992, 12.83 to 99.86649999999992, 12.17 fc rgb \"#000000\"",
- "set object 149 rect from 99.92199999999991, 12.83 to 102.56049999999992, 12.17 fc rgb \"#000000\"",
- "set object 150 rect from 102.61199999999991, 12.83 to 102.74149999999992, 12.17 fc rgb \"#000000\"",
- "set object 151 rect from 102.99499999999992, 12.83 to 104.13299999999992, 12.17 fc rgb \"#000000\"",
- "set object 152 rect from 104.4429999999999, 12.83 to 105.88099999999991, 12.17 fc rgb \"#000000\"",
- "set object 153 rect from 105.93349999999991, 12.83 to 107.51699999999991, 12.17 fc rgb \"#000000\"",
- "set object 154 rect from 108.09449999999991, 12.83 to 109.2659999999999, 12.17 fc rgb \"#000000\"",
- "set object 155 rect from 109.41799999999989, 12.83 to 110.0909999999999, 12.17 fc rgb \"#000000\"",
- "set object 156 rect from 110.4839999999999, 12.83 to 112.6029999999999, 12.17 fc rgb \"#000000\"",
- "set object 157 rect from 112.6564999999999, 12.83 to 115.36399999999989, 12.17 fc rgb \"#000000\"",
- "set object 158 rect from 115.4124999999999, 12.83 to 118.1434999999999, 12.17 fc rgb \"#000000\"",
- "set object 159 rect from 118.19199999999991, 12.83 to 120.9194999999999, 12.17 fc rgb \"#000000\"",
- "set object 160 rect from 121.0314999999999, 12.83 to 123.77499999999989, 12.17 fc rgb \"#000000\"",
- "set object 161 rect from 123.8254999999999, 12.83 to 126.55149999999989, 12.17 fc rgb \"#000000\"",
- "set object 162 rect from 126.59899999999989, 12.83 to 129.3344999999999, 12.17 fc rgb \"#000000\"",
- "set object 163 rect from 129.48849999999987, 12.83 to 130.5424999999999, 12.17 fc rgb \"#000000\"",
- "set object 164 rect from 131.1209999999999, 12.83 to 132.8659999999999, 12.17 fc rgb \"#000000\"",
- "set object 165 rect from 132.92249999999987, 12.83 to 133.04349999999988, 12.17 fc rgb \"#000000\"",
- "set object 166 rect from 133.4079999999999, 12.83 to 136.14449999999988, 12.17 fc rgb \"#000000\"",
- "set object 167 rect from 136.19799999999987, 12.83 to 138.9289999999999, 12.17 fc rgb \"#000000\"",
- "set object 168 rect from 138.98049999999986, 12.83 to 140.86699999999988, 12.17 fc rgb \"#000000\"",
- "set object 169 rect from 140.8814999999999, 12.83 to 140.88349999999988, 12.17 fc rgb \"#000000\"",
- "set object 170 rect from 140.89599999999987, 12.83 to 140.9319999999999, 12.17 fc rgb \"#000000\"",
- "set object 171 rect from 140.9574999999999, 12.83 to 140.96249999999986, 12.17 fc rgb \"#000000\"",
- "set object 172 rect from 140.9779999999999, 12.83 to 141.0599999999999, 12.17 fc rgb \"#000000\"",
- "set object 173 rect from 141.0984999999999, 12.83 to 141.09999999999988, 12.17 fc rgb \"#000000\"",
- "set object 174 rect from 2.4490000000000003, 13.83 to 2.4545, 13.17 fc rgb \"#3399FF\"",
- "set object 175 rect from 3.7920000000000003, 13.83 to 3.8075, 13.17 fc rgb \"#3399FF\"",
- "set object 176 rect from 6.276000000000001, 13.83 to 6.2805, 13.17 fc rgb \"#3399FF\"",
- "set object 177 rect from 7.373, 13.83 to 7.3865, 13.17 fc rgb \"#3399FF\"",
- "set object 178 rect from 9.299, 13.83 to 9.302499999999998, 13.17 fc rgb \"#3399FF\"",
- "set object 179 rect from 10.405000000000001, 13.83 to 10.4235, 13.17 fc rgb \"#3399FF\"",
- "set object 180 rect from 12.882, 13.83 to 12.8865, 13.17 fc rgb \"#3399FF\"",
- "set object 181 rect from 13.897, 13.83 to 13.910499999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 182 rect from 55.80349999999998, 13.83 to 55.80399999999998, 13.17 fc rgb \"#3399FF\"",
- "set object 183 rect from 56.19399999999998, 13.83 to 56.19849999999998, 13.17 fc rgb \"#3399FF\"",
- "set object 184 rect from 62.16599999999996, 13.83 to 62.166499999999964, 13.17 fc rgb \"#3399FF\"",
- "set object 185 rect from 62.54499999999995, 13.83 to 62.54849999999996, 13.17 fc rgb \"#3399FF\"",
- "set object 186 rect from 65.56999999999996, 13.83 to 65.57049999999997, 13.17 fc rgb \"#3399FF\"",
- "set object 187 rect from 65.61499999999995, 13.83 to 65.61649999999995, 13.17 fc rgb \"#3399FF\"",
- "set object 188 rect from 68.71249999999995, 13.83 to 68.71399999999994, 13.17 fc rgb \"#3399FF\"",
- "set object 189 rect from 68.76249999999995, 13.83 to 68.76599999999993, 13.17 fc rgb \"#3399FF\"",
- "set object 190 rect from 72.22849999999994, 13.83 to 72.22899999999994, 13.17 fc rgb \"#3399FF\"",
- "set object 191 rect from 72.27749999999995, 13.83 to 72.27999999999994, 13.17 fc rgb \"#3399FF\"",
- "set object 192 rect from 75.42299999999994, 13.83 to 75.42349999999995, 13.17 fc rgb \"#3399FF\"",
- "set object 193 rect from 75.46599999999995, 13.83 to 75.46749999999994, 13.17 fc rgb \"#3399FF\"",
- "set object 194 rect from 78.17099999999994, 13.83 to 78.17149999999994, 13.17 fc rgb \"#3399FF\"",
- "set object 195 rect from 78.23049999999994, 13.83 to 78.23599999999993, 13.17 fc rgb \"#3399FF\"",
- "set object 196 rect from 80.91049999999994, 13.83 to 80.91099999999994, 13.17 fc rgb \"#3399FF\"",
- "set object 197 rect from 80.94849999999994, 13.83 to 80.94999999999993, 13.17 fc rgb \"#3399FF\"",
- "set object 198 rect from 83.58999999999995, 13.83 to 83.59049999999995, 13.17 fc rgb \"#3399FF\"",
- "set object 199 rect from 83.63699999999994, 13.83 to 83.63949999999993, 13.17 fc rgb \"#3399FF\"",
- "set object 200 rect from 88.75849999999993, 13.83 to 88.75899999999993, 13.17 fc rgb \"#3399FF\"",
- "set object 201 rect from 88.81899999999993, 13.83 to 88.82249999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 202 rect from 91.91649999999991, 13.83 to 91.91699999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 203 rect from 91.96349999999993, 13.83 to 91.96599999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 204 rect from 94.56249999999991, 13.83 to 94.56299999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 205 rect from 94.60349999999991, 13.83 to 94.6049999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 206 rect from 97.21399999999991, 13.83 to 97.21449999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 207 rect from 97.25899999999993, 13.83 to 97.26049999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 208 rect from 99.87599999999992, 13.83 to 99.87649999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 209 rect from 99.91899999999993, 13.83 to 99.92149999999991, 13.17 fc rgb \"#3399FF\"",
- "set object 210 rect from 102.56599999999992, 13.83 to 102.56649999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 211 rect from 102.6099999999999, 13.83 to 102.61149999999991, 13.17 fc rgb \"#3399FF\"",
- "set object 212 rect from 105.88749999999992, 13.83 to 105.88799999999992, 13.17 fc rgb \"#3399FF\"",
- "set object 213 rect from 105.93149999999991, 13.83 to 105.93299999999991, 13.17 fc rgb \"#3399FF\"",
- "set object 214 rect from 109.27249999999991, 13.83 to 109.27299999999991, 13.17 fc rgb \"#3399FF\"",
- "set object 215 rect from 109.38599999999991, 13.83 to 109.4024999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 216 rect from 112.6104999999999, 13.83 to 112.6109999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 217 rect from 112.6544999999999, 13.83 to 112.65599999999989, 13.17 fc rgb \"#3399FF\"",
- "set object 218 rect from 115.37049999999991, 13.83 to 115.37099999999991, 13.17 fc rgb \"#3399FF\"",
- "set object 219 rect from 115.4104999999999, 13.83 to 115.41199999999989, 13.17 fc rgb \"#3399FF\"",
- "set object 220 rect from 118.14999999999989, 13.83 to 118.1504999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 221 rect from 118.18999999999991, 13.83 to 118.1914999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 222 rect from 120.9319999999999, 13.83 to 120.9324999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 223 rect from 121.0104999999999, 13.83 to 121.0259999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 224 rect from 123.78149999999991, 13.83 to 123.78199999999991, 13.17 fc rgb \"#3399FF\"",
- "set object 225 rect from 123.8234999999999, 13.83 to 123.8249999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 226 rect from 126.5569999999999, 13.83 to 126.5574999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 227 rect from 126.5969999999999, 13.83 to 126.59849999999989, 13.17 fc rgb \"#3399FF\"",
- "set object 228 rect from 129.4124999999999, 13.83 to 129.4249999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 229 rect from 129.4864999999999, 13.83 to 129.4879999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 230 rect from 132.87149999999988, 13.83 to 132.87199999999987, 13.17 fc rgb \"#3399FF\"",
- "set object 231 rect from 132.9204999999999, 13.83 to 132.92199999999988, 13.17 fc rgb \"#3399FF\"",
- "set object 232 rect from 136.15099999999987, 13.83 to 136.15149999999986, 13.17 fc rgb \"#3399FF\"",
- "set object 233 rect from 136.19599999999988, 13.83 to 136.19749999999988, 13.17 fc rgb \"#3399FF\"",
- "set object 234 rect from 138.93549999999988, 13.83 to 138.93599999999986, 13.17 fc rgb \"#3399FF\"",
- "set object 235 rect from 138.97849999999988, 13.83 to 138.97999999999988, 13.17 fc rgb \"#3399FF\"",
- "set object 236 rect from 141.0599999999999, 13.83 to 141.0984999999999, 13.17 fc rgb \"#3399FF\"",
- "set object 237 rect from 16.9945, 14.83 to 17.7705, 14.17 fc rgb \"#CC0000\"",
- "set object 238 rect from 18.046, 14.83 to 18.1735, 14.17 fc rgb \"#CC0000\"",
- "set object 239 rect from 19.0915, 14.83 to 19.152, 14.17 fc rgb \"#CC0000\"",
- "set object 240 rect from 20.624499999999998, 14.83 to 21.063999999999997, 14.17 fc rgb \"#CC0000\"",
- "set object 241 rect from 21.148500000000002, 14.83 to 21.175, 14.17 fc rgb \"#CC0000\"",
- "set object 242 rect from 21.2875, 14.83 to 21.363, 14.17 fc rgb \"#CC0000\"",
- "set object 243 rect from 21.505, 14.83 to 21.525499999999997, 14.17 fc rgb \"#CC0000\"",
- "set object 244 rect from 21.604000000000003, 14.83 to 21.619500000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 245 rect from 21.747, 14.83 to 21.8475, 14.17 fc rgb \"#CC0000\"",
- "set object 246 rect from 22.400499999999997, 14.83 to 22.416999999999998, 14.17 fc rgb \"#CC0000\"",
- "set object 247 rect from 22.4715, 14.83 to 22.486, 14.17 fc rgb \"#CC0000\"",
- "set object 248 rect from 22.517500000000002, 14.83 to 22.528, 14.17 fc rgb \"#CC0000\"",
- "set object 249 rect from 22.5655, 14.83 to 22.570999999999998, 14.17 fc rgb \"#CC0000\"",
- "set object 250 rect from 23.1575, 14.83 to 23.189, 14.17 fc rgb \"#CC0000\"",
- "set object 251 rect from 23.376, 14.83 to 23.3945, 14.17 fc rgb \"#CC0000\"",
- "set object 252 rect from 23.518, 14.83 to 23.5775, 14.17 fc rgb \"#CC0000\"",
- "set object 253 rect from 23.617, 14.83 to 23.8365, 14.17 fc rgb \"#CC0000\"",
- "set object 254 rect from 23.912000000000003, 14.83 to 23.9205, 14.17 fc rgb \"#CC0000\"",
- "set object 255 rect from 24.4405, 14.83 to 24.458, 14.17 fc rgb \"#CC0000\"",
- "set object 256 rect from 24.5085, 14.83 to 24.544000000000004, 14.17 fc rgb \"#CC0000\"",
- "set object 257 rect from 41.91250000000001, 14.83 to 42.05100000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 258 rect from 42.30000000000002, 14.83 to 42.31450000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 259 rect from 42.66150000000002, 14.83 to 42.70600000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 260 rect from 42.76550000000001, 14.83 to 42.795000000000016, 14.17 fc rgb \"#CC0000\"",
- "set object 261 rect from 42.812500000000014, 14.83 to 42.83300000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 262 rect from 42.85950000000001, 14.83 to 42.88200000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 263 rect from 43.622000000000014, 14.83 to 43.632500000000014, 14.17 fc rgb \"#CC0000\"",
- "set object 264 rect from 44.812500000000014, 14.83 to 44.82200000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 265 rect from 44.87550000000002, 14.83 to 44.917000000000016, 14.17 fc rgb \"#CC0000\"",
- "set object 266 rect from 45.01150000000001, 14.83 to 45.02900000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 267 rect from 45.068500000000014, 14.83 to 45.08700000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 268 rect from 45.110500000000016, 14.83 to 45.13500000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 269 rect from 45.16350000000002, 14.83 to 45.17200000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 270 rect from 45.34000000000002, 14.83 to 45.361500000000014, 14.17 fc rgb \"#CC0000\"",
- "set object 271 rect from 45.405000000000015, 14.83 to 45.41750000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 272 rect from 45.44250000000002, 14.83 to 45.44850000000002, 14.17 fc rgb \"#CC0000\"",
- "set object 273 rect from 45.466000000000015, 14.83 to 45.470500000000015, 14.17 fc rgb \"#CC0000\"",
- "set object 274 rect from 45.484000000000016, 14.83 to 45.489500000000014, 14.17 fc rgb \"#CC0000\"",
- "set object 275 rect from 45.56900000000001, 14.83 to 45.626500000000014, 14.17 fc rgb \"#CC0000\"",
- "set object 276 rect from 45.71200000000001, 14.83 to 45.76150000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 277 rect from 45.82000000000001, 14.83 to 45.84850000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 278 rect from 45.93000000000001, 14.83 to 45.97850000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 279 rect from 46.08650000000001, 14.83 to 46.13100000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 280 rect from 46.291500000000006, 14.83 to 46.37200000000001, 14.17 fc rgb \"#CC0000\"",
- "set object 281 rect from 46.59550000000001, 14.83 to 46.621, 14.17 fc rgb \"#CC0000\"",
- "set object 282 rect from 46.694500000000005, 14.83 to 46.74, 14.17 fc rgb \"#CC0000\"",
- "set object 283 rect from 46.8975, 14.83 to 46.9925, 14.17 fc rgb \"#CC0000\"",
- "set object 284 rect from 47.050000000000004, 14.83 to 47.057500000000005, 14.17 fc rgb \"#CC0000\"",
- "set object 285 rect from 47.141, 14.83 to 47.3935, 14.17 fc rgb \"#CC0000\"",
- "set object 286 rect from 47.472, 14.83 to 47.5235, 14.17 fc rgb \"#CC0000\"",
- "set object 287 rect from 49.469, 14.83 to 49.4955, 14.17 fc rgb \"#CC0000\"",
- "set object 288 rect from 49.732, 14.83 to 49.780499999999996, 14.17 fc rgb \"#CC0000\"",
- "set object 289 rect from 49.814, 14.83 to 49.82449999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 290 rect from 49.851, 14.83 to 49.8685, 14.17 fc rgb \"#CC0000\"",
- "set object 291 rect from 49.99849999999999, 14.83 to 50.007, 14.17 fc rgb \"#CC0000\"",
- "set object 292 rect from 50.147499999999994, 14.83 to 50.20799999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 293 rect from 50.314499999999995, 14.83 to 50.32899999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 294 rect from 50.40249999999999, 14.83 to 50.43099999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 295 rect from 50.52949999999999, 14.83 to 50.53499999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 296 rect from 50.62949999999999, 14.83 to 51.02349999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 297 rect from 51.292999999999985, 14.83 to 51.30249999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 298 rect from 51.57499999999999, 14.83 to 51.78349999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 299 rect from 51.89349999999999, 14.83 to 51.91599999999998, 14.17 fc rgb \"#CC0000\"",
- "set object 300 rect from 52.13749999999999, 14.83 to 52.15399999999998, 14.17 fc rgb \"#CC0000\"",
- "set object 301 rect from 52.30249999999998, 14.83 to 52.31499999999998, 14.17 fc rgb \"#CC0000\"",
- "set object 302 rect from 52.331499999999984, 14.83 to 52.338999999999984, 14.17 fc rgb \"#CC0000\"",
- "set object 303 rect from 52.40949999999998, 14.83 to 52.448999999999984, 14.17 fc rgb \"#CC0000\"",
- "set object 304 rect from 70.34449999999994, 14.83 to 70.35799999999995, 14.17 fc rgb \"#CC0000\"",
- "set object 305 rect from 140.88349999999988, 14.83 to 140.89599999999987, 14.17 fc rgb \"#CC0000\"",
- "set object 306 rect from 140.96249999999986, 14.83 to 140.9779999999999, 14.17 fc rgb \"#CC0000\"",
- "set object 307 rect from 141.0404999999999, 14.83 to 141.04699999999988, 14.17 fc rgb \"#CC0000\"",
- "set object 308 rect from 25.285, 15.83 to 25.4055, 15.17 fc rgb \"#CC0044\"",
- "set object 309 rect from 25.428000000000004, 15.83 to 25.507500000000004, 15.17 fc rgb \"#CC0044\"",
- "set object 310 rect from 25.526500000000002, 15.83 to 25.591500000000003, 15.17 fc rgb \"#CC0044\"",
- "set object 311 rect from 54.55999999999998, 15.83 to 54.566499999999984, 15.17 fc rgb \"#CC0044\"",
- "set object 312 rect from 54.64299999999998, 15.83 to 54.951999999999984, 15.17 fc rgb \"#CC0044\"",
- "set object 313 rect from 55.48599999999998, 15.83 to 55.49149999999998, 15.17 fc rgb \"#CC0044\"",
- "set object 314 rect from 55.53099999999998, 15.83 to 55.66249999999998, 15.17 fc rgb \"#CC0044\"",
- "set object 315 rect from 56.25149999999998, 15.83 to 56.52499999999998, 15.17 fc rgb \"#CC0044\"",
- "set object 316 rect from 56.55699999999998, 15.83 to 56.64049999999998, 15.17 fc rgb \"#CC0044\"",
- "set object 317 rect from 56.64999999999998, 15.83 to 56.69449999999998, 15.17 fc rgb \"#CC0044\"",
- "set object 318 rect from 56.746499999999976, 15.83 to 56.750999999999976, 15.17 fc rgb \"#CC0044\"",
- "set object 319 rect from 56.76449999999998, 15.83 to 56.845999999999975, 15.17 fc rgb \"#CC0044\"",
- "set object 320 rect from 56.85849999999998, 15.83 to 56.97649999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 321 rect from 57.03599999999997, 15.83 to 57.039499999999975, 15.17 fc rgb \"#CC0044\"",
- "set object 322 rect from 57.076499999999974, 15.83 to 57.205999999999975, 15.17 fc rgb \"#CC0044\"",
- "set object 323 rect from 57.27249999999997, 15.83 to 57.33299999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 324 rect from 57.565999999999974, 15.83 to 57.64849999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 325 rect from 57.878499999999974, 15.83 to 57.934999999999974, 15.17 fc rgb \"#CC0044\"",
- "set object 326 rect from 57.97299999999997, 15.83 to 57.97749999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 327 rect from 57.99099999999997, 15.83 to 58.04499999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 328 rect from 58.055499999999974, 15.83 to 58.07699999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 329 rect from 58.09149999999997, 15.83 to 58.12149999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 330 rect from 58.14299999999997, 15.83 to 58.21549999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 331 rect from 58.23599999999997, 15.83 to 58.316999999999965, 15.17 fc rgb \"#CC0044\"",
- "set object 332 rect from 58.409499999999966, 15.83 to 58.40999999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 333 rect from 58.431499999999964, 15.83 to 58.51699999999997, 15.17 fc rgb \"#CC0044\"",
- "set object 334 rect from 58.53049999999997, 15.83 to 58.590999999999966, 15.17 fc rgb \"#CC0044\"",
- "set object 335 rect from 58.60049999999997, 15.83 to 58.65749999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 336 rect from 58.92499999999996, 15.83 to 59.042999999999964, 15.17 fc rgb \"#CC0044\"",
- "set object 337 rect from 59.641499999999965, 15.83 to 59.65599999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 338 rect from 59.669499999999964, 15.83 to 59.69699999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 339 rect from 59.89099999999996, 15.83 to 59.93649999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 340 rect from 60.04699999999996, 15.83 to 60.05149999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 341 rect from 60.060999999999964, 15.83 to 60.08349999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 342 rect from 60.17149999999996, 15.83 to 60.176999999999964, 15.17 fc rgb \"#CC0044\"",
- "set object 343 rect from 60.19499999999996, 15.83 to 60.26949999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 344 rect from 60.27999999999996, 15.83 to 60.31149999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 345 rect from 60.34699999999996, 15.83 to 60.471499999999956, 15.17 fc rgb \"#CC0044\"",
- "set object 346 rect from 60.48399999999996, 15.83 to 60.508499999999955, 15.17 fc rgb \"#CC0044\"",
- "set object 347 rect from 60.51999999999996, 15.83 to 60.65699999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 348 rect from 60.91649999999996, 15.83 to 60.92099999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 349 rect from 60.98249999999996, 15.83 to 61.253999999999955, 15.17 fc rgb \"#CC0044\"",
- "set object 350 rect from 61.31249999999996, 15.83 to 61.464999999999954, 15.17 fc rgb \"#CC0044\"",
- "set object 351 rect from 62.62699999999996, 15.83 to 63.024999999999956, 15.17 fc rgb \"#CC0044\"",
- "set object 352 rect from 63.14749999999995, 15.83 to 63.15199999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 353 rect from 63.228499999999954, 15.83 to 63.41299999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 354 rect from 64.40899999999996, 15.83 to 64.61749999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 355 rect from 67.34249999999994, 15.83 to 67.34999999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 356 rect from 67.36349999999995, 15.83 to 67.45699999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 357 rect from 67.46599999999995, 15.83 to 67.48749999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 358 rect from 67.53599999999994, 15.83 to 67.59199999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 359 rect from 69.10849999999995, 15.83 to 69.11299999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 360 rect from 69.12949999999995, 15.83 to 69.19199999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 361 rect from 69.22649999999994, 15.83 to 69.30799999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 362 rect from 69.31949999999995, 15.83 to 69.34699999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 363 rect from 69.35749999999994, 15.83 to 69.38399999999996, 15.17 fc rgb \"#CC0044\"",
- "set object 364 rect from 69.40549999999995, 15.83 to 69.45099999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 365 rect from 69.46349999999994, 15.83 to 69.49599999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 366 rect from 70.40899999999993, 15.83 to 70.58649999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 367 rect from 74.40699999999995, 15.83 to 74.41449999999995, 15.17 fc rgb \"#CC0044\"",
- "set object 368 rect from 74.43899999999994, 15.83 to 74.52049999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 369 rect from 74.54499999999993, 15.83 to 74.59549999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 370 rect from 74.60899999999995, 15.83 to 74.63849999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 371 rect from 75.04799999999994, 15.83 to 75.20099999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 372 rect from 84.09549999999993, 15.83 to 84.09999999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 373 rect from 84.15349999999994, 15.83 to 84.26099999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 374 rect from 84.27549999999994, 15.83 to 84.34199999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 375 rect from 84.35349999999993, 15.83 to 84.37299999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 376 rect from 84.40149999999993, 15.83 to 84.43999999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 377 rect from 84.46149999999993, 15.83 to 84.53049999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 378 rect from 84.60099999999994, 15.83 to 84.68049999999992, 15.17 fc rgb \"#CC0044\"",
- "set object 379 rect from 84.69199999999992, 15.83 to 84.71649999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 380 rect from 84.72799999999992, 15.83 to 84.84549999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 381 rect from 84.91749999999993, 15.83 to 84.92199999999994, 15.17 fc rgb \"#CC0044\"",
- "set object 382 rect from 84.93849999999993, 15.83 to 84.99799999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 383 rect from 85.01049999999992, 15.83 to 85.06199999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 384 rect from 85.07249999999993, 15.83 to 85.13799999999992, 15.17 fc rgb \"#CC0044\"",
- "set object 385 rect from 85.37849999999993, 15.83 to 85.38399999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 386 rect from 85.43999999999994, 15.83 to 85.59949999999992, 15.17 fc rgb \"#CC0044\"",
- "set object 387 rect from 85.61599999999993, 15.83 to 85.63749999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 388 rect from 85.65899999999993, 15.83 to 85.69649999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 389 rect from 85.70599999999993, 15.83 to 85.73249999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 390 rect from 85.76899999999992, 15.83 to 85.86549999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 391 rect from 85.87599999999992, 15.83 to 85.91149999999992, 15.17 fc rgb \"#CC0044\"",
- "set object 392 rect from 85.92499999999993, 15.83 to 86.05649999999993, 15.17 fc rgb \"#CC0044\"",
- "set object 393 rect from 86.75549999999993, 15.83 to 87.36899999999991, 15.17 fc rgb \"#CC0044\"",
- "set object 394 rect from 88.83949999999992, 15.83 to 89.21399999999991, 15.17 fc rgb \"#CC0044\"",
- "set object 395 rect from 102.74149999999992, 15.83 to 102.74599999999992, 15.17 fc rgb \"#CC0044\"",
- "set object 396 rect from 102.80749999999992, 15.83 to 102.99499999999992, 15.17 fc rgb \"#CC0044\"",
- "set object 397 rect from 104.13299999999992, 15.83 to 104.4429999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 398 rect from 107.51699999999991, 15.83 to 107.5244999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 399 rect from 107.57199999999992, 15.83 to 107.62449999999991, 15.17 fc rgb \"#CC0044\"",
- "set object 400 rect from 107.6389999999999, 15.83 to 107.69849999999991, 15.17 fc rgb \"#CC0044\"",
- "set object 401 rect from 107.70999999999992, 15.83 to 107.7294999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 402 rect from 107.7469999999999, 15.83 to 107.7834999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 403 rect from 107.79299999999992, 15.83 to 107.82049999999991, 15.17 fc rgb \"#CC0044\"",
- "set object 404 rect from 107.8529999999999, 15.83 to 107.9294999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 405 rect from 107.94099999999992, 15.83 to 107.9654999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 406 rect from 107.97599999999991, 15.83 to 108.09449999999991, 15.17 fc rgb \"#CC0044\"",
- "set object 407 rect from 110.0909999999999, 15.83 to 110.4839999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 408 rect from 130.5424999999999, 15.83 to 130.5489999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 409 rect from 130.5954999999999, 15.83 to 130.6469999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 410 rect from 130.6614999999999, 15.83 to 130.68999999999988, 15.17 fc rgb \"#CC0044\"",
- "set object 411 rect from 130.6994999999999, 15.83 to 130.7219999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 412 rect from 130.7324999999999, 15.83 to 130.7519999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 413 rect from 130.76949999999988, 15.83 to 130.8059999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 414 rect from 130.8154999999999, 15.83 to 130.84299999999988, 15.17 fc rgb \"#CC0044\"",
- "set object 415 rect from 130.87549999999987, 15.83 to 130.95199999999988, 15.17 fc rgb \"#CC0044\"",
- "set object 416 rect from 130.9644999999999, 15.83 to 130.99099999999987, 15.17 fc rgb \"#CC0044\"",
- "set object 417 rect from 131.00249999999988, 15.83 to 131.1209999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 418 rect from 133.04349999999988, 15.83 to 133.4079999999999, 15.17 fc rgb \"#CC0044\"",
- "set object 419 rect from 54.97249999999998, 16.83 to 56.20849999999998, 16.17 fc rgb \"#CC4499\"",
- "set object 420 rect from 56.238999999999976, 16.83 to 56.53849999999998, 16.17 fc rgb \"#CC4499\"",
- "set object 421 rect from 56.71599999999998, 16.83 to 56.830999999999975, 16.17 fc rgb \"#CC4499\"",
- "set object 422 rect from 56.84349999999998, 16.83 to 57.062999999999974, 16.17 fc rgb \"#CC4499\"",
- "set object 423 rect from 57.228499999999976, 16.83 to 57.545499999999976, 16.17 fc rgb \"#CC4499\"",
- "set object 424 rect from 57.957499999999975, 16.83 to 58.00149999999997, 16.17 fc rgb \"#CC4499\"",
- "set object 425 rect from 58.09499999999997, 16.83 to 58.30249999999997, 16.17 fc rgb \"#CC4499\"",
- "set object 426 rect from 58.603999999999964, 16.83 to 58.964499999999965, 16.17 fc rgb \"#CC4499\"",
- "set object 427 rect from 59.773999999999965, 16.83 to 59.88149999999996, 16.17 fc rgb \"#CC4499\"",
- "set object 428 rect from 60.106999999999964, 16.83 to 60.18549999999996, 16.17 fc rgb \"#CC4499\"",
- "set object 429 rect from 60.56649999999996, 16.83 to 62.55849999999995, 16.17 fc rgb \"#CC4499\"",
- "set object 430 rect from 63.43549999999995, 16.83 to 64.39649999999995, 16.17 fc rgb \"#CC4499\"",
- "set object 431 rect from 67.45849999999994, 16.83 to 67.57949999999995, 16.17 fc rgb \"#CC4499\"",
- "set object 432 rect from 69.52049999999994, 16.83 to 70.32799999999995, 16.17 fc rgb \"#CC4499\"",
- "set object 433 rect from 74.66299999999993, 16.83 to 75.03649999999993, 16.17 fc rgb \"#CC4499\"",
- "set object 434 rect from 84.86699999999993, 16.83 to 88.80849999999992, 16.17 fc rgb \"#CC4499\"",
- "set object 435 rect from 103.02549999999991, 16.83 to 104.04749999999991, 16.17 fc rgb \"#CC4499\"",
- "set object 436 rect from 108.1159999999999, 16.83 to 110.07649999999991, 16.17 fc rgb \"#CC4499\"",
- "set object 437 rect from 131.1424999999999, 16.83 to 133.02899999999988, 16.17 fc rgb \"#CC4499\"",
- "set object 438 rect from 141.13349999999986, 16.83 to 141.1669999999999, 16.17 fc rgb \"#CC4499\"",
- "set object 439 rect from 22.2675, 18.83 to 22.3815, 18.17 fc rgb \"#00CC00\"",
- "set object 440 rect from 22.665, 18.83 to 23.1135, 18.17 fc rgb \"#00CC00\"",
- "set object 441 rect from 27.951000000000004, 18.83 to 27.972500000000004, 18.17 fc rgb \"#00CC00\"",
- "set object 442 rect from 27.993000000000002, 18.83 to 28.013500000000004, 18.17 fc rgb \"#00CC00\"",
- "set object 443 rect from 28.043000000000003, 18.83 to 28.063500000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 444 rect from 28.085000000000004, 18.83 to 28.087500000000002, 18.17 fc rgb \"#00CC00\"",
- "set object 445 rect from 28.115000000000002, 18.83 to 28.139500000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 446 rect from 28.154000000000007, 18.83 to 28.260000000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 447 rect from 28.309500000000003, 18.83 to 28.374000000000006, 18.17 fc rgb \"#00CC00\"",
- "set object 448 rect from 28.383500000000005, 18.83 to 28.385000000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 449 rect from 28.396500000000003, 18.83 to 28.445000000000007, 18.17 fc rgb \"#00CC00\"",
- "set object 450 rect from 28.459500000000006, 18.83 to 28.463000000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 451 rect from 28.489500000000007, 18.83 to 28.499000000000006, 18.17 fc rgb \"#00CC00\"",
- "set object 452 rect from 28.512500000000006, 18.83 to 28.516000000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 453 rect from 28.529500000000006, 18.83 to 28.533000000000005, 18.17 fc rgb \"#00CC00\"",
- "set object 454 rect from 28.554500000000004, 18.83 to 28.557000000000006, 18.17 fc rgb \"#00CC00\"",
- "set object 455 rect from 28.573500000000006, 18.83 to 28.579000000000008, 18.17 fc rgb \"#00CC00\"",
- "set object 456 rect from 28.59950000000001, 18.83 to 28.602000000000007, 18.17 fc rgb \"#00CC00\"",
- "set object 457 rect from 28.623500000000007, 18.83 to 28.625000000000007, 18.17 fc rgb \"#00CC00\"",
- "set object 458 rect from 28.637500000000006, 18.83 to 28.647000000000006, 18.17 fc rgb \"#00CC00\"",
- "set object 459 rect from 28.657500000000006, 18.83 to 28.669000000000008, 18.17 fc rgb \"#00CC00\"",
- "set object 460 rect from 28.682500000000005, 18.83 to 28.686000000000007, 18.17 fc rgb \"#00CC00\"",
- "set object 461 rect from 28.695500000000006, 18.83 to 28.701000000000008, 18.17 fc rgb \"#00CC00\"",
- "set object 462 rect from 28.72450000000001, 18.83 to 28.811000000000007, 18.17 fc rgb \"#00CC00\"",
- "set object 463 rect from 28.83250000000001, 18.83 to 28.907500000000006, 18.17 fc rgb \"#00CC00\"",
- "set object 464 rect from 28.97100000000001, 18.83 to 28.97450000000001, 18.17 fc rgb \"#00CC00\"",
- "set object 465 rect from 28.99600000000001, 18.83 to 28.99850000000001, 18.17 fc rgb \"#00CC00\"",
- "set object 466 rect from 29.01200000000001, 18.83 to 29.01350000000001, 18.17 fc rgb \"#00CC00\"",
- "set object 467 rect from 29.02600000000001, 18.83 to 29.056500000000007, 18.17 fc rgb \"#00CC00\"",
- "set object 468 rect from 29.06900000000001, 18.83 to 29.159500000000012, 18.17 fc rgb \"#00CC00\"",
- "set object 469 rect from 29.17100000000001, 18.83 to 29.18450000000001, 18.17 fc rgb \"#00CC00\"",
- "set object 470 rect from 29.19400000000001, 18.83 to 41.84850000000001, 18.17 fc rgb \"#00CC00\"",
- "set object 471 rect from 41.87900000000001, 18.83 to 41.88650000000001, 18.17 fc rgb \"#00CC00\"",
- "set object 472 rect from 27.972500000000004, 19.83 to 28.053000000000004, 19.17 fc rgb \"#44CC00\"",
- "set object 473 rect from 28.063500000000005, 19.83 to 28.169000000000004, 19.17 fc rgb \"#44CC00\"",
- "set object 474 rect from 28.260000000000005, 19.83 to 28.489500000000007, 19.17 fc rgb \"#44CC00\"",
- "set object 475 rect from 28.499000000000006, 19.83 to 28.761500000000005, 19.17 fc rgb \"#44CC00\"",
- "set object 476 rect from 28.78900000000001, 19.83 to 28.847500000000007, 19.17 fc rgb \"#44CC00\"",
- "set object 477 rect from 28.907500000000006, 19.83 to 29.047000000000008, 19.17 fc rgb \"#44CC00\"",
- "set object 478 rect from 29.056500000000007, 19.83 to 29.111000000000008, 19.17 fc rgb \"#44CC00\"",
- "set object 479 rect from 29.12350000000001, 19.83 to 29.21900000000001, 19.17 fc rgb \"#44CC00\"",
- "set object 480 rect from 41.82650000000001, 19.83 to 41.83500000000001, 19.17 fc rgb \"#44CC00\"",
- "set object 481 rect from 41.84850000000001, 19.83 to 41.87900000000001, 19.17 fc rgb \"#44CC00\"",
- "set object 482 rect from 16.737, 20.83 to 16.9595, 20.17 fc rgb \"#00CC44\"",
- "set object 483 rect from 17.8715, 20.83 to 18.017000000000003, 20.17 fc rgb \"#00CC44\"",
- "set object 484 rect from 18.992, 20.83 to 19.0685, 20.17 fc rgb \"#00CC44\"",
- "set object 485 rect from 20.52, 20.83 to 20.5975, 20.17 fc rgb \"#00CC44\"",
- "set object 486 rect from 21.109, 20.83 to 21.1335, 20.17 fc rgb \"#00CC44\"",
- "set object 487 rect from 21.212, 20.83 to 21.2695, 20.17 fc rgb \"#00CC44\"",
- "set object 488 rect from 21.4595, 20.83 to 21.49, 20.17 fc rgb \"#00CC44\"",
- "set object 489 rect from 21.566499999999998, 20.83 to 21.588, 20.17 fc rgb \"#00CC44\"",
- "set object 490 rect from 21.6535, 20.83 to 21.727, 20.17 fc rgb \"#00CC44\"",
- "set object 491 rect from 22.445, 20.83 to 22.4625, 20.17 fc rgb \"#00CC44\"",
- "set object 492 rect from 22.502000000000002, 20.83 to 22.5165, 20.17 fc rgb \"#00CC44\"",
- "set object 493 rect from 22.553, 20.83 to 22.5645, 20.17 fc rgb \"#00CC44\"",
- "set object 494 rect from 23.233, 20.83 to 23.336000000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 495 rect from 23.4255, 20.83 to 23.506, 20.17 fc rgb \"#00CC44\"",
- "set object 496 rect from 23.5895, 20.83 to 23.613, 20.17 fc rgb \"#00CC44\"",
- "set object 497 rect from 23.870500000000003, 20.83 to 23.907, 20.17 fc rgb \"#00CC44\"",
- "set object 498 rect from 24.393, 20.83 to 24.430500000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 499 rect from 24.470000000000002, 20.83 to 24.504500000000004, 20.17 fc rgb \"#00CC44\"",
- "set object 500 rect from 25.267500000000002, 20.83 to 25.283, 20.17 fc rgb \"#00CC44\"",
- "set object 501 rect from 25.4195, 20.83 to 25.427, 20.17 fc rgb \"#00CC44\"",
- "set object 502 rect from 25.519500000000004, 20.83 to 25.526000000000003, 20.17 fc rgb \"#00CC44\"",
- "set object 503 rect from 42.28050000000001, 20.83 to 42.298000000000016, 20.17 fc rgb \"#00CC44\"",
- "set object 504 rect from 42.62700000000002, 20.83 to 42.656500000000015, 20.17 fc rgb \"#00CC44\"",
- "set object 505 rect from 42.747000000000014, 20.83 to 42.763500000000015, 20.17 fc rgb \"#00CC44\"",
- "set object 506 rect from 42.80300000000001, 20.83 to 42.81050000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 507 rect from 42.844000000000015, 20.83 to 42.858500000000014, 20.17 fc rgb \"#00CC44\"",
- "set object 508 rect from 43.60550000000001, 20.83 to 43.62000000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 509 rect from 44.796000000000014, 20.83 to 44.81150000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 510 rect from 44.84500000000001, 20.83 to 44.87150000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 511 rect from 44.996000000000016, 20.83 to 45.00850000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 512 rect from 45.04700000000001, 20.83 to 45.06450000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 513 rect from 45.09600000000001, 20.83 to 45.107500000000016, 20.17 fc rgb \"#00CC44\"",
- "set object 514 rect from 45.14400000000002, 20.83 to 45.16150000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 515 rect from 45.32050000000002, 20.83 to 45.33700000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 516 rect from 45.38750000000002, 20.83 to 45.402000000000015, 20.17 fc rgb \"#00CC44\"",
- "set object 517 rect from 45.43250000000002, 20.83 to 45.442000000000014, 20.17 fc rgb \"#00CC44\"",
- "set object 518 rect from 45.46050000000002, 20.83 to 45.46500000000002, 20.17 fc rgb \"#00CC44\"",
- "set object 519 rect from 45.47750000000001, 20.83 to 45.48300000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 520 rect from 45.49750000000001, 20.83 to 45.55900000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 521 rect from 45.66050000000001, 20.83 to 45.70300000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 522 rect from 45.79350000000001, 20.83 to 45.81700000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 523 rect from 45.86950000000001, 20.83 to 45.92300000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 524 rect from 45.99450000000001, 20.83 to 46.060500000000005, 20.17 fc rgb \"#00CC44\"",
- "set object 525 rect from 46.18500000000001, 20.83 to 46.28150000000001, 20.17 fc rgb \"#00CC44\"",
- "set object 526 rect from 46.550000000000004, 20.83 to 46.5915, 20.17 fc rgb \"#00CC44\"",
- "set object 527 rect from 46.65500000000001, 20.83 to 46.691500000000005, 20.17 fc rgb \"#00CC44\"",
- "set object 528 rect from 46.861000000000004, 20.83 to 46.8935, 20.17 fc rgb \"#00CC44\"",
- "set object 529 rect from 47.039500000000004, 20.83 to 47.049, 20.17 fc rgb \"#00CC44\"",
- "set object 530 rect from 47.0765, 20.83 to 47.135000000000005, 20.17 fc rgb \"#00CC44\"",
- "set object 531 rect from 47.4125, 20.83 to 47.465, 20.17 fc rgb \"#00CC44\"",
- "set object 532 rect from 49.454499999999996, 20.83 to 49.467, 20.17 fc rgb \"#00CC44\"",
- "set object 533 rect from 49.6855, 20.83 to 49.726, 20.17 fc rgb \"#00CC44\"",
- "set object 534 rect from 49.799499999999995, 20.83 to 49.812999999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 535 rect from 49.841499999999996, 20.83 to 49.849999999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 536 rect from 49.894499999999994, 20.83 to 49.9695, 20.17 fc rgb \"#00CC44\"",
- "set object 537 rect from 50.083999999999996, 20.83 to 50.14149999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 538 rect from 50.29299999999999, 20.83 to 50.31249999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 539 rect from 50.36699999999999, 20.83 to 50.39849999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 540 rect from 50.520999999999994, 20.83 to 50.528499999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 541 rect from 50.54899999999999, 20.83 to 50.62049999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 542 rect from 51.27549999999999, 20.83 to 51.29099999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 543 rect from 51.52249999999999, 20.83 to 51.56899999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 544 rect from 51.87299999999998, 20.83 to 51.89049999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 545 rect from 52.115999999999985, 20.83 to 52.13449999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 546 rect from 52.286999999999985, 20.83 to 52.300499999999985, 20.17 fc rgb \"#00CC44\"",
- "set object 547 rect from 52.326999999999984, 20.83 to 52.33049999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 548 rect from 52.362999999999985, 20.83 to 52.404499999999985, 20.17 fc rgb \"#00CC44\"",
- "set object 549 rect from 54.566499999999984, 20.83 to 54.64299999999998, 20.17 fc rgb \"#00CC44\"",
- "set object 550 rect from 55.49149999999998, 20.83 to 55.53099999999998, 20.17 fc rgb \"#00CC44\"",
- "set object 551 rect from 56.64049999999998, 20.83 to 56.64999999999998, 20.17 fc rgb \"#00CC44\"",
- "set object 552 rect from 56.750999999999976, 20.83 to 56.76449999999998, 20.17 fc rgb \"#00CC44\"",
- "set object 553 rect from 57.039499999999975, 20.83 to 57.076499999999974, 20.17 fc rgb \"#00CC44\"",
- "set object 554 rect from 57.885999999999974, 20.83 to 57.893499999999975, 20.17 fc rgb \"#00CC44\"",
- "set object 555 rect from 57.97749999999997, 20.83 to 57.99099999999997, 20.17 fc rgb \"#00CC44\"",
- "set object 556 rect from 58.04499999999997, 20.83 to 58.055499999999974, 20.17 fc rgb \"#00CC44\"",
- "set object 557 rect from 58.14549999999997, 20.83 to 58.15399999999997, 20.17 fc rgb \"#00CC44\"",
- "set object 558 rect from 58.17549999999997, 20.83 to 58.18399999999997, 20.17 fc rgb \"#00CC44\"",
- "set object 559 rect from 58.40999999999997, 20.83 to 58.431499999999964, 20.17 fc rgb \"#00CC44\"",
- "set object 560 rect from 58.51699999999997, 20.83 to 58.53049999999997, 20.17 fc rgb \"#00CC44\"",
- "set object 561 rect from 58.590999999999966, 20.83 to 58.60049999999997, 20.17 fc rgb \"#00CC44\"",
- "set object 562 rect from 59.65599999999996, 20.83 to 59.669499999999964, 20.17 fc rgb \"#00CC44\"",
- "set object 563 rect from 60.05149999999996, 20.83 to 60.060999999999964, 20.17 fc rgb \"#00CC44\"",
- "set object 564 rect from 60.176999999999964, 20.83 to 60.19499999999996, 20.17 fc rgb \"#00CC44\"",
- "set object 565 rect from 60.26949999999996, 20.83 to 60.27999999999996, 20.17 fc rgb \"#00CC44\"",
- "set object 566 rect from 60.31149999999996, 20.83 to 60.34699999999996, 20.17 fc rgb \"#00CC44\"",
- "set object 567 rect from 60.471499999999956, 20.83 to 60.48399999999996, 20.17 fc rgb \"#00CC44\"",
- "set object 568 rect from 60.508499999999955, 20.83 to 60.51999999999996, 20.17 fc rgb \"#00CC44\"",
- "set object 569 rect from 60.92099999999996, 20.83 to 60.98249999999996, 20.17 fc rgb \"#00CC44\"",
- "set object 570 rect from 63.15199999999995, 20.83 to 63.228499999999954, 20.17 fc rgb \"#00CC44\"",
- "set object 571 rect from 67.34999999999994, 20.83 to 67.36349999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 572 rect from 67.40699999999995, 20.83 to 67.41249999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 573 rect from 67.45699999999994, 20.83 to 67.46599999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 574 rect from 69.11299999999994, 20.83 to 69.12949999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 575 rect from 69.19199999999995, 20.83 to 69.22649999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 576 rect from 69.30799999999994, 20.83 to 69.31949999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 577 rect from 69.34699999999995, 20.83 to 69.35749999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 578 rect from 69.38399999999996, 20.83 to 69.40549999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 579 rect from 69.45099999999994, 20.83 to 69.46349999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 580 rect from 70.31749999999994, 20.83 to 70.33949999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 581 rect from 74.41449999999995, 20.83 to 74.43899999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 582 rect from 74.52049999999994, 20.83 to 74.54499999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 583 rect from 74.59549999999994, 20.83 to 74.60899999999995, 20.17 fc rgb \"#00CC44\"",
- "set object 584 rect from 84.09999999999994, 20.83 to 84.15349999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 585 rect from 84.26099999999994, 20.83 to 84.27549999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 586 rect from 84.31099999999992, 20.83 to 84.31949999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 587 rect from 84.34199999999993, 20.83 to 84.35349999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 588 rect from 84.37299999999993, 20.83 to 84.40149999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 589 rect from 84.43999999999994, 20.83 to 84.46149999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 590 rect from 84.53049999999993, 20.83 to 84.60099999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 591 rect from 84.68049999999992, 20.83 to 84.69199999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 592 rect from 84.71649999999993, 20.83 to 84.72799999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 593 rect from 84.92199999999994, 20.83 to 84.93849999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 594 rect from 84.99799999999993, 20.83 to 85.01049999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 595 rect from 85.03599999999992, 20.83 to 85.04449999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 596 rect from 85.06199999999993, 20.83 to 85.07249999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 597 rect from 85.09499999999994, 20.83 to 85.10249999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 598 rect from 85.38399999999993, 20.83 to 85.43999999999994, 20.17 fc rgb \"#00CC44\"",
- "set object 599 rect from 85.59949999999992, 20.83 to 85.61599999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 600 rect from 85.63749999999993, 20.83 to 85.65899999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 601 rect from 85.69649999999993, 20.83 to 85.70599999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 602 rect from 85.73249999999993, 20.83 to 85.76899999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 603 rect from 85.86549999999993, 20.83 to 85.87599999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 604 rect from 85.91149999999992, 20.83 to 85.92499999999993, 20.17 fc rgb \"#00CC44\"",
- "set object 605 rect from 102.74599999999992, 20.83 to 102.80749999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 606 rect from 107.5244999999999, 20.83 to 107.57199999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 607 rect from 107.62449999999991, 20.83 to 107.6389999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 608 rect from 107.6674999999999, 20.83 to 107.6759999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 609 rect from 107.69849999999991, 20.83 to 107.70999999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 610 rect from 107.7294999999999, 20.83 to 107.7469999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 611 rect from 107.7834999999999, 20.83 to 107.79299999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 612 rect from 107.82049999999991, 20.83 to 107.8529999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 613 rect from 107.9294999999999, 20.83 to 107.94099999999992, 20.17 fc rgb \"#00CC44\"",
- "set object 614 rect from 107.9654999999999, 20.83 to 107.97599999999991, 20.17 fc rgb \"#00CC44\"",
- "set object 615 rect from 130.5489999999999, 20.83 to 130.5954999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 616 rect from 130.6469999999999, 20.83 to 130.6614999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 617 rect from 130.68999999999988, 20.83 to 130.6994999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 618 rect from 130.7219999999999, 20.83 to 130.7324999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 619 rect from 130.7519999999999, 20.83 to 130.76949999999988, 20.17 fc rgb \"#00CC44\"",
- "set object 620 rect from 130.8059999999999, 20.83 to 130.8154999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 621 rect from 130.84299999999988, 20.83 to 130.87549999999987, 20.17 fc rgb \"#00CC44\"",
- "set object 622 rect from 130.95199999999988, 20.83 to 130.9644999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 623 rect from 130.99099999999987, 20.83 to 131.00249999999988, 20.17 fc rgb \"#00CC44\"",
- "set object 624 rect from 140.86699999999988, 20.83 to 140.8814999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 625 rect from 140.9319999999999, 20.83 to 140.9574999999999, 20.17 fc rgb \"#00CC44\"",
- "set object 626 rect from 141.0299999999999, 20.83 to 141.03849999999989, 20.17 fc rgb \"#00CC44\"",
- "set object 627 rect from 55.79999999999998, 21.83 to 56.198999999999984, 21.17 fc rgb \"#0044CC\"",
- "set object 628 rect from 62.16149999999996, 21.83 to 62.548999999999964, 21.17 fc rgb \"#0044CC\"",
- "set object 629 rect from 65.56449999999995, 21.83 to 65.61699999999995, 21.17 fc rgb \"#0044CC\"",
- "set object 630 rect from 68.70599999999996, 21.83 to 68.76649999999995, 21.17 fc rgb \"#0044CC\"",
- "set object 631 rect from 72.22199999999995, 21.83 to 72.28049999999995, 21.17 fc rgb \"#0044CC\"",
- "set object 632 rect from 75.41849999999994, 21.83 to 75.46799999999995, 21.17 fc rgb \"#0044CC\"",
- "set object 633 rect from 78.16449999999993, 21.83 to 78.23649999999994, 21.17 fc rgb \"#0044CC\"",
- "set object 634 rect from 80.90399999999994, 21.83 to 80.95049999999993, 21.17 fc rgb \"#0044CC\"",
- "set object 635 rect from 83.58349999999993, 21.83 to 83.63999999999993, 21.17 fc rgb \"#0044CC\"",
- "set object 636 rect from 88.75199999999992, 21.83 to 88.82299999999992, 21.17 fc rgb \"#0044CC\"",
- "set object 637 rect from 91.90999999999991, 21.83 to 91.96649999999993, 21.17 fc rgb \"#0044CC\"",
- "set object 638 rect from 94.55599999999993, 21.83 to 94.6054999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 639 rect from 97.20749999999991, 21.83 to 97.26099999999992, 21.17 fc rgb \"#0044CC\"",
- "set object 640 rect from 99.86649999999992, 21.83 to 99.92199999999991, 21.17 fc rgb \"#0044CC\"",
- "set object 641 rect from 102.56049999999992, 21.83 to 102.61199999999991, 21.17 fc rgb \"#0044CC\"",
- "set object 642 rect from 105.88099999999991, 21.83 to 105.93349999999991, 21.17 fc rgb \"#0044CC\"",
- "set object 643 rect from 109.2659999999999, 21.83 to 109.38599999999991, 21.17 fc rgb \"#0044CC\"",
- "set object 644 rect from 109.4024999999999, 21.83 to 109.41799999999989, 21.17 fc rgb \"#0044CC\"",
- "set object 645 rect from 112.6029999999999, 21.83 to 112.6564999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 646 rect from 115.36399999999989, 21.83 to 115.4124999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 647 rect from 118.1434999999999, 21.83 to 118.19199999999991, 21.17 fc rgb \"#0044CC\"",
- "set object 648 rect from 120.9194999999999, 21.83 to 121.0104999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 649 rect from 121.0259999999999, 21.83 to 121.0314999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 650 rect from 123.77499999999989, 21.83 to 123.8254999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 651 rect from 126.55149999999989, 21.83 to 126.59899999999989, 21.17 fc rgb \"#0044CC\"",
- "set object 652 rect from 129.3344999999999, 21.83 to 129.4124999999999, 21.17 fc rgb \"#0044CC\"",
- "set object 653 rect from 129.4249999999999, 21.83 to 129.48849999999987, 21.17 fc rgb \"#0044CC\"",
- "set object 654 rect from 132.8659999999999, 21.83 to 132.92249999999987, 21.17 fc rgb \"#0044CC\"",
- "set object 655 rect from 136.14449999999988, 21.83 to 136.19799999999987, 21.17 fc rgb \"#0044CC\"",
- "set object 656 rect from 138.9289999999999, 21.83 to 138.98049999999986, 21.17 fc rgb \"#0044CC\"",
- "set object 657 rect from 2.4204999999999997, 22.83 to 3.7920000000000003, 22.17 fc rgb \"#4444CC\"",
- "set object 658 rect from 3.8075, 22.83 to 3.8129999999999997, 22.17 fc rgb \"#4444CC\"",
- "set object 659 rect from 6.2695, 22.83 to 7.373, 22.17 fc rgb \"#4444CC\"",
- "set object 660 rect from 7.3865, 22.83 to 7.3919999999999995, 22.17 fc rgb \"#4444CC\"",
- "set object 661 rect from 9.2915, 22.83 to 10.405000000000001, 22.17 fc rgb \"#4444CC\"",
- "set object 662 rect from 10.4235, 22.83 to 10.43, 22.17 fc rgb \"#4444CC\"",
- "set object 663 rect from 12.8765, 22.83 to 13.897, 22.17 fc rgb \"#4444CC\"",
- "set object 664 rect from 13.910499999999999, 22.83 to 13.915999999999999, 22.17 fc rgb \"#4444CC\"",
- "set object 665 rect from 18.803, 10.2 to 19.803, 9.8 fc rgb \"#000000\"",
- "set object 666 rect from 19.8815, 10.2 to 20.8815, 9.8 fc rgb \"#000000\"",
- "set object 667 rect from 20.910999999999998, 10.2 to 21.910999999999998, 9.8 fc rgb \"#000000\"",
- "set object 668 rect from 28.357000000000006, 10.2 to 30.17350000000001, 9.8 fc rgb \"#000000\"",
- "set object 669 rect from 30.235000000000014, 10.2 to 31.235000000000014, 9.8 fc rgb \"#000000\"",
- "set object 670 rect from 31.28350000000001, 10.2 to 32.28350000000001, 9.8 fc rgb \"#000000\"",
- "set object 671 rect from 32.353000000000016, 10.2 to 33.353000000000016, 9.8 fc rgb \"#000000\"",
- "set object 672 rect from 33.42150000000001, 10.2 to 34.42150000000001, 9.8 fc rgb \"#000000\"",
- "set object 673 rect from 34.47700000000001, 10.2 to 35.47700000000001, 9.8 fc rgb \"#000000\"",
- "set object 674 rect from 35.531500000000015, 10.2 to 36.531500000000015, 9.8 fc rgb \"#000000\"",
- "set object 675 rect from 36.59600000000001, 10.2 to 37.59600000000001, 9.8 fc rgb \"#000000\"",
- "set object 676 rect from 37.65150000000001, 10.2 to 38.65150000000001, 9.8 fc rgb \"#000000\"",
- "set object 677 rect from 38.70800000000001, 10.2 to 39.70800000000001, 9.8 fc rgb \"#000000\"",
- "set object 678 rect from 39.76650000000001, 10.2 to 40.76650000000001, 9.8 fc rgb \"#000000\"",
- "set object 679 rect from 40.82900000000001, 10.2 to 42.82200000000002, 9.8 fc rgb \"#000000\"",
- "set object 680 rect from 43.79150000000001, 10.2 to 44.79150000000001, 9.8 fc rgb \"#000000\"",
- "set object 681 rect from 45.50300000000001, 10.2 to 48.4035, 9.8 fc rgb \"#000000\"",
- "set object 682 rect from 48.49, 10.2 to 53.228999999999985, 9.8 fc rgb \"#000000\"",
- "set object 683 rect from 54.33049999999998, 10.2 to 55.33049999999998, 9.8 fc rgb \"#000000\"",
- "set object 684 rect from 55.37549999999998, 10.2 to 56.37549999999998, 9.8 fc rgb \"#000000\"",
- "set object 685 rect from 58.19399999999997, 10.2 to 59.19399999999997, 9.8 fc rgb \"#000000\"",
- "set object 686 rect from 62.20049999999995, 10.2 to 63.20049999999995, 9.8 fc rgb \"#000000\"",
- "set object 687 rect from 65.31249999999996, 10.2 to 66.31249999999996, 9.8 fc rgb \"#000000\"",
- "set object 688 rect from 66.37099999999995, 10.2 to 67.37099999999995, 9.8 fc rgb \"#000000\"",
- "set object 689 rect from 68.37699999999995, 10.2 to 70.37999999999994, 9.8 fc rgb \"#000000\"",
- "set object 690 rect from 72.48699999999994, 10.2 to 73.48699999999994, 9.8 fc rgb \"#000000\"",
- "set object 691 rect from 73.55549999999994, 10.2 to 74.55549999999994, 9.8 fc rgb \"#000000\"",
- "set object 692 rect from 76.64899999999994, 10.2 to 77.64899999999994, 9.8 fc rgb \"#000000\"",
- "set object 693 rect from 79.81349999999993, 10.2 to 80.81349999999993, 9.8 fc rgb \"#000000\"",
- "set object 694 rect from 81.90449999999993, 10.2 to 82.90449999999993, 9.8 fc rgb \"#000000\"",
- "set object 695 rect from 83.96999999999994, 10.2 to 85.90049999999992, 9.8 fc rgb \"#000000\"",
- "set object 696 rect from 90.04699999999991, 10.2 to 91.04699999999991, 9.8 fc rgb \"#000000\"",
- "set object 697 rect from 91.11749999999992, 10.2 to 92.11749999999992, 9.8 fc rgb \"#000000\"",
- "set object 698 rect from 94.24599999999992, 10.2 to 95.24599999999992, 9.8 fc rgb \"#000000\"",
- "set object 699 rect from 96.36399999999992, 10.2 to 97.36399999999992, 9.8 fc rgb \"#000000\"",
- "set object 700 rect from 108.83549999999991, 10.2 to 109.83549999999991, 9.8 fc rgb \"#000000\"",
- "set object 701 rect from 109.87949999999991, 10.2 to 110.87949999999991, 9.8 fc rgb \"#000000\"",
- "set object 702 rect from 112.9859999999999, 10.2 to 113.9859999999999, 9.8 fc rgb \"#000000\"",
- "set object 703 rect from 114.0484999999999, 10.2 to 115.0484999999999, 9.8 fc rgb \"#000000\"",
- "set object 704 rect from 119.3669999999999, 10.2 to 120.3669999999999, 9.8 fc rgb \"#000000\"",
- "set object 705 rect from 120.4439999999999, 10.2 to 121.4439999999999, 9.8 fc rgb \"#000000\"",
- "set object 706 rect from 121.46899999999991, 10.2 to 122.46899999999991, 9.8 fc rgb \"#000000\"",
- "set object 707 rect from 126.7234999999999, 10.2 to 127.7234999999999, 9.8 fc rgb \"#000000\"",
- "set object 708 rect from 127.77299999999991, 10.2 to 128.7729999999999, 9.8 fc rgb \"#000000\"",
- "set object 709 rect from 132.9344999999999, 10.2 to 133.9344999999999, 9.8 fc rgb \"#000000\"",
- "set object 710 rect from 135.0459999999999, 10.2 to 136.0459999999999, 9.8 fc rgb \"#000000\"",
- "set object 711 rect from 137.1609999999999, 10.2 to 138.1609999999999, 9.8 fc rgb \"#000000\"",
- "set object 712 rect from 139.24899999999988, 10.2 to 140.24899999999988, 9.8 fc rgb \"#000000\"",
- "set object 713 rect from 61.17299999999995, 10.2 to 62.17299999999995, 9.8 fc rgb \"#DD0000\"",
- "set object 714 rect from 63.23999999999996, 10.2 to 64.23999999999995, 9.8 fc rgb \"#DD0000\"",
- "set object 715 rect from 88.98349999999992, 10.2 to 89.98349999999992, 9.8 fc rgb \"#DD0000\"",
- "set object 716 rect from 106.85949999999991, 10.2 to 107.85949999999991, 9.8 fc rgb \"#DD0000\"",
- "set object 717 rect from 18.803, 9.399999999999999 to 19.803, 9.2 fc rgb \"#DD0000\"",
- "set object 718 rect from 19.8815, 9.399999999999999 to 20.8815, 9.2 fc rgb \"#DD0000\"",
- "set object 719 rect from 20.910999999999998, 9.399999999999999 to 21.910999999999998, 9.2 fc rgb \"#DD0000\"",
- "set object 720 rect from 41.82200000000002, 9.399999999999999 to 42.82200000000002, 9.2 fc rgb \"#DD0000\"",
- "set object 721 rect from 43.79150000000001, 9.399999999999999 to 44.79150000000001, 9.2 fc rgb \"#DD0000\"",
- "set object 722 rect from 45.50300000000001, 9.399999999999999 to 48.4035, 9.2 fc rgb \"#DD0000\"",
- "set object 723 rect from 48.49, 9.399999999999999 to 53.228999999999985, 9.2 fc rgb \"#DD0000\"",
- "set object 724 rect from 54.33049999999998, 9.399999999999999 to 55.33049999999998, 9.2 fc rgb \"#DD0000\"",
- "set object 725 rect from 57.33799999999997, 9.399999999999999 to 59.19399999999997, 9.2 fc rgb \"#DD0000\"",
- "set object 726 rect from 62.20049999999995, 9.399999999999999 to 63.20049999999995, 9.2 fc rgb \"#DD0000\"",
- "set object 727 rect from 64.28099999999995, 9.399999999999999 to 65.28099999999995, 9.2 fc rgb \"#DD0000\"",
- "set object 728 rect from 67.35049999999995, 9.399999999999999 to 68.35049999999995, 9.2 fc rgb \"#DD0000\"",
- "set object 729 rect from 71.44949999999994, 9.399999999999999 to 72.44949999999994, 9.2 fc rgb \"#DD0000\"",
- "set object 730 rect from 75.59449999999994, 9.399999999999999 to 76.59449999999994, 9.2 fc rgb \"#DD0000\"",
- "set object 731 rect from 77.68599999999995, 9.399999999999999 to 78.68599999999995, 9.2 fc rgb \"#DD0000\"",
- "set object 732 rect from 78.74099999999993, 9.399999999999999 to 79.74099999999993, 9.2 fc rgb \"#DD0000\"",
- "set object 733 rect from 82.96499999999995, 9.399999999999999 to 84.96999999999994, 9.2 fc rgb \"#DD0000\"",
- "set object 734 rect from 88.98349999999992, 9.399999999999999 to 89.98349999999992, 9.2 fc rgb \"#DD0000\"",
- "set object 735 rect from 90.04699999999991, 9.399999999999999 to 91.04699999999991, 9.2 fc rgb \"#DD0000\"",
- "set object 736 rect from 91.11749999999992, 9.399999999999999 to 92.11749999999992, 9.2 fc rgb \"#DD0000\"",
- "set object 737 rect from 94.24599999999992, 9.399999999999999 to 95.24599999999992, 9.2 fc rgb \"#DD0000\"",
- "set object 738 rect from 98.46299999999991, 9.399999999999999 to 99.46299999999991, 9.2 fc rgb \"#DD0000\"",
- "set object 739 rect from 106.85949999999991, 9.399999999999999 to 108.7474999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 740 rect from 109.87949999999991, 9.399999999999999 to 110.87949999999991, 9.2 fc rgb \"#DD0000\"",
- "set object 741 rect from 115.0789999999999, 9.399999999999999 to 116.0789999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 742 rect from 119.3669999999999, 9.399999999999999 to 120.3669999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 743 rect from 123.56399999999988, 9.399999999999999 to 124.56399999999988, 9.2 fc rgb \"#DD0000\"",
- "set object 744 rect from 127.77299999999991, 9.399999999999999 to 128.7729999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 745 rect from 128.8479999999999, 9.399999999999999 to 129.8479999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 746 rect from 131.90949999999987, 9.399999999999999 to 132.90949999999987, 9.2 fc rgb \"#DD0000\"",
- "set object 747 rect from 132.9344999999999, 9.399999999999999 to 133.9344999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 748 rect from 138.2054999999999, 9.399999999999999 to 139.2054999999999, 9.2 fc rgb \"#DD0000\"",
- "set object 749 rect from 18.803, 9.149999999999999 to 19.803, 8.95 fc rgb \"#DD0000\"",
- "set object 750 rect from 19.8815, 9.149999999999999 to 20.8815, 8.95 fc rgb \"#DD0000\"",
- "set object 751 rect from 20.910999999999998, 9.149999999999999 to 21.910999999999998, 8.95 fc rgb \"#DD0000\"",
- "set object 752 rect from 45.50300000000001, 9.149999999999999 to 48.4035, 8.95 fc rgb \"#DD0000\"",
- "set object 753 rect from 48.49, 9.149999999999999 to 53.228999999999985, 8.95 fc rgb \"#DD0000\"",
- "set object 754 rect from 54.33049999999998, 9.149999999999999 to 55.33049999999998, 8.95 fc rgb \"#DD0000\"",
- "set object 755 rect from 57.33799999999997, 9.149999999999999 to 59.19399999999997, 8.95 fc rgb \"#DD0000\"",
- "set object 756 rect from 61.17299999999995, 9.149999999999999 to 62.17299999999995, 8.95 fc rgb \"#DD0000\"",
- "set object 757 rect from 62.20049999999995, 9.149999999999999 to 63.20049999999995, 8.95 fc rgb \"#DD0000\"",
- "set object 758 rect from 63.23999999999996, 9.149999999999999 to 64.23999999999995, 8.95 fc rgb \"#DD0000\"",
- "set object 759 rect from 64.28099999999995, 9.149999999999999 to 65.28099999999995, 8.95 fc rgb \"#DD0000\"",
- "set object 760 rect from 65.31249999999996, 9.149999999999999 to 66.31249999999996, 8.95 fc rgb \"#DD0000\"",
- "set object 761 rect from 66.37099999999995, 9.149999999999999 to 68.35049999999995, 8.95 fc rgb \"#DD0000\"",
- "set object 762 rect from 68.37699999999995, 9.149999999999999 to 70.37999999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 763 rect from 70.39199999999994, 9.149999999999999 to 71.39199999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 764 rect from 71.44949999999994, 9.149999999999999 to 72.44949999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 765 rect from 72.48699999999994, 9.149999999999999 to 73.48699999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 766 rect from 73.55549999999994, 9.149999999999999 to 75.56249999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 767 rect from 75.59449999999994, 9.149999999999999 to 76.59449999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 768 rect from 76.64899999999994, 9.149999999999999 to 77.64899999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 769 rect from 77.68599999999995, 9.149999999999999 to 78.68599999999995, 8.95 fc rgb \"#DD0000\"",
- "set object 770 rect from 78.74099999999993, 9.149999999999999 to 79.74099999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 771 rect from 79.81349999999993, 9.149999999999999 to 80.81349999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 772 rect from 80.83699999999993, 9.149999999999999 to 81.83699999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 773 rect from 81.90449999999993, 9.149999999999999 to 82.90449999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 774 rect from 82.96499999999995, 9.149999999999999 to 84.96999999999994, 8.95 fc rgb \"#DD0000\"",
- "set object 775 rect from 85.90099999999993, 9.149999999999999 to 86.90099999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 776 rect from 87.97249999999993, 9.149999999999999 to 88.97249999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 777 rect from 88.98349999999992, 9.149999999999999 to 89.98349999999992, 8.95 fc rgb \"#DD0000\"",
- "set object 778 rect from 90.04699999999991, 9.149999999999999 to 91.04699999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 779 rect from 91.11749999999992, 9.149999999999999 to 92.11749999999992, 8.95 fc rgb \"#DD0000\"",
- "set object 780 rect from 92.14499999999992, 9.149999999999999 to 93.14499999999992, 8.95 fc rgb \"#DD0000\"",
- "set object 781 rect from 93.21149999999992, 9.149999999999999 to 94.21149999999992, 8.95 fc rgb \"#DD0000\"",
- "set object 782 rect from 96.36399999999992, 9.149999999999999 to 97.36399999999992, 8.95 fc rgb \"#DD0000\"",
- "set object 783 rect from 98.46299999999991, 9.149999999999999 to 99.46299999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 784 rect from 101.62199999999993, 9.149999999999999 to 102.62199999999993, 8.95 fc rgb \"#DD0000\"",
- "set object 785 rect from 102.63099999999991, 9.149999999999999 to 103.63099999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 786 rect from 104.73949999999991, 9.149999999999999 to 105.73949999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 787 rect from 106.85949999999991, 9.149999999999999 to 108.7474999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 788 rect from 109.87949999999991, 9.149999999999999 to 110.87949999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 789 rect from 110.93299999999991, 9.149999999999999 to 111.93299999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 790 rect from 112.00149999999991, 9.149999999999999 to 113.9859999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 791 rect from 115.0789999999999, 9.149999999999999 to 116.0789999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 792 rect from 117.26799999999992, 9.149999999999999 to 118.26799999999992, 8.95 fc rgb \"#DD0000\"",
- "set object 793 rect from 120.4439999999999, 9.149999999999999 to 121.4439999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 794 rect from 121.46899999999991, 9.149999999999999 to 122.46899999999991, 8.95 fc rgb \"#DD0000\"",
- "set object 795 rect from 122.52449999999989, 9.149999999999999 to 123.52449999999989, 8.95 fc rgb \"#DD0000\"",
- "set object 796 rect from 123.56399999999988, 9.149999999999999 to 124.56399999999988, 8.95 fc rgb \"#DD0000\"",
- "set object 797 rect from 126.7234999999999, 9.149999999999999 to 127.7234999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 798 rect from 127.77299999999991, 9.149999999999999 to 128.7729999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 799 rect from 128.8479999999999, 9.149999999999999 to 129.8479999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 800 rect from 131.90949999999987, 9.149999999999999 to 132.90949999999987, 8.95 fc rgb \"#DD0000\"",
- "set object 801 rect from 132.9344999999999, 9.149999999999999 to 133.9344999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 802 rect from 133.9804999999999, 9.149999999999999 to 134.9804999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 803 rect from 137.1609999999999, 9.149999999999999 to 138.1609999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 804 rect from 138.2054999999999, 9.149999999999999 to 139.2054999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 805 rect from 140.3004999999999, 9.149999999999999 to 141.3004999999999, 8.95 fc rgb \"#DD0000\"",
- "set object 806 rect from 18.803, 8.899999999999999 to 19.803, 8.7 fc rgb \"#DD0000\"",
- "set object 807 rect from 19.8815, 8.899999999999999 to 20.8815, 8.7 fc rgb \"#DD0000\"",
- "set object 808 rect from 20.910999999999998, 8.899999999999999 to 21.910999999999998, 8.7 fc rgb \"#DD0000\"",
- "set object 809 rect from 45.50300000000001, 8.899999999999999 to 48.4035, 8.7 fc rgb \"#DD0000\"",
- "set object 810 rect from 48.49, 8.899999999999999 to 53.228999999999985, 8.7 fc rgb \"#DD0000\"",
- "set object 811 rect from 54.33049999999998, 8.899999999999999 to 55.33049999999998, 8.7 fc rgb \"#DD0000\"",
- "set object 812 rect from 57.33799999999997, 8.899999999999999 to 59.19399999999997, 8.7 fc rgb \"#DD0000\"",
- "set object 813 rect from 61.17299999999995, 8.899999999999999 to 62.17299999999995, 8.7 fc rgb \"#DD0000\"",
- "set object 814 rect from 62.20049999999995, 8.899999999999999 to 63.20049999999995, 8.7 fc rgb \"#DD0000\"",
- "set object 815 rect from 63.23999999999996, 8.899999999999999 to 64.23999999999995, 8.7 fc rgb \"#DD0000\"",
- "set object 816 rect from 64.28099999999995, 8.899999999999999 to 65.28099999999995, 8.7 fc rgb \"#DD0000\"",
- "set object 817 rect from 65.31249999999996, 8.899999999999999 to 66.31249999999996, 8.7 fc rgb \"#DD0000\"",
- "set object 818 rect from 66.37099999999995, 8.899999999999999 to 68.35049999999995, 8.7 fc rgb \"#DD0000\"",
- "set object 819 rect from 68.37699999999995, 8.899999999999999 to 70.37999999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 820 rect from 70.39199999999994, 8.899999999999999 to 71.39199999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 821 rect from 71.44949999999994, 8.899999999999999 to 72.44949999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 822 rect from 72.48699999999994, 8.899999999999999 to 73.48699999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 823 rect from 73.55549999999994, 8.899999999999999 to 75.56249999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 824 rect from 75.59449999999994, 8.899999999999999 to 76.59449999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 825 rect from 76.64899999999994, 8.899999999999999 to 77.64899999999994, 8.7 fc rgb \"#DD0000\"",
- "set object 826 rect from 77.68599999999995, 8.899999999999999 to 78.68599999999995, 8.7 fc rgb \"#DD0000\"",
- "set object 827 rect from 78.74099999999993, 8.899999999999999 to 79.74099999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 828 rect from 79.81349999999993, 8.899999999999999 to 80.81349999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 829 rect from 80.83699999999993, 8.899999999999999 to 81.83699999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 830 rect from 81.90449999999993, 8.899999999999999 to 82.90449999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 831 rect from 82.96499999999995, 8.899999999999999 to 86.90099999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 832 rect from 87.97249999999993, 8.899999999999999 to 88.97249999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 833 rect from 88.98349999999992, 8.899999999999999 to 89.98349999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 834 rect from 90.04699999999991, 8.899999999999999 to 91.04699999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 835 rect from 91.11749999999992, 8.899999999999999 to 92.11749999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 836 rect from 92.14499999999992, 8.899999999999999 to 93.14499999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 837 rect from 93.21149999999992, 8.899999999999999 to 94.21149999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 838 rect from 94.24599999999992, 8.899999999999999 to 95.24599999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 839 rect from 95.31249999999991, 8.899999999999999 to 96.31249999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 840 rect from 96.36399999999992, 8.899999999999999 to 97.36399999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 841 rect from 97.39349999999992, 8.899999999999999 to 98.39349999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 842 rect from 98.46299999999991, 8.899999999999999 to 99.46299999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 843 rect from 99.48249999999992, 8.899999999999999 to 100.48249999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 844 rect from 100.56199999999993, 8.899999999999999 to 101.56199999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 845 rect from 101.62199999999993, 8.899999999999999 to 102.62199999999993, 8.7 fc rgb \"#DD0000\"",
- "set object 846 rect from 102.63099999999991, 8.899999999999999 to 103.63099999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 847 rect from 103.67849999999991, 8.899999999999999 to 104.67849999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 848 rect from 104.73949999999991, 8.899999999999999 to 105.73949999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 849 rect from 105.77499999999992, 8.899999999999999 to 106.77499999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 850 rect from 106.85949999999991, 8.899999999999999 to 108.7474999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 851 rect from 109.87949999999991, 8.899999999999999 to 110.87949999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 852 rect from 110.93299999999991, 8.899999999999999 to 111.93299999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 853 rect from 112.00149999999991, 8.899999999999999 to 113.9859999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 854 rect from 114.0484999999999, 8.899999999999999 to 115.0484999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 855 rect from 115.0789999999999, 8.899999999999999 to 116.0789999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 856 rect from 116.14449999999991, 8.899999999999999 to 117.14449999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 857 rect from 117.26799999999992, 8.899999999999999 to 118.26799999999992, 8.7 fc rgb \"#DD0000\"",
- "set object 858 rect from 118.3064999999999, 8.899999999999999 to 119.3064999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 859 rect from 119.3669999999999, 8.899999999999999 to 120.3669999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 860 rect from 120.4439999999999, 8.899999999999999 to 121.4439999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 861 rect from 121.46899999999991, 8.899999999999999 to 122.46899999999991, 8.7 fc rgb \"#DD0000\"",
- "set object 862 rect from 122.52449999999989, 8.899999999999999 to 123.52449999999989, 8.7 fc rgb \"#DD0000\"",
- "set object 863 rect from 123.56399999999988, 8.899999999999999 to 124.56399999999988, 8.7 fc rgb \"#DD0000\"",
- "set object 864 rect from 124.6324999999999, 8.899999999999999 to 125.6324999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 865 rect from 125.6929999999999, 8.899999999999999 to 126.6929999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 866 rect from 126.7234999999999, 8.899999999999999 to 127.7234999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 867 rect from 127.77299999999991, 8.899999999999999 to 128.7729999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 868 rect from 128.8479999999999, 8.899999999999999 to 129.8479999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 869 rect from 129.8879999999999, 8.899999999999999 to 131.8519999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 870 rect from 131.90949999999987, 8.899999999999999 to 132.90949999999987, 8.7 fc rgb \"#DD0000\"",
- "set object 871 rect from 132.9344999999999, 8.899999999999999 to 133.9344999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 872 rect from 133.9804999999999, 8.899999999999999 to 134.9804999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 873 rect from 135.0459999999999, 8.899999999999999 to 136.0459999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 874 rect from 136.08249999999987, 8.899999999999999 to 137.08249999999987, 8.7 fc rgb \"#DD0000\"",
- "set object 875 rect from 137.1609999999999, 8.899999999999999 to 138.1609999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 876 rect from 138.2054999999999, 8.899999999999999 to 139.2054999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 877 rect from 139.24899999999988, 8.899999999999999 to 140.24899999999988, 8.7 fc rgb \"#DD0000\"",
- "set object 878 rect from 140.3004999999999, 8.899999999999999 to 141.3004999999999, 8.7 fc rgb \"#DD0000\"",
- "set object 879 rect from 18.803, 8.649999999999999 to 19.803, 8.45 fc rgb \"#DD0000\"",
- "set object 880 rect from 19.8815, 8.649999999999999 to 20.8815, 8.45 fc rgb \"#DD0000\"",
- "set object 881 rect from 20.910999999999998, 8.649999999999999 to 21.910999999999998, 8.45 fc rgb \"#DD0000\"",
- "set object 882 rect from 45.50300000000001, 8.649999999999999 to 48.4035, 8.45 fc rgb \"#DD0000\"",
- "set object 883 rect from 48.49, 8.649999999999999 to 53.228999999999985, 8.45 fc rgb \"#DD0000\"",
- "set object 884 rect from 54.33049999999998, 8.649999999999999 to 55.33049999999998, 8.45 fc rgb \"#DD0000\"",
- "set object 885 rect from 57.33799999999997, 8.649999999999999 to 59.19399999999997, 8.45 fc rgb \"#DD0000\"",
- "set object 886 rect from 61.17299999999995, 8.649999999999999 to 62.17299999999995, 8.45 fc rgb \"#DD0000\"",
- "set object 887 rect from 62.20049999999995, 8.649999999999999 to 63.20049999999995, 8.45 fc rgb \"#DD0000\"",
- "set object 888 rect from 63.23999999999996, 8.649999999999999 to 64.23999999999995, 8.45 fc rgb \"#DD0000\"",
- "set object 889 rect from 64.28099999999995, 8.649999999999999 to 65.28099999999995, 8.45 fc rgb \"#DD0000\"",
- "set object 890 rect from 65.31249999999996, 8.649999999999999 to 66.31249999999996, 8.45 fc rgb \"#DD0000\"",
- "set object 891 rect from 66.37099999999995, 8.649999999999999 to 68.35049999999995, 8.45 fc rgb \"#DD0000\"",
- "set object 892 rect from 68.37699999999995, 8.649999999999999 to 70.37999999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 893 rect from 70.39199999999994, 8.649999999999999 to 71.39199999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 894 rect from 71.44949999999994, 8.649999999999999 to 72.44949999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 895 rect from 72.48699999999994, 8.649999999999999 to 73.48699999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 896 rect from 73.55549999999994, 8.649999999999999 to 75.56249999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 897 rect from 75.59449999999994, 8.649999999999999 to 76.59449999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 898 rect from 76.64899999999994, 8.649999999999999 to 77.64899999999994, 8.45 fc rgb \"#DD0000\"",
- "set object 899 rect from 77.68599999999995, 8.649999999999999 to 78.68599999999995, 8.45 fc rgb \"#DD0000\"",
- "set object 900 rect from 78.74099999999993, 8.649999999999999 to 79.74099999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 901 rect from 79.81349999999993, 8.649999999999999 to 80.81349999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 902 rect from 80.83699999999993, 8.649999999999999 to 81.83699999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 903 rect from 81.90449999999993, 8.649999999999999 to 82.90449999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 904 rect from 82.96499999999995, 8.649999999999999 to 86.90099999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 905 rect from 87.97249999999993, 8.649999999999999 to 88.97249999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 906 rect from 88.98349999999992, 8.649999999999999 to 89.98349999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 907 rect from 90.04699999999991, 8.649999999999999 to 91.04699999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 908 rect from 91.11749999999992, 8.649999999999999 to 92.11749999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 909 rect from 92.14499999999992, 8.649999999999999 to 93.14499999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 910 rect from 93.21149999999992, 8.649999999999999 to 94.21149999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 911 rect from 94.24599999999992, 8.649999999999999 to 95.24599999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 912 rect from 95.31249999999991, 8.649999999999999 to 96.31249999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 913 rect from 96.36399999999992, 8.649999999999999 to 97.36399999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 914 rect from 97.39349999999992, 8.649999999999999 to 98.39349999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 915 rect from 98.46299999999991, 8.649999999999999 to 99.46299999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 916 rect from 99.48249999999992, 8.649999999999999 to 100.48249999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 917 rect from 100.56199999999993, 8.649999999999999 to 101.56199999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 918 rect from 101.62199999999993, 8.649999999999999 to 102.62199999999993, 8.45 fc rgb \"#DD0000\"",
- "set object 919 rect from 102.63099999999991, 8.649999999999999 to 103.63099999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 920 rect from 103.67849999999991, 8.649999999999999 to 104.67849999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 921 rect from 104.73949999999991, 8.649999999999999 to 105.73949999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 922 rect from 105.77499999999992, 8.649999999999999 to 106.77499999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 923 rect from 106.85949999999991, 8.649999999999999 to 108.7474999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 924 rect from 109.87949999999991, 8.649999999999999 to 110.87949999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 925 rect from 110.93299999999991, 8.649999999999999 to 111.93299999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 926 rect from 112.00149999999991, 8.649999999999999 to 113.9859999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 927 rect from 114.0484999999999, 8.649999999999999 to 115.0484999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 928 rect from 115.0789999999999, 8.649999999999999 to 116.0789999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 929 rect from 116.14449999999991, 8.649999999999999 to 117.14449999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 930 rect from 117.26799999999992, 8.649999999999999 to 118.26799999999992, 8.45 fc rgb \"#DD0000\"",
- "set object 931 rect from 118.3064999999999, 8.649999999999999 to 119.3064999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 932 rect from 119.3669999999999, 8.649999999999999 to 120.3669999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 933 rect from 120.4439999999999, 8.649999999999999 to 121.4439999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 934 rect from 121.46899999999991, 8.649999999999999 to 122.46899999999991, 8.45 fc rgb \"#DD0000\"",
- "set object 935 rect from 122.52449999999989, 8.649999999999999 to 123.52449999999989, 8.45 fc rgb \"#DD0000\"",
- "set object 936 rect from 123.56399999999988, 8.649999999999999 to 124.56399999999988, 8.45 fc rgb \"#DD0000\"",
- "set object 937 rect from 124.6324999999999, 8.649999999999999 to 125.6324999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 938 rect from 125.6929999999999, 8.649999999999999 to 126.6929999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 939 rect from 126.7234999999999, 8.649999999999999 to 127.7234999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 940 rect from 127.77299999999991, 8.649999999999999 to 128.7729999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 941 rect from 128.8479999999999, 8.649999999999999 to 129.8479999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 942 rect from 129.8879999999999, 8.649999999999999 to 131.8519999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 943 rect from 131.90949999999987, 8.649999999999999 to 132.90949999999987, 8.45 fc rgb \"#DD0000\"",
- "set object 944 rect from 132.9344999999999, 8.649999999999999 to 133.9344999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 945 rect from 133.9804999999999, 8.649999999999999 to 134.9804999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 946 rect from 135.0459999999999, 8.649999999999999 to 136.0459999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 947 rect from 136.08249999999987, 8.649999999999999 to 137.08249999999987, 8.45 fc rgb \"#DD0000\"",
- "set object 948 rect from 137.1609999999999, 8.649999999999999 to 138.1609999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 949 rect from 138.2054999999999, 8.649999999999999 to 139.2054999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 950 rect from 139.24899999999988, 8.649999999999999 to 140.24899999999988, 8.45 fc rgb \"#DD0000\"",
- "set object 951 rect from 140.3004999999999, 8.649999999999999 to 141.3004999999999, 8.45 fc rgb \"#DD0000\"",
- "set object 952 rect from 18.803, 8.399999999999999 to 19.803, 8.2 fc rgb \"#DD0000\"",
- "set object 953 rect from 19.8815, 8.399999999999999 to 20.8815, 8.2 fc rgb \"#DD0000\"",
- "set object 954 rect from 20.910999999999998, 8.399999999999999 to 21.910999999999998, 8.2 fc rgb \"#DD0000\"",
- "set object 955 rect from 45.50300000000001, 8.399999999999999 to 48.4035, 8.2 fc rgb \"#DD0000\"",
- "set object 956 rect from 48.49, 8.399999999999999 to 53.228999999999985, 8.2 fc rgb \"#DD0000\"",
- "set object 957 rect from 54.33049999999998, 8.399999999999999 to 55.33049999999998, 8.2 fc rgb \"#DD0000\"",
- "set object 958 rect from 57.33799999999997, 8.399999999999999 to 59.19399999999997, 8.2 fc rgb \"#DD0000\"",
- "set object 959 rect from 61.17299999999995, 8.399999999999999 to 62.17299999999995, 8.2 fc rgb \"#DD0000\"",
- "set object 960 rect from 62.20049999999995, 8.399999999999999 to 63.20049999999995, 8.2 fc rgb \"#DD0000\"",
- "set object 961 rect from 63.23999999999996, 8.399999999999999 to 64.23999999999995, 8.2 fc rgb \"#DD0000\"",
- "set object 962 rect from 64.28099999999995, 8.399999999999999 to 65.28099999999995, 8.2 fc rgb \"#DD0000\"",
- "set object 963 rect from 65.31249999999996, 8.399999999999999 to 66.31249999999996, 8.2 fc rgb \"#DD0000\"",
- "set object 964 rect from 66.37099999999995, 8.399999999999999 to 68.35049999999995, 8.2 fc rgb \"#DD0000\"",
- "set object 965 rect from 68.37699999999995, 8.399999999999999 to 70.37999999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 966 rect from 70.39199999999994, 8.399999999999999 to 71.39199999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 967 rect from 71.44949999999994, 8.399999999999999 to 72.44949999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 968 rect from 72.48699999999994, 8.399999999999999 to 73.48699999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 969 rect from 73.55549999999994, 8.399999999999999 to 75.56249999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 970 rect from 75.59449999999994, 8.399999999999999 to 76.59449999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 971 rect from 76.64899999999994, 8.399999999999999 to 77.64899999999994, 8.2 fc rgb \"#DD0000\"",
- "set object 972 rect from 77.68599999999995, 8.399999999999999 to 78.68599999999995, 8.2 fc rgb \"#DD0000\"",
- "set object 973 rect from 78.74099999999993, 8.399999999999999 to 79.74099999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 974 rect from 79.81349999999993, 8.399999999999999 to 80.81349999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 975 rect from 80.83699999999993, 8.399999999999999 to 81.83699999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 976 rect from 81.90449999999993, 8.399999999999999 to 82.90449999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 977 rect from 82.96499999999995, 8.399999999999999 to 86.90099999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 978 rect from 87.97249999999993, 8.399999999999999 to 88.97249999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 979 rect from 88.98349999999992, 8.399999999999999 to 89.98349999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 980 rect from 90.04699999999991, 8.399999999999999 to 91.04699999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 981 rect from 91.11749999999992, 8.399999999999999 to 92.11749999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 982 rect from 92.14499999999992, 8.399999999999999 to 93.14499999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 983 rect from 93.21149999999992, 8.399999999999999 to 94.21149999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 984 rect from 94.24599999999992, 8.399999999999999 to 95.24599999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 985 rect from 95.31249999999991, 8.399999999999999 to 96.31249999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 986 rect from 96.36399999999992, 8.399999999999999 to 97.36399999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 987 rect from 97.39349999999992, 8.399999999999999 to 98.39349999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 988 rect from 98.46299999999991, 8.399999999999999 to 99.46299999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 989 rect from 99.48249999999992, 8.399999999999999 to 100.48249999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 990 rect from 100.56199999999993, 8.399999999999999 to 101.56199999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 991 rect from 101.62199999999993, 8.399999999999999 to 102.62199999999993, 8.2 fc rgb \"#DD0000\"",
- "set object 992 rect from 102.63099999999991, 8.399999999999999 to 103.63099999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 993 rect from 103.67849999999991, 8.399999999999999 to 104.67849999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 994 rect from 104.73949999999991, 8.399999999999999 to 105.73949999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 995 rect from 105.77499999999992, 8.399999999999999 to 106.77499999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 996 rect from 106.85949999999991, 8.399999999999999 to 108.7474999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 997 rect from 109.87949999999991, 8.399999999999999 to 110.87949999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 998 rect from 110.93299999999991, 8.399999999999999 to 111.93299999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 999 rect from 112.00149999999991, 8.399999999999999 to 113.9859999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1000 rect from 114.0484999999999, 8.399999999999999 to 115.0484999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1001 rect from 115.0789999999999, 8.399999999999999 to 116.0789999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1002 rect from 116.14449999999991, 8.399999999999999 to 117.14449999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 1003 rect from 117.26799999999992, 8.399999999999999 to 118.26799999999992, 8.2 fc rgb \"#DD0000\"",
- "set object 1004 rect from 118.3064999999999, 8.399999999999999 to 119.3064999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1005 rect from 119.3669999999999, 8.399999999999999 to 120.3669999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1006 rect from 120.4439999999999, 8.399999999999999 to 121.4439999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1007 rect from 121.46899999999991, 8.399999999999999 to 122.46899999999991, 8.2 fc rgb \"#DD0000\"",
- "set object 1008 rect from 122.52449999999989, 8.399999999999999 to 123.52449999999989, 8.2 fc rgb \"#DD0000\"",
- "set object 1009 rect from 123.56399999999988, 8.399999999999999 to 124.56399999999988, 8.2 fc rgb \"#DD0000\"",
- "set object 1010 rect from 124.6324999999999, 8.399999999999999 to 125.6324999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1011 rect from 125.6929999999999, 8.399999999999999 to 126.6929999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1012 rect from 126.7234999999999, 8.399999999999999 to 127.7234999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1013 rect from 127.77299999999991, 8.399999999999999 to 128.7729999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1014 rect from 128.8479999999999, 8.399999999999999 to 129.8479999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1015 rect from 129.8879999999999, 8.399999999999999 to 131.8519999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1016 rect from 131.90949999999987, 8.399999999999999 to 132.90949999999987, 8.2 fc rgb \"#DD0000\"",
- "set object 1017 rect from 132.9344999999999, 8.399999999999999 to 133.9344999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1018 rect from 133.9804999999999, 8.399999999999999 to 134.9804999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1019 rect from 135.0459999999999, 8.399999999999999 to 136.0459999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1020 rect from 136.08249999999987, 8.399999999999999 to 137.08249999999987, 8.2 fc rgb \"#DD0000\"",
- "set object 1021 rect from 137.1609999999999, 8.399999999999999 to 138.1609999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1022 rect from 138.2054999999999, 8.399999999999999 to 139.2054999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1023 rect from 139.24899999999988, 8.399999999999999 to 140.24899999999988, 8.2 fc rgb \"#DD0000\"",
- "set object 1024 rect from 140.3004999999999, 8.399999999999999 to 141.3004999999999, 8.2 fc rgb \"#DD0000\"",
- "set object 1025 rect from 19.8815, 8.149999999999999 to 20.8815, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1026 rect from 20.910999999999998, 8.149999999999999 to 21.910999999999998, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1027 rect from 45.50300000000001, 8.149999999999999 to 48.4035, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1028 rect from 48.49, 8.149999999999999 to 53.228999999999985, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1029 rect from 54.33049999999998, 8.149999999999999 to 55.33049999999998, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1030 rect from 57.33799999999997, 8.149999999999999 to 59.19399999999997, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1031 rect from 61.17299999999995, 8.149999999999999 to 62.17299999999995, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1032 rect from 62.20049999999995, 8.149999999999999 to 63.20049999999995, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1033 rect from 63.23999999999996, 8.149999999999999 to 64.23999999999995, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1034 rect from 64.28099999999995, 8.149999999999999 to 65.28099999999995, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1035 rect from 65.31249999999996, 8.149999999999999 to 66.31249999999996, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1036 rect from 66.37099999999995, 8.149999999999999 to 68.35049999999995, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1037 rect from 68.37699999999995, 8.149999999999999 to 70.37999999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1038 rect from 70.39199999999994, 8.149999999999999 to 71.39199999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1039 rect from 71.44949999999994, 8.149999999999999 to 72.44949999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1040 rect from 72.48699999999994, 8.149999999999999 to 73.48699999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1041 rect from 73.55549999999994, 8.149999999999999 to 75.56249999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1042 rect from 75.59449999999994, 8.149999999999999 to 76.59449999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1043 rect from 76.64899999999994, 8.149999999999999 to 77.64899999999994, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1044 rect from 77.68599999999995, 8.149999999999999 to 78.68599999999995, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1045 rect from 78.74099999999993, 8.149999999999999 to 79.74099999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1046 rect from 79.81349999999993, 8.149999999999999 to 80.81349999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1047 rect from 80.83699999999993, 8.149999999999999 to 81.83699999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1048 rect from 81.90449999999993, 8.149999999999999 to 82.90449999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1049 rect from 82.96499999999995, 8.149999999999999 to 86.90099999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1050 rect from 87.97249999999993, 8.149999999999999 to 88.97249999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1051 rect from 88.98349999999992, 8.149999999999999 to 89.98349999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1052 rect from 90.04699999999991, 8.149999999999999 to 91.04699999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1053 rect from 91.11749999999992, 8.149999999999999 to 92.11749999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1054 rect from 92.14499999999992, 8.149999999999999 to 93.14499999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1055 rect from 93.21149999999992, 8.149999999999999 to 94.21149999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1056 rect from 94.24599999999992, 8.149999999999999 to 95.24599999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1057 rect from 95.31249999999991, 8.149999999999999 to 96.31249999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1058 rect from 96.36399999999992, 8.149999999999999 to 97.36399999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1059 rect from 97.39349999999992, 8.149999999999999 to 98.39349999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1060 rect from 98.46299999999991, 8.149999999999999 to 99.46299999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1061 rect from 99.48249999999992, 8.149999999999999 to 100.48249999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1062 rect from 100.56199999999993, 8.149999999999999 to 101.56199999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1063 rect from 101.62199999999993, 8.149999999999999 to 102.62199999999993, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1064 rect from 102.63099999999991, 8.149999999999999 to 103.63099999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1065 rect from 103.67849999999991, 8.149999999999999 to 104.67849999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1066 rect from 104.73949999999991, 8.149999999999999 to 105.73949999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1067 rect from 105.77499999999992, 8.149999999999999 to 106.77499999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1068 rect from 106.85949999999991, 8.149999999999999 to 108.7474999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1069 rect from 109.87949999999991, 8.149999999999999 to 110.87949999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1070 rect from 110.93299999999991, 8.149999999999999 to 111.93299999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1071 rect from 112.00149999999991, 8.149999999999999 to 113.9859999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1072 rect from 114.0484999999999, 8.149999999999999 to 115.0484999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1073 rect from 115.0789999999999, 8.149999999999999 to 116.0789999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1074 rect from 116.14449999999991, 8.149999999999999 to 117.14449999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1075 rect from 117.26799999999992, 8.149999999999999 to 118.26799999999992, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1076 rect from 118.3064999999999, 8.149999999999999 to 119.3064999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1077 rect from 119.3669999999999, 8.149999999999999 to 120.3669999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1078 rect from 120.4439999999999, 8.149999999999999 to 121.4439999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1079 rect from 121.46899999999991, 8.149999999999999 to 122.46899999999991, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1080 rect from 122.52449999999989, 8.149999999999999 to 123.52449999999989, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1081 rect from 123.56399999999988, 8.149999999999999 to 124.56399999999988, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1082 rect from 124.6324999999999, 8.149999999999999 to 125.6324999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1083 rect from 125.6929999999999, 8.149999999999999 to 126.6929999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1084 rect from 126.7234999999999, 8.149999999999999 to 127.7234999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1085 rect from 127.77299999999991, 8.149999999999999 to 128.7729999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1086 rect from 128.8479999999999, 8.149999999999999 to 129.8479999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1087 rect from 129.8879999999999, 8.149999999999999 to 131.8519999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1088 rect from 131.90949999999987, 8.149999999999999 to 132.90949999999987, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1089 rect from 132.9344999999999, 8.149999999999999 to 133.9344999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1090 rect from 133.9804999999999, 8.149999999999999 to 134.9804999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1091 rect from 135.0459999999999, 8.149999999999999 to 136.0459999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1092 rect from 136.08249999999987, 8.149999999999999 to 137.08249999999987, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1093 rect from 137.1609999999999, 8.149999999999999 to 138.1609999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1094 rect from 138.2054999999999, 8.149999999999999 to 139.2054999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1095 rect from 139.24899999999988, 8.149999999999999 to 140.24899999999988, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1096 rect from 140.3004999999999, 8.149999999999999 to 141.3004999999999, 7.949999999999999 fc rgb \"#DD0000\"",
- "set object 1097 rect from 19.8815, 7.899999999999999 to 20.8815, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1098 rect from 20.910999999999998, 7.899999999999999 to 21.910999999999998, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1099 rect from 45.50300000000001, 7.899999999999999 to 48.4035, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1100 rect from 48.49, 7.899999999999999 to 53.228999999999985, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1101 rect from 54.33049999999998, 7.899999999999999 to 55.33049999999998, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1102 rect from 57.33799999999997, 7.899999999999999 to 59.19399999999997, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1103 rect from 61.17299999999995, 7.899999999999999 to 62.17299999999995, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1104 rect from 62.20049999999995, 7.899999999999999 to 63.20049999999995, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1105 rect from 63.23999999999996, 7.899999999999999 to 64.23999999999995, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1106 rect from 64.28099999999995, 7.899999999999999 to 65.28099999999995, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1107 rect from 65.31249999999996, 7.899999999999999 to 66.31249999999996, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1108 rect from 66.37099999999995, 7.899999999999999 to 68.35049999999995, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1109 rect from 68.37699999999995, 7.899999999999999 to 70.37999999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1110 rect from 70.39199999999994, 7.899999999999999 to 71.39199999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1111 rect from 71.44949999999994, 7.899999999999999 to 72.44949999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1112 rect from 72.48699999999994, 7.899999999999999 to 73.48699999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1113 rect from 73.55549999999994, 7.899999999999999 to 75.56249999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1114 rect from 75.59449999999994, 7.899999999999999 to 76.59449999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1115 rect from 76.64899999999994, 7.899999999999999 to 77.64899999999994, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1116 rect from 77.68599999999995, 7.899999999999999 to 78.68599999999995, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1117 rect from 78.74099999999993, 7.899999999999999 to 79.74099999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1118 rect from 79.81349999999993, 7.899999999999999 to 80.81349999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1119 rect from 80.83699999999993, 7.899999999999999 to 81.83699999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1120 rect from 81.90449999999993, 7.899999999999999 to 82.90449999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1121 rect from 82.96499999999995, 7.899999999999999 to 86.90099999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1122 rect from 87.97249999999993, 7.899999999999999 to 88.97249999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1123 rect from 88.98349999999992, 7.899999999999999 to 89.98349999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1124 rect from 90.04699999999991, 7.899999999999999 to 91.04699999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1125 rect from 91.11749999999992, 7.899999999999999 to 92.11749999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1126 rect from 92.14499999999992, 7.899999999999999 to 93.14499999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1127 rect from 93.21149999999992, 7.899999999999999 to 94.21149999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1128 rect from 94.24599999999992, 7.899999999999999 to 95.24599999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1129 rect from 95.31249999999991, 7.899999999999999 to 96.31249999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1130 rect from 96.36399999999992, 7.899999999999999 to 97.36399999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1131 rect from 97.39349999999992, 7.899999999999999 to 98.39349999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1132 rect from 98.46299999999991, 7.899999999999999 to 99.46299999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1133 rect from 99.48249999999992, 7.899999999999999 to 100.48249999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1134 rect from 100.56199999999993, 7.899999999999999 to 101.56199999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1135 rect from 101.62199999999993, 7.899999999999999 to 102.62199999999993, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1136 rect from 102.63099999999991, 7.899999999999999 to 103.63099999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1137 rect from 103.67849999999991, 7.899999999999999 to 104.67849999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1138 rect from 104.73949999999991, 7.899999999999999 to 105.73949999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1139 rect from 105.77499999999992, 7.899999999999999 to 106.77499999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1140 rect from 106.85949999999991, 7.899999999999999 to 108.7474999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1141 rect from 109.87949999999991, 7.899999999999999 to 110.87949999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1142 rect from 110.93299999999991, 7.899999999999999 to 111.93299999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1143 rect from 112.00149999999991, 7.899999999999999 to 113.9859999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1144 rect from 114.0484999999999, 7.899999999999999 to 115.0484999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1145 rect from 115.0789999999999, 7.899999999999999 to 116.0789999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1146 rect from 116.14449999999991, 7.899999999999999 to 117.14449999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1147 rect from 117.26799999999992, 7.899999999999999 to 118.26799999999992, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1148 rect from 118.3064999999999, 7.899999999999999 to 119.3064999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1149 rect from 119.3669999999999, 7.899999999999999 to 120.3669999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1150 rect from 120.4439999999999, 7.899999999999999 to 121.4439999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1151 rect from 121.46899999999991, 7.899999999999999 to 122.46899999999991, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1152 rect from 122.52449999999989, 7.899999999999999 to 123.52449999999989, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1153 rect from 123.56399999999988, 7.899999999999999 to 124.56399999999988, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1154 rect from 124.6324999999999, 7.899999999999999 to 125.6324999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1155 rect from 125.6929999999999, 7.899999999999999 to 126.6929999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1156 rect from 126.7234999999999, 7.899999999999999 to 127.7234999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1157 rect from 127.77299999999991, 7.899999999999999 to 128.7729999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1158 rect from 128.8479999999999, 7.899999999999999 to 129.8479999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1159 rect from 129.8879999999999, 7.899999999999999 to 131.8519999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1160 rect from 131.90949999999987, 7.899999999999999 to 132.90949999999987, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1161 rect from 132.9344999999999, 7.899999999999999 to 133.9344999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1162 rect from 133.9804999999999, 7.899999999999999 to 134.9804999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1163 rect from 135.0459999999999, 7.899999999999999 to 136.0459999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1164 rect from 136.08249999999987, 7.899999999999999 to 137.08249999999987, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1165 rect from 137.1609999999999, 7.899999999999999 to 138.1609999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1166 rect from 138.2054999999999, 7.899999999999999 to 139.2054999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1167 rect from 139.24899999999988, 7.899999999999999 to 140.24899999999988, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1168 rect from 140.3004999999999, 7.899999999999999 to 141.3004999999999, 7.699999999999999 fc rgb \"#DD0000\"",
- "set object 1169 rect from 19.8815, 7.649999999999999 to 20.8815, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1170 rect from 20.910999999999998, 7.649999999999999 to 21.910999999999998, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1171 rect from 45.50300000000001, 7.649999999999999 to 48.4035, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1172 rect from 48.49, 7.649999999999999 to 53.228999999999985, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1173 rect from 54.33049999999998, 7.649999999999999 to 55.33049999999998, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1174 rect from 57.33799999999997, 7.649999999999999 to 59.19399999999997, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1175 rect from 61.17299999999995, 7.649999999999999 to 62.17299999999995, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1176 rect from 62.20049999999995, 7.649999999999999 to 63.20049999999995, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1177 rect from 63.23999999999996, 7.649999999999999 to 64.23999999999995, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1178 rect from 64.28099999999995, 7.649999999999999 to 65.28099999999995, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1179 rect from 65.31249999999996, 7.649999999999999 to 66.31249999999996, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1180 rect from 66.37099999999995, 7.649999999999999 to 68.35049999999995, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1181 rect from 68.37699999999995, 7.649999999999999 to 70.37999999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1182 rect from 70.39199999999994, 7.649999999999999 to 71.39199999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1183 rect from 71.44949999999994, 7.649999999999999 to 72.44949999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1184 rect from 72.48699999999994, 7.649999999999999 to 73.48699999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1185 rect from 73.55549999999994, 7.649999999999999 to 75.56249999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1186 rect from 75.59449999999994, 7.649999999999999 to 76.59449999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1187 rect from 76.64899999999994, 7.649999999999999 to 77.64899999999994, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1188 rect from 77.68599999999995, 7.649999999999999 to 78.68599999999995, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1189 rect from 78.74099999999993, 7.649999999999999 to 79.74099999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1190 rect from 79.81349999999993, 7.649999999999999 to 80.81349999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1191 rect from 80.83699999999993, 7.649999999999999 to 81.83699999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1192 rect from 81.90449999999993, 7.649999999999999 to 82.90449999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1193 rect from 82.96499999999995, 7.649999999999999 to 86.90099999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1194 rect from 87.97249999999993, 7.649999999999999 to 88.97249999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1195 rect from 88.98349999999992, 7.649999999999999 to 89.98349999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1196 rect from 90.04699999999991, 7.649999999999999 to 91.04699999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1197 rect from 91.11749999999992, 7.649999999999999 to 92.11749999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1198 rect from 92.14499999999992, 7.649999999999999 to 93.14499999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1199 rect from 93.21149999999992, 7.649999999999999 to 94.21149999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1200 rect from 94.24599999999992, 7.649999999999999 to 95.24599999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1201 rect from 95.31249999999991, 7.649999999999999 to 96.31249999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1202 rect from 96.36399999999992, 7.649999999999999 to 97.36399999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1203 rect from 97.39349999999992, 7.649999999999999 to 98.39349999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1204 rect from 98.46299999999991, 7.649999999999999 to 99.46299999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1205 rect from 99.48249999999992, 7.649999999999999 to 100.48249999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1206 rect from 100.56199999999993, 7.649999999999999 to 101.56199999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1207 rect from 101.62199999999993, 7.649999999999999 to 102.62199999999993, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1208 rect from 102.63099999999991, 7.649999999999999 to 103.63099999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1209 rect from 103.67849999999991, 7.649999999999999 to 104.67849999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1210 rect from 104.73949999999991, 7.649999999999999 to 105.73949999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1211 rect from 105.77499999999992, 7.649999999999999 to 106.77499999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1212 rect from 106.85949999999991, 7.649999999999999 to 108.7474999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1213 rect from 109.87949999999991, 7.649999999999999 to 110.87949999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1214 rect from 110.93299999999991, 7.649999999999999 to 111.93299999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1215 rect from 112.00149999999991, 7.649999999999999 to 113.9859999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1216 rect from 114.0484999999999, 7.649999999999999 to 115.0484999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1217 rect from 115.0789999999999, 7.649999999999999 to 116.0789999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1218 rect from 116.14449999999991, 7.649999999999999 to 117.14449999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1219 rect from 117.26799999999992, 7.649999999999999 to 118.26799999999992, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1220 rect from 118.3064999999999, 7.649999999999999 to 119.3064999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1221 rect from 119.3669999999999, 7.649999999999999 to 120.3669999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1222 rect from 120.4439999999999, 7.649999999999999 to 121.4439999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1223 rect from 121.46899999999991, 7.649999999999999 to 122.46899999999991, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1224 rect from 122.52449999999989, 7.649999999999999 to 123.52449999999989, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1225 rect from 123.56399999999988, 7.649999999999999 to 124.56399999999988, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1226 rect from 124.6324999999999, 7.649999999999999 to 125.6324999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1227 rect from 125.6929999999999, 7.649999999999999 to 126.6929999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1228 rect from 126.7234999999999, 7.649999999999999 to 127.7234999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1229 rect from 127.77299999999991, 7.649999999999999 to 128.7729999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1230 rect from 128.8479999999999, 7.649999999999999 to 129.8479999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1231 rect from 129.8879999999999, 7.649999999999999 to 131.8519999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1232 rect from 131.90949999999987, 7.649999999999999 to 132.90949999999987, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1233 rect from 132.9344999999999, 7.649999999999999 to 133.9344999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1234 rect from 133.9804999999999, 7.649999999999999 to 134.9804999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1235 rect from 135.0459999999999, 7.649999999999999 to 136.0459999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1236 rect from 136.08249999999987, 7.649999999999999 to 137.08249999999987, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1237 rect from 137.1609999999999, 7.649999999999999 to 138.1609999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1238 rect from 138.2054999999999, 7.649999999999999 to 139.2054999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1239 rect from 139.24899999999988, 7.649999999999999 to 140.24899999999988, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1240 rect from 140.3004999999999, 7.649999999999999 to 141.3004999999999, 7.449999999999999 fc rgb \"#DD0000\"",
- "set object 1241 rect from 64.28099999999995, 10.2 to 65.28099999999995, 9.8 fc rgb \"#00EE00\"",
- "set object 1242 rect from 70.39199999999994, 10.2 to 71.39199999999994, 9.8 fc rgb \"#00EE00\"",
- "set object 1243 rect from 74.56249999999994, 10.2 to 75.56249999999994, 9.8 fc rgb \"#00EE00\"",
- "set object 1244 rect from 75.59449999999994, 10.2 to 76.59449999999994, 9.8 fc rgb \"#00EE00\"",
- "set object 1245 rect from 77.68599999999995, 10.2 to 78.68599999999995, 9.8 fc rgb \"#00EE00\"",
- "set object 1246 rect from 82.96499999999995, 10.2 to 83.96499999999995, 9.8 fc rgb \"#00EE00\"",
- "set object 1247 rect from 85.90099999999993, 10.2 to 86.90099999999993, 9.8 fc rgb \"#00EE00\"",
- "set object 1248 rect from 87.97249999999993, 10.2 to 88.97249999999993, 9.8 fc rgb \"#00EE00\"",
- "set object 1249 rect from 92.14499999999992, 10.2 to 93.14499999999992, 9.8 fc rgb \"#00EE00\"",
- "set object 1250 rect from 95.31249999999991, 10.2 to 96.31249999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1251 rect from 97.39349999999992, 10.2 to 98.39349999999992, 9.8 fc rgb \"#00EE00\"",
- "set object 1252 rect from 98.46299999999991, 10.2 to 99.46299999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1253 rect from 99.48249999999992, 10.2 to 100.48249999999992, 9.8 fc rgb \"#00EE00\"",
- "set object 1254 rect from 100.56199999999993, 10.2 to 101.56199999999993, 9.8 fc rgb \"#00EE00\"",
- "set object 1255 rect from 101.62199999999993, 10.2 to 102.62199999999993, 9.8 fc rgb \"#00EE00\"",
- "set object 1256 rect from 102.63099999999991, 10.2 to 103.63099999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1257 rect from 103.67849999999991, 10.2 to 104.67849999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1258 rect from 104.73949999999991, 10.2 to 105.73949999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1259 rect from 105.77499999999992, 10.2 to 106.77499999999992, 9.8 fc rgb \"#00EE00\"",
- "set object 1260 rect from 107.7474999999999, 10.2 to 108.7474999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1261 rect from 110.93299999999991, 10.2 to 111.93299999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1262 rect from 115.0789999999999, 10.2 to 116.0789999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1263 rect from 116.14449999999991, 10.2 to 117.14449999999991, 9.8 fc rgb \"#00EE00\"",
- "set object 1264 rect from 117.26799999999992, 10.2 to 118.26799999999992, 9.8 fc rgb \"#00EE00\"",
- "set object 1265 rect from 118.3064999999999, 10.2 to 119.3064999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1266 rect from 122.52449999999989, 10.2 to 123.52449999999989, 9.8 fc rgb \"#00EE00\"",
- "set object 1267 rect from 123.56399999999988, 10.2 to 124.56399999999988, 9.8 fc rgb \"#00EE00\"",
- "set object 1268 rect from 124.6324999999999, 10.2 to 125.6324999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1269 rect from 125.6929999999999, 10.2 to 126.6929999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1270 rect from 128.8479999999999, 10.2 to 129.8479999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1271 rect from 129.8879999999999, 10.2 to 131.8519999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1272 rect from 131.90949999999987, 10.2 to 132.90949999999987, 9.8 fc rgb \"#00EE00\"",
- "set object 1273 rect from 133.9804999999999, 10.2 to 134.9804999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1274 rect from 136.08249999999987, 10.2 to 137.08249999999987, 9.8 fc rgb \"#00EE00\"",
- "set object 1275 rect from 140.3004999999999, 10.2 to 141.3004999999999, 9.8 fc rgb \"#00EE00\"",
- "set object 1276 rect from 61.17299999999995, 9.399999999999999 to 62.17299999999995, 9.2 fc rgb \"#00EE00\"",
- "set object 1277 rect from 63.23999999999996, 9.399999999999999 to 64.23999999999995, 9.2 fc rgb \"#00EE00\"",
- "set object 1278 rect from 65.31249999999996, 9.399999999999999 to 66.31249999999996, 9.2 fc rgb \"#00EE00\"",
- "set object 1279 rect from 66.37099999999995, 9.399999999999999 to 67.37099999999995, 9.2 fc rgb \"#00EE00\"",
- "set object 1280 rect from 68.37699999999995, 9.399999999999999 to 70.37999999999994, 9.2 fc rgb \"#00EE00\"",
- "set object 1281 rect from 70.39199999999994, 9.399999999999999 to 71.39199999999994, 9.2 fc rgb \"#00EE00\"",
- "set object 1282 rect from 72.48699999999994, 9.399999999999999 to 73.48699999999994, 9.2 fc rgb \"#00EE00\"",
- "set object 1283 rect from 73.55549999999994, 9.399999999999999 to 75.56249999999994, 9.2 fc rgb \"#00EE00\"",
- "set object 1284 rect from 76.64899999999994, 9.399999999999999 to 77.64899999999994, 9.2 fc rgb \"#00EE00\"",
- "set object 1285 rect from 79.81349999999993, 9.399999999999999 to 80.81349999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1286 rect from 80.83699999999993, 9.399999999999999 to 81.83699999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1287 rect from 81.90449999999993, 9.399999999999999 to 82.90449999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1288 rect from 84.90049999999992, 9.399999999999999 to 86.90099999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1289 rect from 87.97249999999993, 9.399999999999999 to 88.97249999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1290 rect from 92.14499999999992, 9.399999999999999 to 93.14499999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1291 rect from 93.21149999999992, 9.399999999999999 to 94.21149999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1292 rect from 95.31249999999991, 9.399999999999999 to 96.31249999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1293 rect from 96.36399999999992, 9.399999999999999 to 97.36399999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1294 rect from 97.39349999999992, 9.399999999999999 to 98.39349999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1295 rect from 99.48249999999992, 9.399999999999999 to 100.48249999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1296 rect from 100.56199999999993, 9.399999999999999 to 101.56199999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1297 rect from 101.62199999999993, 9.399999999999999 to 102.62199999999993, 9.2 fc rgb \"#00EE00\"",
- "set object 1298 rect from 102.63099999999991, 9.399999999999999 to 103.63099999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1299 rect from 103.67849999999991, 9.399999999999999 to 104.67849999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1300 rect from 104.73949999999991, 9.399999999999999 to 105.73949999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1301 rect from 105.77499999999992, 9.399999999999999 to 106.77499999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1302 rect from 110.93299999999991, 9.399999999999999 to 111.93299999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1303 rect from 112.00149999999991, 9.399999999999999 to 113.9859999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1304 rect from 114.0484999999999, 9.399999999999999 to 115.0484999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1305 rect from 116.14449999999991, 9.399999999999999 to 117.14449999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1306 rect from 117.26799999999992, 9.399999999999999 to 118.26799999999992, 9.2 fc rgb \"#00EE00\"",
- "set object 1307 rect from 118.3064999999999, 9.399999999999999 to 119.3064999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1308 rect from 120.4439999999999, 9.399999999999999 to 121.4439999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1309 rect from 121.46899999999991, 9.399999999999999 to 122.46899999999991, 9.2 fc rgb \"#00EE00\"",
- "set object 1310 rect from 122.52449999999989, 9.399999999999999 to 123.52449999999989, 9.2 fc rgb \"#00EE00\"",
- "set object 1311 rect from 124.6324999999999, 9.399999999999999 to 125.6324999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1312 rect from 125.6929999999999, 9.399999999999999 to 126.6929999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1313 rect from 126.7234999999999, 9.399999999999999 to 127.7234999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1314 rect from 129.8879999999999, 9.399999999999999 to 131.8519999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1315 rect from 133.9804999999999, 9.399999999999999 to 134.9804999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1316 rect from 135.0459999999999, 9.399999999999999 to 136.0459999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1317 rect from 136.08249999999987, 9.399999999999999 to 137.08249999999987, 9.2 fc rgb \"#00EE00\"",
- "set object 1318 rect from 137.1609999999999, 9.399999999999999 to 138.1609999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1319 rect from 139.24899999999988, 9.399999999999999 to 140.24899999999988, 9.2 fc rgb \"#00EE00\"",
- "set object 1320 rect from 140.3004999999999, 9.399999999999999 to 141.3004999999999, 9.2 fc rgb \"#00EE00\"",
- "set object 1321 rect from 84.90049999999992, 9.149999999999999 to 85.90049999999992, 8.95 fc rgb \"#00EE00\"",
- "set object 1322 rect from 94.24599999999992, 9.149999999999999 to 95.24599999999992, 8.95 fc rgb \"#00EE00\"",
- "set object 1323 rect from 95.31249999999991, 9.149999999999999 to 96.31249999999991, 8.95 fc rgb \"#00EE00\"",
- "set object 1324 rect from 97.39349999999992, 9.149999999999999 to 98.39349999999992, 8.95 fc rgb \"#00EE00\"",
- "set object 1325 rect from 99.48249999999992, 9.149999999999999 to 100.48249999999992, 8.95 fc rgb \"#00EE00\"",
- "set object 1326 rect from 100.56199999999993, 9.149999999999999 to 101.56199999999993, 8.95 fc rgb \"#00EE00\"",
- "set object 1327 rect from 103.67849999999991, 9.149999999999999 to 104.67849999999991, 8.95 fc rgb \"#00EE00\"",
- "set object 1328 rect from 105.77499999999992, 9.149999999999999 to 106.77499999999992, 8.95 fc rgb \"#00EE00\"",
- "set object 1329 rect from 114.0484999999999, 9.149999999999999 to 115.0484999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1330 rect from 116.14449999999991, 9.149999999999999 to 117.14449999999991, 8.95 fc rgb \"#00EE00\"",
- "set object 1331 rect from 118.3064999999999, 9.149999999999999 to 119.3064999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1332 rect from 119.3669999999999, 9.149999999999999 to 120.3669999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1333 rect from 124.6324999999999, 9.149999999999999 to 125.6324999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1334 rect from 125.6929999999999, 9.149999999999999 to 126.6929999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1335 rect from 129.8879999999999, 9.149999999999999 to 131.8519999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1336 rect from 135.0459999999999, 9.149999999999999 to 136.0459999999999, 8.95 fc rgb \"#00EE00\"",
- "set object 1337 rect from 136.08249999999987, 9.149999999999999 to 137.08249999999987, 8.95 fc rgb \"#00EE00\"",
- "set object 1338 rect from 139.24899999999988, 9.149999999999999 to 140.24899999999988, 8.95 fc rgb \"#00EE00\"",
- "set object 1339 rect from 78.74099999999993, 10.2 to 79.74099999999993, 9.8 fc rgb \"#FF00FF\"",
- "set object 1340 rect from 93.21149999999992, 10.2 to 94.21149999999992, 9.8 fc rgb \"#FF00FF\"",
- "set object 1341 rect from 112.00149999999991, 10.2 to 113.00149999999991, 9.8 fc rgb \"#FF00FF\"",
- "set object 1342 rect from 80.83699999999993, 10.2 to 81.83699999999993, 9.8 fc rgb \"#AA00AA\"",
- "set object 1343 rect from 57.33799999999997, 10.2 to 58.33799999999997, 9.8 fc rgb \"#4444AA\"",
- "set object 1344 rect from 67.35049999999995, 10.2 to 68.35049999999995, 9.8 fc rgb \"#4444AA\"",
- "set object 1345 rect from 71.44949999999994, 10.2 to 72.44949999999994, 9.8 fc rgb \"#4444AA\"",
- "set object 1346 rect from 138.2054999999999, 10.2 to 139.2054999999999, 9.8 fc rgb \"#4444AA\"",
- "set label \"external \" at 11.092156249999992,11 textcolor rgb \"#3399FF\" font \"Helvetica,9'\"",
- "set label \"runtime \" at 19.763812499999986,11 textcolor rgb \"#000000\" font \"Helvetica,9'\"",
- "set label \"full code\" at 28.435468749999977,11 textcolor rgb \"#DD0000\" font \"Helvetica,9'\"",
- "set label \"opt code \" at 37.10712499999997,11 textcolor rgb \"#00EE00\" font \"Helvetica,9'\"",
- "set label \"code stub\" at 45.77878124999996,11 textcolor rgb \"#FF00FF\" font \"Helvetica,9'\"",
- "set label \"built-in \" at 54.45043749999995,11 textcolor rgb \"#AA00AA\" font \"Helvetica,9'\"",
- "set label \"inl.cache\" at 63.12209374999994,11 textcolor rgb \"#4444AA\" font \"Helvetica,9'\"",
- "set label \"reg.exp. \" at 71.79374999999993,11 textcolor rgb \"#0000FF\" font \"Helvetica,9'\"",
- "set label \"13 ms\" at 42.32008281250001,5.5 font \"Helvetica,7'\"",
- "set label \"1 ms\" at 4.2255828125,1 font \"Helvetica,7'\"",
- "set label \"1 ms\" at 10.8385828125,1 font \"Helvetica,7'\"",
- "set label \"1 ms\" at 7.8065828125,1 font \"Helvetica,7'\"",
- "set label \"1 ms\" at 14.3305828125,1 font \"Helvetica,7'\"",
- "set label \"0 ms\" at 18.204082812499998,1 font \"Helvetica,7'\"",
- "set label \"0 ms\" at 85.27908281249994,1 font \"Helvetica,7'\"",
- "set y2range [0:59.54259090909095]",
- "plot '-' using 1:2 axes x1y2 with impulses ls 1",
- "41.88650000000001 13.935500000000008",
- "3.7920000000000003 1.3375000000000004",
- "10.405000000000001 1.113500000000002",
- "7.373 1.1035000000000004",
- "13.897 1.0205000000000002",
- "17.7705 0.7759999999999998",
- "84.84549999999993 0.75",
- "86.05649999999993 0.6779999999999973",
- "87.36899999999991 0.6134999999999877",
- "131.1209999999999 0.5784999999999911",
- "108.09449999999991 0.5775000000000006",
- "60.65699999999996 0.4855000000000018",
- "23.1135 0.44849999999999923",
- "21.063999999999997 0.4394999999999989",
- "56.198999999999984 0.3990000000000009",
- "63.024999999999956 0.39799999999999613",
- "51.02349999999999 0.39399999999999835",
- "110.4839999999999 0.3930000000000007",
- "54.951999999999984 0.392000000000003",
- "69.49599999999995 0.38750000000000284",
- "62.548999999999964 0.38750000000000284",
- "89.21399999999991 0.3744999999999976",
- "133.4079999999999 0.3645000000000209",
- "61.253999999999955 0.3374999999999986",
- "104.4429999999999 0.30999999999997385",
- "56.52499999999998 0.2734999999999985",
- "63.41299999999995 0.26549999999999585",
- "102.99499999999992 0.2535000000000025",
- "47.3935 0.25250000000000483",
- "58.65749999999996 0.24799999999999756",
- "23.8365 0.2469999999999999",
- "74.63849999999994 0.23149999999998272",
- "16.9595 0.22250000000000014",
- "85.13799999999992 0.22049999999998704",
- "51.78349999999999 0.2085000000000008",
- "64.61749999999995 0.20849999999998658",
- "70.58649999999994 0.1775000000000091",
- "55.66249999999998 0.17649999999999721",
- "57.205999999999975 0.1700000000000017",
- "75.20099999999994 0.1529999999999916",
- "61.464999999999954 0.1524999999999963",
- "18.017000000000003 0.14550000000000196",
- "67.48749999999995 0.14500000000001023",
- "42.05100000000001 0.1385000000000005",
- "25.4055 0.13799999999999812",
- "46.9925 0.1314999999999955",
- "18.1735 0.12750000000000128",
- "109.38599999999991 0.12000000000000455",
- "59.042999999999964 0.1180000000000021",
- "56.97649999999997 0.117999999999995",
- "22.3815 0.11400000000000077",
- "58.07699999999997 0.1039999999999992",
- "23.336000000000002 0.10300000000000153",
- "21.8475 0.10050000000000026",
- "56.845999999999975 0.09949999999999903",
- "46.28150000000001 0.09649999999999892",
- "121.0104999999999 0.09099999999999397",
- "25.507500000000004 0.08800000000000452",
- "52.448999999999984 0.08599999999999852",
- "46.74 0.08499999999999375",
- "57.64849999999997 0.08249999999999602",
- "58.316999999999965 0.08099999999999596",
- "46.37200000000001 0.08050000000000068",
- "23.506 0.08050000000000068",
- "42.70600000000002 0.07900000000000063",
- "129.4124999999999 0.07800000000000296",
- "20.5975 0.07750000000000057",
- "56.634499999999974 0.07749999999999346",
- "19.0685 0.07649999999999935",
- "21.363 0.07549999999999812",
- "49.9695 0.07500000000000284",
- "24.544000000000004 0.07400000000000162",
- "21.727 0.07349999999999923",
- "58.21549999999997 0.07249999999999801",
- "44.917000000000016 0.07200000000000273",
- "25.591500000000003 0.07199999999999918",
- "50.62049999999999 0.07150000000000034",
- "88.82299999999992 0.07099999999999795",
- "46.621 0.07099999999999795",
- "78.23049999999994 0.0660000000000025",
- "46.060500000000005 0.0659999999999954",
- "50.43099999999999 0.06400000000000006",
- "129.48849999999987 0.06349999999997635",
- "45.55900000000001 0.06150000000000233",
- "19.152 0.06050000000000111",
- "57.33299999999997 0.060499999999997556",
- "50.20799999999999 0.060499999999997556",
- "68.76649999999995 0.06049999999999045",
- "23.5775 0.059499999999999886",
- "47.135000000000005 0.05850000000000222",
- "72.28049999999995 0.05849999999999511",
- "45.626500000000014 0.05750000000000455",
- "21.2695 0.057500000000000995",
- "50.14149999999999 0.05749999999999744",
- "91.96649999999993 0.056500000000013983",
- "83.63999999999993 0.05649999999999977",
- "57.934999999999974 0.05649999999999977",
- "132.92249999999987 0.05649999999997135",
- "67.59199999999996 0.056000000000011596",
- "99.92199999999991 0.055499999999995",
- "59.69699999999996 0.055499999999995",
- "45.84850000000001 0.054999999999999716",
- "56.69449999999998 0.05449999999999733",
- "97.26099999999992 0.05350000000001387",
- "112.6564999999999 0.05349999999999966",
- "45.92300000000001 0.05349999999999966",
- "136.19799999999987 0.05349999999998545",
- "47.465 0.05250000000000199",
- "105.93349999999991 0.052499999999994884",
- "65.61699999999995 0.052499999999994884",
- "47.5235 0.051499999999997215",
- "102.61199999999991 0.05149999999999011",
- "138.98049999999986 0.0514999999999759",
- "123.8254999999999 0.050500000000013756",
- "75.46799999999995 0.04950000000000898",
- "45.76150000000001 0.049500000000001876",
- "94.6054999999999 0.04949999999998056",
- "118.19199999999991 0.048500000000004206",
- "115.4124999999999 0.048500000000004206",
- "45.97850000000001 0.048500000000004206",
- "49.780499999999996 0.0484999999999971",
- "42.795000000000016 0.04800000000000182",
- "126.59899999999989 0.04749999999999943",
- "51.56899999999999 0.04650000000000176",
- "80.95049999999993 0.04649999999999466",
- "140.9779999999999 0.04599999999999227",
- "59.93649999999996 0.04549999999999699",
- "46.13100000000001 0.04449999999999932",
- "51.91599999999998 0.04299999999999926",
- "45.70300000000001 0.042499999999996874",
- "49.4955 0.04100000000000392",
- "45.361500000000014 0.04099999999999682",
- "70.35799999999995 0.04050000000000864",
- "49.726 0.040500000000001535",
- "45.08700000000001 0.03999999999999915",
- "45.13500000000002 0.03900000000000858",
- "52.15399999999998 0.0379999999999967",
- "42.88200000000001 0.0379999999999967",
- "24.430500000000002 0.03750000000000142",
- "60.08349999999996 0.036499999999996646",
- "23.907 0.036499999999996646",
- "50.32899999999999 0.036000000000001364",
- "42.31450000000002 0.034000000000006025",
- "45.02900000000001 0.032999999999994145",
- "23.189 0.031500000000001194",
- "21.49 0.03049999999999997",
- "58.12149999999997 0.030000000000001137",
- "45.41750000000002 0.030000000000001137",
- "42.83300000000001 0.030000000000001137",
- "140.89599999999987 0.028999999999996362",
- "2.4490000000000003 0.028500000000000636",
- "52.31499999999998 0.027999999999998693",
- "45.17200000000002 0.027999999999998693",
- "51.30249999999999 0.027000000000001023",
- "49.8685 0.027000000000001023",
- "43.632500000000014 0.027000000000001023",
- "21.175 0.026499999999998636",
- "44.82200000000002 0.026000000000003354",
- "22.528 0.02599999999999625",
- "49.82449999999999 0.02499999999999858",
- "21.1335 0.024499999999999744",
- "21.588 0.021500000000003183",
- "21.525499999999997 0.02049999999999841",
- "23.3945 0.018499999999999517",
- "47.057500000000005 0.018000000000000682",
- "22.570999999999998 0.01799999999999713",
- "24.458 0.017499999999998295",
- "22.4625 0.017499999999998295",
- "141.04699999999988 0.016999999999995907",
- "22.416999999999998 0.016500000000000625",
- "45.44850000000002 0.015999999999998238",
- "21.619500000000002 0.015499999999999403",
- "109.41799999999989 0.015499999999988745",
- "22.486 0.014500000000001734",
- "50.53499999999999 0.013999999999995794",
- "52.338999999999984 0.012000000000000455",
- "45.489500000000014 0.012000000000000455",
- "45.470500000000015 0.00999999999999801",
- "50.007 0.008500000000005059",
- "23.9205 0.008499999999997954",
- "10.43 0.006499999999999062",
- "13.915999999999999 0.005499999999999616",
- "7.3919999999999995 0.005499999999999616",
- "3.8129999999999997 0.005499999999999616",
- "121.0314999999999 0.00549999999999784",
- "78.23649999999994 0.0005000000000023874",
- "e",
- "# start: 2.4204999999999997",
- "# end: 141.1669999999999",
- "# objects: 1547"
-]
diff --git a/deps/v8/test/mjsunit/tools/profviz-test.log b/deps/v8/test/mjsunit/tools/profviz-test.log
deleted file mode 100644
index 720def9d5a..0000000000
--- a/deps/v8/test/mjsunit/tools/profviz-test.log
+++ /dev/null
@@ -1,2613 +0,0 @@
-shared-library,/usr/local/google/home/yangguo/v8/out/ia32.release/d8,0x08048000,0x08557000
-shared-library,2506f000-25070000,0x2506f000,0x25070000
-shared-library,31e60000-31e61000,0x31e60000,0x31e61000
-shared-library,35dff000-35e00000,0x35dff000,0x35e00000
-shared-library,48218000-48219000,0x48218000,0x48219000
-shared-library,4af7d000-4af7e000,0x4af7d000,0x4af7e000
-shared-library,55bf2000-55bf3000,0x55bf2000,0x55bf3000
-shared-library,/lib/i386-linux-gnu/libc-2.15.so,0xf7450000,0xf75f3000
-shared-library,/lib/i386-linux-gnu/libpthread-2.15.so,0xf75f9000,0xf7610000
-shared-library,/lib/i386-linux-gnu/libgcc_s.so.1,0xf7614000,0xf7630000
-shared-library,/lib/i386-linux-gnu/libm-2.15.so,0xf7633000,0xf765d000
-shared-library,/usr/lib/i386-linux-gnu/libstdc++.so.6.0.16,0xf765f000,0xf7737000
-shared-library,[vdso],0xf776d000,0xf776e000
-shared-library,/lib/i386-linux-gnu/ld-2.15.so,0xf776e000,0xf778e000
-profiler,begin,1
-timer-event-start,V8.GCCompactor,2425
-timer-event-start,V8.External,2458
-timer-event-end,V8.External,2468
-timer-event-start,V8.External,3810
-timer-event-end,V8.External,3830
-timer-event-end,V8.GCCompactor,3840
-code-creation,Stub,2,0x2b80a000,484,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80a200,622,CEntryStub
-code-creation,Stub,2,0x2b80a480,540,ArrayNArgumentsConstructorStub
-code-creation,Stub,13,0x2b80a6a0,116,CompareICStub
-code-creation,Stub,2,0x2b80a720,1428,RecordWriteStub
-code-creation,Stub,2,0x2b80acc0,97,StoreBufferOverflowStub
-code-creation,Stub,2,0x2b80ad40,611,RecordWriteStub
-code-creation,Stub,2,0x2b80afc0,76,InterruptStub
-code-creation,Stub,13,0x2b80b020,104,CompareICStub
-code-creation,Stub,2,0x2b80b0a0,130,ArgumentsAccessStub
-code-creation,Stub,2,0x2b80b140,160,FastNewContextStub
-code-creation,Stub,2,0x2b80b1e0,79,StubFailureTrampolineStub
-code-creation,Stub,2,0x2b80b240,704,ArraySingleArgumentConstructorStub
-code-creation,Stub,14,0x2b80b500,93,CompareNilICStub
-code-creation,Stub,2,0x2b80b560,289,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80b6a0,664,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80b940,740,NameDictionaryLookupStub
-code-creation,Stub,13,0x2b80bc40,156,CompareICStub
-code-creation,Stub,2,0x2b80bce0,611,RecordWriteStub
-code-creation,Stub,13,0x2b80bf60,122,CompareICStub
-code-creation,Stub,2,0x2b80bfe0,217,CreateAllocationSiteStub
-code-creation,Stub,2,0x2b80c0c0,1456,RecordWriteStub
-code-creation,Stub,2,0x2b80c680,245,StoreArrayLiteralElementStub
-code-creation,Stub,2,0x2b80c780,1448,RecordWriteStub
-code-creation,Stub,2,0x2b80cd40,1471,StringAddStub
-code-creation,Stub,2,0x2b80d300,1448,RecordWriteStub
-code-creation,Stub,2,0x2b80d8c0,1453,RecordWriteStub
-code-creation,Stub,12,0x2b80de80,146,BinaryOpStub
-code-creation,Stub,2,0x2b80df20,640,InternalArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80e1a0,517,ArrayConstructorStub
-code-creation,Stub,2,0x2b80e3c0,305,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e500,305,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e640,349,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e7a0,349,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e900,289,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80ea40,680,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80ed00,692,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80efc0,704,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80f280,664,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80f520,488,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80f720,540,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80f940,432,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80fb00,432,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80fcc0,1453,RecordWriteStub
-code-creation,Stub,2,0x2b810280,400,InternalArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b810420,611,RecordWriteStub
-code-creation,Stub,2,0x2b8106a0,213,JSEntryStub
-code-creation,Stub,13,0x2b810780,104,CompareICStub
-code-creation,Stub,12,0x2b810800,124,BinaryOpStub
-code-creation,Stub,2,0x2b810880,1447,StringAddStub
-code-creation,Stub,2,0x2b810e40,640,InternalArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b8110c0,400,InternalArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b811260,261,FastCloneShallowArrayStub
-code-creation,Stub,12,0x2b811380,88,BinaryOpStub
-code-creation,Stub,2,0x2b8113e0,76,StackCheckStub
-code-creation,Stub,2,0x2b811440,1437,RecordWriteStub
-code-creation,Stub,2,0x2b8119e0,289,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b811b20,331,CallFunctionStub
-code-creation,Builtin,3,0x2b811c80,174,A builtin from the snapshot
-code-creation,Stub,14,0x2b811d40,124,CompareNilICStub
-code-creation,Stub,2,0x2b811dc0,1420,RecordWriteStub
-code-creation,Stub,13,0x2b812360,104,CompareICStub
-code-creation,Stub,2,0x2b8123e0,76,LoadFieldStub
-code-creation,Stub,13,0x2b812440,104,CompareICStub
-code-creation,Stub,2,0x2b8124c0,195,NumberToStringStub
-code-creation,Stub,15,0x2b8125a0,148,ToBooleanStub
-code-creation,Stub,2,0x2b812640,351,ArgumentsAccessStub
-code-creation,Stub,2,0x2b8127a0,664,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b812a40,1420,RecordWriteStub
-code-creation,Stub,12,0x2b812fe0,133,BinaryOpStub
-code-creation,Stub,2,0x2b813080,1664,StringAddStub
-code-creation,Stub,2,0x2b813700,1661,StringAddStub
-code-creation,Stub,2,0x2b813d80,472,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b813f60,80,StubFailureTrampolineStub
-code-creation,Stub,13,0x2b813fc0,104,CompareICStub
-code-creation,Stub,2,0x2b814040,331,CallFunctionStub
-code-creation,Stub,2,0x2b8141a0,660,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b814440,1433,RecordWriteStub
-code-creation,Stub,12,0x2b8149e0,146,BinaryOpStub
-code-creation,Stub,2,0x2b814a80,271,CallConstructStub
-code-creation,Stub,15,0x2b814ba0,136,ToBooleanStub
-code-creation,Stub,2,0x2b814c40,468,ArrayNArgumentsConstructorStub
-code-creation,Stub,15,0x2b814e20,128,ToBooleanStub
-code-creation,Stub,2,0x2b814ea0,163,FastNewContextStub
-code-creation,Stub,2,0x2b814f60,1425,RecordWriteStub
-code-creation,LoadIC,5,0x2b815500,145,A load IC from the snapshot
-code-creation,Builtin,3,0x2b8155a0,83,A builtin from the snapshot
-code-creation,Stub,12,0x2b815600,88,BinaryOpStub
-code-creation,Stub,2,0x2b815660,1433,RecordWriteStub
-code-creation,Stub,2,0x2b815c00,331,CallFunctionStub
-code-creation,Stub,13,0x2b815d60,104,CompareICStub
-code-creation,Stub,2,0x2b815de0,304,FastNewClosureStub
-code-creation,Stub,2,0x2b815f20,285,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b816040,1433,RecordWriteStub
-code-creation,Stub,2,0x2b8165e0,233,InternalArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b8166e0,740,NameDictionaryLookupStub
-code-creation,Stub,2,0x2b8169e0,740,NameDictionaryLookupStub
-code-creation,Stub,12,0x2b816ce0,88,BinaryOpStub
-code-creation,Stub,2,0x2b816d40,216,StringCompareStub
-code-creation,Stub,15,0x2b816e20,93,ToBooleanStub
-code-creation,Stub,12,0x2b816e80,88,BinaryOpStub
-code-creation,Stub,2,0x2b816ee0,1433,RecordWriteStub
-code-creation,Stub,12,0x2b817480,155,BinaryOpStub
-code-creation,Stub,2,0x2b817520,169,InternalArrayConstructorStub
-code-creation,Stub,2,0x2b8175e0,233,InternalArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b8176e0,1433,RecordWriteStub
-code-creation,Stub,12,0x2b817c80,88,BinaryOpStub
-code-creation,Stub,2,0x2b817ce0,328,KeyedLoadElementStub
-code-creation,Stub,2,0x2b817e40,1461,RecordWriteStub
-code-creation,Stub,2,0x2b818400,98,ToNumberStub
-code-creation,Stub,13,0x2b818480,122,CompareICStub
-code-creation,Stub,12,0x2b818500,124,BinaryOpStub
-code-creation,Stub,2,0x2b818580,148,CallConstructStub
-code-creation,Stub,13,0x2b818620,491,CompareICStub
-code-creation,Stub,2,0x2b818820,213,JSEntryStub
-code-creation,CallIC,7,0x2b818900,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8189c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818a80,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818b40,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818c00,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818cc0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818d80,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818e40,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818f00,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818fc0,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819080,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819140,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819200,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8192c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819380,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819440,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819500,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8195c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819680,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819740,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819800,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8198c0,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819980,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819a40,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819b00,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819bc0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819c80,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819d40,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819e00,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819ec0,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819f80,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a040,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a100,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a1c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a280,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a340,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a400,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a4c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a580,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a640,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a700,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a7c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a880,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a940,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81aa00,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81aac0,180,A call IC from the snapshot
-code-creation,Builtin,3,0x2b81ab80,107,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81ac00,105,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81ac80,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81ace0,432,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81afc0,101,A builtin from the snapshot
-code-creation,LoadIC,5,0x2b81b1a0,83,A load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b81bf00,83,A keyed load IC from the snapshot
-code-creation,StoreIC,9,0x2b81c680,84,A store IC from the snapshot
-code-creation,Builtin,3,0x2b8262e0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826340,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8263a0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826400,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826460,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8264c0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826520,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826580,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8265e0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826640,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8266a0,80,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826700,80,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826760,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8267c0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826820,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826880,75,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8268e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826960,491,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826b60,406,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826d00,157,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826da0,131,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826e40,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826ec0,107,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826f40,143,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826fe0,143,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827080,143,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827120,94,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827180,91,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8271e0,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827240,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8272a0,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827300,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827360,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8273c0,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827420,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827480,84,A builtin from the snapshot
-code-creation,LoadIC,5,0x2b8274e0,83,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b827540,313,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b827680,266,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b8277a0,80,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b827800,83,A load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827860,83,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b8278c0,896,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827c40,499,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827e40,144,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827ee0,216,A keyed load IC from the snapshot
-code-creation,StoreIC,9,0x2b827fc0,365,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828140,293,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828280,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b8282e0,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828340,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b8283a0,84,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828400,365,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828580,293,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b8286c0,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828720,82,A store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b828780,84,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b8287e0,2082,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b829020,84,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b829080,2082,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b8298c0,286,A keyed store IC from the snapshot
-code-creation,Builtin,3,0x2b8299e0,355,A builtin from the snapshot
-code-creation,Builtin,3,0x2b829b60,416,A builtin from the snapshot
-code-creation,Builtin,3,0x2b829d00,376,A builtin from the snapshot
-code-creation,Builtin,3,0x2b829e80,388,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a020,78,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a080,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a0e0,357,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a260,359,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a3e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a460,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a4e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a560,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a5e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a660,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a6e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a760,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a7e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a860,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a8e0,104,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a960,106,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a9e0,110,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82aa60,112,A builtin from the snapshot
-code-creation,LoadIC,5,0x2b82aae0,106,A load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b82ab60,106,A keyed load IC from the snapshot
-code-creation,StoreIC,9,0x2b82abe0,108,A store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b82ac60,108,A keyed store IC from the snapshot
-code-creation,Stub,14,0x2b82ace0,104,CallFunctionStub
-code-creation,Builtin,3,0x2b82ad60,65,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82adc0,93,A builtin from the snapshot
-timer-event-start,V8.GCCompactor,6301
-timer-event-start,V8.External,6312
-timer-event-end,V8.External,6321
-timer-event-start,V8.External,7418
-timer-event-end,V8.External,7436
-timer-event-end,V8.GCCompactor,7446
-code-creation,LazyCompile,3,0x2b81ac80,77,Empty :1,0x4420e5cc,
-code-creation,LazyCompile,0,0x2b81aea0,264, native uri.js:1,0x4420e668,
-code-creation,LazyCompile,0,0x2b81b040,336,SetUpUri native uri.js:442,0x4420f5b4,
-code-creation,LazyCompile,0,0x2b81b200,1880, native messages.js:1,0x4420f670,
-code-creation,LazyCompile,0,0x2b81b960,1429,FormatString native messages.js:187,0x4420f918,
-code-creation,LazyCompile,0,0x2b81bf60,280,MakeGenericError native messages.js:282,0x44211088,
-code-creation,LazyCompile,0,0x2b81c080,264,FormatMessage native messages.js:301,0x4421113c,
-code-creation,LazyCompile,0,0x2b81c1a0,200,MakeRangeError native messages.js:335,0x442112f0,
-code-creation,LazyCompile,0,0x2b81c280,1012,captureStackTrace native messages.js:1123,0x44212280,
-code-creation,LazyCompile,0,0x2b81c6e0,460,SetUpError native messages.js:1173,0x44212410,
-code-creation,LazyCompile,0,0x2b81c8c0,692,SetUpError.a native messages.js:1176,0x442124c0,
-code-creation,LazyCompile,0,0x2b81cb80,164,d native messages.js:1192,0x44212548,
-code-creation,LazyCompile,0,0x2b81cc40,360, native messages.js:1202,0x442125d0,
-code-creation,LazyCompile,0,0x2b81cc40,360,Error,0x44212698,
-code-creation,LazyCompile,0,0x2b81cc40,360,TypeError,0x442126f8,
-code-creation,LazyCompile,0,0x2b81cc40,360,RangeError,0x44212758,
-code-creation,LazyCompile,0,0x2b81cc40,360,SyntaxError,0x442127b8,
-code-creation,LazyCompile,0,0x2b81cc40,360,ReferenceError,0x44212818,
-code-creation,LazyCompile,0,0x2b81cc40,360,EvalError,0x44212878,
-code-creation,LazyCompile,0,0x2b81cc40,360,URIError,0x442128d8,
-code-creation,LazyCompile,0,0x2b81cdc0,424,SetUpStackOverflowBoilerplate native messages.js:1301,0x44212a74,
-code-creation,LazyCompile,0,0x2b81cf80,216, native messages.js:294,0x44214b3c,
-code-creation,LazyCompile,0,0x2b81d060,408, native string.js:1,0x44214c2c,
-code-creation,LazyCompile,0,0x2b81d200,380,StringConstructor native string.js:35,0x44214e2c,
-code-creation,LazyCompile,0,0x2b81d380,1132,SetUpString native string.js:962,0x44216ea8,
-code-creation,LazyCompile,0,0x2b81d800,616, native date.js:1,0x44216fa0,
-code-creation,LazyCompile,0,0x2b81da80,1392,DateConstructor native date.js:141,0x442182bc,
-code-creation,LazyCompile,0,0x2b81e000,1396,SetUpDate native date.js:761,0x44219944,
-code-creation,LazyCompile,0,0x2b81e580,268, native array.js:1,0x44219b20,
-code-creation,LazyCompile,0,0x2b81e6a0,2272,SetUpArray native array.js:1591,0x4421c6ac,
-code-creation,LazyCompile,0,0x2b81ef80,292,SetUpArray.b native array.js:1605,0x4421c814,
-code-creation,LazyCompile,0,0x2b81f0c0,1084, native v8natives.js:1,0x4421c904,
-code-creation,LazyCompile,0,0x2b81f500,561,InstallFunctions native v8natives.js:46,0x4421cc1c,
-code-creation,LazyCompile,0,0x2b81f740,304,InstallGetterSetter native v8natives.js:72,0x4421ea1c,
-code-creation,LazyCompile,0,0x2b81f880,814,SetUpLockedPrototype native v8natives.js:87,0x4421eab4,
-code-creation,LazyCompile,0,0x2b81fbc0,452,SetUpGlobal native v8natives.js:197,0x4421ed3c,
-code-creation,LazyCompile,0,0x2b81fda0,404,hasOwnProperty native v8natives.js:251,0x4421eee4,
-code-creation,LazyCompile,0,0x2b81ff40,308,ObjectConstructor native v8natives.js:1371,0x442200b4,
-code-creation,LazyCompile,0,0x2b820080,1044,SetUpObject native v8natives.js:1385,0x44220140,
-code-creation,LazyCompile,0,0x2b8204a0,292,BooleanConstructor native v8natives.js:1437,0x442201c8,
-code-creation,LazyCompile,0,0x2b8205e0,448,SetUpBoolean native v8natives.js:1472,0x44220314,
-code-creation,LazyCompile,0,0x2b8207a0,336,NumberConstructor native v8natives.js:1491,0x442203ac,
-code-creation,LazyCompile,0,0x2b820900,924,SetUpNumber native v8natives.js:1635,0x4422073c,
-code-creation,LazyCompile,0,0x2b820ca0,440,FunctionConstructor native v8natives.js:1813,0x44220954,
-code-creation,LazyCompile,0,0x2b820e60,380,SetUpFunction native v8natives.js:1826,0x442209f8,
-code-creation,LazyCompile,0,0x2b820fe0,264, native json.js:1,0x44221238,
-code-creation,LazyCompile,0,0x2b821100,260,SetUpJSON native json.js:219,0x44221940,
-code-creation,LazyCompile,0,0x2b821220,340, native math.js:1,0x44221a5c,
-code-creation,LazyCompile,0,0x2b821380,164,MathConstructor native math.js:40,0x44221ba4,
-code-creation,LazyCompile,0,0x2b821440,1112,SetUpMath native math.js:226,0x4422283c,
-code-creation,LazyCompile,0,0x2b8218a0,404, native regexp.js:1,0x442228f8,
-code-creation,LazyCompile,0,0x2b821a40,324,RegExpConstructor native regexp.js:90,0x44223264,
-code-creation,LazyCompile,0,0x2b821ba0,224,RegExpMakeCaptureGetter native regexp.js:360,0x44223784,
-code-creation,LazyCompile,0,0x2b821c80,1561,SetUpRegExp native regexp.js:400,0x44223878,
-code-creation,LazyCompile,0,0x2b8222a0,280, native apinatives.js:1,0x44223b98,
-code-creation,LazyCompile,0,0x2b8223c0,612, native runtime.js:1,0x44223e30,
-code-creation,LazyCompile,0,0x2b822640,1728,EQUALS native runtime.js:54,0x44224078,
-code-creation,LazyCompile,0,0x2b822d00,376,STRICT_EQUALS native runtime.js:108,0x44224c18,
-code-creation,LazyCompile,0,0x2b822e80,924,COMPARE native runtime.js:128,0x44224ca4,
-code-creation,LazyCompile,0,0x2b823220,596,ADD native runtime.js:171,0x44224d44,
-code-creation,LazyCompile,0,0x2b823480,572,STRING_ADD_LEFT native runtime.js:191,0x44224dd8,
-code-creation,LazyCompile,0,0x2b8236c0,580,STRING_ADD_RIGHT native runtime.js:206,0x44224e64,
-code-creation,LazyCompile,0,0x2b823920,296,SUB native runtime.js:222,0x44224ef4,
-code-creation,LazyCompile,0,0x2b823a60,296,MUL native runtime.js:230,0x44224f84,
-code-creation,LazyCompile,0,0x2b823ba0,296,DIV native runtime.js:238,0x44225014,
-code-creation,LazyCompile,0,0x2b823ce0,296,MOD native runtime.js:246,0x442250a4,
-code-creation,LazyCompile,0,0x2b823e20,296,BIT_OR native runtime.js:260,0x44225134,
-code-creation,LazyCompile,0,0x2b823f60,384,BIT_AND native runtime.js:268,0x442251c4,
-code-creation,LazyCompile,0,0x2b8240e0,296,BIT_XOR native runtime.js:290,0x44225254,
-code-creation,LazyCompile,0,0x2b824220,244,UNARY_MINUS native runtime.js:298,0x442252e4,
-code-creation,LazyCompile,0,0x2b824320,244,BIT_NOT native runtime.js:305,0x44225370,
-code-creation,LazyCompile,0,0x2b824420,296,SHL native runtime.js:312,0x442253fc,
-code-creation,LazyCompile,0,0x2b824560,384,SAR native runtime.js:320,0x4422548c,
-code-creation,LazyCompile,0,0x2b8246e0,296,SHR native runtime.js:342,0x4422551c,
-code-creation,LazyCompile,0,0x2b824820,228,DELETE native runtime.js:356,0x442255ac,
-code-creation,LazyCompile,0,0x2b824920,368,IN native runtime.js:362,0x4422563c,
-code-creation,LazyCompile,0,0x2b824aa0,644,INSTANCE_OF native runtime.js:375,0x442256e8,
-code-creation,LazyCompile,0,0x2b824d40,236,FILTER_KEY native runtime.js:406,0x442257b8,
-code-creation,LazyCompile,0,0x2b824e40,380,CALL_NON_FUNCTION native runtime.js:413,0x44225848,
-code-creation,LazyCompile,0,0x2b824fc0,380,CALL_NON_FUNCTION_AS_CONSTRUCTOR native runtime.js:422,0x442258f4,
-code-creation,LazyCompile,0,0x2b825140,288,CALL_FUNCTION_PROXY native runtime.js:431,0x442259a0,
-code-creation,LazyCompile,0,0x2b825260,260,CALL_FUNCTION_PROXY_AS_CONSTRUCTOR native runtime.js:439,0x44225a38,
-code-creation,LazyCompile,0,0x2b825380,912,APPLY_PREPARE native runtime.js:446,0x44225acc,
-code-creation,LazyCompile,0,0x2b825720,232,APPLY_OVERFLOW native runtime.js:484,0x44225b9c,
-code-creation,LazyCompile,0,0x2b825820,188,TO_OBJECT native runtime.js:490,0x44225c38,
-code-creation,LazyCompile,0,0x2b8258e0,188,TO_NUMBER native runtime.js:496,0x44225cc0,
-code-creation,LazyCompile,0,0x2b8259a0,188,TO_STRING native runtime.js:502,0x44225d48,
-code-creation,LazyCompile,0,0x2b825a60,600,ToPrimitive native runtime.js:514,0x44225dd0,
-code-creation,LazyCompile,0,0x2b825cc0,404,ToBoolean native runtime.js:526,0x44225e60,
-code-creation,LazyCompile,0,0x2b825e60,504,ToNumber native runtime.js:536,0x44225eec,
-code-creation,LazyCompile,0,0x2b826060,416,ToString native runtime.js:561,0x44225fd8,
-code-creation,LazyCompile,0,0x2b826200,220,ToName native runtime.js:578,0x442260c4,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227108,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227168,
-code-creation,LazyCompile,3,0x2b8262e0,77,OpaqueReference,0x442271c8,
-code-creation,LazyCompile,3,0x2b8262e0,77,JSON,0x44227228,
-code-creation,LazyCompile,0,0x2b8204a0,292,Boolean,0x44227288,
-code-creation,LazyCompile,3,0x2b82a080,83,Array,0x442272e8,
-code-creation,LazyCompile,3,0x2b826460,77,pop,0x44227348,
-code-creation,LazyCompile,3,0x2b826400,77,push,0x442273a8,
-code-creation,LazyCompile,3,0x2b826640,77,concat,0x44227408,
-code-creation,LazyCompile,3,0x2b8264c0,77,shift,0x44227468,
-code-creation,LazyCompile,3,0x2b826520,77,unshift,0x442274c8,
-code-creation,LazyCompile,3,0x2b826580,77,slice,0x44227528,
-code-creation,LazyCompile,3,0x2b8265e0,77,splice,0x44227588,
-code-creation,LazyCompile,0,0x2b8207a0,336,Number,0x442275e8,
-code-creation,LazyCompile,3,0x2b82a020,78,InternalArray,0x44227648,
-code-creation,LazyCompile,3,0x2b82a020,78,InternalPackedArray,0x442276b4,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227714,
-code-creation,LazyCompile,0,0x2b821a40,324,RegExp,0x44227774,
-code-creation,LazyCompile,0,0x2b81da80,1392,Date,0x442277d4,
-code-creation,LazyCompile,0,0x2b820ca0,440,Function,0x44227834,
-code-creation,LazyCompile,0,0x2b81d200,380,String,0x44227894,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x442278f4,
-code-creation,LazyCompile,0,0x2b81cf80,216,Script,0x44227960,
-code-creation,LazyCompile,0,0x2b81ff40,308,Object,0x44227a00,
-code-creation,LazyCompile,3,0x2b829d00,376,call,0x44227a60,
-code-creation,LazyCompile,3,0x2b829e80,388,apply,0x44227ac0,
-code-creation,LazyCompile,3,0x2b8262e0,77,Arguments,0x44227b20,
-code-creation,LazyCompile,3,0x2b826820,77,ThrowTypeError,0x44227b80,
-code-creation,LazyCompile,3,0x2b826760,77,,0x44227be0,
-code-creation,LazyCompile,3,0x2b8267c0,77,,0x44227c40,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227ca0,
-timer-event-start,V8.GCCompactor,9350
-timer-event-start,V8.External,9362
-timer-event-end,V8.External,9370
-timer-event-start,V8.External,10477
-timer-event-end,V8.External,10500
-timer-event-end,V8.GCCompactor,10511
-code-creation,Stub,2,0x2b80a000,484,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80a200,622,CEntryStub
-code-creation,Stub,2,0x2b80a480,540,ArrayNArgumentsConstructorStub
-code-creation,Stub,13,0x2b80a6a0,116,CompareICStub
-code-creation,Stub,2,0x2b80a720,1428,RecordWriteStub
-code-creation,Stub,2,0x2b80acc0,97,StoreBufferOverflowStub
-code-creation,Stub,2,0x2b80ad40,611,RecordWriteStub
-code-creation,Stub,2,0x2b80afc0,76,InterruptStub
-code-creation,Stub,13,0x2b80b020,104,CompareICStub
-code-creation,Stub,2,0x2b80b0a0,130,ArgumentsAccessStub
-code-creation,Stub,2,0x2b80b140,160,FastNewContextStub
-code-creation,Stub,2,0x2b80b1e0,79,StubFailureTrampolineStub
-code-creation,Stub,2,0x2b80b240,704,ArraySingleArgumentConstructorStub
-code-creation,Stub,14,0x2b80b500,93,CompareNilICStub
-code-creation,Stub,2,0x2b80b560,289,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80b6a0,664,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80b940,740,NameDictionaryLookupStub
-code-creation,Stub,13,0x2b80bc40,156,CompareICStub
-code-creation,Stub,2,0x2b80bce0,611,RecordWriteStub
-code-creation,Stub,13,0x2b80bf60,122,CompareICStub
-code-creation,Stub,2,0x2b80bfe0,217,CreateAllocationSiteStub
-code-creation,Stub,2,0x2b80c0c0,1456,RecordWriteStub
-code-creation,Stub,2,0x2b80c680,245,StoreArrayLiteralElementStub
-code-creation,Stub,2,0x2b80c780,1448,RecordWriteStub
-code-creation,Stub,2,0x2b80cd40,1471,StringAddStub
-code-creation,Stub,2,0x2b80d300,1448,RecordWriteStub
-code-creation,Stub,2,0x2b80d8c0,1453,RecordWriteStub
-code-creation,Stub,12,0x2b80de80,146,BinaryOpStub
-code-creation,Stub,2,0x2b80df20,640,InternalArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80e1a0,517,ArrayConstructorStub
-code-creation,Stub,2,0x2b80e3c0,305,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e500,305,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e640,349,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e7a0,349,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80e900,289,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b80ea40,680,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80ed00,692,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80efc0,704,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80f280,664,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b80f520,488,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80f720,540,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80f940,432,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80fb00,432,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b80fcc0,1453,RecordWriteStub
-code-creation,Stub,2,0x2b810280,400,InternalArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b810420,611,RecordWriteStub
-code-creation,Stub,2,0x2b8106a0,213,JSEntryStub
-code-creation,Stub,13,0x2b810780,104,CompareICStub
-code-creation,Stub,12,0x2b810800,124,BinaryOpStub
-code-creation,Stub,2,0x2b810880,1447,StringAddStub
-code-creation,Stub,2,0x2b810e40,640,InternalArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b8110c0,400,InternalArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b811260,261,FastCloneShallowArrayStub
-code-creation,Stub,12,0x2b811380,88,BinaryOpStub
-code-creation,Stub,2,0x2b8113e0,76,StackCheckStub
-code-creation,Stub,2,0x2b811440,1437,RecordWriteStub
-code-creation,Stub,2,0x2b8119e0,289,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b811b20,331,CallFunctionStub
-code-creation,Builtin,3,0x2b811c80,174,A builtin from the snapshot
-code-creation,Stub,14,0x2b811d40,124,CompareNilICStub
-code-creation,Stub,2,0x2b811dc0,1420,RecordWriteStub
-code-creation,Stub,13,0x2b812360,104,CompareICStub
-code-creation,Stub,2,0x2b8123e0,76,LoadFieldStub
-code-creation,Stub,13,0x2b812440,104,CompareICStub
-code-creation,Stub,2,0x2b8124c0,195,NumberToStringStub
-code-creation,Stub,15,0x2b8125a0,148,ToBooleanStub
-code-creation,Stub,2,0x2b812640,351,ArgumentsAccessStub
-code-creation,Stub,2,0x2b8127a0,664,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b812a40,1420,RecordWriteStub
-code-creation,Stub,12,0x2b812fe0,133,BinaryOpStub
-code-creation,Stub,2,0x2b813080,1664,StringAddStub
-code-creation,Stub,2,0x2b813700,1661,StringAddStub
-code-creation,Stub,2,0x2b813d80,472,ArrayNArgumentsConstructorStub
-code-creation,Stub,2,0x2b813f60,80,StubFailureTrampolineStub
-code-creation,Stub,13,0x2b813fc0,104,CompareICStub
-code-creation,Stub,2,0x2b814040,331,CallFunctionStub
-code-creation,Stub,2,0x2b8141a0,660,ArraySingleArgumentConstructorStub
-code-creation,Stub,2,0x2b814440,1433,RecordWriteStub
-code-creation,Stub,12,0x2b8149e0,146,BinaryOpStub
-code-creation,Stub,2,0x2b814a80,271,CallConstructStub
-code-creation,Stub,15,0x2b814ba0,136,ToBooleanStub
-code-creation,Stub,2,0x2b814c40,468,ArrayNArgumentsConstructorStub
-code-creation,Stub,15,0x2b814e20,128,ToBooleanStub
-code-creation,Stub,2,0x2b814ea0,163,FastNewContextStub
-code-creation,Stub,2,0x2b814f60,1425,RecordWriteStub
-code-creation,LoadIC,5,0x2b815500,145,A load IC from the snapshot
-code-creation,Builtin,3,0x2b8155a0,83,A builtin from the snapshot
-code-creation,Stub,12,0x2b815600,88,BinaryOpStub
-code-creation,Stub,2,0x2b815660,1433,RecordWriteStub
-code-creation,Stub,2,0x2b815c00,331,CallFunctionStub
-code-creation,Stub,13,0x2b815d60,104,CompareICStub
-code-creation,Stub,2,0x2b815de0,304,FastNewClosureStub
-code-creation,Stub,2,0x2b815f20,285,ArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b816040,1433,RecordWriteStub
-code-creation,Stub,2,0x2b8165e0,233,InternalArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b8166e0,740,NameDictionaryLookupStub
-code-creation,Stub,2,0x2b8169e0,740,NameDictionaryLookupStub
-code-creation,Stub,12,0x2b816ce0,88,BinaryOpStub
-code-creation,Stub,2,0x2b816d40,216,StringCompareStub
-code-creation,Stub,15,0x2b816e20,93,ToBooleanStub
-code-creation,Stub,12,0x2b816e80,88,BinaryOpStub
-code-creation,Stub,2,0x2b816ee0,1433,RecordWriteStub
-code-creation,Stub,12,0x2b817480,155,BinaryOpStub
-code-creation,Stub,2,0x2b817520,169,InternalArrayConstructorStub
-code-creation,Stub,2,0x2b8175e0,233,InternalArrayNoArgumentConstructorStub
-code-creation,Stub,2,0x2b8176e0,1433,RecordWriteStub
-code-creation,Stub,12,0x2b817c80,88,BinaryOpStub
-code-creation,Stub,2,0x2b817ce0,328,KeyedLoadElementStub
-code-creation,Stub,2,0x2b817e40,1461,RecordWriteStub
-code-creation,Stub,2,0x2b818400,98,ToNumberStub
-code-creation,Stub,13,0x2b818480,122,CompareICStub
-code-creation,Stub,12,0x2b818500,124,BinaryOpStub
-code-creation,Stub,2,0x2b818580,148,CallConstructStub
-code-creation,Stub,13,0x2b818620,491,CompareICStub
-code-creation,Stub,2,0x2b818820,213,JSEntryStub
-code-creation,CallIC,7,0x2b818900,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8189c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818a80,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818b40,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818c00,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818cc0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818d80,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818e40,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818f00,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b818fc0,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819080,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819140,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819200,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8192c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819380,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819440,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819500,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8195c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819680,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819740,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819800,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b8198c0,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819980,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819a40,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819b00,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819bc0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819c80,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819d40,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819e00,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819ec0,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b819f80,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a040,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a100,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a1c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a280,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a340,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a400,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a4c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a580,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a640,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a700,189,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a7c0,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a880,178,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81a940,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81aa00,180,A call IC from the snapshot
-code-creation,CallIC,7,0x2b81aac0,180,A call IC from the snapshot
-code-creation,Builtin,3,0x2b81ab80,107,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81ac00,105,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81ac80,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81ace0,432,A builtin from the snapshot
-code-creation,Builtin,3,0x2b81afc0,101,A builtin from the snapshot
-code-creation,LoadIC,5,0x2b81b1a0,83,A load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b81bf00,83,A keyed load IC from the snapshot
-code-creation,StoreIC,9,0x2b81c680,84,A store IC from the snapshot
-code-creation,Builtin,3,0x2b8262e0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826340,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8263a0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826400,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826460,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8264c0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826520,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826580,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8265e0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826640,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8266a0,80,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826700,80,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826760,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8267c0,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826820,77,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826880,75,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8268e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826960,491,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826b60,406,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826d00,157,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826da0,131,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826e40,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826ec0,107,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826f40,143,A builtin from the snapshot
-code-creation,Builtin,3,0x2b826fe0,143,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827080,143,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827120,94,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827180,91,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8271e0,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827240,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8272a0,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827300,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827360,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b8273c0,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827420,84,A builtin from the snapshot
-code-creation,Builtin,3,0x2b827480,84,A builtin from the snapshot
-code-creation,LoadIC,5,0x2b8274e0,83,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b827540,313,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b827680,266,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b8277a0,80,A load IC from the snapshot
-code-creation,LoadIC,5,0x2b827800,83,A load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827860,83,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b8278c0,896,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827c40,499,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827e40,144,A keyed load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b827ee0,216,A keyed load IC from the snapshot
-code-creation,StoreIC,9,0x2b827fc0,365,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828140,293,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828280,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b8282e0,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828340,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b8283a0,84,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828400,365,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828580,293,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b8286c0,88,A store IC from the snapshot
-code-creation,StoreIC,9,0x2b828720,82,A store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b828780,84,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b8287e0,2082,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b829020,84,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b829080,2082,A keyed store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b8298c0,286,A keyed store IC from the snapshot
-code-creation,Builtin,3,0x2b8299e0,355,A builtin from the snapshot
-code-creation,Builtin,3,0x2b829b60,416,A builtin from the snapshot
-code-creation,Builtin,3,0x2b829d00,376,A builtin from the snapshot
-code-creation,Builtin,3,0x2b829e80,388,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a020,78,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a080,83,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a0e0,357,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a260,359,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a3e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a460,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a4e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a560,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a5e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a660,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a6e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a760,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a7e0,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a860,101,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a8e0,104,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a960,106,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82a9e0,110,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82aa60,112,A builtin from the snapshot
-code-creation,LoadIC,5,0x2b82aae0,106,A load IC from the snapshot
-code-creation,KeyedLoadIC,6,0x2b82ab60,106,A keyed load IC from the snapshot
-code-creation,StoreIC,9,0x2b82abe0,108,A store IC from the snapshot
-code-creation,KeyedStoreIC,10,0x2b82ac60,108,A keyed store IC from the snapshot
-code-creation,Stub,14,0x2b82ace0,104,CallFunctionStub
-code-creation,Builtin,3,0x2b82ad60,65,A builtin from the snapshot
-code-creation,Builtin,3,0x2b82adc0,93,A builtin from the snapshot
-timer-event-start,V8.GCCompactor,12962
-timer-event-start,V8.External,12972
-timer-event-end,V8.External,12981
-timer-event-start,V8.External,13996
-timer-event-end,V8.External,14014
-timer-event-end,V8.GCCompactor,14024
-code-creation,LazyCompile,3,0x2b81ac80,77,Empty :1,0x4420e5cc,
-code-creation,LazyCompile,0,0x2b81b040,336,SetUpUri native uri.js:442,0x4420f5b4,
-code-creation,LazyCompile,0,0x2b81b960,1429,FormatString native messages.js:187,0x4420f918,
-code-creation,LazyCompile,0,0x2b81bf60,280,MakeGenericError native messages.js:282,0x44211088,
-code-creation,LazyCompile,0,0x2b81c080,264,FormatMessage native messages.js:301,0x4421113c,
-code-creation,LazyCompile,0,0x2b81c1a0,200,MakeRangeError native messages.js:335,0x442112f0,
-code-creation,LazyCompile,0,0x2b81c280,1012,captureStackTrace native messages.js:1123,0x44212280,
-code-creation,LazyCompile,0,0x2b81c6e0,460,SetUpError native messages.js:1173,0x44212410,
-code-creation,LazyCompile,0,0x2b81c8c0,692,SetUpError.a native messages.js:1176,0x442124c0,
-code-creation,LazyCompile,0,0x2b81cb80,164,d native messages.js:1192,0x44212548,
-code-creation,LazyCompile,0,0x2b81cc40,360, native messages.js:1202,0x442125d0,
-code-creation,LazyCompile,0,0x2b81cc40,360,Error,0x44212698,
-code-creation,LazyCompile,0,0x2b81cc40,360,TypeError,0x442126f8,
-code-creation,LazyCompile,0,0x2b81cc40,360,RangeError,0x44212758,
-code-creation,LazyCompile,0,0x2b81cc40,360,SyntaxError,0x442127b8,
-code-creation,LazyCompile,0,0x2b81cc40,360,ReferenceError,0x44212818,
-code-creation,LazyCompile,0,0x2b81cc40,360,EvalError,0x44212878,
-code-creation,LazyCompile,0,0x2b81cc40,360,URIError,0x442128d8,
-code-creation,LazyCompile,0,0x2b81cdc0,424,SetUpStackOverflowBoilerplate native messages.js:1301,0x44212a74,
-code-creation,LazyCompile,0,0x2b81d200,380,StringConstructor native string.js:35,0x44214e2c,
-code-creation,LazyCompile,0,0x2b81d380,1132,SetUpString native string.js:962,0x44216ea8,
-code-creation,LazyCompile,0,0x2b81da80,1392,DateConstructor native date.js:141,0x442182bc,
-code-creation,LazyCompile,0,0x2b81e000,1396,SetUpDate native date.js:761,0x44219944,
-code-creation,LazyCompile,0,0x2b81e6a0,2272,SetUpArray native array.js:1591,0x4421c6ac,
-code-creation,LazyCompile,0,0x2b81f500,561,InstallFunctions native v8natives.js:46,0x4421cc1c,
-code-creation,LazyCompile,0,0x2b81f740,304,InstallGetterSetter native v8natives.js:72,0x4421ea1c,
-code-creation,LazyCompile,0,0x2b81f880,814,SetUpLockedPrototype native v8natives.js:87,0x4421eab4,
-code-creation,LazyCompile,0,0x2b81fbc0,452,SetUpGlobal native v8natives.js:197,0x4421ed3c,
-code-creation,LazyCompile,0,0x2b81fda0,404,hasOwnProperty native v8natives.js:251,0x4421eee4,
-code-creation,LazyCompile,0,0x2b81ff40,308,ObjectConstructor native v8natives.js:1371,0x442200b4,
-code-creation,LazyCompile,0,0x2b820080,1044,SetUpObject native v8natives.js:1385,0x44220140,
-code-creation,LazyCompile,0,0x2b8204a0,292,BooleanConstructor native v8natives.js:1437,0x442201c8,
-code-creation,LazyCompile,0,0x2b8205e0,448,SetUpBoolean native v8natives.js:1472,0x44220314,
-code-creation,LazyCompile,0,0x2b8207a0,336,NumberConstructor native v8natives.js:1491,0x442203ac,
-code-creation,LazyCompile,0,0x2b820900,924,SetUpNumber native v8natives.js:1635,0x4422073c,
-code-creation,LazyCompile,0,0x2b820ca0,440,FunctionConstructor native v8natives.js:1813,0x44220954,
-code-creation,LazyCompile,0,0x2b820e60,380,SetUpFunction native v8natives.js:1826,0x442209f8,
-code-creation,LazyCompile,0,0x2b821100,260,SetUpJSON native json.js:219,0x44221940,
-code-creation,LazyCompile,0,0x2b821380,164,MathConstructor native math.js:40,0x44221ba4,
-code-creation,LazyCompile,0,0x2b821440,1112,SetUpMath native math.js:226,0x4422283c,
-code-creation,LazyCompile,0,0x2b821a40,324,RegExpConstructor native regexp.js:90,0x44223264,
-code-creation,LazyCompile,0,0x2b821ba0,224,RegExpMakeCaptureGetter native regexp.js:360,0x44223784,
-code-creation,LazyCompile,0,0x2b821c80,1561,SetUpRegExp native regexp.js:400,0x44223878,
-code-creation,LazyCompile,0,0x2b822640,1728,EQUALS native runtime.js:54,0x44224078,
-code-creation,LazyCompile,0,0x2b822d00,376,STRICT_EQUALS native runtime.js:108,0x44224c18,
-code-creation,LazyCompile,0,0x2b822e80,924,COMPARE native runtime.js:128,0x44224ca4,
-code-creation,LazyCompile,0,0x2b823220,596,ADD native runtime.js:171,0x44224d44,
-code-creation,LazyCompile,0,0x2b823480,572,STRING_ADD_LEFT native runtime.js:191,0x44224dd8,
-code-creation,LazyCompile,0,0x2b8236c0,580,STRING_ADD_RIGHT native runtime.js:206,0x44224e64,
-code-creation,LazyCompile,0,0x2b823920,296,SUB native runtime.js:222,0x44224ef4,
-code-creation,LazyCompile,0,0x2b823a60,296,MUL native runtime.js:230,0x44224f84,
-code-creation,LazyCompile,0,0x2b823ba0,296,DIV native runtime.js:238,0x44225014,
-code-creation,LazyCompile,0,0x2b823ce0,296,MOD native runtime.js:246,0x442250a4,
-code-creation,LazyCompile,0,0x2b823e20,296,BIT_OR native runtime.js:260,0x44225134,
-code-creation,LazyCompile,0,0x2b823f60,384,BIT_AND native runtime.js:268,0x442251c4,
-code-creation,LazyCompile,0,0x2b8240e0,296,BIT_XOR native runtime.js:290,0x44225254,
-code-creation,LazyCompile,0,0x2b824220,244,UNARY_MINUS native runtime.js:298,0x442252e4,
-code-creation,LazyCompile,0,0x2b824320,244,BIT_NOT native runtime.js:305,0x44225370,
-code-creation,LazyCompile,0,0x2b824420,296,SHL native runtime.js:312,0x442253fc,
-code-creation,LazyCompile,0,0x2b824560,384,SAR native runtime.js:320,0x4422548c,
-code-creation,LazyCompile,0,0x2b8246e0,296,SHR native runtime.js:342,0x4422551c,
-code-creation,LazyCompile,0,0x2b824820,228,DELETE native runtime.js:356,0x442255ac,
-code-creation,LazyCompile,0,0x2b824920,368,IN native runtime.js:362,0x4422563c,
-code-creation,LazyCompile,0,0x2b824aa0,644,INSTANCE_OF native runtime.js:375,0x442256e8,
-code-creation,LazyCompile,0,0x2b824d40,236,FILTER_KEY native runtime.js:406,0x442257b8,
-code-creation,LazyCompile,0,0x2b824e40,380,CALL_NON_FUNCTION native runtime.js:413,0x44225848,
-code-creation,LazyCompile,0,0x2b824fc0,380,CALL_NON_FUNCTION_AS_CONSTRUCTOR native runtime.js:422,0x442258f4,
-code-creation,LazyCompile,0,0x2b825140,288,CALL_FUNCTION_PROXY native runtime.js:431,0x442259a0,
-code-creation,LazyCompile,0,0x2b825260,260,CALL_FUNCTION_PROXY_AS_CONSTRUCTOR native runtime.js:439,0x44225a38,
-code-creation,LazyCompile,0,0x2b825380,912,APPLY_PREPARE native runtime.js:446,0x44225acc,
-code-creation,LazyCompile,0,0x2b825720,232,APPLY_OVERFLOW native runtime.js:484,0x44225b9c,
-code-creation,LazyCompile,0,0x2b825820,188,TO_OBJECT native runtime.js:490,0x44225c38,
-code-creation,LazyCompile,0,0x2b8258e0,188,TO_NUMBER native runtime.js:496,0x44225cc0,
-code-creation,LazyCompile,0,0x2b8259a0,188,TO_STRING native runtime.js:502,0x44225d48,
-code-creation,LazyCompile,0,0x2b825a60,600,ToPrimitive native runtime.js:514,0x44225dd0,
-code-creation,LazyCompile,0,0x2b825cc0,404,ToBoolean native runtime.js:526,0x44225e60,
-code-creation,LazyCompile,0,0x2b825e60,504,ToNumber native runtime.js:536,0x44225eec,
-code-creation,LazyCompile,0,0x2b826060,416,ToString native runtime.js:561,0x44225fd8,
-code-creation,LazyCompile,0,0x2b826200,220,ToName native runtime.js:578,0x442260c4,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227108,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227168,
-code-creation,LazyCompile,3,0x2b8262e0,77,OpaqueReference,0x442271c8,
-code-creation,LazyCompile,3,0x2b8262e0,77,JSON,0x44227228,
-code-creation,LazyCompile,0,0x2b8204a0,292,Boolean,0x44227288,
-code-creation,LazyCompile,3,0x2b82a080,83,Array,0x442272e8,
-code-creation,LazyCompile,3,0x2b826460,77,pop,0x44227348,
-code-creation,LazyCompile,3,0x2b826400,77,push,0x442273a8,
-code-creation,LazyCompile,3,0x2b826640,77,concat,0x44227408,
-code-creation,LazyCompile,3,0x2b8264c0,77,shift,0x44227468,
-code-creation,LazyCompile,3,0x2b826520,77,unshift,0x442274c8,
-code-creation,LazyCompile,3,0x2b826580,77,slice,0x44227528,
-code-creation,LazyCompile,3,0x2b8265e0,77,splice,0x44227588,
-code-creation,LazyCompile,0,0x2b8207a0,336,Number,0x442275e8,
-code-creation,LazyCompile,3,0x2b82a020,78,InternalArray,0x44227648,
-code-creation,LazyCompile,3,0x2b82a020,78,InternalPackedArray,0x442276b4,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227714,
-code-creation,LazyCompile,0,0x2b821a40,324,RegExp,0x44227774,
-code-creation,LazyCompile,0,0x2b81da80,1392,Date,0x442277d4,
-code-creation,LazyCompile,0,0x2b820ca0,440,Function,0x44227834,
-code-creation,LazyCompile,0,0x2b81d200,380,String,0x44227894,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x442278f4,
-code-creation,LazyCompile,0,0x2b81cf80,216,Script,0x44227960,
-code-creation,LazyCompile,0,0x2b81ff40,308,Object,0x44227a00,
-code-creation,LazyCompile,3,0x2b829d00,376,call,0x44227a60,
-code-creation,LazyCompile,3,0x2b829e80,388,apply,0x44227ac0,
-code-creation,LazyCompile,3,0x2b8262e0,77,Arguments,0x44227b20,
-code-creation,LazyCompile,3,0x2b826820,77,ThrowTypeError,0x44227b80,
-code-creation,LazyCompile,3,0x2b826760,77,,0x44227be0,
-code-creation,LazyCompile,3,0x2b8267c0,77,,0x44227c40,
-code-creation,LazyCompile,3,0x2b8262e0,77,,0x44227ca0,
-code-creation,Stub,2,0x2b81ef80,782,CEntryStub
-code-creation,Stub,2,0x2b81f2a0,197,StoreBufferOverflowStub
-code-creation,Stub,2,0x2b81f380,79,StubFailureTrampolineStub
-code-creation,Stub,2,0x2b81f3e0,80,StubFailureTrampolineStub
-tick,0xf776d430,16272,0,0x0,3
-timer-event-start,V8.ParseLazyMicroSeconds,16854
-timer-event-end,V8.ParseLazyMicroSeconds,17081
-timer-event-start,V8.CompileLazy,17098
-timer-event-start,V8.CompileFullCode,17125
-tick,0xf74c79de,17348,0,0xff820034,2
-code-creation,Stub,2,0x2b81b200,246,FastCloneShallowObjectStub
-code-creation,Stub,12,0x2b81b300,88,BinaryOpStub_ADD_Alloc_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b81b360,88,BinaryOpStub_ADD_OverwriteLeft_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,17910
-code-creation,LazyCompile,0,0x2b81b3c0,572,Instantiate native apinatives.js:44,0x44223cdc,~
-timer-event-end,V8.CompileLazy,17948
-code-creation,Stub,13,0x2b81b600,116,CompareICStub
-timer-event-start,V8.ParseLazyMicroSeconds,18020
-timer-event-end,V8.ParseLazyMicroSeconds,18170
-timer-event-start,V8.CompileLazy,18187
-timer-event-start,V8.CompileFullCode,18208
-code-creation,Stub,12,0x2b81b680,88,BinaryOpStub_BIT_AND_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,18340
-code-creation,LazyCompile,0,0x2b82ae20,1008,InstantiateFunction native apinatives.js:65,0x44223d3c,
-timer-event-end,V8.CompileLazy,18396
-tick,0xf776d430,18420,0,0x90d68fc,2,0x2b81b4f0
-code-creation,Stub,2,0x2b82b220,1800,RecordWriteStub
-code-creation,Stub,2,0x2b82b940,236,KeyedStoreElementStub
-code-creation,KeyedStoreIC,10,0x2b82ba40,91,
-code-creation,CallIC,7,0x2b82baa0,129,InstantiateFunction
-code-creation,LoadIC,5,0x2b82bb40,103,kApiFunctionCache
-code-creation,Stub,12,0x2b82bbc0,146,BinaryOpStub_BIT_AND_Alloc_Smi+Smi
-code-creation,Stub,15,0x2b82bc60,132,ToBooleanStub(Smi)
-timer-event-start,V8.ParseLazyMicroSeconds,19172
-timer-event-end,V8.ParseLazyMicroSeconds,19253
-timer-event-start,V8.CompileLazy,19268
-timer-event-start,V8.CompileFullCode,19285
-timer-event-end,V8.CompileFullCode,19350
-code-creation,LazyCompile,0,0x2b82bd00,753,ConfigureTemplateInstance native apinatives.js:105,0x44223d9c,
-timer-event-end,V8.CompileLazy,19384
-tick,0x83c1620,19510,0,0xff81f92c,0,0x2b82b1de,0x2b81b4f0,0x2b81b576,0x2b82b0b8,0x2b81b4f0
-code-creation,Stub,2,0x2b82c000,208,KeyedLoadElementStub
-code-creation,KeyedLoadIC,6,0x2b82c0e0,91,
-code-creation,Stub,15,0x2b82c140,156,ToBooleanStub(Undefined,SpecObject)
-code-creation,KeyedLoadIC,6,0x2b82c1e0,91,
-code-creation,Stub,12,0x2b82c240,146,BinaryOpStub_ADD_Alloc_Smi+Smi
-code-creation,Stub,15,0x2b82c2e0,168,ToBooleanStub(Undefined,String)
-code-creation,CallIC,7,0x2b82c3a0,129,ConfigureTemplateInstance
-code-creation,CallIC,7,0x2b82c440,129,Instantiate
-code-creation,CallIC,7,0x2b82c4e0,144,Instantiate
-code-creation,Stub,13,0x2b82c580,469,CompareICStub
-code-creation,Stub,14,0x2b82c760,144,CompareNilICStub(NullValue)(MonomorphicMap)
-code-creation,Stub,14,0x2b82c800,144,CompareNilICStub(NullValue)(MonomorphicMap)
-tick,0x8132a60,20593,0,0x8141e5e,0,0x2b822c4e,0x2b82af24,0x2b81b4f0,0x2b82beff,0x2b81b59f,0x2b82beff,0x2b81b589,0x2b82b0b8,0x2b81b4f0
-code-creation,Stub,14,0x2b82c8a0,124,CompareNilICStub(NullValue)(Undefined,Null,Undetectable,Generic)
-code-creation,Stub,13,0x2b82c920,156,CompareICStub
-timer-event-start,V8.ParseLazyMicroSeconds,20736
-timer-event-end,V8.ParseLazyMicroSeconds,20818
-timer-event-start,V8.CompileLazy,20838
-timer-event-start,V8.CompileFullCode,20854
-code-creation,Stub,2,0x2b82c9c0,587,FastCloneShallowArrayStub
-timer-event-end,V8.CompileFullCode,21298
-code-creation,LazyCompile,0,0x2b82cc20,812,DefaultNumber native runtime.js:645,0x44226390,~
-timer-event-end,V8.CompileLazy,21330
-timer-event-start,V8.ParseLazyMicroSeconds,21352
-timer-event-end,V8.ParseLazyMicroSeconds,21381
-timer-event-start,V8.CompileLazy,21393
-timer-event-start,V8.CompileFullCode,21405
-timer-event-end,V8.CompileFullCode,21436
-code-creation,LazyCompile,0,0x2b82cf60,184,valueOf native v8natives.js:245,0x4421ee84,~
-timer-event-end,V8.CompileLazy,21465
-timer-event-start,V8.ParseLazyMicroSeconds,21482
-timer-event-end,V8.ParseLazyMicroSeconds,21544
-timer-event-start,V8.CompileLazy,21557
-timer-event-start,V8.CompileFullCode,21571
-timer-event-end,V8.CompileFullCode,21651
-code-creation,LazyCompile,0,0x2b82d020,652,ToObject native runtime.js:584,0x44226150,~
-timer-event-end,V8.CompileLazy,21690
-tick,0x80eabe2,21708,0,0xff81f7a8,2,0x2b82cfe4,0x2b82cd79,0x2b825c84,0x2b822ca7,0x2b82af24,0x2b81b4f0,0x2b82beff,0x2b81b59f,0x2b82beff,0x2b81b589,0x2b82b0b8,0x2b81b4f0
-timer-event-start,V8.ParseLazyMicroSeconds,21761
-timer-event-end,V8.ParseLazyMicroSeconds,21796
-timer-event-start,V8.CompileLazy,21808
-timer-event-start,V8.CompileFullCode,21820
-timer-event-end,V8.CompileFullCode,21845
-code-creation,LazyCompile,0,0x2b82d2c0,220,IsPrimitive native runtime.js:636,0x44226330,~
-timer-event-end,V8.CompileLazy,21873
-timer-event-start,V8.ParseLazyMicroSeconds,21895
-timer-event-end,V8.ParseLazyMicroSeconds,21921
-timer-event-start,V8.CompileLazy,21932
-timer-event-start,V8.CompileFullCode,21946
-timer-event-end,V8.CompileFullCode,21966
-code-creation,LazyCompile,0,0x2b82d3a0,184,toString native v8natives.js:1721,0x44220834,~
-timer-event-end,V8.CompileLazy,21994
-timer-event-start,V8.ParseLazyMicroSeconds,22009
-timer-event-end,V8.ParseLazyMicroSeconds,22087
-timer-event-start,V8.CompileLazy,22101
-timer-event-start,V8.CompileFullCode,22116
-timer-event-end,V8.CompileFullCode,22221
-code-creation,LazyCompile,0,0x2b82d460,681,FunctionSourceString native v8natives.js:1693,0x442207d4,~
-timer-event-end,V8.CompileLazy,22237
-code-creation,Stub,15,0x2b82d720,156,ToBooleanStub(String)
-code-creation,Stub,12,0x2b82d7c0,124,BinaryOpStub_ADD_Alloc_String+String
-code-creation,Stub,12,0x2b82d840,124,BinaryOpStub_ADD_OverwriteLeft_String+String
-code-creation,CallMiss,7,0x2b82d8c0,178,args_count: 2
-code-creation,CallIC,7,0x2b82d980,128,ToPrimitive
-code-creation,CallIC,7,0x2b82da00,128,DefaultNumber
-code-creation,Stub,2,0x2b82da80,116,valueOf
-code-creation,LoadIC,5,0x2b82db00,93,valueOf
-code-creation,CallIC,7,0x2b82db60,129,ToObject
-code-creation,CallIC,7,0x2b82dc00,128,IsPrimitive
-code-creation,Stub,2,0x2b82dc80,98,toString
-code-creation,LoadIC,5,0x2b82dd00,93,toString
-code-creation,CallIC,7,0x2b82dd60,129,FunctionSourceString
-code-creation,CallIC,7,0x2b82de00,128,ToNumber
-timer-event-start,V8.ParseMicroSeconds,22650
-tick,0xf776d430,22726,0,0x0,2
-timer-event-end,V8.ParseMicroSeconds,22773
-timer-event-start,V8.Compile,22785
-timer-event-start,V8.CompileFullCode,22801
-timer-event-end,V8.CompileFullCode,22822
-code-creation,Script,0,0x2b82de80,264,native arraybuffer.js,0x4423ab7c,~
-timer-event-end,V8.Compile,22836
-timer-event-start,V8.ParseLazyMicroSeconds,22859
-timer-event-end,V8.ParseLazyMicroSeconds,22881
-timer-event-start,V8.CompileLazy,22887
-timer-event-start,V8.CompileFullCode,22899
-timer-event-end,V8.CompileFullCode,22918
-code-creation,LazyCompile,0,0x2b82dfa0,480,SetUpArrayBuffer native arraybuffer.js:84,0x4423aac0,~
-timer-event-end,V8.CompileLazy,22934
-timer-event-start,V8.ParseLazyMicroSeconds,22943
-timer-event-end,V8.ParseLazyMicroSeconds,22962
-timer-event-start,V8.CompileLazy,22967
-timer-event-start,V8.CompileFullCode,22972
-timer-event-end,V8.CompileFullCode,22987
-code-creation,LazyCompile,0,0x2b82e180,324,ArrayBufferConstructor native arraybuffer.js:34,0x4423a9a0,~
-timer-event-end,V8.CompileLazy,23000
-code-creation,LazyCompile,0,0x2b82e180,324,ArrayBufferConstructor native arraybuffer.js:34,0x4423a9a0,
-timer-event-start,V8.ParseLazyMicroSeconds,23021
-timer-event-end,V8.ParseLazyMicroSeconds,23037
-timer-event-start,V8.CompileLazy,23042
-timer-event-start,V8.CompileFullCode,23047
-timer-event-end,V8.CompileFullCode,23057
-code-creation,LazyCompile,0,0x2b82e2e0,252,InstallGetter native v8natives.js:63,0x4421e9bc,~
-timer-event-end,V8.CompileLazy,23069
-code-creation,KeyedLoadIC,6,0x2b82e3e0,91,
-code-creation,LoadIC,5,0x2b82e440,93,length
-timer-event-start,V8.ParseMicroSeconds,23160
-timer-event-end,V8.ParseMicroSeconds,23613
-timer-event-start,V8.Compile,23621
-timer-event-start,V8.CompileFullCode,23666
-timer-event-end,V8.CompileFullCode,23702
-code-creation,Script,0,0x2b82e4a0,720,native typedarray.js,0x4423bc04,~
-timer-event-end,V8.Compile,23724
-timer-event-start,V8.ParseLazyMicroSeconds,23755
-tick,0xf776d430,23782,0,0x0,2
-timer-event-end,V8.ParseLazyMicroSeconds,23867
-timer-event-start,V8.CompileLazy,23905
-timer-event-start,V8.CompileFullCode,23916
-timer-event-end,V8.CompileFullCode,23939
-code-creation,LazyCompile,0,0x2b82e780,664,SetupTypedArray native typedarray.js:170,0x4423b238,~
-timer-event-end,V8.CompileLazy,23971
-timer-event-start,V8.ParseLazyMicroSeconds,23979
-timer-event-end,V8.ParseLazyMicroSeconds,24064
-timer-event-start,V8.CompileLazy,24071
-timer-event-start,V8.CompileFullCode,24085
-code-creation,Stub,2,0x2b82ea20,175,FastNewContextStub
-code-creation,Stub,2,0x2b82eae0,304,FastNewClosureStub
-code-creation,Stub,2,0x2b82ec20,1448,RecordWriteStub
-timer-event-end,V8.CompileFullCode,24149
-code-creation,LazyCompile,0,0x2b82f1e0,460,CreateTypedArrayConstructor native typedarray.js:38,0x4423af98,~
-timer-event-end,V8.CompileLazy,24163
-timer-event-start,V8.ParseLazyMicroSeconds,24170
-timer-event-end,V8.ParseLazyMicroSeconds,24198
-timer-event-start,V8.CompileLazy,24203
-timer-event-start,V8.CompileFullCode,24211
-code-creation,Stub,2,0x2b82f3c0,331,CallFunctionStub_Args4_Recording
-code-creation,Stub,2,0x2b82f520,631,FastCloneShallowArrayStub
-code-creation,Stub,2,0x2b82f7a0,245,StoreArrayLiteralElementStub
-timer-event-end,V8.CompileFullCode,24435
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,~
-timer-event-end,V8.CompileLazy,24448
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-timer-event-start,V8.ParseLazyMicroSeconds,24478
-timer-event-end,V8.ParseLazyMicroSeconds,24519
-timer-event-start,V8.CompileLazy,24525
-timer-event-start,V8.CompileFullCode,24533
-timer-event-end,V8.CompileFullCode,24546
-code-creation,LazyCompile,0,0x2b82fbe0,268,CreateSubArray native typedarray.js:121,0x4423b178,~
-timer-event-end,V8.CompileLazy,24559
-code-creation,CallMiss,7,0x2b82fd00,180,args_count: 4
-code-creation,CallIC,7,0x2b82fdc0,129,CreateTypedArrayConstructor
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b82fe60,103,$Object
-code-creation,LoadIC,5,0x2b82fee0,103,TypedArrayGetBuffer
-code-creation,CallMiss,7,0x2b82ff60,180,args_count: 3
-code-creation,CallIC,7,0x2b830020,129,InstallGetter
-code-creation,LoadIC,5,0x2b8300c0,103,TypedArrayGetByteOffset
-code-creation,LoadIC,5,0x2b830140,103,TypedArrayGetByteLength
-code-creation,LoadIC,5,0x2b8301c0,103,TypedArrayGetLength
-code-creation,CallIC,7,0x2b830240,129,CreateSubArray
-code-creation,LoadIC,5,0x2b8302e0,103,TypedArraySet
-code-creation,CallIC,7,0x2b830360,133,$Array
-code-creation,CallIC,7,0x2b830400,129,InstallFunctions
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-tick,0xf7492ece,24846,0,0xff81ff10,0,0x2b82e839,0x2b82e5f9
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-timer-event-start,V8.ParseLazyMicroSeconds,25032
-timer-event-end,V8.ParseLazyMicroSeconds,25074
-timer-event-start,V8.CompileLazy,25081
-timer-event-start,V8.CompileFullCode,25093
-timer-event-end,V8.CompileFullCode,25115
-code-creation,LazyCompile,0,0x2b8304a0,888,SetupDataView native typedarray.js:434,0x4423ba78,~
-timer-event-end,V8.CompileLazy,25128
-timer-event-start,V8.ParseLazyMicroSeconds,25136
-timer-event-end,V8.ParseLazyMicroSeconds,25175
-timer-event-start,V8.CompileLazy,25181
-timer-event-start,V8.CompileFullCode,25188
-code-creation,Stub,12,0x2b830820,88,BinaryOpStub_SUB_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,25228
-code-creation,LazyCompile,0,0x2b830880,908,DataViewConstructor native typedarray.js:209,0x4423b298,~
-timer-event-end,V8.CompileLazy,25241
-code-creation,LazyCompile,0,0x2b830880,908,DataViewConstructor native typedarray.js:209,0x4423b298,
-code-creation,KeyedStorePolymorphicIC,10,0x2b830c20,101,
-code-creation,KeyedStorePolymorphicIC,10,0x2b830c20,101,args_count: 0
-code-creation,CallIC,7,0x2b830ca0,144,Instantiate
-code-creation,CallIC,7,0x2b830d40,129,InstantiateFunction
-code-creation,LoadIC,5,0x2b830de0,103,kApiFunctionCache
-code-creation,KeyedLoadPolymorphicIC,6,0x2b830e60,105,
-code-creation,CallIC,7,0x2b830ee0,129,ConfigureTemplateInstance
-code-creation,CallIC,7,0x2b830f80,129,Instantiate
-code-creation,Stub,2,0x2b831020,116,valueOf
-code-creation,LoadPolymorphicIC,5,0x2b8310a0,105,valueOf
-code-creation,Stub,2,0x2b831120,98,toString
-code-creation,LoadPolymorphicIC,5,0x2b8311a0,105,toString
-code-creation,CallIC,7,0x2b831220,128,ToPrimitive
-code-creation,CallIC,7,0x2b8312a0,128,DefaultNumber
-code-creation,CallIC,7,0x2b831320,129,ToObject
-code-creation,CallIC,7,0x2b8313c0,128,IsPrimitive
-code-creation,CallIC,7,0x2b831440,129,FunctionSourceString
-code-creation,CallIC,7,0x2b8314e0,128,ToNumber
-tick,0xf776d430,25914,0,0x90ec418,0,0x2b82cda7,0x2b825c84,0x2b822ca7,0x2b82af24,0x2b81b4f0,0x2b82beff,0x2b81b59f,0x2b82beff,0x2b81b589,0x2b82b0b8,0x2b81b4f0
-timer-event-start,V8.ParseLazyMicroSeconds,25965
-timer-event-end,V8.ParseLazyMicroSeconds,25985
-timer-event-start,V8.CompileLazy,25991
-timer-event-start,V8.RecompileSynchronous,25996
-code-creation,LazyCompile,0,0x2b831560,184,valueOf native v8natives.js:245,0x4421ee84,~
-timer-event-end,V8.RecompileSynchronous,26121
-code-creation,LazyCompile,1,0x2b831620,180,valueOf native v8natives.js:245,0x4421ee84,*
-timer-event-end,V8.CompileLazy,26138
-timer-event-start,V8.ParseLazyMicroSeconds,26144
-timer-event-end,V8.ParseLazyMicroSeconds,26156
-timer-event-start,V8.CompileLazy,26161
-timer-event-start,V8.RecompileSynchronous,26166
-code-creation,LazyCompile,0,0x2b8316e0,220,IsPrimitive native runtime.js:636,0x44226330,~
-timer-event-end,V8.RecompileSynchronous,26250
-code-creation,LazyCompile,1,0x2b8317c0,170,IsPrimitive native runtime.js:636,0x44226330,*
-timer-event-end,V8.CompileLazy,26266
-timer-event-start,V8.ParseLazyMicroSeconds,26271
-timer-event-end,V8.ParseLazyMicroSeconds,26282
-timer-event-start,V8.CompileLazy,26286
-timer-event-start,V8.RecompileSynchronous,26291
-code-creation,LazyCompile,0,0x2b831880,184,toString native v8natives.js:1721,0x44220834,~
-timer-event-end,V8.RecompileSynchronous,26361
-code-creation,LazyCompile,1,0x2b831940,180,toString native v8natives.js:1721,0x44220834,*
-timer-event-end,V8.CompileLazy,26376
-code-creation,LoadIC,5,0x2b831a00,103,global
-code-creation,LoadIC,5,0x2b831a80,114,ArrayBuffer
-code-creation,CallMiss,7,0x2b831b00,180,args_count: 0
-code-creation,CallIC,7,0x2b831bc0,129,SetUpArrayBuffer
-code-creation,LoadIC,5,0x2b831c60,103,$ArrayBuffer
-code-creation,LoadIC,5,0x2b831ce0,103,ArrayBufferConstructor
-code-creation,LazyCompile,0,0x2b82e180,324,ArrayBufferConstructor native arraybuffer.js:34,0x4423a9a0,
-code-creation,LoadIC,5,0x2b831d60,103,$Object
-code-creation,LoadIC,5,0x2b831de0,103,ArrayBufferGetByteLength
-code-creation,CallIC,7,0x2b831e60,129,InstallGetter
-code-creation,LoadIC,5,0x2b831f00,103,ArrayBufferSlice
-code-creation,CallIC,7,0x2b831f80,133,$Array
-code-creation,CallIC,7,0x2b832020,129,InstallFunctions
-code-creation,LoadPolymorphicIC,5,0x2b8320c0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b832140,105,length
-code-creation,KeyedLoadPolymorphicIC,6,0x2b8321c0,105,
-code-creation,LoadIC,5,0x2b832240,114,Uint8Array
-code-creation,CallIC,7,0x2b8322c0,129,SetupTypedArray
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832360,103,$Object
-code-creation,LoadIC,5,0x2b8323e0,114,Int8Array
-code-creation,CallIC,7,0x2b832460,129,CreateTypedArrayConstructor
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832500,103,TypedArrayGetBuffer
-code-creation,LoadIC,5,0x2b832580,103,TypedArrayGetByteOffset
-code-creation,LoadIC,5,0x2b832600,103,TypedArrayGetByteLength
-code-creation,LoadIC,5,0x2b832680,103,TypedArrayGetLength
-code-creation,CallIC,7,0x2b832700,129,CreateSubArray
-code-creation,LoadIC,5,0x2b8327a0,103,TypedArraySet
-code-creation,CallIC,7,0x2b832820,133,$Array
-code-creation,LoadIC,5,0x2b8328c0,114,Uint16Array
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-tick,0xf776d430,26979,0,0x90ec418,0,0x2b82e9b7,0x2b82e593
-code-creation,LoadIC,5,0x2b832940,114,Int16Array
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b8329c0,114,Uint32Array
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832a40,114,Int32Array
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832ac0,114,Float32Array
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832b40,114,Float64Array
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832bc0,114,Uint8ClampedArray
-code-creation,LazyCompile,0,0x2b82f8a0,824, native typedarray.js:88,0x4423c580,
-code-creation,LoadIC,5,0x2b832c40,114,DataView
-code-creation,CallIC,7,0x2b832cc0,129,SetupDataView
-code-creation,LoadIC,5,0x2b832d60,103,$DataView
-code-creation,LoadIC,5,0x2b832de0,103,DataViewConstructor
-code-creation,LazyCompile,0,0x2b830880,908,DataViewConstructor native typedarray.js:209,0x4423b298,
-code-creation,LoadIC,5,0x2b832e60,103,DataViewGetBuffer
-code-creation,LoadIC,5,0x2b832ee0,103,DataViewGetByteOffset
-code-creation,LoadIC,5,0x2b832f60,103,DataViewGetByteLength
-code-creation,LoadIC,5,0x2b832fe0,103,DataViewGetInt8
-code-creation,LoadIC,5,0x2b833060,103,DataViewSetInt8
-code-creation,LoadIC,5,0x2b8330e0,103,DataViewGetUint8
-code-creation,LoadIC,5,0x2b833160,103,DataViewSetUint8
-code-creation,LoadIC,5,0x2b8331e0,103,DataViewGetInt16
-code-creation,LoadIC,5,0x2b833260,103,DataViewSetInt16
-code-creation,LoadIC,5,0x2b8332e0,103,DataViewGetUint16
-code-creation,LoadIC,5,0x2b833360,103,DataViewSetUint16
-code-creation,LoadIC,5,0x2b8333e0,103,DataViewGetInt32
-code-creation,LoadIC,5,0x2b833460,103,DataViewSetInt32
-code-creation,LoadIC,5,0x2b8334e0,103,DataViewGetUint32
-code-creation,LoadIC,5,0x2b833560,103,DataViewSetUint32
-code-creation,LoadIC,5,0x2b8335e0,103,DataViewGetFloat32
-code-creation,LoadIC,5,0x2b833660,103,DataViewSetFloat32
-code-creation,LoadIC,5,0x2b8336e0,103,DataViewGetFloat64
-code-creation,LoadIC,5,0x2b833760,103,DataViewSetFloat64
-code-creation,CallMiss,7,0x2b8337e0,189,args_count: 32
-code-creation,CallIC,7,0x2b8338a0,136,$Array
-code-creation,LoadIC,5,0x2b833940,93,length
-timer-event-start,V8.ParseMicroSeconds,28734
-timer-event-start,V8.PreParseMicroSeconds,28760
-timer-event-end,V8.PreParseMicroSeconds,28785
-timer-event-start,V8.PreParseMicroSeconds,28796
-timer-event-end,V8.PreParseMicroSeconds,28803
-timer-event-start,V8.PreParseMicroSeconds,28810
-timer-event-end,V8.PreParseMicroSeconds,28817
-timer-event-start,V8.PreParseMicroSeconds,28828
-timer-event-end,V8.PreParseMicroSeconds,28862
-timer-event-start,V8.PreParseMicroSeconds,28872
-timer-event-end,V8.PreParseMicroSeconds,28878
-timer-event-start,V8.PreParseMicroSeconds,28884
-timer-event-end,V8.PreParseMicroSeconds,28890
-timer-event-start,V8.PreParseMicroSeconds,28905
-timer-event-end,V8.PreParseMicroSeconds,28931
-timer-event-start,V8.PreParseMicroSeconds,28938
-timer-event-end,V8.PreParseMicroSeconds,28970
-timer-event-start,V8.PreParseMicroSeconds,28980
-timer-event-end,V8.PreParseMicroSeconds,28989
-timer-event-start,V8.PreParseMicroSeconds,28995
-timer-event-end,V8.PreParseMicroSeconds,29005
-timer-event-start,V8.PreParseMicroSeconds,29012
-timer-event-end,V8.PreParseMicroSeconds,29019
-timer-event-start,V8.PreParseMicroSeconds,29026
-timer-event-end,V8.PreParseMicroSeconds,29045
-timer-event-start,V8.PreParseMicroSeconds,29052
-timer-event-end,V8.PreParseMicroSeconds,29059
-timer-event-start,V8.PreParseMicroSeconds,29066
-timer-event-end,V8.PreParseMicroSeconds,29072
-timer-event-start,V8.PreParseMicroSeconds,29078
-timer-event-end,V8.PreParseMicroSeconds,29087
-tick,0xf776d430,29099,0,0x0,2
-timer-event-start,V8.PreParseMicroSeconds,29187
-timer-event-end,V8.PreParseMicroSeconds,29241
-timer-event-start,V8.PreParseMicroSeconds,29253
-timer-event-end,V8.PreParseMicroSeconds,29261
-timer-event-start,V8.PreParseMicroSeconds,29274
-timer-event-end,V8.PreParseMicroSeconds,29286
-timer-event-start,V8.PreParseMicroSeconds,29293
-timer-event-end,V8.PreParseMicroSeconds,29305
-timer-event-start,V8.PreParseMicroSeconds,29314
-timer-event-end,V8.PreParseMicroSeconds,29324
-timer-event-start,V8.PreParseMicroSeconds,29331
-timer-event-end,V8.PreParseMicroSeconds,29344
-timer-event-start,V8.PreParseMicroSeconds,29355
-timer-event-end,V8.PreParseMicroSeconds,29369
-timer-event-start,V8.PreParseMicroSeconds,29375
-timer-event-end,V8.PreParseMicroSeconds,29391
-timer-event-start,V8.PreParseMicroSeconds,29400
-timer-event-end,V8.PreParseMicroSeconds,29408
-timer-event-start,V8.PreParseMicroSeconds,29416
-timer-event-end,V8.PreParseMicroSeconds,29422
-timer-event-start,V8.PreParseMicroSeconds,29435
-timer-event-end,V8.PreParseMicroSeconds,29442
-timer-event-start,V8.PreParseMicroSeconds,29448
-timer-event-end,V8.PreParseMicroSeconds,29461
-timer-event-start,V8.PreParseMicroSeconds,29467
-timer-event-end,V8.PreParseMicroSeconds,29480
-timer-event-start,V8.PreParseMicroSeconds,29489
-timer-event-end,V8.PreParseMicroSeconds,29508
-timer-event-start,V8.PreParseMicroSeconds,29516
-timer-event-end,V8.PreParseMicroSeconds,29547
-timer-event-start,V8.PreParseMicroSeconds,29561
-timer-event-end,V8.PreParseMicroSeconds,29579
-timer-event-start,V8.PreParseMicroSeconds,29587
-timer-event-end,V8.PreParseMicroSeconds,29605
-timer-event-start,V8.PreParseMicroSeconds,29613
-timer-event-end,V8.PreParseMicroSeconds,29639
-timer-event-start,V8.PreParseMicroSeconds,29646
-timer-event-end,V8.PreParseMicroSeconds,29667
-timer-event-start,V8.PreParseMicroSeconds,29677
-timer-event-end,V8.PreParseMicroSeconds,29702
-timer-event-start,V8.PreParseMicroSeconds,29709
-timer-event-end,V8.PreParseMicroSeconds,29735
-timer-event-start,V8.PreParseMicroSeconds,29741
-timer-event-end,V8.PreParseMicroSeconds,29758
-timer-event-start,V8.PreParseMicroSeconds,29764
-timer-event-end,V8.PreParseMicroSeconds,29773
-timer-event-start,V8.PreParseMicroSeconds,29781
-timer-event-end,V8.PreParseMicroSeconds,29796
-timer-event-start,V8.PreParseMicroSeconds,29805
-timer-event-end,V8.PreParseMicroSeconds,29813
-timer-event-start,V8.PreParseMicroSeconds,29821
-timer-event-end,V8.PreParseMicroSeconds,29839
-timer-event-start,V8.PreParseMicroSeconds,29847
-timer-event-end,V8.PreParseMicroSeconds,29861
-timer-event-start,V8.PreParseMicroSeconds,29868
-timer-event-end,V8.PreParseMicroSeconds,29873
-timer-event-start,V8.PreParseMicroSeconds,29880
-timer-event-end,V8.PreParseMicroSeconds,29908
-timer-event-start,V8.PreParseMicroSeconds,29914
-timer-event-end,V8.PreParseMicroSeconds,29923
-timer-event-start,V8.PreParseMicroSeconds,29930
-timer-event-end,V8.PreParseMicroSeconds,29937
-timer-event-start,V8.PreParseMicroSeconds,29944
-timer-event-end,V8.PreParseMicroSeconds,29955
-timer-event-start,V8.PreParseMicroSeconds,29960
-timer-event-end,V8.PreParseMicroSeconds,29970
-timer-event-start,V8.PreParseMicroSeconds,29977
-timer-event-end,V8.PreParseMicroSeconds,29982
-timer-event-start,V8.PreParseMicroSeconds,29989
-timer-event-end,V8.PreParseMicroSeconds,29999
-timer-event-start,V8.PreParseMicroSeconds,30031
-timer-event-end,V8.PreParseMicroSeconds,30041
-timer-event-start,V8.PreParseMicroSeconds,30047
-timer-event-end,V8.PreParseMicroSeconds,30054
-timer-event-start,V8.PreParseMicroSeconds,30060
-timer-event-end,V8.PreParseMicroSeconds,30069
-timer-event-start,V8.PreParseMicroSeconds,30080
-timer-event-end,V8.PreParseMicroSeconds,30106
-timer-event-start,V8.PreParseMicroSeconds,30113
-timer-event-end,V8.PreParseMicroSeconds,30121
-timer-event-start,V8.PreParseMicroSeconds,30127
-timer-event-end,V8.PreParseMicroSeconds,30133
-timer-event-start,V8.PreParseMicroSeconds,30139
-timer-event-end,V8.PreParseMicroSeconds,30148
-tick,0x825e06c,30162,0,0x0,2
-timer-event-start,V8.PreParseMicroSeconds,30217
-timer-event-end,V8.PreParseMicroSeconds,30285
-timer-event-start,V8.PreParseMicroSeconds,30293
-timer-event-end,V8.PreParseMicroSeconds,30319
-timer-event-start,V8.PreParseMicroSeconds,30326
-timer-event-end,V8.PreParseMicroSeconds,30344
-timer-event-start,V8.PreParseMicroSeconds,30350
-timer-event-end,V8.PreParseMicroSeconds,30367
-timer-event-start,V8.PreParseMicroSeconds,30374
-timer-event-end,V8.PreParseMicroSeconds,30385
-timer-event-start,V8.PreParseMicroSeconds,30392
-timer-event-end,V8.PreParseMicroSeconds,30400
-timer-event-start,V8.PreParseMicroSeconds,30407
-timer-event-end,V8.PreParseMicroSeconds,30415
-timer-event-start,V8.PreParseMicroSeconds,30429
-timer-event-end,V8.PreParseMicroSeconds,30446
-timer-event-start,V8.PreParseMicroSeconds,30456
-timer-event-end,V8.PreParseMicroSeconds,30461
-timer-event-start,V8.PreParseMicroSeconds,30469
-timer-event-end,V8.PreParseMicroSeconds,30480
-timer-event-start,V8.PreParseMicroSeconds,30488
-timer-event-end,V8.PreParseMicroSeconds,30497
-timer-event-start,V8.PreParseMicroSeconds,30503
-timer-event-end,V8.PreParseMicroSeconds,30511
-timer-event-start,V8.PreParseMicroSeconds,30517
-timer-event-end,V8.PreParseMicroSeconds,30528
-timer-event-start,V8.PreParseMicroSeconds,30535
-timer-event-end,V8.PreParseMicroSeconds,30539
-timer-event-start,V8.PreParseMicroSeconds,30546
-timer-event-end,V8.PreParseMicroSeconds,30550
-timer-event-start,V8.PreParseMicroSeconds,30568
-timer-event-end,V8.PreParseMicroSeconds,30577
-timer-event-start,V8.PreParseMicroSeconds,30586
-timer-event-end,V8.PreParseMicroSeconds,30591
-timer-event-start,V8.PreParseMicroSeconds,30600
-timer-event-end,V8.PreParseMicroSeconds,30610
-timer-event-start,V8.PreParseMicroSeconds,30616
-timer-event-end,V8.PreParseMicroSeconds,30621
-timer-event-start,V8.PreParseMicroSeconds,30630
-timer-event-end,V8.PreParseMicroSeconds,30638
-timer-event-start,V8.PreParseMicroSeconds,30649
-timer-event-end,V8.PreParseMicroSeconds,30665
-timer-event-start,V8.PreParseMicroSeconds,30672
-timer-event-end,V8.PreParseMicroSeconds,30682
-timer-event-start,V8.PreParseMicroSeconds,30692
-timer-event-end,V8.PreParseMicroSeconds,30706
-timer-event-start,V8.PreParseMicroSeconds,30719
-timer-event-end,V8.PreParseMicroSeconds,30730
-timer-event-start,V8.PreParseMicroSeconds,30737
-timer-event-end,V8.PreParseMicroSeconds,30749
-tick,0x82b07f6,31208,0,0x0,2
-tick,0x824d3ad,32274,0,0x0,2
-tick,0x82b07c6,33327,0,0x0,2
-tick,0x82b0804,34401,0,0x0,2
-tick,0x81fc62c,35474,0,0x0,2
-tick,0x81fc62c,36534,0,0x0,2
-tick,0x824e954,37593,0,0x0,2
-tick,0x82b07f3,38662,0,0x0,2
-tick,0x81fc625,39722,0,0x0,2
-tick,0x81fc61e,40783,0,0x0,2
-tick,0x821c1a1,41846,0,0x0,2
-tick,0x81fc62c,42913,0,0x0,2
-timer-event-start,V8.PreParseMicroSeconds,43415
-timer-event-end,V8.PreParseMicroSeconds,43428
-timer-event-start,V8.PreParseMicroSeconds,43446
-timer-event-end,V8.PreParseMicroSeconds,43481
-timer-event-end,V8.ParseMicroSeconds,43493
-timer-event-start,V8.Compile,43498
-timer-event-start,V8.CompileFullCode,43528
-timer-event-end,V8.CompileFullCode,43671
-code-creation,Script,0,0x2b8339a0,6060,bsuite/kraken-once/stanford-crypto-ccm.js,0x2f33b684,~
-timer-event-end,V8.Compile,43688
-timer-event-start,V8.Execute,43739
-timer-event-start,V8.ParseLazyMicroSeconds,43914
-timer-event-end,V8.ParseLazyMicroSeconds,43936
-timer-event-start,V8.CompileLazy,43942
-timer-event-start,V8.CompileFullCode,43947
-timer-event-end,V8.CompileFullCode,43966
-tick,0x820b498,43978,0,0x0,0,0x2b83464f
-code-creation,LazyCompile,0,0x2b835160,372,sjcl.hash.sha256 bsuite/kraken-once/stanford-crypto-ccm.js:15,0x2f339fb0,~
-timer-event-end,V8.CompileLazy,44194
-code-creation,Stub,2,0x2b8352e0,188,KeyedLoadElementStub
-code-creation,KeyedLoadIC,6,0x2b8353a0,91,
-code-creation,CallPreMonomorphic,7,0x2b835400,178,args_count: 0
-timer-event-start,V8.ParseLazyMicroSeconds,44292
-timer-event-end,V8.ParseLazyMicroSeconds,44326
-timer-event-start,V8.CompileLazy,44333
-timer-event-start,V8.CompileFullCode,44340
-code-creation,Stub,12,0x2b8354c0,88,BinaryOpStub_MOD_Alloc_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b835520,88,BinaryOpStub_MUL_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,44389
-code-creation,LazyCompile,0,0x2b835580,906,sjcl.hash.sha256.w bsuite/kraken-once/stanford-crypto-ccm.js:17,0x2f33a190,~
-timer-event-end,V8.CompileLazy,44407
-code-creation,Stub,12,0x2b835920,167,BinaryOpStub_MUL_Alloc_Smi+Smi
-code-creation,Stub,13,0x2b8359e0,122,CompareICStub
-timer-event-start,V8.ParseLazyMicroSeconds,44439
-timer-event-end,V8.ParseLazyMicroSeconds,44460
-timer-event-start,V8.CompileLazy,44465
-timer-event-start,V8.CompileFullCode,44471
-code-creation,Stub,2,0x2b835a60,501,MathPowStub
-timer-event-end,V8.CompileFullCode,44505
-code-creation,LazyCompile,0,0x2b835c60,304,pow native math.js:181,0x4422259c,~
-timer-event-end,V8.CompileLazy,44517
-timer-event-start,V8.ParseLazyMicroSeconds,44522
-timer-event-end,V8.ParseLazyMicroSeconds,44534
-timer-event-start,V8.CompileLazy,44539
-timer-event-start,V8.CompileFullCode,44545
-code-creation,Stub,12,0x2b835da0,88,BinaryOpStub_MUL_OverwriteLeft_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b835e00,88,BinaryOpStub_BIT_OR_OverwriteLeft_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,44570
-code-creation,LazyCompile,0,0x2b835e60,228,a bsuite/kraken-once/stanford-crypto-ccm.js:17,0x2f33d150,~
-timer-event-end,V8.CompileLazy,44582
-timer-event-start,V8.ParseLazyMicroSeconds,44590
-timer-event-end,V8.ParseLazyMicroSeconds,44609
-timer-event-start,V8.CompileLazy,44614
-timer-event-start,V8.CompileFullCode,44619
-code-creation,Stub,12,0x2b835f60,88,BinaryOpStub_SHR_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,44646
-code-creation,LazyCompile,0,0x2b835fc0,344,floor native math.js:99,0x4422241c,~
-timer-event-end,V8.CompileLazy,44657
-code-creation,Stub,13,0x2b836120,404,CompareICStub
-code-creation,Stub,13,0x2b8362c0,232,CompareICStub
-code-creation,Stub,13,0x2b8363c0,404,CompareICStub
-code-creation,Stub,13,0x2b836560,240,CompareICStub
-code-creation,Stub,12,0x2b836660,349,BinaryOpStub_SHR_Alloc_Number+Smi
-code-creation,Stub,12,0x2b8367c0,246,BinaryOpStub_SUB_Alloc_Number+Smi
-code-creation,Stub,12,0x2b8368c0,245,BinaryOpStub_MUL_OverwriteLeft_Number+Number
-code-creation,Stub,12,0x2b8369c0,407,BinaryOpStub_BIT_OR_OverwriteLeft_Number+Smi
-code-creation,Stub,2,0x2b836b60,1808,RecordWriteStub
-code-creation,Stub,2,0x2b837280,606,KeyedStoreElementStub
-code-creation,KeyedStoreIC,10,0x2b8374e0,91,
-tick,0x31e6020f,45036,0,0x2b836b61,0,0x2b8357c1,0x2b835208,0x2b83464f
-code-creation,LoadIC,5,0x2b837540,114,Math
-code-creation,CallIC,7,0x2b8375c0,289,floor
-code-creation,Stub,2,0x2b837700,80,LoadFieldStub
-code-creation,Stub,2,0x2b837760,95,N
-code-creation,LoadIC,5,0x2b8377c0,93,N
-code-creation,CallIC,7,0x2b837820,113,pow
-code-creation,Stub,2,0x2b8378a0,80,LoadFieldStub
-code-creation,Stub,2,0x2b837900,95,a
-code-creation,LoadIC,5,0x2b837960,93,a
-code-creation,Stub,12,0x2b8379c0,190,BinaryOpStub_MOD_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b837a80,181,BinaryOpStub_MOD_Alloc_Smi+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,45383
-timer-event-end,V8.ParseLazyMicroSeconds,45402
-timer-event-start,V8.CompileLazy,45408
-timer-event-start,V8.CompileFullCode,45413
-timer-event-end,V8.CompileFullCode,45428
-code-creation,LazyCompile,0,0x2b837b40,264,sjcl.hash.sha256.reset bsuite/kraken-once/stanford-crypto-ccm.js:16,0x2f33a070,~
-timer-event-end,V8.CompileLazy,45442
-code-creation,StoreIC,9,0x2b837c60,138,codec
-code-creation,StoreIC,9,0x2b837d00,141,hex
-tick,0x8294f6f,46096,0,0xff820124,0,0x2b834ff0
-code-creation,StoreIC,9,0x2b837da0,171,ccm
-timer-event-start,V8.ParseLazyMicroSeconds,46605
-timer-event-end,V8.ParseLazyMicroSeconds,46625
-timer-event-start,V8.CompileLazy,46630
-timer-event-start,V8.CompileFullCode,46635
-timer-event-end,V8.CompileFullCode,46649
-code-creation,LazyCompile,0,0x2b837e60,300,sjcl.test.TestCase bsuite/kraken-once/stanford-crypto-ccm.js:99,0x2f33b210,~
-timer-event-end,V8.CompileLazy,46663
-timer-event-start,V8.ParseLazyMicroSeconds,46681
-timer-event-end,V8.ParseLazyMicroSeconds,46712
-timer-event-start,V8.CompileLazy,46718
-timer-event-start,V8.CompileFullCode,46725
-code-creation,CallInitialize,7,0x2b837fa0,178,args_count: 4
-timer-event-end,V8.CompileFullCode,46771
-code-creation,LazyCompile,0,0x2b838060,953,sjcl.test.run bsuite/kraken-once/stanford-crypto-ccm.js:180,0x2f33b4b0,~
-timer-event-end,V8.CompileLazy,46788
-code-creation,Stub,13,0x2b838420,485,CompareICStub
-code-creation,CallIC,7,0x2b838620,128,ToString
-code-creation,CallPreMonomorphic,7,0x2b8386a0,178,args_count: 4
-timer-event-start,V8.ParseLazyMicroSeconds,46859
-timer-event-end,V8.ParseLazyMicroSeconds,46876
-timer-event-start,V8.CompileLazy,46881
-timer-event-start,V8.CompileFullCode,46888
-code-creation,CallInitialize,7,0x2b838760,178,args_count: 5
-timer-event-end,V8.CompileFullCode,46910
-code-creation,LazyCompile,0,0x2b838820,320,browserUtil.cpsMap bsuite/kraken-once/stanford-crypto-ccm.js:63,0x2f33b030,~
-timer-event-end,V8.CompileLazy,46922
-code-creation,CallPreMonomorphic,7,0x2b838960,178,args_count: 5
-timer-event-start,V8.ParseLazyMicroSeconds,46937
-timer-event-end,V8.ParseLazyMicroSeconds,46959
-timer-event-start,V8.CompileLazy,46965
-timer-event-start,V8.CompileFullCode,46972
-code-creation,Stub,2,0x2b838a20,172,FastNewContextStub
-timer-event-end,V8.CompileFullCode,46995
-code-creation,LazyCompile,0,0x2b838ae0,420,browserUtil.cpsIterate bsuite/kraken-once/stanford-crypto-ccm.js:49,0x2f33afd0,~
-timer-event-end,V8.CompileLazy,47008
-timer-event-start,V8.ParseLazyMicroSeconds,47013
-timer-event-end,V8.ParseLazyMicroSeconds,47029
-timer-event-start,V8.CompileLazy,47034
-timer-event-start,V8.CompileFullCode,47041
-code-creation,Stub,2,0x2b838ca0,328,CallFunctionStub_Args0_Recording
-timer-event-end,V8.CompileFullCode,47070
-code-creation,LazyCompile,0,0x2b838e00,372,go bsuite/kraken-once/stanford-crypto-ccm.js:50,0x2f33da7c,~
-timer-event-end,V8.CompileLazy,47082
-timer-event-start,V8.ParseLazyMicroSeconds,47088
-timer-event-end,V8.ParseLazyMicroSeconds,47110
-timer-event-start,V8.CompileLazy,47115
-timer-event-start,V8.CompileFullCode,47121
-timer-event-end,V8.CompileFullCode,47134
-code-creation,LazyCompile,0,0x2b838f80,236, bsuite/kraken-once/stanford-crypto-ccm.js:64,0x2f33d9d4,~
-timer-event-end,V8.CompileLazy,47146
-tick,0xf776d430,47160,0,0x90ec418,2,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,KeyedLoadIC,6,0x2b839080,91,
-timer-event-start,V8.ParseLazyMicroSeconds,47296
-timer-event-end,V8.ParseLazyMicroSeconds,47317
-timer-event-start,V8.CompileLazy,47323
-timer-event-start,V8.CompileFullCode,47329
-code-creation,CallInitialize,7,0x2b8390e0,178,args_count: 3
-timer-event-end,V8.CompileFullCode,47355
-code-creation,LazyCompile,0,0x2b8391a0,260, bsuite/kraken-once/stanford-crypto-ccm.js:192,0x2f33d920,~
-timer-event-end,V8.CompileLazy,47368
-code-creation,CallPreMonomorphic,7,0x2b8392c0,178,args_count: 3
-timer-event-start,V8.ParseLazyMicroSeconds,47390
-timer-event-end,V8.ParseLazyMicroSeconds,47409
-timer-event-start,V8.CompileLazy,47415
-timer-event-start,V8.CompileFullCode,47421
-timer-event-end,V8.CompileFullCode,47438
-code-creation,LazyCompile,0,0x2b839380,344,sjcl.test.TestCase.run bsuite/kraken-once/stanford-crypto-ccm.js:168,0x2f33b450,~
-timer-event-end,V8.CompileLazy,47452
-timer-event-start,V8.ParseLazyMicroSeconds,47462
-timer-event-end,V8.ParseLazyMicroSeconds,47476
-timer-event-start,V8.CompileLazy,47481
-timer-event-start,V8.CompileFullCode,47485
-timer-event-end,V8.CompileFullCode,47496
-code-creation,LazyCompile,0,0x2b8394e0,208,valueOf native date.js:361,0x44218984,~
-timer-event-end,V8.CompileLazy,47507
-timer-event-start,V8.ParseLazyMicroSeconds,47517
-timer-event-end,V8.ParseLazyMicroSeconds,47526
-timer-event-start,V8.CompileLazy,47531
-timer-event-start,V8.CompileFullCode,47536
-timer-event-end,V8.CompileFullCode,47545
-code-creation,LazyCompile,0,0x2b8395c0,192,browserUtil.pauseAndThen bsuite/kraken-once/stanford-crypto-ccm.js:47,0x2f33af70,~
-timer-event-end,V8.CompileLazy,47557
-timer-event-start,V8.ParseLazyMicroSeconds,47561
-timer-event-end,V8.ParseLazyMicroSeconds,47571
-timer-event-start,V8.CompileLazy,47576
-timer-event-start,V8.CompileFullCode,47581
-timer-event-end,V8.CompileFullCode,47591
-code-creation,LazyCompile,0,0x2b839680,192, bsuite/kraken-once/stanford-crypto-ccm.js:171,0x2f33dc70,~
-timer-event-end,V8.CompileLazy,47602
-timer-event-start,V8.ParseLazyMicroSeconds,47608
-timer-event-end,V8.ParseLazyMicroSeconds,47674
-timer-event-start,V8.CompileLazy,47681
-timer-event-start,V8.CompileFullCode,47693
-code-creation,Stub,2,0x2b839740,196,FastNewContextStub
-code-creation,Stub,12,0x2b839820,88,BinaryOpStub_DIV_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,47755
-code-creation,LazyCompile,0,0x2b839880,716, bsuite/kraken-once/stanford-crypto-ccm.js:7235,0x2f33b5d0,~
-timer-event-end,V8.CompileLazy,47768
-code-creation,Stub,12,0x2b839b60,196,BinaryOpStub_DIV_Alloc_Smi+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,47798
-timer-event-end,V8.ParseLazyMicroSeconds,47845
-timer-event-start,V8.CompileLazy,47851
-timer-event-start,V8.CompileFullCode,47863
-code-creation,Stub,12,0x2b839c40,88,BinaryOpStub_MUL_OverwriteRight_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,47917
-code-creation,LazyCompile,0,0x2b839ca0,2065, bsuite/kraken-once/stanford-crypto-ccm.js:7243,0x2f33de10,
-timer-event-end,V8.CompileLazy,47930
-code-creation,Stub,12,0x2b83a4c0,167,BinaryOpStub_MUL_OverwriteRight_Smi+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,47958
-timer-event-end,V8.ParseLazyMicroSeconds,47986
-timer-event-start,V8.CompileLazy,47992
-timer-event-start,V8.CompileFullCode,47998
-code-creation,Stub,12,0x2b83a580,88,BinaryOpStub_BIT_XOR_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,48031
-code-creation,LazyCompile,0,0x2b83a5e0,717,sjcl.codec.hex.toBits bsuite/kraken-once/stanford-crypto-ccm.js:13,0x2f339e90,~
-timer-event-end,V8.CompileLazy,48044
-timer-event-start,V8.ParseLazyMicroSeconds,48061
-timer-event-end,V8.ParseLazyMicroSeconds,48119
-timer-event-start,V8.CompileLazy,48126
-timer-event-start,V8.CompileFullCode,48135
-timer-event-end,V8.CompileFullCode,48188
-code-creation,LazyCompile,0,0x2b83a8c0,1601,DoConstructRegExp native regexp.js:39,0x44222a28,~
-timer-event-end,V8.CompileLazy,48203
-timer-event-start,V8.ParseLazyMicroSeconds,48213
-tick,0x80eabd3,48226,0,0xff81fb44,2,0x2b821ae3,0x2b83a6a4,0x2b839e4e,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.ParseLazyMicroSeconds,48288
-timer-event-start,V8.CompileLazy,48309
-timer-event-start,V8.CompileFullCode,48323
-timer-event-end,V8.CompileFullCode,48372
-code-creation,LazyCompile,0,0x2b83af20,1284,charAt native string.js:64,0x44215fa8,~
-timer-event-end,V8.CompileLazy,48386
-code-creation,Stub,14,0x2b83b440,144,CompareNilICStub(NullValue)(MonomorphicMap)
-code-creation,Stub,5,0x2b83b4e0,97,StringLengthStub
-timer-event-start,V8.ParseLazyMicroSeconds,48435
-timer-event-end,V8.ParseLazyMicroSeconds,48536
-timer-event-start,V8.CompileLazy,48543
-timer-event-start,V8.CompileFullCode,48555
-code-creation,Stub,2,0x2b83b560,828,SubStringStub
-timer-event-end,V8.CompileFullCode,48640
-code-creation,LazyCompile,0,0x2b83b8a0,2428,replace native string.js:213,0x44216248,~
-timer-event-end,V8.CompileLazy,48654
-code-creation,StoreIC,9,0x2b83c220,135,lastIndex
-code-creation,Stub,14,0x2b83c2c0,124,CompareNilICStub(NullValue)(Null)
-code-creation,RegExp,4,0x2b83c340,758,\\s|0x
-timer-event-start,V8.ParseLazyMicroSeconds,48827
-timer-event-end,V8.ParseLazyMicroSeconds,48873
-timer-event-start,V8.CompileLazy,48879
-timer-event-start,V8.CompileFullCode,48886
-timer-event-end,V8.CompileFullCode,48916
-code-creation,LazyCompile,0,0x2b83c640,960,substr native string.js:749,0x44216608,~
-timer-event-end,V8.CompileLazy,48930
-code-creation,Stub,14,0x2b83ca00,144,CompareNilICStub(NullValue)(MonomorphicMap)
-code-creation,Stub,13,0x2b83caa0,122,CompareICStub
-timer-event-start,V8.ParseLazyMicroSeconds,48959
-timer-event-end,V8.ParseLazyMicroSeconds,49000
-timer-event-start,V8.CompileLazy,49006
-timer-event-start,V8.CompileFullCode,49012
-code-creation,Stub,12,0x2b83cb20,88,BinaryOpStub_BIT_OR_Alloc_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b83cb80,88,BinaryOpStub_SAR_Alloc_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,49062
-code-creation,LazyCompile,0,0x2b83cbe0,1096,parseInt native v8natives.js:130,0x4421ec1c,~
-timer-event-end,V8.CompileLazy,49075
-code-creation,Stub,12,0x2b83d040,399,BinaryOpStub_BIT_XOR_Alloc_Number+Smi
-code-creation,CallIC,7,0x2b83d1e0,147,substr
-code-creation,CallIC,7,0x2b83d280,129,parseInt
-code-creation,Stub,2,0x2b83d320,1433,RecordWriteStub
-code-creation,Stub,2,0x2b83d8c0,611,RecordWriteStub
-code-creation,CallIC,7,0x2b83db40,656,push
-timer-event-start,V8.ParseLazyMicroSeconds,49192
-timer-event-end,V8.ParseLazyMicroSeconds,49229
-timer-event-start,V8.CompileLazy,49235
-timer-event-start,V8.CompileFullCode,49242
-code-creation,Stub,12,0x2b83dde0,88,BinaryOpStub_SAR_OverwriteRight_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b83de40,88,BinaryOpStub_BIT_AND_OverwriteRight_Uninitialized+Uninitialized
-tick,0x8250358,49284,0,0xff81fe84,2,0x2b83a871,0x2b839e4e,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.CompileFullCode,49346
-code-creation,LazyCompile,0,0x2b83dea0,536,sjcl.bitArray.clamp bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339b30,~
-timer-event-end,V8.CompileLazy,49390
-timer-event-start,V8.ParseLazyMicroSeconds,49402
-timer-event-end,V8.ParseLazyMicroSeconds,49416
-timer-event-start,V8.CompileLazy,49421
-timer-event-start,V8.CompileFullCode,49426
-timer-event-end,V8.CompileFullCode,49438
-code-creation,LazyCompile,0,0x2b83e0c0,248,ceil native math.js:81,0x442222fc,~
-timer-event-end,V8.CompileLazy,49450
-timer-event-start,V8.ParseLazyMicroSeconds,49466
-timer-event-end,V8.ParseLazyMicroSeconds,49529
-timer-event-start,V8.CompileLazy,49535
-timer-event-start,V8.CompileFullCode,49544
-code-creation,Stub,2,0x2b83e1c0,647,FastCloneShallowArrayStub
-code-creation,Stub,12,0x2b83e460,88,BinaryOpStub_SHL_Alloc_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b83e4c0,88,BinaryOpStub_BIT_AND_OverwriteLeft_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b83e520,88,BinaryOpStub_BIT_XOR_OverwriteLeft_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,49801
-code-creation,LazyCompile,0,0x2b83e580,3002,sjcl.cipher.aes bsuite/kraken-once/stanford-crypto-ccm.js:4,0x2f339830,~
-timer-event-end,V8.CompileLazy,49816
-timer-event-start,V8.ParseLazyMicroSeconds,49829
-timer-event-end,V8.ParseLazyMicroSeconds,49886
-timer-event-start,V8.CompileLazy,49893
-timer-event-start,V8.CompileFullCode,49902
-code-creation,Stub,12,0x2b83f140,88,BinaryOpStub_BIT_XOR_OverwriteRight_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,49958
-code-creation,LazyCompile,0,0x2b83f1a0,2528,sjcl.cipher.aes.w bsuite/kraken-once/stanford-crypto-ccm.js:6,0x2f339950,~
-timer-event-end,V8.CompileLazy,49972
-code-creation,Stub,12,0x2b83fb80,167,BinaryOpStub_SHL_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b83fc40,155,BinaryOpStub_SAR_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b83fce0,167,BinaryOpStub_MUL_OverwriteLeft_Smi+Smi
-code-creation,Stub,12,0x2b83fda0,146,BinaryOpStub_BIT_XOR_OverwriteLeft_Smi+Smi
-code-creation,Stub,2,0x2b83fe40,1808,RecordWriteStub
-code-creation,Stub,2,0x2b840560,554,KeyedStoreElementStub
-code-creation,KeyedStoreIC,10,0x2b8407a0,91,
-code-creation,Stub,12,0x2b840800,146,BinaryOpStub_BIT_XOR_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b8408a0,146,BinaryOpStub_BIT_XOR_OverwriteRight_Smi+Smi
-tick,0x82d1790,50347,0,0xff81fdb8,0,0x2b83f388,0x2b83e64a,0x2b839e65,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,12,0x2b840940,383,BinaryOpStub_BIT_XOR_OverwriteLeft_Smi+Int32
-code-creation,Stub,12,0x2b840ac0,375,BinaryOpStub_SHL_Alloc_Int32+Smi
-code-creation,Stub,12,0x2b840c40,325,BinaryOpStub_SHR_Alloc_Int32+Smi
-code-creation,Stub,12,0x2b840da0,167,BinaryOpStub_SHR_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b840e60,383,BinaryOpStub_BIT_XOR_OverwriteLeft_Int32+Smi
-code-creation,Stub,2,0x2b840fe0,794,ElementsTransitionAndStoreStub
-code-creation,KeyedStorePolymorphicIC,10,0x2b841300,107,
-code-creation,KeyedStorePolymorphicIC,10,0x2b841300,107,args_count: 0
-code-creation,Stub,2,0x2b841380,204,KeyedLoadElementStub
-code-creation,KeyedLoadIC,6,0x2b841460,91,
-code-creation,Stub,2,0x2b8414c0,405,ElementsTransitionAndStoreStub
-code-creation,Stub,2,0x2b841660,554,KeyedStoreElementStub
-code-creation,KeyedStorePolymorphicIC,10,0x2b8418a0,107,
-code-creation,KeyedStorePolymorphicIC,10,0x2b8418a0,107,args_count: 0
-code-creation,Stub,12,0x2b841920,233,BinaryOpStub_MUL_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b841a20,407,BinaryOpStub_BIT_XOR_OverwriteLeft_Number+Smi
-code-creation,Stub,12,0x2b841bc0,407,BinaryOpStub_BIT_XOR_OverwriteLeft_Smi+Number
-code-creation,Stub,12,0x2b841d60,355,BinaryOpStub_BIT_XOR_OverwriteLeft_Int32+Int32
-code-creation,Stub,12,0x2b841ee0,379,BinaryOpStub_BIT_XOR_OverwriteLeft_Int32+Number
-code-creation,Stub,15,0x2b842060,144,ToBooleanStub(Undefined,Smi)
-code-creation,Stub,2,0x2b842100,236,KeyedStoreElementStub
-code-creation,KeyedStoreIC,10,0x2b842200,91,
-code-creation,CallIC,7,0x2b842260,136,slice
-code-creation,CallMegamorphic,7,0x2b842300,685,args_count: 1
-code-creation,Stub,12,0x2b8425c0,146,BinaryOpStub_ADD_OverwriteLeft_Smi+Smi
-code-creation,Stub,12,0x2b842660,148,BinaryOpStub_SUB_Alloc_Smi+Smi
-code-creation,Stub,2,0x2b842700,301,KeyedLoadElementStub
-code-creation,KeyedLoadIC,6,0x2b842840,91,
-tick,0x817d391,51438,0,0xff81f9a4,0,0x2b83e81e,0x2b839e65,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,12,0x2b8428a0,190,BinaryOpStub_MOD_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b842960,146,BinaryOpStub_BIT_AND_OverwriteLeft_Smi+Smi
-code-creation,Stub,12,0x2b842a00,347,BinaryOpStub_BIT_XOR_Alloc_Int32+Int32
-code-creation,Stub,12,0x2b842b60,214,BinaryOpStub_SHL_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b842c40,375,BinaryOpStub_SAR_Alloc_Int32+Smi
-code-creation,Stub,12,0x2b842dc0,375,BinaryOpStub_BIT_AND_Alloc_Int32+Smi
-code-creation,CallIC,7,0x2b842f40,147,replace
-code-creation,Stub,2,0x2b842fe0,76,LoadFieldStub
-code-creation,LoadIC,5,0x2b843040,93,lastIndex
-code-creation,Stub,2,0x2b8430a0,76,LoadFieldStub
-code-creation,LoadIC,5,0x2b843100,93,global
-code-creation,LoadIC,5,0x2b843160,103,lastMatchInfoOverride
-code-creation,LoadIC,5,0x2b8431e0,103,lastMatchInfo
-code-creation,LoadIC,5,0x2b843260,103,sjcl
-code-creation,LoadIC,5,0x2b8432e0,93,bitArray
-code-creation,CallIC,7,0x2b843340,113,clamp
-code-creation,LoadIC,5,0x2b8433c0,93,length
-code-creation,CallIC,7,0x2b843420,113,ceil
-code-creation,CallIC,7,0x2b8434a0,136,slice
-code-creation,Stub,12,0x2b843540,264,BinaryOpStub_DIV_Alloc_Smi+Smi
-code-creation,Stub,12,0x2b843660,407,BinaryOpStub_SAR_OverwriteRight_Number+Smi
-code-creation,Stub,12,0x2b843800,383,BinaryOpStub_BIT_AND_OverwriteRight_Int32+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,51907
-timer-event-end,V8.ParseLazyMicroSeconds,51924
-timer-event-start,V8.CompileLazy,51930
-timer-event-start,V8.CompileFullCode,51935
-code-creation,Stub,12,0x2b843980,88,BinaryOpStub_SHL_OverwriteRight_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b8439e0,88,BinaryOpStub_ADD_OverwriteRight_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,51966
-code-creation,LazyCompile,0,0x2b843a40,288,sjcl.bitArray.partial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339b90,~
-timer-event-end,V8.CompileLazy,51979
-code-creation,Stub,12,0x2b843b60,375,BinaryOpStub_BIT_OR_Alloc_Int32+Smi
-code-creation,Stub,12,0x2b843ce0,247,BinaryOpStub_MUL_Alloc_Smi+Number
-code-creation,Stub,12,0x2b843de0,268,BinaryOpStub_ADD_OverwriteRight_Int32+Number
-code-creation,Stub,2,0x2b843f00,240,KeyedStoreElementStub
-code-creation,KeyedStoreIC,10,0x2b844000,91,
-code-creation,CallMiss,7,0x2b844060,178,args_count: 3
-code-creation,CallIC,7,0x2b844120,113,partial
-timer-event-start,V8.ParseLazyMicroSeconds,52165
-timer-event-end,V8.ParseLazyMicroSeconds,52210
-timer-event-start,V8.CompileLazy,52217
-timer-event-start,V8.CompileFullCode,52225
-code-creation,Stub,12,0x2b8441a0,88,BinaryOpStub_SHR_OverwriteRight_Uninitialized+Uninitialized
-code-creation,CallInitialize,7,0x2b844200,178,args_count: 6
-timer-event-end,V8.CompileFullCode,52278
-code-creation,LazyCompile,0,0x2b8442c0,1057,sjcl.mode.ccm.encrypt bsuite/kraken-once/stanford-crypto-ccm.js:19,0x2f33a250,~
-timer-event-end,V8.CompileLazy,52296
-timer-event-start,V8.ParseLazyMicroSeconds,52306
-timer-event-end,V8.ParseLazyMicroSeconds,52324
-timer-event-start,V8.CompileLazy,52329
-timer-event-start,V8.CompileFullCode,52334
-timer-event-end,V8.CompileFullCode,52349
-code-creation,LazyCompile,0,0x2b844700,336,sjcl.bitArray.bitLength bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339ad0,~
-timer-event-end,V8.CompileLazy,52362
-timer-event-start,V8.ParseLazyMicroSeconds,52375
-timer-event-end,V8.ParseLazyMicroSeconds,52388
-timer-event-start,V8.CompileLazy,52392
-timer-event-start,V8.CompileFullCode,52398
-timer-event-end,V8.CompileFullCode,52420
-code-creation,LazyCompile,0,0x2b844860,236,sjcl.bitArray.getPartial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339bf0,~
-timer-event-end,V8.CompileLazy,52433
-code-creation,Stub,12,0x2b844960,264,BinaryOpStub_DIV_Alloc_Int32+Number
-timer-event-start,V8.ParseLazyMicroSeconds,52455
-tick,0x8092495,52475,0,0xff81fcd0,2,0x2b844833,0x2b84437f,0x2b83a0cc,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.ParseLazyMicroSeconds,52539
-timer-event-start,V8.CompileLazy,52558
-timer-event-start,V8.CompileFullCode,52577
-timer-event-end,V8.CompileFullCode,52590
-code-creation,LazyCompile,0,0x2b844a80,248,round native math.js:193,0x4422265c,~
-timer-event-end,V8.CompileLazy,52602
-code-creation,CallIC,7,0x2b844b80,113,getPartial
-code-creation,Stub,12,0x2b844c00,238,BinaryOpStub_DIV_Alloc_Number+Number
-code-creation,CallIC,7,0x2b844d00,113,round
-code-creation,Stub,12,0x2b844d80,167,BinaryOpStub_SHR_OverwriteRight_Smi+Smi
-code-creation,CallPreMonomorphic,7,0x2b844e40,178,args_count: 6
-timer-event-start,V8.ParseLazyMicroSeconds,52676
-timer-event-end,V8.ParseLazyMicroSeconds,52738
-timer-event-start,V8.CompileLazy,52745
-timer-event-start,V8.CompileFullCode,52753
-code-creation,Stub,12,0x2b844f00,88,BinaryOpStub_SHL_OverwriteLeft_Uninitialized+Uninitialized
-code-creation,Stub,12,0x2b844f60,88,BinaryOpStub_BIT_OR_OverwriteRight_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,52818
-code-creation,LazyCompile,0,0x2b844fc0,1838,sjcl.mode.ccm.G bsuite/kraken-once/stanford-crypto-ccm.js:20,0x2f33a310,~
-timer-event-end,V8.CompileLazy,52833
-code-creation,Stub,13,0x2b845700,241,CompareICStub
-code-creation,Stub,12,0x2b845800,167,BinaryOpStub_SHL_OverwriteLeft_Smi+Smi
-code-creation,Stub,12,0x2b8458c0,145,BinaryOpStub_BIT_OR_OverwriteRight_Smi+Smi
-code-creation,Stub,12,0x2b845960,145,BinaryOpStub_BIT_OR_OverwriteLeft_Smi+Smi
-code-creation,Stub,12,0x2b845a00,167,BinaryOpStub_SHL_OverwriteRight_Smi+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,52912
-timer-event-end,V8.ParseLazyMicroSeconds,52936
-timer-event-start,V8.CompileLazy,52941
-timer-event-start,V8.CompileFullCode,52947
-timer-event-end,V8.CompileFullCode,52966
-code-creation,LazyCompile,0,0x2b845ac0,560,sjcl.bitArray.concat bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339a70,~
-timer-event-end,V8.CompileLazy,52980
-code-creation,Stub,12,0x2b845d00,399,BinaryOpStub_BIT_OR_Alloc_Number+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,53013
-timer-event-end,V8.ParseLazyMicroSeconds,53049
-timer-event-start,V8.CompileLazy,53055
-timer-event-start,V8.CompileFullCode,53062
-timer-event-end,V8.CompileFullCode,53095
-code-creation,LazyCompile,0,0x2b845ea0,1126,sjcl.bitArray.P bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339cb0,~
-timer-event-end,V8.CompileLazy,53110
-code-creation,Stub,13,0x2b846320,485,CompareICStub
-code-creation,Stub,12,0x2b846520,383,BinaryOpStub_BIT_OR_OverwriteRight_Int32+Smi
-code-creation,Stub,12,0x2b8466a0,383,BinaryOpStub_SHL_OverwriteRight_Int32+Smi
-code-creation,Stub,12,0x2b846820,407,BinaryOpStub_BIT_OR_OverwriteRight_Number+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,53194
-timer-event-end,V8.ParseLazyMicroSeconds,53206
-timer-event-start,V8.CompileLazy,53211
-timer-event-start,V8.CompileFullCode,53216
-timer-event-end,V8.CompileFullCode,53226
-code-creation,LazyCompile,0,0x2b8469c0,184,sjcl.cipher.aes.encrypt bsuite/kraken-once/stanford-crypto-ccm.js:6,0x2f339890,~
-timer-event-end,V8.CompileLazy,53243
-timer-event-start,V8.ParseLazyMicroSeconds,53249
-timer-event-end,V8.ParseLazyMicroSeconds,53325
-timer-event-start,V8.CompileLazy,53332
-timer-event-start,V8.CompileFullCode,53343
-code-creation,Stub,12,0x2b846a80,88,BinaryOpStub_SUB_OverwriteLeft_Uninitialized+Uninitialized
-tick,0x8376055,53535,0,0x81bab7d,2,0x2b846a46,0x2b845312,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,2,0x2b846ae0,683,FastCloneShallowArrayStub
-code-creation,Stub,11,0x2b846da0,132,UnaryOpStubMinus(None)
-timer-event-end,V8.CompileFullCode,53746
-code-creation,LazyCompile,0,0x2b846e40,3418,sjcl.cipher.aes.H bsuite/kraken-once/stanford-crypto-ccm.js:7,0x2f3399b0,~
-timer-event-end,V8.CompileLazy,53763
-code-creation,Stub,12,0x2b847ba0,375,BinaryOpStub_BIT_XOR_Alloc_Smi+Int32
-code-creation,Stub,12,0x2b847d20,375,BinaryOpStub_BIT_XOR_Alloc_Int32+Smi
-code-creation,Stub,12,0x2b847ea0,148,BinaryOpStub_SUB_OverwriteLeft_Smi+Smi
-code-creation,Stub,15,0x2b847f40,164,ToBooleanStub(Smi,HeapNumber)
-code-creation,CallMiss,7,0x2b848000,178,args_count: 4
-code-creation,CallIC,7,0x2b8480c0,113,P
-code-creation,LoadIC,5,0x2b848140,103,undefined
-timer-event-start,V8.ParseLazyMicroSeconds,54007
-timer-event-end,V8.ParseLazyMicroSeconds,54027
-timer-event-start,V8.CompileLazy,54032
-timer-event-start,V8.CompileFullCode,54038
-timer-event-end,V8.CompileFullCode,54052
-code-creation,LazyCompile,0,0x2b8481c0,388,sjcl.bitArray.k bsuite/kraken-once/stanford-crypto-ccm.js:11,0x2f339d10,~
-timer-event-end,V8.CompileLazy,54065
-code-creation,CallIC,7,0x2b848360,132,H
-code-creation,LoadIC,5,0x2b848400,93,a
-code-creation,Stub,2,0x2b848460,95,h
-code-creation,LoadIC,5,0x2b8484c0,93,h
-code-creation,CallIC,7,0x2b848520,132,encrypt
-code-creation,Stub,12,0x2b8485c0,371,BinaryOpStub_BIT_XOR_Alloc_Int32+Number
-timer-event-start,V8.ParseLazyMicroSeconds,54281
-timer-event-end,V8.ParseLazyMicroSeconds,54332
-timer-event-start,V8.CompileLazy,54339
-timer-event-start,V8.CompileFullCode,54347
-code-creation,Stub,2,0x2b848740,663,FastCloneShallowArrayStub
-timer-event-end,V8.CompileFullCode,54560
-code-creation,LazyCompile,0,0x2b8489e0,1221,sjcl.mode.ccm.I bsuite/kraken-once/stanford-crypto-ccm.js:21,0x2f33a370,~
-timer-event-end,V8.CompileLazy,54577
-tick,0x82f2dd2,54590,0,0xff81f67c,2,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,12,0x2b848ec0,371,BinaryOpStub_BIT_XOR_Alloc_Number+Int32
-timer-event-start,V8.ParseLazyMicroSeconds,54663
-timer-event-end,V8.ParseLazyMicroSeconds,54685
-timer-event-start,V8.CompileLazy,54691
-timer-event-start,V8.CompileFullCode,54697
-code-creation,Stub,12,0x2b849040,88,BinaryOpStub_SUB_OverwriteRight_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,54724
-code-creation,LazyCompile,0,0x2b8490a0,392,sjcl.bitArray.bitSlice bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339a10,~
-timer-event-end,V8.CompileLazy,54737
-code-creation,Stub,12,0x2b849240,148,BinaryOpStub_SUB_OverwriteRight_Smi+Smi
-code-creation,Stub,13,0x2b8492e0,494,CompareICStub
-code-creation,CallMegamorphic,7,0x2b8494e0,685,args_count: 2
-code-creation,Stub,12,0x2b8497a0,246,BinaryOpStub_ADD_Alloc_Number+Smi
-code-creation,LoadPolymorphicIC,5,0x2b8498a0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b849920,105,length
-timer-event-start,V8.ParseLazyMicroSeconds,54933
-timer-event-end,V8.ParseLazyMicroSeconds,54956
-timer-event-start,V8.CompileLazy,54962
-timer-event-start,V8.CompileFullCode,54968
-timer-event-end,V8.CompileFullCode,54989
-code-creation,LazyCompile,0,0x2b8499a0,585,sjcl.bitArray.equal bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339c50,~
-timer-event-end,V8.CompileLazy,55003
-code-creation,Stub,12,0x2b849c00,395,BinaryOpStub_BIT_XOR_Alloc_Number+Number
-code-creation,Stub,12,0x2b849da0,133,BinaryOpStub_ADD_Alloc_String+Smi
-code-creation,Stub,12,0x2b849e40,133,BinaryOpStub_ADD_OverwriteLeft_String+Smi
-timer-event-start,V8.ParseLazyMicroSeconds,55131
-timer-event-end,V8.ParseLazyMicroSeconds,55149
-timer-event-start,V8.CompileLazy,55155
-timer-event-start,V8.CompileFullCode,55160
-timer-event-end,V8.CompileFullCode,55177
-code-creation,LazyCompile,0,0x2b849ee0,292,sjcl.test.TestCase.require bsuite/kraken-once/stanford-crypto-ccm.js:131,0x2f33b390,~
-timer-event-end,V8.CompileLazy,55190
-timer-event-start,V8.ParseLazyMicroSeconds,55198
-timer-event-end,V8.ParseLazyMicroSeconds,55206
-timer-event-start,V8.CompileLazy,55211
-timer-event-start,V8.CompileFullCode,55216
-timer-event-end,V8.CompileFullCode,55228
-code-creation,LazyCompile,0,0x2b84a020,208,sjcl.test.TestCase.pass bsuite/kraken-once/stanford-crypto-ccm.js:110,0x2f33b270,~
-timer-event-end,V8.CompileLazy,55240
-code-creation,StoreIC,9,0x2b84a100,103,passes
-timer-event-start,V8.ParseLazyMicroSeconds,55261
-timer-event-end,V8.ParseLazyMicroSeconds,55307
-timer-event-start,V8.CompileLazy,55313
-timer-event-start,V8.CompileFullCode,55321
-code-creation,Stub,12,0x2b84a180,88,BinaryOpStub_DIV_OverwriteLeft_Uninitialized+Uninitialized
-timer-event-end,V8.CompileFullCode,55365
-code-creation,LazyCompile,0,0x2b84a1e0,1229,sjcl.mode.ccm.decrypt bsuite/kraken-once/stanford-crypto-ccm.js:19,0x2f33a2b0,~
-timer-event-end,V8.CompileLazy,55379
-code-creation,CallIC,7,0x2b84a6c0,136,slice
-code-creation,CallIC,7,0x2b84a760,128,P
-code-creation,LoadPolymorphicIC,5,0x2b84a7e0,105,length
-code-creation,KeyedLoadPolymorphicIC,6,0x2b84a860,105,
-code-creation,CallIC,7,0x2b84a8e0,656,push
-code-creation,Stub,12,0x2b84ab80,407,BinaryOpStub_SHL_OverwriteRight_Number+Smi
-code-creation,LoadPolymorphicIC,5,0x2b84ad20,105,length
-code-creation,LoadPolymorphicIC,5,0x2b84ada0,105,length
-code-creation,CallIC,7,0x2b84ae20,136,slice
-code-creation,Stub,12,0x2b84aec0,196,BinaryOpStub_DIV_OverwriteLeft_Smi+Smi
-code-creation,Stub,2,0x2b84afa0,70,k
-code-creation,LoadIC,5,0x2b84b000,93,k
-code-creation,CallIC,7,0x2b84b060,113,bitLength
-code-creation,CallIC,7,0x2b84b0e0,128,partial
-code-creation,CallIC,7,0x2b84b160,113,concat
-code-creation,LoadPolymorphicIC,5,0x2b84b1e0,105,length
-code-creation,CallIC,7,0x2b84b260,136,concat
-code-creation,CallIC,7,0x2b84b300,113,bitSlice
-code-creation,CallIC,7,0x2b84b380,136,concat
-tick,0x8118ca4,55654,0,0x90ec418,0,0x2b848b2e,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,CallIC,7,0x2b84b420,136,slice
-code-creation,StoreIC,9,0x2b84b4c0,138,tag
-code-creation,StoreIC,9,0x2b84b560,138,data
-code-creation,Stub,12,0x2b84b600,214,BinaryOpStub_SHL_OverwriteRight_Smi+Smi
-code-creation,LoadPolymorphicIC,5,0x2b84b6e0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b84b760,105,length
-code-creation,CallMiss,7,0x2b84b7e0,178,args_count: 0
-code-creation,CallIC,7,0x2b84b8a0,132,pass
-code-creation,Stub,2,0x2b84b940,76,LoadFieldStub
-code-creation,LoadIC,5,0x2b84b9a0,93,passes
-code-creation,LoadIC,5,0x2b84ba00,93,key
-code-creation,LoadIC,5,0x2b84ba60,93,cipher
-code-creation,Stub,2,0x2b84bac0,70,aes
-code-creation,LoadIC,5,0x2b84bb20,93,aes
-code-creation,CallIC,7,0x2b84bb80,113,toBits
-code-creation,Stub,2,0x2b84bc00,95,h
-code-creation,LoadIC,5,0x2b84bc60,93,h
-code-creation,StoreIC,9,0x2b84bcc0,246,a
-code-creation,LoadIC,5,0x2b84bdc0,93,iv
-code-creation,Stub,2,0x2b84be20,76,LoadFieldStub
-code-creation,LoadIC,5,0x2b84be80,93,adata
-code-creation,LoadIC,5,0x2b84bee0,93,pt
-code-creation,Stub,2,0x2b84bf40,76,LoadFieldStub
-code-creation,LoadIC,5,0x2b84bfa0,93,ct
-code-creation,LoadIC,5,0x2b84c000,93,tag
-code-creation,LoadIC,5,0x2b84c060,93,mode
-code-creation,LoadIC,5,0x2b84c0c0,93,ccm
-code-creation,CallMiss,7,0x2b84c120,178,args_count: 5
-code-creation,CallIC,7,0x2b84c1e0,113,encrypt
-code-creation,CallMiss,7,0x2b84c260,178,args_count: 6
-code-creation,CallIC,7,0x2b84c320,113,G
-code-creation,CallIC,7,0x2b84c3a0,193,pop
-code-creation,CallIC,7,0x2b84c480,113,I
-code-creation,LoadIC,5,0x2b84c500,93,data
-code-creation,LoadIC,5,0x2b84c560,93,tag
-code-creation,CallIC,7,0x2b84c5c0,113,equal
-code-creation,CallIC,7,0x2b84c640,132,require
-code-creation,CallIC,7,0x2b84c6e0,113,decrypt
-code-creation,CallIC,7,0x2b84c760,128,bitSlice
-code-creation,CallMegamorphic,7,0x2b84c7e0,685,args_count: 0
-tick,0xf776d430,56728,0,0x90ec418,0,0x2b84a349,0x2b83a281,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,15,0x2b84caa0,172,ToBooleanStub(Undefined,Smi,HeapNumber)
-code-creation,CallIC,7,0x2b84cb60,193,pop
-code-creation,Stub,2,0x2b84cc40,725,ElementsTransitionAndStoreStub
-code-creation,Stub,2,0x2b84cf20,1800,RecordWriteStub
-code-creation,Stub,2,0x2b84d640,578,KeyedStoreElementStub
-code-creation,KeyedStorePolymorphicIC,10,0x2b84d8a0,107,
-code-creation,KeyedStorePolymorphicIC,10,0x2b84d8a0,107,args_count: 0
-timer-event-start,V8.RecompileSynchronous,57494
-timer-event-start,V8.ParseLazyMicroSeconds,57505
-timer-event-end,V8.ParseLazyMicroSeconds,57586
-code-creation,LazyCompile,0,0x2b84d920,3418,sjcl.cipher.aes.H bsuite/kraken-once/stanford-crypto-ccm.js:7,0x2f3399b0,~
-tick,0x8092457,57778,0,0x19e,2,0x2b846a46,0x2b8455f6,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.RecompileSynchronous,57904
-timer-event-start,V8.RecompileConcurrent,57929
-code-creation,Stub,2,0x2b84e680,559,ElementsTransitionAndStoreStub
-code-creation,KeyedStorePolymorphicIC,10,0x2b84e8c0,107,
-code-creation,KeyedStorePolymorphicIC,10,0x2b84e8c0,107,args_count: 0
-code-creation,LoadPolymorphicIC,5,0x2b84e940,105,length
-code-creation,LoadPolymorphicIC,5,0x2b84e9c0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b84ea40,105,length
-code-creation,LoadPolymorphicIC,5,0x2b84eac0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b84eb40,105,length
-timer-event-start,V8.RecompileSynchronous,58447
-timer-event-start,V8.ParseLazyMicroSeconds,58457
-timer-event-end,V8.ParseLazyMicroSeconds,58501
-code-creation,LazyCompile,0,0x2b84ebc0,1096,parseInt native v8natives.js:130,0x4421ec1c,~
-timer-event-end,V8.RecompileSynchronous,58637
-timer-event-start,V8.GCScavenger,58779
-timer-event-start,V8.External,58787
-timer-event-end,V8.External,58791
-tick,0x810f40c,58868,0,0x0,1
-timer-event-start,V8.External,59191
-timer-event-end,V8.External,59200
-timer-event-end,V8.GCScavenger,59205
-timer-event-end,V8.RecompileConcurrent,59219
-timer-event-start,V8.RecompileConcurrent,59254
-timer-event-start,V8.RecompileSynchronous,59271
-code-creation,LazyCompile,1,0x2b84f020,4592,sjcl.cipher.aes.H bsuite/kraken-once/stanford-crypto-ccm.js:7,0x2f3399b0,*
-timer-event-end,V8.RecompileSynchronous,59549
-timer-event-end,V8.RecompileConcurrent,59567
-timer-event-start,V8.RecompileSynchronous,59590
-code-creation,LazyCompile,1,0x2b850220,1662,parseInt native v8natives.js:130,0x4421ec1c,*
-timer-event-end,V8.RecompileSynchronous,59672
-timer-event-start,V8.RecompileSynchronous,59682
-timer-event-start,V8.ParseLazyMicroSeconds,59687
-timer-event-end,V8.ParseLazyMicroSeconds,59701
-code-creation,LazyCompile,0,0x2b8508a0,236,sjcl.bitArray.getPartial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339bf0,~
-timer-event-end,V8.RecompileSynchronous,59750
-timer-event-start,V8.RecompileConcurrent,59776
-timer-event-start,V8.RecompileSynchronous,59811
-timer-event-start,V8.ParseLazyMicroSeconds,59820
-timer-event-end,V8.ParseLazyMicroSeconds,59838
-code-creation,LazyCompile,0,0x2b8509a0,388,sjcl.bitArray.k bsuite/kraken-once/stanford-crypto-ccm.js:11,0x2f339d10,~
-timer-event-end,V8.RecompileConcurrent,59909
-timer-event-start,V8.RecompileConcurrent,59926
-timer-event-end,V8.RecompileSynchronous,59933
-timer-event-start,V8.RecompileSynchronous,59950
-tick,0xf776d430,59966,0,0x90ec418,2,0x2b8455e6,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,LazyCompile,1,0x2b850b40,536,sjcl.bitArray.getPartial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339bf0,*
-timer-event-end,V8.RecompileSynchronous,60077
-timer-event-start,V8.RecompileSynchronous,60141
-timer-event-start,V8.ParseLazyMicroSeconds,60149
-timer-event-end,V8.RecompileConcurrent,60177
-timer-event-end,V8.ParseLazyMicroSeconds,60195
-code-creation,LazyCompile,0,0x2b850d60,960,substr native string.js:749,0x44216608,~
-timer-event-end,V8.RecompileSynchronous,60329
-timer-event-start,V8.RecompileConcurrent,60356
-code-deopt,60375,544
-timer-event-start,V8.RecompileSynchronous,60409
-code-creation,LazyCompile,1,0x2b851120,1534,sjcl.bitArray.k bsuite/kraken-once/stanford-crypto-ccm.js:11,0x2f339d10,*
-timer-event-end,V8.RecompileSynchronous,60474
-code-creation,LoadPolymorphicIC,5,0x2b851720,105,length
-code-creation,LoadPolymorphicIC,5,0x2b8517a0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b851820,105,length
-timer-event-end,V8.RecompileConcurrent,60691
-timer-event-start,V8.RecompileSynchronous,60716
-code-creation,LazyCompile,1,0x2b8518a0,1792,substr native string.js:749,0x44216608,*
-timer-event-end,V8.RecompileSynchronous,60803
-tick,0x2b849c4b,60997,0,0x2b849afa,0,0x2b83a0df,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.RecompileSynchronous,61042
-timer-event-start,V8.ParseLazyMicroSeconds,61054
-timer-event-end,V8.ParseLazyMicroSeconds,61066
-code-creation,LazyCompile,0,0x2b851fa0,184,sjcl.cipher.aes.encrypt bsuite/kraken-once/stanford-crypto-ccm.js:6,0x2f339890,~
-timer-event-end,V8.RecompileSynchronous,61112
-timer-event-start,V8.RecompileConcurrent,61139
-timer-event-start,V8.RecompileSynchronous,61159
-timer-event-start,V8.ParseLazyMicroSeconds,61168
-timer-event-end,V8.ParseLazyMicroSeconds,61186
-timer-event-end,V8.RecompileConcurrent,61201
-code-creation,LazyCompile,0,0x2b852060,336,sjcl.bitArray.bitLength bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339ad0,~
-timer-event-start,V8.ParseLazyMicroSeconds,61249
-timer-event-end,V8.ParseLazyMicroSeconds,61264
-timer-event-end,V8.RecompileSynchronous,61290
-timer-event-start,V8.RecompileSynchronous,61309
-timer-event-start,V8.RecompileConcurrent,61317
-code-creation,LazyCompile,1,0x2b8521c0,196,sjcl.cipher.aes.encrypt bsuite/kraken-once/stanford-crypto-ccm.js:6,0x2f339890,*
-timer-event-end,V8.RecompileSynchronous,61348
-timer-event-start,V8.RecompileSynchronous,61374
-timer-event-start,V8.ParseLazyMicroSeconds,61381
-timer-event-end,V8.ParseLazyMicroSeconds,61394
-timer-event-end,V8.RecompileSynchronous,61418
-timer-event-start,V8.RecompileSynchronous,61424
-timer-event-start,V8.ParseLazyMicroSeconds,61429
-timer-event-end,V8.ParseLazyMicroSeconds,61442
-code-creation,LazyCompile,0,0x2b8522a0,248,round native math.js:193,0x4422265c,~
-timer-event-end,V8.RecompileConcurrent,61471
-timer-event-start,V8.RecompileConcurrent,61480
-timer-event-end,V8.RecompileSynchronous,61487
-timer-event-start,V8.RecompileSynchronous,61512
-timer-event-end,V8.RecompileConcurrent,61536
-timer-event-start,V8.RecompileConcurrent,61543
-code-creation,LazyCompile,1,0x2b8523a0,888,sjcl.bitArray.bitLength bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339ad0,*
-timer-event-end,V8.RecompileSynchronous,61565
-timer-event-start,V8.RecompileSynchronous,61570
-code-creation,LazyCompile,1,0x2b852720,536,sjcl.bitArray.getPartial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339bf0,*
-timer-event-end,V8.RecompileSynchronous,61599
-timer-event-start,V8.RecompileSynchronous,61606
-timer-event-end,V8.RecompileConcurrent,61610
-code-creation,LazyCompile,1,0x2b852940,242,round native math.js:193,0x4422265c,*
-timer-event-end,V8.RecompileSynchronous,61629
-code-creation,LoadPolymorphicIC,5,0x2b852a40,105,length
-timer-event-start,V8.RecompileSynchronous,61726
-timer-event-start,V8.ParseLazyMicroSeconds,61731
-timer-event-end,V8.ParseLazyMicroSeconds,61757
-code-creation,LazyCompile,0,0x2b852ac0,536,sjcl.bitArray.clamp bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339b30,~
-timer-event-start,V8.ParseLazyMicroSeconds,61847
-timer-event-end,V8.ParseLazyMicroSeconds,61865
-code-creation,Function,0,0x2b852ce0,288,sjcl.bitArray.partial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339b90,~
-timer-event-end,V8.RecompileSynchronous,61926
-timer-event-start,V8.RecompileSynchronous,61933
-timer-event-start,V8.ParseLazyMicroSeconds,61939
-timer-event-end,V8.ParseLazyMicroSeconds,61953
-timer-event-start,V8.RecompileConcurrent,61961
-code-creation,LazyCompile,0,0x2b852e00,248,ceil native math.js:81,0x442222fc,~
-timer-event-end,V8.RecompileSynchronous,62019
-tick,0x811e913,62060,0,0xf773bff4,2,0x2b83dfae,0x2b8445e0,0x2b83a0cc,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-deopt,62122,544
-timer-event-end,V8.RecompileConcurrent,62287
-timer-event-start,V8.RecompileConcurrent,62297
-timer-event-start,V8.RecompileSynchronous,62309
-timer-event-end,V8.RecompileConcurrent,62353
-code-creation,Stub,2,0x2b852f00,1785,RecordWriteStub
-code-creation,LazyCompile,1,0x2b853600,1514,sjcl.bitArray.clamp bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339b30,*
-timer-event-end,V8.RecompileSynchronous,62415
-timer-event-start,V8.RecompileSynchronous,62421
-code-creation,LazyCompile,1,0x2b853c00,242,ceil native math.js:81,0x442222fc,*
-timer-event-end,V8.RecompileSynchronous,62445
-code-creation,LoadPolymorphicIC,5,0x2b853d00,105,length
-code-creation,LoadPolymorphicIC,5,0x2b853d80,105,length
-timer-event-start,V8.RecompileSynchronous,63048
-timer-event-start,V8.ParseLazyMicroSeconds,63067
-timer-event-end,V8.ParseLazyMicroSeconds,63085
-timer-event-end,V8.RecompileSynchronous,63117
-tick,0xf776d430,63132,0,0x90ec418,0,0x2b8462cc,0x2b845cd7,0x2b848b0a,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.RecompileConcurrent,63203
-timer-event-end,V8.RecompileConcurrent,63315
-timer-event-start,V8.RecompileSynchronous,63329
-code-creation,LazyCompile,1,0x2b853e00,644,sjcl.bitArray.partial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339b90,*
-timer-event-end,V8.RecompileSynchronous,63379
-timer-event-start,V8.RecompileSynchronous,63494
-timer-event-start,V8.ParseLazyMicroSeconds,63503
-timer-event-end,V8.ParseLazyMicroSeconds,63517
-timer-event-end,V8.RecompileSynchronous,63544
-timer-event-start,V8.RecompileConcurrent,63572
-timer-event-start,V8.RecompileSynchronous,63641
-timer-event-start,V8.ParseLazyMicroSeconds,63651
-timer-event-end,V8.RecompileConcurrent,63664
-timer-event-end,V8.ParseLazyMicroSeconds,63678
-code-creation,LazyCompile,0,0x2b8540a0,560,sjcl.bitArray.concat bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339a70,~
-timer-event-start,V8.ParseLazyMicroSeconds,63757
-timer-event-end,V8.ParseLazyMicroSeconds,63772
-timer-event-start,V8.ParseLazyMicroSeconds,63808
-timer-event-end,V8.ParseLazyMicroSeconds,63848
-code-creation,Function,0,0x2b8542e0,1126,sjcl.bitArray.P bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339cb0,~
-timer-event-start,V8.ParseLazyMicroSeconds,63977
-timer-event-end,V8.ParseLazyMicroSeconds,63994
-timer-event-start,V8.ParseLazyMicroSeconds,64023
-timer-event-end,V8.ParseLazyMicroSeconds,64039
-timer-event-end,V8.RecompileSynchronous,64072
-timer-event-start,V8.RecompileSynchronous,64079
-timer-event-start,V8.RecompileConcurrent,64099
-code-creation,LazyCompile,1,0x2b854760,536,sjcl.bitArray.getPartial bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339bf0,*
-timer-event-end,V8.RecompileSynchronous,64194
-tick,0xf776d430,64209,0,0x4059,2,0x2b845c29,0x2b848b0a,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-deopt,64271,544
-timer-event-start,V8.RecompileSynchronous,64467
-timer-event-start,V8.ParseLazyMicroSeconds,64476
-timer-event-end,V8.ParseLazyMicroSeconds,64542
-code-creation,LazyCompile,0,0x2b854980,3002,sjcl.cipher.aes bsuite/kraken-once/stanford-crypto-ccm.js:4,0x2f339830,~
-timer-event-end,V8.RecompileSynchronous,64818
-timer-event-end,V8.RecompileConcurrent,64871
-timer-event-start,V8.RecompileConcurrent,64883
-timer-event-start,V8.RecompileSynchronous,64890
-code-creation,LazyCompile,1,0x2b855540,3364,sjcl.bitArray.concat bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339a70,*
-timer-event-end,V8.RecompileSynchronous,65047
-code-deopt,65079,4608
-code-creation,LoadPolymorphicIC,5,0x2b856280,105,length
-tick,0x2b8472a7,65264,0,0x52f0b0e1,0,0x2b852252,0x2b848c4b,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,LoadPolymorphicIC,5,0x2b856300,105,length
-code-creation,LoadPolymorphicIC,5,0x2b856380,105,length
-timer-event-start,V8.GCScavenger,65757
-timer-event-start,V8.External,65766
-timer-event-end,V8.External,65770
-timer-event-start,V8.External,66154
-timer-event-end,V8.External,66162
-timer-event-end,V8.GCScavenger,66166
-timer-event-end,V8.RecompileConcurrent,66181
-timer-event-start,V8.RecompileSynchronous,66254
-tick,0x81c09b0,66332,0,0x91632e8,2,0x2b839e65,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,2,0x2b856400,1785,RecordWriteStub
-code-creation,Stub,2,0x2b856b00,1785,RecordWriteStub
-code-creation,Stub,2,0x2b857200,783,RecordWriteStub
-code-creation,Stub,2,0x2b857520,1772,RecordWriteStub
-code-creation,Stub,2,0x2b857c20,1785,RecordWriteStub
-code-creation,LazyCompile,1,0x2b858320,4397,sjcl.cipher.aes bsuite/kraken-once/stanford-crypto-ccm.js:4,0x2f339830,*
-timer-event-end,V8.RecompileSynchronous,66661
-timer-event-start,V8.RecompileSynchronous,66788
-timer-event-start,V8.ParseLazyMicroSeconds,66797
-timer-event-end,V8.ParseLazyMicroSeconds,66878
-timer-event-end,V8.RecompileSynchronous,67067
-timer-event-start,V8.RecompileConcurrent,67094
-tick,0x2b8473da,67403,0,0x2f392d35,0,0x2b852252,0x2b8455f6,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.RecompileConcurrent,68064
-timer-event-start,V8.RecompileSynchronous,68081
-code-creation,LazyCompile,1,0x2b859460,4752,sjcl.cipher.aes.H bsuite/kraken-once/stanford-crypto-ccm.js:7,0x2f3399b0,*
-timer-event-end,V8.RecompileSynchronous,68294
-code-creation,LoadPolymorphicIC,5,0x2b85a700,105,length
-tick,0x2b85055a,68462,0,0x527b30d9,0,0x2b83a782,0x2b839f55,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,69250
-timer-event-start,V8.External,69260
-timer-event-end,V8.External,69264
-timer-event-start,V8.External,69314
-timer-event-end,V8.External,69320
-timer-event-end,V8.GCScavenger,69324
-tick,0x82ec00c,69525,0,0xff81fcf4,0,0x2b85056f,0x2b83a782,0x2b839fd2,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,LoadPolymorphicIC,5,0x2b85a780,105,length
-code-creation,LoadPolymorphicIC,5,0x2b85a800,117,length
-code-creation,LoadPolymorphicIC,5,0x2b85a880,117,length
-code-creation,LoadPolymorphicIC,5,0x2b85a900,117,length
-code-creation,LoadPolymorphicIC,5,0x2b85a980,117,length
-code-creation,LoadPolymorphicIC,5,0x2b85aa00,117,length
-tick,0x81168ba,70588,0,0x90d5060,0,0x2b85056f,0x2b83a782,0x2b839f04,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.RecompileSynchronous,71064
-timer-event-start,V8.ParseLazyMicroSeconds,71076
-timer-event-end,V8.ParseLazyMicroSeconds,71094
-code-creation,LazyCompile,0,0x2b85aa80,292,sjcl.test.TestCase.require bsuite/kraken-once/stanford-crypto-ccm.js:131,0x2f33b390,~
-timer-event-start,V8.ParseLazyMicroSeconds,71142
-timer-event-end,V8.ParseLazyMicroSeconds,71152
-code-creation,Function,0,0x2b85abc0,208,sjcl.test.TestCase.pass bsuite/kraken-once/stanford-crypto-ccm.js:110,0x2f33b270,~
-timer-event-end,V8.RecompileSynchronous,71195
-timer-event-start,V8.RecompileSynchronous,71204
-timer-event-start,V8.ParseLazyMicroSeconds,71210
-timer-event-start,V8.RecompileConcurrent,71216
-timer-event-end,V8.ParseLazyMicroSeconds,71228
-timer-event-end,V8.RecompileSynchronous,71254
-timer-event-end,V8.RecompileConcurrent,71304
-timer-event-start,V8.RecompileConcurrent,71312
-timer-event-start,V8.RecompileSynchronous,71316
-code-creation,LazyCompile,1,0x2b85aca0,322,sjcl.test.TestCase.require bsuite/kraken-once/stanford-crypto-ccm.js:131,0x2f33b390,*
-timer-event-end,V8.RecompileSynchronous,71361
-timer-event-start,V8.RecompileSynchronous,71367
-timer-event-end,V8.RecompileConcurrent,71373
-code-creation,LazyCompile,1,0x2b85ae00,198,sjcl.test.TestCase.pass bsuite/kraken-once/stanford-crypto-ccm.js:110,0x2f33b270,*
-timer-event-end,V8.RecompileSynchronous,71390
-tick,0x2b83c3b1,71653,0,0xffffff6b,0,0x2b83bd35,0x2b83a725,0x2b839f55,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,72513
-timer-event-start,V8.External,72524
-timer-event-end,V8.External,72530
-timer-event-start,V8.External,72583
-timer-event-end,V8.External,72591
-timer-event-end,V8.GCScavenger,72596
-tick,0x8116878,72711,0,0x90d5060,0,0x2b85056f,0x2b83a782,0x2b839f04,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,CallIC,7,0x2b85aee0,136,concat
-timer-event-start,V8.RecompileSynchronous,72947
-timer-event-start,V8.ParseLazyMicroSeconds,72956
-timer-event-end,V8.ParseLazyMicroSeconds,72977
-code-creation,LazyCompile,0,0x2b85af80,392,sjcl.bitArray.bitSlice bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339a10,~
-timer-event-start,V8.ParseLazyMicroSeconds,73044
-timer-event-end,V8.ParseLazyMicroSeconds,73083
-timer-event-start,V8.ParseLazyMicroSeconds,73169
-timer-event-end,V8.ParseLazyMicroSeconds,73185
-timer-event-start,V8.ParseLazyMicroSeconds,73217
-timer-event-end,V8.ParseLazyMicroSeconds,73232
-timer-event-start,V8.ParseLazyMicroSeconds,73263
-timer-event-end,V8.ParseLazyMicroSeconds,73289
-timer-event-start,V8.ParseLazyMicroSeconds,73339
-timer-event-end,V8.ParseLazyMicroSeconds,73356
-timer-event-end,V8.RecompileSynchronous,73393
-timer-event-start,V8.RecompileConcurrent,73422
-tick,0x82eea09,73786,0,0x90de9b0,0,0x2b85056f,0x2b83a782,0x2b839e4e,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.ParseLazyMicroSeconds,74228
-timer-event-end,V8.RecompileConcurrent,74243
-timer-event-end,V8.ParseLazyMicroSeconds,74259
-timer-event-start,V8.CompileLazy,74267
-timer-event-start,V8.CompileFullCode,74273
-timer-event-end,V8.CompileFullCode,74291
-code-creation,LazyCompile,0,0x2b85b120,332, bsuite/kraken-once/stanford-crypto-ccm.js:55,0x2f33db50,~
-timer-event-end,V8.CompileLazy,74304
-timer-event-start,V8.RecompileSynchronous,74351
-code-creation,LazyCompile,1,0x2b85b280,4132,sjcl.bitArray.bitSlice bsuite/kraken-once/stanford-crypto-ccm.js:9,0x2f339a10,*
-timer-event-end,V8.RecompileSynchronous,74533
-tick,0x2b85a2b8,74843,0,0xf5,0,0x2b852252,0x2b8454f6,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b84a934,75905,0,0x2b855c42,0,0x2b8446a3,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,76182
-timer-event-start,V8.External,76193
-timer-event-end,V8.External,76197
-timer-event-start,V8.External,76251
-timer-event-end,V8.External,76258
-timer-event-end,V8.GCScavenger,76262
-tick,0x81168ba,76974,0,0x90d5060,0,0x2b85056f,0x2b83a782,0x2b839fd2,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x81168ba,78047,0,0x90d5060,0,0x2b85056f,0x2b83a782,0x2b839f55,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.RecompileSynchronous,78403
-timer-event-start,V8.ParseLazyMicroSeconds,78415
-timer-event-end,V8.ParseLazyMicroSeconds,78444
-code-creation,LazyCompile,0,0x2b85c2c0,717,sjcl.codec.hex.toBits bsuite/kraken-once/stanford-crypto-ccm.js:13,0x2f339e90,~
-timer-event-start,V8.ParseLazyMicroSeconds,78530
-timer-event-end,V8.ParseLazyMicroSeconds,78559
-timer-event-start,V8.ParseLazyMicroSeconds,78614
-timer-event-end,V8.ParseLazyMicroSeconds,78632
-timer-event-end,V8.RecompileSynchronous,78666
-timer-event-start,V8.RecompileConcurrent,78695
-timer-event-end,V8.RecompileConcurrent,79073
-timer-event-start,V8.RecompileSynchronous,79089
-tick,0x2b859d1c,79108,0,0x6,0,0x2b852252,0x2b8455f6,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,2,0x2b85c5a0,1421,StringAddStub
-code-creation,LazyCompile,1,0x2b85cb40,2261,sjcl.codec.hex.toBits bsuite/kraken-once/stanford-crypto-ccm.js:13,0x2f339e90,*
-timer-event-end,V8.RecompileSynchronous,79251
-timer-event-start,V8.GCScavenger,79473
-timer-event-start,V8.External,79482
-timer-event-end,V8.External,79486
-timer-event-start,V8.External,79534
-timer-event-end,V8.External,79540
-timer-event-end,V8.GCScavenger,79544
-tick,0x2b85b446,80176,0,0x256b20d1,0,0x2b848b8c,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x80c4222,81235,0,0x90d5060,0,0x2b85b578,0x2b84a349,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,82255
-timer-event-start,V8.External,82266
-timer-event-end,V8.External,82270
-tick,0x2b858631,82290,0,0x2b80a276,0,0x2b839e65,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.External,82339
-timer-event-end,V8.External,82349
-timer-event-end,V8.GCScavenger,82353
-tick,0x2b82f581,83363,0,0x2b84539a,0,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x808cf8f,84440,0,0x90dabb0,0,0x2b85599a,0x2b845482,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,85035
-timer-event-start,V8.External,85046
-timer-event-end,V8.External,85050
-timer-event-start,V8.External,85093
-timer-event-end,V8.External,85099
-timer-event-end,V8.GCScavenger,85103
-tick,0x2b829c56,85495,0,0x3e60ce29,0,0x2b852252,0x2b8454f6,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x808b74f,86567,0,0x2f308081,0,0x2b8537a0,0x2b8456a8,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b85d04c,87632,0,0x2b839f55,0,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,87755
-timer-event-start,V8.External,87766
-timer-event-end,V8.External,87770
-timer-event-start,V8.External,87822
-timer-event-end,V8.External,87829
-timer-event-end,V8.GCScavenger,87833
-timer-event-start,V8.RecompileSynchronous,88294
-timer-event-start,V8.ParseLazyMicroSeconds,88303
-timer-event-end,V8.ParseLazyMicroSeconds,88361
-code-creation,LazyCompile,0,0x2b85d420,1221,sjcl.mode.ccm.I bsuite/kraken-once/stanford-crypto-ccm.js:21,0x2f33a370,~
-timer-event-start,V8.ParseLazyMicroSeconds,88473
-timer-event-end,V8.ParseLazyMicroSeconds,88492
-timer-event-start,V8.ParseLazyMicroSeconds,88532
-timer-event-end,V8.ParseLazyMicroSeconds,88545
-timer-event-start,V8.ParseLazyMicroSeconds,88572
-timer-event-end,V8.ParseLazyMicroSeconds,88588
-timer-event-start,V8.ParseLazyMicroSeconds,88612
-timer-event-end,V8.ParseLazyMicroSeconds,88645
-timer-event-start,V8.ParseLazyMicroSeconds,88688
-timer-event-end,V8.ParseLazyMicroSeconds,88714
-tick,0x81fc61b,88727,0,0xff81ebbc,2,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.ParseLazyMicroSeconds,88792
-timer-event-end,V8.ParseLazyMicroSeconds,88867
-timer-event-start,V8.ParseLazyMicroSeconds,88951
-timer-event-end,V8.ParseLazyMicroSeconds,88967
-timer-event-start,V8.ParseLazyMicroSeconds,88996
-timer-event-end,V8.ParseLazyMicroSeconds,89012
-timer-event-end,V8.RecompileSynchronous,89134
-timer-event-start,V8.RecompileConcurrent,89160
-timer-event-start,V8.RecompileSynchronous,89215
-timer-event-start,V8.ParseLazyMicroSeconds,89224
-timer-event-end,V8.ParseLazyMicroSeconds,89245
-code-creation,LazyCompile,0,0x2b85d900,585,sjcl.bitArray.equal bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339c50,~
-timer-event-start,V8.ParseLazyMicroSeconds,89309
-timer-event-end,V8.ParseLazyMicroSeconds,89326
-timer-event-start,V8.ParseLazyMicroSeconds,89356
-timer-event-end,V8.ParseLazyMicroSeconds,89369
-timer-event-start,V8.ParseLazyMicroSeconds,89391
-timer-event-end,V8.ParseLazyMicroSeconds,89406
-timer-event-start,V8.ParseLazyMicroSeconds,89433
-timer-event-end,V8.ParseLazyMicroSeconds,89445
-timer-event-end,V8.RecompileSynchronous,89485
-timer-event-start,V8.RecompileSynchronous,89730
-timer-event-start,V8.ParseLazyMicroSeconds,89740
-tick,0x81168ba,89761,0,0x90d5060,0,0x2b85056f,0x2b85cd2d,0x2b839f04,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.ParseLazyMicroSeconds,89805
-code-creation,LazyCompile,0,0x2b85db60,1838,sjcl.mode.ccm.G bsuite/kraken-once/stanford-crypto-ccm.js:20,0x2f33a310,~
-timer-event-start,V8.ParseLazyMicroSeconds,89969
-timer-event-end,V8.ParseLazyMicroSeconds,89990
-timer-event-start,V8.ParseLazyMicroSeconds,90016
-timer-event-end,V8.ParseLazyMicroSeconds,90042
-timer-event-start,V8.ParseLazyMicroSeconds,90084
-timer-event-end,V8.ParseLazyMicroSeconds,90098
-timer-event-start,V8.ParseLazyMicroSeconds,90129
-timer-event-end,V8.ParseLazyMicroSeconds,90170
-timer-event-start,V8.ParseLazyMicroSeconds,90271
-timer-event-end,V8.ParseLazyMicroSeconds,90286
-timer-event-start,V8.ParseLazyMicroSeconds,90326
-timer-event-end,V8.ParseLazyMicroSeconds,90344
-timer-event-end,V8.RecompileSynchronous,90480
-tick,0x2b8596f9,90829,0,0x8,0,0x2b852252,0x2b8454f6,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.RecompileConcurrent,91133
-timer-event-start,V8.RecompileConcurrent,91145
-timer-event-start,V8.RecompileSynchronous,91197
-code-creation,Stub,2,0x2b85e2a0,1800,RecordWriteStub
-code-creation,Stub,2,0x2b85e9c0,1805,RecordWriteStub
-code-creation,Stub,2,0x2b85f0e0,1785,RecordWriteStub
-code-creation,Stub,2,0x2b85f7e0,1797,RecordWriteStub
-timer-event-end,V8.RecompileConcurrent,91529
-timer-event-start,V8.RecompileConcurrent,91540
-code-creation,Stub,2,0x2b85ff00,1789,RecordWriteStub
-code-creation,Stub,2,0x2b860600,1805,RecordWriteStub
-code-creation,LazyCompile,1,0x2b860d20,9288,sjcl.mode.ccm.I bsuite/kraken-once/stanford-crypto-ccm.js:21,0x2f33a370,*
-timer-event-end,V8.RecompileSynchronous,91729
-timer-event-start,V8.RecompileSynchronous,91735
-code-creation,LazyCompile,1,0x2b863180,2119,sjcl.bitArray.equal bsuite/kraken-once/stanford-crypto-ccm.js:10,0x2f339c50,*
-timer-event-end,V8.RecompileSynchronous,91833
-tick,0xf74c34b6,91883,0,0x90ebc51,2,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-deopt,91990,9312
-code-creation,LoadPolymorphicIC,5,0x2b8639e0,105,length
-tick,0x2b859a99,92950,0,0x4,0,0x2b852252,0x2b8455f6,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,93234
-timer-event-start,V8.External,93245
-timer-event-end,V8.External,93249
-timer-event-end,V8.RecompileConcurrent,93304
-timer-event-start,V8.External,93319
-timer-event-end,V8.External,93327
-timer-event-end,V8.GCScavenger,93331
-timer-event-start,V8.RecompileSynchronous,93353
-code-creation,Stub,2,0x2b863a60,1800,RecordWriteStub
-code-creation,Stub,2,0x2b864180,1780,RecordWriteStub
-code-creation,LazyCompile,1,0x2b864880,7990,sjcl.mode.ccm.G bsuite/kraken-once/stanford-crypto-ccm.js:20,0x2f33a310,*
-timer-event-end,V8.RecompileSynchronous,93732
-code-creation,LoadPolymorphicIC,5,0x2b8667c0,105,length
-code-creation,LoadPolymorphicIC,5,0x2b866840,105,length
-code-creation,LoadPolymorphicIC,5,0x2b8668c0,105,length
-tick,0x2b848cbd,94006,0,0xa,0,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,LoadPolymorphicIC,5,0x2b866940,105,length
-tick,0x8231000,95074,0,0x90d5060,0,0x2b848e54,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x83b9d75,96149,0,0x527db159,0,0x2b82364b,0x2b83a13d,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,96446
-timer-event-start,V8.External,96457
-timer-event-end,V8.External,96461
-timer-event-start,V8.External,96513
-timer-event-end,V8.External,96520
-timer-event-end,V8.GCScavenger,96524
-tick,0x2b85960c,97208,0,0xfee0,0,0x2b852252,0x2b848c4b,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b83b5b3,98279,0,0x2b851c24,0,0x2b85cd19,0x2b839f04,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,99128
-timer-event-start,V8.External,99139
-timer-event-end,V8.External,99143
-timer-event-start,V8.External,99189
-timer-event-end,V8.External,99195
-timer-event-end,V8.GCScavenger,99199
-tick,0x821c54b,99345,0,0x5270e530,0,0x2b83bd35,0x2b85ccab,0x2b839fd2,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b85a010,100416,0,0x0,0,0x2b852252,0x2b865810,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x808b5f1,101472,0,0x2f308081,0,0x2b8537a0,0x2b84a325,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,101820
-timer-event-start,V8.External,101831
-timer-event-end,V8.External,101835
-timer-event-start,V8.External,101885
-timer-event-end,V8.External,101891
-timer-event-end,V8.GCScavenger,101895
-tick,0x2b85a376,102533,0,0x9c155cd6,0,0x2b852252,0x2b865810,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b863678,103607,0,0x4c0,0,0x2b83a0df,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,104515
-timer-event-start,V8.External,104529
-timer-event-end,V8.External,104533
-timer-event-start,V8.External,104581
-timer-event-end,V8.External,104588
-timer-event-end,V8.GCScavenger,104592
-tick,0x2b85a2dc,104658,0,0x29,0,0x2b852252,0x2b8658f7,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b859e24,105742,0,0x80c5e06,0,0x2b852252,0x2b8654d2,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-deopt,106093,4416
-code-creation,Stub,12,0x2b8669c0,190,BinaryOpStub_MOD_Alloc_Smi+Smi
-tick,0x2b8514f9,106811,0,0xd1b6f5df,0,0x2b8657f1,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,107254
-timer-event-start,V8.External,107264
-timer-event-end,V8.External,107268
-timer-event-start,V8.External,107317
-timer-event-end,V8.External,107323
-timer-event-end,V8.GCScavenger,107327
-timer-event-start,V8.RecompileSynchronous,107462
-timer-event-start,V8.ParseLazyMicroSeconds,107471
-timer-event-end,V8.ParseLazyMicroSeconds,107537
-timer-event-end,V8.RecompileSynchronous,107729
-timer-event-start,V8.RecompileConcurrent,107764
-tick,0x2b859da9,107874,0,0x2,0,0x2b852252,0x2b848b65,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-end,V8.RecompileConcurrent,108795
-timer-event-start,V8.RecompileSynchronous,108885
-tick,0x2b859d60,108935,0,0x0,0,0x2b852252,0x2b8658f7,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,Stub,2,0x2b866a80,783,RecordWriteStub
-code-creation,Stub,2,0x2b866da0,1772,RecordWriteStub
-code-creation,LazyCompile,1,0x2b8674a0,4040,sjcl.cipher.aes bsuite/kraken-once/stanford-crypto-ccm.js:4,0x2f339830,*
-timer-event-end,V8.RecompileSynchronous,109204
-tick,0x2b851bd9,110005,0,0x68,0,0x2b85cd19,0x2b839f04,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,110651
-timer-event-start,V8.External,110662
-timer-event-end,V8.External,110666
-timer-event-start,V8.External,110715
-timer-event-end,V8.External,110721
-timer-event-end,V8.GCScavenger,110725
-tick,0x2b85a1d8,111072,0,0x0,0,0x2b852252,0x2b8658f7,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b848d38,112161,0,0x4c,0,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.RecompileSynchronous,112323
-timer-event-start,V8.ParseLazyMicroSeconds,112335
-timer-event-end,V8.ParseLazyMicroSeconds,112387
-timer-event-start,V8.ParseLazyMicroSeconds,112444
-timer-event-end,V8.ParseLazyMicroSeconds,112463
-timer-event-start,V8.ParseLazyMicroSeconds,112496
-timer-event-end,V8.ParseLazyMicroSeconds,112509
-timer-event-start,V8.ParseLazyMicroSeconds,112536
-timer-event-end,V8.ParseLazyMicroSeconds,112552
-timer-event-start,V8.ParseLazyMicroSeconds,112576
-timer-event-end,V8.ParseLazyMicroSeconds,112598
-timer-event-start,V8.ParseLazyMicroSeconds,112639
-timer-event-end,V8.ParseLazyMicroSeconds,112653
-timer-event-start,V8.ParseLazyMicroSeconds,112685
-timer-event-end,V8.ParseLazyMicroSeconds,112722
-timer-event-start,V8.ParseLazyMicroSeconds,112803
-timer-event-end,V8.ParseLazyMicroSeconds,112819
-timer-event-start,V8.ParseLazyMicroSeconds,112848
-timer-event-end,V8.ParseLazyMicroSeconds,112863
-timer-event-end,V8.RecompileSynchronous,112986
-timer-event-start,V8.RecompileConcurrent,113012
-tick,0x2b867dc3,113148,0,0x100,0,0x2b839e65,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,114171
-timer-event-start,V8.External,114182
-timer-event-end,V8.External,114186
-tick,0x82c920e,114254,0,0x0,1
-timer-event-start,V8.External,114309
-timer-event-end,V8.External,114330
-timer-event-end,V8.GCScavenger,114350
-timer-event-end,V8.RecompileConcurrent,115013
-timer-event-start,V8.RecompileSynchronous,115032
-tick,0x8369515,115325,0,0x9135ff0,2,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,LazyCompile,1,0x5120a000,9284,sjcl.mode.ccm.I bsuite/kraken-once/stanford-crypto-ccm.js:21,0x2f33a370,*
-timer-event-end,V8.RecompileSynchronous,115434
-code-deopt,115666,9312
-tick,0x2b85056f,116392,0,0x52f8f619,0,0x2b85cd2d,0x2b839fd2,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b812420,117465,0,0x2b85592e,0,0x2b86573b,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,117571
-timer-event-start,V8.External,117583
-timer-event-end,V8.External,117587
-timer-event-start,V8.External,117636
-timer-event-end,V8.External,117642
-timer-event-end,V8.GCScavenger,117646
-tick,0x811db13,118481,0,0x90d5060,0,0x2b85cd53,0x2b839eb3,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x80c4222,119548,0,0x90d5060,0,0x2b85599a,0x2b86573b,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,120368
-timer-event-start,V8.External,120379
-timer-event-end,V8.External,120383
-timer-event-start,V8.External,120428
-timer-event-end,V8.External,120434
-timer-event-end,V8.GCScavenger,120438
-tick,0x2b867eb3,120610,0,0x100,0,0x2b839e65,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b859eae,121680,0,0x80c5e06,0,0x2b852252,0x2b8658f7,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b85981d,122808,0,0x21,0,0x2b852252,0x2b848c4b,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,123188
-timer-event-start,V8.External,123199
-timer-event-end,V8.External,123203
-timer-event-start,V8.External,123248
-timer-event-end,V8.External,123254
-timer-event-end,V8.GCScavenger,123258
-tick,0x2b859ca8,123878,0,0x0,0,0x2b852252,0x2b865810,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x80fa2d1,124943,0,0x5279ab29,0,0x2b83bd35,0x2b85ccab,0x2b839fd2,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,126000
-timer-event-start,V8.External,126017
-timer-event-end,V8.External,126022
-tick,0x808b6b0,126038,0,0x2f308081,0,0x2b855838,0x2b848b0a,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.External,126109
-timer-event-end,V8.External,126129
-timer-event-end,V8.GCScavenger,126139
-tick,0x808b656,127081,0,0x2f308081,0,0x2b8658be,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b85a1f0,128141,0,0x1f,0,0x2b852252,0x2b848c4b,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,128896
-timer-event-start,V8.External,128907
-timer-event-end,V8.External,128911
-timer-event-start,V8.External,128958
-timer-event-end,V8.External,128964
-timer-event-end,V8.GCScavenger,128968
-tick,0x2b867d2b,129212,0,0x100,0,0x2b839e65,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b859a7b,130285,0,0x80c5e06,0,0x2b852252,0x2b865810,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b859c3b,131350,0,0x0,0,0x2b852252,0x2b8658f7,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,131713
-timer-event-start,V8.External,131723
-timer-event-end,V8.External,131727
-timer-event-start,V8.External,131772
-timer-event-end,V8.External,131778
-timer-event-end,V8.GCScavenger,131782
-tick,0x80c413f,132412,0,0x90d5060,0,0x2b855ca8,0x2b8446a3,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x80a1baf,133466,0,0x811e5c0,0,0x2b848b2e,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,134532
-tick,0x2b85d126,134550,0,0x2,0,0x2b839f04,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.External,134619
-timer-event-end,V8.External,134636
-timer-event-start,V8.External,134702
-timer-event-end,V8.External,134708
-timer-event-end,V8.GCScavenger,134712
-tick,0x2b8594d3,135617,0,0x80c5e06,0,0x2b852252,0x2b8654d2,0x2b844628,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.RecompileSynchronous,135776
-timer-event-start,V8.ParseLazyMicroSeconds,135787
-timer-event-end,V8.ParseLazyMicroSeconds,135838
-timer-event-start,V8.ParseLazyMicroSeconds,135894
-timer-event-end,V8.ParseLazyMicroSeconds,135913
-timer-event-start,V8.ParseLazyMicroSeconds,135946
-timer-event-end,V8.ParseLazyMicroSeconds,135960
-timer-event-start,V8.ParseLazyMicroSeconds,135987
-timer-event-end,V8.ParseLazyMicroSeconds,136002
-timer-event-start,V8.ParseLazyMicroSeconds,136026
-timer-event-end,V8.ParseLazyMicroSeconds,136048
-timer-event-start,V8.ParseLazyMicroSeconds,136089
-timer-event-end,V8.ParseLazyMicroSeconds,136103
-timer-event-start,V8.ParseLazyMicroSeconds,136135
-timer-event-end,V8.ParseLazyMicroSeconds,136172
-timer-event-start,V8.ParseLazyMicroSeconds,136253
-timer-event-end,V8.ParseLazyMicroSeconds,136270
-timer-event-start,V8.ParseLazyMicroSeconds,136301
-timer-event-end,V8.ParseLazyMicroSeconds,136317
-timer-event-end,V8.RecompileSynchronous,136440
-timer-event-start,V8.RecompileConcurrent,136466
-tick,0x2b859c6e,136680,0,0x0,0,0x2b852252,0x2b8658f7,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-creation,LoadPolymorphicIC,5,0x5120c460,105,length
-code-creation,LoadPolymorphicIC,5,0x5120c4e0,117,length
-code-creation,LoadPolymorphicIC,5,0x5120c560,117,length
-code-creation,LoadPolymorphicIC,5,0x5120c5e0,105,length
-code-creation,LoadPolymorphicIC,5,0x5120c660,105,length
-tick,0x2b855ece,137742,0,0x527d0961,0,0x2b8446a3,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,138203
-timer-event-start,V8.External,138213
-timer-event-end,V8.External,138217
-timer-event-start,V8.External,138271
-timer-event-end,V8.External,138277
-timer-event-end,V8.GCScavenger,138281
-timer-event-end,V8.RecompileConcurrent,138393
-timer-event-start,V8.RecompileSynchronous,138412
-code-creation,LazyCompile,1,0x5120c6e0,9284,sjcl.mode.ccm.I bsuite/kraken-once/stanford-crypto-ccm.js:21,0x2f33a370,*
-timer-event-end,V8.RecompileSynchronous,138781
-tick,0x83647f0,138812,0,0xf633ddf4,2,0x2b844670,0x2b83a0cc,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-code-deopt,138895,9312
-tick,0x2b851212,139867,0,0xff81fd00,0,0x2b8657f1,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x82ebff7,140937,0,0x2f33ca81,0,0x2b85056f,0x2b85cd2d,0x2b839fd2,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,141540
-timer-event-start,V8.External,141551
-timer-event-end,V8.External,141555
-timer-event-start,V8.External,141605
-timer-event-end,V8.External,141611
-timer-event-end,V8.GCScavenger,141615
-tick,0x2b85a0a6,142005,0,0x0,0,0x2b852252,0x2b865810,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x8116886,143088,0,0x90d5060,0,0x2b85b862,0x2b848b8c,0x2b84a58b,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b83dbaf,144137,0,0x2b85cd53,0,0x2b839fd2,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.GCScavenger,144365
-timer-event-start,V8.External,144376
-timer-event-end,V8.External,144380
-timer-event-start,V8.External,144428
-timer-event-end,V8.External,144434
-timer-event-end,V8.GCScavenger,144438
-tick,0x81168ba,145212,0,0x90d5060,0,0x2b85056f,0x2b85cd2d,0x2b839f04,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-tick,0x2b851430,146268,0,0xff81fd00,0,0x2b8657f1,0x2b84a5e0,0x2b83a281,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b85b238,0x2b83a474,0x2b838f3f,0x2b838c50,0x2b839b39,0x2b83970e,0x2b83964b,0x2b8394a8,0x2b839273,0x2b839036,0x2b838f3f,0x2b838c50,0x2b83892e,0x2b8383df,0x2b8350ac
-timer-event-start,V8.ParseLazyMicroSeconds,146339
-timer-event-end,V8.ParseLazyMicroSeconds,146358
-timer-event-start,V8.CompileLazy,146364
-timer-event-start,V8.CompileFullCode,146369
-timer-event-end,V8.CompileFullCode,146386
-code-creation,LazyCompile,0,0x5120eb40,212, bsuite/kraken-once/stanford-crypto-ccm.js:172,0x2f33dd88,~
-timer-event-end,V8.CompileLazy,146400
-code-creation,Stub,12,0x5120ec20,311,BinaryOpStub_SUB_Alloc_Generic+Generic
-timer-event-start,V8.ParseLazyMicroSeconds,146431
-timer-event-end,V8.ParseLazyMicroSeconds,146461
-timer-event-start,V8.CompileLazy,146467
-timer-event-start,V8.CompileFullCode,146475
-timer-event-end,V8.CompileFullCode,146495
-code-creation,LazyCompile,0,0x5120ed60,580,NonNumberToNumber native runtime.js:548,0x44225f78,~
-timer-event-end,V8.CompileLazy,146508
-code-creation,Stub,2,0x5120efc0,98,valueOf
-code-creation,LoadPolymorphicIC,5,0x5120f040,117,valueOf
-code-creation,CallIC,7,0x5120f0c0,129,ToNumber
-timer-event-start,V8.ParseLazyMicroSeconds,146556
-timer-event-end,V8.ParseLazyMicroSeconds,146569
-timer-event-start,V8.CompileLazy,146574
-timer-event-start,V8.CompileFullCode,146580
-timer-event-end,V8.CompileFullCode,146591
-code-creation,LazyCompile,0,0x5120f160,208,record bsuite/kraken-once/stanford-crypto-ccm.js:7229,0x2f339680,~
-timer-event-end,V8.CompileLazy,146603
-timer-event-start,V8.External,146613
-timer-event-end,V8.External,146656
-timer-event-end,V8.Execute,146662
-timer-event-start,V8.RecompileConcurrent,146700
-timer-event-end,V8.RecompileConcurrent,146738
-profiler,end
diff --git a/deps/v8/test/mjsunit/tools/profviz.js b/deps/v8/test/mjsunit/tools/profviz.js
deleted file mode 100644
index f89a2adeb3..0000000000
--- a/deps/v8/test/mjsunit/tools/profviz.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2009 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Load implementations from <project root>/tools.
-// Files: tools/csvparser.js tools/splaytree.js tools/codemap.js
-// Files: tools/consarray.js tools/profile.js tools/profile_view.js
-// Files: tools/logreader.js tools/arguments.js tools/tickprocessor.js
-// Files: tools/profviz/composer.js
-// Resources: test/mjsunit/tools/profviz-test.log
-// Resources: test/mjsunit/tools/profviz-test.default
-// Env: TEST_FILE_NAME
-
-assertEquals('string', typeof TEST_FILE_NAME);
-var path_length = TEST_FILE_NAME.lastIndexOf('/');
-if (path_length == -1) {
- path_length = TEST_FILE_NAME.lastIndexOf('\\');
-}
-assertTrue(path_length != -1);
-
-var path = TEST_FILE_NAME.substr(0, path_length + 1);
-var input_file = path + "profviz-test.log";
-var reference_file = path + "profviz-test.default";
-
-var content_lines = read(input_file).split("\n");
-var line_cursor = 0;
-var output_lines = [];
-
-function input() {
- return content_lines[line_cursor++];
-}
-
-function output(line) {
- output_lines.push(line);
-}
-
-function set_range(start, end) {
- range_start = start;
- range_end = end;
-}
-
-var distortion = 4500 / 1000000;
-var resx = 1600;
-var resy = 600;
-
-var psc = new PlotScriptComposer(resx, resy);
-psc.collectData(input, distortion);
-psc.findPlotRange(undefined, undefined, set_range);
-var objects = psc.assembleOutput(output);
-
-output("# start: " + range_start);
-output("# end: " + range_end);
-output("# objects: " + objects);
-
-var create_baseline = false;
-
-if (create_baseline) {
- print(JSON.stringify(output_lines, null, 2));
-} else {
- assertArrayEquals(JSON.parse(read(reference_file)), output_lines);
-}
diff --git a/deps/v8/test/mjsunit/tools/splaytree.js b/deps/v8/test/mjsunit/tools/splaytree.mjs
index d582dc972f..9da03cb0f4 100644
--- a/deps/v8/test/mjsunit/tools/splaytree.js
+++ b/deps/v8/test/mjsunit/tools/splaytree.mjs
@@ -25,8 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load the Splay tree implementation from <project root>/tools.
-// Files: tools/splaytree.js
+import { SplayTree } from "../../../tools/splaytree.mjs";
(function testIsEmpty() {
diff --git a/deps/v8/test/mjsunit/tools/tickprocessor.js b/deps/v8/test/mjsunit/tools/tickprocessor.mjs
index 07d0646b64..5ba23f51fc 100644
--- a/deps/v8/test/mjsunit/tools/tickprocessor.js
+++ b/deps/v8/test/mjsunit/tools/tickprocessor.mjs
@@ -25,10 +25,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Load implementations from <project root>/tools.
-// Files: tools/splaytree.js tools/codemap.js tools/csvparser.js
-// Files: tools/consarray.js tools/profile.js tools/profile_view.js
-// Files: tools/logreader.js tools/arguments.js tools/tickprocessor.js
// Resources: test/mjsunit/tools/tickprocessor-test-func-info.log
// Resources: test/mjsunit/tools/tickprocessor-test.default
// Resources: test/mjsunit/tools/tickprocessor-test.func-info
@@ -39,6 +35,11 @@
// Resources: test/mjsunit/tools/tickprocessor-test.separate-ic
// Env: TEST_FILE_NAME
+import {
+ TickProcessor, ArgumentsProcessor, UnixCppEntriesProvider,
+ MacCppEntriesProvider, WindowsCppEntriesProvider, readFile
+} from "../../../tools/tickprocessor.mjs";
+
(function testArgumentsProcessor() {
var p_default = new ArgumentsProcessor([]);
diff --git a/deps/v8/test/mjsunit/tools/timeline.mjs b/deps/v8/test/mjsunit/tools/timeline.mjs
new file mode 100644
index 0000000000..07fd605992
--- /dev/null
+++ b/deps/v8/test/mjsunit/tools/timeline.mjs
@@ -0,0 +1,31 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import { Timeline } from "../../../tools/system-analyzer/timeline.mjs";
+import { Event } from "../../../tools/system-analyzer/log/log.mjs";
+
+
+(function testTimeline() {
+ let timeline = new Timeline();
+ let id1 = "0x3e7e082470cd";
+ let id2 = "0x3e7e082470ad";
+ let time = 12;
+ let event1 = new Event(id1, time);
+ let event2 = new Event(id1, time + 1);
+ let event3 = new Event(id1, time + 2);
+ let event4 = new Event(id1, time + 3);
+ let event5 = new Event(id2, time + 3);
+ timeline.push(event1);
+ timeline.push(event2);
+ timeline.push(event3);
+ timeline.push(event4);
+ timeline.push(event5);
+ let startTime = time;
+ let endTime = time + 2;
+ timeline.selectTimeRange(startTime, endTime);
+ assertArrayEquals(timeline.selection, [event1, event2, event3]);
+ let entryIdx = timeline.find(time + 1);
+ let entry = timeline.at(entryIdx);
+ assertEquals(entry.time, time + 1);
+})();
diff --git a/deps/v8/test/mjsunit/wasm/anyfunc.js b/deps/v8/test/mjsunit/wasm/anyfunc.js
index 0f04dbbeb0..259eb53f06 100644
--- a/deps/v8/test/mjsunit/wasm/anyfunc.js
+++ b/deps/v8/test/mjsunit/wasm/anyfunc.js
@@ -48,7 +48,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const gc_index = builder.addImport('q', 'gc', void_sig);
// First call the gc, then check if the object still exists.
builder.addFunction('main', ref_sig)
- .addLocals({anyfunc_count: 10})
+ .addLocals(kWasmAnyFunc, 10)
.addBody([
kExprLocalGet, 0,
kExprLocalSet, 1, // Set local
@@ -139,7 +139,7 @@ load('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
const sig_index = builder.addType(kSig_a_v);
builder.addFunction('main', sig_index)
- .addLocals({anyfunc_count: 1})
+ .addLocals(kWasmAnyFunc, 1)
.addBody([kExprLocalGet, 0])
.exportFunc();
diff --git a/deps/v8/test/mjsunit/wasm/atomics.js b/deps/v8/test/mjsunit/wasm/atomics.js
index 264662f2ac..9826a155a8 100644
--- a/deps/v8/test/mjsunit/wasm/atomics.js
+++ b/deps/v8/test/mjsunit/wasm/atomics.js
@@ -437,7 +437,7 @@ function CmpExchgLoop(opcode, alignment) {
let builder = new WasmModuleBuilder();
builder.addImportedMemory("m", "imported_mem", 0, 2, "shared");
builder.addFunction("main", makeSig([kWasmI32], []))
- .addLocals({i64_count: 2})
+ .addLocals(kWasmI64, 2)
.addBody([
kExprLoop, kWasmStmt,
kExprLocalGet, 0,
diff --git a/deps/v8/test/mjsunit/wasm/call-ref.js b/deps/v8/test/mjsunit/wasm/call-ref.js
index 355986cf6b..1112ed8e3d 100644
--- a/deps/v8/test/mjsunit/wasm/call-ref.js
+++ b/deps/v8/test/mjsunit/wasm/call-ref.js
@@ -7,72 +7,72 @@
load("test/mjsunit/wasm/wasm-module-builder.js");
(function Test1() {
+ var exporting_instance = (function () {
+ var builder = new WasmModuleBuilder();
+
+ builder.addFunction("addition", kSig_i_ii)
+ .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Add])
+ .exportFunc();
+
+ return builder.instantiate({});
+ })();
+
var instance = (function () {
var builder = new WasmModuleBuilder();
var sig_index = builder.addType(kSig_i_ii);
- var imported_webassembly_function_index =
+ var imported_type_reflection_function_index =
builder.addImport("imports", "mul", sig_index);
var imported_js_function_index =
- builder.addImport("imports", "add", sig_index);
+ builder.addImport("imports", "js_add", sig_index);
+
+ var imported_wasm_function_index =
+ builder.addImport("imports", "wasm_add", sig_index);
- builder.addExport("reexported_js_function",
- imported_js_function_index);
+ builder.addExport("unused", imported_wasm_function_index);
+ builder.addExport("reexported_js_function", imported_js_function_index);
builder.addExport("reexported_webassembly_function",
- imported_webassembly_function_index);
+ imported_type_reflection_function_index);
var locally_defined_function =
builder.addFunction("sub", sig_index)
- .addBody([
- kExprLocalGet, 0,
- kExprLocalGet, 1,
- kExprI32Sub
- ])
+ .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Sub])
.exportFunc();
- builder.addFunction("main", makeSig([kWasmAnyFunc, kWasmI32, kWasmI32],
- [kWasmI32]))
- .addBody([
- kExprLocalGet, 1,
- kExprLocalGet, 2,
- kExprLocalGet, 0,
- kGCPrefix, kExprRttCanon, 0,
- kGCPrefix, kExprRefCast, kWasmAnyFunc, 0,
- kExprCallRef
- ])
+ builder.addFunction("main", makeSig(
+ [wasmRefType(sig_index), kWasmI32, kWasmI32], [kWasmI32]))
+ .addBody([kExprLocalGet, 1, kExprLocalGet, 2, kExprLocalGet, 0,
+ kExprCallRef])
.exportFunc();
- builder.addFunction("test_local", makeSig([], [kWasmI32]))
- .addBody([
- kExprI32Const, 55,
- kExprI32Const, 42,
- kExprRefFunc, locally_defined_function.index,
- kExprCallRef
- ])
- .exportFunc();
-
- builder.addFunction("test_js_import", makeSig([], [kWasmI32]))
- .addBody([
- kExprI32Const, 15,
- kExprI32Const, 42,
- kExprRefFunc, imported_js_function_index,
- kExprCallRef
- ])
+ builder.addFunction("test_local", kSig_i_v)
+ .addBody([kExprI32Const, 55, kExprI32Const, 42,
+ kExprRefFunc, locally_defined_function.index, kExprCallRef])
.exportFunc();
- builder.addFunction("test_webassembly_import", makeSig([], [kWasmI32]))
- .addBody([
- kExprI32Const, 3,
- kExprI32Const, 7,
- kExprRefFunc, imported_webassembly_function_index,
- kExprCallRef
- ])
+ builder.addFunction("test_js_import", kSig_i_v)
+ .addBody([kExprI32Const, 15, kExprI32Const, 42,
+ kExprRefFunc, imported_js_function_index, kExprCallRef])
.exportFunc();
+ builder.addFunction("test_wasm_import", kSig_i_v)
+ .addBody([kExprI32Const, 15, kExprI32Const, 42,
+ kExprRefFunc, imported_wasm_function_index, kExprCallRef])
+ .exportFunc();
+
+ /* Future use
+ builder.addFunction("test_webassembly_import", kSig_i_v)
+ .addBody([kExprI32Const, 3, kExprI32Const, 7,
+ kExprRefFunc, imported_type_reflection_function_index,
+ kExprCallRef])
+ .exportFunc();
+ */
+
return builder.instantiate({imports: {
- add: function(a, b) { return a + b; },
+ js_add: function(a, b) { return a + b; },
+ wasm_add: exporting_instance.exports.addition,
mul: new WebAssembly.Function({parameters:['i32', 'i32'],
results: ['i32']},
function(a, b) { return a * b; })
@@ -97,9 +97,15 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
assertEquals(19, instance.exports.main(
instance.exports.reexported_js_function, 12, 7));
- // TODO(7748): Make this work.
+ print("--imported function from another module--");
+ assertEquals(57, instance.exports.test_wasm_import());
+ print("--not imported function defined in another module--");
+ assertEquals(19, instance.exports.main(
+ exporting_instance.exports.addition, 12, 7));
+
+ // TODO(7748): Make these work once we know how we interact
+ // with the 'type reflection' proposal.
//print("--imported WebAssembly.Function--")
//assertEquals(21, instance.exports.test_webassembly_import());
-
//print(" --not imported WebAssembly.Function--")
})();
diff --git a/deps/v8/test/mjsunit/wasm/compare-exchange-stress.js b/deps/v8/test/mjsunit/wasm/compare-exchange-stress.js
index f7607e144d..97ed71b9e1 100644
--- a/deps/v8/test/mjsunit/wasm/compare-exchange-stress.js
+++ b/deps/v8/test/mjsunit/wasm/compare-exchange-stress.js
@@ -126,9 +126,7 @@ function makeWorkerCodeForOpcode(compareExchangeOpcode, size, functionName,
builder.addFunction(functionName, makeSig([kWasmI32, kWasmI32, kWasmI32,
kWasmI32, kWasmI32
], []))
- .addLocals({
- i32_count: 3
- })
+ .addLocals(kWasmI32, 3)
.addBody(body)
.exportAs(functionName);
}
@@ -147,8 +145,8 @@ function spawnWorker(module, memory, address, sequence) {
`onmessage = function(msg) {
this.instance = new WebAssembly.Instance(msg.module,
{m: {imported_mem: msg.memory}});
- instance.exports.worker(msg.address, msg.sequence, msg.sequenceLength, msg.workerId,
- msg.bitMask);
+ instance.exports.worker(msg.address, msg.sequence,
+ msg.sequenceLength, msg.workerId, msg.bitMask);
postMessage({workerId: msg.workerId});
}`,
{type: 'string'}
diff --git a/deps/v8/test/mjsunit/wasm/compare-exchange64-stress.js b/deps/v8/test/mjsunit/wasm/compare-exchange64-stress.js
index 05d3476193..be219f3a07 100644
--- a/deps/v8/test/mjsunit/wasm/compare-exchange64-stress.js
+++ b/deps/v8/test/mjsunit/wasm/compare-exchange64-stress.js
@@ -131,9 +131,7 @@ function makeWorkerCodeForOpcode(compareExchangeOpcode, size, functionName,
builder.addFunction(functionName, makeSig([kWasmI32, kWasmI32, kWasmI32,
kWasmI32, kWasmI32
], []))
- .addLocals({
- i32_count: 1, i64_count: 2
- })
+ .addLocals(kWasmI32, 1).addLocals(kWasmI64, 2)
.addBody(body)
.exportAs(functionName);
}
diff --git a/deps/v8/test/mjsunit/wasm/errors.js b/deps/v8/test/mjsunit/wasm/errors.js
index 4362895d62..3b37ba563b 100644
--- a/deps/v8/test/mjsunit/wasm/errors.js
+++ b/deps/v8/test/mjsunit/wasm/errors.js
@@ -110,7 +110,8 @@ function import_error(index, module, func, msg) {
b = builder();
msg = import_error(
0, 'foo', 'bar',
- 'global import must be a number or WebAssembly.Global object');
+ 'global import must be a number, valid Wasm reference, '
+ + 'or WebAssembly.Global object');
b.addImportedGlobal('foo', 'bar', kWasmI32);
assertLinkError(b.toBuffer(), {foo: {}}, msg);
b = builder();
diff --git a/deps/v8/test/mjsunit/wasm/exceptions-externref.js b/deps/v8/test/mjsunit/wasm/exceptions-externref.js
index b405be80a8..f91132401e 100644
--- a/deps/v8/test/mjsunit/wasm/exceptions-externref.js
+++ b/deps/v8/test/mjsunit/wasm/exceptions-externref.js
@@ -105,7 +105,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
let builder = new WasmModuleBuilder();
let except = builder.addException(kSig_v_a);
builder.addFunction("throw_catch_local", kSig_a_v)
- .addLocals({anyfunc_count: 1})
+ .addLocals(kWasmAnyFunc, 1)
.addBody([
kExprTry, kWasmAnyFunc,
kExprLocalGet, 0,
diff --git a/deps/v8/test/mjsunit/wasm/exceptions-rethrow.js b/deps/v8/test/mjsunit/wasm/exceptions-rethrow.js
index be609cbf2d..0264115d7e 100644
--- a/deps/v8/test/mjsunit/wasm/exceptions-rethrow.js
+++ b/deps/v8/test/mjsunit/wasm/exceptions-rethrow.js
@@ -21,7 +21,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
kExprEnd,
]).exportFunc();
builder.addFunction("rethrow1", kSig_i_i)
- .addLocals({except_count: 1})
+ .addLocals(kWasmExnRef, 1)
.addBody([
kExprTry, kWasmI32,
kExprThrow, except,
@@ -51,7 +51,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
let except1 = builder.addException(kSig_v_v);
let except2 = builder.addException(kSig_v_v);
builder.addFunction("rethrow_nested", kSig_i_i)
- .addLocals({except_count: 2})
+ .addLocals(kWasmExnRef, 2)
.addBody([
kExprTry, kWasmI32,
kExprThrow, except2,
@@ -93,7 +93,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
let builder = new WasmModuleBuilder();
let except = builder.addException(kSig_v_v);
builder.addFunction("rethrow_recatch", kSig_i_i)
- .addLocals({except_count: 1})
+ .addLocals(kWasmExnRef, 1)
.addBody([
kExprTry, kWasmI32,
kExprThrow, except,
diff --git a/deps/v8/test/mjsunit/wasm/exceptions-simd.js b/deps/v8/test/mjsunit/wasm/exceptions-simd.js
index 0b407af5c0..bfa8d60757 100644
--- a/deps/v8/test/mjsunit/wasm/exceptions-simd.js
+++ b/deps/v8/test/mjsunit/wasm/exceptions-simd.js
@@ -13,7 +13,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
var kSig_v_s = makeSig([kWasmS128], []);
var except = builder.addException(kSig_v_s);
builder.addFunction("throw_simd", kSig_v_v)
- .addLocals({s128_count: 1})
+ .addLocals(kWasmS128, 1)
.addBody([
kExprLocalGet, 0,
kExprThrow, 0,
@@ -31,7 +31,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
var kSig_v_s = makeSig([kWasmS128], []);
var except = builder.addException(kSig_v_s);
builder.addFunction("throw_catch_simd", kSig_i_v)
- .addLocals({s128_count: 1})
+ .addLocals(kWasmS128, 1)
.addBody([
kExprTry, kWasmS128,
kExprLocalGet, 0,
diff --git a/deps/v8/test/mjsunit/wasm/exceptions.js b/deps/v8/test/mjsunit/wasm/exceptions.js
index de1026c045..5d5fc5de73 100644
--- a/deps/v8/test/mjsunit/wasm/exceptions.js
+++ b/deps/v8/test/mjsunit/wasm/exceptions.js
@@ -12,7 +12,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
builder.addFunction("push_and_drop_exnref", kSig_v_v)
- .addLocals({except_count: 1})
+ .addLocals(kWasmExnRef, 1)
.addBody([
kExprLocalGet, 0,
kExprDrop,
@@ -343,7 +343,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
let builder = new WasmModuleBuilder();
let except = builder.addException(kSig_v_v);
builder.addFunction("catch_complex", kSig_i_i)
- .addLocals({except_count: 1})
+ .addLocals(kWasmExnRef, 1)
.addBody([
kExprBlock, kWasmI32,
kExprTry, kWasmStmt,
@@ -467,7 +467,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
let builder = new WasmModuleBuilder();
let except = builder.addException(kSig_v_l);
builder.addFunction("throw_catch_param", kSig_i_i)
- .addLocals({i64_count: 1})
+ .addLocals(kWasmI64, 1)
.addBody([
kExprLocalGet, 0,
kExprI64UConvertI32,
@@ -661,7 +661,7 @@ load("test/mjsunit/wasm/exceptions-utils.js");
.exportFunc();
builder.addFunction("same_scope_multiple", kSig_i_i)
- .addLocals({i32_count: 1, except_count: 1})
+ .addLocals(kWasmI32, 1).addLocals(kWasmExnRef, 1)
// path = 0;
//
// try {
diff --git a/deps/v8/test/mjsunit/wasm/externref-globals-liftoff.js b/deps/v8/test/mjsunit/wasm/externref-globals-liftoff.js
new file mode 100644
index 0000000000..53fb6ea0ab
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/externref-globals-liftoff.js
@@ -0,0 +1,8 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-reftypes --expose-gc --liftoff
+// Flags: --no-wasm-tier-up --liftoff-extern-ref
+
+load("test/mjsunit/wasm/externref-globals.js");
diff --git a/deps/v8/test/mjsunit/wasm/externref-globals.js b/deps/v8/test/mjsunit/wasm/externref-globals.js
index ce89cf73db..278d1ab27b 100644
--- a/deps/v8/test/mjsunit/wasm/externref-globals.js
+++ b/deps/v8/test/mjsunit/wasm/externref-globals.js
@@ -594,3 +594,25 @@ function dummy_func() {
assertSame(expected_wasm, instance.exports.get_global_wasm());
assertSame(expected_val, instance.exports.get_global_js()());
})();
+
+(function TestSetGlobalWriteBarrier() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ const global = builder.addGlobal(kWasmExternRef, true).index;
+ builder.addFunction("set_global", kSig_v_r)
+ .addBody([kExprLocalGet, 0, kExprGlobalSet, global])
+ .exportFunc();
+ builder.addFunction("get_global", kSig_r_v)
+ .addBody([kExprGlobalGet, global])
+ .exportFunc();
+
+ const instance = builder.instantiate();
+ // Trigger GC twice to make sure the instance is moved to mature space.
+ gc();
+ gc();
+ const test_value = { hello: 'world' };
+ instance.exports.set_global(test_value);
+ // Run another GC to test if the writebarrier existed.
+ gc();
+ assertSame(test_value, instance.exports.get_global());
+})();
diff --git a/deps/v8/test/mjsunit/wasm/externref-liftoff.js b/deps/v8/test/mjsunit/wasm/externref-liftoff.js
new file mode 100644
index 0000000000..bf10030837
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/externref-liftoff.js
@@ -0,0 +1,8 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --expose-wasm --experimental-wasm-reftypes --expose-gc --liftoff
+// Flags: --no-wasm-tier-up --liftoff-extern-ref
+
+load("test/mjsunit/wasm/externref.js");
diff --git a/deps/v8/test/mjsunit/wasm/externref.js b/deps/v8/test/mjsunit/wasm/externref.js
index 3b6b563731..cf4c8a41e7 100644
--- a/deps/v8/test/mjsunit/wasm/externref.js
+++ b/deps/v8/test/mjsunit/wasm/externref.js
@@ -53,7 +53,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
const gc_index = builder.addImport("q", "gc", void_sig);
// First call the gc, then check if the object still exists.
builder.addFunction('main', ref_sig)
- .addLocals({externref_count: 10})
+ .addLocals(kWasmExternRef, 10)
.addBody([
kExprLocalGet, 0, kExprLocalSet, 1, // Set local
kExprLocalGet, 0, kExprLocalSet, 2, // Set local
@@ -209,7 +209,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
const builder = new WasmModuleBuilder();
builder.addFunction('main', kSig_r_v)
.addBody([kExprLocalGet, 0])
- .addLocals({externref_count: 1})
+ .addLocals(kWasmExternRef, 1)
.exportFunc();
const instance = builder.instantiate();
diff --git a/deps/v8/test/mjsunit/wasm/futex.js b/deps/v8/test/mjsunit/wasm/futex.js
index 8f5dce943a..d142b95d35 100644
--- a/deps/v8/test/mjsunit/wasm/futex.js
+++ b/deps/v8/test/mjsunit/wasm/futex.js
@@ -54,7 +54,7 @@ function WasmI64AtomicWait(memory, offset, index, val_low,
// I64 for the instruction parameter.
builder.addFunction("main",
makeSig([kWasmI32, kWasmI32, kWasmI32, kWasmF64], [kWasmI32]))
- .addLocals({i64_count: 1}) // local that is passed as value param to wait
+ .addLocals(kWasmI64, 1) // local that is passed as value param to wait
.addBody([
kExprLocalGet, 1,
kExprI64UConvertI32,
diff --git a/deps/v8/test/mjsunit/wasm/generic-wrapper.js b/deps/v8/test/mjsunit/wasm/generic-wrapper.js
index e8bafcd7ae..1f0845a968 100644
--- a/deps/v8/test/mjsunit/wasm/generic-wrapper.js
+++ b/deps/v8/test/mjsunit/wasm/generic-wrapper.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --wasm-generic-wrapper --expose-gc
+// Flags: --wasm-generic-wrapper --expose-gc --allow-natives-syntax
load("test/mjsunit/wasm/wasm-module-builder.js");
@@ -74,7 +74,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
}
let instance = builder.instantiate({ mod: { func: import_func } });
- instance.exports.main(5);
+ assertEquals(undefined, instance.exports.main(5));
assertEquals(17, x);
})();
@@ -97,6 +97,651 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
let y = { valueOf: () => { print("Hello!"); gc(); return 24; } };
let instance = builder.instantiate({ mod: { func: import_func } });
- instance.exports.main(y);
+ assertEquals(undefined, instance.exports.main(y));
assertEquals(36, x);
})();
+
+(function testGenericWrapper4Param() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiii);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4) {
+ gc();
+ x += 2 * param1 + 3 * param2 + 4 * param3 + 5 * param4;
+ }
+
+ let param2 = { valueOf: () => { gc(); return 6; } };
+ let param3 = { valueOf: () => { gc(); return 3; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(9, param2, param3, 0));
+ assertEquals(60, x);
+ // Now we test if the evaluation order of the parameters is correct.
+ x = 12;
+ param3 = {
+ valueOf: () => {
+ Object.defineProperty(param2, 'valueOf', {
+ value: () => 30
+ })
+ return 3;
+ }
+ };
+ assertEquals(undefined, instance.exports.main(9, param2, param3, 0));
+ assertEquals(60, x);
+})();
+
+let kSig_v_iiiiiiii = makeSig([kWasmI32, kWasmI32, kWasmI32, kWasmI32,
+ kWasmI32, kWasmI32, kWasmI32, kWasmI32], []);
+
+(function testGenericWrapper8Param() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiiiiiii);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprLocalGet, 6,
+ kExprLocalGet, 7,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4, param5, param6,
+ param7, param8) {
+ gc();
+ x += param1 + 2 * param2 + 3 * param3 + 4 * param4 + 5 * param5
+ + 6 * param6 + 7 * param7 + 8 * param8;
+ }
+
+ let param1 = { valueOf: () => { gc(); return 5; } };
+ let param4 = { valueOf: () => { gc(); return 8; } };
+ let param6 = { valueOf: () => { gc(); return 10; } };
+ let param8 = { valueOf: () => { gc(); return 12; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(param1, 6, 7, param4, 9, param6, 11, param8));
+ assertEquals(360, x);
+})();
+
+// Passing less parameters than expected.
+(function testGenericWrapper4ParamWithLessParams() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiii);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4) {
+ gc();
+ x += param1 + param2 + param3 + param4;
+ }
+
+ let param2 = { valueOf: () => { gc(); return 3; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(5, param2));
+ assertEquals(20, x);
+})();
+
+// Passing more parameters than expected.
+(function testGenericWrapper4ParamWithMoreParams() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiii);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4) {
+ gc();
+ x += param1 + param2 + param3 + param4;
+ }
+
+ let param2 = { valueOf: () => { gc(); return 3; } };
+ let param3 = { valueOf: () => { gc(); return 6; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(5, param2, param3, 7, 200, 300, 400));
+ assertEquals(33, x);
+})();
+
+(function testGenericWrapper1I32ReturnSmi() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_i_i);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0, kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param) {
+ gc();
+ return x + param;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(17, instance.exports.main(5));
+})();
+
+(function testGenericWrapper1I32ReturnHeapNumber() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_i_i);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0, kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 2147483640;
+ function import_func(param) {
+ let result = x + param;
+ %SimulateNewspaceFull();
+ return result;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(2147483645, instance.exports.main(5));
+})();
+
+let kSig_i_lili = makeSig([kWasmI64, kWasmI32, kWasmI64, kWasmI32], [kWasmI32]);
+
+(function testGenericWrapper4IParam1I32Ret() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_i_lili);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12n;
+ function import_func(param1, param2, param3, param4) {
+ x += 2n * param1 + BigInt(3 * param2) + 4n * param3 + BigInt(5 * param4);
+ return Number(x);
+ }
+
+ let param2 = { valueOf: () => { gc(); return 6; } };
+ let param3 = { valueOf: () => { gc(); return 3n; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(60, instance.exports.main(9n, param2, param3, 0));
+})();
+
+let kSig_v_iiili = makeSig([kWasmI32, kWasmI32, kWasmI32, kWasmI64,
+ kWasmI32], []);
+
+(function testGenericWrapper5IParam() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiili);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4, param5) {
+ gc();
+ x += 2 * param1 + 3 * param2 + 4 * param3 + 5 * Number(param4) + 6 * param5;
+ }
+
+ let param2 = { valueOf: () => { gc(); return 6; } };
+ let param3 = { valueOf: () => { gc(); return 3; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(9, param2, param3, 0n, 2));
+ assertEquals(72, x);
+})();
+
+let kSig_v_iiilii = makeSig([kWasmI32, kWasmI32, kWasmI32, kWasmI64,
+ kWasmI32, kWasmI32], []);
+
+(function testGenericWrapper6IParam() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiilii);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4, param5, param6) {
+ gc();
+ x += 2 * param1 + 3 * param2 + 4 * param3 + 5 * Number(param4) + 6 * param5 + 7 * param6;
+ }
+
+ let param2 = { valueOf: () => { gc(); return 6; } };
+ let param3 = { valueOf: () => { gc(); return 3; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(9, param2, param3, 0n, 2, 3));
+ assertEquals(93, x);
+})();
+
+let kSig_v_liilliiil = makeSig([kWasmI64, kWasmI32, kWasmI32, kWasmI64,
+ kWasmI64, kWasmI32, kWasmI32, kWasmI32, kWasmI64], [kWasmI32]);
+
+(function testGenericWrapper9IParam132Ret() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_liilliiil);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprLocalGet, 6,
+ kExprLocalGet, 7,
+ kExprLocalGet, 8,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4, param5, param6,
+ param7, param8, param9) {
+ x += Number(param1) + 2 * param2 + 3 * param3 + Number(4n * param4) + Number(5n * param5)
+ + 6 * param6 + 7 * param7 + 8 * param8 + Number(9n * param9);
+ return x;
+ }
+
+ let param1 = { valueOf: () => { gc(); return 5n; } };
+ let param4 = { valueOf: () => { gc(); return 8n; } };
+ let param6 = { valueOf: () => { gc(); return 10; } };
+ let param8 = { valueOf: () => { gc(); return 12; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(360, instance.exports.main(param1, 6, 7, param4, 9n, param6, 11, param8, 0n));
+})();
+
+// The function expects BigInt, but gets Number.
+(function testGenericWrapperTypeError() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_l);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0, kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12n;
+ function import_func(param1) {
+ x += param1;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertThrows(() => { instance.exports.main(17) }, TypeError);
+})();
+
+(function testGenericWrapper1I64Return() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_l_v);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ function import_func() {
+ gc();
+ return 10000000000n;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(10000000000n, instance.exports.main());
+})();
+
+(function testGenericWrapper1F32Return() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_f_v);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ function import_func() {
+ gc();
+ return 0.5;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(0.5, instance.exports.main());
+})();
+
+(function testGenericWrapper1F64Return() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_d_v);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ function import_func() {
+ gc();
+ return 0.25;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(0.25, instance.exports.main());
+})();
+
+(function testGenericWrapper1Float32() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_f);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0, kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12.5;
+ function import_func(param) {
+ gc();
+ x += param;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(12.5));
+ assertEquals(25, x);
+})();
+
+(function testGenericWrapper1Float64() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_d);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0, kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12.5;
+ function import_func(param) {
+ gc();
+ x += param;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(12.5));
+ assertEquals(25, x);
+})();
+
+let kSig_v_ffddddff = makeSig([kWasmF32, kWasmF32, kWasmF64, kWasmF64,
+ kWasmF64, kWasmF64, kWasmF32, kWasmF32], []);
+
+(function testGenericWrapper8Floats() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_ffddddff);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprLocalGet, 6,
+ kExprLocalGet, 7,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4, param5, param6,
+ param7, param8) {
+ gc();
+ x += param1 + 2 * param2 + 3 * param3 + 4 * param4 + 5 * param5
+ + 6 * param6 + 7 * param7 + 8 * param8;
+ }
+
+ let param1 = { valueOf: () => { gc(); return 1.5; } };
+ let param4 = { valueOf: () => { gc(); return 4.5; } };
+ let param6 = { valueOf: () => { gc(); return 6.5; } };
+ let param8 = { valueOf: () => { gc(); return 8.5; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(param1, 2.5, 3.5, param4,
+ 5.5, param6, 7.5, param8));
+ assertEquals(234, x);
+})();
+
+let kSig_v_iiliffddlfdff = makeSig([kWasmI32, kWasmI32, kWasmI64,
+ kWasmI32, kWasmF32, kWasmF32, kWasmF64, kWasmF64, kWasmI64, kWasmF32,
+ kWasmF64, kWasmF32, kWasmF32], []);
+// Floats don't fit into param registers.
+(function testGenericWrapper13ParamMix() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiliffddlfdff);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprLocalGet, 6,
+ kExprLocalGet, 7,
+ kExprLocalGet, 8,
+ kExprLocalGet, 9,
+ kExprLocalGet, 10,
+ kExprLocalGet, 11,
+ kExprLocalGet, 12,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ let y = 1.0;
+ function import_func(parami1, parami2, paraml1, parami3, paramf1, paramf2,
+ paramd1, paramd2, paraml2, paramf3, paramd3, paramf4, paramf5) {
+ gc();
+ x += parami1 + 2 * parami2 + 3 * Number(paraml1) + 4 * parami3
+ + 5 * Number(paraml2);
+ y += paramf1 + 2 * paramf2 + 3 * paramd1 + 4 * paramd2 + 5 * paramf3
+ + 6 * paramd3 + 7 * paramf4 + 8 * paramf5;
+ }
+
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(5, 6, 7n, 8, 1.5, 2.5, 3.5,
+ 4.5, 11n, 5.5, 6.5, 7.5, 8.5));
+ assertEquals(137, x);
+ assertEquals(223, y);
+})();
+
+let kSig_v_iiliiiffddli = makeSig([kWasmI32, kWasmI32, kWasmI64, kWasmI32,
+ kWasmI32, kWasmI32, kWasmF32, kWasmF32, kWasmF64, kWasmF64, kWasmI64,
+ kWasmI32], []);
+// Integers don't fit into param registers.
+(function testGenericWrapper12ParamMix() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_v_iiliiiffddli);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprLocalGet, 6,
+ kExprLocalGet, 7,
+ kExprLocalGet, 8,
+ kExprLocalGet, 9,
+ kExprLocalGet, 10,
+ kExprLocalGet, 11,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ let y = 1.0;
+ function import_func(param1, param2, param3, param4, param5, param6,
+ paramf1, paramf2, paramd1, paramd2, param7, param8) {
+ gc();
+ x += param1 + 2 * param2 + 3 * Number(param3) + 4 * param4 + 5 * param5
+ + 6 * param6 + 7 * Number(param7) + 8 * param8;
+ y += paramf1 + paramf2 + paramd1 + paramd2;
+ }
+
+ let param1 = { valueOf: () => { gc(); return 5; } };
+ let param4 = { valueOf: () => { gc(); return 8; } };
+ let param6 = { valueOf: () => { gc(); return 10; } };
+ let param8 = { valueOf: () => { gc(); return 12; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(undefined, instance.exports.main(param1, 6, 7n, param4, 9, param6,
+ 1.5, 2.5, 3.6, 4.4, 11n, param8));
+ assertEquals(360, x);
+ assertEquals(13, y);
+})();
+
+let kSig_f_iiliiiffddlifffdi = makeSig([kWasmI32, kWasmI32, kWasmI64, kWasmI32,
+ kWasmI32, kWasmI32, kWasmF32, kWasmF32, kWasmF64, kWasmF64, kWasmI64,
+ kWasmI32, kWasmF32, kWasmF32, kWasmF32, kWasmF64, kWasmI32], [kWasmF32]);
+// Integers and floats don't fit into param registers.
+(function testGenericWrapper17ParamMix() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_f_iiliiiffddlifffdi);
+ let func_index = builder.addImport("mod", "func", sig_index);
+ builder.addFunction("main", sig_index)
+ .addBody([
+ kExprLocalGet, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 2,
+ kExprLocalGet, 3,
+ kExprLocalGet, 4,
+ kExprLocalGet, 5,
+ kExprLocalGet, 6,
+ kExprLocalGet, 7,
+ kExprLocalGet, 8,
+ kExprLocalGet, 9,
+ kExprLocalGet, 10,
+ kExprLocalGet, 11,
+ kExprLocalGet, 12,
+ kExprLocalGet, 13,
+ kExprLocalGet, 14,
+ kExprLocalGet, 15,
+ kExprLocalGet, 16,
+ kExprCallFunction, func_index
+ ])
+ .exportFunc();
+
+ let x = 12;
+ function import_func(param1, param2, param3, param4, param5, param6,
+ paramf1, paramf2, paramd1, paramd2, param7, param8, paramf3, paramf4,
+ paramf5, paramd3, param9) {
+ gc();
+ x += param1 + 2 * param2 + 3 * Number(param3) + 4 * param4 + 5 * param5
+ + 6 * param6 + 7 * Number(param7) + 8 * param8 + 9 * param9;
+ let y = 1.0;
+ y += paramf1 + 2 * paramf2 + 3 * paramd1 + 4 * paramd2 + 5 * paramf3
+ + 6 * paramf4 + 7 * paramf5 + 8 * paramd3;
+ return y;
+ }
+
+ let param1 = { valueOf: () => { gc(); return 5; } };
+ let param4 = { valueOf: () => { gc(); return 8; } };
+ let param6 = { valueOf: () => { gc(); return 10; } };
+ let param8 = { valueOf: () => { gc(); return 12; } };
+ let paramd1 = { valueOf: () => { gc(); return 3.5; } };
+ let paramf3 = { valueOf: () => { gc(); return 5.5; } };
+ let param9 = { valueOf: () => { gc(); return 0; } };
+ let instance = builder.instantiate({ mod: { func: import_func } });
+ assertEquals(223, instance.exports.main(param1, 6, 7n, param4, 9, param6,
+ 1.5, 2.5, paramd1, 4.5, 11n, param8, paramf3, 6.5, 7.5, 8.5, param9));
+ assertEquals(360, x);
+})();
+
+(function Regression1130385() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let sig_index = builder.addType(kSig_i_v);
+ builder.addFunction("f0", sig_index)
+ .addBody([kExprI32Const, 12])
+ .exportFunc();
+
+ builder.addFunction("f1", sig_index)
+ .addBody([kExprI32Const, 15])
+ .exportFunc();
+
+ let instance = builder.instantiate();
+ assertEquals(15, instance.exports.f1());
+})();
diff --git a/deps/v8/test/mjsunit/wasm/liftoff-simd-params.js b/deps/v8/test/mjsunit/wasm/liftoff-simd-params.js
index 1ee7f74a32..bced7e2b85 100644
--- a/deps/v8/test/mjsunit/wasm/liftoff-simd-params.js
+++ b/deps/v8/test/mjsunit/wasm/liftoff-simd-params.js
@@ -17,7 +17,7 @@ builder.addImportedMemory('m', 'imported_mem', 1, 2);
builder.addType(makeSig(new Array(18).fill(kWasmS128), []));
builder.addFunction(undefined, makeSig([], []))
- .addLocals({s128_count: 9})
+ .addLocals(kWasmS128, 9)
.addBodyWithEnd([
// These will all be args to the callee.
// Load first arg from memory, this was written with values from JS.
diff --git a/deps/v8/test/mjsunit/wasm/multi-value-simd.js b/deps/v8/test/mjsunit/wasm/multi-value-simd.js
index 4c4f5f754d..ee712656f0 100644
--- a/deps/v8/test/mjsunit/wasm/multi-value-simd.js
+++ b/deps/v8/test/mjsunit/wasm/multi-value-simd.js
@@ -33,7 +33,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
// For each v128 on the stack, we return the first and last lane. This help
// catch bugs with reading/writing the wrong stack slots.
builder.addFunction("main", sig_iiiiiiiiii_v)
- .addLocals({"i32_count": 10, "s128_count": 1})
+ .addLocals(kWasmI32, 10).addLocals(kWasmS128, 1)
.addBody([
kExprCallFunction, callee.index,
diff --git a/deps/v8/test/mjsunit/wasm/reference-globals.js b/deps/v8/test/mjsunit/wasm/reference-globals.js
new file mode 100644
index 0000000000..57f23ffb83
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/reference-globals.js
@@ -0,0 +1,105 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc
+
+load("test/mjsunit/wasm/wasm-module-builder.js");
+
+(function Test1() {
+ var exporting_instance = (function () {
+ var builder = new WasmModuleBuilder();
+
+ var sig_index = builder.addType(kSig_i_ii);
+ var wrong_sig_index = builder.addType(kSig_i_i);
+
+ var addition_index = builder.addFunction("addition", sig_index)
+ .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Add])
+ .exportFunc();
+
+ var global = builder.addGlobal(wasmRefType(sig_index), false);
+ global.function_index = addition_index;
+ global.exportAs("global");
+ builder.addGlobal(wasmOptRefType(wrong_sig_index), false)
+ .exportAs("mistyped_global");
+
+ return builder.instantiate({});
+ })();
+
+ // Mistyped imported global.
+ assertThrows(
+ () => {
+ var builder = new WasmModuleBuilder();
+ var sig_index = builder.addType(kSig_i_ii);
+ builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index),
+ false);
+ builder.instantiate(
+ {imports: { global: exporting_instance.exports.mistyped_global }})},
+ WebAssembly.LinkError,
+ /imported global does not match the expected type/
+ );
+
+ // Mistyped imported global due to cross-module typechecking.
+ assertThrows(
+ () => {
+ var builder = new WasmModuleBuilder();
+ var sig_index = builder.addType(kSig_i_i);
+ builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index),
+ false);
+ builder.instantiate(
+ {imports: { global: exporting_instance.exports.global }})},
+ WebAssembly.LinkError,
+ /imported global does not match the expected type/
+ );
+
+ // Non-function imported into function-typed global.
+ assertThrows(
+ () => {
+ var builder = new WasmModuleBuilder();
+ var sig_index = builder.addType(kSig_i_ii);
+ builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index),
+ false);
+ builder.instantiate({imports: { global: 42 }})},
+ WebAssembly.LinkError,
+ /function-typed object must be null \(if nullable\) or a Wasm function object/
+ );
+
+ // Mistyped function import.
+ assertThrows(
+ () => {
+ var builder = new WasmModuleBuilder();
+ var sig_index = builder.addType(kSig_i_i);
+ builder.addImportedGlobal("imports", "global", wasmRefType(sig_index),
+ false);
+ builder.instantiate(
+ {imports: { global: exporting_instance.exports.addition }})},
+ WebAssembly.LinkError,
+ /assigned exported function has to be a subtype of the expected type/
+ );
+
+ var instance = (function () {
+ var builder = new WasmModuleBuilder();
+
+ var sig_index = builder.addType(kSig_i_ii);
+
+ builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index),
+ false);
+
+ builder.addFunction("test_import", kSig_i_ii)
+ .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprGlobalGet, 0,
+ kExprCallRef])
+ .exportFunc();
+
+ return builder.instantiate({imports: {
+ global: exporting_instance.exports.global
+ }});
+ })();
+
+ // This module is valid.
+ assertFalse(instance === undefined);
+ assertFalse(instance === null);
+ assertFalse(instance === 0);
+
+ // The correct function reference has been passed.
+ assertEquals(66, instance.exports.test_import(42, 24));
+})();
diff --git a/deps/v8/test/mjsunit/wasm/reference-tables.js b/deps/v8/test/mjsunit/wasm/reference-tables.js
new file mode 100644
index 0000000000..756ec04d44
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/reference-tables.js
@@ -0,0 +1,91 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-typed-funcref
+
+load("test/mjsunit/wasm/wasm-module-builder.js");
+
+(function Test1() {
+ var exporting_instance = (function () {
+ var builder = new WasmModuleBuilder();
+ var binary_type = builder.addType(kSig_i_ii);
+
+ builder.addFunction("addition", kSig_i_ii)
+ .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Add])
+ .exportFunc();
+
+ builder.addFunction("id", kSig_i_i)
+ .addBody([kExprLocalGet, 0])
+ .exportFunc();
+
+ builder.addTable(wasmOptRefType(binary_type), 1, 100).exportAs("table");
+
+ return builder.instantiate({});
+ })();
+
+ // Wrong type for imported table.
+ assertThrows(
+ () => {
+ var builder = new WasmModuleBuilder();
+ var unary_type = builder.addType(kSig_i_i);
+ builder.addImportedTable("imports", "table", 1, 100,
+ wasmOptRefType(unary_type));
+ builder.instantiate({imports: {table: exporting_instance.exports.table}})
+ },
+ WebAssembly.LinkError,
+ /imported table does not match the expected type/
+ )
+
+ // Type for imported table must match exactly.
+ assertThrows(
+ () => {
+ var builder = new WasmModuleBuilder();
+ builder.addImportedTable("imports", "table", 1, 100, kWasmFuncRef);
+ builder.instantiate({imports: {table: exporting_instance.exports.table}})
+ },
+ WebAssembly.LinkError,
+ /imported table does not match the expected type/
+ )
+
+ var instance = (function () {
+ var builder = new WasmModuleBuilder();
+
+ var unary_type = builder.addType(kSig_i_i);
+ var binary_type = builder.addType(kSig_i_ii);
+
+ builder.addImportedTable("imports", "table", 1, 100,
+ wasmOptRefType(binary_type));
+
+ var table = builder.addTable(wasmOptRefType(unary_type), 1)
+ .exportAs("table");
+ builder.addTable(kWasmFuncRef, 1).exportAs("generic_table");
+
+ builder.addFunction("table_test", makeSig([wasmRefType(unary_type)],
+ [kWasmI32]))
+ // Set table[0] to input function, then retrieve it and call it.
+ .addBody([kExprI32Const, 0, kExprLocalGet, 0, kExprTableSet, table.index,
+ kExprI32Const, 42, kExprI32Const, 0, kExprTableGet, table.index,
+ kExprCallRef])
+ .exportFunc();
+
+ // Instantiate with a table of the correct type.
+ return builder.instantiate(
+ {imports: {table: exporting_instance.exports.table}});
+ })();
+
+ // This module is valid.
+ assertTrue(!!instance);
+
+ // The correct function reference is preserved when setting it to and getting
+ // it back from a table.
+ assertEquals(42, instance.exports.table_test(exporting_instance.exports.id));
+
+ // Setting from JS API respects types.
+ instance.exports.generic_table.set(0, exporting_instance.exports.id);
+ instance.exports.table.set(0, exporting_instance.exports.id);
+ assertThrows(
+ () => instance.exports.table.set(0, exporting_instance.exports.addition),
+ TypeError,
+ /Argument 1 must be null or a WebAssembly function of type compatible to 'this'/);
+})();
diff --git a/deps/v8/test/mjsunit/wasm/simd-errors.js b/deps/v8/test/mjsunit/wasm/simd-errors.js
index 75c427026d..fe32cf68f1 100644
--- a/deps/v8/test/mjsunit/wasm/simd-errors.js
+++ b/deps/v8/test/mjsunit/wasm/simd-errors.js
@@ -61,5 +61,5 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
})();
(function TestS128GlobalConstructor() {
- assertThrows(() => new WebAssembly.Global({value: 'i128'}), TypeError);
+ assertThrows(() => new WebAssembly.Global({value: 'v128'}), TypeError);
})();
diff --git a/deps/v8/test/mjsunit/wasm/simd-globals.js b/deps/v8/test/mjsunit/wasm/simd-globals.js
index dce1337ec6..f678b59f65 100644
--- a/deps/v8/test/mjsunit/wasm/simd-globals.js
+++ b/deps/v8/test/mjsunit/wasm/simd-globals.js
@@ -9,7 +9,7 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
// Test for S128 global with initialization.
// This checks for a bug in copying the immediate values from the
// initialization expression into the globals area of the module.
-(function TestS128() {
+(function TestS128GlobalInitialization() {
var builder = new WasmModuleBuilder();
var g = builder.addGlobal(kWasmS128);
g.init = [1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0];
@@ -35,3 +35,15 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
assertEquals(i+1, instance.exports[`get${i}`]());
}
})();
+
+(function TestS128GlobalImport() {
+ // We want to test that a module with an imported V128 global does not crash.
+ // But that is a bit tricky because:
+ // 1. WebAssembly.Global({value: 'v128'}) is an error
+ // 2. WebAssembly.Global of any other type is a type mismatch error
+ // So here, we do 2. in order to get further along the code path, where
+ // previously it would have crashed, it now checks for v128 and exits early.
+ var builder = new WasmModuleBuilder();
+ var g = builder.addImportedGlobal('m', 'foo', kWasmS128);
+ assertThrows(() => builder.instantiate({m: {foo: 0}}));
+})();
diff --git a/deps/v8/test/mjsunit/wasm/test-wasm-module-builder.js b/deps/v8/test/mjsunit/wasm/test-wasm-module-builder.js
index e43eaf7258..b8f5aa0321 100644
--- a/deps/v8/test/mjsunit/wasm/test-wasm-module-builder.js
+++ b/deps/v8/test/mjsunit/wasm/test-wasm-module-builder.js
@@ -43,7 +43,7 @@ function instantiate(buffer, ffi) {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
builder.addFunction(undefined, kSig_i_i)
- .addLocals({i32_count: 1})
+ .addLocals(kWasmI32, 1)
.addBody([kExprLocalGet, 0, kExprLocalSet, 1, kExprLocalGet, 1])
.exportAs('main');
@@ -57,16 +57,15 @@ function instantiate(buffer, ffi) {
print(arguments.callee.name);
// TODO(titzer): i64 only works on 64-bit platforms.
var types = [
- {locals: {i32_count: 1}, type: kWasmI32},
- // {locals: {i64_count: 1}, type: kWasmI64},
- {locals: {f32_count: 1}, type: kWasmF32},
- {locals: {f64_count: 1}, type: kWasmF64},
+ {count: 1, type: kWasmI32},
+ {count: 1, type: kWasmF32},
+ {count: 1, type: kWasmF64},
];
for (p of types) {
let builder = new WasmModuleBuilder();
builder.addFunction(undefined, makeSig_r_x(p.type, p.type))
- .addLocals(p.locals)
+ .addLocals(p.type, p.count)
.addBody([kExprLocalGet, 0, kExprLocalSet, 1, kExprLocalGet, 1])
.exportAs('main');
diff --git a/deps/v8/test/mjsunit/wasm/tier-up-testing-flag.js b/deps/v8/test/mjsunit/wasm/tier-up-testing-flag.js
index 20aa30930c..d25124ddb1 100644
--- a/deps/v8/test/mjsunit/wasm/tier-up-testing-flag.js
+++ b/deps/v8/test/mjsunit/wasm/tier-up-testing-flag.js
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --allow-natives-syntax --liftoff --no-future --no-wasm-tier-up
+// Flags: --allow-natives-syntax --liftoff --no-wasm-tier-up
// Compile functions 0 and 2 with Turbofan, the rest with Liftoff:
// Flags: --wasm-tier-mask-for-testing=5
diff --git a/deps/v8/test/mjsunit/wasm/wasm-dynamic-tiering.js b/deps/v8/test/mjsunit/wasm/wasm-dynamic-tiering.js
index b93df3ff9e..f3243e75fd 100644
--- a/deps/v8/test/mjsunit/wasm/wasm-dynamic-tiering.js
+++ b/deps/v8/test/mjsunit/wasm/wasm-dynamic-tiering.js
@@ -7,7 +7,7 @@
load('test/mjsunit/wasm/wasm-module-builder.js');
-const num_iterations = 5;
+const num_iterations = 4;
const num_functions = 2;
const builder = new WasmModuleBuilder();
diff --git a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
index 3c62ed9646..b914ee91e3 100644
--- a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
+++ b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
@@ -99,8 +99,15 @@ let kWasmI64 = 0x7e;
let kWasmF32 = 0x7d;
let kWasmF64 = 0x7c;
let kWasmS128 = 0x7b;
+let kWasmFuncRef = 0x70;
+let kWasmAnyFunc = kWasmFuncRef; // Alias named as in the JS API spec
let kWasmExternRef = 0x6f;
-let kWasmAnyFunc = 0x70;
+function wasmOptRefType(index) { return {opcode: 0x6c, index: index}; }
+function wasmRefType(index) { return {opcode: 0x6b, index: index}; }
+let kWasmI31Ref = 0x6a;
+function wasmRtt(index, depth) {
+ return {opcode: 0x69, index: index, depth: depth};
+}
let kWasmExnRef = 0x68;
let kExternalFunction = 0;
@@ -392,6 +399,7 @@ let kAtomicPrefix = 0xfe;
// GC opcodes
let kExprRttCanon = 0x30;
let kExprRefCast = 0x41;
+let kExprI31New = 0x20;
// Numeric opcodes.
let kExprMemoryInit = 0x08;
@@ -476,22 +484,22 @@ let kExprI64AtomicCompareExchange32U = 0x4e;
// Simd opcodes.
let kExprS128LoadMem = 0x00;
-let kExprI16x8Load8x8S = 0x01;
-let kExprI16x8Load8x8U = 0x02;
-let kExprI32x4Load16x4S = 0x03;
-let kExprI32x4Load16x4U = 0x04;
-let kExprI64x2Load32x2S = 0x05;
-let kExprI64x2Load32x2U = 0x06;
-let kExprS8x16LoadSplat = 0x07;
-let kExprS16x8LoadSplat = 0x08;
-let kExprS32x4LoadSplat = 0x09;
-let kExprS64x2LoadSplat = 0x0a;
+let kExprS128Load8x8S = 0x01;
+let kExprS128Load8x8U = 0x02;
+let kExprS128Load16x4S = 0x03;
+let kExprS128Load16x4U = 0x04;
+let kExprS128Load32x2S = 0x05;
+let kExprS128Load32x2U = 0x06;
+let kExprS128Load8Splat = 0x07;
+let kExprS128Load16Splat = 0x08;
+let kExprS128Load32Splat = 0x09;
+let kExprS128Load64Splat = 0x0a;
let kExprS128StoreMem = 0x0b;
let kExprS128Const = 0x0c;
-let kExprS8x16Shuffle = 0x0d;
+let kExprI8x16Shuffle = 0x0d;
-let kExprS8x16Swizzle = 0x0e;
+let kExprI8x16Swizzle = 0x0e;
let kExprI8x16Splat = 0x0f;
let kExprI16x8Splat = 0x10;
let kExprI32x4Splat = 0x11;
@@ -781,6 +789,15 @@ class Binary {
}
}
+ emit_type(type) {
+ if ((typeof type) == "number") this.emit_u8(type);
+ else {
+ this.emit_u8(type.opcode);
+ if ('depth' in type) this.emit_u8(type.depth);
+ this.emit_u32v(type.index);
+ }
+ }
+
emit_header() {
this.emit_bytes([
kWasmH0, kWasmH1, kWasmH2, kWasmH3, kWasmV0, kWasmV1, kWasmV2, kWasmV3
@@ -802,20 +819,22 @@ class Binary {
}
class WasmFunctionBuilder {
- constructor(module, name, type_index) {
+ // Encoding of local names: a string corresponds to a local name,
+ // a number n corresponds to n undefined names.
+ constructor(module, name, type_index, arg_names) {
this.module = module;
this.name = name;
this.type_index = type_index;
this.body = [];
this.locals = [];
- this.local_names = [];
+ this.local_names = arg_names;
this.body_offset = undefined; // Not valid until module is serialized.
}
numLocalNames() {
let num_local_names = 0;
for (let loc_name of this.local_names) {
- if (loc_name !== undefined) ++num_local_names;
+ if (typeof loc_name == "string") ++num_local_names;
}
return num_local_names;
}
@@ -854,20 +873,17 @@ class WasmFunctionBuilder {
getNumLocals() {
let total_locals = 0;
for (let l of this.locals) {
- for (let type of ["i32", "i64", "f32", "f64", "s128"]) {
- total_locals += l[type + "_count"] || 0;
- }
+ total_locals += l.count
}
return total_locals;
}
- addLocals(locals, names) {
- const old_num_locals = this.getNumLocals();
- this.locals.push(locals);
- if (names) {
- const missing_names = old_num_locals - this.local_names.length;
- this.local_names.push(...new Array(missing_names), ...names);
- }
+ addLocals(type, count, names) {
+ this.locals.push({type: type, count: count});
+ names = names || [];
+ if (names.length > count) throw new Error('too many locals names given');
+ this.local_names.push(...names);
+ if (count > names.length) this.local_names.push(count - names.length);
return this;
}
@@ -972,17 +988,17 @@ class WasmModuleBuilder {
return this.types.length - 1;
}
- addGlobal(local_type, mutable) {
- let glob = new WasmGlobalBuilder(this, local_type, mutable);
+ addGlobal(type, mutable) {
+ let glob = new WasmGlobalBuilder(this, type, mutable);
glob.index = this.globals.length + this.num_imported_globals;
this.globals.push(glob);
return glob;
}
addTable(type, initial_size, max_size = undefined) {
- if (type != kWasmExternRef && type != kWasmAnyFunc && type != kWasmExnRef) {
- throw new Error(
- 'Tables must be of type kWasmExternRef, kWasmAnyFunc or kWasmExnRef');
+ if (type == kWasmI32 || type == kWasmI64 || type == kWasmF32 ||
+ type == kWasmF64 || type == kWasmS128 || type == kWasmStmt) {
+ throw new Error('Tables must be of a reference type');
}
let table = new WasmTableBuilder(this, type, initial_size, max_size);
table.index = this.tables.length + this.num_imported_tables;
@@ -997,9 +1013,13 @@ class WasmModuleBuilder {
return except_index;
}
- addFunction(name, type) {
+ addFunction(name, type, arg_names) {
+ arg_names = arg_names || [];
let type_index = (typeof type) == "number" ? type : this.addType(type);
- let func = new WasmFunctionBuilder(this, name, type_index);
+ let num_args = this.types[type_index].params.length;
+ if (num_args < arg_names.length) throw new Error("too many arg names provided");
+ if (num_args > arg_names.length) arg_names.push(num_args - arg_names.length);
+ let func = new WasmFunctionBuilder(this, name, type_index, arg_names);
func.index = this.functions.length + this.num_imported_funcs;
this.functions.push(func);
return func;
@@ -1011,7 +1031,7 @@ class WasmModuleBuilder {
}
let type_index = (typeof type) == "number" ? type : this.addType(type);
this.imports.push({module: module, name: name, kind: kExternalFunction,
- type: type_index});
+ type_index: type_index});
return this.num_imported_funcs++;
}
@@ -1047,7 +1067,8 @@ class WasmModuleBuilder {
throw new Error('Imported exceptions must be declared before local ones');
}
let type_index = (typeof type) == "number" ? type : this.addType(type);
- let o = {module: module, name: name, kind: kExternalException, type: type_index};
+ let o = {module: module, name: name, kind: kExternalException,
+ type_index: type_index};
this.imports.push(o);
return this.num_imported_exceptions++;
}
@@ -1058,6 +1079,14 @@ class WasmModuleBuilder {
}
addExportOfKind(name, kind, index) {
+ if (index == undefined && kind != kExternalTable &&
+ kind != kExternalMemory) {
+ throw new Error(
+ 'Index for exports other than tables/memories must be provided');
+ }
+ if (index !== undefined && (typeof index) != 'number') {
+ throw new Error('Index for exports must be a number')
+ }
this.exports.push({name: name, kind: kind, index: index});
return this;
}
@@ -1155,11 +1184,11 @@ class WasmModuleBuilder {
section.emit_u8(kWasmFunctionTypeForm);
section.emit_u32v(type.params.length);
for (let param of type.params) {
- section.emit_u8(param);
+ section.emit_type(param);
}
section.emit_u32v(type.results.length);
for (let result of type.results) {
- section.emit_u8(result);
+ section.emit_type(result);
}
}
});
@@ -1175,9 +1204,9 @@ class WasmModuleBuilder {
section.emit_string(imp.name || '');
section.emit_u8(imp.kind);
if (imp.kind == kExternalFunction) {
- section.emit_u32v(imp.type);
+ section.emit_u32v(imp.type_index);
} else if (imp.kind == kExternalGlobal) {
- section.emit_u32v(imp.type);
+ section.emit_type(imp.type);
section.emit_u8(imp.mutable);
} else if (imp.kind == kExternalMemory) {
var has_max = (typeof imp.maximum) != "undefined";
@@ -1190,14 +1219,14 @@ class WasmModuleBuilder {
section.emit_u32v(imp.initial); // initial
if (has_max) section.emit_u32v(imp.maximum); // maximum
} else if (imp.kind == kExternalTable) {
- section.emit_u8(imp.type);
+ section.emit_type(imp.type);
var has_max = (typeof imp.maximum) != "undefined";
section.emit_u8(has_max ? 1 : 0); // flags
section.emit_u32v(imp.initial); // initial
if (has_max) section.emit_u32v(imp.maximum); // maximum
} else if (imp.kind == kExternalException) {
section.emit_u32v(kExceptionAttribute);
- section.emit_u32v(imp.type);
+ section.emit_u32v(imp.type_index);
} else {
throw new Error("unknown/unsupported import kind " + imp.kind);
}
@@ -1222,7 +1251,7 @@ class WasmModuleBuilder {
binary.emit_section(kTableSectionCode, section => {
section.emit_u32v(wasm.tables.length);
for (let table of wasm.tables) {
- section.emit_u8(table.type);
+ section.emit_type(table.type);
section.emit_u8(table.has_max);
section.emit_u32v(table.initial_size);
if (table.has_max) section.emit_u32v(table.max_size);
@@ -1253,9 +1282,9 @@ class WasmModuleBuilder {
if (debug) print("emitting events @ " + binary.length);
binary.emit_section(kExceptionSectionCode, section => {
section.emit_u32v(wasm.exceptions.length);
- for (let type of wasm.exceptions) {
+ for (let type_index of wasm.exceptions) {
section.emit_u32v(kExceptionAttribute);
- section.emit_u32v(type);
+ section.emit_u32v(type_index);
}
});
}
@@ -1266,7 +1295,7 @@ class WasmModuleBuilder {
binary.emit_section(kGlobalSectionCode, section => {
section.emit_u32v(wasm.globals.length);
for (let global of wasm.globals) {
- section.emit_u8(global.type);
+ section.emit_type(global.type);
section.emit_u8(global.mutable);
if ((typeof global.init_index) == "undefined") {
// Emit a constant initializer.
@@ -1306,6 +1335,15 @@ class WasmModuleBuilder {
section.emit_u8(kExprRefNull);
section.emit_u8(kWasmExnRef);
break;
+ default:
+ if (global.function_index !== undefined) {
+ section.emit_u8(kExprRefFunc);
+ section.emit_u32v(global.function_index);
+ } else {
+ section.emit_u8(kExprRefNull);
+ section.emit_u32v(global.type.index);
+ }
+ break;
}
} else {
// Emit a global-index initializer.
@@ -1459,40 +1497,12 @@ class WasmModuleBuilder {
for (let func of wasm.functions) {
header.reset();
// Function body length will be patched later.
- let local_decls = [];
- for (let l of func.locals || []) {
- if (l.i32_count > 0) {
- local_decls.push({count: l.i32_count, type: kWasmI32});
- }
- if (l.i64_count > 0) {
- local_decls.push({count: l.i64_count, type: kWasmI64});
- }
- if (l.f32_count > 0) {
- local_decls.push({count: l.f32_count, type: kWasmF32});
- }
- if (l.f64_count > 0) {
- local_decls.push({count: l.f64_count, type: kWasmF64});
- }
- if (l.s128_count > 0) {
- local_decls.push({count: l.s128_count, type: kWasmS128});
- }
- if (l.externref_count > 0) {
- local_decls.push({count: l.externref_count, type: kWasmExternRef});
- }
- if (l.anyfunc_count > 0) {
- local_decls.push({count: l.anyfunc_count, type: kWasmAnyFunc});
- }
- if (l.except_count > 0) {
- local_decls.push({count: l.except_count, type: kWasmExnRef});
- }
- }
-
+ let local_decls = func.locals || [];
header.emit_u32v(local_decls.length);
for (let decl of local_decls) {
header.emit_u32v(decl.count);
- header.emit_u8(decl.type);
+ header.emit_type(decl.type);
}
-
section.emit_u32v(header.length + func.body.length);
section.emit_bytes(header.trunc_buffer());
// Set to section offset for now, will update.
@@ -1576,10 +1586,15 @@ class WasmModuleBuilder {
if (func.numLocalNames() == 0) continue;
name_section.emit_u32v(func.index);
name_section.emit_u32v(func.numLocalNames());
+ let name_index = 0;
for (let i = 0; i < func.local_names.length; ++i) {
- if (func.local_names[i] === undefined) continue;
- name_section.emit_u32v(i);
- name_section.emit_string(func.local_names[i]);
+ if (typeof func.local_names[i] == "string") {
+ name_section.emit_u32v(name_index);
+ name_section.emit_string(func.local_names[i]);
+ name_index++;
+ } else {
+ name_index += func.local_names[i];
+ }
}
}
});
diff --git a/deps/v8/test/test262/test262.status b/deps/v8/test/test262/test262.status
index 6fd6859611..f27bd83a45 100644
--- a/deps/v8/test/test262/test262.status
+++ b/deps/v8/test/test262/test262.status
@@ -62,10 +62,6 @@
# https://bugs.chromium.org/p/v8/issues/detail?id=4709
'language/expressions/assignment/fn-name-lhs-cover': [FAIL],
- # https://bugs.chromium.org/p/v8/issues/detail?id=9084
- 'intl402/supportedLocalesOf-consistent-with-resolvedOptions': [FAIL],
- 'intl402/fallback-locales-are-supported': [FAIL],
-
# https://code.google.com/p/v8/issues/detail?id=4251
'language/expressions/postfix-increment/S11.3.1_A5_T1': [FAIL],
'language/expressions/postfix-increment/S11.3.1_A5_T2': [FAIL],
@@ -382,6 +378,94 @@
'built-ins/RegExp/named-groups/non-unicode-property-names-valid': [FAIL],
# https://bugs.chromium.org/p/v8/issues/detail?id=4628
+ 'language/eval-code/direct/async-gen-func-decl-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-decl-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-func-expr-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-meth-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/async-gen-named-func-expr-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-decl-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-decl-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-decl-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-decl-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-decl-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-decl-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-decl-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-decl-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-expr-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-expr-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-expr-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-expr-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-expr-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-expr-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/func-expr-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/func-expr-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-decl-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-named-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-func-expr-nameless-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-meth-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-meth-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-meth-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-meth-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-meth-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-meth-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/gen-meth-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/gen-meth-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/meth-fn-body-cntns-arguments-func-decl-declare-arguments': [FAIL],
+ 'language/eval-code/direct/meth-fn-body-cntns-arguments-func-decl-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/meth-fn-body-cntns-arguments-lex-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/meth-fn-body-cntns-arguments-lex-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/meth-fn-body-cntns-arguments-var-bind-declare-arguments': [FAIL],
+ 'language/eval-code/direct/meth-fn-body-cntns-arguments-var-bind-declare-arguments-and-assign': [FAIL],
+ 'language/eval-code/direct/meth-no-pre-existing-arguments-bindings-are-present-declare-arguments': [FAIL],
+ 'language/eval-code/direct/meth-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign': [FAIL],
'language/eval-code/direct/non-definable-function-with-function': [FAIL],
'language/eval-code/direct/non-definable-function-with-variable': [FAIL],
'language/eval-code/indirect/non-definable-function-with-function': [FAIL],
@@ -447,12 +531,12 @@
'language/expressions/call/eval-spread-empty-leading': [FAIL],
'language/expressions/call/eval-spread-empty-trailing': [FAIL],
- # https://bugs.chromium.org/p/v8/issues/detail?id=8664
- 'intl402/Collator/missing-unicode-ext-value-defaults-to-true': [FAIL],
-
# https://bugs.chromium.org/p/v8/issues/detail?id=7472
'intl402/NumberFormat/currency-digits': [FAIL],
+ # http://crbug/v8/10844
+ 'intl402/NumberFormat/dft-currency-mnfd-range-check-mxfd': [FAIL],
+
# https://bugs.chromium.org/p/v8/issues/detail?id=7831
'language/statements/generators/generator-created-after-decl-inst': [FAIL],
'language/expressions/generators/generator-created-after-decl-inst': [FAIL],
@@ -524,6 +608,36 @@
# https://crbug.com/v8/10789
'built-ins/Function/prototype/toString/built-in-function-object': [FAIL],
+ # http://crbug/v8/10903
+ 'annexB/built-ins/RegExp/legacy-accessors/index/prop-desc': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/index/this-cross-realm-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/index/this-not-regexp-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/index/this-subclass-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/input/this-cross-realm-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/input/this-not-regexp-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/input/this-subclass-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastMatch/prop-desc': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastMatch/this-cross-realm-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastMatch/this-not-regexp-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastMatch/this-subclass-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastParen/prop-desc': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastParen/this-cross-realm-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastParen/this-not-regexp-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/lastParen/this-subclass-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/leftContext/prop-desc': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/leftContext/this-cross-realm-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/leftContext/this-not-regexp-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/leftContext/this-subclass-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/rightContext/prop-desc': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/rightContext/this-cross-realm-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/rightContext/this-not-regexp-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/legacy-accessors/rightContext/this-subclass-constructor': [FAIL],
+ 'annexB/built-ins/RegExp/prototype/compile/this-cross-realm-instance': [FAIL],
+ 'annexB/built-ins/RegExp/prototype/compile/this-subclass-instance': [FAIL],
+
+ # http://crbug/v8/10905
+ 'language/identifier-resolution/assign-to-global-undefined': [FAIL],
+
######################## NEEDS INVESTIGATION ###########################
# https://bugs.chromium.org/p/v8/issues/detail?id=7833
@@ -539,11 +653,6 @@
# https://github.com/tc39/ecma262/pull/889
'annexB/language/function-code/block-decl-func-skip-arguments': [FAIL],
- # Non-simple assignment targets are runtime errors instead of syntax errors for web compat.
- 'language/expressions/logical-assignment/lgcl-or-assignment-operator-non-simple-lhs': [FAIL],
- 'language/expressions/logical-assignment/lgcl-and-assignment-operator-non-simple-lhs': [FAIL],
- 'language/expressions/logical-assignment/lgcl-nullish-assignment-operator-non-simple-lhs': [FAIL],
-
############################ INVALID TESTS #############################
# Test makes unjustified assumptions about the number of calls to SortCompare.
diff --git a/deps/v8/test/unittests/BUILD.gn b/deps/v8/test/unittests/BUILD.gn
index facc6f25b4..c239c3825d 100644
--- a/deps/v8/test/unittests/BUILD.gn
+++ b/deps/v8/test/unittests/BUILD.gn
@@ -20,6 +20,40 @@ if (is_fuchsia) {
}
}
+v8_executable("v8_cppgc_shared_unittests") {
+ testonly = true
+
+ configs = [
+ "../..:external_config",
+ "../..:internal_config_base",
+ ]
+
+ sources = [ "heap/base/run-all-unittests.cc" ]
+
+ deps = [
+ ":v8_cppgc_shared_unittests_sources",
+ "//testing/gmock",
+ "//testing/gtest",
+ ]
+}
+
+v8_source_set("v8_cppgc_shared_unittests_sources") {
+ testonly = true
+
+ sources = [ "heap/base/worklist-unittest.cc" ]
+
+ configs = [
+ "../..:external_config",
+ "../..:internal_config_base",
+ ]
+
+ deps = [
+ "../..:v8_cppgc_shared_for_testing",
+ "//testing/gmock",
+ "//testing/gtest",
+ ]
+}
+
# Stand-alone target for C++ GC unittests. This is used to ensure that it
# builds without V8 as well. They are also included in the regular unittests
# target for simplicity.
@@ -35,6 +69,7 @@ v8_executable("cppgc_unittests") {
deps = [
":cppgc_unittests_sources",
+ ":v8_cppgc_shared_unittests_sources",
"../..:cppgc_for_testing",
"//testing/gmock",
"//testing/gtest",
@@ -45,6 +80,7 @@ v8_source_set("cppgc_unittests_sources") {
testonly = true
sources = [
+ "heap/cppgc/concurrent-marking-unittest.cc",
"heap/cppgc/concurrent-sweeper-unittest.cc",
"heap/cppgc/custom-spaces-unittest.cc",
"heap/cppgc/finalizer-trait-unittest.cc",
@@ -56,6 +92,7 @@ v8_source_set("cppgc_unittests_sources") {
"heap/cppgc/heap-object-header-unittest.cc",
"heap/cppgc/heap-page-unittest.cc",
"heap/cppgc/heap-unittest.cc",
+ "heap/cppgc/incremental-marking-schedule-unittest.cc",
"heap/cppgc/logging-unittest.cc",
"heap/cppgc/marker-unittest.cc",
"heap/cppgc/marking-verifier-unittest.cc",
@@ -75,7 +112,6 @@ v8_source_set("cppgc_unittests_sources") {
"heap/cppgc/tests.cc",
"heap/cppgc/tests.h",
"heap/cppgc/visitor-unittest.cc",
- "heap/cppgc/worklist-unittest.cc",
"heap/cppgc/write-barrier-unittest.cc",
]
@@ -102,6 +138,7 @@ v8_executable("unittests") {
deps = [
":cppgc_unittests_sources",
":unittests_sources",
+ ":v8_cppgc_shared_unittests_sources",
"../..:v8_for_testing",
"../..:v8_libbase",
"../..:v8_libplatform",
@@ -243,6 +280,7 @@ v8_source_set("unittests_sources") {
"heap/heap-controller-unittest.cc",
"heap/heap-unittest.cc",
"heap/heap-utils.h",
+ "heap/index-generator-unittest.cc",
"heap/item-parallel-job-unittest.cc",
"heap/js-member-unittest.cc",
"heap/list-unittest.cc",
@@ -318,6 +356,7 @@ v8_source_set("unittests_sources") {
"wasm/function-body-decoder-unittest.cc",
"wasm/leb-helper-unittest.cc",
"wasm/loop-assignment-analysis-unittest.cc",
+ "wasm/module-decoder-memory64-unittest.cc",
"wasm/module-decoder-unittest.cc",
"wasm/simd-shuffle-unittest.cc",
"wasm/streaming-decoder-unittest.cc",
@@ -336,6 +375,10 @@ v8_source_set("unittests_sources") {
sources += [ "wasm/wasm-gdbserver-unittest.cc" ]
}
+ if (v8_enable_conservative_stack_scanning) {
+ sources += [ "heap/object-start-bitmap-unittest.cc" ]
+ }
+
if (v8_current_cpu == "arm") {
sources += [
"assembler/turbo-assembler-arm-unittest.cc",
diff --git a/deps/v8/test/unittests/api/isolate-unittest.cc b/deps/v8/test/unittests/api/isolate-unittest.cc
index 429d70617a..392577dcaa 100644
--- a/deps/v8/test/unittests/api/isolate-unittest.cc
+++ b/deps/v8/test/unittests/api/isolate-unittest.cc
@@ -94,7 +94,7 @@ TEST_F(IncumbentContextTest, Basic) {
info.GetReturnValue().Set(incumbent_context->Global());
});
Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate());
- global_template->Set(Str("getIncumbentGlobal"), get_incumbent_global);
+ global_template->Set(isolate(), "getIncumbentGlobal", get_incumbent_global);
Local<Context> context_a = Context::New(isolate(), nullptr, global_template);
Local<Context> context_b = Context::New(isolate(), nullptr, global_template);
diff --git a/deps/v8/test/unittests/compiler/branch-elimination-unittest.cc b/deps/v8/test/unittests/compiler/branch-elimination-unittest.cc
index a231539f6f..22481467e9 100644
--- a/deps/v8/test/unittests/compiler/branch-elimination-unittest.cc
+++ b/deps/v8/test/unittests/compiler/branch-elimination-unittest.cc
@@ -28,7 +28,8 @@ class BranchEliminationTest : public GraphTest {
JSOperatorBuilder javascript(zone());
JSGraph jsgraph(isolate(), graph(), common(), &javascript, nullptr,
machine());
- GraphReducer graph_reducer(zone(), graph(), tick_counter(), jsgraph.Dead());
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker(),
+ jsgraph.Dead());
BranchElimination branch_condition_elimination(&graph_reducer, &jsgraph,
zone());
graph_reducer.AddReducer(&branch_condition_elimination);
diff --git a/deps/v8/test/unittests/compiler/constant-folding-reducer-unittest.cc b/deps/v8/test/unittests/compiler/constant-folding-reducer-unittest.cc
index da15d373ba..0481221497 100644
--- a/deps/v8/test/unittests/compiler/constant-folding-reducer-unittest.cc
+++ b/deps/v8/test/unittests/compiler/constant-folding-reducer-unittest.cc
@@ -74,8 +74,7 @@ class ConstantFoldingReducerTest : public TypedGraphTest {
JSOperatorBuilder javascript(zone());
JSGraph jsgraph(isolate(), graph(), common(), &javascript, simplified(),
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
ConstantFoldingReducer reducer(&graph_reducer, &jsgraph, broker());
return reducer.Reduce(node);
}
diff --git a/deps/v8/test/unittests/compiler/graph-reducer-unittest.cc b/deps/v8/test/unittests/compiler/graph-reducer-unittest.cc
index 82bf8ddc40..bb965cce94 100644
--- a/deps/v8/test/unittests/compiler/graph-reducer-unittest.cc
+++ b/deps/v8/test/unittests/compiler/graph-reducer-unittest.cc
@@ -314,7 +314,7 @@ TEST_F(AdvancedReducerTest, ReplaceWithValue_ValueUse) {
Node* zero = graph()->NewNode(common.Int32Constant(0));
Node* use_value = graph()->NewNode(common.Return(), zero, node, start, start);
Node* replacement = graph()->NewNode(&kMockOperator);
- GraphReducer graph_reducer(zone(), graph(), nullptr);
+ GraphReducer graph_reducer(zone(), graph(), nullptr, nullptr);
ReplaceWithValueReducer r(&graph_reducer);
r.ReplaceWithValue(node, replacement);
EXPECT_EQ(replacement, use_value->InputAt(1));
@@ -331,7 +331,7 @@ TEST_F(AdvancedReducerTest, ReplaceWithValue_EffectUse) {
Node* use_control = graph()->NewNode(common.Merge(1), start);
Node* use_effect = graph()->NewNode(common.EffectPhi(1), node, use_control);
Node* replacement = graph()->NewNode(&kMockOperator);
- GraphReducer graph_reducer(zone(), graph(), nullptr);
+ GraphReducer graph_reducer(zone(), graph(), nullptr, nullptr);
ReplaceWithValueReducer r(&graph_reducer);
r.ReplaceWithValue(node, replacement);
EXPECT_EQ(start, use_effect->InputAt(0));
@@ -350,7 +350,7 @@ TEST_F(AdvancedReducerTest, ReplaceWithValue_ControlUse1) {
Node* success = graph()->NewNode(common.IfSuccess(), node);
Node* use_control = graph()->NewNode(common.Merge(1), success);
Node* replacement = graph()->NewNode(&kMockOperator);
- GraphReducer graph_reducer(zone(), graph(), nullptr);
+ GraphReducer graph_reducer(zone(), graph(), nullptr, nullptr);
ReplaceWithValueReducer r(&graph_reducer);
r.ReplaceWithValue(node, replacement);
EXPECT_EQ(start, use_control->InputAt(0));
@@ -371,7 +371,7 @@ TEST_F(AdvancedReducerTest, ReplaceWithValue_ControlUse2) {
Node* exception = graph()->NewNode(common.IfException(), effect, node);
Node* use_control = graph()->NewNode(common.Merge(1), success);
Node* replacement = graph()->NewNode(&kMockOperator);
- GraphReducer graph_reducer(zone(), graph(), tick_counter(), dead);
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), nullptr, dead);
ReplaceWithValueReducer r(&graph_reducer);
r.ReplaceWithValue(node, replacement);
EXPECT_EQ(start, use_control->InputAt(0));
@@ -395,7 +395,7 @@ TEST_F(AdvancedReducerTest, ReplaceWithValue_ControlUse3) {
Node* exception = graph()->NewNode(common.IfException(), effect, node);
Node* use_control = graph()->NewNode(common.Merge(1), success);
Node* replacement = graph()->NewNode(&kMockOperator);
- GraphReducer graph_reducer(zone(), graph(), tick_counter(), dead);
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), nullptr, dead);
ReplaceWithValueReducer r(&graph_reducer);
r.ReplaceWithValue(node, replacement);
EXPECT_EQ(start, use_control->InputAt(0));
@@ -425,20 +425,20 @@ class GraphReducerTest : public TestWithZone {
protected:
void ReduceNode(Node* node, Reducer* r) {
- GraphReducer reducer(zone(), graph(), tick_counter());
+ GraphReducer reducer(zone(), graph(), tick_counter(), nullptr);
reducer.AddReducer(r);
reducer.ReduceNode(node);
}
void ReduceNode(Node* node, Reducer* r1, Reducer* r2) {
- GraphReducer reducer(zone(), graph(), tick_counter());
+ GraphReducer reducer(zone(), graph(), tick_counter(), nullptr);
reducer.AddReducer(r1);
reducer.AddReducer(r2);
reducer.ReduceNode(node);
}
void ReduceNode(Node* node, Reducer* r1, Reducer* r2, Reducer* r3) {
- GraphReducer reducer(zone(), graph(), tick_counter());
+ GraphReducer reducer(zone(), graph(), tick_counter(), nullptr);
reducer.AddReducer(r1);
reducer.AddReducer(r2);
reducer.AddReducer(r3);
@@ -446,20 +446,20 @@ class GraphReducerTest : public TestWithZone {
}
void ReduceGraph(Reducer* r1) {
- GraphReducer reducer(zone(), graph(), tick_counter());
+ GraphReducer reducer(zone(), graph(), tick_counter(), nullptr);
reducer.AddReducer(r1);
reducer.ReduceGraph();
}
void ReduceGraph(Reducer* r1, Reducer* r2) {
- GraphReducer reducer(zone(), graph(), tick_counter());
+ GraphReducer reducer(zone(), graph(), tick_counter(), nullptr);
reducer.AddReducer(r1);
reducer.AddReducer(r2);
reducer.ReduceGraph();
}
void ReduceGraph(Reducer* r1, Reducer* r2, Reducer* r3) {
- GraphReducer reducer(zone(), graph(), tick_counter());
+ GraphReducer reducer(zone(), graph(), tick_counter(), nullptr);
reducer.AddReducer(r1);
reducer.AddReducer(r2);
reducer.AddReducer(r3);
diff --git a/deps/v8/test/unittests/compiler/js-call-reducer-unittest.cc b/deps/v8/test/unittests/compiler/js-call-reducer-unittest.cc
index b6338addeb..a8020b6244 100644
--- a/deps/v8/test/unittests/compiler/js-call-reducer-unittest.cc
+++ b/deps/v8/test/unittests/compiler/js-call-reducer-unittest.cc
@@ -34,9 +34,7 @@ class JSCallReducerTest : public TypedGraphTest {
SimplifiedOperatorBuilder simplified(zone());
JSGraph jsgraph(isolate(), graph(), common(), javascript(), &simplified,
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
-
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
JSCallReducer reducer(&graph_reducer, &jsgraph, broker(), zone(),
JSCallReducer::kNoFlags, &deps_);
return reducer.Reduce(node);
diff --git a/deps/v8/test/unittests/compiler/js-create-lowering-unittest.cc b/deps/v8/test/unittests/compiler/js-create-lowering-unittest.cc
index d50278700f..a10f246491 100644
--- a/deps/v8/test/unittests/compiler/js-create-lowering-unittest.cc
+++ b/deps/v8/test/unittests/compiler/js-create-lowering-unittest.cc
@@ -43,8 +43,7 @@ class JSCreateLoweringTest : public TypedGraphTest {
SimplifiedOperatorBuilder simplified(zone());
JSGraph jsgraph(isolate(), graph(), common(), javascript(), &simplified,
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
JSCreateLowering reducer(&graph_reducer, &deps_, &jsgraph, broker(),
zone());
return reducer.Reduce(node);
diff --git a/deps/v8/test/unittests/compiler/js-intrinsic-lowering-unittest.cc b/deps/v8/test/unittests/compiler/js-intrinsic-lowering-unittest.cc
index 5b4088f28e..2a5410d307 100644
--- a/deps/v8/test/unittests/compiler/js-intrinsic-lowering-unittest.cc
+++ b/deps/v8/test/unittests/compiler/js-intrinsic-lowering-unittest.cc
@@ -35,8 +35,7 @@ class JSIntrinsicLoweringTest : public GraphTest {
SimplifiedOperatorBuilder simplified(zone());
JSGraph jsgraph(isolate(), graph(), common(), javascript(), &simplified,
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
JSIntrinsicLowering reducer(&graph_reducer, &jsgraph, broker());
return reducer.Reduce(node);
}
diff --git a/deps/v8/test/unittests/compiler/js-typed-lowering-unittest.cc b/deps/v8/test/unittests/compiler/js-typed-lowering-unittest.cc
index 5f68aea4e4..c20149d21e 100644
--- a/deps/v8/test/unittests/compiler/js-typed-lowering-unittest.cc
+++ b/deps/v8/test/unittests/compiler/js-typed-lowering-unittest.cc
@@ -50,8 +50,7 @@ class JSTypedLoweringTest : public TypedGraphTest {
SimplifiedOperatorBuilder simplified(zone());
JSGraph jsgraph(isolate(), graph(), common(), javascript(), &simplified,
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
JSTypedLowering reducer(&graph_reducer, &jsgraph, broker(), zone());
return reducer.Reduce(node);
}
diff --git a/deps/v8/test/unittests/compiler/machine-operator-reducer-unittest.cc b/deps/v8/test/unittests/compiler/machine-operator-reducer-unittest.cc
index 168fd9017d..358771f6d4 100644
--- a/deps/v8/test/unittests/compiler/machine-operator-reducer-unittest.cc
+++ b/deps/v8/test/unittests/compiler/machine-operator-reducer-unittest.cc
@@ -34,7 +34,8 @@ class MachineOperatorReducerTest : public GraphTest {
javascript_(zone()),
jsgraph_(isolate(), graph(), &common_, &javascript_, nullptr,
&machine_),
- graph_reducer_(zone(), graph(), tick_counter(), jsgraph_.Dead()) {}
+ graph_reducer_(zone(), graph(), tick_counter(), broker(),
+ jsgraph_.Dead()) {}
protected:
Reduction Reduce(Node* node) {
@@ -837,6 +838,16 @@ TEST_F(MachineOperatorReducerTest, Word32AndWithBitFields) {
}
}
+TEST_F(MachineOperatorReducerTest, Word32AndWithIncorrectBitField) {
+ Reduction const r = Reduce(graph()->NewNode(
+ machine()->Word32And(), Parameter(0),
+ graph()->NewNode(machine()->Word32Equal(),
+ graph()->NewNode(machine()->Word32And(), Parameter(0),
+ Int32Constant(4)),
+ Parameter(0))));
+ ASSERT_FALSE(r.Changed());
+}
+
// -----------------------------------------------------------------------------
// Word32Or
diff --git a/deps/v8/test/unittests/compiler/ppc/OWNERS b/deps/v8/test/unittests/compiler/ppc/OWNERS
index 6d1a8fc472..6edd45a6ef 100644
--- a/deps/v8/test/unittests/compiler/ppc/OWNERS
+++ b/deps/v8/test/unittests/compiler/ppc/OWNERS
@@ -1,4 +1,4 @@
-jyan@ca.ibm.com
+junyan@redhat.com
joransiu@ca.ibm.com
-michael_dawson@ca.ibm.com
-miladfar@ca.ibm.com \ No newline at end of file
+midawson@redhat.com
+mfarazma@redhat.com
diff --git a/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc b/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc
index 4e8da8e969..b8fe329f69 100644
--- a/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc
+++ b/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc
@@ -85,18 +85,6 @@ class LiveRangeUnitTest : public TestWithZone {
return range->SplitAt(LifetimePosition::FromInt(pos), zone());
}
- TopLevelLiveRange* Splinter(TopLevelLiveRange* top, int start, int end,
- int new_id = 0) {
- if (top->splinter() == nullptr) {
- TopLevelLiveRange* ret = zone()->New<TopLevelLiveRange>(
- new_id, MachineRepresentation::kTagged);
- top->SetSplinter(ret);
- }
- top->Splinter(LifetimePosition::FromInt(start),
- LifetimePosition::FromInt(end), zone());
- return top->splinter();
- }
-
// Ranges first and second match structurally.
bool RangesMatch(LiveRange* first, LiveRange* second) {
if (first->Start() != second->Start() || first->End() != second->End()) {
@@ -308,185 +296,6 @@ TEST_F(LiveRangeUnitTest, SplitManyIntervalUsePositionsAfter) {
EXPECT_TRUE(RangesMatch(expected_bottom, child));
}
-TEST_F(LiveRangeUnitTest, SplinterSingleInterval) {
- TopLevelLiveRange* range = TestRangeBuilder(zone()).Build(0, 6);
- TopLevelLiveRange* splinter = Splinter(range, 3, 5);
- EXPECT_EQ(nullptr, range->next());
- EXPECT_EQ(nullptr, splinter->next());
- EXPECT_EQ(range, splinter->splintered_from());
-
- TopLevelLiveRange* expected_source =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 6).Build();
- TopLevelLiveRange* expected_splinter = TestRangeBuilder(zone()).Build(3, 5);
- EXPECT_TRUE(RangesMatch(expected_source, range));
- EXPECT_TRUE(RangesMatch(expected_splinter, splinter));
-}
-
-TEST_F(LiveRangeUnitTest, MergeSingleInterval) {
- TopLevelLiveRange* original = TestRangeBuilder(zone()).Build(0, 6);
- TopLevelLiveRange* splinter = Splinter(original, 3, 5);
-
- original->Merge(splinter, zone());
- TopLevelLiveRange* result = TestRangeBuilder(zone()).Build(0, 6);
- LiveRange* child_1 = Split(result, 3);
- Split(child_1, 5);
-
- EXPECT_TRUE(RangesMatch(result, original));
-}
-
-TEST_F(LiveRangeUnitTest, SplinterMultipleIntervalsOutside) {
- TopLevelLiveRange* range =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- TopLevelLiveRange* splinter = Splinter(range, 2, 6);
- EXPECT_EQ(nullptr, range->next());
- EXPECT_EQ(nullptr, splinter->next());
- EXPECT_EQ(range, splinter->splintered_from());
-
- TopLevelLiveRange* expected_source =
- TestRangeBuilder(zone()).Add(0, 2).Add(6, 8).Build();
- TopLevelLiveRange* expected_splinter =
- TestRangeBuilder(zone()).Add(2, 3).Add(5, 6).Build();
- EXPECT_TRUE(RangesMatch(expected_source, range));
- EXPECT_TRUE(RangesMatch(expected_splinter, splinter));
-}
-
-TEST_F(LiveRangeUnitTest, MergeMultipleIntervalsOutside) {
- TopLevelLiveRange* original =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- TopLevelLiveRange* splinter = Splinter(original, 2, 6);
- original->Merge(splinter, zone());
-
- TopLevelLiveRange* result =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- LiveRange* child_1 = Split(result, 2);
- Split(child_1, 6);
- EXPECT_TRUE(RangesMatch(result, original));
-}
-
-TEST_F(LiveRangeUnitTest, SplinterMultipleIntervalsInside) {
- TopLevelLiveRange* range =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- V8_ASSERT_DEBUG_DEATH(Splinter(range, 3, 5), ".*");
-}
-
-TEST_F(LiveRangeUnitTest, SplinterMultipleIntervalsLeft) {
- TopLevelLiveRange* range =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- TopLevelLiveRange* splinter = Splinter(range, 2, 4);
- EXPECT_EQ(nullptr, range->next());
- EXPECT_EQ(nullptr, splinter->next());
- EXPECT_EQ(range, splinter->splintered_from());
-
- TopLevelLiveRange* expected_source =
- TestRangeBuilder(zone()).Add(0, 2).Add(5, 8).Build();
- TopLevelLiveRange* expected_splinter = TestRangeBuilder(zone()).Build(2, 3);
- EXPECT_TRUE(RangesMatch(expected_source, range));
- EXPECT_TRUE(RangesMatch(expected_splinter, splinter));
-}
-
-TEST_F(LiveRangeUnitTest, MergeMultipleIntervalsLeft) {
- TopLevelLiveRange* original =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- TopLevelLiveRange* splinter = Splinter(original, 2, 4);
- original->Merge(splinter, zone());
-
- TopLevelLiveRange* result =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- Split(result, 2);
- EXPECT_TRUE(RangesMatch(result, original));
-}
-
-TEST_F(LiveRangeUnitTest, SplinterMultipleIntervalsRight) {
- TopLevelLiveRange* range =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- TopLevelLiveRange* splinter = Splinter(range, 4, 6);
- EXPECT_EQ(nullptr, range->next());
- EXPECT_EQ(nullptr, splinter->next());
- EXPECT_EQ(range, splinter->splintered_from());
-
- TopLevelLiveRange* expected_source =
- TestRangeBuilder(zone()).Add(0, 3).Add(6, 8).Build();
- TopLevelLiveRange* expected_splinter = TestRangeBuilder(zone()).Build(5, 6);
- EXPECT_TRUE(RangesMatch(expected_source, range));
- EXPECT_TRUE(RangesMatch(expected_splinter, splinter));
-}
-
-TEST_F(LiveRangeUnitTest, SplinterMergeMultipleTimes) {
- TopLevelLiveRange* range =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 10).Add(12, 16).Build();
- Splinter(range, 4, 6);
- Splinter(range, 8, 14);
- TopLevelLiveRange* splinter = range->splinter();
- EXPECT_EQ(nullptr, range->next());
- EXPECT_EQ(nullptr, splinter->next());
- EXPECT_EQ(range, splinter->splintered_from());
-
- TopLevelLiveRange* expected_source =
- TestRangeBuilder(zone()).Add(0, 3).Add(6, 8).Add(14, 16).Build();
- TopLevelLiveRange* expected_splinter =
- TestRangeBuilder(zone()).Add(5, 6).Add(8, 10).Add(12, 14).Build();
- EXPECT_TRUE(RangesMatch(expected_source, range));
- EXPECT_TRUE(RangesMatch(expected_splinter, splinter));
-}
-
-TEST_F(LiveRangeUnitTest, MergeMultipleIntervalsRight) {
- TopLevelLiveRange* original =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- TopLevelLiveRange* splinter = Splinter(original, 4, 6);
- original->Merge(splinter, zone());
-
- TopLevelLiveRange* result =
- TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build();
- LiveRange* child_1 = Split(result, 5);
- Split(child_1, 6);
-
- EXPECT_TRUE(RangesMatch(result, original));
-}
-
-TEST_F(LiveRangeUnitTest, MergeAfterSplitting) {
- TopLevelLiveRange* original = TestRangeBuilder(zone()).Build(0, 8);
- TopLevelLiveRange* splinter = Splinter(original, 4, 6);
- LiveRange* original_child = Split(original, 2);
- Split(original_child, 7);
- original->Merge(splinter, zone());
-
- TopLevelLiveRange* result = TestRangeBuilder(zone()).Build(0, 8);
- LiveRange* child_1 = Split(result, 2);
- LiveRange* child_2 = Split(child_1, 4);
- LiveRange* child_3 = Split(child_2, 6);
- Split(child_3, 7);
-
- EXPECT_TRUE(RangesMatch(result, original));
-}
-
-TEST_F(LiveRangeUnitTest, IDGeneration) {
- TopLevelLiveRange* vreg = TestRangeBuilder(zone()).Id(2).Build(0, 100);
- EXPECT_EQ(2, vreg->vreg());
- EXPECT_EQ(0, vreg->relative_id());
-
- TopLevelLiveRange* splinter =
- zone()->New<TopLevelLiveRange>(101, MachineRepresentation::kTagged);
- vreg->SetSplinter(splinter);
- vreg->Splinter(LifetimePosition::FromInt(4), LifetimePosition::FromInt(12),
- zone());
-
- EXPECT_EQ(101, splinter->vreg());
- EXPECT_EQ(1, splinter->relative_id());
-
- LiveRange* child = vreg->SplitAt(LifetimePosition::FromInt(50), zone());
-
- EXPECT_EQ(2, child->relative_id());
-
- LiveRange* splinter_child =
- splinter->SplitAt(LifetimePosition::FromInt(8), zone());
-
- EXPECT_EQ(1, splinter->relative_id());
- EXPECT_EQ(3, splinter_child->relative_id());
-
- vreg->Merge(splinter, zone());
- EXPECT_EQ(1, splinter->relative_id());
-}
-
} // namespace compiler
} // namespace internal
} // namespace v8
diff --git a/deps/v8/test/unittests/compiler/regalloc/register-allocator-unittest.cc b/deps/v8/test/unittests/compiler/regalloc/register-allocator-unittest.cc
index 509cf80eb2..6f25792d11 100644
--- a/deps/v8/test/unittests/compiler/regalloc/register-allocator-unittest.cc
+++ b/deps/v8/test/unittests/compiler/regalloc/register-allocator-unittest.cc
@@ -634,63 +634,7 @@ TEST_F(RegisterAllocatorTest, SingleDeferredBlockSpill) {
Reg(0), Slot(0)));
}
-TEST_F(RegisterAllocatorTest, MultipleDeferredBlockSpills) {
- if (FLAG_turbo_control_flow_aware_allocation) return;
-
- StartBlock(); // B0
- auto var1 = EmitOI(Reg(0));
- auto var2 = EmitOI(Reg(1));
- auto var3 = EmitOI(Reg(2));
- EndBlock(Branch(Reg(var1, 0), 1, 2));
-
- StartBlock(true); // B1
- EmitCall(Slot(-2), Slot(var1));
- EndBlock(Jump(2));
-
- StartBlock(true); // B2
- EmitCall(Slot(-1), Slot(var2));
- EndBlock();
-
- StartBlock(); // B3
- EmitNop();
- EndBlock();
-
- StartBlock(); // B4
- Return(Reg(var3, 2));
- EndBlock();
-
- const int def_of_v2 = 3;
- const int call_in_b1 = 4;
- const int call_in_b2 = 6;
- const int end_of_b1 = 5;
- const int end_of_b2 = 7;
- const int start_of_b3 = 8;
-
- Allocate();
- // TODO(mtrofin): at the moment, the linear allocator spills var1 and var2,
- // so only var3 is spilled in deferred blocks.
- const int var3_reg = 2;
- const int var3_slot = 2;
-
- EXPECT_FALSE(IsParallelMovePresent(def_of_v2, Instruction::START, sequence(),
- Reg(var3_reg), Slot()));
- EXPECT_TRUE(IsParallelMovePresent(call_in_b1, Instruction::START, sequence(),
- Reg(var3_reg), Slot(var3_slot)));
- EXPECT_TRUE(IsParallelMovePresent(end_of_b1, Instruction::START, sequence(),
- Slot(var3_slot), Reg()));
-
- EXPECT_TRUE(IsParallelMovePresent(call_in_b2, Instruction::START, sequence(),
- Reg(var3_reg), Slot(var3_slot)));
- EXPECT_TRUE(IsParallelMovePresent(end_of_b2, Instruction::START, sequence(),
- Slot(var3_slot), Reg()));
-
- EXPECT_EQ(0,
- GetParallelMoveCount(start_of_b3, Instruction::START, sequence()));
-}
-
TEST_F(RegisterAllocatorTest, ValidMultipleDeferredBlockSpills) {
- if (!FLAG_turbo_control_flow_aware_allocation) return;
-
StartBlock(); // B0
auto var1 = EmitOI(Reg(0));
auto var2 = EmitOI(Reg(1));
diff --git a/deps/v8/test/unittests/compiler/simplified-operator-reducer-unittest.cc b/deps/v8/test/unittests/compiler/simplified-operator-reducer-unittest.cc
index 2158590ece..b73207ad98 100644
--- a/deps/v8/test/unittests/compiler/simplified-operator-reducer-unittest.cc
+++ b/deps/v8/test/unittests/compiler/simplified-operator-reducer-unittest.cc
@@ -30,13 +30,12 @@ class SimplifiedOperatorReducerTest : public GraphTest {
protected:
Reduction Reduce(Node* node) {
- JSHeapBroker broker(isolate(), zone());
MachineOperatorBuilder machine(zone());
JSOperatorBuilder javascript(zone());
JSGraph jsgraph(isolate(), graph(), common(), &javascript, simplified(),
&machine);
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
- SimplifiedOperatorReducer reducer(&graph_reducer, &jsgraph, &broker);
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
+ SimplifiedOperatorReducer reducer(&graph_reducer, &jsgraph, broker());
return reducer.Reduce(node);
}
@@ -500,6 +499,63 @@ TEST_F(SimplifiedOperatorReducerTest, ObjectIsSmiWithNumberConstant) {
}
}
+// -----------------------------------------------------------------------------
+// CheckedInt32Add
+
+TEST_F(SimplifiedOperatorReducerTest,
+ CheckedInt32AddConsecutivelyWithConstants) {
+ Node* p0 = Parameter(0);
+ Node* effect = graph()->start();
+ Node* control = graph()->start();
+ TRACED_FOREACH(int32_t, a, kInt32Values) {
+ TRACED_FOREACH(int32_t, b, kInt32Values) {
+ Node* add1 = graph()->NewNode(simplified()->CheckedInt32Add(), p0,
+ Int32Constant(a), effect, control);
+ Node* add2 = graph()->NewNode(simplified()->CheckedInt32Add(), add1,
+ Int32Constant(b), add1, control);
+
+ Reduction r = Reduce(add2);
+ int32_t c;
+ bool overflow = base::bits::SignedAddOverflow32(a, b, &c);
+ if ((a >= 0) == (b >= 0) && !overflow) {
+ ASSERT_TRUE(r.Changed());
+ Node* new_node = r.replacement();
+ ASSERT_EQ(new_node->opcode(), IrOpcode::kCheckedInt32Add);
+ ASSERT_EQ(new_node->InputAt(0), p0);
+ EXPECT_THAT(new_node->InputAt(1), IsInt32Constant(c));
+ ASSERT_EQ(new_node->InputAt(2), effect);
+ ASSERT_EQ(new_node->InputAt(3), control);
+ EXPECT_TRUE(add1->uses().empty());
+ } else {
+ ASSERT_FALSE(r.Changed());
+ }
+ }
+ }
+}
+
+TEST_F(SimplifiedOperatorReducerTest,
+ CheckedInt32AddConsecutivelyWithConstantsNoChanged) {
+ Node* p0 = Parameter(0);
+ Node* effect = graph()->start();
+ Node* control = graph()->start();
+ TRACED_FOREACH(int32_t, a, kInt32Values) {
+ TRACED_FOREACH(int32_t, b, kInt32Values) {
+ Node* add1 = graph()->NewNode(simplified()->CheckedInt32Add(), p0,
+ Int32Constant(a), effect, control);
+ Node* add2 = graph()->NewNode(simplified()->CheckedInt32Add(), add1,
+ Int32Constant(b), add1, control);
+ Node* add3 = graph()->NewNode(simplified()->CheckedInt32Add(), add1,
+ Int32Constant(b), effect, control);
+
+ // No changed since add1 has other value uses.
+ Reduction r = Reduce(add2);
+ ASSERT_FALSE(r.Changed());
+ r = Reduce(add3);
+ ASSERT_FALSE(r.Changed());
+ }
+ }
+}
+
} // namespace simplified_operator_reducer_unittest
} // namespace compiler
} // namespace internal
diff --git a/deps/v8/test/unittests/compiler/typed-optimization-unittest.cc b/deps/v8/test/unittests/compiler/typed-optimization-unittest.cc
index fb40386378..043c90bd6c 100644
--- a/deps/v8/test/unittests/compiler/typed-optimization-unittest.cc
+++ b/deps/v8/test/unittests/compiler/typed-optimization-unittest.cc
@@ -36,8 +36,7 @@ class TypedOptimizationTest : public TypedGraphTest {
JSOperatorBuilder javascript(zone());
JSGraph jsgraph(isolate(), graph(), common(), &javascript, simplified(),
&machine);
- // TODO(titzer): mock the GraphReducer here for better unit testing.
- GraphReducer graph_reducer(zone(), graph(), tick_counter());
+ GraphReducer graph_reducer(zone(), graph(), tick_counter(), broker());
TypedOptimization reducer(&graph_reducer, &deps_, &jsgraph, broker());
return reducer.Reduce(node);
}
diff --git a/deps/v8/test/unittests/heap/base/run-all-unittests.cc b/deps/v8/test/unittests/heap/base/run-all-unittests.cc
new file mode 100644
index 0000000000..cdc862e309
--- /dev/null
+++ b/deps/v8/test/unittests/heap/base/run-all-unittests.cc
@@ -0,0 +1,17 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "testing/gmock/include/gmock/gmock.h"
+
+int main(int argc, char** argv) {
+ // Don't catch SEH exceptions and continue as the following tests might hang
+ // in an broken environment on windows.
+ testing::GTEST_FLAG(catch_exceptions) = false;
+
+ // Most unit-tests are multi-threaded, so enable thread-safe death-tests.
+ testing::FLAGS_gtest_death_test_style = "threadsafe";
+
+ testing::InitGoogleMock(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/deps/v8/test/unittests/heap/base/worklist-unittest.cc b/deps/v8/test/unittests/heap/base/worklist-unittest.cc
new file mode 100644
index 0000000000..ae737a7aa3
--- /dev/null
+++ b/deps/v8/test/unittests/heap/base/worklist-unittest.cc
@@ -0,0 +1,311 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/base/worklist.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace heap {
+namespace base {
+
+class SomeObject {};
+
+using TestWorklist = Worklist<SomeObject*, 64>;
+
+TEST(CppgcWorkListTest, SegmentCreate) {
+ TestWorklist::Segment segment;
+ EXPECT_TRUE(segment.IsEmpty());
+ EXPECT_EQ(0u, segment.Size());
+ EXPECT_FALSE(segment.IsFull());
+}
+
+TEST(CppgcWorkListTest, SegmentPush) {
+ TestWorklist::Segment segment;
+ EXPECT_EQ(0u, segment.Size());
+ segment.Push(nullptr);
+ EXPECT_EQ(1u, segment.Size());
+}
+
+TEST(CppgcWorkListTest, SegmentPushPop) {
+ TestWorklist::Segment segment;
+ segment.Push(nullptr);
+ EXPECT_EQ(1u, segment.Size());
+ SomeObject dummy;
+ SomeObject* object = &dummy;
+ segment.Pop(&object);
+ EXPECT_EQ(0u, segment.Size());
+ EXPECT_EQ(nullptr, object);
+}
+
+TEST(CppgcWorkListTest, SegmentIsEmpty) {
+ TestWorklist::Segment segment;
+ EXPECT_TRUE(segment.IsEmpty());
+ segment.Push(nullptr);
+ EXPECT_FALSE(segment.IsEmpty());
+}
+
+TEST(CppgcWorkListTest, SegmentIsFull) {
+ TestWorklist::Segment segment;
+ EXPECT_FALSE(segment.IsFull());
+ for (size_t i = 0; i < TestWorklist::Segment::kSize; i++) {
+ segment.Push(nullptr);
+ }
+ EXPECT_TRUE(segment.IsFull());
+}
+
+TEST(CppgcWorkListTest, SegmentClear) {
+ TestWorklist::Segment segment;
+ segment.Push(nullptr);
+ EXPECT_FALSE(segment.IsEmpty());
+ segment.Clear();
+ EXPECT_TRUE(segment.IsEmpty());
+ for (size_t i = 0; i < TestWorklist::Segment::kSize; i++) {
+ segment.Push(nullptr);
+ }
+}
+
+TEST(CppgcWorkListTest, SegmentUpdateFalse) {
+ TestWorklist::Segment segment;
+ SomeObject* object;
+ object = reinterpret_cast<SomeObject*>(&object);
+ segment.Push(object);
+ segment.Update([](SomeObject* object, SomeObject** out) { return false; });
+ EXPECT_TRUE(segment.IsEmpty());
+}
+
+TEST(CppgcWorkListTest, SegmentUpdate) {
+ TestWorklist::Segment segment;
+ SomeObject* objectA;
+ objectA = reinterpret_cast<SomeObject*>(&objectA);
+ SomeObject* objectB;
+ objectB = reinterpret_cast<SomeObject*>(&objectB);
+ segment.Push(objectA);
+ segment.Update([objectB](SomeObject* object, SomeObject** out) {
+ *out = objectB;
+ return true;
+ });
+ SomeObject* object;
+ segment.Pop(&object);
+ EXPECT_EQ(object, objectB);
+}
+
+TEST(CppgcWorkListTest, CreateEmpty) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local(&worklist);
+ EXPECT_TRUE(worklist_local.IsLocalEmpty());
+ EXPECT_TRUE(worklist.IsEmpty());
+}
+
+TEST(CppgcWorkListTest, LocalPushPop) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local(&worklist);
+ SomeObject dummy;
+ SomeObject* retrieved = nullptr;
+ worklist_local.Push(&dummy);
+ EXPECT_FALSE(worklist_local.IsLocalEmpty());
+ EXPECT_TRUE(worklist_local.Pop(&retrieved));
+ EXPECT_EQ(&dummy, retrieved);
+}
+
+TEST(CppgcWorkListTest, LocalPushStaysPrivate) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_view1(&worklist);
+ TestWorklist::Local worklist_view2(&worklist);
+ SomeObject dummy;
+ SomeObject* retrieved = nullptr;
+ EXPECT_TRUE(worklist.IsEmpty());
+ EXPECT_EQ(0U, worklist.Size());
+ worklist_view1.Push(&dummy);
+ EXPECT_EQ(0U, worklist.Size());
+ EXPECT_FALSE(worklist_view2.Pop(&retrieved));
+ EXPECT_EQ(nullptr, retrieved);
+ EXPECT_TRUE(worklist_view1.Pop(&retrieved));
+ EXPECT_EQ(&dummy, retrieved);
+ EXPECT_EQ(0U, worklist.Size());
+}
+
+TEST(CppgcWorkListTest, GlobalUpdateNull) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local(&worklist);
+ SomeObject* object;
+ object = reinterpret_cast<SomeObject*>(&object);
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local.Push(object);
+ }
+ worklist_local.Push(object);
+ worklist_local.Publish();
+ worklist.Update([](SomeObject* object, SomeObject** out) { return false; });
+ EXPECT_TRUE(worklist.IsEmpty());
+ EXPECT_EQ(0U, worklist.Size());
+}
+
+TEST(CppgcWorkListTest, GlobalUpdate) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local(&worklist);
+ SomeObject* objectA = nullptr;
+ objectA = reinterpret_cast<SomeObject*>(&objectA);
+ SomeObject* objectB = nullptr;
+ objectB = reinterpret_cast<SomeObject*>(&objectB);
+ SomeObject* objectC = nullptr;
+ objectC = reinterpret_cast<SomeObject*>(&objectC);
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local.Push(objectA);
+ }
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local.Push(objectB);
+ }
+ worklist_local.Push(objectA);
+ worklist_local.Publish();
+ worklist.Update([objectA, objectC](SomeObject* object, SomeObject** out) {
+ if (object != objectA) {
+ *out = objectC;
+ return true;
+ }
+ return false;
+ });
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ SomeObject* object;
+ EXPECT_TRUE(worklist_local.Pop(&object));
+ EXPECT_EQ(object, objectC);
+ }
+}
+
+TEST(CppgcWorkListTest, FlushToGlobalPushSegment) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local0(&worklist);
+ TestWorklist::Local worklist_local1(&worklist);
+ SomeObject* object = nullptr;
+ SomeObject* objectA = nullptr;
+ objectA = reinterpret_cast<SomeObject*>(&objectA);
+ worklist_local0.Push(objectA);
+ worklist_local0.Publish();
+ EXPECT_EQ(1U, worklist.Size());
+ EXPECT_TRUE(worklist_local1.Pop(&object));
+}
+
+TEST(CppgcWorkListTest, FlushToGlobalPopSegment) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local0(&worklist);
+ TestWorklist::Local worklist_local1(&worklist);
+ SomeObject* object = nullptr;
+ SomeObject* objectA = nullptr;
+ objectA = reinterpret_cast<SomeObject*>(&objectA);
+ worklist_local0.Push(objectA);
+ worklist_local0.Push(objectA);
+ worklist_local0.Pop(&object);
+ worklist_local0.Publish();
+ EXPECT_EQ(1U, worklist.Size());
+ EXPECT_TRUE(worklist_local1.Pop(&object));
+}
+
+TEST(CppgcWorkListTest, Clear) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local(&worklist);
+ SomeObject* object;
+ object = reinterpret_cast<SomeObject*>(&object);
+ worklist_local.Push(object);
+ worklist_local.Publish();
+ EXPECT_EQ(1U, worklist.Size());
+ worklist.Clear();
+ EXPECT_TRUE(worklist.IsEmpty());
+ EXPECT_EQ(0U, worklist.Size());
+}
+
+TEST(CppgcWorkListTest, SingleSegmentSteal) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local1(&worklist);
+ TestWorklist::Local worklist_local2(&worklist);
+ SomeObject dummy;
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local1.Push(&dummy);
+ }
+ SomeObject* retrieved = nullptr;
+ // One more push/pop to publish the full segment.
+ worklist_local1.Push(nullptr);
+ EXPECT_TRUE(worklist_local1.Pop(&retrieved));
+ EXPECT_EQ(nullptr, retrieved);
+ EXPECT_EQ(1U, worklist.Size());
+ // Stealing.
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ EXPECT_TRUE(worklist_local2.Pop(&retrieved));
+ EXPECT_EQ(&dummy, retrieved);
+ EXPECT_FALSE(worklist_local1.Pop(&retrieved));
+ }
+ EXPECT_TRUE(worklist.IsEmpty());
+ EXPECT_EQ(0U, worklist.Size());
+}
+
+TEST(CppgcWorkListTest, MultipleSegmentsStolen) {
+ TestWorklist worklist;
+ TestWorklist::Local worklist_local1(&worklist);
+ TestWorklist::Local worklist_local2(&worklist);
+ TestWorklist::Local worklist_local3(&worklist);
+ SomeObject dummy1;
+ SomeObject dummy2;
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local1.Push(&dummy1);
+ }
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local1.Push(&dummy2);
+ }
+ SomeObject* retrieved = nullptr;
+ SomeObject dummy3;
+ // One more push/pop to publish the full segment.
+ worklist_local1.Push(&dummy3);
+ EXPECT_TRUE(worklist_local1.Pop(&retrieved));
+ EXPECT_EQ(&dummy3, retrieved);
+ EXPECT_EQ(2U, worklist.Size());
+ // Stealing.
+ EXPECT_TRUE(worklist_local2.Pop(&retrieved));
+ SomeObject* const expect_bag2 = retrieved;
+ EXPECT_TRUE(worklist_local3.Pop(&retrieved));
+ SomeObject* const expect_bag3 = retrieved;
+ EXPECT_EQ(0U, worklist.Size());
+ EXPECT_NE(expect_bag2, expect_bag3);
+ EXPECT_TRUE(expect_bag2 == &dummy1 || expect_bag2 == &dummy2);
+ EXPECT_TRUE(expect_bag3 == &dummy1 || expect_bag3 == &dummy2);
+ for (size_t i = 1; i < TestWorklist::kSegmentSize; i++) {
+ EXPECT_TRUE(worklist_local2.Pop(&retrieved));
+ EXPECT_EQ(expect_bag2, retrieved);
+ EXPECT_FALSE(worklist_local1.Pop(&retrieved));
+ }
+ for (size_t i = 1; i < TestWorklist::kSegmentSize; i++) {
+ EXPECT_TRUE(worklist_local3.Pop(&retrieved));
+ EXPECT_EQ(expect_bag3, retrieved);
+ EXPECT_FALSE(worklist_local1.Pop(&retrieved));
+ }
+ EXPECT_TRUE(worklist.IsEmpty());
+}
+
+TEST(CppgcWorkListTest, MergeGlobalPool) {
+ TestWorklist worklist1;
+ TestWorklist::Local worklist_local1(&worklist1);
+ SomeObject dummy;
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ worklist_local1.Push(&dummy);
+ }
+ SomeObject* retrieved = nullptr;
+ // One more push/pop to publish the full segment.
+ worklist_local1.Push(nullptr);
+ EXPECT_TRUE(worklist_local1.Pop(&retrieved));
+ EXPECT_EQ(nullptr, retrieved);
+ EXPECT_EQ(1U, worklist1.Size());
+ // Merging global pool into a new Worklist.
+ TestWorklist worklist2;
+ TestWorklist::Local worklist_local2(&worklist2);
+ EXPECT_EQ(0U, worklist2.Size());
+ worklist2.Merge(&worklist1);
+ EXPECT_EQ(1U, worklist2.Size());
+ EXPECT_FALSE(worklist2.IsEmpty());
+ for (size_t i = 0; i < TestWorklist::kSegmentSize; i++) {
+ EXPECT_TRUE(worklist_local2.Pop(&retrieved));
+ EXPECT_EQ(&dummy, retrieved);
+ EXPECT_FALSE(worklist_local1.Pop(&retrieved));
+ }
+ EXPECT_TRUE(worklist1.IsEmpty());
+ EXPECT_TRUE(worklist2.IsEmpty());
+}
+
+} // namespace base
+} // namespace heap
diff --git a/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc b/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc
new file mode 100644
index 0000000000..b39a545b7b
--- /dev/null
+++ b/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc
@@ -0,0 +1,159 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "include/cppgc/allocation.h"
+#include "include/cppgc/default-platform.h"
+#include "include/cppgc/member.h"
+#include "include/cppgc/persistent.h"
+#include "src/heap/cppgc/globals.h"
+#include "src/heap/cppgc/marker.h"
+#include "src/heap/cppgc/marking-visitor.h"
+#include "src/heap/cppgc/stats-collector.h"
+#include "test/unittests/heap/cppgc/tests.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cppgc {
+namespace internal {
+
+#if defined(THREAD_SANITIZER)
+
+namespace {
+
+class GCed : public GarbageCollected<GCed> {
+ public:
+ void Trace(cppgc::Visitor* visitor) const { visitor->Trace(child_); }
+
+ Member<GCed> child_;
+};
+
+class GCedWithCallback : public GarbageCollected<GCedWithCallback> {
+ public:
+ template <typename Callback>
+ explicit GCedWithCallback(Callback callback) {
+ callback(this);
+ }
+
+ void Trace(cppgc::Visitor* visitor) const { visitor->Trace(child_); }
+
+ Member<GCedWithCallback> child_;
+};
+
+class Mixin : public GarbageCollectedMixin {
+ public:
+ void Trace(cppgc::Visitor* visitor) const { visitor->Trace(child_); }
+
+ Member<Mixin> child_;
+};
+
+class GCedWithMixin : public GarbageCollected<GCedWithMixin>, public Mixin {
+ public:
+ void Trace(cppgc::Visitor* visitor) const { Mixin::Trace(visitor); }
+};
+
+template <typename T>
+class GCedHolder : public GarbageCollected<GCedHolder<T>> {
+ public:
+ void Trace(cppgc::Visitor* visitor) const { visitor->Trace(object_); }
+
+ Member<T> object_;
+};
+
+class ConcurrentMarkingTest : public testing::TestWithHeap {
+ public:
+ using Config = Heap::Config;
+ static constexpr Config ConcurrentPreciseConfig = {
+ Config::CollectionType::kMajor, Config::StackState::kNoHeapPointers,
+ Config::MarkingType::kIncrementalAndConcurrent,
+ Config::SweepingType::kIncrementalAndConcurrent};
+
+ void StartConcurrentGC() {
+ Heap* heap = Heap::From(GetHeap());
+ heap->DisableHeapGrowingForTesting();
+ heap->StartIncrementalGarbageCollection(ConcurrentPreciseConfig);
+ heap->marker()->DisableIncrementalMarkingForTesting();
+ }
+
+ bool SingleStep(Config::StackState stack_state) {
+ MarkerBase* marker = Heap::From(GetHeap())->marker();
+ DCHECK(marker);
+ return marker->IncrementalMarkingStepForTesting(stack_state);
+ }
+
+ void FinishSteps(Config::StackState stack_state) {
+ while (!SingleStep(stack_state)) {
+ }
+ }
+
+ void FinishGC() {
+ Heap::From(GetHeap())->FinalizeIncrementalGarbageCollectionIfRunning(
+ ConcurrentPreciseConfig);
+ }
+};
+
+// static
+constexpr ConcurrentMarkingTest::Config
+ ConcurrentMarkingTest::ConcurrentPreciseConfig;
+
+} // namespace
+
+// The following tests below check for data races during concurrent marking.
+
+TEST_F(ConcurrentMarkingTest, MarkingObjects) {
+ static constexpr int kNumStep = 1000;
+ StartConcurrentGC();
+ Persistent<GCedHolder<GCed>> root =
+ MakeGarbageCollected<GCedHolder<GCed>>(GetAllocationHandle());
+ Member<GCed>* last_object = &root->object_;
+ for (int i = 0; i < kNumStep; ++i) {
+ for (int j = 0; j < kNumStep; ++j) {
+ *last_object = MakeGarbageCollected<GCed>(GetAllocationHandle());
+ last_object = &(*last_object)->child_;
+ }
+ // Use SignleStep to re-post concurrent jobs.
+ SingleStep(Config::StackState::kNoHeapPointers);
+ }
+ FinishGC();
+}
+
+TEST_F(ConcurrentMarkingTest, MarkingInConstructionObjects) {
+ static constexpr int kNumStep = 1000;
+ StartConcurrentGC();
+ Persistent<GCedHolder<GCedWithCallback>> root =
+ MakeGarbageCollected<GCedHolder<GCedWithCallback>>(GetAllocationHandle());
+ Member<GCedWithCallback>* last_object = &root->object_;
+ for (int i = 0; i < kNumStep; ++i) {
+ for (int j = 0; j < kNumStep; ++j) {
+ MakeGarbageCollected<GCedWithCallback>(
+ GetAllocationHandle(), [&last_object](GCedWithCallback* obj) {
+ *last_object = obj;
+ last_object = &(*last_object)->child_;
+ });
+ }
+ // Use SignleStep to re-post concurrent jobs.
+ SingleStep(Config::StackState::kNoHeapPointers);
+ }
+ FinishGC();
+}
+
+TEST_F(ConcurrentMarkingTest, MarkingMixinObjects) {
+ static constexpr int kNumStep = 1000;
+ StartConcurrentGC();
+ Persistent<GCedHolder<Mixin>> root =
+ MakeGarbageCollected<GCedHolder<Mixin>>(GetAllocationHandle());
+ Member<Mixin>* last_object = &root->object_;
+ for (int i = 0; i < kNumStep; ++i) {
+ for (int j = 0; j < kNumStep; ++j) {
+ *last_object = MakeGarbageCollected<GCedWithMixin>(GetAllocationHandle());
+ last_object = &(*last_object)->child_;
+ }
+ // Use SignleStep to re-post concurrent jobs.
+ SingleStep(Config::StackState::kNoHeapPointers);
+ }
+ FinishGC();
+}
+
+#endif // defined(THREAD_SANITIZER)
+
+} // namespace internal
+} // namespace cppgc
diff --git a/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc b/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc
index 32e65756fb..3794adce25 100644
--- a/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc
@@ -79,7 +79,7 @@ class ConcurrentSweeperTest : public testing::TestWithHeap {
void FinishSweeping() {
Heap* heap = Heap::From(GetHeap());
Sweeper& sweeper = heap->sweeper();
- sweeper.Finish();
+ sweeper.FinishIfRunning();
}
const RawHeap& GetRawHeap() const {
diff --git a/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc b/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc
index 3695afc6f4..9dc1b8d426 100644
--- a/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc
@@ -6,6 +6,7 @@
#include "include/cppgc/platform.h"
#include "src/heap/cppgc/heap.h"
+#include "test/unittests/heap/cppgc/test-platform.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -18,6 +19,8 @@ namespace {
class MockGarbageCollector : public GarbageCollector {
public:
MOCK_METHOD(void, CollectGarbage, (GarbageCollector::Config), (override));
+ MOCK_METHOD(void, StartIncrementalGarbageCollection,
+ (GarbageCollector::Config), (override));
MOCK_METHOD(size_t, epoch, (), (const, override));
};
@@ -81,7 +84,7 @@ TEST(GCInvokerTest, ConservativeGCIsInvokedSynchronouslyWhenSupported) {
invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
}
-TEST(GCInvokerTest, ConservativeGCIsInvokedAsPreciseGCViaPlatform) {
+TEST(GCInvokerTest, ConservativeGCIsScheduledAsPreciseGCViaPlatform) {
std::shared_ptr<cppgc::TaskRunner> runner =
std::shared_ptr<cppgc::TaskRunner>(new MockTaskRunner());
MockPlatform platform(runner);
@@ -94,5 +97,43 @@ TEST(GCInvokerTest, ConservativeGCIsInvokedAsPreciseGCViaPlatform) {
invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
}
+TEST(GCInvokerTest, ConservativeGCIsInvokedAsPreciseGCViaPlatform) {
+ testing::TestPlatform platform;
+ MockGarbageCollector gc;
+ GCInvoker invoker(&gc, &platform,
+ cppgc::Heap::StackSupport::kNoConservativeStackScan);
+ EXPECT_CALL(gc, epoch).WillRepeatedly(::testing::Return(0));
+ EXPECT_CALL(gc, CollectGarbage);
+ invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
+ platform.WaitAllForegroundTasks();
+}
+
+TEST(GCInvokerTest, IncrementalGCIsStarted) {
+ // Since StartIncrementalGarbageCollection doesn't scan the stack, support for
+ // conservative stack scanning should not matter.
+ MockPlatform platform(nullptr);
+ MockGarbageCollector gc;
+ // Conservative stack scanning supported.
+ GCInvoker invoker_with_support(
+ &gc, &platform,
+ cppgc::Heap::StackSupport::kSupportsConservativeStackScan);
+ EXPECT_CALL(
+ gc, StartIncrementalGarbageCollection(::testing::Field(
+ &GarbageCollector::Config::stack_state,
+ GarbageCollector::Config::StackState::kMayContainHeapPointers)));
+ invoker_with_support.StartIncrementalGarbageCollection(
+ GarbageCollector::Config::ConservativeIncrementalConfig());
+ // Conservative stack scanning *not* supported.
+ GCInvoker invoker_without_support(
+ &gc, &platform, cppgc::Heap::StackSupport::kNoConservativeStackScan);
+ EXPECT_CALL(
+ gc, StartIncrementalGarbageCollection(::testing::Field(
+ &GarbageCollector::Config::stack_state,
+ GarbageCollector::Config::StackState::kMayContainHeapPointers)))
+ .Times(0);
+ invoker_without_support.StartIncrementalGarbageCollection(
+ GarbageCollector::Config::ConservativeIncrementalConfig());
+}
+
} // namespace internal
} // namespace cppgc
diff --git a/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc b/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc
index 42994fb0d5..f1ff2a5877 100644
--- a/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc
@@ -29,6 +29,11 @@ class FakeGarbageCollector : public GarbageCollector {
callcount_++;
}
+ void StartIncrementalGarbageCollection(
+ GarbageCollector::Config config) override {
+ UNREACHABLE();
+ }
+
size_t epoch() const override { return callcount_; }
private:
@@ -40,6 +45,8 @@ class FakeGarbageCollector : public GarbageCollector {
class MockGarbageCollector : public GarbageCollector {
public:
MOCK_METHOD(void, CollectGarbage, (GarbageCollector::Config), (override));
+ MOCK_METHOD(void, StartIncrementalGarbageCollection,
+ (GarbageCollector::Config), (override));
MOCK_METHOD(size_t, epoch, (), (const, override));
};
@@ -87,7 +94,7 @@ TEST(HeapGrowingTest, ConstantGrowingFactor) {
gc.SetLiveBytes(kObjectSize);
FakeAllocate(&stats_collector, kObjectSize + 1);
EXPECT_EQ(1u, gc.epoch());
- EXPECT_EQ(1.5 * kObjectSize, growing.limit());
+ EXPECT_EQ(1.5 * kObjectSize, growing.limit_for_atomic_gc());
}
TEST(HeapGrowingTest, SmallHeapGrowing) {
@@ -103,7 +110,35 @@ TEST(HeapGrowingTest, SmallHeapGrowing) {
gc.SetLiveBytes(1);
FakeAllocate(&stats_collector, kLargeAllocation);
EXPECT_EQ(1u, gc.epoch());
- EXPECT_EQ(1 + HeapGrowing::kMinLimitIncrease, growing.limit());
+ EXPECT_EQ(1 + HeapGrowing::kMinLimitIncrease, growing.limit_for_atomic_gc());
+}
+
+TEST(HeapGrowingTest, IncrementalGCStarted) {
+ StatsCollector stats_collector;
+ MockGarbageCollector gc;
+ cppgc::Heap::ResourceConstraints constraints;
+ HeapGrowing growing(&gc, &stats_collector, constraints);
+ EXPECT_CALL(gc, CollectGarbage(::testing::_)).Times(0);
+ EXPECT_CALL(gc, StartIncrementalGarbageCollection(::testing::_));
+ // Allocate 1 byte less the limit for atomic gc to trigger incremental gc.
+ FakeAllocate(&stats_collector, growing.limit_for_atomic_gc() - 1);
+}
+
+TEST(HeapGrowingTest, IncrementalGCFinalized) {
+ StatsCollector stats_collector;
+ MockGarbageCollector gc;
+ cppgc::Heap::ResourceConstraints constraints;
+ HeapGrowing growing(&gc, &stats_collector, constraints);
+ EXPECT_CALL(gc, CollectGarbage(::testing::_)).Times(0);
+ EXPECT_CALL(gc, StartIncrementalGarbageCollection(::testing::_));
+ // Allocate 1 byte less the limit for atomic gc to trigger incremental gc.
+ size_t bytes_for_incremental_gc = growing.limit_for_atomic_gc() - 1;
+ FakeAllocate(&stats_collector, bytes_for_incremental_gc);
+ ::testing::Mock::VerifyAndClearExpectations(&gc);
+ EXPECT_CALL(gc, CollectGarbage(::testing::_));
+ EXPECT_CALL(gc, StartIncrementalGarbageCollection(::testing::_)).Times(0);
+ // Allocate the rest needed to trigger atomic gc ().
+ FakeAllocate(&stats_collector, StatsCollector::kAllocationThresholdBytes);
}
} // namespace internal
diff --git a/deps/v8/test/unittests/heap/cppgc/incremental-marking-schedule-unittest.cc b/deps/v8/test/unittests/heap/cppgc/incremental-marking-schedule-unittest.cc
new file mode 100644
index 0000000000..e91870be9d
--- /dev/null
+++ b/deps/v8/test/unittests/heap/cppgc/incremental-marking-schedule-unittest.cc
@@ -0,0 +1,95 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/cppgc/incremental-marking-schedule.h"
+
+#include "src/base/platform/time.h"
+#include "src/heap/cppgc/globals.h"
+#include "src/heap/cppgc/stats-collector.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cppgc {
+namespace internal {
+
+namespace {
+
+class IncrementalMarkingScheduleTest : public testing::Test {
+ public:
+ static const size_t kObjectSize;
+};
+
+const size_t IncrementalMarkingScheduleTest::kObjectSize =
+ 100 * IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep;
+
+} // namespace
+
+TEST_F(IncrementalMarkingScheduleTest, FirstStepReturnsDefaultDuration) {
+ IncrementalMarkingSchedule schedule;
+ schedule.NotifyIncrementalMarkingStart();
+ schedule.SetElapsedTimeForTesting(0);
+ EXPECT_EQ(IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+}
+
+// If marking is not behind schedule and very small time passed between steps
+// the oracle should return the minimum step duration.
+TEST_F(IncrementalMarkingScheduleTest, NoTimePassedReturnsMinimumDuration) {
+ IncrementalMarkingSchedule schedule;
+ schedule.NotifyIncrementalMarkingStart();
+ // Add incrementally marked bytes to tell oracle this is not the first step.
+ schedule.UpdateIncrementalMarkedBytes(
+ IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep);
+ schedule.SetElapsedTimeForTesting(0);
+ EXPECT_EQ(IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+}
+
+TEST_F(IncrementalMarkingScheduleTest, OracleDoesntExccedMaximumStepDuration) {
+ IncrementalMarkingSchedule schedule;
+ schedule.NotifyIncrementalMarkingStart();
+ // Add incrementally marked bytes to tell oracle this is not the first step.
+ static constexpr size_t kMarkedBytes = 1;
+ schedule.UpdateIncrementalMarkedBytes(kMarkedBytes);
+ schedule.SetElapsedTimeForTesting(
+ IncrementalMarkingSchedule::kEstimatedMarkingTimeMs);
+ EXPECT_EQ(kObjectSize - kMarkedBytes,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+}
+
+TEST_F(IncrementalMarkingScheduleTest, AheadOfScheduleReturnsMinimumDuration) {
+ IncrementalMarkingSchedule schedule;
+ schedule.NotifyIncrementalMarkingStart();
+ // Add incrementally marked bytes to tell oracle this is not the first step.
+ schedule.UpdateIncrementalMarkedBytes(
+ IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep);
+ schedule.AddConcurrentlyMarkedBytes(0.6 * kObjectSize);
+ schedule.SetElapsedTimeForTesting(
+ 0.5 * IncrementalMarkingSchedule::kEstimatedMarkingTimeMs);
+ EXPECT_EQ(IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+}
+
+TEST_F(IncrementalMarkingScheduleTest, BehindScheduleReturnsCorrectDuration) {
+ IncrementalMarkingSchedule schedule;
+ schedule.NotifyIncrementalMarkingStart();
+ schedule.UpdateIncrementalMarkedBytes(0.1 * kObjectSize);
+ schedule.AddConcurrentlyMarkedBytes(0.25 * kObjectSize);
+ schedule.SetElapsedTimeForTesting(
+ 0.5 * IncrementalMarkingSchedule::kEstimatedMarkingTimeMs);
+ EXPECT_EQ(0.15 * kObjectSize,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+ schedule.AddConcurrentlyMarkedBytes(0.05 * kObjectSize);
+ schedule.SetElapsedTimeForTesting(
+ 0.5 * IncrementalMarkingSchedule::kEstimatedMarkingTimeMs);
+ EXPECT_EQ(0.1 * kObjectSize,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+ schedule.AddConcurrentlyMarkedBytes(0.05 * kObjectSize);
+ schedule.SetElapsedTimeForTesting(
+ 0.5 * IncrementalMarkingSchedule::kEstimatedMarkingTimeMs);
+ EXPECT_EQ(0.05 * kObjectSize,
+ schedule.GetNextIncrementalStepDuration(kObjectSize));
+}
+
+} // namespace internal
+} // namespace cppgc
diff --git a/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc b/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc
index 8944372701..b879d9b989 100644
--- a/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc
@@ -18,7 +18,6 @@ namespace cppgc {
namespace internal {
namespace {
-
class MarkerTest : public testing::TestWithHeap {
public:
using MarkingConfig = Marker::MarkingConfig;
@@ -27,14 +26,24 @@ class MarkerTest : public testing::TestWithHeap {
const MarkingConfig config = {MarkingConfig::CollectionType::kMajor,
stack_state};
auto* heap = Heap::From(GetHeap());
- Marker marker(heap->AsBase());
- marker.StartMarking(config);
- marker.FinishMarking(config);
- marker.ProcessWeakness();
+ InitializeMarker(*heap, GetPlatformHandle().get(), config);
+ marker_->FinishMarking(stack_state);
+ marker_->ProcessWeakness();
// Pretend do finish sweeping as StatsCollector verifies that Notify*
// methods are called in the right order.
heap->stats_collector()->NotifySweepingCompleted();
}
+
+ void InitializeMarker(HeapBase& heap, cppgc::Platform* platform,
+ MarkingConfig config) {
+ marker_ =
+ MarkerFactory::CreateAndStartMarking<Marker>(heap, platform, config);
+ }
+
+ Marker* marker() const { return marker_.get(); }
+
+ private:
+ std::unique_ptr<Marker> marker_;
};
class GCed : public GarbageCollected<GCed> {
@@ -216,50 +225,166 @@ class GCedWithCallback : public GarbageCollected<GCedWithCallback> {
} // namespace
TEST_F(MarkerTest, InConstructionObjectIsEventuallyMarkedEmptyStack) {
- Marker marker(Heap::From(GetHeap())->AsBase());
- marker.StartMarking({MarkingConfig::CollectionType::kMajor,
- MarkingConfig::StackState::kMayContainHeapPointers});
+ static const Marker::MarkingConfig config = {
+ MarkingConfig::CollectionType::kMajor,
+ MarkingConfig::StackState::kMayContainHeapPointers};
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
GCedWithCallback* object = MakeGarbageCollected<GCedWithCallback>(
- GetAllocationHandle(), [&marker](GCedWithCallback* obj) {
+ GetAllocationHandle(), [marker = marker()](GCedWithCallback* obj) {
Member<GCedWithCallback> member(obj);
- marker.VisitorForTesting().Trace(member);
+ marker->VisitorForTesting().Trace(member);
});
EXPECT_TRUE(HeapObjectHeader::FromPayload(object).IsMarked());
- marker.FinishMarking({MarkingConfig::CollectionType::kMajor,
- MarkingConfig::StackState::kMayContainHeapPointers});
+ marker()->FinishMarking(MarkingConfig::StackState::kMayContainHeapPointers);
EXPECT_TRUE(HeapObjectHeader::FromPayload(object).IsMarked());
}
TEST_F(MarkerTest, InConstructionObjectIsEventuallyMarkedNonEmptyStack) {
- Marker marker(Heap::From(GetHeap())->AsBase());
static const Marker::MarkingConfig config = {
MarkingConfig::CollectionType::kMajor,
MarkingConfig::StackState::kMayContainHeapPointers};
- marker.StartMarking(config);
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
MakeGarbageCollected<GCedWithCallback>(
- GetAllocationHandle(), [&marker](GCedWithCallback* obj) {
+ GetAllocationHandle(), [marker = marker()](GCedWithCallback* obj) {
Member<GCedWithCallback> member(obj);
- marker.VisitorForTesting().Trace(member);
+ marker->VisitorForTesting().Trace(member);
EXPECT_TRUE(HeapObjectHeader::FromPayload(obj).IsMarked());
- marker.FinishMarking(config);
+ marker->FinishMarking(
+ MarkingConfig::StackState::kMayContainHeapPointers);
EXPECT_TRUE(HeapObjectHeader::FromPayload(obj).IsMarked());
});
}
TEST_F(MarkerTest, SentinelNotClearedOnWeakPersistentHandling) {
- Marker marker(Heap::From(GetHeap())->AsBase());
- Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
- auto* tmp = MakeGarbageCollected<GCed>(GetAllocationHandle());
- root->SetWeakChild(tmp);
static const Marker::MarkingConfig config = {
MarkingConfig::CollectionType::kMajor,
MarkingConfig::StackState::kNoHeapPointers};
- marker.StartMarking(config);
- marker.FinishMarking(config);
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
+ Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
+ auto* tmp = MakeGarbageCollected<GCed>(GetAllocationHandle());
+ root->SetWeakChild(tmp);
+ marker()->FinishMarking(MarkingConfig::StackState::kNoHeapPointers);
root->SetWeakChild(kSentinelPointer);
- marker.ProcessWeakness();
+ marker()->ProcessWeakness();
EXPECT_EQ(kSentinelPointer, root->weak_child());
}
+// Incremental Marking
+
+class IncrementalMarkingTest : public testing::TestWithHeap {
+ public:
+ using MarkingConfig = Marker::MarkingConfig;
+
+ static constexpr MarkingConfig IncrementalPreciseMarkingConfig = {
+ MarkingConfig::CollectionType::kMajor,
+ MarkingConfig::StackState::kNoHeapPointers,
+ MarkingConfig::MarkingType::kIncremental};
+ static constexpr MarkingConfig IncrementalConservativeMarkingConfig = {
+ MarkingConfig::CollectionType::kMajor,
+ MarkingConfig::StackState::kMayContainHeapPointers,
+ MarkingConfig::MarkingType::kIncremental};
+
+ void FinishSteps(MarkingConfig::StackState stack_state) {
+ while (!SingleStep(stack_state)) {}
+ }
+
+ void FinishMarking() {
+ marker_->FinishMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+ marker_->ProcessWeakness();
+ // Pretend do finish sweeping as StatsCollector verifies that Notify*
+ // methods are called in the right order.
+ Heap::From(GetHeap())->stats_collector()->NotifySweepingCompleted();
+ }
+
+ void InitializeMarker(HeapBase& heap, cppgc::Platform* platform,
+ MarkingConfig config) {
+ marker_ =
+ MarkerFactory::CreateAndStartMarking<Marker>(heap, platform, config);
+ }
+
+ Marker* marker() const { return marker_.get(); }
+
+ private:
+ bool SingleStep(MarkingConfig::StackState stack_state) {
+ return marker_->IncrementalMarkingStepForTesting(stack_state);
+ }
+
+ std::unique_ptr<Marker> marker_;
+};
+
+constexpr IncrementalMarkingTest::MarkingConfig
+ IncrementalMarkingTest::IncrementalPreciseMarkingConfig;
+constexpr IncrementalMarkingTest::MarkingConfig
+ IncrementalMarkingTest::IncrementalConservativeMarkingConfig;
+
+TEST_F(IncrementalMarkingTest, RootIsMarkedAfterMarkingStarted) {
+ Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
+ EXPECT_FALSE(HeapObjectHeader::FromPayload(root).IsMarked());
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
+ IncrementalPreciseMarkingConfig);
+ EXPECT_TRUE(HeapObjectHeader::FromPayload(root).IsMarked());
+ FinishMarking();
+}
+
+TEST_F(IncrementalMarkingTest, MemberIsMarkedAfterMarkingSteps) {
+ Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
+ root->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
+ HeapObjectHeader& header = HeapObjectHeader::FromPayload(root->child());
+ EXPECT_FALSE(header.IsMarked());
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
+ IncrementalPreciseMarkingConfig);
+ FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+ EXPECT_TRUE(header.IsMarked());
+ FinishMarking();
+}
+
+TEST_F(IncrementalMarkingTest,
+ MemberWithWriteBarrierIsMarkedAfterMarkingSteps) {
+ Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
+ IncrementalPreciseMarkingConfig);
+ root->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
+ HeapObjectHeader& header = HeapObjectHeader::FromPayload(root->child());
+ EXPECT_FALSE(header.IsMarked());
+ FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+ EXPECT_TRUE(header.IsMarked());
+ FinishMarking();
+}
+
+namespace {
+class Holder : public GarbageCollected<Holder> {
+ public:
+ void Trace(Visitor* visitor) const { visitor->Trace(member_); }
+
+ Member<GCedWithCallback> member_;
+};
+} // namespace
+
+TEST_F(IncrementalMarkingTest, IncrementalStepDuringAllocation) {
+ Persistent<Holder> holder =
+ MakeGarbageCollected<Holder>(GetAllocationHandle());
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
+ IncrementalPreciseMarkingConfig);
+ const HeapObjectHeader* header;
+ MakeGarbageCollected<GCedWithCallback>(
+ GetAllocationHandle(), [this, &holder, &header](GCedWithCallback* obj) {
+ header = &HeapObjectHeader::FromPayload(obj);
+ holder->member_ = obj;
+ EXPECT_FALSE(header->IsMarked());
+ FinishSteps(MarkingConfig::StackState::kMayContainHeapPointers);
+ EXPECT_TRUE(header->IsMarked());
+ });
+ FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+ EXPECT_TRUE(header->IsMarked());
+ FinishMarking();
+}
+
+TEST_F(IncrementalMarkingTest, MarkingRunsOutOfWorkEventually) {
+ InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
+ IncrementalPreciseMarkingConfig);
+ FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+ FinishMarking();
+}
+
} // namespace internal
} // namespace cppgc
diff --git a/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc b/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc
index 47a6b26dee..fb5ba772da 100644
--- a/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc
@@ -76,6 +76,28 @@ TEST_F(MarkingVerifierTest, DoesntDieOnMarkedWeakMember) {
VerifyMarking(Heap::From(GetHeap())->AsBase(), StackState::kNoHeapPointers);
}
+namespace {
+
+class GCedWithCallback : public GarbageCollected<GCedWithCallback> {
+ public:
+ template <typename Callback>
+ explicit GCedWithCallback(Callback callback) {
+ callback(this);
+ }
+ void Trace(cppgc::Visitor* visitor) const {}
+};
+
+} // namespace
+
+TEST_F(MarkingVerifierTest, DoesntDieOnInConstructionOnObject) {
+ MakeGarbageCollected<GCedWithCallback>(
+ GetAllocationHandle(), [this](GCedWithCallback* obj) {
+ HeapObjectHeader::FromPayload(obj).TryMarkAtomic();
+ VerifyMarking(Heap::From(GetHeap())->AsBase(),
+ StackState::kMayContainHeapPointers);
+ });
+}
+
// Death tests.
namespace {
diff --git a/deps/v8/test/unittests/heap/cppgc/marking-visitor-unittest.cc b/deps/v8/test/unittests/heap/cppgc/marking-visitor-unittest.cc
index 799d44bea9..51387712c7 100644
--- a/deps/v8/test/unittests/heap/cppgc/marking-visitor-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/marking-visitor-unittest.cc
@@ -23,7 +23,8 @@ namespace {
class MarkingVisitorTest : public testing::TestWithHeap {
public:
MarkingVisitorTest()
- : marker_(std::make_unique<Marker>(Heap::From(GetHeap())->AsBase())) {}
+ : marker_(MarkerFactory::CreateAndStartMarking<Marker>(
+ *Heap::From(GetHeap()), GetPlatformHandle().get())) {}
~MarkingVisitorTest() override { marker_->ClearAllWorklistsForTesting(); }
Marker* GetMarker() { return marker_.get(); }
@@ -47,6 +48,7 @@ class TestMarkingVisitor : public MarkingVisitor {
public:
explicit TestMarkingVisitor(Marker* marker)
: MarkingVisitor(marker->heap(), marker->MarkingStateForTesting()) {}
+ ~TestMarkingVisitor() { marking_state_.Publish(); }
};
} // namespace
diff --git a/deps/v8/test/unittests/heap/cppgc/member-unittest.cc b/deps/v8/test/unittests/heap/cppgc/member-unittest.cc
index bddac760a5..64934d69cd 100644
--- a/deps/v8/test/unittests/heap/cppgc/member-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/member-unittest.cc
@@ -147,6 +147,41 @@ TEST_F(MemberTest, Swap) {
template <template <typename> class MemberType1,
template <typename> class MemberType2>
+void MoveTest(cppgc::Heap* heap) {
+ {
+ GCed* gced1 = MakeGarbageCollected<GCed>(heap->GetAllocationHandle());
+ MemberType1<GCed> member1 = gced1;
+ MemberType2<GCed> member2(std::move(member1));
+ // Move-from member must be in empty state.
+ EXPECT_FALSE(member1);
+ EXPECT_EQ(gced1, member2.Get());
+ }
+ {
+ GCed* gced1 = MakeGarbageCollected<GCed>(heap->GetAllocationHandle());
+ MemberType1<GCed> member1 = gced1;
+ MemberType2<GCed> member2;
+ member2 = std::move(member1);
+ // Move-from member must be in empty state.
+ EXPECT_FALSE(member1);
+ EXPECT_EQ(gced1, member2.Get());
+ }
+}
+
+TEST_F(MemberTest, Move) {
+ cppgc::Heap* heap = GetHeap();
+ MoveTest<Member, Member>(heap);
+ MoveTest<Member, WeakMember>(heap);
+ MoveTest<Member, UntracedMember>(heap);
+ MoveTest<WeakMember, Member>(heap);
+ MoveTest<WeakMember, WeakMember>(heap);
+ MoveTest<WeakMember, UntracedMember>(heap);
+ MoveTest<UntracedMember, Member>(heap);
+ MoveTest<UntracedMember, WeakMember>(heap);
+ MoveTest<UntracedMember, UntracedMember>(heap);
+}
+
+template <template <typename> class MemberType1,
+ template <typename> class MemberType2>
void HeterogeneousConversionTest(cppgc::Heap* heap) {
{
MemberType1<GCed> member1 =
diff --git a/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc b/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc
index 992bd67f6d..3591af29a4 100644
--- a/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc
@@ -49,7 +49,7 @@ class SweeperTest : public testing::TestWithHeap {
heap->stats_collector()->NotifyMarkingStarted();
heap->stats_collector()->NotifyMarkingCompleted(0);
sweeper.Start(Sweeper::Config::kAtomic);
- sweeper.Finish();
+ sweeper.FinishIfRunning();
}
void MarkObject(void* payload) {
diff --git a/deps/v8/test/unittests/heap/cppgc/test-platform.cc b/deps/v8/test/unittests/heap/cppgc/test-platform.cc
index 140e9c1589..c649b1e89d 100644
--- a/deps/v8/test/unittests/heap/cppgc/test-platform.cc
+++ b/deps/v8/test/unittests/heap/cppgc/test-platform.cc
@@ -6,29 +6,68 @@
#include "src/base/platform/platform.h"
#include "src/base/platform/time.h"
+#include "src/heap/cppgc/default-job.h"
namespace cppgc {
namespace internal {
namespace testing {
-void TestTaskRunner::PostTask(std::unique_ptr<v8::Task> task) {
+namespace {
+class TestJobThread final : public v8::base::Thread {
+ public:
+ using id = uint8_t;
+
+ explicit TestJobThread(TestJob* job) : Thread(Options("job")), job_(job) {}
+
+ void Run() final;
+
+ static size_t GetMaxSupportedConcurrency() { return 4u; }
+
+ private:
+ TestJob* const job_;
+};
+} // namespace
+
+// Default implementation of Jobs based on std::thread.
+class TestJob final : public DefaultJobImpl<TestJobThread> {
+ public:
+ explicit TestJob(Key key, std::unique_ptr<cppgc::JobTask> job_task)
+ : DefaultJobImpl(key, std::move(job_task)) {}
+
+ std::shared_ptr<TestJobThread> CreateThread(DefaultJobImpl* job) final {
+ std::shared_ptr<TestJobThread> thread =
+ std::make_shared<TestJobThread>(this);
+ const bool thread_started = thread->Start();
+ USE(thread_started);
+ DCHECK(thread_started);
+ return thread;
+ }
+};
+
+void TestJobThread::Run() {
+ DCHECK_NOT_NULL(job_);
+ job_->RunJobTask();
+}
+
+void TestTaskRunner::PostTask(std::unique_ptr<cppgc::Task> task) {
tasks_.push_back(std::move(task));
}
-void TestTaskRunner::PostNonNestableTask(std::unique_ptr<v8::Task> task) {
+void TestTaskRunner::PostNonNestableTask(std::unique_ptr<cppgc::Task> task) {
PostTask(std::move(task));
}
-void TestTaskRunner::PostDelayedTask(std::unique_ptr<v8::Task> task, double) {
+void TestTaskRunner::PostDelayedTask(std::unique_ptr<cppgc::Task> task,
+ double) {
PostTask(std::move(task));
}
-void TestTaskRunner::PostNonNestableDelayedTask(std::unique_ptr<v8::Task> task,
- double) {
+void TestTaskRunner::PostNonNestableDelayedTask(
+ std::unique_ptr<cppgc::Task> task, double) {
PostTask(std::move(task));
}
-void TestTaskRunner::PostIdleTask(std::unique_ptr<v8::IdleTask> task) {
+void TestTaskRunner::PostIdleTask(std::unique_ptr<cppgc::IdleTask> task) {
idle_tasks_.push_back(std::move(task));
}
@@ -62,35 +101,19 @@ void TestTaskRunner::RunUntilIdle() {
idle_tasks_.clear();
}
-class TestPlatform::TestJobHandle : public v8::JobHandle {
- public:
- explicit TestJobHandle(const std::shared_ptr<JobThread>& thread)
- : thread_(thread) {
- const bool success = thread_->Start();
- USE(success);
- }
-
- void NotifyConcurrencyIncrease() override {}
- void Join() override { thread_->Join(); }
- void Cancel() override { Join(); }
- bool IsRunning() override { return true; }
-
- private:
- std::shared_ptr<JobThread> thread_;
-};
-
TestPlatform::TestPlatform()
: foreground_task_runner_(std::make_unique<TestTaskRunner>()) {}
TestPlatform::~TestPlatform() V8_NOEXCEPT { WaitAllBackgroundTasks(); }
-std::unique_ptr<v8::JobHandle> TestPlatform::PostJob(
- v8::TaskPriority, std::unique_ptr<v8::JobTask> job_task) {
+std::unique_ptr<cppgc::JobHandle> TestPlatform::PostJob(
+ cppgc::TaskPriority, std::unique_ptr<cppgc::JobTask> job_task) {
if (AreBackgroundTasksDisabled()) return {};
- auto thread = std::make_shared<JobThread>(std::move(job_task));
- job_threads_.push_back(thread);
- return std::make_unique<TestJobHandle>(std::move(thread));
+ std::shared_ptr<TestJob> job =
+ DefaultJobFactory<TestJob>::Create(std::move(job_task));
+ jobs_.push_back(job);
+ return std::make_unique<TestJob::JobHandle>(std::move(job));
}
double TestPlatform::MonotonicallyIncreasingTime() {
@@ -103,10 +126,10 @@ void TestPlatform::WaitAllForegroundTasks() {
}
void TestPlatform::WaitAllBackgroundTasks() {
- for (auto& thread : job_threads_) {
- thread->Join();
+ for (auto& job : jobs_) {
+ job->Join();
}
- job_threads_.clear();
+ jobs_.clear();
}
TestPlatform::DisableBackgroundTasksScope::DisableBackgroundTasksScope(
diff --git a/deps/v8/test/unittests/heap/cppgc/test-platform.h b/deps/v8/test/unittests/heap/cppgc/test-platform.h
index 474afaed0f..1faa6efb40 100644
--- a/deps/v8/test/unittests/heap/cppgc/test-platform.h
+++ b/deps/v8/test/unittests/heap/cppgc/test-platform.h
@@ -16,16 +16,22 @@ namespace cppgc {
namespace internal {
namespace testing {
-class TestTaskRunner : public v8::TaskRunner {
+class TestJob;
+
+class TestTaskRunner : public cppgc::TaskRunner {
public:
- void PostTask(std::unique_ptr<v8::Task> task) override;
- void PostNonNestableTask(std::unique_ptr<v8::Task> task) override;
- void PostDelayedTask(std::unique_ptr<v8::Task> task, double) override;
- void PostNonNestableDelayedTask(std::unique_ptr<v8::Task> task,
+ void PostTask(std::unique_ptr<cppgc::Task> task) override;
+ void PostDelayedTask(std::unique_ptr<cppgc::Task> task, double) override;
+
+ bool NonNestableTasksEnabled() const override { return true; }
+ void PostNonNestableTask(std::unique_ptr<cppgc::Task> task) override;
+
+ bool NonNestableDelayedTasksEnabled() const override { return true; }
+ void PostNonNestableDelayedTask(std::unique_ptr<cppgc::Task> task,
double) override;
- void PostIdleTask(std::unique_ptr<v8::IdleTask> task) override;
bool IdleTasksEnabled() override { return true; }
+ void PostIdleTask(std::unique_ptr<cppgc::IdleTask> task) override;
bool RunSingleTask();
bool RunSingleIdleTask(double duration_in_seconds);
@@ -33,8 +39,8 @@ class TestTaskRunner : public v8::TaskRunner {
void RunUntilIdle();
private:
- std::vector<std::unique_ptr<v8::Task>> tasks_;
- std::vector<std::unique_ptr<v8::IdleTask>> idle_tasks_;
+ std::vector<std::unique_ptr<cppgc::Task>> tasks_;
+ std::vector<std::unique_ptr<cppgc::IdleTask>> idle_tasks_;
};
class TestPlatform : public Platform {
@@ -53,12 +59,14 @@ class TestPlatform : public Platform {
PageAllocator* GetPageAllocator() override { return &page_allocator_; }
- std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner() override {
+ std::shared_ptr<cppgc::TaskRunner> GetForegroundTaskRunner() override {
return foreground_task_runner_;
}
- std::unique_ptr<v8::JobHandle> PostJob(
- v8::TaskPriority, std::unique_ptr<v8::JobTask> job_task) override;
+ // TestPlatform does not support job priorities. All jobs would be assigned
+ // the same priority regardless of the cppgc::TaskPriority parameter.
+ std::unique_ptr<cppgc::JobHandle> PostJob(
+ cppgc::TaskPriority, std::unique_ptr<cppgc::JobTask> job_task) override;
double MonotonicallyIncreasingTime() override;
@@ -66,47 +74,13 @@ class TestPlatform : public Platform {
void WaitAllBackgroundTasks();
private:
- class TestJobHandle;
-
- class WorkerThread : public v8::base::Thread {
- public:
- explicit WorkerThread(std::unique_ptr<v8::Task> task)
- : Thread(Options("worker")), task_(std::move(task)) {}
-
- void Run() override {
- if (task_) std::move(task_)->Run();
- }
-
- private:
- std::unique_ptr<v8::Task> task_;
- };
-
- class JobThread : public v8::base::Thread {
- public:
- explicit JobThread(std::unique_ptr<v8::JobTask> task)
- : Thread(Options("job")), task_(std::move(task)) {}
-
- void Run() override {
- class JobDelegate : public v8::JobDelegate {
- public:
- bool ShouldYield() override { return false; }
- void NotifyConcurrencyIncrease() override {}
- } delegate;
-
- if (task_) task_->Run(&delegate);
- }
-
- private:
- std::unique_ptr<v8::JobTask> task_;
- };
-
bool AreBackgroundTasksDisabled() const {
return disabled_background_tasks_ > 0;
}
v8::base::PageAllocator page_allocator_;
std::shared_ptr<TestTaskRunner> foreground_task_runner_;
- std::vector<std::shared_ptr<JobThread>> job_threads_;
+ std::vector<std::shared_ptr<TestJob>> jobs_;
size_t disabled_background_tasks_ = 0;
};
diff --git a/deps/v8/test/unittests/heap/cppgc/worklist-unittest.cc b/deps/v8/test/unittests/heap/cppgc/worklist-unittest.cc
deleted file mode 100644
index b9e8843666..0000000000
--- a/deps/v8/test/unittests/heap/cppgc/worklist-unittest.cc
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2020 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/heap/cppgc/worklist.h"
-
-#include "test/unittests/heap/cppgc/tests.h"
-
-namespace cppgc {
-namespace internal {
-
-class SomeObject {};
-
-using TestWorklist = Worklist<SomeObject*, 64>;
-
-TEST(CppgcWorkListTest, SegmentCreate) {
- TestWorklist::Segment segment;
- EXPECT_TRUE(segment.IsEmpty());
- EXPECT_EQ(0u, segment.Size());
- EXPECT_FALSE(segment.IsFull());
-}
-
-TEST(CppgcWorkListTest, SegmentPush) {
- TestWorklist::Segment segment;
- EXPECT_EQ(0u, segment.Size());
- EXPECT_TRUE(segment.Push(nullptr));
- EXPECT_EQ(1u, segment.Size());
-}
-
-TEST(CppgcWorkListTest, SegmentPushPop) {
- TestWorklist::Segment segment;
- EXPECT_TRUE(segment.Push(nullptr));
- EXPECT_EQ(1u, segment.Size());
- SomeObject dummy;
- SomeObject* object = &dummy;
- EXPECT_TRUE(segment.Pop(&object));
- EXPECT_EQ(0u, segment.Size());
- EXPECT_EQ(nullptr, object);
-}
-
-TEST(CppgcWorkListTest, SegmentIsEmpty) {
- TestWorklist::Segment segment;
- EXPECT_TRUE(segment.IsEmpty());
- EXPECT_TRUE(segment.Push(nullptr));
- EXPECT_FALSE(segment.IsEmpty());
-}
-
-TEST(CppgcWorkListTest, SegmentIsFull) {
- TestWorklist::Segment segment;
- EXPECT_FALSE(segment.IsFull());
- for (size_t i = 0; i < TestWorklist::Segment::kCapacity; i++) {
- EXPECT_TRUE(segment.Push(nullptr));
- }
- EXPECT_TRUE(segment.IsFull());
-}
-
-TEST(CppgcWorkListTest, SegmentClear) {
- TestWorklist::Segment segment;
- EXPECT_TRUE(segment.Push(nullptr));
- EXPECT_FALSE(segment.IsEmpty());
- segment.Clear();
- EXPECT_TRUE(segment.IsEmpty());
- for (size_t i = 0; i < TestWorklist::Segment::kCapacity; i++) {
- EXPECT_TRUE(segment.Push(nullptr));
- }
-}
-
-TEST(CppgcWorkListTest, SegmentFullPushFails) {
- TestWorklist::Segment segment;
- EXPECT_FALSE(segment.IsFull());
- for (size_t i = 0; i < TestWorklist::Segment::kCapacity; i++) {
- EXPECT_TRUE(segment.Push(nullptr));
- }
- EXPECT_TRUE(segment.IsFull());
- EXPECT_FALSE(segment.Push(nullptr));
-}
-
-TEST(CppgcWorkListTest, SegmentEmptyPopFails) {
- TestWorklist::Segment segment;
- EXPECT_TRUE(segment.IsEmpty());
- SomeObject* object;
- EXPECT_FALSE(segment.Pop(&object));
-}
-
-TEST(CppgcWorkListTest, SegmentUpdateFalse) {
- TestWorklist::Segment segment;
- SomeObject* object;
- object = reinterpret_cast<SomeObject*>(&object);
- EXPECT_TRUE(segment.Push(object));
- segment.Update([](SomeObject* object, SomeObject** out) { return false; });
- EXPECT_TRUE(segment.IsEmpty());
-}
-
-TEST(CppgcWorkListTest, SegmentUpdate) {
- TestWorklist::Segment segment;
- SomeObject* objectA;
- objectA = reinterpret_cast<SomeObject*>(&objectA);
- SomeObject* objectB;
- objectB = reinterpret_cast<SomeObject*>(&objectB);
- EXPECT_TRUE(segment.Push(objectA));
- segment.Update([objectB](SomeObject* object, SomeObject** out) {
- *out = objectB;
- return true;
- });
- SomeObject* object;
- EXPECT_TRUE(segment.Pop(&object));
- EXPECT_EQ(object, objectB);
-}
-
-TEST(CppgcWorkListTest, CreateEmpty) {
- TestWorklist worklist;
- TestWorklist::View worklist_view(&worklist, 0);
- EXPECT_TRUE(worklist_view.IsLocalEmpty());
- EXPECT_TRUE(worklist.IsEmpty());
-}
-
-TEST(CppgcWorkListTest, LocalPushPop) {
- TestWorklist worklist;
- TestWorklist::View worklist_view(&worklist, 0);
- SomeObject dummy;
- SomeObject* retrieved = nullptr;
- EXPECT_TRUE(worklist_view.Push(&dummy));
- EXPECT_FALSE(worklist_view.IsLocalEmpty());
- EXPECT_TRUE(worklist_view.Pop(&retrieved));
- EXPECT_EQ(&dummy, retrieved);
-}
-
-TEST(CppgcWorkListTest, LocalIsBasedOnId) {
- TestWorklist worklist;
- // Use the same id.
- TestWorklist::View worklist_view1(&worklist, 0);
- TestWorklist::View worklist_view2(&worklist, 0);
- SomeObject dummy;
- SomeObject* retrieved = nullptr;
- EXPECT_TRUE(worklist_view1.Push(&dummy));
- EXPECT_FALSE(worklist_view1.IsLocalEmpty());
- EXPECT_FALSE(worklist_view2.IsLocalEmpty());
- EXPECT_TRUE(worklist_view2.Pop(&retrieved));
- EXPECT_EQ(&dummy, retrieved);
- EXPECT_TRUE(worklist_view1.IsLocalEmpty());
- EXPECT_TRUE(worklist_view2.IsLocalEmpty());
-}
-
-TEST(CppgcWorkListTest, LocalPushStaysPrivate) {
- TestWorklist worklist;
- TestWorklist::View worklist_view1(&worklist, 0);
- TestWorklist::View worklist_view2(&worklist, 1);
- SomeObject dummy;
- SomeObject* retrieved = nullptr;
- EXPECT_TRUE(worklist.IsEmpty());
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
- EXPECT_TRUE(worklist_view1.Push(&dummy));
- EXPECT_FALSE(worklist.IsEmpty());
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
- EXPECT_FALSE(worklist_view2.Pop(&retrieved));
- EXPECT_EQ(nullptr, retrieved);
- EXPECT_TRUE(worklist_view1.Pop(&retrieved));
- EXPECT_EQ(&dummy, retrieved);
- EXPECT_TRUE(worklist.IsEmpty());
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
-}
-
-TEST(CppgcWorkListTest, GlobalUpdateNull) {
- TestWorklist worklist;
- TestWorklist::View worklist_view(&worklist, 0);
- SomeObject* object;
- object = reinterpret_cast<SomeObject*>(&object);
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view.Push(object));
- }
- EXPECT_TRUE(worklist_view.Push(object));
- worklist.Update([](SomeObject* object, SomeObject** out) { return false; });
- EXPECT_TRUE(worklist.IsEmpty());
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
-}
-
-TEST(CppgcWorkListTest, GlobalUpdate) {
- TestWorklist worklist;
- TestWorklist::View worklist_view(&worklist, 0);
- SomeObject* objectA = nullptr;
- objectA = reinterpret_cast<SomeObject*>(&objectA);
- SomeObject* objectB = nullptr;
- objectB = reinterpret_cast<SomeObject*>(&objectB);
- SomeObject* objectC = nullptr;
- objectC = reinterpret_cast<SomeObject*>(&objectC);
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view.Push(objectA));
- }
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view.Push(objectB));
- }
- EXPECT_TRUE(worklist_view.Push(objectA));
- worklist.Update([objectA, objectC](SomeObject* object, SomeObject** out) {
- if (object != objectA) {
- *out = objectC;
- return true;
- }
- return false;
- });
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- SomeObject* object;
- EXPECT_TRUE(worklist_view.Pop(&object));
- EXPECT_EQ(object, objectC);
- }
-}
-
-TEST(CppgcWorkListTest, FlushToGlobalPushSegment) {
- TestWorklist worklist;
- TestWorklist::View worklist_view0(&worklist, 0);
- TestWorklist::View worklist_view1(&worklist, 1);
- SomeObject* object = nullptr;
- SomeObject* objectA = nullptr;
- objectA = reinterpret_cast<SomeObject*>(&objectA);
- EXPECT_TRUE(worklist_view0.Push(objectA));
- worklist.FlushToGlobal(0);
- EXPECT_EQ(1U, worklist.GlobalPoolSize());
- EXPECT_TRUE(worklist_view1.Pop(&object));
-}
-
-TEST(CppgcWorkListTest, FlushToGlobalPopSegment) {
- TestWorklist worklist;
- TestWorklist::View worklist_view0(&worklist, 0);
- TestWorklist::View worklist_view1(&worklist, 1);
- SomeObject* object = nullptr;
- SomeObject* objectA = nullptr;
- objectA = reinterpret_cast<SomeObject*>(&objectA);
- EXPECT_TRUE(worklist_view0.Push(objectA));
- EXPECT_TRUE(worklist_view0.Push(objectA));
- EXPECT_TRUE(worklist_view0.Pop(&object));
- worklist.FlushToGlobal(0);
- EXPECT_EQ(1U, worklist.GlobalPoolSize());
- EXPECT_TRUE(worklist_view1.Pop(&object));
-}
-
-TEST(CppgcWorkListTest, Clear) {
- TestWorklist worklist;
- TestWorklist::View worklist_view(&worklist, 0);
- SomeObject* object;
- object = reinterpret_cast<SomeObject*>(&object);
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view.Push(object));
- }
- EXPECT_TRUE(worklist_view.Push(object));
- EXPECT_EQ(1U, worklist.GlobalPoolSize());
- worklist.Clear();
- EXPECT_TRUE(worklist.IsEmpty());
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
-}
-
-TEST(CppgcWorkListTest, SingleSegmentSteal) {
- TestWorklist worklist;
- TestWorklist::View worklist_view1(&worklist, 0);
- TestWorklist::View worklist_view2(&worklist, 1);
- SomeObject dummy;
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view1.Push(&dummy));
- }
- SomeObject* retrieved = nullptr;
- // One more push/pop to publish the full segment.
- EXPECT_TRUE(worklist_view1.Push(nullptr));
- EXPECT_TRUE(worklist_view1.Pop(&retrieved));
- EXPECT_EQ(nullptr, retrieved);
- EXPECT_EQ(1U, worklist.GlobalPoolSize());
- // Stealing.
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view2.Pop(&retrieved));
- EXPECT_EQ(&dummy, retrieved);
- EXPECT_FALSE(worklist_view1.Pop(&retrieved));
- }
- EXPECT_TRUE(worklist.IsEmpty());
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
-}
-
-TEST(CppgcWorkListTest, MultipleSegmentsStolen) {
- TestWorklist worklist;
- TestWorklist::View worklist_view1(&worklist, 0);
- TestWorklist::View worklist_view2(&worklist, 1);
- TestWorklist::View worklist_view3(&worklist, 2);
- SomeObject dummy1;
- SomeObject dummy2;
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view1.Push(&dummy1));
- }
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view1.Push(&dummy2));
- }
- SomeObject* retrieved = nullptr;
- SomeObject dummy3;
- // One more push/pop to publish the full segment.
- EXPECT_TRUE(worklist_view1.Push(&dummy3));
- EXPECT_TRUE(worklist_view1.Pop(&retrieved));
- EXPECT_EQ(&dummy3, retrieved);
- EXPECT_EQ(2U, worklist.GlobalPoolSize());
- // Stealing.
- EXPECT_TRUE(worklist_view2.Pop(&retrieved));
- SomeObject* const expect_bag2 = retrieved;
- EXPECT_TRUE(worklist_view3.Pop(&retrieved));
- SomeObject* const expect_bag3 = retrieved;
- EXPECT_EQ(0U, worklist.GlobalPoolSize());
- EXPECT_NE(expect_bag2, expect_bag3);
- EXPECT_TRUE(expect_bag2 == &dummy1 || expect_bag2 == &dummy2);
- EXPECT_TRUE(expect_bag3 == &dummy1 || expect_bag3 == &dummy2);
- for (size_t i = 1; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view2.Pop(&retrieved));
- EXPECT_EQ(expect_bag2, retrieved);
- EXPECT_FALSE(worklist_view1.Pop(&retrieved));
- }
- for (size_t i = 1; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view3.Pop(&retrieved));
- EXPECT_EQ(expect_bag3, retrieved);
- EXPECT_FALSE(worklist_view1.Pop(&retrieved));
- }
- EXPECT_TRUE(worklist.IsEmpty());
-}
-
-TEST(CppgcWorkListTest, MergeGlobalPool) {
- TestWorklist worklist1;
- TestWorklist::View worklist_view1(&worklist1, 0);
- SomeObject dummy;
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view1.Push(&dummy));
- }
- SomeObject* retrieved = nullptr;
- // One more push/pop to publish the full segment.
- EXPECT_TRUE(worklist_view1.Push(nullptr));
- EXPECT_TRUE(worklist_view1.Pop(&retrieved));
- EXPECT_EQ(nullptr, retrieved);
- EXPECT_EQ(1U, worklist1.GlobalPoolSize());
- // Merging global pool into a new Worklist.
- TestWorklist worklist2;
- TestWorklist::View worklist_view2(&worklist2, 0);
- EXPECT_EQ(0U, worklist2.GlobalPoolSize());
- worklist2.MergeGlobalPool(&worklist1);
- EXPECT_EQ(1U, worklist2.GlobalPoolSize());
- EXPECT_FALSE(worklist2.IsEmpty());
- for (size_t i = 0; i < TestWorklist::kSegmentCapacity; i++) {
- EXPECT_TRUE(worklist_view2.Pop(&retrieved));
- EXPECT_EQ(&dummy, retrieved);
- EXPECT_FALSE(worklist_view1.Pop(&retrieved));
- }
- EXPECT_TRUE(worklist1.IsEmpty());
- EXPECT_TRUE(worklist2.IsEmpty());
-}
-
-} // namespace internal
-} // namespace cppgc
diff --git a/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc b/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc
index b8ca42db53..b06083d1ef 100644
--- a/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc
@@ -21,20 +21,18 @@ namespace {
class IncrementalMarkingScope {
public:
- explicit IncrementalMarkingScope(MarkerBase* marker) : marker_(marker) {
- marker_->StartMarking(kIncrementalConfig);
- }
+ explicit IncrementalMarkingScope(MarkerBase* marker) : marker_(marker) {}
~IncrementalMarkingScope() V8_NOEXCEPT {
- marker_->FinishMarking(kIncrementalConfig);
+ marker_->FinishMarking(kIncrementalConfig.stack_state);
}
- private:
static constexpr Marker::MarkingConfig kIncrementalConfig{
Marker::MarkingConfig::CollectionType::kMajor,
Marker::MarkingConfig::StackState::kNoHeapPointers,
Marker::MarkingConfig::MarkingType::kIncremental};
+ private:
MarkerBase* marker_;
};
@@ -45,15 +43,12 @@ class ExpectWriteBarrierFires final : private IncrementalMarkingScope {
ExpectWriteBarrierFires(MarkerBase* marker,
std::initializer_list<void*> objects)
: IncrementalMarkingScope(marker),
- marking_worklist_(
- marker->MarkingWorklistsForTesting().marking_worklist(),
- MarkingWorklists::kMutatorThreadId),
+ marking_worklist_(marker->MarkingStateForTesting().marking_worklist()),
write_barrier_worklist_(
- marker->MarkingWorklistsForTesting().write_barrier_worklist(),
- MarkingWorklists::kMutatorThreadId),
+ marker->MarkingStateForTesting().write_barrier_worklist()),
objects_(objects) {
- EXPECT_TRUE(marking_worklist_.IsGlobalPoolEmpty());
- EXPECT_TRUE(write_barrier_worklist_.IsGlobalPoolEmpty());
+ EXPECT_TRUE(marking_worklist_.IsGlobalEmpty());
+ EXPECT_TRUE(write_barrier_worklist_.IsGlobalEmpty());
for (void* object : objects) {
headers_.push_back(&HeapObjectHeader::FromPayload(object));
EXPECT_FALSE(headers_.back()->IsMarked());
@@ -81,13 +76,13 @@ class ExpectWriteBarrierFires final : private IncrementalMarkingScope {
EXPECT_TRUE(header->IsMarked());
header->Unmark();
}
- EXPECT_TRUE(marking_worklist_.IsGlobalPoolEmpty());
- EXPECT_TRUE(write_barrier_worklist_.IsGlobalPoolEmpty());
+ EXPECT_TRUE(marking_worklist_.IsGlobalEmpty());
+ EXPECT_TRUE(write_barrier_worklist_.IsGlobalEmpty());
}
private:
- MarkingWorklists::MarkingWorklist::View marking_worklist_;
- MarkingWorklists::WriteBarrierWorklist::View write_barrier_worklist_;
+ MarkingWorklists::MarkingWorklist::Local& marking_worklist_;
+ MarkingWorklists::WriteBarrierWorklist::Local& write_barrier_worklist_;
std::vector<void*> objects_;
std::vector<HeapObjectHeader*> headers_;
};
@@ -97,14 +92,11 @@ class ExpectNoWriteBarrierFires final : private IncrementalMarkingScope {
ExpectNoWriteBarrierFires(MarkerBase* marker,
std::initializer_list<void*> objects)
: IncrementalMarkingScope(marker),
- marking_worklist_(
- marker->MarkingWorklistsForTesting().marking_worklist(),
- MarkingWorklists::kMutatorThreadId),
+ marking_worklist_(marker->MarkingStateForTesting().marking_worklist()),
write_barrier_worklist_(
- marker->MarkingWorklistsForTesting().write_barrier_worklist(),
- MarkingWorklists::kMutatorThreadId) {
- EXPECT_TRUE(marking_worklist_.IsGlobalPoolEmpty());
- EXPECT_TRUE(write_barrier_worklist_.IsGlobalPoolEmpty());
+ marker->MarkingStateForTesting().write_barrier_worklist()) {
+ EXPECT_TRUE(marking_worklist_.IsGlobalEmpty());
+ EXPECT_TRUE(write_barrier_worklist_.IsGlobalEmpty());
for (void* object : objects) {
auto* header = &HeapObjectHeader::FromPayload(object);
headers_.emplace_back(header, header->IsMarked());
@@ -112,16 +104,16 @@ class ExpectNoWriteBarrierFires final : private IncrementalMarkingScope {
}
~ExpectNoWriteBarrierFires() {
- EXPECT_TRUE(marking_worklist_.IsGlobalPoolEmpty());
- EXPECT_TRUE(write_barrier_worklist_.IsGlobalPoolEmpty());
+ EXPECT_TRUE(marking_worklist_.IsGlobalEmpty());
+ EXPECT_TRUE(write_barrier_worklist_.IsGlobalEmpty());
for (const auto& pair : headers_) {
EXPECT_EQ(pair.second, pair.first->IsMarked());
}
}
private:
- MarkingWorklists::MarkingWorklist::View marking_worklist_;
- MarkingWorklists::WriteBarrierWorklist::View write_barrier_worklist_;
+ MarkingWorklists::MarkingWorklist::Local& marking_worklist_;
+ MarkingWorklists::WriteBarrierWorklist::Local& write_barrier_worklist_;
std::vector<std::pair<HeapObjectHeader*, bool /* was marked */>> headers_;
};
@@ -149,7 +141,9 @@ class GCed : public GarbageCollected<GCed> {
class WriteBarrierTest : public testing::TestWithHeap {
public:
WriteBarrierTest() : internal_heap_(Heap::From(GetHeap())) {
- GetMarkerRef() = std::make_unique<Marker>(internal_heap_->AsBase());
+ GetMarkerRef() = MarkerFactory::CreateAndStartMarking<Marker>(
+ *internal_heap_, GetPlatformHandle().get(),
+ IncrementalMarkingScope::kIncrementalConfig);
marker_ = GetMarkerRef().get();
}
@@ -165,6 +159,8 @@ class WriteBarrierTest : public testing::TestWithHeap {
MarkerBase* marker_;
};
+class NoWriteBarrierTest : public testing::TestWithHeap {};
+
// =============================================================================
// Basic support. ==============================================================
// =============================================================================
@@ -187,7 +183,7 @@ TEST_F(WriteBarrierTest, TriggersWhenMarkingIsOn) {
}
}
-TEST_F(WriteBarrierTest, BailoutWhenMarkingIsOff) {
+TEST_F(NoWriteBarrierTest, BailoutWhenMarkingIsOff) {
auto* object1 = MakeGarbageCollected<GCed>(GetAllocationHandle());
auto* object2 = MakeGarbageCollected<GCed>(GetAllocationHandle());
EXPECT_FALSE(object1->IsMarked());
diff --git a/deps/v8/test/unittests/heap/heap-unittest.cc b/deps/v8/test/unittests/heap/heap-unittest.cc
index 9181992b38..34774b3a35 100644
--- a/deps/v8/test/unittests/heap/heap-unittest.cc
+++ b/deps/v8/test/unittests/heap/heap-unittest.cc
@@ -10,6 +10,7 @@
#include "src/handles/handles-inl.h"
#include "src/heap/memory-chunk.h"
+#include "src/heap/safepoint.h"
#include "src/heap/spaces-inl.h"
#include "src/objects/objects-inl.h"
#include "test/unittests/test-utils.h"
@@ -151,6 +152,7 @@ TEST_F(HeapWithPointerCompressionTest, HeapLayout) {
// Check that all memory chunks belong this region.
base::AddressRegion heap_reservation(isolate_root, size_t{4} * GB);
+ SafepointScope scope(i_isolate()->heap());
OldGenerationMemoryChunkIterator iter(i_isolate()->heap());
for (;;) {
MemoryChunk* chunk = iter.next();
diff --git a/deps/v8/test/unittests/heap/index-generator-unittest.cc b/deps/v8/test/unittests/heap/index-generator-unittest.cc
new file mode 100644
index 0000000000..11627741b8
--- /dev/null
+++ b/deps/v8/test/unittests/heap/index-generator-unittest.cc
@@ -0,0 +1,50 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/index-generator.h"
+
+#include "test/unittests/test-utils.h"
+
+namespace v8 {
+namespace internal {
+
+TEST(IndexGeneratorTest, Empty) {
+ IndexGenerator gen(0);
+
+ EXPECT_EQ(base::nullopt, gen.GetNext());
+}
+
+TEST(IndexGeneratorTest, GetNext) {
+ IndexGenerator gen(11);
+
+ EXPECT_EQ(0U, gen.GetNext());
+ EXPECT_EQ(5U, gen.GetNext());
+ EXPECT_EQ(2U, gen.GetNext());
+ EXPECT_EQ(8U, gen.GetNext());
+ EXPECT_EQ(1U, gen.GetNext());
+ EXPECT_EQ(3U, gen.GetNext());
+ EXPECT_EQ(6U, gen.GetNext());
+ EXPECT_EQ(9U, gen.GetNext());
+ EXPECT_EQ(4U, gen.GetNext());
+ EXPECT_EQ(7U, gen.GetNext());
+ EXPECT_EQ(10U, gen.GetNext());
+ EXPECT_EQ(base::nullopt, gen.GetNext());
+}
+
+TEST(IndexGeneratorTest, GiveBack) {
+ IndexGenerator gen(4);
+
+ EXPECT_EQ(0U, gen.GetNext());
+ EXPECT_EQ(2U, gen.GetNext());
+ EXPECT_EQ(1U, gen.GetNext());
+ gen.GiveBack(2);
+ gen.GiveBack(0);
+ EXPECT_EQ(0U, gen.GetNext());
+ EXPECT_EQ(2U, gen.GetNext());
+ EXPECT_EQ(3U, gen.GetNext());
+ EXPECT_EQ(base::nullopt, gen.GetNext());
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/test/unittests/heap/object-start-bitmap-unittest.cc b/deps/v8/test/unittests/heap/object-start-bitmap-unittest.cc
new file mode 100644
index 0000000000..8e57d86d95
--- /dev/null
+++ b/deps/v8/test/unittests/heap/object-start-bitmap-unittest.cc
@@ -0,0 +1,174 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/object-start-bitmap.h"
+
+#include "src/base/macros.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace v8 {
+namespace internal {
+
+class ObjectStartBitmap;
+
+namespace {
+
+bool IsEmpty(const ObjectStartBitmap& bitmap) {
+ size_t count = 0;
+ bitmap.Iterate([&count](Address) { count++; });
+ return count == 0;
+}
+
+// Abstraction for objects that hides ObjectStartBitmap::kGranularity and
+// the base address as getting either of it wrong will result in failed DCHECKs.
+class TestObject {
+ public:
+ static Address kBaseOffset;
+
+ explicit TestObject(size_t number) : number_(number) {
+ const size_t max_entries = ObjectStartBitmap::MaxEntries();
+ EXPECT_GE(max_entries, number_);
+ }
+
+ Address base_ptr() const {
+ return kBaseOffset + ObjectStartBitmap::Granularity() * number_;
+ }
+
+ // Allow implicitly converting Object to Address.
+ operator Address() const { return base_ptr(); }
+
+ private:
+ const size_t number_;
+};
+
+Address TestObject::kBaseOffset = reinterpret_cast<Address>(0x4000ul);
+
+} // namespace
+
+TEST(V8ObjectStartBitmapTest, MoreThanZeroEntriesPossible) {
+ const size_t max_entries = ObjectStartBitmap::MaxEntries();
+ EXPECT_LT(0u, max_entries);
+}
+
+TEST(V8ObjectStartBitmapTest, InitialEmpty) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ EXPECT_TRUE(IsEmpty(bitmap));
+}
+
+TEST(V8ObjectStartBitmapTest, SetBitImpliesNonEmpty) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ bitmap.SetBit(TestObject(0));
+ EXPECT_FALSE(IsEmpty(bitmap));
+}
+
+TEST(V8ObjectStartBitmapTest, SetBitCheckBit) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object(7);
+ bitmap.SetBit(object);
+ EXPECT_TRUE(bitmap.CheckBit(object));
+}
+
+TEST(V8ObjectStartBitmapTest, SetBitClearbitCheckBit) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object(77);
+ bitmap.SetBit(object);
+ bitmap.ClearBit(object);
+ EXPECT_FALSE(bitmap.CheckBit(object));
+}
+
+TEST(V8ObjectStartBitmapTest, SetBitClearBitImpliesEmpty) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object(123);
+ bitmap.SetBit(object);
+ bitmap.ClearBit(object);
+ EXPECT_TRUE(IsEmpty(bitmap));
+}
+
+TEST(V8ObjectStartBitmapTest, AdjacentObjectsAtBegin) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object0(0);
+ TestObject object1(1);
+ bitmap.SetBit(object0);
+ bitmap.SetBit(object1);
+ EXPECT_FALSE(bitmap.CheckBit(TestObject(3)));
+ size_t count = 0;
+ bitmap.Iterate([&count, object0, object1](Address current) {
+ if (count == 0) {
+ EXPECT_EQ(object0.base_ptr(), current);
+ } else if (count == 1) {
+ EXPECT_EQ(object1.base_ptr(), current);
+ }
+ count++;
+ });
+ EXPECT_EQ(2u, count);
+}
+
+TEST(V8ObjectStartBitmapTest, AdjacentObjectsAtEnd) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ const size_t last_entry_index = ObjectStartBitmap::MaxEntries() - 1;
+ TestObject object0(last_entry_index - 1);
+ TestObject object1(last_entry_index);
+ bitmap.SetBit(object0);
+ bitmap.SetBit(object1);
+ EXPECT_FALSE(bitmap.CheckBit(TestObject(last_entry_index - 2)));
+ size_t count = 0;
+ bitmap.Iterate([&count, object0, object1](Address current) {
+ if (count == 0) {
+ EXPECT_EQ(object0.base_ptr(), current);
+ } else if (count == 1) {
+ EXPECT_EQ(object1.base_ptr(), current);
+ }
+ count++;
+ });
+ EXPECT_EQ(2u, count);
+}
+
+TEST(V8ObjectStartBitmapTest, FindBasePtrExact) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object(654);
+ bitmap.SetBit(object);
+ EXPECT_EQ(object.base_ptr(), bitmap.FindBasePtr(object.base_ptr()));
+}
+
+TEST(V8ObjectStartBitmapTest, FindBasePtrApproximate) {
+ static const size_t kInternalDelta = 37;
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object(654);
+ bitmap.SetBit(object);
+ EXPECT_EQ(object.base_ptr(),
+ bitmap.FindBasePtr(object.base_ptr() + kInternalDelta));
+}
+
+TEST(V8ObjectStartBitmapTest, FindBasePtrIteratingWholeBitmap) {
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object_to_find(TestObject(0));
+ Address hint_index = TestObject(ObjectStartBitmap::MaxEntries() - 1);
+ bitmap.SetBit(object_to_find);
+ EXPECT_EQ(object_to_find.base_ptr(), bitmap.FindBasePtr(hint_index));
+}
+
+TEST(V8ObjectStartBitmapTest, FindBasePtrNextCell) {
+ // This white box test makes use of the fact that cells are of type uint32_t.
+ const size_t kCellSize = sizeof(uint32_t);
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object_to_find(TestObject(kCellSize - 1));
+ Address hint = TestObject(kCellSize);
+ bitmap.SetBit(TestObject(0));
+ bitmap.SetBit(object_to_find);
+ EXPECT_EQ(object_to_find.base_ptr(), bitmap.FindBasePtr(hint));
+}
+
+TEST(V8ObjectStartBitmapTest, FindBasePtrSameCell) {
+ // This white box test makes use of the fact that cells are of type uint32_t.
+ const size_t kCellSize = sizeof(uint32_t);
+ ObjectStartBitmap bitmap(TestObject::kBaseOffset);
+ TestObject object_to_find(TestObject(kCellSize - 1));
+ bitmap.SetBit(TestObject(0));
+ bitmap.SetBit(object_to_find);
+ EXPECT_EQ(object_to_find.base_ptr(),
+ bitmap.FindBasePtr(object_to_find.base_ptr()));
+}
+
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/test/unittests/heap/safepoint-unittest.cc b/deps/v8/test/unittests/heap/safepoint-unittest.cc
index 264d3e936e..214d15277c 100644
--- a/deps/v8/test/unittests/heap/safepoint-unittest.cc
+++ b/deps/v8/test/unittests/heap/safepoint-unittest.cc
@@ -13,11 +13,17 @@
namespace v8 {
namespace internal {
+void EnsureFlagLocalHeapsEnabled() {
+ // Avoid data race in concurrent thread by only setting the flag to true if
+ // not already enabled.
+ if (!FLAG_local_heaps) FLAG_local_heaps = true;
+}
+
using SafepointTest = TestWithIsolate;
TEST_F(SafepointTest, ReachSafepointWithoutLocalHeaps) {
+ EnsureFlagLocalHeapsEnabled();
Heap* heap = i_isolate()->heap();
- FLAG_local_heaps = true;
bool run = false;
{
SafepointScope scope(heap);
@@ -47,8 +53,8 @@ class ParkedThread final : public v8::base::Thread {
};
TEST_F(SafepointTest, StopParkedThreads) {
+ EnsureFlagLocalHeapsEnabled();
Heap* heap = i_isolate()->heap();
- FLAG_local_heaps = true;
int safepoints = 0;
@@ -106,8 +112,8 @@ class RunningThread final : public v8::base::Thread {
};
TEST_F(SafepointTest, StopRunningThreads) {
+ EnsureFlagLocalHeapsEnabled();
Heap* heap = i_isolate()->heap();
- FLAG_local_heaps = true;
const int kThreads = 10;
const int kRuns = 5;
@@ -139,8 +145,8 @@ TEST_F(SafepointTest, StopRunningThreads) {
}
TEST_F(SafepointTest, SkipLocalHeapOfThisThread) {
+ EnsureFlagLocalHeapsEnabled();
Heap* heap = i_isolate()->heap();
- FLAG_local_heaps = true;
LocalHeap local_heap(heap);
{
SafepointScope scope(heap);
diff --git a/deps/v8/test/unittests/heap/unmapper-unittest.cc b/deps/v8/test/unittests/heap/unmapper-unittest.cc
index a919945d3f..bd476cd1ec 100644
--- a/deps/v8/test/unittests/heap/unmapper-unittest.cc
+++ b/deps/v8/test/unittests/heap/unmapper-unittest.cc
@@ -170,7 +170,6 @@ class TrackingPageAllocator : public ::v8::PageAllocator {
os << " page: [" << start << ", " << end << "), access: ";
switch (access) {
case PageAllocator::kNoAccess:
- case PageAllocator::kNoAccessWillJitLater:
os << "--";
break;
case PageAllocator::kRead:
diff --git a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
index cc7ca63061..7b1150b499 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
@@ -137,6 +137,7 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
// Emit load / store property operations.
builder.LoadNamedProperty(reg, name, load_slot.ToInt())
.LoadNamedPropertyNoFeedback(reg, name)
+ .LoadNamedPropertyFromSuper(reg, name, load_slot.ToInt())
.LoadKeyedProperty(reg, keyed_load_slot.ToInt())
.StoreNamedProperty(reg, name, sloppy_store_slot.ToInt(),
LanguageMode::kSloppy)
diff --git a/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc b/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc
index 0bf431eaae..ad25ab06cb 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc
@@ -142,7 +142,7 @@ TEST_F(BytecodeArrayWriterUnittest, SimpleExample) {
Handle<BytecodeArray> bytecode_array =
writer()->ToBytecodeArray(isolate(), 0, 0, factory()->empty_byte_array());
- bytecode_array->set_source_position_table(
+ bytecode_array->set_synchronized_source_position_table(
*writer()->ToSourcePositionTable(isolate()));
CHECK_EQ(bytecodes()->size(), arraysize(expected_bytes));
@@ -229,7 +229,7 @@ TEST_F(BytecodeArrayWriterUnittest, ComplexExample) {
Handle<BytecodeArray> bytecode_array =
writer()->ToBytecodeArray(isolate(), 0, 0, factory()->empty_byte_array());
- bytecode_array->set_source_position_table(
+ bytecode_array->set_synchronized_source_position_table(
*writer()->ToSourcePositionTable(isolate()));
SourcePositionTableIterator source_iterator(
bytecode_array->SourcePositionTable());
@@ -278,7 +278,7 @@ TEST_F(BytecodeArrayWriterUnittest, ElideNoneffectfulBytecodes) {
Handle<BytecodeArray> bytecode_array =
writer()->ToBytecodeArray(isolate(), 0, 0, factory()->empty_byte_array());
- bytecode_array->set_source_position_table(
+ bytecode_array->set_synchronized_source_position_table(
*writer()->ToSourcePositionTable(isolate()));
SourcePositionTableIterator source_iterator(
bytecode_array->SourcePositionTable());
@@ -346,7 +346,7 @@ TEST_F(BytecodeArrayWriterUnittest, DeadcodeElimination) {
Handle<BytecodeArray> bytecode_array =
writer()->ToBytecodeArray(isolate(), 0, 0, factory()->empty_byte_array());
- bytecode_array->set_source_position_table(
+ bytecode_array->set_synchronized_source_position_table(
*writer()->ToSourcePositionTable(isolate()));
SourcePositionTableIterator source_iterator(
bytecode_array->SourcePositionTable());
diff --git a/deps/v8/test/unittests/libplatform/default-job-unittest.cc b/deps/v8/test/unittests/libplatform/default-job-unittest.cc
index b54e589fca..bf65050ed7 100644
--- a/deps/v8/test/unittests/libplatform/default-job-unittest.cc
+++ b/deps/v8/test/unittests/libplatform/default-job-unittest.cc
@@ -36,7 +36,7 @@ TEST(DefaultJobTest, CancelJob) {
}
}
- size_t GetMaxConcurrency() const override {
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
return max_concurrency.load(std::memory_order_relaxed);
}
@@ -83,7 +83,7 @@ TEST(DefaultJobTest, JoinJobContributes) {
--max_concurrency;
}
- size_t GetMaxConcurrency() const override {
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
return max_concurrency.load(std::memory_order_relaxed);
}
@@ -105,6 +105,41 @@ TEST(DefaultJobTest, JoinJobContributes) {
EXPECT_EQ(0U, job_raw->max_concurrency);
}
+// Verify that Join() on a job that uses |worker_count| eventually converges
+// and doesn't hang.
+TEST(DefaultJobTest, WorkerCount) {
+ static constexpr size_t kMaxTask = 4;
+ DefaultPlatform platform(kMaxTask);
+
+ // This Job spawns a workers until the first worker task completes.
+ class JobTest : public JobTask {
+ public:
+ ~JobTest() override = default;
+
+ void Run(JobDelegate* delegate) override {
+ base::MutexGuard guard(&mutex);
+ if (max_concurrency > 0) --max_concurrency;
+ }
+
+ size_t GetMaxConcurrency(size_t worker_count) const override {
+ return worker_count + max_concurrency.load(std::memory_order_relaxed);
+ }
+
+ base::Mutex mutex;
+ std::atomic_size_t max_concurrency{kMaxTask};
+ };
+
+ auto job = std::make_unique<JobTest>();
+ JobTest* job_raw = job.get();
+ auto state = std::make_shared<DefaultJobState>(
+ &platform, std::move(job), TaskPriority::kUserVisible, kMaxTask);
+ state->NotifyConcurrencyIncrease();
+
+ // GetMaxConcurrency() eventually returns 0 thus, Join() should not hang.
+ state->Join();
+ EXPECT_EQ(0U, job_raw->max_concurrency);
+}
+
// Verify that calling NotifyConcurrencyIncrease() (re-)schedules tasks with the
// intended concurrency.
TEST(DefaultJobTest, JobNotifyConcurrencyIncrease) {
@@ -126,7 +161,7 @@ TEST(DefaultJobTest, JobNotifyConcurrencyIncrease) {
--max_concurrency;
}
- size_t GetMaxConcurrency() const override {
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
return max_concurrency.load(std::memory_order_relaxed);
}
@@ -177,7 +212,7 @@ TEST(DefaultJobTest, FinishBeforeJoin) {
--max_concurrency;
}
- size_t GetMaxConcurrency() const override {
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
return max_concurrency.load(std::memory_order_relaxed);
}
@@ -214,7 +249,9 @@ TEST(DefaultJobTest, LeakHandle) {
void Run(JobDelegate* delegate) override {}
- size_t GetMaxConcurrency() const override { return 0; }
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
+ return 0;
+ }
};
DefaultPlatform platform(0);
@@ -228,6 +265,35 @@ TEST(DefaultJobTest, LeakHandle) {
handle->Join();
}
+TEST(DefaultJobTest, AcquireTaskId) {
+ class JobTest : public JobTask {
+ public:
+ ~JobTest() override = default;
+
+ void Run(JobDelegate* delegate) override {}
+
+ size_t GetMaxConcurrency(size_t /* worker_count */) const override {
+ return 0;
+ }
+ };
+
+ DefaultPlatform platform(0);
+ auto job = std::make_unique<JobTest>();
+ auto state = std::make_shared<DefaultJobState>(&platform, std::move(job),
+ TaskPriority::kUserVisible, 1);
+
+ EXPECT_EQ(0U, state->AcquireTaskId());
+ EXPECT_EQ(1U, state->AcquireTaskId());
+ EXPECT_EQ(2U, state->AcquireTaskId());
+ EXPECT_EQ(3U, state->AcquireTaskId());
+ EXPECT_EQ(4U, state->AcquireTaskId());
+ state->ReleaseTaskId(1);
+ state->ReleaseTaskId(3);
+ EXPECT_EQ(1U, state->AcquireTaskId());
+ EXPECT_EQ(3U, state->AcquireTaskId());
+ EXPECT_EQ(5U, state->AcquireTaskId());
+}
+
} // namespace default_job_unittest
} // namespace platform
} // namespace v8
diff --git a/deps/v8/test/unittests/wasm/control-transfer-unittest.cc b/deps/v8/test/unittests/wasm/control-transfer-unittest.cc
index 1c22d8afd0..0d3ca9ad56 100644
--- a/deps/v8/test/unittests/wasm/control-transfer-unittest.cc
+++ b/deps/v8/test/unittests/wasm/control-transfer-unittest.cc
@@ -107,7 +107,7 @@ TEST_F(ControlTransferTest, SimpleIf) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprEnd // @4
};
CheckTransfers(code, {{2, 2, 0, 0}});
@@ -118,7 +118,7 @@ TEST_F(ControlTransferTest, SimpleIf1) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprNop, // @4
kExprEnd // @5
};
@@ -130,7 +130,7 @@ TEST_F(ControlTransferTest, SimpleIf2) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprNop, // @4
kExprNop, // @5
kExprEnd // @6
@@ -143,7 +143,7 @@ TEST_F(ControlTransferTest, SimpleIfElse) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprElse, // @4
kExprEnd // @5
};
@@ -155,7 +155,7 @@ TEST_F(ControlTransferTest, SimpleIfElse_v1) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprI32Const, // @4
0, // @5
kExprElse, // @6
@@ -171,7 +171,7 @@ TEST_F(ControlTransferTest, SimpleIfElse1) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprElse, // @4
kExprNop, // @5
kExprEnd // @6
@@ -184,7 +184,7 @@ TEST_F(ControlTransferTest, IfBr) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprBr, // @4
0, // @5
kExprEnd // @6
@@ -197,13 +197,13 @@ TEST_F(ControlTransferTest, IfBrElse) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprBr, // @4
0, // @5
kExprElse, // @6
kExprEnd // @7
};
- CheckTransfers(code, {{2, 5, 0, 0}, {4, 4, 0, 0}, {6, 2, 0, 0}});
+ CheckTransfers(code, {{2, 5, 0, 0}, {4, 4, 0, 0}});
}
TEST_F(ControlTransferTest, IfElseBr) {
@@ -211,7 +211,7 @@ TEST_F(ControlTransferTest, IfElseBr) {
kExprI32Const, // @0
0, // @1
kExprIf, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprElse, // @4
kExprBr, // @5
0, // @6
@@ -223,7 +223,7 @@ TEST_F(ControlTransferTest, IfElseBr) {
TEST_F(ControlTransferTest, BlockEmpty) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprEnd // @2
};
CheckTransfers(code, {});
@@ -232,7 +232,7 @@ TEST_F(ControlTransferTest, BlockEmpty) {
TEST_F(ControlTransferTest, Br0) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprBr, // @2
0, // @3
kExprEnd // @4
@@ -243,7 +243,7 @@ TEST_F(ControlTransferTest, Br0) {
TEST_F(ControlTransferTest, Br1) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprNop, // @2
kExprBr, // @3
0, // @4
@@ -255,7 +255,7 @@ TEST_F(ControlTransferTest, Br1) {
TEST_F(ControlTransferTest, Br_v1a) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprI32Const, // @2
0, // @3
kExprBr, // @4
@@ -268,7 +268,7 @@ TEST_F(ControlTransferTest, Br_v1a) {
TEST_F(ControlTransferTest, Br_v1b) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprI32Const, // @2
0, // @3
kExprBr, // @4
@@ -283,7 +283,7 @@ TEST_F(ControlTransferTest, Br_v1c) {
kExprI32Const, // @0
0, // @1
kExprBlock, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprBr, // @4
0, // @5
kExprEnd // @6
@@ -294,7 +294,7 @@ TEST_F(ControlTransferTest, Br_v1c) {
TEST_F(ControlTransferTest, Br_v1d) {
byte code[] = {
kExprBlock, // @0
- kLocalI32, // @1
+ kI32Code, // @1
kExprI32Const, // @2
0, // @3
kExprBr, // @4
@@ -307,7 +307,7 @@ TEST_F(ControlTransferTest, Br_v1d) {
TEST_F(ControlTransferTest, Br2) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprNop, // @2
kExprNop, // @3
kExprBr, // @4
@@ -320,7 +320,7 @@ TEST_F(ControlTransferTest, Br2) {
TEST_F(ControlTransferTest, Br0b) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprBr, // @2
0, // @3
kExprNop, // @4
@@ -332,7 +332,7 @@ TEST_F(ControlTransferTest, Br0b) {
TEST_F(ControlTransferTest, Br0c) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprBr, // @2
0, // @3
kExprNop, // @4
@@ -344,46 +344,46 @@ TEST_F(ControlTransferTest, Br0c) {
TEST_F(ControlTransferTest, SimpleLoop1) {
byte code[] = {
- kExprLoop, // @0
- kLocalVoid, // @1
- kExprBr, // @2
- 0, // @3
- kExprEnd // @4
+ kExprLoop, // @0
+ kVoidCode, // @1
+ kExprBr, // @2
+ 0, // @3
+ kExprEnd // @4
};
CheckTransfers(code, {{2, -2, 0, 0}});
}
TEST_F(ControlTransferTest, SimpleLoop2) {
byte code[] = {
- kExprLoop, // @0
- kLocalVoid, // @1
- kExprNop, // @2
- kExprBr, // @3
- 0, // @4
- kExprEnd // @5
+ kExprLoop, // @0
+ kVoidCode, // @1
+ kExprNop, // @2
+ kExprBr, // @3
+ 0, // @4
+ kExprEnd // @5
};
CheckTransfers(code, {{3, -3, 0, 0}});
}
TEST_F(ControlTransferTest, SimpleLoopExit1) {
byte code[] = {
- kExprLoop, // @0
- kLocalVoid, // @1
- kExprBr, // @2
- 1, // @3
- kExprEnd // @4
+ kExprLoop, // @0
+ kVoidCode, // @1
+ kExprBr, // @2
+ 1, // @3
+ kExprEnd // @4
};
CheckTransfers(code, {{2, 4, 0, 0}});
}
TEST_F(ControlTransferTest, SimpleLoopExit2) {
byte code[] = {
- kExprLoop, // @0
- kLocalVoid, // @1
- kExprNop, // @2
- kExprBr, // @3
- 1, // @4
- kExprEnd // @5
+ kExprLoop, // @0
+ kVoidCode, // @1
+ kExprNop, // @2
+ kExprBr, // @3
+ 1, // @4
+ kExprEnd // @5
};
CheckTransfers(code, {{3, 4, 0, 0}});
}
@@ -391,7 +391,7 @@ TEST_F(ControlTransferTest, SimpleLoopExit2) {
TEST_F(ControlTransferTest, BrTable0) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprI32Const, // @2
0, // @3
kExprBrTable, // @4
@@ -405,7 +405,7 @@ TEST_F(ControlTransferTest, BrTable0) {
TEST_F(ControlTransferTest, BrTable0_v1a) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprI32Const, // @2
0, // @3
kExprI32Const, // @4
@@ -421,7 +421,7 @@ TEST_F(ControlTransferTest, BrTable0_v1a) {
TEST_F(ControlTransferTest, BrTable0_v1b) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprI32Const, // @2
0, // @3
kExprI32Const, // @4
@@ -437,7 +437,7 @@ TEST_F(ControlTransferTest, BrTable0_v1b) {
TEST_F(ControlTransferTest, BrTable1) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprI32Const, // @2
0, // @3
kExprBrTable, // @4
@@ -452,9 +452,9 @@ TEST_F(ControlTransferTest, BrTable1) {
TEST_F(ControlTransferTest, BrTable2) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprBlock, // @2
- kLocalVoid, // @3
+ kVoidCode, // @3
kExprI32Const, // @4
0, // @5
kExprBrTable, // @6
@@ -471,11 +471,11 @@ TEST_F(ControlTransferTest, BrTable2) {
TEST_F(ControlTransferTest, BiggerSpDiffs) {
byte code[] = {
kExprBlock, // @0
- kLocalI32, // @1
+ kI32Code, // @1
kExprI32Const, // @2
0, // @3
kExprBlock, // @4
- kLocalVoid, // @5
+ kVoidCode, // @5
kExprI32Const, // @6
0, // @7
kExprI32Const, // @8
@@ -495,19 +495,19 @@ TEST_F(ControlTransferTest, BiggerSpDiffs) {
TEST_F(ControlTransferTest, NoInfoForUnreachableCode) {
byte code[] = {
kExprBlock, // @0
- kLocalVoid, // @1
+ kVoidCode, // @1
kExprBr, // @2
0, // @3
kExprBr, // @4 -- no control transfer entry!
1, // @5
kExprEnd, // @6
kExprBlock, // @7
- kLocalVoid, // @8
+ kVoidCode, // @8
kExprUnreachable, // @9
kExprI32Const, // @10
0, // @11
kExprIf, // @12 -- no control transfer entry!
- kLocalVoid, // @13
+ kVoidCode, // @13
kExprBr, // @14 -- no control transfer entry!
0, // @15
kExprElse, // @16 -- no control transfer entry!
diff --git a/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc b/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
index 1d06e91563..0237a7d2ae 100644
--- a/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
+++ b/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
@@ -31,8 +31,8 @@ namespace function_body_decoder_unittest {
#define B2(a, b) WASM_BLOCK(a, b)
#define B3(a, b, c) WASM_BLOCK(a, b, c)
-#define WASM_IF_OP kExprIf, kLocalVoid
-#define WASM_LOOP_OP kExprLoop, kLocalVoid
+#define WASM_IF_OP kExprIf, kVoidCode
+#define WASM_LOOP_OP kExprLoop, kVoidCode
#define EXPECT_OK(result) \
do { \
@@ -111,7 +111,7 @@ class TestModuleBuilder {
byte AddTable(ValueType type, uint32_t initial_size, bool has_maximum_size,
uint32_t maximum_size) {
- CHECK(type == kWasmExternRef || type == kWasmFuncRef);
+ CHECK(WasmTable::IsValidTableType(type, &mod));
mod.tables.emplace_back();
WasmTable& table = mod.tables.back();
table.type = type;
@@ -510,17 +510,17 @@ TEST_F(FunctionBodyDecoderTest, Binops_off_end) {
}
TEST_F(FunctionBodyDecoderTest, BinopsAcrossBlock1) {
- ExpectFailure(sigs.i_i(), {WASM_ZERO, kExprBlock, kLocalI32, WASM_ZERO,
+ ExpectFailure(sigs.i_i(), {WASM_ZERO, kExprBlock, kI32Code, WASM_ZERO,
kExprI32Add, kExprEnd});
}
TEST_F(FunctionBodyDecoderTest, BinopsAcrossBlock2) {
- ExpectFailure(sigs.i_i(), {WASM_ZERO, WASM_ZERO, kExprBlock, kLocalI32,
+ ExpectFailure(sigs.i_i(), {WASM_ZERO, WASM_ZERO, kExprBlock, kI32Code,
kExprI32Add, kExprEnd});
}
TEST_F(FunctionBodyDecoderTest, BinopsAcrossBlock3) {
- ExpectFailure(sigs.i_i(), {WASM_ZERO, WASM_ZERO, kExprIf, kLocalI32,
+ ExpectFailure(sigs.i_i(), {WASM_ZERO, WASM_ZERO, kExprIf, kI32Code,
kExprI32Add, kExprElse, kExprI32Add, kExprEnd});
}
@@ -575,13 +575,13 @@ TEST_F(FunctionBodyDecoderTest, BlockN) {
for (size_t i = 0; i <= kMaxSize; i++) {
memset(buffer, kExprNop, sizeof(buffer));
buffer[0] = kExprBlock;
- buffer[1] = kLocalVoid;
+ buffer[1] = kVoidCode;
buffer[i + 2] = kExprEnd;
ExpectValidates(sigs.v_i(), VectorOf(buffer, i + 3), kAppendEnd);
}
}
-#define WASM_EMPTY_BLOCK kExprBlock, kLocalVoid, kExprEnd
+#define WASM_EMPTY_BLOCK kExprBlock, kVoidCode, kExprEnd
TEST_F(FunctionBodyDecoderTest, Block0) {
ExpectValidates(sigs.v_v(), {WASM_EMPTY_BLOCK});
@@ -837,8 +837,7 @@ TEST_F(FunctionBodyDecoderTest, IfElseUnreachable2) {
}
TEST_F(FunctionBodyDecoderTest, OneArmedIfWithArity) {
- static const byte code[] = {WASM_ZERO, kExprIf, kLocalI32, WASM_ONE,
- kExprEnd};
+ static const byte code[] = {WASM_ZERO, kExprIf, kI32Code, WASM_ONE, kExprEnd};
ExpectFailure(sigs.i_v(), code, kAppendEnd,
"start-arity and end-arity of one-armed if must match");
}
@@ -1763,7 +1762,7 @@ TEST_F(FunctionBodyDecoderTest, IndirectCallsOutOfBounds) {
ExpectFailure(sig, {WASM_CALL_INDIRECT(2, WASM_I32V_1(27), WASM_ZERO)});
}
-TEST_F(FunctionBodyDecoderTest, IndirectCallsWithMismatchedSigs3) {
+TEST_F(FunctionBodyDecoderTest, IndirectCallsWithMismatchedSigs1) {
const FunctionSig* sig = sigs.i_i();
builder.InitializeTable(wasm::kWasmStmt);
@@ -1784,6 +1783,34 @@ TEST_F(FunctionBodyDecoderTest, IndirectCallsWithMismatchedSigs3) {
ExpectFailure(sig, {WASM_CALL_INDIRECT(sig1, WASM_F32(17.6), WASM_ZERO)});
}
+TEST_F(FunctionBodyDecoderTest, IndirectCallsWithMismatchedSigs2) {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+ byte table_type_index = builder.AddSignature(sigs.i_i());
+ byte table_index =
+ builder.InitializeTable(ValueType::Ref(table_type_index, kNullable));
+
+ ExpectValidates(sigs.i_v(),
+ {WASM_CALL_INDIRECT_TABLE(table_index, table_type_index,
+ WASM_I32V_1(42), WASM_ZERO)});
+
+ byte wrong_type_index = builder.AddSignature(sigs.i_ii());
+ ExpectFailure(sigs.i_v(),
+ {WASM_CALL_INDIRECT_TABLE(table_index, wrong_type_index,
+ WASM_I32V_1(42), WASM_ZERO)},
+ kAppendEnd,
+ "call_indirect: Immediate signature #1 is not a subtype of "
+ "immediate table #0");
+
+ byte non_function_table_index = builder.InitializeTable(kWasmExternRef);
+ ExpectFailure(
+ sigs.i_v(),
+ {WASM_CALL_INDIRECT_TABLE(non_function_table_index, table_type_index,
+ WASM_I32V_1(42), WASM_ZERO)},
+ kAppendEnd,
+ "call_indirect: immediate table #1 is not of a function type");
+}
+
TEST_F(FunctionBodyDecoderTest, IndirectCallsWithoutTableCrash) {
const FunctionSig* sig = sigs.i_i();
@@ -1814,14 +1841,14 @@ TEST_F(FunctionBodyDecoderTest, IncompleteStore) {
ExpectFailure(sig, ArrayVector(code), kOmitEnd);
}
-TEST_F(FunctionBodyDecoderTest, IncompleteS8x16Shuffle) {
+TEST_F(FunctionBodyDecoderTest, IncompleteI8x16Shuffle) {
WASM_FEATURE_SCOPE(simd);
const FunctionSig* sig = sigs.i_i();
builder.InitializeMemory();
builder.InitializeTable(wasm::kWasmStmt);
static byte code[] = {kSimdPrefix,
- static_cast<byte>(kExprS8x16Shuffle & 0xff)};
+ static_cast<byte>(kExprI8x16Shuffle & 0xff)};
ExpectFailure(sig, ArrayVector(code), kOmitEnd);
}
@@ -1962,15 +1989,24 @@ TEST_F(FunctionBodyDecoderTest, AllSetGlobalCombinations) {
TEST_F(FunctionBodyDecoderTest, TableSet) {
WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+
+ byte tab_type = builder.AddSignature(sigs.i_i());
byte tab_ref1 = builder.AddTable(kWasmExternRef, 10, true, 20);
byte tab_func1 = builder.AddTable(kWasmFuncRef, 20, true, 30);
byte tab_func2 = builder.AddTable(kWasmFuncRef, 10, false, 20);
byte tab_ref2 = builder.AddTable(kWasmExternRef, 10, false, 20);
- ValueType sig_types[]{kWasmExternRef, kWasmFuncRef, kWasmI32};
- FunctionSig sig(0, 3, sig_types);
+ byte tab_typed_func =
+ builder.AddTable(ValueType::Ref(tab_type, kNullable), 10, false, 20);
+
+ ValueType sig_types[]{kWasmExternRef, kWasmFuncRef, kWasmI32,
+ ValueType::Ref(tab_type, kNonNullable)};
+ FunctionSig sig(0, 4, sig_types);
byte local_ref = 0;
byte local_func = 1;
byte local_int = 2;
+ byte local_typed_func = 3;
+
ExpectValidates(&sig, {WASM_TABLE_SET(tab_ref1, WASM_I32V(6),
WASM_GET_LOCAL(local_ref))});
ExpectValidates(&sig, {WASM_TABLE_SET(tab_func1, WASM_I32V(5),
@@ -1979,6 +2015,10 @@ TEST_F(FunctionBodyDecoderTest, TableSet) {
WASM_GET_LOCAL(local_func))});
ExpectValidates(&sig, {WASM_TABLE_SET(tab_ref2, WASM_I32V(8),
WASM_GET_LOCAL(local_ref))});
+ ExpectValidates(&sig, {WASM_TABLE_SET(tab_typed_func, WASM_I32V(8),
+ WASM_GET_LOCAL(local_typed_func))});
+ ExpectValidates(&sig, {WASM_TABLE_SET(tab_func1, WASM_I32V(8),
+ WASM_GET_LOCAL(local_typed_func))});
// Only values of the correct type can be set to a table.
ExpectFailure(&sig, {WASM_TABLE_SET(tab_ref1, WASM_I32V(4),
@@ -1993,6 +2033,8 @@ TEST_F(FunctionBodyDecoderTest, TableSet) {
WASM_GET_LOCAL(local_int))});
ExpectFailure(&sig, {WASM_TABLE_SET(tab_func1, WASM_I32V(3),
WASM_GET_LOCAL(local_int))});
+ ExpectFailure(&sig, {WASM_TABLE_SET(tab_typed_func, WASM_I32V(3),
+ WASM_GET_LOCAL(local_func))});
// Out-of-bounds table index should fail.
byte oob_tab = 37;
@@ -2004,15 +2046,24 @@ TEST_F(FunctionBodyDecoderTest, TableSet) {
TEST_F(FunctionBodyDecoderTest, TableGet) {
WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+
+ byte tab_type = builder.AddSignature(sigs.i_i());
byte tab_ref1 = builder.AddTable(kWasmExternRef, 10, true, 20);
byte tab_func1 = builder.AddTable(kWasmFuncRef, 20, true, 30);
byte tab_func2 = builder.AddTable(kWasmFuncRef, 10, false, 20);
byte tab_ref2 = builder.AddTable(kWasmExternRef, 10, false, 20);
- ValueType sig_types[]{kWasmExternRef, kWasmFuncRef, kWasmI32};
- FunctionSig sig(0, 3, sig_types);
+ byte tab_typed_func =
+ builder.AddTable(ValueType::Ref(tab_type, kNullable), 10, false, 20);
+
+ ValueType sig_types[]{kWasmExternRef, kWasmFuncRef, kWasmI32,
+ ValueType::Ref(tab_type, kNullable)};
+ FunctionSig sig(0, 4, sig_types);
byte local_ref = 0;
byte local_func = 1;
byte local_int = 2;
+ byte local_typed_func = 3;
+
ExpectValidates(
&sig,
{WASM_SET_LOCAL(local_ref, WASM_TABLE_GET(tab_ref1, WASM_I32V(6)))});
@@ -2028,6 +2079,12 @@ TEST_F(FunctionBodyDecoderTest, TableGet) {
ExpectValidates(
&sig, {WASM_SET_LOCAL(local_ref, WASM_SEQ(WASM_I32V(6), kExprTableGet,
U32V_2(tab_ref1)))});
+ ExpectValidates(
+ &sig, {WASM_SET_LOCAL(local_func,
+ WASM_TABLE_GET(tab_typed_func, WASM_I32V(7)))});
+ ExpectValidates(
+ &sig, {WASM_SET_LOCAL(local_typed_func,
+ WASM_TABLE_GET(tab_typed_func, WASM_I32V(7)))});
// We cannot store references as any other type.
ExpectFailure(&sig, {WASM_SET_LOCAL(local_func,
@@ -2043,6 +2100,10 @@ TEST_F(FunctionBodyDecoderTest, TableGet) {
WASM_TABLE_GET(tab_ref1, WASM_I32V(9)))});
ExpectFailure(&sig, {WASM_SET_LOCAL(
local_int, WASM_TABLE_GET(tab_func1, WASM_I32V(3)))});
+ ExpectFailure(&sig,
+ {WASM_SET_LOCAL(local_typed_func,
+ WASM_TABLE_GET(tab_func1, WASM_I32V(3)))});
+
// Out-of-bounds table index should fail.
byte oob_tab = 37;
ExpectFailure(
@@ -2266,7 +2327,7 @@ TEST_F(FunctionBodyDecoderTest, BreakNesting_6_levels) {
if (code[pos] != kExprBlock) continue;
if (m & 1) {
code[pos] = kExprLoop;
- code[pos + 1] = kLocalVoid;
+ code[pos + 1] = kVoidCode;
}
m >>= 1;
}
@@ -2656,11 +2717,11 @@ TEST_F(FunctionBodyDecoderTest, SelectWithType) {
ExpectValidates(sigs.l_l(),
{WASM_SELECT_L(WASM_I64V_1(0), WASM_I64V_1(0), WASM_ZERO)});
ExpectValidates(sigs.e_e(),
- {WASM_SELECT_R(WASM_REF_NULL(kLocalExternRef),
- WASM_REF_NULL(kLocalExternRef), WASM_ZERO)});
+ {WASM_SELECT_R(WASM_REF_NULL(kExternRefCode),
+ WASM_REF_NULL(kExternRefCode), WASM_ZERO)});
ExpectValidates(sigs.c_c(),
- {WASM_SELECT_A(WASM_REF_NULL(kLocalFuncRef),
- WASM_REF_NULL(kLocalFuncRef), WASM_ZERO)});
+ {WASM_SELECT_A(WASM_REF_NULL(kFuncRefCode),
+ WASM_REF_NULL(kFuncRefCode), WASM_ZERO)});
}
TEST_F(FunctionBodyDecoderTest, SelectWithType_fail) {
@@ -2702,7 +2763,7 @@ TEST_F(FunctionBodyDecoderTest, ThrowUnreachable) {
{WASM_GET_LOCAL(0), kExprThrow, ex2, WASM_F32(0.0)});
}
-#define WASM_TRY_OP kExprTry, kLocalVoid
+#define WASM_TRY_OP kExprTry, kVoidCode
#define WASM_BR_ON_EXN(depth, index) \
kExprBrOnExn, static_cast<byte>(depth), static_cast<byte>(index)
@@ -3202,14 +3263,14 @@ TEST_F(FunctionBodyDecoderTest, TableGrow) {
ExpectFailure(
sigs.i_c(),
- {WASM_TABLE_GROW(tab_func, WASM_REF_NULL(kLocalFuncRef), WASM_ONE)});
+ {WASM_TABLE_GROW(tab_func, WASM_REF_NULL(kFuncRefCode), WASM_ONE)});
WASM_FEATURE_SCOPE(reftypes);
ExpectValidates(
sigs.i_c(),
- {WASM_TABLE_GROW(tab_func, WASM_REF_NULL(kLocalFuncRef), WASM_ONE)});
+ {WASM_TABLE_GROW(tab_func, WASM_REF_NULL(kFuncRefCode), WASM_ONE)});
ExpectValidates(
sigs.i_e(),
- {WASM_TABLE_GROW(tab_ref, WASM_REF_NULL(kLocalExternRef), WASM_ONE)});
+ {WASM_TABLE_GROW(tab_ref, WASM_REF_NULL(kExternRefCode), WASM_ONE)});
// FuncRef table cannot be initialized with an ExternRef value.
ExpectFailure(sigs.i_e(),
{WASM_TABLE_GROW(tab_func, WASM_GET_LOCAL(0), WASM_ONE)});
@@ -3219,7 +3280,7 @@ TEST_F(FunctionBodyDecoderTest, TableGrow) {
// Check that the table index gets verified.
ExpectFailure(
sigs.i_e(),
- {WASM_TABLE_GROW(tab_ref + 2, WASM_REF_NULL(kLocalExternRef), WASM_ONE)});
+ {WASM_TABLE_GROW(tab_ref + 2, WASM_REF_NULL(kExternRefCode), WASM_ONE)});
}
TEST_F(FunctionBodyDecoderTest, TableSize) {
@@ -3237,14 +3298,14 @@ TEST_F(FunctionBodyDecoderTest, TableFill) {
ExpectFailure(sigs.v_c(),
{WASM_TABLE_FILL(tab_func, WASM_ONE,
- WASM_REF_NULL(kLocalFuncRef), WASM_ONE)});
+ WASM_REF_NULL(kFuncRefCode), WASM_ONE)});
WASM_FEATURE_SCOPE(reftypes);
ExpectValidates(sigs.v_c(),
{WASM_TABLE_FILL(tab_func, WASM_ONE,
- WASM_REF_NULL(kLocalFuncRef), WASM_ONE)});
+ WASM_REF_NULL(kFuncRefCode), WASM_ONE)});
ExpectValidates(sigs.v_e(),
{WASM_TABLE_FILL(tab_ref, WASM_ONE,
- WASM_REF_NULL(kLocalExternRef), WASM_ONE)});
+ WASM_REF_NULL(kExternRefCode), WASM_ONE)});
// FuncRef table cannot be initialized with an ExternRef value.
ExpectFailure(sigs.v_e(), {WASM_TABLE_FILL(tab_func, WASM_ONE,
WASM_GET_LOCAL(0), WASM_ONE)});
@@ -3254,18 +3315,17 @@ TEST_F(FunctionBodyDecoderTest, TableFill) {
// Check that the table index gets verified.
ExpectFailure(sigs.v_e(),
{WASM_TABLE_FILL(tab_ref + 2, WASM_ONE,
- WASM_REF_NULL(kLocalExternRef), WASM_ONE)});
+ WASM_REF_NULL(kExternRefCode), WASM_ONE)});
}
TEST_F(FunctionBodyDecoderTest, TableOpsWithoutTable) {
{
WASM_FEATURE_SCOPE(reftypes);
- ExpectFailure(
- sigs.i_v(),
- {WASM_TABLE_GROW(0, WASM_REF_NULL(kLocalExternRef), WASM_ONE)});
+ ExpectFailure(sigs.i_v(), {WASM_TABLE_GROW(0, WASM_REF_NULL(kExternRefCode),
+ WASM_ONE)});
ExpectFailure(sigs.i_v(), {WASM_TABLE_SIZE(0)});
ExpectFailure(sigs.i_e(),
- {WASM_TABLE_FILL(0, WASM_ONE, WASM_REF_NULL(kLocalExternRef),
+ {WASM_TABLE_FILL(0, WASM_ONE, WASM_REF_NULL(kExternRefCode),
WASM_ONE)});
}
{
@@ -3442,7 +3502,8 @@ TEST_F(FunctionBodyDecoderTest, NonDefaultableLocal) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(reftypes);
AddLocals(ValueType::Ref(HeapType::kExtern, kNonNullable), 1);
- ExpectFailure(sigs.v_v(), {});
+ ExpectFailure(sigs.v_v(), {}, kAppendEnd,
+ "Cannot define function-level local of non-defaultable type");
}
TEST_F(FunctionBodyDecoderTest, RefEq) {
@@ -3570,7 +3631,7 @@ TEST_F(FunctionBodyDecoderTest, RefIsNull) {
WASM_FEATURE_SCOPE(gc);
ExpectValidates(sigs.i_i(),
- {WASM_REF_IS_NULL(WASM_REF_NULL(kLocalExternRef))});
+ {WASM_REF_IS_NULL(WASM_REF_NULL(kExternRefCode))});
ExpectFailure(
sigs.i_i(), {WASM_REF_IS_NULL(WASM_GET_LOCAL(0))}, kAppendEnd,
"invalid argument type to ref.is_null. Expected reference type, got i32");
@@ -3780,7 +3841,7 @@ TEST_F(FunctionBodyDecoderTest, GCArray) {
/** array.new_with_rtt **/
ExpectValidates(&sig_r_v,
{WASM_ARRAY_NEW_WITH_RTT(
- array_type_index, WASM_REF_NULL(kLocalFuncRef),
+ array_type_index, WASM_REF_NULL(kFuncRefCode),
WASM_I32V(10), WASM_RTT_CANON(array_type_index))});
// Too few arguments.
ExpectFailure(&sig_r_v,
@@ -3792,7 +3853,7 @@ TEST_F(FunctionBodyDecoderTest, GCArray) {
// Mistyped initializer.
ExpectFailure(&sig_r_v,
{WASM_ARRAY_NEW_WITH_RTT(
- array_type_index, WASM_REF_NULL(kLocalExternRef),
+ array_type_index, WASM_REF_NULL(kExternRefCode),
WASM_I32V(10), WASM_RTT_CANON(array_type_index))},
kAppendEnd,
"array.new_with_rtt[0] expected type funcref, found ref.null "
@@ -3800,14 +3861,14 @@ TEST_F(FunctionBodyDecoderTest, GCArray) {
// Mistyped length.
ExpectFailure(
&sig_r_v,
- {WASM_ARRAY_NEW_WITH_RTT(array_type_index, WASM_REF_NULL(kLocalFuncRef),
+ {WASM_ARRAY_NEW_WITH_RTT(array_type_index, WASM_REF_NULL(kFuncRefCode),
WASM_I64V(5), WASM_RTT_CANON(array_type_index))},
kAppendEnd,
"array.new_with_rtt[1] expected type i32, found i64.const of type i64");
// Mistyped rtt.
ExpectFailure(
&sig_r_v,
- {WASM_ARRAY_NEW_WITH_RTT(array_type_index, WASM_REF_NULL(kLocalFuncRef),
+ {WASM_ARRAY_NEW_WITH_RTT(array_type_index, WASM_REF_NULL(kFuncRefCode),
WASM_I32V(5),
WASM_RTT_CANON(struct_type_index))},
kAppendEnd,
@@ -3815,7 +3876,7 @@ TEST_F(FunctionBodyDecoderTest, GCArray) {
// Wrong type index.
ExpectFailure(
sigs.v_v(),
- {WASM_ARRAY_NEW_WITH_RTT(struct_type_index, WASM_REF_NULL(kLocalFuncRef),
+ {WASM_ARRAY_NEW_WITH_RTT(struct_type_index, WASM_REF_NULL(kFuncRefCode),
WASM_I32V(10), WASM_RTT_CANON(array_type_index)),
kExprDrop},
kAppendEnd, "invalid array index: 1");
@@ -3854,9 +3915,9 @@ TEST_F(FunctionBodyDecoderTest, GCArray) {
"array.get_u is only valid for packed arrays. Use array.get instead.");
/** array.set **/
- ExpectValidates(
- &sig_v_r, {WASM_ARRAY_SET(array_type_index, WASM_GET_LOCAL(0),
- WASM_I32V(42), WASM_REF_NULL(kLocalFuncRef))});
+ ExpectValidates(&sig_v_r,
+ {WASM_ARRAY_SET(array_type_index, WASM_GET_LOCAL(0),
+ WASM_I32V(42), WASM_REF_NULL(kFuncRefCode))});
// With non-nullable array type.
ExpectValidates(
&sig_v_cr,
@@ -4031,13 +4092,13 @@ TEST_F(FunctionBodyDecoderTest, RttSub) {
// Can build an rtt.sub with self type for a generic heap type.
ValueType type = ValueType::Rtt(HeapType::kFunc, 2);
FunctionSig sig(1, 0, &type);
- ExpectValidates(
- &sig, {WASM_RTT_SUB(kLocalFuncRef, WASM_RTT_CANON(kLocalFuncRef))});
+ ExpectValidates(&sig,
+ {WASM_RTT_SUB(kFuncRefCode, WASM_RTT_CANON(kFuncRefCode))});
}
// Trivial type error.
ExpectFailure(sigs.v_v(),
- {WASM_RTT_SUB(kLocalFuncRef, WASM_I32V(42)), kExprDrop},
+ {WASM_RTT_SUB(kFuncRefCode, WASM_I32V(42)), kExprDrop},
kAppendEnd, "rtt.sub requires a supertype rtt on stack");
{
@@ -4048,12 +4109,12 @@ TEST_F(FunctionBodyDecoderTest, RttSub) {
WASM_RTT_CANON(array_type_index))});
// Can build an rtt.sub for an array from eqref.
ExpectValidates(
- &sig, {WASM_RTT_SUB(array_type_index, WASM_RTT_CANON(kLocalEqRef))});
+ &sig, {WASM_RTT_SUB(array_type_index, WASM_RTT_CANON(kEqRefCode))});
// Fails when argument to rtt.sub is not a supertype.
- ExpectFailure(sigs.v_v(),
- {WASM_RTT_SUB(kLocalEqRef, WASM_RTT_CANON(array_type_index)),
- kExprDrop},
- kAppendEnd, "rtt.sub requires a supertype rtt on stack");
+ ExpectFailure(
+ sigs.v_v(),
+ {WASM_RTT_SUB(kEqRefCode, WASM_RTT_CANON(array_type_index)), kExprDrop},
+ kAppendEnd, "rtt.sub requires a supertype rtt on stack");
}
{
@@ -4065,7 +4126,7 @@ TEST_F(FunctionBodyDecoderTest, RttSub) {
WASM_RTT_CANON(super_struct_type_index))});
// Can build an rtt.sub for a struct from eqref.
ExpectValidates(&sig, {WASM_RTT_SUB(super_struct_type_index,
- WASM_RTT_CANON(kLocalEqRef))});
+ WASM_RTT_CANON(kEqRefCode))});
// Fails when argument to rtt.sub is not a supertype.
ExpectFailure(sigs.v_v(),
{WASM_RTT_SUB(super_struct_type_index,
@@ -4161,14 +4222,14 @@ TEST_F(FunctionBodyDecoderTest, RefTestCast) {
// Trivial type error.
ExpectFailure(sigs.v_v(),
- {WASM_REF_TEST(kLocalEqRef, kLocalI31Ref, WASM_I32V(1),
- WASM_RTT_CANON(kLocalI31Ref)),
+ {WASM_REF_TEST(kEqRefCode, kI31RefCode, WASM_I32V(1),
+ WASM_RTT_CANON(kI31RefCode)),
kExprDrop},
kAppendEnd,
"ref.test[0] expected type eqref, found i32.const of type i32");
ExpectFailure(sigs.v_v(),
- {WASM_REF_CAST(kLocalEqRef, kLocalI31Ref, WASM_I32V(1),
- WASM_RTT_CANON(kLocalI31Ref)),
+ {WASM_REF_CAST(kEqRefCode, kI31RefCode, WASM_I32V(1),
+ WASM_RTT_CANON(kI31RefCode)),
kExprDrop},
kAppendEnd,
"ref.cast[0] expected type eqref, found i32.const of type i32");
@@ -4179,14 +4240,14 @@ TEST_F(FunctionBodyDecoderTest, RefTestCast) {
FunctionSig sig(0, 1, &arg_type);
ExpectFailure(
&sig,
- {WASM_REF_TEST(kLocalEqRef, static_cast<byte>(array_heap),
- WASM_GET_LOCAL(0), WASM_RTT_CANON(kLocalI31Ref)),
+ {WASM_REF_TEST(kEqRefCode, static_cast<byte>(array_heap),
+ WASM_GET_LOCAL(0), WASM_RTT_CANON(kI31RefCode)),
kExprDrop},
kAppendEnd, "ref.test: expected rtt for type 0 but got (rtt 1 i31)");
ExpectFailure(
&sig,
- {WASM_REF_CAST(kLocalEqRef, static_cast<byte>(array_heap),
- WASM_GET_LOCAL(0), WASM_RTT_CANON(kLocalI31Ref)),
+ {WASM_REF_CAST(kEqRefCode, static_cast<byte>(array_heap),
+ WASM_GET_LOCAL(0), WASM_RTT_CANON(kI31RefCode)),
kExprDrop},
kAppendEnd, "ref.cast: expected rtt for type 0 but got (rtt 1 i31)");
}
@@ -4318,10 +4379,10 @@ TEST_F(WasmOpcodeLengthTest, Statements) {
ExpectLength(2, kExprBrIf);
ExpectLength(2, kExprThrow);
ExpectLength(3, kExprBrOnExn);
- ExpectLength(2, kExprBlock, kLocalI32);
- ExpectLength(2, kExprLoop, kLocalI32);
- ExpectLength(2, kExprIf, kLocalI32);
- ExpectLength(2, kExprTry, kLocalI32);
+ ExpectLength(2, kExprBlock, kI32Code);
+ ExpectLength(2, kExprLoop, kI32Code);
+ ExpectLength(2, kExprIf, kI32Code);
+ ExpectLength(2, kExprTry, kI32Code);
}
TEST_F(WasmOpcodeLengthTest, MiscExpressions) {
@@ -4437,14 +4498,14 @@ TEST_F(WasmOpcodeLengthTest, SimdExpressions) {
#define TEST_SIMD(name, opcode, sig) ExpectLengthPrefixed(1, kExpr##name);
FOREACH_SIMD_1_OPERAND_OPCODE(TEST_SIMD)
#undef TEST_SIMD
- ExpectLengthPrefixed(16, kExprS8x16Shuffle);
+ ExpectLengthPrefixed(16, kExprI8x16Shuffle);
// test for bad simd opcode, 0xFF is encoded in two bytes.
ExpectLength(3, kSimdPrefix, 0xFF, 0x1);
}
TEST_F(WasmOpcodeLengthTest, IllegalRefIndices) {
- ExpectFailure(kExprBlock, kLocalOptRef, U32V_3(kV8MaxWasmTypes + 1));
- ExpectFailure(kExprBlock, kLocalOptRef, U32V_4(0x01000000));
+ ExpectFailure(kExprBlock, kOptRefCode, U32V_3(kV8MaxWasmTypes + 1));
+ ExpectFailure(kExprBlock, kOptRefCode, U32V_4(0x01000000));
}
using TypesOfLocals = ZoneVector<ValueType>;
@@ -4534,8 +4595,8 @@ TEST_F(LocalDeclDecoderTest, MixedLocals) {
for (byte b = 0; b < 3; b++) {
for (byte c = 0; c < 3; c++) {
for (byte d = 0; d < 3; d++) {
- const byte data[] = {4, a, kLocalI32, b, kLocalI64,
- c, kLocalF32, d, kLocalF64};
+ const byte data[] = {4, a, kI32Code, b, kI64Code,
+ c, kF32Code, d, kF64Code};
BodyLocalDecls decls(zone());
bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
EXPECT_TRUE(result);
@@ -4650,7 +4711,7 @@ TEST_F(BytecodeIteratorTest, ForeachOffset) {
}
TEST_F(BytecodeIteratorTest, WithLocalDecls) {
- byte code[] = {1, 1, kLocalI32, WASM_I32V_1(9), WASM_I32V_1(11)};
+ byte code[] = {1, 1, kI32Code, WASM_I32V_1(9), WASM_I32V_1(11)};
BodyLocalDecls decls(zone());
BytecodeIterator iter(code, code + sizeof(code), &decls);
diff --git a/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc b/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc
index 97e7dee27e..c1c98830bc 100644
--- a/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc
+++ b/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc
@@ -38,7 +38,7 @@ TEST_F(WasmLoopAssignmentAnalyzerTest, Empty0) {
}
TEST_F(WasmLoopAssignmentAnalyzerTest, Empty1) {
- byte code[] = {kExprLoop, kLocalVoid, 0};
+ byte code[] = {kExprLoop, kVoidCode, 0};
for (int i = 0; i < 5; i++) {
BitVector* assigned = Analyze(code, code + arraysize(code));
for (int j = 0; j < assigned->length(); j++) {
@@ -176,9 +176,9 @@ TEST_F(WasmLoopAssignmentAnalyzerTest, Loop2) {
}
TEST_F(WasmLoopAssignmentAnalyzerTest, Malformed) {
- byte code[] = {kExprLoop, kLocalVoid, kExprF32Neg, kExprBrTable, 0x0E, 'h',
- 'e', 'l', 'l', 'o', ',', ' ',
- 'w', 'o', 'r', 'l', 'd', '!'};
+ byte code[] = {kExprLoop, kVoidCode, kExprF32Neg, kExprBrTable, 0x0E, 'h',
+ 'e', 'l', 'l', 'o', ',', ' ',
+ 'w', 'o', 'r', 'l', 'd', '!'};
BitVector* assigned = Analyze(code, code + arraysize(code));
CHECK_NULL(assigned);
}
diff --git a/deps/v8/test/unittests/wasm/module-decoder-memory64-unittest.cc b/deps/v8/test/unittests/wasm/module-decoder-memory64-unittest.cc
new file mode 100644
index 0000000000..edd12b022a
--- /dev/null
+++ b/deps/v8/test/unittests/wasm/module-decoder-memory64-unittest.cc
@@ -0,0 +1,80 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/objects/objects-inl.h"
+#include "src/wasm/module-decoder.h"
+#include "src/wasm/wasm-features.h"
+#include "src/wasm/wasm-limits.h"
+#include "test/common/wasm/wasm-macro-gen.h"
+#include "test/unittests/test-utils.h"
+
+namespace v8 {
+namespace internal {
+namespace wasm {
+namespace module_decoder_unittest {
+
+#define EXPECT_OK(result) \
+ do { \
+ if (!result.ok()) { \
+ GTEST_NONFATAL_FAILURE_(result.error().message().c_str()); \
+ return; \
+ } \
+ } while (false)
+
+class Memory64DecodingTest : public TestWithIsolateAndZone {
+ public:
+ ModuleResult DecodeModule(std::initializer_list<uint8_t> module_body_bytes) {
+ // Add the wasm magic and version number automatically.
+ std::vector<uint8_t> module_bytes{WASM_MODULE_HEADER};
+ module_bytes.insert(module_bytes.end(), module_body_bytes);
+ static constexpr WasmFeatures kEnabledFeatures{
+ WasmFeature::kFeature_memory64};
+ return DecodeWasmModule(
+ kEnabledFeatures, module_bytes.data(),
+ module_bytes.data() + module_bytes.size(), false, kWasmOrigin,
+ isolate()->counters(), isolate()->metrics_recorder(),
+ v8::metrics::Recorder::ContextId::Empty(), DecodingMethod::kSync,
+ isolate()->wasm_engine()->allocator());
+ }
+};
+
+TEST_F(Memory64DecodingTest, MemoryLimitLEB64) {
+ // 2 bytes LEB (32-bit range), no maximum.
+ ModuleResult result = DecodeModule(
+ {SECTION(Memory, ENTRY_COUNT(1), kMemory64NoMaximum, U32V_2(5))});
+ EXPECT_OK(result);
+ EXPECT_EQ(5u, result.value()->initial_pages);
+ EXPECT_EQ(false, result.value()->has_maximum_pages);
+
+ // 2 bytes LEB (32-bit range), with maximum.
+ result = DecodeModule({SECTION(Memory, ENTRY_COUNT(1), kMemory64WithMaximum,
+ U32V_2(7), U32V_2(47))});
+ EXPECT_OK(result);
+ EXPECT_EQ(7u, result.value()->initial_pages);
+ EXPECT_EQ(true, result.value()->has_maximum_pages);
+ EXPECT_EQ(47u, result.value()->maximum_pages);
+
+ // 10 bytes LEB, 32-bit range, no maximum.
+ result = DecodeModule(
+ {SECTION(Memory, ENTRY_COUNT(1), kMemory64NoMaximum, U64V_10(2))});
+ EXPECT_OK(result);
+ EXPECT_EQ(2u, result.value()->initial_pages);
+ EXPECT_EQ(false, result.value()->has_maximum_pages);
+
+ // 10 bytes LEB, 32-bit range, with maximum.
+ result = DecodeModule({SECTION(Memory, ENTRY_COUNT(1), kMemory64WithMaximum,
+ U64V_10(2), U64V_10(6))});
+ EXPECT_OK(result);
+ EXPECT_EQ(2u, result.value()->initial_pages);
+ EXPECT_EQ(true, result.value()->has_maximum_pages);
+ EXPECT_EQ(6u, result.value()->maximum_pages);
+
+ // TODO(clemensb): Test numbers outside the 32-bit range once that's
+ // supported.
+}
+
+} // namespace module_decoder_unittest
+} // namespace wasm
+} // namespace internal
+} // namespace v8
diff --git a/deps/v8/test/unittests/wasm/module-decoder-unittest.cc b/deps/v8/test/unittests/wasm/module-decoder-unittest.cc
index 6dc48505f7..49528b8aea 100644
--- a/deps/v8/test/unittests/wasm/module-decoder-unittest.cc
+++ b/deps/v8/test/unittests/wasm/module-decoder-unittest.cc
@@ -29,44 +29,29 @@ namespace module_decoder_unittest {
#define WASM_INIT_EXPR_F32(val) WASM_F32(val), kExprEnd
#define WASM_INIT_EXPR_I64(val) WASM_I64(val), kExprEnd
#define WASM_INIT_EXPR_F64(val) WASM_F64(val), kExprEnd
-#define WASM_INIT_EXPR_EXTERN_REF_NULL WASM_REF_NULL(kLocalExternRef), kExprEnd
-#define WASM_INIT_EXPR_FUNC_REF_NULL WASM_REF_NULL(kLocalFuncRef), kExprEnd
+#define WASM_INIT_EXPR_EXTERN_REF_NULL WASM_REF_NULL(kExternRefCode), kExprEnd
+#define WASM_INIT_EXPR_FUNC_REF_NULL WASM_REF_NULL(kFuncRefCode), kExprEnd
#define WASM_INIT_EXPR_REF_FUNC(val) WASM_REF_FUNC(val), kExprEnd
#define WASM_INIT_EXPR_GLOBAL(index) WASM_GET_GLOBAL(index), kExprEnd
-#define REF_NULL_ELEMENT kExprRefNull, kLocalFuncRef, kExprEnd
+#define REF_NULL_ELEMENT kExprRefNull, kFuncRefCode, kExprEnd
#define REF_FUNC_ELEMENT(v) kExprRefFunc, U32V_1(v), kExprEnd
#define EMPTY_BODY 0
#define NOP_BODY 2, 0, kExprNop
-#define SIG_ENTRY_i_i SIG_ENTRY_x_x(kLocalI32, kLocalI32)
+#define SIG_ENTRY_i_i SIG_ENTRY_x_x(kI32Code, kI32Code)
#define UNKNOWN_SECTION(size) 0, U32V_1(size + 5), ADD_COUNT('l', 'u', 'l', 'z')
-
-template <typename... Args>
-std::integral_constant<size_t, sizeof...(Args)> CountArgsHelper(Args...);
-#define COUNT_ARGS(...) (decltype(CountArgsHelper(__VA_ARGS__))::value)
-
-template <size_t num>
-struct CheckLEB1 : std::integral_constant<size_t, num> {
- static_assert(num <= I32V_MAX(1), "LEB range check");
-};
-#define CHECK_LEB1(num) CheckLEB1<num>::value
-
-#define ADD_COUNT(...) CHECK_LEB1(COUNT_ARGS(__VA_ARGS__)), __VA_ARGS__
-
-#define SECTION(name, ...) k##name##SectionCode, ADD_COUNT(__VA_ARGS__)
-
-#define SIGNATURES_SECTION(count, ...) SECTION(Type, U32V_1(count), __VA_ARGS__)
-#define FUNCTION_SIGNATURES_SECTION(count, ...) \
+#define TYPE_SECTION(count, ...) SECTION(Type, U32V_1(count), __VA_ARGS__)
+#define FUNCTION_SECTION(count, ...) \
SECTION(Function, U32V_1(count), __VA_ARGS__)
#define FOO_STRING ADD_COUNT('f', 'o', 'o')
#define NO_LOCAL_NAMES 0
-#define EMPTY_SIGNATURES_SECTION SECTION(Type, ENTRY_COUNT(0))
-#define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(Function, ENTRY_COUNT(0))
+#define EMPTY_TYPE_SECTION SECTION(Type, ENTRY_COUNT(0))
+#define EMPTY_FUNCTION_SECTION SECTION(Function, ENTRY_COUNT(0))
#define EMPTY_FUNCTION_BODIES_SECTION SECTION(Code, ENTRY_COUNT(0))
#define SECTION_NAMES(...) \
SECTION(Unknown, ADD_COUNT('n', 'a', 'm', 'e'), ##__VA_ARGS__)
@@ -110,7 +95,7 @@ struct CheckLEB1 : std::integral_constant<size_t, num> {
#define THREE_EMPTY_BODIES SECTION(Code, ENTRY_COUNT(3), X3(EMPTY_BODY))
#define FOUR_EMPTY_BODIES SECTION(Code, ENTRY_COUNT(4), X4(EMPTY_BODY))
-#define SIGNATURES_SECTION_VOID_VOID \
+#define TYPE_SECTION_ONE_SIG_VOID_VOID \
SECTION(Type, ENTRY_COUNT(1), SIG_ENTRY_v_v)
#define LINEAR_MEMORY_INDEX_0 0
@@ -119,8 +104,8 @@ struct CheckLEB1 : std::integral_constant<size_t, num> {
#define FIELD_COUNT(count) U32V_1(count)
#define STRUCT_FIELD(type, mutability) type, (mutability ? 1 : 0)
-#define WASM_REF(index) kLocalRef, index
-#define WASM_OPT_REF(index) kLocalOptRef, index
+#define WASM_REF(index) kRefCode, index
+#define WASM_OPT_REF(index) kOptRefCode, index
#define WASM_STRUCT_DEF(...) kWasmStructTypeCode, __VA_ARGS__
#define WASM_ARRAY_DEF(type, mutability) \
kWasmArrayTypeCode, type, (mutability ? 1 : 0)
@@ -144,7 +129,9 @@ struct CheckLEB1 : std::integral_constant<size_t, num> {
do { \
ModuleResult result = DecodeModule(data, data + sizeof(data)); \
EXPECT_FALSE(result.ok()); \
- EXPECT_THAT(result.error().message(), HasSubstr(msg)); \
+ if (!result.ok()) { \
+ EXPECT_THAT(result.error().message(), HasSubstr(msg)); \
+ } \
} while (false)
#define EXPECT_OFF_END_FAILURE(data, min) \
@@ -182,12 +169,12 @@ struct ValueTypePair {
uint8_t code;
ValueType type;
} kValueTypes[] = {
- {kLocalI32, kWasmI32}, // --
- {kLocalI64, kWasmI64}, // --
- {kLocalF32, kWasmF32}, // --
- {kLocalF64, kWasmF64}, // --
- {kLocalFuncRef, kWasmFuncRef}, // --
- {kLocalExternRef, kWasmExternRef}, // --
+ {kI32Code, kWasmI32}, // --
+ {kI64Code, kWasmI64}, // --
+ {kF32Code, kWasmF32}, // --
+ {kF64Code, kWasmF64}, // --
+ {kFuncRefCode, kWasmFuncRef}, // --
+ {kExternRefCode, kWasmExternRef}, // --
};
class WasmModuleVerifyTest : public TestWithIsolateAndZone {
@@ -247,7 +234,7 @@ TEST_F(WasmModuleVerifyTest, OneGlobal) {
static const byte data[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalI32, // local type
+ kI32Code, // local type
0, // immutable
WASM_INIT_EXPR_I32V_1(13)) // init
};
@@ -278,7 +265,7 @@ TEST_F(WasmModuleVerifyTest, S128Global) {
9, 10, 11, 12, 13, 14, 15};
static const byte data[] = {SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalS128, // memory type
+ kS128Code, // memory type
0, // immutable
WASM_SIMD_CONSTANT(v.data()), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
@@ -296,15 +283,15 @@ TEST_F(WasmModuleVerifyTest, ExternRefGlobal) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
TWO_EMPTY_FUNCTIONS(SIG_INDEX(0)),
SECTION(Global, // --
ENTRY_COUNT(2), // --
- kLocalExternRef, // local type
+ kExternRefCode, // local type
0, // immutable
WASM_INIT_EXPR_EXTERN_REF_NULL, // init
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
0, // immutable
WASM_INIT_EXPR_REF_FUNC(1)), // init
SECTION(Element, // section name
@@ -314,7 +301,7 @@ TEST_F(WasmModuleVerifyTest, ExternRefGlobal) {
ENTRY_COUNT(1), // func entry count
FUNC_INDEX(0), // func index
DECLARATIVE_WITH_ELEMENTS, // flags 1
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
ENTRY_COUNT(1), // func ref count
REF_FUNC_ELEMENT(1)), // func ref
TWO_EMPTY_BODIES};
@@ -345,15 +332,15 @@ TEST_F(WasmModuleVerifyTest, FuncRefGlobal) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
TWO_EMPTY_FUNCTIONS(SIG_INDEX(0)),
SECTION(Global, // --
ENTRY_COUNT(2), // --
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
0, // immutable
WASM_INIT_EXPR_FUNC_REF_NULL, // init
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
0, // immutable
WASM_INIT_EXPR_REF_FUNC(1)), // init
SECTION(Element, // section name
@@ -363,7 +350,7 @@ TEST_F(WasmModuleVerifyTest, FuncRefGlobal) {
ENTRY_COUNT(1), // func entry count
FUNC_INDEX(0), // func index
DECLARATIVE_WITH_ELEMENTS, // flags 1
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
ENTRY_COUNT(1), // func ref count
REF_FUNC_ELEMENT(1)), // func ref
TWO_EMPTY_BODIES};
@@ -392,12 +379,12 @@ TEST_F(WasmModuleVerifyTest, InvalidFuncRefGlobal) {
WASM_FEATURE_SCOPE(reftypes);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
TWO_EMPTY_FUNCTIONS(SIG_INDEX(0)),
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
0, // immutable
WASM_INIT_EXPR_REF_FUNC(7)), // invalid function index
TWO_EMPTY_BODIES};
@@ -412,12 +399,12 @@ TEST_F(WasmModuleVerifyTest, ExternRefGlobalWithGlobalInit) {
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // global name
kExternalGlobal, // import kind
- kLocalExternRef, // type
+ kExternRefCode, // type
0), // mutability
SECTION(Global, // --
ENTRY_COUNT(1),
- kLocalExternRef, // local type
- 0, // immutable
+ kExternRefCode, // local type
+ 0, // immutable
WASM_INIT_EXPR_GLOBAL(0)),
};
@@ -445,12 +432,12 @@ TEST_F(WasmModuleVerifyTest, NullGlobalWithGlobalInit) {
ADD_COUNT('m'), // module name
ADD_COUNT('n'), // global name
kExternalGlobal, // import kind
- kLocalExternRef, // type
+ kExternRefCode, // type
0), // mutability
SECTION(Global, // --
ENTRY_COUNT(1),
- kLocalExternRef, // local type
- 0, // immutable
+ kExternRefCode, // local type
+ 0, // immutable
WASM_INIT_EXPR_GLOBAL(0)),
};
@@ -471,11 +458,11 @@ TEST_F(WasmModuleVerifyTest, NullGlobalWithGlobalInit) {
}
}
-TEST_F(WasmModuleVerifyTest, Global_invalid_type) {
+TEST_F(WasmModuleVerifyTest, GlobalInvalidType) {
static const byte data[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- 64, // invalid memory type
+ 64, // invalid value type
1, // mutable
WASM_INIT_EXPR_I32V_1(33)), // init
};
@@ -483,11 +470,11 @@ TEST_F(WasmModuleVerifyTest, Global_invalid_type) {
EXPECT_FAILURE(data);
}
-TEST_F(WasmModuleVerifyTest, Global_invalid_type2) {
+TEST_F(WasmModuleVerifyTest, GlobalInvalidType2) {
static const byte data[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalVoid, // invalid memory type
+ kVoidCode, // invalid value type
1, // mutable
WASM_INIT_EXPR_I32V_1(33)), // init
};
@@ -495,11 +482,11 @@ TEST_F(WasmModuleVerifyTest, Global_invalid_type2) {
EXPECT_FAILURE(data);
}
-TEST_F(WasmModuleVerifyTest, Global_invalid_init) {
+TEST_F(WasmModuleVerifyTest, GlobalInitializer) {
static const byte no_initializer_no_end[] = {
SECTION(Global, //--
ENTRY_COUNT(1), //--
- kLocalI32, // type
+ kI32Code, // type
1) // mutable
};
EXPECT_FAILURE_WITH_MSG(no_initializer_no_end,
@@ -508,7 +495,7 @@ TEST_F(WasmModuleVerifyTest, Global_invalid_init) {
static const byte no_initializer[] = {
SECTION(Global, //--
ENTRY_COUNT(1), //--
- kLocalI32, // type
+ kI32Code, // type
1, // mutable
kExprEnd) // --
};
@@ -519,7 +506,7 @@ TEST_F(WasmModuleVerifyTest, Global_invalid_init) {
static const byte too_many_initializers_no_end[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalI32, // type
+ kI32Code, // type
1, // mutable
WASM_I32V_1(42), // one value is good
WASM_I32V_1(43)) // another value is too much
@@ -530,7 +517,7 @@ TEST_F(WasmModuleVerifyTest, Global_invalid_init) {
static const byte too_many_initializers[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalI32, // type
+ kI32Code, // type
1, // mutable
WASM_I32V_1(42), // one value is good
WASM_I32V_1(43), // another value is too much
@@ -542,12 +529,117 @@ TEST_F(WasmModuleVerifyTest, Global_invalid_init) {
static const byte missing_end_opcode[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalI32, // type
+ kI32Code, // type
1, // mutable
WASM_I32V_1(42)) // init value
};
EXPECT_FAILURE_WITH_MSG(missing_end_opcode,
"Global initializer is missing 'end'");
+
+ static const byte referencing_out_of_bounds_global[] = {
+ SECTION(Global, ENTRY_COUNT(1), // --
+ kI32Code, // type
+ 1, // mutable
+ WASM_GET_GLOBAL(42), kExprEnd) // init value
+ };
+ EXPECT_FAILURE_WITH_MSG(referencing_out_of_bounds_global,
+ "global index is out of bounds");
+
+ static const byte referencing_undefined_global[] = {
+ SECTION(Global, ENTRY_COUNT(2), // --
+ kI32Code, // type
+ 0, // mutable
+ WASM_GET_GLOBAL(1), kExprEnd, // init value
+ kI32Code, // type
+ 0, // mutable
+ WASM_I32V(0), kExprEnd) // init value
+ };
+ EXPECT_FAILURE_WITH_MSG(referencing_undefined_global,
+ "global #1 is not defined yet");
+
+ {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+ WASM_FEATURE_SCOPE(gc);
+ static const byte referencing_undefined_global_nested[] = {
+ SECTION(Global, ENTRY_COUNT(2), // --
+ WASM_RTT(2, kFuncRefCode), // type
+ 0, // mutable
+ WASM_RTT_SUB(kFuncRefCode, // init value
+ WASM_GET_GLOBAL(1)), // --
+ kExprEnd, // --
+ WASM_RTT(1, kFuncRefCode), // type
+ 0, // mutable
+ WASM_RTT_CANON(kFuncRefCode), kExprEnd) // init value
+ };
+ EXPECT_FAILURE_WITH_MSG(referencing_undefined_global_nested,
+ "global #1 is not defined yet");
+ }
+
+ static const byte referencing_mutable_global[] = {
+ SECTION(Global, ENTRY_COUNT(2), // --
+ kI32Code, // type
+ 1, // mutable
+ WASM_I32V(1), kExprEnd, // init value
+ kI32Code, // type
+ 0, // mutable
+ WASM_GET_GLOBAL(0), kExprEnd) // init value
+ };
+ EXPECT_FAILURE_WITH_MSG(
+ referencing_mutable_global,
+ "mutable globals cannot be used in initializer expressions");
+
+ static const byte referencing_mutable_imported_global[] = {
+ SECTION(Import, ENTRY_COUNT(1), // --
+ ADD_COUNT('m'), ADD_COUNT('n'), // module, name
+ kExternalGlobal, // --
+ kI32Code, // type
+ 1), // mutable
+ SECTION(Global, ENTRY_COUNT(1), // --
+ kI32Code, // type
+ 0, // mutable
+ WASM_GET_GLOBAL(0), kExprEnd) // init value
+ };
+ EXPECT_FAILURE_WITH_MSG(
+ referencing_mutable_imported_global,
+ "mutable globals cannot be used in initializer expressions");
+
+ static const byte referencing_immutable_imported_global[] = {
+ SECTION(Import, ENTRY_COUNT(1), // --
+ ADD_COUNT('m'), ADD_COUNT('n'), // module, name
+ kExternalGlobal, // --
+ kI32Code, // type
+ 0), // mutable
+ SECTION(Global, ENTRY_COUNT(1), // --
+ kI32Code, // type
+ 0, // mutable
+ WASM_GET_GLOBAL(0), kExprEnd) // init value
+ };
+ EXPECT_VERIFIES(referencing_immutable_imported_global);
+
+ static const byte referencing_local_global[] = {
+ SECTION(Global, ENTRY_COUNT(2), // --
+ kI32Code, // type
+ 0, // mutable
+ WASM_I32V(1), kExprEnd, // init value
+ kI32Code, // type
+ 0, // mutable
+ WASM_GET_GLOBAL(0), kExprEnd) // init value
+ };
+ EXPECT_FAILURE_WITH_MSG(
+ referencing_local_global,
+ "non-imported globals cannot be used in initializer expressions");
+
+ {
+ // But: experimental-wasm-gc should enable referencing immutable local
+ // globals.
+ WASM_FEATURE_SCOPE(gc);
+ EXPECT_VERIFIES(referencing_local_global);
+ // Referencing mutable glocals still invalid.
+ EXPECT_FAILURE_WITH_MSG(
+ referencing_mutable_global,
+ "mutable globals cannot be used in initializer expressions");
+ }
}
TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
@@ -561,7 +653,7 @@ TEST_F(WasmModuleVerifyTest, ExportMutableGlobal) {
static const byte data[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalI32, // local type
+ kI32Code, // local type
0, // immutable
WASM_INIT_EXPR_I32V_1(13)), // init
SECTION(Export, // --
@@ -576,7 +668,7 @@ TEST_F(WasmModuleVerifyTest, ExportMutableGlobal) {
static const byte data[] = {
SECTION(Global, // --
ENTRY_COUNT(1), // --
- kLocalI32, // local type
+ kI32Code, // local type
1, // mutable
WASM_INIT_EXPR_I32V_1(13)), // init
SECTION(Export, // --
@@ -605,7 +697,7 @@ static void AppendUint32v(std::vector<byte>* buffer, uint32_t val) {
TEST_F(WasmModuleVerifyTest, NGlobals) {
static const byte data[] = {
- kLocalF32, // memory type
+ kF32Code, // memory type
0, // immutable
WASM_INIT_EXPR_F32(7.7), // init
};
@@ -627,23 +719,13 @@ TEST_F(WasmModuleVerifyTest, NGlobals) {
}
}
-TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
- static const byte data[] = {SECTION(Global, // --
- ENTRY_COUNT(1), // --
- 33, // memory type
- 0, // exported
- WASM_INIT_EXPR_I32V_1(1))};
-
- EXPECT_FAILURE(data);
-}
-
TEST_F(WasmModuleVerifyTest, TwoGlobals) {
static const byte data[] = {SECTION(Global, // --
ENTRY_COUNT(2), // --
- kLocalF32, // type
+ kF32Code, // type
0, // immutable
WASM_INIT_EXPR_F32(22.0), // --
- kLocalF64, // type
+ kF64Code, // type
1, // mutable
WASM_INIT_EXPR_F64(23.0))}; // --
@@ -675,8 +757,8 @@ TEST_F(WasmModuleVerifyTest, TwoGlobals) {
TEST_F(WasmModuleVerifyTest, RefNullGlobal) {
WASM_FEATURE_SCOPE(reftypes);
- static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kLocalFuncRef, 1,
- WASM_REF_NULL(kLocalFuncRef), kExprEnd)};
+ static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kFuncRefCode, 1,
+ WASM_REF_NULL(kFuncRefCode), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_OK(result);
}
@@ -684,8 +766,8 @@ TEST_F(WasmModuleVerifyTest, RefNullGlobal) {
TEST_F(WasmModuleVerifyTest, RefNullGlobalInvalid1) {
WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(typed_funcref);
- static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kLocalOptRef, 0,
- 1, WASM_REF_NULL(0), kExprEnd)};
+ static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kOptRefCode, 0, 1,
+ WASM_REF_NULL(0), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "Type index 0 is out of bounds");
}
@@ -693,7 +775,7 @@ TEST_F(WasmModuleVerifyTest, RefNullGlobalInvalid1) {
TEST_F(WasmModuleVerifyTest, RefNullGlobalInvalid2) {
WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(typed_funcref);
- static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kLocalFuncRef, 1,
+ static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kFuncRefCode, 1,
kExprRefNull, U32V_5(1000001), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result,
@@ -706,8 +788,8 @@ TEST_F(WasmModuleVerifyTest, RttCanonGlobalGeneric) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {SECTION(Global, ENTRY_COUNT(1),
- WASM_RTT(1, kLocalFuncRef), 1,
- WASM_RTT_CANON(kLocalFuncRef), kExprEnd)};
+ WASM_RTT(1, kFuncRefCode), 1,
+ WASM_RTT_CANON(kFuncRefCode), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_OK(result);
}
@@ -718,7 +800,7 @@ TEST_F(WasmModuleVerifyTest, RttCanonGlobalStruct) {
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {
SECTION(Type, ENTRY_COUNT(1),
- WASM_STRUCT_DEF(FIELD_COUNT(1), STRUCT_FIELD(kLocalI32, true))),
+ WASM_STRUCT_DEF(FIELD_COUNT(1), STRUCT_FIELD(kI32Code, true))),
SECTION(Global, ENTRY_COUNT(1), WASM_RTT(1, 0), 0, WASM_RTT_CANON(0),
kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
@@ -730,8 +812,8 @@ TEST_F(WasmModuleVerifyTest, RttCanonGlobalTypeError) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {SECTION(Global, ENTRY_COUNT(1),
- WASM_RTT(1, kLocalExternRef), 1,
- WASM_RTT_CANON(kLocalFuncRef), kExprEnd)};
+ WASM_RTT(1, kExternRefCode), 1,
+ WASM_RTT_CANON(kFuncRefCode), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result,
"type error in init expression, expected (rtt 1 extern), got "
@@ -742,9 +824,9 @@ TEST_F(WasmModuleVerifyTest, GlobalRttSubOfCanon) {
WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
- static const byte data[] = {SECTION(
- Global, ENTRY_COUNT(1), WASM_RTT(2, kLocalI31Ref), 1,
- WASM_RTT_SUB(kLocalI31Ref, WASM_RTT_CANON(kLocalEqRef)), kExprEnd)};
+ static const byte data[] = {
+ SECTION(Global, ENTRY_COUNT(1), WASM_RTT(2, kI31RefCode), 1,
+ WASM_RTT_SUB(kI31RefCode, WASM_RTT_CANON(kEqRefCode)), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
WasmInitExpr expected = WasmInitExpr::RttSub(
HeapType::kI31, WasmInitExpr::RttCanon(HeapType::kEq));
@@ -757,9 +839,9 @@ TEST_F(WasmModuleVerifyTest, GlobalRttSubOfSubOfCanon) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {SECTION(
- Global, ENTRY_COUNT(1), WASM_RTT(3, kLocalEqRef), 1,
- WASM_RTT_SUB(kLocalEqRef,
- WASM_RTT_SUB(kLocalEqRef, WASM_RTT_CANON(kLocalEqRef))),
+ Global, ENTRY_COUNT(1), WASM_RTT(3, kEqRefCode), 1,
+ WASM_RTT_SUB(kEqRefCode,
+ WASM_RTT_SUB(kEqRefCode, WASM_RTT_CANON(kEqRefCode))),
kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
WasmInitExpr expected = WasmInitExpr::RttSub(
@@ -774,15 +856,15 @@ TEST_F(WasmModuleVerifyTest, GlobalRttSubOfGlobal) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {
- SECTION(Import, // section header
- ENTRY_COUNT(1), // number of imports
- ADD_COUNT('m'), // module name
- ADD_COUNT('f'), // global name
- kExternalGlobal, // import kind
- WASM_RTT(1, kLocalEqRef), // type
- 0), // mutability
- SECTION(Global, ENTRY_COUNT(1), WASM_RTT(2, kLocalI31Ref), 1,
- WASM_RTT_SUB(kLocalI31Ref, WASM_GET_GLOBAL(0)), kExprEnd)};
+ SECTION(Import, // section header
+ ENTRY_COUNT(1), // number of imports
+ ADD_COUNT('m'), // module name
+ ADD_COUNT('f'), // global name
+ kExternalGlobal, // import kind
+ WASM_RTT(1, kEqRefCode), // type
+ 0), // mutability
+ SECTION(Global, ENTRY_COUNT(1), WASM_RTT(2, kI31RefCode), 1,
+ WASM_RTT_SUB(kI31RefCode, WASM_GET_GLOBAL(0)), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
WasmInitExpr expected =
WasmInitExpr::RttSub(HeapType::kI31, WasmInitExpr::GlobalGet(0));
@@ -800,10 +882,10 @@ TEST_F(WasmModuleVerifyTest, GlobalRttSubOfGlobalTypeError) {
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
0), // mutability
- SECTION(Global, ENTRY_COUNT(1), WASM_RTT(2, kLocalExternRef), 1,
- WASM_RTT_SUB(kLocalExternRef, WASM_GET_GLOBAL(0)), kExprEnd)};
+ SECTION(Global, ENTRY_COUNT(1), WASM_RTT(2, kExternRefCode), 1,
+ WASM_RTT_SUB(kExternRefCode, WASM_GET_GLOBAL(0)), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "rtt.sub requires a supertype rtt on stack");
}
@@ -813,8 +895,8 @@ TEST_F(WasmModuleVerifyTest, GlobalRttSubIllegalParent) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {SECTION(
- Global, ENTRY_COUNT(1), WASM_RTT(2, kLocalEqRef), 1,
- WASM_RTT_SUB(kLocalEqRef, WASM_RTT_CANON(kLocalExternRef)), kExprEnd)};
+ Global, ENTRY_COUNT(1), WASM_RTT(2, kEqRefCode), 1,
+ WASM_RTT_SUB(kEqRefCode, WASM_RTT_CANON(kExternRefCode)), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "rtt.sub requires a supertype rtt on stack");
}
@@ -824,14 +906,157 @@ TEST_F(WasmModuleVerifyTest, RttSubGlobalTypeError) {
WASM_FEATURE_SCOPE(typed_funcref);
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {SECTION(
- Global, ENTRY_COUNT(1), WASM_RTT(1 /* Should be 2 */, kLocalI31Ref), 1,
- WASM_RTT_SUB(kLocalI31Ref, WASM_RTT_CANON(kLocalEqRef)), kExprEnd)};
+ Global, ENTRY_COUNT(1), WASM_RTT(1 /* Should be 2 */, kI31RefCode), 1,
+ WASM_RTT_SUB(kI31RefCode, WASM_RTT_CANON(kEqRefCode)), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result,
"type error in init expression, expected (rtt 1 i31), got "
"(rtt 2 i31)");
}
+TEST_F(WasmModuleVerifyTest, EmptyStruct) {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+ WASM_FEATURE_SCOPE(gc);
+ static const byte empty_struct[] = {SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(0))}; // field count
+
+ EXPECT_VERIFIES(empty_struct);
+}
+
+TEST_F(WasmModuleVerifyTest, InvalidStructTypeDef) {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+ WASM_FEATURE_SCOPE(gc);
+ static const byte all_good[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(1), // field count
+ kI32Code, // perfectly valid field type
+ 1)}; // mutability
+ EXPECT_VERIFIES(all_good);
+
+ static const byte invalid_field_type[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(1), // field count
+ kWasmArrayTypeCode, // bogus field type
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(invalid_field_type, "invalid value type");
+
+ static const byte field_type_oob_ref[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(1), // field count
+ kOptRefCode, // field type: reference...
+ 3, // ...to nonexistent type
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(field_type_oob_ref, "Type index 3 is out of bounds");
+
+ static const byte field_type_invalid_ref[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(1), // field count
+ kOptRefCode, // field type: reference...
+ U32V_4(1234567), // ...to a type > kV8MaxWasmTypes
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(field_type_invalid_ref, "greater than the maximum");
+
+ static const byte field_type_invalid_ref2[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(1), // field count
+ kOptRefCode, // field type: reference...
+ kI32Code, // ...to a non-referenceable type
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(field_type_invalid_ref2, "Unknown heap type");
+
+ static const byte not_enough_field_types[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(2), // field count
+ kI32Code, // field type 1
+ 1)}; // mutability 1
+ EXPECT_FAILURE_WITH_MSG(not_enough_field_types, "expected 1 byte");
+
+ static const byte not_enough_field_types2[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(2), // field count
+ kI32Code, // field type 1
+ 1, // mutability 1
+ kI32Code)}; // field type 2
+ EXPECT_FAILURE_WITH_MSG(not_enough_field_types2, "expected 1 byte");
+
+ static const byte invalid_mutability[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmStructTypeCode, // --
+ U32V_1(1), // field count
+ kI32Code, // field type
+ 2)}; // invalid mutability value
+ EXPECT_FAILURE_WITH_MSG(invalid_mutability, "invalid mutability");
+}
+
+TEST_F(WasmModuleVerifyTest, InvalidArrayTypeDef) {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+ WASM_FEATURE_SCOPE(gc);
+ static const byte all_good[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kI32Code, // perfectly valid field type
+ 1)}; // mutability
+ EXPECT_VERIFIES(all_good);
+
+ static const byte invalid_field_type[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kWasmArrayTypeCode, // bogus field type
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(invalid_field_type, "invalid value type");
+
+ static const byte field_type_oob_ref[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kOptRefCode, // field type: reference...
+ 3, // ...to nonexistent type
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(field_type_oob_ref, "Type index 3 is out of bounds");
+
+ static const byte field_type_invalid_ref[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kOptRefCode, // field type: reference...
+ U32V_3(1234567), // ...to a type > kV8MaxWasmTypes
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(field_type_invalid_ref, "Unknown heap type");
+
+ static const byte field_type_invalid_ref2[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kOptRefCode, // field type: reference...
+ kI32Code, // ...to a non-referenceable type
+ 1)}; // mutability
+ EXPECT_FAILURE_WITH_MSG(field_type_invalid_ref2, "Unknown heap type");
+
+ static const byte invalid_mutability[] = {
+ SECTION(Type, ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kI32Code, // field type
+ 2)}; // invalid mutability value
+ EXPECT_FAILURE_WITH_MSG(invalid_mutability, "invalid mutability");
+
+ static const byte invalid_mutability2[] = {
+ SECTION(Type,
+ ENTRY_COUNT(1), // --
+ kWasmArrayTypeCode, // --
+ kI32Code, // field type
+ 0)}; // immmutability (disallowed in MVP)
+ EXPECT_FAILURE_WITH_MSG(invalid_mutability2,
+ "immutable arrays are not supported");
+}
+
TEST_F(WasmModuleVerifyTest, ZeroExceptions) {
static const byte data[] = {SECTION(Exception, ENTRY_COUNT(0))};
FAIL_IF_NO_EXPERIMENTAL_EH(data);
@@ -844,7 +1069,7 @@ TEST_F(WasmModuleVerifyTest, ZeroExceptions) {
TEST_F(WasmModuleVerifyTest, OneI32Exception) {
static const byte data[] = {
- SECTION(Type, ENTRY_COUNT(1), SIG_ENTRY_v_x(kLocalI32)), // sig#0 (i32)
+ SECTION(Type, ENTRY_COUNT(1), SIG_ENTRY_v_x(kI32Code)), // sig#0 (i32)
SECTION(Exception, ENTRY_COUNT(1),
EXCEPTION_ENTRY(SIG_INDEX(0)))}; // except[0] (sig#0)
FAIL_IF_NO_EXPERIMENTAL_EH(data);
@@ -862,8 +1087,8 @@ TEST_F(WasmModuleVerifyTest, OneI32Exception) {
TEST_F(WasmModuleVerifyTest, TwoExceptions) {
static const byte data[] = {
SECTION(Type, ENTRY_COUNT(2),
- SIG_ENTRY_v_x(kLocalI32), // sig#0 (i32)
- SIG_ENTRY_v_xx(kLocalF32, kLocalI64)), // sig#1 (f32, i64)
+ SIG_ENTRY_v_x(kI32Code), // sig#0 (i32)
+ SIG_ENTRY_v_xx(kF32Code, kI64Code)), // sig#1 (f32, i64)
SECTION(Exception, ENTRY_COUNT(2),
EXCEPTION_ENTRY(SIG_INDEX(1)), // except[0] (sig#1)
EXCEPTION_ENTRY(SIG_INDEX(0)))}; // except[1] (sig#0)
@@ -883,7 +1108,7 @@ TEST_F(WasmModuleVerifyTest, TwoExceptions) {
TEST_F(WasmModuleVerifyTest, Exception_invalid_sig_index) {
static const byte data[] = {
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
SECTION(Exception, ENTRY_COUNT(1),
EXCEPTION_ENTRY(
SIG_INDEX(23)))}; // except[0] (sig#23 [out-of-bounds])
@@ -968,7 +1193,7 @@ TEST_F(WasmModuleVerifyTest, ExceptionSectionAfterTableBeforeMemory) {
TEST_F(WasmModuleVerifyTest, ExceptionImport) {
static const byte data[] = {
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
SECTION(Import, // section header
ENTRY_COUNT(1), // number of imports
ADD_COUNT('m'), // module name
@@ -986,7 +1211,7 @@ TEST_F(WasmModuleVerifyTest, ExceptionImport) {
TEST_F(WasmModuleVerifyTest, ExceptionExport) {
static const byte data[] = {
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
SECTION(Exception, ENTRY_COUNT(1),
EXCEPTION_ENTRY(SIG_INDEX(0))), // except[0] (sig#0)
SECTION(Export, ENTRY_COUNT(1), // --
@@ -1004,7 +1229,7 @@ TEST_F(WasmModuleVerifyTest, ExceptionExport) {
TEST_F(WasmModuleVerifyTest, OneSignature) {
{
- static const byte data[] = {SIGNATURES_SECTION_VOID_VOID};
+ static const byte data[] = {TYPE_SECTION_ONE_SIG_VOID_VOID};
EXPECT_VERIFIES(data);
}
@@ -1016,12 +1241,11 @@ TEST_F(WasmModuleVerifyTest, OneSignature) {
TEST_F(WasmModuleVerifyTest, MultipleSignatures) {
static const byte data[] = {
- SECTION(
- Type, // --
- ENTRY_COUNT(3), // --
- SIG_ENTRY_v_v, // void -> void
- SIG_ENTRY_x_x(kLocalI32, kLocalF32), // f32 -> i32
- SIG_ENTRY_x_xx(kLocalI32, kLocalF64, kLocalF64)), // f64,f64 -> i32
+ SECTION(Type, // --
+ ENTRY_COUNT(3), // --
+ SIG_ENTRY_v_v, // void -> void
+ SIG_ENTRY_x_x(kI32Code, kF32Code), // f32 -> i32
+ SIG_ENTRY_x_xx(kI32Code, kF64Code, kF64Code)), // f64,f64 -> i32
};
ModuleResult result = DecodeModule(data, data + sizeof(data));
@@ -1048,14 +1272,14 @@ TEST_F(WasmModuleVerifyTest, DataSegmentWithImmutableImportedGlobal) {
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
0, // mutability
ADD_COUNT('n'), // module name
ADD_COUNT('g'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
0), // mutability
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0,
WASM_INIT_EXPR_GLOBAL(1), // dest addr
U32V_1(3), // source size
@@ -1076,9 +1300,9 @@ TEST_F(WasmModuleVerifyTest, DataSegmentWithMutableImportedGlobal) {
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
1), // mutability
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0,
WASM_INIT_EXPR_GLOBAL(0), // dest addr
U32V_1(3), // source size
@@ -1089,9 +1313,9 @@ TEST_F(WasmModuleVerifyTest, DataSegmentWithMutableImportedGlobal) {
TEST_F(WasmModuleVerifyTest, DataSegmentWithImmutableGlobal) {
// Only an immutable imported global can be used as an init_expr.
const byte data[] = {
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Global, ENTRY_COUNT(1),
- kLocalI32, // local type
+ kI32Code, // local type
0, // immutable
WASM_INIT_EXPR_I32V_3(0x9BBAA)), // init
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0,
@@ -1105,7 +1329,7 @@ TEST_F(WasmModuleVerifyTest, DataSegmentWithImmutableGlobal) {
TEST_F(WasmModuleVerifyTest, OneDataSegment) {
const byte kDataSegmentSourceOffset = 24;
const byte data[] = {
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0,
WASM_INIT_EXPR_I32V_3(0x9BBAA), // dest addr
U32V_1(3), // source size
@@ -1136,7 +1360,7 @@ TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
const byte kDataSegment1SourceOffset = kDataSegment0SourceOffset + 11;
const byte data[] = {
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Data,
ENTRY_COUNT(2), // segment count
LINEAR_MEMORY_INDEX_0,
@@ -1186,19 +1410,19 @@ TEST_F(WasmModuleVerifyTest, DataWithoutMemory) {
TEST_F(WasmModuleVerifyTest, MaxMaximumMemorySize) {
{
const byte data[] = {
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 0, U32V_3(65536))};
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 0, U32V_3(65536))};
EXPECT_VERIFIES(data);
}
{
const byte data[] = {
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 0, U32V_3(65537))};
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 0, U32V_3(65537))};
EXPECT_FAILURE(data);
}
}
TEST_F(WasmModuleVerifyTest, DataSegment_wrong_init_type) {
const byte data[] = {
- SECTION(Memory, ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ SECTION(Memory, ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Data, ENTRY_COUNT(1), LINEAR_MEMORY_INDEX_0,
WASM_INIT_EXPR_F64(9.9), // dest addr
U32V_1(3), // source size
@@ -1211,7 +1435,7 @@ TEST_F(WasmModuleVerifyTest, DataSegment_wrong_init_type) {
TEST_F(WasmModuleVerifyTest, DataSegmentEndOverflow) {
const byte data[] = {
SECTION(Memory, // memory section
- ENTRY_COUNT(1), kHasMaximumFlag, 28, 28),
+ ENTRY_COUNT(1), kWithMaximum, 28, 28),
SECTION(Data, // data section
ENTRY_COUNT(1), // one entry
LINEAR_MEMORY_INDEX_0, // mem index
@@ -1225,11 +1449,11 @@ TEST_F(WasmModuleVerifyTest, DataSegmentEndOverflow) {
TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// code ----------------------------------------------------------------
ONE_EMPTY_BODY};
@@ -1246,7 +1470,7 @@ TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
TEST_F(WasmModuleVerifyTest, ElementSectionWithInternalTable) {
static const byte data[] = {
// table ---------------------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// elements ------------------------------------------------------------
SECTION(Element, ENTRY_COUNT(0))};
@@ -1260,7 +1484,7 @@ TEST_F(WasmModuleVerifyTest, ElementSectionWithImportedTable) {
ADD_COUNT('m'), // module name
ADD_COUNT('t'), // table name
kExternalTable, // import kind
- kLocalFuncRef, // elem_type
+ kFuncRefCode, // elem_type
0, // no maximum field
1), // initial size
// elements ------------------------------------------------------------
@@ -1287,11 +1511,11 @@ TEST_F(WasmModuleVerifyTest, Regression_735887) {
// Test with an invalid function index in the element section.
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// elements ------------------------------------------------------------
SECTION(Element,
ENTRY_COUNT(1), // entry count
@@ -1306,11 +1530,11 @@ TEST_F(WasmModuleVerifyTest, Regression_735887) {
TEST_F(WasmModuleVerifyTest, OneIndirectFunction_one_entry) {
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// elements ------------------------------------------------------------
SECTION(Element,
ENTRY_COUNT(1), // entry count
@@ -1332,13 +1556,13 @@ TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) {
static const byte data[] = {
// sig#0 -------------------------------------------------------
SECTION(Type,
- ENTRY_COUNT(2), // --
- SIG_ENTRY_v_v, // void -> void
- SIG_ENTRY_v_x(kLocalI32)), // void -> i32
+ ENTRY_COUNT(2), // --
+ SIG_ENTRY_v_v, // void -> void
+ SIG_ENTRY_v_x(kI32Code)), // void -> i32
// funcs ------------------------------------------------------
FOUR_EMPTY_FUNCTIONS(SIG_INDEX(0)),
// table declaration -------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 8),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 8),
// table elements ----------------------------------------------
SECTION(Element,
ENTRY_COUNT(1), // entry count
@@ -1363,13 +1587,13 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMultipleTables) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
SECTION(Table, ENTRY_COUNT(2), // section header
- kLocalFuncRef, 0, 5, // table 0
- kLocalFuncRef, 0, 9), // table 1
+ kFuncRefCode, 0, 5, // table 0
+ kFuncRefCode, 0, 9), // table 1
// elements ------------------------------------------------------------
SECTION(Element,
ENTRY_COUNT(2), // entry count
@@ -1396,27 +1620,27 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTables) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// imports -------------------------------------------------------------
SECTION(Import, ENTRY_COUNT(2),
ADD_COUNT('m'), // module name
ADD_COUNT('t'), // table name
kExternalTable, // import kind
- kLocalFuncRef, // elem_type
+ kFuncRefCode, // elem_type
0, // no maximum field
5, // initial size
ADD_COUNT('m'), // module name
ADD_COUNT('s'), // table name
kExternalTable, // import kind
- kLocalFuncRef, // elem_type
+ kFuncRefCode, // elem_type
0, // no maximum field
10), // initial size
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
SECTION(Table, ENTRY_COUNT(2), // section header
- kLocalFuncRef, 0, 15, // table 0
- kLocalFuncRef, 0, 19), // table 1
+ kFuncRefCode, 0, 15, // table 0
+ kFuncRefCode, 0, 19), // table 1
// elements ------------------------------------------------------------
SECTION(Element,
4, // entry count
@@ -1454,13 +1678,13 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMultipleTablesArbitraryOrder) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
SECTION(Table, ENTRY_COUNT(2), // section header
- kLocalFuncRef, 0, 5, // table 0
- kLocalFuncRef, 0, 9), // table 1
+ kFuncRefCode, 0, 5, // table 0
+ kFuncRefCode, 0, 9), // table 1
// elements ------------------------------------------------------------
SECTION(Element,
ENTRY_COUNT(3), // entry count
@@ -1491,27 +1715,27 @@ TEST_F(WasmModuleVerifyTest, ElementSectionMixedTablesArbitraryOrder) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// imports -------------------------------------------------------------
SECTION(Import, ENTRY_COUNT(2),
ADD_COUNT('m'), // module name
ADD_COUNT('t'), // table name
kExternalTable, // import kind
- kLocalFuncRef, // elem_type
+ kFuncRefCode, // elem_type
0, // no maximum field
5, // initial size
ADD_COUNT('m'), // module name
ADD_COUNT('s'), // table name
kExternalTable, // import kind
- kLocalFuncRef, // elem_type
+ kFuncRefCode, // elem_type
0, // no maximum field
10), // initial size
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
SECTION(Table, ENTRY_COUNT(2), // section header
- kLocalFuncRef, 0, 15, // table 0
- kLocalFuncRef, 0, 19), // table 1
+ kFuncRefCode, 0, 15, // table 0
+ kFuncRefCode, 0, 19), // table 1
// elements ------------------------------------------------------------
SECTION(Element,
4, // entry count
@@ -1547,13 +1771,13 @@ TEST_F(WasmModuleVerifyTest, ElementSectionInitExternRefTableWithFuncRef) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
SECTION(Table, ENTRY_COUNT(2), // section header
- kLocalExternRef, 0, 5, // table 0
- kLocalFuncRef, 0, 9), // table 1
+ kExternRefCode, 0, 5, // table 0
+ kFuncRefCode, 0, 9), // table 1
// elements ------------------------------------------------------------
SECTION(Element,
ENTRY_COUNT(2), // entry count
@@ -1582,27 +1806,27 @@ TEST_F(WasmModuleVerifyTest, ElementSectionDontInitExternRefImportedTable) {
WASM_FEATURE_SCOPE(bulk_memory);
static const byte data[] = {
// sig#0 ---------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// imports -------------------------------------------------------------
SECTION(Import, ENTRY_COUNT(2),
- ADD_COUNT('m'), // module name
- ADD_COUNT('t'), // table name
- kExternalTable, // import kind
- kLocalFuncRef, // elem_type
- 0, // no maximum field
- 5, // initial size
- ADD_COUNT('m'), // module name
- ADD_COUNT('s'), // table name
- kExternalTable, // import kind
- kLocalExternRef, // elem_type
- 0, // no maximum field
- 10), // initial size
+ ADD_COUNT('m'), // module name
+ ADD_COUNT('t'), // table name
+ kExternalTable, // import kind
+ kFuncRefCode, // elem_type
+ 0, // no maximum field
+ 5, // initial size
+ ADD_COUNT('m'), // module name
+ ADD_COUNT('s'), // table name
+ kExternalTable, // import kind
+ kExternRefCode, // elem_type
+ 0, // no maximum field
+ 10), // initial size
// funcs ---------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration ---------------------------------------------------
SECTION(Table, ENTRY_COUNT(2), // section header
- kLocalFuncRef, 0, 15, // table 0
- kLocalFuncRef, 0, 19), // table 1
+ kFuncRefCode, 0, 15, // table 0
+ kFuncRefCode, 0, 19), // table 1
// elements ------------------------------------------------------------
SECTION(Element,
ENTRY_COUNT(4), // entry count
@@ -1624,7 +1848,7 @@ TEST_F(WasmModuleVerifyTest, ElementSectionDontInitExternRefImportedTable) {
TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) {
static const byte data[] = {
// sig#0 -------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// indirect table ----------------------------------------------
SECTION(Table, ENTRY_COUNT(1), 1, 0, 0)};
@@ -1634,7 +1858,7 @@ TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) {
TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) {
static const byte data[] = {
// sig#0 -------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// functions ---------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// indirect table ----------------------------------------------
@@ -1647,10 +1871,10 @@ TEST_F(WasmModuleVerifyTest, MultipleTablesWithoutFlag) {
static const byte data[] = {
SECTION(Table, // table section
ENTRY_COUNT(2), // 2 tables
- kLocalFuncRef, // table 1: type
+ kFuncRefCode, // table 1: type
0, // table 1: no maximum
10, // table 1: minimum size
- kLocalFuncRef, // table 2: type
+ kFuncRefCode, // table 2: type
0, // table 2: no maximum
10), // table 2: minimum size
};
@@ -1660,14 +1884,14 @@ TEST_F(WasmModuleVerifyTest, MultipleTablesWithoutFlag) {
TEST_F(WasmModuleVerifyTest, MultipleTablesWithFlag) {
WASM_FEATURE_SCOPE(reftypes);
static const byte data[] = {
- SECTION(Table, // table section
- ENTRY_COUNT(2), // 2 tables
- kLocalFuncRef, // table 1: type
- 0, // table 1: no maximum
- 10, // table 1: minimum size
- kLocalExternRef, // table 2: type
- 0, // table 2: no maximum
- 11), // table 2: minimum size
+ SECTION(Table, // table section
+ ENTRY_COUNT(2), // 2 tables
+ kFuncRefCode, // table 1: type
+ 0, // table 1: no maximum
+ 10, // table 1: minimum size
+ kExternRefCode, // table 2: type
+ 0, // table 2: no maximum
+ 11), // table 2: minimum size
};
ModuleResult result = DecodeModule(data, data + sizeof(data));
@@ -1682,11 +1906,61 @@ TEST_F(WasmModuleVerifyTest, MultipleTablesWithFlag) {
EXPECT_EQ(kWasmExternRef, result.value()->tables[1].type);
}
+TEST_F(WasmModuleVerifyTest, TypedFunctionTable) {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+
+ static const byte data[] = {
+ SECTION(Type, ENTRY_COUNT(1), SIG_ENTRY_v_x(kI32Code)),
+ SECTION(Table, // table section
+ ENTRY_COUNT(1), // 1 table
+ kOptRefCode, 0, // table 0: type
+ 0, 10)}; // table 0: limits
+
+ ModuleResult result = DecodeModule(data, data + sizeof(data));
+ EXPECT_OK(result);
+ EXPECT_EQ(ValueType::Ref(0, kNullable), result.value()->tables[0].type);
+}
+
+TEST_F(WasmModuleVerifyTest, IllegalTableTypes) {
+ WASM_FEATURE_SCOPE(reftypes);
+ WASM_FEATURE_SCOPE(typed_funcref);
+ WASM_FEATURE_SCOPE(gc);
+
+ using Vec = std::vector<byte>;
+
+ static Vec table_types[] = {{kOptRefCode, 0},
+ {kOptRefCode, 1},
+ {kOptRefCode, kI31RefCode},
+ {kI31RefCode},
+ {kRttCode, 2, kFuncRefCode}};
+
+ for (Vec type : table_types) {
+ Vec data = {
+ SECTION(Type, ENTRY_COUNT(2),
+ WASM_STRUCT_DEF(FIELD_COUNT(1), STRUCT_FIELD(kI32Code, true)),
+ WASM_ARRAY_DEF(kI32Code, true)),
+ kTableSectionCode, static_cast<byte>(type.size() + 3), byte{1}};
+ // Last elements are section size and entry count
+
+ // Add table type
+ data.insert(data.end(), type.begin(), type.end());
+ // Add table limits
+ data.insert(data.end(), {byte{0}, byte{10}});
+
+ auto result = DecodeModule(data.data(), data.data() + data.size());
+
+ EXPECT_NOT_OK(result,
+ "Currently, only nullable exnref, externref, and "
+ "function references are allowed as table types");
+ }
+}
+
TEST_F(WasmModuleVerifyTest, TieringCompilationHints) {
WASM_FEATURE_SCOPE(compilation_hints);
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v),
- FUNCTION_SIGNATURES_SECTION(3, 0, 0, 0),
+ TYPE_SECTION(1, SIG_ENTRY_v_v),
+ FUNCTION_SECTION(3, 0, 0, 0),
SECTION_COMPILATION_HINTS(BASELINE_TIER_BASELINE | TOP_TIER_BASELINE,
BASELINE_TIER_BASELINE | TOP_TIER_OPTIMIZED,
BASELINE_TIER_OPTIMIZED | TOP_TIER_OPTIMIZED),
@@ -1791,7 +2065,7 @@ TEST_F(WasmSignatureDecodeTest, Ok_i_tt) {
for (size_t j = 0; j < arraysize(kValueTypes); j++) {
ValueTypePair p1_type = kValueTypes[j];
const byte data[] = {
- SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)};
+ SIG_ENTRY_x_xx(kI32Code, p0_type.code, p1_type.code)};
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
EXPECT_TRUE(sig != nullptr);
@@ -1828,7 +2102,7 @@ TEST_F(WasmSignatureDecodeTest, Ok_tt_tt) {
TEST_F(WasmSignatureDecodeTest, TooManyParams) {
static const byte data[] = {kWasmFunctionTypeCode,
WASM_I32V_3(kV8MaxWasmFunctionParams + 1),
- kLocalI32, 0};
+ kI32Code, 0};
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
EXPECT_FALSE(sig != nullptr);
}
@@ -1840,7 +2114,7 @@ TEST_F(WasmSignatureDecodeTest, TooManyReturns) {
const int max_return_count = static_cast<int>(
enable_mv ? kV8MaxWasmFunctionMultiReturns : kV8MaxWasmFunctionReturns);
byte data[] = {kWasmFunctionTypeCode, 0, WASM_I32V_3(max_return_count + 1),
- kLocalI32};
+ kI32Code};
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
EXPECT_EQ(nullptr, sig);
}
@@ -1849,7 +2123,7 @@ TEST_F(WasmSignatureDecodeTest, TooManyReturns) {
TEST_F(WasmSignatureDecodeTest, Fail_off_end) {
byte data[256];
for (int p = 0; p <= 255; p = p + 1 + p * 3) {
- for (int i = 0; i <= p; i++) data[i] = kLocalI32;
+ for (int i = 0; i <= p; i++) data[i] = kI32Code;
data[0] = static_cast<byte>(p);
for (int i = 0; i < p + 1; i++) {
@@ -1863,10 +2137,10 @@ TEST_F(WasmSignatureDecodeTest, Fail_off_end) {
TEST_F(WasmSignatureDecodeTest, Fail_externref_without_flag) {
// Disable ExternRef support and check that decoding fails.
WASM_FEATURE_SCOPE_VAL(reftypes, false);
- byte ref_types[] = {kLocalFuncRef, kLocalExternRef};
+ byte ref_types[] = {kFuncRefCode, kExternRefCode};
for (byte invalid_type : ref_types) {
for (size_t i = 0;; i++) {
- byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)};
+ byte data[] = {SIG_ENTRY_x_xx(kI32Code, kI32Code, kI32Code)};
if (i >= arraysize(data)) break;
data[i] = invalid_type;
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
@@ -1878,7 +2152,7 @@ TEST_F(WasmSignatureDecodeTest, Fail_externref_without_flag) {
TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) {
byte kInvalidType = 76;
for (size_t i = 0;; i++) {
- byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)};
+ byte data[] = {SIG_ENTRY_x_xx(kI32Code, kI32Code, kI32Code)};
if (i >= arraysize(data)) break;
data[i] = kInvalidType;
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
@@ -1887,19 +2161,19 @@ TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) {
}
TEST_F(WasmSignatureDecodeTest, Fail_invalid_ret_type1) {
- static const byte data[] = {SIG_ENTRY_x_x(kLocalVoid, kLocalI32)};
+ static const byte data[] = {SIG_ENTRY_x_x(kVoidCode, kI32Code)};
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
EXPECT_EQ(nullptr, sig);
}
TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type1) {
- static const byte data[] = {SIG_ENTRY_x_x(kLocalI32, kLocalVoid)};
+ static const byte data[] = {SIG_ENTRY_x_x(kI32Code, kVoidCode)};
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
EXPECT_EQ(nullptr, sig);
}
TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type2) {
- static const byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalVoid)};
+ static const byte data[] = {SIG_ENTRY_x_xx(kI32Code, kI32Code, kVoidCode)};
const FunctionSig* sig = DecodeSig(data, data + sizeof(data));
EXPECT_EQ(nullptr, sig);
}
@@ -1922,14 +2196,14 @@ TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) {
SIG_ENTRY_v_v, // signature entry
4, // locals
3,
- kLocalI32, // --
+ kI32Code, // --
4,
- kLocalI64, // --
+ kI64Code, // --
5,
- kLocalF32, // --
+ kF32Code, // --
6,
- kLocalF64, // --
- kExprEnd // body
+ kF64Code, // --
+ kExprEnd // body
};
WasmModule module;
@@ -1994,7 +2268,7 @@ TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionNonEmpty) {
TEST_F(WasmModuleVerifyTest, SignatureFollowedByEmptyUnknownSection) {
const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// -----------------------------------------------------------
UNKNOWN_SECTION(0)};
EXPECT_VERIFIES(data);
@@ -2003,9 +2277,14 @@ TEST_F(WasmModuleVerifyTest, SignatureFollowedByEmptyUnknownSection) {
TEST_F(WasmModuleVerifyTest, SignatureFollowedByUnknownSection) {
const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// -----------------------------------------------------------
- UNKNOWN_SECTION(5), 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ UNKNOWN_SECTION(5),
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
};
EXPECT_VERIFIES(data);
}
@@ -2043,7 +2322,7 @@ TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) {
UNKNOWN_SECTION(1),
0, // one byte section
SECTION(Global, ENTRY_COUNT(1),
- kLocalI32, // memory type
+ kI32Code, // memory type
0, // exported
WASM_INIT_EXPR_I32V_1(33)), // init
};
@@ -2079,7 +2358,7 @@ TEST_F(WasmModuleVerifyTest, ImportTable_mutable_global) {
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
0), // mutability
};
EXPECT_VERIFIES(data);
@@ -2091,7 +2370,7 @@ TEST_F(WasmModuleVerifyTest, ImportTable_mutable_global) {
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
1), // mutability
};
EXPECT_VERIFIES(data);
@@ -2105,7 +2384,7 @@ TEST_F(WasmModuleVerifyTest, ImportTable_mutability_malformed) {
ADD_COUNT('m'), // module name
ADD_COUNT('g'), // global name
kExternalGlobal, // import kind
- kLocalI32, // type
+ kI32Code, // type
2), // invalid mutability
};
EXPECT_FAILURE(data);
@@ -2137,7 +2416,7 @@ TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
SECTION(Import,
ENTRY_COUNT(1), // --
ADD_COUNT('m'), // module name
@@ -2151,14 +2430,14 @@ TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, // --
- SECTION(Import, // --
- ENTRY_COUNT(1), // --
- NO_NAME, // module name
- ADD_COUNT('f'), // function name
- kExternalFunction, // import kind
- SIG_INDEX(0), // sig index
- 0), // auxiliary data
+ TYPE_SECTION_ONE_SIG_VOID_VOID, // --
+ SECTION(Import, // --
+ ENTRY_COUNT(1), // --
+ NO_NAME, // module name
+ ADD_COUNT('f'), // function name
+ kExternalFunction, // import kind
+ SIG_INDEX(0), // sig index
+ 0), // auxiliary data
};
EXPECT_FAILURE(data);
}
@@ -2166,7 +2445,7 @@ TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) {
TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
SECTION(Import, ENTRY_COUNT(1),
ADD_COUNT('m'), // module name
ADD_COUNT('f'), // function name
@@ -2178,8 +2457,8 @@ TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
}
TEST_F(WasmModuleVerifyTest, ExportTable_empty1) {
- static const byte data[] = { // signatures
- SIGNATURES_SECTION_VOID_VOID, // --
+ static const byte data[] = { // signatures
+ TYPE_SECTION_ONE_SIG_VOID_VOID, // --
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
SECTION(Export, ENTRY_COUNT(0)), // --
ONE_EMPTY_BODY};
@@ -2205,7 +2484,7 @@ TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) {
TEST_F(WasmModuleVerifyTest, ExportTableOne) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
+ TYPE_SECTION_ONE_SIG_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
SECTION(Export,
ENTRY_COUNT(1), // exports
NO_NAME, // --
@@ -2222,7 +2501,7 @@ TEST_F(WasmModuleVerifyTest, ExportTableOne) {
TEST_F(WasmModuleVerifyTest, ExportNameWithInvalidStringLength) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
+ TYPE_SECTION_ONE_SIG_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
SECTION(Export,
ENTRY_COUNT(1), // exports
U32V_1(84), // invalid string length
@@ -2238,7 +2517,7 @@ TEST_F(WasmModuleVerifyTest, ExportNameWithInvalidStringLength) {
TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
+ TYPE_SECTION_ONE_SIG_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
SECTION(Export,
ENTRY_COUNT(2), // exports
ADD_COUNT('n', 'a', 'm', 'e'), // --
@@ -2259,7 +2538,7 @@ TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
TEST_F(WasmModuleVerifyTest, ExportTableThree) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, THREE_EMPTY_FUNCTIONS(SIG_INDEX(0)),
+ TYPE_SECTION_ONE_SIG_VOID_VOID, THREE_EMPTY_FUNCTIONS(SIG_INDEX(0)),
SECTION(Export,
ENTRY_COUNT(3), // exports
ADD_COUNT('a'), // --
@@ -2283,7 +2562,7 @@ TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
for (int i = 0; i < 6; i++) {
const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, THREE_EMPTY_FUNCTIONS(SIG_INDEX(0)),
+ TYPE_SECTION_ONE_SIG_VOID_VOID, THREE_EMPTY_FUNCTIONS(SIG_INDEX(0)),
SECTION(Export,
ENTRY_COUNT(1), // exports
ADD_COUNT('e', 'x'), // --
@@ -2302,7 +2581,7 @@ TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) {
static const byte data[] = {
// signatures
- SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
+ TYPE_SECTION_ONE_SIG_VOID_VOID, ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
SECTION(Export,
ENTRY_COUNT(1), // exports
NO_NAME, // --
@@ -2325,12 +2604,12 @@ TEST_F(WasmModuleVerifyTest, Regression_648070) {
TEST_F(WasmModuleVerifyTest, Regression_738097) {
// The function body size caused an integer overflow in the module decoder.
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(1, 0), // --
- SECTION(Code, // --
- ENTRY_COUNT(1), // --
- U32V_5(0xFFFFFFFF), // function size,
- 0) // No real body
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(1, 0), // --
+ SECTION(Code, // --
+ ENTRY_COUNT(1), // --
+ U32V_5(0xFFFFFFFF), // function size,
+ 0) // No real body
};
EXPECT_FAILURE(data);
}
@@ -2340,12 +2619,12 @@ TEST_F(WasmModuleVerifyTest, FunctionBodySizeLimit) {
for (uint32_t body_size = kV8MaxWasmFunctionSize - delta;
body_size < kV8MaxWasmFunctionSize + delta; body_size++) {
byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(1, 0), // --
- kCodeSectionCode, // code section
- U32V_5(1 + body_size + 5), // section size
- 1, // # functions
- U32V_5(body_size) // body size
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(1, 0), // --
+ kCodeSectionCode, // code section
+ U32V_5(1 + body_size + 5), // section size
+ 1, // # functions
+ U32V_5(body_size) // body size
};
size_t total = sizeof(data) + body_size;
byte* buffer = reinterpret_cast<byte*>(calloc(1, total));
@@ -2360,28 +2639,33 @@ TEST_F(WasmModuleVerifyTest, FunctionBodySizeLimit) {
}
}
+TEST_F(WasmModuleVerifyTest, IllegalTypeCode) {
+ static const byte data[] = {TYPE_SECTION(1, SIG_ENTRY_v_x(0x41))};
+ EXPECT_FAILURE_WITH_MSG(data, "invalid value type");
+}
+
TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) {
static const byte data[] = {
- EMPTY_SIGNATURES_SECTION, // --
- EMPTY_FUNCTION_SIGNATURES_SECTION, // --
- EMPTY_FUNCTION_BODIES_SECTION // --
+ EMPTY_TYPE_SECTION, // --
+ EMPTY_FUNCTION_SECTION, // --
+ EMPTY_FUNCTION_BODIES_SECTION // --
};
EXPECT_VERIFIES(data);
}
TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) {
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(1, 0), // --
- ONE_EMPTY_BODY // --
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(1, 0), // --
+ ONE_EMPTY_BODY // --
};
EXPECT_VERIFIES(data);
}
TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) {
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(1, 0), // --
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(1, 0), // --
SECTION(Code, ENTRY_COUNT(1), NOP_BODY) // --
};
EXPECT_VERIFIES(data);
@@ -2389,26 +2673,26 @@ TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) {
TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) {
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
- ONE_EMPTY_BODY // --
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(2, 0, 0), // --
+ ONE_EMPTY_BODY // --
};
EXPECT_FAILURE(data);
}
TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) {
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(1, 0), // --
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(1, 0), // --
SECTION(Code, ENTRY_COUNT(2), NOP_BODY, NOP_BODY) // --
};
EXPECT_FAILURE(data);
}
TEST_F(WasmModuleVerifyTest, Names_empty) {
- static const byte data[] = {
- EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION,
- EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION};
+ static const byte data[] = {EMPTY_TYPE_SECTION, EMPTY_FUNCTION_SECTION,
+ EMPTY_FUNCTION_BODIES_SECTION,
+ EMPTY_NAMES_SECTION};
EXPECT_VERIFIES(data);
}
@@ -2416,8 +2700,8 @@ TEST_F(WasmModuleVerifyTest, Names_one_empty) {
// TODO(wasm): This test does not test anything (corrupt name section does not
// fail validation).
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(1, 0), // --
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(1, 0), // --
ONE_EMPTY_BODY, // --
SECTION_NAMES(ENTRY_COUNT(1), FOO_STRING, NO_LOCAL_NAMES) // --
};
@@ -2428,8 +2712,8 @@ TEST_F(WasmModuleVerifyTest, Names_two_empty) {
// TODO(wasm): This test does not test anything (corrupt name section does not
// fail validation).
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
- FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // --
+ FUNCTION_SECTION(2, 0, 0), // --
TWO_EMPTY_BODIES, // --
SECTION_NAMES(ENTRY_COUNT(2), // --
FOO_STRING, NO_LOCAL_NAMES, // --
@@ -2458,8 +2742,8 @@ TEST_F(WasmModuleVerifyTest, Regression684855) {
TEST_F(WasmModuleVerifyTest, FunctionSectionWithoutCodeSection) {
static const byte data[] = {
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // Type section.
- FUNCTION_SIGNATURES_SECTION(1, 0), // Function section.
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // Type section.
+ FUNCTION_SECTION(1, 0), // Function section.
};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "function count is 1, but code section is absent");
@@ -2537,7 +2821,7 @@ TEST_F(WasmInitExprDecodeTest, InitExpr_f64) {
TEST_F(WasmInitExprDecodeTest, InitExpr_ExternRef) {
WASM_FEATURE_SCOPE(reftypes);
- static const byte data[] = {kExprRefNull, kLocalExternRef, kExprEnd};
+ static const byte data[] = {kExprRefNull, kExternRefCode, kExprEnd};
WasmInitExpr expr = DecodeInitExpr(data, data + sizeof(data));
EXPECT_EQ(WasmInitExpr::kRefNullConst, expr.kind());
}
@@ -2611,7 +2895,7 @@ TEST_F(WasmModuleCustomSectionTest, TwoKnownTwoUnknownSections) {
static const byte data[] = {
U32_LE(kWasmMagic), // --
U32_LE(kWasmVersion), // --
- SIGNATURES_SECTION(2, SIG_ENTRY_v_v, SIG_ENTRY_v_v), // --
+ TYPE_SECTION(2, SIG_ENTRY_v_v, SIG_ENTRY_v_v), // --
SECTION(Unknown, ADD_COUNT('X'), 17, 18), // --
ONE_EMPTY_FUNCTION(SIG_INDEX(0)), // --
SECTION(Unknown, ADD_COUNT('o', 't', 'h', 'e', 'r'), 7, 8), // --
@@ -2697,14 +2981,14 @@ TEST_F(WasmModuleVerifyTest, PassiveDataSegment) {
TEST_F(WasmModuleVerifyTest, ActiveElementSegmentWithElements) {
static const byte data[] = {
// sig#0 -----------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs -----------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration -----------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// element segments -----------------------------------------------------
SECTION(Element, ENTRY_COUNT(1), ACTIVE_WITH_ELEMENTS, TABLE_INDEX0,
- WASM_INIT_EXPR_I32V_1(0), kLocalFuncRef, U32V_1(3),
+ WASM_INIT_EXPR_I32V_1(0), kFuncRefCode, U32V_1(3),
REF_FUNC_ELEMENT(0), REF_FUNC_ELEMENT(0), REF_NULL_ELEMENT),
// code ------------------------------------------------------------------
ONE_EMPTY_BODY};
@@ -2717,13 +3001,13 @@ TEST_F(WasmModuleVerifyTest, ActiveElementSegmentWithElements) {
TEST_F(WasmModuleVerifyTest, PassiveElementSegment) {
static const byte data[] = {
// sig#0 -----------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs -----------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration -----------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// element segments -----------------------------------------------------
- SECTION(Element, ENTRY_COUNT(1), PASSIVE_WITH_ELEMENTS, kLocalFuncRef,
+ SECTION(Element, ENTRY_COUNT(1), PASSIVE_WITH_ELEMENTS, kFuncRefCode,
U32V_1(3), REF_FUNC_ELEMENT(0), REF_FUNC_ELEMENT(0),
REF_NULL_ELEMENT),
// code ------------------------------------------------------------------
@@ -2737,13 +3021,13 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegment) {
TEST_F(WasmModuleVerifyTest, PassiveElementSegmentExternRef) {
static const byte data[] = {
// sig#0 -----------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs -----------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration -----------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// element segments -----------------------------------------------------
- SECTION(Element, ENTRY_COUNT(1), PASSIVE_WITH_ELEMENTS, kLocalExternRef,
+ SECTION(Element, ENTRY_COUNT(1), PASSIVE_WITH_ELEMENTS, kExternRefCode,
U32V_1(0)),
// code ------------------------------------------------------------------
ONE_EMPTY_BODY};
@@ -2754,11 +3038,11 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegmentExternRef) {
TEST_F(WasmModuleVerifyTest, PassiveElementSegmentWithIndices) {
static const byte data[] = {
// sig#0 -----------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs -----------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// table declaration -----------------------------------------------------
- SECTION(Table, ENTRY_COUNT(1), kLocalFuncRef, 0, 1),
+ SECTION(Table, ENTRY_COUNT(1), kFuncRefCode, 0, 1),
// element segments ------------------------------------------------------
SECTION(Element, ENTRY_COUNT(1), PASSIVE, kExternalFunction,
ENTRY_COUNT(3), U32V_1(0), U32V_1(0), U32V_1(0)),
@@ -2773,14 +3057,14 @@ TEST_F(WasmModuleVerifyTest, PassiveElementSegmentWithIndices) {
TEST_F(WasmModuleVerifyTest, DeclarativeElementSegmentFuncRef) {
static const byte data[] = {
// sig#0 -----------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs -----------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// element segments -----------------------------------------------------
SECTION(Element, // section name
ENTRY_COUNT(1), // entry count
DECLARATIVE_WITH_ELEMENTS, // flags
- kLocalFuncRef, // local type
+ kFuncRefCode, // local type
U32V_1(0)), // func ref count
// code ------------------------------------------------------------------
ONE_EMPTY_BODY};
@@ -2796,7 +3080,7 @@ TEST_F(WasmModuleVerifyTest, DeclarativeElementSegmentWithInvalidIndex) {
WASM_FEATURE_SCOPE(reftypes);
static const byte data[] = {
// sig#0 -----------------------------------------------------------------
- SIGNATURES_SECTION_VOID_VOID,
+ TYPE_SECTION_ONE_SIG_VOID_VOID,
// funcs -----------------------------------------------------------------
ONE_EMPTY_FUNCTION(SIG_INDEX(0)),
// element segments -----------------------------------------------------
@@ -2844,9 +3128,8 @@ TEST_F(WasmModuleVerifyTest, DataCountSectionAfterStartBeforeElement) {
// We need the start section for this test, but the start section must
// reference a valid function, which requires the type and function
// sections too.
- SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // Type section.
- FUNCTION_SIGNATURES_SECTION(1, 0), // Function section.
-
+ TYPE_SECTION(1, SIG_ENTRY_v_v), // Type section.
+ FUNCTION_SECTION(1, 0), // Function section.
SECTION(Start, U32V_1(0)), // Start section.
SECTION(DataCount, ENTRY_COUNT(0)), // DataCount section.
SECTION(Element, ENTRY_COUNT(0)) // Element section.
@@ -2912,7 +3195,7 @@ TEST_F(WasmModuleVerifyTest, GcStructIdsPass) {
static const byte data[] = {SECTION(
Type, ENTRY_COUNT(3),
- WASM_STRUCT_DEF(FIELD_COUNT(3), STRUCT_FIELD(kLocalI32, true),
+ WASM_STRUCT_DEF(FIELD_COUNT(3), STRUCT_FIELD(kI32Code, true),
STRUCT_FIELD(WASM_OPT_REF(0), true),
STRUCT_FIELD(WASM_OPT_REF(1), true)),
WASM_STRUCT_DEF(FIELD_COUNT(2), STRUCT_FIELD(WASM_OPT_REF(0), true),
@@ -2925,8 +3208,8 @@ TEST_F(WasmModuleVerifyTest, GcStructIdsPass) {
TEST_F(WasmModuleVerifyTest, OutOfBoundsTypeInGlobal) {
WASM_FEATURE_SCOPE(reftypes);
WASM_FEATURE_SCOPE(typed_funcref);
- static const byte data[] = {SECTION(Global, ENTRY_COUNT(1), kLocalRef, 0,
- WASM_REF_NULL(0), kExprEnd)};
+ static const byte data[] = {
+ SECTION(Global, ENTRY_COUNT(1), kRefCode, 0, WASM_REF_NULL(0), kExprEnd)};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "Type index 0 is out of bounds");
}
@@ -2937,7 +3220,7 @@ TEST_F(WasmModuleVerifyTest, OutOfBoundsTypeInType) {
WASM_FEATURE_SCOPE(gc);
static const byte data[] = {
SECTION(Type, ENTRY_COUNT(1),
- WASM_STRUCT_DEF(FIELD_COUNT(1), STRUCT_FIELD(kLocalRef, true)))};
+ WASM_STRUCT_DEF(FIELD_COUNT(1), STRUCT_FIELD(kRefCode, true)))};
ModuleResult result = DecodeModule(data, data + sizeof(data));
EXPECT_NOT_OK(result, "Type index 1 is out of bounds");
}
@@ -2948,7 +3231,7 @@ TEST_F(WasmModuleVerifyTest, IllegalPackedFields) {
WASM_FEATURE_SCOPE(reftypes);
static const byte data[] = {
- SECTION(Global, ENTRY_COUNT(1), kLocalI16, 0, WASM_INIT_EXPR_I32V_1(13))};
+ SECTION(Global, ENTRY_COUNT(1), kI16Code, 0, WASM_INIT_EXPR_I32V_1(13))};
ModuleResult result = DecodeModule(data, data + sizeof(data));
@@ -2979,12 +3262,12 @@ TEST_F(WasmModuleVerifyTest, IllegalPackedFields) {
#undef CHECK_LEB1
#undef ADD_COUNT
#undef SECTION
-#undef SIGNATURES_SECTION
-#undef FUNCTION_SIGNATURES_SECTION
+#undef TYPE_SECTION
+#undef FUNCTION_SECTION
#undef FOO_STRING
#undef NO_LOCAL_NAMES
-#undef EMPTY_SIGNATURES_SECTION
-#undef EMPTY_FUNCTION_SIGNATURES_SECTION
+#undef EMPTY_TYPE_SECTION
+#undef EMPTY_FUNCTION_SECTION
#undef EMPTY_FUNCTION_BODIES_SECTION
#undef SECTION_NAMES
#undef EMPTY_NAMES_SECTION
@@ -3003,7 +3286,7 @@ TEST_F(WasmModuleVerifyTest, IllegalPackedFields) {
#undef TWO_EMPTY_BODIES
#undef THREE_EMPTY_BODIES
#undef FOUR_EMPTY_BODIES
-#undef SIGNATURES_SECTION_VOID_VOID
+#undef TYPE_SECTION_ONE_SIG_VOID_VOID
#undef LINEAR_MEMORY_INDEX_0
#undef FIELD_COUNT
diff --git a/deps/v8/test/unittests/wasm/subtyping-unittest.cc b/deps/v8/test/unittests/wasm/subtyping-unittest.cc
index 8be7f808e8..5b43924493 100644
--- a/deps/v8/test/unittests/wasm/subtyping-unittest.cc
+++ b/deps/v8/test/unittests/wasm/subtyping-unittest.cc
@@ -35,20 +35,25 @@ void DefineArray(WasmModule* module, FieldInit element_type) {
TEST_F(WasmSubtypingTest, Subtyping) {
v8::internal::AccountingAllocator allocator;
- WasmModule module_(std::make_unique<Zone>(&allocator, ZONE_NAME));
-
- WasmModule* module = &module_;
-
- /* 0 */ DefineStruct(module, {mut(ref(2)), immut(optRef(2))});
- /* 1 */ DefineStruct(module, {mut(ref(2)), immut(ref(2))});
- /* 2 */ DefineArray(module, immut(ref(0)));
- /* 3 */ DefineArray(module, immut(ref(1)));
- /* 4 */ DefineStruct(module, {mut(ref(2)), immut(ref(3)), immut(kWasmF64)});
- /* 5 */ DefineStruct(module, {mut(optRef(2)), immut(ref(2))});
- /* 6 */ DefineArray(module, mut(kWasmI32));
- /* 7 */ DefineArray(module, immut(kWasmI32));
- /* 8 */ DefineStruct(module, {mut(kWasmI32), immut(optRef(8))});
- /* 9 */ DefineStruct(module, {mut(kWasmI32), immut(optRef(8))});
+ WasmModule module1_(std::make_unique<Zone>(&allocator, ZONE_NAME));
+ WasmModule module2_(std::make_unique<Zone>(&allocator, ZONE_NAME));
+
+ WasmModule* module1 = &module1_;
+ WasmModule* module2 = &module2_;
+
+ // Set up two identical modules.
+ for (WasmModule* module : {module1, module2}) {
+ /* 0 */ DefineStruct(module, {mut(ref(2)), immut(optRef(2))});
+ /* 1 */ DefineStruct(module, {mut(ref(2)), immut(ref(2))});
+ /* 2 */ DefineArray(module, immut(ref(0)));
+ /* 3 */ DefineArray(module, immut(ref(1)));
+ /* 4 */ DefineStruct(module, {mut(ref(2)), immut(ref(3)), immut(kWasmF64)});
+ /* 5 */ DefineStruct(module, {mut(optRef(2)), immut(ref(2))});
+ /* 6 */ DefineArray(module, mut(kWasmI32));
+ /* 7 */ DefineArray(module, immut(kWasmI32));
+ /* 8 */ DefineStruct(module, {mut(kWasmI32), immut(optRef(8))});
+ /* 9 */ DefineStruct(module, {mut(kWasmI32), immut(optRef(8))});
+ }
ValueType numeric_types[] = {kWasmI32, kWasmI64, kWasmF32, kWasmF64,
kWasmS128};
@@ -56,65 +61,87 @@ TEST_F(WasmSubtypingTest, Subtyping) {
kWasmEqRef, kWasmI31Ref, optRef(0),
ref(0), optRef(2), ref(2)};
- // Value types are unrelated, except if they are equal.
- for (ValueType subtype : numeric_types) {
- for (ValueType supertype : numeric_types) {
- CHECK_EQ(IsSubtypeOf(subtype, supertype, module), subtype == supertype);
+ // Type judgements across modules should work the same as within one module.
+ for (WasmModule* module : {module1, module2}) {
+ // Value types are unrelated, except if they are equal.
+ for (ValueType subtype : numeric_types) {
+ for (ValueType supertype : numeric_types) {
+ CHECK_EQ(IsSubtypeOf(subtype, supertype, module1, module),
+ subtype == supertype);
+ }
}
- }
- // Value types are unrelated with reference types.
- for (ValueType value_type : numeric_types) {
- for (ValueType ref_type : ref_types) {
- CHECK(!IsSubtypeOf(value_type, ref_type, module));
- CHECK(!IsSubtypeOf(ref_type, value_type, module));
+ // Value types are unrelated with reference types.
+ for (ValueType value_type : numeric_types) {
+ for (ValueType ref_type : ref_types) {
+ CHECK(!IsSubtypeOf(value_type, ref_type, module1, module));
+ CHECK(!IsSubtypeOf(ref_type, value_type, module1, module));
+ }
}
- }
- for (ValueType ref_type : ref_types) {
- // Concrete reference types and i31ref are subtypes of eqref,
- // exnref/externref/funcref are not.
- CHECK_EQ(IsSubtypeOf(ref_type, kWasmEqRef, module),
- ref_type != kWasmFuncRef && ref_type != kWasmExternRef &&
- ref_type != kWasmExnRef);
- // Each reference type is a subtype of itself.
- CHECK(IsSubtypeOf(ref_type, ref_type, module));
- }
+ for (ValueType ref_type : ref_types) {
+ // Concrete reference types and i31ref are subtypes of eqref,
+ // exnref/externref/funcref are not.
+ CHECK_EQ(IsSubtypeOf(ref_type, kWasmEqRef, module1, module),
+ ref_type != kWasmFuncRef && ref_type != kWasmExternRef &&
+ ref_type != kWasmExnRef);
+ // Each reference type is a subtype of itself.
+ CHECK(IsSubtypeOf(ref_type, ref_type, module1, module));
+ }
- // The rest of ref. types are unrelated.
- for (ValueType type_1 :
- {kWasmExternRef, kWasmFuncRef, kWasmExnRef, kWasmI31Ref}) {
- for (ValueType type_2 :
+ // The rest of ref. types are unrelated.
+ for (ValueType type_1 :
{kWasmExternRef, kWasmFuncRef, kWasmExnRef, kWasmI31Ref}) {
- CHECK_EQ(IsSubtypeOf(type_1, type_2, module), type_1 == type_2);
+ for (ValueType type_2 :
+ {kWasmExternRef, kWasmFuncRef, kWasmExnRef, kWasmI31Ref}) {
+ CHECK_EQ(IsSubtypeOf(type_1, type_2, module1, module),
+ type_1 == type_2);
+ }
}
- }
- // Unrelated refs are unrelated.
- CHECK(!IsSubtypeOf(ref(0), ref(2), module));
- CHECK(!IsSubtypeOf(optRef(3), optRef(1), module));
- // ref is a subtype of optref for the same struct/array.
- CHECK(IsSubtypeOf(ref(0), optRef(0), module));
- CHECK(IsSubtypeOf(ref(2), optRef(2), module));
- // optref is not a subtype of ref for the same struct/array.
- CHECK(!IsSubtypeOf(optRef(0), ref(0), module));
- CHECK(!IsSubtypeOf(optRef(2), ref(2), module));
- // ref is a subtype of optref if the same is true for the underlying
- // structs/arrays.
- CHECK(IsSubtypeOf(ref(3), optRef(2), module));
- // Prefix subtyping for structs.
- CHECK(IsSubtypeOf(optRef(4), optRef(0), module));
- // Mutable fields are invariant.
- CHECK(!IsSubtypeOf(ref(0), ref(5), module));
- // Immutable fields are covariant.
- CHECK(IsSubtypeOf(ref(1), ref(0), module));
- // Prefix subtyping + immutable field covariance for structs.
- CHECK(IsSubtypeOf(optRef(4), optRef(1), module));
- // No subtyping between mutable/immutable fields.
- CHECK(!IsSubtypeOf(ref(7), ref(6), module));
- CHECK(!IsSubtypeOf(ref(6), ref(7), module));
- // Recursive types.
- CHECK(IsSubtypeOf(ref(9), ref(8), module));
+ // Unrelated refs are unrelated.
+ CHECK(!IsSubtypeOf(ref(0), ref(2), module1, module));
+ CHECK(!IsSubtypeOf(optRef(3), optRef(1), module1, module));
+ // ref is a subtype of optref for the same struct/array.
+ CHECK(IsSubtypeOf(ref(0), optRef(0), module1, module));
+ CHECK(IsSubtypeOf(ref(2), optRef(2), module1, module));
+ // optref is not a subtype of ref for the same struct/array.
+ CHECK(!IsSubtypeOf(optRef(0), ref(0), module1, module));
+ CHECK(!IsSubtypeOf(optRef(2), ref(2), module1, module));
+ // ref is a subtype of optref if the same is true for the underlying
+ // structs/arrays.
+ CHECK(IsSubtypeOf(ref(3), optRef(2), module1, module));
+ // Prefix subtyping for structs.
+ CHECK(IsSubtypeOf(optRef(4), optRef(0), module1, module));
+ // Mutable fields are invariant.
+ CHECK(!IsSubtypeOf(ref(0), ref(5), module1, module));
+ // Immutable fields are covariant.
+ CHECK(IsSubtypeOf(ref(1), ref(0), module1, module));
+ // Prefix subtyping + immutable field covariance for structs.
+ CHECK(IsSubtypeOf(optRef(4), optRef(1), module1, module));
+ // No subtyping between mutable/immutable fields.
+ CHECK(!IsSubtypeOf(ref(7), ref(6), module1, module));
+ CHECK(!IsSubtypeOf(ref(6), ref(7), module1, module));
+ // Recursive types.
+ CHECK(IsSubtypeOf(ref(9), ref(8), module1, module));
+
+ // Identical rtts are subtypes of each other.
+ CHECK(IsSubtypeOf(ValueType::Rtt(5, 3), ValueType::Rtt(5, 3), module1,
+ module2));
+ CHECK(IsSubtypeOf(ValueType::Rtt(HeapType::kExn, 3),
+ ValueType::Rtt(HeapType::kExn, 3), module1, module2));
+ // Rtts of different depth are unrelated.
+ CHECK(!IsSubtypeOf(ValueType::Rtt(5, 1), ValueType::Rtt(5, 3), module1,
+ module2));
+ CHECK(!IsSubtypeOf(ValueType::Rtt(5, 8), ValueType::Rtt(5, 3), module1,
+ module2));
+ // Rtts of identical types are subtype-related.
+ CHECK(IsSubtypeOf(ValueType::Rtt(8, 1), ValueType::Rtt(9, 1), module1,
+ module));
+ // Rtts of subtypes are not related.
+ CHECK(!IsSubtypeOf(ValueType::Rtt(1, 1), ValueType::Rtt(0, 1), module1,
+ module));
+ }
}
} // namespace subtyping_unittest
diff --git a/deps/v8/test/wasm-js/testcfg.py b/deps/v8/test/wasm-js/testcfg.py
index 63fa3a69d8..2a7843430b 100644
--- a/deps/v8/test/wasm-js/testcfg.py
+++ b/deps/v8/test/wasm-js/testcfg.py
@@ -34,6 +34,11 @@ proposal_flags = [{
'flags': ['--experimental-wasm-tail-call',
'--wasm-staging']
},
+ {
+ 'name': 'simd',
+ 'flags': ['--experimental-wasm-simd',
+ '--wasm-staging']
+ },
]
diff --git a/deps/v8/test/wasm-js/tests.tar.gz.sha1 b/deps/v8/test/wasm-js/tests.tar.gz.sha1
index 254ed634cc..a3ee7c7f95 100644
--- a/deps/v8/test/wasm-js/tests.tar.gz.sha1
+++ b/deps/v8/test/wasm-js/tests.tar.gz.sha1
@@ -1 +1 @@
-3bc1c30d8286fef436d08e5cbe5508ddb4e69ad6 \ No newline at end of file
+a7c9db6002250f90f4b316649b2915791ff389a8 \ No newline at end of file
diff --git a/deps/v8/test/wasm-js/wasm-js.status b/deps/v8/test/wasm-js/wasm-js.status
index 22c9659309..7d05f23747 100644
--- a/deps/v8/test/wasm-js/wasm-js.status
+++ b/deps/v8/test/wasm-js/wasm-js.status
@@ -35,11 +35,11 @@
'constructor/instantiate': [SKIP],
}], # 'arch == s390 or arch == s390x or system == aix'
-['mode == debug or simulator_run or variant != default or arch == arm', {
+['mode == debug or simulator_run or variant != default or arch == arm or tsan or msan or asan', {
# Slow, and we always have the same limits anyway.
# ODroid bots don't have enough memory to run the test.
'limits': [SKIP],
-}], # mode == debug or simulator_run or variant != default or arch == arm
+}], # mode == debug or simulator_run or variant != default or arch == arm or tsan or msan or asan
##############################################################################
['lite_mode or variant == jitless', {
diff --git a/deps/v8/test/wasm-spec-tests/testcfg.py b/deps/v8/test/wasm-spec-tests/testcfg.py
index cfdbdd76bc..6d4f139a2e 100644
--- a/deps/v8/test/wasm-spec-tests/testcfg.py
+++ b/deps/v8/test/wasm-spec-tests/testcfg.py
@@ -27,6 +27,11 @@ proposal_flags = [{
'flags': ['--experimental-wasm-return-call',
'--wasm-staging']
},
+ {
+ 'name': 'simd',
+ 'flags': ['--experimental-wasm-simd',
+ '--wasm-staging']
+ },
]
class TestLoader(testsuite.JSTestLoader):
diff --git a/deps/v8/test/wasm-spec-tests/tests.tar.gz.sha1 b/deps/v8/test/wasm-spec-tests/tests.tar.gz.sha1
index 33377258e0..a2b0da9da5 100644
--- a/deps/v8/test/wasm-spec-tests/tests.tar.gz.sha1
+++ b/deps/v8/test/wasm-spec-tests/tests.tar.gz.sha1
@@ -1 +1 @@
-342913732440647d224359974191e907f810123f \ No newline at end of file
+d4b9b276a7d0608e3a9bb2d62e6d2b877d05da0c \ No newline at end of file
diff --git a/deps/v8/test/wasm-spec-tests/wasm-spec-tests.status b/deps/v8/test/wasm-spec-tests/wasm-spec-tests.status
index b6a698b016..88f3c9a9f3 100644
--- a/deps/v8/test/wasm-spec-tests/wasm-spec-tests.status
+++ b/deps/v8/test/wasm-spec-tests/wasm-spec-tests.status
@@ -5,6 +5,11 @@
[
[ALWAYS, {
'skip-stack-guard-page': [PASS, ['((arch == ppc or arch == ppc64 or arch == s390 or arch == s390x) and simulator_run)', SKIP]],
+ # TODO(wasm) Investigate failing spec tests after update.
+ 'binary': [FAIL],
+ 'proposals/js-types/binary-leb128': [FAIL],
+ 'proposals/bulk-memory-operations/binary': [FAIL],
+ 'proposals/bulk-memory-operations/binary-leb128': [FAIL],
# TODO(v8:9144): The MVP behavior when bounds-checking segments changed in
# the bulk-memory proposal. Since we've enabled bulk-memory by default, we
@@ -31,8 +36,25 @@
# This test requires the reftypes flag to be disabled.
'proposals/bulk-memory-operations/imports': [FAIL],
+
+ # SIMD test cases
+ # Scalar lowering is incomplete, we skip these and selectively enable as
+ # we finish the implementation, see v8:10507.
+ 'proposals/simd/simd_conversions' : [PASS, FAIL],
+ 'proposals/simd/simd_lane' : [PASS, FAIL],
+
}], # ALWAYS
+['arch == arm and not simulator_run', {
+ # See https://crbug.com/v8/10938 denormals not handled correctly on ARM.
+ 'proposals/simd/simd_f32x4': [PASS, FAIL],
+ 'proposals/simd/simd_f32x4_arith': [PASS, FAIL],
+ 'proposals/simd/simd_f32x4_cmp': [PASS, FAIL],
+ # This test only has 1 problematic use of f32x4.min and f32x4.div, consider
+ # removing it from upstream, then we can run this test.
+ 'proposals/simd/simd_splat' : [PASS, FAIL],
+}], # arch == arm and not simulator_run
+
['arch == mipsel or arch == mips64el or arch == mips or arch == mips64', {
# These tests fail because mips does not support the correct NaN bit patterns.
'float_misc': [SKIP],
diff --git a/deps/v8/third_party/jinja2/OWNERS b/deps/v8/third_party/jinja2/OWNERS
index ee2bec9ba3..8861ff8cb3 100644
--- a/deps/v8/third_party/jinja2/OWNERS
+++ b/deps/v8/third_party/jinja2/OWNERS
@@ -3,4 +3,4 @@ haraken@chromium.org
nbarth@chromium.org
# TEAM: platform-architecture-dev@chromium.org
-# COMPONENT: Blink>Internals
+# COMPONENT: Blink>Bindings
diff --git a/deps/v8/third_party/v8/builtins/array-sort.tq b/deps/v8/third_party/v8/builtins/array-sort.tq
index 03af91af95..ea7c0e7dc9 100644
--- a/deps/v8/third_party/v8/builtins/array-sort.tq
+++ b/deps/v8/third_party/v8/builtins/array-sort.tq
@@ -294,7 +294,7 @@ Store<FastDoubleElements>(
const elements = UnsafeCast<FixedDoubleArray>(object.elements);
const heapVal = UnsafeCast<HeapNumber>(value);
const val = Convert<float64>(heapVal);
- StoreFixedDoubleArrayElementSmi(elements, index, val);
+ StoreFixedDoubleArrayElement(elements, index, val);
return kSuccess;
}
diff --git a/deps/v8/third_party/zlib/BUILD.gn b/deps/v8/third_party/zlib/BUILD.gn
index 50540d97ae..34d8c0a61f 100644
--- a/deps/v8/third_party/zlib/BUILD.gn
+++ b/deps/v8/third_party/zlib/BUILD.gn
@@ -29,6 +29,20 @@ config("zlib_internal_config") {
}
}
+source_set("zlib_common_headers") {
+ sources = [
+ "chromeconf.h",
+ "deflate.h",
+ "inffast.h",
+ "inffixed.h",
+ "inflate.h",
+ "inftrees.h",
+ "zconf.h",
+ "zlib.h",
+ "zutil.h",
+ ]
+}
+
use_arm_neon_optimizations = false
if ((current_cpu == "arm" || current_cpu == "arm64") &&
!(is_win && !is_clang)) {
@@ -81,6 +95,8 @@ source_set("zlib_adler32_simd") {
configs += [ ":zlib_internal_config" ]
public_configs = [ ":zlib_adler32_simd_config" ]
+
+ public_deps = [ ":zlib_common_headers" ]
}
if (use_arm_neon_optimizations) {
@@ -127,6 +143,8 @@ if (use_arm_neon_optimizations) {
configs += [ ":zlib_internal_config" ]
public_configs = [ ":zlib_arm_crc32_config" ]
+
+ public_deps = [ ":zlib_common_headers" ]
}
}
@@ -170,6 +188,8 @@ source_set("zlib_inflate_chunk_simd") {
configs += [ "//build/config/compiler:no_chromium_code" ]
public_configs = [ ":zlib_inflate_chunk_simd_config" ]
+
+ public_deps = [ ":zlib_common_headers" ]
}
config("zlib_crc32_simd_config") {
@@ -198,6 +218,7 @@ source_set("zlib_crc32_simd") {
configs += [ ":zlib_internal_config" ]
public_configs = [ ":zlib_crc32_simd_config" ]
+ public_deps = [ ":zlib_common_headers" ]
}
config("zlib_x86_simd_config") {
@@ -229,6 +250,8 @@ source_set("zlib_x86_simd") {
configs += [ ":zlib_internal_config" ]
public_configs = [ ":zlib_x86_simd_config" ]
+
+ public_deps = [ ":zlib_common_headers" ]
}
config("zlib_warnings") {
@@ -403,6 +426,7 @@ if (build_with_chromium) {
sources = [
"contrib/tests/infcover.cc",
"contrib/tests/infcover.h",
+ "contrib/tests/run_all_unittests.cc",
"contrib/tests/utils_unittest.cc",
"google/compression_utils_portable.cc",
"google/compression_utils_portable.h",
@@ -410,8 +434,8 @@ if (build_with_chromium) {
deps = [
":zlib",
+ "//base/test:test_support",
"//testing/gtest",
- "//testing/gtest:gtest_main",
]
include_dirs = [
diff --git a/deps/v8/third_party/zlib/DEPS b/deps/v8/third_party/zlib/DEPS
deleted file mode 100644
index b6dcfc6bc1..0000000000
--- a/deps/v8/third_party/zlib/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
- "+testing/gtest",
-] \ No newline at end of file
diff --git a/deps/v8/third_party/zlib/deflate.c b/deps/v8/third_party/zlib/deflate.c
index 1597196b08..8bf93e5248 100644
--- a/deps/v8/third_party/zlib/deflate.c
+++ b/deps/v8/third_party/zlib/deflate.c
@@ -60,6 +60,11 @@
#include "crc32_simd.h"
#endif
+#ifdef FASTEST
+/* See http://crbug.com/1113596 */
+#error "FASTEST is not supported in Chromium's zlib."
+#endif
+
const char deflate_copyright[] =
" deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
/*
@@ -304,10 +309,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
s->w_size = 1 << s->w_bits;
s->w_mask = s->w_size - 1;
- if (x86_cpu_enable_simd) {
+ s->hash_bits = memLevel + 7;
+ if ((x86_cpu_enable_simd || arm_cpu_enable_crc32) && s->hash_bits < 15) {
s->hash_bits = 15;
- } else {
- s->hash_bits = memLevel + 7;
}
s->hash_size = 1 << s->hash_bits;
@@ -1346,7 +1350,16 @@ local uInt longest_match(s, cur_match)
* necessary to put more guard bytes at the end of the window, or
* to check more often for insufficient lookahead.
*/
- Assert(scan[2] == match[2], "scan[2]?");
+ if (!x86_cpu_enable_simd && !arm_cpu_enable_crc32) {
+ Assert(scan[2] == match[2], "scan[2]?");
+ } else {
+ /* When using CRC hashing, scan[2] and match[2] may mismatch, but in
+ * that case at least one of the other hashed bytes will mismatch
+ * also. Bytes 0 and 1 were already checked above, and we know there
+ * are at least four bytes to check otherwise the mismatch would have
+ * been found by the scan_end comparison above, so: */
+ Assert(scan[2] == match[2] || scan[3] != match[3], "scan[2]??");
+ }
scan++, match++;
do {
} while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
@@ -1377,7 +1390,16 @@ local uInt longest_match(s, cur_match)
* the hash keys are equal and that HASH_BITS >= 8.
*/
scan += 2, match++;
- Assert(*scan == *match, "match[2]?");
+ if (!x86_cpu_enable_simd && !arm_cpu_enable_crc32) {
+ Assert(*scan == *match, "match[2]?");
+ } else {
+ /* When using CRC hashing, scan[2] and match[2] may mismatch, but in
+ * that case at least one of the other hashed bytes will mismatch
+ * also. Bytes 0 and 1 were already checked above, and we know there
+ * are at least four bytes to check otherwise the mismatch would have
+ * been found by the scan_end comparison above, so: */
+ Assert(*scan == *match || scan[1] != match[1], "match[2]??");
+ }
/* We check for insufficient lookahead only every 8th comparison;
* the 256th check will be made at strstart+258.
@@ -2038,7 +2060,13 @@ local block_state deflate_slow(s, flush)
uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
/* Do not insert strings in hash table beyond this. */
- check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+ if (s->prev_match == -1) {
+ /* The window has slid one byte past the previous match,
+ * so the first byte cannot be compared. */
+ check_match(s, s->strstart, s->prev_match+1, s->prev_length-1);
+ } else {
+ check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+ }
_tr_tally_dist(s, s->strstart -1 - s->prev_match,
s->prev_length - MIN_MATCH, bflush);
diff --git a/deps/v8/third_party/zlib/patches/0006-fix-check_match.patch b/deps/v8/third_party/zlib/patches/0006-fix-check_match.patch
new file mode 100644
index 0000000000..b21c363b1e
--- /dev/null
+++ b/deps/v8/third_party/zlib/patches/0006-fix-check_match.patch
@@ -0,0 +1,42 @@
+From 8304bdda5293ffd5b3efce8e4f54904b387029d6 Mon Sep 17 00:00:00 2001
+From: Hans Wennborg <hans@chromium.org>
+Date: Wed, 23 Sep 2020 16:36:38 +0200
+Subject: [PATCH] Avoid crashing in check_match when prev_match == -1
+
+prev_match can be set to -1 after sliding the window. In that case, the
+window has slid past the first byte of the last match, which means it
+cannot be compared in check_match.
+
+This would cause zlib to crash on some inputs to deflate when built
+with ZLIB_DEBUG enabled.
+
+Check for this situation and avoid crashing by not trying to compare
+the first byte.
+
+Bug: 1113142
+---
+ third_party/zlib/deflate.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
+index cfdd2f46b230..d70732ec6fc2 100644
+--- a/third_party/zlib/deflate.c
++++ b/third_party/zlib/deflate.c
+@@ -2060,7 +2060,13 @@ local block_state deflate_slow(s, flush)
+ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+ /* Do not insert strings in hash table beyond this. */
+
+- check_match(s, s->strstart-1, s->prev_match, s->prev_length);
++ if (s->prev_match == -1) {
++ /* The window has slid one byte past the previous match,
++ * so the first byte cannot be compared. */
++ check_match(s, s->strstart, s->prev_match+1, s->prev_length-1);
++ } else {
++ check_match(s, s->strstart-1, s->prev_match, s->prev_length);
++ }
+
+ _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+ s->prev_length - MIN_MATCH, bflush);
+--
+2.28.0.681.g6f77f65b4e-goog
+
diff --git a/deps/v8/tools/android-sync.sh b/deps/v8/tools/android-sync.sh
index dc93746538..709bbb7f7d 100755
--- a/deps/v8/tools/android-sync.sh
+++ b/deps/v8/tools/android-sync.sh
@@ -102,7 +102,6 @@ sync_file tools/logreader.js
sync_file tools/arguments.js
sync_file tools/tickprocessor.js
echo ""
-sync_dir tools/profviz
sync_dir test/intl
sync_dir test/message
sync_dir test/mjsunit
diff --git a/deps/v8/tools/arguments.mjs b/deps/v8/tools/arguments.mjs
new file mode 100644
index 0000000000..232ca6badb
--- /dev/null
+++ b/deps/v8/tools/arguments.mjs
@@ -0,0 +1,78 @@
+// Copyright 2017 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+export class BaseArgumentsProcessor {
+ constructor(args) {
+ this.args_ = args;
+ this.result_ = this.getDefaultResults();
+ console.assert(this.result_ !== undefined)
+ console.assert(this.result_.logFileName !== undefined);
+ this.argsDispatch_ = this.getArgsDispatch();
+ console.assert(this.argsDispatch_ !== undefined);
+ }
+
+ getDefaultResults() {
+ throw "Implement in getDefaultResults in subclass";
+ }
+
+ getArgsDispatch() {
+ throw "Implement getArgsDispatch in subclass";
+ }
+
+ result() { return this.result_ }
+
+ printUsageAndExit() {
+ print('Cmdline args: [options] [log-file-name]\n' +
+ 'Default log file name is "' +
+ this.result_.logFileName + '".\n');
+ print('Options:');
+ for (var arg in this.argsDispatch_) {
+ var synonyms = [arg];
+ var dispatch = this.argsDispatch_[arg];
+ for (var synArg in this.argsDispatch_) {
+ if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) {
+ synonyms.push(synArg);
+ delete this.argsDispatch_[synArg];
+ }
+ }
+ print(' ' + synonyms.join(', ').padEnd(20) + " " + dispatch[2]);
+ }
+ quit(2);
+ }
+
+ parse() {
+ while (this.args_.length) {
+ var arg = this.args_.shift();
+ if (arg.charAt(0) != '-') {
+ this.result_.logFileName = arg;
+ continue;
+ }
+ var userValue = null;
+ var eqPos = arg.indexOf('=');
+ if (eqPos != -1) {
+ userValue = arg.substr(eqPos + 1);
+ arg = arg.substr(0, eqPos);
+ }
+ if (arg in this.argsDispatch_) {
+ var dispatch = this.argsDispatch_[arg];
+ var property = dispatch[0];
+ var defaultValue = dispatch[1];
+ if (typeof defaultValue == "function") {
+ userValue = defaultValue(userValue);
+ } else if (userValue == null) {
+ userValue = defaultValue;
+ }
+ this.result_[property] = userValue;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+export function parseBool(str) {
+ if (str == "true" || str == "1") return true;
+ return false;
+}
diff --git a/deps/v8/tools/clusterfuzz/v8_mock.js b/deps/v8/tools/clusterfuzz/v8_mock.js
index ca1336a0df..be7a40b70f 100644
--- a/deps/v8/tools/clusterfuzz/v8_mock.js
+++ b/deps/v8/tools/clusterfuzz/v8_mock.js
@@ -197,3 +197,10 @@ FinalizationRegistry.prototype.register = function(target, holdings) { };
FinalizationRegistry.prototype.unregister = function(unregisterToken) { };
FinalizationRegistry.prototype.cleanupSome = function() { };
FinalizationRegistry.prototype[Symbol.toStringTag] = "FinalizationRegistry";
+
+// Mock the nondeterministic Atomics.waitAsync.
+Atomics.waitAsync = function() {
+ // Return a mock "Promise" whose "then" function will call the callback
+ // immediately.
+ return {'value': {'then': function (f) { f(); }}};
+}
diff --git a/deps/v8/tools/codemap.mjs b/deps/v8/tools/codemap.mjs
new file mode 100644
index 0000000000..fd0fc808ca
--- /dev/null
+++ b/deps/v8/tools/codemap.mjs
@@ -0,0 +1,321 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import { SplayTree } from "./splaytree.mjs";
+
+/**
+ * Constructs a mapper that maps addresses into code entries.
+ *
+ * @constructor
+ */
+export function CodeMap() {
+ /**
+ * Dynamic code entries. Used for JIT compiled code.
+ */
+ this.dynamics_ = new SplayTree();
+
+ /**
+ * Name generator for entries having duplicate names.
+ */
+ this.dynamicsNameGen_ = new CodeMap.NameGenerator();
+
+ /**
+ * Static code entries. Used for statically compiled code.
+ */
+ this.statics_ = new SplayTree();
+
+ /**
+ * Libraries entries. Used for the whole static code libraries.
+ */
+ this.libraries_ = new SplayTree();
+
+ /**
+ * Map of memory pages occupied with static code.
+ */
+ this.pages_ = [];
+};
+
+
+/**
+ * The number of alignment bits in a page address.
+ */
+CodeMap.PAGE_ALIGNMENT = 12;
+
+
+/**
+ * Page size in bytes.
+ */
+CodeMap.PAGE_SIZE =
+ 1 << CodeMap.PAGE_ALIGNMENT;
+
+
+/**
+ * Adds a dynamic (i.e. moveable and discardable) code entry.
+ *
+ * @param {number} start The starting address.
+ * @param {CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+CodeMap.prototype.addCode = function(start, codeEntry) {
+ this.deleteAllCoveredNodes_(this.dynamics_, start, start + codeEntry.size);
+ this.dynamics_.insert(start, codeEntry);
+};
+
+
+/**
+ * Moves a dynamic code entry. Throws an exception if there is no dynamic
+ * code entry with the specified starting address.
+ *
+ * @param {number} from The starting address of the entry being moved.
+ * @param {number} to The destination address.
+ */
+CodeMap.prototype.moveCode = function(from, to) {
+ var removedNode = this.dynamics_.remove(from);
+ this.deleteAllCoveredNodes_(this.dynamics_, to, to + removedNode.value.size);
+ this.dynamics_.insert(to, removedNode.value);
+};
+
+
+/**
+ * Discards a dynamic code entry. Throws an exception if there is no dynamic
+ * code entry with the specified starting address.
+ *
+ * @param {number} start The starting address of the entry being deleted.
+ */
+CodeMap.prototype.deleteCode = function(start) {
+ var removedNode = this.dynamics_.remove(start);
+};
+
+
+/**
+ * Adds a library entry.
+ *
+ * @param {number} start The starting address.
+ * @param {CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+CodeMap.prototype.addLibrary = function(
+ start, codeEntry) {
+ this.markPages_(start, start + codeEntry.size);
+ this.libraries_.insert(start, codeEntry);
+};
+
+
+/**
+ * Adds a static code entry.
+ *
+ * @param {number} start The starting address.
+ * @param {CodeMap.CodeEntry} codeEntry Code entry object.
+ */
+CodeMap.prototype.addStaticCode = function(
+ start, codeEntry) {
+ this.statics_.insert(start, codeEntry);
+};
+
+
+/**
+ * @private
+ */
+CodeMap.prototype.markPages_ = function(start, end) {
+ for (var addr = start; addr <= end;
+ addr += CodeMap.PAGE_SIZE) {
+ this.pages_[(addr / CodeMap.PAGE_SIZE)|0] = 1;
+ }
+};
+
+
+/**
+ * @private
+ */
+CodeMap.prototype.deleteAllCoveredNodes_ = function(tree, start, end) {
+ var to_delete = [];
+ var addr = end - 1;
+ while (addr >= start) {
+ var node = tree.findGreatestLessThan(addr);
+ if (!node) break;
+ var start2 = node.key, end2 = start2 + node.value.size;
+ if (start2 < end && start < end2) to_delete.push(start2);
+ addr = start2 - 1;
+ }
+ for (var i = 0, l = to_delete.length; i < l; ++i) tree.remove(to_delete[i]);
+};
+
+
+/**
+ * @private
+ */
+CodeMap.prototype.isAddressBelongsTo_ = function(addr, node) {
+ return addr >= node.key && addr < (node.key + node.value.size);
+};
+
+
+/**
+ * @private
+ */
+CodeMap.prototype.findInTree_ = function(tree, addr) {
+ var node = tree.findGreatestLessThan(addr);
+ return node && this.isAddressBelongsTo_(addr, node) ? node : null;
+};
+
+
+/**
+ * Finds a code entry that contains the specified address. Both static and
+ * dynamic code entries are considered. Returns the code entry and the offset
+ * within the entry.
+ *
+ * @param {number} addr Address.
+ */
+CodeMap.prototype.findAddress = function(addr) {
+ var pageAddr = (addr / CodeMap.PAGE_SIZE)|0;
+ if (pageAddr in this.pages_) {
+ // Static code entries can contain "holes" of unnamed code.
+ // In this case, the whole library is assigned to this address.
+ var result = this.findInTree_(this.statics_, addr);
+ if (!result) {
+ result = this.findInTree_(this.libraries_, addr);
+ if (!result) return null;
+ }
+ return { entry : result.value, offset : addr - result.key };
+ }
+ var min = this.dynamics_.findMin();
+ var max = this.dynamics_.findMax();
+ if (max != null && addr < (max.key + max.value.size) && addr >= min.key) {
+ var dynaEntry = this.findInTree_(this.dynamics_, addr);
+ if (dynaEntry == null) return null;
+ // Dedupe entry name.
+ var entry = dynaEntry.value;
+ if (!entry.nameUpdated_) {
+ entry.name = this.dynamicsNameGen_.getName(entry.name);
+ entry.nameUpdated_ = true;
+ }
+ return { entry : entry, offset : addr - dynaEntry.key };
+ }
+ return null;
+};
+
+
+/**
+ * Finds a code entry that contains the specified address. Both static and
+ * dynamic code entries are considered.
+ *
+ * @param {number} addr Address.
+ */
+CodeMap.prototype.findEntry = function(addr) {
+ var result = this.findAddress(addr);
+ return result ? result.entry : null;
+};
+
+
+/**
+ * Returns a dynamic code entry using its starting address.
+ *
+ * @param {number} addr Address.
+ */
+CodeMap.prototype.findDynamicEntryByStartAddress =
+ function(addr) {
+ var node = this.dynamics_.find(addr);
+ return node ? node.value : null;
+};
+
+
+/**
+ * Returns an array of all dynamic code entries.
+ */
+CodeMap.prototype.getAllDynamicEntries = function() {
+ return this.dynamics_.exportValues();
+};
+
+
+/**
+ * Returns an array of pairs of all dynamic code entries and their addresses.
+ */
+CodeMap.prototype.getAllDynamicEntriesWithAddresses = function() {
+ return this.dynamics_.exportKeysAndValues();
+};
+
+
+/**
+ * Returns an array of all static code entries.
+ */
+CodeMap.prototype.getAllStaticEntries = function() {
+ return this.statics_.exportValues();
+};
+
+
+/**
+ * Returns an array of pairs of all static code entries and their addresses.
+ */
+CodeMap.prototype.getAllStaticEntriesWithAddresses = function() {
+ return this.statics_.exportKeysAndValues();
+};
+
+
+/**
+ * Returns an array of all libraries entries.
+ */
+CodeMap.prototype.getAllLibrariesEntries = function() {
+ return this.libraries_.exportValues();
+};
+
+
+/**
+ * Creates a code entry object.
+ *
+ * @param {number} size Code entry size in bytes.
+ * @param {string} opt_name Code entry name.
+ * @param {string} opt_type Code entry type, e.g. SHARED_LIB, CPP.
+ * @constructor
+ */
+CodeMap.CodeEntry = function(size, opt_name, opt_type) {
+ this.size = size;
+ this.name = opt_name || '';
+ this.type = opt_type || '';
+ this.nameUpdated_ = false;
+};
+
+
+CodeMap.CodeEntry.prototype.getName = function() {
+ return this.name;
+};
+
+
+CodeMap.CodeEntry.prototype.toString = function() {
+ return this.name + ': ' + this.size.toString(16);
+};
+
+
+CodeMap.NameGenerator = function() {
+ this.knownNames_ = {};
+};
+
+
+CodeMap.NameGenerator.prototype.getName = function(name) {
+ if (!(name in this.knownNames_)) {
+ this.knownNames_[name] = 0;
+ return name;
+ }
+ var count = ++this.knownNames_[name];
+ return name + ' {' + count + '}';
+};
diff --git a/deps/v8/tools/consarray.mjs b/deps/v8/tools/consarray.mjs
new file mode 100644
index 0000000000..450e18f663
--- /dev/null
+++ b/deps/v8/tools/consarray.mjs
@@ -0,0 +1,92 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/**
+ * Constructs a ConsArray object. It is used mainly for tree traversal.
+ * In this use case we have lots of arrays that we need to iterate
+ * sequentally. The internal Array implementation is horribly slow
+ * when concatenating on large (10K items) arrays due to memory copying.
+ * That's why we avoid copying memory and insead build a linked list
+ * of arrays to iterate through.
+ *
+ * @constructor
+ */
+export function ConsArray() {
+ this.tail_ = new ConsArray.Cell(null, null);
+ this.currCell_ = this.tail_;
+ this.currCellPos_ = 0;
+};
+
+
+/**
+ * Concatenates another array for iterating. Empty arrays are ignored.
+ * This operation can be safely performed during ongoing ConsArray
+ * iteration.
+ *
+ * @param {Array} arr Array to concatenate.
+ */
+ConsArray.prototype.concat = function(arr) {
+ if (arr.length > 0) {
+ this.tail_.data = arr;
+ this.tail_ = this.tail_.next = new ConsArray.Cell(null, null);
+ }
+};
+
+
+/**
+ * Whether the end of iteration is reached.
+ */
+ConsArray.prototype.atEnd = function() {
+ return this.currCell_ === null ||
+ this.currCell_.data === null ||
+ this.currCellPos_ >= this.currCell_.data.length;
+};
+
+
+/**
+ * Returns the current item, moves to the next one.
+ */
+ConsArray.prototype.next = function() {
+ var result = this.currCell_.data[this.currCellPos_++];
+ if (this.currCellPos_ >= this.currCell_.data.length) {
+ this.currCell_ = this.currCell_.next;
+ this.currCellPos_ = 0;
+ }
+ return result;
+};
+
+
+/**
+ * A cell object used for constructing a list in ConsArray.
+ *
+ * @constructor
+ */
+ConsArray.Cell = function(data, next) {
+ this.data = data;
+ this.next = next;
+};
diff --git a/deps/v8/tools/csvparser.mjs b/deps/v8/tools/csvparser.mjs
new file mode 100644
index 0000000000..03356d8209
--- /dev/null
+++ b/deps/v8/tools/csvparser.mjs
@@ -0,0 +1,105 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/**
+ * Creates a CSV lines parser.
+ */
+export class CsvParser {
+ /**
+ * Converts \x00 and \u0000 escape sequences in the given string.
+ *
+ * @param {string} input field.
+ **/
+ escapeField(string) {
+ let nextPos = string.indexOf("\\");
+ if (nextPos === -1) return string;
+
+ let result = string.substring(0, nextPos);
+ // Escape sequences of the form \x00 and \u0000;
+ let endPos = string.length;
+ let pos = 0;
+ while (nextPos !== -1) {
+ let escapeIdentifier = string.charAt(nextPos + 1);
+ pos = nextPos + 2;
+ if (escapeIdentifier === 'n') {
+ result += '\n';
+ nextPos = pos;
+ } else if (escapeIdentifier === '\\') {
+ result += '\\';
+ nextPos = pos;
+ } else {
+ if (escapeIdentifier === 'x') {
+ // \x00 ascii range escapes consume 2 chars.
+ nextPos = pos + 2;
+ } else {
+ // \u0000 unicode range escapes consume 4 chars.
+ nextPos = pos + 4;
+ }
+ // Convert the selected escape sequence to a single character.
+ let escapeChars = string.substring(pos, nextPos);
+ result += String.fromCharCode(parseInt(escapeChars, 16));
+ }
+
+ // Continue looking for the next escape sequence.
+ pos = nextPos;
+ nextPos = string.indexOf("\\", pos);
+ // If there are no more escape sequences consume the rest of the string.
+ if (nextPos === -1) {
+ result += string.substr(pos);
+ } else if (pos !== nextPos) {
+ result += string.substring(pos, nextPos);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Parses a line of CSV-encoded values. Returns an array of fields.
+ *
+ * @param {string} line Input line.
+ */
+ parseLine(line) {
+ var pos = 0;
+ var endPos = line.length;
+ var fields = [];
+ if (endPos == 0) return fields;
+ let nextPos = 0;
+ while(nextPos !== -1) {
+ nextPos = line.indexOf(',', pos);
+ let field;
+ if (nextPos === -1) {
+ field = line.substr(pos);
+ } else {
+ field = line.substring(pos, nextPos);
+ }
+ fields.push(this.escapeField(field));
+ pos = nextPos + 1;
+ };
+ return fields
+ }
+}
diff --git a/deps/v8/tools/debug_helper/BUILD.gn b/deps/v8/tools/debug_helper/BUILD.gn
index 522a0e2270..064bc32260 100644
--- a/deps/v8/tools/debug_helper/BUILD.gn
+++ b/deps/v8/tools/debug_helper/BUILD.gn
@@ -37,7 +37,10 @@ action("run_mkgrokdump") {
testonly = true
visibility = [ ":*" ]
- deps = [ "../../test/mkgrokdump:mkgrokdump($v8_generator_toolchain)" ]
+ deps = [
+ "../..:run_mksnapshot_default",
+ "../../test/mkgrokdump:mkgrokdump($v8_generator_toolchain)",
+ ]
script = "../run.py"
@@ -72,9 +75,9 @@ v8_component("v8_debug_helper") {
public = [ "debug-helper.h" ]
sources = [
- "$target_gen_dir/../../torque-generated/class-debug-readers-tq.cc",
- "$target_gen_dir/../../torque-generated/class-debug-readers-tq.h",
- "$target_gen_dir/../../torque-generated/instance-types-tq.h",
+ "$target_gen_dir/../../torque-generated/class-debug-readers.cc",
+ "$target_gen_dir/../../torque-generated/class-debug-readers.h",
+ "$target_gen_dir/../../torque-generated/instance-types.h",
"$target_gen_dir/heap-constants-gen.cc",
"compiler-types.cc",
"debug-helper-internal.cc",
diff --git a/deps/v8/tools/debug_helper/OWNERS b/deps/v8/tools/debug_helper/OWNERS
new file mode 100644
index 0000000000..01f6b8db39
--- /dev/null
+++ b/deps/v8/tools/debug_helper/OWNERS
@@ -0,0 +1 @@
+seth.brenith@microsoft.com
diff --git a/deps/v8/tools/debug_helper/debug-helper-internal.cc b/deps/v8/tools/debug_helper/debug-helper-internal.cc
index c64d0ad58c..29af7ebdd7 100644
--- a/deps/v8/tools/debug_helper/debug-helper-internal.cc
+++ b/deps/v8/tools/debug_helper/debug-helper-internal.cc
@@ -4,7 +4,7 @@
#include "debug-helper-internal.h"
#include "src/common/ptr-compr-inl.h"
-#include "torque-generated/class-debug-readers-tq.h"
+#include "torque-generated/class-debug-readers.h"
namespace i = v8::internal;
diff --git a/deps/v8/tools/debug_helper/debug-helper-internal.h b/deps/v8/tools/debug_helper/debug-helper-internal.h
index c9812b7635..129d0d31a4 100644
--- a/deps/v8/tools/debug_helper/debug-helper-internal.h
+++ b/deps/v8/tools/debug_helper/debug-helper-internal.h
@@ -173,6 +173,37 @@ class ObjectPropertiesResult {
std::vector<const char*> guessed_types_raw_;
};
+class StackFrameResult;
+struct StackFrameResultExtended : public d::StackFrameResult {
+ // Back reference for cleanup.
+ debug_helper_internal::StackFrameResult* base;
+};
+
+// Internal version of API class v8::debug_helper::StackFrameResult.
+class StackFrameResult {
+ public:
+ StackFrameResult(std::vector<std::unique_ptr<ObjectProperty>> properties) {
+ properties_ = std::move(properties);
+ }
+
+ d::StackFrameResult* GetPublicView() {
+ public_view_.num_properties = properties_.size();
+ properties_raw_.clear();
+ for (const auto& property : properties_) {
+ properties_raw_.push_back(property->GetPublicView());
+ }
+ public_view_.properties = properties_raw_.data();
+ public_view_.base = this;
+ return &public_view_;
+ }
+
+ private:
+ std::vector<std::unique_ptr<ObjectProperty>> properties_;
+
+ StackFrameResultExtended public_view_;
+ std::vector<d::ObjectProperty*> properties_raw_;
+};
+
class TqObjectVisitor;
// Base class representing a V8 object in the debuggee's address space.
diff --git a/deps/v8/tools/debug_helper/debug-helper.h b/deps/v8/tools/debug_helper/debug-helper.h
index dc08bf6346..73f4e66a1b 100644
--- a/deps/v8/tools/debug_helper/debug-helper.h
+++ b/deps/v8/tools/debug_helper/debug-helper.h
@@ -144,10 +144,15 @@ struct ObjectPropertiesResult {
const char** guessed_types;
};
+struct StackFrameResult {
+ size_t num_properties;
+ ObjectProperty** properties;
+};
+
// Copies byte_count bytes of memory from the given address in the debuggee to
// the destination buffer.
typedef MemoryAccessResult (*MemoryAccessor)(uintptr_t address,
- uint8_t* destination,
+ void* destination,
size_t byte_count);
// Additional data that can help GetObjectProperties to be more accurate. Any
@@ -193,6 +198,11 @@ _v8_debug_helper_GetObjectProperties(
const char* type_hint);
V8_DEBUG_HELPER_EXPORT void _v8_debug_helper_Free_ObjectPropertiesResult(
v8::debug_helper::ObjectPropertiesResult* result);
+V8_DEBUG_HELPER_EXPORT v8::debug_helper::StackFrameResult*
+_v8_debug_helper_GetStackFrame(
+ uintptr_t frame_pointer, v8::debug_helper::MemoryAccessor memory_accessor);
+V8_DEBUG_HELPER_EXPORT void _v8_debug_helper_Free_StackFrameResult(
+ v8::debug_helper::StackFrameResult* result);
V8_DEBUG_HELPER_EXPORT const v8::debug_helper::ClassList*
_v8_debug_helper_ListObjectClasses();
V8_DEBUG_HELPER_EXPORT const char* _v8_debug_helper_BitsetName(
@@ -237,6 +247,20 @@ inline const char* BitsetName(uint64_t payload) {
return _v8_debug_helper_BitsetName(payload);
}
+struct DebugHelperStackFrameResultDeleter {
+ void operator()(v8::debug_helper::StackFrameResult* ptr) {
+ _v8_debug_helper_Free_StackFrameResult(ptr);
+ }
+};
+using StackFrameResultPtr =
+ std::unique_ptr<StackFrameResult, DebugHelperStackFrameResultDeleter>;
+
+inline StackFrameResultPtr GetStackFrame(
+ uintptr_t frame_pointer, v8::debug_helper::MemoryAccessor memory_accessor) {
+ return StackFrameResultPtr(
+ _v8_debug_helper_GetStackFrame(frame_pointer, memory_accessor));
+}
+
} // namespace debug_helper
} // namespace v8
diff --git a/deps/v8/tools/debug_helper/get-object-properties.cc b/deps/v8/tools/debug_helper/get-object-properties.cc
index 0e8fbf02a6..c920857976 100644
--- a/deps/v8/tools/debug_helper/get-object-properties.cc
+++ b/deps/v8/tools/debug_helper/get-object-properties.cc
@@ -8,10 +8,12 @@
#include "heap-constants.h"
#include "include/v8-internal.h"
#include "src/common/external-pointer.h"
+#include "src/execution/frame-constants.h"
+#include "src/execution/frames.h"
#include "src/execution/isolate-utils.h"
#include "src/objects/string-inl.h"
#include "src/strings/unicode-inl.h"
-#include "torque-generated/class-debug-readers-tq.h"
+#include "torque-generated/class-debug-readers.h"
namespace i = v8::internal;
@@ -331,7 +333,7 @@ class ReadStringVisitor : public TqObjectVisitor {
Isolate::FromRoot(GetIsolateRoot(heap_addresses_.any_heap_pointer)),
resource_data));
#else
- uintptr_t data_address = reinterpret_cast<uintptr_t>(resource_data);
+ uintptr_t data_address = static_cast<uintptr_t>(resource_data);
#endif // V8_COMPRESS_POINTERS
if (done_) return;
ReadStringCharacters<TChar>(object, data_address);
@@ -437,7 +439,7 @@ class ReadStringVisitor : public TqObjectVisitor {
class AddInfoVisitor : public TqObjectVisitor {
public:
// Returns a descriptive string and a list of properties for the given object.
- // Both may be empty, and are meant as an addition to, not a replacement for,
+ // Both may be empty, and are meant as an addition or a replacement for,
// the Torque-generated data about the object.
static std::pair<std::string, std::vector<std::unique_ptr<ObjectProperty>>>
Visit(const TqObject* object, d::MemoryAccessor accessor,
@@ -454,6 +456,22 @@ class AddInfoVisitor : public TqObjectVisitor {
}
}
+ void VisitExternalString(const TqExternalString* object) override {
+ VisitString(object);
+ // Cast resource field to v8::String::ExternalStringResourceBase* would add
+ // more info.
+ properties_.push_back(std::make_unique<ObjectProperty>(
+ "resource",
+ CheckTypeName<v8::String::ExternalStringResourceBase*>(
+ "v8::String::ExternalStringResourceBase*"),
+ CheckTypeName<v8::String::ExternalStringResourceBase*>(
+ "v8::String::ExternalStringResourceBase*"),
+ object->GetResourceAddress(), 1,
+ sizeof(v8::String::ExternalStringResourceBase*),
+ std::vector<std::unique_ptr<StructProperty>>(),
+ d::PropertyKind::kSingle));
+ }
+
void VisitJSObject(const TqJSObject* object) override {
// JSObject and its subclasses can be followed directly by an array of
// property values. The start and end offsets of those values are described
@@ -524,8 +542,21 @@ std::unique_ptr<ObjectPropertiesResult> GetHeapObjectPropertiesNotCompressed(
auto extra_info =
AddInfoVisitor::Visit(typed.object.get(), accessor, heap_addresses);
brief = JoinWithSpace(brief, extra_info.first);
- props.insert(props.end(), std::make_move_iterator(extra_info.second.begin()),
- std::make_move_iterator(extra_info.second.end()));
+
+ // Overwrite existing properties if they have the same name.
+ for (size_t i = 0; i < extra_info.second.size(); i++) {
+ bool overwrite = false;
+ for (size_t j = 0; j < props.size(); j++) {
+ if (strcmp(props[j]->GetPublicView()->name,
+ extra_info.second[i]->GetPublicView()->name) == 0) {
+ props[j] = std::move(extra_info.second[i]);
+ overwrite = true;
+ break;
+ }
+ }
+ if (overwrite) continue;
+ props.push_back(std::move(extra_info.second[i]));
+ }
brief = AppendAddressAndType(brief, address, typed.object->GetName());
@@ -601,6 +632,32 @@ std::unique_ptr<ObjectPropertiesResult> GetObjectProperties(
stream.str(), kSmi);
}
+std::unique_ptr<StackFrameResult> GetStackFrame(
+ uintptr_t frame_pointer, d::MemoryAccessor memory_accessor) {
+ // Read the data at frame_pointer + kContextOrFrameTypeOffset.
+ intptr_t context_or_frame_type = 0;
+ d::MemoryAccessResult validity = memory_accessor(
+ frame_pointer + CommonFrameConstants::kContextOrFrameTypeOffset,
+ reinterpret_cast<void*>(&context_or_frame_type), sizeof(intptr_t));
+ auto props = std::vector<std::unique_ptr<ObjectProperty>>();
+ if (validity == d::MemoryAccessResult::kOk) {
+ // If it is context, not frame marker then add new property
+ // "currently_executing_function".
+ if (!StackFrame::IsTypeMarker(context_or_frame_type)) {
+ props.push_back(std::make_unique<ObjectProperty>(
+ "currently_executing_jsfunction",
+ CheckTypeName<v8::internal::JSFunction>("v8::internal::JSFunction"),
+ CheckTypeName<v8::internal::JSFunction*>("v8::internal::JSFunction"),
+ frame_pointer + StandardFrameConstants::kFunctionOffset, 1,
+ sizeof(v8::internal::JSFunction),
+ std::vector<std::unique_ptr<StructProperty>>(),
+ d::PropertyKind::kSingle));
+ }
+ }
+
+ return std::make_unique<StackFrameResult>(std::move(props));
+}
+
} // namespace debug_helper_internal
} // namespace internal
} // namespace v8
@@ -623,4 +680,16 @@ V8_DEBUG_HELPER_EXPORT void _v8_debug_helper_Free_ObjectPropertiesResult(
std::unique_ptr<di::ObjectPropertiesResult> ptr(
static_cast<di::ObjectPropertiesResultExtended*>(result)->base);
}
+
+V8_DEBUG_HELPER_EXPORT d::StackFrameResult* _v8_debug_helper_GetStackFrame(
+ uintptr_t frame_pointer, d::MemoryAccessor memory_accessor) {
+ return di::GetStackFrame(frame_pointer, memory_accessor)
+ .release()
+ ->GetPublicView();
+}
+V8_DEBUG_HELPER_EXPORT void _v8_debug_helper_Free_StackFrameResult(
+ d::StackFrameResult* result) {
+ std::unique_ptr<di::StackFrameResult> ptr(
+ static_cast<di::StackFrameResultExtended*>(result)->base);
+}
}
diff --git a/deps/v8/tools/debug_helper/list-object-classes.cc b/deps/v8/tools/debug_helper/list-object-classes.cc
index 2d723e9218..0e17dcb99d 100644
--- a/deps/v8/tools/debug_helper/list-object-classes.cc
+++ b/deps/v8/tools/debug_helper/list-object-classes.cc
@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "debug-helper-internal.h"
-#include "torque-generated/class-debug-readers-tq.h"
+#include "torque-generated/class-debug-readers.h"
namespace di = v8::internal::debug_helper_internal;
diff --git a/deps/v8/tools/dump-cpp.py b/deps/v8/tools/dump-cpp.py
index 31dc0536dc..58c08c8a7f 100644
--- a/deps/v8/tools/dump-cpp.py
+++ b/deps/v8/tools/dump-cpp.py
@@ -19,9 +19,7 @@ def is_file_executable(fPath):
return os.path.isfile(fPath) and os.access(fPath, os.X_OK)
if __name__ == '__main__':
- JS_FILES = ['splaytree.js', 'codemap.js', 'csvparser.js', 'consarray.js',
- 'profile.js', 'logreader.js', 'arguments.js', 'tickprocessor.js',
- 'SourceMap.js', 'dumpcpp.js', 'dumpcpp-driver.js']
+ JS_FILES = ['dumpcpp-driver.mjs']
tools_path = os.path.dirname(os.path.realpath(__file__))
on_windows = platform.system() == 'Windows'
JS_FILES = [os.path.join(tools_path, f) for f in JS_FILES]
@@ -53,7 +51,7 @@ if __name__ == '__main__':
print('No d8 binary path found in {}.'.format(log_file))
sys.exit(-1)
- args = [d8_exec] + JS_FILES + ['--'] + args
+ args = [d8_exec] + ['--module'] + JS_FILES + ['--'] + args
with open(log_file) as f:
sp = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
diff --git a/deps/v8/tools/dumpcpp-driver.js b/deps/v8/tools/dumpcpp-driver.mjs
index 6073dea738..fafa85e67e 100644
--- a/deps/v8/tools/dumpcpp-driver.js
+++ b/deps/v8/tools/dumpcpp-driver.mjs
@@ -2,6 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import { WebInspector } from "./sourcemap.mjs";
+import {
+ CppProcessor, ArgumentsProcessor, UnixCppEntriesProvider,
+ WindowsCppEntriesProvider, MacCppEntriesProvider
+ } from "./dumpcpp.mjs";
+
// Dump C++ symbols of shared library if possible
function processArguments(args) {
diff --git a/deps/v8/tools/dumpcpp.js b/deps/v8/tools/dumpcpp.mjs
index 58cb74cc6a..9142cad114 100644
--- a/deps/v8/tools/dumpcpp.js
+++ b/deps/v8/tools/dumpcpp.mjs
@@ -2,7 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-function CppProcessor(cppEntriesProvider, timedRange, pairwiseTimedRange) {
+import { LogReader, parseString } from "./logreader.mjs";
+import { CodeMap } from "./codemap.mjs";
+export {
+ ArgumentsProcessor, UnixCppEntriesProvider,
+ WindowsCppEntriesProvider, MacCppEntriesProvider,
+ } from "./tickprocessor.mjs";
+ import { inherits } from "./tickprocessor.mjs";
+
+
+export function CppProcessor(cppEntriesProvider, timedRange, pairwiseTimedRange) {
LogReader.call(this, {
'shared-library': { parsers: [parseString, parseInt, parseInt, parseInt],
processor: this.processSharedLibrary }
diff --git a/deps/v8/tools/gcmole/gcmole-tools.tar.gz.sha1 b/deps/v8/tools/gcmole/gcmole-tools.tar.gz.sha1
index 221e2e9d29..a8ea9424af 100644
--- a/deps/v8/tools/gcmole/gcmole-tools.tar.gz.sha1
+++ b/deps/v8/tools/gcmole/gcmole-tools.tar.gz.sha1
@@ -1 +1 @@
-0af04ef475bc746a501fe17d3b56ccb03fc151fc
+7736018d2ca616f7c1477102cc169ee579ee6003
diff --git a/deps/v8/tools/gcmole/gcmole.cc b/deps/v8/tools/gcmole/gcmole.cc
index cce177caf9..3c5fb5ce96 100644
--- a/deps/v8/tools/gcmole/gcmole.cc
+++ b/deps/v8/tools/gcmole/gcmole.cc
@@ -685,6 +685,7 @@ class FunctionAnalyzer {
clang::CXXRecordDecl* maybe_object_decl,
clang::CXXRecordDecl* smi_decl,
clang::CXXRecordDecl* no_gc_decl,
+ clang::CXXRecordDecl* no_gc_or_safepoint_decl,
clang::CXXRecordDecl* no_heap_access_decl,
clang::DiagnosticsEngine& d, clang::SourceManager& sm)
: ctx_(ctx),
@@ -692,6 +693,7 @@ class FunctionAnalyzer {
maybe_object_decl_(maybe_object_decl),
smi_decl_(smi_decl),
no_gc_decl_(no_gc_decl),
+ no_gc_or_safepoint_decl_(no_gc_or_safepoint_decl),
no_heap_access_decl_(no_heap_access_decl),
d_(d),
sm_(sm),
@@ -1406,6 +1408,8 @@ class FunctionAnalyzer {
}
return (no_gc_decl_ && IsDerivedFrom(definition, no_gc_decl_)) ||
+ (no_gc_or_safepoint_decl_ &&
+ IsDerivedFrom(definition, no_gc_or_safepoint_decl_)) ||
(no_heap_access_decl_ &&
IsDerivedFrom(definition, no_heap_access_decl_));
}
@@ -1491,6 +1495,7 @@ class FunctionAnalyzer {
clang::CXXRecordDecl* maybe_object_decl_;
clang::CXXRecordDecl* smi_decl_;
clang::CXXRecordDecl* no_gc_decl_;
+ clang::CXXRecordDecl* no_gc_or_safepoint_decl_;
clang::CXXRecordDecl* no_heap_access_decl_;
clang::DiagnosticsEngine& d_;
@@ -1557,6 +1562,11 @@ class ProblemsFinder : public clang::ASTConsumer,
.ResolveNamespace("internal")
.ResolveTemplate("DisallowHeapAllocation");
+ clang::CXXRecordDecl* no_gc_or_safepoint_decl =
+ r.ResolveNamespace("v8")
+ .ResolveNamespace("internal")
+ .ResolveTemplate("DisallowGarbageCollection");
+
clang::CXXRecordDecl* no_heap_access_decl =
r.ResolveNamespace("v8")
.ResolveNamespace("internal")
@@ -1586,10 +1596,10 @@ class ProblemsFinder : public clang::ASTConsumer,
no_heap_access_decl = no_heap_access_decl->getDefinition();
if (object_decl != NULL && smi_decl != NULL && maybe_object_decl != NULL) {
- function_analyzer_ =
- new FunctionAnalyzer(clang::ItaniumMangleContext::create(ctx, d_),
- object_decl, maybe_object_decl, smi_decl,
- no_gc_decl, no_heap_access_decl, d_, sm_);
+ function_analyzer_ = new FunctionAnalyzer(
+ clang::ItaniumMangleContext::create(ctx, d_), object_decl,
+ maybe_object_decl, smi_decl, no_gc_decl, no_gc_or_safepoint_decl,
+ no_heap_access_decl, d_, sm_);
TraverseDecl(ctx.getTranslationUnitDecl());
} else {
if (object_decl == NULL) {
diff --git a/deps/v8/tools/gcmole/run-gcmole.py b/deps/v8/tools/gcmole/run-gcmole.py
index 40e2be9699..02174b218a 100755
--- a/deps/v8/tools/gcmole/run-gcmole.py
+++ b/deps/v8/tools/gcmole/run-gcmole.py
@@ -21,7 +21,7 @@ BASE_PATH = os.path.dirname(os.path.dirname(GCMOLE_PATH))
assert len(sys.argv) == 2
-if not os.path.isfile("out/build/gen/torque-generated/builtin-definitions-tq.h"):
+if not os.path.isfile("out/build/gen/torque-generated/builtin-definitions.h"):
print("Expected generated headers in out/build/gen.")
print("Either build v8 in out/build or change gcmole.lua:115")
sys.exit(-1)
diff --git a/deps/v8/tools/gen-postmortem-metadata.py b/deps/v8/tools/gen-postmortem-metadata.py
index 07883bb71b..84b9ad4990 100644
--- a/deps/v8/tools/gen-postmortem-metadata.py
+++ b/deps/v8/tools/gen-postmortem-metadata.py
@@ -263,8 +263,6 @@ extras_accessors = [
'UncompiledData, inferred_name, String, kInferredNameOffset',
'UncompiledData, start_position, int32_t, kStartPositionOffset',
'UncompiledData, end_position, int32_t, kEndPositionOffset',
- 'Script, name, Object, kNameOffset',
- 'Script, line_ends, Object, kLineEndsOffset',
'SharedFunctionInfo, raw_function_token_offset, int16_t, kFunctionTokenOffsetOffset',
'SharedFunctionInfo, internal_formal_parameter_count, uint16_t, kFormalParameterCountOffset',
'SharedFunctionInfo, flags, int, kFlagsOffset',
@@ -279,7 +277,6 @@ extras_accessors = [
'SlicedString, offset, SMI, kOffsetOffset',
'ThinString, actual, String, kActualOffset',
'Symbol, name, Object, kDescriptionOffset',
- 'FixedArrayBase, length, SMI, kLengthOffset',
];
#
diff --git a/deps/v8/tools/ic-explorer.html b/deps/v8/tools/ic-explorer.html
index 2ceb8b2719..61d94d65d1 100644
--- a/deps/v8/tools/ic-explorer.html
+++ b/deps/v8/tools/ic-explorer.html
@@ -49,16 +49,7 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
padding: 0.5em 0 0.2em 0;
}
</style>
- <script src="./splaytree.js"></script>
- <script src="./codemap.js"></script>
- <script src="./csvparser.js"></script>
- <script src="./consarray.js"></script>
- <script src="./profile.js"></script>
- <script src="./profile_view.js"></script>
- <script src="./logreader.js"></script>
- <script src="./arguments.js"></script>
- <script src="./ic-processor.js"></script>
- <script src="./SourceMap.js"></script>
+ <script type="module" src="./ic-processor.js"></script>
<script>
"use strict"
diff --git a/deps/v8/tools/ic-processor b/deps/v8/tools/ic-processor
index c33052cdf6..7b886b8220 100755
--- a/deps/v8/tools/ic-processor
+++ b/deps/v8/tools/ic-processor
@@ -33,9 +33,5 @@ if [ ! -x "$d8_exec" ]; then
fi
# nm spits out 'no symbols found' messages to stderr.
-cat $log_file | $d8_exec $tools_path/splaytree.js $tools_path/codemap.js \
- $tools_path/csvparser.js $tools_path/consarray.js \
- $tools_path/profile.js $tools_path/profile_view.js \
- $tools_path/logreader.js $tools_path/arguments.js \
- $tools_path/ic-processor.js $tools_path/SourceMap.js \
- $tools_path/ic-processor-driver.js -- $@ 2>/dev/null
+cat $log_file | $d8_exec \
+ --module $tools_path/ic-processor-driver.mjs -- $@ 2>/dev/null
diff --git a/deps/v8/tools/ic-processor-driver.js b/deps/v8/tools/ic-processor-driver.mjs
index 2aa52006c7..779837aa3f 100644
--- a/deps/v8/tools/ic-processor-driver.js
+++ b/deps/v8/tools/ic-processor-driver.mjs
@@ -2,6 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import { IcProcessor, ArgumentsProcessor, readFile } from "./ic-processor.mjs";
+import { WebInspector } from "./sourcemap.mjs";
+
function processArguments(args) {
var processor = new ArgumentsProcessor(args);
if (processor.parse()) {
diff --git a/deps/v8/tools/ic-processor.js b/deps/v8/tools/ic-processor.mjs
index 04ac987b85..7f6fb03a61 100644
--- a/deps/v8/tools/ic-processor.js
+++ b/deps/v8/tools/ic-processor.mjs
@@ -2,6 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import { LogReader, parseString, parseVarArgs } from "./logreader.mjs";
+import { BaseArgumentsProcessor } from "./arguments.mjs";
+import { Profile } from "./profile.mjs";
+
function inherits(childCtor, parentCtor) {
childCtor.prototype.__proto__ = parentCtor.prototype;
};
@@ -9,7 +13,7 @@ function inherits(childCtor, parentCtor) {
/**
* A thin wrapper around shell's 'read' function showing a file name on error.
*/
-function readFile(fileName) {
+export function readFile(fileName) {
try {
return read(fileName);
} catch (e) {
@@ -31,7 +35,7 @@ function parseState(s) {
}
-function IcProcessor() {
+export function IcProcessor() {
var propertyICParser = [
parseInt, parseInt, parseInt, parseInt, parseString, parseString,
parseInt, parseString, parseString, parseString];
@@ -175,7 +179,7 @@ print(
-class ArgumentsProcessor extends BaseArgumentsProcessor {
+export class ArgumentsProcessor extends BaseArgumentsProcessor {
getArgsDispatch() {
return {
'--range': ['range', 'auto,auto',
diff --git a/deps/v8/tools/linux-tick-processor b/deps/v8/tools/linux-tick-processor
index 8b856caa9c..8e5100b095 100755
--- a/deps/v8/tools/linux-tick-processor
+++ b/deps/v8/tools/linux-tick-processor
@@ -34,9 +34,4 @@ fi
# nm spits out 'no symbols found' messages to stderr.
cat $log_file | $d8_exec --enable-os-system \
- $tools_path/splaytree.js $tools_path/codemap.js \
- $tools_path/csvparser.js $tools_path/consarray.js \
- $tools_path/profile.js $tools_path/profile_view.js \
- $tools_path/logreader.js $tools_path/arguments.js \
- $tools_path/tickprocessor.js $tools_path/SourceMap.js \
- $tools_path/tickprocessor-driver.js -- $@ 2>/dev/null
+ --module $tools_path/tickprocessor-driver.mjs -- $@ 2>/dev/null
diff --git a/deps/v8/tools/logreader.mjs b/deps/v8/tools/logreader.mjs
new file mode 100644
index 0000000000..75bc7ddade
--- /dev/null
+++ b/deps/v8/tools/logreader.mjs
@@ -0,0 +1,248 @@
+// Copyright 2011 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/**
+ * @fileoverview Log Reader is used to process log file produced by V8.
+ */
+
+ import { CsvParser } from "./csvparser.mjs";
+
+/**
+ * Base class for processing log files.
+ *
+ * @param {Array.<Object>} dispatchTable A table used for parsing and processing
+ * log records.
+ * @param {boolean} timedRange Ignore ticks outside timed range.
+ * @param {boolean} pairwiseTimedRange Ignore ticks outside pairs of timer
+ * markers.
+ * @constructor
+ */
+export function LogReader(dispatchTable, timedRange, pairwiseTimedRange) {
+ /**
+ * @type {Array.<Object>}
+ */
+ this.dispatchTable_ = dispatchTable;
+
+ /**
+ * @type {boolean}
+ */
+ this.timedRange_ = timedRange;
+
+ /**
+ * @type {boolean}
+ */
+ this.pairwiseTimedRange_ = pairwiseTimedRange;
+ if (pairwiseTimedRange) {
+ this.timedRange_ = true;
+ }
+
+ /**
+ * Current line.
+ * @type {number}
+ */
+ this.lineNum_ = 0;
+
+ /**
+ * CSV lines parser.
+ * @type {CsvParser}
+ */
+ this.csvParser_ = new CsvParser();
+
+ /**
+ * Keeps track of whether we've seen a "current-time" tick yet.
+ * @type {boolean}
+ */
+ this.hasSeenTimerMarker_ = false;
+
+ /**
+ * List of log lines seen since last "current-time" tick.
+ * @type {Array.<String>}
+ */
+ this.logLinesSinceLastTimerMarker_ = [];
+};
+
+
+/**
+ * Used for printing error messages.
+ *
+ * @param {string} str Error message.
+ */
+LogReader.prototype.printError = function(str) {
+ // Do nothing.
+};
+
+
+/**
+ * Processes a portion of V8 profiler event log.
+ *
+ * @param {string} chunk A portion of log.
+ */
+LogReader.prototype.processLogChunk = function(chunk) {
+ this.processLog_(chunk.split('\n'));
+};
+
+
+/**
+ * Processes a line of V8 profiler event log.
+ *
+ * @param {string} line A line of log.
+ */
+LogReader.prototype.processLogLine = function(line) {
+ if (!this.timedRange_) {
+ this.processLogLine_(line);
+ return;
+ }
+ if (line.startsWith("current-time")) {
+ if (this.hasSeenTimerMarker_) {
+ this.processLog_(this.logLinesSinceLastTimerMarker_);
+ this.logLinesSinceLastTimerMarker_ = [];
+ // In pairwise mode, a "current-time" line ends the timed range.
+ if (this.pairwiseTimedRange_) {
+ this.hasSeenTimerMarker_ = false;
+ }
+ } else {
+ this.hasSeenTimerMarker_ = true;
+ }
+ } else {
+ if (this.hasSeenTimerMarker_) {
+ this.logLinesSinceLastTimerMarker_.push(line);
+ } else if (!line.startsWith("tick")) {
+ this.processLogLine_(line);
+ }
+ }
+};
+
+
+/**
+ * Processes stack record.
+ *
+ * @param {number} pc Program counter.
+ * @param {number} func JS Function.
+ * @param {Array.<string>} stack String representation of a stack.
+ * @return {Array.<number>} Processed stack.
+ */
+LogReader.prototype.processStack = function(pc, func, stack) {
+ var fullStack = func ? [pc, func] : [pc];
+ var prevFrame = pc;
+ for (var i = 0, n = stack.length; i < n; ++i) {
+ var frame = stack[i];
+ var firstChar = frame.charAt(0);
+ if (firstChar == '+' || firstChar == '-') {
+ // An offset from the previous frame.
+ prevFrame += parseInt(frame, 16);
+ fullStack.push(prevFrame);
+ // Filter out possible 'overflow' string.
+ } else if (firstChar != 'o') {
+ fullStack.push(parseInt(frame, 16));
+ } else {
+ this.printError("dropping: " + frame);
+ }
+ }
+ return fullStack;
+};
+
+
+/**
+ * Returns whether a particular dispatch must be skipped.
+ *
+ * @param {!Object} dispatch Dispatch record.
+ * @return {boolean} True if dispatch must be skipped.
+ */
+LogReader.prototype.skipDispatch = function(dispatch) {
+ return false;
+};
+
+// Parses dummy variable for readability;
+export const parseString = 'parse-string';
+export const parseVarArgs = 'parse-var-args';
+
+/**
+ * Does a dispatch of a log record.
+ *
+ * @param {Array.<string>} fields Log record.
+ * @private
+ */
+LogReader.prototype.dispatchLogRow_ = function(fields) {
+ // Obtain the dispatch.
+ var command = fields[0];
+ var dispatch = this.dispatchTable_[command];
+ if (dispatch === undefined) return;
+ if (dispatch === null || this.skipDispatch(dispatch)) {
+ return;
+ }
+
+ // Parse fields.
+ var parsedFields = [];
+ for (var i = 0; i < dispatch.parsers.length; ++i) {
+ var parser = dispatch.parsers[i];
+ if (parser === parseString) {
+ parsedFields.push(fields[1 + i]);
+ } else if (typeof parser == 'function') {
+ parsedFields.push(parser(fields[1 + i]));
+ } else if (parser === parseVarArgs) {
+ // var-args
+ parsedFields.push(fields.slice(1 + i));
+ break;
+ } else {
+ throw new Error("Invalid log field parser: " + parser);
+ }
+ }
+
+ // Run the processor.
+ dispatch.processor.apply(this, parsedFields);
+};
+
+
+/**
+ * Processes log lines.
+ *
+ * @param {Array.<string>} lines Log lines.
+ * @private
+ */
+LogReader.prototype.processLog_ = function(lines) {
+ for (var i = 0, n = lines.length; i < n; ++i) {
+ this.processLogLine_(lines[i]);
+ }
+}
+
+/**
+ * Processes a single log line.
+ *
+ * @param {String} a log line
+ * @private
+ */
+LogReader.prototype.processLogLine_ = function(line) {
+ if (line.length > 0) {
+ try {
+ var fields = this.csvParser_.parseLine(line);
+ this.dispatchLogRow_(fields);
+ } catch (e) {
+ this.printError('line ' + (this.lineNum_ + 1) + ': ' + (e.message || e) + '\n' + e.stack);
+ }
+ }
+ this.lineNum_++;
+};
diff --git a/deps/v8/tools/map-processor b/deps/v8/tools/map-processor
index cf18c31a8e..ceb69970df 100755
--- a/deps/v8/tools/map-processor
+++ b/deps/v8/tools/map-processor
@@ -33,9 +33,5 @@ if [ ! -x "$d8_exec" ]; then
fi
# nm spits out 'no symbols found' messages to stderr.
-cat $log_file | $d8_exec $tools_path/splaytree.js $tools_path/codemap.js \
- $tools_path/csvparser.js $tools_path/consarray.js \
- $tools_path/profile.js $tools_path/profile_view.js \
- $tools_path/logreader.js $tools_path/arguments.js \
- $tools_path/map-processor.js $tools_path/SourceMap.js \
- $tools_path/map-processor-driver.js -- $@ 2>/dev/null
+cat $log_file | $d8_exec \
+ --module $tools_path/map-processor-driver.mjs -- $@ 2>/dev/null
diff --git a/deps/v8/tools/map-processor-driver.js b/deps/v8/tools/map-processor-driver.mjs
index 31a4860849..a7a6fefa66 100644
--- a/deps/v8/tools/map-processor-driver.js
+++ b/deps/v8/tools/map-processor-driver.mjs
@@ -2,6 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import { WebInspector } from "./sourcemap.mjs";
+import {
+ MapProcessor, ArgumentsProcessor, readFile
+ } from "./map-processor.mjs";
+
function processArguments(args) {
var processor = new ArgumentsProcessor(args);
if (processor.parse()) {
diff --git a/deps/v8/tools/map-processor.html b/deps/v8/tools/map-processor.html
index b2bc3d57df..16cd224638 100644
--- a/deps/v8/tools/map-processor.html
+++ b/deps/v8/tools/map-processor.html
@@ -374,16 +374,7 @@ dd {
}
</style>
-<script src="./splaytree.js"></script>
-<script src="./codemap.js"></script>
-<script src="./csvparser.js"></script>
-<script src="./consarray.js"></script>
-<script src="./profile.js"></script>
-<script src="./profile_view.js"></script>
-<script src="./logreader.js"></script>
-<script src="./SourceMap.js"></script>
-<script src="./arguments.js"></script>
-<script src="./map-processor.js"></script>
+<script type="module" src="./map-processor.js"></script>
<script>
"use strict"
// =========================================================================
diff --git a/deps/v8/tools/map-processor.js b/deps/v8/tools/map-processor.mjs
index 9b261c7d1b..7c290abb8d 100644
--- a/deps/v8/tools/map-processor.js
+++ b/deps/v8/tools/map-processor.mjs
@@ -2,6 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import { LogReader, parseString, parseVarArgs } from "./logreader.mjs";
+import { BaseArgumentsProcessor } from "./arguments.mjs";
+import { Profile } from "./profile.mjs";
+
// ===========================================================================
function define(prototype, name, fn) {
Object.defineProperty(prototype, name, {value:fn, enumerable:false});
@@ -18,9 +22,22 @@ define(Array.prototype, "max", function(fn) {
})
define(Array.prototype, "first", function() { return this[0] });
define(Array.prototype, "last", function() { return this[this.length - 1] });
+
+
+/**
+ * A thin wrapper around shell's 'read' function showing a file name on error.
+ */
+export function readFile(fileName) {
+ try {
+ return read(fileName);
+ } catch (e) {
+ console.log(fileName + ': ' + (e.message || e));
+ throw e;
+ }
+}
// ===========================================================================
-class MapProcessor extends LogReader {
+export class MapProcessor extends LogReader {
constructor() {
super();
this.dispatchTable_ = {
@@ -745,7 +762,7 @@ function BreakDown(list, map_fn) {
// ===========================================================================
-class ArgumentsProcessor extends BaseArgumentsProcessor {
+export class ArgumentsProcessor extends BaseArgumentsProcessor {
getArgsDispatch() {
return {
'--range': ['range', 'auto,auto',
diff --git a/deps/v8/tools/parse-processor b/deps/v8/tools/parse-processor
index 1c7175257d..b601dda9e2 100755
--- a/deps/v8/tools/parse-processor
+++ b/deps/v8/tools/parse-processor
@@ -34,9 +34,4 @@ fi
# nm spits out 'no symbols found' messages to stderr.
cat $log_file | $d8_exec --allow-natives-syntax \
- $tools_path/splaytree.js $tools_path/codemap.js \
- $tools_path/csvparser.js $tools_path/consarray.js \
- $tools_path/profile.js $tools_path/profile_view.js \
- $tools_path/logreader.js $tools_path/arguments.js \
- $tools_path/parse-processor.js $tools_path/SourceMap.js \
- $tools_path/parse-processor-driver.js -- $@ 2>/dev/null
+ --module $tools_path/parse-processor-driver.mjs -- $@ 2>/dev/null
diff --git a/deps/v8/tools/parse-processor-driver.js b/deps/v8/tools/parse-processor-driver.mjs
index f8f0c15254..9c72d744ad 100644
--- a/deps/v8/tools/parse-processor-driver.js
+++ b/deps/v8/tools/parse-processor-driver.mjs
@@ -2,6 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import { WebInspector } from "./sourcemap.mjs";
+import {
+ ParseProcessor, ArgumentsProcessor, readFile,
+ } from "./parse-processor.mjs";
+
function processArguments(args) {
var processor = new ArgumentsProcessor(args);
if (processor.parse()) {
diff --git a/deps/v8/tools/parse-processor.html b/deps/v8/tools/parse-processor.html
index 0f5818eaf0..9d78bbff2a 100644
--- a/deps/v8/tools/parse-processor.html
+++ b/deps/v8/tools/parse-processor.html
@@ -103,26 +103,22 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
text-align: right;
}
</style>
-<script src="./splaytree.js"></script>
-<script src="./codemap.js"></script>
-<script src="./csvparser.js"></script>
-<script src="./consarray.js"></script>
-<script src="./profile.js"></script>
-<script src="./profile_view.js"></script>
-<script src="./logreader.js"></script>
-<script src="./arguments.js"></script>
-<script src="./parse-processor.js"></script>
-<script src="./SourceMap.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
-<script>
-"use strict";
+<script type="module">
+
+import { ParseProcessor, kSecondsToMillis } from "./parse-processor.mjs";
+
google.charts.load('current', {packages: ['corechart']});
function $(query) {
return document.querySelector(query);
}
-function loadFile() {
+window.addEventListener('DOMContentLoaded', (event) => {
+ $("#uploadInput").focus();
+});
+
+document.loadFile = function() {
let files = $('#uploadInput').files;
let file = files[0];
@@ -140,10 +136,6 @@ function loadFile() {
reader.readAsText(file);
}
-function handleOnLoad() {
- document.querySelector("#uploadInput").focus();
-}
-
function createNode(tag, classNames) {
let node = document.createElement(tag);
if (classNames) {
@@ -395,7 +387,7 @@ function createFunktionList(metric, description, time, funktions) {
</script>
</head>
-<body onload="handleOnLoad()">
+<body>
<h1>BEHOLD, THIS IS PARSEROR!</h1>
<h2>Usage</h2>
diff --git a/deps/v8/tools/parse-processor.js b/deps/v8/tools/parse-processor.mjs
index b829cf29d5..ed010d55a4 100644
--- a/deps/v8/tools/parse-processor.js
+++ b/deps/v8/tools/parse-processor.mjs
@@ -3,11 +3,13 @@
// found in the LICENSE file.
"use strict";
+import { LogReader, parseString } from "./logreader.mjs";
+import { BaseArgumentsProcessor } from "./arguments.mjs";
/**
* A thin wrapper around shell's 'read' function showing a file name on error.
*/
-function readFile(fileName) {
+export function readFile(fileName) {
try {
return read(fileName);
} catch (e) {
@@ -730,8 +732,8 @@ class Funktion extends CompilationUnit {
// ===========================================================================
-const kTimestampFactor = 1000;
-const kSecondsToMillis = 1000;
+export const kTimestampFactor = 1000;
+export const kSecondsToMillis = 1000;
function toTimestamp(microseconds) {
return microseconds / kTimestampFactor
@@ -744,7 +746,7 @@ function startOf(timestamp, time) {
}
-class ParseProcessor extends LogReader {
+export class ParseProcessor extends LogReader {
constructor() {
super();
this.dispatchTable_ = {
@@ -1130,7 +1132,7 @@ class ParseProcessor extends LogReader {
}
-class ArgumentsProcessor extends BaseArgumentsProcessor {
+export class ArgumentsProcessor extends BaseArgumentsProcessor {
getArgsDispatch() {
return {};
}
diff --git a/deps/v8/tools/plot-timer-events b/deps/v8/tools/plot-timer-events
deleted file mode 100755
index 02176320a5..0000000000
--- a/deps/v8/tools/plot-timer-events
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-
-# find the name of the log file to process, it must not start with a dash.
-log_file="v8.log"
-for arg in "$@"
-do
- if ! expr "X${arg}" : "^X-" > /dev/null; then
- log_file=${arg}
- fi
-done
-
-tools_path=`cd $(dirname "$0");pwd`
-if test ! "$D8_PATH"; then
- d8_public=`which d8`
- if test -x "$d8_public"; then D8_PATH=$(dirname "$d8_public"); fi
-fi
-
-if test ! -n "$D8_PATH"; then
- D8_PATH=$tools_path/..
-fi
-
-d8_exec=$D8_PATH/d8
-
-if test ! -x "$d8_exec"; then
- D8_PATH=`pwd`/out/native
- d8_exec=$D8_PATH/d8
-fi
-
-if test ! -x "$d8_exec"; then
- d8_exec=`grep -m 1 -o '".*/d8"' $log_file | sed 's/"//g'`
-fi
-
-if test ! -x "$d8_exec"; then
- echo "d8 shell not found in $D8_PATH"
- echo "Please provide path to d8 as env var in D8_PATH"
- exit 1
-fi
-
-
-contains=0;
-for arg in "$@"; do
- `echo "$arg" | grep -q "^--distortion"`
- if test $? -eq 0; then
- contains=1
- break
- fi
-done
-
-if test "$contains" -eq 0; then
- # Try to find out how much the instrumentation overhead is.
- calibration_log=calibration.log
- calibration_script="for (var i = 0; i < 1000000; i++) print();"
-
- $d8_exec --noopt --prof --logfile $calibration_log \
- --log-timer-events -e "$calibration_script" > /dev/null
- t_1_start=`grep "timer-event-start,\"V8.Execute\"" $calibration_log \
- | tail -n1 | awk -F, '{print $3}'`
- t_1_end=`grep "timer-event-end,\"V8.Execute\"" $calibration_log \
- | tail -n1 | awk -F, '{print $3}'`
- n_1=`grep "timer-event\|tick" $calibration_log | wc -l`
-
- $d8_exec --noopt --prof --logfile $calibration_log \
- --log-internal-timer-events -e "$calibration_script" > /dev/null
- t_2_start=`grep "timer-event-start,\"V8.Execute\"" $calibration_log \
- | tail -n1 | awk -F, '{print $3}'`
- t_2_end=`grep "timer-event-end,\"V8.Execute\"" $calibration_log \
- | tail -n1 | awk -F, '{print $3}'`
- n_2=`grep "timer-event\|tick" $calibration_log | wc -l`
-
- rm $calibration_log
-
- # Overhead in picoseconds.
- distortion=`echo "1000*(($t_1_end - $t_1_start) - ($t_2_end - $t_2_start)) \
- / ($n_1 - $n_2)" | bc`
- options="--distortion=$distortion"
-fi
-
-cat $log_file |
- $d8_exec $tools_path/csvparser.js $tools_path/splaytree.js \
- $tools_path/codemap.js $tools_path/profile.js $tools_path/profile_view.js \
- $tools_path/logreader.js $tools_path/arguments.js \
- $tools_path/tickprocessor.js$tools_path/profviz/composer.js \
- $tools_path/profviz/stdio.js \
- -- $@ $options 2>/dev/null > timer-events.plot
-
-success=$?
-if test $success -ne 0; then
- cat timer-events.plot
-else
- cat timer-events.plot | gnuplot > timer-events.png
-fi
-
-rm -f timer-events.plot
diff --git a/deps/v8/tools/profile.js b/deps/v8/tools/profile.js
index f8829679db..50076825ad 100644
--- a/deps/v8/tools/profile.js
+++ b/deps/v8/tools/profile.js
@@ -25,6 +25,52 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// TODO: move to separate modules
+class SourcePosition {
+ constructor(script, line, column) {
+ this.script = script;
+ this.line = line;
+ this.column = column;
+ this.entries = [];
+ }
+ addEntry(entry) {
+ this.entries.push(entry);
+ }
+}
+
+class Script {
+
+ constructor(id, name, source) {
+ this.id = id;
+ this.name = name;
+ this.source = source;
+ this.sourcePositions = [];
+ // Map<line, Map<column, SourcePosition>>
+ this.lineToColumn = new Map();
+ }
+
+ addSourcePosition(line, column, entry) {
+ let sourcePosition = this.lineToColumn.get(line)?.get(column);
+ if (sourcePosition === undefined) {
+ sourcePosition = new SourcePosition(this, line, column, )
+ this.#addSourcePosition(line, column, sourcePosition);
+ }
+ sourcePosition.addEntry(entry);
+ return sourcePosition;
+ }
+
+ #addSourcePosition(line, column, sourcePosition) {
+ let columnToSourcePosition;
+ if (this.lineToColumn.has(line)) {
+ columnToSourcePosition = this.lineToColumn.get(line);
+ } else {
+ columnToSourcePosition = new Map();
+ this.lineToColumn.set(line, columnToSourcePosition);
+ }
+ this.sourcePositions.push(sourcePosition);
+ columnToSourcePosition.set(column, sourcePosition);
+ }
+}
/**
* Creates a profile object for processing profiling-related events
@@ -38,6 +84,8 @@ function Profile() {
this.bottomUpTree_ = new CallTree();
this.c_entries_ = {};
this.ticks_ = [];
+ this.scripts_ = [];
+ this.urlToScript_ = new Map();
};
@@ -47,7 +95,7 @@ function Profile() {
*
* @param {string} name Function name.
*/
-Profile.prototype.skipThisFunction = function(name) {
+Profile.prototype.skipThisFunction = function (name) {
return false;
};
@@ -89,8 +137,8 @@ Profile.CodeState = {
* during stack strace processing, specifies a position of the frame
* containing the address.
*/
-Profile.prototype.handleUnknownCode = function(
- operation, addr, opt_stackPos) {
+Profile.prototype.handleUnknownCode = function (
+ operation, addr, opt_stackPos) {
};
@@ -101,10 +149,10 @@ Profile.prototype.handleUnknownCode = function(
* @param {number} startAddr Starting address.
* @param {number} endAddr Ending address.
*/
-Profile.prototype.addLibrary = function(
- name, startAddr, endAddr) {
+Profile.prototype.addLibrary = function (
+ name, startAddr, endAddr) {
var entry = new CodeMap.CodeEntry(
- endAddr - startAddr, name, 'SHARED_LIB');
+ endAddr - startAddr, name, 'SHARED_LIB');
this.codeMap_.addLibrary(startAddr, entry);
return entry;
};
@@ -117,10 +165,10 @@ Profile.prototype.addLibrary = function(
* @param {number} startAddr Starting address.
* @param {number} endAddr Ending address.
*/
-Profile.prototype.addStaticCode = function(
- name, startAddr, endAddr) {
+Profile.prototype.addStaticCode = function (
+ name, startAddr, endAddr) {
var entry = new CodeMap.CodeEntry(
- endAddr - startAddr, name, 'CPP');
+ endAddr - startAddr, name, 'CPP');
this.codeMap_.addStaticCode(startAddr, entry);
return entry;
};
@@ -134,8 +182,8 @@ Profile.prototype.addStaticCode = function(
* @param {number} start Starting address.
* @param {number} size Code entry size.
*/
-Profile.prototype.addCode = function(
- type, name, timestamp, start, size) {
+Profile.prototype.addCode = function (
+ type, name, timestamp, start, size) {
var entry = new Profile.DynamicCodeEntry(size, type, name);
this.codeMap_.addCode(start, entry);
return entry;
@@ -152,8 +200,8 @@ Profile.prototype.addCode = function(
* @param {number} funcAddr Shared function object address.
* @param {Profile.CodeState} state Optimization state.
*/
-Profile.prototype.addFuncCode = function(
- type, name, timestamp, start, size, funcAddr, state) {
+Profile.prototype.addFuncCode = function (
+ type, name, timestamp, start, size, funcAddr, state) {
// As code and functions are in the same address space,
// it is safe to put them in a single code map.
var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr);
@@ -188,7 +236,7 @@ Profile.prototype.addFuncCode = function(
* @param {number} from Current code entry address.
* @param {number} to New code entry address.
*/
-Profile.prototype.moveCode = function(from, to) {
+Profile.prototype.moveCode = function (from, to) {
try {
this.codeMap_.moveCode(from, to);
} catch (e) {
@@ -196,9 +244,9 @@ Profile.prototype.moveCode = function(from, to) {
}
};
-Profile.prototype.deoptCode = function(
- timestamp, code, inliningId, scriptOffset, bailoutType,
- sourcePositionText, deoptReasonText) {
+Profile.prototype.deoptCode = function (
+ timestamp, code, inliningId, scriptOffset, bailoutType,
+ sourcePositionText, deoptReasonText) {
};
/**
@@ -206,7 +254,7 @@ Profile.prototype.deoptCode = function(
*
* @param {number} start Starting address.
*/
-Profile.prototype.deleteCode = function(start) {
+Profile.prototype.deleteCode = function (start) {
try {
this.codeMap_.deleteCode(start);
} catch (e) {
@@ -217,17 +265,27 @@ Profile.prototype.deleteCode = function(start) {
/**
* Adds source positions for given code.
*/
-Profile.prototype.addSourcePositions = function(
- start, script, startPos, endPos, sourcePositions, inliningPositions,
- inlinedFunctions) {
+Profile.prototype.addSourcePositions = function (
+ start, script, startPos, endPos, sourcePositions, inliningPositions,
+ inlinedFunctions) {
// CLI does not need source code => ignore.
};
/**
* Adds script source code.
*/
-Profile.prototype.addScriptSource = function(script, source) {
- // CLI does not need source code => ignore.
+Profile.prototype.addScriptSource = function (id, url, source) {
+ const script = new Script(id, url, source);
+ this.scripts_[id] = script;
+ this.urlToScript_.set(url, script);
+};
+
+
+/**
+ * Adds script source code.
+ */
+Profile.prototype.getScript = function (url) {
+ return this.urlToScript_.get(url);
};
/**
@@ -236,7 +294,7 @@ Profile.prototype.addScriptSource = function(script, source) {
* @param {number} from Current code entry address.
* @param {number} to New code entry address.
*/
-Profile.prototype.moveFunc = function(from, to) {
+Profile.prototype.moveFunc = function (from, to) {
if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
this.codeMap_.moveCode(from, to);
}
@@ -248,7 +306,7 @@ Profile.prototype.moveFunc = function(from, to) {
*
* @param {number} addr Entry address.
*/
-Profile.prototype.findEntry = function(addr) {
+Profile.prototype.findEntry = function (addr) {
return this.codeMap_.findEntry(addr);
};
@@ -259,7 +317,7 @@ Profile.prototype.findEntry = function(addr) {
*
* @param {Array<number>} stack Stack sample.
*/
-Profile.prototype.recordTick = function(time_ns, vmState, stack) {
+Profile.prototype.recordTick = function (time_ns, vmState, stack) {
var processedStack = this.resolveAndFilterFuncs_(stack);
this.bottomUpTree_.addPath(processedStack);
processedStack.reverse();
@@ -273,7 +331,7 @@ Profile.prototype.recordTick = function(time_ns, vmState, stack) {
*
* @param {Array<number>} stack Stack sample.
*/
-Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
+Profile.prototype.resolveAndFilterFuncs_ = function (stack) {
var result = [];
var last_seen_c_function = '';
var look_for_first_c_function = false;
@@ -295,9 +353,9 @@ Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
if (i === 0) result.push("UNKNOWN");
}
if (look_for_first_c_function &&
- i > 0 &&
- (!entry || entry.type !== 'CPP') &&
- last_seen_c_function !== '') {
+ i > 0 &&
+ (!entry || entry.type !== 'CPP') &&
+ last_seen_c_function !== '') {
if (this.c_entries_[last_seen_c_function] === undefined) {
this.c_entries_[last_seen_c_function] = 0;
}
@@ -314,7 +372,7 @@ Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
*
* @param {function(CallTree.Node)} f Visitor function.
*/
-Profile.prototype.traverseTopDownTree = function(f) {
+Profile.prototype.traverseTopDownTree = function (f) {
this.topDownTree_.traverse(f);
};
@@ -324,7 +382,7 @@ Profile.prototype.traverseTopDownTree = function(f) {
*
* @param {function(CallTree.Node)} f Visitor function.
*/
-Profile.prototype.traverseBottomUpTree = function(f) {
+Profile.prototype.traverseBottomUpTree = function (f) {
this.bottomUpTree_.traverse(f);
};
@@ -335,7 +393,7 @@ Profile.prototype.traverseBottomUpTree = function(f) {
*
* @param {string} opt_label Node label.
*/
-Profile.prototype.getTopDownProfile = function(opt_label) {
+Profile.prototype.getTopDownProfile = function (opt_label) {
return this.getTreeProfile_(this.topDownTree_, opt_label);
};
@@ -346,7 +404,7 @@ Profile.prototype.getTopDownProfile = function(opt_label) {
*
* @param {string} opt_label Node label.
*/
-Profile.prototype.getBottomUpProfile = function(opt_label) {
+Profile.prototype.getBottomUpProfile = function (opt_label) {
return this.getTreeProfile_(this.bottomUpTree_, opt_label);
};
@@ -357,7 +415,7 @@ Profile.prototype.getBottomUpProfile = function(opt_label) {
* @param {Profile.CallTree} tree Call tree.
* @param {string} opt_label Node label.
*/
-Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
+Profile.prototype.getTreeProfile_ = function (tree, opt_label) {
if (!opt_label) {
tree.computeTotalWeights();
return tree;
@@ -375,7 +433,7 @@ Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
*
* @param {string} opt_label Starting node label.
*/
-Profile.prototype.getFlatProfile = function(opt_label) {
+Profile.prototype.getFlatProfile = function (opt_label) {
var counters = new CallTree();
var rootLabel = opt_label || CallTree.ROOT_NODE_LABEL;
var precs = {};
@@ -424,13 +482,13 @@ Profile.prototype.getFlatProfile = function(opt_label) {
};
-Profile.CEntryNode = function(name, ticks) {
+Profile.CEntryNode = function (name, ticks) {
this.name = name;
this.ticks = ticks;
}
-Profile.prototype.getCEntryProfile = function() {
+Profile.prototype.getCEntryProfile = function () {
var result = [new Profile.CEntryNode("TOTAL", 0)];
var total_ticks = 0;
for (var f in this.c_entries_) {
@@ -439,7 +497,7 @@ Profile.prototype.getCEntryProfile = function() {
result.push(new Profile.CEntryNode(f, ticks));
}
result[0].ticks = total_ticks; // Sorting will keep this at index 0.
- result.sort(function(n1, n2) {
+ result.sort(function (n1, n2) {
return n2.ticks - n1.ticks || (n2.name < n1.name ? -1 : 1)
});
return result;
@@ -449,7 +507,7 @@ Profile.prototype.getCEntryProfile = function() {
/**
* Cleans up function entries that are not referenced by code entries.
*/
-Profile.prototype.cleanUpFuncEntries = function() {
+Profile.prototype.cleanUpFuncEntries = function () {
var referencedFuncEntries = [];
var entries = this.codeMap_.getAllDynamicEntriesWithAddresses();
for (var i = 0, l = entries.length; i < l; ++i) {
@@ -464,7 +522,7 @@ Profile.prototype.cleanUpFuncEntries = function() {
}
for (var i = 0, l = entries.length; i < l; ++i) {
if (entries[i][1].constructor === Profile.FunctionEntry &&
- !entries[i][1].used) {
+ !entries[i][1].used) {
this.codeMap_.deleteCode(entries[i][0]);
}
}
@@ -479,7 +537,7 @@ Profile.prototype.cleanUpFuncEntries = function() {
* @param {string} name Function name.
* @constructor
*/
-Profile.DynamicCodeEntry = function(size, type, name) {
+Profile.DynamicCodeEntry = function (size, type, name) {
CodeMap.CodeEntry.call(this, size, name, type);
};
@@ -487,7 +545,7 @@ Profile.DynamicCodeEntry = function(size, type, name) {
/**
* Returns node name.
*/
-Profile.DynamicCodeEntry.prototype.getName = function() {
+Profile.DynamicCodeEntry.prototype.getName = function () {
return this.type + ': ' + this.name;
};
@@ -495,17 +553,17 @@ Profile.DynamicCodeEntry.prototype.getName = function() {
/**
* Returns raw node name (without type decoration).
*/
-Profile.DynamicCodeEntry.prototype.getRawName = function() {
+Profile.DynamicCodeEntry.prototype.getRawName = function () {
return this.name;
};
-Profile.DynamicCodeEntry.prototype.isJSFunction = function() {
+Profile.DynamicCodeEntry.prototype.isJSFunction = function () {
return false;
};
-Profile.DynamicCodeEntry.prototype.toString = function() {
+Profile.DynamicCodeEntry.prototype.toString = function () {
return this.getName() + ': ' + this.size.toString(16);
};
@@ -519,7 +577,7 @@ Profile.DynamicCodeEntry.prototype.toString = function() {
* @param {Profile.CodeState} state Code optimization state.
* @constructor
*/
-Profile.DynamicFuncCodeEntry = function(size, type, func, state) {
+Profile.DynamicFuncCodeEntry = function (size, type, func, state) {
CodeMap.CodeEntry.call(this, size, '', type);
this.func = func;
this.state = state;
@@ -530,14 +588,14 @@ Profile.DynamicFuncCodeEntry.STATE_PREFIX = ["", "~", "*"];
/**
* Returns state.
*/
-Profile.DynamicFuncCodeEntry.prototype.getState = function() {
+Profile.DynamicFuncCodeEntry.prototype.getState = function () {
return Profile.DynamicFuncCodeEntry.STATE_PREFIX[this.state];
};
/**
* Returns node name.
*/
-Profile.DynamicFuncCodeEntry.prototype.getName = function() {
+Profile.DynamicFuncCodeEntry.prototype.getName = function () {
var name = this.func.getName();
return this.type + ': ' + this.getState() + name;
};
@@ -546,17 +604,17 @@ Profile.DynamicFuncCodeEntry.prototype.getName = function() {
/**
* Returns raw node name (without type decoration).
*/
-Profile.DynamicFuncCodeEntry.prototype.getRawName = function() {
+Profile.DynamicFuncCodeEntry.prototype.getRawName = function () {
return this.func.getName();
};
-Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function() {
+Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function () {
return true;
};
-Profile.DynamicFuncCodeEntry.prototype.toString = function() {
+Profile.DynamicFuncCodeEntry.prototype.toString = function () {
return this.getName() + ': ' + this.size.toString(16);
};
@@ -567,7 +625,7 @@ Profile.DynamicFuncCodeEntry.prototype.toString = function() {
* @param {string} name Function name.
* @constructor
*/
-Profile.FunctionEntry = function(name) {
+Profile.FunctionEntry = function (name) {
CodeMap.CodeEntry.call(this, 0, name);
};
@@ -575,7 +633,7 @@ Profile.FunctionEntry = function(name) {
/**
* Returns node name.
*/
-Profile.FunctionEntry.prototype.getName = function() {
+Profile.FunctionEntry.prototype.getName = function () {
var name = this.name;
if (name.length == 0) {
name = '<anonymous>';
@@ -595,7 +653,7 @@ Profile.FunctionEntry.prototype.toString = CodeMap.CodeEntry.prototype.toString;
*/
function CallTree() {
this.root_ = new CallTree.Node(
- CallTree.ROOT_NODE_LABEL);
+ CallTree.ROOT_NODE_LABEL);
};
@@ -614,7 +672,7 @@ CallTree.prototype.totalsComputed_ = false;
/**
* Returns the tree root.
*/
-CallTree.prototype.getRoot = function() {
+CallTree.prototype.getRoot = function () {
return this.root_;
};
@@ -624,7 +682,7 @@ CallTree.prototype.getRoot = function() {
*
* @param {Array<string>} path Call path.
*/
-CallTree.prototype.addPath = function(path) {
+CallTree.prototype.addPath = function (path) {
if (path.length == 0) {
return;
}
@@ -644,7 +702,7 @@ CallTree.prototype.addPath = function(path) {
*
* @param {string} label Child node label.
*/
-CallTree.prototype.findOrAddChild = function(label) {
+CallTree.prototype.findOrAddChild = function (label) {
return this.root_.findOrAddChild(label);
};
@@ -665,9 +723,9 @@ CallTree.prototype.findOrAddChild = function(label) {
*
* @param {string} label The label of the new root node.
*/
-CallTree.prototype.cloneSubtree = function(label) {
+CallTree.prototype.cloneSubtree = function (label) {
var subTree = new CallTree();
- this.traverse(function(node, parent) {
+ this.traverse(function (node, parent) {
if (!parent && node.label != label) {
return null;
}
@@ -682,7 +740,7 @@ CallTree.prototype.cloneSubtree = function(label) {
/**
* Computes total weights in the call graph.
*/
-CallTree.prototype.computeTotalWeights = function() {
+CallTree.prototype.computeTotalWeights = function () {
if (this.totalsComputed_) {
return;
}
@@ -706,16 +764,17 @@ CallTree.prototype.computeTotalWeights = function() {
* @param {function(CallTree.Node, *)} f Visitor function.
* The second parameter is the result of calling 'f' on the parent node.
*/
-CallTree.prototype.traverse = function(f) {
+CallTree.prototype.traverse = function (f) {
var pairsToProcess = new ConsArray();
- pairsToProcess.concat([{node: this.root_, param: null}]);
+ pairsToProcess.concat([{ node: this.root_, param: null }]);
while (!pairsToProcess.atEnd()) {
var pair = pairsToProcess.next();
var node = pair.node;
var newParam = f(node, pair.param);
var morePairsToProcess = [];
node.forEachChild(function (child) {
- morePairsToProcess.push({node: child, param: newParam}); });
+ morePairsToProcess.push({ node: child, param: newParam });
+ });
pairsToProcess.concat(morePairsToProcess);
}
};
@@ -729,7 +788,7 @@ CallTree.prototype.traverse = function(f) {
* @param {function(CallTree.Node)} exit A function called
* after visiting node's children.
*/
-CallTree.prototype.traverseInDepth = function(enter, exit) {
+CallTree.prototype.traverseInDepth = function (enter, exit) {
function traverse(node) {
enter(node);
node.forEachChild(traverse);
@@ -745,7 +804,7 @@ CallTree.prototype.traverseInDepth = function(enter, exit) {
* @param {string} label Node label.
* @param {CallTree.Node} opt_parent Node parent.
*/
-CallTree.Node = function(label, opt_parent) {
+CallTree.Node = function (label, opt_parent) {
this.label = label;
this.parent = opt_parent;
this.children = {};
@@ -772,7 +831,7 @@ CallTree.Node.prototype.totalWeight = 0;
*
* @param {string} label Child node label.
*/
-CallTree.Node.prototype.addChild = function(label) {
+CallTree.Node.prototype.addChild = function (label) {
var child = new CallTree.Node(label, this);
this.children[label] = child;
return child;
@@ -783,18 +842,19 @@ CallTree.Node.prototype.addChild = function(label) {
* Computes node's total weight.
*/
CallTree.Node.prototype.computeTotalWeight =
- function() {
- var totalWeight = this.selfWeight;
- this.forEachChild(function(child) {
- totalWeight += child.computeTotalWeight(); });
- return this.totalWeight = totalWeight;
-};
+ function () {
+ var totalWeight = this.selfWeight;
+ this.forEachChild(function (child) {
+ totalWeight += child.computeTotalWeight();
+ });
+ return this.totalWeight = totalWeight;
+ };
/**
* Returns all node's children as an array.
*/
-CallTree.Node.prototype.exportChildren = function() {
+CallTree.Node.prototype.exportChildren = function () {
var result = [];
this.forEachChild(function (node) { result.push(node); });
return result;
@@ -806,7 +866,7 @@ CallTree.Node.prototype.exportChildren = function() {
*
* @param {string} label Child node label.
*/
-CallTree.Node.prototype.findChild = function(label) {
+CallTree.Node.prototype.findChild = function (label) {
return this.children[label] || null;
};
@@ -817,7 +877,7 @@ CallTree.Node.prototype.findChild = function(label) {
*
* @param {string} label Child node label.
*/
-CallTree.Node.prototype.findOrAddChild = function(label) {
+CallTree.Node.prototype.findOrAddChild = function (label) {
return this.findChild(label) || this.addChild(label);
};
@@ -827,7 +887,7 @@ CallTree.Node.prototype.findOrAddChild = function(label) {
*
* @param {function(CallTree.Node)} f Visitor function.
*/
-CallTree.Node.prototype.forEachChild = function(f) {
+CallTree.Node.prototype.forEachChild = function (f) {
for (var c in this.children) {
f(this.children[c]);
}
@@ -839,7 +899,7 @@ CallTree.Node.prototype.forEachChild = function(f) {
*
* @param {function(CallTree.Node)} f Visitor function.
*/
-CallTree.Node.prototype.walkUpToRoot = function(f) {
+CallTree.Node.prototype.walkUpToRoot = function (f) {
for (var curr = this; curr != null; curr = curr.parent) {
f(curr);
}
@@ -852,8 +912,8 @@ CallTree.Node.prototype.walkUpToRoot = function(f) {
* @param {Array<string>} labels The path.
* @param {function(CallTree.Node)} opt_f Visitor function.
*/
-CallTree.Node.prototype.descendToChild = function(
- labels, opt_f) {
+CallTree.Node.prototype.descendToChild = function (
+ labels, opt_f) {
for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
var child = curr.findChild(labels[pos]);
if (opt_f) {
@@ -872,30 +932,30 @@ function JsonProfile() {
this.scripts_ = [];
}
-JsonProfile.prototype.addLibrary = function(
- name, startAddr, endAddr) {
+JsonProfile.prototype.addLibrary = function (
+ name, startAddr, endAddr) {
var entry = new CodeMap.CodeEntry(
- endAddr - startAddr, name, 'SHARED_LIB');
+ endAddr - startAddr, name, 'SHARED_LIB');
this.codeMap_.addLibrary(startAddr, entry);
entry.codeId = this.codeEntries_.length;
- this.codeEntries_.push({name : entry.name, type : entry.type});
+ this.codeEntries_.push({ name: entry.name, type: entry.type });
return entry;
};
-JsonProfile.prototype.addStaticCode = function(
- name, startAddr, endAddr) {
+JsonProfile.prototype.addStaticCode = function (
+ name, startAddr, endAddr) {
var entry = new CodeMap.CodeEntry(
- endAddr - startAddr, name, 'CPP');
+ endAddr - startAddr, name, 'CPP');
this.codeMap_.addStaticCode(startAddr, entry);
entry.codeId = this.codeEntries_.length;
- this.codeEntries_.push({name : entry.name, type : entry.type});
+ this.codeEntries_.push({ name: entry.name, type: entry.type });
return entry;
};
-JsonProfile.prototype.addCode = function(
- kind, name, timestamp, start, size) {
+JsonProfile.prototype.addCode = function (
+ kind, name, timestamp, start, size) {
let codeId = this.codeEntries_.length;
// Find out if we have a static code entry for the code. If yes, we will
// make sure it is written to the JSON file just once.
@@ -909,17 +969,17 @@ JsonProfile.prototype.addCode = function(
entry.codeId = codeId;
this.codeEntries_[codeId] = {
- name : entry.name,
+ name: entry.name,
timestamp: timestamp,
- type : entry.type,
- kind : kind
+ type: entry.type,
+ kind: kind
};
return entry;
};
-JsonProfile.prototype.addFuncCode = function(
- kind, name, timestamp, start, size, funcAddr, state) {
+JsonProfile.prototype.addFuncCode = function (
+ kind, name, timestamp, start, size, funcAddr, state) {
// As code and functions are in the same address space,
// it is safe to put them in a single code map.
var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr);
@@ -928,13 +988,13 @@ JsonProfile.prototype.addFuncCode = function(
this.codeMap_.addCode(funcAddr, func);
func.funcId = this.functionEntries_.length;
- this.functionEntries_.push({name : name, codes : []});
+ this.functionEntries_.push({ name: name, codes: [] });
} else if (func.name !== name) {
// Function object has been overwritten with a new one.
func.name = name;
func.funcId = this.functionEntries_.length;
- this.functionEntries_.push({name : name, codes : []});
+ this.functionEntries_.push({ name: name, codes: [] });
}
// TODO(jarin): Insert the code object into the SFI's code list.
var entry = this.codeMap_.findDynamicEntryByStartAddress(start);
@@ -964,17 +1024,17 @@ JsonProfile.prototype.addFuncCode = function(
}
this.codeEntries_.push({
- name : entry.name,
- type : entry.type,
- kind : kind,
- func : func.funcId,
- tm : timestamp
+ name: entry.name,
+ type: entry.type,
+ kind: kind,
+ func: func.funcId,
+ tm: timestamp
});
}
return entry;
};
-JsonProfile.prototype.moveCode = function(from, to) {
+JsonProfile.prototype.moveCode = function (from, to) {
try {
this.codeMap_.moveCode(from, to);
} catch (e) {
@@ -982,9 +1042,9 @@ JsonProfile.prototype.moveCode = function(from, to) {
}
};
-JsonProfile.prototype.addSourcePositions = function(
- start, script, startPos, endPos, sourcePositions, inliningPositions,
- inlinedFunctions) {
+JsonProfile.prototype.addSourcePositions = function (
+ start, script, startPos, endPos, sourcePositions, inliningPositions,
+ inlinedFunctions) {
var entry = this.codeMap_.findDynamicEntryByStartAddress(start);
if (!entry) return;
var codeId = entry.codeId;
@@ -1007,26 +1067,23 @@ JsonProfile.prototype.addSourcePositions = function(
}
this.codeEntries_[entry.codeId].source = {
- script : script,
- start : startPos,
- end : endPos,
- positions : sourcePositions,
- inlined : inliningPositions,
- fns : inlinedFunctions
+ script: script,
+ start: startPos,
+ end: endPos,
+ positions: sourcePositions,
+ inlined: inliningPositions,
+ fns: inlinedFunctions
};
};
-JsonProfile.prototype.addScriptSource = function(script, url, source) {
- this.scripts_[script] = {
- name : url,
- source : source
- };
+JsonProfile.prototype.addScriptSource = function (id, url, source) {
+ this.scripts_[id] = new Script(id, url, source);
};
-JsonProfile.prototype.deoptCode = function(
- timestamp, code, inliningId, scriptOffset, bailoutType,
- sourcePositionText, deoptReasonText) {
+JsonProfile.prototype.deoptCode = function (
+ timestamp, code, inliningId, scriptOffset, bailoutType,
+ sourcePositionText, deoptReasonText) {
let entry = this.codeMap_.findDynamicEntryByStartAddress(code);
if (entry) {
let codeId = entry.codeId;
@@ -1035,18 +1092,18 @@ JsonProfile.prototype.deoptCode = function(
// The subsequent deoptimizations should be lazy deopts for
// other on-stack activations.
this.codeEntries_[codeId].deopt = {
- tm : timestamp,
- inliningId : inliningId,
- scriptOffset : scriptOffset,
- posText : sourcePositionText,
- reason : deoptReasonText,
- bailoutType : bailoutType
+ tm: timestamp,
+ inliningId: inliningId,
+ scriptOffset: scriptOffset,
+ posText: sourcePositionText,
+ reason: deoptReasonText,
+ bailoutType: bailoutType
};
}
}
};
-JsonProfile.prototype.deleteCode = function(start) {
+JsonProfile.prototype.deleteCode = function (start) {
try {
this.codeMap_.deleteCode(start);
} catch (e) {
@@ -1054,17 +1111,17 @@ JsonProfile.prototype.deleteCode = function(start) {
}
};
-JsonProfile.prototype.moveFunc = function(from, to) {
+JsonProfile.prototype.moveFunc = function (from, to) {
if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
this.codeMap_.moveCode(from, to);
}
};
-JsonProfile.prototype.findEntry = function(addr) {
+JsonProfile.prototype.findEntry = function (addr) {
return this.codeMap_.findEntry(addr);
};
-JsonProfile.prototype.recordTick = function(time_ns, vmState, stack) {
+JsonProfile.prototype.recordTick = function (time_ns, vmState, stack) {
// TODO(jarin) Resolve the frame-less case (when top of stack is
// known code).
var processedStack = [];
@@ -1076,14 +1133,14 @@ JsonProfile.prototype.recordTick = function(time_ns, vmState, stack) {
processedStack.push(-1, stack[i]);
}
}
- this.ticks_.push({ tm : time_ns, vm : vmState, s : processedStack });
+ this.ticks_.push({ tm: time_ns, vm: vmState, s: processedStack });
};
function writeJson(s) {
write(JSON.stringify(s, null, 2));
}
-JsonProfile.prototype.writeJson = function() {
+JsonProfile.prototype.writeJson = function () {
// Write out the JSON in a partially manual way to avoid creating too-large
// strings in one JSON.stringify call when there are a lot of ticks.
write('{\n')
diff --git a/deps/v8/tools/profile.mjs b/deps/v8/tools/profile.mjs
new file mode 100644
index 0000000000..50864dce0f
--- /dev/null
+++ b/deps/v8/tools/profile.mjs
@@ -0,0 +1,1175 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import { CodeMap } from "./codemap.mjs";
+import { ConsArray } from "./consarray.mjs";
+
+// TODO: move to separate modules
+export class SourcePosition {
+ constructor(script, line, column) {
+ this.script = script;
+ this.line = line;
+ this.column = column;
+ this.entries = [];
+ }
+ addEntry(entry) {
+ this.entries.push(entry);
+ }
+}
+
+export class Script {
+
+ constructor(id, name, source) {
+ this.id = id;
+ this.name = name;
+ this.source = source;
+ this.sourcePositions = [];
+ // Map<line, Map<column, SourcePosition>>
+ this.lineToColumn = new Map();
+ }
+
+ addSourcePosition(line, column, entry) {
+ let sourcePosition = this.lineToColumn.get(line)?.get(column);
+ if (sourcePosition === undefined) {
+ sourcePosition = new SourcePosition(this, line, column, )
+ this.#addSourcePosition(line, column, sourcePosition);
+ }
+ sourcePosition.addEntry(entry);
+ return sourcePosition;
+ }
+
+ #addSourcePosition(line, column, sourcePosition) {
+ let columnToSourcePosition;
+ if (this.lineToColumn.has(line)) {
+ columnToSourcePosition = this.lineToColumn.get(line);
+ } else {
+ columnToSourcePosition = new Map();
+ this.lineToColumn.set(line, columnToSourcePosition);
+ }
+ this.sourcePositions.push(sourcePosition);
+ columnToSourcePosition.set(column, sourcePosition);
+ }
+}
+
+/**
+ * Creates a profile object for processing profiling-related events
+ * and calculating function execution times.
+ *
+ * @constructor
+ */
+export function Profile() {
+ this.codeMap_ = new CodeMap();
+ this.topDownTree_ = new CallTree();
+ this.bottomUpTree_ = new CallTree();
+ this.c_entries_ = {};
+ this.ticks_ = [];
+ this.scripts_ = [];
+ this.urlToScript_ = new Map();
+};
+
+
+/**
+ * Returns whether a function with the specified name must be skipped.
+ * Should be overriden by subclasses.
+ *
+ * @param {string} name Function name.
+ */
+Profile.prototype.skipThisFunction = function (name) {
+ return false;
+};
+
+
+/**
+ * Enum for profiler operations that involve looking up existing
+ * code entries.
+ *
+ * @enum {number}
+ */
+Profile.Operation = {
+ MOVE: 0,
+ DELETE: 1,
+ TICK: 2
+};
+
+
+/**
+ * Enum for code state regarding its dynamic optimization.
+ *
+ * @enum {number}
+ */
+Profile.CodeState = {
+ COMPILED: 0,
+ OPTIMIZABLE: 1,
+ OPTIMIZED: 2
+};
+
+
+/**
+ * Called whenever the specified operation has failed finding a function
+ * containing the specified address. Should be overriden by subclasses.
+ * See the Profile.Operation enum for the list of
+ * possible operations.
+ *
+ * @param {number} operation Operation.
+ * @param {number} addr Address of the unknown code.
+ * @param {number} opt_stackPos If an unknown address is encountered
+ * during stack strace processing, specifies a position of the frame
+ * containing the address.
+ */
+Profile.prototype.handleUnknownCode = function (
+ operation, addr, opt_stackPos) {
+};
+
+
+/**
+ * Registers a library.
+ *
+ * @param {string} name Code entry name.
+ * @param {number} startAddr Starting address.
+ * @param {number} endAddr Ending address.
+ */
+Profile.prototype.addLibrary = function (
+ name, startAddr, endAddr) {
+ var entry = new CodeMap.CodeEntry(
+ endAddr - startAddr, name, 'SHARED_LIB');
+ this.codeMap_.addLibrary(startAddr, entry);
+ return entry;
+};
+
+
+/**
+ * Registers statically compiled code entry.
+ *
+ * @param {string} name Code entry name.
+ * @param {number} startAddr Starting address.
+ * @param {number} endAddr Ending address.
+ */
+Profile.prototype.addStaticCode = function (
+ name, startAddr, endAddr) {
+ var entry = new CodeMap.CodeEntry(
+ endAddr - startAddr, name, 'CPP');
+ this.codeMap_.addStaticCode(startAddr, entry);
+ return entry;
+};
+
+
+/**
+ * Registers dynamic (JIT-compiled) code entry.
+ *
+ * @param {string} type Code entry type.
+ * @param {string} name Code entry name.
+ * @param {number} start Starting address.
+ * @param {number} size Code entry size.
+ */
+Profile.prototype.addCode = function (
+ type, name, timestamp, start, size) {
+ var entry = new Profile.DynamicCodeEntry(size, type, name);
+ this.codeMap_.addCode(start, entry);
+ return entry;
+};
+
+
+/**
+ * Registers dynamic (JIT-compiled) code entry.
+ *
+ * @param {string} type Code entry type.
+ * @param {string} name Code entry name.
+ * @param {number} start Starting address.
+ * @param {number} size Code entry size.
+ * @param {number} funcAddr Shared function object address.
+ * @param {Profile.CodeState} state Optimization state.
+ */
+Profile.prototype.addFuncCode = function (
+ type, name, timestamp, start, size, funcAddr, state) {
+ // As code and functions are in the same address space,
+ // it is safe to put them in a single code map.
+ var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr);
+ if (!func) {
+ func = new Profile.FunctionEntry(name);
+ this.codeMap_.addCode(funcAddr, func);
+ } else if (func.name !== name) {
+ // Function object has been overwritten with a new one.
+ func.name = name;
+ }
+ var entry = this.codeMap_.findDynamicEntryByStartAddress(start);
+ if (entry) {
+ if (entry.size === size && entry.func === func) {
+ // Entry state has changed.
+ entry.state = state;
+ } else {
+ this.codeMap_.deleteCode(start);
+ entry = null;
+ }
+ }
+ if (!entry) {
+ entry = new Profile.DynamicFuncCodeEntry(size, type, func, state);
+ this.codeMap_.addCode(start, entry);
+ }
+ return entry;
+};
+
+
+/**
+ * Reports about moving of a dynamic code entry.
+ *
+ * @param {number} from Current code entry address.
+ * @param {number} to New code entry address.
+ */
+Profile.prototype.moveCode = function (from, to) {
+ try {
+ this.codeMap_.moveCode(from, to);
+ } catch (e) {
+ this.handleUnknownCode(Profile.Operation.MOVE, from);
+ }
+};
+
+Profile.prototype.deoptCode = function (
+ timestamp, code, inliningId, scriptOffset, bailoutType,
+ sourcePositionText, deoptReasonText) {
+};
+
+/**
+ * Reports about deletion of a dynamic code entry.
+ *
+ * @param {number} start Starting address.
+ */
+Profile.prototype.deleteCode = function (start) {
+ try {
+ this.codeMap_.deleteCode(start);
+ } catch (e) {
+ this.handleUnknownCode(Profile.Operation.DELETE, start);
+ }
+};
+
+/**
+ * Adds source positions for given code.
+ */
+Profile.prototype.addSourcePositions = function (
+ start, script, startPos, endPos, sourcePositions, inliningPositions,
+ inlinedFunctions) {
+ // CLI does not need source code => ignore.
+};
+
+/**
+ * Adds script source code.
+ */
+Profile.prototype.addScriptSource = function (id, url, source) {
+ const script = new Script(id, url, source);
+ this.scripts_[id] = script;
+ this.urlToScript_.set(url, script);
+};
+
+
+/**
+ * Adds script source code.
+ */
+Profile.prototype.getScript = function (url) {
+ return this.urlToScript_.get(url);
+};
+
+/**
+ * Reports about moving of a dynamic code entry.
+ *
+ * @param {number} from Current code entry address.
+ * @param {number} to New code entry address.
+ */
+Profile.prototype.moveFunc = function (from, to) {
+ if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
+ this.codeMap_.moveCode(from, to);
+ }
+};
+
+
+/**
+ * Retrieves a code entry by an address.
+ *
+ * @param {number} addr Entry address.
+ */
+Profile.prototype.findEntry = function (addr) {
+ return this.codeMap_.findEntry(addr);
+};
+
+
+/**
+ * Records a tick event. Stack must contain a sequence of
+ * addresses starting with the program counter value.
+ *
+ * @param {Array<number>} stack Stack sample.
+ */
+Profile.prototype.recordTick = function (time_ns, vmState, stack) {
+ var processedStack = this.resolveAndFilterFuncs_(stack);
+ this.bottomUpTree_.addPath(processedStack);
+ processedStack.reverse();
+ this.topDownTree_.addPath(processedStack);
+};
+
+
+/**
+ * Translates addresses into function names and filters unneeded
+ * functions.
+ *
+ * @param {Array<number>} stack Stack sample.
+ */
+Profile.prototype.resolveAndFilterFuncs_ = function (stack) {
+ var result = [];
+ var last_seen_c_function = '';
+ var look_for_first_c_function = false;
+ for (var i = 0; i < stack.length; ++i) {
+ var entry = this.codeMap_.findEntry(stack[i]);
+ if (entry) {
+ var name = entry.getName();
+ if (i === 0 && (entry.type === 'CPP' || entry.type === 'SHARED_LIB')) {
+ look_for_first_c_function = true;
+ }
+ if (look_for_first_c_function && entry.type === 'CPP') {
+ last_seen_c_function = name;
+ }
+ if (!this.skipThisFunction(name)) {
+ result.push(name);
+ }
+ } else {
+ this.handleUnknownCode(Profile.Operation.TICK, stack[i], i);
+ if (i === 0) result.push("UNKNOWN");
+ }
+ if (look_for_first_c_function &&
+ i > 0 &&
+ (!entry || entry.type !== 'CPP') &&
+ last_seen_c_function !== '') {
+ if (this.c_entries_[last_seen_c_function] === undefined) {
+ this.c_entries_[last_seen_c_function] = 0;
+ }
+ this.c_entries_[last_seen_c_function]++;
+ look_for_first_c_function = false; // Found it, we're done.
+ }
+ }
+ return result;
+};
+
+
+/**
+ * Performs a BF traversal of the top down call graph.
+ *
+ * @param {function(CallTree.Node)} f Visitor function.
+ */
+Profile.prototype.traverseTopDownTree = function (f) {
+ this.topDownTree_.traverse(f);
+};
+
+
+/**
+ * Performs a BF traversal of the bottom up call graph.
+ *
+ * @param {function(CallTree.Node)} f Visitor function.
+ */
+Profile.prototype.traverseBottomUpTree = function (f) {
+ this.bottomUpTree_.traverse(f);
+};
+
+
+/**
+ * Calculates a top down profile for a node with the specified label.
+ * If no name specified, returns the whole top down calls tree.
+ *
+ * @param {string} opt_label Node label.
+ */
+Profile.prototype.getTopDownProfile = function (opt_label) {
+ return this.getTreeProfile_(this.topDownTree_, opt_label);
+};
+
+
+/**
+ * Calculates a bottom up profile for a node with the specified label.
+ * If no name specified, returns the whole bottom up calls tree.
+ *
+ * @param {string} opt_label Node label.
+ */
+Profile.prototype.getBottomUpProfile = function (opt_label) {
+ return this.getTreeProfile_(this.bottomUpTree_, opt_label);
+};
+
+
+/**
+ * Helper function for calculating a tree profile.
+ *
+ * @param {Profile.CallTree} tree Call tree.
+ * @param {string} opt_label Node label.
+ */
+Profile.prototype.getTreeProfile_ = function (tree, opt_label) {
+ if (!opt_label) {
+ tree.computeTotalWeights();
+ return tree;
+ } else {
+ var subTree = tree.cloneSubtree(opt_label);
+ subTree.computeTotalWeights();
+ return subTree;
+ }
+};
+
+
+/**
+ * Calculates a flat profile of callees starting from a node with
+ * the specified label. If no name specified, starts from the root.
+ *
+ * @param {string} opt_label Starting node label.
+ */
+Profile.prototype.getFlatProfile = function (opt_label) {
+ var counters = new CallTree();
+ var rootLabel = opt_label || CallTree.ROOT_NODE_LABEL;
+ var precs = {};
+ precs[rootLabel] = 0;
+ var root = counters.findOrAddChild(rootLabel);
+
+ this.topDownTree_.computeTotalWeights();
+ this.topDownTree_.traverseInDepth(
+ function onEnter(node) {
+ if (!(node.label in precs)) {
+ precs[node.label] = 0;
+ }
+ var nodeLabelIsRootLabel = node.label == rootLabel;
+ if (nodeLabelIsRootLabel || precs[rootLabel] > 0) {
+ if (precs[rootLabel] == 0) {
+ root.selfWeight += node.selfWeight;
+ root.totalWeight += node.totalWeight;
+ } else {
+ var rec = root.findOrAddChild(node.label);
+ rec.selfWeight += node.selfWeight;
+ if (nodeLabelIsRootLabel || precs[node.label] == 0) {
+ rec.totalWeight += node.totalWeight;
+ }
+ }
+ precs[node.label]++;
+ }
+ },
+ function onExit(node) {
+ if (node.label == rootLabel || precs[rootLabel] > 0) {
+ precs[node.label]--;
+ }
+ },
+ null);
+
+ if (!opt_label) {
+ // If we have created a flat profile for the whole program, we don't
+ // need an explicit root in it. Thus, replace the counters tree
+ // root with the node corresponding to the whole program.
+ counters.root_ = root;
+ } else {
+ // Propagate weights so percents can be calculated correctly.
+ counters.getRoot().selfWeight = root.selfWeight;
+ counters.getRoot().totalWeight = root.totalWeight;
+ }
+ return counters;
+};
+
+
+Profile.CEntryNode = function (name, ticks) {
+ this.name = name;
+ this.ticks = ticks;
+}
+
+
+Profile.prototype.getCEntryProfile = function () {
+ var result = [new Profile.CEntryNode("TOTAL", 0)];
+ var total_ticks = 0;
+ for (var f in this.c_entries_) {
+ var ticks = this.c_entries_[f];
+ total_ticks += ticks;
+ result.push(new Profile.CEntryNode(f, ticks));
+ }
+ result[0].ticks = total_ticks; // Sorting will keep this at index 0.
+ result.sort(function (n1, n2) {
+ return n2.ticks - n1.ticks || (n2.name < n1.name ? -1 : 1)
+ });
+ return result;
+}
+
+
+/**
+ * Cleans up function entries that are not referenced by code entries.
+ */
+Profile.prototype.cleanUpFuncEntries = function () {
+ var referencedFuncEntries = [];
+ var entries = this.codeMap_.getAllDynamicEntriesWithAddresses();
+ for (var i = 0, l = entries.length; i < l; ++i) {
+ if (entries[i][1].constructor === Profile.FunctionEntry) {
+ entries[i][1].used = false;
+ }
+ }
+ for (var i = 0, l = entries.length; i < l; ++i) {
+ if ("func" in entries[i][1]) {
+ entries[i][1].func.used = true;
+ }
+ }
+ for (var i = 0, l = entries.length; i < l; ++i) {
+ if (entries[i][1].constructor === Profile.FunctionEntry &&
+ !entries[i][1].used) {
+ this.codeMap_.deleteCode(entries[i][0]);
+ }
+ }
+};
+
+
+/**
+ * Creates a dynamic code entry.
+ *
+ * @param {number} size Code size.
+ * @param {string} type Code type.
+ * @param {string} name Function name.
+ * @constructor
+ */
+Profile.DynamicCodeEntry = function (size, type, name) {
+ CodeMap.CodeEntry.call(this, size, name, type);
+};
+
+
+/**
+ * Returns node name.
+ */
+Profile.DynamicCodeEntry.prototype.getName = function () {
+ return this.type + ': ' + this.name;
+};
+
+
+/**
+ * Returns raw node name (without type decoration).
+ */
+Profile.DynamicCodeEntry.prototype.getRawName = function () {
+ return this.name;
+};
+
+
+Profile.DynamicCodeEntry.prototype.isJSFunction = function () {
+ return false;
+};
+
+
+Profile.DynamicCodeEntry.prototype.toString = function () {
+ return this.getName() + ': ' + this.size.toString(16);
+};
+
+
+/**
+ * Creates a dynamic code entry.
+ *
+ * @param {number} size Code size.
+ * @param {string} type Code type.
+ * @param {Profile.FunctionEntry} func Shared function entry.
+ * @param {Profile.CodeState} state Code optimization state.
+ * @constructor
+ */
+Profile.DynamicFuncCodeEntry = function (size, type, func, state) {
+ CodeMap.CodeEntry.call(this, size, '', type);
+ this.func = func;
+ this.state = state;
+};
+
+Profile.DynamicFuncCodeEntry.STATE_PREFIX = ["", "~", "*"];
+
+/**
+ * Returns state.
+ */
+Profile.DynamicFuncCodeEntry.prototype.getState = function () {
+ return Profile.DynamicFuncCodeEntry.STATE_PREFIX[this.state];
+};
+
+/**
+ * Returns node name.
+ */
+Profile.DynamicFuncCodeEntry.prototype.getName = function () {
+ var name = this.func.getName();
+ return this.type + ': ' + this.getState() + name;
+};
+
+
+/**
+ * Returns raw node name (without type decoration).
+ */
+Profile.DynamicFuncCodeEntry.prototype.getRawName = function () {
+ return this.func.getName();
+};
+
+
+Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function () {
+ return true;
+};
+
+
+Profile.DynamicFuncCodeEntry.prototype.toString = function () {
+ return this.getName() + ': ' + this.size.toString(16);
+};
+
+
+/**
+ * Creates a shared function object entry.
+ *
+ * @param {string} name Function name.
+ * @constructor
+ */
+Profile.FunctionEntry = function (name) {
+ CodeMap.CodeEntry.call(this, 0, name);
+};
+
+
+/**
+ * Returns node name.
+ */
+Profile.FunctionEntry.prototype.getName = function () {
+ var name = this.name;
+ if (name.length == 0) {
+ name = '<anonymous>';
+ } else if (name.charAt(0) == ' ') {
+ // An anonymous function with location: " aaa.js:10".
+ name = '<anonymous>' + name;
+ }
+ return name;
+};
+
+Profile.FunctionEntry.prototype.toString = CodeMap.CodeEntry.prototype.toString;
+
+/**
+ * Constructs a call graph.
+ *
+ * @constructor
+ */
+function CallTree() {
+ this.root_ = new CallTree.Node(
+ CallTree.ROOT_NODE_LABEL);
+};
+
+
+/**
+ * The label of the root node.
+ */
+CallTree.ROOT_NODE_LABEL = '';
+
+
+/**
+ * @private
+ */
+CallTree.prototype.totalsComputed_ = false;
+
+
+/**
+ * Returns the tree root.
+ */
+CallTree.prototype.getRoot = function () {
+ return this.root_;
+};
+
+
+/**
+ * Adds the specified call path, constructing nodes as necessary.
+ *
+ * @param {Array<string>} path Call path.
+ */
+CallTree.prototype.addPath = function (path) {
+ if (path.length == 0) {
+ return;
+ }
+ var curr = this.root_;
+ for (var i = 0; i < path.length; ++i) {
+ curr = curr.findOrAddChild(path[i]);
+ }
+ curr.selfWeight++;
+ this.totalsComputed_ = false;
+};
+
+
+/**
+ * Finds an immediate child of the specified parent with the specified
+ * label, creates a child node if necessary. If a parent node isn't
+ * specified, uses tree root.
+ *
+ * @param {string} label Child node label.
+ */
+CallTree.prototype.findOrAddChild = function (label) {
+ return this.root_.findOrAddChild(label);
+};
+
+
+/**
+ * Creates a subtree by cloning and merging all subtrees rooted at nodes
+ * with a given label. E.g. cloning the following call tree on label 'A'
+ * will give the following result:
+ *
+ * <A>--<B> <B>
+ * / /
+ * <root> == clone on 'A' ==> <root>--<A>
+ * \ \
+ * <C>--<A>--<D> <D>
+ *
+ * And <A>'s selfWeight will be the sum of selfWeights of <A>'s from the
+ * source call tree.
+ *
+ * @param {string} label The label of the new root node.
+ */
+CallTree.prototype.cloneSubtree = function (label) {
+ var subTree = new CallTree();
+ this.traverse(function (node, parent) {
+ if (!parent && node.label != label) {
+ return null;
+ }
+ var child = (parent ? parent : subTree).findOrAddChild(node.label);
+ child.selfWeight += node.selfWeight;
+ return child;
+ });
+ return subTree;
+};
+
+
+/**
+ * Computes total weights in the call graph.
+ */
+CallTree.prototype.computeTotalWeights = function () {
+ if (this.totalsComputed_) {
+ return;
+ }
+ this.root_.computeTotalWeight();
+ this.totalsComputed_ = true;
+};
+
+
+/**
+ * Traverses the call graph in preorder. This function can be used for
+ * building optionally modified tree clones. This is the boilerplate code
+ * for this scenario:
+ *
+ * callTree.traverse(function(node, parentClone) {
+ * var nodeClone = cloneNode(node);
+ * if (parentClone)
+ * parentClone.addChild(nodeClone);
+ * return nodeClone;
+ * });
+ *
+ * @param {function(CallTree.Node, *)} f Visitor function.
+ * The second parameter is the result of calling 'f' on the parent node.
+ */
+CallTree.prototype.traverse = function (f) {
+ var pairsToProcess = new ConsArray();
+ pairsToProcess.concat([{ node: this.root_, param: null }]);
+ while (!pairsToProcess.atEnd()) {
+ var pair = pairsToProcess.next();
+ var node = pair.node;
+ var newParam = f(node, pair.param);
+ var morePairsToProcess = [];
+ node.forEachChild(function (child) {
+ morePairsToProcess.push({ node: child, param: newParam });
+ });
+ pairsToProcess.concat(morePairsToProcess);
+ }
+};
+
+
+/**
+ * Performs an indepth call graph traversal.
+ *
+ * @param {function(CallTree.Node)} enter A function called
+ * prior to visiting node's children.
+ * @param {function(CallTree.Node)} exit A function called
+ * after visiting node's children.
+ */
+CallTree.prototype.traverseInDepth = function (enter, exit) {
+ function traverse(node) {
+ enter(node);
+ node.forEachChild(traverse);
+ exit(node);
+ }
+ traverse(this.root_);
+};
+
+
+/**
+ * Constructs a call graph node.
+ *
+ * @param {string} label Node label.
+ * @param {CallTree.Node} opt_parent Node parent.
+ */
+CallTree.Node = function (label, opt_parent) {
+ this.label = label;
+ this.parent = opt_parent;
+ this.children = {};
+};
+
+
+/**
+ * Node self weight (how many times this node was the last node in
+ * a call path).
+ * @type {number}
+ */
+CallTree.Node.prototype.selfWeight = 0;
+
+
+/**
+ * Node total weight (includes weights of all children).
+ * @type {number}
+ */
+CallTree.Node.prototype.totalWeight = 0;
+
+
+/**
+ * Adds a child node.
+ *
+ * @param {string} label Child node label.
+ */
+CallTree.Node.prototype.addChild = function (label) {
+ var child = new CallTree.Node(label, this);
+ this.children[label] = child;
+ return child;
+};
+
+
+/**
+ * Computes node's total weight.
+ */
+CallTree.Node.prototype.computeTotalWeight =
+ function () {
+ var totalWeight = this.selfWeight;
+ this.forEachChild(function (child) {
+ totalWeight += child.computeTotalWeight();
+ });
+ return this.totalWeight = totalWeight;
+ };
+
+
+/**
+ * Returns all node's children as an array.
+ */
+CallTree.Node.prototype.exportChildren = function () {
+ var result = [];
+ this.forEachChild(function (node) { result.push(node); });
+ return result;
+};
+
+
+/**
+ * Finds an immediate child with the specified label.
+ *
+ * @param {string} label Child node label.
+ */
+CallTree.Node.prototype.findChild = function (label) {
+ return this.children[label] || null;
+};
+
+
+/**
+ * Finds an immediate child with the specified label, creates a child
+ * node if necessary.
+ *
+ * @param {string} label Child node label.
+ */
+CallTree.Node.prototype.findOrAddChild = function (label) {
+ return this.findChild(label) || this.addChild(label);
+};
+
+
+/**
+ * Calls the specified function for every child.
+ *
+ * @param {function(CallTree.Node)} f Visitor function.
+ */
+CallTree.Node.prototype.forEachChild = function (f) {
+ for (var c in this.children) {
+ f(this.children[c]);
+ }
+};
+
+
+/**
+ * Walks up from the current node up to the call tree root.
+ *
+ * @param {function(CallTree.Node)} f Visitor function.
+ */
+CallTree.Node.prototype.walkUpToRoot = function (f) {
+ for (var curr = this; curr != null; curr = curr.parent) {
+ f(curr);
+ }
+};
+
+
+/**
+ * Tries to find a node with the specified path.
+ *
+ * @param {Array<string>} labels The path.
+ * @param {function(CallTree.Node)} opt_f Visitor function.
+ */
+CallTree.Node.prototype.descendToChild = function (
+ labels, opt_f) {
+ for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
+ var child = curr.findChild(labels[pos]);
+ if (opt_f) {
+ opt_f(child, pos);
+ }
+ curr = child;
+ }
+ return curr;
+};
+
+export function JsonProfile() {
+ this.codeMap_ = new CodeMap();
+ this.codeEntries_ = [];
+ this.functionEntries_ = [];
+ this.ticks_ = [];
+ this.scripts_ = [];
+}
+
+JsonProfile.prototype.addLibrary = function (
+ name, startAddr, endAddr) {
+ var entry = new CodeMap.CodeEntry(
+ endAddr - startAddr, name, 'SHARED_LIB');
+ this.codeMap_.addLibrary(startAddr, entry);
+
+ entry.codeId = this.codeEntries_.length;
+ this.codeEntries_.push({ name: entry.name, type: entry.type });
+ return entry;
+};
+
+JsonProfile.prototype.addStaticCode = function (
+ name, startAddr, endAddr) {
+ var entry = new CodeMap.CodeEntry(
+ endAddr - startAddr, name, 'CPP');
+ this.codeMap_.addStaticCode(startAddr, entry);
+
+ entry.codeId = this.codeEntries_.length;
+ this.codeEntries_.push({ name: entry.name, type: entry.type });
+ return entry;
+};
+
+JsonProfile.prototype.addCode = function (
+ kind, name, timestamp, start, size) {
+ let codeId = this.codeEntries_.length;
+ // Find out if we have a static code entry for the code. If yes, we will
+ // make sure it is written to the JSON file just once.
+ let staticEntry = this.codeMap_.findAddress(start);
+ if (staticEntry && staticEntry.entry.type === 'CPP') {
+ codeId = staticEntry.entry.codeId;
+ }
+
+ var entry = new CodeMap.CodeEntry(size, name, 'CODE');
+ this.codeMap_.addCode(start, entry);
+
+ entry.codeId = codeId;
+ this.codeEntries_[codeId] = {
+ name: entry.name,
+ timestamp: timestamp,
+ type: entry.type,
+ kind: kind
+ };
+
+ return entry;
+};
+
+JsonProfile.prototype.addFuncCode = function (
+ kind, name, timestamp, start, size, funcAddr, state) {
+ // As code and functions are in the same address space,
+ // it is safe to put them in a single code map.
+ var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr);
+ if (!func) {
+ var func = new CodeMap.CodeEntry(0, name, 'SFI');
+ this.codeMap_.addCode(funcAddr, func);
+
+ func.funcId = this.functionEntries_.length;
+ this.functionEntries_.push({ name: name, codes: [] });
+ } else if (func.name !== name) {
+ // Function object has been overwritten with a new one.
+ func.name = name;
+
+ func.funcId = this.functionEntries_.length;
+ this.functionEntries_.push({ name: name, codes: [] });
+ }
+ // TODO(jarin): Insert the code object into the SFI's code list.
+ var entry = this.codeMap_.findDynamicEntryByStartAddress(start);
+ if (entry) {
+ if (entry.size === size && entry.func === func) {
+ // Entry state has changed.
+ entry.state = state;
+ } else {
+ this.codeMap_.deleteCode(start);
+ entry = null;
+ }
+ }
+ if (!entry) {
+ entry = new CodeMap.CodeEntry(size, name, 'JS');
+ this.codeMap_.addCode(start, entry);
+
+ entry.codeId = this.codeEntries_.length;
+
+ this.functionEntries_[func.funcId].codes.push(entry.codeId);
+
+ if (state === 0) {
+ kind = "Builtin";
+ } else if (state === 1) {
+ kind = "Unopt";
+ } else if (state === 2) {
+ kind = "Opt";
+ }
+
+ this.codeEntries_.push({
+ name: entry.name,
+ type: entry.type,
+ kind: kind,
+ func: func.funcId,
+ tm: timestamp
+ });
+ }
+ return entry;
+};
+
+JsonProfile.prototype.moveCode = function (from, to) {
+ try {
+ this.codeMap_.moveCode(from, to);
+ } catch (e) {
+ printErr("Move: unknown source " + from);
+ }
+};
+
+JsonProfile.prototype.addSourcePositions = function (
+ start, script, startPos, endPos, sourcePositions, inliningPositions,
+ inlinedFunctions) {
+ var entry = this.codeMap_.findDynamicEntryByStartAddress(start);
+ if (!entry) return;
+ var codeId = entry.codeId;
+
+ // Resolve the inlined functions list.
+ if (inlinedFunctions.length > 0) {
+ inlinedFunctions = inlinedFunctions.substring(1).split("S");
+ for (var i = 0; i < inlinedFunctions.length; i++) {
+ var funcAddr = parseInt(inlinedFunctions[i]);
+ var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr);
+ if (!func || func.funcId === undefined) {
+ printErr("Could not find function " + inlinedFunctions[i]);
+ inlinedFunctions[i] = null;
+ } else {
+ inlinedFunctions[i] = func.funcId;
+ }
+ }
+ } else {
+ inlinedFunctions = [];
+ }
+
+ this.codeEntries_[entry.codeId].source = {
+ script: script,
+ start: startPos,
+ end: endPos,
+ positions: sourcePositions,
+ inlined: inliningPositions,
+ fns: inlinedFunctions
+ };
+};
+
+JsonProfile.prototype.addScriptSource = function (id, url, source) {
+ this.scripts_[id] = new Script(id, url, source);
+};
+
+
+JsonProfile.prototype.deoptCode = function (
+ timestamp, code, inliningId, scriptOffset, bailoutType,
+ sourcePositionText, deoptReasonText) {
+ let entry = this.codeMap_.findDynamicEntryByStartAddress(code);
+ if (entry) {
+ let codeId = entry.codeId;
+ if (!this.codeEntries_[codeId].deopt) {
+ // Only add the deopt if there was no deopt before.
+ // The subsequent deoptimizations should be lazy deopts for
+ // other on-stack activations.
+ this.codeEntries_[codeId].deopt = {
+ tm: timestamp,
+ inliningId: inliningId,
+ scriptOffset: scriptOffset,
+ posText: sourcePositionText,
+ reason: deoptReasonText,
+ bailoutType: bailoutType
+ };
+ }
+ }
+};
+
+JsonProfile.prototype.deleteCode = function (start) {
+ try {
+ this.codeMap_.deleteCode(start);
+ } catch (e) {
+ printErr("Delete: unknown address " + start);
+ }
+};
+
+JsonProfile.prototype.moveFunc = function (from, to) {
+ if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
+ this.codeMap_.moveCode(from, to);
+ }
+};
+
+JsonProfile.prototype.findEntry = function (addr) {
+ return this.codeMap_.findEntry(addr);
+};
+
+JsonProfile.prototype.recordTick = function (time_ns, vmState, stack) {
+ // TODO(jarin) Resolve the frame-less case (when top of stack is
+ // known code).
+ var processedStack = [];
+ for (var i = 0; i < stack.length; i++) {
+ var resolved = this.codeMap_.findAddress(stack[i]);
+ if (resolved) {
+ processedStack.push(resolved.entry.codeId, resolved.offset);
+ } else {
+ processedStack.push(-1, stack[i]);
+ }
+ }
+ this.ticks_.push({ tm: time_ns, vm: vmState, s: processedStack });
+};
+
+function writeJson(s) {
+ write(JSON.stringify(s, null, 2));
+}
+
+JsonProfile.prototype.writeJson = function () {
+ // Write out the JSON in a partially manual way to avoid creating too-large
+ // strings in one JSON.stringify call when there are a lot of ticks.
+ write('{\n')
+
+ write(' "code": ');
+ writeJson(this.codeEntries_);
+ write(',\n');
+
+ write(' "functions": ');
+ writeJson(this.functionEntries_);
+ write(',\n');
+
+ write(' "ticks": [\n');
+ for (var i = 0; i < this.ticks_.length; i++) {
+ write(' ');
+ writeJson(this.ticks_[i]);
+ if (i < this.ticks_.length - 1) {
+ write(',\n');
+ } else {
+ write('\n');
+ }
+ }
+ write(' ],\n');
+
+ write(' "scripts": ');
+ writeJson(this.scripts_);
+
+ write('}\n');
+};
diff --git a/deps/v8/tools/profile_view.mjs b/deps/v8/tools/profile_view.mjs
new file mode 100644
index 0000000000..9349cc6a7a
--- /dev/null
+++ b/deps/v8/tools/profile_view.mjs
@@ -0,0 +1,202 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import { ConsArray } from "./consarray.mjs";
+
+/**
+ * Creates a Profile View builder object.
+ *
+ * @param {number} samplingRate Number of ms between profiler ticks.
+ * @constructor
+ */
+export function ViewBuilder(samplingRate) {
+ this.samplingRate = samplingRate;
+};
+
+
+/**
+ * Builds a profile view for the specified call tree.
+ *
+ * @param {CallTree} callTree A call tree.
+ * @param {boolean} opt_bottomUpViewWeights Whether remapping
+ * of self weights for a bottom up view is needed.
+ */
+ViewBuilder.prototype.buildView = function(
+ callTree, opt_bottomUpViewWeights) {
+ var head;
+ var samplingRate = this.samplingRate;
+ var createViewNode = this.createViewNode;
+ callTree.traverse(function(node, viewParent) {
+ var totalWeight = node.totalWeight * samplingRate;
+ var selfWeight = node.selfWeight * samplingRate;
+ if (opt_bottomUpViewWeights === true) {
+ if (viewParent === head) {
+ selfWeight = totalWeight;
+ } else {
+ selfWeight = 0;
+ }
+ }
+ var viewNode = createViewNode(node.label, totalWeight, selfWeight, head);
+ if (viewParent) {
+ viewParent.addChild(viewNode);
+ } else {
+ head = viewNode;
+ }
+ return viewNode;
+ });
+ var view = this.createView(head);
+ return view;
+};
+
+
+/**
+ * Factory method for a profile view.
+ *
+ * @param {ProfileView.Node} head View head node.
+ * @return {ProfileView} Profile view.
+ */
+ViewBuilder.prototype.createView = function(head) {
+ return new ProfileView(head);
+};
+
+
+/**
+ * Factory method for a profile view node.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ * corresponding function and its descendants (not that depending on
+ * profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ * corresponding function only.
+ * @param {ProfileView.Node} head Profile view head.
+ * @return {ProfileView.Node} Profile view node.
+ */
+ViewBuilder.prototype.createViewNode = function(
+ funcName, totalTime, selfTime, head) {
+ return new ProfileView.Node(
+ funcName, totalTime, selfTime, head);
+};
+
+
+/**
+ * Creates a Profile View object. It allows to perform sorting
+ * and filtering actions on the profile.
+ *
+ * @param {ProfileView.Node} head Head (root) node.
+ * @constructor
+ */
+export function ProfileView(head) {
+ this.head = head;
+};
+
+
+/**
+ * Sorts the profile view using the specified sort function.
+ *
+ * @param {function(ProfileView.Node,
+ * ProfileView.Node):number} sortFunc A sorting
+ * functions. Must comply with Array.sort sorting function requirements.
+ */
+ProfileView.prototype.sort = function(sortFunc) {
+ this.traverse(function (node) {
+ node.sortChildren(sortFunc);
+ });
+};
+
+
+/**
+ * Traverses profile view nodes in preorder.
+ *
+ * @param {function(ProfileView.Node)} f Visitor function.
+ */
+ProfileView.prototype.traverse = function(f) {
+ var nodesToTraverse = new ConsArray();
+ nodesToTraverse.concat([this.head]);
+ while (!nodesToTraverse.atEnd()) {
+ var node = nodesToTraverse.next();
+ f(node);
+ nodesToTraverse.concat(node.children);
+ }
+};
+
+
+/**
+ * Constructs a Profile View node object. Each node object corresponds to
+ * a function call.
+ *
+ * @param {string} internalFuncName A fully qualified function name.
+ * @param {number} totalTime Amount of time that application spent in the
+ * corresponding function and its descendants (not that depending on
+ * profile they can be either callees or callers.)
+ * @param {number} selfTime Amount of time that application spent in the
+ * corresponding function only.
+ * @param {ProfileView.Node} head Profile view head.
+ * @constructor
+ */
+ProfileView.Node = function(
+ internalFuncName, totalTime, selfTime, head) {
+ this.internalFuncName = internalFuncName;
+ this.totalTime = totalTime;
+ this.selfTime = selfTime;
+ this.head = head;
+ this.parent = null;
+ this.children = [];
+};
+
+
+/**
+ * Returns a share of the function's total time in its parent's total time.
+ */
+ProfileView.Node.prototype.__defineGetter__(
+ 'parentTotalPercent',
+ function() { return this.totalTime /
+ (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; });
+
+
+/**
+ * Adds a child to the node.
+ *
+ * @param {ProfileView.Node} node Child node.
+ */
+ProfileView.Node.prototype.addChild = function(node) {
+ node.parent = this;
+ this.children.push(node);
+};
+
+
+/**
+ * Sorts all the node's children recursively.
+ *
+ * @param {function(ProfileView.Node,
+ * ProfileView.Node):number} sortFunc A sorting
+ * functions. Must comply with Array.sort sorting function requirements.
+ */
+ProfileView.Node.prototype.sortChildren = function(
+ sortFunc) {
+ this.children.sort(sortFunc);
+};
diff --git a/deps/v8/tools/profviz/composer.js b/deps/v8/tools/profviz/composer.js
deleted file mode 100644
index 411a7248eb..0000000000
--- a/deps/v8/tools/profviz/composer.js
+++ /dev/null
@@ -1,557 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Array.prototype.top = function() {
- if (this.length == 0) return undefined;
- return this[this.length - 1];
-}
-
-
-function PlotScriptComposer(kResX, kResY, error_output) {
- // Constants.
- var kV8BinarySuffixes = ["/d8", "/libv8.so"];
- var kStackFrames = 8; // Stack frames to display in the plot.
-
- var kTimerEventWidth = 0.33; // Width of each timeline.
- var kExecutionFrameWidth = 0.2; // Width of the top stack frame line.
- var kStackFrameWidth = 0.1; // Width of the lower stack frame lines.
- var kGapWidth = 0.05; // Gap between stack frame lines.
-
- var kY1Offset = 11; // Offset for stack frame vs. event lines.
- var kDeoptRow = 7; // Row displaying deopts.
- var kGetTimeHeight = 0.5; // Height of marker displaying timed part.
- var kMaxDeoptLength = 4; // Draw size of the largest deopt.
- var kPauseLabelPadding = 5; // Padding for pause time labels.
- var kNumPauseLabels = 7; // Number of biggest pauses to label.
- var kCodeKindLabelPadding = 100; // Padding for code kind labels.
-
- var kTickHalfDuration = 0.5; // Duration of half a tick in ms.
- var kMinRangeLength = 0.0005; // Minimum length for an event in ms.
-
- var kNumThreads = 2; // Number of threads.
- var kExecutionThreadId = 0; // ID of main thread.
-
- // Init values.
- var num_timer_event = kY1Offset + 0.5;
-
- // Data structures.
- function TimerEvent(label, color, pause, thread_id) {
- assert(thread_id >= 0 && thread_id < kNumThreads, "invalid thread id");
- this.label = label;
- this.color = color;
- this.pause = pause;
- this.ranges = [];
- this.thread_id = thread_id;
- this.index = ++num_timer_event;
- }
-
- function CodeKind(color, kinds) {
- this.color = color;
- this.in_execution = [];
- this.stack_frames = [];
- for (var i = 0; i < kStackFrames; i++) this.stack_frames.push([]);
- this.kinds = kinds;
- }
-
- function Range(start, end) {
- this.start = start; // In milliseconds.
- this.end = end; // In milliseconds.
- }
-
- function Deopt(time, size) {
- this.time = time; // In milliseconds.
- this.size = size; // In bytes.
- }
-
- Range.prototype.duration = function() { return this.end - this.start; }
-
- function Tick(tick) {
- this.tick = tick;
- }
-
- var TimerEvents = {
- 'V8.Execute':
- new TimerEvent("execution", "#000000", false, 0),
- 'V8.External':
- new TimerEvent("external", "#3399FF", false, 0),
- 'V8.CompileFullCode':
- new TimerEvent("compile unopt", "#CC0000", true, 0),
- 'V8.RecompileSynchronous':
- new TimerEvent("recompile sync", "#CC0044", true, 0),
- 'V8.RecompileConcurrent':
- new TimerEvent("recompile async", "#CC4499", false, 1),
- 'V8.CompileEvalMicroSeconds':
- new TimerEvent("compile eval", "#CC4400", true, 0),
- 'V8.ParseMicroSeconds':
- new TimerEvent("parse", "#00CC00", true, 0),
- 'V8.PreParseMicroSeconds':
- new TimerEvent("preparse", "#44CC00", true, 0),
- 'V8.ParseLazyMicroSeconds':
- new TimerEvent("lazy parse", "#00CC44", true, 0),
- 'V8.GCScavenger':
- new TimerEvent("gc scavenge", "#0044CC", true, 0),
- 'V8.GCCompactor':
- new TimerEvent("gc compaction", "#4444CC", true, 0),
- 'V8.GCContext':
- new TimerEvent("gc context", "#4400CC", true, 0),
- };
-
- var CodeKinds = {
- 'external ': new CodeKind("#3399FF", [-2]),
- 'runtime ': new CodeKind("#000000", [-1]),
- 'full code': new CodeKind("#DD0000", [0]),
- 'opt code ': new CodeKind("#00EE00", [1]),
- 'code stub': new CodeKind("#FF00FF", [2]),
- 'built-in ': new CodeKind("#AA00AA", [3]),
- 'inl.cache': new CodeKind("#4444AA",
- [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),
- 'reg.exp. ': new CodeKind("#0000FF", [15]),
- };
-
- var code_map = new CodeMap();
- var execution_pauses = [];
- var deopts = [];
- var gettime = [];
- var event_stack = [];
- var last_time_stamp = [];
- for (var i = 0; i < kNumThreads; i++) {
- event_stack[i] = [];
- last_time_stamp[i] = -1;
- }
-
- var range_start = undefined;
- var range_end = undefined;
- var obj_index = 0;
- var pause_tolerance = 0.005; // Milliseconds.
- var distortion = 0;
-
- // Utility functions.
- function assert(something, message) {
- if (!something) {
- var error = new Error(message);
- error_output(error.stack);
- }
- }
-
- function FindCodeKind(kind) {
- for (name in CodeKinds) {
- if (CodeKinds[name].kinds.indexOf(kind) >= 0) {
- return CodeKinds[name];
- }
- }
- }
-
- function TicksToRanges(ticks) {
- var ranges = [];
- for (var i = 0; i < ticks.length; i++) {
- var tick = ticks[i].tick;
- ranges.push(
- new Range(tick - kTickHalfDuration, tick + kTickHalfDuration));
- }
- return ranges;
- }
-
- function MergeRanges(ranges) {
- ranges.sort(function(a, b) {
- return (a.start == b.start) ? a.end - b.end : a.start - b.start;
- });
- var result = [];
- var j = 0;
- for (var i = 0; i < ranges.length; i = j) {
- var merge_start = ranges[i].start;
- if (merge_start > range_end) break; // Out of plot range.
- var merge_end = ranges[i].end;
- for (j = i + 1; j < ranges.length; j++) {
- var next_range = ranges[j];
- // Don't merge ranges if there is no overlap (incl. merge tolerance).
- if (next_range.start > merge_end + pause_tolerance) break;
- // Merge ranges.
- if (next_range.end > merge_end) { // Extend range end.
- merge_end = next_range.end;
- }
- }
- if (merge_end < range_start) continue; // Out of plot range.
- if (merge_end < merge_start) continue; // Not an actual range.
- result.push(new Range(merge_start, merge_end));
- }
- return result;
- }
-
- function RestrictRangesTo(ranges, start, end) {
- var result = [];
- for (var i = 0; i < ranges.length; i++) {
- if (ranges[i].start <= end && ranges[i].end >= start) {
- result.push(new Range(Math.max(ranges[i].start, start),
- Math.min(ranges[i].end, end)));
- }
- }
- return result;
- }
-
- // Public methods.
- this.collectData = function(input, distortion_per_entry) {
-
- var last_timestamp = 0;
-
- // Parse functions.
- var parseTimeStamp = function(timestamp) {
- int_timestamp = parseInt(timestamp);
- assert(int_timestamp >= last_timestamp, "Inconsistent timestamps.");
- last_timestamp = int_timestamp;
- distortion += distortion_per_entry;
- return int_timestamp / 1000 - distortion;
- }
-
- var processTimerEventStart = function(name, start) {
- // Find out the thread id.
- var new_event = TimerEvents[name];
- if (new_event === undefined) return;
- var thread_id = new_event.thread_id;
-
- start = Math.max(last_time_stamp[thread_id] + kMinRangeLength, start);
-
- // Last event on this thread is done with the start of this event.
- var last_event = event_stack[thread_id].top();
- if (last_event !== undefined) {
- var new_range = new Range(last_time_stamp[thread_id], start);
- last_event.ranges.push(new_range);
- }
- event_stack[thread_id].push(new_event);
- last_time_stamp[thread_id] = start;
- };
-
- var processTimerEventEnd = function(name, end) {
- // Find out about the thread_id.
- var finished_event = TimerEvents[name];
- var thread_id = finished_event.thread_id;
- assert(finished_event === event_stack[thread_id].pop(),
- "inconsistent event stack");
-
- end = Math.max(last_time_stamp[thread_id] + kMinRangeLength, end);
-
- var new_range = new Range(last_time_stamp[thread_id], end);
- finished_event.ranges.push(new_range);
- last_time_stamp[thread_id] = end;
- };
-
- var processCodeCreateEvent = function(type, kind, address, size, name) {
- var code_entry = new CodeMap.CodeEntry(size, name);
- code_entry.kind = kind;
- code_map.addCode(address, code_entry);
- };
-
- var processCodeMoveEvent = function(from, to) {
- code_map.moveCode(from, to);
- };
-
- var processCodeDeleteEvent = function(address) {
- code_map.deleteCode(address);
- };
-
- var processCodeDeoptEvent = function(time, size) {
- deopts.push(new Deopt(time, size));
- }
-
- var processCurrentTimeEvent = function(time) {
- gettime.push(time);
- }
-
- var processSharedLibrary = function(name, start, end) {
- var code_entry = new CodeMap.CodeEntry(end - start, name);
- code_entry.kind = -3; // External code kind.
- for (var i = 0; i < kV8BinarySuffixes.length; i++) {
- var suffix = kV8BinarySuffixes[i];
- if (name.indexOf(suffix, name.length - suffix.length) >= 0) {
- code_entry.kind = -1; // V8 runtime code kind.
- break;
- }
- }
- code_map.addLibrary(start, code_entry);
- };
-
- var processTickEvent = function(
- pc, timer, unused_x, unused_y, vmstate, stack) {
- var tick = new Tick(timer);
-
- var entry = code_map.findEntry(pc);
- if (entry) FindCodeKind(entry.kind).in_execution.push(tick);
-
- for (var i = 0; i < kStackFrames; i++) {
- if (!stack[i]) break;
- var entry = code_map.findEntry(stack[i]);
- if (entry) FindCodeKind(entry.kind).stack_frames[i].push(tick);
- }
- };
- // Collect data from log.
- var logreader = new LogReader(
- { 'timer-event-start': { parsers: [parseString, parseTimeStamp],
- processor: processTimerEventStart },
- 'timer-event-end': { parsers: [parseString, parseTimeStamp],
- processor: processTimerEventEnd },
- 'shared-library': { parsers: [parseString, parseInt, parseInt],
- processor: processSharedLibrary },
- 'code-creation': { parsers: [parseString, parseInt, parseInt,
- parseInt, parseString],
- processor: processCodeCreateEvent },
- 'code-move': { parsers: [parseInt, parseInt],
- processor: processCodeMoveEvent },
- 'code-delete': { parsers: [parseInt],
- processor: processCodeDeleteEvent },
- 'code-deopt': { parsers: [parseTimeStamp, parseInt],
- processor: processCodeDeoptEvent },
- 'current-time': { parsers: [parseTimeStamp],
- processor: processCurrentTimeEvent },
- 'tick': { parsers: [parseInt, parseTimeStamp, parseString,
- parseString, parseInt, parseVarArgs],
- processor: processTickEvent }
- });
-
- var line;
- while (line = input()) {
- for (var s of line.split("\n")) logreader.processLogLine(s);
- }
-
- // Collect execution pauses.
- for (name in TimerEvents) {
- var event = TimerEvents[name];
- if (!event.pause) continue;
- var ranges = event.ranges;
- for (var j = 0; j < ranges.length; j++) execution_pauses.push(ranges[j]);
- }
- execution_pauses = MergeRanges(execution_pauses);
- };
-
-
- this.findPlotRange = function(
- range_start_override, range_end_override, result_callback) {
- var start_found = (range_start_override || range_start_override == 0);
- var end_found = (range_end_override || range_end_override == 0);
- range_start = start_found ? range_start_override : Infinity;
- range_end = end_found ? range_end_override : -Infinity;
-
- if (!start_found || !end_found) {
- for (name in TimerEvents) {
- var ranges = TimerEvents[name].ranges;
- for (var i = 0; i < ranges.length; i++) {
- if (ranges[i].start < range_start && !start_found) {
- range_start = ranges[i].start;
- }
- if (ranges[i].end > range_end && !end_found) {
- range_end = ranges[i].end;
- }
- }
- }
-
- for (codekind in CodeKinds) {
- var ticks = CodeKinds[codekind].in_execution;
- for (var i = 0; i < ticks.length; i++) {
- if (ticks[i].tick < range_start && !start_found) {
- range_start = ticks[i].tick;
- }
- if (ticks[i].tick > range_end && !end_found) {
- range_end = ticks[i].tick;
- }
- }
- }
- }
- // Set pause tolerance to something appropriate for the plot resolution
- // to make it easier for gnuplot.
- pause_tolerance = (range_end - range_start) / kResX / 10;
-
- if (typeof result_callback === 'function') {
- result_callback(range_start, range_end);
- }
- };
-
-
- this.assembleOutput = function(output) {
- output("set yrange [0:" + (num_timer_event + 1) + "]");
- output("set xlabel \"execution time in ms\"");
- output("set xrange [" + range_start + ":" + range_end + "]");
- output("set style fill pattern 2 bo 1");
- output("set style rect fs solid 1 noborder");
- output("set style line 1 lt 1 lw 1 lc rgb \"#000000\"");
- output("set border 15 lw 0.2"); // Draw thin border box.
- output("set style line 2 lt 1 lw 1 lc rgb \"#9944CC\"");
- output("set xtics out nomirror");
- output("unset key");
-
- function DrawBarBase(color, start, end, top, bottom, transparency) {
- obj_index++;
- command = "set object " + obj_index + " rect";
- command += " from " + start + ", " + top;
- command += " to " + end + ", " + bottom;
- command += " fc rgb \"" + color + "\"";
- if (transparency) {
- command += " fs transparent solid " + transparency;
- }
- output(command);
- }
-
- function DrawBar(row, color, start, end, width) {
- DrawBarBase(color, start, end, row + width, row - width);
- }
-
- function DrawHalfBar(row, color, start, end, width) {
- DrawBarBase(color, start, end, row, row - width);
- }
-
- var percentages = {};
- var total = 0;
- for (var name in TimerEvents) {
- var event = TimerEvents[name];
- var ranges = RestrictRangesTo(event.ranges, range_start, range_end);
- var sum =
- ranges.map(function(range) { return range.duration(); })
- .reduce(function(a, b) { return a + b; }, 0);
- percentages[name] = (sum / (range_end - range_start) * 100).toFixed(1);
- }
-
- // Plot deopts.
- deopts.sort(function(a, b) { return b.size - a.size; });
- var max_deopt_size = deopts.length > 0 ? deopts[0].size : Infinity;
-
- for (var i = 0; i < deopts.length; i++) {
- var deopt = deopts[i];
- DrawHalfBar(kDeoptRow, "#9944CC", deopt.time,
- deopt.time + 10 * pause_tolerance,
- deopt.size / max_deopt_size * kMaxDeoptLength);
- }
-
- // Plot current time polls.
- if (gettime.length > 1) {
- var start = gettime[0];
- var end = gettime.pop();
- DrawBarBase("#0000BB", start, end, kGetTimeHeight, 0, 0.2);
- }
-
- // Name Y-axis.
- var ytics = [];
- for (name in TimerEvents) {
- var index = TimerEvents[name].index;
- var label = TimerEvents[name].label;
- ytics.push('"' + label + ' (' + percentages[name] + '%%)" ' + index);
- }
- ytics.push('"code kind color coding" ' + kY1Offset);
- ytics.push('"code kind in execution" ' + (kY1Offset - 1));
- ytics.push('"top ' + kStackFrames + ' js stack frames"' + ' ' +
- (kY1Offset - 2));
- ytics.push('"pause times" 0');
- ytics.push('"max deopt size: ' + (max_deopt_size / 1024).toFixed(1) +
- ' kB" ' + kDeoptRow);
- output("set ytics out nomirror (" + ytics.join(', ') + ")");
-
- // Plot timeline.
- for (var name in TimerEvents) {
- var event = TimerEvents[name];
- var ranges = MergeRanges(event.ranges);
- for (var i = 0; i < ranges.length; i++) {
- DrawBar(event.index, event.color,
- ranges[i].start, ranges[i].end,
- kTimerEventWidth);
- }
- }
-
- // Plot code kind gathered from ticks.
- for (var name in CodeKinds) {
- var code_kind = CodeKinds[name];
- var offset = kY1Offset - 1;
- // Top most frame.
- var row = MergeRanges(TicksToRanges(code_kind.in_execution));
- for (var j = 0; j < row.length; j++) {
- DrawBar(offset, code_kind.color,
- row[j].start, row[j].end, kExecutionFrameWidth);
- }
- offset = offset - 2 * kExecutionFrameWidth - kGapWidth;
- // Javascript frames.
- for (var i = 0; i < kStackFrames; i++) {
- offset = offset - 2 * kStackFrameWidth - kGapWidth;
- row = MergeRanges(TicksToRanges(code_kind.stack_frames[i]));
- for (var j = 0; j < row.length; j++) {
- DrawBar(offset, code_kind.color,
- row[j].start, row[j].end, kStackFrameWidth);
- }
- }
- }
-
- // Add labels as legend for code kind colors.
- var padding = kCodeKindLabelPadding * (range_end - range_start) / kResX;
- var label_x = range_start;
- var label_y = kY1Offset;
- for (var name in CodeKinds) {
- label_x += padding;
- output("set label \"" + name + "\" at " + label_x + "," + label_y +
- " textcolor rgb \"" + CodeKinds[name].color + "\"" +
- " font \"Helvetica,9'\"");
- obj_index++;
- }
-
- if (execution_pauses.length == 0) {
- // Force plot and return without plotting execution pause impulses.
- output("plot 1/0");
- return;
- }
-
- // Label the longest pauses.
- execution_pauses =
- RestrictRangesTo(execution_pauses, range_start, range_end);
- execution_pauses.sort(function(a, b) {
- if (a.duration() == b.duration() && b.end == a.end)
- return b.start - a.start;
-
- return (a.duration() == b.duration())
- ? b.end - a.end : b.duration() - a.duration();
- });
-
- var max_pause_time = execution_pauses.length > 0
- ? execution_pauses[0].duration() : 0;
- padding = kPauseLabelPadding * (range_end - range_start) / kResX;
- var y_scale = kY1Offset / max_pause_time / 2;
- for (var i = 0; i < execution_pauses.length && i < kNumPauseLabels; i++) {
- var pause = execution_pauses[i];
- var label_content = (pause.duration() | 0) + " ms";
- var label_x = pause.end + padding;
- var label_y = Math.max(1, (pause.duration() * y_scale));
- output("set label \"" + label_content + "\" at " +
- label_x + "," + label_y + " font \"Helvetica,7'\"");
- obj_index++;
- }
-
- // Scale second Y-axis appropriately.
- var y2range = max_pause_time * num_timer_event / kY1Offset * 2;
- output("set y2range [0:" + y2range + "]");
- // Plot graph with impulses as data set.
- output("plot '-' using 1:2 axes x1y2 with impulses ls 1");
- for (var i = 0; i < execution_pauses.length; i++) {
- var pause = execution_pauses[i];
- output(pause.end + " " + pause.duration());
- obj_index++;
- }
- output("e");
- return obj_index;
- };
-}
diff --git a/deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js b/deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js
deleted file mode 100644
index 99a986eb80..0000000000
--- a/deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js
+++ /dev/null
@@ -1,4658 +0,0 @@
-// Copyright 1986 - 1993, 1998, 2004 Thomas Williams, Colin Kelley
-//
-// Permission to use, copy, and distribute this software and its
-// documentation for any purpose with or without fee is hereby granted,
-// provided that the above copyright notice appear in all copies and
-// that both that copyright notice and this permission notice appear
-// in supporting documentation.
-//
-// Permission to modify the software is granted, but not the right to
-// distribute the complete modified source code. Modifications are to
-// be distributed as patches to the released version. Permission to
-// distribute binaries produced by compiling modified sources is granted,
-// provided you
-// 1. distribute the corresponding source modifications from the
-// released version in the form of a patch file along with the binaries,
-// 2. add special version identification to distinguish your version
-// in addition to the base release version number,
-// 3. provide your name and address as the primary contact for the
-// support of your modified version, and
-// 4. retain our contact information in regard to use of the base
-// software.
-// Permission to distribute the released version of the source code along
-// with corresponding source modifications in the form of a patch file is
-// granted with same provisions 2 through 4 for binary distributions.
-//
-// This software is provided "as is" without express or implied warranty
-// to the extent permitted by applicable law.
-
-// This Javascript port of gnuplot 4.6.3 [1] has been generated using
-// Emscripten [2]. This port has been made possible by Christian Huettig [3],
-// whose changes to gnuplot's source files can be found below [4] in
-// accordance to gnuplot's copyright.
-//
-// [1] http://www.gnuplot.info/
-// [2] https://github.com/kripken/emscripten/
-// [3] https://github.com/chhu/gnuplot-JS
-// [4] Patch to gnuplot 4.6.3
-// --- gnuplot-4.6.3/src/axis.c 2012-11-08 18:13:08.000000000 +0100
-// +++ gnuplot-4.6.3_mod/src/axis.c 2013-05-11 11:08:08.791587160 +0200
-// @@ -467,8 +467,9 @@ copy_or_invent_formatstring(AXIS_INDEX a
-// int precision = (ceil(-log10(fabs(axmax-axmin))));
-// if ((axmin*axmax > 0) && precision > 4)
-// sprintf(ticfmt[axis],"%%.%df", (precision>14) ? 14 : precision);
-// + else
-// + strcpy(ticfmt[axis], "%g");
-// }
-// -
-// return ticfmt[axis];
-// }
-
-var Module = {
- 'noInitialRun': true,
- print: function(text) {
- self.postMessage({'transaction': -1, 'content': text});
- },
- printErr: function(text) {
- self.postMessage({'transaction': -2, 'content': text});
- },
-};
-function gnuplot_create() {
-// Note: For maximum-speed code, see "Optimizing Code" on the Emscripten wiki, https://github.com/kripken/emscripten/wiki/Optimizing-Code
-// Note: Some Emscripten settings may limit the speed of the generated code.
-try {
- this['Module'] = Module;
- Module.test;
-} catch(e) {
- this['Module'] = Module = {};
-}
-// The environment setup code below is customized to use Module.
-// *** Environment setup code ***
-var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
-var ENVIRONMENT_IS_WEB = typeof window === 'object';
-var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
-var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
-if (typeof module === "object") {
- module.exports = Module;
-}
-if (ENVIRONMENT_IS_NODE) {
- // Expose functionality in the same simple way that the shells work
- // Note that we pollute the global namespace here, otherwise we break in node
- Module['print'] = function(x) {
- process['stdout'].write(x + '\n');
- };
- Module['printErr'] = function(x) {
- process['stderr'].write(x + '\n');
- };
- var nodeFS = require('fs');
- var nodePath = require('path');
- Module['read'] = function(filename, binary) {
- filename = nodePath['normalize'](filename);
- var ret = nodeFS['readFileSync'](filename);
- // The path is absolute if the normalized version is the same as the resolved.
- if (!ret && filename != nodePath['resolve'](filename)) {
- filename = path.join(__dirname, '..', 'src', filename);
- ret = nodeFS['readFileSync'](filename);
- }
- if (ret && !binary) ret = ret.toString();
- return ret;
- };
- Module['readBinary'] = function(filename) { return Module['read'](filename, true) };
- Module['load'] = function(f) {
- globalEval(read(f));
- };
- if (!Module['arguments']) {
- Module['arguments'] = process['argv'].slice(2);
- }
-}
-if (ENVIRONMENT_IS_SHELL) {
- Module['print'] = print;
- if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
- Module['read'] = read;
- Module['readBinary'] = function(f) {
- return read(f, 'binary');
- };
- if (!Module['arguments']) {
- if (typeof scriptArgs != 'undefined') {
- Module['arguments'] = scriptArgs;
- } else if (typeof arguments != 'undefined') {
- Module['arguments'] = arguments;
- }
- }
-}
-if (ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER) {
- if (!Module['print']) {
- Module['print'] = function(x) {
- console.log(x);
- };
- }
- if (!Module['printErr']) {
- Module['printErr'] = function(x) {
- console.log(x);
- };
- }
-}
-if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
- Module['read'] = function(url) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, false);
- xhr.send(null);
- return xhr.responseText;
- };
- if (!Module['arguments']) {
- if (typeof arguments != 'undefined') {
- Module['arguments'] = arguments;
- }
- }
-}
-if (ENVIRONMENT_IS_WORKER) {
- // We can do very little here...
- var TRY_USE_DUMP = false;
- if (!Module['print']) {
- Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
- dump(x);
- }) : (function(x) {
- // self.postMessage(x); // enable this if you want stdout to be sent as messages
- }));
- }
- Module['load'] = importScripts;
-}
-if (!ENVIRONMENT_IS_WORKER && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_SHELL) {
- // Unreachable because SHELL is dependent on the others
- throw 'Unknown runtime environment. Where are we?';
-}
-function globalEval(x) {
- eval.call(null, x);
-}
-if (!Module['load'] == 'undefined' && Module['read']) {
- Module['load'] = function(f) {
- globalEval(Module['read'](f));
- };
-}
-if (!Module['print']) {
- Module['print'] = function(){};
-}
-if (!Module['printErr']) {
- Module['printErr'] = Module['print'];
-}
-if (!Module['arguments']) {
- Module['arguments'] = [];
-}
-// *** Environment setup code ***
-// Closure helpers
-Module.print = Module['print'];
-Module.printErr = Module['printErr'];
-// Callbacks
-if (!Module['preRun']) Module['preRun'] = [];
-if (!Module['postRun']) Module['postRun'] = [];
-// === Auto-generated preamble library stuff ===
-//========================================
-// Runtime code shared with compiler
-//========================================
-var Runtime = {
- stackSave: function () {
- return STACKTOP;
- },
- stackRestore: function (stackTop) {
- STACKTOP = stackTop;
- },
- forceAlign: function (target, quantum) {
- quantum = quantum || 4;
- if (quantum == 1) return target;
- if (isNumber(target) && isNumber(quantum)) {
- return Math.ceil(target/quantum)*quantum;
- } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
- var logg = log2(quantum);
- return '((((' +target + ')+' + (quantum-1) + ')>>' + logg + ')<<' + logg + ')';
- }
- return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
- },
- isNumberType: function (type) {
- return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
- },
- isPointerType: function isPointerType(type) {
- return type[type.length-1] == '*';
-},
- isStructType: function isStructType(type) {
- if (isPointerType(type)) return false;
- if (isArrayType(type)) return true;
- if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
- // See comment in isStructPointerType()
- return type[0] == '%';
-},
- INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
- FLOAT_TYPES: {"float":0,"double":0},
- or64: function (x, y) {
- var l = (x | 0) | (y | 0);
- var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
- return l + h;
- },
- and64: function (x, y) {
- var l = (x | 0) & (y | 0);
- var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
- return l + h;
- },
- xor64: function (x, y) {
- var l = (x | 0) ^ (y | 0);
- var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
- return l + h;
- },
- getNativeTypeSize: function (type, quantumSize) {
- if (Runtime.QUANTUM_SIZE == 1) return 1;
- var size = {
- '%i1': 1,
- '%i8': 1,
- '%i16': 2,
- '%i32': 4,
- '%i64': 8,
- "%float": 4,
- "%double": 8
- }['%'+type]; // add '%' since float and double confuse Closure compiler as keys, and also spidermonkey as a compiler will remove 's from '_i8' etc
- if (!size) {
- if (type.charAt(type.length-1) == '*') {
- size = Runtime.QUANTUM_SIZE; // A pointer
- } else if (type[0] == 'i') {
- var bits = parseInt(type.substr(1));
- assert(bits % 8 == 0);
- size = bits/8;
- }
- }
- return size;
- },
- getNativeFieldSize: function (type) {
- return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
- },
- dedup: function dedup(items, ident) {
- var seen = {};
- if (ident) {
- return items.filter(function(item) {
- if (seen[item[ident]]) return false;
- seen[item[ident]] = true;
- return true;
- });
- } else {
- return items.filter(function(item) {
- if (seen[item]) return false;
- seen[item] = true;
- return true;
- });
- }
-},
- set: function set() {
- var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
- var ret = {};
- for (var i = 0; i < args.length; i++) {
- ret[args[i]] = 0;
- }
- return ret;
-},
- STACK_ALIGN: 8,
- getAlignSize: function (type, size, vararg) {
- // we align i64s and doubles on 64-bit boundaries, unlike x86
- if (type == 'i64' || type == 'double' || vararg) return 8;
- if (!type) return Math.min(size, 8); // align structures internally to 64 bits
- return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
- },
- calculateStructAlignment: function calculateStructAlignment(type) {
- type.flatSize = 0;
- type.alignSize = 0;
- var diffs = [];
- var prev = -1;
- type.flatIndexes = type.fields.map(function(field) {
- var size, alignSize;
- if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
- size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
- alignSize = Runtime.getAlignSize(field, size);
- } else if (Runtime.isStructType(field)) {
- size = Types.types[field].flatSize;
- alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
- } else if (field[0] == 'b') {
- // bN, large number field, like a [N x i8]
- size = field.substr(1)|0;
- alignSize = 1;
- } else {
- throw 'Unclear type in struct: ' + field + ', in ' + type.name_ + ' :: ' + dump(Types.types[type.name_]);
- }
- if (type.packed) alignSize = 1;
- type.alignSize = Math.max(type.alignSize, alignSize);
- var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
- type.flatSize = curr + size;
- if (prev >= 0) {
- diffs.push(curr-prev);
- }
- prev = curr;
- return curr;
- });
- type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
- if (diffs.length == 0) {
- type.flatFactor = type.flatSize;
- } else if (Runtime.dedup(diffs).length == 1) {
- type.flatFactor = diffs[0];
- }
- type.needsFlattening = (type.flatFactor != 1);
- return type.flatIndexes;
- },
- generateStructInfo: function (struct, typeName, offset) {
- var type, alignment;
- if (typeName) {
- offset = offset || 0;
- type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
- if (!type) return null;
- if (type.fields.length != struct.length) {
- printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
- return null;
- }
- alignment = type.flatIndexes;
- } else {
- var type = { fields: struct.map(function(item) { return item[0] }) };
- alignment = Runtime.calculateStructAlignment(type);
- }
- var ret = {
- __size__: type.flatSize
- };
- if (typeName) {
- struct.forEach(function(item, i) {
- if (typeof item === 'string') {
- ret[item] = alignment[i] + offset;
- } else {
- // embedded struct
- var key;
- for (var k in item) key = k;
- ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
- }
- });
- } else {
- struct.forEach(function(item, i) {
- ret[item[1]] = alignment[i];
- });
- }
- return ret;
- },
- dynCall: function (sig, ptr, args) {
- if (args && args.length) {
- if (!args.splice) args = Array.prototype.slice.call(args);
- args.splice(0, 0, ptr);
- return Module['dynCall_' + sig].apply(null, args);
- } else {
- return Module['dynCall_' + sig].call(null, ptr);
- }
- },
- functionPointers: [],
- addFunction: function (func) {
- for (var i = 0; i < Runtime.functionPointers.length; i++) {
- if (!Runtime.functionPointers[i]) {
- Runtime.functionPointers[i] = func;
- return 2 + 2*i;
- }
- }
- throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';
- },
- removeFunction: function (index) {
- Runtime.functionPointers[(index-2)/2] = null;
- },
- warnOnce: function (text) {
- if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
- if (!Runtime.warnOnce.shown[text]) {
- Runtime.warnOnce.shown[text] = 1;
- Module.printErr(text);
- }
- },
- funcWrappers: {},
- getFuncWrapper: function (func, sig) {
- assert(sig);
- if (!Runtime.funcWrappers[func]) {
- Runtime.funcWrappers[func] = function() {
- return Runtime.dynCall(sig, func, arguments);
- };
- }
- return Runtime.funcWrappers[func];
- },
- UTF8Processor: function () {
- var buffer = [];
- var needed = 0;
- this.processCChar = function (code) {
- code = code & 0xff;
- if (needed) {
- buffer.push(code);
- needed--;
- }
- if (buffer.length == 0) {
- if (code < 128) return String.fromCharCode(code);
- buffer.push(code);
- if (code > 191 && code < 224) {
- needed = 1;
- } else {
- needed = 2;
- }
- return '';
- }
- if (needed > 0) return '';
- var c1 = buffer[0];
- var c2 = buffer[1];
- var c3 = buffer[2];
- var ret;
- if (c1 > 191 && c1 < 224) {
- ret = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
- } else {
- ret = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
- }
- buffer.length = 0;
- return ret;
- }
- this.processJSString = function(string) {
- string = unescape(encodeURIComponent(string));
- var ret = [];
- for (var i = 0; i < string.length; i++) {
- ret.push(string.charCodeAt(i));
- }
- return ret;
- }
- },
- stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = ((((STACKTOP)+7)>>3)<<3); return ret; },
- staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = ((((STATICTOP)+7)>>3)<<3); return ret; },
- dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = ((((DYNAMICTOP)+7)>>3)<<3); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
- alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
- makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+(((low)>>>(0))))+((+(((high)>>>(0))))*(+(4294967296)))) : ((+(((low)>>>(0))))+((+(((high)|(0))))*(+(4294967296))))); return ret; },
- GLOBAL_BASE: 8,
- QUANTUM_SIZE: 4,
- __dummy__: 0
-}
-//========================================
-// Runtime essentials
-//========================================
-var __THREW__ = 0; // Used in checking for thrown exceptions.
-var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
-var undef = 0;
-// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
-// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
-var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD;
-var tempI64, tempI64b;
-var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;
-function abort(text) {
- Module.print(text + ':\n' + (new Error).stack);
- ABORT = true;
- throw "Assertion: " + text;
-}
-function assert(condition, text) {
- if (!condition) {
- abort('Assertion failed: ' + text);
- }
-}
-var globalScope = this;
-// C calling interface. A convenient way to call C functions (in C files, or
-// defined with extern "C").
-//
-// Note: LLVM optimizations can inline and remove functions, after which you will not be
-// able to call them. Closure can also do so. To avoid that, add your function to
-// the exports using something like
-//
-// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
-//
-// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C")
-// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
-// 'array' for JavaScript arrays and typed arrays).
-// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be omitted). Types are as in returnType,
-// except that 'array' is not possible (there is no way for us to know the length of the array)
-// @param args An array of the arguments to the function, as native JS values (as in returnType)
-// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
-// @return The return value, as a native JS value (as in returnType)
-function ccall(ident, returnType, argTypes, args) {
- return ccallFunc(getCFunc(ident), returnType, argTypes, args);
-}
-Module["ccall"] = ccall;
-// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
-function getCFunc(ident) {
- try {
- var func = globalScope['Module']['_' + ident]; // closure exported function
- if (!func) func = eval('_' + ident); // explicit lookup
- } catch(e) {
- }
- assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
- return func;
-}
-// Internal function that does a C call using a function, not an identifier
-function ccallFunc(func, returnType, argTypes, args) {
- var stack = 0;
- function toC(value, type) {
- if (type == 'string') {
- if (value === null || value === undefined || value === 0) return 0; // null string
- if (!stack) stack = Runtime.stackSave();
- var ret = Runtime.stackAlloc(value.length+1);
- writeStringToMemory(value, ret);
- return ret;
- } else if (type == 'array') {
- if (!stack) stack = Runtime.stackSave();
- var ret = Runtime.stackAlloc(value.length);
- writeArrayToMemory(value, ret);
- return ret;
- }
- return value;
- }
- function fromC(value, type) {
- if (type == 'string') {
- return Pointer_stringify(value);
- }
- assert(type != 'array');
- return value;
- }
- var i = 0;
- var cArgs = args ? args.map(function(arg) {
- return toC(arg, argTypes[i++]);
- }) : [];
- var ret = fromC(func.apply(null, cArgs), returnType);
- if (stack) Runtime.stackRestore(stack);
- return ret;
-}
-// Returns a native JS wrapper for a C function. This is similar to ccall, but
-// returns a function you can call repeatedly in a normal way. For example:
-//
-// var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
-// alert(my_function(5, 22));
-// alert(my_function(99, 12));
-//
-function cwrap(ident, returnType, argTypes) {
- var func = getCFunc(ident);
- return function() {
- return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
- }
-}
-Module["cwrap"] = cwrap;
-// Sets a value in memory in a dynamic way at run-time. Uses the
-// type data. This is the same as makeSetValue, except that
-// makeSetValue is done at compile-time and generates the needed
-// code then, whereas this function picks the right code at
-// run-time.
-// Note that setValue and getValue only do *aligned* writes and reads!
-// Note that ccall uses JS types as for defining types, while setValue and
-// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
-function setValue(ptr, value, type, noSafe) {
- type = type || 'i8';
- if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
- switch(type) {
- case 'i1': HEAP8[(ptr)]=value; break;
- case 'i8': HEAP8[(ptr)]=value; break;
- case 'i16': HEAP16[((ptr)>>1)]=value; break;
- case 'i32': HEAP32[((ptr)>>2)]=value; break;
- case 'i64': (tempI64 = [value>>>0,Math.min(Math.floor((value)/(+(4294967296))), (+(4294967295)))>>>0],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break;
- case 'float': HEAPF32[((ptr)>>2)]=value; break;
- case 'double': HEAPF64[((ptr)>>3)]=value; break;
- default: abort('invalid type for setValue: ' + type);
- }
-}
-Module['setValue'] = setValue;
-// Parallel to setValue.
-function getValue(ptr, type, noSafe) {
- type = type || 'i8';
- if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
- switch(type) {
- case 'i1': return HEAP8[(ptr)];
- case 'i8': return HEAP8[(ptr)];
- case 'i16': return HEAP16[((ptr)>>1)];
- case 'i32': return HEAP32[((ptr)>>2)];
- case 'i64': return HEAP32[((ptr)>>2)];
- case 'float': return HEAPF32[((ptr)>>2)];
- case 'double': return HEAPF64[((ptr)>>3)];
- default: abort('invalid type for setValue: ' + type);
- }
- return null;
-}
-Module['getValue'] = getValue;
-var ALLOC_NORMAL = 0; // Tries to use _malloc()
-var ALLOC_STACK = 1; // Lives for the duration of the current function call
-var ALLOC_STATIC = 2; // Cannot be freed
-var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
-var ALLOC_NONE = 4; // Do not allocate
-Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
-Module['ALLOC_STACK'] = ALLOC_STACK;
-Module['ALLOC_STATIC'] = ALLOC_STATIC;
-Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
-Module['ALLOC_NONE'] = ALLOC_NONE;
-// allocate(): This is for internal use. You can use it yourself as well, but the interface
-// is a little tricky (see docs right below). The reason is that it is optimized
-// for multiple syntaxes to save space in generated code. So you should
-// normally not use allocate(), and instead allocate memory using _malloc(),
-// initialize it with setValue(), and so forth.
-// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
-// in *bytes* (note that this is sometimes confusing: the next parameter does not
-// affect this!)
-// @types: Either an array of types, one for each byte (or 0 if no type at that position),
-// or a single type which is used for the entire block. This only matters if there
-// is initial data - if @slab is a number, then this does not matter at all and is
-// ignored.
-// @allocator: How to allocate memory, see ALLOC_*
-function allocate(slab, types, allocator, ptr) {
- var zeroinit, size;
- if (typeof slab === 'number') {
- zeroinit = true;
- size = slab;
- } else {
- zeroinit = false;
- size = slab.length;
- }
- var singleType = typeof types === 'string' ? types : null;
- var ret;
- if (allocator == ALLOC_NONE) {
- ret = ptr;
- } else {
- ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
- }
- if (zeroinit) {
- var ptr = ret, stop;
- assert((ret & 3) == 0);
- stop = ret + (size & ~3);
- for (; ptr < stop; ptr += 4) {
- HEAP32[((ptr)>>2)]=0;
- }
- stop = ret + size;
- while (ptr < stop) {
- HEAP8[((ptr++)|0)]=0;
- }
- return ret;
- }
- if (singleType === 'i8') {
- if (slab.subarray || slab.slice) {
- HEAPU8.set(slab, ret);
- } else {
- HEAPU8.set(new Uint8Array(slab), ret);
- }
- return ret;
- }
- var i = 0, type, typeSize, previousType;
- while (i < size) {
- var curr = slab[i];
- if (typeof curr === 'function') {
- curr = Runtime.getFunctionIndex(curr);
- }
- type = singleType || types[i];
- if (type === 0) {
- i++;
- continue;
- }
- if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
- setValue(ret+i, curr, type);
- // no need to look up size unless type changes, so cache it
- if (previousType !== type) {
- typeSize = Runtime.getNativeTypeSize(type);
- previousType = type;
- }
- i += typeSize;
- }
- return ret;
-}
-Module['allocate'] = allocate;
-function Pointer_stringify(ptr, /* optional */ length) {
- // Find the length, and check for UTF while doing so
- var hasUtf = false;
- var t;
- var i = 0;
- while (1) {
- t = HEAPU8[(((ptr)+(i))|0)];
- if (t >= 128) hasUtf = true;
- else if (t == 0 && !length) break;
- i++;
- if (length && i == length) break;
- }
- if (!length) length = i;
- var ret = '';
- if (!hasUtf) {
- var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
- var curr;
- while (length > 0) {
- curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
- ret = ret ? ret + curr : curr;
- ptr += MAX_CHUNK;
- length -= MAX_CHUNK;
- }
- return ret;
- }
- var utf8 = new Runtime.UTF8Processor();
- for (i = 0; i < length; i++) {
- t = HEAPU8[(((ptr)+(i))|0)];
- ret += utf8.processCChar(t);
- }
- return ret;
-}
-Module['Pointer_stringify'] = Pointer_stringify;
-// Memory management
-var PAGE_SIZE = 4096;
-function alignMemoryPage(x) {
- return ((x+4095)>>12)<<12;
-}
-var HEAP;
-var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
-var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
-var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
-var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk
-function enlargeMemory() {
- abort('Cannot enlarge memory arrays in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value, or (2) set Module.TOTAL_MEMORY before the program runs.');
-}
-var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
-var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;
-var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
-// Initialize the runtime's memory
-// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
-assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
- 'Cannot fallback to non-typed array case: Code is too specialized');
-var buffer = new ArrayBuffer(TOTAL_MEMORY);
-HEAP8 = new Int8Array(buffer);
-HEAP16 = new Int16Array(buffer);
-HEAP32 = new Int32Array(buffer);
-HEAPU8 = new Uint8Array(buffer);
-HEAPU16 = new Uint16Array(buffer);
-HEAPU32 = new Uint32Array(buffer);
-HEAPF32 = new Float32Array(buffer);
-HEAPF64 = new Float64Array(buffer);
-// Endianness check (note: assumes compiler arch was little-endian)
-HEAP32[0] = 255;
-assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
-Module['HEAP'] = HEAP;
-Module['HEAP8'] = HEAP8;
-Module['HEAP16'] = HEAP16;
-Module['HEAP32'] = HEAP32;
-Module['HEAPU8'] = HEAPU8;
-Module['HEAPU16'] = HEAPU16;
-Module['HEAPU32'] = HEAPU32;
-Module['HEAPF32'] = HEAPF32;
-Module['HEAPF64'] = HEAPF64;
-function callRuntimeCallbacks(callbacks) {
- while(callbacks.length > 0) {
- var callback = callbacks.shift();
- if (typeof callback == 'function') {
- callback();
- continue;
- }
- var func = callback.func;
- if (typeof func === 'number') {
- if (callback.arg === undefined) {
- Runtime.dynCall('v', func);
- } else {
- Runtime.dynCall('vi', func, [callback.arg]);
- }
- } else {
- func(callback.arg === undefined ? null : callback.arg);
- }
- }
-}
-var __ATINIT__ = []; // functions called during startup
-var __ATMAIN__ = []; // functions called when main() is to be run
-var __ATEXIT__ = []; // functions called during shutdown
-var runtimeInitialized = false;
-function ensureInitRuntime() {
- if (runtimeInitialized) return;
- runtimeInitialized = true;
- callRuntimeCallbacks(__ATINIT__);
-}
-function preMain() {
- callRuntimeCallbacks(__ATMAIN__);
-}
-function exitRuntime() {
- callRuntimeCallbacks(__ATEXIT__);
-}
-// Tools
-// This processes a JS string into a C-line array of numbers, 0-terminated.
-// For LLVM-originating strings, see parser.js:parseLLVMString function
-function intArrayFromString(stringy, dontAddNull, length /* optional */) {
- var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
- if (length) {
- ret.length = length;
- }
- if (!dontAddNull) {
- ret.push(0);
- }
- return ret;
-}
-Module['intArrayFromString'] = intArrayFromString;
-function intArrayToString(array) {
- var ret = [];
- for (var i = 0; i < array.length; i++) {
- var chr = array[i];
- if (chr > 0xFF) {
- chr &= 0xFF;
- }
- ret.push(String.fromCharCode(chr));
- }
- return ret.join('');
-}
-Module['intArrayToString'] = intArrayToString;
-// Write a Javascript array to somewhere in the heap
-function writeStringToMemory(string, buffer, dontAddNull) {
- var array = intArrayFromString(string, dontAddNull);
- var i = 0;
- while (i < array.length) {
- var chr = array[i];
- HEAP8[(((buffer)+(i))|0)]=chr
- i = i + 1;
- }
-}
-Module['writeStringToMemory'] = writeStringToMemory;
-function writeArrayToMemory(array, buffer) {
- for (var i = 0; i < array.length; i++) {
- HEAP8[(((buffer)+(i))|0)]=array[i];
- }
-}
-Module['writeArrayToMemory'] = writeArrayToMemory;
-function unSign(value, bits, ignore, sig) {
- if (value >= 0) {
- return value;
- }
- return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
- : Math.pow(2, bits) + value;
-}
-function reSign(value, bits, ignore, sig) {
- if (value <= 0) {
- return value;
- }
- var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
- : Math.pow(2, bits-1);
- if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
- // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
- // TODO: In i64 mode 1, resign the two parts separately and safely
- value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
- }
- return value;
-}
-if (!Math['imul']) Math['imul'] = function(a, b) {
- var ah = a >>> 16;
- var al = a & 0xffff;
- var bh = b >>> 16;
- var bl = b & 0xffff;
- return (al*bl + ((ah*bl + al*bh) << 16))|0;
-};
-// A counter of dependencies for calling run(). If we need to
-// do asynchronous work before running, increment this and
-// decrement it. Incrementing must happen in a place like
-// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
-// Note that you can add dependencies in preRun, even though
-// it happens right before run - run will be postponed until
-// the dependencies are met.
-var runDependencies = 0;
-var runDependencyTracking = {};
-var calledInit = false, calledRun = false;
-var runDependencyWatcher = null;
-function addRunDependency(id) {
- runDependencies++;
- if (Module['monitorRunDependencies']) {
- Module['monitorRunDependencies'](runDependencies);
- }
- if (id) {
- assert(!runDependencyTracking[id]);
- runDependencyTracking[id] = 1;
- } else {
- Module.printErr('warning: run dependency added without ID');
- }
-}
-Module['addRunDependency'] = addRunDependency;
-function removeRunDependency(id) {
- runDependencies--;
- if (Module['monitorRunDependencies']) {
- Module['monitorRunDependencies'](runDependencies);
- }
- if (id) {
- assert(runDependencyTracking[id]);
- delete runDependencyTracking[id];
- } else {
- Module.printErr('warning: run dependency removed without ID');
- }
- if (runDependencies == 0) {
- if (runDependencyWatcher !== null) {
- clearInterval(runDependencyWatcher);
- runDependencyWatcher = null;
- }
- // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
- if (!calledRun && shouldRunNow) run();
- }
-}
-Module['removeRunDependency'] = removeRunDependency;
-Module["preloadedImages"] = {}; // maps url to image data
-Module["preloadedAudios"] = {}; // maps url to audio data
-function addPreRun(func) {
- if (!Module['preRun']) Module['preRun'] = [];
- else if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
- Module['preRun'].push(func);
-}
-var awaitingMemoryInitializer = false;
-function loadMemoryInitializer(filename) {
- function applyData(data) {
- HEAPU8.set(data, STATIC_BASE);
- runPostSets();
- }
- // always do this asynchronously, to keep shell and web as similar as possible
- addPreRun(function() {
- if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
- applyData(Module['readBinary'](filename));
- } else {
- Browser.asyncLoad(filename, function(data) {
- applyData(data);
- }, function(data) {
- throw 'could not load memory initializer ' + filename;
- });
- }
- });
- awaitingMemoryInitializer = false;
-}
-// === Body ===
-STATIC_BASE = 8;
-STATICTOP = STATIC_BASE + 243440;
-var _stdout;
-var _stdin;
-var _stderr;
-var _stdout = _stdout=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
-var _stdin = _stdin=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
-var _stderr = _stderr=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
-/* memory initializer */ allocate([0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,80,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,68,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,0,0,0,0,0,0,0,0,58,140,48,226,142,121,69,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,139,1,0,240,84,3,0,80,126,1,0,0,0,0,0,80,131,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,134,1,0,248,132,1,0,232,123,1,0,0,0,0,0,224,128,1,0,0,0,0,0,0,85,1,0,8,0,0,0,208,80,1,0,9,0,0,0,192,76,1,0,10,0,0,0,64,73,1,0,13,0,0,0,240,70,1,0,27,0,0,0,40,67,1,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,244,1,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,3,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,184,30,133,235,81,184,158,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,193,1,0,16,189,1,0,16,220,1,0,192,222,1,0,0,0,0,0,96,133,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,253,1,0,0,0,0,0,160,149,1,0,32,148,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,20,0,0,0,26,0,0,0,21,0,0,0,27,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,26,1,0,0,0,0,0,0,2,0,0,0,94,1,0,0,1,0,0,0,2,0,0,0,88,0,0,0,0,0,0,0,2,0,0,0,26,0,0,0,1,0,0,0,2,0,0,0,58,0,0,0,0,0,0,0,2,0,0,0,48,1,0,0,1,0,0,0,1,0,0,0,96,0,0,0,1,0,0,0,2,0,0,0,96,0,0,0,1,0,0,0,3,0,0,0,96,0,0,0,3,0,0,0,1,0,0,0,96,0,0,0,3,0,0,0,2,0,0,0,96,0,0,0,3,0,0,0,3,0,0,0,96,0,0,0,3,0,0,0,2,0,0,0,26,1,0,0,3,0,0,0,2,0,0,0,88,0,0,0,3,0,0,0,2,0,0,0,58,0,0,0,1,0,0,0,2,0,0,0,134,1,0,0,3,0,0,0,2,0,0,0,134,1,0,0,1,0,0,0,2,0,0,0,140,1,0,0,1,0,0,0,2,0,0,0,8,0,0,0,1,0,0,0,2,0,0,0,38,1,0,0,1,0,0,0,2,0,0,0,54,1,0,0,1,0,0,0,2,0,0,0,94,0,0,0,1,0,0,0,2,0,0,0,182,0,0,0,3,0,0,0,2,0,0,0,140,1,0,0,1,0,0,0,2,0,0,0,14,0,0,0,1,0,0,0,2,0,0,0,16,0,0,0,1,0,0,0,2,0,0,0,24,1,0,0,1,0,0,0,2,0,0,0,132,0,0,0,1,0,0,0,2,0,0,0,118,1,0,0,1,0,0,0,2,0,0,0,108,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,2,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,185,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,93,1,0,8,93,1,0,248,92,1,0,240,92,1,0,208,92,1,0,200,92,1,0,184,92,1,0,160,92,1,0,0,0,0,0,0,0,0,0,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,42,2,0,1,0,0,0,176,34,3,0,2,0,0,0,32,42,2,0,3,0,0,0,0,0,0,0,0,0,0,0,117,110,115,32,112,109,51,100,59,115,101,32,108,109,97,114,103,32,115,99,114,101,32,48,46,48,53,59,115,101,32,114,109,97,114,103,32,115,99,114,101,32,48,46,57,55,53,59,32,115,101,32,98,109,97,114,103,32,115,99,114,101,32,48,46,50,50,59,32,115,101,32,116,109,97,114,103,32,115,99,114,101,32,48,46,56,54,59,115,101,32,103,114,105,100,59,115,101,32,116,105,99,115,32,115,99,97,108,101,32,48,59,32,115,101,32,120,116,105,99,115,32,48,44,48,46,49,59,115,101,32,121,116,105,99,115,32,48,44,48,46,49,59,115,101,32,107,101,121,32,116,111,112,32,114,105,103,104,116,32,97,116,32,115,99,114,101,32,48,46,57,55,53,44,48,46,57,55,53,32,104,111,114,105,122,111,110,116,97,108,32,116,105,116,108,101,32,39,82,44,71,44,66,32,112,114,111,102,105,108,101,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,108,111,114,32,112,97,108,101,116,116,101,39,59,0,0,0,0,0,115,112,108,111,116,32,49,47,48,59,10,10,10,0,0,0,114,101,115,101,116,59,115,101,116,32,109,117,108,116,105,59,117,110,115,32,98,111,114,100,101,114,59,117,110,115,32,107,101,121,59,115,101,116,32,116,105,99,32,105,110,59,117,110,115,32,120,116,105,99,115,59,117,110,115,32,121,116,105,99,115,59,115,101,32,99,98,116,105,99,32,48,44,48,46,49,44,49,32,109,105,114,114,32,102,111,114,109,97,116,32,39,39,59,115,101,32,120,114,91,48,58,49,93,59,115,101,32,121,114,91,48,58,49,93,59,115,101,32,122,114,91,48,58,49,93,59,115,101,32,99,98,114,91,48,58,49,93,59,115,101,32,112,109,51,100,32,109,97,112,59,115,101,116,32,99,111,108,111,114,98,111,120,32,104,111,114,32,117,115,101,114,32,111,114,105,103,32,48,46,48,53,44,48,46,48,50,32,115,105,122,101,32,48,46,57,50,53,44,48,46,49,50,59,0,0,0,0,0,0,0,0,10,10,10,117,110,115,32,109,117,108,116,105,59,10,0,0,248,110,3,0,56,16,3,0,100,0,0,0,100,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,48,1,0,0,190,0,0,0,190,0,0,0,190,0,0,0,2,0,0,0,190,0,0,0,126,0,0,0,126,0,0,0,90,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,13,3,0,128,10,3,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,20,0,0,0,142,1,0,0,158,1,0,0,18,1,0,0,2,0,0,0,120,0,0,0,82,0,0,0,34,0,0,0,174,0,0,0,40,0,0,0,62,0,0,0,158,0,0,0,54,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,9,3,0,176,7,3,0,32,3,0,0,184,1,0,0,20,0,0,0,9,0,0,0,8,0,0,0,6,0,0,0,102,0,0,0,48,0,0,0,218,0,0,0,98,0,0,0,2,0,0,0,12,1,0,0,50,0,0,0,96,0,0,0,158,0,0,0,42,0,0,0,164,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,6,3,0,176,4,3,0,255,15,0,0,59,12,0,0,71,0,0,0,51,0,0,0,36,0,0,0,36,0,0,0,48,1,0,0,8,0,0,0,104,1,0,0,100,0,0,0,2,0,0,0,52,0,0,0,102,0,0,0,86,0,0,0,38,0,0,0,80,0,0,0,160,0,0,0,124,0,0,0,72,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,2,3,0,96,0,3,0,0,4,0,0,12,3,0,0,25,0,0,0,14,0,0,0,11,0,0,0,11,0,0,0,48,1,0,0,20,1,0,0,40,1,0,0,170,0,0,0,2,0,0,0,172,0,0,0,128,0,0,0,60,0,0,0,106,1,0,0,78,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,253,2,0,160,251,2,0,0,4,0,0,12,3,0,0,25,0,0,0,14,0,0,0,11,0,0,0,11,0,0,0,48,1,0,0,234,0,0,0,50,0,0,0,170,0,0,0,2,0,0,0,172,0,0,0,136,0,0,0,42,0,0,0,40,0,0,0,62,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,245,2,0,64,243,2,0,0,4,0,0,12,3,0,0,25,0,0,0,14,0,0,0,11,0,0,0,11,0,0,0,48,1,0,0,20,1,0,0,40,1,0,0,66,0,0,0,2,0,0,0,6,0,0,0,136,0,0,0,42,0,0,0,40,0,0,0,62,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,152,0,0,0,0,0,0,0,65,0,0,0,66,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,234,2,0,192,220,2,0,112,23,0,0,160,15,0,0,100,0,0,0,80,0,0,0,100,0,0,0,100,0,0,0,206,0,0,0,148,0,0,0,222,0,0,0,116,1,0,0,2,0,0,0,180,1,0,0,100,0,0,0,130,0,0,0,140,0,0,0,118,0,0,0,34,0,0,0,20,0,0,0,70,0,0,0,48,0,0,0,60,0,0,0,30,0,0,0,1,11,0,0,0,0,0,0,0,0,0,0,52,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,56,0,0,0,98,0,0,0,0,0,0,0,4,0,0,0,120,1,0,0,102,0,0,0,24,0,0,0,130,0,0,0,0,0,0,0,0,0,0,0,128,218,2,0,160,216,2,0,73,127,0,0,182,91,0,0,12,3,0,0,177,1,0,0,153,1,0,0,153,1,0,0,106,0,0,0,150,0,0,0,168,0,0,0,2,0,0,0,2,0,0,0,176,1,0,0,40,0,0,0,106,0,0,0,230,0,0,0,28,0,0,0,96,0,0,0,50,0,0,0,58,0,0,0,48,0,0,0,106,0,0,0,40,0,0,0,4,9,0,0,0,0,0,0,0,0,0,0,50,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,42,1,0,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,214,2,0,120,212,2,0,72,23,0,0,32,28,0,0,220,0,0,0,132,0,0,0,90,0,0,0,90,0,0,0,24,0,0,0,28,1,0,0,62,0,0,0,56,1,0,0,2,0,0,0,46,1,0,0,144,0,0,0,54,0,0,0,28,0,0,0,38,0,0,0,138,0,0,0,146,0,0,0,60,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,210,2,0,248,208,2,0,79,0,0,0,24,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,196,0,0,0,40,0,0,0,242,0,0,0,34,1,0,0,2,0,0,0,86,0,0,0,108,0,0,0,18,0,0,0,146,0,0,0,104,0,0,0,12,0,0,0,124,0,0,0,110,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,28,0,0,0,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,207,2,0,0,206,2,0,32,28,0,0,192,18,0,0,124,0,0,0,100,0,0,0,120,0,0,0,120,0,0,0,48,1,0,0,126,1,0,0,254,0,0,0,182,0,0,0,2,0,0,0,90,0,0,0,104,0,0,0,124,0,0,0,70,1,0,0,64,0,0,0,8,0,0,0,194,0,0,0,60,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,204,2,0,144,202,2,0,122,105,0,0,28,79,0,0,38,2,0,0,254,0,0,0,168,0,0,0,168,0,0,0,50,1,0,0,246,0,0,0,148,1,0,0,32,0,0,0,2,0,0,0,74,1,0,0,28,0,0,0,48,0,0,0,220,0,0,0,102,0,0,0,36,0,0,0,184,0,0,0,50,0,0,0,48,0,0,0,180,0,0,0,20,0,0,0,4,25,0,0,0,0,0,0,0,0,0,0,32,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,136,0,0,0,54,0,0,0,64,0,0,0,0,0,0,0,8,0,0,0,238,0,0,0,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,199,2,0,232,194,2,0,112,23,0,0,16,14,0,0,125,0,0,0,75,0,0,0,75,0,0,0,75,0,0,0,78,0,0,0,6,1,0,0,178,1,0,0,66,1,0,0,2,0,0,0,56,0,0,0,122,0,0,0,10,0,0,0,128,1,0,0,94,0,0,0,82,0,0,0,94,0,0,0,112,0,0,0,46,0,0,0,0,0,0,0,24,0,0,0,4,1,0,0,0,0,0,0,0,0,0,0,38,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,0,0,0,0,0,0,0,108,1,0,0,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,193,2,0,232,191,2,0,0,2,0,0,134,1,0,0,10,0,0,0,7,0,0,0,5,0,0,0,5,0,0,0,48,1,0,0,192,0,0,0,72,0,0,0,86,1,0,0,2,0,0,0,220,0,0,0,22,0,0,0,16,0,0,0,132,1,0,0,98,0,0,0,118,0,0,0,124,0,0,0,44,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,190,2,0,224,188,2,0,208,2,0,0,104,1,0,0,12,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,48,1,0,0,250,0,0,0,216,0,0,0,88,1,0,0,2,0,0,0,134,0,0,0,38,0,0,0,46,0,0,0,156,0,0,0,52,0,0,0,28,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,187,2,0,16,185,2,0,16,39,0,0,76,29,0,0,60,0,0,0,30,0,0,0,107,0,0,0,107,0,0,0,104,0,0,0,8,1,0,0,4,1,0,0,16,1,0,0,2,0,0,0,178,0,0,0,26,0,0,0,4,0,0,0,84,1,0,0,108,0,0,0,22,0,0,0,124,0,0,0,60,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,183,2,0,120,182,2,0,21,177,0,0,148,132,0,0,169,0,0,0,112,0,0,0,106,0,0,0,106,0,0,0,204,0,0,0,110,1,0,0,58,0,0,0,30,1,0,0,2,0,0,0,154,1,0,0,152,0,0,0,92,0,0,0,120,0,0,0,18,0,0,0,2,0,0,0,84,0,0,0,32,0,0,0,48,0,0,0,142,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,181,2,0,88,179,2,0,228,12,0,0,36,9,0,0,60,0,0,0,30,0,0,0,20,0,0,0,20,0,0,0,68,0,0,0,80,1,0,0,88,0,0,0,12,0,0,0,2,0,0,0,70,0,0,0,52,0,0,0,68,0,0,0,168,0,0,0,22,0,0,0,76,0,0,0,168,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,178,2,0,168,175,2,0,152,58,0,0,16,39,0,0,66,1,0,0,157,0,0,0,66,0,0,0,66,0,0,0,24,1,0,0,210,0,0,0,64,1,0,0,0,1,0,0,2,0,0,0,198,0,0,0,12,0,0,0,84,0,0,0,18,1,0,0,4,0,0,0,16,0,0,0,80,0,0,0,120,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,174,2,0,152,172,2,0,32,28,0,0,176,19,0,0,140,0,0,0,84,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,42,1,0,0,146,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,242,0,0,0,116,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,54,0,0,0,90,0,0,0,6,0,0,0,148,29,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,30,1,0,0,8,0,0,0,34,0,0,0,10,0,0,0,132,0,0,0,136,1,0,0,0,1,0,0,86,0,0,0,0,0,0,0,0,0,36,64,248,170,2,0,192,169,2,0,40,35,0,0,112,23,0,0,120,0,0,0,70,0,0,0,70,0,0,0,70,0,0,0,48,1,0,0,228,0,0,0,118,1,0,0,70,1,0,0,2,0,0,0,62,1,0,0,30,0,0,0,56,0,0,0,18,0,0,0,24,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,3,0,64,168,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,1,0,0,34,0,0,0,4,0,0,0,156,0,0,0,2,0,0,0,212,0,0,0,74,0,0,0,62,0,0,0,20,0,0,0,68,0,0,0,132,0,0,0,110,0,0,0,122,0,0,0,48,0,0,0,144,0,0,0,10,0,0,0,5,11,0,0,0,0,0,0,0,0,0,0,28,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,180,0,0,0,4,1,0,0,14,0,0,0,0,0,0,0,6,0,0,0,82,0,0,0,194,0,0,0,228,0,0,0,102,1,0,0,0,0,0,0,0,0,36,64,208,165,2,0,48,164,2,0,182,3,0,0,122,2,0,0,18,0,0,0,10,0,0,0,7,0,0,0,7,0,0,0,200,0,0,0,248,0,0,0,18,0,0,0,140,1,0,0,2,0,0,0,152,0,0,0,94,0,0,0,142,0,0,0,180,0,0,0,30,0,0,0,176,0,0,0,148,0,0,0,26,0,0,0,10,0,0,0,204,0,0,0,2,0,0,0,1,9,0,0,0,0,0,0,0,0,0,0,24,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,0,0,0,82,1,0,0,138,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,162,2,0,72,161,2,0,232,3,0,0,232,3,0,0,25,0,0,0,16,0,0,0,18,0,0,0,18,0,0,0,230,0,0,0,100,1,0,0,244,0,0,0,76,0,0,0,2,0,0,0,130,0,0,0,32,0,0,0,154,0,0,0,236,0,0,0,96,0,0,0,12,0,0,0,6,0,0,0,60,0,0,0,48,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,160,2,0,208,158,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,188,0,0,0,106,1,0,0,182,1,0,0,174,1,0,0,2,0,0,0,26,1,0,0,134,0,0,0,132,0,0,0,160,0,0,0,90,0,0,0,114,0,0,0,30,0,0,0,56,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,157,2,0,72,156,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,188,0,0,0,14,1,0,0,158,0,0,0,146,1,0,0,2,0,0,0,26,1,0,0,134,0,0,0,132,0,0,0,160,0,0,0,90,0,0,0,114,0,0,0,30,0,0,0,56,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,154,2,0,248,152,2,0,32,28,0,0,176,19,0,0,110,0,0,0,66,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,186,0,0,0,146,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,34,1,0,0,16,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,48,0,0,0,90,0,0,0,6,0,0,0,148,32,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,32,0,0,0,8,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,0,152,2,0,216,149,2,0,32,28,0,0,176,19,0,0,100,0,0,0,60,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,186,0,0,0,14,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,242,0,0,0,12,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,54,0,0,0,0,0,0,0,6,0,0,0,128,32,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,30,1,0,0,8,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,232,147,2,0,88,146,2,0,32,28,0,0,176,19,0,0,100,0,0,0,60,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,186,0,0,0,14,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,242,0,0,0,12,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,54,0,0,0,0,0,0,0,6,0,0,0,128,32,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,30,1,0,0,8,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,240,144,2,0,176,142,2,0,184,11,0,0,8,7,0,0,83,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,46,0,0,0,84,0,0,0,164,0,0,0,52,1,0,0,2,0,0,0,124,1,0,0,116,0,0,0,44,0,0,0,62,0,0,0,20,0,0,0,64,0,0,0,128,0,0,0,36,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,141,2,0,152,139,2,0,136,19,0,0,184,11,0,0,152,0,0,0,73,0,0,0,69,0,0,0,69,0,0,0,10,1,0,0,152,1,0,0,160,0,0,0,224,0,0,0,2,0,0,0,154,0,0,0,6,0,0,0,72,0,0,0,48,0,0,0,100,0,0,0,88,0,0,0,190,0,0,0,82,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,138,2,0,168,136,2,0,16,39,0,0,16,39,0,0,164,1,0,0,160,0,0,0,200,0,0,0,150,0,0,0,138,1,0,0,92,1,0,0,68,1,0,0,102,1,0,0,2,0,0,0,44,1,0,0,90,0,0,0,66,0,0,0,34,0,0,0,66,0,0,0,116,0,0,0,186,0,0,0,14,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,148,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,134,2,0,8,133,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,48,1,0,0,226,0,0,0,54,1,0,0,122,0,0,0,2,0,0,0,176,0,0,0,146,0,0,0,110,0,0,0,142,0,0,0,126,0,0,0,130,0,0,0,170,0,0,0,84,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,131,2,0,0,130,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,48,1,0,0,114,0,0,0,130,1,0,0,90,1,0,0,2,0,0,0,94,0,0,0,138,0,0,0,140,0,0,0,120,1,0,0,106,0,0,0,70,0,0,0,198,0,0,0,54,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,128,2,0,136,125,2,0,224,46,0,0,32,28,0,0,110,1,0,0,176,0,0,0,166,0,0,0,166,0,0,0,136,1,0,0,60,1,0,0,126,0,0,0,134,1,0,0,2,0,0,0,252,0,0,0,112,0,0,0,58,0,0,0,204,0,0,0,10,0,0,0,72,0,0,0,200,0,0,0,34,0,0,0,22,0,0,0,68,0,0,0,12,0,0,0,132,1,0,0,0,0,0,0,0,0,0,0,26,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,156,1,0,0,212,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,123,2,0,208,120,2,0,156,49,0,0,196,29,0,0,165,1,0,0,206,0,0,0,123,0,0,0,123,0,0,0,116,0,0,0,74,0,0,0,58,1,0,0,110,0,0,0,2,0,0,0,54,0,0,0,70,0,0,0,2,0,0,0,46,0,0,0,48,0,0,0,188,0,0,0,112,0,0,0,92,0,0,0,30,0,0,0,38,0,0,0,28,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,178,0,0,0,114,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,128,63,0,0,0,0,0,0,240,65,0,0,0,0,0,0,112,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,93,0,0,0,0,0,0,9,46,46,46,105,116,32,105,115,78,101,119,76,101,118,101,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,97,65,101,69,102,70,103,71,0,0,0,0,0,0,0,0,99,100,105,111,117,120,88,0,104,108,76,113,106,122,90,116,67,83,112,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,21,3,0,160,0,3,0,176,212,2,0,32,192,2,0,224,175,2,0,120,160,2,0,32,145,2,0,136,128,2,0,8,184,2,0,64,79,2,0,120,129,2,0,96,64,2,0,40,56,2,0,168,48,2,0,208,42,2,0,48,36,2,0,152,28,2,0,80,22,2,0,184,14,2,0,232,8,2,0,120,3,2,0,80,254,1,0,56,250,1,0,64,245,1,0,8,240,1,0,200,235,1,0])
-.concat([240,230,1,0,40,226,1,0,224,220,1,0,48,214,1,0,40,209,1,0,160,197,1,0,56,194,1,0,128,190,1,0,192,177,1,0,216,165,1,0,16,162,1,0,184,158,1,0,48,154,1,0,224,151,1,0,240,149,1,0,128,148,1,0,224,139,1,0,240,137,1,0,8,135,1,0,88,133,1,0,144,131,1,0,152,129,1,0,8,127,1,0,96,124,1,0,32,122,1,0,72,120,1,0,200,118,1,0,192,116,1,0,8,115,1,0,56,112,1,0,216,109,1,0,160,107,1,0,184,103,1,0,8,101,1,0,136,98,1,0,232,96,1,0,88,94,1,0,104,92,1,0,80,89,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,199,1,0,1,0,0,0,88,199,1,0,2,0,0,0,224,198,1,0,3,0,0,0,40,43,1,0,4,0,0,0,136,198,1,0,4,0,0,0,176,111,1,0,5,0,0,0,88,198,1,0,9,0,0,0,232,197,1,0,10,0,0,0,152,197,1,0,6,0,0,0,8,197,1,0,7,0,0,0,112,196,1,0,8,0,0,0,248,195,1,0,11,0,0,0,0,0,0,0,0,0,0,0,248,60,1,0,56,55,1,0,88,52,1,0,48,50,1,0,200,48,1,0,0,0,0,0,16,241,1,0,152,240,1,0,88,52,1,0,48,50,1,0,200,48,1,0,0,0,0,0,16,241,1,0,152,240,1,0,88,52,1,0,48,50,1,0,104,249,1,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,115,99,97,108,101,32,109,117,115,116,32,98,101,32,62,32,48,59,32,118,105,101,119,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,114,111,116,95,37,99,32,109,117,115,116,32,98,101,32,105,110,32,91,48,58,37,100,93,32,100,101,103,114,101,101,115,32,114,97,110,103,101,59,32,118,105,101,119,32,117,110,99,104,97,110,103,101,100,0,0,232,119,1,0,2,0,0,0,16,118,1,0,1,0,0,0,48,116,1,0,1,0,0,0,96,114,1,0,3,0,0,0,176,111,1,0,4,0,0,0,56,109,1,0,5,0,0,0,248,105,1,0,6,0,0,0,8,199,1,0,7,0,0,0,40,100,1,0,8,0,0,0,232,97,1,0,9,0,0,0,248,95,1,0,10,0,0,0,32,93,1,0,11,0,0,0,56,91,1,0,12,0,0,0,0,89,1,0,13,0,0,0,0,84,1,0,14,0,0,0,224,79,1,0,15,0,0,0,16,75,1,0,17,0,0,0,232,72,1,0,18,0,0,0,160,69,1,0,19,0,0,0,16,66,1,0,20,0,0,0,80,60,1,0,21,0,0,0,248,54,1,0,22,0,0,0,24,52,1,0,23,0,0,0,248,49,1,0,16,0,0,0,96,48,1,0,16,0,0,0,0,46,1,0,24,0,0,0,184,43,1,0,25,0,0,0,96,41,1,0,26,0,0,0,24,39,1,0,27,0,0,0,104,37,1,0,28,0,0,0,104,35,1,0,29,0,0,0,200,33,1,0,30,0,0,0,96,32,1,0,31,0,0,0,208,30,1,0,32,0,0,0,112,28,1,0,31,0,0,0,32,111,3,0,32,0,0,0,80,109,3,0,33,0,0,0,80,105,3,0,34,0,0,0,240,102,3,0,35,0,0,0,64,101,3,0,36,0,0,0,32,98,3,0,37,0,0,0,56,96,3,0,37,0,0,0,136,93,3,0,38,0,0,0,0,87,3,0,39,0,0,0,48,85,3,0,40,0,0,0,192,82,3,0,41,0,0,0,128,80,3,0,42,0,0,0,240,77,3,0,44,0,0,0,32,76,3,0,45,0,0,0,56,74,3,0,48,0,0,0,56,72,3,0,49,0,0,0,32,70,3,0,46,0,0,0,128,67,3,0,47,0,0,0,120,65,3,0,52,0,0,0,80,63,3,0,53,0,0,0,208,60,3,0,50,0,0,0,168,58,3,0,51,0,0,0,48,57,3,0,54,0,0,0,56,55,3,0,55,0,0,0,104,52,3,0,68,0,0,0,176,49,3,0,69,0,0,0,88,48,3,0,56,0,0,0,16,46,3,0,57,0,0,0,200,43,3,0,58,0,0,0,136,40,3,0,59,0,0,0,0,38,3,0,61,0,0,0,176,34,3,0,60,0,0,0,64,32,3,0,62,0,0,0,32,31,3,0,63,0,0,0,56,30,3,0,63,0,0,0,16,189,2,0,76,0,0,0,16,29,3,0,77,0,0,0,24,28,3,0,78,0,0,0,56,27,3,0,79,0,0,0,248,172,2,0,80,0,0,0,72,26,3,0,81,0,0,0,24,25,3,0,75,0,0,0,0,24,3,0,82,0,0,0,120,97,1,0,83,0,0,0,152,19,3,0,85,0,0,0,184,16,3,0,84,0,0,0,128,13,3,0,86,0,0,0,176,123,1,0,87,0,0,0,200,10,3,0,88,0,0,0,112,9,3,0,89,0,0,0,216,7,3,0,90,0,0,0,168,6,3,0,91,0,0,0,248,4,3,0,92,0,0,0,224,2,3,0,93,0,0,0,152,0,3,0,94,0,0,0,128,121,1,0,97,0,0,0,24,254,2,0,98,0,0,0,0,252,2,0,99,0,0,0,88,245,2,0,119,0,0,0,120,243,2,0,110,0,0,0,144,235,2,0,101,0,0,0,32,221,2,0,129,0,0,0,216,218,2,0,120,0,0,0,224,216,2,0,138,0,0,0,112,214,2,0,70,0,0,0,168,212,2,0,113,0,0,0,184,210,2,0,104,0,0,0,48,209,2,0,132,0,0,0,232,207,2,0,123,0,0,0,64,206,2,0,141,0,0,0,208,204,2,0,64,0,0,0,232,202,2,0,117,0,0,0,96,200,2,0,118,0,0,0,40,195,2,0,108,0,0,0,200,193,2,0,109,0,0,0,24,192,2,0,136,0,0,0,120,190,2,0,137,0,0,0,8,189,2,0,127,0,0,0,192,187,2,0,128,0,0,0,96,185,2,0,145,0,0,0,160,183,2,0,146,0,0,0,200,182,2,0,147,0,0,0,96,181,2,0,148,0,0,0,120,179,2,0,66,0,0,0,48,178,2,0,67,0,0,0,216,175,2,0,111,0,0,0,80,174,2,0,112,0,0,0,232,172,2,0,102,0,0,0,16,171,2,0,103,0,0,0,0,170,2,0,130,0,0,0,160,168,2,0,131,0,0,0,24,166,2,0,121,0,0,0,112,164,2,0,122,0,0,0,8,163,2,0,139,0,0,0,136,161,2,0,140,0,0,0,104,160,2,0,71,0,0,0,0,159,2,0,72,0,0,0,200,157,2,0,114,0,0,0,120,156,2,0,115,0,0,0,200,154,2,0,105,0,0,0,56,153,2,0,106,0,0,0,16,152,2,0,133,0,0,0,40,150,2,0,134,0,0,0,248,147,2,0,124,0,0,0,152,146,2,0,125,0,0,0,24,145,2,0,142,0,0,0,232,142,2,0,143,0,0,0,64,141,2,0,73,0,0,0,232,139,2,0,74,0,0,0,120,138,2,0,116,0,0,0,232,136,2,0,107,0,0,0,16,135,2,0,135,0,0,0,88,133,2,0,126,0,0,0,224,131,2,0,144,0,0,0,56,130,2,0,65,0,0,0,80,128,2,0,149,0,0,0,192,125,2,0,95,0,0,0,224,123,2,0,96,0,0,0,88,121,2,0,100,0,0,0,192,111,2,0,153,0,0,0,24,109,2,0,154,0,0,0,80,107,2,0,155,0,0,0,240,104,2,0,156,0,0,0,168,96,2,0,157,0,0,0,80,93,2,0,152,0,0,0,248,91,2,0,150,0,0,0,216,90,2,0,151,0,0,0,0,0,0,0,0,0,0,0,48,116,1,0,1,0,0,0,24,20,2,0,2,0,0,0,128,19,2,0,3,0,0,0,136,18,2,0,4,0,0,0,240,17,2,0,5,0,0,0,120,17,2,0,6,0,0,0,160,16,2,0,7,0,0,0,32,16,2,0,8,0,0,0,144,15,2,0,9,0,0,0,168,14,2,0,10,0,0,0,24,14,2,0,11,0,0,0,152,13,2,0,12,0,0,0,40,13,2,0,13,0,0,0,136,12,2,0,14,0,0,0,232,247,1,0,15,0,0,0,48,11,2,0,16,0,0,0,168,10,2,0,17,0,0,0,16,10,2,0,18,0,0,0,144,9,2,0,19,0,0,0,216,8,2,0,20,0,0,0,168,7,2,0,21,0,0,0,240,6,2,0,22,0,0,0,96,6,2,0,23,0,0,0,0,0,0,0,0,0,0,0,240,34,2,0,1,0,0,0,40,34,2,0,2,0,0,0,8,93,1,0,3,0,0,0,128,32,2,0,3,0,0,0,208,250,1,0,4,0,0,0,248,30,2,0,5,0,0,0,88,30,2,0,9,0,0,0,104,29,2,0,10,0,0,0,136,28,2,0,11,0,0,0,112,27,2,0,12,0,0,0,192,26,2,0,6,0,0,0,56,26,2,0,7,0,0,0,168,25,2,0,8,0,0,0,64,25,2,0,13,0,0,0,128,24,2,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,154,153,153,153,153,153,169,63,154,153,153,153,153,153,201,63,154,153,153,153,153,153,185,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,102,102,102,102,102,102,230,63,51,51,51,51,51,51,235,63,205,204,204,204,204,204,236,63,154,153,153,153,153,153,217,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,102,102,102,102,102,102,230,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,51,51,51,51,51,51,227,63,51,51,51,51,51,51,227,63,51,51,51,51,51,51,227,63,0,0,0,0,0,0,240,63,102,102,102,102,102,102,238,63,102,102,102,102,102,102,238,63,102,102,102,102,102,102,238,63,232,211,1,0,0,0,0,0,128,82,2,0,1,0,0,0,112,82,2,0,2,0,0,0,96,82,2,0,4,0,0,0,80,82,2,0,5,0,0,0,8,82,2,0,3,0,0,0,0,82,2,0,6,0,0,0,128,234,1,0,7,0,0,0,0,0,0,0,8,0,0,0,136,208,2,0,39,0,0,0,104,75,2,0,40,0,0,0,192,74,2,0,41,0,0,0,32,74,2,0,1,0,0,0,88,73,2,0,2,0,0,0,192,72,2,0,3,0,0,0,64,72,2,0,4,0,0,0,56,71,2,0,5,0,0,0,8,70,2,0,6,0,0,0,104,69,2,0,7,0,0,0,216,68,2,0,8,0,0,0,232,67,2,0,13,0,0,0,168,67,2,0,9,0,0,0,192,66,2,0,14,0,0,0,48,116,1,0,10,0,0,0,32,66,2,0,11,0,0,0,88,65,2,0,12,0,0,0,80,64,2,0,15,0,0,0,72,63,2,0,16,0,0,0,64,62,2,0,17,0,0,0,48,61,2,0,18,0,0,0,136,60,2,0,19,0,0,0,200,59,2,0,20,0,0,0,32,59,2,0,21,0,0,0,120,58,2,0,22,0,0,0,232,57,2,0,23,0,0,0,200,56,2,0,24,0,0,0,0,224,1,0,25,0,0,0,192,218,1,0,26,0,0,0,240,53,2,0,27,0,0,0,16,53,2,0,28,0,0,0,40,52,2,0,29,0,0,0,72,51,2,0,30,0,0,0,184,50,2,0,31,0,0,0,64,50,2,0,32,0,0,0,248,49,2,0,37,0,0,0,96,49,2,0,38,0,0,0,128,234,1,0,33,0,0,0,0,48,2,0,34,0,0,0,192,229,1,0,35,0,0,0,192,46,2,0,36,0,0,0,8,46,2,0,36,0,0,0,72,45,2,0,42,0,0,0,200,44,2,0,42,0,0,0,40,44,2,0,43,0,0,0,176,43,2,0,44,0,0,0,88,43,2,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,89,2,0,1,0,0,0,0,82,2,0,2,0,0,0,40,86,2,0,3,0,0,0,112,84,2,0,4,0,0,0,0,83,2,0,5,0,0,0,192,81,2,0,6,0,0,0,200,80,2,0,7,0,0,0,32,80,2,0,8,0,0,0,48,79,2,0,9,0,0,0,8,78,2,0,10,0,0,0,72,77,2,0,11,0,0,0,176,76,2,0,12,0,0,0,0,0,0,0,0,0,0,0,136,208,2,0,0,0,0,0,88,188,2,0,15,0,0,0,24,172,2,0,1,0,0,0,176,73,2,0,2,0,0,0,152,4,2,0,3,0,0,0,160,209,1,0,4,0,0,0,88,157,2,0,5,0,0,0,144,122,1,0,6,0,0,0,184,98,1,0,7,0,0,0,184,67,1,0,8,0,0,0,24,38,1,0,9,0,0,0,40,102,3,0,10,0,0,0,56,75,3,0,11,0,0,0,152,140,2,0,12,0,0,0,112,122,2,0,13,0,0,0,152,88,2,0,14,0,0,0,0,0,0,0,16,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,176,0,0,0,0,0,0,160,41,2,0,1,0,0,0,216,40,2,0,2,0,0,0,136,208,2,0,3,0,0,0,32,40,2,0,4,0,0,0,48,116,1,0,4,0,0,0,80,39,2,0,5,0,0,0,184,38,2,0,6,0,0,0,56,38,2,0,7,0,0,0,184,37,2,0,8,0,0,0,56,86,3,0,9,0,0,0,40,36,2,0,10,0,0,0,120,35,2,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,128,1,0,1,0,0,0,16,126,1,0,3,0,0,0,176,123,1,0,2,0,0,0,128,121,1,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,141,2,0,40,140,2,0,160,138,2,0,56,137,2,0,96,135,2,0,0,0,0,0,100,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,205,204,204,204,204,204,236,63,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,37,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,243,1,0,24,150,1,0,104,136,1,0,8,116,1,0,128,90,1,0,48,153,2,0,80,32,1,0,112,22,3,0,64,67,3,0,192,45,3,0,248,26,3,0,168,7,3,0,120,220,2,0,112,202,2,0,96,182,2,0,152,165,2,0,232,151,2,0,216,134,2,0,0,107,2,0,144,82,2,0,144,74,2,0,120,67,2,0,224,58,2,0,128,50,2,0,152,44,2,0,152,38,2,0,112,31,2,0,96,24,2,0,16,17,2,0,8,11,2,0,16,5,2,0,72,0,2,0,240,251,1,0,136,246,1,0,248,241,1,0,8,237,1,0,24,232,1,0,248,227,1,0,136,222,1,0,144,216,1,0,16,210,1,0,152,198,1,0,32,195,1,0,200,191,1,0,184,186,1,0,72,167,1,0,104,163,1,0,0,160,1,0,40,155,1,0,104,152,1,0,80,150,1,0,208,148,1,0,184,140,1,0,152,138,1,0,176,135,1,0,184,133,1,0,56,132,1,0,168,130,1,0,176,127,1,0,32,125,1,0,232,122,1,0,168,120,1,0,48,119,1,0,40,117,1,0,80,115,1,0,152,112,1,0,64,110,1,0,72,108,1,0,168,104,1,0,144,101,1,0,208,98,1,0,72,97,1,0,48,95,1,0,192,92,1,0,152,190,2,0,152,190,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,93,1,0,72,93,1,0,248,92,1,0,208,92,1,0,240,92,1,0,184,92,1,0,160,92,1,0,48,55,1,0,232,54,1,0,200,54,1,0,72,93,1,0,192,54,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,255,0,255,0,255,255,255,255,0,143,188,143,255,105,180,0,0,0,255,127,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,89,64,0,0,0,0,0,136,195,64,0,0,0,0,132,215,151,65,0,128,224,55,121,195,65,67,23,110,5,181,181,184,147,70,245,249,63,233,3,79,56,77,50,29,48,249,72,119,130,90,60,191,115,127,221,79,21,117,3,0,0,0,50,0,0,0,50,0,0,0,2,0,0,0,0,0,0,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,65,0,0,128,63,0,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,1,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,3,0,0,0,50,0,0,0,50,0,0,0,2,0,0,0,0,0,0,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,65,0,0,128,63,0,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,1,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,255,255,255,255,0,0,0,0,48,0,0,0,0,0,0,0,128,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,98,0,97,52,0,0,0,0,0,0,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,224,198,1,0,1,0,0,0,184,195,1,0,33,0,0,0,232,52,2,0,18,0,0,0,48,195,1,0,51,0,0,0,240,194,1,0,51,0,0,0,192,194,1,0,64,0,0,0,104,194,1,0,39,1,0,0])
-.concat([40,194,1,0,39,1,0,0,88,193,1,0,23,1,0,0,240,192,1,0,55,1,0,0,168,192,1,0,102,0,0,0,104,192,1,0,102,0,0,0,16,192,1,0,86,0,0,0,224,191,1,0,118,0,0,0,168,191,1,0,153,0,0,0,112,191,1,0,136,1,0,0,32,191,1,0,89,1,0,0,112,190,1,0,169,0,0,0,88,189,1,0,137,0,0,0,192,188,1,0,177,0,0,0,96,188,1,0,184,0,0,0,40,188,1,0,193,0,0,0,120,187,1,0,209,0,0,0,216,186,1,0,225,0,0,0,104,186,1,0,1,1,0,0,88,185,1,0,252,0,0,0,248,195,1,0,218,1,0,0,0,38,3,0,96,1,0,0,80,184,1,0,112,1,0,0,184,177,1,0,144,1,0,0,248,175,1,0,160,1,0,0,128,172,1,0,176,1,0,0,216,170,1,0,201,1,0,0,176,168,1,0,233,1,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,128,196,1,0,1,0,0,0,0,193,1,0,2,0,0,0,200,188,1,0,3,0,0,0,144,172,1,0,4,0,0,0,216,164,1,0,5,0,0,0,8,161,1,0,6,0,0,0,48,157,1,0,7,0,0,0,16,153,1,0,8,0,0,0,200,150,1,0,9,0,0,0,0,0,0,0,0,0,0,0,67,97,110,32,115,112,101,99,105,102,121,32,96,111,114,105,103,105,110,96,32,111,114,32,96,99,101,110,116,101,114,96,44,32,98,117,116,32,110,111,116,32,98,111,116,104,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,224,1,0,0,0,0,0,216,219,1,0,1,0,0,0,64,212,1,0,2,0,0,0,232,199,1,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,154,153,153,153,153,153,201,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,4,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,10,215,163,59,56,0,0,0,71,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,59,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,110,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,53,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,115,0,0,0,111,18,3,59,182,243,125,61,40,0,0,0,75,0,0,0,10,215,163,59,154,153,153,61,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,44,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,32,35,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,28,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,13,0,0,0,5,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,231,251,31,65,160,134,0,0,160,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,12,0,0,0,3,0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,14,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,43,3,0,136,43,3,0,0,43,3,0,168,42,3,0,120,42,3,0,64,42,3,0,216,41,3,0,128,41,3,0,64,41,3,0,240,40,3,0,152,40,3,0,120,40,3,0,32,40,3,0,0,40,3,0,192,39,3,0,128,39,3,0,64,39,3,0,0,39,3,0,176,38,3,0,160,38,3,0,8,38,3,0,184,37,3,0,48,37,3,0,248,36,3,0,176,36,3,0,80,36,3,0,40,36,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,200,1,0,240,196,1,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,150,1,0,48,153,2,0,240,152,2,0,224,156,0,0,232,152,2,0,224,152,2,0,112,169,2,0,0,0,0,0,128,152,2,0,120,152,2,0,96,152,2,0,24,152,2,0,8,152,2,0,248,151,2,0,224,151,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,205,204,204,204,204,204,236,63,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,117,1,0,32,235,1,0,80,230,1,0,192,224,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,175,203,174,131,28,212,63,5,131,82,81,72,84,238,63,69,54,70,161,27,144,249,63,152,255,235,55,110,60,2,64,78,179,64,187,67,42,8,64,182,126,159,22,40,30,15,64,4,60,105,225,178,74,246,63,1,185,171,244,102,150,205,63,22,140,132,149,142,226,195,191,74,181,106,247,109,120,121,63,254,41,194,141,220,23,24,63,203,225,243,45,104,14,165,190,132,27,223,205,9,48,240,63,248,153,229,120,38,16,232,191,53,126,55,150,221,183,137,63,17,80,205,36,107,134,132,63,156,200,73,125,117,186,47,191,218,83,12,136,64,206,160,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,15,0,0,14,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,56,15,0,14,53,15,0,14,59,15,0,14,58,15,0,14,60,15,0,15,124,15,0,14,61,15,0,14,43,15,0,0,0,0,0,14,121,15,0,14,123,15,0,0,0,0,0,0,0,0,0,0,0,0,0,14,48,15,0,14,122,15,0,14,126,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,122,15,0,14,125,15,0,14,119,15,0,14,120,15,0,0,0,0,0,14,57,15,0,14,33,15,0,14,96,15,0,14,34,15,0,14,97,15,0,14,88,15,0,14,80,15,0,14,83,15,0,14,52,15,0,14,35,15,0,14,92,15,0,14,36,15,0,14,37,15,0,14,102,15,0,14,101,15,0,14,38,15,0,14,39,15,0,14,99,15,0,14,54,15,0,14,104,15,0,14,103,15,0,14,95,15,0,14,105,15,0,14,90,15,0,0,0,0,0,14,82,15,0,14,45,15,0,14,109,15,0,14,46,15,0,14,91,15,0,0,0,0,0,14,112,15,0,14,94,15,0,14,72,15,0,14,68,15,0,14,64,15,0,14,98,15,0,14,76,15,0,14,84,15,0,14,87,15,0,14,53,15,0,14,73,15,0,14,69,15,0,14,65,15,0,14,77,15,0,14,89,15,0,14,85,15,0,14,81,15,0,14,93,15,0,14,100,15,0,14,55,15,0,14,74,15,0,14,70,15,0,14,66,15,0,14,106,15,0,14,78,15,0,0,0,0,0,14,86,15,0,14,75,15,0,14,71,15,0,14,67,15,0,14,79,15,0,0,0,0,0,14,113,15,0,14,111,15,0,14,52,15,0,14,79,15,0,14,69,15,0,14,64,15,0,14,76,15,0,14,72,15,0,14,84,15,0,14,53,15,0,14,65,15,0,14,77,15,0,14,73,15,0,14,93,15,0,14,81,15,0,14,89,15,0,14,88,15,0,14,80,15,0,14,92,15,0,14,87,15,0,14,83,15,0,14,66,15,0,14,78,15,0,14,74,15,0,14,67,15,0,14,75,15,0,14,111,15,0,14,90,15,0,14,91,15,0,14,86,15,0,14,59,15,0,14,82,15,0,0,0,0,0,14,62,15,0,14,68,15,0,14,85,15,0,14,70,15,0,14,71,15,0,14,55,15,0,14,54,15,0,14,121,15,0,14,122,15,0,14,57,15,0,0,0,0,0,0,0,0,0,14,120,15,0,14,119,15,0,14,56,15,0,14,123,15,0,14,125,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,96,15,0,14,34,15,0,14,33,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,63,15,0,14,60,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,98,15,0,14,97,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,58,15,0,14,100,15,0,14,99,15,0,14,36,15,0,14,37,15,0,14,35,15,0,0,0,0,0,14,101,15,0,14,38,15,0,14,39,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,102,15,0,0,0,0,0,14,103,15,0,14,94,15,0,14,95,15,0,14,104,15,0,14,106,15,0,14,105,15,0,0,0,0,0,14,113,15,0,14,112,15,0,14,109,15,0,14,46,15,0,14,45,15,0,0,0,0,0,0,0,0,0,14,48,15,0,14,40,15,0,14,118,15,0,14,126,15,0,0,0,0,0,0,0,0,0,0,0,0,0,14,61,15,0,0,0,0,0,0,0,0,0,14,122,15,0,14,43,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,255,251,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,46,54,0,0,0,0,0,51,0,0,0,0,0,0,0,50,48,49,51,45,48,52,45,49,50,32,0,0,0,0,0,67,111,112,121,114,105,103,104,116,32,40,67,41,32,49,57,56,54,45,49,57,57,51,44,32,49,57,57,56,44,32,50,48,48,52,44,32,50,48,48,55,45,50,48,49,51,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,97,110,117,97,114,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,101,98,114,117,97,114,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,97,114,99,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,112,114,105,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,117,110,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,117,108,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,117,103,117,115,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,111,118,101,109,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,117,110,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-.concat([77,111,110,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,117,101,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,114,105,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,97,116,117,114,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,78,3,0,116,1,0,0,72,75,2,0,32,1,0,0,112,5,2,0,64,1,0,0,64,210,1,0,62,1,0,0,96,150,1,0,36,1,0,0,152,76,3,0,10,1,0,0,248,109,3,0,188,0,0,0,72,68,1,0,128,0,0,0,216,150,1,0,100,0,0,0,104,102,3,0,170,0,0,0,136,75,3,0,210,0,0,0,88,54,3,0,80,1,0,0,224,30,3,0,72,1,0,0,120,15,3,0,222,0,0,0,136,250,2,0,78,1,0,0,176,208,2,0,28,1,0,0,120,188,2,0,232,0,0,0,168,42,2,0,56,1,0,0,24,36,2,0,252,0,0,0,184,140,2,0,172,0,0,0,32,111,3,0,68,0,0,0,168,88,2,0,74,0,0,0,40,77,2,0,124,0,0,0,184,69,2,0,206,0,0,0,0,62,2,0,192,0,0,0,136,53,2,0,166,0,0,0,224,46,2,0,72,0,0,0,80,41,2,0,246,0,0,0,88,34,2,0,96,1,0,0,152,26,2,0,216,0,0,0,192,19,2,0,214,0,0,0,112,13,2,0,74,1,0,0,160,6,2,0,2,0,0,0,208,1,2,0,84,0,0,0,64,253,1,0,208,0,0,0,16,248,1,0,114,1,0,0,184,243,1,0,82,1,0,0,184,238,1,0,104,0,0,0,112,234,1,0,234,0,0,0,176,229,1,0,6,1,0,0,208,223,1,0,30,0,0,0,152,190,2,0,0,0,0,0,72,158,1,0,240,0,0,0,144,199,1,0,104,1,0,0,0,196,1,0,104,1,0,0,144,42,2,0,116,0,0,0,112,188,1,0,176,0,0,0,240,170,1,0,2,1,0,0,120,164,1,0,98,1,0,0,184,160,1,0,12,0,0,0,248,156,1,0,152,0,0,0,216,152,1,0,112,1,0,0,168,150,1,0,110,0,0,0,72,149,1,0,250,0,0,0,120,145,1,0,184,0,0,0,0,139,1,0,130,1,0,0,96,136,1,0,126,0,0,0,80,134,1,0,134,0,0,0,144,132,1,0,20,1,0,0,240,130,1,0,60,0,0,0,64,128,1,0,66,0,0,0,208,125,1,0,70,0,0,0,112,123,1,0,90,1,0,0,88,121,1,0,76,1,0,0,184,119,1,0,76,0,0,0,216,117,1,0,110,1,0,0,0,116,1,0,68,1,0,0,224,113,1,0,36,0,0,0,96,182,2,0,196,0,0,0,0,137,1,0,122,0,0,0,208,105,1,0,106,0,0,0,136,102,1,0,6,0,0,0,224,99,1,0,224,0,0,0,192,97,1,0,226,0,0,0,208,95,1,0,46,1,0,0,0,93,1,0,44,1,0,0,120,90,1,0,82,0,0,0,160,87,1,0,202,0,0,0,168,83,1,0,154,0,0,0,168,79,1,0,164,0,0,0,144,74,1,0,186,0,0,0,184,72,1,0,218,0,0,0,104,69,1,0,44,0,0,0,136,65,1,0,12,1,0,0,184,59,1,0,112,0,0,0,208,54,1,0,8,1,0,0,248,51,1,0,58,1,0,0,208,49,1,0,122,1,0,0,0,48,1,0,78,0,0,0,216,45,1,0,66,1,0,0,120,43,1,0,118,0,0,0,48,41,1,0,52,1,0,0,208,38,1,0,126,1,0,0,48,37,1,0,244,0,0,0,72,35,1,0,64,0,0,0,152,33,1,0,14,1,0,0,72,32,1,0,88,1,0,0,144,30,1,0,254,0,0,0,72,28,1,0,124,1,0,0,240,110,3,0,190,0,0,0,192,108,3,0,50,1,0,0,56,105,3,0,50,0,0,0,208,102,3,0,86,1,0,0,192,165,1,0,60,1,0,0,200,97,3,0,42,0,0,0,32,96,3,0,40,1,0,0,48,93,3,0,198,0,0,0,144,86,3,0,114,1,0,0,240,84,3,0,238,0,0,0,240,161,1,0,238,0,0,0,24,80,3,0,248,0,0,0,192,77,3,0,22,1,0,0,32,42,2,0,10,0,0,0,8,74,3,0,92,1,0,0,0,72,3,0,162,0,0,0,208,69,3,0,162,0,0,0,56,67,3,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,25,2,0,232,18,2,0,200,12,2,0,48,6,2,0,128,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,121,1,0,0,0,0,0,8,120,1,0,0,0,0,0,192,172,1,0,240,164,1,0,102,105,116,46,108,111,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,167,1,0,0,0,0,0,96,167,1,0,1,0,0,0,8,167,1,0,2,0,0,0,176,166,1,0,3,0,0,0,88,166,1,0,4,0,0,0,160,76,2,0,9,0,0,0,96,244,2,0,10,0,0,0,208,164,1,0,11,0,0,0,112,164,1,0,12,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,80,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,50,0,0,0,50,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,65,0,0,128,63,1,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,2,0,0,0,50,0,0,0,50,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,65,0,0,128,63,1,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,241,104,227,136,181,248,228,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,236,1,0,96,25,3,0,176,73,2,0,152,4,2,0,160,209,1,0,32,150,1,0,144,122,1,0,184,98,1,0,184,67,1,0,24,38,1,0,40,102,3,0,56,75,3,0,0,54,3,0,176,30,3,0,240,14,3,0,48,246,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,65,0,0,0,0,0,0,0,0,0,0,240,63,65,114,105,97,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,65,0,0,0,0,65,114,105,97,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,64,0,0,0,0,0,0,160,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,8,0,0,0,0,0,0,0,12,0,0,0,10,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,121,1,0,24,121,1,0,216,120,1,0,152,120,1,0,128,120,1,0,104,120,1,0,88,120,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,57,2,0,1,0,0,0,0,0,1,0,184,49,2,0,0,0,0,0,1,0,1,0,56,49,2,0,3,0,0,0,0,0,2,0,48,43,2,0,2,0,0,0,1,0,2,0,168,36,2,0,5,0,0,0,0,0,4,0,232,28,2,0,4,0,0,0,1,0,4,0,192,22,2,0,7,0,0,0,0,0,8,0,248,14,2,0,6,0,0,0,1,0,8,0,16,9,2,0,8,0,0,0,2,0,4,0,152,3,2,0,9,0,0,0,2,0,8,0,160,254,1,0,8,0,0,0,2,0,4,0,160,250,1,0,9,0,0,0,2,0,8,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,32,73,2,0,0,0,0,0,0,66,2,0,3,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,101,120,101,99,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,10,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,104,149,1,0,1,0,0,0,72,147,1,0,2,0,0,0,88,139,1,0,3,0,0,0,0,137,1,0,4,0,0,0,120,134,1,0,5,0,0,0,192,132,1,0,6,0,0,0,24,131,1,0,7,0,0,0,0,0,0,0,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,129,2,0,88,59,3,0,16,92,2,0,8,161,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,1,0,1,2,2,1,0,1,3,2,1,0,152,187,0,0,10,0,0,0,248,186,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,219,0,0,2,0,0,0,0,0,0,0,1,0,0,0,248,7,0,0,2,0,0,0,1,0,0,0,1,0,0,0,72,3,0,0,2,0,0,0,2,0,0,0,2,0,0,0,168,3,0,0,2,0,0,0,3,0,0,0,2,0,0,0,88,3,0,0,1,0,0,0,6,0,0,0,4,0,0,0,184,3,0,0,1,0,0,0,7,0,0,0,4,0,0,0,80,3,0,0,1,0,0,0,10,0,0,0,8,0,0,0,176,3,0,0,1,0,0,0,11,0,0,0,8,0,0,0,0,165,0,0,1,0,0,0,8,0,0,0,4,0,0,0,8,165,0,0,1,0,0,0,9,0,0,0,8,0,0,0,168,211,0,0,3,0,0,0,0,0,0,0,1,0,0,0,240,7,0,0,1,0,0,0,1,0,0,0,1,0,0,0,88,85,0,0,1,0,0,0,2,0,0,0,2,0,0,0,112,4,0,0,1,0,0,0,3,0,0,0,2,0,0,0,64,146,0,0,4,0,0,0,4,0,0,0,4,0,0,0,184,7,0,0,2,0,0,0,5,0,0,0,4,0,0,0,64,137,0,0,2,0,0,0,6,0,0,0,4,0,0,0,176,7,0,0,2,0,0,0,7,0,0,0,4,0,0,0,16,165,0,0,2,0,0,0,8,0,0,0,4,0,0,0,96,201,0,0,2,0,0,0,9,0,0,0,8,0,0,0,72,55,1,0,253,255,255,255,252,255,255,255,251,255,255,255,200,125,2,0,252,255,255,255,251,255,255,255,253,255,255,255,224,90,2,0,251,255,255,255,253,255,255,255,252,255,255,255,0,78,2,0,252,255,255,255,253,255,255,255,251,255,255,255,48,71,2,0,253,255,255,255,251,255,255,255,252,255,255,255,64,63,2,0,251,255,255,255,252,255,255,255,253,255,255,255,32,55,2,0,253,255,255,255,252,255,255,255,251,255,255,255,248,47,2,0,252,255,255,255,251,255,255,255,253,255,255,255,24,42,2,0,251,255,255,255,253,255,255,255,252,255,255,255,112,35,2,0,252,255,255,255,253,255,255,255,251,255,255,255,88,27,2,0,253,255,255,255,251,255,255,255,252,255,255,255,224,20,2,0,251,255,255,255,252,255,255,255,253,255,255,255,160,76,2,0,253,255,255,255,252,255,255,255,251,255,255,255,64,69,2,0,252,255,255,255,253,255,255,255,251,255,255,255,96,174,2,0,253,255,255,255,252,255,255,255,251,255,255,255,16,159,2,0,252,255,255,255,253,255,255,255,251,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,253,255,255,255,252,255,255,255,251,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,220,1,0,202,0,0,0,240,153,1,0,174,0,0,0,224,126,1,0,164,1,0,0,80,103,1,0,164,1,0,0,80,87,3,0,142,0,0,0,24,42,1,0,124,0,0,0,232,105,3,0,2,1,0,0,80,78,3,0,2,1,0,0,128,57,3,0,144,0,0,0,160,32,3,0,174,0,0,0,224,109,1,0,174,0,0,0,40,17,3,0,64,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,176,0,0,0,0,0,0,1,0,0,0,1,0,1,0,18,0,0,0,1,0,1,0,33,0,0,0,1,0,1,0,51,0,0,0,1,0,1,0,64,0,0,0,1,0,1,0,86,0,0,0,2,0,1,0,102,0,0,0,2,0,1,0,118,0,0,0,3,0,1,0,137,0,0,0,3,0,1,0,153,0,0,0,1,0,1,0,169,0,0,0,3,0,1,0,177,0,0,0,1,0,1,0,193,0,0,0,1,0,1,0,184,0,0,0,1,0,1,0,209,0,0,0,1,0,1,0,225,0,0,0,2,0,2,0,252,0,0,0,4,0,1,0,1,1,0,0,4,0,1,0,218,1,0,0,2,0,1,0,23,1,0,0,2,0,1,0,39,1,0,0,2,0,1,0,55,1,0,0,3,0,1,0,89,1,0,0,1,0,1,0,96,1,0,0,1,0,2,0,112,1,0,0,2,0,1,0,136,1,0,0,1,0,0,0,144,1,0,0,1,0,2,0,160,1,0,0,3,0,2,0,176,1,0,0,4,0,2,0,201,1,0,0,2,0,1,0,233,1,0,0,2,0,3,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,3,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,184,30,133,235,81,184,158,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,73,1,0,255,255,255,0,72,93,1,0,0,0,0,0,48,5,2,0,160,160,160,0,248,92,1,0,0,0,255,0,32,4,2,0,0,192,0,0,208,3,2,0,255,128,0,0,104,3,2,0,255,0,192,0,136,2,2,0,238,238,0,0,8,2,2,0,0,64,192,0,184,1,2,0,0,200,200,0,96,1,2,0,225,105,65,0,184,0,2,0,32,192,255,0,120,0,2,0,64,128,0,0,0,0,2,0,255,128,192,0,104,255,1,0,128,96,48,0,208,254,1,0,0,0,139,0,64,254,1,0,0,128,64,0,200,253,1,0,255,128,255,0,104,253,1,0,212,255,127,0,200,92,1,0,42,42,165,0,48,55,1,0,0,255,255,0,160,252,1,0,208,224,64,0,16,252,1,0,0,0,0,0,208,251,1,0,26,26,26,0,88,251,1,0,51,51,51,0,216,250,1,0,77,77,77,0,48,250,1,0,102,102,102,0,128,249,1,0,127,127,127,0,88,248,1,0,153,153,153,0,240,247,1,0,179,179,179,0,128,32,2,0,192,192,192,0,144,247,1,0,204,204,204,0,24,247,1,0,229,229,229,0,168,246,1,0,255,255,255,0,64,246,1,0,50,50,240,0,232,245,1,0,144,238,144,0,160,245,1,0,230,216,173,0,48,245,1,0,240,85,240,0,112,244,1,0,255,255,224,0,232,243,1,0,130,221,238,0,144,243,1,0,193,182,255,0,8,243,1,0,238,238,175,0,120,242,1,0,0,215,255,0,208,92,1,0,0,255,0,0,200,241,1,0,0,100,0,0,0,241,1,0,127,255,0,0,136,240,1,0,34,139,34,0,248,239,1,0,87,139,46,0,240,92,1,0,255,0,0,0,248,238,1,0,139,0,0,0,104,238,1,0,112,25,25,0,232,237,1,0,128,0,0,0,104,237,1,0,205,0,0,0,48,237,1,0,235,206,135,0,160,92,1,0,255,255,0,0,184,92,1,0,255,0,255,0,32,236,1,0,209,206,0,0,184,235,1,0,147,20,255,0,192,54,1,0,80,127,255,0,160,234,1,0,128,128,240,0,72,234,1,0,0,69,255,0,216,233,1,0,114,128,250,0,128,233,1,0,122,150,233,0,168,232,1,0,140,230,240,0,240,231,1,0,107,183,189,0,144,231,1,0,11,134,184,0,64,231,1,0,220,245,245,0,232,230,1,0,32,128,160,0,128,230,1,0,0,165,255,0,232,229,1,0,238,130,238,0,136,229,1,0,211,0,148,0,32,229,1,0,221,160,221,0,160,228,1,0,64,80,144,0,56,228,1,0,47,107,85,0,176,227,1,0,0,20,128,0,104,227,1,0,20,20,128,0,176,226,1,0,20,64,128,0,32,226,1,0,128,64,128,0,224,224,1,0,192,96,128,0,56,224,1,0,255,96,128,0,184,223,1,0,0,128,128,0,120,223,1,0,64,128,255,0,40,223,1,0,64,160,255,0,176,222,1,0,96,160,255,0,64,222,1,0,112,160,255,0,216,221,1,0,192,192,255,0,72,221,1,0,128,255,255,0,208,220,1,0,192,255,255,0,56,220,1,0,158,183,205,0,200,219,1,0,240,255,240,0,168,218,1,0,205,182,160,0,96,218,1,0,193,255,193,0,24,218,1,0,176,192,205,0,80,217,1,0,64,255,124,0,112,216,1,0,32,255,160,0,8,93,1,0,190,190,190,0,24,216,1,0,211,211,211,0,120,215,1,0,211,211,211,0,32,214,1,0,160,160,160,0,152,213,1,0,205,182,160,0,56,212,1,0,0,0,0,0,192,211,1,0,26,26,26,0,56,211,1,0,51,51,51,0,248,210,1,0,77,77,77,0,56,210,1,0,102,102,102,0,232,209,1,0,127,127,127,0,152,209,1,0,153,153,153,0,112,209,1,0,179,179,179,0,32,209,1,0,204,204,204,0,152,200,1,0,229,229,229,0,224,199,1,0,255,255,255,0,0,0,0,0,255,255,255,255,100,118,1,0,254,255,255,255,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,154,153,153,153,153,153,201,63,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,51,51,51,51,51,51,227,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-.concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,161,1,0,120,157,1,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,28,0,0,0,0,0,0,72,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,65,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,83,119,105,116,122,101,114,108,97,110,100,76,105,103,104,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,85,3,0,88,83,3,0,72,89,1,0,40,81,3,0,96,78,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,56,46,51,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,9,2,0,10,0,0,0,152,31,3,0,160,1,0,0,168,77,2,0,96,0,0,0,80,7,2,0,72,1,0,0,96,212,1,0,30,0,0,0,224,150,1,0,76,1,0,0,208,123,1,0,60,0,0,0,64,100,1,0,214,0,0,0,184,69,1,0,166,1,0,0,64,39,1,0,140,0,0,0,224,194,2,0,98,1,0,0,104,76,3,0,98,1,0,0,96,55,3,0,236,0,0,0,48,31,3,0,166,0,0,0,200,16,3,0,132,1,0,0,8,252,2,0,94,1,0,0,80,209,2,0,36,0,0,0,16,189,2,0,240,0,0,0,248,172,2,0,150,1,0,0,208,157,2,0,112,0,0,0,80,141,2,0,166,1,0,0,232,123,2,0,170,1,0,0,88,89,2,0,208,0,0,0,80,77,2,0,22,1,0,0,24,70,2,0,138,0,0,0,80,62,2,0,128,0,0,0,248,53,2,0,114,1,0,0,144,47,2,0,38,1,0,0,176,41,2,0,184,0,0,0,0,35,2,0,38,0,0,0,208,26,2,0,22,0,0,0,40,20,2,0,108,1,0,0,160,13,2,0,26,0,0,0,0,7,2,0,32,1,0,0,24,2,2,0,232,0,0,0,120,253,1,0,194,0,0,0,96,248,1,0,84,1,0,0,248,243,1,0,144,1,0,0,8,239,1,0,96,1,0,0,176,234,1,0,36,1,0,0,240,148,1,0,118,0,0,0,0,0,0,0,112,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,255,255,255,0,0,0,0,24,24,2,0,114,0,0,0,216,23,2,0,104,0,0,0,88,23,2,0,99,0,0,0,72,22,2,0,121,0,0,0,240,20,2,0,120,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,8,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,13,2,0,144,7,2,0,72,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,0,0,0,0,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,112,213,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,97,1,0,0,0,0,0,57,180,200,118,190,159,240,63,224,95,1,0,0,0,0,0,47,221,36,6,129,149,241,63,16,93,1,0,0,0,0,0,135,22,217,206,247,83,241,63,32,91,1,0,0,0,0,0,147,24,4,86,14,45,240,63,104,134,1,0,0,0,0,0,49,8,172,28,90,100,239,63,8,131,1,0,0,0,0,0,133,235,81,184,30,133,239,63,176,132,1,0,0,0,0,0,227,165,155,196,32,176,238,63,88,128,1,0,0,0,0,0,0,0,0,0,0,0,240,63,48,109,1,0,0,0,0,0,8,172,28,90,100,59,245,63,176,102,1,0,0,0,0,0,8,172,28,90,100,59,245,63,232,105,1,0,0,0,0,0,176,114,104,145,237,124,243,63,16,100,1,0,0,0,0,0,219,249,126,106,188,116,245,63,224,45,1,0,0,0,0,0,78,98,16,88,57,180,236,63,168,141,2,0,0,0,0,0,155,85,159,171,173,216,243,63,88,141,2,0,0,0,0,0,210,111,95,7,206,25,237,63,40,141,2,0,0,0,0,0,39,194,134,167,87,202,243,63,8,141,2,0,0,0,0,0,188,150,144,15,122,54,237,63,240,140,2,0,0,0,0,0,84,82,39,160,137,176,246,63,216,140,2,0,0,0,0,0,215,163,112,61,10,215,241,63,192,140,2,0,0,0,0,0,233,72,46,255,33,253,236,63,160,140,2,0,0,0,0,0,28,124,97,50,85,48,246,63,120,140,2,0,0,0,0,0,224,190,14,156,51,162,246,63,88,140,2,0,0,0,0,0,238,235,192,57,35,74,243,63,48,140,2,0,0,0,0,0,208,213,86,236,47,187,242,63,248,139,2,0,0,0,0,0,201,118,190,159,26,47,245,63,208,139,2,0,0,0,0,0,178,157,239,167,198,75,245,63,128,139,2,0,0,0,0,0,238,235,192,57,35,74,243,63,104,139,2,0,0,0,0,0,121,88,168,53,205,59,243,63,64,139,2,0,0,0,0,0,121,88,168,53,205,59,243,63,16,139,2,0,0,0,0,0,233,72,46,255,33,253,236,63,248,138,2,0,0,0,0,0,233,72,46,255,33,253,236,63,216,138,2,0,0,0,0,0,233,72,46,255,33,253,236,63,200,138,2,0,0,0,0,0,135,22,217,206,247,83,249,63,168,138,2,0,0,0,0,0,211,77,98,16,88,57,242,63,128,138,2,0,0,0,0,0,211,77,98,16,88,57,242,63,96,138,2,0,0,0,0,0,47,221,36,6,129,149,241,63,56,138,2,0,0,0,0,0,147,24,4,86,14,45,240,63,40,138,2,0,0,0,0,0,176,114,104,145,237,124,243,63,16,138,2,0,0,0,0,0,219,249,126,106,188,116,245,63,0,138,2,0,0,0,0,0,227,165,155,196,32,176,238,63,232,137,2,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,160,15,0,0,0,0,0,0,255,255,255,255,0,0,0,0,112,23,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,251,255,255,255,0,0,0,0,152,190,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,153,1,0,40,151,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,63,1,0,0,0,6,0,0,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,2,0,0,0,0,0,0,0,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,37,45,49,55,115,32,32,37,115,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,1,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,46,1,0,0,0,0,0,224,61,3,0,1,0,0,0,112,22,3,0,2,0,0,0,96,89,1,0,3,0,0,0,96,231,1,0,4,0,0,0,88,166,1,0,5,0,0,0,176,166,1,0,6,0,0,0,96,244,2,0,7,0,0,0,208,174,2,0,8,0,0,0,192,222,1,0,9,0,0,0,8,112,3,0,10,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,122,0,0,0,1,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,121,0,0,0,5,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,120,0,0,0,5,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,99,98,0,0,5,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,122,50,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,121,50,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,120,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,114,0,0,0,2,0,0,0,0,0,0,0,0,0,20,192,0,0,0,0,0,0,20,64,116,0,0,0,0,0,0,0,0,0,0,0,0,0,20,192,0,0,0,0,0,0,20,64,117,0,0,0,0,0,0,0,0,0,0,0,0,0,20,192,0,0,0,0,0,0,20,64,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-.concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-.concat([0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,77,2,0,176,69,2,0,240,61,2,0,128,53,2,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,97,110,0,0,0,0,0,70,101,98,0,0,0,0,0,77,97,114,0,0,0,0,0,65,112,114,0,0,0,0,0,77,97,121,0,0,0,0,0,74,117,110,0,0,0,0,0,74,117,108,0,0,0,0,0,65,117,103,0,0,0,0,0,83,101,112,0,0,0,0,0,79,99,116,0,0,0,0,0,78,111,118,0,0,0,0,0,68,101,99,0,0,0,0,0,83,117,110,0,0,0,0,0,77,111,110,0,0,0,0,0,84,117,101,0,0,0,0,0,87,101,100,0,0,0,0,0,84,104,117,0,0,0,0,0,70,114,105,0,0,0,0,0,83,97,116,0,0,0,0,0,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,109,97,120,0,0,71,80,86,65,76,95,88,95,77,65,88,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,37,115,32,61,32,37,103,59,10,0,0,0,87,105,108,108,32,110,111,116,32,99,104,101,99,107,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,40,109,97,121,32,99,97,117,115,101,32,99,114,97,115,104,101,115,41,46,10,0,0,0,117,110,100,101,102,105,110,101,100,32,118,97,114,105,97,98,108,101,58,32,37,115,0,0,101,120,101,99,117,116,105,110,103,58,32,37,115,0,0,0,112,108,111,116,95,97,120,105,115,95,120,109,105,110,0,0,65,109,98,105,103,117,111,117,115,32,114,101,113,117,101,115,116,32,39,37,46,42,115,39,59,32,112,111,115,115,105,98,108,101,32,109,97,116,99,104,101,115,58,10,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,37,115,32,61,32,37,100,59,10,0,0,0,116,109,95,109,100,97,121,0,97,108,108,95,116,101,114,109,95,110,97,109,101,115,50,0,71,80,86,65,76,95,88,95,77,73,78,0,0,0,0,0,108,115,0,0,0,0,0,0,105,110,100,101,120,95,109,105,110,0,0,0,0,0,0,0,110,111,32,99,111,108,117,109,110,32,119,105,116,104,32,104,101,97,100,101,114,32,34,37,115,34,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,104,101,105,103,104,116,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,0,0,10,9,85,115,101,114,32,97,110,100,32,100,101,102,97,117,108,116,32,118,97,114,105,97,98,108,101,115,58,10,0,0,114,101,108,36,97,116,105,118,101,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,119,105,100,116,104,32,61,32,37,46,49,102,59,10,0,99,104,97,110,103,101,32,118,105,101,119,32,40,115,99,97,108,105,110,103,41,46,32,85,115,101,32,60,99,116,114,108,62,32,116,111,32,115,99,97,108,101,32,116,104,101,32,97,120,101,115,32,111,110,108,121,46,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,121,116,111,112,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,121,98,111,116,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,120,109,97,120,32,61,32,37,46,49,102,59,10,0,0,101,108,108,105,112,115,101,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,120,109,105,110,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,101,114,109,95,121,109,97,120,32,61,32,37,100,59,10,0,0,0,0,0,0,0,67,111,110,116,105,110,117,101,46,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,101,114,109,95,120,109,97,120,32,61,32,37,100,59,10,0,0,0,0,0,0,0,122,116,105,99,115,0,0,0,47,47,32,112,108,111,116,32,98,111,117,110,100,97,114,105,101,115,32,97,110,100,32,97,120,105,115,32,115,99,97,108,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,109,111,117,115,105,110,103,32,10,0,0,0,116,109,95,104,111,117,114,0,37,115,32,0,0,0,0,0,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,60,33,91,67,68,65,84,65,91,10,0,0,0,0,0,0,108,105,110,101,116,121,112,101,36,115,0,0,0,0,0,0,115,117,109,115,113,0,0,0,115,116,114,105,110,103,99,111,108,117,109,110,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,0,0,32,57,44,52,44,49,44,52,44,49,44,52,0,0,0,0,10,9,86,97,114,105,97,98,108,101,115,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,37,115,58,10,0,32,56,44,52,44,50,44,52,0,0,0,0,0,0,0,0,116,105,109,101,32,102,111,114,109,97,116,32,115,116,114,105,110,103,32,101,120,112,101,99,116,101,100,0,0,0,0,0,10,37,115,111,98,106,101,99,116,32,37,50,100,32,0,0,68,105,109,95,49,0,0,0,60,66,50,45,77,111,116,105,111,110,62,0,0,0,0,0,104,101,97,100,32,115,105,122,101,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,32,50,44,52,0,0,0,0,32,53,44,56,0,0,0,0,83,117,98,116,111,112,105,99,32,111,102,32,0,0,0,0,32,100,61,39,0,0,0,0,99,108,97,115,115,61,34,103,114,105,100,108,105,110,101,34,32,0,0,0,0,0,0,0,115,116,114,111,107,101,45,100,97,115,104,97,114,114,97,121,61,39,37,115,39,32,0,0,83,116,111,112,46,0,0,0,115,116,114,111,107,101,61,39,37,115,39,32,0,0,0,0,115,116,114,111,107,101,61,39,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,39,32,0,0,0,0,116,109,95,109,105,110,0,0,32,0,0,0,0,0,0,0,9,60,112,97,116,104,32,0,108,105,110,101,115,36,116,121,108,101,0,0,0,0,0,0,77,37,46,49,102,44,37,46,49,102,32,0,0,0,0,0,10,9,65,108,108,32,97,118,97,105,108,97,98,108,101,32,118,97,114,105,97,98,108,101,115,58,10,0,0,0,0,0,10,9,9,9,32,32,32,32,116,111,32,0,0,0,0,0,10,9,9,0,0,0,0,0,76,37,46,49,102,44,37,46,49,102,32,0,0,0,0,0,99,104,97,110,103,101,32,118,105,101,119,32,40,114,111,116,97,116,105,111,110,41,46,32,85,115,101,32,60,99,116,114,108,62,32,116,111,32,114,111,116,97,116,101,32,116,104,101,32,97,120,101,115,32,111,110,108,121,46,0,0,0,0,0,60,47,116,101,120,116,62,10,9,60,47,103,62,10,0,0,38,97,109,112,59,0,0,0,38,108,116,59,0,0,0,0,9,9,60,116,101,120,116,62,0,0,0,0,0,0,0,0,10,10,40,83,41,116,111,112,32,102,105,116,44,32,40,67,41,111,110,116,105,110,117,101,44,32,40,69,41,120,101,99,117,116,101,32,70,73,84,95,83,67,82,73,80,84,58,32,32,0,0,0,0,0,0,0,9,9,60,116,101,120,116,32,120,109,108,58,115,112,97,99,101,61,34,112,114,101,115,101,114,118,101,34,62,0,0,0,32,32,0,0,0,0,0,0,116,109,95,115,101,99,0,0,97,108,108,95,116,101,114,109,95,110,97,109,101,115,0,0,32,116,101,120,116,45,97,110,99,104,111,114,58,37,115,34,62,10,0,0,0,0,0,0,108,97,36,98,101,108,0,0,99,114,101,97,116,101,95,97,110,100,95,115,101,116,95,118,97,114,0,0,0,0,0,0,99,111,108,117,109,110,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,32,102,111,110,116,45,115,116,121,108,101,58,37,115,59,0,97,108,108,0,0,0,0,0,32,102,111,110,116,45,119,101,105,103,104,116,58,37,115,59,0,0,0,0,0,0,0,0,37,97,32,37,98,32,37,100,32,37,72,58,37,77,58,37,83,32,37,89,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,112,111,108,121,103,111,110,32,0,0,0,60,66,49,45,77,111,116,105,111,110,62,0,0,0,0,0,110,111,102,105,108,108,36,101,100,0,0,0,0,0,0,0,59,32,102,111,110,116,45,102,97,109,105,108,121,58,37,115,59,32,102,111,110,116,45,115,105,122,101,58,37,46,50,102,112,116,59,0,0,0,0,0,114,103,98,40,37,100,44,37,100,44,37,100,41,0,0,0,104,101,108,112,32,112,114,111,109,112,116,0,0,0,0,0,34,32,115,116,121,108,101,61,34,115,116,114,111,107,101,58,110,111,110,101,59,32,102,105,108,108,58,0,0,0,0,0,32,114,111,116,97,116,101,40,37,105,41,0,0,0,0,0,9,60,103,32,116,114,97,110,115,102,111,114,109,61,34,116,114,97,110,115,108,97,116,101,40,37,46,49,102,44,37,46,49,102,41,0,0,0,0,0,37,115,95,101,114,114,0,0,101,110,100,0,0,0,0,0,109,105,100,100,108,101,0,0,101,120,112,105,110,116,0,0,32,32,37,49,53,115,32,32,37,115,10,0,0,0,0,0,115,116,97,114,116,0,0,0,107,101,121,116,36,105,116,108,101,0,0,0,0,0,0,0,112,111,115,95,109,97,120,95,121,0,0,0,0,0,0,0,68,97,116,97,32,102,105,108,101,32,105,115,32,101,109,112,116,121,0,0,0,0,0,0,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,37,117,39,32,116,114,97,110,115,102,111,114,109,61,39,116,114,97,110,115,108,97,116,101,40,37,46,49,102,44,37,46,49,102,41,32,115,99,97,108,101,40,37,46,50,102,41,39,37,115,47,62,10,0,0,0,0,108,105,110,101,115,116,121,108,101,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,68,111,116,39,32,120,61,39,37,46,49,102,39,32,121,61,39,37,46,49,102,39,37,115,47,62,10,0,0,0,0,0,0,0,0,109,97,114,107,32,122,111,111,109,32,114,101,103,105,111,110,32,40,111,110,108,121,32,102,111,114,32,50,100,45,112,108,111,116,115,32,97,110,100,32,109,97,112,115,41,46,0,0,32,99,111,108,111,114,61,39,37,115,39,0,0,0,0,0,32,99,111,108,111,114,61,39,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,39,0,0,0,0,0,104,101,108,112,32,98,117,102,102,101,114,0,0,0,0,0,98,111,108,100,0,0,0,0,105,116,97,108,105,99,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,0,0,0,0,32,73,116,97,108,105,99,0,37,46,48,102,0,0,0,0,32,105,116,97,108,105,99,0,101,120,112,101,99,116,101,100,32,111,112,116,105,111,110,97,108,32,97,120,105,115,32,110,97,109,101,0,0,0,0,0,37,109,47,37,100,47,37,121,0,0,0,0,0,0,0,0,32,66,111,108,100,0,0,0,97,105,114,121,0,0,0,0,10,65,118,97,105,108,97,98,108,101,32,116,101,114,109,105,110,97,108,32,116,121,112,101,115,58,10,0,0,0,0,0,32,98,111,108,100,0,0,0,34,62,10,0,0,0,0,0,107,36,101,121,0,0,0,0,112,111,115,95,109,105,110,95,121,0,0,0,0,0,0,0,68,97,116,97,32,102,105,108,101,32,114,101,97,100,32,101,114,114,111,114,0,0,0,0,80,65,71,69,82,0,0,0,9,108,105,110,101,115,116,121,108,101,32,37,100,44,32,0,109,105,116,101,114,0,0,0,60,66,51,62,0,0,0,0,102,105,108,108,36,101,100,0,59,32,115,116,114,111,107,101,45,119,105,100,116,104,58,37,46,50,102,59,32,115,116,114,111,107,101,45,108,105,110,101,99,97,112,58,37,115,59,32,115,116,114,111,107,101,45,108,105,110,101,106,111,105,110,58,37,115,0,0,0,0,0,0,99,117,114,114,101,110,116,67,111,108,111,114,0,0,0,0,99,112,49,50,53,48,0,0,32,111,112,101,110,32,121,108,111,119,32,121,104,105,103,104,32,121,99,108,111,115,101,32,119,105,100,116,104,0,0,0,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,0,0,0,0,0,0,60,103,32,115,116,121,108,101,61,34,102,105,108,108,58,110,111,110,101,59,32,99,111,108,111,114,58,37,115,59,32,115,116,114,111,107,101,58,0,0,37,54,46,51,102,32,0,0,9,9,60,47,112,97,116,116,101,114,110,62,10,9,60,47,100,101,102,115,62,10,0,0,9,9,9,60,112,97,116,104,32,115,116,121,108,101,32,61,32,39,37,115,32,37,115,58,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,37,115,39,47,62,10,0,108,97,109,98,101,114,116,119,0,0,0,0,0,0,0,0,108,105,115,116,95,116,101,114,109,115,0,0,0,0,0,0,9,9,9,60,112,97,116,104,32,115,116,121,108,101,32,61,32,39,37,115,32,37,115,58,37,115,39,32,100,61,32,39,37,115,39,47,62,10,0,0,105,115,36,111,115,97,109,112,108,101,115,0,0,0,0,0,32,32,68,97,116,97,32,66,108,111,99,107,115,58,32,32,37,42,108,100,10,0,0,0,102,36,105,116,0,0,0,0,9,9,9,60,112,97,116,104,32,115,116,121,108,101,61,39,37,115,32,37,115,58,114,103,98,40,37,100,44,37,100,44,37,100,41,39,32,100,61,39,37,115,39,47,62,10,0,0,108,105,110,101,116,121,112,101,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,112,111,108,97,114,32,109,111,100,101,0,0,0,0,0,0,0,115,116,114,111,107,101,58,110,111,110,101,59,0,0,0,0,114,101,109,111,118,101,32,108,97,98,101,108,32,99,108,111,115,101,32,116,111,32,112,111,105,110,116,101,114,32,105,102,32,96,115,101,116,32,109,111,117,115,101,32,108,97,98,101,108,115,96,32,105,115,32,111,110,0,0,0,0,0,0,0,102,105,108,108,58,110,111,110,101,59,0,0,0,0,0,0,10,37,115,32,0,0,0,0,77,45,50,44,48,32,76,52,44,49,50,32,77,48,44,45,52,32,76,56,44,49,50,32,77,52,44,45,52,32,76,49,48,44,56,0,0,0,0,0,77,45,50,44,56,32,76,52,44,45,52,32,77,48,44,49,50,32,76,56,44,45,52,32,77,52,44,49,50,32,76,49,48,44,48,0,0,0,0,0,77,45,52,44,56,32,76,56,44,45,52,32,77,48,44,49,50,32,76,49,50,44,48,0,77,45,52,44,48,32,76,56,44,49,50,32,77,48,44,45,52,32,76,49,50,44,56,0,37,45,49,53,46,49,53,115,0,0,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,83,101,101,32,39,104,101,108,112,32,115,104,111,119,39,46,0,0,0,77,48,44,48,32,76,48,44,56,32,76,56,44,56,32,76,56,44,48,32,76,48,44,48,0,0,0,0,0,0,0,0,77,48,44,48,32,76,56,44,56,32,77,48,44,56,32,76,56,44,48,32,77,48,44,52,32,76,52,44,56,32,76,56,44,52,32,76,52,44,48,32,76,48,44,52,0,0,0,0,97,116,97,110,104,0,0,0,90,97,112,102,32,68,105,110,103,98,97,116,115,0,0,0,77,48,44,48,32,76,56,44,56,32,77,48,44,56,32,76,56,44,48,0,0,0,0,0,104,105,115,36,116,111,114,121,115,105,122,101,0,0,0,0,32,32,66,108,97,110,107,58,32,32,32,32,32,32,32,32,37,42,108,100,10,0,0,0,46,46,46,0,0,0,0,0,9,60,100,101,102,115,62,10,9,9,60,112,97,116,116,101,114,110,32,105,100,61,39,103,112,80,97,116,37,100,39,32,112,97,116,116,101,114,110,85,110,105,116,115,61,39,117,115,101,114,83,112,97,99,101,79,110,85,115,101,39,32,120,61,39,48,39,32,121,61,39,48,39,32,119,105,100,116,104,61,39,56,39,32,104,101,105,103,104,116,61,39,56,39,62,10,0,0,0,0,0,0,0,0,9,108,105,110,101,116,121,112,101,32,37,100,44,32,0,0,110,111,102,111,114,116,36,114,97,110,0,0,0,0,0,0,103,112,98,105,110,0,0,0,32,117,110,105,116,115,32,0,115,116,114,111,107,101,0,0,60,67,116,114,108,45,66,50,62,0,0,0,0,0,0,0,9,60,103,32,115,116,121,108,101,32,61,32,39,115,116,114,111,107,101,58,110,111,110,101,59,32,115,104,97,112,101,45,114,101,110,100,101,114,105,110,103,58,99,114,105,115,112,69,100,103,101,115,39,62,10,0,103,101,110,95,111,110,101,95,99,111,110,116,111,117,114,58,32,110,111,32,99,111,110,116,111,117,114,32,102,111,117,110,100,10,0,0,0,0,0,0,37,115,32,61,32,39,99,117,114,114,101,110,116,67,111,108,111,114,39,0,0,0,0,0,32,60,32,0,0,0,0,0,37,115,32,61,32,39,37,115,39,0,0,0,0,0,0,0,99,97,110,110,111,116,32,98,101,32,104,101,114,101,0,0,78,101,101,100,32,102,117,108,108,32,117,115,105,110,103,32,115,112,101,99,32,102,111,114,32,121,32,116,105,109,101,32,100,97,116,97,0,0,0,0,37,115,32,61,32,39,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,39,0,0,0,0,0,0,0,102,105,108,108,0,0,0,0,45,45,100,101,102,97,117,108,116,45,115,101,116,116,105,110,103,115,0,0,0,0,0,0,37,45,54,46,54,115,32,0,39,47,62,10,0,0,0,0,117,115,101,114,32,102,117,110,99,0,0,0,0,0,0,0,37,46,49,102,44,37,46,49,102,37,115,0,0,0,0,0,97,99,111,115,104,0,0,0,90,97,112,102,32,67,104,97,110,99,101,114,121,32,77,101,100,105,117,109,32,73,116,97,108,105,99,0,0,0,0,0,32,112,111,105,110,116,115,32,61,32,39,0,0,0,0,0,109,111,114,101,62,32,0,0,104,105,100,36,100,101,110,51,100,0,0,0,0,0,0,0,32,32,73,110,118,97,108,105,100,58,32,32,32,32,32,32,37,42,108,100,10,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,114,117,108,101,114,96,0,0,37,46,55,55,115,37,115,10,37,115,58,37,100,58,0,0,32,102,105,108,108,32,61,32,39,117,114,108,40,35,103,112,80,97,116,37,100,41,39,0,9,76,105,110,101,116,121,112,101,115,32,114,101,112,101,97,116,32,101,118,101,114,121,32,37,100,32,117,110,108,101,115,115,32,101,120,112,108,105,99,105,116,108,121,32,100,101,102,105,110,101,100,10,0,0,0,32,32,97,110,103,108,101,32,37,103,0,0,0,0,0,0,32,102,105,108,108,45,111,112,97,99,105,116,121,32,61,32,39,37,102,39,0,0,0,0,47,121,115,116,101,112,32,49,32,105,109,97,120,32,100,105,118,32,100,101,102,32,47,121,48,32,48,32,100,101,102,32,47,105,105,32,48,32,100,101,102,10,0,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,37,115,32,102,105,108,101,32,39,37,115,39,0,0,0,0,0,0,0,0,99,117,114,118,101,0,0,0,120,32,112,111,115,0,0,0,111,114,32,100,114,97,119,32,108,97,98,101,108,115,32,105,102,32,96,115,101,116,32,109,111,117,115,101,32,108,97,98,101,108,115,32,105,115,32,111,110,96,0,0,0,0,0,0,32,102,105,108,108,32,61,32,39,37,115,39,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,116,121,112,101,32,110,101,105,116,104,101,114,32,73,78,84,32,111,114,32,67,77,80,76,88,0,0,0,0,0,0,9,9,60,112,111,108,121,103,111,110,32,0,0,0,0,0,99,97,110,110,111,116,32,115,101,116,32,114,97,110,103,101,32,119,105,116,104,32,114,101,112,108,111,116,0,0,0,0,32,120,109,108,58,115,112,97,99,101,61,34,112,114,101,115,101,114,118,101,34,0,0,0,32,102,105,108,108,61,34,110,111,110,101,34,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,100,121,61,34,37,46,50,102,112,116,34,0,0,0,0,32,100,120,61,34,37,46,50,102,101,109,34,0,0,0,0,97,115,105,110,104,0,0,0,83,121,109,98,111,108,0,0,32,102,111,110,116,45,115,116,121,108,101,61,34,37,115,34,32,0,0,0,0,0,0,0,103,36,114,105,100,0,0,0,32,32,79,117,116,32,111,102,32,114,97,110,103,101,58,32,37,42,108,100,10,0,0,0,82,101,119,105,110,100,105,110,103,32,102,100,32,37,100,10,0,0,0,0,0,0,0,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,37,115,34,32,0,0,0,0,0,0,40,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,41,0,0,0,0,0,0,122,0,0,0,0,0,0,0,44,32,37,115,37,103,0,0,110,111,114,109,97,108,0,0,73,110,32,108,111,103,32,109,111,100,101,32,114,114,97,110,103,101,32,109,117,115,116,32,110,111,116,32,105,110,99,108,117,100,101,32,48,0,0,0,97,110,110,111,116,97,116,101,32,116,104,101,32,103,114,97,112,104,32,117,115,105,110,103,32,96,109,111,117,115,101,102,111,114,109,97,116,96,32,40,115,101,101,32,107,101,121,115,32,39,49,39,44,32,39,50,39,41,0,0,0,0,0,0,32,102,111,110,116,45,115,105,122,101,61,34,37,46,49,102,112,116,34,0,0,0,0,0,32,115,116,121,108,101,61,34,102,111,110,116,45,102,97,109,105,108,121,58,37,115,34,32,0,0,0,0,0,0,0,0,60,116,115,112,97,110,0,0,60,116,115,112,97,110,32,100,120,61,34,45,37,46,49,102,101,109,34,32,100,121,61,34,37,46,49,102,112,116,34,62,0,0,0,0,0,0,0,0,79,110,108,121,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,32,115,117,114,102,97,99,101,46,10,0,0,0,0,0,0,0,0,37,115,60,47,116,115,112,97,110,62,0,0,0,0,0,0,10,10,99,111,114,114,101,108,97,116,105,111,110,32,109,97,116,114,105,120,32,111,102,32,116,104,101,32,102,105,116,32,112,97,114,97,109,101,116,101,114,115,58,10,10,0,0,0,60,47,103,62,10,0,0,0,10,72,101,108,112,32,116,111,112,105,99,115,32,97,118,97,105,108,97,98,108,101,58,10,0,0,0,0,0,0,0,0,62,10,0,0,0,0,0,0,105,110,118,110,111,114,109,0,80,97,108,97,116,105,110,111,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,111,110,99,108,105,99,107,61,34,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,86,105,115,105,98,105,108,105,116,121,40,101,118,116,44,39,37,115,95,112,108,111,116,95,37,100,37,115,39,41,34,0,0,0,0,0,0,102,117,36,110,99,116,105,111,110,115,0,0,0,0,0,0,32,32,82,101,99,111,114,100,115,58,32,32,32,32,32,32,37,42,108,100,10,0,0,0,83,107,105,112,112,105,110,103,32,117,110,114,101,97,100,97,98,108,101,32,102,105,108,101,32,34,37,115,34,0,0,0,9,60,103,32,118,105,115,105,98,105,108,105,116,121,61,34,118,105,115,105,98,108,101,34,32,0,0,0,0,0,0,0,40,99,104,97,114,97,99,116,101,114,32,117,110,105,116,115,41,32,0,0,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,101,108,108,105,112,115,101,32,0,0,0,62,60,116,105,116,108,101,62,37,115,95,112,108,111,116,95,37,100,37,115,60,47,116,105,116,108,101,62,10,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,54,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,120,121,101,114,114,111,114,98,97,114,115,0,0,0,0,0,0,0,60,66,50,62,0,0,0,0,9,60,103,32,105,100,61,34,37,115,95,112,108,111,116,95,37,100,37,115,34,32,0,0,103,110,117,112,108,111,116,0,105,110,118,97,108,105,100,32,99,111,109,109,97,110,100,0,9,60,47,103,62,10,0,0,32,104,48,46,48,49,39,47,62,0,0,0,0,0,0,0,90,32,0,0,0,0,0,0,43,47,45,0,0,0,0,0,100,36,97,115,104,101,100,0,91,0,0,0,0,0,0,0,105,110,118,101,114,102,0,0,80,97,108,97,116,105,110,111,32,66,111,108,100,0,0,0,108,36,97,110,100,115,99,97,112,101,0,0,0,0,0,0,102,117,36,110,99,116,105,111,110,0,0,0,0,0,0,0,42,32,70,73,76,69,58,32,10,0,0,0,0,0,0,0,114,98,0,0,0,0,0,0,112,36,111,114,116,114,97,105,116,0,0,0,0,0,0,0,40,115,99,114,101,101,110,32,117,110,105,116,115,41,32,0,32,97,114,99,32,91,37,103,58,37,103,93,32,0,0,0,32,37,115,32,102,111,110,116,32,34,37,115,44,37,117,34,0,0,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,53,32,99,111,108,117,109,110,32,112,108,111,116,32,115,116,121,108,101,59,32,114,101,115,101,116,116,105,110,103,32,116,111,32,98,111,120,101,114,114,111,114,98,97,114,115,0,0,0,0,0,32,108,105,110,101,119,105,100,116,104,32,37,102,0,0,0,112,114,105,110,116,32,99,111,111,114,100,105,110,97,116,101,115,32,116,111,32,99,108,105,112,98,111,97,114,100,32,117,115,105,110,103,32,96,99,108,105,112,98,111,97,114,100,102,111,114,109,97,116,96,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,115,101,101,32,107,101,121,115,32,39,51,39,44,32,39,52,39,41,0,0,97,114,114,111,119,115,36,116,121,108,101,0,0,0,0,0,69,68,70,95,66,105,110,97,114,121,70,105,108,101,80,111,115,105,116,105,111,110,0,0,32,109,111,110,111,99,104,114,111,109,101,0,0,0,0,0,78,101,119,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,110,97,109,101,32,101,120,112,101,99,116,101,100,0,108,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,112,111,114,116,114,97,105,116,0,0,0,0,0,0,0,0,37,115,32,91,37,117,44,37,117,93,0,0,0,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,45,49,53,103,32,32,37,45,51,46,51,115,32,37,45,49,50,46,52,103,32,40,37,46,52,103,37,37,41,10,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,102,111,110,116,32,110,97,109,101,32,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,93,39,0,0,0,110,111,114,109,0,0,0,0,80,97,108,97,116,105,110,111,32,73,116,97,108,105,99,0,93,0,0,0,0,0,0,0,102,111,36,114,109,97,116,0,111,117,116,111,102,114,97,110,103,101,0,0,0,0,0,0,34,37,115,34,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,0,0,0,0,0,39,44,39,32,101,120,112,101,99,116,101,100,0,0,0,0,40,103,114,97,112,104,32,117,110,105,116,115,41,32,0,0,110,111,101,113,117,97,108,36,95,97,120,101,115,0,0,0,37,115,37,103,0,0,0,0,110,111,46,32,119,105,110,100,111,119,115,58,32,91,104,111,114,105,122,111,110,116,97,108,44,118,101,114,116,105,99,97,108,93,32,101,120,112,101,99,116,101,100,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,52,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,121,101,114,114,111,114,98,97,114,115,0,0,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,58,32,111,117,116,32,111,102,32,114,97,110,103,101,0,50,120,60,66,49,62,0,0,97,114,114,111,119,115,116,121,108,101,32,37,100,32,110,111,116,32,102,111,117,110,100,0,108,105,110,101,119,105,100,116,104,58,32,119,105,100,116,104,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,46,0,0,0,0,0,0,80,97,114,97,109,101,116,101,114,32,102,105,108,101,110,97,109,101,32,101,120,112,101,99,116,101,100,0,0,0,0,0,37,37,84,71,73,70,32,50,46,49,53,45,112,55,10,115,116,97,116,101,40,37,100,44,51,48,44,37,117,44,48,44,48,44,37,117,44,49,54,44,49,44,57,44,49,44,49,44,48,44,48,44,48,44,48,44,49,44,48,44,39,37,115,39,44,48,44,37,117,44,48,44,48,44,49,44,49,48,44,48,44,48,44,49,44,49,44,48,44,49,54,44,48,44,48,44,49,44,49,44,49,41,46,10,37,37,10,37,37,32,64,40,35,41,67,114,101,97,116,111,114,58,32,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,37,37,32,37,37,87,37,37,10,37,37,10,112,97,103,101,40,49,44,34,34,41,46,10,0,0,0,0,119,97,114,110,105,110,103,58,32,117,115,105,110,103,32,115,116,97,110,100,97,114,100,32,109,117,108,116,105,112,108,111,116,10,0,0,0,0,0,0,101,114,114,111,114,58,32,110,117,109,98,101,114,32,111,102,32,112,108,111,116,115,32,62,32,112,108,111,116,115,32,112,101,114,32,112,97,103,101,10,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,32,32,32,32,32,32,32,32,32,32,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,10,10,0,99,111,114,97,108,0,0,0,72,111,116,80,105,110,107,0,99,101,105,108,0,0,0,0,80,97,108,97,116,105,110,111,32,82,111,109,97,110,0,0,68,97,114,107,83,101,97,71,114,101,101,110,0,0,0,0,102,111,110,116,36,112,97,116,104,0,0,0,0,0,0,0,98,108,111,99,107,115,0,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,105,112,101,32,102,111,114,32,100,97,116,97,0,0,0,0,0,121,101,108,108,111,119,0,0,40,115,101,99,111,110,100,32,97,120,101,115,41,32,0,0,120,121,122,0,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,99,105,114,99,108,101,32,0,0,0,0,116,101,120,116,40,39,37,115,39,44,37,117,44,37,117,44,39,37,115,39,44,48,44,37,117,44,49,44,37,117,44,37,117,44,49,44,53,53,44,49,49,57,44,37,117,44,48,44,49,53,44,52,44,48,44,48,44,48,44,48,44,91,10,9,34,37,115,34,93,41,46,10,0,0,0,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,51,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,121,101,114,114,111,114,98,97,114,115,0,0,0,0,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,99,111,108,111,114,32,110,97,109,101,32,97,110,100,32,110,111,116,32,97,32,115,116,114,105,110,103,32,34,35,65,65,82,82,71,71,66,66,34,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,55,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,53,55,54,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,111,110,108,121,32,107,101,121,119,111,114,100,115,32,97,114,101,32,39,116,101,114,109,105,110,97,108,39,32,97,110,100,32,39,112,97,108,101,116,116,101,39,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,49,53,50,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,49,53,50,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,0,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,55,50,56,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,70,105,110,97,108,32,115,101,116,32,111,102,32,112,97,114,97,109,101,116,101,114,115,32,32,32,32,32,32,32,32,32,32,32,32,65,115,121,109,112,116,111,116,105,99,32,83,116,97,110,100,97,114,100,32,69,114,114,111,114,10,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,55,50,56,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,55,50,56,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,102,108,111,111,114,0,0,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,0,102,105,116,0,0,0,0,0,98,108,97,110,107,115,0,0,99,97,110,110,111,116,32,111,112,101,110,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,102,111,114,32,114,101,97,100,105,110,103,32,100,97,116,97,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,53,55,54,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,40,102,105,114,115,116,32,97,120,101,115,41,32,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,49,53,50,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,49,32,111,114,32,50,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,112,111,105,110,116,115,0,0,0,0,0,0,0,98,105,110,100,95,97,112,112,101,110,100,45,62,110,101,119,0,0,0,0,0,0,0,0,35,37,108,120,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,53,55,54,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,115,99,114,101,101,110,100,117,109,112,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,10,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,52,52,56,48,44,50,53,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,9,103,110,117,112,108,111,116,114,99,32,105,115,32,114,101,97,100,32,102,114,111,109,32,37,115,10,0,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,54,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117])
-.concat([44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,111,110,32,101,114,114,111,114,58,32,110,111,110,45,112,111,115,105,116,105,118,101,32,100,105,97,103,111,110,97,108,32,101,108,101,109,101,110,116,32,105,110,32,99,111,118,97,114,46,32,109,97,116,114,105,120,0,0,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,76,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,108,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,54,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,37,42,100,0,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,53,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,114,97,110,100,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,53,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,66,111,108,100,0,0,0,0,0,100,101,99,36,105,109,97,108,115,105,103,110,0,0,0,0,105,110,118,97,108,105,100,0,112,111,108,121,103,111,110,40,39,37,115,39,44,52,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,9,32,32,102,111,110,116,32,34,37,115,34,10,0,0,0,101,113,117,97,108,36,95,97,120,101,115,0,0,0,0,0,102,114,111,109,32,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,52,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,84,111,111,32,109,97,110,121,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,68,101,108,101,116,101,0,0,111,118,97,108,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,49,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,111,118,97,108,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,50,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,115,97,118,101,32,102,105,108,101,0,0,0,99,112,57,53,48,0,0,0,98,111,120,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,49,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,32,111,112,101,110,32,121,108,111,119,32,121,104,105,103,104,32,121,99,108,111,115,101,0,98,111,120,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,50,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,99,97,108,108,110,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,70,73,84,95,87,83,83,82,0,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,10,0,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,44,10,0,0,0,0,0,0,0,67,97,110,110,111,116,32,115,112,108,111,116,32,105,110,32,112,111,108,97,114,32,99,111,111,114,100,105,110,97,116,101,32,115,121,115,116,101,109,46,0,0,0,0,0,0,0,0,105,103,97,109,109,97,0,0,103,114,111,117,112,40,91,10,0,0,0,0,0,0,0,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,73,116,97,108,105,99,0,0,0,101,110,99,36,111,100,105,110,103,0,0,0,0,0,0,0,114,101,99,111,114,100,115,0,101,120,36,105,116,0,0,0,99,97,110,110,111,116,32,112,108,111,116,32,102,114,111,109,32,115,116,100,105,110,47,115,116,100,111,117,116,47,115,116,100,101,114,114,0,0,0,0,103,114,111,117,112,40,91,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,116,105,109,101,100,97,116,97,32,109,111,100,101,0,0,0,0,32,115,105,122,101,32,0,0,93,44,10,37,117,44,48,44,91,10,93,41,46,10,0,0,78,111,116,32,101,110,111,117,103,104,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,0,0,0,0,0,0,69,115,99,97,112,101,0,0,99,111,108,111,114,115,112,101,99,32,111,112,116,105,111,110,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,0,103,114,111,117,112,40,91,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,44,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,10,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,37,100,44,91,10,9,37,117,44,37,117,44,37,117,44,37,117,93,44,49,44,37,117,44,49,44,37,117,44,48,44,48,44,37,117,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,37,117,44,37,117,93,44,48,44,37,117,44,49,44,37,117,44,48,44,48,44,37,117,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,112,111,108,121,40,39,37,115,39,44,37,100,44,91,10,9,0,0,0,0,0,0,0,0,91,110,111,110,101,93,0,0,70,73,84,95,83,84,68,70,73,84,0,0,0,0,0,0,35,37,46,50,120,37,46,50,120,37,46,50,120,0,0,0,93,44,37,100,44,49,44,48,44,48,44,37,117,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,118,111,105,103,116,0,0,0,37,117,44,37,117,0,0,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,82,111,109,97,110,0,0,0,0,100,117,36,109,109,121,0,0,37,115,9,37,108,100,10,0,105,110,118,97,108,105,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,116,101,103,101,114,0,10,9,0,0,0,0,0,0,9,32,0,0,0,0,0,0,116,36,105,109,101,0,0,0,99,101,110,116,101,114,32,0,37,117,44,37,117,44,0,0,82,101,116,117,114,110,0,0,112,97,108,101,116,116,101,32,102,114,97,99,116,105,111,110,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,37,100,44,91,10,9,0,0,0,0,0,99,111,110,116,111,117,114,32,116,114,105,100,105,97,103,32,109,0,0,0,0,0,0,0,119,104,105,116,101,0,0,0,110,111,32,112,114,101,118,105,111,117,115,32,112,108,111,116,0,0,0,0,0,0,0,0,105,36,110,116,101,114,97,99,116,105,118,101,0,0,0,0,98,108,45,105,110,116,101,114,112,32,98,101,116,119,101,101,110,32,115,99,97,110,0,0,78,101,101,100,32,102,117,108,108,32,117,115,105,110,103,32,115,112,101,99,32,102,111,114,32,120,32,116,105,109,101,32,100,97,116,97,0,0,0,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,116,104,105,114,100,32,99,111,108,111,114,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,0,112,36,101,114,108,116,107,0,108,97,98,101,108,112,111,105,110,116,32,108,97,98,101,108,0,0,0,0,0,0,0,0,105,110,116,101,114,97,99,116,105,118,101,0,0,0,0,0,45,100,0,0,0,0,0,0,70,73,84,95,78,68,70,0,112,101,114,108,116,107,0,0,37,115,32,37,115,0,0,0,105,98,101,116,97,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,121,50,109,93,62,48,125,32,123,112,117,116,115,32,34,32,36,121,50,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,121,50,115,43,36,121,50,101,41,93,34,125,10,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,0,100,103,36,114,105,100,51,100,0,0,0,0,0,0,0,0,32,32,77,101,100,105,97,110,58,32,32,32,37,115,32,10,0,0,0,0,0,0,0,0,116,117,114,110,105,110,103,32,114,117,108,101,114,32,111,102,102,46,10,0,0,0,0,0,100,97,116,97,102,105,108,101,32,108,105,110,101,32,98,117,102,102,101,114,0,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,120,50,109,93,62,48,125,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,36,120,50,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,120,50,115,43,36,120,50,101,41,93,34,125,10,0,41,10,0,0,0,0,0,0,110,111,119,114,105,36,116,101,98,97,99,107,0,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,121,49,109,93,62,48,125,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,36,121,49,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,121,49,115,43,36,121,49,101,41,93,34,125,10,0,115,101,116,32,0,0,0,0,73,110,118,97,108,105,100,32,115,117,98,115,116,105,116,117,116,105,111,110,32,36,37,99,0,0,0,0,0,0,0,0,37,105,32,37,105,32,116,114,97,110,115,108,97,116,101,32,37,105,32,37,105,32,115,99,97,108,101,32,48,32,115,101,116,108,105,110,101,119,105,100,116,104,10,0,0,0,0,0,115,112,108,105,110,101,32,104,101,108,112,32,118,101,99,116,111,114,0,0,0,0,0,0,75,80,95,69,110,116,101,114,0,0,0,0,0,0,0,0,101,120,112,101,99,116,101,100,32,112,97,108,101,116,116,101,32,102,114,97,99,116,105,111,110,0,0,0,0,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,120,49,109,93,62,48,125,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,36,120,49,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,120,49,115,43,36,120,49,101,41,93,34,125,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,99,111,117,108,100,32,110,111,116,32,97,99,99,101,115,115,32,115,117,109,109,97,116,105,111,110,32,99,111,101,102,102,105,99,105,101,110,116,32,102,117,110,99,116,105,111,110,0,0,0,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,32,36,119,105,110,32,36,105,100,32,36,120,49,115,32,36,121,49,115,32,36,120,50,115,32,36,121,50,115,32,36,120,49,101,32,36,121,49,101,32,36,120,50,101,32,36,121,50,101,32,36,120,49,109,32,36,121,49,109,32,36,120,50,109,32,36,121,50,109,10,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,45,32,114,101,102,114,101,115,104,32,111,102,32,117,110,107,110,111,119,110,32,112,108,111,116,32,116,121,112,101,0,0,0,115,101,116,32,105,100,32,91,36,119,105,110,32,102,105,110,100,32,119,105,116,104,116,97,103,32,99,117,114,114,101,110,116,93,10,0,0,0,0,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,115,101,99,111,110,100,32,99,111,108,111,114,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,105,102,32,123,40,91,108,108,101,110,103,116,104,32,91,105,110,102,111,32,99,111,109,109,97,110,100,115,32,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,93,93,41,125,32,123,10,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,95,120,121,32,123,119,105,110,32,120,49,115,32,121,49,115,32,120,50,115,32,121,50,115,32,120,49,101,32,121,49,101,32,120,50,101,32,121,50,101,32,120,49,109,32,121,49,109,32,120,50,109,32,121,50,109,125,32,123,10,0,0,0,0,0,0,0,0,118,97,114,105,97,110,99,101,32,111,102,32,114,101,115,105,100,117,97,108,115,32,40,114,101,100,117,99,101,100,32,99,104,105,115,113,117,97,114,101,41,32,61,32,87,83,83,82,47,110,100,102,32,32,32,58,32,37,103,10,10,0,0,0,114,101,116,117,114,110,32,123,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,125,10,0,0,0,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,95,97,120,105,115,114,97,110,103,101,115,32,123,125,32,123,10,0,0,0,108,103,97,109,109,97,0,0,114,101,116,117,114,110,32,123,37,100,32,37,100,32,37,100,32,37,100,125,10,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,32,66,111,108,100,0,0,0,100,97,116,97,36,102,105,108,101,0,0,0,0,0,0,0,32,32,81,117,97,114,116,105,108,101,58,32,37,115,32,10,0,0,0,0,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,95,112,108,111,116,97,114,101,97,32,123,125,32,123,10,0,0,0,0,0,100,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,100,97,116,97,102,105,108,101,32,111,112,116,105,111,110,115,0,0,0,0,0,0,0,44,32,0,0,0,0,0,0,119,114,36,105,116,101,98,97,99,107,0,0,0,0,0,0,125,10,0,0,0,0,0,0,9,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,100,102,95,114,101,97,100,108,105,110,101,32,114,101,116,117,114,110,101,100,32,37,100,32,58,32,100,97,116,97,102,105,108,101,32,108,105,110,101,32,37,100,0,0,0,0,0,84,97,98,0,0,0,0,0,112,114,105,110,116,32,34,92,110,34,10,0,0,0,0,0,105,102,32,40,108,101,110,103,116,104,40,36,121,50,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,121,50,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,121,50,115,43,36,121,50,101,41,59,125,10,0,0,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,102,114,101,115,104,32,102,114,111,109,32,116,104,105,115,32,115,116,97,116,101,46,32,116,114,121,105,110,103,32,102,117,108,108,32,114,101,112,108,111,116,0,0,0,0,0,0,105,102,32,40,108,101,110,103,116,104,40,36,120,50,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,120,50,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,120,50,115,43,36,120,50,101,41,59,125,10,0,0,0,0,0,0,0,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,102,105,114,115,116,32,99,111,108,111,114,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,0,105,102,32,40,108,101,110,103,116,104,40,36,121,49,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,121,49,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,121,49,115,43,36,121,49,101,41,59,125,10,0,0,0,0,0,0,0,0,105,102,32,40,108,101,110,103,116,104,40,36,120,49,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,120,49,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,120,49,115,43,36,120,49,101,41,59,125,10,0,0,0,0,0,0,0,0,79,117,116,114,97,110,103,101,100,32,97,110,100,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,32,115,117,114,102,97,99,101,46,10,0,0,0,0,0,0,0,114,109,115,32,111,102,32,114,101,115,105,100,117,97,108,115,32,32,32,32,32,32,40,70,73,84,95,83,84,68,70,73,84,41,32,61,32,115,113,114,116,40,87,83,83,82,47,110,100,102,41,32,32,32,32,58,32,37,103,10,0,0,0,0,125,32,101,108,115,101,32,123,10,0,0,0,0,0,0,0,58,10,0,0,0,0,0,0,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,32,36,119,105,110,44,32,36,105,100,44,32,36,120,49,115,44,32,36,121,49,115,44,32,36,120,50,115,44,32,36,121,50,115,44,32,36,120,49,101,44,32,36,121,49,101,44,32,36,120,50,101,44,32,36,121,50,101,44,32,36,120,49,109,44,32,36,121,49,109,44,32,36,120,50,109,44,32,36,121,50,109,10,0,0,0,0,0,103,97,109,109,97,0,0,0,109,121,32,36,105,100,32,61,32,36,119,105,110,45,62,102,105,110,100,40,39,119,105,116,104,116,97,103,39,44,32,39,99,117,114,114,101,110,116,39,41,59,10,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,32,79,98,108,105,113,117,101,0,0,0,0,0,0,0,0,100,97,36,116,97,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,10,0,0,105,102,32,40,100,101,102,105,110,101,100,32,38,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,41,32,123,10,0,0,0,0,0,0,0,110,111,97,117,116,111,36,115,99,97,108,101,0,0,0,0,109,121,32,40,36,119,105,110,44,32,36,120,49,115,44,32,36,121,49,115,44,32,36,120,50,115,44,32,36,121,50,115,44,32,36,120,49,101,44,32,36,121,49,101,44,32,36,120,50,101,44,32,36,121,50,101,44,32,36,120,49,109,44,32,36,121,49,109,44,32,36,120,50,109,44,32,36,121,50,109,41,32,61,32,64,95,59,10,0,0,0,0,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,114,101,99,116,32,0,0,0,0,0,0,78,111,116,32,101,110,111,117,103,104,32,99,111,108,117,109,110,115,32,102,111,114,32,118,97,114,105,97,98,108,101,32,99,111,108,111,114,0,0,0,66,97,99,107,83,112,97,99,101,0,0,0,0,0,0,0,101,120,112,101,99,116,101,100,32,99,98,32,118,97,108,117,101,0,0,0,0,0,0,0,115,117,98,32,103,110,117,112,108,111,116,95,120,121,32,123,10,0,0,0,0,0,0,0,114,101,116,117,114,110,32,40,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,41,59,10,0,0,0,0,0,0,0,110,111,32,97,99,116,105,118,101,32,112,108,111,116,59,32,99,97,110,110,111,116,32,114,101,102,114,101,115,104,0,0,115,117,98,32,103,110,117,112,108,111,116,95,97,120,105,115,114,97,110,103,101,115,32,123,10,0,0,0,0,0,0,0,105,110,32,108,97,98,101,108,95,119,105,100,116,104,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,77,111,100,101,32,39,37,99,39,46,10,0,0,0,114,101,116,117,114,110,32,40,37,100,44,32,37,100,44,32,37,100,44,32,37,100,41,59,10,0,0,0,0,0,0,0,115,117,98,32,103,110,117,112,108,111,116,95,112,108,111,116,97,114,101,97,32,123,10,0,100,101,103,114,101,101,115,32,111,102,32,102,114,101,101,100,111,109,32,32,32,32,40,70,73,84,95,78,68,70,41,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,58,32,37,100,10,0,0,0,0,125,59,10,0,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,32,99,97,110,32,123,10,36,99,97,110,32,100,101,108,101,116,101,32,97,108,108,10,115,101,116,32,99,109,120,32,91,101,120,112,114,32,91,119,105,110,102,111,32,119,105,100,116,104,32,36,99,97,110,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,98,111,114,100,101,114,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,93,93,10,105,102,32,123,36,99,109,120,32,60,61,32,49,125,32,123,115,101,116,32,99,109,120,32,91,36,99,97,110,32,99,103,101,116,32,45,119,105,100,116,104,93,125,10,115,101,116,32,99,109,121,32,91,101,120,112,114,32,91,119,105,110,102,111,32,104,101,105,103,104,116,32,36,99,97,110,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,98,111,114,100,101,114,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,93,93,10,105,102,32,123,36,99,109,121,32,60,61,32,49,125,32,123,115,101,116,32,99,109,121,32,91,36,99,97,110,32,99,103,101,116,32,45,104,101,105,103,104,116,93,125,10,0,0,0,0,0,0,0,101,114,102,99,0,0,0,0,115,117,98,32,123,10,109,121,40,36,99,97,110,41,32,61,32,64,95,59,10,36,99,97,110,45,62,100,101,108,101,116,101,40,39,97,108,108,39,41,59,10,109,121,32,36,99,109,120,32,61,32,36,99,97,110,45,62,119,105,100,116,104,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,98,111,114,100,101,114,41,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,41,59,10,105,102,32,40,36,99,109,120,32,60,61,32,49,41,32,123,10,36,99,109,120,32,61,32,40,36,99,97,110,45,62,99,103,101,116,40,45,119,105,100,116,104,41,41,59,10,125,10,109,121,32,36,99,109,121,32,61,32,36,99,97,110,45,62,104,101,105,103,104,116,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,98,111,114,100,101,114,41,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,41,59,10,105,102,32,40,36,99,109,121,32,60,61,32,49,41,32,123,10,36,99,109,121,32,61,32,40,36,99,97,110,45,62,99,103,101,116,40,45,104,101,105,103,104,116,41,41,59,10,125,10,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,0,0,0,0,0,0,0,0,99,111,36,110,116,111,117,114,115,0,0,0,0,0,0,0,32,32,77,105,110,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,10,0,0,34,10,0,0,0,0,0,0,118,111,108,97,116,105,108,101,0,0,0,0,0,0,0,0,32,123,125,0,0,0,0,0,103,114,97,112,104,32,0,0,71,80,95,76,65,83,84,95,75,69,89,0,0,0,0,0,99,98,0,0,0,0,0,0,93,32,60,66,117,116,116,111,110,62,32,34,103,110,117,112,108,111,116,95,120,121,32,37,37,87,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,0,0,0,0,0,0,93,41,59,10,0,0,0,0,100,97,116,97,102,105,108,101,32,110,97,109,101,0,0,0,112,114,105,110,116,32,99,117,114,114,101,110,116,32,100,105,114,0,0,0,0,0,0,0,32,34,34,0,0,0,0,0,32,37,102,0,0,0,0,0,32,34,34,44,0,0,0,0,10,72,109,109,109,109,46,46,46,46,32,83,117,109,32,111,102,32,115,113,117,97,114,101,100,32,114,101,115,105,100,117,97,108,115,32,105,115,32,122,101,114,111,46,32,67,97,110,39,116,32,99,111,109,112,117,116,101,32,101,114,114,111,114,115,46,10,10,0,0,0,0,32,37,102,44,0,0,0,0,44,32,39,60,66,117,116,116,111,110,62,39,32,61,62,32,91,92,38,103,110,117,112,108,111,116,95,120,121,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,0,0,101,114,102,0,0,0,0,0,112,111,112,32,49,0,0,0,36,99,97,110,32,99,114,101,97,116,101,32,108,105,110,101,32,91,101,120,112,114,32,36,99,109,120,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,121,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,120,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,121,32,42,32,37,100,32,47,49,48,48,48,93,32,45,102,105,108,108,32,37,115,32,45,119,105,100,116,104,32,37,102,32,45,99,97,112,115,116,121,108,101,32,114,111,117,110,100,10,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,99,110,36,116,114,112,97,114,97,109,0,0,0,0,0,0,32,32,67,79,71,58,32,32,32,32,32,32,37,115,32,37,115,10,0,0,0,0,0,0,36,99,97,110,45,62,99,114,101,97,116,101,76,105,110,101,40,36,99,109,120,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,121,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,120,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,121,32,42,32,37,100,32,47,32,49,48,48,48,44,32,45,102,105,108,108,32,61,62,32,113,123,37,115,125,44,32,45,119,105,100,116,104,32,61,62,32,37,102,44,32,45,99,97,112,115,116,121,108,101,32,61,62,32,113,123,114,111,117,110,100,125,41,0,0,0,117,36,115,105,110,103,0,0,9,32,32,101,120,112,108,105,99,105,116,32,108,105,115,116,32,40,0,0,0,0,0,0,36,99,97,110,32,98,105,110,100,32,91,10,0,0,0,0,37,115,32,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,10,0,0,0,0,0,0,78,111,116,32,101,110,111,117,103,104,32,99,111,108,117,109,110,115,32,102,111,114,32,116,104,105,115,32,115,116,121,108,101,0,0,0,0,0,0,0,66,117,116,116,111,110,49,0,112,97,108,101,116,116,101,32,122,32,110,111,116,32,112,111,115,115,105,98,108,101,32,104,101,114,101,0,0,0,0,0,36,99,97,110,45,62,98,105,110,100,40,0,0,0,0,0,99,121,97,110,0,0,0,0,60,115,116,100,101,114,114,62,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,0,50,42,120,32,45,32,49,0,98,114,111,119,110,0,0,0,103,114,101,101,110,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,45,49,53,103,10,0,0,0,0,0,0,0,98,108,117,101,0,0,0,0,114,101,100,0,0,0,0,0,98,101,115,121,49,0,0,0,103,114,97,121,0,0,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,0,0,99,36,108,105,112,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,32,37,108,100,32,93,10,0,0,0,0,0,98,108,97,99,107,0,0,0,116,104,114,117,36,0,0,0,117,110,107,110,111,119,110,32,116,105,99,100,101,102,32,116,121,112,101,32,105,110,32,115,104,111,119,95,116,105,99,100,101,102,40,41,0,0,0,0,101,118,97,108,32,36,99,97,110,32,99,114,101,97,116,101,32,116,101,120,116,32,91,101,120,112,114,32,36,99,109,120,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,121,32,42,32,37,100,32,47,49,48,48,48,93,32,45,116,101,120,116,32,92,123,37,115,92,125,32,45,102,105,108,108,32,37,115,32,45,97,110,99,104,111,114,32,37,115,32,91,101,120,112,114,32,91,105,110,102,111,32,101,120,105,115,116,115,32,102,111,110,116,93,63,34,45,102,111,110,116,32,92,36,102,111,110,116,34,58,123,125,93,10,0,0,0,0,0,0,0,32,112,111,105,110,116,105,110,116,101,114,118,97,108,32,37,100,0,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,117,115,105,110,103,32,115,112,101,99,115,32,102,111,114,32,116,104,105,115,32,115,116,121,108,101,0,0,0,0,0,67,108,111,115,101,0,0,0,84,75,95,112,117,116,95,116,101,120,116,58,32,113,117,111,116,101,100,32,115,116,114,105,110,103,0,0,0,0,0,0,36,99,97,110,45,62,99,114,101,97,116,101,84,101,120,116,40,36,99,109,120,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,121,32,42,32,37,100,32,47,32,49,48,48,48,44,32,45,116,101,120,116,32,61,62,32,113,123,37,115,125,44,32,45,102,105,108,108,32,61,62,32,113,123,37,115,125,44,32,45,97,110,99,104,111,114,32,61,62,32,39,37,115,39,44,32,40,100,101,102,105,110,101,100,32,36,102,111,110,116,32,63,32,40,45,102,111,110,116,32,61,62,32,36,102,111,110,116,41,32,58,32,40,41,41,41,59,10,0,0,0,0,0,0,0,0,60,115,116,100,111,117,116,62,0,0,0,0,0,0,0,0,99,101,110,116,101,114,0,0,50,32,109,117,108,32,49,32,115,117,98,0,0,0,0,0,110,101,119,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,99,111,117,108,100,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,0,0,0,0,0,0,93,10,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,32,10,10,0,0,0,0,0,0,32,45,115,105,122,101,32,37,100,0,0,0,0,0,0,0,115,101,116,32,102,111,110,116,32,91,102,111,110,116,32,99,114,101,97,116,101,32,45,102,97,109,105,108,121,32,37,115,0,0,0,0,0,0,0,0,98,101,115,121,48,0,0,0,41,59,10,125,10,0,0,0,72,101,108,118,101,116,105,99,97,32,79,98,108,105,113,117,101,0,0,0,0,0,0,0,99,108,36,97,98,101,108,0,32,32,77,105,110,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,32,37,108,100,32,93,10,0,0,0,0,0,44,32,45,115,105,122,101,32,61,62,32,37,100,0,0,0,101,118,36,101,114,121,0,0,32,32,110,111,32,97,117,116,111,45,103,101,110,101,114,97,116,101,100,32,116,105,99,115,10,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,91,39,32,111,114,32,39,114,101,115,116,111,114,101,39,0,0,0,0,0,0,105,102,32,40,36,99,97,110,45,62,99,97,110,40,39,102,111,110,116,67,114,101,97,116,101,39,41,41,32,123,10,36,102,111,110,116,32,61,32,36,99,97,110,45,62,102,111,110,116,67,114,101,97,116,101,40,45,102,97,109,105,108,121,32,61,62,32,113,123,37,115,125,0,0,0,0,0,0,0,0,32,112,111,105,110,116,115,105,122,101,32,37,46,51,102,0,118,97,114,99,111,108,111,114,32,97,114,114,97,121,0,0,70,49,50,0,0,0,0,0,111,110,108,121,32,116,99,32,108,116,32,60,110,62,32,112,111,115,115,105,98,108,101,32,104,101,114,101,0,0,0,0,99,97,116,99,104,32,123,117,110,115,101,116,32,36,102,111,110,116,125,10,0,0,0,0,117,110,100,101,102,32,36,102,111,110,116,59,10,0,0,0,110,111,36,114,111,116,97,116,101,0,0,0,0,0,0,0,50,42,120,32,45,32,48,46,53,0,0,0,0,0,0,0,114,111,116,36,97,116,101,0,9,108,111,97,100,112,97,116,104,32,105,115,32,101,109,112,116,121,10,0,0,0,0,0,115,105,36,122,101,0,0,0,70,105,110,97,108,32,115,101,116,32,111,102,32,112,97,114,97,109,101,116,101,114,115,32,10,0,0,0,0,0,0,0,114,36,111,109,97,110,0,0,37,48,42,100,0,0,0,0,99,36,111,117,114,105,101,114,0,0,0,0,0,0,0,0,98,101,115,106,49,0,0,0,32,110,111,114,111,116,97,116,101,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,98,111,120,36,119,105,100,116,104,0,0,0,0,0,0,0,32,32,83,117,109,32,83,113,46,58,32,32,37,115,10,0,115,105,122,101,32,37,46,50,102,105,110,44,32,37,46,50,102,105,110,32,0,0,0,0,105,36,110,100,101,120,0,0,32,117,110,116,105,108,32,0,115,105,122,101,32,37,46,50,102,99,109,44,32,37,46,50,102,99,109,32,0,0,0,0,32,112,111,105,110,116,115,105,122,101,32,100,101,102,97,117,108,116,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,105,110,32,104,105,115,116,111,103,114,97,109,32,85,78,68,69,70,73,78,69,68,0,0,0,0,0,0,0,70,49,49,0,0,0,0,0,105,108,108,101,103,97,108,32,108,105,110,101,116,121,112,101,0,0,0,0,0,0,0,0,114,111,109,97,110,0,0,0,99,111,117,114,105,101,114,0,99,112,56,53,50,0,0,0,37,115,32,37,100,0,0,0,49,32,121,50,0,0,0,0,50,32,109,117,108,32,48,46,53,32,115,117,98,0,0,0,40,100,111,99,117,109,101,110,116,32,115,112,101,99,105,102,105,99,32,102,111,110,116,41,0,0,0,0,0,0,0,0,73,110,32,116,104,105,115,32,100,101,103,101,110,101,114,97,116,101,32,99,97,115,101,44,32,97,108,108,32,101,114,114,111,114,115,32,97,114,101,32,122,101,114,111,32,98,121,32,100,101,102,105,110,105,116,105,111,110,46,10,10,0,0,0,99,109,116,116,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,92,105,102,120,92,112,108,111,116,112,111,105,110,116,92,117,110,100,101,102,105,110,101,100,92,110,101,119,115,97,118,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,92,102,105,10,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,10,0,0,98,101,115,106,48,0,0,0,92,102,111,110,116,92,103,110,117,112,108,111,116,61,37,115,49,48,32,97,116,32,37,100,112,116,10,92,103,110,117,112,108,111,116,10,0,0,0,0,67,111,117,114,105,101,114,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,0,0,98,111,114,36,100,101,114,0,32,32,83,117,109,58,32,32,32,32,32,32,37,115,10,0,101,118,97,108,36,117,97,116,101,0,0,0,0,0,0,0,100,111,99,0,0,0,0,0,110,111,110,117,110,105,36,102,111,114,109,0,0,0,0,0,32,115,101,99,115,0,0,0,114,101,36,115,116,111,114,101,0,0,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,119,105,116,104,32,108,111,103,115,99,97,108,101,32,97,99,116,105,118,101,0,0,0,0,0,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,48,44,48,41,10,0,0,0,0,32,112,111,105,110,116,115,105,122,101,32,118,97,114,105,97,98,108,101,0,0,0,0,0,115,116,97,99,107,104,101,105,103,104,116,32,97,114,114,97,121,0,0,0,0,0,0,0,70,49,48,0,0,0,0,0,101,120,112,101,99,116,101,100,32,108,105,110,101,116,121,112,101,0,0,0,0,0,0,0,92,109,117,108,116,105,112,117,116,40,37,117,44,37,117,41,40,37,46,51,102,44,37,46,51,102,41,123,37,117,125,123,37,115,125,10,0,0,0,0,92,112,117,116,40,37,46,50,102,44,37,46,50,102,41,123,37,115,125,10,0,0,0,0,92,115,112,101,99,105,97,108,123,101,109,58,108,105,110,101,119,105,100,116,104,32,37,46,49,102,112,116,125,37,37,10,0,0,0,0,0,0,0,0,50,42,120,0,0,0,0,0,92,115,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,123,92,114,117,108,101,91,37,46,51,102,112,116,93,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,37,37,10,0,0,0,0,0,123,92,114,111,116,97,116,101,98,111,120,123,37,100,125,0,84,101,114,109,105,110,97,108,32,111,112,116,105,111,110,115,32,97,114,101,32,39,37,115,39,10,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,112,97,100,101,115,117,105,116,36,125,0,0,0,0,0,10,69,120,97,99,116,108,121,32,97,115,32,109,97,110,121,32,100,97,116,97,32,112,111,105,110,116,115,32,97,115,32,116,104,101,114,101,32,97,114,101,32,112,97,114,97,109,101,116,101,114,115,46,10,0,0,103,101,116,95,111,102,102,115,101,116,115,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,104,101,97,114,116,115,117,105,116,36,125,0,0,0,0,0,108,111,103,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,108,111,122,101,110,103,101,36,125,0,0,67,111,117,114,105,101,114,32,66,111,108,100,0,0,0,0,32,32,83,116,100,32,68,101,118,58,32,32,37,115,10,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,108,111,122,101,110,103,101,36,125,0,0,0,0,0,0,0,32,98,121,32,37,103,37,115,0,0,0,0,0,0,0,0,105,110,116,101,103,101,114,32,111,118,101,114,102,108,111,119,59,32,99,104,97,110,103,105,110,103,32,116,111,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,0,0,0,0,101,120,112,101,99,116,105,110,103,32,114,105,103,104,116,32,112,97,114,101,110,116,104,101,115,105,115,32,41,0,0,0,101,104,102,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,116,114,105,97,110,103,108,101,100,111,119,110,36,125,0,0,0,0,0,32,112,111,105,110,116,116,121,112,101,32,37,100,0,0,0,98,111,120,112,108,111,116,32,104,97,115,32,117,110,100,101,102,105,110,101,100,32,120,32,99,111,111,114,100,105,110,97,116,101,0,0,0,0,0,0,70,57,0,0,0,0,0,0,101,120,112,101,99,116,101,100,32,99,111,108,111,114,115,112,101,99,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,116,114,105,97,110,103,108,101,100,111,119,110,36,125,0,0,99,111,110,116,111,117,114,32,100,50,121,0,0,0,0,0])
-.concat([92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,116,114,105,97,110,103,108,101,36,125,0,115,101,116,32,37,115,114,97,110,103,101,32,91,32,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,117,108,108,101,116,36,125,0,0,0,0,0,0,0,0,98,108,45,105,110,116,101,114,112,32,97,108,111,110,103,32,115,99,97,110,0,0,0,0,112,114,101,118,105,111,117,115,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,110,111,116,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,0,0,0,0,0,0,50,32,109,117,108,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,99,105,114,99,36,125,0,0,116,101,120,116,95,108,97,98,101,108,32,108,105,115,116,32,119,97,115,32,110,111,116,32,105,110,105,116,105,97,108,105,122,101,100,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,115,113,117,97,114,101,36,125,0,0,0,45,45,112,101,114,115,105,115,116,0,0,0,0,0,0,0,97,98,115,46,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,108,97,115,116,32,105,116,101,114,97,116,105,111,110,32,58,32,37,103,10,10,0,0,0,0,0,0,0,0,92,114,97,105,115,101,98,111,120,123,45,46,56,112,116,125,123,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,66,111,120,36,125,125,0,87,97,114,110,105,110,103,32,58,32,117,100,102,32,115,104,97,100,111,119,101,100,32,98,121,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,97,115,116,36,125,0,0,0,108,111,103,49,48,0,0,0,92,114,117,108,101,123,49,112,116,125,123,49,112,116,125,0,67,111,117,114,105,101,114,32,79,98,108,105,113,117,101,0,98,36,97,114,115,0,0,0,32,32,77,101,97,110,58,32,32,32,32,32,37,115,10,0,77,79,85,83,69,95,82,85,76,69,82,95,89,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,114,117,108,101,123,37,103,112,116,125,123,37,103,112,116,125,125,10,0,37,35,103,0,0,0,0,0,105,110,99,114,101,109,101,110,116,32,109,117,115,116,32,98,101,32,110,101,103,97,116,105,118,101,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,101,109,116,101,120,32,115,112,101,99,105,97,108,115,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,92,105,102,120,92,112,108,111,116,112,111,105,110,116,92,117,110,100,101,102,105,110,101,100,92,110,101,119,115,97,118,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,92,102,105,10,0,32,108,105,110,101,119,105,100,116,104,32,37,46,51,102,0,98,111,120,112,108,111,116,32,112,101,114,109,117,116,97,116,105,111,110,115,32,97,114,114,97,121,0,0,0,0,0,0,115,116,114,111,107,101,32,103,115,97,118,101,9,37,37,32,100,114,97,119,32,103,114,97,121,32,115,99,97,108,101,32,115,109,111,111,116,104,32,98,111,120,10,109,97,120,99,111,108,111,114,115,32,48,32,103,116,32,123,47,105,109,97,120,32,109,97,120,99,111,108,111,114,115,32,100,101,102,125,32,123,47,105,109,97,120,32,49,48,50,52,32,100,101,102,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,0,0,115,112,108,105,110,101,32,115,111,108,117,116,105,111,110,32,118,101,99,116,111,114,0,0,70,56,0,0,0,0,0,0,92,101,110,100,71,78,85,80,76,79,84,112,105,99,116,117,114,101,10,92,101,110,100,103,114,111,117,112,10,92,101,110,100,105,110,112,117,116,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,99,111,117,108,100,32,110,111,116,32,97,99,99,101,115,115,32,105,116,101,114,97,116,105,111,110,32,118,97,114,105,97,98,108,101,46,0,0,0,0,0,0,92,101,110,100,123,112,105,99,116,117,114,101,125,37,10,92,101,110,100,103,114,111,117,112,10,92,101,110,100,105,110,112,117,116,10,0,0,0,0,0,92,101,110,100,123,100,111,99,117,109,101,110,116,125,10,0,124,50,42,120,32,45,32,48,46,53,124,0,0,0,0,0,32,32,32,32,92,103,112,108,98,97,99,107,116,101,120,116,10,32,32,32,32,92,112,117,116,40,48,44,48,41,123,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,123,37,115,125,125,37,37,10,32,32,32,32,92,103,112,108,102,114,111,110,116,116,101,120,116,10,32,32,92,101,110,100,123,112,105,99,116,117,114,101,125,37,37,10,92,101,110,100,103,114,111,117,112,10,0,0,0,114,101,108,46,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,108,97,115,116,32,105,116,101,114,97,116,105,111,110,32,58,32,37,103,10,10,0,0,0,0,0,0,0,0,92,114,111,116,97,116,101,98,111,120,123,37,100,125,123,0,32,32,32,32,32,32,92,112,117,116,40,37,100,44,37,100,41,123,0,0,0,0,0,0,32,32,32,32,32,32,92,99,111,108,111,114,103,114,97,121,123,37,115,125,37,37,10,0,67,111,117,114,105,101,114,0,97,117,36,116,111,115,99,97,108,101,0,0,0,0,0,0,42,32,67,79,76,85,77,78,58,32,10,0,0,0,0,0,32,32,32,32,32,32,92,99,111,108,111,114,123,119,104,105,116,101,125,37,37,10,0,0,32,102,114,111,109,32,0,0,105,110,99,114,101,109,101,110,116,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,0,0,0,0,0,32,32,32,32,32,32,92,99,111,108,111,114,123,98,108,97,99,107,125,37,37,10,0,0,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,0,98,111,120,112,108,111,116,32,108,97,98,101,108,115,32,97,114,114,97,121,0,0,0,0,70,55,0,0,0,0,0,0,114,103,98,0,0,0,0,0,119,98,97,48,49,50,51,52,53,54,55,56,0,0,0,0,32,32,32,32,32,32,92,99,115,110,97,109,101,32,76,84,37,99,92,101,110,100,99,115,110,97,109,101,37,37,10,0,32,32,32,32,32,32,92,99,111,108,111,114,114,103,98,123,37,51,46,50,102,44,37,51,46,50,102,44,37,51,46,50,102,125,37,37,10,0,0,0,50,32,109,117,108,32,48,46,53,32,115,117,98,32,97,98,115,0,0,0,0,0,0,0,37,37,112,109,51,100,95,109,97,112,95,101,110,100,10,0,37,37,112,109,51,100,95,109,97,112,95,98,101,103,105,110,10,0,0,0,0,0,0,0,9,32,32,66,97,99,107,32,115,105,100,101,32,111,102,32,115,117,114,102,97,99,101,115,32,104,97,115,32,108,105,110,101,115,116,121,108,101,32,111,102,102,115,101,116,32,111,102,32,37,100,10,9,32,32,66,105,116,45,77,97,115,107,32,111,102,32,76,105,110,101,115,32,116,111,32,100,114,97,119,32,105,110,32,101,97,99,104,32,116,114,105,97,110,103,108,101,32,105,115,32,37,108,100,10,9,32,32,37,100,58,32,0,0,0,0,0,0,0,0,102,105,110,97,108,32,115,117,109,32,111,102,32,115,113,117,97,114,101,115,32,111,102,32,114,101,115,105,100,117,97,108,115,32,58,32,37,103,10,0,32,32,32,32,92,103,112,108,103,97,100,100,116,111,109,97,99,114,111,92,103,112,108,102,114,111,110,116,116,101,120,116,123,37,10,0,0,0,0,0,32,32,32,32,92,103,112,108,103,97,100,100,116,111,109,97,99,114,111,92,103,112,108,98,97,99,107,116,101,120,116,123,37,10,0,0,0,0,0,0,10,83,117,98,116,111,112,105,99,115,32,97,118,97,105,108,97,98,108,101,32,102,111,114,32,0,0,0,0,0,0,0,32,32,32,32,125,37,10,0,66,111,111,107,109,97,110,32,68,101,109,105,32,73,116,97,108,105,99,0,0,0,0,0,97,114,36,114,111,119,0,0,42,32,77,65,84,82,73,88,58,32,91,37,100,32,88,32,37,100,93,32,10,0,0,0,125,37,10,0,0,0,0,0,78,111,32,112,114,101,118,105,111,117,115,32,102,105,108,101,110,97,109,101,0,0,0,0,32,32,115,101,114,105,101,115,0,0,0,0,0,0,0,0,37,10,32,32,92,115,112,101,99,105,97,108,123,112,115,58,32,99,117,114,114,101,110,116,112,111,105,110,116,32,103,114,101,115,116,111,114,101,32,109,111,118,101,116,111,125,37,10,32,32,0,0,0,0,0,0,70,54,0,0,0,0,0,0,92,114,106,117,115,116,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,91,114,93,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,92,99,106,117,115,116,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,121,116,105,99,115,0,0,0,52,120,59,49,59,45,50,120,43,49,46,56,52,59,120,47,48,46,48,56,45,49,49,46,53,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,0,92,108,106,117,115,116,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,10,65,102,116,101,114,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,116,104,101,32,102,105,116,32,99,111,110,118,101,114,103,101,100,46,10,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,0,32,32,87,97,114,110,105,110,103,58,32,83,105,110,103,108,101,32,105,115,111,108,105,110,101,32,40,115,99,97,110,41,32,105,115,32,110,111,116,32,101,110,111,117,103,104,32,102,111,114,32,97,32,112,109,51,100,32,112,108,111,116,46,10,9,32,32,32,72,105,110,116,58,32,77,105,115,115,105,110,103,32,98,108,97,110,107,32,108,105,110,101,115,32,105,110,32,116,104,101,32,100,97,116,97,32,102,105,108,101,63,32,83,101,101,32,39,104,101,108,112,32,112,109,51,100,39,32,97,110,100,32,70,65,81,46,10,0,0,0,0,0,0,0,115,103,110,0,0,0,0,0,37,37,10,32,32,92,115,112,101,99,105,97,108,123,112,115,58,32,103,115,97,118,101,32,99,117,114,114,101,110,116,112,111,105,110,116,32,99,117,114,114,101,110,116,112,111,105,110,116,32,116,114,97,110,115,108,97,116,101,10,37,100,32,114,111,116,97,116,101,32,110,101,103,32,101,120,99,104,32,110,101,103,32,101,120,99,104,32,116,114,97,110,115,108,97,116,101,125,37,37,10,32,32,0,66,111,111,107,109,97,110,32,68,101,109,105,0,0,0,0,97,110,36,103,108,101,115,0,109,97,120,95,105,110,100,101,120,0,0,0,0,0,0,0,32,32,92,112,117,116,40,37,100,44,37,100,41,123,0,0,32,32,68,97,121,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,92,102,111,110,116,115,105,122,101,123,37,103,125,123,92,98,97,115,101,108,105,110,101,115,107,105,112,125,92,115,101,108,101,99,116,102,111,110,116,10,0,0,0,0,0,0,0,0,32,108,105,110,101,99,111,108,111,114,0,0,0,0,0,0,120,112,45,62,112,95,99,111,117,110,116,32,61,61,32,121,112,45,62,112,95,99,111,117,110,116,0,0,0,0,0,0,70,53,0,0,0,0,0,0,32,32,125,125,37,10,0,0,32,115,105,122,101,32,37,46,50,102,105,110,44,32,37,46,50,102,105,110,32,0,0,0,32,115,105,122,101,32,37,46,50,102,99,109,44,32,37,46,50,102,99,109,32,0,0,0,32,59,10,0,0,0,0,0,100,117,112,32,48,46,52,50,32,108,101,32,123,52,32,109,117,108,125,32,123,100,117,112,32,48,46,57,50,32,108,101,32,123,45,50,32,109,117,108,32,49,46,56,52,32,97,100,100,125,32,123,48,46,48,56,32,100,105,118,32,49,49,46,53,32,115,117,98,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,0,0,0,32,37,100,0,0,0,0,0,32,116,105,110,121,0,0,0,10,84,104,101,32,102,105,116,32,119,97,115,32,115,116,111,112,112,101,100,32,98,121,32,116,104,101,32,117,115,101,114,32,97,102,116,101,114,32,37,100,32,105,116,101,114,97,116,105,111,110,115,46,10,0,0,32,115,109,97,108,108,0,0,32,114,111,116,97,116,101,0,97,98,115,0,0,0,0,0,48,46,53,0,0,0,0,0,32,100,97,115,104,101,100,0,66,111,111,107,109,97,110,32,76,105,103,104,116,32,73,116,97,108,105,99,0,0,0,0,97,116,0,0,0,0,0,0,109,105,110,95,105,110,100,101,120,0,0,0,0,0,0,0,32,99,111,108,111,114,0,0,109,97,120,95,117,115,105,110,103,32,60,61,32,77,65,88,68,65,84,65,67,79,76,83,0,0,0,0,0,0,0,0,32,32,77,111,110,116,104,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,0,0,0,100,36,116,105,99,115,0,0,37,115,37,115,37,115,37,115,0,0,0,0,0,0,0,0,32,108,105,110,101,116,121,112,101,32,37,100,0,0,0,0,70,52,0,0,0,0,0,0,112,36,97,116,116,101,114,110,0,0,0,0,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,0,0,0,0,0,102,111,110,116,32,115,105,122,101,32,111,117,116,32,111,102,32,98,111,117,110,100,115,32,91,49,46,46,49,48,48,93,0,0,0,0,0,0,0,0,116,36,105,110,121,0,0,0,115,36,109,97,108,108,0,0,50,42,120,45,48,46,56,52,0,0,0,0,0,0,0,0,114,36,111,116,97,116,101,0,10,77,97,120,105,109,117,109,32,105,116,101,114,97,116,105,111,110,32,99,111,117,110,116,32,40,37,100,41,32,114,101,97,99,104,101,100,46,32,70,105,116,32,115,116,111,112,112,101,100,46,10,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,69,69,80,73,67,32,109,97,99,114,111,115,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,0,0,0,0,0,92,102,111,111,116,110,111,116,101,115,105,122,101,10,0,0,105,110,116,0,0,0,0,0,92,102,111,110,116,115,105,122,101,123,37,100,125,123,37,103,125,92,115,101,108,101,99,116,102,111,110,116,10,0,0,0,66,111,111,107,109,97,110,32,76,105,103,104,116,0,0,0,97,99,36,116,105,111,110,95,116,97,98,108,101,0,0,0,99,111,103,95,121,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,37,100,44,37,100,41,10,0,0,32,32,105,110,116,101,114,118,97,108,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,109,36,116,105,99,115,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,111,116,116,101,100,108,105,110,101,123,50,48,125,0,0,0,0,0,0,45,45,45,101,114,114,111,114,33,45,45,45,10,0,0,0,117,115,101,115,95,97,120,105,115,91,83,69,67,79,78,68,95,89,95,65,88,73,83,93,0,0,0,0,0,0,0,0,70,51,0,0,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,97,115,104,108,105,110,101,91,54,48,93,123,50,48,125,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,111,116,116,101,100,108,105,110,101,123,49,48,125,0,0,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,97,115,104,108,105,110,101,91,57,48,93,123,49,48,125,0,0,0,0,50,32,109,117,108,32,48,46,56,52,32,115,117,98,0,0,92,84,104,105,99,107,108,105,110,101,115,32,92,112,97,116,104,0,0,0,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,112,97,116,104,0,0,0,0,0,0,0,0,70,73,84,95,67,79,78,86,69,82,71,69,68,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,114,97,119,108,105,110,101,91,45,53,48,93,0,0,0,0,0,0,0,92,116,104,105,99,107,108,105,110,101,115,32,92,112,97,116,104,0,0,0,0,0,0,0,69,108,108,105,112,116,105,99,80,105,0,0,0,0,0,0,40,37,117,44,37,117,41,0,65,118,97,110,116,71,97,114,100,101,32,68,101,109,105,32,79,98,108,105,113,117,101,0,97,36,108,108,0,0,0,0,99,111,103,95,120,0,0,0,10,37,115,40,37,117,44,37,117,41,0,0,0,0,0,0,102,108,111,97,116,54,52,0,37,115,40,37,117,44,37,117,41,0,0,0,0,0,0,0,101,108,108,105,112,115,101,115,10,0,0,0,0,0,0,0,117,115,101,115,95,97,120,105,115,91,70,73,82,83,84,95,89,95,65,88,73,83,93,0,70,50,0,0,0,0,0,0,101,36,109,112,116,121,0,0,92,99,111,108,111,114,123,121,101,108,108,111,119,125,10,0,92,99,111,108,111,114,123,99,121,97,110,125,10,0,0,0,112,97,117,115,101,100,0,0,92,99,111,108,111,114,123,109,97,103,101,110,116,97,125,10,0,0,0,0,0,0,0,0,92,99,111,108,111,114,123,103,114,101,101,110,125,10,0,0,120,47,48,46,51,50,45,48,46,55,56,49,50,53,0,0,9,108,111,97,100,112,97,116,104,32,102,114,111,109,32,71,78,85,80,76,79,84,95,76,73,66,32,105,115,32,0,0,92,99,111,108,111,114,123,98,108,117,101,125,10,0,0,0,103,112,95,115,116,114,97,100,100,0,0,0,0,0,0,0,70,73,84,58,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,100,117,114,105,110,103,32,102,105,116,0,0,92,99,111,108,111,114,123,114,101,100,125,10,0,0,0,0,37,56,46,51,103,0,0,0,116,105,109,101,32,118,97,108,117,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,92,99,111,108,111,114,123,98,108,97,99,107,125,10,0,0,69,108,108,105,112,116,105,99,69,0,0,0,0,0,0,0,125,125,125,10,0,0,0,0,65,118,97,110,116,71,97,114,100,101,32,68,101,109,105,0,118,36,97,114,105,97,98,108,101,115,0,0,0,0,0,0,105,110,100,101,120,95,109,97,120,95,121,0,0,0,0,0,37,99,92,92,0,0,0,0,102,108,111,97,116,51,50,0,32,32,32,32,111,102,102,115,101,116,32,0,0,0,0,0,97,117,36,116,111,102,114,101,113,0,0,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,116,93,123,92,115,104,111,114,116,115,116,97,99,107,123,0,99,105,114,99,108,101,115,10,0,0,0,0,0,0,0,0,97,108,108,32,112,111,105,110,116,115,32,121,50,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,33,0,0,70,49,0,0,0,0,0,0,116,114,97,110,115,36,112,97,114,101,110,116,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,92,115,104,111,114,116,115,116,97,99,107,123,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,98,93,123,92,115,104,111,114,116,115,116,97,99,107,123,0,77,111,117,115,105,110,103,32,110,111,116,32,97,99,116,105,118,101,0,0,0,0,0,0,99,112,56,53,48,0,0,0,37,115,125,125,125,10,0,0,32,120,108,111,119,32,120,104,105,103,104,32,121,108,111,119,32,121,104,105,103,104,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,116,93,123,92,114,111,116,97,116,101,98,111,120,91,111,114,105,103,105,110,61,99,93,123,57,48,125,123,0,0,0,0,48,46,51,50,32,100,105,118,32,48,46,55,56,49,50,53,32,115,117,98,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,92,114,111,116,97,116,101,98,111,120,91,111,114,105,103,105,110,61,99,93,123,57,48,125,123,0,0,0,0,0,108,111,103,102,105,108,101,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,98,93,123,92,114,111,116,97,116,101,98,111,120,91,111,114,105,103,105,110,61,99,93,123,57,48,125,123,0,0,0,0,37,115,125,125,10,0,0,0,69,108,108,105,112,116,105,99,75,0,0,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,114,93,123,0,0,0,0,0,0,65,118,97,110,116,71,97,114,100,101,32,66,111,111,107,32,79,98,108,105,113,117,101,0,116,36,101,114,109,105,110,97,108,0,0,0,0,0,0,0,105,110,100,101,120,95,109,97,120,95,120,0,0,0,0,0,100,111,0,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,123,0,117,105,110,116,54,52,0,0,32,97,110,100,32,97,114,101,32,110,111,116,32,114,111,116,97,116,101,100,44,10,9,0,101,120,112,101,99,116,101,100,32,102,111,114,109,97,116,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,0,0,0,0,0,0,114,103,98,105,109,97,103,101,10,0,0,0,0,0,0,0,97,108,108,32,112,111,105,110,116,115,32,121,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,33,0,0,0,75,80,95,57,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,115,116,97,114,36,125,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,116,114,105,97,110,103,108,101,36,125,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,116,105,109,101,115,36,125,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,66,111,120,36,125,0,124,40,51,120,45,50,41,47,50,124,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,32,43,36,125,0,0,0,78,111,32,102,105,116,116,97,98,108,101,32,112,97,114,97,109,101,116,101,114,115,33,10,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,68,105,97,109,111,110,100,36,125,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,115,116,97,114,36,125,0,0,0,0,0,0,116,97,110,104,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,116,114,105,97,110,103,108,101,36,125,0,0,65,118,97,110,116,71,97,114,100,101,32,66,111,111,107,0,115,36,101,116,0,0,0,0,105,110,100,101,120,95,109,105,110,95,121,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,116,105,109,101,115,36,125,0,0,0,0,0,105,110,116,54,52,0,0,0,32,105,110,32,50,68,32,109,111,100,101,44,32,116,101,114,109,105,110,97,108,32,112,101,114,109,105,116,116,105,110,103,44,10,9,0,0,0,0,0,99,111,109,36,109,101,110,116,115,99,104,97,114,115,0,0,101,120,112,101,99,116,105,110,103,32,101,120,112,111,110,101,110,116,0,0,0,0,0,0,102,111,114,109,97,116,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,66,111,120,36,125,0,0,0,0,0,0,0,105,109,97,103,101,10,0,0,101,100,102,0,0,0,0,0,117,115,101,115,95,97,120,105,115,91,83,69,67,79,78,68,95,88,95,65,88,73,83,93,0,0,0,0,0,0,0,0,75,80,95,56,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,32,43,36,125,0,99,111,110,116,111,117,114,32,100,50,120,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,68,105,97,109,111,110,100,36,125,0,0,0,35,32,115,101,116,32,111,117,116,112,117,116,10,0,0,0,92,99,105,114,99,108,101,42,123,50,52,125,0,0,0,0,112,109,51,100,95,112,108,111,116,45,62,113,117,97,100,114,97,110,103,108,101,115,0,0,92,99,105,114,99,108,101,42,123,49,56,125,0,0,0,0,49,46,53,32,109,117,108,32,49,32,115,117,98,32,97,98,115,0,0,0,0,0,0,0,92,99,105,114,99,108,101,42,123,49,50,125,0,0,0,0,45,112,101,114,115,105,115,116,0,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,100,97,116,97,32,112,111,105,110,116,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32,110,117,109,98,101,114,32,111,102,32,112,97,114,97,109,101,116,101,114,115,0,92,99,105,114,99,108,101,123,50,52,125,0,0,0,0,0,92,99,105,114,99,108,101,123,49,56,125,0,0,0,0,0,99,111,115,104,0,0,0,0,92,99,105,114,99,108,101,123,49,50,125,0,0,0,0,0,84,105,109,101,115,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,0,0,0,102,36,117,110,99,116,105,111,110,115,0,0,0,0,0,0,105,110,100,101,120,95,109,105,110,95,120,0,0,0,0,0,84,111,111,32,109,97,110,121,32,108,101,118,101,108,115,32,111,102,32,110,101,115,116,101,100,32,109,97,99,114,111,115,0,0,0,0,0,0,0,0,77,79,85,83,69,95,82,85,76,69,82,95,88,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,116,97,114,36,125,0,0,117,105,110,116,51,50,0,0,32,98,121,32,37,100,0,0,101,120,112,101,99,116,101,100,32,102,111,110,116,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,116,114,105,97,110,103,108,101,36,125,0,0,0,0,0,0,108,97,98,101,108,115,10,0,99,108,111,115,101,0,0,0,37,105,0,0,0,0,0,0,117,115,101,115,95,97,120,105,115,91,70,73,82,83,84,95,88,95,65,88,73,83,93,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,76,85,45,68,69,67,79,77,80,0,0,0,0,115,109,111,111,116,104,95,98,111,120,0,0,0,0,0,0,115,112,108,105,110,101,32,114,105,103,104,116,32,115,105,100,101,0,0,0,0,0,0,0,75,80,95,55,0,0,0,0,100,117,112,108,105,99,97,116,101,100,32,97,114,103,117,109,101,110,116,115,32,105,110,32,115,116,121,108,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,116,105,109,101,115,36,125,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,101,120,112,101,99,116,115,32,97,114,103,117,109,101,110,116,32,40,118,97,114,110,97,109,101,41,32,111,102,32,116,121,112,101,32,115,116,114,105,110,103,46,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,66,111,120,36,125,0,0,0,37,115,32,97,120,105,115,32,114,97,110,103,101,32,117,110,100,101,102,105,110,101,100,32,111,114,32,111,118,101,114,102,108,111,119,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,43,36,125,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,68,105,97,109,111,110,100,36,125,0,0,0,0,0,0,0,124,40,51,120,45,49,41,47,50,124,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,37,115,125,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,102,0,0,0,0,0,0,0,0,92,101,110,100,123,112,105,99,116,117,114,101,125,10,0,0,115,105,110,104,0,0,0,0,92,102,111,111,116,110,111,116,101,115,105,122,101,37,10,0,84,105,109,101,115,32,66,111,108,100,0,0,0,0,0,0,104,97,110,110,0,0,0,0,37,115,37,115,9,37,108,100,10,0,0,0,0,0,0,0,116,114,105,109,32,116,111,112,32,38,32,98,111,116,116,111,109,32,109,97,114,103,105,110,115,0,0,0,0,0,0,0,105,110,116,51,50,0,0,0,32,114,111,116,97,116,101,100,0,0,0,0,0,0,0,0,116,114,105,109,32,98,111,116,116,111,109,32,109,97,114,103,105,110,0,0,0,0,0,0,112,109,51,100,10,0,0,0,98,117,116,116,111,110,51,0,75,80,95,54,0,0,0,0,78,111,32,112,111,105,110,116,105,110,116,101,114,118,97,108,32,115,112,101,99,105,102,105,101,114,32,97,108,108,111,119,101,100,44,32,104,101,114,101,0,0,0,0,0,0,0,0,116,114,105,109,32,116,111,112,32,109,97,114,103,105,110,0,116,114,105,109,32,108,101,102,116,32,38,32,114,105,103,104,116,32,109,97,114,103,105,110,115,0,0,0,0,0,0,0,99,104,97,114,36,97,99,116,101,114,0,0,0,0,0,0,116,114,105,109,32,114,105,103,104,116,32,109,97,114,103,105,110,0,0,0,0,0,0,0,116,114,105,109,32,108,101,102,116,32,109,97,114,103,105,110,0,0,0,0,0,0,0,0,49,46,53,32,109,117,108,32,46,53,32,115,117,98,32,97,98,115,0,0,0,0,0,0,37,37,32,0,0,0,0,0,110,111,32,112,97,114,97,109,101,116,101,114,32,115,112,101,99,105,102,105,101,100,0,0,37,10,0,0,0,0,0,0,92,115,112,101,99,105,97,108,123,100,116,32,37,102,125,37,37,10,0,0,0,0,0,0,97,116,97,110,50,0,0,0,92,115,112,101,99,105,97,108,123,100,97,32,37,102,125,37,37,10,0,0,0,0,0,0,84,105,109,101,115,32,73,116,97,108,105,99,0,0,0,0,98,111,120,0,0,0,0,0,109,97,120,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,123,92,115,104,111,114,116,115,116,97,99,107,123,37,115,125,125,125,10,0,0,0,0,0,117,119,111,114,100,0,0,0,102,111,114,109,97,116,32,34,37,115,34,0,0,0,0,0,110,111,114,97,110,103,101,36,108,105,109,105,116,101,100,0,91,108,116,93,0,0,0,0,98,111,120,112,108,111,116,10,0,0,0,0,0,0,0,0,98,117,116,116,111,110,50,0,97,108,108,32,112,111,105,110,116,115,32,117,110,100,101,102,105,110,101,100,33,0,0,0,75,80,95,53,0,0,0,0,112,105,0,0,0,0,0,0,91,108,98,93,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,123,37,115,125,125,10,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,125,10,0,0,0,0,0,0,120,116,105,99,115,0,0,0,92,112,117,116,40,37,100,44,37,100,41,0,0,0,0,0,40,51,120,45,50,41,47,50,0,0,0,0,0,0,0,0,92,115,112,101,99,105,97,108,123,112,97,32,37,100,32,37,100,125,0,0,0,0,0,0,102,105,116,116,101,100,32,112,97,114,97,109,101,116,101,114,115,32,105,110,105,116,105,97,108,105,122,101,100,32,119,105,116,104,32,99,117,114,114,101,110,116,32,118,97,114,105,97,98,108,101,32,118,97,108,117,101,115,10,10,0,0,0,0,92,115,112,101,99,105,97,108,123,102,112,125,37,10,0,0,92,115,112,101,99,105,97,108,123,97,114,32,48,32,48,32,37,100,32,37,100,32,48,32,55,125,0,0,0,0,0,0,97,116,97,110,0,0,0,0,92,115,112,101,99,105,97,108,123,112,110,32,37,100,125,0,84,105,109,101,115,32,82,111,109,97,110,0,0,0,0,0,99,97,117,99,104,121,0,0,117,112,95,113,117,97,114,116,105,108,101,0,0,0,0,0,92,115,112,101,99,105,97,108,123,115,104,32,37,102,125,0,117,105,110,116,49,54,0,0,106,117,115,116,105,102,105,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,44,32,0,0,0,0,0,0,0,114,97,110,103,101,36,108,105,109,105,116,101,100,0,0,0,125,37,37,10,0,0,0,0,99,97,110,100,108,101,115,116,105,99,107,115,10,0,0,0,98,117,116,116,111,110,49,0,78,111,32,100,97,116,97,32,105,110,32,112,108,111,116,0,75,80,95,52,0,0,0,0,112,111,105,110,116,105,36,110,116,101,114,118,97,108,0,0,92,114,117,108,101,123,46,49,112,116,125,123,46,49,112,116,125,0,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,115,112,101,99,105,97,108,123,101,109,58,108,105,110,101,116,111,125,125,10,0,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,115,112,101,99,105,97,108,123,101,109,58,109,111,118,101,116,111,125,125,10,0,0,0,0,0,0,0,69,68,70,95,66,105,110,97,114,121,70,105,108,101,78,97,109,101,0,0,0,0,0,0,49,46,53,32,109,117,108,32,49,32,115,117,98,0,0,0,92,112,117,116,40,37,46,49,102,44,37,46,49,102,41,123,92,114,117,108,101,91,37,46,51,102,112,116,93,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,102,105,116,58,32,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101,114,115,63,0,0,0,0,0,0,92,112,117,116,40,37,46,49,102,44,37,46,49,102,41,123,37,115,125,10,0,0,0,0,92,112,117,116,40,37,46,50,102,44,37,117,41,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,97,99,111,115,0,0,0,0,112,111,112,32,48,46,53,0,92,109,117,108,116,105,112,117,116,40,37,46,50,102,44,37,46,50,102,41,40,37,46,51,102,44,37,46,51,102,41,123,50,125,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,0,0,0,77,117,115,116,32,115,101,116,32,111,117,116,112,117,116,32,116,111,32,97,32,102,105,108,101,32,111,114,32,112,117,116,32,97,108,108,32,109,117,108,116,105,112,108,111,116,32,99,111,109,109,97,110,100,115,32,111,110,32,111,110,101,32,105,110,112,117,116,32,108,105,110,101,0,0,0,0,0,0,0,101,120,112,0,0,0,0,0,109,101,100,105,97,110,0,0,92,109,117,108,116,105,112,117,116,40,37,46,50,102,44,37,46,50,102,41,40,37,46,51,102,44,37,46,51,102,41,123,37,117,125,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,0,0,99,101,110,116,101,114,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,97,117,116,111,106,36,117,115,116,105,102,121,0,0,0,0,92,112,117,116,40,37,117,44,37,46,50,102,41,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,102,105,110,97,110,99,101,98,97,114,115,10,0,0,0,0,97,110,121,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,39,115,117,109,32,91,60,118,97,114,62,32,61,32,60,115,116,97,114,116,62,58,60,101,110,100,62,93,32,60,101,120,112,114,101,115,115,105,111,110,62,39,10,0,0,0,75,80,95,51,0,0,0,0,78,111,32,112,111,105,110,116,115,105,122,101,32,115,112,101,99,105,102,105,101,114,32,97,108,108,111,119,101,100,44,32,104,101,114,101,0,0,0,0,92,117,115,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,0,0,0,0,0,92,112,117,116,40,37,117,44,37,117,41,123,37,115,125,10,0,0,0,0,0,0,0,0,115,101,99,36,111,110,100,0,92,112,117,116,40,37,100,44,37,100,41,123,92,118,101,99,116,111,114,40,37,100,44,37,100,41,123,48,125,125,10,0,92,112,117,116,40,37,100,44,37,100,41,123,92,37,115,40,37,100,44,37,100,41,123,37,100,125,125,10,0,0,0,0,40,51,120,45,49,41,47,50,0,0,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,37,115,40,37,100,44,48,41,123,37,100,125,125,10,0,0,0,0,0,102,105,116,32,112,97,114,97,109,32,114,101,115,105,122,101,0,0,0,0,0,0,0,0,108,105,110,101,0,0,0,0,118,101,99,116,111,114,0,0,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,97,115,105,110,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,37,115,40,48,44,37,100,41,123,37,100,125,125,10,0,0,0,0,0,84,104,105,115,32,116,101,114,109,105,110,97,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,109,117,108,116,105,112,108,111,116,0,0,0,0,0,0,0,0,103,97,117,115,115,0,0,0,108,111,95,113,117,97,114,116,105,108,101,0,0,0,0,0,117,36,110,105,116,0,0,0,114,105,103,104,116,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,0,105,110,116,49,54,0,0,0,114,105,36,103,104,116,0,0,110,111,36,104,97,99,107,116,101,120,116,0,0,0,0,0,118,101,99,116,111,114,10,0,115,117,114,102,97,99,101,0,107,101,121,36,112,114,101,115,115,0,0,0,0,0,0,0,39,93,39,32,101,120,112,101,99,116,101,100,0,0,0,0,75,80,95,50,0,0,0,0,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,80,83,84,82,73,67,75,83,32,109,97,99,114,111,115,10,0,92,99,97,116,99,111,100,101,96,64,61,49,50,10,92,102,105,10,92,101,110,100,112,115,112,105,99,116,117,114,101,10,0,0,0,0,0,0,0,0,102,105,114,36,115,116,0,0,92,112,115,112,105,99,116,117,114,101,40,37,102,44,37,102,41,40,37,102,44,37,102,41,10,92,105,102,120,92,110,111,102,105,103,115,92,117,110,100,101,102,105,110,101,100,10,92,99,97,116,99,111,100,101,96,64,61,49,49,10,10,0,0,92,112,115,115,101,116,123,117,110,105,116,61,53,46,48,105,110,44,120,117,110,105,116,61,53,46,48,105,110,44,121,117,110,105,116,61,51,46,48,105,110,125,10,0,0,0,0,0,49,46,53,32,109,117,108,32,46,53,32,115,117,98,0,0,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,99,111,117,108,100,32,110,111,116,32,98,101,32,114,101,97,100,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,65,114,114,111,119,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,99,97,116,99,111,100,101,96,64,61,49,50,10,10,92,102,105,10,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,80,108,117,115,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,43,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,83,113,117,97,114,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,67,105,114,99,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,111,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,84,114,105,97,110,103,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,116,114,105,97,110,103,108,101,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,80,101,110,116,97,103,111,110,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,112,101,110,116,97,103,111,110,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,115,113,117,97,114,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,42,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,99,105,114,99,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,42,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,116,114,105,97,110,103,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,116,114,105,97,110,103,108,101,42,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83])
-.concat([84,64,70,105,108,108,112,101,110,116,97,103,111,110,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,112,101,110,116,97,103,111,110,42,125,10,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,105,97,109,111,110,100,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,44,100,111,116,97,110,103,108,101,61,52,53,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,100,105,97,109,111,110,100,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,42,44,100,111,116,97,110,103,108,101,61,52,53,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,67,114,111,115,115,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,43,44,100,111,116,97,110,103,108,101,61,52,53,125,10,0,0,0,0,0,0,0,0,116,97,110,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,66,111,114,100,101,114,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,65,120,101,115,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,111,116,116,101,100,44,100,111,116,115,101,112,61,46,48,48,52,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,83,111,108,105,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,97,115,104,101,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,97,115,104,101,100,44,100,97,115,104,61,46,48,49,32,46,48,49,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,111,116,116,101,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,50,53,44,108,105,110,101,115,116,121,108,101,61,100,111,116,116,101,100,44,100,111,116,115,101,112,61,46,48,48,56,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,76,111,110,103,68,97,115,104,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,97,115,104,101,100,44,100,97,115,104,61,46,48,50,32,46,48,49,125,10,0,0,0,0,0,0,0,115,112,108,105,110,101,36,115,0,0,0,0,0,0,0,0,109,105,110,0,0,0,0,0,37,32,68,101,102,105,110,101,32,110,101,119,32,80,83,84,32,111,98,106,101,99,116,115,44,32,105,102,32,110,111,116,32,97,108,114,101,97,100,121,32,100,101,102,105,110,101,100,10,92,105,102,120,92,80,83,84,108,111,97,100,101,100,92,117,110,100,101,102,105,110,101,100,10,92,100,101,102,92,80,83,84,108,111,97,100,101,100,123,116,125,10,92,112,115,115,101,116,123,97,114,114,111,119,115,105,122,101,61,46,48,49,32,51,46,50,32,49,46,52,32,46,51,125,10,92,112,115,115,101,116,123,100,111,116,115,105,122,101,61,46,48,49,125,10,92,99,97,116,99,111,100,101,96,64,61,49,49,10,10,0,0,0,0,0,0,0,0,108,101,102,116,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,0,0,117,98,121,116,101,0,0,0,92,80,83,84,64,76,111,110,103,68,97,115,104,0,0,0,104,105,115,116,101,112,115,10,0,0,0,0,0,0,0,0,105,110,100,101,120,101,115,32,108,117,0,0,0,0,0,0,120,50,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,39,58,39,32,101,120,112,101,99,116,101,100,0,0,0,0,75,80,95,49,0,0,0,0,112,115,0,0,0,0,0,0,92,80,83,84,64,68,111,116,116,101,100,0,0,0,0,0,92,80,83,84,64,68,97,115,104,101,100,0,0,0,0,0,92,80,83,84,64,83,111,108,105,100,0,0,0,0,0,0,92,80,83,84,64,65,120,101,115,0,0,0,0,0,0,0,124,51,120,45,50,124,0,0,34,37,115,34,32,0,0,0,92,80,83,84,64,66,111,114,100,101,114,0,0,0,0,0,59,0,0,0,0,0,0,0,70,73,88,69,68,58,32,32,37,115,10,0,0,0,0,0,40,37,46,52,102,44,37,46,52,102,41,10,0,0,0,0,105,108,108,101,103,97,108,32,100,97,121,32,111,102,32,109,111,110,116,104,0,0,0,0,36,37,102,32,92,116,105,109,101,115,32,49,48,94,123,37,100,125,36,0,0,0,0,0,99,111,115,0,0,0,0,0,36,37,102,36,0,0,0,0,109,112,32,116,105,116,108,101,0,0,0,0,0,0,0,0,113,110,111,114,109,0,0,0,115,117,109,95,115,113,0,0,36,37,100,32,92,116,105,109,101,115,32,49,48,94,123,37,100,125,36,0,0,0,0,0,10,9,32,32,108,97,98,101,108,115,32,97,114,101,32,0,117,105,110,116,56,0,0,0,36,37,100,36,0,0,0,0,102,115,116,101,112,115,10,0,109,97,116,114,105,120,32,58,32,116,104,105,110,32,112,108,97,116,101,32,115,112,108,105,110,101,115,32,50,100,0,0,117,110,101,120,112,101,99,116,101,100,32,125,0,0,0,0,42,42,0,0,0,0,0,0,75,80,95,48,0,0,0,0,112,111,105,110,116,115,36,105,122,101,0,0,0,0,0,0,36,49,48,94,123,37,100,125,36,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,99,112,52,51,55,0,0,0,123,37,115,125,10,0,0,0,32,121,108,111,119,32,121,104,105,103,104,0,0,0,0,0,40,37,46,52,102,44,37,46,52,102,41,0,0,0,0,0,51,32,109,117,108,32,50,32,115,117,98,32,97,98,115,0,112,117,115,104,100,0,0,0,123,76,125,0,0,0,0,0,99,111,117,108,100,32,110,111,116,32,114,101,97,100,32,112,97,114,97,109,101,116,101,114,45,102,105,108,101,32,34,37,115,34,0,0,0,0,0,0,91,114,93,0,0,0,0,0,91,108,93,0,0,0,0,0,115,105,110,0,0,0,0,0,92,114,112,117,116,0,0,0,71,80,86,65,76,95,77,85,76,84,73,80,76,79,84,0,99,110,36,111,114,109,97,108,0,0,0,0,0,0,0,0,115,117,109,0,0,0,0,0,99,108,36,101,97,114,0,0,92,80,83,84,64,70,105,108,108,112,101,110,116,97,103,111,110,0,0,0,0,0,0,0,10,9,32,32,116,105,99,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,100,97,116,97,32,114,97,110,103,101,0,0,0,0,0,0,98,121,116,101,0,0,0,0,110,111,114,111,36,116,97,116,101,0,0,0,0,0,0,0,78,101,101,100,32,48,32,116,111,32,50,32,117,115,105,110,103,32,115,112,101,99,115,32,102,111,114,32,115,116,97,116,115,32,99,111,109,109,97,110,100,0,0,0,0,0,0,0,92,80,83,84,64,70,105,108,108,99,105,114,99,108,101,0,115,116,101,112,115,10,0,0,116,104,105,110,32,112,108,97,116,101,32,115,112,108,105,110,101,115,32,105,110,32,100,103,114,105,100,51,100,0,0,0,101,120,112,101,99,116,105,110,103,32,123,119,104,105,108,101,45,99,108,97,117,115,101,125,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,101,120,112,114,101,115,115,105,111,110,32,0,0,0,0,0,75,80,95,68,105,118,105,100,101,0,0,0,0,0,0,0,78,111,32,112,111,105,110,116,116,121,112,101,32,115,112,101,99,105,102,105,101,114,32,97,108,108,111,119,101,100,44,32,104,101,114,101,0,0,0,0,92,80,83,84,64,70,105,108,108,116,114,105,97,110,103,108,101,0,0,0,0,0,0,0,92,80,83,84,64,70,105,108,108,115,113,117,97,114,101,0,92,80,83,84,64,70,105,108,108,100,105,97,109,111,110,100,0,0,0,0,0,0,0,0,92,80,83,84,64,80,101,110,116,97,103,111,110,0,0,0,124,51,120,45,49,124,0,0,92,80,83,84,64,84,114,105,97,110,103,108,101,0,0,0,102,105,116,116,101,100,32,112,97,114,97,109,101,116,101,114,115,32,97,110,100,32,105,110,105,116,105,97,108,32,118,97,108,117,101,115,32,102,114,111,109,32,102,105,108,101,58,32,37,115,10,10,0,0,0,0,92,80,83,84,64,67,105,114,99,108,101,0,0,0,0,0,92,80,83,84,64,67,114,111,115,115,0,0,0,0,0,0,99,111,110,106,103,0,0,0,92,80,83,84,64,83,113,117,97,114,101,0,0,0,0,0,105,110,118,97,108,105,100,32,111,114,32,100,117,112,108,105,99,97,116,101,32,111,112,116,105,111,110,0,0,0,0,0,107,36,100,101,110,115,105,116,121,0,0,0,0,0,0,0,115,116,100,100,101,118,0,0,92,80,83,84,64,80,108,117,115,0,0,0,0,0,0,0,32,97,110,100,32,109,105,114,114,111,114,101,100,32,111,110,32,111,112,112,111,115,105,116,101,32,98,111,114,100,101,114,0,0,0,0,0,0,0,0,105,110,116,56,0,0,0,0,92,80,83,84,64,68,105,97,109,111,110,100,0,0,0,0,105,110,112,117,116,32,108,105,110,101,32,99,111,112,121,0,114,111,36,116,97,116,101,0,32,37,100,10,0,0,0,0,98,111,120,120,121,101,114,114,111,114,98,97,114,115,10,0,71,114,105,100,100,105,110,103,32,111,102,32,116,104,101,32,99,111,108,111,114,32,99,111,108,117,109,110,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,101,120,112,101,99,116,105,110,103,32,123,100,111,45,99,108,97,117,115,101,125,0,0,0,98,105,110,0,0,0,0,0,83,107,105,112,112,105,110,103,32,100,97,116,97,32,102,105,108,101,32,119,105,116,104,32,110,111,32,118,97,108,105,100,32,112,111,105,110,116,115,0,37,115,40,37,46,52,102,44,37,46,52,102,41,10,0,0,75,80,95,68,101,99,105,109,97,108,0,0,0,0,0,0,32,43,37,100,10,0,0,0,92,113,100,105,115,107,40,37,46,52,102,44,37,46,52,102,41,123,37,46,52,102,125,10,0,0,0,0,0,0,0,0,99,111,110,116,111,117,114,32,100,101,108,116,97,95,116,0,32,40,117,110,100,101,102,105,110,101,100,41,10,0,0,0,97,100,100,95,116,105,99,95,117,115,101,114,58,32,108,105,115,116,32,115,111,114,116,32,101,114,114,111,114,0,0,0,123,45,62,125,0,0,0,0,35,32,115,101,116,32,111,117,116,112,117,116,32,39,37,115,39,10,0,0,0,0,0,0,32,37,99,32,100,117,109,109,121,10,0,0,0,0,0,0,92,80,83,84,64,65,114,114,111,119,37,115,40,37,46,52,102,44,37,46,52,102,41,40,37,46,52,102,44,37,46,52,102,41,10,0,0,0,0,0,102,117,110,99,116,105,111,110,32,116,111,32,112,108,111,116,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,32,37,115,10,0,0,0,0,51,32,109,117,108,32,49,32,115,117,98,32,97,98,115,0,92,100,101,102,92,112,111,108,121,112,109,73,73,73,100,35,49,123,92,112,115,112,111,108,121,103,111,110,91,108,105,110,101,115,116,121,108,101,61,110,111,110,101,44,102,105,108,108,115,116,121,108,101,61,115,111,108,105,100,44,102,105,108,108,99,111,108,111,114,61,80,83,84,64,67,79,76,79,82,35,49,93,125,10,10,0,0,0,10,9,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,85,115,97,103,101,58,32,103,110,117,112,108,111,116,32,91,79,80,84,73,79,78,93,46,46,46,32,91,70,73,76,69,93,10,32,32,45,86,44,32,45,45,118,101,114,115,105,111,110,10,32,32,45,104,44,32,45,45,104,101,108,112,10,32,32,45,112,32,32,45,45,112,101,114,115,105,115,116,10,32,32,45,100,32,32,45,45,100,101,102,97,117,108,116,45,115,101,116,116,105,110,103,115,10,32,32,45,101,32,32,34,99,111,109,109,97,110,100,49,59,32,99,111,109,109,97,110,100,50,59,32,46,46,46,34,10,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,0,0,0,0,0,0,0,92,110,101,119,114,103,98,99,111,108,111,114,123,80,83,84,64,67,79,76,79,82,37,100,125,123,37,103,32,37,103,32,37,103,125,10,0,0,0,0,102,105,116,32,112,97,114,97,109,0,0,0,0,0,0,0,32,40,102,105,120,109,97,120,41,0,0,0,0,0,0,0,112,101,114,109,95,97,116,0,92,110,101,119,103,114,97,121,123,80,83,84,64,67,79,76,79,82,37,100,125,123,37,103,125,10,0,0,0,0,0,0,32,40,102,105,120,109,105,110,41,0,0,0,0,0,0,0,112,115,116,114,105,99,107,115,58,32,80,97,108,101,116,116,101,32,117,115,101,100,32,98,101,102,111,114,101,32,115,101,116,33,10,0,0,0,0,0,97,114,103,0,0,0,0,0,32,40,109,97,120,41,0,0,101,120,112,101,99,116,105,110,103,32,60,121,111,102,102,115,101,116,62,0,0,0,0,0,40,37,46,52,103,44,37,46,52,103,41,0,0,0,0,0,99,117,109,36,117,108,97,116,105,118,101,0,0,0,0,0,109,101,97,110,0,0,0,0,109,111,117,115,101,46,99,0,103,110,117,112,108,111,116,62,32,0,0,0,0,0,0,0,32,40,109,105,110,41,0,0,111,110,32,98,111,114,100,101,114,0,0,0,0,0,0,0,108,102,0,0,0,0,0,0,92,112,111,108,121,112,109,73,73,73,100,123,37,100,125,0,9,37,115,58,32,37,115,37,115,37,115,37,115,37,115,44,32,0,0,0,0,0,0,0,98,111,120,101,114,114,111,114,98,97,114,115,10,0,0,0,78,111,32,117,115,97,98,108,101,32,100,97,116,97,32,105,110,32,116,104,105,115,32,112,108,111,116,32,116,111,32,97,117,116,111,45,115,99,97,108,101,32,97,120,105,115,32,114,97,110,103,101,0,0,0,0,99,97,108,108,95,97,114,103,99,32,62,61,32,48,32,38,38,32,99,97,108,108,95,97,114,103,99,32,60,61,32,57,0,0,0,0,0,0,0,0,101,108,115,101,32,119,105,116,104,111,117,116,32,105,102,0,78,101,101,100,32,117,115,105,110,103,32,115,112,101,99,32,102,111,114,32,121,32,116,105,109,101,32,100,97,116,97,0,99,111,108,117,109,110,0,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,73,110,118,101,114,116,95,82,116,82,0,0,0,99,98,111,120,0,0,0,0,115,112,108,105,110,101,32,104,101,108,112,32,109,97,116,114,105,120,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,117,115,105,110,103,32,84,69,88,68,82,65,87,32,109,97,99,114,111,115,10,0,75,80,95,83,117,98,116,114,97,99,116,0,0,0,0,0,115,112,114,105,110,116,102,95,115,112,101,99,105,102,105,101,114,58,32,110,111,32,102,111,114,109,97,116,32,115,112,101,99,105,102,105,101,114,10,0,9,97,117,116,111,115,99,97,108,105,110,103,32,105,115,32,0,0,0,0,0,0,0,0,92,101,110,100,123,116,101,120,100,114,97,119,125,10,0,0,114,97,110,103,101,32,115,112,101,99,105,102,105,101,114,115,32,111,102,32,115,117,109,32,109,117,115,116,32,104,97,118,101,32,105,110,116,101,103,101,114,32,118,97,108,117,101,115,0,0,0,0,0,0,0,0,9,101,114,114,111,114,115,32,97,114,101,32,112,108,111,116,116,101,100,32,119,105,116,104,111,117,116,32,98,97,114,115,10,0,0,0,0,0,0,0,40,37,100,32,37,100,41,0,9,101,114,114,111,114,98,97,114,115,32,97,114,101,32,112,108,111,116,116,101,100,32,105,110,32,37,115,32,119,105,116,104,32,98,97,114,115,32,111,102,32,115,105,122,101,32,37,102,10,0,0,0,0,0,0,10,92,99,112,97,116,104,32,0,0,0,0,0,0,0,0,9,98,111,114,100,101,114,32,37,100,32,105,115,32,100,114,97,119,110,32,105,110,32,37,115,32,111,102,32,116,104,101,32,112,108,111,116,32,101,108,101,109,101,110,116,115,32,119,105,116,104,10,9,32,0,0,51,120,45,50,0,0,0,0,92,112,97,116,104,32,40,37,100,32,37,100,41,0,0,0,9,98,111,114,100,101,114,32,105,115,32,110,111,116,32,100,114,97,119,110,10,0,0,0,92,108,105,110,101,119,100,32,37,100,10,0,0,0,0,0,78,101,101,100,32,118,105,97,32,97,110,100,32,101,105,116,104,101,114,32,112,97,114,97,109,101,116,101,114,32,108,105,115,116,32,111,114,32,102,105,108,101,0,0,0,0,0,0,114,101,108,97,116,105,118,101,0,0,0,0,0,0,0,0,92,37,99,116,101,120,116,123,37,115,125,10,0,0,0,0,97,98,115,111,108,117,116,101,0,0,0,0,0,0,0,0,92,116,101,120,116,114,101,102,32,104,58,82,32,118,58,67,32,0,0,0,0,0,0,0,105,109,97,103,0,0,0,0,9,98,111,120,119,105,100,116,104,32,105,115,32,37,103,32,37,115,10,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,60,121,115,99,97,108,101,62,0,0,0,0,0,0,92,116,101,120,116,114,101,102,32,104,58,76,32,118,58,67,32,0,0,0,0,0,0,0,102,36,114,101,113,117,101,110,99,121,0,0,0,0,0,0,37,115,37,115,9,37,102,10,0,0,0,0,0,0,0,0,9,98,111,120,119,105,100,116,104,32,105,115,32,97,117,116,111,10,0,0,0,0,0,0,32,97,110,100,32,109,105,114,114,111,114,101,100,32,37,115,0,0,0,0,0,0,0,0,100,111,117,98,108,101,0,0,92,109,111,118,101,32,40,37,100,32,37,100,41,0,0,0,115,99,36,97,108,101,0,0,9,110,111,116,32,100,114,97,119,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,116,119,111,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,87,114,111,110,103,32,110,117,109,98,101,114,32,111,102,32,99,111,108,117,109,110,115,32,105,110,32,105,110,112,117,116,32,100,97,116,97,32,45,32,108,105,110,101,32,37,100,0,73,110,118,97,108,105,100,32,123,101,108,115,101,45,99,108,97,117,115,101,125,0,0,0,119,111,114,100,115,0,0,0,92,102,99,105,114,32,102,58,48,46,57,32,114,58,49,54,0,0,0,0,0,0,0,0,75,80,95,83,101,112,97,114,97,116,111,114,0,0,0,0,115,112,114,105,110,116,102,95,115,112,101,99,105,102,105,101,114,58,32,117,115,101,100,32,119,105,116,104,32,105,110,118,97,108,105,100,32,102,111,114,109,97,116,32,115,112,101,99,105,102,105,101,114,10,0,0,9,100,114,97,119,105,110,103,32,97,110,100,32,99,108,105,112,112,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,116,119,111,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,92,102,99,105,114,32,102,58,48,46,57,32,114,58,49,50,0,0,0,0,0,0,0,0,9,110,111,116,32,100,114,97,119,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,105,110,114,97,110,103,101,32,97,110,100,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,92,102,99,105,114,32,102,58,48,46,57,32,114,58,57,0,9,100,114,97,119,105,110,103,32,97,110,100,32,99,108,105,112,112,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,105,110,114,97,110,103,101,32,97,110,100,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,92,108,99,105,114,32,114,58,49,54,0,0,0,0,0,0,9,112,111,105,110,116,32,99,108,105,112,32,105,115,32,37,115,10,0,0,0,0,0,0,51,32,109,117,108,32,50,32,115,117,98,0,0,0,0,0,92,108,99,105,114,32,114,58,49,50,0,0,0,0,0,0,9,99,111,110,116,111,117,114,32,108,105,110,101,32,116,121,112,101,115,32,97,114,101,32,97,108,108,32,116,104,101,32,115,97,109,101,10,0,0,0,92,108,99,105,114,32,114,58,57,0,0,0,0,0,0,0,118,105,97,0,0,0,0,0,9,99,111,110,116,111,117,114,32,108,105,110,101,32,116,121,112,101,115,32,97,114,101,32,118,97,114,105,101,100,32,38,32,108,97,98,101,108,101,100,32,119,105,116,104,32,102,111,114,109,97,116,32,39,37,115,39,10,0,0,0,0,0,0,92,104,116,101,120,116,123,36,92,115,116,97,114,36,125,0,9,9,37,100,32,105,110,99,114,101,109,101,110,116,97,108,32,108,101,118,101,108,115,32,115,116,97,114,116,105,110,103,32,97,116,32,37,103,44,32,115,116,101,112,32,37,103,44,32,101,110,100,32,37,103,10,0,0,0,0,0,0,0,0,92,104,116,101,120,116,123,36,92,116,114,105,97,110,103,108,101,36,125,0,0,0,0,0,98,101,108,111,119,0,0,0,114,101,97,108,0,0,0,0,44,37,103,32,0,0,0,0,111,110,108,121,32,118,97,108,105,100,32,97,115,32,112,97,114,116,32,111,102,32,97,110,32,97,117,116,111,45,108,97,121,111,117,116,32,99,111,109,109,97,110,100,0,0,0,0,92,104,116,101,120,116,123,36,92,116,105,109,101,115,36,125,0,0,0,0,0,0,0,0,97,98,111,118,101,0,0,0,117,36,110,105,113,117,101,0,37,49,49,46,53,101,0,0,111,110,32,97,120,105,115,0,102,0,0,0,0,0,0,0,92,114,109,111,118,101,40,48,32,52,41,92,104,116,101,120,116,123,36,92,66,111,120,36,125,0,0,0,0,0,0,0,111,117,116,36,119,97,114,100,115,0,0,0,0,0,0,0,9,9,37,100,32,100,105,115,99,114,101,116,101,32,108,101,118,101,108,115,32,97,116,32,0,0,0,0,0,0,0,0,100,97,116,97,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,85,110,107,110,111,119,110,32,109,97,112,112,105,110,103,32,116,121,112,101,0,0,0,0,79,108,100,45,115,116,121,108,101,32,105,102,47,101,108,115,101,32,115,116,97,116,101,109,101,110,116,32,101,110,99,111,117,110,116,101,114,101,100,32,105,110,115,105,100,101,32,98,114,97,99,107,101,116,115,0,78,101,119,32,104,105,115,116,111,103,114,97,109,0,0,0,115,112,114,105,110,116,102,0,92,104,116,101,120,116,123,36,43,36,125,0,0,0,0,0,75,80,95,65,100,100,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,112,114,105,110,116,102,95,115,112,101,99,105,102,105,101,114,32,99,97,108,108,101,100,32,119,105,116,104,111,117,116,32,39,37,39,10,0,0,0,9,9,97,112,112,114,111,120,46,32,37,100,32,97,117,116,111,109,97,116,105,99,32,108,101,118,101,108,115,10,0,0,92,114,109,111,118,101,40,48,32,52,41,92,104,116,101,120,116,123,36,92,68,105,97,109,111,110,100,36,125,0,0,0,121,50,0,0,0,0,0,0,9,9,97,115,32,98,115,112,108,105,110,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,101,103,109,101,110,116,115,32,111,102,32,111,114,100,101,114,32,37,100,32,119,105,116,104,32,37,100,32,112,116,115,10,0,0,0,0,92,104,116,101,120,116,123,36,92,99,100,111,116,36,125,0,120,50,0,0,0,0,0,0,9,9,97,115,32,99,117,98,105,99,32,115,112,108,105,110,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,115,101,103,109,101,110,116,115,32,119,105,116,104,32,37,100,32,112,116,115,10,0,0,0,92,116,101,120,116,114,101,102,32,104,58,67,32,118,58,67,32,0,0,0,0,0,0,0,121,49,0,0,0,0,0,0,9,9,97,115,32,108,105,110,101,97,114,32,115,101,103,109,101,110,116,115,10,0,0,0,67,97,110,39,116,32,117,115,101,32,112,109,51,100,32,102,111,114,32,50,100,32,112,108,111,116,115,0,0,0,0,0,51,120,45,49,0,0,0,0,92,109,111,118,101,32,40,37,100,32,37,100,41,10,0,0,120,49,0,0,0,0,0,0,103,114,105,100,32,98,97,115,101,32,97,110,100,32,115,117,114,102,97,99,101,10,0,0,92,109,111,118,101,32,40,37,100,32,37,100,41,92,37,99,118,101,99,32,40,37,100,32,37,100,41,0,0,0,0,0,99,36,108,111,115,101,100,0,102,117,110,99,116,105,111,110,32,117,115,101,100,32,102,111,114,32,102,105,116,116,105,110,103,58,32,37,115,10,0,0,115,117,114,102,97,99,101,10,0,0,0,0,0,0,0,0,10,10,102,111,110,116,95,105,100,101,110,116,105,102,105,101,114,58,61,34,71,78,85,80,76,79,84,34,59,10,102,111,110,116,95,115,105,122,101,32,55,50,112,116,35,59,10,116,104,35,61,48,46,52,112,116,35,59,32,100,101,102,105,110,101,95,119,104,111,108,101,95,112,105,120,101,108,115,40,116,104,41,59,10,10,112,97,116,104,32,97,114,114,111,119,104,101,97,100,59,10,97,114,114,111,119,104,101,97,100,32,61,32,40,45,55,112,116,44,45,50,112,116,41,123,100,105,114,51,48,125,46,46,40,45,54,112,116,44,48,112,116,41,46,46,123,100,105,114,49,53,48,125,40,45,55,112,116,44,50,112,116,41,32,38,10,32,32,40,45,55,112,116,44,50,112,116,41,45,45,40,48,112,116,44,48,112,116,41,45,45,40,45,55,112,116,44,45,50,112,116,41,32,38,32,99,121,99,108,101,59,10,0,0,0,0,101,108,108,36,105,112,115,101,115,0,0,0,0,0,0,0,103,114,105,100,32,98,97,115,101,10,0,0,0,0,0,0,10,100,101,102,32,101,110,100,99,104,97,114,32,61,10,32,32,37,32,78,101,120,116,32,108,105,110,101,32,115,104,111,117,108,100,32,112,114,111,98,97,98,108,121,32,98,101,32,114,101,109,111,118,101,100,32,105,102,32,67,77,32,98,97,115,101,32,105,115,32,117,115,101,100,10,32,32,108,58,61,48,59,32,114,58,61,119,59,10,32,32,37,73,110,99,108,117,100,101,32,116,104,101,32,110,101,120,116,32,116,119,111,32,108,105,110,101,115,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,10,32,32,37,114,111,116,97,116,101,32,116,104,101,32,112,105,99,116,117,114,101,32,57,48,32,100,101,103,46,40,80,111,114,116,114,97,105,116,32,116,111,32,76,97,110,100,115,99,97,112,101,41,10,32,32,37,99,117,114,114,101,110,116,112,105,99,116,117,114,101,58,61,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,114,111,116,97,116,101,100,32,57,48,32,115,104,105,102,116,101,100,32,40,104,44,48,41,59,10,32,32,37,116,109,112,58,61,99,104,97,114,104,116,59,32,99,104,97,114,104,116,58,61,99,104,97,114,119,100,59,32,99,104,97,114,119,100,58,61,116,109,112,59,10,32,32,115,99,97,110,116,111,107,101,110,115,32,101,120,116,114,97,95,101,110,100,99,104,97,114,59,10,32,32,105,102,32,112,114,111,111,102,105,110,103,62,48,58,32,109,97,107,101,98,111,120,40,112,114,111,111,102,114,117,108,101,41,59,32,102,105,10,32,32,99,104,97,114,100,120,58,61,119,59,10,32,32,115,104,105,112,105,116,59,10,32,32,105,102,32,100,105,115,112,108,97,121,105,110,103,62,48,58,32,109,97,107,101,98,111,120,40,115,99,114,101,101,110,114,117,108,101,41,59,32,115,104,111,119,105,116,59,32,102,105,10,32,32,101,110,100,103,114,111,117,112,32,10,101,110,100,100,101,102,59,10,108,101,116,32,101,110,100,99,104,97,114,95,32,61,32,101,110,100,99,104,97,114,59,10,108,101,116,32,103,101,110,101,114,97,116,101,32,61,32,105,110,112,117,116,59,10,108,101,116,32,114,111,109,97,110,32,61,32,114,111,109,97,110,59,10,0,99,105,114,36,99,108,101,115,0,0,0,0,0,0,0,0,51,100,112,108,111,116,0,0,116,105,109,101,99,111,108,117,109,110,0,0,0,0,0,0,32,105,110,32,37,100,32,108,101,118,101,108,115,32,111,110,32,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,60,110,117,109,95,99,111,108,115,62,0,0,0,0,10,99,109,99,104,97,114,32,34,80,101,114,105,111,100,34,59,10,32,32,110,117,109,101,114,105,99,32,100,111,116,95,100,105,97,109,35,59,32,100,111,116,95,100,105,97,109,35,58,61,105,102,32,109,111,110,111,115,112,97,99,101,58,32,53,47,52,32,102,105,92,32,100,111,116,95,115,105,122,101,35,59,10,32,32,100,101,102,105,110,101,95,119,104,111,108,101,95,98,108,97,99,107,101,114,95,112,105,120,101,108,115,40,100,111,116,95,100,105,97,109,41,59,10,32,32,98,101,103,105,110,99,104,97,114,40,34,46,34,44,53,117,35,44,100,111,116,95,100,105,97,109,35,44,48,41,59,10,32,32,97,100,106,117,115,116,95,102,105,116,40,48,44,48,41,59,32,112,105,99,107,117,112,32,102,105,110,101,46,110,105,98,59,10,32,32,112,111,115,49,40,100,111,116,95,100,105,97,109,44,48,41,59,32,112,111,115,50,40,100,111,116,95,100,105,97,109,44,57,48,41,59,10,32,32,108,102,116,32,120,49,108,61,104,114,111,117,110,100,40,46,53,119,45,46,53,100,111,116,95,100,105,97,109,41,59,32,98,111,116,32,121,50,108,61,48,59,32,122,49,61,122,50,59,32,100,111,116,40,49,44,50,41,59,9,37,32,100,111,116,10,32,32,112,101,110,108,97,98,101,108,115,40,49,44,50,41,59,10,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,0,114,103,98,97,36,108,112,104,97,0,0,0,0,0,0,0,115,36,98,101,122,105,101,114,0,0,0,0,0,0,0,0,37,49,49,46,52,102,0,0,110,111,116,32,100,114,97,119,110,10,0,0,0,0,0,0,79,70,70,10,0,0,0,0,102,108,111,97,116,0,0,0,105,110,112,117,116,32,99,109,114,49,48,46,109,102,10,105,102,32,108,105,103,115,62,49,58,32,102,111,110,116,95,99,111,100,105,110,103,95,115,99,104,101,109,101,58,61,34,84,101,88,32,116,101,120,116,34,59,10,32,32,115,112,97,110,105,115,104,95,115,104,114,105,101,107,61,111,99,116,34,48,55,52,34,59,32,115,112,97,110,105,115,104,95,113,117,101,114,121,61,111,99,116,34,48,55,54,34,59,10,101,108,115,101,58,32,102,111,110,116,95,99,111,100,105,110,103,95,115,99,104,101,109,101,58,61,10,32,32,105,102,32,108,105,103,115,61,48,58,32,34,84,101,88,32,116,121,112,101,119,114,105,116,101,114,32,116,101,120,116,34,10,32,32,101,108,115,101,58,32,34,84,101,88,32,116,101,120,116,32,119,105,116,104,111,117,116,32,102,45,108,105,103,97,116,117,114,101,115,34,32,102,105,59,10,32,32,115,112,97,110,105,115,104,95,115,104,114,105,101,107,61,111,99,116,34,48,49,54,34,59,32,115,112,97,110,105,115,104,95,113,117,101,114,121,61,111,99,116,34,48,49,55,34,59,32,102,105,10,102,111,110,116,95,115,101,116,117,112,59,10,105,110,112,117,116,32,114,111,109,97,110,117,46,109,102,32,37,82,111,109,97,110,32,117,112,112,101,114,99,97,115,101,46,10,105,110,112,117,116,32,114,111,109,97,110,108,46,109,102,32,37,82,111,109,97,110,32,108,111,119,101,114,99,97,115,101,46,10,105,110,112,117,116,32,103,114,101,101,107,117,46,109,102,32,37,71,114,101,101,107,32,117,112,112,101,114,99,97,115,101,46,10,105,110,112,117,116,32,114,111,109,97,110,100,46,109,102,32,37,78,117,109,101,114,97,108,115,46,10,105,110,112,117,116,32,114,111,109,97,110,112,46,109,102,32,37,65,109,112,101,114,115,97,110,100,44,32,113,117,101,115,116,105,111,110,32,109,97,114,107,115,44,32,99,117,114,114,101,110,99,121,32,115,105,103,110,46,10,105,110,112,117,116,32,114,111,109,115,112,108,46,109,102,32,37,76,111,119,101,114,99,97,115,101,32,115,112,101,99,105,97,108,115,32,40,100,111,116,108,101,115,115,32,92,105,44,32,108,105,103,97,116,117,114,101,32,92,97,101,44,32,101,116,99,46,41,10,105,110,112,117,116,32,114,111,109,115,112,117,46,109,102,32,37,85,112,112,101,114,99,97,115,101,32,115,112,101,99,105,97,108,115,32,40,92,65,69,44,32,92,79,69,44,32,92,79,41,10,105,110,112,117,116,32,112,117,110,99,116,46,109,102,32,37,80,117,110,99,116,117,97,116,105,111,110,32,115,121,109,98,111,108,115,46,10,10,109,105,110,117,115,61,65,83,67,73,73,34,45,34,59,32,99,109,99,104,97,114,32,34,77,105,110,117,115,32,115,105,103,110,34,59,10,32,98,101,103,105,110,97,114,105,116,104,99,104,97,114,40,109,105,110,117,115,41,59,32,10,32,32,112,105,99,107,117,112,32,114,117,108,101,46,110,105,98,59,10,32,32,108,102,116,32,120,49,61,104,114,111,117,110,100,32,49,46,53,117,45,101,112,115,59,10,32,32,120,50,61,119,45,120,49,59,32,121,49,61,121,50,61,109,97,116,104,95,97,120,105,115,59,10,32,32,100,114,97,119,32,122,49,45,45,122,50,59,9,32,37,32,98,97,114,10,32,32,108,97,98,101,108,115,40,49,44,50,41,59,32,10,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,0,114,103,98,105,109,97,36,103,101,0,0,0,0,0,0,0,105,110,36,119,97,114,100,115,0,0,0,0,0,0,0,0,9,99,111,110,116,111,117,114,32,102,111,114,32,115,117,114,102,97,99,101,115,32,97,114,101,32,37,115,0,0,0,0,102,105,108,108,101,100,99,117,114,118,101,115,32,0,0,0,78,101,101,100,32,50,32,111,114,32,51,32,99,111,108,117,109,110,115,0,0,0,0,0,99,108,97,117,115,101,0,0,76,111,103,32,115,99,97,108,101,32,111,110,32,89,32,105,115,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,115,116,97,99,107,101,100,32,104,105,115,116,111,103,114,97,109,32,112,108,111,116,10,0,0,0,0,0,80,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,10,100,101,102,32,101,110,100,99,104,97,114,32,61,10,32,32,114,91,99,104,97,114,99,111,100,101,93,58,61,99,117,114,114,101,110,116,112,105,99,116,117,114,101,59,10,32,32,119,100,91,99,104,97,114,99,111,100,101,93,58,61,119,59,104,116,91,99,104,97,114,99,111,100,101,93,58,61,104,59,100,112,91,99,104,97,114,99,111,100,101,93,58,61,100,59,10,32,32,109,101,115,115,97,103,101,32,34,80,105,99,116,117,114,101,32,111,102,32,99,104,97,114,99,111,100,101,32,110,111,46,34,32,38,32,100,101,99,105,109,97,108,32,99,104,97,114,99,111,100,101,59,10,32,32,101,110,100,103,114,111,117,112,59,10,101,110,100,100,101,102,59,10,108,101,116,32,101,110,100,99,104,97,114,95,32,61,32,101,110,100,99,104,97,114,59,10,108,101,116,32,103,101,110,101,114,97,116,101,32,61,32,114,101,108,97,120,59,10,108,101,116,32,114,111,109,97,110,32,61,32,114,101,108,97,120,59,10,0,0,105,109,97,36,103,101,0,0,75,80,95,77,117,108,116,105,112,108,121,0,0,0,0,0,118,97,114,36,105,97,98,108,101,0,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,97,115,115,105,103,110,32,116,111,32,115,111,109,101,116,104,105,110,103,32,111,116,104,101,114,32,116,104,97,110,32,97,32,110,97,109,101,100,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,100,105,115,97,98,108,101,100,10,0,0,0,0,0,0,0,10,100,101,102,32,112,117,116,95,116,101,120,116,40,101,120,112,114,32,116,115,44,120,115,116,97,114,116,44,121,115,116,97,114,116,44,114,111,116,44,106,117,115,116,105,102,105,99,97,116,105,111,110,41,32,61,10,32,32,98,101,103,105,110,103,114,111,117,112,10,32,32,32,32,116,101,120,116,95,119,105,100,116,104,58,61,48,59,116,101,120,116,95,104,101,105,103,104,116,58,61,48,59,116,101,120,116,95,100,101,112,116,104,58,61,48,59,10,32,32,32,32,102,111,114,32,105,110,100,58,61,48,32,115,116,101,112,32,49,32,117,110,116,105,108,32,108,101,110,103,116,104,40,116,115,41,45,49,58,10,32,32,32,32,32,32,100,101,99,95,110,117,109,58,61,65,83,67,73,73,32,115,117,98,115,116,114,105,110,103,32,40,105,110,100,44,105,110,100,43,49,41,32,111,102,32,116,115,59,10,32,32,32,32,32,32,105,102,32,117,110,107,110,111,119,110,32,114,91,100,101,99,95,110,117,109,93,58,32,100,101,99,95,110,117,109,58,61,51,50,59,32,102,105,10,32,32,32,32,32,32,105,102,32,100,101,99,95,110,117,109,61,51,50,58,32,10,32,32,32,32,32,32,32,32,116,101,120,116,95,119,105,100,116,104,58,61,116,101,120,116,95,119,105,100,116,104,43,119,100,91,54,53,93,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,104,101,105,103,104,116,58,61,109,97,120,40,116,101,120,116,95,104,101,105,103,104,116,44,104,116,91,54,53,93,41,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,100,101,112,116,104,58,61,109,97,120,40,116,101,120,116,95,100,101,112,116,104,44,100,112,91,54,53,93,41,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,100,101,99,95,110,117,109,62,61,48,58,32,10,32,32,32,32,32,32,32,32,116,101,120,116,95,119,105,100,116,104,58,61,116,101,120,116,95,119,105,100,116,104,43,119,100,91,100,101,99,95,110,117,109,93,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,104,101,105,103,104,116,58,61,109,97,120,40,116,101,120,116,95,104,101,105,103,104,116,44,104,116,91,100,101,99,95,110,117,109,93,41,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,100,101,112,116,104,58,61,109,97,120,40,116,101,120,116,95,100,101,112,116,104,44,100,112,91,100,101,99,95,110,117,109,93,41,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,101,110,100,102,111,114,10,32,32,32,32,105,102,32,114,111,116,61,57,48,58,10,32,32,32,32,32,32,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,49,58,32,121,110,101,120,116,58,61,121,115,116,97,114,116,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,50,58,32,121,110,101,120,116,58,61,114,111,117,110,100,40,121,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,47,50,41,59,10,32,32,32,32,32,32,101,108,115,101,58,32,121,110,101,120,116,58,61,114,111,117,110,100,40,121,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,41,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,32,32,120,110,101,120,116,58,61,120,115,116,97,114,116,43,40,116,101,120,116,95,104,101,105,103,104,116,45,116,101,120,116,95,100,101,112,116,104,41,47,50,59,10,32,32,32,32,101,108,115,101,58,10,32,32,32,32,32,32,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,49,58,32,120,110,101,120,116,58,61,120,115,116,97,114,116,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,50,58,32,120,110,101,120,116,58,61,114,111,117,110,100,40,120,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,47,50,41,59,10,32,32,32,32,32,32,101,108,115,101,58,32,120,110,101,120,116,58,61,114,111,117,110,100,40,120,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,41,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,32,32,121,110,101,120,116,58,61,121,115,116,97,114,116,45,40,116,101,120,116,95,104,101,105,103,104,116,45,116,101,120,116,95,100,101,112,116,104,41,47,50,59,10,32,32,32,32,102,105,10,32,32,32,32,102,111,114,32,105,110,100,58,61,48,32,115,116,101,112,32,49,32,117,110,116,105,108,32,108,101,110,103,116,104,40,116,115,41,45,49,58,10,32,32,32,32,32,32,100,101,99,95,110,117,109,58,61,65,83,67,73,73,32,115,117,98,115,116,114,105,110,103,32,40,105,110,100,44,105,110,100,43,49,41,32,111,102,32,116,115,59,10,32,32,32,32,32,32,105,102,32,117,110,107,110,111,119,110,32,114,91,100,101,99,95,110,117,109,93,58,32,100,101,99,95,110,117,109,58,61,51,50,59,32,102,105,10,32,32,32,32,32,32,105,102,32,100,101,99,95,110,117,109,61,51,50,58,32,10,32,32,32,32,32,32,32,32,120,110,101,120,116,58,61,120,110,101,120,116,43,119,100,91,54,53,93,42,99,111,115,100,32,114,111,116,59,10,32,32,32,32,32,32,32,32,121,110,101,120,116,58,61,121,110,101,120,116,43,119,100,91,54,53,93,42,115,105,110,100,32,114,111,116,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,100,101,99,95,110,117,109,62,61,48,58,32,10,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,58,61,99,117,114,114,101,110,116,112,105,99,116,117,114,101,43,114,91,100,101,99,95,110,117,109,93,32,115,104,105,102,116,101,100,40,120,110,101,120,116,44,121,110,101,120,116,41,10,32,32,32,32,32,32,32,32,32,32,114,111,116,97,116,101,100,97,114,111,117,110,100,32,40,40,120,110,101,120,116,44,121,110,101,120,116,41,44,114,111,116,41,59,32,10,32,32,32,32,32,32,32,32,120,110,101,120,116,58,61,120,110,101,120,116,43,119,100,91,100,101,99,95,110,117,109,93,42,99,111,115,100,32,114,111,116,59,10,32,32,32,32,32,32,32,32,121,110,101,120,116,58,61])
-.concat([121,110,101,120,116,43,119,100,91,100,101,99,95,110,117,109,93,42,115,105,110,100,32,114,111,116,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,101,110,100,102,111,114,10,32,32,101,110,100,103,114,111,117,112,32,10,101,110,100,100,101,102,59,10,0,0,0,0,108,97,98,101,108,115,0,0,44,32,107,100,101,110,115,105,116,121,50,100,32,109,111,100,101,0,0,0,0,0,0,0,99,111,108,111,114,32,97,120,105,115,0,0,0,0,0,0,10,37,73,110,99,108,117,100,101,32,110,101,120,116,32,101,105,103,104,116,32,108,105,110,101,115,32,105,102,32,121,111,117,32,104,97,118,101,32,112,114,111,98,108,101,109,115,32,119,105,116,104,32,116,104,101,32,109,111,100,101,32,111,110,32,121,111,117,114,32,115,121,115,116,101,109,46,46,10,37,112,114,111,111,102,105,110,103,58,61,48,59,10,37,102,111,110,116,109,97,107,105,110,103,58,61,49,59,10,37,116,114,97,99,105,110,103,116,105,116,108,101,115,58,61,48,59,10,37,112,105,120,101,108,115,95,112,101,114,95,105,110,99,104,58,61,51,48,48,59,10,37,98,108,97,99,107,101,114,58,61,48,59,10,37,102,105,108,108,105,110,58,61,46,50,59,10,37,111,95,99,111,114,114,101,99,116,105,111,110,58,61,46,54,59,10,37,102,105,120,95,117,110,105,116,115,59,10,0,0,0,0,0,0,0,0,99,97,110,36,100,108,101,115,116,105,99,107,115,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,107,101,114,110,101,108,61,37,115,44,10,9,115,99,97,108,101,32,102,97,99,116,111,114,115,32,120,61,37,102,44,32,121,61,37,102,37,115,10,0,105,102,32,117,110,107,110,111,119,110,32,99,109,98,97,115,101,58,32,105,110,112,117,116,32,99,109,98,97,115,101,32,102,105,10,10,116,114,97,99,105,110,103,115,116,97,116,115,58,61,49,59,10,112,105,99,116,117,114,101,32,114,91,93,59,10,10,100,101,102,32,111,112,101,110,105,116,32,61,32,111,112,101,110,119,105,110,100,111,119,32,99,117,114,114,101,110,116,119,105,110,100,111,119,10,32,32,102,114,111,109,32,40,48,44,48,41,32,116,111,32,40,52,48,48,44,56,48,48,41,32,97,116,32,40,45,53,48,44,53,48,48,41,32,101,110,100,100,101,102,59,10,10,109,111,100,101,95,115,101,116,117,112,59,10,0,0,0,102,105,110,36,97,110,99,101,98,97,114,115,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,115,112,108,105,110,101,115,10,0,0,0,0,0,0,0,0,51,32,109,117,108,32,49,32,115,117,98,0,0,0,0,0,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,118,101,99,36,116,111,114,115,0,0,0,0,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,110,111,114,109,61,37,100,10,0,0,0,0,0,0,0,0,68,97,109,97,103,101,100,32,69,68,70,32,104,101,97,100,101,114,32,111,102,32,37,115,58,32,110,111,116,32,109,117,108,116,105,112,108,101,32,111,102,32,53,49,50,32,66,46,10,0,0,0,0,0,0,0,97,58,61,119,47,37,100,59,98,58,61,104,47,37,100,59,10,0,0,0,0,0,0,0,104,105,115,36,116,101,112,115,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,114,101,115,105,100,117,97,108,115,32,97,114,101,32,119,101,105,103,104,116,101,100,32,101,113,117,97,108,108,121,32,40,117,110,105,116,32,119,101,105,103,104,116,41,10,10,0,0,9,99,111,109,109,97,110,100,32,108,105,110,101,32,109,97,99,114,111,115,32,119,105,108,108,32,37,115,98,101,32,101,120,112,97,110,100,101,100,10,0,0,0,0,0,0,0,0,65,115,115,101,114,116,105,111,110,32,102,97,105,108,101,100,58,32,37,115,0,0,0,0,10,10,98,101,103,105,110,99,104,97,114,40,37,100,44,37,103,105,110,35,44,37,103,105,110,35,44,48,41,59,10,0,102,115,36,116,101,112,115,0,99,121,108,105,110,100,114,105,99,97,108,10,0,0,0,0,100,114,97,119,32,40,37,100,97,44,37,100,98,41,45,45,40,37,100,97,44,37,100,98,41,59,10,0,0,0,0,0,102,105,108,108,115,116,36,101,112,115,0,0,0,0,0,0,118,97,108,105,100,0,0,0,115,112,104,101,114,105,99,97,108,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,44,32,60,110,117,109,95,99,111,108,115,62,39,0,0,0,0,0,0,0,0,100,114,97,119,100,111,116,32,40,37,100,97,44,37,100,98,41,59,10,0,0,0,0,0,115,116,36,101,112,115,0,0,99,36,115,112,108,105,110,101,115,0,0,0,0,0,0,0,32,32,83,117,109,32,120,121,58,32,32,32,32,32,32,32,37,46,52,103,10,0,0,0,99,97,114,116,101,115,105,97,110,10,0,0,0,0,0,0,9,37,115,45,97,120,105,115,32,116,105,99,115,58,9,0,108,117,0,0,0,0,0,0,101,114,114,111,114,32,105,110,32,101,100,103,101,51,100,95,105,110,116,101,114,115,101,99,116,0,0,0,0,0,0,0,112,105,99,107,117,112,32,112,101,110,99,105,114,99,108,101,32,115,99,97,108,101,100,32,37,103,116,104,59,10,0,0,98,111,120,120,36,121,101,114,114,111,114,98,97,114,115,0,110,111,109,105,36,114,114,111,114,0,0,0,0,0,0,0,9,109,97,112,112,105,110,103,32,102,111,114,32,51,45,100,32,100,97,116,97,32,105,115,32,0,0,0,0,0,0,0,104,105,115,116,111,103,114,97,109,115,10,0,0,0,0,0,50,32,99,111,108,117,109,110,115,32,111,110,108,121,32,112,111,115,115,105,98,108,101,32,119,105,116,104,32,101,120,112,108,105,99,105,116,32,112,109,51,100,32,115,116,121,108,101,32,40,108,105,110,101,32,37,100,41,0,0,0,0,0,0,76,111,103,32,115,99,97,108,101,32,111,110,32,88,32,105,115,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,104,105,115,116,111,103,114,97,109,32,112,108,111,116,115,10,0,0,0,0,101,120,112,101,99,116,101,100,32,123,101,108,115,101,45,99,108,97,117,115,101,125,0,0,67,111,108,117,109,110,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,112,117,116,95,116,101,120,116,40,34,37,115,34,44,37,100,97,44,37,100,98,44,37,100,44,37,100,41,59,10,0,0,98,111,120,101,114,36,114,111,114,98,97,114,115,0,0,0,75,80,95,69,113,117,97,108,0,0,0,0,0,0,0,0,65,116,116,101,109,112,116,32,116,111,32,97,115,115,105,103,110,32,116,111,32,97,32,114,101,97,100,45,111,110,108,121,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,0,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,115,32,97,114,101,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,0,0,0,0,102,105,108,108,32,97,114,114,111,119,104,101,97,100,32,114,111,116,97,116,101,100,32,97,110,103,108,101,40,37,100,44,37,100,41,32,115,104,105,102,116,101,100,32,40,37,100,97,44,37,100,98,41,59,10,0,102,105,108,108,101,100,99,36,117,114,118,101,115,0,0,0,9,32,32,37,115,45,97,120,105,115,58,32,34,37,115,34,10,0,0,0,0,0,0,0,39,58,39,32,111,114,32,107,101,121,119,111,114,100,32,39,116,111,39,32,101,120,112,101,99,116,101,100,0,0,0,0,102,111,36,110,116,0,0,0,104,105,115,116,36,111,103,114,97,109,115,0,0,0,0,0,9,116,105,99,32,102,111,114,109,97,116,32,105,115,58,10,0,0,0,0,0,0,0,0,109,97,36,103,110,105,102,105,99,97,116,105,111,110,0,0,98,111,120,101,115,0,0,0,9,37,115,32,97,114,101,32,112,108,111,116,116,101,100,32,119,105,116,104,32,0,0,0,51,120,0,0,0,0,0,0,110,111,112,114,111,36,108,111,103,117,101,115,0,0,0,0,120,121,101,36,114,114,111,114,98,97,114,115,0,0,0,0,32,119,105,116,104,32,98,111,114,100,101,114,32,0,0,0,112,114,111,36,108,111,103,117,101,115,0,0,0,0,0,0,120,101,36,114,114,111,114,98,97,114,115,0,0,0,0,0,32,119,105,116,104,32,110,111,32,98,111,114,100,101,114,10,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,35,100,97,116,97,112,111,105,110,116,115,32,61,32,37,100,10,0,0,0,0,0,0,0,110,111,112,115,36,110,102,115,115,0,0,0,0,0,0,0,101,36,114,114,111,114,98,97,114,115,0,0,0,0,0,0,9,70,105,108,108,32,115,116,121,108,101,32,105,115,32,101,109,112,116,121,0,0,0,0,112,115,110,102,115,115,45,118,36,101,114,115,105,111,110,55,0,0,0,0,0,0,0,0,121,101,36,114,114,111,114,98,97,114,115,0,0,0,0,0,9,70,105,108,108,32,115,116,121,108,101,32,117,115,101,115,32,37,115,32,112,97,116,116,101,114,110,115,32,115,116,97,114,116,105,110,103,32,97,116,32,37,100,0,0,0,0,0,112,115,36,110,102,115,115,0,120,121,101,114,114,111,114,108,36,105,110,101,115,0,0,0,98,36,101,122,105,101,114,0,32,32,67,111,114,114,101,108,97,116,105,111,110,58,32,32,114,32,61,32,37,46,52,103,10,0,0,0,0,0,0,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,61,0,0,0,0,0,0,0,79,85,84,0,0,0,0,0,117,108,111,110,103,0,0,0,97,109,36,115,116,101,120,0,120,101,114,114,111,114,108,36,105,110,101,115,0,0,0,0,109,105,36,114,114,111,114,0,9,70,105,108,108,32,115,116,121,108,101,32,117,115,101,115,32,37,115,32,115,111,108,105,100,32,99,111,108,111,117,114,32,119,105,116,104,32,100,101,110,115,105,116,121,32,37,46,51,102,0,0,0,0,0,0,98,111,120,101,115,10,0,0,103,101,116,95,100,97,116,97,58,32,107,101,121,32,116,105,116,108,101,32,110,111,116,32,102,111,117,110,100,32,105,110,32,114,101,113,117,101,115,116,101,100,32,99,111,108,117,109,110,10,0,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,112,111,108,97,114,32,109,111,100,101,0,0,97,52,36,112,97,112,101,114,0,0,0,0,0,0,0,0,101,114,114,111,114,108,36,105,110,101,115,0,0,0,0,0,75,80,95,68,101,108,101,116,101,0,0,0,0,0,0,0,100,101,102,97,117,108,116,32,108,105,110,101,116,121,112,101,115,10,0,0,0,0,0,0,108,97,36,116,101,120,0,0,121,101,114,114,111,114,108,36,105,110,101,115,0,0,0,0,117,115,101,114,45,100,101,102,105,110,101,100,32,108,105,110,101,32,115,116,121,108,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,100,101,102,97,117,108,116,32,108,105,110,101,32,116,121,112,101,115,10,0,0,0,0,0,0,0,0,116,36,101,120,0,0,0,0,100,36,111,116,115,0,0,0,9,80,108,111,116,32,108,105,110,101,115,32,105,110,99,114,101,109,101,110,116,32,111,118,101,114,32,0,0,0,0,0,110,36,111,116,101,120,0,0,108,112,0,0,0,0,0,0,102,111,114,116,36,114,97,110,0,0,0,0,0,0,0,0,32,116,101,120,116,99,111,108,111,114,32,108,116,32,37,100,0,0,0,0,0,0,0,0,51,32,109,117,108,0,0,0,115,36,111,108,105,100,0,0,108,105,110,101,115,112,36,111,105,110,116,115,0,0,0,0,32,116,105,116,108,101,32,111,102,102,115,101,116,32,0,0,99,36,111,108,111,117,114,0,78,111,32,100,97,116,97,32,116,111,32,102,105,116,32,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,99,111,108,117,109,110,115,116,97,99,107,101,100,32,0,0,0,0,0,0,99,36,111,108,111,114,0,0,66,97,100,32,97,98,98,114,101,118,105,97,116,101,100,32,109,111,110,116,104,32,110,97,109,101,0,0,0,0,0,0,105,36,109,112,117,108,115,101,115,0,0,0,0,0,0,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,114,111,119,115,116,97,99,107,101,100,32,0,109,111,36,110,111,99,104,114,111,109,101,0,0,0,0,0,98,111,120,112,108,111,116,0,115,116,114,99,111,108,0,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,101,114,114,111,114,98,97,114,115,32,119,105,116,104,32,103,97,112,32,37,100,32,108,119,32,37,103,32,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,60,110,117,109,95,99,111,108,115,62,44,60,110,117,109,95,114,111,119,115,62,39,0,0,0,0,0,0,0,112,115,110,115,102,115,115,0,114,101,99,116,36,97,110,103,108,101,0,0,0,0,0,0,97,36,99,115,112,108,105,110,101,115,0,0,0,0,0,0,32,32,76,105,110,101,97,114,32,77,111,100,101,108,58,32,121,32,61,32,37,46,52,103,32,120,32,43,32,37,46,52,103,10,0,0,0,0,0,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,99,108,117,115,116,101,114,101,100,32,119,105,116,104,32,103,97,112,32,37,100,32,0,0,0,0,0,0,73,78,0,0,0,0,0,0,108,100,0,0,0,0,0,0,112,115,110,115,102,115,115,40,118,55,41,0,0,0,0,0,101,108,108,36,105,112,115,101,0,0,0,0,0,0,0,0,97,114,114,111,119,115,116,121,108,101,32,110,111,116,32,102,111,117,110,100,0,0,0,0,120,121,101,114,114,111,114,98,97,114,115,10,0,0,0,0,101,120,112,101,99,116,105,110,103,32,40,101,120,112,114,101,115,115,105,111,110,41,0,0,39,41,39,32,101,120,112,101,99,116,101,100,0,0,0,0,37,115,32,37,115,32,37,115,116,101,120,37,115,37,115,32,109,97,103,32,37,46,51,102,32,37,115,32,37,115,112,114,111,108,111,103,117,101,115,40,37,100,41,0,0,0,0,0,99,105,114,99,36,108,101,0,75,80,95,80,97,103,101,85,112,0,0,0,0,0,0,0,108,105,110,101,99,36,111,108,111,114,0,0,0,0,0,0,32,40,100,101,102,97,117,108,116,32,108,101,110,103,116,104,32,97,110,100,32,97,110,103,108,101,115,41,10,0,0,0,32,97,109,115,116,101,120,0,104,105,115,116,36,111,103,114,97,109,0,0,0,0,0,0,32,108,101,110,103,116,104,32,37,115,37,103,44,32,97,110,103,108,101,32,37,103,32,100,101,103,0,0,0,0,0,0,115,116,97,114,116,105,110,103,32,114,97,110,103,101,32,118,97,108,117,101,32,111,114,32,39,58,39,32,111,114,32,39,116,111,39,32,101,120,112,101,99,116,101,100,0,0,0,0,32,97,52,112,97,112,101,114,0,0,0,0,0,0,0,0,105,110,99,114,36,101,109,101,110,116,0,0,0,0,0,0,9,32,32,97,114,114,111,119,32,104,101,97,100,115,58,32,37,115,44,32,0,0,0,0,108,97,0,0,0,0,0,0,102,115,0,0,0,0,0,0,32,110,111,104,101,97,100,0,124,99,111,115,40,55,50,48,120,41,124,0,0,0,0,0,9,108,111,97,100,112,97,116,104,32,105,115,32,0,0,0,109,111,110,111,99,104,114,111,109,101,0,0,0,0,0,0,32,111,110,101,32,104,101,97,100,32,0,0,0,0,0,0,99,111,108,111,114,0,0,0,108,36,105,110,101,115,0,0,115,116,114,105,110,103,0,0,37,103,93,10,0,0,0,0,32,98,111,116,104,32,104,101,97,100,115,32,0,0,0,0,98,105,110,100,0,0,0,0,105,108,108,101,103,97,108,32,109,111,110,116,104,0,0,0,37,115,32,37,115,32,37,115,116,101,120,37,115,37,115,32,109,97,103,32,37,46,51,102,32,102,111,110,116,32,34,37,115,44,37,46,50,102,34,32,37,115,112,114,111,108,111,103,117,101,115,40,37,100,41,0,102,36,117,110,99,116,105,111,110,0,0,0,0,0,0,0,9,32,37,115,32,37,115,0,101,120,112,101,99,116,105,110,103,32,102,111,110,116,32,110,97,109,101,0,0,0,0,0,100,36,97,116,97,0,0,0,115,116,114,105,110,103,99,111,108,117,109,110,0,0,0,0,9,97,114,114,111,119,115,116,121,108,101,32,37,100,44,32,0,0,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,108,97,121,111,117,116,32,99,111,109,109,97,110,100,115,0,0,0,0,0,0,0,0,112,99,114,114,56,114,0,0,103,114,97,121,49,48,48,0,120,50,121,49,0,0,0,0,32,32,76,105,110,101,97,114,32,77,111,100,101,108,58,32,121,32,61,32,37,46,52,103,32,120,32,45,32,37,46,52,103,10,0,0,0,0,0,0,97,112,112,101,97,114,32,105,110,32,116,104,101,32,111,114,100,101,114,32,116,104,101,121,32,119,101,114,101,32,102,111,117,110,100,0,0,0,0,0,9,37,115,45,97,120,105,115,32,116,105,99,115,32,97,114,101,32,37,115,44,32,9,109,97,106,111,114,32,116,105,99,115,99,97,108,101,32,105,115,32,37,103,32,97,110,100,32,109,105,110,111,114,32,116,105,99,115,99,97,108,101,32,105,115,32,37,103,10,0,0,0,108,111,110,103,0,0,0,0,99,109,114,49,48,0,0,0,103,114,97,121,57,48,0,0,97,120,36,105,115,0,0,0,98,101,32,115,111,114,116,101,100,32,97,108,112,104,97,98,101,116,105,99,97,108,108,121,0,0,0,0,0,0,0,0,120,101,114,114,111,114,98,97,114,115,10,0,0,0,0,0,66,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,102,105,108,101,32,37,115,0,0,89,111,117,32,104,97,118,101,32,116,111,32,99,111,109,112,105,108,101,32,103,110,117,112,108,111,116,32,119,105,116,104,32,98,117,105,108,116,105,110,32,114,101,97,100,108,105,110,101,32,111,114,32,71,78,85,32,114,101,97,100,108,105,110,101,32,111,114,32,66,83,68,32,101,100,105,116,108,105,110,101,32,116,111,32,101,110,97,98,108,101,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,0,10,100,101,102,32,95,119,99,32,61,32,119,105,116,104,112,101,110,32,99,117,114,114,101,110,116,112,101,110,32,119,105,116,104,99,111,108,111,114,32,99,117,114,114,101,110,116,99,111,108,111,114,32,101,110,100,100,101,102,59,10,100,101,102,32,95,97,99,32,61,32,97,100,100,116,111,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,101,110,100,100,101,102,59,10,100,101,102,32,95,115,109,115,32,61,32,115,99,97,108,101,100,32,109,112,116,32,115,104,105,102,116,101,100,32,101,110,100,100,101,102,59,10,37,32,100,114,97,119,105,110,103,32,112,111,105,110,116,45,116,121,112,101,115,10,100,101,102,32,103,112,100,114,97,119,32,40,101,120,112,114,32,110,44,32,120,44,32,121,41,32,61,10,32,32,105,102,32,110,60,48,58,32,95,97,99,32,99,111,110,116,111,117,114,32,102,117,108,108,99,105,114,99,108,101,32,95,115,109,115,32,40,120,44,121,41,10,32,32,101,108,115,101,105,102,32,40,110,61,49,41,32,111,114,32,40,110,61,51,41,58,10,32,32,32,32,95,97,99,32,100,111,117,98,108,101,112,97,116,104,32,112,116,112,97,116,104,91,110,93,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,59,10,32,32,32,32,95,97,99,32,100,111,117,98,108,101,112,97,116,104,32,112,116,112,97,116,104,91,110,93,32,114,111,116,97,116,101,100,32,57,48,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,10,32,32,101,108,115,101,105,102,32,110,60,54,58,32,95,97,99,32,100,111,117,98,108,101,112,97,116,104,32,112,116,112,97,116,104,91,110,93,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,10,32,32,101,108,115,101,58,32,95,97,99,32,99,111,110,116,111,117,114,32,112,116,112,97,116,104,91,110,93,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,10,32,32,102,105,10,101,110,100,100,101,102,59,10,10,37,32,116,104,101,32,112,111,105,110,116,32,115,104,97,112,101,115,10,112,97,116,104,32,112,116,112,97,116,104,91,93,59,10,37,100,105,97,109,111,110,100,10,112,116,112,97,116,104,48,32,61,32,112,116,112,97,116,104,54,32,61,32,40,45,49,47,50,44,48,41,45,45,40,48,44,45,49,47,50,41,45,45,40,49,47,50,44,48,41,45,45,40,48,44,49,47,50,41,45,45,99,121,99,108,101,59,10,37,32,112,108,117,115,32,115,105,103,110,10,112,116,112,97,116,104,49,32,61,32,40,45,49,47,50,44,48,41,45,45,40,49,47,50,44,48,41,59,10,37,32,115,113,117,97,114,101,10,112,116,112,97,116,104,50,32,61,32,112,116,112,97,116,104,55,32,61,32,40,45,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,49,47,50,41,45,45,40,45,49,47,50,44,49,47,50,41,45,45,99,121,99,108,101,59,10,37,32,99,114,111,115,115,10,112,116,112,97,116,104,51,32,58,61,32,40,45,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,49,47,50,41,59,10,37,32,99,105,114,99,108,101,58,10,112,116,112,97,116,104,52,32,61,32,112,116,112,97,116,104,56,58,61,32,102,117,108,108,99,105,114,99,108,101,59,10,37,32,116,114,105,97,110,103,108,101,10,112,116,112,97,116,104,53,32,61,32,112,116,112,97,116,104,57,32,58,61,32,40,48,44,49,47,50,41,45,45,40,45,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,45,49,47,50,41,45,45,99,121,99,108,101,59,10,10,100,101,102,32,108,105,110,101,116,121,112,101,32,101,120,112,114,32,110,32,61,10,32,32,99,117,114,114,101,110,116,99,111,108,111,114,58,61,32,105,102,32,99,111,108,111,114,108,105,110,101,115,32,58,32,99,111,108,91,110,93,32,101,108,115,101,58,32,98,108,97,99,107,32,102,105,59,10,32,32,105,102,32,110,32,61,32,45,49,32,58,10,32,32,32,32,32,32,100,114,97,119,111,112,116,105,111,110,115,40,119,105,116,104,99,111,108,111,114,32,99,117,114,114,101,110,116,99,111,108,111,114,32,119,105,116,104,112,101,110,32,40,99,117,114,114,101,110,116,112,101,110,32,115,99,97,108,101,100,32,46,53,41,41,59,10,32,32,101,108,115,101,105,102,32,110,32,60,32,49,32,58,10,32,32,32,32,100,114,97,119,111,112,116,105,111,110,115,40,95,119,99,41,59,10,32,32,101,108,115,101,32,58,10,32,32,32,32,100,114,97,119,111,112,116,105,111,110,115,40,32,105,102,32,100,97,115,104,101,100,108,105,110,101,115,58,32,100,97,115,104,101,100,32,108,116,91,110,93,32,102,105,32,95,119,99,41,59,10,32,32,102,105,10,101,110,100,100,101,102,59,10,10,37,32,100,97,115,104,32,112,97,116,116,101,114,110,115,10,112,105,99,116,117,114,101,32,108,116,91,93,59,10,108,116,49,61,100,97,115,104,112,97,116,116,101,114,110,40,111,110,32,50,32,111,102,102,32,50,41,59,32,37,32,100,97,115,104,101,115,10,108,116,50,61,100,97,115,104,112,97,116,116,101,114,110,40,111,110,32,50,32,111,102,102,32,50,32,111,110,32,48,46,50,32,111,102,102,32,50,41,59,32,37,100,97,115,104,45,100,111,116,10,108,116,51,61,108,116,49,32,115,99,97,108,101,100,32,49,46,52,49,52,59,10,108,116,52,61,108,116,50,32,115,99,97,108,101,100,32,49,46,52,49,52,59,10,108,116,53,61,108,116,49,32,115,99,97,108,101,100,32,50,59,10,108,116,54,58,61,108,116,50,32,115,99,97,108,101,100,32,50,59,10,108,116,55,61,100,97,115,104,112,97,116,116,101,114,110,40,111,110,32,48,46,50,32,111,102,102,32,50,41,59,32,37,100,111,116,115,10,10,99,111,108,111,114,32,99,111,108,91,93,44,99,121,97,110,44,32,109,97,103,101,110,116,97,44,32,121,101,108,108,111,119,59,10,99,121,97,110,61,98,108,117,101,43,103,114,101,101,110,59,32,109,97,103,101,110,116,97,61,114,101,100,43,98,108,117,101,59,121,101,108,108,111,119,61,103,114,101,101,110,43,114,101,100,59,10,99,111,108,91,45,50,93,58,61,99,111,108,91,45,49,93,58,61,99,111,108,48,58,61,98,108,97,99,107,59,10,99,111,108,49,58,61,114,101,100,59,10,99,111,108,50,58,61,40,46,50,44,46,50,44,49,41,59,32,37,98,108,117,101,10,99,111,108,51,58,61,40,49,44,46,54,54,44,48,41,59,32,37,111,114,97,110,103,101,10,99,111,108,52,58,61,46,56,53,42,103,114,101,101,110,59,10,99,111,108,53,58,61,46,57,42,109,97,103,101,110,116,97,59,10,99,111,108,54,58,61,48,46,56,53,42,99,121,97,110,59,10,99,111,108,55,58,61,46,56,53,42,121,101,108,108,111,119,59,10,10,37,112,108,97,99,105,110,103,32,116,101,120,116,10,112,105,99,116,117,114,101,32,71,80,116,101,120,116,59,10,100,101,102,32,112,117,116,95,116,101,120,116,40,101,120,112,114,32,112,105,99,44,32,120,44,32,121,44,32,114,44,32,106,41,32,61,10,32,32,71,80,116,101,120,116,58,61,109,97,107,101,112,105,99,40,112,105,99,41,59,10,32,32,71,80,116,101,120,116,58,61,71,80,116,101,120,116,32,115,104,105,102,116,101,100,10,32,32,32,32,105,102,32,106,32,61,32,49,58,32,40,45,40,117,108,99,111,114,110,101,114,32,71,80,116,101,120,116,32,43,32,108,108,99,111,114,110,101,114,32,71,80,116,101,120,116,41,47,50,41,10,32,32,32,32,101,108,115,101,105,102,32,106,32,61,32,50,58,32,40,45,99,101,110,116,101,114,32,71,80,116,101,120,116,41,10,32,32,32,32,101,108,115,101,58,32,40,45,40,117,114,99,111,114,110,101,114,32,71,80,116,101,120,116,32,43,32,108,114,99,111,114,110,101,114,32,71,80,116,101,120,116,41,47,50,41,10,32,32,32,32,102,105,10,32,32,32,32,114,111,116,97,116,101,100,32,114,59,10,32,32,97,100,100,116,111,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,97,108,115,111,32,71,80,116,101,120,116,32,115,104,105,102,116,101,100,32,40,120,44,121,41,10,101,110,100,100,101,102,59,10,0,0,0,0,0,0,0,0,103,114,97,121,56,48,0,0,75,80,95,85,112,0,0,0,108,99,0,0,0,0,0,0,69,82,82,78,79,0,0,0,9,102,97,99,116,111,114,32,108,97,98,101,108,115,32,119,105,108,108,32,37,115,10,0,100,97,115,104,101,100,108,105,110,101,115,58,61,116,114,117,101,59,10,0,0,0,0,0,103,114,97,121,55,48,0,0,97,114,101,32,111,102,102,0,100,97,115,104,101,100,108,105,110,101,115,58,61,102,97,108,115,101,59,10,0,0,0,0,103,114,97,121,54,48,0,0,105,115,111,95,56,56,53,57,95,49,53,0,0,0,0,0,97,114,101,32,97,117,116,111,109,97,116,105,99,0,0,0,32,120,108,111,119,32,120,104,105,103,104,0,0,0,0,0,99,111,108,111,114,108,105,110,101,115,58,61,102,97,108,115,101,59,10,0,0,0,0,0,103,114,97,121,53,48,0,0,119,105,108,108,32,98,101,32,112,117,116,32,111,110,32,116,104,101,32,120,50,32,97,120,105,115,0,0,0,0,0,0,55,50,48,32,109,117,108,32,99,111,115,32,97,98,115,0,99,111,108,111,114,108,105,110,101,115,58,61,116,114,117,101,59,10,0,0,0,0,0,0,103,114,97,121,52,48,0,0,112,117,115,104,100,50,0,0,119,105,108,108,32,98,101,32,112,117,116,32,111,110,32,116,104,101,32,120,32,97,120,105,115,0,0,0,0,0,0,0,100,114,111,112,108,97,115,116,95,100,121,110,97,114,114,97,121,58,32,100,121,110,97,114,114,97,121,32,119,97,115,110,39,116,32,105,110,105,116,105,97,108,105,122,101,100,33,0,10,99,111,108,111,114,32,99,117,114,114,101,110,116,99,111,108,111,114,59,32,99,117,114,114,101,110,116,99,111,108,111,114,58,61,98,108,97,99,107,59,10,99,111,108,111,114,32,102,105,108,108,99,111,108,111,114,59,10,98,111,111,108,101,97,110,32,99,111,108,111,114,108,105,110,101,115,44,100,97,115,104,101,100,108,105,110,101,115,59,10,0,0,0,0,0,103,114,97,121,51,48,0,0,9,102,97,99,116,111,114,32,108,97,98,101,108,115,32,37,115,10,0,0,0,0,0,0,92,115,101,116,102,111,110,116,123,37,115,125,123,37,53,46,50,102,125,10,101,116,101,120,10,0,0,0,0,0,0,0,103,114,97,121,50,48,0,0,9,115,101,112,97,114,97,116,105,111,110,32,98,101,116,119,101,101,110,32,98,111,120,112,108,111,116,115,32,105,115,32,37,103,10,0,0,0,0,0,10,37,102,111,110,116,32,99,104,97,110,103,101,115,10,118,101,114,98,97,116,105,109,116,101,120,10,92,100,101,102,92,115,101,116,102,111,110,116,35,49,35,50,123,37,46,10,32,32,92,102,111,110,116,92,103,112,102,111,110,116,61,35,49,32,97,116,32,35,50,112,116,10,92,103,112,102,111,110,116,125,10,0,0,0,0,0,0,103,114,97,121,49,48,0,0,9,111,117,116,108,105,101,114,115,32,119,105,108,108,32,110,111,116,32,98,101,32,100,114,97,119,110,10,0,0,0,0,108,97,121,36,111,117,116,0,10,100,101,102,97,117,108,116,102,111,110,116,58,61,32,34,37,115,34,59,10,100,101,102,97,117,108,116,115,99,97,108,101,32,58,61,32,37,54,46,51,102,47,102,111,110,116,115,105,122,101,32,100,101,102,97,117,108,116,102,111,110,116,59,10,0,0,0,0,0,0,0,103,114,97,121,48,0,0,0,120,49,121,50,0,0,0,0,32,32,77,101,100,105,97,110,58,32,32,32,37,115,32,37,115,32,37,115,10,0,0,0,99,100,0,0,0,0,0,0,9,111,117,116,108,105,101,114,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,32,117,115,105,110,103,32,112,111,105,110,116,32,116,121,112,101,32,37,100,10,0,0,0,0,46,48,0,0,0,0,0,0,118,97,114,100,101,102,32,109,97,107,101,112,105,99,40,101,120,112,114,32,115,116,114,41,32,61,10,32,32,105,102,32,112,105,99,116,117,114,101,32,115,116,114,32,58,32,115,116,114,32,115,99,97,108,101,100,32,116,101,120,116,109,97,103,10,32,32,37,32,111,116,104,101,114,119,105,115,101,32,97,32,115,116,114,105,110,103,10,32,32,101,108,115,101,58,32,115,116,114,32,105,110,102,111,110,116,32,100,101,102,97,117,108,116,102,111,110,116,32,115,99,97,108,101,100,32,40,100,101,102,97,117,108,116,115,99,97,108,101,42,116,101,120,116,109,97,103,41,10,32,32,102,105,10,101,110,100,100,101,102,59,10,10,100,101,102,32,105,110,102,111,110,116,115,105,122,101,40,101,120,112,114,32,115,116,114,44,32,115,105,122,101,41,32,61,10,32,32,105,110,102,111,110,116,32,115,116,114,32,115,99,97,108,101,100,32,40,115,105,122,101,32,47,32,102,111,110,116,115,105,122,101,32,115,116,114,41,10,101,110,100,100,101,102,59,10,0,0,115,108,97,116,101,103,114,97,121,0,0,0,0,0,0,0,116,36,105,99,115,0,0,0,67,97,110,39,116,32,114,101,97,100,32,100,97,116,97,32,102,105,108,101,0,0,0,0,32,32,98,111,120,32,98,121,32,37,53,46,50,102,32,111,102,32,116,104,101,32,105,110,116,101,114,113,117,97,114,116,105,108,101,32,100,105,115,116,97,110,99,101,10,0,0,0,121,101,114,114,111,114,98,97,114,115,10,0,0,0,0,0,10,116,101,120,116,109,97,103,58,61,37,54,46,51,102,59,10,0,0,0,0,0,0,0,100,97,114,107,45,103,114,97,121,0,0,0,0,0,0,0,75,80,95,72,111,109,101,0,98,103,110,100,0,0,0,0,110,111,110,45,115,116,114,105,110,103,32,97,114,103,117,109,101,110,116,32,116,111,32,115,121,115,116,101,109,40,41,0,32,32,109,101,100,105,97,110,32,116,111,32,105,110,99,108,117,100,101,32,37,53,46,50,102,32,111,102,32,116,104,101,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,10,119,97,114,110,105,110,103,99,104,101,99,107,58,61,48,59,10,100,101,102,97,117,108,116,109,112,116,58,61,109,112,116,58,61,52,59,10,116,104,58,61,46,54,59,10,37,37,32,72,97,118,101,32,110,105,99,101,32,115,104,97,114,112,32,106,111,105,110,115,32,111,110,32,111,117,114,32,108,105,110,101,115,10,108,105,110,101,99,97,112,58,61,98,117,116,116,59,10,108,105,110,101,106,111,105,110,58,61,109,105,116,101,114,101,100,59,10,10,100,101,102,32,115,99,97,108,101,112,101,110,32,101,120,112,114,32,110,32,61,32,112,105,99,107,117,112,32,112,101,110,99,105,114,99,108,101,32,115,99,97,108,101,100,32,40,110,42,116,104,41,32,101,110,100,100,101,102,59,10,100,101,102,32,112,116,115,105,122,101,32,101,120,112,114,32,110,32,61,32,109,112,116,58,61,110,42,100,101,102,97,117,108,116,109,112,116,32,101,110,100,100,101,102,59,10,10,0,0,0,0,0,108,105,103,104,116,45,103,114,101,121,0,0,0,0,0,0,9,98,111,120,112,108,111,116,32,114,97,110,103,101,32,101,120,116,101,110,100,115,32,102,114,111,109,32,116,104,101,32,0,0,0,0,0,0,0,0,85,112,112,101,114,32,98,111,117,110,100,32,111,102,32,99,111,110,115,116,114,97,105,110,116,32,60,32,108,111,119,101,114,32,98,111,117,110,100,58,32,32,84,117,114,110,105,110,103,32,111,102,32,99,111,110,115,116,114,97,105,110,116,115,46,0,0,0,0,0,0,0,92,98,101,103,105,110,123,100,111,99,117,109,101,110,116,125,10,101,116,101,120,10,37,32,69,78,68,80,82,69,10,0,108,105,103,104,116,45,103,114,97,121,0,0,0,0,0,0,98,111,120,32,97,110,100,32,119,104,105,115,107,101,114,0,92,117,115,101,112,97,99,107,97,103,101,91,105,110,116,108,105,109,105,116,115,93,123,97,109,115,109,97,116,104,125,10,92,117,115,101,112,97,99,107,97,103,101,123,97,109,115,102,111,110,116,115,125,10,0,0,103,114,101,101,110,121,101,108,108,111,119,0,0,0,0,0,102,105,110,97,110,99,101,32,98,97,114,0,0,0,0,0,124,115,105,110,40,55,50,48,120,41,124,0,0,0,0,0,92,117,115,101,112,97,99,107,97,103,101,91,108,97,116,105,110,49,93,123,105,110,112,117,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,91,84,49,93,123,102,111,110,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,123,116,101,120,116,99,111,109,112,125,10,92,117,115,101,112,97,99,107,97,103,101,123,109,97,116,104,112,116,109,120,125,10,92,117,115,101,112,97,99,107,97,103,101,91,115,99,97,108,101,100,61,46,57,50,93,123,104,101,108,118,101,116,125,10,92,117,115,101,112,97,99,107,97,103,101,123,99,111,117,114,105,101,114,125,10,92,117,115,101,112,97,99,107,97,103,101,123,108,97,116,101,120,115,121,109,125,10,0,0,99,104,97,114,116,114,101,117,115,101,0,0,0,0,0,0,9,98,111,120,112,108,111,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,37,115,10,0,0,109,117,108,116,105,112,108,111,116,32,109,111,100,101,32,105,115,32,37,115,10,0,0,0,92,117,115,101,112,97,99,107,97,103,101,91,108,97,116,105,110,49,93,123,105,110,112,117,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,91,84,49,93,123,102,111,110,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,123,116,105,109,101,115,44,109,97,116,104,112,116,109,120,125,10,92,117,115,101,112,97,99,107,97,103,101,123,104,101,108,118,101,116,125,10,92,117,115,101,112,97,99,107,97,103,101,123,99,111,117,114,105,101,114,125,10,0,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,37,103,58,0,0,0,0,0,44,32,102,105,108,108,115,116,121,108,101,0,0,0,0,0,92,100,111,99,117,109,101,110,116,99,108,97,115,115,123,97,114,116,105,99,108,101,125,10,0,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,0,44,32,108,119,32,37,46,49,102,32,0,0,0,0,0,0,92,100,111,99,117,109,101,110,116,99,108,97,115,115,91,97,52,112,97,112,101,114,93,123,97,114,116,105,99,108,101,125,10,0,0,0,0,0,0,0,115,108,97,116,101,103,114,101,121,0,0,0,0,0,0,0,108,116,32,37,100,0,0,0,110,111,101,110,104,36,97,110,99,101,100,0,0,0,0,0,10,37,37,32,65,100,100,32,92,100,111,99,117,109,101,110,116,99,108,97,115,115,32,97,110,100,32,92,98,101,103,105,110,123,100,99,111,117,109,101,110,116,125,32,102,111,114,32,108,97,116,101,120,10,37,37,32,78,66,32,121,111,117,32,115,104,111,117,108,100,32,115,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32,84,69,88,32,116,111,32,116,104,101,32,110,97,109,101,32,111,102,32,121,111,117,114,10,37,37,32,108,97,116,101,120,32,101,120,101,99,117,116,97,98,108,101,32,40,110,111,114,109,97,108,108,121,32,108,97,116,101,120,41,32,105,110,111,114,100,101,114,32,102,111,114,32,109,101,116,97,112,111,115,116,32,116,111,32,119,111,114,107,10,37,37,32,111,114,32,114,117,110,10,37,37,32,109,112,111,115,116,32,45,45,116,101,120,61,108,97,116,101,120,32,46,46,46,10,10,37,32,66,69,71,80,82,69,10,118,101,114,98,97,116,105,109,116,101,120,10,0,104,111,110,101,121,100,101,119,0,0,0,0,0,0,0,0,120,50,121,50,0,0,0,0,32,32,81,117,97,114,116,105,108,101,58,32,37,115,32,37,115,32,37,115,10,0,0,0,98,97,99,107,103,114,111,117,110,100,0,0,0,0,0,0,37,46,49,53,103,0,0,0,117,105,110,116,0,0,0,0,112,114,111,108,111,103,117,101,115,58,61,37,100,59,10,0,99,111,109,109,97,110,100,32,115,116,114,105,110,103,0,0,98,105,115,113,117,101,0,0,98,101,104,105,110,100,0,0,120,121,101,114,114,111,114,108,105,110,101,115,10,0,0,0,78,101,101,100,32,50,32,111,114,32,51,32,99,111,108,117,109,110,115,32,102,111,114,32,112,111,108,97,114,32,100,97,116,97,0,0,0,0,0,0,102,105,108,108,36,115,116,121,108,101,0,0,0,0,0,0,69,120,112,101,99,116,101,100,32,99,111,109,109,97,110,100,32,115,116,114,105,110,103,0,97,118,115,0,0,0,0,0,37,37,71,78,85,80,76,79,84,32,77,101,116,97,112,111,115,116,32,111,117,116,112,117,116,58,32,37,115,10,0,0,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,75,80,95,82,105,103,104,116,0,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,105,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,32,116,121,112,101,0,0,0,9,82,101,99,116,97,110,103,108,101,32,115,116,121,108,101,32,105,115,32,37,115,44,32,102,105,108,108,32,99,111,108,111,114,32,0,0,0,0,0,101,110,100,46,10,0,0,0,107,104,97,107,105,49,0,0,9,67,105,114,99,108,101,32,115,116,121,108,101,32,104,97,115,32,100,101,102,97,117,108,116,32,114,97,100,105,117,115,32,0,0,0,0,0,0,0,110,111,32,117,112,112,101,114,32,98,111,117,110,100,32,99,111,110,115,116,114,97,105,110,116,32,97,108,108,111,119,101,100,32,105,102,32,110,111,116,32,97,117,116,111,115,99,97,108,105,110,103,0,0,0,0,99,111,110,116,111,117,114,32,98,95,115,112,108,105,110,101,0,0,0,0,0,0,0,0,37,32,69,78,68,80,79,83,84,10,0,0,0,0,0,0,112,105,110,107,0,0,0,0,115,101,116,32,116,101,114,109,105,110,97,108,32,117,110,107,110,111,119,110,10,0,0,0,44,32,98,111,116,104,32,100,105,97,109,101,116,101,114,115,32,97,114,101,32,105,110,32,116,104,101,32,115,97,109,101,32,117,110,105,116,115,32,97,115,32,116,104,101,32,121,32,97,120,105,115,10,0,0,0,60,110,111,62,0,0,0,0,101,116,101,120,10,0,0,0,108,105,103,104,116,45,115,97,108,109,111,110,0,0,0,0,44,32,98,111,116,104,32,100,105,97,109,101,116,101,114,115,32,97,114,101,32,105,110,32,116,104,101,32,115,97,109,101,32,117,110,105,116,115,32,97,115,32,116,104,101,32,120,32,97,120,105,115,10,0,0,0,55,50,48,32,109,117,108,32,115,105,110,32,97,98,115,0,32,92,101,110,100,123,100,111,99,117,109,101,110,116,125,10,0,0,0,0,0,0,0,0,115,97,110,100,121,98,114,111,119,110,0,0,0,0,0,0,117,0,0,0,0,0,0,0,44,32,100,105,97,109,101,116,101,114,115,32,97,114,101,32,105,110,32,100,105,102,102,101,114,101,110,116,32,117,110,105,116,115,32,40,109,97,106,111,114,58,32,120,32,97,120,105,115,44,32,109,105,110,111,114,58,32,121,32,97,120,105,115,41,10,0,0,0,0,0,0,45,45,104,101,108,112,0,0,118,101,114,98,97,116,105,109,116,101,120,10,0,0,0,0,116,97,110,49,0,0,0,0,42,58,0,0,0,0,0,0,44,32,100,101,102,97,117,108,116,32,97,110,103,108,101,32,105,115,32,37,46,49,102,32,100,101,103,114,101,101,115,0,97,99,116,105,111,110,32,116,97,98,108,101,0,0,0,0,37,32,66,69,71,80,79,83,84,10,0,0,0,0,0,0,115,105,101,110,110,97,49,0,9,69,108,108,105,112,115,101,32,115,116,121,108,101,32,104,97,115,32,100,101,102,97,117,108,116,32,115,105,122,101,32,0,0,0,0,0,0,0,0,101,110,100,102,105,103,59,10,0,0,0,0,0,0,0,0,121,101,108,108,111,119,52,0,70,117,110,99,116,105,111,110,115,0,0,0,0,0,0,0,106,116,101,114,110,0,0,0,101,120,112,101,99,116,105,110,103,32,39,114,97,100,105,97,110,115,39,32,111,114,32,39,100,101,103,114,101,101,115,39,0,0,0,0,0,0,0,0,101,110,104,36,97,110,99,101])
-.concat([100,0,0,0,0,0,0,0,115,99,97,108,101,112,101,110,32,49,59,32,112,116,115,105,122,101,32,37,46,51,102,59,108,105,110,101,116,121,112,101,32,45,50,59,10,0,0,0,115,108,97,116,101,98,108,117,101,49,0,0,0,0,0,0,120,49,121,49,0,0,0,0,68,97,116,97,0,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,32,32,32,37,115,32,91,37,42,108,100,93,10,0,0,0,0,0,0,37,115,58,37,100,32,112,114,111,116,111,99,111,108,32,101,114,114,111,114,10,0,0,0,100,36,101,103,114,101,101,115,0,0,0,0,0,0,0,0,109,117,108,116,105,112,108,111,116,62,32,0,0,0,0,0,37,48,51,111,0,0,0,0,100,0,0,0,0,0,0,0,97,58,61,119,47,37,46,49,102,59,98,58,61,104,47,37,46,49,102,59,10,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,0,0,9,37,115,32,105,115,32,117,110,100,101,102,105,110,101,100,10,0,0,0,0,0,0,0,115,116,121,108,101,32,108,105,110,101,0,0,0,0,0,0,114,36,97,100,105,97,110,115,0,0,0,0,0,0,0,0,120,101,114,114,111,114,108,105,110,101,115,10,0,0,0,0,78,101,101,100,32,49,32,111,114,32,51,32,99,111,108,117,109,110,115,32,102,111,114,32,99,97,114,116,101,115,105,97,110,32,100,97,116,97,0,0,67,97,110,39,116,32,99,104,97,110,103,101,32,116,111,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121,0,0,126,0,0,0,0,0,0,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,71,105,118,101,110,115,40,41,0,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,44,32,97,108,108,32,119,101,105,103,104,116,115,32,104,97,118,101,32,116,111,32,98,101,32,62,32,48,0,0,0,0,0,0,0,10,98,101,103,105,110,102,105,103,40,37,100,41,59,10,119,58,61,37,46,51,102,105,110,59,104,58,61,37,46,51,102,105,110,59,10,0,0,0,0,99,98,116,105,99,115,0,0,111,114,99,104,105,100,52,0,75,80,95,66,101,103,105,110,0,0,0,0,0,0,0,0,9,37,115,10,0,0,0,0,114,103,98,36,99,111,108,111,114,0,0,0,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,116,114,105,110,103,32,110,111,116,32,97,108,108,111,99,97,116,101,100,0,0,0,0,100,117,112,108,105,99,97,116,101,32,111,114,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,97,114,103,117,109,101,110,116,115,0,0,0,0,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,0,115,105,101,110,110,97,52,0,10,9,85,115,101,114,45,68,101,102,105,110,101,100,32,70,117,110,99,116,105,111,110,115,58,10,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,37,115,32,114,101,113,117,105,114,101,115,32,37,100,32,118,97,114,105,97,98,108,101,37,99,0,0,0,0,0,0,119,114,111,110,103,32,97,114,103,117,109,101,110,116,32,105,110,32,115,101,116,32,97,114,114,111,119,0,0,0,0,0,109,97,108,102,111,114,109,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,114,97,105,110,116,32,40,117,115,101,32,39,60,39,32,111,110,108,121,41,0,0,100,114,97,119,32,40,37,46,49,102,97,44,37,46,49,102,98,41,0,0,0,0,0,0,98,114,111,119,110,52,0,0,100,101,102,97,117,108,116,32,108,97,121,101,114,0,0,0,101,110,100,32,99,111,111,114,100,105,110,97,116,101,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,108,105,110,101,116,121,112,101,32,37,100,59,10,0,0,0,111,114,97,110,103,101,114,101,100,52,0,0,0,0,0,0,9,71,114,105,100,32,100,114,97,119,110,32,97,116,32,37,115,10,0,0,0,0,0,0,115,116,97,114,116,32,99,111,111,114,100,105,110,97,116,101,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,124,99,111,115,40,51,54,48,120,41,124,0,0,0,0,0,112,117,116,95,116,101,120,116,40,32,98,116,101,120,32,37,115,32,101,116,101,120,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,100,97,114,107,45,111,108,105,118,101,103,114,101,101,110,0,100,101,103,114,101,101,115,0,97,114,114,111,119,0,0,0,112,117,116,95,116,101,120,116,40,32,98,116,101,120,32,92,115,101,116,102,111,110,116,123,37,115,125,123,37,53,46,50,102,125,32,37,115,32,101,116,101,120,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,0,0,0,100,97,114,107,45,112,108,117,109,0,0,0,0,0,0,0,114,97,100,105,97,110,115,0,32,32,32,32,32,32,32,32,32,83,107,105,112,112,101,100,32,37,100,32,112,111,105,110,116,115,32,111,117,116,115,105,100,101,32,114,97,110,103,101,32,91,37,115,61,0,0,0,116,97,103,32,109,117,115,116,32,98,101,32,62,32,48,0,112,117,116,95,116,101,120,116,40,34,37,115,34,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,112,108,117,109,0,0,0,0,9,71,114,105,100,32,114,97,100,105,105,32,100,114,97,119,110,32,101,118,101,114,121,32,37,102,32,37,115,10,0,0,112,117,116,95,116,101,120,116,40,34,37,115,34,32,105,110,102,111,110,116,115,105,122,101,40,34,37,115,34,44,37,53,46,50,102,41,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,0,100,97,114,107,45,118,105,111,108,101,116,0,0,0,0,0,10,9,77,105,110,111,114,32,103,114,105,100,32,100,114,97,119,110,32,119,105,116,104,0,106,117,109,112,110,122,0,0,104,101,97,100,36,115,0,0,102,111,110,116,0,0,0,0,103,112,100,114,97,119,40,37,100,44,37,46,49,102,97,44,37,46,49,102,98,41,59,10,0,0,0,0,0,0,0,0,118,105,111,108,101,116,0,0,9,77,97,106,111,114,32,103,114,105,100,32,100,114,97,119,110,32,119,105,116,104,0,0,32,32,77,105,110,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,32,32,32,37,115,32,91,37,42,108,100,93,10,0,0,0,0,0,0,97,115,0,0,0,0,0,0,99,111,110,118,95,116,101,120,116,32,98,117,102,102,101,114,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,100,114,97,119,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,59,10,0,0,0,0,0,111,114,97,110,103,101,0,0,32,116,105,99,115,10,0,0,108,105,110,101,116,121,112,101,0,0,0,0,0,0,0,0,121,101,114,114,111,114,108,105,110,101,115,10,0,0,0,0,101,120,112,101,99,116,105,110,103,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,100,114,97,119,100,98,108,97,114,114,111,119,0,0,0,0,111,108,105,118,101,0,0,0,75,80,95,76,101,102,116,0,32,109,37,115,0,0,0,0,66,111,116,104,32,112,97,114,97,109,101,116,101,114,115,32,116,111,32,115,116,114,112,116,105,109,101,32,109,117,115,116,32,98,101,32,115,116,114,105,110,103,115,0,0,0,0,0,100,114,97,119,97,114,114,111,119,0,0,0,0,0,0,0,98,101,105,103,101,0,0,0,32,37,115,0,0,0,0,0,98,97,99,107,36,104,101,97,100,0,0,0,0,0,0,0,122,50,0,0,0,0,0,0,37,115,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,59,10,0,0,0,0,0,0,0,100,97,114,107,45,103,111,108,100,101,110,114,111,100,0,0,82,101,99,116,97,110,103,117,108,97,114,0,0,0,0,0,121,95,109,105,110,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,121,95,109,97,120,33,0,0,0,73,110,118,97,108,105,100,32,114,97,110,103,101,0,0,0,112,116,115,105,122,101,32,37,46,51,102,59,10,0,0,0,100,97,114,107,45,107,104,97,107,105,0,0,0,0,0,0,80,111,108,97,114,0,0,0,37,115,102,105,120,109,97,36,120,0,0,0,0,0,0,0,51,54,48,32,109,117,108,32,99,111,115,32,97,98,115,0,102,105,108,108,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,99,121,99,108,101,32,119,105,116,104,112,101,110,32,40,112,101,110,99,105,114,99,108,101,32,115,99,97,108,101,100,32,48,112,116,41,32,119,105,116,104,99,111,108,111,114,32,102,105,108,108,99,111,108,111,114,59,10,0,0,0,0,0,107,104,97,107,105,0,0,0,9,37,115,32,103,114,105,100,32,100,114,97,119,110,32,97,116,0,0,0,0,0,0,0,37,115,102,105,120,109,105,36,110,0,0,0,0,0,0,0,9,32,32,72,105,100,100,101,110,51,100,32,101,108,101,109,101,110,116,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,32,105,110,32,37,115,32,111,102,32,110,111,110,45,104,105,100,100,101,110,51,100,32,101,108,101,109,101,110,116,115,10,0,0,0,0,0,0,102,105,108,108,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,99,121,99,108,101,32,119,105,116,104,99,111,108,111,114,32,98,97,99,107,103,114,111,117,110,100,59,10,0,0,0,100,97,114,107,45,115,97,108,109,111,110,0,0,0,0,0,9,103,114,105,100,32,105,115,32,79,70,70,10,0,0,0,32,32,32,32,32,32,32,32,32,82,101,97,100,32,37,100,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,37,115,102,105,120,0,0,0,115,99,97,108,101,112,101,110,32,37,46,51,102,59,10,0,115,97,108,109,111,110,0,0,114,97,120,105,115,32,105,115,32,37,115,100,114,97,119,110,10,0,0,0,0,0,0,0,37,115,109,97,36,120,0,0,80,114,101,115,115,32,114,101,116,117,114,110,32,102,111,114,32,109,111,114,101,58,32,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,37,46,52,103,42,114,101,100,43,37,46,52,103,42,103,114,101,101,110,43,37,46,52,103,42,98,108,117,101,59,10,0,0,0,111,114,97,110,103,101,45,114,101,100,0,0,0,0,0,0,9,37,115,122,101,114,111,97,120,105,115,32,105,115,32,79,70,70,10,0,0,0,0,0,106,117,109,112,122,0,0,0,37,115,109,105,36,110,0,0,116,105,36,116,108,101,0,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,99,111,108,37,100,59,10,0,0,0,108,105,103,104,116,45,99,111,114,97,108,0,0,0,0,0,125,0,0,0,0,0,0,0,9,37,115,122,101,114,111,97,120,105,115,32,105,115,32,100,114,97,119,110,32,119,105,116,104,0,0,0,0,0,0,0,32,32,83,117,109,32,83,113,46,58,32,32,37,115,32,37,115,32,37,115,10,0,0,0,107,101,36,101,112,102,105,120,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,100,105,115,112,95,118,97,108,117,101,40,41,0,0,0,0,115,105,110,116,0,0,0,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,98,108,97,99,107,59,10,0,0,0,108,97,98,101,108,32,110,111,116,32,102,111,117,110,100,0,69,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,115,101,116,32,37,115,0,0,102,105,120,0,0,0,0,0,100,111,116,115,10,0,0,0,120,112,45,62,110,101,120,116,95,115,112,32,61,61,32,121,112,0,0,0,0,0,0,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,37,46,51,103,119,104,105,116,101,59,10,0,0,0,0,0,0,0,100,97,114,107,45,112,105,110,107,0,0,0,0,0,0,0,75,80,95,80,97,103,101,68,111,119,110,0,0,0,0,0,32,112,111,105,110,116,32,119,105,116,104,32,99,111,108,111,114,32,111,102,0,0,0,0,98,117,102,102,101,114,91,108,101,110,103,116,104,45,49,93,32,61,61,32,39,32,39,0,102,117,108,108,36,119,105,100,116,104,0,0,0,0,0,0,59,10,0,0,0,0,0,0,100,97,114,107,45,116,117,114,113,117,111,105,115,101,0,0,32,110,111,112,111,105,110,116,0,0,0,0,0,0,0,0,108,36,97,114,103,101,0,0,100,101,102,97,117,108,116,0,37,115,32,61,32,0,0,0,109,97,108,102,111,114,109,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,97,114,105,110,116,0,99,121,99,108,101,32,119,105,116,104,99,111,108,111,114,32,102,105,108,108,99,111,108,111,114,59,10,0,0,0,0,0,32,102,111,110,116,32,34,37,115,34,0,0,0,0,0,0,120,95,109,105,110,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,120,95,109,97,120,33,0,0,0,45,45,0,0,0,0,0,0,32,37,115,32,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,97,98,115,111,108,117,116,101,39,32,111,114,32,39,114,101,108,97,116,105,118,101,39,32,0,0,0,0,0,77,79,85,83,69,95,0,0,124,115,105,110,40,51,54,48,120,41,124,0,0,0,0,0,10,45,45,0,0,0,0,0,116,105,109,101,108,97,98,101,108,46,116,101,120,116,0,0,115,107,121,98,108,117,101,0,32,110,111,116,32,114,111,116,97,116,101,100,0,0,0,0,114,36,101,108,97,116,105,118,101,0,0,0,0,0,0,0,40,37,46,49,102,97,44,37,46,49,102,98,41,37,115,0,109,101,100,105,117,109,45,98,108,117,101,0,0,0,0,0,32,114,111,116,97,116,101,100,32,98,121,32,37,100,32,100,101,103,114,101,101,115,32,40,105,102,32,112,111,115,115,105,98,108,101,41,0,0,0,0,97,36,98,115,111,108,117,116,101,0,0,0,0,0,0,0,98,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,100,97,116,97,102,105,108,101,0,115,101,116,32,37,115,122,101,114,111,97,120,105,115,0,0,102,105,108,108,32,0,0,0,110,97,118,121,0,0,0,0,32,99,101,110,116,114,101,0,112,114,105,110,116,95,116,97,98,108,101,58,32,111,117,116,112,117,116,32,98,117,102,102,101,114,0,0,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,105,110,32,115,99,105,101,110,116,105,102,105,99,32,110,117,109,98,101,114,32,102,111,114,109,97,116,116,105,110,103,0,0,102,105,108,108,99,111,108,111,114,58,61,99,117,114,114,101,110,116,99,111,108,111,114,59,10,0,0,0,0,0,0,0,109,105,100,110,105,103,104,116,45,98,108,117,101,0,0,0,9,108,97,98,101,108,32,37,100,32,34,37,115,34,32,97,116,32,0,0,0,0,0,0,122,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,122,95,109,97,120,51,100,33,0,0,0,0,0,0,0,106,117,109,112,0,0,0,0,32,40,0,0,0,0,0,0,102,105,108,108,99,111,108,111,114,58,61,99,117,114,114,101,110,116,99,111,108,111,114,42,37,46,50,102,43,98,97,99,107,103,114,111,117,110,100,42,37,46,50,102,59,10,0,0,100,97,114,107,45,98,108,117,101,0,0,0,0,0,0,0,123,0,0,0,0,0,0,0,32,32,83,117,109,58,32,32,32,32,32,32,37,115,32,37,115,32,37,115,10,0,0,0,34,37,115,34,0,0,0,0,102,105,108,108,99,111,108,111,114,58,61,98,97,99,107,103,114,111,117,110,100,59,10,0,44,32,98,97,99,107,97,110,103,108,101,32,37,103,32,100,101,103,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,108,105,110,101,97,114,39,44,32,39,99,117,98,105,99,115,112,108,105,110,101,39,44,32,39,98,115,112,108,105,110,101,39,44,32,39,112,111,105,110,116,115,39,44,32,39,108,101,118,101,108,115,39,32,111,114,32,39,111,114,100,101,114,39,0,0,0,0,0,115,101,116,32,37,115,116,105,99,115,32,37,115,32,0,0,108,105,110,101,115,112,111,105,110,116,115,10,0,0,0,0,71,80,86,65,76,95,76,65,83,84,95,80,76,79,84,0,47,0,0,0,0,0,0,0,100,101,102,97,117,108,116,102,111,110,116,0,0,0,0,0,115,101,97,45,103,114,101,101,110,0,0,0,0,0,0,0,75,80,95,68,111,119,110,0,10,9,32,32,97,114,114,111,119,32,104,101,97,100,58,32,108,101,110,103,116,104,32,37,115,37,103,44,32,97,110,103,108,101,32,37,103,32,100,101,103,0,0,0,0,0,0,0,98,115,112,108,105,110,101,32,111,114,100,101,114,32,109,117,115,116,32,98,101,32,105,110,32,91,50,46,46,49,48,93,32,114,97,110,103,101,46,0,32,110,111,114,97,110,103,101,108,105,109,105,116,0,0,0,101,120,116,101,114,110,97,108,36,105,109,97,103,101,115,0,102,111,114,101,115,116,45,103,114,101,101,110,0,0,0,0,40,115,101,99,111,110,100,32,120,32,97,120,105,115,41,32,0,0,0,0,0,0,0,0,111,36,114,100,101,114,0,0,32,114,97,110,103,101,108,105,109,105,116,0,0,0,0,0,117,110,102,105,110,105,115,104,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,114,97,105,110,116,0,0,0,0,0,0,0,0,105,110,108,105,110,101,36,105,109,97,103,101,115,0,0,0,115,112,114,105,110,103,45,103,114,101,101,110,0,0,0,0,40,102,105,114,115,116,32,120,32,97,120,105,115,41,32,0,76,101,118,101,108,115,32,116,121,112,101,32,105,115,32,100,105,115,99,114,101,116,101,44,32,105,103,110,111,114,105,110,103,32,110,101,119,32,110,117,109,98,101,114,32,111,102,32,99,111,110,116,111,117,114,32,108,101,118,101,108,115,0,0,84,101,114,109,105,110,97,108,32,99,97,110,118,97,115,32,97,114,101,97,32,116,111,111,32,115,109,97,108,108,32,116,111,32,104,111,108,100,32,112,108,111,116,46,10,9,32,32,32,32,67,104,101,99,107,32,112,108,111,116,32,98,111,117,110,100,97,114,121,32,97,110,100,32,102,111,110,116,32,115,105,122,101,115,46,0,0,0,112,111,105,110,116,115,119,105,116,104,116,101,120,0,0,0,100,97,114,107,45,103,114,101,101,110,0,0,0,0,0,0,32,116,111,32,0,0,0,0,97,117,36,116,111,0,0,0,10,115,101,116,32,37,115,100,116,105,99,115,0,0,0,0,51,54,48,32,109,117,108,32,115,105,110,32,97,98,115,0,112,111,105,110,116,115,119,105,116,104,109,101,116,97,112,111,115,116,0,0,0,0,0,0,32,114,116,111,32,0,0,0,101,120,112,101,99,116,105,110,103,32,99,111,109,109,97,32,116,111,32,115,101,112,97,114,97,116,101,32,105,110,99,114,44,115,116,111,112,32,108,101,118,101,108,115,0,0,0,0,10,115,101,116,32,37,115,109,116,105,99,115,0,0,0,0,112,111,105,110,116,115,119,105,116,104,109,112,0,0,0,0,103,111,108,100,0,0,0,0,10,9,32,32,102,114,111,109,32,0,0,0,0,0,0,0,105,110,99,114,101,109,101,110,116,32,99,97,110,110,111,116,32,98,101,32,48,0,0,0,97,117,116,111,102,114,101,113,32,0,0,0,0,0,0,0,77,97,120,46,32,110,117,109,98,101,114,32,111,102,32,100,97,116,97,32,112,111,105,110,116,115,32,115,99,97,108,101,100,32,117,112,32,116,111,58,32,37,100,10,0,0,0,0,69,68,70,32,104,101,97,100,101,114,0,0,0,0,0,0,116,101,120,36,112,111,105,110,116,115,0,0,0,0,0,0,108,105,103,104,116,45,116,117,114,113,117,111,105,115,101,0,110,111,102,105,108,108,101,100,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,99,111,109,109,97,32,116,111,32,115,101,112,97,114,97,116,101,32,115,116,97,114,116,44,105,110,99,114,32,108,101,118,101,108,115,0,0,0,10,115,101,116,32,37,115,116,105,99,115,32,0,0,0,0,108,111,103,49,48,95,98,97,115,101,32,61,61,32,49,46,48,0,0,0,0,0,0,0,109,112,36,112,111,105,110,116,115,0,0,0,0,0,0,0,108,105,103,104,116,45,112,105,110,107,0,0,0,0,0,0,101,109,112,116,121,0,0,0,105,110,36,99,114,101,109,101,110,116,97,108,0,0,0,0,97,115,115,105,103,110,0,0,32,97,117,116,111,106,117,115,116,105,102,121,0,0,0,0,112,111,112,32,48,0,0,0,116,101,120,116,115,99,97,108,101,0,0,0,0,0,0,0,108,105,103,104,116,45,103,111,108,100,101,110,114,111,100,0,119,104,105,108,101,0,0,0,102,105,108,108,101,100,0,0,101,120,112,101,99,116,105,110,103,32,99,111,109,109,97,32,116,111,32,115,101,112,97,114,97,116,101,32,100,105,115,99,114,101,116,101,32,108,101,118,101,108,115,0,0,0,0,0,32,32,83,116,100,32,68,101,118,58,32,32,37,115,32,37,115,32,37,115,10,0,0,0,98,121,32,37,100,32,0,0,117,115,104,111,114,116,0,0,102,111,110,116,115,99,97,108,101,0,0,0,0,0,0,0,108,105,103,104,116,45,99,121,97,110,0,0,0,0,0,0,9,97,114,114,111,119,32,37,100,44,32,37,115,32,37,115,32,37,115,0,0,0,0,0,108,105,110,101,115,116,121,108,101,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,100,105,115,99,114,101,116,101,32,108,101,118,101,108,0,0,0,0,0,0,0,0,105,109,112,117,108,115,101,115,10,0,0,0,0,0,0,0,67,97,110,110,111,116,32,99,111,110,116,111,117,114,32,110,111,110,32,103,114,105,100,32,100,97,116,97,46,32,80,108,101,97,115,101,32,117,115,101,32,34,115,101,116,32,100,103,114,105,100,51,100,34,46,0,98,105,110,100,95,99,111,109,109,97,110,100,45,62,114,104,115,0,0,0,0,0,0,0,108,119,0,0,0,0,0,0,108,105,103,104,116,45,109,97,103,101,110,116,97,0,0,0,75,80,95,69,110,100,0,0,9,107,101,121,32,116,105,116,108,101,32,105,115,32,34,37,115,34,10,0,0,0,0,0,100,105,36,115,99,114,101,116,101,0,0,0,0,0,0,0,82,101,115,117,108,116,105,110,103,32,115,116,114,105,110,103,32,105,115,32,116,111,111,32,108,111,110,103,0,0,0,0,108,105,110,101,119,36,105,100,116,104,0,0,0,0,0,0,108,105,103,104,116,45,98,108,117,101,0,0,0,0,0,0,37,100,32,102,111,114,32,118,101,114,116,105,99,97,108,32,97,108,105,103,110,109,101,110,116,10,0,0,0,0,0,0,108,101,36,118,101,108,115,0,111,117,116,0,0,0,0,0,100,108,0,0,0,0,0,0,108,105,103,104,116,45,103,114,101,101,110,0,0,0,0,0,9,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,114,111,119,115,32,105,115,32,0,0,0,0,0,98,36,115,112,108,105,110,101,0,0,0,0,0,0,0,0,107,101,121,0,0,0,0,0,100,97,115,104,108,36,101,110,103,116,104,0,0,0,0,0,108,105,103,104,116,45,114,101,100,0,0,0,0,0,0,0,99,97,108,99,117,108,97,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,0,0,99,36,117,98,105,99,115,112,108,105,110,101,0,0,0,0,97,120,105,115,0,0,0,0,99,111,115,40,51,54,48,120,41,0,0,0,0,0,0,0,115,113,117,97,114,101,36,100,0,0,0,0,0,0,0,0,103,114,101,121,49,48,48,0,37,100,32,102,111,114,32,104,111,114,105,122,111,110,116,97,108,32,97,108,105,103,110,109,101,110,116,10,0,0,0,0,108,105,36,110,101,97,114,0,115,101,116,32,37,115,116,105,99,115,32,37,115,32,37,115,32,115,99,97,108,101,32,37,103,44,37,103,32,37,115,109,105,114,114,111,114,32,37,115,32,0,0,0,0,0,0,0,98,101,118,101,108,36,101,100,0,0,0,0,0,0,0,0,103,114,101,121,57,48,0,0,9,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,99,111,108,117,109,110,115,32,105,115,32,0,0,115,101,116,32,110,111,37,115,116,105,99,115,10,0,0,0,79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,102,105,116,58,32,116,111,111,32,109,97,110,121,32,100,97,116,97,112,111,105,110,116,115,32,40,37,100,41,63,0,109,105,116,101,114,36,101,100,0,0,0,0,0,0,0,0,103,114,101,121,56,48,0,0,119,105,116,104,32,99,111,108,117,109,110,32,104,101,97,100,101,114,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,98,97,115,101,39,44,32,39,115,117,114,102,97,99,101,39,44,32,111,114,32,39,98,111,116,104,39,0,0,32,108,111,103,102,105,108,101,32,39,37,115,39,0,0,0,115,111,36,108,105,100,0,0,103,114,101,121,55,48,0,0,119,105,116,104,32,102,105,108,101,110,97,109,101,0,0,0,98,111,36,116,104,0,0,0,91,93,0,0,0,0,0,0,115,101,116,32,102,105,116,32,37,115,101,114,114,111,114,118,97,114,105,97,98,108,101,115,0,0,0,0,0,0,0,0,116,101,109,112,32,102,105,108,101,32,115,116,114,105,110,103,0,0,0,0,0,0,0,0,100,97,36,115,104,101,100,0,103,114,101,121,54,48,0,0,117,112,36,100,97,116,101,0,9,115,97,109,112,108,101,32,108,101,110,103,116,104,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,118,101,114,116,105,99,97,108,32,115,112,97,99,105,110,103,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,119,105,100,116,104,32,97,100,106,117,115,116,109,101,110,116,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,104,101,105,103,104,116,32,97,100,106,117,115,116,109,101,110,116,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,99,117,114,118,101,115,32,97,114,101,37,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,116,105,116,108,101,100,32,37,115,10,0,0,0,0,0,0,0,0,115,36,117,114,102,97,99,101,0,0,0,0,0,0,0,0,32,32,77,101,97,110,58,32,32,32,32,32,37,115,32,37,115,32,37,115,10,0,0,0,115,101,116,32,112,115,100,105,114,10,0,0,0,0,0,0,123,37,115,44,32,37,115,125,0,0,0,0,0,0,0,0,115,104,111,114,116,0,0,0,109,111,110,111,36,99,104,114,111,109,101,0,0,0,0,0,103,114,101,121,53,48,0,0,9,107,101,121,32,98,111,120,32,105,115,32,111,112,97,113,117,101,32,97,110,100,32,100,114,97,119,110,32,105,110,32,102,114,111,110,116,32,111,102,32,116,104,101,32,103,114,97,112,104,10,0,0,0,0,0,98,97,36,115,101,0,0,0,115,101,116,32,112,115,100,105,114,32,34,37,115,34,10,0,112,111,105,110,116,115,10,0,65,108,108,32,112,111,105,110,116,115,32,111,102,32,99,111,108,111,114,98,111,120,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,98,105,110,100,95,99,111,109,109,97,110,100,45,62,108,104,115,0,0,0,0,0,0,0,43,0,0,0,0,0,0,0,99,111,108,36,111,117,114,0,103,114,101,121,52,48,0,0,75,80,95,73,110,115,101,114,116,0,0,0,0,0,0,0,110,111,116,32,98,111,120,101,100,10,0,0,0,0,0,0,83,99,97,108,101,32,102,97,99,116,111,114,115,32,109,117,115,116,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,32,45,32,110,111,116,32,99,104,97,110,103,101,100,33,0,0,115,101,116,32,102,111,110,116,112,97,116,104,32,0,0,0,68,111,117,98,108,101,0,0,102,95,115,116,114,102,116,105,109,101,58,32,98,117,102,102,101,114,0,0,0,0,0,0,105,110,105,116,32,100,121,110,97,114,114,97,121,0,0,0,99,111,108,36,111,114,0,0,103,114,101,121,51,48,0,0,98,111,120,101,100,10,9,119,105,116,104,32,0,0,0,0,78,117,109,98,101,114,32,111,102,32,103,114,105,100,32,112,111,105,110,116,115,32,109,117,115,116,32,98,101,32,105,110,32,91,50,58,49,48,48,48,93,32,45,32,110,111,116,32,99,104,97,110,103,101,100,33,0,0,0,0,0,0,0,0,117,110,102,105,110,105,115,104,101,100,32,114,97,110,103,101,0,0,0,0,0,0,0,0,110,111,104,101,97,100,101,114,0,0,0,0,0,0,0,0,103,114,101,121,50,48,0,0,114,105,103,104,116,0,0,0,85,110,114,101,99,111,103,110,105,122,101,32,107,101,121,119,111,114,100,32,111,114,32,117,110,101,120,112,101,99,116,101,100,32,118,97,108,117,101,0,100,105,102,102,105,99,117,108,116,121,32,109,97,107,105,110,103,32,114,111,111,109,32,102,111,114,32,120,116,105,99,32,108,97,98,101,108,115,0,0,115,101,116,32,108,111,97,100,112,97,116,104,32,0,0,0,104,101,97,100,101,114,0,0,103,114,101,121,49,48,0,0,108,101,102,116,0,0,0,0,107,100,101,110,115,36,105,116,121,50,100,0,0,0,0,0,51,54,48,32,109,117,108,32,99,111,115,0,0,0,0,0,110,111,116,105,109,101,36,115,116,97,109,112,0,0,0,0,103,114,101,121,48,0,0,0,9,107,101,121,32,105,115,32,37,115,32,106,117,115,116,105,102,105,101,100,44,32,37,115,114,101,118,101,114,115,101,100,44,32,37,115,105,110,118,101,114,116,101,100,44,32,37,115,101,110,104,97,110,99,101,100,32,97,110,100,32,0,0,0,100,101,99,105,109,97,108,95,115,105,103,110,32,105,110,32,108,111,99,97,108,101,32,105,115,32,37,115,10,0,0,0,101,114,114,111,114,32,100,117,114,105,110,103,32,102,105,116,0,0,0,0,0,0,0,0,116,105,109,101,36,115,116,97,109,112,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,0,9,107,101,121,32,105,115,32,97,116,32,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,102,105,110,100,32,114,101,113,117,101,115,116,101,100,32,108,111,99,97,108,101,0,115,116,97,110,100,36,97,108,111,110,101,0,0,0,0,0,32,114,109,97,114,103,105,110,0,0,0,0,0,0,0,0,76,65,78,71,0,0,0,0,85,83,69,82,78,65,77,69,0,0,0,0,0,0,0,0,105,110,112,36,117,116,0,0,32,108,109,97,114,103,105,110,0,0,0,0,0,0,0,0,76,67,95,78,85,77,69,82,73,67,0,0,0,0,0,0,110,101,115,0,0,0,0,0,67,108,111,115,105,110,103,32,37,115,10,0,0,0,0,0,100,101,102,97,117,108,116,115,105,122,101,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,117,110,115,36,101,116,0,0,32,98,109,97,114,103,105,110,0,0,0,0,0,0,0,0,76,67,95,65,76,76,0,0,42,32,67,79,76,85,77,78,83,58,10,0,0,0,0,0,102,114,97,99,116,105,111,110,0,0,0,0,0,0,0,0,117,99,104,97,114,0,0,0,115,105,122,101,0,0,0,0,111,114,99,104,105,100,0,0,32,116,109,97,114,103,105,110,0,0,0,0,0,0,0,0,99,97,110,100,108,101,115,0,108,105,110,101,115,10,0,0,65,108,108,32,112,111,105,110,116,115,32,122,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,119,104,105,115,107,101,114,36,98,97,114,115,0,0,0,0,99,111,109,109,97,110,100,46,99,0,0,0,0,0,0,0,100,36,101,102,97,117,108,116,0,0,0,0,0,0,0,0,100,97,114,107,45,99,104,97,114,116,114,101,117,115,101,0,75,80,95,70,52,0,0,0,32,111,117,116,115,105,100,101,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,115,101,99,111,110,100,32,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,110,97,109,101,0,0,0,0,120,121,61,37,103,44,37,103,0,0,0,0,0,0,0,0,70,108,111,97,116,0,0,0,102,105,110,97,110,99,101,98,97,114,115,0,0,0,0,0,115,105,122,101,58,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,100,97,114,107,45,114,101,100,0,0,0,0,0,0,0,0,32,105,110,115,105,100,101,0,101,120,112,101,99,116,105,110,103,32,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,110,97,109,101,0,0,0,115,101,116,32,115,116,121,108,101,32,98,111,120,112,108,111,116,32,37,115,32,37,115,32,37,53,46,50,102,32,37,115,111,117,116,108,105,101,114,115,32,112,116,32,37,100,32,115,101,112,97,114,97,116,105,111,110,32,37,103,32,108,97,98,101,108,115,32,37,115,32,37,115,115,111,114,116,101,100,10,0,0,0,0,0,0,0,0,105,110,36,99,104,101,115,0,115,116,101,101,108,98,108,117,101,0,0,0,0,0,0,0,32,104,111,114,105,122,111,110,116,97,108,0,0,0,0,0,105,99,111,110,118,32,102,97,105,108,101,100,32,116,111,32,99,111,110,118,101,114,116,32,100,101,103,114,101,101,32,115,105,103,110,0,0,0,0,0,120,116,105,99,0,0,0,0,10,117,110,115,101,116,32,99,111,108,111,114,98,111,120,10,0,0,0,0,0,0,0,0,115,105,122,101,32,114,101,113,117,105,114,101,115,32,116,119,111,32,110,117,109,98,101,114,115,58,32,32,120,115,105,122,101,44,32,121,115,105,122,101,0,0,0,0,0,0,0,0,112,117,114,112,108,101,0,0,32,118,101,114,116,105,99,97,108,0,0,0,0,0,0,0,105,99,111,110,118,95,111,112,101,110,32,102,97,105,108,101,100,32,102,111,114,32,37,115,0,0,0,0,0,0,0,0,98,111,114,100,101,114,32,37,100,0,0,0,0,0,0,0,115,105,110,40,51,54,48,120,41,0,0,0,0,0,0,0,101,120,112,97,110,100,32,108,111,97,100,112,97,116,104,0,102,111,110,116,32,34,37,115,44,37,103,34,0,0,0,0,100,97,114,107,45,115,112,114,105,110,103,45,103,114,101,101,110,0,0,0,0,0,0,0,32,99,101,110,116,101,114,0,98,100,101,102,97,117,108,116,0,0,0,0,0,0,0,0,109,112,112,111,105,110,116,115,32,0,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,32,114,105,103,104,116,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,101,110,99,111,100,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,59,32,115,101,101,32,39,104,101,108,112,32,101,110,99,111,100,105,110,103,39,46,0,0,0,0,0,0,0,110,111,98,111,114,100,101,114,0,0,0,0,0,0,0,0,101,114,114,36,111,114,115,116,97,116,101,0,0,0,0,0,73,108,108,101,103,97,108,32,100,97,121,32,111,102,32,121,101,97,114,0,0,0,0,0,116,101,120,112,111,105,110,116,115,32,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,0,0,0,0,0,0,0,32,108,101,102,116,0,0,0,57,51,50,0,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,104,111,115,116,115,99,114,105,112,116,47,102,111,110,116,115,0,0,0,0,0,0,85,83,69,82,0,0,0,0,115,111,108,105,100,0,0,0,100,97,114,107,45,121,101,108,108,111,119,0,0,0,0,0,83,74,73,83,0,0,0,0,101,113,115,0,0,0,0,0,104,111,114,105,122,111,110,116,0,0,0,0,0,0,0,0,78,111,32,116,101,114,109,105,110,97,108,32,100,101,102,105,110,101,100,0,0,0,0,0,100,97,115,104,101,100,0,0,100,97,114,107,45,111,114,97,110,103,101,0,0,0,0,0,117,110,100,36,101,102,105,110,101,0,0,0,0,0,0,0,9,107,101,121,32,105,115,32,79,78,44,32,112,111,115,105,116,105,111,110,58,32,0,0,118,101,114,116,105,99,0,0,99,0,0,0,0,0,0,0,32,37,115,32,100,97,115,104,108,101,110,103,116,104,32,37,103,32,108,105,110,101,119,105,100,116,104,32,37,103,32,102,111,110,116,115,99,97,108,101,32,37,103,32,92,10,32,32,32,0,0,0,0,0,0,0,100,97,114,107,45,99,121,97,110,0,0,0,0,0,0,0,9,107,101,121,32,105,115,32,79,70,70,10,0,0,0,0,85,84,70,0,0,0,0,0,115,101,116,32,99,111,108,111,114,98,111,120,32,37,115,97,108,32,111,114,105,103,105,110,32,0,0,0,0,0,0,0,32,114,103,98,32,34,35,37,54,46,54,120,34,32,0,0,65,108,108,32,112,111,105,110,116,115,32,121,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,111,110,108,121,32,102,111,114,32,100,97,116,97,102,105,108,101,115,44,32,114,101,118,101,114,116,105,110,103,32,116,111,32,34,112,111,105,110,116,115,34,0,0,0,0,40,98,105,110,100,95,99,111,109,109,97,110,100,41,32,37,115,58,37,100,10,0,0,0,60,61,0,0,0,0,0,0,114,111,117,110,100,0,0,0,100,97,114,107,45,109,97,103,101,110,116,97,0,0,0,0,75,80,95,70,51,0,0,0,32,111,110,108,121,10,0,0,117,116,102,0,0,0,0,0,37,115,61,37,103,0,0,0,68,111,117,98,108,101,86,97,108,117,101,0,0,0,0,0,102,95,115,116,114,102,116,105,109,101,58,32,102,109,116,0,117,115,101,114,0,0,0,0,98,101,118,101,108,101,100,32,0,0,0,0,0,0,0,0,119,101,98,45,98,108,117,101,0,0,0,0,0,0,0,0,9,110,111,32,108,111,103,115,99,97,108,105,110,103,10,0,108,111,99,97,108,101,0,0,115,101,116,32,99,111,108,111,114,98,111,120,32,37,115,10,0,0,0,0,0,0,0,0,114,111,117,110,100,101,100,32,0,0,0,0,0,0,0,0,119,101,98,45,103,114,101,101,110,0,0,0,0,0,0,0,32,97,110,100,0,0,0,0,117,110,107,110,111,119,110,32,45,45,45,32,101,120,112,101,99,116,101,100,32,39,108,111,103,102,105,108,101,39,32,111,114,32,91,110,111,93,101,114,114,111,114,118,97,114,105,97,98,108,101,115,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,111,102,32,99,111,108,111,114,32,97,120,105,115,32,117,110,100,101,102,105,110,101,100,46,0,0,0,0,0,105,115,111,95,56,56,53,57,95,57,0,0,0,0,0,0,10,35,32,120,32,121,0,0,109,105,116,101,114,101,100,32,0,0,0,0,0,0,0,0,9,108,111,103,115,99,97,108,105,110,103,0,0,0,0,0,110,111,113,117,105,101,116,0,99,117,98,101,104,101,108,105,120,32,115,116,97,114,116,32,37,46,50,103,32,99,121,99,108,101,115,32,37,46,50,103,32,115,97,116,117,114,97,116,105,111,110,32,37,46,50,103,10,0,0,0,0,0,0,0,51,54,48,32,109,117,108,32,115,105,110,0,0,0,0,0,109,111,110,111,99,104,114,111,109,101,32,0,0,0,0,0,100,97,114,107,45,103,114,101,121,0,0,0,0,0,0,0,37,115,32,37,115,32,40,98,97,115,101,32,37,103,41,0,113,117,105,101,116,0,0,0,102,117,110,99,116,105,111,110,115,32,37,115,44,32,37,115,44,32,37,115,10,0,0,0,112,117,115,104,100,49,0,0,99,111,108,111,114,32,0,0,110,101,120,116,102,114,111,109,95,100,121,110,97,114,114,97,121,58,32,100,121,110,97,114,114,97,121,32,119,97,110,39,116,32,105,110,105,116,105,97,108,105,122,101,100,33,0,0,9,111,102,102,115,101,116,115,32,97,114,101,0,0,0,0,110,111,101,114,114,36,111,114,118,97,114,105,97,98,108,101,115,0,0,0,0,0,0,0,32,41,10,0,0,0,0,0,122,58,115,10,0,0,0,0,34,32,92,10,32,32,32,0,9,116,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,101,114,114,36,111,114,118,97,114,105,97,98,108,101,115,0,92,10,32,32,32,32,0,0,47,117,115,114,47,115,104,97,114,101,47,103,104,111,115,116,115,99,114,105,112,116,47,102,111,110,116,115,0,0,0,0,37,51,111,37,110,0,0,0,34,0,0,0,0,0,0,0,99,111,114,110,101,114,115,50,99,36,111,108,111,114,0,0,9,116,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,101,120,112,101,99,116,105,110,103,32,115,116,114,105,110,103,0,0,0,0,0,0,0,0,99,111,110,99,97,116,101,110,97,116,101,0,0,0,0,0,99,97,110,110,111,116,32,111,112,101,110,32,102,105,108,101,59,32,111,117,116,112,117,116,32,110,111,116,32,99,104,97,110,103,101,100,0,0,0,0,37,115,0,0,0,0,0,0,92,10,32,32,32,104,101,97,100,101,114,32,0,0,0,0,101,36,120,112,108,105,99,105,116,0,0,0,0,0,0,0,116,101,115,116,0,0,0,0,9,116,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,108,111,103,36,102,105,108,101,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,99,97,36,108,108,0,0,0,32,37,46,52,103,32,37,46,52,103,32,37,46,52,103,32,37,46,52,103,0,0,0,0,72,69,76,80,70,73,76,69,32,32,32,32,32,32,32,32,32,32,32,61,32,34,37,115,34,10,0,0,0,0,0,0,115,99,104,97,114,0,0,0,110,111,104,101,97,100,101,114,32,92,10,32,32,32,0,0,110,111,105,36,109,112,108,105,99,105,116,0,0,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,100,101,102,105,110,101,100,32,40,0,0,0,0,0,0,0])
-.concat([79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,115,116,97,116,115,58,32,116,111,111,32,109,97,110,121,32,100,97,116,97,112,111,105,110,116,115,32,40,37,100,41,63,0,0,0,0,0,0,0,32,114,103,98,32,34,37,115,34,32,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,120,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,34,119,105,116,104,34,32,97,108,108,111,119,101,100,32,111,110,108,121,32,97,102,116,101,114,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,0,97,108,108,36,119,105,110,100,111,119,115,0,0,0,0,0,62,61,0,0,0,0,0,0,110,111,116,105,109,101,115,116,97,109,112,0,0,0,0,0,110,111,101,36,120,112,108,105,99,105,116,0,0,0,0,0,75,80,95,70,50,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,99,108,111,115,101,100,0,0,70,108,111,97,116,86,97,108,117,101,0,0,0,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,115,116,114,102,116,105,109,101,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,114,103,98,102,111,114,109,117,108,97,101,32,37,100,44,32,37,100,44,32,37,100,10,0,114,97,36,105,115,101,0,0,100,111,109,97,105,110,0,0,116,105,109,101,115,116,97,109,112,0,0,0,0,0,0,0,105,36,109,112,108,105,99,105,116,0,0,0,0,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,78,97,78,0,0,0,0,0,10,115,101,116,32,112,97,108,101,116,116,101,32,0,0,0,119,104,105,99,104,61,61,65,85,84,79,83,67,65,76,69,95,77,73,78,32,124,124,32,119,104,105,99,104,61,61,65,85,84,79,83,67,65,76,69,95,77,65,88,0,0,0,0,105,110,112,117,116,0,0,0,116,114,36,97,110,115,112,97,114,101,110,116,0,0,0,0,9,98,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,108,97,121,101,114,100,36,101,102,97,117,108,116,0,0,0,87,97,114,110,105,110,103,32,45,32,100,105,102,102,105,99,117,108,116,121,32,102,105,116,116,105,110,103,32,112,108,111,116,32,116,105,116,108,101,115,32,105,110,116,111,32,107,101,121,0,0,0,0,0,0,0,115,97,118,101,46,99,0,0,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,110,111,115,111,36,108,105,100,0,0,0,0,0,0,0,0,9,98,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,110,111,112,111,36,108,97,114,0,0,0,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,46,10,0,124,99,111,115,40,49,56,48,120,41,124,0,0,0,0,0,115,105,122,101,32,37,103,37,115,44,37,103,37,115,32,37,115,32,37,115,32,37,115,0,110,111,116,114,36,97,110,115,112,97,114,101,110,116,0,0,9,98,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,112,111,36,108,97,114,0,0,88,89,90,32,0,0,0,0,107,101,121,119,111,114,100,32,39,100,97,116,97,39,32,100,101,112,114,101,99,97,116,101,100,44,32,117,115,101,32,39,115,104,111,119,32,115,116,121,108,101,32,100,97,116,97,39,0,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,32,105,110,32,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,0,0,9,108,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,110,111,114,36,116,105,99,115,0,0,0,0,0,0,0,0,89,73,81,32,0,0,0,0,122,10,0,0,0,0,0,0,71,110,117,112,108,111,116,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,111,117,116,32,115,117,112,112,111,114,116,32,102,111,114,32,80,78,71,32,105,109,97,103,101,115,46,32,89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,114,101,98,117,105,108,100,32,103,110,117,112,108,111,116,46,0,0,0,0,0,0,0,0,110,111,104,105,36,100,100,101,110,51,100,0,0,0,0,0,9,108,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,110,111,109,99,98,36,116,105,99,115,0,0,0,0,0,0,67,77,89,32,0,0,0,0,47,117,115,114,47,108,105,98,47,88,49,49,47,102,111,110,116,115,33,0,0,0,0,0,37,52,111,37,110,0,0,0,97,114,114,111,119,32,110,111,116,32,102,111,117,110,100,0,83,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,104,101,97,100,101,114,32,105,110,102,111,114,109,97,116,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,104,105,36,100,100,101,110,51,100,0,0,0,0,0,0,0,9,108,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,110,111,99,98,36,116,105,99,115,0,0,0,0,0,0,0,72,83,86,32,0,0,0,0,100,111,108,108,97,114,115,0,119,98,0,0,0,0,0,0,101,110,108,0,0,0,0,0,10,92,115,116,97,114,116,116,101,120,116,10,10,0,0,0,109,97,112,0,0,0,0,0,115,121,36,115,116,101,109,0,9,111,117,116,112,117,116,32,105,115,32,115,101,110,116,32,116,111,32,83,84,68,79,85,84,10,0,0,0,0,0,0,110,111,109,121,50,36,116,105,99,115,0,0,0,0,0,0,115,117,109,120,121,0,0,0,82,71,66,32,0,0,0,0,99,104,97,114,0,0,0,0,101,120,116,101,114,110,97,108,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,37,99,0,0,0,0,99,108,105,112,52,36,105,110,0,0,0,0,0,0,0,0,9,111,117,116,112,117,116,32,105,115,32,115,101,110,116,32,116,111,32,39,37,115,39,10,0,0,0,0,0,0,0,0,110,111,109,120,50,36,116,105,99,115,0,0,0,0,0,0,99,111,108,111,114,32,109,111,100,101,108,32,0,0,0,0,32,114,103,98,32,118,97,114,105,97,98,108,101,32,0,0,110,111,32,102,117,110,99,116,105,111,110,115,32,111,114,32,100,97,116,97,32,116,111,32,112,108,111,116,0,0,0,0,42,0,0,0,0,0,0,0,105,110,108,105,110,101,0,0,99,108,105,112,49,36,105,110,0,0,0,0,0,0,0,0,75,80,95,70,49,0,0,0,9,112,114,105,110,116,32,111,117,116,112,117,116,32,105,115,32,115,101,110,116,32,116,111,32,39,37,115,39,10,0,0,110,111,109,122,36,116,105,99,115,0,0,0,0,0,0,0,98,101,108,111,119,32,0,0,83,105,103,110,101,100,76,111,110,103,0,0,0,0,0,0,102,95,103,112,114,105,110,116,102,0,0,0,0,0,0,0,103,114,97,121,10,0,0,0,32,32,32,32,105,109,97,103,101,115,61,37,115,93,32,37,37,32,42,105,110,108,105,110,101,42,32,124,32,101,120,116,101,114,110,97,108,32,40,105,110,108,105,110,101,32,111,110,108,121,32,119,111,114,107,115,32,105,110,32,77,75,73,86,44,32,101,120,116,101,114,110,97,108,32,114,101,113,117,105,114,101,115,32,112,110,103,32,115,117,112,112,111,114,116,32,105,110,32,103,110,117,112,108,111,116,41,10,0,0,0,0,110,111,102,116,114,36,105,97,110,103,108,101,115,0,0,0,9,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,105,114,101,99,116,111,114,121,32,34,37,115,34,10,0,110,111,109,121,36,116,105,99,115,0,0,0,0,0,0,0,103,97,109,109,97,32,37,103,32,0,0,0,0,0,0,0,99,111,110,116,111,117,114,32,99,111,111,114,100,115,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,115,116,97,116,115,0,0,116,101,120,0,0,0,0,0,102,116,114,36,105,97,110,103,108,101,115,0,0,0,0,0,110,111,109,120,36,116,105,99,115,0,0,0,0,0,0,0,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,0,0,98,111,117,110,100,97,114,121,0,0,0,0,0,0,0,0,35,32,67,111,110,116,111,117,114,58,32,112,111,105,110,116,115,32,37,105,44,32,122,32,37,103,44,32,108,97,98,101,108,58,32,37,115,10,0,0,109,101,116,97,112,111,115,116,0,0,0,0,0,0,0,0,102,108,36,117,115,104,0,0,9,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32,71,78,85,80,76,79,84,95,80,83,95,68,73,82,58,32,0,0,110,111,121,50,36,116,105,99,115,0,0,0,0,0,0,0,117,115,101,32,39,115,101,116,32,116,101,114,109,39,32,116,111,32,115,101,116,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,102,105,114,115,116,0,0,0,0,0,0,0,49,56,48,32,109,117,108,32,99,111,115,32,97,98,115,0,32,32,32,32,112,111,105,110,116,115,61,37,115,44,32,37,37,32,42,109,101,116,97,112,111,115,116,42,32,124,32,116,101,120,32,40,83,104,111,117,108,100,32,112,111,105,110,116,115,32,98,101,32,100,114,97,119,110,32,119,105,116,104,32,77,101,116,97,80,111,115,116,32,111,114,32,84,101,88,63,41,10,0,0,0,0,0,0,100,101,112,36,116,104,111,114,100,101,114,0,0,0,0,0,110,111,110,101,0,0,0,0,110,111,120,50,36,116,105,99,115,0,0,0,0,0,0,0,110,101,103,97,116,105,118,101,0,0,0,0,0,0,0,0,45,104,0,0,0,0,0,0,32,32,32,32,37,37,102,111,110,116,115,99,97,108,101,61,37,103,44,32,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,116,101,120,116,32,108,97,98,101,108,115,10,0,0,115,99,97,110,115,97,117,116,111,36,109,97,116,105,99,0,110,111,122,36,116,105,99,115,0,0,0,0,0,0,0,0,112,111,115,105,116,105,118,101,0,0,0,0,0,0,0,0,37,115,58,0,0,0,0,0,101,120,112,114,101,115,115,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,0,0,32,32,32,32,108,105,110,101,119,105,100,116,104,61,37,103,44,32,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,108,105,110,101,32,119,105,100,116,104,115,32,40,49,46,48,32,109,101,97,110,115,32,48,46,53,98,112,41,10,0,0,115,99,97,110,115,98,97,99,107,36,119,97,114,100,0,0,9,100,105,114,101,99,116,111,114,121,32,102,114,111,109,32,39,115,101,116,32,112,115,100,105,114,39,58,32,0,0,0,110,111,121,36,116,105,99,115,0,0,0,0,0,0,0,0,115,101,116,32,112,97,108,101,116,116,101,32,37,115,32,37,115,32,109,97,120,99,111,108,111,114,115,32,37,100,32,0,47,117,115,114,47,88,49,49,82,54,47,108,105,98,47,88,49,49,47,102,111,110,116,115,47,116,114,117,101,116,121,112,101,0,0,0,0,0,0,0,119,97,114,110,105,110,103,58,32,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,117,110,115,101,116,32,97,114,114,111,119,0,0,0,0,0,32,32,32,32,100,97,115,104,108,101,110,103,116,104,61,37,103,44,32,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,100,97,115,104,32,108,101,110,103,116,104,115,10,0,0,115,99,97,110,115,102,111,114,36,119,97,114,100,0,0,0,9,112,97,114,97,109,101,116,114,105,99,32,105,115,32,37,115,10,0,0,0,0,0,0,110,111,120,36,116,105,99,115,0,0,0,0,0,0,0,0,99,37,105,0,0,0,0,0,98,111,111,108,0,0,0,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,105,112,101,59,32,111,117,116,112,117,116,32,110,111,116,32,99,104,97,110,103,101,100,0,0,10,35,32,67,111,110,116,111,117,114,32,37,100,44,32,108,97,98,101,108,58,32,37,115,10,0,0,0,0,0,0,0,110,111,0,0,0,0,0,0,105,110,116,101,114,112,36,111,108,97,116,101,0,0,0,0,115,116,36,97,116,115,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,32,61,32,37,51,105,32,37,51,105,32,37,51,105,0,0,0,0,0,105,103,110,111,114,105,110,103,32,108,101,102,116,47,99,101,110,116,101,114,47,114,105,103,104,116,59,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,108,109,97,114,103,105,110,47,116,109,97,114,103,105,110,46,0,0,99,111,114,114,101,108,97,116,105,111,110,0,0,0,0,0,114,101,112,108,111,116,0,0,101,120,116,101,110,100,32,116,111,107,101,110,32,116,97,98,108,101,0,0,0,0,0,0,71,78,85,80,76,79,84,95,80,83,95,68,73,82,32,32,32,32,32,61,32,34,37,115,34,10,0,0,0,0,0,0,122,114,116,0,0,0,0,0,121,101,115,0,0,0,0,0,88,89,90,0,0,0,0,0,10,32,32,37,45,49,56,115,32,0,0,0,0,0,0,0,111,102,36,102,115,101,116,0,105,103,110,111,114,105,110,103,32,116,111,112,47,99,101,110,116,101,114,47,98,111,116,116,111,109,59,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,116,109,97,114,103,105,110,47,98,109,97,114,103,105,110,46,0,0,32,112,97,108,101,116,116,101,32,102,114,97,99,116,105,111,110,32,37,52,46,50,102,0,105,103,110,111,114,105,110,103,32,116,114,97,105,108,105,110,103,32,99,111,109,109,97,32,105,110,32,112,108,111,116,32,99,111,109,109,97,110,100,0,46,103,110,117,112,108,111,116,0,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,117,115,97,103,101,58,32,114,97,105,115,101,32,123,112,108,111,116,95,105,100,125,0,0,119,32,61,32,48,32,105,110,32,71,105,118,101,110,115,40,41,59,32,32,67,106,106,32,61,32,37,103,44,32,32,67,105,106,32,61,32,37,103,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,44,32,110,101,101,100,32,97,116,32,108,101,97,115,116,32,52,32,112,111,105,110,116,115,0,0,0,32,32,32,32,100,97,115,104,101,100,61,37,115,44,32,37,37,32,42,121,101,115,42,32,124,32,110,111,10,0,0,0,89,73,81,0,0,0,0,0,75,80,95,84,97,98,0,0,102,105,108,108,101,100,95,112,111,108,121,103,111,110,95,122,102,105,120,32,99,111,114,110,101,114,115,0,0,0,0,0,9,84,104,101,114,101,32,97,114,101,32,37,100,32,112,114,101,100,101,102,105,110,101,100,32,99,111,108,111,114,32,110,97,109,101,115,58,0,0,0,117,110,107,110,111,119,110,32,107,101,121,32,111,112,116,105,111,110,0,0,0,0,0,0,97,98,111,118,101,32,0,0,85,110,115,105,103,110,101,100,76,111,110,103,0,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,103,112,114,105,110,116,102,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,0,99,97,110,32,111,110,108,121,32,100,111,32,101,108,108,105,112,116,105,99,32,105,110,116,101,103,114,97,108,115,32,111,102,32,114,101,97,108,115,0,44,32,37,37,32,42,98,117,116,116,42,32,124,32,114,111,117,110,100,101,100,32,124,32,115,113,117,97,114,101,100,10,0,0,0,0,0,0,0,0,67,77,89,0,0,0,0,0,37,105,9,37,105,9,37,105,10,0,0,0,0,0,0,0,97,36,117,116,111,109,97,116,105,99,0,0,0,0,0,0,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,108,105,109,105,116,32,101,120,99,101,101,100,101,100,0,0,116,105,99,107,32,105,110,116,101,114,118,97,108,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,109,97,99,104,105,110,101,32,112,114,101,99,105,115,105,111,110,0,0,0,115,113,117,97,114,101,100,0,72,83,86,0,0,0,0,0,37,48,46,52,102,9,37,48,46,52,102,9,37,48,46,52,102,10,0,0,0,0,0,0,99,111,108,36,117,109,110,104,101,97,100,101,114,0,0,0,95,94,0,0,0,0,0,0,98,117,116,116,0,0,0,0,82,71,66,0,0,0,0,0,46,10,0,0,0,0,0,0,77,117,108,116,105,112,108,101,32,115,116,97,99,107,32,100,105,114,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,0,0,0,0,32,99,111,114,110,101,114,115,50,99,111,108,111,114,32,0,115,105,110,40,49,56,48,120,41,0,0,0,0,0,0,0,32,32,32,32,108,105,110,101,99,97,112,61,0,0,0,0,99,117,98,101,104,101,108,105,120,0,0,0,0,0,0,0,32,115,97,118,101,100,32,116,111,32,34,37,115,34,46,0,77,117,108,116,105,112,108,101,32,108,111,99,97,116,105,111,110,32,114,101,103,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,0,0,0,0,32,110,111,104,105,100,100,101,110,51,100,0,0,0,0,0,105,110,118,101,114,115,101,95,101,114,114,111,114,95,102,117,110,99,58,32,84,104,101,32,118,97,108,117,101,32,111,117,116,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,0,0,44,32,37,37,32,42,109,105,116,101,114,101,100,42,32,124,32,114,111,117,110,100,101,100,32,124,32,98,101,118,101,108,101,100,10,0,0,0,0,0,103,97,109,36,109,97,0,0,67,111,108,111,114,0,0,0,77,117,108,116,105,112,108,101,32,104,111,114,105,122,111,110,116,97,108,32,112,111,115,105,116,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,32,104,105,100,100,101,110,51,100,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,102,111,114,109,97,116,32,61,32,0,0,0,0,0,0,0,98,101,118,101,108,101,100,0,109,97,120,99,36,111,108,111,114,115,0,0,0,0,0,0,71,114,97,121,0,0,0,0,77,117,108,116,105,112,108,101,32,118,101,114,116,105,99,97,108,32,112,111,115,105,116,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,0,0,32,104,105,100,100,101,110,51,100,32,37,100,0,0,0,0,47,117,115,114,47,88,49,49,82,54,47,108,105,98,47,88,49,49,47,102,111,110,116,115,47,84,121,112,101,49,0,0,71,80,86,65,76,95,69,82,82,77,83,71,0,0,0,0,116,121,120,0,0,0,0,0,114,111,117,110,100,101,100,0,112,115,95,97,108,108,99,70,0,0,0,0,0,0,0,0,37,115,32,112,97,108,101,116,116,101,32,119,105,116,104,32,37,105,32,100,105,115,99,114,101,116,101,32,99,111,108,111,114,115,0,0,0,0,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,99,108,111,115,105,110,103,0,0,0,0,102,116,114,105,97,110,103,108,101,115,0,0,0,0,0,0,102,97,99,116,111,114,105,97,108,0,0,0,0,0,0,0,119,0,0,0,0,0,0,0,37,99,10,0,0,0,0,0,109,105,116,101,114,101,100,0,110,111,112,115,95,97,108,108,99,70,0,0,0,0,0,0,115,112,36,108,111,116,0,0,101,120,112,101,99,116,105,110,103,32,110,111,32,111,112,116,105,111,110,32,111,114,32,105,110,116,32,111,114,32,102,108,111,97,116,0,0,0,0,0,115,116,114,105,110,103,32,101,120,112,101,99,116,101,100,0,105,110,116,101,114,99,101,112,116,0,0,0,0,0,0,0,32,110,111,0,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,47,103,110,117,112,108,111,116,46,103,105,104,0,0,0,0,0,0,0,0,116,122,114,0,0,0,0,0,108,105,110,101,106,111,105,110,61,0,0,0,0,0,0,0,109,111,36,100,101,108,0,0,105,36,110,116,0,0,0,0,110,111,112,111,36,105,110,116,0,0,0,0,0,0,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,114,101,115,105,122,101,32,112,97,116,116,101,114,110,0,0,0,0,0,67,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110,32,115,111,109,101,32,109,97,116,114,105,120,32,98,105,110,97,114,121,32,97,110,100,32,103,101,110,101,114,97,108,32,98,105,110,97,114,121,32,107,101,121,119,111,114,100,115,0,32,112,97,108,101,116,116,101,32,99,98,32,37,103,0,0,115,97,109,112,108,101,115,32,111,114,32,105,115,111,95,115,97,109,112,108,101,115,32,60,32,50,46,32,77,117,115,116,32,98,101,32,97,116,32,108,101,97,115,116,32,50,46,0,103,110,117,112,108,111,116,114,99,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,117,115,97,103,101,58,32,108,111,119,101,114,32,123,112,108,111,116,95,105,100,125,0,0,92,115,101,116,117,112,71,78,85,80,76,79,84,116,101,114,109,105,110,97,108,10,32,32,32,91,99,111,110,116,101,120,116,93,10,32,32,32,91,0,102,117,110,99,36,116,105,111,110,115,0,0,0,0,0,0,75,80,95,83,112,97,99,101,0,0,0,0,0,0,0,0,102,36,108,111,97,116,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,110,101,120,116,32,110,117,109,98,101,114,0,0,0,0,0,0,0,0,115,121,110,116,97,120,32,105,115,32,120,121,61,60,120,62,44,60,121,62,0,0,0,0,83,105,103,110,101,100,73,110,116,101,103,101,114,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,105,110,118,97,108,105,100,32,115,112,101,99,95,116,121,112,101,0,0,0,0,0,0,0,76,97,115,116,32,108,105,110,101,32,109,117,115,116,32,110,111,116,32,98,101,32,98,101,102,111,114,101,32,102,105,114,115,116,32,108,105,110,101,0,92,115,101,116,117,112,98,111,100,121,102,111,110,116,10,32,32,32,91,37,115,37,115,37,103,112,116,93,10,0,0,0,102,105,108,101,0,0,0,0,112,97,108,101,116,116,101,32,115,105,122,101,32,114,101,113,117,105,114,101,100,0,0,0,99,111,110,115,116,97,110,116,32,101,120,112,114,101,115,115,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,0,98,101,103,105,110,0,0,0,76,97,115,116,32,112,111,105,110,116,32,109,117,115,116,32,110,111,116,32,98,101,32,98,101,102,111,114,101,32,102,105,114,115,116,32,112,111,105,110,116,0,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,97,120,105,115,32,116,105,99,107,115,32,114,101,113,117,101,115,116,101,100,32,40,62,37,46,48,103,41,0,0,0,102,117,110,99,116,105,111,110,32,37,115,32,114,101,113,117,105,114,101,115,32,37,100,32,118,97,114,105,97,98,108,101,115,0,0,0,0,0,0,0,92,100,101,102,105,110,101,98,111,100,121,102,111,110,116,101,110,118,105,114,111,110,109,101,110,116,10,32,32,32,91,37,103,112,116,93,10,0,0,0,100,101,102,36,105,110,101,100,0,0,0,0,0,0,0,0,37,51,105,46,32,103,114,97,121,61,37,48,46,52,102,44,32,40,114,44,103,44,98,41,61,40,37,48,46,52,102,44,37,48,46,52,102,44,37,48,46,52,102,41,44,32,35,37,48,50,120,37,48,50,120,37,48,50,120,32,61,32,37,51,105,32,37,51,105,32,37,51,105,10,0,0,0,0,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,111,117,116,112,117,116,32,98,117,102,102,101,114,0,0,0,0,0,0,69,120,112,101,99,116,101,100,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,0,0,0,114,103,98,36,102,111,114,109,117,108,97,101,0,0,0,0,9,99,111,108,111,114,32,109,97,112,112,105,110,103,32,42,110,111,116,42,32,100,111,110,101,32,98,121,32,100,101,102,105,110,101,100,32,103,114,97,100,105,101,110,116,46,10,0,112,111,105,110,116,116,36,121,112,101,0,0,0,0,0,0,32,102,108,117,115,104,32,0,69,120,112,101,99,116,101,100,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,0,0,0,0,0,0,0,49,56,48,32,109,117,108,32,115,105,110,0,0,0,0,0,92,115,101,116,117,112,99,111,108,111,114,115,10,32,32,32,91,115,116,97,116,101,61,115,116,97,114,116,93,10,0,0,9,32,32,42,32,116,104,117,115,32,116,104,101,32,114,97,110,103,101,115,32,105,110,32,96,115,101,116,32,112,109,51,100,32,114,103,98,102,111,114,109,117,108,97,101,39,32,97,114,101,32,45,37,105,46,46,37,105,10,0,0,0,0,0,108,105,110,101,116,36,121,112,101,0,0,0,0,0,0,0,115,101,116,32,112,109,51,100,32,105,110,116,101,114,112,111,108,97,116,101,32,37,100,44,37,100,0,0,0,0,0,0,73,110,100,101,120,32,115,116,101,112,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,0,0,0,0,92,117,115,101,109,111,100,117,108,101,10,32,32,32,91,103,110,117,112,108,111,116,93,10,0,0,0,0,0,0,0,0,78,111,32,115,117,99,104,32,111,112,116,105,111,110,32,116,111,32,104,105,100,100,101,110,51,100,32,40,111,114,32,119,114,111,110,103,32,111,114,100,101,114,41,0,0,0,0,0,103,114,101,121,0,0,0,0,9,32,32,42,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,115,32,109,101,97,110,32,105,110,118,101,114,116,101,100,61,110,101,103,97,116,105,118,101,32,99,111,108,111,117,114,32,99,111,109,112,111,110,101,110,116,10,0,0,100,101,112,116,104,111,114,100,101,114,10,0,0,0,0,0,85,112,112,101,114,32,105,110,100,101,120,32,115,104,111,117,108,100,32,98,101,32,98,105,103,103,101,114,32,116,104,97,110,32,108,111,119,101,114,32,105,110,100,101,120,0,0,0,70,73,84,58,32,32,32,32,100,97,116,97,32,114,101,97,100,32,102,114,111,109,32,37,115,10,0,0,0,0,0,0,92,101,110,97,98,108,101,114,101,103,105,109,101,10,32,32,32,91,117,116,102,45,56,93,10,0,0,0,0,0,0,0,37,50,105,58,32,37,45,49,53,115,0,0,0,0,0,0,115,99,97,110,115,98,97,99,107,119,97,114,100,10,0,0,66,105,110,97,114,121,32,109,97,116,114,105,120,32,102,105,108,101,32,102,111,114,109,97,116,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,117,114,102,97,99,101,32,112,101,114,32,102,105,108,101,0,67,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,112,111,105,110,116,115,39,44,32,39,111,110,101,39,44,32,111,114,32,39,116,119,111,39,0,0,0,0,0,76,73,78,69,83,0,0,0,37,37,32,83,101,101,32,97,108,115,111,32,104,116,116,112,58,47,47,119,105,107,105,46,99,111,110,116,101,120,116,103,97,114,100,101,110,46,110,101,116,47,71,110,117,112,108,111,116,10,37,37,10,0,0,0,110,101,103,36,97,116,105,118,101,0,0,0,0,0,0,0,10,9,32,32,32,32,0,0,99,101,110,116,114,101,0,0,115,99,97,110,115,102,111,114,119,97,114,100,10,0,0,0,112,111,119,101,114,0,0,0,73,110,32,109,117,108,116,105,112,108,111,116,32,109,111,100,101,32,121,111,117,32,99,97,110,39,116,32,99,104,97,110,103,101,32,116,104,101,32,111,117,116,112,117,116,10,0,0,32,100,101,108,116,97,95,120,32,100,101,108,116,97,95,121,32,100,101,108,116,97,95,122,0,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,32,118,101,114,115,105,111,110,58,32,37,115,46,37,115,44,32,116,101,114,109,105,110,97,108,32,118,101,114,115,105,111,110,58,32,37,115,46,37,115,32,40,37,115,41,10,0,0,0,0,0,0,0,0,112,111,115,36,105,116,105,118,101,0,0,0,0,0,0,0,115,104,36,111,119,0,0,0,9,32,32,42,32,116,104,101,114,101,32,97,114,101,32,37,105,32,97,118,97,105,108,97,98,108,101,32,114,103,98,32,99,111,108,111,114,32,109,97,112,112,105,110,103,32,102,111,114,109,117,108,97,101,58,0,115,108,111,112,101,0,0,0,115,99,97,110,115,97,117,116,111,109,97,116,105,99,10,0,102,70,101,69,103,71,0,0,71,78,85,72,69,76,80,0,10,0,0,0,0,0,0,0,114,116,122,0,0,0,0,0,98,97,36,99,107,0,0,0,9,84,104,101,32,98,101,115,116,32,109,97,116,99,104,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,97,108,101,116,116,101,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,10,9,32,32,32,32,115,101,116,32,112,97,108,101,116,116,101,32,114,103,98,102,111,114,109,117,108,97,101,32,37,105,44,37,105,44,37,105,10,0,0,0,0,112,111,36,105,110,116,0,0,32,97,116,32,37,115,10,0,43,45,35,48,49,50,51,52,53,54,55,56,57,46,0,0,32,112,97,108,101,116,116,101,32,122,0,0,0,0,0,0,121,32,114,97,110,103,101,0,110,101,0,0,0,0,0,0,32,111,110,58,32,37,115,0,102,114,36,111,110,116,0,0,66,101,103,105,110,0,0,0,102,111,114,109,117,108,97,101,32,112,116,115,0,0,0,0,116,109,112,32,108,111,97,100,112,97,116,104,0,0,0,0,101,120,112,108,105,99,105,116,0,0,0,0,0,0,0,0,102,95,115,112,114,105,110,116,102,58,32,97,116,116,101,109,112,116,32,116,111,32,112,114,105,110,116,32,115,116,114,105,110,103,32,118,97,108,117,101,32,119,105,116,104,32,110,117,109,101,114,105,99,32,102,111,114,109,97,116,0,0,0,0,85,110,115,105,103,110,101,100,73,110,116,101,103,101,114,0,116,105,99,108,97,98,101,108,115,32,109,117,115,116,32,99,111,109,101,32,102,114,111,109,32,97,32,114,101,97,108,32,99,111,108,117,109,110,0,0,37,89,45,37,109,45,37,100,32,37,72,58,37,77,32,37,90,0,0,0,0,0,0,0,102,111,114,109,117,108,97,101,0,0,0,0,0,0,0,0,116,109,112,32,102,111,110,116,112,97,116,104,0,0,0,0,105,109,112,108,105,99,105,116,0,0,0,0,0,0,0,0,102,111,114,109,97,116,32,109,117,115,116,32,104,97,118,101,32,49,45,55,32,99,111,110,118,101,114,115,105,111,110,115,32,111,102,32,116,121,112,101,32,100,111,117,98,108,101,32,40,37,37,108,102,41,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,117,110,107,110,111,119,110,32,116,105,99,32,116,121,112,101,0,0,0,0,0,0,0,37,37,32,87,114,105,116,116,101,110,32,98,121,32,67,111,110,84,101,88,116,32,116,101,114,109,105,110,97,108,32,102,111,114,32,71,78,85,80,76,79,84,0,0,0,0,0,0,111,36,114,105,103,105,110,0,102,111,114,109,117,108,97,101,83,101,113,0,0,0,0,0,101,120,112,101,99,116,101,100,32,115,116,114,105,110,103,0,115,101,116,32,112,109,51,100,32,0,0,0,0,0,0,0,99,111,114,110,101,114,115,32,102,111,114,32,102,105,108,108,101,100,99,117,114,118,101,115,0,0,0,0,0,0,0,0,67,111,108,117,109,110,32,109,117,115,116,32,98,101,32,62,61,32,45,50,0,0,0,0,92,101,110,100,105,110,112,117,116,10,0,0,0,0,0,0,110,111,98,111,36,114,100,101,114,0,0,0,0,0,0,0,82,71,66,32,112,116,115,0,108,111,103,32,98,97,115,101,32,109,117,115,116,32,98,101,32,62,32,49,46,48,59,32,108,111,103,115,99,97,108,101,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,0,115,101,116,32,108,111,99,97,108,101,32,34,37,115,34,10,0,0,0,0,0,0,0,0,40,50,120,45,49,41,94,50,0,0,0,0,0,0,0,0,92,115,116,111,112,116,101,120,116,10,0,0,0,0,0,0,98,100,36,101,102,97,117,108,116,0,0,0,0,0,0,0,100,111,112,108,111,116,0,0,9,67,117,114,114,101,110,116,32,112,97,108,101,116,116,101,32,105,115,10,9,32,32,32,32,115,101,116,32,112,97,108,101,116,116,101,32,114,103,98,102,111,114,109,117,108,97,101,32,37,105,44,37,105,44,37,105,10,0,0,0,0,0,0,115,101,116,32,116,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,99,98,116,105,99,36,108,97,98,101,108,115,0,0,0,0,92,115,116,111,112,71,78,85,80,76,79,84,103,114,97,112,104,105,99,10,0,0,0,0,98,111,36,114,100,101,114,0,69,120,112,101,99,116,105,110,103,32,39,103,114,97,100,105,101,110,116,39,32,111,114,32,39,112,97,108,101,116,116,101,32,60,110,62,39,32,111,114,32,39,114,103,98,102,111,114,109,117,108,97,101,39,32,111,114,32,39,99,111,108,111,114,110,97,109,101,115,39,0,0,101,120,112,101,99,116,105,110,103,32,39,99,97,114,116,101,115,105,97,110,39,44,32,39,115,112,104,101,114,105,99,97,108,39,44,32,111,114,32,39,99,121,108,105,110,100,114,105,99,97,108,39,0,0,0,0,115,101,116,32,114,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,122,116,105,99,36,108,97,98,101,108,115,0,0,0,0,0,37,115,10,10,0,0,0,0,92,115,116,111,112,71,78,85,80,76,79,84,112,97,103,101,10,0,0,0,0,0,0,0,117,36,115,101,114,0,0,0,102,105,116,50,114,103,98,36,102,111,114,109,117,108,97,101,0,0,0,0,0,0,0,0,99,121,36,108,105,110,100,114,105,99,97,108,0,0,0,0,115,101,116,32,98,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,121,50,116,105,99,36,108,97,98,101,108,115,0,0,0,0,9,103,110,117,112,108,111,116,32,76,67,95,78,85,77,69,82,73,67,32,37,115,10,0,37,46,49,50,48,115,0,0,116,36,119,111,0,0,0,0,115,101,116,98,111,117,110,100,115,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,116,111,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,119,44,104,41,59,10,0,104,36,111,114,105,122,111,110,116,97,108,0,0,0,0,0,99,111,108,111,114,36,110,97,109,101,115,0,0,0,0,0,115,36,112,104,101,114,105,99,97,108,0,0,0,0,0,0,97,116,32,115,99,114,101,101,110,0,0,0,0,0,0,0,121,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,121,95,109,97,120,51,100,33,0,0,0,0,0,0,0,121,116,105,99,36,108,97,98,101,108,115,0,0,0,0,0,109,111,100,0,0,0,0,0,100,101,115,116,32,61,61,32,78,85,76,76,32,124,124,32,100,101,115,116,32,33,61,32,111,117,116,115,116,114,0,0,10,35,32,73,115,111,67,117,114,118,101,32,37,100,44,32,37,100,32,112,111,105,110,116,115,10,35,32,120,32,121,32,122,0,0,0,0,0,0,0,118,36,101,114,116,105,99,97,108,0,0,0,0,0,0,0,115,104,101,36,108,108,0,0,99,97,36,114,116,101,115,105,97,110,0,0,0,0,0,0,37,115,9,37,102,10,0,0,115,101,116,32,108,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,120,50,116,105,99,36,108,97,98,101,108,115,0,0,0,0,67,111,109,112,105,108,101,32,111,112,116,105,111,110,115,58,10,37,115,10,0,0,0,0,37,46,52,103,0,0,0,0,114,122,116,0,0,0,0,0,116,105,109,101,0,0,0,0,114,103,98,102,111,114,36,109,117,108,97,101,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,115,99,114,101,101,110,32,60,102,114,97,99,116,105,111,110,62,39,0,0,0,115,101,116,32,122,101,114,111,32,37,103,10,0,0,0,0,120,116,105,99,36,108,97,98,101,108,115,0,0,0,0,0,32,108,105,110,101,115,116,121,108,101,32,37,100,0,0,0,120,32,114,97,110,103,101,0,99,111,108,117,109,110,104,101,97,100,0,0,0,0,0,0,114,99,102,105,108,101,0,0,101,113,0,0,0,0,0,0,41,59,112,111,115,105,116,105,111,110,115,40,0,0,0,0,116,101,114,109,36,105,110,97,108,0,0,0,0,0,0,0,69,110,100,0,0,0,0,0,103,114,97,36,100,105,101,110,116,0,0,0,0,0,0,0,115,99,36,114,101,101,110,0,102,95,115,112,114,105,110,116,102,58,32,97,116,116,101,109,112,116,32,116,111,32,112,114,105,110,116,32,110,117,109,101,114,105,99,32,118,97,108,117,101,32,119,105,116,104,32,115,116,114,105,110,103,32,102,111,114,109,97,116,0,0,0,0,83,105,103,110,101,100,83,104,111,114,116,0,0,0,0,0,40,37,46,51,103,44,37,46,51,103,44,37,46,51,103,41,0,0,0,0,0,0,0,0,110,111,111,112,97,113,117,101,0,0,0,0,0,0,0,0,101,120,116,114,97,32,99,104,97,114,115,32,97,102,116,101,114,32,60,115,101,112,97,114,97,116,105,111,110,95,99,104,97,114,62,0,0,0,0,0,107,101,121,32,101,110,116,114,121,0,0,0,0,0,0,0,10,37,72,58,37,77,0,0,99,111,108,111,114,115,40,0,111,112,97,113,117,101,0,0,9,103,97,109,109,97,32,105,115,32,37,46,52,103,10,0,39,92,116,39,0,0,0,0,104,105,115,116,101,112,115,32,118,97,108,105,100,32,112,111,105,110,116,32,109,97,112,112,105,110,103,0,0,0,0,0,116,101,109,112,32,115,116,114,105,110,103,32,102,111,114,32,108,97,98,101,108,32,104,97,99,107,0,0,0,0,0,0,99,111,108,111,114,95,109,111,100,101,40,103,114,97,100,105,101,110,116,41,59,0,0,0,109,97,120,114,111,119,36,115,0,0,0,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,32,39,37,99,39,46,10,0,0,34,92,116,34,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,99,111,108,117,109,110,32,60,61,32,48,32,105,110,32,100,97,116,97,102,105,108,101,46,99,0,0,0,0,0,0,0,50,32,109,117,108,32,49,32,115,117,98,32,100,117,112,32,109,117,108,0,0,0,0,0,99,111,108,111,114,95,109,111,100,101,40,102,117,110,99,116,105,111,110,115,41,0,0,0,109,97,120,99,111,108,117,36,109,110,115,0,0,0,0,0,88,89,90,10,0,0,0,0,101,120,112,101,99,116,101,100,32,34,60,115,101,112,97,114,97,116,111,114,95,99,104,97,114,62,34,0,0,0,0,0,115,101,116,32,116,105,109,101,115,116,97,109,112,32,37,115,32,10,0,0,0,0,0,0,37,49,54,46,51,102,0,0,99,111,108,111,114,95,109,111,100,101,40,114,103,98,41,59,102,111,114,109,117,108,97,101,40,37,100,44,37,100,44,37,100,41,0,0,0,0,0,0,109,97,120,99,111,108,36,115,0,0,0,0,0,0,0,0,89,73,81,10,0,0,0,0,119,104,105,116,101,36,115,112,97,99,101,0,0,0,0,0,32,114,111,116,97,116,101,32,112,97,114,97,108,108,101,108,0,0,0,0,0,0,0,0,116,105,109,101,115,116,114,105,110,103,0,0,0,0,0,0,10,10,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,10,0,0,0,0,0,0,99,111,108,111,114,95,109,111,100,101,40,103,114,97,121,41,0,0,0,0,0,0,0,0,116,101,120,116,36,99,111,108,111,114,0,0,0,0,0,0,84,105,99,32,108,97,98,101,108,32,100,111,101,115,32,110,111,116,32,101,118,97,108,117,97,116,101,32,97,115,32,115,116,114,105,110,103,33,10,0,67,77,89,10,0,0,0,0,101,120,112,101,99,116,101,100,32,115,116,114,105,110,103,32,119,105,116,104,32,99,111,109,109,101,110,116,115,32,99,104,97,114,115,0,0,0,0,0,10,115,101,116,32,37,115,37,115,32,0,0,0,0,0,0,9,103,110,117,112,108,111,116,32,76,67,95,84,73,77,69,32,32,32,32,37,115,10,0,117,116,105,108,46,99,0,0,111,36,110,101,0,0,0,0,103,112,95,109,97,107,101,95,112,97,108,101,116,116,101,40,0,0,0,0,0,0,0,0,116,99,0,0,0,0,0,0,72,83,86,10,0,0,0,0,109,97,120,95,108,105,110,101,95,108,101,110,0,0,0,0,100,105,118,0,0,0,0,0,84,97,98,117,108,97,114,32,111,117,116,112,117,116,32,111,102,32,116,104,105,115,32,51,68,32,112,108,111,116,32,115,116,121,108,101,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,10,0,0,0,70,97,116,97,108,58,32,117,110,100,101,102,105,110,101,100,32,99,111,108,111,114,32,102,111,114,109,117,108,97,32,40,99,97,110,32,98,101,32,48,45,45,37,105,41,10,0,0,37,37,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,117,115,101,114,45,100,101,102,105,110,101,100,32,115,101,116,116,105,110,103,115,10,103,112,95,115,101,116,117,112,95,97,102,116,101,114,59,10,0,0,0,0,0,0,0,0,115,101,36,116,0,0,0,0,82,71,66,10,0,0,0,0,101,120,112,101,99,116,101,100,32,109,105,115,115,105,110,103,45,118,97,108,117,101,32,115,116,114,105,110,103,0,0,0,95,121,0,0,0,0,0,0,115,101,116,32,37,115,37,115,32,34,37,115,34,32,0,0,108,36,111,110,103,0,0,0,103,112,95,115,101,116,95,108,105,110,101,119,105,100,116,104,40,37,103,41,59,10,0,0,122,116,114,0,0,0,0,0,110,111,116,105,36,116,108,101])
-.concat([0,0,0,0,0,0,0,0,9,67,111,108,111,114,45,77,111,100,101,108,58,32,0,0,119,114,111,110,103,32,111,112,116,105,111,110,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,32,37,102,10,0,37,103,32,37,103,0,0,0,32,108,116,32,37,100,0,0,121,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,0,33,61,0,0,0,0,0,0,37,37,32,108,105,110,101,119,105,100,116,104,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,108,105,110,101,115,10,0,0,0,0,0,0,0,80,97,103,101,68,111,119,110,0,0,0,0,0,0,0,0,32,99,111,108,111,114,32,112,111,115,105,116,105,111,110,115,32,102,111,114,32,100,105,115,99,114,101,116,101,32,112,97,108,101,116,116,101,32,116,101,114,109,105,110,97,108,115,10,0,0,0,0,0,0,0,0,114,117,108,101,114,32,97,116,0,0,0,0,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,32,100,101,102,97,117,108,116,10,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,112,108,111,116,32,116,121,112,101,0,0,37,37,0,0,0,0,0,0,85,110,115,105,103,110,101,100,83,104,111,114,116,0,0,0,103,112,95,115,101,116,95,112,111,105,110,116,115,105,122,101,40,37,103,41,59,10,0,0,110,111,97,36,117,116,111,116,105,116,108,101,115,0,0,0,65,76,76,32,114,101,109,97,105,110,105,110,103,0,0,0,101,120,112,101,99,116,105,110,103,32,114,117,108,101,114,32,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,10,0,0,0,0,37,100,47,37,109,0,0,0,83,105,103,110,101,100,66,121,116,101,0,0,0,0,0,0,112,118,101,114,116,32,62,61,32,48,0,0,0,0,0,0,37,37,32,112,111,105,110,116,115,105,122,101,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,10,0,0,0,0,97,36,117,116,111,116,105,116,108,101,115,0,0,0,0,0,77,65,88,32,37,105,0,0,114,117,36,108,101,114,0,0,115,101,116,32,110,111,109,37,115,116,105,99,115,10,0,0,103,112,95,115,99,97,108,101,95,116,101,120,116,32,58,61,32,37,103,59,10,0,0,0,104,36,101,105,103,104,116,0,9,97,108,108,111,99,97,116,105,110,103,32,0,0,0,0,110,111,114,117,36,108,101,114,0,0,0,0,0,0,0,0,115,101,116,32,116,105,99,115,108,101,118,101,108,32,37,103,10,0,0,0,0,0,0,0,124,120,45,48,46,53,124,0,37,37,32,116,101,120,116,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,116,104,101,32,119,104,111,108,101,32,102,105,103,117,114,101,10,0,0,0,0,119,36,105,100,116,104,0,0,32,78,79,84,0,0,0,0,115,104,111,117,108,100,32,98,101,58,32,37,100,32,60,61,32,109,111,117,115,101,102,111,114,109,97,116,32,60,61,32,37,100,10,0,0,0,0,0,115,101,116,32,120,121,112,108,97,110,101,32,97,116,32,37,103,10,0,0,0,0,0,0,37,37,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,117,115,101,114,45,100,101,102,105,110,101,100,32,115,101,116,116,105,110,103,115,10,103,112,95,115,101,116,117,112,95,98,101,102,111,114,101,59,10,0,0,0,0,0,0,0,115,112,36,97,99,105,110,103,0,0,0,0,0,0,0,0,9,97,108,108,32,99,111,108,111,114,32,102,111,114,109,117,108,97,101,32,65,82,69,37,115,32,119,114,105,116,116,101,110,32,105,110,116,111,32,111,117,116,112,117,116,32,112,111,115,116,115,99,114,105,112,116,32,102,105,108,101,10,0,0,112,108,101,97,115,101,32,39,115,101,116,32,109,111,117,115,101,32,109,111,117,115,101,102,111,114,109,97,116,32,60,102,109,116,62,39,32,102,105,114,115,116,46,10,0,0,0,0,102,117,110,99,116,105,111,110,0,0,0,0,0,0,0,0,44,32,116,97,110,103,101,110,116,61,37,115,41,0,0,0,99,111,117,108,100,32,110,111,116,32,111,112,101,110,32,108,111,103,45,102,105,108,101,32,37,115,0,0,0,0,0,0,37,37,32,68,105,102,102,101,114,101,110,116,32,105,110,105,116,105,97,108,105,115,97,116,105,111,110,115,10,0,0,0,115,97,36,109,112,108,101,110,0,0,0,0,0,0,0,0,78,69,71,65,84,73,86,69,0,0,0,0,0,0,0,0,109,111,36,117,115,101,102,111,114,109,97,116,0,0,0,0,115,101,116,32,115,116,121,108,101,32,102,117,110,99,116,105,111,110,32,0,0,0,0,0,44,32,37,32,35,46,52,103,100,101,103,41,0,0,0,0,80,115,101,117,100,111,100,97,116,97,32,110,111,116,32,121,101,116,32,105,109,112,108,101,109,101,110,116,101,100,32,102,111,114,32,112,111,108,97,114,32,111,114,32,112,97,114,97,109,101,116,114,105,99,32,103,114,97,112,104,115,0,0,0,9,103,110,117,112,108,111,116,32,101,110,99,111,100,105,110,103,32,32,32,37,115,10,0,108,105,110,101,32,37,100,58,32,0,0,0,0,0,0,0,112,36,111,105,110,116,115,0,37,37,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,10,0,0,0,110,111,98,36,111,120,0,0,105,110,112,117,116,32,100,97,116,97,32,40,39,101,39,32,101,110,100,115,41,32,62,32,0,0,0,0,0,0,0,0,80,79,83,73,84,73,86,69,0,0,0,0,0,0,0,0,115,104,111,117,108,100,32,98,101,58,32,37,100,32,60,61,32,99,108,105,112,98,111,97,114,100,102,111,114,109,97,116,32,60,61,32,37,100,10,0,115,101,116,32,115,116,121,108,101,32,100,97,116,97,32,0,104,101,97,100,115,0,0,0,109,117,108,116,0,0,0,0,10,35,32,83,117,114,102,97,99,101,32,37,100,32,111,102,32,37,100,32,115,117,114,102,97,99,101,115,10,0,0,0,37,37,32,116,101,109,112,111,114,97,114,121,32,118,97,114,105,97,98,108,101,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,112,97,116,104,10,115,97,118,101,32,112,59,32,112,97,116,104,32,112,59,10,0,0,0,0,0,98,36,111,120,0,0,0,0,115,99,114,36,101,101,110,100,117,109,112,0,0,0,0,0,9,102,105,103,117,114,101,32,105,115,32,37,115,10,0,0,95,120,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,112,111,105,110,116,115,32,37,100,10,115,101,116,32,115,105,122,101,32,114,97,116,105,111,32,37,103,32,37,103,44,37,103,10,115,101,116,32,111,114,105,103,105,110,32,37,103,44,37,103,10,0,0,0,0,0,0,0,93,32,32,100,105,115,116,97,110,99,101,58,32,0,0,0,109,97,116,114,105,120,32,99,111,110,116,97,105,110,115,32,109,105,115,115,105,110,103,32,111,114,32,117,110,100,101,102,105,110,101,100,32,118,97,108,117,101,115,0,0,0,0,0,71,32,78,32,85,32,80,32,76,32,79,32,84,0,0,0,37,37,32,116,101,109,112,111,114,97,114,121,32,118,97,114,105,97,98,108,101,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,112,97,116,104,32,97,110,100,32,105,109,97,103,101,115,10,115,97,118,101,32,112,44,32,105,109,103,44,32,105,109,97,59,32,112,97,116,104,32,112,59,32,115,116,114,105,110,103,32,105,109,103,44,32,105,109,97,59,10,0,0,0,0,0,0,0,116,114,122,0,0,0,0,0,115,104,111,119,46,99,0,0,39,102,111,110,116,110,97,109,101,44,102,111,110,116,115,105,122,101,39,32,101,120,112,101,99,116,101,100,0,0,0,0,99,108,36,105,112,98,111,97,114,100,102,111,114,109,97,116,0,0,0,0,0,0,0,0,100,121,50,61,0,0,0,0,100,102,95,109,97,116,114,105,120,0,0,0,0,0,0,0,32,116,101,120,116,99,111,108,111,114,0,0,0,0,0,0,120,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,0,80,105,112,101,115,32,97,110,100,32,115,104,101,108,108,32,99,111,109,109,97,110,100,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,100,117,114,105,110,103,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,0,0,0,0,61,61,0,0,0,0,0,0,67,97,110,110,111,116,32,115,101,116,32,105,110,116,101,114,110,97,108,32,118,97,114,105,97,98,108,101,115,32,71,80,86,65,76,95,32,97,110,100,32,77,79,85,83,69,95,0,99,109,0,0,0,0,0,0,80,97,103,101,85,112,0,0,37,115,58,37,100,32,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,32,39,37,99,39,46,10,0,0,0,100,105,115,99,114,101,116,101,32,37,103,0,0,0,0,0,78,111,32,116,101,114,109,105,110,97,108,32,104,97,115,32,98,101,101,110,32,112,117,115,104,101,100,32,121,101,116,10,0,0,0,0,0,0,0,0,100,120,50,61,0,0,0,0,77,97,116,114,105,120,32,100,111,101,115,32,110,111,116,32,114,101,112,114,101,115,101,110,116,32,97,32,103,114,105,100,0,0,0,0,0,0,0,0,105,110,0,0,0,0,0,0,110,111,105,110,118,36,101,114,116,0,0,0,0,0,0,0,9,67,117,98,101,104,101,108,105,120,32,99,111,108,111,114,32,112,97,108,101,116,116,101,58,32,115,116,97,114,116,32,37,103,32,99,121,99,108,101,115,32,37,103,32,115,97,116,117,114,97,116,105,111,110,32,37,103,10,0,0,0,0,0,110,111,122,111,111,109,106,117,36,109,112,0,0,0,0,0,105,110,99,114,101,109,101,110,116,97,108,32,37,103,44,37,103,44,37,103,10,0,0,0,70,105,108,101,32,100,111,101,115,110,39,116,32,102,97,99,116,111,114,105,122,101,32,105,110,116,111,32,102,117,108,108,32,109,97,116,114,105,120,0,37,109,47,37,100,0,0,0,85,110,115,105,103,110,101,100,66,121,116,101,0,0,0,0,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,44,32,119,105,100,116,104,32,97,110,100,32,104,101,105,103,104,116,32,111,102,32,116,104,101,32,102,105,103,117,114,101,10,97,32,58,61,32,49,99,109,59,32,119,32,58,61,32,37,46,51,102,97,59,32,104,32,58,61,32,37,46,51,102,97,59,32,37,37,32,40,37,103,37,115,44,32,37,103,37,115,41,10,0,0,0,0,105,110,118,36,101,114,116,0,9,32,32,67,45,102,111,114,109,117,108,97,58,32,37,115,10,0,0,0,0,0,0,0,122,111,111,109,106,117,36,109,112,0,0,0,0,0,0,0,97,117,116,111,32,37,100,10,0,0,0,0,0,0,0,0,82,101,97,100,32,103,114,105,100,32,119,105,100,116,104,32,116,111,111,32,108,97,114,103,101,0,0,0,0,0,0,0,115,116,114,105,110,103,32,116,101,114,109,118,101,114,115,105,111,110,59,32,32,32,32,116,101,114,109,118,101,114,115,105,111,110,32,32,32,32,58,61,32,34,37,115,34,59,10,0,110,111,114,101,118,36,101,114,115,101,0,0,0,0,0,0,9,32,32,66,45,102,111,114,109,117,108,97,58,32,37,115,10,0,0,0,0,0,0,0,110,111,118,101,36,114,98,111,115,101,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,108,101,118,101,108,115,32,0,0,0,82,101,97,100,32,103,114,105,100,32,111,102,32,122,101,114,111,32,119,105,100,116,104,0,48,46,53,32,115,117,98,32,97,98,115,0,0,0,0,0,115,116,114,105,110,103,32,103,110,117,112,108,111,116,118,101,114,115,105,111,110,59,32,103,110,117,112,108,111,116,118,101,114,115,105,111,110,32,58,61,32,34,37,115,34,59,10,0,114,101,118,36,101,114,115,101,0,0,0,0,0,0,0,0,9,32,32,65,45,102,111,114,109,117,108,97,58,32,37,115,10,0,0,0,0,0,0,0,118,101,36,114,98,111,115,101,0,0,0,0,0,0,0,0,98,115,112,108,105,110,101,10,0,0,0,0,0,0,0,0,67,97,110,39,116,32,114,101,97,100,32,115,101,99,111,110,100,32,100,105,109,101,110,115,105,111,110,32,105,110,32,100,97,116,97,32,102,105,108,101,32,34,37,115,34,0,0,0,66,82,69,65,75,58,32,37,115,0,0,0,0,0,0,0,92,115,116,97,114,116,71,78,85,80,76,79,84,103,114,97,112,104,105,99,91,37,100,93,10,0,0,0,0,0,0,0,82,36,105,103,104,116,0,0,9,99,111,108,111,114,32,109,97,112,112,105,110,103,32,105,115,32,100,111,110,101,32,98,121,32,117,115,101,114,32,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,115,10,0,0,0,0,0,0,0,110,111,108,97,36,98,101,108,115,0,0,0,0,0,0,0,99,117,98,105,99,115,112,108,105,110,101,10,0,0,0,0,121,61,0,0,0,0,0,0,67,97,110,39,116,32,114,101,97,100,32,102,105,114,115,116,32,100,105,109,101,110,115,105,111,110,32,105,110,32,100,97,116,97,32,102,105,108,101,32,34,37,115,34,0,0,0,0,92,115,116,97,114,116,71,78,85,80,76,79,84,112,97,103,101,32,37,37,32,71,114,97,112,104,105,99,32,78,114,46,32,37,100,10,0,0,0,0,76,36,101,102,116,0,0,0,9,99,111,108,111,114,32,109,97,112,112,105,110,103,32,98,121,32,100,101,102,105,110,101,100,32,103,114,97,100,105,101,110,116,10,0,0,0,0,0,108,97,98,101,108,36,115,0,108,105,110,101,97,114,10,0,120,61,0,0,0,0,0,0,67,97,110,39,116,32,111,112,101,110,32,100,97,116,97,32,102,105,108,101,32,34,37,115,34,0,0,0,0,0,0,0,9,103,110,117,112,108,111,116,32,76,67,95,67,84,89,80,69,32,32,32,37,115,10,0,34,37,115,34,44,32,108,105,110,101,32,37,100,58,32,0,112,32,58,61,32,40,37,46,51,102,97,44,37,46,51,102,97,41,0,0,0,0,0,0,114,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,9,114,103,98,32,99,111,108,111,114,32,109,97,112,112,105,110,103,32,98,121,32,114,103,98,102,111,114,109,117,108,97,101,32,97,114,101,32,37,105,44,37,105,44,37,105,10,0,110,111,112,111,36,108,97,114,100,105,115,116,97,110,99,101,0,0,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,0,0,32,32,32,115,99,97,108,101,58,32,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,110,100,32,105,109,112,108,105,101,100,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,0,0,0,0,0,0,98,97,99,107,104,101,97,100,0,0,0,0,0,0,0,0,109,105,110,117,115,0,0,0,112,114,105,110,116,95,51,100,116,97,98,108,101,32,111,117,116,112,117,116,32,98,117,102,102,101,114,0,0,0,0,0,103,112,95,115,101,116,95,108,105,110,101,116,121,112,101,40,37,100,41,59,10,0,0,0,108,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,115,97,36,118,101,0,0,0,67,79,76,79,82,0,0,0,112,111,108,97,114,100,105,115,116,97,110,99,101,116,36,97,110,0,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,111,114,100,101,114,32,37,100,10,0,118,105,101,119,58,32,0,0,80,108,111,116,32,115,116,121,108,101,32,114,101,113,117,105,114,101,115,32,104,105,103,104,101,114,32,116,104,97,110,32,111,110,101,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,0,0,37,115,9,102,97,113,44,32,98,117,103,115,44,32,101,116,99,58,32,32,32,116,121,112,101,32,34,104,101,108,112,32,70,65,81,34,10,37,115,9,105,109,109,101,100,105,97,116,101,32,104,101,108,112,58,32,32,32,116,121,112,101,32,34,104,101,108,112,34,32,32,40,112,108,111,116,32,119,105,110,100,111,119,58,32,104,105,116,32,39,104,39,41,10,0,0,123,37,115,125,41,59,10,0,122,121,120,0,0,0,0,0,98,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,71,82,65,89,0,0,0,0,112,111,36,108,97,114,100,105,115,116,97,110,99,101,100,101,103,0,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,110,111,102,112,101,95,116,114,97,112,10,0,0,0,0,0,0,0,0,122,111,111,109,105,110,103,32,99,97,110,99,101,108,108,101,100,46,10,0,0,0,0,0,80,108,111,116,32,115,116,121,108,101,32,114,101,113,117,105,114,101,115,32,104,105,103,104,101,114,32,116,104,97,110,32,116,119,111,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,0,0,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,110,111,116,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,72,79,77,69,32,110,111,116,32,115,101,116,32,45,32,99,97,110,110,111,116,32,101,120,112,97,110,100,32,116,105,108,100,101,0,0,0,0,0,0,38,0,0,0,0,0,0,0,91,37,115,93,0,0,0,0,116,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,68,111,119,110,0,0,0,0,9,112,97,108,101,116,116,101,32,105,115,32,37,115,10,0,110,111,122,111,111,109,99,111,36,111,114,100,105,110,97,116,101,115,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,102,111,114,116,114,97,110,10,0,0,0,32,32,32,114,101,115,116,111,114,101,100,32,116,101,114,109,105,110,97,108,32,105,115,32,37,115,32,37,115,10,0,0,96,98,117,105,108,116,105,110,45,99,97,110,99,101,108,45,122,111,111,109,96,32,99,97,110,99,101,108,32,122,111,111,109,32,114,101,103,105,111,110,0,0,0,0,0,0,0,0,80,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,114,101,101,32,99,111,108,117,109,110,32,100,97,116,97,32,105,110,32,116,104,105,115,32,103,114,97,112,104,32,109,111,100,101,0,0,0,0,0,97,108,105,103,110,40,37,115,41,44,32,92,115,111,109,101,116,120,116,91,103,112,93,0,111,36,117,116,115,105,100,101,0,0,0,0,0,0,0,0,72,79,82,73,90,79,78,84,65,76,0,0,0,0,0,0,122,111,111,109,99,111,36,111,114,100,105,110,97,116,101,115,0,0,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,99,111,109,109,101,110,116,115,99,104,97,114,115,32,39,37,115,39,10,0,0,0,0,0,0,0,0,77,79,85,83,69,95,75,69,89,95,87,73,78,68,79,87,0,0,0,0,0,0,0,0,110,111,95,99,111,108,115,32,60,61,32,77,65,88,68,65,84,65,67,79,76,83,0,0,104,105,100,100,101,110,32,116,104,101,115,101,95,101,100,103,101,115,0,0,0,0,0,0,72,105,103,104,66,121,116,101,70,105,114,115,116,0,0,0,97,110,103,108,101,40,37,100,41,44,32,0,0,0,0,0,105,110,115,36,105,100,101,0,86,69,82,84,73,67,65,76,0,0,0,0,0,0,0,0,110,111,100,111,36,117,98,108,101,99,108,105,99,107,0,0,71,80,86,65,76,95,86,73,69,87,95,90,83,67,65,76,69,0,0,0,0,0,0,0,101,108,108,105,112,115,101,32,112,108,111,116,0,0,0,0,67,97,110,110,111,116,32,103,101,110,101,114,97,116,101,32,99,111,111,114,100,115,32,102,111,114,32,116,104,97,116,32,112,108,111,116,32,115,116,121,108,101,0,0,0,0,0,0,103,112,95,112,117,116,95,116,101,120,116,40,40,37,46,51,102,97,44,32,37,46,51,102,97,41,44,32,0,0,0,0,98,101,36,108,111,119,0,0,9,99,111,108,111,114,32,103,114,97,100,105,101,110,116,32,105,115,32,37,115,32,105,110,32,116,104,101,32,99,111,108,111,114,32,98,111,120,10,0,100,111,36,117,98,108,101,99,108,105,99,107,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,115,101,112,97,114,97,116,111,114,32,119,104,105,116,101,115,112,97,99,101,10,0,0,0,0,0,0,71,80,86,65,76,95,86,73,69,87,95,83,67,65,76,69,0,0,0,0,0,0,0,0,77,97,116,114,105,120,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,111,110,108,121,32,116,104,114,101,101,32,99,111,108,117,109,110,115,0,71,78,85,80,76,79,84,95,76,73,66,0,0,0,0,0,99,111,115,40,57,48,120,41,0,0,0,0,0,0,0,0,103,112,95,112,111,105,110,116,40,37,46,51,102,97,44,37,46,51,102,97,44,37,100,41,59,10,0,0,0,0,0,0,117,36,110,100,101,114,0,0,65,114,103,104,33,0,0,0,103,114,36,97,112,104,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,115,101,112,97,114,97,116,111,114,32,34,37,99,34,10,0,0,0,0,37,108,102,0,0,0,0,0,97,98,36,111,118,101,0,0,44,0,0,0,0,0,0,0,10,9,32,32,32,32,32,32,32,32,32,32,115,105,122,101,58,32,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,109,105,115,115,105,110,103,32,39,37,115,39,10,0,0,0,0,0,0,78,111,32,100,101,102,97,117,108,116,32,99,111,108,117,109,110,115,32,107,110,111,119,110,32,102,111,114,32,116,104,97,116,32,112,108,111,116,32,115,116,121,108,101,0,0,0,0,76,97,109,98,100,97,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,115,32,114,101,115,101,116,58,32,32,37,103,10,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,32,83,101,101,32,39,104,101,108,112,32,117,110,115,101,116,39,46,0,66,97,100,32,116,105,109,101,32,102,111,114,109,97,116,32,105,110,32,115,116,114,105,110,103,0,0,0,0,0,0,0,44,37,103,112,116,0,0,0,111,118,36,101,114,0,0,0,97,116,32,85,83,69,82,32,111,114,105,103,105,110,58,32,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,107,101,121,119,111,114,100,32,39,97,112,112,101,110,100,39,0,0,0,0,0,0,116,117,112,108,101,32,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,0,0,37,98,0,0,0,0,0,0,94,10,0,0,0,0,0,0,121,120,0,0,0,0,0,0,103,112,95,115,101,116,95,112,111,105,110,116,115,105,122,101,40,37,46,51,102,41,59,10,0,0,0,0,0,0,0,0,104,111,114,36,105,122,111,110,116,97,108,0,0,0,0,0,97,116,32,68,69,70,65,85,76,84,32,112,111,115,105,116,105,111,110,10,0,0,0,0,97,112,112,101,110,100,0,0,69,120,112,101,99,116,105,110,103,32,39,44,39,32,111,114,32,39,41,39,0,0,0,0,104,101,97,100,0,0,0,0,112,108,117,115,0,0,0,0,32,37,99,10,0,0,0,0,112,32,58,61,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,118,101,114,36,116,105,99,97,108,0,0,0,0,0,0,0,114,101,115,36,101,116,0,0,78,79,84,32,100,114,97,119,110,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,105,108,101,110,97,109,101,0,0,0,0,0,0,112,114,101,102,105,120,0,0,37,115,10,37,115,9,37,115,10,37,115,9,86,101,114,115,105,111,110,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,32,32,32,32,108,97,115,116,32,109,111,100,105,102,105,101,100,32,37,115,10,37,115,9,66,117,105,108,100,32,83,121,115,116,101,109,58,32,37,115,32,37,115,10,37,115,10,37,115,9,37,115,10,37,115,9,84,104,111,109,97,115,32,87,105,108,108,105,97,109,115,44,32,67,111,108,105,110,32,75,101,108,108,101,121,32,97,110,100,32,109,97,110,121,32,111,116,104,101,114,115,10,37,115,10,37,115,9,103,110,117,112,108,111,116,32,104,111,109,101,58,32,32,32,32,32,104,116,116,112,58,47,47,119,119,119,46,103,110,117,112,108,111,116,46,105,110,102,111,10,0,0,0,0,0,0,103,112,95,115,101,116,95,108,105,110,101,119,105,100,116,104,40,37,46,51,102,41,59,10,0,0,0,0,0,0,0,0,120,122,121,0,0,0,0,0,99,36,101,110,116,101,114,0,100,114,97,119,110,32,98,97,99,107,10,9,0,0,0,0,110,111,114,111,116,36,97,116,101,0,0,0,0,0,0,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,116,32,102,111,114,32,99,117,114,118,101,115,44,32,117,47,118,32,102,111,114,32,115,117,114,102,97,99,101,115,10,0,0,0,0,0,115,101,116,32,109,97,112,112,105,110,103,32,0,0,0,0,98,111,114,100,101,114,0,0,116,104,105,115,95,112,108,111,116,32,33,61,32,78,85,76,76,0,0,0,0,0,0,0,97,120,101,115,32,109,117,115,116,32,98,101,32,120,49,121,49,44,32,120,49,121,50,44,32,120,50,121,49,32,111,114,32,120,50,121,50,0,0,0,116,105,108,100,101,32,101,120,112,97,110,115,105,111,110,0,94,0,0,0,0,0,0,0,99,111,110,116,101,120,116,46,116,114,109,32,115,101,116,95,99,111,108,111,114,32,117,110,107,110,111,119,110,32,99,111,108,111,114,115,112,101,99,45,62,116,121,112,101,32,37,105,0,0,0,0,0,0,0,0,114,36,105,103,104,116,0,0,100,114,97,119,110,32,102,114,111,110,116,10,9,0,0,0,115,101,116,32,109,97,99,114,111,115,10,0,0,0,0,0,115,101,116,32,116,101,114,109,32,37,115,32,37,115,0,0,102,95,115,112,114,105,110,116,102,0,0,0,0,0,0,0,77,111,114,101,32,116,104,97,110,32,37,100,32,101,108,101,109,101,110,116,115,0,0,0,37,37,103,112,95,115,101,116,95,99,111,108,111,114,40,102,114,97,99,40,37,46,52,102,41,41,59,10,0,0,0,0,108,36,101,102,116,0,0,0,9,99,111,108,111,114,32,98,111,120,32,119,105,116,104,111,117,116,32,98,111,114,100,101,114,32,105,115,32,0,0,0,69,120,112,101,99,116,101,100,32,99,111,109,109,97,46,0,117,110,115,101,116,32,99,108,97,98,101,108,10,0,0,0,104,105,100,100,101,110,32,110,111,114,116,104,95,101,100,103,101,115,0,0,0,0,0,0,76,111,119,66,121,116,101,70,105,114,115,116,0,0,0,0,103,112,95,115,101,116,95,99,111,108,111,114,40,114,103,98,40,37,51,46,50,102,44,37,51,46,50,102,44,37,51,46,50,102,41,41,59,10,0,0,98,36,111,116,116,111,109,0,68,69,70,65,85,76,84,32,108,105,110,101,32,116,121,112,101,32,105,115,32,0,0,0,86,97,108,117,101,32,111,117,116,32,111,102,32,114,97,110,103,101,32,91,48,44,49,93,46,0,0,0,0,0,0,0,115,101,116,32,99,108,97,98,101,108,32,39,37,115,39,10,0,0,0,0,0,0,0,0,105,115,111,95,56,56,53,57,95,50,0,0,0,0,0,0,104,105,115,116,111,103,114,97,109,0,0,0,0,0,0,0,73,110,118,97,108,105,100,32,110,117,109,101,114,105,99,32,111,114,32,116,117,112,108,101,32,102,111,114,109,0,0,0,10,35,32,67,117,114,118,101,32,116,105,116,108,101,58,32,34,37,115,34,0,0,0,0,103,112,95,115,101,116,95,99,111,108,111,114,40,108,116,40,37,100,41,41,59,10,0,0,116,36,111,112,0,0,0,0,108,105,110,101,32,116,121,112,101,32,37,100,32,105,115,32,0,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,110,97,109,101,46,0,0,0,0,0,32,98,111,116,104,10,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,73,110,118,97,108,105,100,32,99,111,109,109,97,32,115,101,112,97,114,97,116,101,100,32,116,121,112,101,0,0,0,0,57,48,32,109,117,108,32,99,111,115,0,0,0,0,0,0,45,45,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,103,112,95,100,114,97,119,40,112,41,59,10,0,0,0,111,102,102,0,0,0,0,0,9,99,111,108,111,114,32,98,111,120,32,119,105,116,104,32,98,111,114,100,101,114,44,32,0,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,115,112,101,99,105,102,105,101,114,46,32,85,115,101,32,39,35,114,114,103,103,98,98,39,46,0,32,115,117,114,102,97,99,101,10,0,0,0,0,0,0,0,80,101,114,112,101,110,100,105,99,117,108,97,114,32,118,101,99,116,111,114,32,99,97,110,110,111,116,32,98,101,32,122,101,114,111,0,0,0,0,0,112,117,115,104,99,0,0,0,45,45,99,121,99,108,101,59,10,103,112,95,100,114,97,119,40,112,41,59,10,0,0,0,111,110,0,0,0,0,0,0,101,120,116,101,110,100,32,100,121,110,97,114,114,97,121,0,99,111,114,110,101,114,32,37,105,10,0,0,0,0,0,0,35,37,50,120,37,50,120,37,50,120,0,0,0,0,0,0,32,98,97,115,101,10,0,0,84,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,0,0,0,0,0,0,0,0,76,97,109,98,100,97,32,83,116,97,114,116,32,118,97,108,117,101,32,115,101,116,58,32,37,103,10,0,0,0,0,0,103,112,95,100,111,116,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,0,109,97,120,105,109,117,109,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,0,69,120,112,101,99,116,101,100,32,40,32,116,111,32,115,116,97,114,116,32,103,114,97,100,105,101,110,116,32,100,101,102,105,110,105,116,105,111,110,46,0,0,0,0,0,0,0,0,10,115,101,116,32,115,97,109,112,108,101,115,32,37,100,44,32,37,100,10,115,101,116,32,105,115,111,115,97,109,112,108,101,115,32,37,100,44,32,37,100,10,37,115,115,101,116,32,115,117,114,102,97,99,101,10,37,115,115,101,116,32,99,111,110,116,111,117,114,0,0,0,37,66,0,0,0,0,0,0,120,121,0,0,0,0,0,0,41,59,10,0,0,0,0,0,98,97,99,107,0,0,0,0,109,105,110,105,109,117,109,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,0,71,114,97,121,32,115,99,97,108,101,32,110,111,116,32,115,111,114,116,101,100,32,105,110,32,103,114,97,100,105,101,110,116,46,0,0,0,0,0,0,101,113,117,97,108,32,120,121,122,0,0,0,0,0,0,0,37,100,46,32,37,100,46,32,37,48,52,100,32,37,100,58,37,48,50,100,0,0,0,0,110,111,104,101,97,100,0,0,108,101,0,0,0,0,0,0,48,120,37,48,54,120,0,0,44,100,101,110,115,105,116,121,40,48,41,0,0,0,0,0,102,114,111,110,116,0,0,0,114,101,36,114,101,97,100,0,109,101,100,105,97,110,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,0,0,78,111,32,118,97,108,105,100,32,112,97,108,101,116,116,101,32,102,111,117,110,100,0,0,83,84,65,84,83,95,0,0,101,113,117,97,108,32,120,121,0,0,0,0,0,0,0,0,37,100,58,37,48,50,100,0,98,105,36,110,100,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,40,100,97,116,97,102,105,108,101,46,99,41,58,32,85,110,107,110,111,119,110,32,112,108,111,116,32,109,111,100,101,0,0,47,117,115,114,47,108,111,99,97,108,47,98,105,110,0,0,44,112,97,116,116,101,114,110,40,37,100,41,0,0,0,0,121,120,122,0,0,0,0,0,110,111,98,101,110,116,36,111,118,101,114,0,0,0,0,0,103,101,111,109,101,116,114,105,99,97,108,32,109,101,97,110,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,0,0,66,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,0,0,0,0,0,10,115,101,116,32,118,105,101,119,32,32,37,115,0,0,0,37,100,46,32,37,100,46,32,37,48,52,100,0,0,0,0,84,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,32,102,111,114,32,115,101,116,116,105,110,103,32,98,105,110,97,114,121,32,112,97,114,97,109,101,116,101,114,115,0,0,109,97,116,36,114,105,120,0,110,111,98,111,114,100,101,114,10,0,0,0,0,0,0,0,116,104,105,115,95,112,108,111,116,32,61,61,32,42,116,112,95,51,100,95,112,116,114,0,67,97,110,110,111,116,32,101,120,112,97,110,100,32,101,109,112,116,121,32,112,97,116,104,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,71,80,70,85,78,95,0,0,44,100,101,110,115,105,116,121,40,37,46,50,102,41,0,0,98,101,110,116,36,111,118,101,114,0,0,0,0,0,0,0,85,112,0,0,0,0,0,0,97,118,101,114,97,103,101,100,32,52,32,99,111,114,110,101,114,115,10,0,0,0,0,0,112,109,51,100,32,103,114,97,100,105,101,110,116,0,0,0,37,103,44,32,37,103,44,32,37,103,44,32,37,103,0,0,99,97,110,32,111,110,108,121,32,100,111,32,98,101,115,115,101,108,32,102,117,110,99,116,105,111,110,115,32,111,102,32,114,101,97,108,115,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,115,112,114,105,110,116,102,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,0,84,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,32,102,111,114,32,51,68,32,112,108,111,116,0,0,0,0,44,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,110,111,97,108,116,36,100,105,97,103,111,110,97,108,0,0,9,113,117,97,100,114,97,110,103,108,101,32,99,111,108,111,114,32,97,99,99,111,114,100,105,110,103,32,116,111,32,0,103,114,97,100,105,101,110,116,0,0,0,0,0,0,0,0,84,119,111,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,32,102,111,114,32,50,68,32,112,108,111,116,0,0,0,0,0,0,104,105,100,100,101,110,32,116,104,101,115,101,95,112,111,108,121,115,0,0,0,0,0,0,88,114,105,103,104,116,89,117,112,0,0,0,0,0,0,0,103,112,95,102,105,108,108,40,112,0,0,0,0,0,0,0,97,108,116,36,100,105,97,103,111,110,97,108,0,0,0,0,9,115,116,101,112,115,32,102,111,114,32,98,105,108,105,110,101,97,114,32,105,110,116,101,114,112,111,108,97,116,105,111,110,58,32,37,100,44,37,100,10,0,0,0,0,0,0,0,76,101,115,115,32,116,104,97,110,32,51,32,117,115,105,110,103,32,115,112,101,99,115,32,102,111,114,32,112,97,108,101,116,116,101,0,0,0,0,0,115,101,116,32,118,105,101,119,32,0,0,0,0,0,0,0,44,32,40,117,110,100,101,102,105,110,101,100,41,47,0,0,99,117,116,101,32,108,105,116,116,108,101,32,101,108,108,105,112,115,101,32,102,111,114,32,116,104,101,32,107,101,121,32,115,97,109,112,108,101,0,0,78,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,116,111,32,115,107,105,112,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,0,0,0,0,0,0,0,0,45,45,99,121,99,108,101,59,10,0,0,0,0,0,0,0,110,111,117,110,100,36,101,102,105,110,101,100,0,0,0,0,9,112,109,51,100,45,104,105,100,100,101,110,51,100,32,105,115,32,37,115,10,0,0,0,117,110,115,101,116,32,100,101,99,105,109,97,108,115,105,103,110,10,0,0,0,0,0,0,111,102,102,36,115,101,116,0,115,99,97,36,108,101,0,0,73,109,112,114,111,112,101,114,32,115,99,97,110,110,105,110,103,32,115,116,114,105,110,103,46,32,84,114,121,32,50,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,102,111,114,32,50,68,32,100,97,116,97,0,0,0,0,117,112,36,119,97,114,100,115,0,0,0,0,0,0,0,0,100,111,119,110,36,119,97,114,100,115,0,0,0,0,0,0,114,111,119,36,115,102,105,114,115,116,0,0,0,0,0,0,99,111,108,36,117,109,110,115,102,105,114,115,116,0,0,0,115,105,110,40,57,48,120,41,0,0,0,0,0,0,0,0,79,114,105,103,105,110,32,105,115,32,97,116,32,40,37,102,44,37,102,41,0,0,0,0,45,45,40,37,46,51,102,97,44,37,46,51,102,97,41,0,46,92,34,71,78,85,80,76,79,84,58,32,71,82,79,70,70,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,116,104,101,32,103,112,105,99,32,112,114,101,112,114,111,99,101,115,115,111,114,10,0,0,117,110,100,101,102,36,105,110,101,100,0,0,0,0,0,0,46,80,69,10,0,0,0,0,9,112,109,51,100,45,104,105,100,100,101,110,51,100,32,105,115,32,111,110,32,97,110,100,32,119,105,108,108,32,117,115,101,32,108,105,110,101,115,116,121,108,101,32,37,100,10,0,69,120,112,101,99,116,101,100,32,99,111,109,109,97,0,0,115,101,116,32,100,101,99,105,109,97,108,115,105,103,110,32,39,37,115,39,10,0,0,0,120,61,37,102,59,32,121,61,37,102,10,0,0,0,0,0,47,40,117,110,100,101,102,105,110,101,100,41,0,0,0,0,46,80,83,32,37,102,32,37,102,10,0,0,0,0,0,0,109,111,118,101,32,116,111,32,40,120,43,37,102,44,121,43,37,102,41,10,0,0,0,0,73,109,112,114,111,112,101,114,32,115,99,97,110,110,105,110,103,32,115,116,114,105,110,103,46,32,84,114,121,32,51,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,102,111,114,32,51,68,32,100,97,116,97,0,0,0,0,100,97,115,104,101,100,32,48,46,48,55,53,0,0,0,0,100,97,115,104,101,100,32,48,46,48,53,0,0,0,0,0,100,111,116,116,101,100,0,0,116,104,105,99,107,110,101,115,115,32,49,46,48,0,0,0,32,92,10,32,32,32,116,104,101,110,32,116,111,32,40,120,43,37,102,44,121,43,37,102,41,0,0,0,0,0,0,0,10,32,32,0,0,0,0,0,108,105,110,101,32,37,115,32,116,111,32,40,120,43,37,102,44,121,43,37,102,41,0,0,116,114,105,36,97,110,103,108,101,112,97,116,116,101,114,110,0,0,0,0,0,0,0,0,97,116,32,120,43,37,102,44,121,43,37,102,10,0,0,0,97,108,108,32,52,32,112,111,105,110,116,115,32,111,102,32,116,104,101,32,113,117,97,100,114,97,110,103,108,101,32,105,110,32,120,44,121,32,114,97,110,103,101,115,10,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,102,111,114,32,102,117,110,99,116,105,111,110,0,0,115,101,116,32,100,101,99,105,109,97,108,115,105,103,110,32,108,111,99,97,108,101,32,34,37,115,34,10,0,0,0,0,114,106,117,115,116,32,0,0,108,106,117,115,116,32,0,0,67,97,110,110,111,116,32,97,108,116,101,114,32,115,99,97,110,110,105,110,103,32,109,101,116,104,111,100,32,102,111,114,32,111,110,101,45,100,105,109,101,110,115,105,111,110,97,108,32,100,97,116,97,0,0,0,59,32,114,101,115,101,116,32,108,105,110,101,119,105,100,10,0,0,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,114,97,110,103,101,45,115,112,101,99,115,32,102,111,114,32,97,32,37,100,45,118,97,114,105,97,98,108,101,32,102,105,116,0,0,0,0,0,0,108,105,110,101,32,102,114,111,109,32,120,43,37,102,44,121,43,37,102,32,116,111,32,120,43,37,102,44,121,43,37,102,10,0,0,0,0,0,0,0,97,114,114,111,119,104,101,97,100,61,55,59,32,97,114,114,111,119,32,102,114,111,109,32,120,43,37,102,44,121,43,37,102,32,116,111,32,120,43,37,102,44,121,43,37,102,10,0,49,54,0,0,0,0,0,0,27,91,114,27,91,50,52,59,49,72,0,0,0,0,0,0,40,37,46,51,102,97,44,37,46,51,102,97,41,0,0,0,27,91,50,74,27,91,50,52,59,49,72,0,0,0,0,0,110,111,111,102,102,36,115,101,116,0,0,0,0,0,0,0,27,92,27,91,50,52,59,49,72,0,0,0,0,0,0,0,97,116,32,108,101,97,115,116,32,49,32,112,111,105,110,116,32,111,102,32,116,104,101,32,113,117,97,100,114,97,110,103,108,101,32,105,110,32,120,44,121,32,114,97,110,103,101,115,10,0,0,0,0,0,0,0,115,101,116,32,112,111,105,110,116,115,105,122,101,32,37,103,10,115,101,116,32,112,111,105,110,116,105,110,116,101,114,118,97,108,98,111,120,32,37,103,10,115,101,116,32,101,110,99,111,100,105,110,103,32,37,115,10,37,115,115,101,116,32,112,111,108,97,114,10,37,115,115,101,116,32,112,97,114,97,109,101,116,114,105,99,10,0,0,27,91,50,74,27,80,49,112,83,40,67,48,41,83,40,69,41,84,40,65,48,41,10,0,80,91,37,100,44,37,100,93,10,0,0,0,0,0,0,0,118,91,93,118,91,37,100,44,37,100,93,10,0,0,0,0,122,90,0,0,0,0,0,0,87,40,80,37,100,41,10,0,87,40,73,37,100,41,10,0,37,97,0,0,0,0,0,0,84,40,68,48,44,83,49,41,10,0,0,0,0,0,0,0,10,37,115,37,115,10,0,0,84,40,68,57,48,44,83,49,41,10,0,0,0,0,0,0,67,111,109,109,97,110,100,32,39,117,110,115,101,116,32,104,105,115,116,111,114,121,115,105,122,101,39,32,114,101,113,117,105,114,101,115,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,100,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,44,32,117,115,101,32,34,117,110,115,101,116,34,0,0,27,77,71,49,27,82,75,33,27,83,75,33,27,76,90,27,37,37,33,49,0,0,0,0,112,32,58,61,32,0,0,0,27,37,37,33,48,27,77,78,48,27,77,67,66,55,67,59,27,77,81,49,27,77,84,49,0,0,0,0,0,0,0,0,27,37,37,33,48,27,76,90,27,37,37,33,49,0,0,0,9,99,108,105,112,112,105,110])
-.concat([103,58,32,0,0,0,0,0,78,97,109,101,100,32,99,111,108,111,114,115,32,119,105,108,108,32,112,114,111,100,117,99,101,32,115,116,114,97,110,103,101,32,114,101,115,117,108,116,115,32,105,102,32,110,111,116,32,105,110,32,99,111,108,111,114,32,109,111,100,101,32,82,71,66,46,0,0,0,0,0,115,101,116,32,111,102,102,115,101,116,115,0,0,0,0,0,27,76,86,49,27,37,37,33,49,0,0,0,0,0,0,0,27,37,37,33,48,27,12,27,76,86,48,0,0,0,0,0,27,76,70,0,0,0,0,0,121,89,0,0,0,0,0,0,115,106,36,105,115,0,0,0,27,76,71,0,0,0,0,0,103,101,0,0,0,0,0,0,37,52,100,32,0,0,0,0,27,77,86,0,0,0,0,0,27,77,76,0,0,0,0,0,27,77,76,63,0,0,0,0,37,108,102,32,44,32,37,108,102,32,37,99,0,0,0,0,27,77,76,53,0,0,0,0,32,32,99,108,105,112,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,116,111,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,41,59,10,0,0,0,0,27,76,84,0,0,0,0,0,100,101,102,36,97,117,108,116,115,0,0,0,0,0,0,0,114,101,112,36,108,111,116,0,27,77,82,69,58,48,0,0,9,102,108,117,115,104,105,110,103,32,116,114,105,97,110,103,108,101,115,32,97,114,101,32,37,115,100,114,97,119,110,10,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,112,97,108,101,116,116,101,32,111,112,116,105,111,110,0,0,69,120,112,101,99,116,105,110,103,32,91,110,111,93,111,117,116,112,117,116,32,111,114,32,112,114,101,102,105,120,0,0,115,101,116,32,108,111,103,115,99,97,108,101,32,37,115,32,37,103,10,0,0,0,0,0,27,77,82,48,48,0,0,0,27,76,72,0,0,0,0,0,27,77,77,0,0,0,0,0,120,88,0,0,0,0,0,0,31,37,115,10,0,0,0,0,27,91,63,51,56,108,0,0,35,33,37,115,47,103,110,117,112,108,111,116,10,35,10,0,96,97,96,97,98,99,100,104,105,106,107,108,0,0,0,0,31,27,3,0,0,0,0,0,67,111,109,109,97,110,100,32,39,115,101,116,32,104,105,115,116,111,114,121,115,105,122,101,39,32,114,101,113,117,105,114,101,115,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,0,0,100,114,97,119,32,98,105,116,109,97,112,105,109,97,103,101,32,40,37,117,44,37,117,44,105,109,103,41,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,0,0,0,27,12,0,0,0,0,0,0,110,111,32,109,97,116,99,104,105,110,103,32,39,125,39,0,122,36,101,114,111,0,0,0,121,122,120,0,0,0,0,0,56,57,58,59,0,0,0,0,69,78,68,0,0,0,0,0,112,97,114,97,36,108,108,101,108,0,0,0,0,0,0,0,110,111,110,45,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,114,101,113,117,105,114,101,100,0,0,0,0,117,110,115,101,116,32,108,111,103,115,99,97,108,101,10,0,27,37,99,0,0,0,0,0,27,91,63,51,56,104,0,0,116,105,116,108,101,0,0,0,67,97,110,32,111,110,108,121,32,102,108,105,112,32,120,44,32,121,44,32,97,110,100,47,111,114,32,122,0,0,0,0,32,101,109,112,116,121,32,0,106,115,36,100,105,114,0,0,102,115,105,122,101,0,0,0,97,120,36,101,115,0,0,0,32,106,115,100,105,114,32,34,37,115,34,0,0,0,0,0,47,98,105,110,47,115,104,0,38,38,0,0,0,0,0,0,32,116,105,116,108,101,32,34,37,115,34,0,0,0,0,0,118,97,114,110,97,109,101,0,32,109,111,117,115,105,110,103,0,0,0,0,0,0,0,0,100,114,97,119,32,105,109,97,103,101,40,10,32,32,0,0,32,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,114,97,120,36,105,115,0,0,32,110,97,109,101,32,34,37,115,34,0,0,0,0,0,0,115,119,97,112,112,101,100,32,112,100,112,32,40,100,105,109,109,108,101,41,0,0,0,0,66,69,71,73,78,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,46,0,0,0,0,37,115,10,0,0,0,0,0,116,105,116,108,101,32,0,0,32,102,111,110,116,115,99,97,108,101,32,37,103,0,0,0,9,99,117,114,114,101,110,116,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,10,0,0,0,0,0,0,77,79,85,83,69,95,67,84,82,76,0,0,0,0,0,0,32,101,110,104,97,110,99,101,100,0,0,0,0,0,0,0,115,112,114,105,110,116,102,32,97,114,103,115,0,0,0,0,37,115,32,102,115,105,122,101,32,37,103,32,108,119,32,37,103,0,0,0,0,0,0,0,120,88,121,89,122,90,0,0,32,115,105,122,101,32,37,100,44,37,100,0,0,0,0,0,32,98,117,116,116,0,0,0,32,114,111,117,110,100,101,100,0,0,0,0,0,0,0,0,32,100,97,115,104,108,101,110,103,116,104,32,37,51,46,49,102,0,0,0,0,0,0,0,32,115,111,108,105,100,0,0,105,109,97,32,58,61,32,34,37,37,10,0,0,0,0,0,102,111,110,116,58,32,101,120,112,101,99,116,105,110,103,32,115,116,114,105,110,103,0,0,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,0,105,108,108,101,103,97,108,32,106,97,118,97,115,99,114,105,112,116,32,102,117,110,99,116,105,111,110,32,110,97,109,101,0,0,0,0,0,0,0,0,102,108,117,115,104,101,100,32,102,114,111,109,32,37,115,10,0,0,0,0,0,0,0,0,69,120,112,101,99,116,101,100,32,99,111,108,111,114,32,109,111,100,101,108,46,0,0,0,99,111,108,117,109,110,115,116,97,99,107,101,100,32,0,0,101,120,112,101,99,116,105,110,103,32,97,32,106,97,118,97,115,99,114,105,112,116,32,102,117,110,99,116,105,111,110,32,110,97,109,101,0,0,0,0,77,79,85,83,69,95,65,76,84,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,97,110,32,72,84,77,76,32,116,105,116,108,101,32,115,116,114,105,110,103,0,0,60,47,100,105,118,62,10,10,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,0,0,0,0,0,0,0,0,70,108,105,112,112,105,110,103,32,100,105,109,101,110,115,105,111,110,32,100,105,114,101,99,116,105,111,110,32,109,117,115,116,32,98,101,32,49,32,111,114,32,48,0,0,0,0,0,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,10,0,0,0,0,0,104,105,100,100,101,110,32,110,111,114,116,104,95,112,111,108,121,115,0,0,0,0,0,0,60,116,97,98,108,101,32,99,108,97,115,115,61,34,112,108,111,116,34,62,10,60,116,114,62,60,116,100,62,10,32,32,32,32,60,99,97,110,118,97,115,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,32,119,105,100,116,104,61,34,37,100,34,32,104,101,105,103,104,116,61,34,37,100,34,32,116,97,98,105,110,100,101,120,61,34,48,34,62,10,9,83,111,114,114,121,44,32,121,111,117,114,32,98,114,111,119,115,101,114,32,115,101,101,109,115,32,110,111,116,32,116,111,32,115,117,112,112,111,114,116,32,116,104,101,32,72,84,77,76,32,53,32,99,97,110,118,97,115,32,101,108,101,109,101,110,116,10,32,32,32,32,60,47,99,97,110,118,97,115,62,10,60,47,116,100,62,60,47,116,114,62,10,60,47,116,97,98,108,101,62,10,0,0,0,0,0,0,0,60,47,116,100,62,60,116,100,62,10,0,0,0,0,0,0,103,110,117,112,108,111,116,95,99,111,110,116,111,117,114,0,60,47,116,97,98,108,101,62,60,47,116,100,62,60,47,116,114,62,10,60,47,116,97,98,108,101,62,10,0,0,0,0,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,121,50,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,121,50,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,0,0,0,0,0,0,0,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,120,50,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,120,50,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,0,0,0,0,0,0,0,37,48,50,120,0,0,0,0,88,114,105,103,104,116,89,100,111,119,110,0,0,0,0,0,122,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,32,105,100,61,34,103,110,117,112,108,111,116,95,109,111,117,115,101,98,111,120,34,32,98,111,114,100,101,114,61,49,62,10,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,120,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,120,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,121,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,121,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,0,0,67,69,78,84,69,82,69,68,10,0,0,0,0,0,0,0,115,97,116,36,117,114,97,116,105,111,110,0,0,0,0,0,114,111,119,115,116,97,99,107,101,100,32,0,0,0,0,0,35,35,32,0,0,0,0,0,32,32,32,32,32,32,60,47,116,97,98,108,101,62,10,32,32,60,47,116,100,62,60,47,116,114,62,10,60,47,116,97,98,108,101,62,60,47,116,100,62,60,47,116,114,62,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,0,0,0,0,0,0,0,0,77,79,85,83,69,95,83,72,73,70,84,0,0,0,0,0,9,60,47,116,114,62,10,0,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,62,32,60,47,116,100,62,10,0,0,0,0,83,97,109,112,108,101,32,112,101,114,105,111,100,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,46,32,84,114,121,32,96,102,108,105,112,96,32,102,111,114,32,99,104,97,110,103,105,110,103,32,100,105,114,101,99,116,105,111,110,0,0,0,0,0,0,0,84,104,105,115,32,116,101,114,109,105,110,97,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,102,105,108,108,101,100,32,112,111,108,121,103,111,110,115,0,0,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,116,111,103,103,108,101,95,112,108,111,116,40,34,103,112,95,112,108,111,116,95,37,100,34,41,62,37,100,60,47,116,100,62,10,0,0,112,97,114,97,109,101,116,101,114,32,116,111,32,96,112,109,51,100,32,97,116,96,32,114,101,113,117,105,114,101,115,32,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,117,112,32,116,111,32,54,32,99,104,97,114,97,99,116,101,114,115,32,98,44,115,44,116,10,9,40,100,114,97,119,105,110,103,32,97,116,32,98,111,116,116,111,109,44,32,115,117,114,102,97,99,101,44,32,116,111,112,41,0,0,0,0,0,0,9,60,116,114,62,10,0,0,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,98,108,101,102,116,34,62,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,32,98,111,114,100,101,114,61,48,62,10,32,32,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,32,32,32,32,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,32,105,100,61,34,103,110,117,112,108,111,116,95,109,111,117,115,101,98,111,120,34,32,98,111,114,100,101,114,61,48,62,10,32,32,32,32,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,98,104,34,62,60,47,116,100,62,60,47,116,114,62,10,32,32,32,32,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,98,104,34,62,10,32,32,32,32,32,32,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,9,60,116,114,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,116,111,103,103,108,101,95,103,114,105,100,62,60,105,109,103,32,115,114,99,61,34,37,115,103,114,105,100,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,103,114,105,100,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,35,34,32,116,105,116,108,101,61,34,116,111,103,103,108,101,32,103,114,105,100,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,117,110,122,111,111,109,62,60,105,109,103,32,115,114,99,61,34,37,115,112,114,101,118,105,111,117,115,122,111,111,109,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,117,110,122,111,111,109,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,117,110,122,111,111,109,34,32,116,105,116,108,101,61,34,117,110,122,111,111,109,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,114,101,122,111,111,109,62,60,105,109,103,32,115,114,99,61,34,37,115,110,101,120,116,122,111,111,109,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,114,101,122,111,111,109,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,114,101,122,111,111,109,34,32,116,105,116,108,101,61,34,114,101,122,111,111,109,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,116,111,103,103,108,101,95,122,111,111,109,95,116,101,120,116,62,60,105,109,103,32,115,114,99,61,34,37,115,116,101,120,116,122,111,111,109,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,116,101,120,116,122,111,111,109,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,122,111,111,109,32,116,101,120,116,34,32,116,105,116,108,101,61,34,122,111,111,109,32,116,101,120,116,32,119,105,116,104,32,112,108,111,116,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,112,111,112,117,112,95,104,101,108,112,40,41,62,60,105,109,103,32,115,114,99,61,34,37,115,104,101,108,112,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,104,101,108,112,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,63,34,32,116,105,116,108,101,61,34,104,101,108,112,34,62,60,47,116,100,62,10,9,60,47,116,114,62,10,0,0,0,0,0,60,47,115,99,114,105,112,116,62,10,60,108,105,110,107,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,37,115,103,110,117,112,108,111,116,95,109,111,117,115,101,46,99,115,115,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,62,10,60,47,104,101,97,100,62,10,60,98,111,100,121,32,111,110,108,111,97,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,40,41,59,32,103,110,117,112,108,111,116,46,105,110,105,116,40,41,59,34,32,111,110,99,111,110,116,101,120,116,109,101,110,117,61,34,114,101,116,117,114,110,32,102,97,108,115,101,59,34,62,10,10,60,100,105,118,32,99,108,97,115,115,61,34,103,110,117,112,108,111,116,34,62,10,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,34,59,10,0,0,34,59,10,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,0,121,50,122,101,114,111,97,36,120,105,115,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,32,61,32,37,46,51,102,59,10,0,9,115,117,98,115,101,113,117,101,110,116,32,115,99,97,110,115,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,110,98,32,111,102,32,112,116,115,32,97,114,101,32,0,99,121,99,36,108,101,115,0,101,114,114,111,114,98,97,114,115,32,103,97,112,32,37,100,32,108,119,32,37,103,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,32,61,32,37,46,51,102,59,10,0,77,79,85,83,69,95,89,50,0,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,104,101,105,103,104,116,32,61,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,97,120,32,45,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,105,110,59,10,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,119,105,100,116,104,32,61,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,32,45,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,59,10,0,0,0,0,0,77,111,114,101,32,112,97,114,97,109,101,116,101,114,115,32,115,112,101,99,105,102,105,101,100,32,116,104,97,110,32,100,97,116,97,32,114,101,99,111,114,100,115,32,115,112,101,99,105,102,105,101,100,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,108,111,103,97,120,105,115,95,114,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,108,111,103,97,120,105,115,95,121,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,108,111,103,97,120,105,115,95,120,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,0,0,0,0,57,48,32,109,117,108,32,115,105,110,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,50,109,97,120,0,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,0,121,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,0,0,0,0,9,116,97,107,105,110,103,32,115,99,97,110,115,32,100,105,114,101,99,116,105,111,110,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,99,108,117,115,116,101,114,101,100,32,103,97,112,32,37,100,32,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,50,109,97,120,0,101,120,112,97,110,100,105,110,103,32,99,117,114,118,101,32,118,97,114,105,97,98,108,101,32,99,111,108,111,114,115,0,77,79,85,83,69,95,88,50,0,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,114,109,105,110,32,61,32,37,103,59,10,0,0,0,67,97,110,110,111,116,32,102,108,105,112,32,97,32,110,111,110,45,101,120,105,115,116,101,110,116,32,100,105,109,101,110,115,105,111,110,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,97,120,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,105,110,0,0,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,0,0,37,115,32,61,32,37,103,59,10,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,0,0,37,37,10,0,0,0,0,0,37,115,32,61,32,37,100,59,10,0,0,0,0,0,0,0,120,50,122,101,114,111,97,36,120,105,115,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,104,101,105,103,104,116,32,61,32,37,46,49,102,59,10,0,0,0,0,66,65,67,75,87,65,82,68,0,0,0,0,0,0,0,0,99,111,108,111,114,32,102,111,114,109,117,108,97,32,111,117,116,32,111,102,32,114,97,110,103,101,32,40,117,115,101,32,96,115,104,111,119,32,112,97,108,101,116,116,101,32,114,103,98,102,111,114,109,117,108,97,101,39,32,116,111,32,100,105,115,112,108,97,121,32,116,104,101,32,114,97,110,103,101,41,0,0,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,104,105,115,116,111,103,114,97,109,32,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,119,105,100,116,104,32,61,32,37,46,49,102,59,10,0,0,0,0,0,77,79,85,83,69,95,89,0,103,110,117,112,108,111,116,46,112,108,111,116,95,121,116,111,112,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,121,98,111,116,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,70,111,114,109,97,116,32,115,112,101,99,105,102,105,101,114,32,109,117,115,116,32,98,101,103,105,110,32,119,105,116,104,32,39,37,39,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,120,109,97,120,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,67,97,110,39,116,32,114,101,45,110,97,109,101,32,39,121,39,32,105,110,32,97,32,111,110,101,45,118,97,114,105,97,98,108,101,32,102,105,116,0,117,110,100,101,102,105,110,101,100,32,118,97,108,117,101,0,103,110,117,112,108,111,116,46,112,108,111,116,95,120,109,105,110,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,101,114,109,95,121,109,97,120,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,101,114,109,95,120,109,97,120,32,61,32,37,100,59,10,0,0,0,10,47,47,32,112,108,111,116,32,98,111,117,110,100,97,114,105,101,115,32,97,110,100,32,97,120,105,115,32,115,99,97,108,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,109,111,117,115,105,110,103,32,10,0,0,105,109,103,32,58,61,32,34,37,37,10,0,0,0,0,0,67,97,110,118,97,115,84,101,120,116,70,117,110,99,116,105,111,110,115,46,101,110,97,98,108,101,40,99,116,120,41,59,10,99,116,120,46,115,116,114,111,107,101,83,116,121,108,101,32,61,32,34,114,103,98,40,50,49,53,44,50,49,53,44,50,49,53,41,34,59,10,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,37,46,49,103,59,10,10,0,0,120,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,99,116,120,46,102,105,108,108,83,116,121,108,101,32,61,32,34,37,115,34,59,10,99,116,120,46,102,105,108,108,82,101,99,116,40,48,44,48,44,37,100,44,37,100,41,59,10,0,70,79,82,87,65,82,68,0,99,111,110,102,108,105,99,116,105,110,103,32,111,112,116,105,111,110,115,0,0,0,0,0,99,116,120,46,108,105,110,101,67,97,112,32,61,32,34,37,115,34,59,32,99,116,120,46,108,105,110,101,74,111,105,110,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,77,79,85,83,69,95,88,0,103,110,117,112,108,111,116,46,100,97,115,104,108,101,110,103,116,104,32,61,32,37,100,59,10,0,0,0,0,0,0,0,47,47,32,115,104,111,114,116,32,102,111,114,109,115,32,111,102,32,99,111,109,109,97,110,100,115,32,112,114,111,118,105,100,101,100,32,98,121,32,103,110,117,112,108,111,116,95,99,111,109,109,111,110,46,106,115,10,102,117,110,99,116,105,111,110,32,68,84,32,32,40,100,116,41,32,32,123,103,110,117,112,108,111,116,46,100,97,115,104,116,121,112,101,40,100,116,41,59,125,59,10,102,117,110,99,116,105,111,110,32,68,83,32,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,100,97,115,104,115,116,97,114,116,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,68,76,32,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,100,97,115,104,115,116,101,112,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,77,32,32,32,40,120,44,121,41,32,123,105,102,32,40,103,110,117,112,108,111,116,46,112,97,116,116,101,114,110,46,108,101,110,103,116,104,32,62,32,48,41,32,68,83,40,120,44,121,41,59,32,101,108,115,101,32,103,110,117,112,108,111,116,46,77,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,76,32,32,32,40,120,44,121,41,32,123,105,102,32,40,103,110,117,112,108,111,116,46,112,97,116,116,101,114,110,46,108,101,110,103,116,104,32,62,32,48,41,32,68,76,40,120,44,121,41,59,32,101,108,115,101,32,103,110,117,112,108,111,116,46,76,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,68,111,116,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,68,111,116,40,120,47,49,48,46,44,121,47,49,48,46,41,59,125,59,10,102,117,110,99,116,105,111,110,32,80,116,32,32,40,78,44,120,44,121,44,119,41,32,123,103,110,117,112,108,111,116,46,80,116,40,78,44,120,47,49,48,46,44,121,47,49,48,46,44,119,47,49,48,46,41,59,125,59,10,102,117,110,99,116,105,111,110,32,82,32,32,32,40,120,44,121,44,119,44,104,41,32,123,103,110,117,112,108,111,116,46,82,40,120,44,121,44,119,44,104,41,59,125,59,10,102,117,110,99,116,105,111,110,32,84,32,32,32,40,120,44,121,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,32,123,103,110,117,112,108,111,116,46,84,40,120,44,121,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,59,125,59,10,102,117,110,99,116,105,111,110,32,84,82,32,32,40,120,44,121,44,97,110,103,108,101,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,32,123,103,110,117,112,108,111,116,46,84,82,40,120,44,121,44,97,110,103,108,101,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,59,125,59,10,102,117,110,99,116,105,111,110,32,98,112,32,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,98,112,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,99,102,112,32,40,41,32,123,103,110,117,112,108,111,116,46,99,102,112,40,41,59,125,59,10,102,117,110,99,116,105,111,110,32,99,102,115,112,40,41,32,123,103,110,117,112,108,111,116,46,99,102,115,112,40,41,59,125,59,10,10,0,85,110,114,101,99,111,103,110,105,122,101,100,32,98,105,110,97,114,121,32,102,111,114,109,97,116,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,0,0,0,0,0,0,0,47,47,32,71,110,117,112,108,111,116,32,118,101,114,115,105,111,110,32,37,115,46,37,115,10,0,0,0,0,0,0,0,47,47,32,82,101,105,110,105,116,105,97,108,105,122,101,32,109,111,117,115,101,32,116,114,97,99,107,105,110,103,32,97,110,100,32,122,111,111,109,32,102,111,114,32,116,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,112,108,111,116,10,105,102,32,40,40,116,121,112,101,111,102,40,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,41,32,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,124,124,32,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,32,33,61,32,37,115,41,32,32,38,38,32,32,116,121,112,101,111,102,40,103,110,117,112,108,111,116,46,109,111,117,115,101,95,117,112,100,97,116,101,41,32,33,61,32,34,117,110,100,101,102,105,110,101,100,34,41,32,123,10,32,32,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,95,110,97,109,101,32,61,32,34,37,115,34,59,10,32,32,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,32,61,32,37,115,59,10,32,32,99,97,110,118,97,115,46,111,110,109,111,117,115,101,109,111,118,101,32,61,32,103,110,117,112,108,111,116,46,109,111,117,115,101,95,117,112,100,97,116,101,59,10,32,32,99,97,110,118,97,115,46,111,110,109,111,117,115,101,117,112,32,61,32,103,110,117,112,108,111,116,46,122,111,111,109,95,105,110,59,10,32,32,99,97,110,118,97,115,46,111,110,109,111,117,115,101,100,111,119,110,32,61,32,103,110,117,112,108,111,116,46,115,97,118,101,99,108,105,99,107,59,10,32,32,99,97,110,118,97,115,46,111,110,107,101,121,112,114,101,115,115,32,61,32,103,110,117,112,108,111,116,46,100,111,95,104,111,116,107,101,121,59,10,32,32,105,102,32,40,99,97,110,118,97,115,46,97,116,116,97,99,104,69,118,101,110,116,41,32,123,99,97,110,118,97,115,46,97,116,116,97,99,104,69,118,101,110,116,40,39,109,111,117,115,101,111,118,101,114,39,44,32,37,115,41,59,125,10,32,32,101,108,115,101,32,105,102,32,40,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,41,32,123,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,39,109,111,117,115,101,111,118,101,114,39,44,32,37,115,44,32,102,97,108,115,101,41,59,125,32,10,32,32,103,110,117,112,108,111,116,46,122,111,111,109,101,100,32,61,32,102,97,108,115,101,59,10,32,32,103,110,117,112,108,111,116,46,122,111,111,109,95,97,120,105,115,95,119,105,100,116,104,32,61,32,48,59,10,32,32,103,110,117,112,108,111,116,46,122,111,111,109,95,105,110,95,112,114,111,103,114,101,115,115,32,61,32,102,97,108,115,101,59,10,32,32,103,110,117,112,108,111,116,46,112,111,108,97,114,95,109,111,100,101,32,61,32,37,115,59,10,32,32,99,116,120,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,37,100,44,37,100,41,59,10,125,10,0,37,65,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,37,115,40,41,32,123,10,99,97,110,118,97,115,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,34,37,115,34,41,59,10,99,116,120,32,61,32,99,97,110,118,97,115,46,103,101,116,67,111,110,116,101,120,116,40,34,50,100,34,41,59,10,0,102,111,114,109,97,116,32,116,111,111,32,108,111,110,103,32,100,117,101,32,116,111,32,108,111,110,103,32,100,101,99,105,109,97,108,115,105,103,110,32,115,116,114,105,110,103,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,117,110,115,101,116,32,108,97,98,101,108,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,10,118,97,114,32,99,97,110,118,97,115,44,32,99,116,120,59,10,103,110,117,112,108,111,116,46,103,114,105,100,95,108,105,110,101,115,32,61,32,116,114,117,101,59,10,103,110,117,112,108,111,116,46,122,111,111,109,101,100,32,61,32,102,97,108,115,101,59,10,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,95,110,97,109,101,32,61,32,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,59,10,10,102,117,110,99,116,105,111,110,32,103,110,117,112,108,111,116,95,99,97,110,118,97,115,40,41,32,123,10,99,97,110,118,97,115,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,41,59,10,99,116,120,32,61,32,99,97,110,118,97,115,46,103,101,116,67,111,110,116,101,120,116,40,34,50,100,34,41,59,10,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,103,110,117,112,108,111,116,46,105,110,105,116,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,125,59,60,47,115,99,114,105,112,116,62,10,0,0,67,111,110,84,101,88,116,32,119,105,116,104,32,77,101,116,97,70,117,110,32,40,102,111,114,32,80,68,70,32,100,111,99,117,109,101,110,116,115,41,0,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,32,103,110,117,112,108,111,116,46,104,101,108,112,95,85,82,76,32,61,32,34,37,115,47,99,97,110,118,97,115,95,104,101,108,112,46,104,116,109,108,34,59,32,60,47,115,99,114,105,112,116,62,10,0,0,0,0,118,114,36,97,110,103,101,0,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,103,110,117,112,108,111,116,95,109,111,117,115,101,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,0,0,0,0,0,9,116,97,107,105,110,103,32,115,99,97,110,115,32,105,110,32,37,115,32,100,105,114,101,99,116,105,111,110,10,0,0,105,110,118,97,108,105,100,32,99,111,108,111,114,98,111,120,32,111,112,116,105,111,110,0,115,101,116,32,115,116,121,108,101,32,97,114,114,111,119,32,37,100,0,0,0,0,0,0,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,103,110,117,112,108,111,116,95,100,97,115,104,101,100,108,105,110,101,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,0,0,0,0,0,0,0,107,101,121,95,99,104,97,114,0,0,0,0,0,0,0,0,99,97,110,118,97,115,116,101,120,116,0,0,0,0,0,0,99,97,110,118,97,115,109,97,116,104,0,0,0,0,0,0,70,97,105,108,117,114,101,32,105,110,32,98,105,110,97,114,121,32,116,97,98,108,101,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,0,0,107,111,105,56,36,117,0,0,60,33,45,45,91,105,102,32,73,69,93,62,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,115,114,99,61,34,101,120,99,97,110,118,97,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,60,33,91,101,110,100,105,102,93,45,45,62,10,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,37,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,103,110,117,112,108,111,116,95,99,111,109,109,111,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,0,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,99,111,110,116,101,110,116,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,62,10,0,0,0,0,71,110,117,112,108,111,116,32,67,97,110,118,97,115,32,71,114,97,112,104,0,0,0,0,60,33,68,79,67,84,89,80,69,32,72,84,77,76,62,10,60,104,116,109,108,62,10,60,104,101,97,100,62,10,60,116,105,116,108,101,62,37,115,60,47,116,105,116,108,101,62,10,0,0,0,0,0,0,0,0,99,116,120,46,98,101,103,105,110,80,97,116,104,40,41,59,10,0,0,0,0,0,0,0,99,111,110,116,101,120,116,0,77,40,37,117,44,37,117,41,59,10,0,0,0,0,0,0,117,114,36,97,110,103,101,0,114,101,102,36,114,101,115,104,0,0,0,0,0,0,0,0,76,40,37,117,44,37,117,41,59,10,0,0,0,0,0,0,9,116,114,117,101,32,100,101,112,116,104,32,111,114,100,101,114,105,110,103,10,0,0,0,101,120,112,101,99,116,105,110,103,32,115,99,114,101,101,110,32,118,97,108,117,101,32,91,48,32,45,32,49,93,0,0,105,108,108,101,103,97,108,32,112,114,101,102,105,120,0,0,117,110,115,101,116,32,115,116,121,108,101,32,97,114,114,111,119,10,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,100,97,115,104,112,97,116,116,101,114,110,51,41,59,10,0,0,0,0,0,0,77,79,85,83,69,95,67,72,65,82,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,100,97,115,104,112,97,116,116,101,114,110,37,49,100,41,59,10,0,0,0,0,119,120,116,0,0,0,0,0,114,103,98,40,49,55,49,44,50,49,52,44,48,48,48,41,0,0,0,0,0,0,0,0,37,39,34,32,0,0,0,0,114,103,98,40,50,49,52,44,48,48,48,44,49,50,48,41,0,0,0,0,0,0,0,0,114,103,98,40,50,53,53,44,50,48,52,44,48,48,48,41,0,0,0,0,0,0,0,0,114,103,98,40,49,54,51,44,49,52,53,44,50,53,53,41,0,0,0,0,0,0,0,0,116,111,107,101,110,32,116,97,98,108,101,0,0,0,0,0,37,115,37,115,10,37,115,37,115,10,37,115,37,115,10,37,115,37,115,37,115,37,115,10,37,115,10,0,0,0,0,0,114,103,98,40,50,49,52,44,50,49,52,44,48,54,57,41,0,0,0,0,0,0,0,0,114,103,98,40,48,48,48,44,49,53,51,44,49,54,49,41,0,0,0,0,0,0,0,0,77,101,116,97,80,111,115,116,32,112,108,111,116,116,105,110,103,32,115,116,97,110,100,97,114,100,0,0,0,0,0,0,114,103,98,40,50,53,53,44,49,53,51,44,48,48,48,41,0,0,0,0,0,0,0,0,116,114,36,97,110,103,101,0,122,120,121,0,0,0,0,0,114,103,98,40,48,48,48,44,48,48,48,44,49,52,56,41,0,0,0,0,0,0,0,0,84,79,80,0,0,0,0,0,98,121,0,0,0,0,0,0,116,97,103,32,109,117,115,116,32,98,101,32,115,116,114,105,99,116,108,121,32,112,111,115,105,116,105,118,101,32,40,115,101,101,32,96,104,101,108,112,32,115,101,116,32,115,116,121,108,101,32,108,105,110,101,39,41,0,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,108,105,110,101,32,37,100,32,0,0,0,0,0,0,114,103,98,40,48,50,49,44,49,49,55,44,48,54,57,41,0,0,0,0,0,0,0,0,77,79,85,83,69,95,75,69,89,0,0,0,0,0,0,0,114,103,98,40,48,48,48,44,50,53,53,44,50,53,53,41,0,0,0,0,0,0,0,0,114,103,98,40,49,57,48,44,48,48,48,44,49,57,48,41,0,0,0,0,0,0,0,0,117,115,105,110,103,32,100,101,102,97,117,108,116,32,98,105,110,97,114,121,32,102,111,114,109,97,116,0,0,0,0,0,32,100,101,102,97,117,108,116,10,0,0,0,0,0,0,0,114,103,98,40,48,48,48,44,48,48,48,44,50,50,53,41,0,0,0,0,0,0,0,0,100,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,112,108,111,116,32,111,112,116,105,111,110,115,0,0,0,114,103,98,40,48,48,48,44,49,55,49,44,48,48,48,41,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,117,110,105,113,117,101,39,44,32,39,102,114,101,113,117,101,110,99,121,39,44,32,39,99,117,109,117,108,97,116,105,118,101,39,44,32,39,99,110,111,114,109,97,108,39,44,32,39,107,100,101,110,115,105,116,121,39,44,32,39,97,99,115,112,108,105,110,101,115,39,44,32,39,99,115,112,108,105,110,101,115,39,44,32,39,98,101,122,105,101,114,39,32,111,114,32,39,115,98,101,122,105,101,114,39,0,0,0,0,114,103,98,40,50,53,53,44,48,48,48,44,48,48,48,41,0,0,0,0,0,0,0,0,83,72,69,76,76,0,0,0,124,124,0,0,0,0,0,0,114,103,98,40,49,54,48,44,49,54,48,44,49,54,48,41,0,0,0,0,0,0,0,0,109,97,116,114,105,120,32,101,108,101,109,101,110,116,115,0])
-.concat([114,103,98,40,48,48,48,44,48,48,48,44,48,48,48,41,0,0,0,0,0,0,0,0,115,112,108,105,110,101,32,109,97,116,114,105,120,0,0,0,109,112,0,0,0,0,0,0,114,103,98,40,50,53,53,44,50,53,53,44,50,53,53,41,0,0,0,0,0,0,0,0,114,114,36,97,110,103,101,0,117,115,105,110,103,32,100,101,102,97,117,108,116,32,98,105,110,97,114,121,32,114,101,99,111,114,100,47,97,114,114,97,121,32,115,116,114,117,99,116,117,114,101,0,0,0,0,0,72,111,109,101,0,0,0,0,34,41,59,10,0,0,0,0,83,85,82,70,65,67,69,0,105,110,118,97,108,105,100,32,112,109,51,100,32,111,112,116,105,111,110,0,0,0,0,0,84,40,37,100,44,37,100,44,37,46,49,102,44,34,37,115,34,44,34,0,0,0,0,0,117,110,115,101,116,32,115,116,121,108,101,32,108,105,110,101,10,0,0,0,0,0,0,0,102,105,108,108,101,100,95,112,111,108,121,103,111,110,51,100,32,99,111,114,110,101,114,115,0,0,0,0,0,0,0,0,32,32,32,112,117,115,104,101,100,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,0,0,0,0,77,79,85,83,69,95,66,85,84,84,79,78,0,0,0,0,84,82,40,37,100,44,37,100,44,37,100,44,37,46,49,102,44,34,37,115,34,44,34,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,0,0,0,0,82,105,103,104,116,0,0,0,108,105,116,116,108,101,0,0,80,116,40,37,100,44,37,100,44,37,100,44,37,46,49,102,41,59,10,0,0,0,0,0,68,111,116,40,37,100,44,37,100,41,59,10,0,0,0,0,82,40,37,100,44,37,100,44,37,100,44,37,100,41,59,10,0,0,0,0,0,0,0,0,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,37,103,59,10,0,0,0,0,99,116,120,46,115,116,114,111,107,101,83,116,121,108,101,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,0,77,101,116,97,102,111,110,116,32,112,108,111,116,116,105,110,103,32,115,116,97,110,100,97,114,100,0,0,0,0,0,0,114,103,98,40,37,48,51,100,44,37,48,51,100,44,37,48,51,100,41,0,0,0,0,0,99,98,114,36,97,110,103,101,0,0,0,0,0,0,0,0,37,115,37,99,0,0,0,0,66,79,84,84,79,77,0,0,101,120,112,101,99,116,105,110,103,32,39,109,101,97,110,39,44,32,39,103,101,111,109,101,97,110,39,44,32,39,109,101,100,105,97,110,39,44,32,39,109,105,110,39,44,32,39,109,97,120,39,44,32,39,99,49,39,44,32,39,99,50,39,44,32,39,99,51,39,32,111,114,32,39,99,52,39,0,0,0,117,115,101,114,115,116,121,108,101,115,0,0,0,0,0,0,114,103,98,40,37,51,100,44,37,51,100,44,37,51,100,41,37,99,0,0,0,0,0,0,114,103,98,97,40,50,53,53,44,50,53,53,44,50,53,53,44,48,46,48,48,41,0,0,114,103,98,97,40,37,49,49,46,49,49,115,44,37,52,46,50,102,41,37,99,0,0,0,68,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,100,97,116,97,102,105,108,101,32,111,112,116,105,111,110,115,0,0,0,0,0,0,0,37,77,0,0,0,0,0,0,99,102,115,112,40,41,59,10,0,0,0,0,0,0,0,0,80,108,111,116,32,116,121,112,101,32,105,115,32,110,101,105,116,104,101,114,32,102,117,110,99,116,105,111,110,32,110,111,114,32,100,97,116,97,0,0,99,102,112,40,41,59,10,0,76,40,37,100,44,32,37,100,41,59,10,0,0,0,0,0,98,112,40,37,100,44,32,37,100,41,59,10,0,0,0,0,99,116,120,46,102,105,108,108,83,116,121,108,101,32,61,32,34,37,115,34,59,10,0,0,109,102,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,115,111,108,105,100,41,59,10,0,0,0,0,0,122,114,36,97,110,103,101,0,109,0,0,0,0,0,0,0,84,104,105,115,32,99,111,112,121,32,111,102,32,103,110,117,112,108,111,116,32,99,97,110,110,111,116,32,114,101,97,100,32,112,110,103,47,103,105,102,47,106,112,101,103,32,105,109,97,103,101,115,0,0,0,0,44,32,116,104,101,110,32,0,99,52,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,105,110,99,114,101,109,101,110,116,32,37,115,10,0,77,126,60,62,37,87,61,38,64,0,0,0,0,0,0,0,97,120,105,115,32,114,97,110,103,101,115,32,109,117,115,116,32,98,101,32,97,98,111,118,101,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,33,0,0,0,0,0,0,65,99,101,70,86,63,97,98,100,69,103,104,110,111,112,113,117,0,0,0,0,0,0,0,32,74,84,118,94,95,34,42,121,107,76,115,120,122,0,0,109,105,115,115,105,110,103,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,40,41,91,93,123,125,92,0,102,116,114,0,0,0,0,0,106,96,39,44,59,58,33,46,0,0,0,0,0,0,0,0,105,73,108,124,0,0,0,0,99,116,120,46,115,116,114,111,107,101,40,41,59,10,0,0,76,97,84,101,88,32,116,101,120,100,114,97,119,32,101,110,118,105,114,111,110,109,101,110,116,0,0,0,0,0,0,0,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,115,97,118,101,87,105,100,116,104,59,10,125,32,47,47,32,103,114,105,100,95,108,105,110,101,115,10,0,0,0,0,0,121,50,114,36,97,110,103,101,0,0,0,0,0,0,0,0,105,102,32,40,103,110,117,112,108,111,116,46,103,114,105,100,95,108,105,110,101,115,41,32,123,10,118,97,114,32,115,97,118,101,87,105,100,116,104,32,61,32,99,116,120,46,108,105,110,101,87,105,100,116,104,59,10,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,99,116,120,46,108,105,110,101,87,105,100,116,104,32,42,32,48,46,53,59,10,0,0,9,112,109,51,100,32,112,108,111,116,116,101,100,32,97,116,32,0,0,0,0,0,0,0,99,51,0,0,0,0,0,0,32,115,105,122,101,32,37,115,32,37,46,51,102,44,37,46,51,102,44,37,46,51,102,0,125,32,47,47,32,69,110,100,32,37,115,95,112,108,111,116,95,37,100,32,10,0,0,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,107,101,101,112,102,105,120,0,0,0,105,102,32,40,116,121,112,101,111,102,40,103,110,117,112,108,111,116,46,104,105,100,101,95,37,115,95,112,108,111,116,95,37,100,41,32,61,61,32,34,117,110,100,101,102,105,110,101,100,34,124,124,32,33,103,110,117,112,108,111,116,46,104,105,100,101,95,37,115,95,112,108,111,116,95,37,100,41,32,123,10,0,0,0,0,0,0,0,103,112,0,0,0,0,0,0,102,111,114,109,36,97,116,0,99,116,120,46,99,108,111,115,101,80,97,116,104,40,41,59,10,0,0,0,0,0,0,0,119,105,100,36,116,104,0,0,108,105,36,110,101,119,105,100,116,104,0,0,0,0,0,0,110,111,114,36,111,116,97,116,101,0,0,0,0,0,0,0,115,113,114,116,40,115,113,114,116,40,120,41,41,0,0,0,119,105,110,36,119,111,114,100,54,0,0,0,0,0,0,0,116,101,120,100,114,97,119,0,110,111,102,36,111,110,116,108,105,115,116,0,0,0,0,0,121,114,36,97,110,103,101,0,108,97,36,110,100,115,99,97,112,101,0,0,0,0,0,0,101,120,112,108,105,99,105,116,32,40,100,114,97,119,32,112,109,51,100,32,115,117,114,102,97,99,101,32,97,99,99,111,114,100,105,110,103,32,116,111,32,115,116,121,108,101,41,0,99,50,0,0,0,0,0,0,99,104,97,114,97,99,116,101,114,0,0,0,0,0,0,0,32,120,37,48,50,120,37,48,50,120,37,48,50,120,0,0,96,98,117,105,108,116,105,110,45,97,117,116,111,115,99,97,108,101,96,32,40,115,101,116,32,97,117,116,111,115,99,97,108,101,32,107,101,101,112,102,105,120,59,32,114,101,112,108,111,116,41,0,0,0,0,0,110,111,102,111,110,116,108,105,115,116,0,0,0,0,0,0,37,115,32,37,115,32,37,115,32,37,115,32,37,115,32,119,105,100,116,104,32,37,100,32,108,105,110,101,119,105,100,116,104,32,37,100,32,34,37,115,34,32,37,100,0,0,0,0,79,112,116,105,111,110,115,32,97,114,101,32,100,101,102,97,117,108,116,44,32,115,119,97,112,32,40,115,119,97,98,41,44,32,108,105,116,116,108,101,44,32,98,105,103,44,32,109,105,100,100,108,101,32,40,112,100,112,41,0,0,0,0,0,37,115,44,37,100,0,0,0,105,110,118,97,108,105,100,32,99,111,108,111,114,32,115,112,101,99,44,32,109,117,115,116,32,98,101,32,120,82,82,71,71,66,66,0,0,0,0,0,120,37,50,104,120,37,50,104,120,37,50,104,120,0,0,0,119,105,100,116,104,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,80,83,84,114,105,99,107,115,32,109,97,99,114,111,115,0,0,99,103,109,32,112,111,108,121,108,105,110,101,115,0,0,0,120,50,114,36,97,110,103,101,0,0,0,0,0,0,0,0,37,46,51,49,115,44,37,100,0,0,0,0,0,0,0,0,105,109,112,108,105,99,105,116,32,40,112,109,51,100,32,100,114,97,119,32,102,111,114,32,97,108,108,32,115,117,114,102,97,99,101,115,41,0,0,0,99,49,0,0,0,0,0,0,115,99,114,101,101,110,0,0,80,73,67,84,85,82,69,49,0,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,98,111,114,100,101,114,96,0,67,71,77,32,102,111,110,116,32,108,105,115,116,0,0,0,71,110,117,112,108,111,116,32,118,101,114,115,105,111,110,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,44,32,67,111,109,112,117,116,101,114,32,71,114,97,112,104,105,99,115,32,77,101,116,97,102,105,108,101,32,118,101,114,115,105,111,110,32,49,32,112,101,114,32,77,73,76,45,68,45,50,56,48,48,51,65,47,66,65,83,73,67,45,49,46,37,100,0,0,0,0,0,0,112,100,112,0,0,0,0,0,84,105,109,101,115,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,0,0,0,0,84,105,109,101,115,32,79,98,108,105,113,117,101,0,0,0,67,111,117,114,105,101,114,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,0,67,111,117,114,105,101,114,32,73,116,97,108,105,99,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,112,115,116,114,105,99,107,115,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,73,116,97,108,105,99,0,0,0,0,0,0,0,0,120,114,36,97,110,103,101,0,49,53,0,0,0,0,0,0,9,112,109,51,100,32,115,116,121,108,101,32,105,115,32,37,115,10,0,0,0,0,0,0,103,114,97,112,104,0,0,0,83,99,114,105,112,116,0,0,96,98,117,105,108,116,105,110,45,114,101,112,108,111,116,96,0,0,0,0,0,0,0,0,90,97,112,102,68,105,110,103,98,97,116,115,0,0,0,0,72,101,114,115,104,101,121,47,83,121,109,98,111,108,95,77,97,116,104,0,0,0,0,0,109,105,100,36,100,108,101,0,72,101,114,115,104,101,121,47,83,121,109,98,111,108,95,83,101,116,95,50,0,0,0,0,72,101,114,115,104,101,121,47,83,121,109,98,111,108,95,83,101,116,95,49,0,0,0,0,76,111,99,97,108,101,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,0,0,0,72,101,114,115,104,101,121,47,71,111,116,104,105,99,95,73,116,97,108,105,97,110,0,0,111,101,69,102,70,103,71,0,99,121,99,108,101,0,0,0,72,101,114,115,104,101,121,47,71,111,116,104,105,99,95,69,110,103,108,105,115,104,0,0,72,101,114,115,104,101,121,47,71,111,116,104,105,99,95,71,101,114,109,97,110,0,0,0,84,80,73,67,32,45,45,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,116,112,105,99,32,92,115,112,101,99,105,97,108,115,0,0,0,72,101,114,115,104,101,121,47,84,114,105,112,108,101,120,95,73,116,97,108,105,99,0,0,110,111,99,98,109,116,105,36,99,115,0,0,0,0,0,0,72,101,114,115,104,101,121,47,84,114,105,112,108,101,120,95,82,111,109,97,110,0,0,0,9,112,111,105,110,116,115,105,122,101,32,105,115,32,37,103,10,0,0,0,0,0,0,0,115,101,99,111,110,100,0,0,72,101,114,115,104,101,121,47,68,117,112,108,101,120,95,82,111,109,97,110,0,0,0,0,117,110,115,101,116,32,103,114,105,100,0,0,0,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,67,121,114,105,108,108,105,99,0,0,0,0,0,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,73,116,97,108,105,99,0,0,108,105,116,36,116,108,101,0,107,111,105,56,36,114,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,83,99,114,105,112,116,0,0,103,116,0,0,0,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,71,114,101,101,107,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,82,111,109,97,110,0,0,0,72,101,114,115,104,101,121,47,83,105,109,112,108,101,120,95,83,99,114,105,112,116,0,0,72,101,114,115,104,101,121,47,83,105,109,112,108,101,120,95,71,114,101,101,107,0,0,0,116,112,105,99,0,0,0,0,72,101,114,115,104,101,121,47,83,105,109,112,108,101,120,95,82,111,109,97,110,0,0,0,99,98,109,116,105,36,99,115,0,0,0,0,0,0,0,0,113,36,117,105,116,0,0,0,72,101,114,115,104,101,121,47,67,97,114,116,111,103,114,97,112,104,105,99,95,71,114,101,101,107,0,0,0,0,0,0,9,112,111,105,110,116,105,110,116,101,114,118,97,108,98,111,120,32,105,115,32,37,103,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,0,0,102,105,114,115,116,0,0,0,72,101,114,115,104,101,121,47,67,97,114,116,111,103,114,97,112,104,105,99,95,82,111,109,97,110,0,0,0,0,0,0,67,71,77,32,99,111,108,111,114,32,116,97,98,108,101,0,48,32,60,61,32,108,101,110,103,116,104,0,0,0,0,0,115,119,97,98,0,0,0,0,40,48,32,60,61,32,99,103,109,95,105,100,41,32,38,38,32,40,99,103,109,95,105,100,32,60,32,49,50,56,41,0,40,48,32,60,61,32,99,108,97,115,115,41,32,38,38,40,99,108,97,115,115,32,60,49,54,41,0,0,0,0,0,0,118,97,108,117,101,32,60,61,32,51,50,55,54,55,0,0,43,68,65,84,65,83,84,82,73,78,71,83,32,32,43,72,73,83,84,79,71,82,65,77,83,32,32,43,79,66,74,69,67,84,83,32,32,43,83,84,82,73,78,71,86,65,82,83,32,32,43,77,65,67,82,79,83,32,32,43,73,77,65,71,69,32,32,43,85,83,69,82,95,76,73,78,69,84,89,80,69,83,32,43,83,84,65,84,83,32,0,0,0,0,0,0,45,51,50,55,54,56,32,60,61,32,118,97,108,117,101,0,69,69,80,73,67,32,45,45,32,101,120,116,101,110,100,101,100,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,0,0,0,0,0,99,111,108,111,117,114,36,0,110,111,122,109,116,105,36,99,115,0,0,0,0,0,0,0,99,111,108,111,114,36,0,0,9,104,111,119,101,118,101,114,32,76,67,95,67,84,89,80,69,32,105,110,32,99,117,114,114,101,110,116,32,108,111,99,97,108,101,32,105,115,32,37,115,10,0,0,0,0,0,0,103,101,111,109,101,97,110,0,37,115,32,34,37,115,34,32,37,100,44,37,48,46,49,102,44,37,48,46,49,102,44,37,48,46,49,102,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,103,114,105,100,96,0,0,0,83,119,105,116,122,101,114,108,97,110,100,76,105,103,104,116,0,0,0,0,0,0,0,0,37,37,33,80,83,45,65,100,111,98,101,45,50,46,48,32,69,80,83,70,45,49,46,50,10,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,37,37,37,37,84,101,109,112,108,97,116,101,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,37,37,37,37,69,110,100,67,111,109,109,101,110,116,115,10,37,37,37,37,69,110,100,80,114,111,108,111,103,10,37,37,37,37,66,101,103,105,110,83,101,116,117,112,10,37,37,37,37,69,110,100,83,101,116,117,112,10,0,0,0,115,119,97,112,0,0,0,0,32,37,115,32,112,97,116,116,101,114,110,32,37,100,32,0,37,48,46,50,102,32,37,48,46,50,102,32,109,10,0,0,110,111,115,117,114,36,102,97,99,101,0,0,0,0,0,0,83,10,37,46,50,102,32,37,46,50,102,32,109,10,0,0,115,36,109,111,111,116,104,0,37,46,50,102,32,37,46,50,102,32,108,10,0,0,0,0,110,111,32,72,79,77,69,32,102,111,117,110,100,0,0,0,101,120,116,101,110,100,95,97,116,0,0,0,0,0,0,0,91,50,32,50,32,50,32,50,32,50,32,50,32,50,32,52,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,48,46,53,32,48,46,53,32,48,46,53,32,48,32,75,10,0,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,100,101,102,105,110,105,116,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,0,101,101,112,105,99,0,0,0,91,50,32,50,32,50,32,50,32,50,32,52,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,0,0,122,109,116,105,36,99,115,0,73,110,115,101,114,116,0,0,48,32,48,46,55,32,49,32,48,32,75,10,0,0,0,0,9,110,111,109,105,110,97,108,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,32,105,115,32,37,115,10,0,0,0,0,0,0,91,50,32,50,32,50,32,52,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,102,111,110,116,112,97,116,104,95,102,117,108,108,110,97,109,101,58,32,78,111,32,80,105,112,101,32,97,108,108,111,119,101,100,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,104,101,108,112,96,0,0,91,52,32,51,32,49,32,51,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,73,78,84,71,82,32,97,114,103,117,109,101,110,116,0,0,0,0,0,48,32,48,32,49,32,48,32,75,10,0,0,0,0,0,0,91,53,32,50,32,49,32,50,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,49,32,48,32,48,32,48,32,75,10,0,0,0,0,0,0,37,102,32,119,10,0,0,0,91,49,32,49,46,53,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,48,32,49,32,48,32,48,32,75,10,0,0,0,0,0,0,112,108,97,105,110,32,84,101,88,32,119,105,116,104,32,80,111,115,116,83,99,114,105,112,116,32,92,115,112,101,99,105,97,108,115,0,0,0,0,0,91,50,32,51,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,0,0,110,111,121,50,109,116,105,36,99,115,0,0,0,0,0,0,48,32,49,32,49,32,48,32,75,10,0,0,0,0,0,0,9,100,101,103,114,101,101,32,115,105,103,110,32,102,111,114,32,111,117,116,112,117,116,32,105,115,32,37,115,32,10,0,68,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,32,45,45,45,32,105,103,110,111,114,101,100,0,0,0,91,52,32,50,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,0,0,67,97,110,110,111,116,32,116,111,103,103,108,101,32,108,111,103,32,115,99,97,108,101,32,102,111,114,32,118,111,108,97,116,105,108,101,32,100,97,116,97,0,0,0,0,0,0,0,49,32,49,32,48,32,48,32,75,10,0,0,0,0,0,0,91,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,101,110,100,36,105,97,110,0,49,32,48,32,49,32,48,32,75,10,0,0,0,0,0,0,91,49,32,50,93,32,48,32,100,10,48,32,106,10,48,32,71,10,0,0,0,0,0,0,104,105,100,100,101,110,32,115,111,114,116,32,101,100,103,101,115,0,0,0,0,0,0,0,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,58,32,37,115,0,0,91,93,32,48,32,100,10,48,32,106,10,48,32,71,10,0,48,32,48,32,48,32,49,32,75,10,0,0,0,0,0,0,37,46,50,102,32,119,10,0,112,115,116,101,120,0,0,0,41,116,10,84,10,0,0,0,121,50,109,116,105,36,99,115,0,0,0,0,0,0,0,0,91,48,32,49,32,45,49,32,48,32,37,46,50,102,32,37,46,50,102,93,101,10,48,32,103,10,0,0,0,0,0,0,9,100,101,99,105,109,97,108,115,105,103,110,32,102,111,114,32,111,117,116,112,117,116,32,104,97,115,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,40,110,111,114,109,97,108,108,121,32,39,46,39,41,10,0,0,0,0,0,0,0,91,49,32,48,32,48,32,49,32,37,46,50,102,32,37,46,50,102,93,101,10,48,32,103,10,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,108,117,115,104,32,39,98,101,103,105,110,39,44,32,39,99,101,110,116,101,114,39,32,111,114,32,39,101,110,100,39,0,0,0,0,0,0,32,37,115,32,37,115,32,37,115,0,0,0,0,0,0,0,82,97,115,116,101,114,65,120,101,115,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,108,111,103,96,32,121,32,108,111,103,115,99,97,108,101,32,102,111,114,32,112,108,111,116,115,44,32,122,32,97,110,100,32,99,98,32,102,111,114,32,115,112,108,111,116,115,0,0,47,95,37,115,32,37,100,32,37,100,32,48,32,50,32,122,10,0,0,0,0,0,0,0,47,95,37,115,32,37,100,32,37,100,32,48,32,49,32,122,10,0,0,0,0,0,0,0,115,107,105,112,0,0,0,0,86,105,115,105,98,108,101,32,112,105,120,101,108,32,103,114,105,100,32,104,97,115,32,97,32,115,99,97,110,32,108,105,110,101,32,115,104,111,114,116,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,32,115,99,97,110,32,108,105,110,101,115,46,0,0,0,0,47,95,37,115,32,37,100,32,37,100,32,48,32,48,32,122,10,0,0,0,0,0,0,0,83,10,0,0,0,0,0,0,110,111,101,36,110,104,97,110,99,101,100,0,0,0,0,0,110,111,102,36,101,101,100,0,102,36,101,101,100,0,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,80,111,115,116,83,99,114,105,112,116,32,92,115,112,101,99,105,97,108,115,0,0,0,0,0,37,115,102,101,101,100,32,37,115,32,115,105,122,101,32,37,100,44,32,37,100,0,0,0,110,111,121,109,116,105,36,99,115,0,0,0,0,0,0,0,100,117,109,98,32,116,101,114,109,105,110,97,108,0,0,0,9,100,101,99,105,109,97,108,115,105,103,110,32,102,111,114,32,111,117,116,112,117,116,32,105,115,32,37,115,32,10,0,101,36,110,100,0,0,0,0,32,32,48,10,69,78,68,83,69,67,10,32,32,48,10,69,79,70,10,0,0,0,0,0,115,101,116,32,108,111,103,32,121,50,0,0,0,0,0,0,55,0,0,0,0,0,0,0,32,32,48,10,69,78,68,84,65,66,10,48,10,69,78,68,83,69,67,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,66,76,79,67,75,83,10,32,32,48,10,69,78,68,83,69,67,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,69,78,84,73,84,73,69,83,10,0,75,101,121,32,119,111,114,100,32,96,112,101,114,112,101,110,100,105,99,117,108,97,114,96,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,32,96,112,108,111,116,96,32,99,111,109,109,97,110,100,0,0,0,0,0,32,32,48,10,76,65,89,69,82,10,32,32,50,10,37,115,10,32,55,48,10,32,32,32,54,52,10,54,50,10,32,32,32,37,115,10,32,32,54,10,37,115,10,0,0,0,0,0,32,32,48,10,84,65,66,76,69,10,32,32,50,10,76,65,89,69,82,10,32,55,48,10,32,32,32,37,45,100,10,0,32,32,48,10,80,79,76,89,76,73,78,69,10,32,32,56,10,37,115,10,32,54,54,10,32,32,32,49,10,32,32,54,10,37,115,10,32,32,48,10,86,69,82,84,69,88,10,32,32,56,10,37,115,10,32,32,54,10,37,115,10,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,51,48,10,48,46,48,48,48,10,0,0,0,68,65,83,72,68,79,84,0,115,113,114,116,32,115,113,114,116,0,0,0,0,0,0,0,68,79,84,0,0,0,0,0,112,115,108,97,116,101,120,0,80,72,65,78,84,79,77,0,121,109,116,105,36,99,115,0,67,69,78,84,69,82,0,0,9,100,101,99,105,109,97,108,115,105,103,110,32,102,111,114,32,105,110,112,117,116,32,105,115,32,32,37,115,32,10,0,98,36,101,103,105,110,0,0,115,101,116,32,97,114,114,111,119,32,37,100,32,102,114,111,109,32,0,0,0,0,0,0,72,73,68,68,69,78,0,0,117,110,115,101,116,32,108,111,103,32,121,50,0,0,0,0,68,65,83,72,69,68,0,0,67,79,78,84,73,78,85,79,85,83,0,0,0,0,0,0,112,101,114,112,36,101,110,100,105,99,117,108,97,114,0,0,32,32,48,10,86,69,82,84,69,88,10,32,32,56,10,37,115,10,32,32,54,10,37,115,10,32,32,49,48,10,37,45,54,46,51,102,10,32,32,50,48,10,37,45,54,46,51,102,10,32,32,51,48,10,48,46,48,48,48,10,0,0,0,0,53,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,117,115,105,110,103,32,103,114,97,112,104,105,99,120,32,112,97,99,107,97,103,101,0,0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,110,111,120,50,109,116,105,36,99,115,0,0,0,0,0,0,83,84,65,78,68,65,82,68,0,0,0,0,0,0,0,0,78,111,32,102,117,114,116,104,101,114,32,111,112,116,105,111,110,115,32,97,108,108,111,119,101,100,32,97,102,116,101,114,32,39,100,101,102,97,117,108,116,115,39,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,115,116,101,112,32,118,97,108,117,101,115,32,105,44,106,0,0,0,0,0,0,0,117,110,115,101,116,32,97,114,114,111,119,10,0,0,0,0,32,55,50,10,37,100,10,32,49,49,10,37,45,54,46,51,102,10,32,50,49,10,37,45,54,46,51,102,10,32,51,49,10,48,46,48,48,48,10,0,115,101,116,32,108,111,103,32,120,50,0,0,0,0,0,0,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,51,48,10,48,46,48,48,48,10,32,52,48,10,37,45,54,46,51,102,10,32,32,49,10,37,115,10,32,53,48,10,37,45,54,46,51,102,10,32,32,55,10,37,115,10,0,0,0,0,32,32,48,10,84,69,88,84,10,32,32,56,10,37,115,10,0,0,0,0,0,0,0,0,32,32,48,10,83,69,81,69,78,68,10,0,0,0,0,0,38,35,120,37,50,46,50,120,59,0,0,0,0,0,0,0,123,125,94,95,64,38,126,0,32,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,54,120,34,0,0,0,0,0,32,100,97,115,104,108,101,110,103,116,104,32,37,46,49,102,0,0,0,0,0,0,0,0,101,112,115,108,97,116,101,120,0,0,0,0,0,0,0,0,32,108,119,32,37,46,49,102,0,0,0,0,0,0,0,0,120,50,109,116,105,36,99,115,0,0,0,0,0,0,0,0,114,111,116,36,97,116,105,111,110,0,0,0,0,0,0,0,32,115,105,122,101,32,37,100,44,37,100,32,0,0,0,0,9,108,111,103,45,102,105,108,101,32,102,111,114,32,102,105,116,115,32,105,115,32,117,110,99,104,97,110,103,101,100,32,102,114,111,109,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,100,101,102,97,117,108,116,32,111,102,10,9,39,37,115,39,10,0,0,32,112,111,105,110,116,0,0,32,102,111,110,116,115,99,97,108,101,32,37,46,49,102,0,117,110,115,101,116,32,108,111,103,32,120,50,0,0,0,0,32,101,110,104,97,110,99,101,100,32,0,0,0,0,0,0,37,115,32,37,115,32,37,115,32,102,111,110,116,32,34,37,115,44,37,103,34,0,0,0,99,111,110,116,111,117,114,32,112,111,108,121,103,111,110,0,37,103,0,0,0,0,0,0,110,111,112,114,111,36,112,111,114,116,105,111,110,97,108,0,98,97,99,107,36,103,114,111,117,110,100,0,0,0,0,0,66,97,100,32,102,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,0,0,0,0,100,101,36,102,97,117,108,116,0,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,117,110,115,101,116,32,114,101,99,116,97,110,103,108,101,0,116,101,114,109,111,112,116,36,105,111,110,0,0,0,0,0,101,109,102,95,109,111,118,101,58,32,40,37,100,44,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,101,109,84,101,88,32,115,112,101,99,105,97,108,115,0,0,0,110,111,120,109,116,105,36,99,115,0,0,0,0,0,0,0,101,109,102,95,115,111,108,105,100,95,118,101,99,116,111,114,58,32,40,37,100,44,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,9,108,111,103,45,102,105,108,101,32,102,111,114,32,102,105,116,115,32,105,115,32,119,97,115,32,115,101,116,32,98,121,32,116,104,101,32,117,115,101,114,32,116,111,32,98,101,32,10,9,39,37,115,39,10,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,116,32,102,111,114,32,99,117,114,118,101,115,10,0,0,0,0,0,0,0,105,99,111,110,118,32,102,97,105,108,101,100,0,0,0,0,115,101,116,32,108,111,103,32,121,0,0,0,0,0,0,0,105,99,111,110,118,95,111,112,101,110,32,102,97,105,108,101,100,0,0,0,0,0,0,0,85,84,70,45,49,54,76,69,0,0,0,0,0,0,0,0,99,112,52,36,51,55,0,0,83,104,105,102,116,95,74,73,83,0,0,0,0,0,0,0,32,34,37,115,34,10,0,0,85,84,70,45,56,0,0,0,105,99,111,110,118,32,115,116,114,105,110,103,0,0,0,0,32,83,116,114,105,107,101,79,117,116,0,0,0,0,0,0,32,83,116,114,105,107,101,111,117,116,0,0,0,0,0,0,101,109,116,101,120,0,0,0,32,115,116,114,105,107,101,111,117,116,0,0,0,0,0,0,120,109,116,105,36,99,115,0,112,119,100,0,0,0,0,0,32,85,110,100,101,114,108,105,110,101,0,0,0,0,0,0,32,110,111,116,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,98,106,101,99,116,32,116,121,112,101,0,0,0,0,0,0,0,0,32,117,110,100,101,114,108,105,110,101,0,0,0,0,0,0,117,110,115,101,116,32,108,111,103,32,121,0,0,0,0,0,101,109,102,95,100,97,115,104,101,100,95,118,101,99,116,111,114,58,32,40,37,100,44,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,0,32,105,46,44,59,58,124,33,39,0,0,0,0,0,0,0,111,114,105,103,36,105,110,0,109,119,60,62,0,0,0,0,32,105,106,108,46,44,59,58,124,33,40,41,91,93,73,45,39,0,0,0,0,0,0,0,118,36,101,114,115,105,111,110,0,0,0,0,0,0,0,0,43,85,83,69,95,77,79,85,83,69,32,32,0,0,0,0,116,101,120,116,115,36,112,101,99,105,97,108,0,0,0,0,116,101,120,116,114,36,105,103,105,100,0,0,0,0,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,0,0,0,0,0,0,0,116,101,120,116,110,36,111,114,109,97,108,0,0,0,0,0,110,111,99,98,100,116,105,36,99,115,0,0,0,0,0,0,114,116,0,0,0,0,0,0,116,101,120,116,104,36,105,100,100,101,110,0,0,0,0,0,9,102,105,116,32,119,105,108,108,37,115,32,112,108,97,99,101,32,112,97,114,97,109,101,116,101,114,32,101,114,114,111,114,115,32,105,110,32,118,97,114,105,97,98,108,101,115,10,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,111,98,106,101,99,116,0,0,116,36,104,105,99,107,110,101,115,115,0,0,0,0,0,0,115,101,116,32,108,111,103,32,120,0,0,0,0,0,0,0,115,109,36,97,108,108,0,0,112,111,114,36,116,114,97,105,116,0,0,0,0,0,0,0,116,114,97,110,115,36,112,111,115,101,0,0,0,0,0,0,112,111,105,36,110,116,115,109,97,120,0,0,0,0,0,0,109,101,36,116,114,105,99,0,110,111,99,111,110,36,116,111,117,114,115,0,0,0,0,0,35,32,32,32,32,69,79,70,10,0,0,0,0,0,0,0,102,36,111,110,116,115,105,122,101,0,0,0,0,0,0,0,72,79,77,69,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,58,39,0,0,0,100,101,36,112,116,104,0,0,98,36,105,103,0,0,0,0,102,117,110,99,116,105,111,110,32,99,111,110,116,97,105,110,115,32,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101,114,115,0,0,0,108,97,116,101,120,0,0,0,32,115,105,122,101,32,37,102,32,37,102,0,0,0,0,0,99,98,100,116,105,36,99,115,0,0,0,0,0,0,0,0,83,121,115,95,82,101,113,0,32,115,105,122,101,32,37,100,32,37,100,0,0,0,0,0,79,70,70,0,0,0,0,0,112,111,108,121,36,103,111,110,0,0,0,0,0,0,0,0,118,101,114,115,105,111,110,0,108,111,97,100,112,97,116,104,95,102,111,112,101,110,0,0,117,110,115,101,116,32,108,111,103,32,120,0,0,0,0,0,100,101,112,116,104,0,0,0,109,101,116,114,105,99,0,0,115,99,97,110,0,0,0,0,105,110,99,104,101,115,0,0,112,111,105,110,116,115,109,97,120,0,0,0,0,0,0,0,115,109,97,108,108,0,0,0,98,105,103,0,0,0,0,0,37,115,32,37,115,32,37,115,32,37,100,32,37,115,32,37,115,32,37,115,37,115,32,37,115,32,34,37,115,44,37,100,34,32,37,115,32,37,100,32,37,115,32,37,100,32,37,115,32,37,115,0,0,0,0,0,84,107,47,84,99,108,32,99,97,110,118,97,115,32,119,105,100,103,101,116,32,91,112,101,114,108,116,107,93,32,91,105,110,116,101,114,97,99,116,105,118,101,93,0,0,0,0,0,32,116,101,120,116,114,105,103,105,100,0,0,0,0,0,0,110,111,122,100,116,105,36,99,115,0,0,0,0,0,0,0,32,116,101,120,116,104,105,100,100,101,110,0,0,0,0,0,79,78,0,0,0,0,0,0,32,114,111,116,97,116,101,32,98,121,32,37,100,0,0,0,32,116,101,120,116,115,112,101,99,105,97,108,0,0,0,0,115,101,116,32,108,111,103,32,122,0,0,0,0,0,0,0,37,115,37,115,37,115,0,0,32,116,101,120,116,110,111,114,109,97,108,0,0,0,0,0,110,111,102,108,105,112,0,0,37,72,0,0,0,0,0,0,119,114,111,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,44,32,109,117,115,116,32,98,101,32,51,46,49,32,111,114,32,51,46,50,0,0,0,0,0,0,0,0,104,105,100,100,101,110,32,115,111,114,116,97,114,114,97,121,0,0,0,0,0,0,0,0,118,101,114,115,105,111,110,58,32,51,46,49,32,111,114,32,51,46,50,32,101,120,112,101,99,116,101,100,0,0,0,0,112,111,105,110,116,115,109,97,120,58,32,110,117,109,98,101,114,32,111,117,116,32,111,102,32,114,97,110,103,101,32,40,50,44,37,108,100,41,0,0,109,97,120,46,32,112,111,105,110,116,115,32,112,101,114,32,112,111,108,121,108,105,110,101,58,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,100,101,112,116,104,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,116,107,99,97,110,118,97,115,0,0,0,0,0,0,0,0,100,101,112,116,104,58,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,122,100,116,105,36,99,115,0,116,104,105,99,107,110,101,115,115,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,9,112,111,108,97,114,32,105,115,32,37,115,10,0,0,0,116,104,105,99,107,110,101,115,115,58,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,117,110,115,101,116,32,108,111,103,32,122,0,0,0,0,0,115,105,122,101,58,32,50,32,110,117,109,98,101,114,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,80,83,105,122,101,95,50,0,83,105,110,103,108,101,0,0,102,108,105,112,0,0,0,0,86,105,115,105,98,108,101,32,112,105,120,101,108,32,103,114,105,100,32,104,97,115,32,97,32,115,99,97,110,32,108,105,110,101,32,108,111,110,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,32,115,99,97,110,32,108,105,110,101,115,46,0,0,0,0,0,65,52,0,0,0,0,0,0,76,101,116,116,101,114,0,0,35,70,73,71,32,51,46,50,10,37,115,10,37,115,10,37,115,10,37,115,10,37,54,46,50,102,10,37,115,10,37,100,10,37,100,32,37,100,10,0,51,46,50,0,0,0,0,0,77,101,116,114,105,99,0,0,84,71,73,70,32,88,49,49,32,91,109,111,100,101,93,32,91,120,44,121,93,32,91,100,97,115,104,101,100,93,32,91,34,102,111,110,116,34,32,91,102,111,110,116,115,105,122,101,93,93,0,0,0,0,0,0,73,110,99,104,101,115,0,0,110,111,121,50,100,116,105,36,99,115,0,0,0,0,0,0,67,101,110,116,101,114,0,0,100,101,103,114,101,101,115,10,0,0,0,0,0,0,0,0,115,101,116,32,108,97,98,101,108,32,37,100,32,34,37,115,34,32,97,116,32,0,0,0,35,70,73,71,32,51,46,49,10,37,115,10,37,115,10,37,115,10,37,100,32,37,100,10,0,0,0,0,0,0,0,0,115,101,116,32,108,111,103,32,99,98,0,0,0,0,0,0,51,46,49,0,0,0,0,0,70,73,71,95,112,111,105,110,116,115,0,0,0,0,0,0,102,108,105,112,122,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,37,54,46,51,102,32,37,100,32,37,54,46,51,102,32,37,54,46,51,102,32,37,100,32,37,100,32,37,115,92,48,48,49,10,0,0,0,0,0,0,70,73,71,32,116,101,120,116,0,0,0,0,0,0,0,0,52,10,9,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,53,10,9,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,0,0,115,113,114,116,40,120,41,0,50,32,51,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,48,32,48,32,48,32,48,32,48,32,0,0,0,0,0,0,0,116,103,105,102,0,0,0,0,49,32,51,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,49,32,48,46,48,48,48,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,121,50,100,116,105,36,99,115,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,114,97,100,105,97,110,115,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,10,0,0,0,115,97,109,112,108,105,110,103,32,114,97,116,101,32,109,117,115,116,32,98,101,32,62,32,49,59,32,115,97,109,112,108,105,110,103,32,117,110,99,104,97,110,103,101,100,0,0,0,117,110,115,101,116,32,108,97,98,101,108,10,0,0,0,0,114,101,99,116,0,0,0,0,117,110,115,101,116,32,108,111,103,32,99,98,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,57,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,32,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,77,117,115,116,32,115,112,101,99,105,102,121,32,97,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,32,115,105,122,101,32,98,101,102,111,114,101,32,105,110,100,105,99,97,116,105,110,103,32,102,108,105,112,32,105,110,32,115,101,99,111,110,100,32,100,105,109,101,110,115,105,111,110,0,0,0,102,105,103,58,32,65,116,116,101,109,112,116,32,116,111,32,115,101,116,32,112,97,108,101,116,116,101,32,116,119,105,99,101,10,0,0,0,0,0,0,37,100,32,37,100,32,35,37,50,46,50,120,37,50,46,50,120,37,50,46,50,120,10,0,77,111,110,111,99,104,114,111,109,101,32,102,105,103,32,102,105,108,101,58,32,117,115,105,110,103,32,103,114,97,121,32,112,97,108,101,116,116,101,32,105,110,115,116,101,97,100,32])
-.concat([111,102,32,99,111,108,111,114,10,0,0,0,0,0,0,0,102,105,103,58,32,80,97,108,101,116,116,101,32,117,115,101,100,32,98,101,102,111,114,101,32,115,101,116,10,0,0,0,32,37,100,32,37,100,0,0,87,51,67,32,83,99,97,108,97,98,108,101,32,86,101,99,116,111,114,32,71,114,97,112,104,105,99,115,32,100,114,105,118,101,114,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,57,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,108,100,10,9,0,0,0,110,111,121,100,116,105,36,99,115,0,0,0,0,0,0,0,45,54,10,0,0,0,0,0,9,65,110,103,108,101,115,32,97,114,101,32,105,110,32,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,102,111,114,32,115,105,122,101,0,0,117,110,115,101,116,32,107,101,121,10,0,0,0,0,0,0,35,32,69,110,100,32,112,108,111,116,32,35,37,100,10,0,96,98,117,105,108,116,105,110,45,110,101,97,114,101,115,116,45,108,111,103,96,32,116,111,103,103,108,101,32,108,111,103,115,99,97,108,101,32,111,102,32,97,120,105,115,32,110,101,97,114,101,115,116,32,99,117,114,115,111,114,0,0,0,0,35,32,66,101,103,105,110,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,0,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,102,108,105,112,121,0,0,0,54,0,0,0,0,0,0,0,78,101,101,100,32,50,32,116,111,32,55,32,117,115,105,110,103,32,115,112,101,99,115,0,27,42,109,112,49,109,50,97,50,81,0,0,0,0,0,0,27,42,100,101,84,0,0,0,27,42,100,97,102,108,115,67,0,0,0,0,0,0,0,0,27,42,112,0,0,0,0,0,81,77,83,47,81,85,73,67,32,76,97,115,101,114,32,112,114,105,110,116,101,114,32,40,97,108,115,111,32,84,97,108,97,114,105,115,32,49,50,48,48,32,97,110,100,32,111,116,104,101,114,115,41,0,0,0,27,42,109,37,100,66,0,0,121,100,116,105,36,99,115,0,27,42,100,84,0,0,0,0,9,115,97,109,112,108,105,110,103,32,114,97,116,101,32,105,115,32,37,100,44,32,37,100,10,0,0,0,0,0,0,0,110,111,115,113,36,117,97,114,101,0,0,0,0,0,0,0,115,101,116,32,107,101,121,32,37,115,111,112,97,113,117,101,10,0,0,0,0,0,0,0,72,80,50,54,0,0,0,0,116,117,114,110,105,110,103,32,109,111,117,115,101,32,111,102,102,46,10,0,0,0,0,0,37,100,44,37,100,79,0,0,37,100,44,37,100,80,0,0,102,108,105,112,120,0,0,0,27,42,100,0,0,0,0,0,27,42,109,37,100,78,0,0,9,102,111,110,116,112,97,116,104,32,105,115,32,101,109,112,116,121,10,0,0,0,0,0,27,42,109,49,109,49,110,49,51,54,44,49,99,90,0,0,120,50,94,123,37,100,125,0,27,42,100,97,99,90,0,0,105,110,118,97,108,105,100,32,97,120,105,115,0,0,0,0,27,42,112,97,102,37,100,44,37,100,90,0,0,0,0,0,113,109,115,0,0,0,0,0,27,42,112,98,102,37,100,44,37,100,90,0,0,0,0,0,110,111,120,50,100,116,105,36,99,115,0,0,0,0,0,0,27,42,109,37,100,98,90,0,9,105,115,111,32,115,97,109,112,108,105,110,103,32,114,97,116,101,32,105,115,32,37,100,44,32,37,100,10,0,0,0,110,111,114,97,36,116,105,111,0,0,0,0,0,0,0,0,10,115,101,116,32,107,101,121,32,109,97,120,99,111,108,117,109,110,115,32,37,100,32,109,97,120,114,111,119,115,32,37,100,0,0,0,0,0,0,0,27,42,108,37,115,10,0,0,116,117,114,110,105,110,103,32,109,111,117,115,101,32,111,110,46,10,0,0,0,0,0,0,27,42,109,37,100,110,90,10,0,0,0,0,0,0,0,0,110,111,101,106,101,99,116,0,120,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,120,95,109,97,120,51,100,33,0,0,0,0,0,0,0,67,117,114,114,101,110,116,108,121,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,116,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,0,0,0,0,0,105,115,111,36,95,56,56,53,57,95,49,0,0,0,0,0,101,106,101,99,116,0,0,0,32,116,121,112,101,10,0,0,37,100,32,112,101,110,115,32,37,115,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,34,101,106,101,99,116,34,32,111,114,32,110,117,109,98,101,114,32,111,102,32,112,101,110,115,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,101,110,115,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,101,106,101,36,99,116,0,0,80,111,115,116,83,99,114,105,112,116,32,103,114,97,112,104,105,99,115,44,32,105,110,99,108,117,100,105,110,103,32,69,80,83,70,32,101,109,98,101,100,100,101,100,32,102,105,108,101,115,32,40,42,46,101,112,115,41,0,0,0,0,0,0,80,85,83,80,48,59,80,71,59,27,46,90,10,0,0,0,120,50,100,116,105,36,99,115,0,0,0,0,0,0,0,0,112,114,36,105,110,116,0,0,80,85,83,80,48,59,27,46,90,10,0,0,0,0,0,0,105,110,100,101,112,101,110,100,101,110,116,108,121,32,115,99,97,108,101,100,0,0,0,0,114,97,36,116,105,111,0,0,112,114,101,36,102,105,120,0,10,115,101,116,32,107,101,121,32,37,115,105,110,118,101,114,116,32,115,97,109,112,108,101,110,32,37,103,32,115,112,97,99,105,110,103,32,37,103,32,119,105,100,116,104,32,37,103,32,104,101,105,103,104,116,32,37,103,32,0,0,0,0,0,67,65,55,59,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,109,111,117,115,101,96,0,0,73,78,59,37,115,10,83,67,48,44,37,100,44,48,44,37,100,59,10,83,82,37,102,44,37,102,59,10,0,0,0,0,27,46,89,10,27,46,73,56,49,59,59,49,55,58,27,46,78,59,49,57,58,27,46,77,53,48,48,58,10,0,0,0,100,122,0,0,0,0,0,0,80,85,59,80,65,37,100,44,37,100,59,10,0,0,0,0,80,65,37,100,44,37,100,59,10,0,0,0,0,0,0,0,80,68,59,80,65,37,100,44,37,100,59,10,0,0,0,0,45,85,83,69,95,67,87,68,82,67,32,32,0,0,0,0,80,85,59,10,83,80,37,100,59,10,0,0,0,0,0,0,3,10,0,0,0,0,0,0,112,111,115,116,115,99,114,105,112,116,0,0,0,0,0,0,76,66,0,0,0,0,0,0,110,111,120,100,116,105,36,99,115,0,0,0,0,0,0,0,116,114,0,0,0,0,0,0,68,73,48,44,49,59,10,0,111,110,32,116,104,101,32,115,97,109,101,32,115,99,97,108,101,0,0,0,0,0,0,0,115,113,36,117,97,114,101,0,110,111,98,111,120,0,0,0,68,73,48,44,45,49,59,10,0,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,112,114,101,118,105,111,117,115,45,109,111,117,115,101,45,102,111,114,109,97,116,96,0,68,73,49,44,48,59,10,0,116,0,0,0,0,0,0,0,112,36,115,112,111,105,110,116,115,0,0,0,0,0,0,0,77,117,115,116,32,115,112,101,99,105,102,121,32,97,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,32,115,105,122,101,32,98,101,102,111,114,101,32,105,110,100,105,99,97,116,105,110,103,32,115,112,97,99,105,110,103,32,105,110,32,115,101,99,111,110,100,32,100,105,109,101,110,115,105,111,110,0,0,0,0,0,0,0,0,32,37,115,32,115,111,108,105,100,32,37,46,50,102,32,0,110,36,111,112,115,112,111,105,110,116,115,0,0,0,0,0,110,111,104,105,100,100,101,110,36,51,100,0,0,0,0,0,102,36,111,110,116,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,100,97,115,36,104,101,100,0,115,111,108,36,105,100,0,0,110,111,112,115,112,111,105,110,116,115,0,0,0,0,0,0,70,114,97,109,101,32,109,97,107,101,114,32,77,73,70,32,51,46,48,48,32,102,111,114,109,97,116,0,0,0,0,0,112,115,112,111,105,110,116,115,0,0,0,0,0,0,0,0,120,100,116,105,36,99,115,0,83,99,114,111,108,108,95,76,111,99,107,0,0,0,0,0,112,105,116,99,104,0,0,0,120,47,121,47,122,0,0,0,101,120,116,114,97,110,101,111,117,115,32,111,114,32,111,117,116,45,111,102,45,111,114,100,101,114,32,97,114,103,117,109,101,110,116,115,32,105,110,32,115,101,116,32,97,114,114,111,119,115,116,121,108,101,0,0,104,101,105,103,104,116,0,0,115,119,105,116,99,104,101,100,32,109,111,117,115,101,32,102,111,114,109,97,116,32,102,114,111,109,32,37,108,100,32,116,111,32,37,108,100,10,0,0,32,37,115,32,37,100,32,37,115,32,92,10,32,32,32,37,115,32,37,115,32,37,102,32,37,115,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,117,98,115,116,114,105,110,103,32,114,97,110,103,101,32,111,112,101,114,97,116,111,114,32,97,112,112,108,105,101,100,32,116,111,32,110,111,110,45,83,84,82,73,78,71,32,116,121,112,101,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,112,111,105,110,116,32,115,105,122,101,58,32,114,101,97,108,32,110,117,109,98,101,114,0,0,0,0,0,0,0,100,114,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,111,110,116,58,32,115,116,105,99,107,44,32,99,103,95,116,105,109,101,115,44,32,117,110,105,118,101,114,115,44,32,122,97,112,102,95,100,105,110,103,98,97,116,115,44,32,97,110,116,105,113,117,101,95,111,108,105,118,101,44,10,97,114,105,97,108,44,32,99,111,117,114,105,101,114,44,32,103,97,114,97,109,111,110,100,95,97,110,116,105,103,117,97,44,32,108,101,116,116,101,114,95,103,111,116,104,105,99,44,32,99,103,95,111,109,101,103,97,44,32,97,108,98,101,114,116,117,115,44,10,116,105,109,101,115,95,110,101,119,95,114,111,109,97,110,44,32,99,108,97,114,101,110,100,111,110,44,32,99,111,114,111,110,101,116,44,32,109,97,114,105,103,111,108,100,44,32,116,114,117,101,116,121,112,101,95,115,121,109,98,111,108,115,44,32,111,114,32,119,105,110,103,100,105,110,103,115,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,101,110,115,32,109,117,115,116,32,98,101,32,97,32,112,111,115,105,116,105,118,101,0,0,0,0,0,0,0,108,101,116,116,101,114,0,0,108,101,116,36,116,101,114,0,108,101,103,97,108,0,0,0,109,105,102,0,0,0,0,0,108,101,103,36,97,108,0,0,110,111,99,98,116,105,36,99,115,0,0,0,0,0,0,0,110,111,101,120,116,101,110,100,101,100,0,0,0,0,0,0,120,47,121,0,0,0,0,0,97,114,114,111,119,115,116,121,108,101,0,0,0,0,0,0,110,111,97,117,116,111,116,105,116,108,101,115,0,0,0,0,110,111,101,120,116,36,101,110,100,101,100,0,0,0,0,0,96,98,117,105,108,116,105,110,45,110,101,120,116,45,109,111,117,115,101,45,102,111,114,109,97,116,96,0,0,0,0,0,101,120,116,101,110,100,101,100,0,0,0,0,0,0,0,0,101,120,116,36,101,110,100,101,100,0,0,0,0,0,0,0,100,121,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,109,111,100,101,58,32,112,111,114,116,114,97,105,116,32,111,114,32,108,97,110,100,115,99,97,112,101,0,0,0,109,36,111,100,101,0,0,0,42,65,108,108,42,32,101,100,103,101,115,32,117,110,100,101,102,105,110,101,100,32,111,114,32,111,117,116,32,111,102,32,114,97,110,103,101,44,32,116,104,117,115,32,110,111,32,112,108,111,116,46,0,0,0,0,27,38,108,48,79,0,0,0,27,38,108,49,79,0,0,0,27,69,27,38,108,49,88,37,115,10,0,0,0,0,0,0,73,109,97,103,101,110,32,108,97,115,101,114,32,112,114,105,110,116,101,114,0,0,0,0,27,37,48,65,27,69,10,0,99,98,116,105,36,99,115,0,27,37,49,65,27,38,108,48,72,10,0,0,0,0,0,0,9,9,37,115,32,97,120,101,115,32,97,114,101,32,37,115,10,0,0,0,0,0,0,0,111,98,106,101,99,116,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,32,102,97,105,108,117,114,101,0,0,0,97,117,116,111,116,105,116,108,101,115,0,0,0,0,0,0,85,76,49,44,49,48,48,59,10,85,76,50,44,56,44,56,44,57,44,56,44,56,44,57,44,56,44,56,44,57,44,56,44,56,44,57,59,10,85,76,51,44,54,44,54,44,54,44,55,44,54,44,54,44,54,44,55,44,54,44,54,44,54,44,55,44,54,44,54,44,54,44,55,59,10,85,76,52,44,53,44,53,44,53,44,49,48,44,53,44,53,44,53,44,49,48,44,53,44,53,44,53,44,49,48,59,10,85,76,53,44,53,44,53,44,53,44,53,44,53,44,56,44,53,44,53,44,53,44,53,44,53,44,56,44,53,44,53,44,53,44,53,44,53,44,57,59,10,85,76,54,44,56,44,56,44,48,44,57,44,56,44,56,44,48,44,57,44,56,44,56,44,48,44,57,59,10,85,76,55,44,52,44,52,44,52,44,52,44,48,44,52,44,52,44,52,44,52,44,52,44,48,44,52,44,52,44,52,44,52,44,52,44,48,44,52,59,10,85,76,56,44,54,44,54,44,54,44,54,44,54,44,54,44,48,44,54,44,54,44,54,44,54,44,54,44,54,44,54,44,48,44,54,59,10,0,96,98,117,105,108,116,105,110,45,100,101,99,114,101,109,101,110,116,45,99,108,105,112,98,111,97,114,100,109,111,100,101,96,0,0,0,0,0,0,0,73,78,83,80,49,83,68,49,44,37,100,44,50,44,37,100,44,0,0,0,0,0,0,0,27,37,48,66,0,0,0,0,80,83,105,122,101,95,49,0,100,116,0,0,0,0,0,0,105,109,97,103,101,0,0,0,80,69,60,0,0,0,0,0,80,69,0,0,0,0,0,0,46,48,56,0,0,0,0,0,105,109,97,103,101,110,0,0,46,49,54,0,0,0,0,0,110,111,114,116,105,36,99,115,0,0,0,0,0,0,0,0,46,50,52,0,0,0,0,0,37,103,32,114,111,116,95,120,44,32,37,103,32,114,111,116,95,122,44,32,37,103,32,115,99,97,108,101,44,32,37,103,32,115,99,97,108,101,95,122,10,0,0,0,0,0,0,0,111,98,106,101,99,116,0,0,97,117,116,111,116,105,116,108,101,115,32,99,111,108,117,109,110,104,101,97,100,0,0,0,44,50,0,0,0,0,0,0,115,119,105,116,99,104,101,100,32,99,108,105,112,98,111,97,114,100,32,102,111,114,109,97,116,32,102,114,111,109,32,37,108,100,32,116,111,32,37,108,100,10,0,0,0,0,0,0,80,87,46,49,76,84,49,44,46,50,53,0,0,0,0,0,80,87,46,50,76,84,0,0,100,120,0,0,0,0,0,0,80,87,37,115,76,84,0,0,80,87,37,115,76,84,37,100,37,115,0,0,0,0,0,0,80,85,59,10,83,80,49,59,10,80,87,46,50,76,84,49,44,46,50,53,0,0,0,0,80,85,59,10,83,80,49,59,10,80,87,46,50,76,84,0,115,113,114,116,0,0,0,0,80,85,59,10,83,80,37,100,59,10,76,84,59,0,0,0,72,80,32,68,101,115,105,103,110,106,101,116,32,55,53,48,67,44,32,72,80,32,76,97,115,101,114,106,101,116,32,73,73,73,47,73,86,44,32,101,116,99,46,32,40,109,97,110,121,32,111,112,116,105,111,110,115,41,0,0,0,0,0,0,80,85,59,10,83,80,37,100,59,10,76,84,37,100,59,0,114,116,105,36,99,115,0,0,76,66,37,115,3,10,0,0,109,97,112,10,0,0,0,0,73,110,99,111,110,115,105,115,116,101,110,116,32,111,112,116,105,111,110,115,0,0,0,0,68,73,49,44,48,0,0,0,96,98,117,105,108,116,105,110,45,105,110,99,114,101,109,101,110,116,45,99,108,105,112,98,111,97,114,100,109,111,100,101,96,0,0,0,0,0,0,0,68,73,48,44,45,49,0,0,68,73,48,44,49,0,0,0,97,114,114,36,97,121,0,0,76,79,55,0,0,0,0,0,76,79,52,0,0,0,0,0,76,79,49,0,0,0,0,0,87,71,37,46,50,102,44,49,56,48,44,49,56,48,59,69,80,59,10,0,0,0,0,0,69,87,37,46,50,102,44,48,44,49,56,48,59,10,0,0,112,99,108,53,0,0,0,0,80,77,50,59,70,84,49,48,44,51,48,59,70,80,59,69,80,59,70,84,59,10,0,0,110,111,122,116,105,36,99,115,0,0,0,0,0,0,0,0,70,84,49,48,44,51,48,59,87,71,37,46,50,102,44,48,44,51,54,48,59,69,80,59,70,84,59,10,0,0,0,0,9,118,105,101,119,32,105,115,32,0,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,114,32,100,117,112,108,105,99,97,116,101,32,111,112,116,105,111,110,0,0,0,0,0,0,0,0,76,101,102,116,0,0,0,0,70,84,49,48,44,51,48,59,82,65,37,100,44,37,100,59,69,80,59,70,84,59,10,0,110,111,116,0,0,0,0,0,82,65,37,100,44,37,100,59,69,80,59,10,0,0,0,0,87,71,37,100,44,48,44,51,54,48,59,69,80,59,10,0,114,101,99,36,111,114,100,0,87,71,37,100,44,57,48,44,50,55,48,59,69,80,59,69,87,37,100,44,48,44,57,48,59,10,0,0,0,0,0,0,87,71,37,100,44,49,56,48,44,50,55,48,59,69,80,59,69,87,37,100,44,57,48,44,57,48,59,10,0,0,0,0,87,71,37,100,44,49,56,48,44,49,56,48,59,69,80,59,69,87,37,100,44,48,44,49,56,48,59,10,0,0,0,0,87,71,37,100,44,50,55,48,44,50,55,48,59,69,80,59,69,87,37,100,44,49,56,48,44,57,48,59,10,0,0,0,87,71,37,100,44,57,48,44,57,48,59,69,80,59,69,87,37,100,44,49,56,48,44,57,48,59,87,71,37,100,44,50,55,48,44,57,48,59,69,80,59,69,87,37,100,44,48,44,57,48,59,10,0,0,0,0,72,80,55,52,55,53,32,97,110,100,32,114,101,108,97,116,105,118,101,115,32,91,110,117,109,98,101,114,32,111,102,32,112,101,110,115,93,32,91,101,106,101,99,116,93,0,0,0,87,71,37,100,44,50,55,48,44,49,56,48,59,69,80,59,69,87,37,100,44,57,48,44,49,56,48,59,10,0,0,0,122,116,105,36,99,115,0,0,87,71,37,100,44,50,55,48,44,57,48,59,69,80,59,69,87,37,100,44,48,44,50,55,48,59,10,0,0,0,0,0,9,115,117,114,102,97,99,101,32,105,115,32,37,115,100,114,97,119,110,10,0,0,0,0,102,105,108,108,99,36,111,108,111,114,0,0,0,0,0,0,104,111,114,105,122,111,110,116,97,108,0,0,0,0,0,0,87,71,37,100,44,48,44,50,55,48,59,69,80,59,69,87,37,100,44,50,55,48,44,57,48,59,10,0,0,0,0,0,100,105,115,116,97,110,99,101,32,116,111,32,114,117,108,101,114,32,119,105,108,108,32,37,115,32,98,101,32,115,104,111,119,110,32,105,110,32,112,111,108,97,114,32,99,111,111,114,100,105,110,97,116,101,115,46,10,0,0,0,0,0,0,0,87,71,37,100,44,57,48,44,49,56,48,59,69,80,59,69,87,37,100,44,50,55,48,44,49,56,48,59,10,0,0,0,87,71,37,100,44,48,44,57,48,59,69,80,59,69,87,37,100,44,57,48,44,57,48,59,87,71,37,100,44,49,56,48,44,57,48,59,69,80,59,69,87,37,100,44,50,55,48,44,57,48,59,10,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,102,105,108,101,116,121,112,101,59,32,116,114,121,32,34,115,104,111,119,32,100,97,116,97,102,105,108,101,32,98,105,110,97,114,121,32,102,105,108,101,116,121,112,101,115,34,0,0,0,0,0,87,71,37,100,44,49,56,48,44,57,48,59,69,80,59,69,87,37,100,44,50,55,48,44,50,55,48,59,10,0,0,0,87,71,37,100,44,48,44,49,56,48,59,69,80,59,69,87,37,100,44,49,56,48,44,49,56,48,59,10,0,0,0,0,9,115,121,115,116,101,109,32,102,111,110,116,112,97,116,104,32,105,115,32,0,0,0,0,87,71,37,100,44,57,48,44,57,48,59,69,80,59,69,87,37,100,44,49,56,48,44,50,55,48,59,10,0,0,0,0,120,50,94,123,37,100,125,89,105,0,0,0,0,0,0,0,87,71,37,100,44,48,44,57,48,59,69,80,59,69,87,37,100,44,57,48,44,50,55,48,59,10,0,0,0,0,0,0,121,111,117,32,99,97,110,39,116,32,99,104,97,110,103,101,32,116,104,101,32,111,117,116,112,117,116,32,105,110,32,109,117,108,116,105,112,108,111,116,32,109,111,100,101,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,0,0,0,0,67,73,37,100,59,10,0,0,104,112,103,108,0,0,0,0,80,77,50,59,70,80,59,69,80,59,10,0,0,0,0,0,110,111,121,50,116,105,36,99,115,0,0,0,0,0,0,0,80,77,48,59,10,0,0,0,100,114,97,119,110,0,0,0,102,99,0,0,0,0,0,0,118,101,114,116,105,99,97,108,0,0,0,0,0,0,0,0,87,71,37,46,50,102,44,48,44,51,54,48,59,69,80,59,10,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,112,111,108,97,114,100,105,115,116,97,110,99,101,96,0,0,67,73,37,46,50,102,59,10,0,0,0,0,0,0,0,0,82,65,37,46,50,102,44,37,46,50,102,59,69,80,59,10,0,0,0,0,0,0,0,0,117,116,102,36,56,0,0,0,119,105,110,103,100,105,110,103,115,0,0,0,0,0,0,0,32,32,99,111,108,111,114,0,98,97,110,100,0,0,0,0,119,36,105,110,103,100,105,110,103,115,0,0,0,0,0,0,116,114,117,101,116,121,112,101,95,115,121,109,98,111,108,115,0,0,0,0,0,0,0,0,116,114,36,117,101,116,121,112,101,95,115,121,109,98,111,108,115,0,0,0,0,0,0,0,103,101,116,99,111,108,111,114,46,99,0,0,0,0,0,0,109,97,114,105,103,111,108,100,0,0,0,0,0,0,0,0,72,80,50,54,52,56,32,97,110,100,32,72,80,50,54,52,55,0,0,0,0,0,0,0,109,36,97,114,105,103,111,108,100,0,0,0,0,0,0,0,121,50,116,105,36,99,115,0,112,36,108,111,116,0,0,0,99,111,114,111,110,101,116,0,114,101,109,111,118,101,100,0,73,110,118,97,108,105,100,32,99,111,109,109,97,110,100,32,45,32,100,105,100,32,121,111,117,32,109,101,97,110,32,39,117,110,115,101,116,32,115,116,121,108,101,32,114,101,99,116,97,110,103,108,101,39,63,0,110,111,111,117,116,36,112,117,116,0,0,0,0,0,0,0,32,37,115,32,37,115,32,37,115,114,101,118,101,114,115,101,32,37,115,101,110,104,97,110,99,101,100,32,37,115,32,0,99,111,114,36,111,110,101,116,0,0,0,0,0,0,0,0,99,111,109,109,117,110,105,99,97,116,105,111,110,32,99,111,109,109,97,110,100,115,32,119,105,108,108,32,98,101,32,101,99,104,111,101,100,46,10,0,99,108,97,114,101,110,100,111,110,0,0,0,0,0,0,0,99,108,36,97,114,101,110,100,111,110,0,0,0,0,0,0,102,105,108,101,36,116,121,112,101,0,0,0,0,0,0,0,116,105,109,101,115,95,110,101,119,95,114,111,109,97,110,0,116,105,36,109,101,115,95,110,101,119,95,114,111,109,97,110,0,0,0,0,0,0,0,0,97,108,98,101,114,116,117,115,0,0,0,0,0,0,0,0,43,66,73,78,65,82,89,95,68,65,84,65,32,32,0,0,97,108,36,98,101,114,116,117,115,0,0,0,0,0,0,0,99,103,95,111,109,101,103,97,0,0,0,0,0,0,0,0,104,112,50,54,52,56,0,0,99,103,95,111,36,109,101,103,97,0,0,0,0,0,0,0,110,111,121,116,105,36,99,115,0,0,0,0,0,0,0,0,108,101,116,116,101,114,95,103,111,116,104,105,99,0,0,0,0,0,0,0,0,0,0,0,9,104,105,100,100,101,110,32,115,117,114,102,97,99,101,32,105,115,32,37,115,10,0,0,99,36,101,110,116,114,101,0,32,98,111,116,116,111,109,0,108,36,101,116,116,101,114,95,103,111,116,104,105,99,0,0,101,99,104,111,105,110,103,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,99,111,109,109,97,110,100,115,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,10,0,0,0,0,0,0,0,103,97,114,97,109,111,110,100,95,97,110,116,105,103,117,97,0,0,0,0,0,0,0,0,103,36,97,114,97,109,111,110,100,95,97,110,116,105,103,117,97,0,0,0,0,0,0,0,100,97,116,97,102,105,108,101,32,99,111,108,117,109,110,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,37,115,102,105,120,109,97,120,10,0,99,111,117,36,114,105,101,114,0,0,0,0,0,0,0,0,97,114,105,97,108,0,0,0,97,114,36,105,97,108,0,0,99,117,114,118,101,32,112,111,105,110,116,115,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,32,37,115,10,0,105,116,101,114,97,116,105,111,110,32,108,105,110,107,101,100,32,108,105,115,116,0,0,0,97,110,116,105,113,117,101,95,111,108,105,118,101,0,0,0,97,110,36,116,105,113,117,101,95,111,108,105,118,101,0,0,72,80,50,54,50,51,65,32,97,110,100,32,109,97,121,98,101,32,111,116,104,101,114,115,0,0,0,0,0,0,0,0,122,97,112,102,95,100,105,110,103,98,97,116,115,0,0,0,121,116,105,36,99,115,0,0,80,97,117,115,101,0,0,0,122,36,97,112,102,95,100,105,110,103,98,97,116,115,0,0,9,84,114,121,32,116,111,32,115,101,116,32,76,79,67,75,69,68,32,97,115,112,101,99,116,32,114,97,116,105,111,32,116,111,32,37,103,58,49,46,48,10,0,0,0,0,0,0,85,110,114,101,99,111,103,105,110,105,122,101,100,32,111,98,106,101,99,116,32,116,121,112,101,0,0,0,0,0,0,0,32,116,111,112,0,0,0,0,99,103,95,116,105,109,101,115,0,0,0,0,0,0,0,0,108,102,32,116,111,107,101,110,115,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,118,101,114,98,111,115,101,96,0,0,0,0,0,0,0,0,99,103,95,116,36,105,109,101,115,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,117,98,115,116,114,105,110,103,32,114,97,110,103,101,32,115,112,101,99,105,102,105,101,114,115,32,109,117,115,116,32,104,97,118,101,32,105,110,116,101,103,101,114,32,118,97,108,117,101,115,0,0,0,0,0,115,116,105,99,107,0,0,0,100,102,95,110,111,95,117,115,101,95,115,112,101,99,115,32,61,61,32,48,32,124,124,32,111,117,116,112,117,116,32,61,61,32,100,102,95,110,111,95,117,115,101,95,115,112,101,99,115,32,124,124,32,111,117,116,112,117,116,32,61,61,32,109,97,120,0,0,0,0,0,0,115,36,116,105,99,107,0,0,117,110,105,118,101,114,115,0,117,36,110,105,118,101,114,115,0,0,0,0,0,0,0,0,53,44,37,100,44,54,44,37,100,44,55,44,37,100,59,83,83,59,10,0,0,0,0,0,51,44,37,102,44,0,0,0,104,112,50,54,50,51,65,0,52,44,37,102,44,0,0,0,110,111,120,50,116,105,36,99,115,0,0,0,0,0,0,0,83,68,49,44,37,100,44,50,44,37,100,44,0,0,0,0,9,78,111,32,97,116,116,101,109,112,116,32,116,111,32,99,111,110,116,114,111,108,32,97,115,112,101,99,116,32,114,97,116,105,111,10,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,112,111,108,121,103,111,110,32,115,121,110,116,97,120,0,0,0,0,0,36,0,0,0,0,0,0,0,115,101,116,32,115,105,122,101,32,115,113,117,97,114,101,0,37,100,32,37,115,32,91,37,49,100,44,37,49,100,93,0,99,111,117,114,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,117,110,107,110,111,119,110,32,99,111,108,117,109,110,32,116,121,112,101,0,0,0,0,0,37,37,46,37,100,102,0,0,37,115,37,48,50,100,0,0,64,100,111,99,117,109,101,110,116,40,108,97,110,103,117,97,103,101,32,105,109,112,114,101,115,115,44,32,112,97,112,101,114,32,97,52,41,0,0,0,99,111,110,118,101,114,116,101,100,32,108,97,98,101,108,32,115,116,114,105,110,103,0,0,63,36,0,0,0,0,0,0,104,36,101,108,112,0,0,0,70,73,71,32,103,114,97,112,104,105,99,115,32,108,97,110,103,117,97,103,101,32,102,111,114,32,88,70,73,71,32,103,114,97,112,104,105,99,115,32,101,100,105,116,111,114,0,0,112,36,111,108,121,108,105,110,101,0,0,0,0,0,0,0,120,50,116,105,36,99,115,0,118,36,101,99,116,111,114,115,0,0,0,0,0,0,0,0,9,84,114,121,32,116,111,32,115,101,116,32,97,115,112,101,99,116,32,114,97,116,105,111,32,116,111,32,37,103,58,49,46,48,10,0,0,0,0,0,80,111,108,121,103,111,110,32,105,115,32,110,111,116,32,99,108,111,115,101,100,32,45,32,97,100,100,105,110,103,32,101,120,116,114,97,32,118,101,114,116,101,120,10,0,0,0,0,118,101,99,116,111,114,115,0,115,101,116,32,115,105,122,101,32,110,111,115,113,117,97,114,101,0,0,0,0,0,0,0,112,111,108,121,108,105,110,101,0,0,0,0,0,0,0,0,99,111,108,111,117,114,0,0,113,117,111,116,101,0,0,0,85,115,97,103,101,58,32,115,101,116,32,116,101,114,109,105,110,97,108,32,109,105,102,32,91,111,112,116,105,111,110,115,93,10,9,111,112,116,105,111,110,115,58,10,9,9,99,111,108,111,117,114,32,47,32,32,32,32,32,32,32,32,68,114,97,119,32,112,114,105,109,105,116,105,118,101,115,32,119,105,116,104,32,108,105,110,101,32,116,121,112,101,115,32,62,61,32,48,32,105,110,32,99,111,108,111,117,114,32,40,115,101,112,46,32,50,45,55,41,10,9,9,109,111,110,111,99,104,114,111,109,101,32,32,32,32,32,32,68,114,97,119,32,112,114,105,109,105,116,105,118,101,115,32,105,110,32,98,108,97,99,107,32,40,115,101,112,46,32,48,41,10,10,9,9,112,111,108,121,108,105,110,101,32,47,32,32,32,32,32,32,68,114,97,119,32,108,105,110,101,115,32,97,115,32,99,111,110,116,105,110,117,111,117,115,32,99,117,114,118,101,115,10,9,9,118,101,99,116,111,114,115,32,32,32,32,32,32,32,32,32,68,114,97,119,32,108,105,110,101,115,32,97,115,32,99,111,108,108,101,99,116,105,111,110,115,32,111,102,32,118,101,99,116,111,114,115,10,10,9,9,104,101,108,112,32,47,32,63,32,32,32,32,32,32,32,32,80,114,105,110,116,32,115,104,111,114,116,32,117,115,97,103,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,110,32,115,116,100,101,114,114,10,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,105,120,101,108,115,32,99,97,110,110,111,116,32,98,101,32,102,97,99,116,111,114,101,100,32,105,110,116,111,32,105,110,116,101,103,101,114,115,32,109,97,116,99,104,105,110,103,32,103,114,105,100,46,32,78,32,61,32,37,100,32,32,75,32,61,32,37,100,0,67,101,110,116,101,114,95,50,0,0,0,0,0,0,0,0,60,77,73,70,70,105,108,101,32,51,46,48,48,62,32,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,103,110,117,112,108,111,116,32,118,101,114,115,105,111,110,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,59,32,105,100,101,110,116,105,102,105,101,115,32,116,104,105,115,32,97,115,32,97,32,77,73,70,32,102,105,108,101,10,35,10,35,32,115,104,111,119,32,98,111,114,100,101,114,115,10,60,68,111,99,117,109,101,110,116,10,60,68,66,111,114,100,101,114,115,79,110,32,89,101,115,62,10,62,10,35,32,83,101,116,32,97,32,100,101,102,97,117,108,116,32,112,101,110,32,112,97,116,116,101,114,110,44,32,112,101,110,32,119,105,100,116,104,44,32,117,110,105,116,32,97,110,100,32,102,111,110,116,32,102,111,114,32,115,117,98,115,101,113,117,101,110,116,32,111,98,106,101,99,116,115,10,60,80,101,110,32,48,62,10,60,70,105,108,108,32,49,53,62,10,60,80,101,110,87,105,100,116,104,32,48,46,53,32,112,116,62,10,60,83,101,112,97,114,97,116,105,111,110,32,48,62,10,60,85,110,105,116,115,32,85,99,109,62,10,60,70,111,110,116,67,97,116,97,108,111,103,10,9,60,70,111,110,116,32,60,70,84,97,103,32,96,37,115,39,62,60,70,70,97,109,105,108,121,32,96,84,105,109,101,115,39,62,60,70,83,105,122,101,32,37,100,62,60,70,80,108,97,105,110,32,89,101,115,62,62,10,9,60,70,111,110,116,32,60,70,84,97,103,32,96,37,115,39,62,60,70,70,97,109,105,108,121,32,96,90,97,112,102,68,105,110,103,98,97,116,115,39,62,60,70,83,105,122,101,32,55,46,48,32,112,116,62,60,70,80,108,97,105,110,32,89,101,115,62,62,10,9,60,70,111,110,116,32,60,70,84,97,103,32,96,37,115,39,62,60,70,70,97,109,105,108,121,32,96,83,121,109,98,111,108,39,62,60,70,83,105,122,101,32,53,46,48,32,112,116,62,60,70,80,108,97,105,110,32,89,101,115,62,62,10,62,10,35,10,0,0,0,0,0,0,35,10,35,32,69,110,100,32,111,102,32,77,73,70,70,105,108,101,10,0,0,0,0,0,62,10,35,32,69,110,100,32,111,102,32,70,114,97,109,101,32,110,117,109,98,101,114,32,37,100,10,35,10,0,0,0,37,115,95,37,115,95,37,115,0,0,0,0,0,0,0,0,9,60,71,114,111,117,112,10,9,9,60,73,68,32,37,100,62,10,9,62,10,0,0,0,102,105,103,0,0,0,0,0,9,35,10,9,35,32,71,114,111,117,112,32,116,104,101,32,116,104,101,32,111,98,106,101,99,116,115,32,105,110,32,103,114,111,117,112,115,32,116,111,32,109,97,107,101,32,116,104,101,32,99,104,97,114,116,32,101,97,115,105,101,114,32,116,111,32,109,97,110,105,112,117,108,97,116,101,10,9,35,32,97,102,116,101,114,32,105,116,39,115,32,105,109,112,111,114,116,101,100,32,105,110,116,111,32,70,114,97,109,101,77,97,107,101,114,46,10,0,0,0,110,111,120,116,105,36,99,115,0,0,0,0,0,0,0,0,35,10,35,32,70,114,97,109,101,32,110,117,109,98,101,114,32,37,100,32,119,105,116,104,32,112,108,111,116,32,111,102,32,103,114,97,112,104,105,99,115,10,60,70,114,97,109,101,10,9,60,80,101,110,32,49,53,62,10,9,60,70,105,108,108,32,49,53,62,10,9,60,80,101,110,87,105,100,116,104,32,32,48,46,53,32,112,116,62,10,9,60,83,101,112,97,114,97,116,105,111,110,32,48,62,10,9,60,66,82,101,99,116,32,50,46,48,48,48,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,62,10,9,60,78,83,79,102,102,115,101,116,32,32,48,46,48,48,48,62,10,9,60,66,76,79,102,102,115,101,116,32,32,48,46,48,48,48,62,10,0,0,9,115,105,122,101,32,105,115,32,115,99,97,108,101,100,32,98,121,32,37,103,44,37,103,10,0,0,0,0,0,0,0,112,111,108,121,103,111,110,32,118,101,114,116,101,120,0,0,77,73,70,32,100,114,105,118,101,114,0,0,0,0,0,0,115,101,116,32,115,105,122,101,32,114,97,116,105,111,32,45,49,0,0,0,0,0,0,0,32,60,80,101,110,32,37,100,62,32,0,0,0,0,0,0,32,60,70,111,110,116,32,60,70,83,101,112,97,114,97,116,105,111,110,32,37,100,62,62,32,0,0,0,0,0,0,0,76,97,115,116,32,112,111,105,110,116,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,102,105,108,101,32,100,105,100,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,96,117,115,105,110,103,96,32,99,111,108,117,109,110,115,0,0,0,0,0,0,0,32,60,83,101,112,97,114,97,116,105,111,110,32,37,100,62,32,0,0,0,0,0,0,0,32,60,80,101,110,87,105,100,116,104,32,48,46,49,32,112,116,62,32,0,0,0,0,0,32,60,70,111,110,116,32,60,70,83,101,112,97,114,97,116,105,111,110,32,48,62,62,32,0,0,0,0,0,0,0,0,32,60,80,101,110,87,105,100,116,104,32,49,46,48,32,112,116,62,32,0,0,0,0,0,71,80,86,65,76,95,68,65,84,65,0,0,0,0,0,0,120,94,52,0,0,0,0,0,32,60,83,101,112,97,114,97,116,105,111,110,32,48,62,32,0,0,0,0,0,0,0,0,69,110,104,97,110,99,101,100,32,77,101,116,97,102,105,108,101,32,102,111,114,109,97,116,0,0,0,0,0,0,0,0,9,9,60,84,76,79,114,105,103,105,110,32,32,37,46,51,102,32,37,46,51,102,62,32,37,115,32,60,65,110,103,108,101,32,37,100,62,32,60,83,116,114,105,110,103,32,96,37,115,39,62,10,9,62,10,0,120,116,105,36,99,115,0,0,9,60,84,101,120,116,76,105,110,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,32,37,115,32,37,115,32,37,115,10,0,0,0,0,9,111,114,105,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,44,37,103,10,0,0,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,97,114,99,32,91,60,98,101,103,105,110,62,58,60,101,110,100,62,93,0,0,0,97,116,32,0,0,0,0,0,32,60,84,76,65,108,105,103,110,109,101,110,116,32,82,105,103,104,116,62,32,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,114,97,116,105,111,96,0,0,32,60,84,76,65,108,105,103,110,109,101,110,116,32,67,101,110,116,101,114,62,32,0,0,45,86,0,0,0,0,0,0,32,60,84,76,65,108,105,103,110,109,101,110,116,32,76,101,102,116,62,32,0,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,99,114,101,97,116,101,32,118,101,99,116,111,114,0,0,0,0,0,0,9,60,80,111,108,121,76,105,110,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,32,37,115,32,37,115,32,60,70,105,108,108,32,49,53,62,10,0,0,0,0,0,9,9,60,70,111,110,116,10,9,9,9,60,70,84,97,103,32,96,37,115,39,62,10,9,9,62,10,0,0,0,0,0,9,62,10,0,0,0,0,0,9,9,60,84,76,79,114,105,103,105,110,32,32,37,46,51,102,32,37,46,51,102,62,32,37,115,32,60,83,116,114,105,110,103,32,96,37,99,39,62,10,0,0,0,0,0,0,0,76,79,71,0,0,0,0,0,9,60,84,101,120,116,76,105,110,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,10,0,0,0,0,0,101,109,102,0,0,0,0,0,9,9,60,83,104,97,112,101,82,101,99,116,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,62,10,0,0,0,0,0,0,99,98,108,36,97,98,101,108,0,0,0,0,0,0,0,0,9,60,82,101,99,116,97,110,103,108,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,10,0,0,0,0,9,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,10,0,0,0,0,0,0,58,0,0,0,0,0,0,0,114,109,97,114,103,105,110,0,10,9,62,10,0,0,0,0,110,101,120,116,32,122,111,111,109,46,10,0,0,0,0,0,60,80,111,105,110,116,32,32,37,46,51,102,32,37,46,51,102,62,32,0,0,0,0,0,9,9,60,78,117,109,80,111,105,110,116,115,32,37,100,62,32,0,0,0,0,0,0,0,103,112,98,105,110,97,114,121,32,109,97,116,114,105,120,32,114,111,119,0,0,0,0,0,9,9,60,70,105,108,108,32,37,100,62,10,0,0,0,0,9,60,80,111,108,121,103,111,110,32,60,71,114,111,117,112,73,68,32,37,100,62,10,0,110,111,98,97,99,107,103,36,114,111,117,110,100,0,0,0,110,111,97,100,111,98,101,36,103,108,121,112,104,110,97,109,101,115,0,0,0,0,0,0,77,65,88,0,0,0,0,0,97,100,111,98,101,36,103,108,121,112,104,110,97,109,101,115,0,0,0,0,0,0,0,0,100,120,102,45,102,105,108,101,32,102,111,114,32,65,117,116,111,67,97,100,32,40,100,101,102,97,117,108,116,32,115,105,122,101,32,49,50,48,120,56,48,41,0,0,0,0,0,0,110,101,119,36,115,116,121,108,101,0,0,0,0,0,0,0,122,108,36,97,98,101,108,0,111,108,100,36,115,116,121,108,101,0,0,0,0,0,0,0,32,32,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,37,115,32,37,115,10,0,0,0,0,0,0,65,110,103,108,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,108,109,97,114,103,105,110,0,110,111,97,36,117,120,102,105,108,101,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,122,111,111,109,45,110,101,120,116,96,32,103,111,32,116,111,32,110,101,120,116,32,122,111,111,109,32,105,110,32,116,104,101,32,122,111,111,109,32,115,116,97,99,107,0,0,0,97,36,117,120,102,105,108,101,0,0,0,0,0,0,0,0,110,36,111,114,111,116,97,116,101,0,0,0,0,0,0,0,66,105,110,97,114,121,32,100,97,116,97,32,116,121,112,101,32,117,110,107,110,111,119,110,0,0,0,0,0,0,0,0,112,97,108,102,36,117,110,99,112,97,114,97,109,0,0,0,110,111,102,111,110,116,102,36,105,108,101,115,0,0,0,0,9,102,111,110,116,112,97,116,104,32,105,115,32,0,0,0,102,111,110,116,102,36,105,108,101,0,0,0,0,0,0,0,32,107,77,71,84,80,69,90,89,0,0,0,0,0,0,0,114,111,117,36,110,100,101,100,0,0,0,0,0,0,0,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,120,32,102,111,114,32,99,117,114,118,101,115,44,32,120,47,121,32,102,111,114,32,115,117,114,102,97,99,101,115,10,0,0,0,0,0,46,37,48,42,100,0,0,0,77,73,78,0,0,0,0,0,100,101,102,97,117,108,116,112,36,108,101,120,0,0,0,0,100,120,102,0,0,0,0,0,100,117,36,112,108,101,120,0,121,50,108,36,97,98,101,108,0,0,0,0,0,0,0,0,115,105,36,109,112,108,101,120,0,0,0,0,0,0,0,0])
-.concat([97,114,99,0,0,0,0,0,98,109,97,114,103,105,110,0,99,111,108,111,117,114,116,36,101,120,116,0,0,0,0,0,112,114,101,118,105,111,117,115,32,122,111,111,109,46,10,0,99,111,108,111,114,116,36,101,120,116,0,0,0,0,0,0,98,36,108,97,99,107,116,101,120,116,0,0,0,0,0,0,67,111,117,108,100,110,39,116,32,115,108,117,114,112,32,37,108,100,32,98,121,116,101,115,32,40,114,101,116,117,114,110,32,119,97,115,32,37,122,100,41,10,0,0,0,0,0,0,100,101,102,36,97,117,108,116,0,0,0,0,0,0,0,0,109,36,111,110,111,99,104,114,111,109,101,0,0,0,0,0,116,104,105,115,0,0,0,0,120,111,114,0,0,0,0,0,101,112,36,115,102,0,0,0,32,102,111,110,116,115,99,97,108,101,32,37,51,46,49,102,32,0,0,0,0,0,0,0,37,103,32,0,0,0,0,0,71,80,86,65,76,0,0,0,34,37,115,34,32,37,103,32,0,0,0,0,0,0,0,0,97,115,99,105,105,32,97,114,116,32,102,111,114,32,97,110,121,116,104,105,110,103,32,116,104,97,116,32,112,114,105,110,116,115,32,116,101,120,116,0,34,37,115,34,32,37,103,37,115,32,0,0,0,0,0,0,121,108,36,97,98,101,108,0,100,102,95,114,101,97,100,98,105,110,97,114,121,32,115,108,117,114,112,101,114,0,0,0,112,97,36,117,115,101,0,0,32,37,115,97,100,111,98,101,103,108,121,112,104,110,97,109,101,115,32,92,10,32,32,32,0,0,0,0,0,0,0,0,114,97,100,105,117,115,0,0,111,117,116,36,112,117,116,0,116,109,97,114,103,105,110,0,110,111,104,101,97,100,101,114,32,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,122,111,111,109,45,112,114,101,118,105,111,117,115,96,32,103,111,32,116,111,32,112,114,101,118,105,111,117,115,32,122,111,111,109,32,105,110,32,116,104,101,32,122,111,111,109,32,115,116,97,99,107,0,0,0,104,101,97,100,101,114,32,34,37,115,34,32,0,0,0,0,110,111,97,117,120,102,105,108,101,0,0,0,0,0,0,0,97,117,120,102,105,108,101,0,37,115,32,37,115,32,0,0,32,32,32,112,97,108,102,117,110,99,112,97,114,97,109,32,37,100,44,37,103,32,92,10,32,32,32,0,0,0,0,0,45,66,65,67,75,87,65,82,68,83,95,67,79,77,80,65,84,73,66,73,76,73,84,89,32,32,0,0,0,0,0,0,32,32,32,110,111,98,97,99,107,103,114,111,117,110,100,32,92,10,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,83,73,90,69,0,0,0,0,0,0,0,0,32,32,32,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,32,92,10,0,0,0,0,0,0,0,0,100,117,109,98,0,0,0,0,110,111,99,108,105,112,0,0,120,50,108,36,97,98,101,108,0,0,0,0,0,0,0,0,99,108,105,112,0,0,0,0,116,105,99,115,32,97,114,101,32,105,110,32,37,115,32,111,102,32,112,108,111,116,10,0,99,101,110,36,116,101,114,0,111,117,116,115,105,100,101,0,99,111,108,111,114,116,101,120,116,0,0,0,0,0,0,0,98,108,97,99,107,116,101,120,116,0,0,0,0,0,0,0,108,101,118,101,108,100,101,102,97,117,108,116,0,0,0,0,83,99,97,110,32,115,105,122,101,32,111,102,32,109,97,116,114,105,120,32,105,115,32,122,101,114,111,0,0,0,0,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,37,115,102,105,120,109,105,110,10,0,108,101,118,101,108,49,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,111,110,108,121,32,102,111,114,32,100,97,116,97,102,105,108,101,115,32,44,32,114,101,118,101,114,116,105,110,103,32,116,111,32,34,112,111,105,110,116,115,34,0,0,0,32,32,32,37,115,32,37,115,32,37,115,32,92,10,32,32,32,37,115,32,100,97,115,104,108,101,110,103,116,104,32,37,46,49,102,32,108,105,110,101,119,105,100,116,104,32,37,46,49,102,32,37,115,32,37,115,32,92,10,0,0,0,0,0,32,97,117,120,102,105,108,101,0,0,0,0,0,0,0,0,115,121,110,116,97,120,58,32,32,103,110,117,112,108,111,116,32,45,101,32,34,99,111,109,109,97,110,100,115,34,10,0,110,111,114,111,116,97,116,101,0,0,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,88,83,73,90,69,0,0,0,0,0,0,0,0,114,111,116,97,116,101,0,0,114,101,102,114,101,115,104,32,110,111,116,32,112,111,115,115,105,98,108,101,32,97,110,100,32,114,101,112,108,111,116,32,105,115,32,100,105,115,97,98,108,101,100,0,0,0,0,0,69,80,83,32,102,111,114,109,97,116,32,102,111,114,32,67,111,114,101,108,68,82,65,87,0,0,0,0,0,0,0,0,100,101,102,97,117,108,116,112,108,101,120,0,0,0,0,0,120,108,36,97,98,101,108,0,67,108,101,97,114,0,0,0,115,105,109,112,108,101,120,0,9,120,121,112,108,97,110,101,32,116,105,99,115,108,101,118,101,108,32,105,115,32,37,103,10,0,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,116,111,32,111,114,32,114,116,111,0,0,0,0,0,105,110,115,105,100,101,0,0,100,117,112,108,101,120,0,0,108,111,97,100,47,101,118,97,108,32,110,101,115,116,101,100,32,116,111,111,32,100,101,101,112,108,121,0,0,0,0,0,59,32,115,101,116,32,120,50,114,91,37,32,35,103,58,37,32,35,103,93,59,32,115,101,116,32,121,50,114,91,37,32,35,103,58,37,32,35,103,93,0,0,0,0,0,0,0,0,110,111,101,110,104,97,110,99,101,100,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,32,116,111,32,115,116,114,115,116,114,116,0,37,115,32,37,115,32,37,115,32,92,10,0,0,0,0,0,100,102,95,110,111,95,98,105,110,95,99,111,108,115,0,0,32,102,111,110,116,102,105,108,101,32,34,37,115,34,0,0,112,115,95,102,111,110,116,102,105,108,101,95,99,104,97,114,0,0,0,0,0,0,0,0,37,115,44,37,103,0,0,0,111,102,32,102,111,110,116,32,110,97,109,101,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,77,65,88,0,116,101,114,109,105,110,97,108,32,37,115,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,37,115,0,0,0,0,0,99,111,114,101,108,0,0,0,73,32,119,105,108,108,32,116,114,121,32,116,111,32,102,105,120,32,105,116,32,98,117,116,32,116,104,105,115,32,109,97,121,32,110,111,116,32,119,111,114,107,46,0,0,0,0,0,99,98,100,97,36,116,97,0,73,108,108,101,103,97,108,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,80,111,115,116,83,99,114,105,112,116,32,102,111,110,116,32,110,97,109,101,46,0,0,0,0,0,9,120,121,112,108,97,110,101,32,105,110,116,101,114,99,101,112,116,115,32,122,32,97,120,105,115,32,97,116,32,37,103,10,0,0,0,0,0,0,0,114,101,108,97,116,105,118,101,32,99,111,111,114,100,105,110,97,116,101,115,32,109,117,115,116,32,109,97,116,99,104,32,105,110,32,116,121,112,101,0,115,101,116,32,107,101,121,32,0,0,0,0,0,0,0,0,40,41,91,93,123,125,124,32,0,0,0,0,0,0,0,0,115,101,116,32,120,114,91,37,46,49,50,103,58,37,46,49,50,103,93,59,32,115,101,116,32,121,114,91,37,46,49,50,103,58,37,46,49,50,103,93,0,0,0,0,0,0,0,0,97,108,108,111,119,101,100,32,100,101,118,105,97,116,105,111,110,32,109,117,115,116,32,98,101,32,60,32,49,0,0,0,67,97,110,39,116,32,100,101,108,101,116,101,32,70,111,110,116,32,102,105,108,101,110,97,109,101,32,39,37,115,39,0,100,102,95,109,97,120,95,98,105,110,105,110,102,111,95,99,111,108,115,32,62,32,100,102,95,110,111,95,98,105,110,95,99,111,108,115,0,0,0,0,37,32,103,0,0,0,0,0,110,101,119,95,112,115,95,102,111,110,116,102,105,108,101,45,62,102,111,110,116,102,105,108,101,95,110,97,109,101,0,0,110,101,119,95,112,115,95,102,111,110,116,102,105,108,101,0,115,101,116,32,104,105,100,100,101,110,51,100,32,37,115,32,111,102,102,115,101,116,32,37,100,32,116,114,105,97,110,103,108,101,112,97,116,116,101,114,110,32,37,108,100,32,117,110,100,101,102,105,110,101,100,32,37,100,32,37,115,97,108,116,100,105,97,103,111,110,97,108,32,37,115,98,101,110,116,111,118,101,114,10,0,0,0,0,100,101,108,36,101,116,101,0,97,100,100,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,77,73,78,0,67,97,110,110,111,116,32,117,115,101,32,97,117,120,32,102,105,108,101,32,111,110,32,115,116,100,111,117,116,46,32,83,119,105,116,99,104,105,110,103,32,111,102,102,32,97,117,120,102,105,108,101,32,111,112,116,105,111,110,46,10,0,0,0,67,111,109,112,117,116,101,114,32,71,114,97,112,104,105,99,115,32,77,101,116,97,102,105,108,101,0,0,0,0,0,0,84,117,114,110,105,110,103,32,111,102,102,32,97,117,120,102,105,108,101,32,111,112,116,105,111,110,10,0,0,0,0,0,122,100,97,36,116,97,0,0,67,97,110,110,111,116,32,109,97,107,101,32,80,111,115,116,83,99,114,105,112,116,32,102,105,108,101,32,110,97,109,101,32,102,114,111,109,32,37,115,10,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,109,105,110,105,116,105,99,32,116,121,112,101,32,105,110,32,115,104,111,119,95,109,116,105,99,115,40,41,0,0,0,0,114,116,111,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,97,117,120,32,102,105,108,101,32,37,115,32,102,111,114,32,111,117,116,112,117,116,46,32,83,119,105,116,99,104,105,110,103,32,111,102,102,32,97,117,120,102,105,108,101,32,111,112,116,105,111,110,46,10,0,0,0,0,0,0,117,110,122,111,111,109,46,10,0,0,0,0,0,0,0,0,112,115,108,97,116,101,120,32,97,117,120,32,102,105,108,101,110,97,109,101,0,0,0,0,109,97,120,32,60,61,32,77,65,88,68,65,84,65,67,79,76,83,0,0,0,0,0,0,73,109,97,103,101,32,103,114,105,100,32,109,117,115,116,32,98,101,32,97,116,32,108,101,97,115,116,32,50,32,120,32,50,46,10,10,0,0,0,0,101,112,115,108,97,116,101,120,32,84,101,88,32,102,105,108,101,110,97,109,101,0,0,0,111,112,101,110,32,111,102,32,112,111,115,116,115,99,105,112,116,32,111,117,116,112,117,116,32,102,105,108,101,32,37,115,32,102,97,105,108,101,100,0,67,101,110,116,101,114,95,49,0,0,0,0,0,0,0,0,46,37,115,0,0,0,0,0,45,105,110,99,46,37,115,0,71,80,86,65,76,95,84,69,82,77,95,88,77,65,88,0,45,45,45,32,114,101,111,112,101,110,32,102,97,105,108,101,100,0,0,0,0,0,0,0,99,103,109,0,0,0,0,0,82,101,115,101,116,116,105,110,103,32,112,114,105,109,97,114,121,32,111,117,116,112,117,116,32,102,105,108,101,32,116,111,32,37,115,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,80,111,115,116,83,99,114,105,112,116,32,111,117,116,112,117,116,32,116,111,32,37,115,0,0,121,50,100,97,36,116,97,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,100,114,97,119,110,32,119,105,116,104,32,37,100,32,115,117,98,105,110,116,101,114,118,97,108,115,32,98,101,116,119,101,101,110,32,109,97,106,111,114,32,120,116,105,99,32,109,97,114,107,115,10,0,0,116,111,0,0,0,0,0,0,115,101,116,32,107,101,121,32,116,105,116,108,101,32,34,37,115,34,0,0,0,0,0,0,103,105,118,101,32,116,104,101,32,116,101,120,32,102,105,108,101,110,97,109,101,32,97,115,32,111,117,116,112,117,116,0,96,98,117,105,108,116,105,110,45,117,110,122,111,111,109,96,0,0,0,0,0,0,0,0,70,111,114,32,101,112,115,108,97,116,101,120,32,115,116,97,110,100,97,108,111,110,101,32,109,111,100,101,44,32,121,111,117,32,104,97,118,101,32,116,111,32,37,115,0,0,0,0,46,69,80,83,0,0,0,0,100,97,116,97,95,102,112,32,33,61,32,78,85,76,76,0,46,101,112,115,0,0,0,0,101,112,115,108,97,116,101,120,32,101,112,115,32,102,105,108,101,110,97,109,101,0,0,0,101,112,115,108,97,116,101,120,32,111,117,116,112,117,116,32,102,105,108,101,32,110,97,109,101,32,109,117,115,116,32,98,101,32,111,102,32,116,104,101,32,102,111,114,109,32,102,105,108,101,110,97,109,101,46,120,120,120,0,0,0,0,0,0,92,112,117,116,40,48,44,48,41,123,92,99,111,108,111,114,98,111,120,123,103,112,66,97,99,107,103,114,111,117,110,100,125,123,92,109,97,107,101,98,111,120,40,37,46,50,102,44,37,46,50,102,41,91,93,123,125,125,125,37,37,10,0,0,71,80,86,65,76,95,84,69,82,77,95,88,77,73,78,0,100,117,112,32,109,117,108,32,100,117,112,32,109,117,108,0,92,100,101,102,105,110,101,99,111,108,111,114,123,103,112,66,97,99,107,103,114,111,117,110,100,125,123,114,103,98,125,123,37,46,51,102,44,32,37,46,51,102,44,32,37,46,51,102,125,37,37,10,0,0,0,0,72,84,77,76,32,67,97,110,118,97,115,32,111,98,106,101,99,116,0,0,0,0,0,0,32,32,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,46,52,102,98,112,125,37,37,10,32,32,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,46,50,102,44,37,46,50,102,41,37,37,10,0,0,0,0,0,121,100,97,36,116,97,0,0,32,32,32,32,92,101,108,115,101,10,32,32,32,32,32,32,37,32,103,114,97,121,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,114,103,98,35,49,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,103,114,97,121,35,49,123,92,99,111,108,111,114,91,103,114,97,121,93,123,35,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,119,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,119,104,105,116,101,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,98,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,97,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,48,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,49,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,50,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,51,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,52,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,53,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,54,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,55,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,56,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,92,102,105,10,32,32,92,102,105,10,0,0,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,0,0,102,114,111,109,0,0,0,0,37,115,115,101,116,32,114,97,120,105,115,10,0,0,0,0,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,48,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,49,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,49,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,50,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,48,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,51,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,52,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,49,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,53,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,49,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,54,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,48,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,55,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,46,51,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,56,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,46,53,44,48,46,53,44,48,46,53,125,125,37,10,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,114,105,103,104,116,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,0,0,0,0,0,0,0,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,48,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,49,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,48,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,50,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,49,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,51,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,49,125,125,37,10,0,0,0,0,32,32,92,105,102,71,80,98,108,97,99,107,116,101,120,116,10,32,32,32,32,37,32,110,111,32,116,101,120,116,99,111,108,111,114,32,97,116,32,97,108,108,10,32,32,32,32,92,100,101,102,92,99,111,108,111,114,114,103,98,35,49,123,125,37,10,32,32,32,32,92,100,101,102,92,99,111,108,111,114,103,114,97,121,35,49,123,125,37,10,32,32,92,101,108,115,101,10,32,32,32,32,37,32,103,114,97,121,32,111,114,32,99,111,108,111,114,63,10,32,32,32,32,92,105,102,71,80,99,111,108,111,114,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,114,103,98,35,49,123,92,99,111,108,111,114,91,114,103,98,93,123,35,49,125,125,37,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,103,114,97,121,35,49,123,92,99,111,108,111,114,91,103,114,97,121,93,123,35,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,119,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,119,104,105,116,101,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,98,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,97,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,0,0,0,0,9,32,32,37,115,0,0,0,32,32,92,109,97,107,101,97,116,108,101,116,116,101,114,10,32,32,92,112,114,111,118,105,100,101,99,111,109,109,97,110,100,92,99,111,108,111,114,91,50,93,91,93,123,37,37,10,32,32,32,32,92,71,101,110,101,114,105,99,69,114,114,111,114,123,40,103,110,117,112,108,111,116,41,32,92,115,112,97,99,101,92,115,112,97,99,101,92,115,112,97,99,101,92,64,115,112,97,99,101,115,125,123,37,37,10,32,32,32,32,32,32,80,97,99,107,97,103,101,32,99,111,108,111,114,32,110,111,116,32,108,111,97,100,101,100,32,105,110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,10,32,32,32,32,32,32,116,101,114,109,105,110,97,108,32,111,112,116,105,111,110,32,96,99,111,108,111,117,114,116,101,120,116,39,37,37,10,32,32,32,32,125,123,83,101,101,32,116,104,101,32,103,110,117,112,108,111,116,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,101,120,112,108,97,110,97,116,105,111,110,46,37,37,10,32,32,32,32,125,123,69,105,116,104,101,114,32,117,115,101,32,39,98,108,97,99,107,116,101,120,116,39,32,105,110,32,103,110,117,112,108,111,116,32,111,114,32,108,111,97,100,32,116,104,101,32,112,97,99,107,97,103,101,10,32,32,32,32,32,32,99,111,108,111,114,46,115,116,121,32,105,110,32,76,97,84,101,88,46,125,37,37,10,32,32,32,32,92,114,101,110,101,119,99,111,109,109,97,110,100,92,99,111,108,111,114,91,50,93,91,93,123,125,37,37,10,32,32,125,37,37,10,32,32,92,112,114,111,118,105,100,101,99,111,109,109,97,110,100,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,91,50,93,91,93,123,37,37,10,32,32,32,32,92,71,101,110,101,114,105,99,69,114,114,111,114,123,40,103,110,117,112,108,111,116,41,32,92,115,112,97,99,101,92,115,112,97,99,101,92,115,112,97,99,101,92,64,115,112,97,99,101,115,125,123,37,37,10,32,32,32,32,32,32,80,97,99,107,97,103,101,32,103,114,97,112,104,105,99,120,32,111,114,32,103,114,97,112,104,105,99,115,32,110,111,116,32,108,111,97,100,101,100,37,37,10,32,32,32,32,125,123,83,101,101,32,116,104,101,32,103,110,117,112,108,111,116,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,101,120,112,108,97,110,97,116,105,111,110,46,37,37,10,32,32,32,32,125,123,84,104,101,32,103,110,117,112,108,111,116,32,101,112,115,108,97,116,101,120,32,116,101,114,109,105,110,97,108,32,110,101,101,100,115,32,103,114,97,112,104,105,99,120,46,115,116,121,32,111,114,32,103,114,97,112,104,105,99,115,46,115,116,121,46,125,37,37,10,32,32,32,32,92,114,101,110,101,119,99,111,109,109,97,110,100,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,91,50,93,91,93,123,125,37,37,10,32,32,125,37,37,10,32,32,92,112,114,111,118,105,100,101,99,111,109,109,97,110,100,92,114,111,116,97,116,101,98,111,120,91,50,93,123,35,50,125,37,37,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,105,102,71,80,99,111,108,111,114,125,123,37,37,10,32,32,32,32,92,110,101,119,105,102,92,105,102,71,80,99,111,108,111,114,10,32,32,32,32,92,71,80,99,111,108,111,114,37,115,10,32,32,125,123,125,37,37,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,105,102,71,80,98,108,97,99,107,116,101,120,116,125,123,37,37,10,32,32,32,32,92,110,101,119,105,102,92,105,102,71,80,98,108,97,99,107,116,101,120,116,10,32,32,32,32,92,71,80,98,108,97,99,107,116,101,120,116,37,115,10,32,32,125,123,125,37,37,10,32,32,37,37,32,100,101,102,105,110,101,32,97,32,92,103,64,97,100,100,116,111,64,109,97,99,114,111,32,119,105,116,104,111,117,116,32,64,32,105,110,32,116,104,101,32,110,97,109,101,58,10,32,32,92,108,101,116,92,103,112,108,103,97,100,100,116,111,109,97,99,114,111,92,103,64,97,100,100,116,111,64,109,97,99,114,111,10,32,32,37,37,32,100,101,102,105,110,101,32,101,109,112,116,121,32,116,101,109,112,108,97,116,101,115,32,102,111,114,32,97,108,108,32,99,111,109,109,97,110,100,115,32,116,97,107,105,110,103,32,116,101,120,116,58,10,32,32,92,103,100,101,102,92,103,112,108,98,97,99,107,116,101,120,116,123,125,37,37,10,32,32,92,103,100,101,102,92,103,112,108,102,114,111,110,116,116,101,120,116,123,125,37,37,10,32,32,92,109,97,107,101,97,116,111,116,104,101,114,10,0,0,0,0,0,0,0,32,32,92,115,101,108,101,99,116,102,111,110,116,10,0,0,32,32,92,102,111,110,116,115,104,97,112,101,123,37,115,125,37,37,10,0,0,0,0,0,32,32,92,102,111,110,116,115,101,114,105,101,115,123,37,115,125,37,37,10,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,87,73,78,68,79,87,73,68,0,0,0,0,0,32,32,92,102,111,110,116,102,97,109,105,108,121,123,37,115,125,37,37,10,0,0,0,0,99,97,110,118,97,115,0,0,32,32,37,37,32,69,110,99,111,100,105,110,103,32,105,110,115,105,100,101,32,116,104,101,32,112,108,111,116,46,32,32,73,110,32,116,104,101,32,104,101,97,100,101,114,32,111,102,32,121,111,117,114,32,100,111,99,117,109,101,110,116,44,32,116,104,105,115,32,101,110,99,111,100,105,110,103,10,32,32,37,37,32,115,104,111,117,108,100,32,116,111,32,100,101,102,105,110,101,100,44,32,101,46,103,46,44,32,98,121,32,117,115,105,110,103,10,32,32,37,37,32,92,117,115,101,112,97,99,107,97,103,101,91,37,115,44,60,111,116,104,101,114,32,101,110,99,111,100,105,110,103,115,62,93,123,105,110,112,117,116,101,110,99,125,10,32,32,92,105,110,112,117,116,101,110,99,111,100,105,110,103,123,37,115,125,37,37,10,0,0,0,120,50,100,97,36,116,97,0,92,98,101,103,105,110,103,114,111,117,112,10,0,0,0,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,111,102,102,32,102,111,114,32,108,105,110,101,97,114,32,115,99,97,108,101,115,10,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,102,111,114,32,108,111,103,32,115,99,97,108,101,115,10,0,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,111,98,106,101,99,116,32,116,121,112,101,0,0,0,0,0,37,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,117,112,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,0,0,92,109,97,107,101,97,116,108,101,116,116,101,114,10,37,37,32,83,101,108,101,99,116,32,97,110,32,97,112,112,114,111,112,114,105,97,116,101,32,100,101,102,97,117,108,116,32,100,114,105,118,101,114,32,40,102,114,111,109,32,84,101,88,76,105,118,101,32,103,114,97,112,104,105,99,115,46,99,102,103,41,10,92,98,101,103,105,110,103,114,111,117,112,10,32,32,92,99,104,97,114,100,101,102,92,120,61,48,32,37,37,10,32,32,37,37,32,99,104,101,99,107,32,112,100,102,84,101,88,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,112,100,102,111,117,116,112,117,116,125,123,125,123,37,37,10,32,32,32,32,92,105,102,99,97,115,101,92,112,100,102,111,117,116,112,117,116,10,32,32,32,32,92,101,108,115,101,10,32,32,32,32,32,32,92,99,104,97,114,100,101,102,92,120,61,49,32,37,37,10,32,32,32,32,92,102,105,10,32,32,125,37,37,10,32,32,37,37,32,99,104,101,99,107,32,86,84,101,88,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,79,112,77,111,100,101,125,123,125,123,37,37,10,32,32,32,32,92,99,104,97,114,100,101,102,92,120,61,50,32,37,37,10,32,32,125,37,37,10,92,101,120,112,97,110,100,97,102,116,101,114,92,101,110,100,103,114,111,117,112,10,92,105,102,99,97,115,101,92,120,10,32,32,37,37,32,100,101,102,97,117,108,116,32,99,97,115,101,10,32,32,92,80,97,115,115,79,112,116,105,111,110,115,84,111,80,97,99,107,97,103,101,123,100,118,105,112,115,125,123,103,101,111,109,101,116,114,121,125,10,92,111,114,10,32,32,37,37,32,112,100,102,84,101,88,32,105,115,32,114,117,110,110,105,110,103,32,105,110,32,112,100,102,32,109,111,100,101,10,32,32,92,80,97,115,115,79,112,116,105,111,110,115,84,111,80,97,99,107,97,103,101,123,112,100,102,116,101,120,125,123,103,101,111,109,101,116,114,121,125,10,92,101,108,115,101,10,32,32,37,37,32,86,84,101,88,32,105,115,32,114,117,110,110,105,110,103,10,32,32,92,80,97,115,115,79,112,116,105,111,110,115,84,111,80,97,99,107,97,103,101,123,118,116,101,120,125,123,103,101,111,109,101,116,114,121,125,10,92,102,105,10,92,109,97,107,101,97,116,111,116,104,101,114,10,37,37,32,83,101,116,32,112,97,112,101,114,115,105,122,101,10,92,117,115,101,112,97,99,107,97,103,101,91,112,97,112,101,114,115,105,122,101,61,123,37,46,50,102,98,112,44,37,46,50,102,98,112,125,44,116,101,120,116,61,123,37,46,50,102,98,112,44,37,46,50,102,98,112,125,93,123,103,101,111,109,101,116,114,121,125,10,37,37,32,78,111,32,112,97,103,101,32,110,117,109,98,101,114,115,32,97,110,100,32,110,111,32,112,97,114,97,103,114,97,112,104,32,105,110,100,101,110,116,97,116,105,111,110,10,92,112,97,103,101,115,116,121,108,101,123,101,109,112,116,121,125,10,92,115,101,116,108,101,110,103,116,104,123,92,112,97,114,105,110,100,101,110,116,125,123,48,98,112,125,37,37,10,37,37,32,76,111,97,100,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,102,105,108,101,10,92,73,110,112,117,116,73,102,70,105,108,101,69,120,105,115,116,115,123,103,110,117,112,108,111,116,46,99,102,103,125,123,37,37,10,32,32,92,116,121,112,101,111,117,116,123,85,115,105,110,103,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,102,105,108,101,32,103,110,117,112,108,111,116,46,99,102,103,125,37,37,10,125,123,37,37,10,32,92,116,121,112,101,111,117,116,123,78,111,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,102,105,108,101,32,103,110,117,112,108,111,116,46,99,102,103,32,102,111,117,110,100,46,125,37,37,10,125,37,37,10,37,115,10,92,98,101,103,105,110,123,100,111,99,117,109,101,110,116,125,10,0,0,0,0,0,0,0,0,92,117,115,101,112,97,99,107,97,103,101,91,37,115,93,123,105,110,112,117,116,101,110,99,125,10,0,0,0,0,0,0,9,84,104,105,115,32,118,101,114,115,105,111,110,32,111,102,32,103,110,117,112,108,111,116,32,117,110,100,101,114,115,116,97,110,100,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,110,97,114,121,32,102,105,108,101,32,116,121,112,101,115,58,10,0,0,37,32,76,111,97,100,32,112,97,99,107,97,103,101,115,10,92,117,115,101,112,97,99,107,97,103,101,123,103,114,97,112,104,105,99,120,125,10,92,117,115,101,112,97,99,107,97,103,101,123,99,111,108,111,114,125,10,0,0,0,0,0,0,0,111,110,108,121,32,54,32,114,97,110,103,101,32,115,112,101,99,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,0,0,0,0,0,0,0,0,92,114,101,110,101,119,99,111,109,109,97,110,100,42,92,117,112,100,101,102,97,117,108,116,123,37,115,125,37,37,10,0,92,114,101,110,101,119,99,111,109,109,97,110,100,42,92,109,100,100,101,102,97,117,108,116,123,37,115,125,37,37,10,0,92,114,101,110,101,119,99,111,109,109,97,110,100,42,92,114,109,100,101,102,97,117,108,116,123,37,115,125,37,37,10,0,71,80,86,65,76,95,80,87,68,0,0,0,0,0,0,0,92,100,111,99,117,109,101,110,116,99,108,97,115,115,123,109,105,110,105,109,97,108,125,10,37,37,32,83,101,116,32,102,111,110,116,32,115,105,122,101,10,92,109,97,107,101,97,116,108,101,116,116,101,114,10,92,100,101,102,92,64,112,116,115,105,122,101,123,37,100,125,10,92,73,110,112,117,116,73,102,70,105,108,101,69,120,105,115,116,115,123,115,105,122,101,37,100,46,99,108,111,125,123,125,123,37,37,10,32,32,32,92,71,101,110,101,114,105,99,69,114,114,111,114,123,40,103,110,117,112,108,111,116,41,32,92,115,112,97,99,101,92,115,112,97,99,101,92,115,112,97,99,101,92,64,115,112,97,99,101,115,125,123,37,37,10,32,32,32,32,32,32,71,110,117,112,108,111,116,32,69,114,114,111,114,58,32,70,105,108,101,32,96,115,105,122,101,37,100,46,99,108,111,39,32,110,111,116,32,102,111,117,110,100,33,32,67,111,117,108,100,32,110,111,116,32,115,101,116,32,102,111,110,116,32,115,105,122,101,37,37,10,32,32,32,125,123,83,101,101,32,116,104,101,32,103,110,117,112,108,111,116,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,101,120,112,108,97,110,97,116,105,111,110,46,37,37,10,32,32,32,125,123,70,111,114,32,117,115,105,110,103,32,97,32,102,111,110,116,32,115,105,122,101,32,97,32,102,105,108,101,32,96,115,105,122,101,60,102,111,110,116,115,105,122,101,62,46,99,108,111,39,32,104,97,115,32,116,111,32,101,120,105,115,116,46,10,32,32,32,32,32,32,32,32,70,97,108,108,105,110,103,32,98,97,99,107,32,94,94,74,116,111,32,100,101,102,97,117,108,116,32,102,111,110,116,115,105,122,101,32,49,48,112,116,46,125,37,37,10,32,32,92,100,101,102,92,64,112,116,115,105,122,101,123,48,125,10,32,32,92,105,110,112,117,116,123,115,105,122,101,49,48,46,99,108,111,125,37,37,10,125,37,37,10,92,109,97,107,101,97,116,111,116,104,101,114,10,0,0,0,0,88,116,101,114,109,32,84,101,107,116,114,111,110,105,120,32,52,48,49,52,32,77,111,100,101,0,0,0,0,0,0,0,69,80,83,76,65,84,69,88,95,99,111,109,109,111,110,95,105,110,105,116,0,0,0,0,120,100,97,36,116,97,0,0,105,110,118,97,108,105,100,32,105,110,112,117,116,32,101,110,99,111,100,105,110,103,32,117,115,101,100,0,0,0,0,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,111,102,102,10,0,0,108,97,121,101,114,100,101,102,97,117,108,116,0,0,0,0,107,111,105,56,45,117,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,108,101,102,116,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,107,111,105,56,45,114,0,0,99,112,52,51,55,100,101,0,32,45,45,32,112,114,111,99,101,115,115,111,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,32,115,105,122,101,0,0,0,0,0,0,0,0,108,97,116,105,110,57,0,0,108,97,116,105,110,53,0,0,114,0,0,0,0,0,0,0,108,97,116,105,110,50,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,66,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,98,0,0,0,108,97,116,105,110,49,0,0,121,111,117,32,99,97,110,39,116,32,117,110,115,101,116,32,116,104,101,32,112,97,108,101,116,116,101,46,10,0,0,0,102,105,108,108,105,110,103,32,71,80,86,65,76,95,80,87,68,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,0,0,0,0,0,0,120,116,101,114,109,0,0,0,101,112,115,108,97,116,101,120,32,116,101,114,109,105,110,97,108,32,99,97,110,110,111,116,32,119,114,105,116,101,32,116,111,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,0,0,0,0,0,0,0,120,121,112,36,108,97,110,101,0,0,0,0,0,0,0,0,9,110,111,116,32,114,111,116,97,116,101,100,10,9,0,0,101,120,112,101,99,116,101,100,32,103,97,112,32,118,97,108,117,101,0,0,0,0,0,0,115,101,116,32,103,114,105,100,32,37,115,32,32,0,0,0,32,32,123,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,123,34,10,0,0,0,99,104,97,110,103,105,110,103,32,118,105,101,119,32,116,111,32,37,102,44,32,37,102,46,10,0,0,0,0,0,0,0,32,32,92,115,112,101,99,105,97,108,123,112,115,102,105,108,101,61,37,115,32,108,108,120,61,48,32,108,108,121,61,48,32,117,114,120,61,37,100,32,117,114,121,61,37,100,32,114,119,105,61,37,100,125,10,0,92,71,78,85,80,76,79,84,112,105,99,116,117,114,101,40,37,100,44,37,100,41,10,0,40,37,100,41,0,0,0,0,117,116,102,56,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,112,108,97,105,110,32,84,101,88,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,92,98,101,103,105,110,103,114,111,117,112,10,92,99,97,116,99,111,100,101,96,92,64,61,49,49,92,114,101,108,97,120,10,92,100,101,102,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,123,37,37,10,32,32,92,100,101,102,92,100,111,35,35,49,123,92,99,97,116,99,111,100,101,96,35,35,49,61,49,50,92,114,101,108,97,120,125,92,100,111,115,112,101,99,105,97,108,115,10,32,32,92,99,97,116,99,111,100,101,96,92,123,61,49,92,99,97,116,99,111,100,101,96,92,125,61,50,92,99,97,116,99,111,100,101,92,37,37,61,49,52,92,114,101,108,97,120,92,115,112,101,99,105,97,108,125,37,37,10,37,37,10,92,101,120,112,97,110,100,97,102,116,101,114,92,105,102,120,92,99,115,110,97,109,101,32,71,78,85,80,76,79,84,112,105,99,116,117,114,101,92,101,110,100,99,115,110,97,109,101,92,114,101,108,97,120,10,32,32,92,99,115,110,97,109,101,32,110,101,119,100,105,109,101,110,92,101,110,100,99,115,110,97,109,101,92,71,78,85,80,76,79,84,117,110,105,116,10,32,32,92,103,100,101,102,92,71,78,85,80,76,79,84,112,105,99,116,117,114,101,40,35,49,44,35,50,41,123,92,118,98,111,120,32,116,111,35,50,92,71,78,85,80,76,79,84,117,110,105,116,92,98,103,114,111,117,112,10,32,32,32,32,92,100,101,102,92,112,117,116,40,35,35,49,44,35,35,50,41,35,35,51,123,92,117,110,115,107,105,112,92,114,97,105,115,101,35,35,50,92,71,78,85,80,76,79,84,117,110,105,116,10,32,32,32,32,32,32,92,104,98,111,120,32,116,111,48,112,116,123,92,107,101,114,110,35,35,49,92,71,78,85,80,76,79,84,117,110,105,116,32,35,35,51,92,104,115,115,125,92,105,103])
-.concat([110,111,114,101,115,112,97,99,101,115,125,37,37,10,32,32,32,32,92,100,101,102,92,108,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,35,35,49,92,104,115,115,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,99,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,32,35,35,49,92,104,115,115,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,114,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,32,35,35,49,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,115,116,97,99,107,35,35,49,123,92,108,101,116,92,92,61,92,99,114,92,116,97,98,115,107,105,112,61,48,112,116,92,104,97,108,105,103,110,123,92,104,102,105,108,32,35,35,35,35,92,104,102,105,108,92,99,114,32,35,35,49,92,99,114,99,114,125,125,37,37,10,32,32,32,32,92,100,101,102,92,108,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,115,116,97,99,107,123,35,35,49,125,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,99,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,115,116,97,99,107,123,35,35,49,125,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,114,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,118,98,111,120,32,116,111,48,112,116,123,92,115,116,97,99,107,123,35,35,49,125,92,118,115,115,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,118,115,115,92,104,98,111,120,32,116,111,35,49,92,71,78,85,80,76,79,84,117,110,105,116,92,98,103,114,111,117,112,92,105,103,110,111,114,101,115,112,97,99,101,115,125,37,37,10,32,32,92,103,100,101,102,92,101,110,100,71,78,85,80,76,79,84,112,105,99,116,117,114,101,123,92,104,115,115,92,101,103,114,111,117,112,92,101,103,114,111,117,112,125,37,37,10,92,102,105,10,92,71,78,85,80,76,79,84,117,110,105,116,61,37,46,52,102,98,112,10,0,104,105,115,116,111,103,114,97,109,115,0,0,0,0,0,0,98,111,114,0,0,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,48,44,48,41,37,37,10,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,92,98,101,103,105,110,103,114,111,117,112,37,37,10,92,109,97,107,101,97,116,108,101,116,116,101,114,37,37,10,92,110,101,119,99,111,109,109,97,110,100,123,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,125,123,37,37,10,32,32,92,64,115,97,110,105,116,105,122,101,92,99,97,116,99,111,100,101,96,92,37,37,61,49,52,92,114,101,108,97,120,92,115,112,101,99,105,97,108,125,37,37,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,46,52,102,98,112,125,37,37,10,0,80,108,111,116,32,102,97,105,108,101,100,33,0,0,0,0,111,114,32,115,101,116,32,116,104,101,32,108,111,97,100,112,97,116,104,32,97,112,112,114,111,112,114,105,97,116,101,108,121,10,0,0,0,0,0,0,86,84,45,108,105,107,101,32,116,101,107,52,48,120,120,32,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,0,0,0,0,0,0,0,111,114,32,115,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,97,108,32,118,97,114,105,97,98,108,101,32,71,78,85,80,76,79,84,95,80,83,95,68,73,82,10,0,0,0,0,0,0,0,118,105,36,101,119,0,0,0,108,36,111,97,100,0,0,0,80,108,101,97,115,101,32,99,111,112,121,32,37,115,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,97,98,111,118,101,32,100,105,114,101,99,116,111,114,105,101,115,10,0,9,114,111,116,97,116,101,100,32,105,102,32,116,104,101,32,116,101,114,109,105,110,97,108,32,97,108,108,111,119,115,32,105,116,10,9,0,0,0,0,103,97,112,0,0,0,0,0,32,92,10,0,0,0,0,0,67,97,110,39,116,32,102,105,110,100,32,80,111,115,116,83,99,114,105,112,116,32,112,114,111,108,111,103,117,101,32,102,105,108,101,32,37,115,10,0,71,80,86,65,76,95,86,73,69,87,95,82,79,84,95,90,0,0,0,0,0,0,0,0,71,78,85,80,76,79,84,95,80,83,95,68,73,82,0,0,80,114,111,108,111,103,32,110,97,109,101,0,0,0,0,0,10,9,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,110,97,114,121,32,100,97,116,97,32,115,105,122,101,115,32,97,116,116,101,109,112,116,32,116,111,32,98,101,32,109,97,99,104,105,110,101,32,105,110,100,101,112,101,110,100,101,110,116,58,10,10,9,32,32,110,97,109,101,32,40,115,105,122,101,32,105,110,32,98,121,116,101,115,41,10,10,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,47,80,111,115,116,83,99,114,105,112,116,0,97,103,108,105,115,116,0,0,97,103,108,102,110,46,116,120,116,0,0,0,0,0,0,0,47,76,84,51,32,123,32,80,76,32,91,56,32,100,108,49,32,53,32,100,108,49,32,48,46,53,32,100,108,49,32,53,32,100,108,49,93,32,49,32,48,32,49,32,68,76,32,125,32,100,101,102,10,0,0,0,71,80,86,65,76,95,78,97,78,0,0,0,0,0,0,0,47,76,84,50,32,123,32,80,76,32,91,52,32,100,108,49,32,52,32,100,108,49,93,32,48,32,49,32,49,32,68,76,32,125,32,100,101,102,10,0,118,116,116,101,107,0,0,0,47,76,84,49,32,123,32,80,76,32,91,56,32,100,108,49,32,53,32,100,108,49,93,32,48,32,48,32,49,32,68,76,32,125,32,100,101,102,10,0,118,101,36,114,115,105,111,110,0,0,0,0,0,0,0,0,47,76,84,48,32,123,32,80,76,32,91,93,32,49,32,48,32,48,32,68,76,32,125,32,100,101,102,10,0,0,0,0,116,111,112,0,0,0,0,0,99,111,108,117,109,110,115,36,116,97,99,107,101,100,0,0,32,37,115,37,115,116,105,99,115,32,37,115,109,37,115,116,105,99,115,0,0,0,0,0,47,76,84,97,32,123,32,65,76,32,91,49,32,117,100,108,32,109,117,108,32,50,32,117,100,108,32,109,117,108,93,32,48,32,115,101,116,100,97,115,104,32,48,32,48,32,48,32,115,101,116,114,103,98,99,111,108,111,114,32,125,32,100,101,102,10,0,0,0,0,0,0,71,80,86,65,76,95,86,73,69,87,95,82,79,84,95,88,0,0,0,0,0,0,0,0,47,76,84,98,32,123,32,66,76,32,91,93,32,48,32,48,32,48,32,68,76,32,125,32,100,101,102,10,0,0,0,0,47,76,84,119,32,123,32,80,76,32,91,93,32,49,32,115,101,116,103,114,97,121,32,125,32,100,101,102,10,0,0,0,40,37,100,41,10,0,0,0,93,32,41,10,0,0,0,0,37,32,82,101,100,101,102,105,110,101,32,108,105,110,101,32,116,121,112,101,115,32,116,111,32,109,97,116,99,104,32,111,108,100,32,101,112,115,108,97,116,101,120,32,100,114,105,118,101,114,10,0,0,0,0,0,119,36,105,116,104,0,0,0,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,32,100,101,102,105,110,101,102,111,110,116,32,112,111,112,10,0,100,117,112,32,108,101,110,103,116,104,32,100,105,99,116,32,98,101,103,105,110,32,123,49,32,105,110,100,101,120,32,47,70,73,68,32,101,113,32,123,112,111,112,32,112,111,112,125,32,123,100,101,102,125,32,105,102,101,108,115,101,125,32,102,111,114,97,108,108,10,0,0,45,101,0,0,0,0,0,0,47,67,77,69,88,49,48,45,66,97,115,101,108,105,110,101,32,47,67,77,69,88,49,48,32,102,105,110,100,102,111,110,116,32,91,49,32,48,32,48,32,49,32,48,32,49,93,32,109,97,107,101,102,111,110,116,10,0,0,0,0,0,0,0,71,80,86,65,76,95,112,105,0,0,0,0,0,0,0,0,37,37,66,101,103,105,110,80,114,111,99,83,101,116,58,32,67,77,69,88,49,48,45,66,97,115,101,108,105,110,101,10,0,0,0,0,0,0,0,0,114,101,102,114,101,115,104,10,0,0,0,0,0,0,0,0,84,101,107,116,114,111,110,105,120,32,52,48,49,48,32,97,110,100,32,111,116,104,101,114,115,59,32,109,111,115,116,32,84,69,75,32,101,109,117,108,97,116,111,114,115,0,0,0,67,77,69,88,49,48,0,0,116,105,116,36,108,101,0,0,76,105,110,101,102,101,101,100,0,0,0,0,0,0,0,0,37,37,69,110,100,80,114,111,99,83,101,116,10,0,0,0,98,111,116,116,111,109,0,0,114,111,119,115,36,116,97,99,107,101,100,0,0,0,0,0,115,101,116,32,103,114,105,100,0,0,0,0,0,0,0,0,67,111,109,109,97,110,100,32,39,37,115,39,32,103,101,110,101,114,97,116,101,100,32,101,114,114,111,114,44,32,101,120,105,116,99,111,100,101,32,105,115,32,37,100,0,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,108,111,97,100,32,102,105,108,101,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,99,117,98,105,99,32,115,112,108,105,110,101,115,0,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,100,111,119,110,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,80,105,112,101,32,39,37,115,39,32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,110,116,32,39,37,115,39,46,10,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,115,116,114,108,101,110,32,111,102,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,110,116,32,39,37,115,39,46,32,76,111,99,97,116,105,111,110,58,10,32,32,32,37,115,10,0,108,111,97,100,95,102,111,110,116,102,105,108,101,115,0,0,47,70,111,110,116,78,97,109,101,0,0,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,115,101,101,109,115,32,110,111,116,32,116,111,32,98,101,32,97,32,80,70,65,32,102,105,108,101,0,0,0,0,0,0,0,67,111,109,109,97,110,100,32,39,37,115,39,32,115,101,101,109,115,32,110,111,116,32,116,111,32,103,101,110,101,114,97,116,101,32,80,70,65,32,100,97,116,97,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,73,78,65,76,83,0,37,33,70,111,110,116,84,121,112,101,49,0,0,0,0,0,116,101,107,52,48,120,120,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,0,0,116,105,109,36,101,115,116,97,109,112,0,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,104,97,115,32,117,110,107,110,111,119,110,32,101,120,116,101,110,115,105,111,110,46,32,65,115,115,117,109,101,32,105,116,32,105,115,32,97,32,112,102,97,32,102,105,108,101,0,0,0,9,119,114,105,116,116,101,110,32,105,110,32,37,115,32,99,111,114,110,101,114,10,0,0,101,114,114,111,114,36,98,97,114,115,0,0,0,0,0,0,115,101,116,32,103,114,105,100,32,110,111,112,111,108,97,114,10,0,0,0,0,0,0,0,112,102,97,0,0,0,0,0,78,111,32,99,111,109,109,97,110,100,32,102,111,114,32,97,117,116,111,109,97,116,105,99,32,102,111,110,116,32,99,111,110,118,101,114,115,105,111,110,32,112,102,98,45,62,112,102,97,32,100,101,102,105,110,101,100,0,0,0,0,0,0,0,112,102,98,116,111,112,115,32,37,115,0,0,0,0,0,0,9,32,32,0,0,0,0,0,67,97,110,39,116,32,112,108,111,116,32,119,105,116,104,32,97,110,32,101,109,112,116,121,32,37,115,32,114,97,110,103,101,33,0,0,0,0,0,0,71,78,85,80,76,79,84,95,80,70,66,84,79,80,70,65,0,0,0,0,0,0,0,0,112,102,98,0,0,0,0,0,117,110,115,101,116,32,104,105,100,100,101,110,51,100,10,0,67,111,117,108,100,32,110,111,116,32,101,120,101,99,117,116,101,32,99,111,109,109,97,110,100,32,39,37,115,39,0,0,78,111,32,99,111,109,109,97,110,100,32,102,111,114,32,97,117,116,111,109,97,116,105,99,32,102,111,110,116,32,99,111,110,118,101,114,115,105,111,110,32,116,116,102,45,62,112,102,97,32,100,101,102,105,110,101,100,0,0,0,0,0,0,0,110,101,119,32,107,101,121,32,108,105,115,116,0,0,0,0,116,116,102,50,112,116,49,32,45,97,32,45,101,32,45,87,32,48,32,37,115,32,45,0,84,101,107,116,114,111,110,105,120,32,52,49,48,54,44,32,52,49,48,55,44,32,52,49,48,57,32,97,110,100,32,52,50,48,88,32,116,101,114,109,105,110,97,108,115,0,0,0,71,78,85,80,76,79,84,95,84,84,70,84,79,80,70,65,0,0,0,0,0,0,0,0,116,105,109,101,102,36,109,116,0,0,0,0,0,0,0,0,111,116,102,0,0,0,0,0,99,108,117,115,116,36,101,114,101,100,0,0,0,0,0,0,115,101,116,32,103,114,105,100,32,112,111,108,97,114,32,37,102,10,0,0,0,0,0,0,116,116,102,0,0,0,0,0,112,0,0,0,0,0,0,0,37,37,37,37,66,101,103,105,110,80,114,111,99,83,101,116,58,32,37,115,10,0,0,0,80,83,95,101,115,99,97,112,101,95,115,116,114,105,110,103,0,0,0,0,0,0,0,0,9,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,110,97,114,121,32,100,97,116,97,32,115,105,122,101,115,32,97,114,101,32,109,97,99,104,105,110,101,32,100,101,112,101,110,100,101,110,116,58,10,10,9,32,32,110,97,109,101,32,40,115,105,122,101,32,105,110,32,98,121,116,101,115,41,10,10,0,0,0,0,0,0,76,111,103,32,115,99,97,108,105,110,103,32,111,102,32,51,68,32,105,109,97,103,101,32,112,108,111,116,115,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,0,101,110,100,10,37,37,69,110,100,80,114,111,108,111,103,10,0,0,0,0,0,0,0,0,40,41,92,0,0,0,0,0,115,116,97,116,117,115,100,105,99,116,32,98,101,103,105,110,32,37,115,32,115,101,116,100,117,112,108,101,120,109,111,100,101,32,101,110,100,10,0,0,79,114,105,103,105,110,95,50,0,0,0,0,0,0,0,0,117,116,102,45,56,46,112,115,0,0,0,0,0,0,0,0,71,80,86,65,76,95,67,79,77,80,73,76,69,95,79,80,84,73,79,78,83,0,0,0,107,111,105,56,117,46,112,115,0,0,0,0,0,0,0,0,116,101,107,52,49,48,120,0,107,111,105,56,114,46,112,115,0,0,0,0,0,0,0,0,116,105,99,115,108,36,101,118,101,108,0,0,0,0,0,0,99,112,49,50,53,49,46,112,115,0,0,0,0,0,0,0,9,115,101,116,32,37,115,100,97,116,97,32,116,105,109,101,10,0,0,0,0,0,0,0,117,110,115,101,116,32,103,114,105,100,10,0,0,0,0,0,99,112,49,50,53,48,46,112,115,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,99,112,56,53,50,46,112,115,0,0,0,0,0,0,0,0,99,112,56,53,48,46,112,115,0,0,0,0,0,0,0,0,99,112,52,51,55,46,112,115,0,0,0,0,0,0,0,0,56,56,53,57,45,49,53,46,112,115,0,0,0,0,0,0,56,56,53,57,45,57,46,112,115,0,0,0,0,0,0,0,56,56,53,57,45,50,46,112,115,0,0,0,0,0,0,0,108,111,97,100,112,97,116,104,32,61,61,32,78,85,76,76,0,0,0,0,0,0,0,0,71,80,86,65,76,95,80,65,84,67,72,76,69,86,69,76,0,0,0,0,0,0,0,0,56,56,53,57,45,49,46,112,115,0,0,0,0,0,0,0,120,94,51,0,0,0,0,0,82,69,71,73,83,32,103,114,97,112,104,105,99,115,32,108,97,110,103,117,97,103,101,0,112,114,111,108,111,103,117,101,46,112,115,0,0,0,0,0,116,105,99,115,99,36,97,108,101,0,0,0,0,0,0,0,47,100,111,99,108,105,112,32,123,10,32,32,67,108,105,112,84,111,66,111,117,110,100,105,110,103,66,111,120,32,123,10,32,32,32,32,110,101,119,112,97,116,104,32,37,100,32,37,100,32,109,111,118,101,116,111,32,37,100,32,37,100,32,108,105,110,101,116,111,32,37,100,32,37,100,32,108,105,110,101,116,111,32,37,100,32,37,100,32,108,105,110,101,116,111,32,99,108,111,115,101,112,97,116,104,10,32,32,32,32,99,108,105,112,10,32,32,125,32,105,102,10,125,32,100,101,102,10,0,0,0,0,0,0,0,0,104,115,0,0,0,0,0,0,115,101,116,32,116,105,99,115,32,37,115,10,0,0,0,0,37,37,80,97,103,101,115,58,32,40,97,116,101,110,100,41,10,0,0,0,0,0,0,0,80,111,114,116,114,97,105,116,0,0,0,0,0,0,0,0,76,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,44,32,37,100,32,98,101,102,111,114,101,32,112,108,97,110,101,0,0,0,0,0,0,0,37,37,37,37,79,114,105,101,110,116,97,116,105,111,110,58,32,37,115,10,0,0,0,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,40,97,116,101,110,100,41,0,37,37,37,37,84,105,116,108,101,58,32,37,115,10,0,0,71,80,86,65,76,95,86,69,82,83,73,79,78,0,0,0,37,33,80,83,45,65,100,111,98,101,45,50,46,48,10,0,114,101,103,105,115,0,0,0,37,33,80,83,45,65,100,111,98,101,45,50,46,48,32,69,80,83,70,45,50,46,48,10,0,0,0,0,0,0,0,0,116,105,36,99,115,0,0,0,101,112,115,0,0,0,0,0,40,0,0,0,0,0,0,0,32,110,111,101,110,104,97,110,99,101,100,0,0,0,0,0,117,110,36,115,111,114,116,101,100,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,112,111,115,116,115,99,114,105,112,116,32,102,111,114,109,97,116,32,117,115,101,100,0,0,37,37,37,37,80,97,103,101,115,58,32,37,100,10,0,0,37,115,37,115,0,0,0,0,44,32,37,100,32,98,101,102,111,114,101,32,108,105,110,101,0,0,0,0,0,0,0,0,37,37,68,111,99,117,109,101,110,116,70,111,110,116,115,58,32,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,37,37,84,114,97,105,108,101,114,10,0,0,0,0,0,0,115,116,114,111,107,101,10,103,114,101,115,116,111,114,101,10,101,110,100,10,115,104,111,119,112,97,103,101,10,0,0,0,77,82,115,104,111,119,10,0,66,97,100,32,102,117,108,108,32,109,111,110,116,104,32,110,97,109,101,0,0,0,0,0,71,80,86,65,76,95,69,82,82,78,79,0,0,0,0,0,77,67,115,104,111,119,10,0,71,80,73,67,32,45,45,32,80,114,111,100,117,99,101,32,103,114,97,112,104,115,32,105,110,32,103,114,111,102,102,32,117,115,105,110,103,32,116,104,101,32,103,112,105,99,32,112,114,101,112,114,111,99,101,115,115,111,114,0,0,0,0,0,77,76,115,104,111,119,10,0,116,101,114,109,111,36,112,116,105,111,110,115,0,0,0,0,93,32,37,46,49,102,32,0,44,32,114,111,116,97,116,101,100,32,98,121,32,37,100,32,100,101,103,114,101,101,115,32,105,110,32,50,68,32,112,108,111,116,115,0,0,0,0,0,115,111,36,114,116,101,100,0,92,37,111,0,0,0,0,0,91,32,0,0,0,0,0,0,99,117,114,114,101,110,116,112,111,105,110,116,32,103,115,97,118,101,32,116,114,97,110,115,108,97,116,101,32,37,100,32,114,111,116,97,116,101,32,48,32,48,32,109,111,118,101,116,111,10,0,0,0,0,0,0,10,9,32,32,32,32,83,107,105,112,32,98,121,116,101,115,58,32,37,100,32,98,101,102,111,114,101,32,114,101,99,111,114,100,0,0,0,0,0,0,47,88,89,114,101,115,116,111,114,101,32,123,32,91,40,32,41,32,49,32,50,32,116,114,117,101,32,102,97,108,115,101,32,52,32,40,41,93,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,47,88,89,115,97,118,101,32,32,32,32,123,32,91,40,32,41,32,49,32,50,32,116,114,117,101,32,102,97,108,115,101,32,51,32,40,41,93,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,101,120,112,97,110,100,32,102,111,110,116,112,97,116,104,0,32,32,101,120,99,104,32,100,117,112,32,77,70,119,105,100,116,104,32,45,50,32,100,105,118,32,51,32,45,49,32,114,111,108,108,32,82,10,32,32,66,108,97,99,107,116,101,120,116,32,123,103,115,97,118,101,32,48,32,115,101,116,103,114,97,121,32,77,70,115,104,111,119,32,103,114,101,115,116,111,114,101,125,32,123,77,70,115,104,111,119,125,32,105,102,101,108,115,101,32,125,32,98,105,110,100,32,100,101,102,10,0,101,37,43,48,50,100,0,0,47,77,67,115,104,111,119,32,123,32,99,117,114,114,101,110,116,112,111,105,110,116,32,115,116,114,111,107,101,32,77,10,0,0,0,0,0,0,0,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,120,32,102,111,114,32,99,117,114,118,101,115,10,0,0,0,0,0,0,0,37,72,58,37,77,0,0,0,71,80,86,65,76,95,69,78,67,79,68,73,78,71,0,0,32,32,101,120,99,104,32,100,117,112,32,77,70,119,105,100,116,104,32,110,101,103,32,51,32,45,49,32,114,111,108,108,32,82,10,32,32,66,108,97,99,107,116,101,120,116,32,123,103,115,97,118,101,32,48,32,115,101,116,103,114,97,121,32,77,70,115,104,111,119,32,103,114,101,115,116,111,114,101,125,32,123,77,70,115,104,111,119,125,32,105,102,101,108,115,101,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,103,112,105,99,0,0,0,0,47,77,82,115,104,111,119,32,123,32,99,117,114,114,101,110,116,112,111,105,110,116,32,115,116,114,111,107,101,32,77,10,0,0,0,0,0,0,0,0,116,97,98,108,101,0,0,0,32,32,48,32,101,120,99,104,32,82,10,32,32,66,108,97,99,107,116,101,120,116,32,123,103,115,97,118,101,32,48,32,115,101,116,103,114,97,121,32,77,70,115,104,111,119,32,103,114,101,115,116,111,114,101,125,32,123,77,70,115,104,111,119,125,32,105,102,101,108,115,101,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,44,32,112,97,114,97,108,108,101,108,32,116,111,32,97,120,105,115,32,105,110,32,51,68,32,112,108,111,116,115,0,0,101,120,112,101,99,116,105,110,103,32,39,120,39,44,32,39,120,50,39,44,32,39,97,117,116,111,39,32,111,114,32,39,111,102,102,39,0,0,0,0,115,101,116,32,97,110,103,108,101,115,32,37,115,10,0,0,47,77,76,115,104,111,119,32,123,32,99,117,114,114,101,110,116,112,111,105,110,116,32,115,116,114,111,107,101,32,77,10,0,0,0,0,0,0,0,0,32,32,32,32,32,54,32,103,101,116,32,71,115,119,105,100,116,104,32,112,111,112,32,97,100,100,125,32,123,112,111,112,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,102,111,114,97,108,108,125,32,100,101,102,10,0,0,32,123,100,117,112,32,51,32,103,101,116,123,100,117,112,32,100,117,112,32,48,32,103,101,116,32,102,105,110,100,102,111,110,116,32,101,120,99,104,32,49,32,103,101,116,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,0,0,37,50,46,50,115,0,0,0,115,106,105,115,0,0,0,0,47,77,70,119,105,100,116,104,32,123,48,32,101,120,99,104,32,123,32,100,117,112,32,53,32,103,101,116,32,51,32,103,101,32,123,32,53,32,103,101,116,32,51,32,101,113,32,123,32,48,32,125,32,123,32,112,111,112,32,125,32,105,102,101,108,115,101,32,125,10,0,0,84,97,98,117,108,97,114,32,111,117,116,112,117,116,32,111,102,32,37,115,32,112,108,111,116,32,115,116,121,108,101,32,110,111,116,32,102,117,108,108,121,32,105,109,112,108,101,109,101,110,116,101,100,10,0,0,108,97,110,100,0,0,0,0,47,71,115,119,105,100,116,104,32,123,100,117,112,32,116,121,112,101,32,47,115,116,114,105,110,103,116,121,112,101,32,101,113,32,123,115,116,114,105,110,103,119,105,100,116,104,125,32,123,112,111,112,32,40,110,41,32,115,116,114,105,110,103,119,105,100,116,104,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,32,102,111,114,97,108,108,125,32,100,101,102,10,0,32,32,32,32,32,105,102,101,108,115,101,32,125,10,0,0,71,80,86,65,76,95,79,85,84,80,85,84,0,0,0,0,32,32,32,32,32,112,111,112,32,97,108,111,97,100,32,112,111,112,32,77,125,32,105,102,101,108,115,101,32,125,105,102,101,108,115,101,32,125,105,102,101,108,115,101,32,125,10,0,85,110,107,110,111,119,110,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,45,32,110,111,116,32,97,32,112,108,111,116,116,105,110,103,32,100,101,118,105,99,101,0,0,0,32,32,32,32,32,115,104,111,119,32,50,32,105,110,100,101,120,32,123,97,108,111,97,100,32,112,111,112,32,77,32,110,101,103,32,51,32,45,49,32,114,111,108,108,32,110,101,103,32,82,32,112,111,112,32,112,111,112,125,32,123,112,111,112,32,112,111,112,32,112,111,112,10,0,0,0,0,0,0,0,115,117,36,114,102,97,99,101,0,0,0,0,0,0,0,0,101,108,115,101,0,0,0,0,32,32,32,32,32,100,117,112,32,48,32,82,125,32,123,100,117,112,32,54,32,103,101,116,32,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,45,50,32,100,105,118,32,48,32,82,32,54,32,103,101,116,10,0,0,0,0,0,0,44,32,117,115,105,110,103,32,102,111,110,116,32,34,37,115,34,0,0,0,0,0,0,0,97,117,116,111,0,0,0,0,78,111,32,118,97,108,105,100,32,100,97,116,97,32,112,111,105,110,116,115,32,102,111,117,110,100,32,105,110,32,102,105,108,101,0,0,0,0,0,0,115,101,116,32,102,111,114,109,97,116,32,37,115,32,34,37,115,34,10,0,0,0,0,0,32,32,32,32,32,103,101,116,32,49,32,101,113,32,123,100,117,112,32,50,32,103,101,116,32,101,120,99,104,32,100,117,112,32,51,32,103,101,116,32,101,120,99,104,32,54,32,103,101,116,32,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,45,50,32,100,105,118,10,0,0,0,0,0,0,32,32,32,32,32,123,100,117,112,32,51,32,103,101,116,32,123,50,32,103,101,116,32,110,101,103,32,48,32,101,120,99,104,32,82,32,112,111,112,125,32,123,112,111,112,32,97,108,111,97,100,32,112,111,112,32,77,125,32,105,102,101,108,115,101,125,32,123,100,117,112,32,53,10,0,0,0,0,0,0,32,32,32,32,32,103,101,116,32,101,120,99,104,32,52,32,103,101,116,32,123,71,115,104,111,119,125,32,123,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,48,32,82,125,32,105,102,101,108,115,101,32,125,105,102,32,100,117,112,32,53,32,103,101,116,32,48,32,101,113,10,0,0,0,0,10,9,32,32,32,32,83,99,97,110,58,32,0,0,0,0,32,32,32,32,32,91,32,99,117,114,114,101,110,116,112,111,105,110,116,32,93,32,101,120,99,104,32,100,117,112,32,50,32,103,101,116,32,48,32,101,120,99,104,32,82,32,100,117,112,32,53,32,103,101,116,32,50,32,110,101,32,123,100,117,112,32,100,117,112,32,54,10,0,0,0,0,0,0,0,0,32,32,32,32,32,123,100,117,112,32,100,117,112,32,48,32,103,101,116,32,102,105,110,100,102,111,110,116,32,101,120,99,104,32,49,32,103,101,116,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,32,32,32,32,32,123,32,53,32,103,101,116,32,51,32,101,113,32,123,103,115,97,118,101,125,32,123,103,114,101,115,116,111,114,101,125,32,105,102,101,108,115,101,32,125,10,0,0,45,76,73,66,71,68,32,32,0,0,0,0,0,0,0,0,32,32,32,123,32,100,117,112,32,53,32,103,101,116,32,51,32,103,101,10,0,0,0,0,71,80,86,65,76,95,84,69,82,77,79,80,84,73,79,78,83,0,0,0,0,0,0,0,47,77,70,115,104,111,119,32,123,10,0,0,0,0,0,0,123,125,94,95,64,38,126,10,0,0,0,0,0,0,0,0,125,32,105,102,10,0,0,0,115,116,36,121,108,101,0,0,103,115,97,118,101,32,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,67,32,99,108,105,112,112,97,116,104,32,102,105,108,108,32,103,114,101,115,116,111,114,101,0,0,9,37,115,37,115,32,105,115,32,34,37,115,34,44,32,111,102,102,115,101,116,32,97,116,32,0,0,0,0,0,0,0,116,101,120,116,95,108,97,98,101,108,0,0,0,0,0,0,115,101,116,32,100,117,109,109,121,32,37,115,44,37,115,10,0,0,0,0,0,0,0,0,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,67,32,49,46,48,48,48,32,48,32,48,32,37,46,50,102,32,37,46,50,102,32,66,111,120,67,111,108,70,105,108,108,0,0,0,0,0,0,0,0,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,48,32,108,116,32,51,32,49,32,114,111,108,108,32,48,32,108,116,32,101,120,99,104,32,48,32,108,116,32,111,114,32,111,114,32,110,111,116,32,123,0,0,0,0,0,0,0,0,40,37,115,41,32,102,105,110,100,102,111,110,116,32,37,100,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,10,9,32,32,32,32,51,68,32,110,111,114,109,97,108,32,118,101,99,116,111,114,58,32,40,37,102,44,32,37,102,44,32,37,102,41,0,0,0,0,32,32,35,32,40,99,117,114,114,101,110,116,108,121,32,91,0,0,0,0,0,0,0,0,48,32,115,101,116,103,114,97,121,10,110,101,119,112,97,116,104,10,0,0,0,0,0,0,110,111,116,36,105,116,108,101,0,0,0,0,0,0,0,0,57,48,32,114,111,116,97,116,101,10,48,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,0,103,110,117,100,105,99,116,32,98,101,103,105,110,10,103,115,97,118,101,10,100,111,99,108,105,112,10,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,37,46,51,102,32,37,46,51,102,32,115,99,97,108,101,10,0,0,0,0,0,45,0,0,0,0,0,0,0,87,114,105,116,105,110,103,32,111,117,116,32,80,111,115,116,83,99,114,105,112,116,32,109,97,99,114,111,115,32,102,111,114,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,109,111,100,101,10,0,0,0,37,37,37,37,80,97,103,101,58,32,37,100,32,37,100,10,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,37,100,32,37,100,32,78,10,0,0,0,0,0,0,0,0,71,80,95,70,73,82,83,84,95,75,69,89,0,0,0,0,37,100,32,37,100,32,82,10,0,0,0,0,0,0,0,0,108,97,98,101,108,0,0,0,47,121,48,32,121,48,32,121,115,116,101,112,32,97,100,100,32,100,101,102,32,47,105,105,32,105,105,32,49,32,97,100,100,32,100,101,102,10,105,105,32,105,109,97,120,32,103,101,32,123,101,120,105,116,125,32,105,102,32,125,32,108,111,111,112,10,103,114,101,115,116,111,114,101,32,48,32,115,101,116,103,114,97,121,10,0,0,0,120,0,0,0,0,0,0,0,32,107,100,101,110,115,105,116,121,50,100,0,0,0,0,0,37,100,32,37,100,32,77,10,0,0,0,0,0,0,0,0,116,111,107,101,110,95,116,97,98,108,101,95,115,105,122,101,32,62,61,32,108,102,45,62,110,117,109,95,116,111,107,101,110,115,43,49,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,115,112,108,105,110,101,115,44,32,110,101,101,100,32,97,116,32,108,101,97,115,116,32,51,32,112,111,105,110,116,115,0,115,116,114,111,107,101,32,37,100,32,37,100,32,77,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,83,84,82,73,78,71,32,111,112,101,114,97,116,111,114,32,97,112,112,108,105,101,100,32,116,111,32,110,111,110,45,83,84,82,73,78,71,32,116,121,112,101,0,0,0,0,0,37,100,32,37,100,32,86,10,0,0,0,0,0,0,0,0,10,9,32,32,32,32,50,68,32,114,111,116,97,116,105,111,110,32,97,110,103,108,101,58,32,37,102,0,0,0,0,0,37,100,32,37,100,32,76,10,0,0,0,0,0,0,0,0,76,84,37,99,10,0,0,0,41,32,82,115,104,111,119,10,0,0,0,0,0,0,0,0,41,32,67,115,104,111,119,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,0,0,0,0,0,0,41,32,76,115,104,111,119,10,0,0,0,0,0,0,0,0,101,115,116,105,109,97,116,101,32,119,105,100,116,104,32,111,102,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,115,116,114,105,110,103,0,0,93,32,71,82,115,104,111,119,10,0,0,0,0,0,0,0,115,97,36,109,112,108,101,115,0,0,0,0,0,0,0,0,93,32,71,67,115,104,111,119,10,0,0,0,0,0,0,0,110,117,109,101,114,105,99,97,108,0,0,0,0,0,0,0,115,101,116,32,100,103,114,105,100,51,100,32,37,100,44,37,100,32,37,115,37,115,32,37,102,44,37,102,10,0,0,0,93,32,71,76,115,104,111,119,10,0,0,0,0,0,0,0,99,117,114,114,101,110,116,112,111,105,110,116,32,103,115,97,118,101,32,116,114,97,110,115,108,97,116,101,32,37,100,32,114,111,116,97,116,101,32,48,32,48,32,77,10,0,0,0,37,100,32,37,100,32,37,115,10,0,0,0,0,0,0,0,32,40,37,102,44,32,37,102,44,32,37,102,41,0,0,0,97,100,106,117,115,116,105,110,103,32,116,111,32,91,37,103,58,37,103,93,10,0,0,0,80,101,110,116,87,0,0,0,68,105,97,87,0,0,0,0,84,114,105,68,87,0,0,0,84,114,105,85,87,0,0,0,110,101,119,32,108,105,110,101,32,98,117,102,102,101,114,0,67,105,114,99,87,0,0,0,101,115,116,105,109,97,116,101,0,0,0,0,0,0,0,0,66,111,120,87,0,0,0,0,111,98,106,36,101,99,116,0,80,101,110,116,69,0,0,0,108,97,98,36,101,108,115,0,115,101,116,32,100,103,114,105,100,51,100,32,37,100,44,37,100,32,115,112,108,105,110,101,115,10,0,0,0,0,0,0,68,105,97,69,0,0,0,0,84,114,105,68,69,0,0,0,105,115,111,95,56,56,53,57,95,49,0,0,0,0,0,0,84,114,105,85,69,0,0,0,10,9,32,32,32,32,67,101,110,116,101,114,58,0,0,0,67,105,114,99,69,0,0,0,73,109,97,103,101,32,103,114,105,100,32,109,117,115,116,32,98,101,32,97,116,32,108,101,97,115,116,32,52,32,112,111,105,110,116,115,32,40,50,32,120,32,50,41,46,10,10,0,66,111,120,69,0,0,0,0,68,49,53,0,0,0,0,0,68,49,52,0,0,0,0,0,85,110,107,110,111,119,110,32,112,111,105,110,116,32,116,121,112,101,32,105,110,32,112,108,111,116,51,100,95,108,105,110,101,115,0,0,0,0,0,0,79,114,105,103,105,110,95,49,0,0,0,0,0,0,0,0,10,35,32,67,117,114,118,101,32,37,100,32,111,102,32,37,100,44,32,37,100,32,112,111,105,110,116,115,0,0,0,0,68,49,51,0,0,0,0,0,123,125,36,91,93,92,0,0,68,49,50,0,0,0,0,0,112,115,100,105,114,0,0,0,68,49,49,0,0,0,0,0,9,37,115,32,105,115,32,115,101,116,32,116,111,32,37,115,10,0,0,0,0,0,0,0,115,101,112,97,114,97,116,105,111,110,32,109,117,115,116,32,98,101,32,62,32,48,0,0,115,101,116,32,100,103,114,105,100,51,100,32,37,100,44,37,100,44,32,37,100,10,0,0,68,49,48,0,0,0,0,0,76,0,0,0,0,0,0,0,68,57,0,0,0,0,0,0,68,56,0,0,0,0,0,0,10,9,32,32,32,32,79,114,105,103,105,110,58,0,0,0,68,55,0,0,0,0,0,0,68,54,0,0,0,0,0,0,68,53,0,0,0,0,0,0,68,52,0,0,0,0,0,0,68,51,0,0,0,0,0,0,100,117,112,32,100,117,112,32,109,117,108,32,109,117,108,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,109,111,100,101,32,112,97,114,115,105,110,103,32,101,114,114,111,114,0,0,0,0,0,0,0,0,68,50,0,0,0,0,0,0,112,111,108,36,97,114,0,0,68,49,0,0,0,0,0,0,9,114,101,97,100,32,102,111,114,109,97,116,32,102,111,114,32,116,105,109,101,32,111,110,32,37,115,32,97,120,105,115,32,105,115,32,34,37,115,34,10,0,0,0,0,0,0,0,115,101,112,36,97,114,97,116,105,111,110,0,0,0,0,0,121,121,10,0,0,0,0,0,68,48,0,0,0,0,0,0,108,0,0,0,0,0,0,0,83,49,53,0,0,0,0,0,83,49,52,0,0,0,0,0,44,32,100,122,61,37,102,0,83,49,51,0,0,0,0,0,83,49,50,0,0,0,0,0,83,49,49,0,0,0,0,0,83,49,48,0,0,0,0,0,83,57,0,0,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,109,111,100,101,32,112,97,114,115,101,114,32,45,32,105,103,110,111,114,105,110,103,32,115,112,117,114,105,111,117,115,32,125,0,83,56,0,0,0,0,0,0,112,111,105,36,110,116,115,105,122,101,0,0,0,0,0,0,83,55,0,0,0,0,0,0,9,122,101,114,111,32,105,115,32,37,103,10,0,0,0,0,83,54,0,0,0,0,0,0,102,105,110,97,110,99,101,36,98,97,114,115,0,0,0,0,120,120,10,0,0,0,0,0,114,101,115,105,122,101,95,100,121,110,97,114,114,97,121,58,32,100,121,110,97,114,114,97,121,32,119,97,115,110,39,116,32,105,110,105,116,105,97,108,105,122,101,100,33,0,0,0,104,0,0,0,0,0,0,0,83,53,0,0,0,0,0,0,83,52,0,0,0,0,0,0,44,32,100,121,61,37,102,0,83,51,0,0,0,0,0,0,83,50,0,0,0,0,0,0,73,47,79,32,101,114,114,111,114,32,100,117,114,105,110,103,32,117,112,100,97,116,101,0,83,49,0,0,0,0,0,0,83,48,0,0,0,0,0,0,71,80,86,65,76,95,86,73,69,87,95,77,65,80,0,0,67,49,53,0,0,0,0,0,115,118,103,0,0,0,0,0,67,49,52,0,0,0,0,0,112,111,105,110,116,105,110,116,36,101,114,118,97,108,98,111,120,0,0,0,0,0,0,0,67,49,51,0,0,0,0,0,102,105,108,101,116,36,121,112,101,115,0,0,0,0,0,0,99,97,110,100,108,101,36,115,116,105,99,107,115,0,0,0,120,121,10,0,0,0,0,0,67,49,50,0,0,0,0,0,103,0,0,0,0,0,0,0,67,49,49,0,0,0,0,0,67,49,48,0,0,0,0,0,10,9,32,32,32,32,83,97,109,112,108,101,32,112,101,114,105,111,100,115,58,32,100,120,61,37,102,0,0,0,0,0,67,57,0,0,0,0,0,0,67,56,0,0,0,0,0,0,36,96,0,0,0,0,0,0,67,55,0,0,0,0,0,0,121,122,97,102,112,110,117,109,32,107,77,71,84,80,69,90,89,0,0,0,0,0,0,0,67,54,0,0,0,0,0,0,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,71,80,86,65,76,95,83,80,76,79,84,0,0,0,0,0,67,53,0,0,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,112,97,114,115,101,114,32,45,45,32,115,112,117,114,105,111,117,115,32,98,97,99,107,115,108,97,115,104,0,0,0,0,0,0,67,52,0,0,0,0,0,0,99,111,108,111,114,115,0,0,67,51,0,0,0,0,0,0,100,97,116,97,115,36,105,122,101,115,0,0,0,0,0,0,102,114,97,99,116,105,111,110,32,109,117,115,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,49,0,0,0,0,117,110,105,116,115,32,0,0,67,50,0,0,0,0,0,0,101,0,0,0,0,0,0,0,67,49,0,0,0,0,0,0,67,48,0,0,0,0,0,0,97,108,108,32,102,111,114,119,97,114,100,0,0,0,0,0,107,111,105,56,117,0,0,0,80,101,110,116,70,0,0,0,32,32,114,101,100,32,103,114,101,101,110,32,98,108,117,101,32,97,108,112,104,97,0,0,80,101,110,116,0,0,0,0,108,111,114,0,0,0,0,0,68,105,97,70,0,0,0,0,68,105,97,0,0,0,0,0,71,80,86,65,76,95,80,76,79,84,0,0,0,0,0,0,84,114,105,68,70,0,0,0,94,95,64,38,126,123,125,0,84,114,105,68,0,0,0,0,99,111,108,111,114,110,36,97,109,101,115,0,0,0,0,0,105,102,0,0,0,0,0,0,84,114,105,85,70,0,0,0,98,105,110,36,97,114,121,0,102,114,97,99,36,116,105,111,110,0,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,111,117,116,32,111,102,32,114,97,110,103,101,0,32,97,110,103,108,101,32,37,103,32,0,0,0,0,0,0,84,114,105,85,0,0,0,0,98,0,0,0,0,0,0,0,67,105,114,99,108,101,70,0,108,111,119,36,101,114,0,0,67,105,114,99,108,101,0,0,37,115,102,108,105,112,32,122,0,0,0,0,0,0,0,0,66,111,120,70,0,0,0,0,66,111,120,0,0,0,0,0,83,116,97,114,0,0,0,0,45,76,73,66,82,69,65,68,76,73,78,69,32,32,45,72,73,83,84,79,82,89,32,32,0,0,0,0,0,0,0,0,67,114,115,0,0,0,0,0,71,80,86,65,76,95,82,95,76,79,71,0,0,0,0,0])
-.concat([80,108,115,0,0,0,0,0,98,97,100,32,115,121,110,116,97,120,32,105,110,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,115,116,114,105,110,103,0,0,0,0,0,0,80,110,116,0,0,0,0,0,99,111,108,111,114,98,36,111,120,0,0,0,0,0,0,0,103,115,97,118,101,32,91,93,32,48,32,115,101,116,100,97,115,104,10,0,0,0,0,0,9,78,111,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,100,117,114,105,110,103,32,100,97,116,97,32,105,110,112,117,116,10,0,114,97,119,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,32,83,101,101,32,39,104,101,108,112,32,115,101,116,39,46,0,0,0,114,97,110,103,101,0,0,0,115,101,116,32,115,116,121,108,101,32,101,108,108,105,112,115,101,32,115,105,122,101,32,0,47,118,115,104,105,102,116,32,37,100,32,100,101,102,10,0,97,0,0,0,0,0,0,0,47,37,115,32,102,105,110,100,102,111,110,116,32,37,103,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,37,102,0,0,0,0,0,0,109,105,115,115,105,110,103,32,102,105,108,101,110,97,109,101,0,0,0,0,0,0,0,0,37,46,51,102,32,85,80,10,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,34,116,105,116,108,101,34,32,102,111,114,32,112,108,111,116,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,48,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,110,101,119,104,105,115,116,36,111,103,114,97,109,0,0,0,49,32,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,67,111,108,70,105,108,108,10,0,0,0,0,0,0,0,87,65,82,78,73,78,71,58,32,69,114,114,111,114,32,100,117,114,105,110,103,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,10,10,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,50,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,49,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,82,95,77,73,78,0,0,0,0,0,39,59,39,32,101,120,112,101,99,116,101,100,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,112,97,114,115,101,114,32,45,32,115,112,117,114,105,111,117,115,32,125,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,70,105,108,108,10,0,0,0,0,112,97,108,36,101,116,116,101,0,0,0,0,0,0,0,0,98,105,110,100,58,32,99,97,110,110,111,116,32,112,97,114,115,101,32,37,115,10,0,0,10,32,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,116,114,117,101,32,100,101,102,10,0,0,0,0,0,0,0,0,9,68,97,116,97,102,105,108,101,32,112,97,114,115,105,110,103,32,119,105,108,108,32,97,99,99,101,112,116,32,70,111,114,116,114,97,110,32,68,32,111,114,32,81,32,99,111,110,115,116,97,110,116,115,10,0,112,116,0,0,0,0,0,0,121,48,32,48,32,78,32,48,32,49,32,86,32,121,115,116,101,112,32,48,32,86,32,48,32,45,49,32,102,10,0,0,32,10,0,0,0,0,0,0,37,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,67,111,108,70,105,108,108,10,0,0,0,0,67,97,110,110,111,116,32,115,109,111,111,116,104,58,32,110,111,32,100,97,116,97,32,119,105,116,104,105,110,32,102,105,120,101,100,32,120,114,97,110,103,101,33,0,0,0,0,0,37,115,65,108,116,45,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,97,114,103,117,109,101,110,116,32,110,101,105,116,104,101,114,32,73,78,84,32,111,114,32,67,77,80,76,88,0,0,37,100,32,37,100,32,37,100,32,37,100,32,82,101,99,32,102,105,108,108,10,0,0,0,37,46,51,102,32,85,76,10,0,0,0,0,0,0,0,0,37,115,102,108,105,112,32,121,0,0,0,0,0,0,0,0,32,32,105,102,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,88,89,90,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,67,77,89,41,32,101,113,32,123,67,77,89,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,89,73,81,41,32,101,113,32,123,89,73,81,50,82,71,66,125,10,0,105,110,118,101,114,115,101,95,110,111,114,109,97,108,95,102,117,110,99,0,0,0,0,0,47,83,101,108,101,99,116,83,112,97,99,101,32,123,67,111,108,111,114,83,112,97,99,101,32,40,72,83,86,41,32,101,113,32,123,72,83,86,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,88,89,90,41,32,101,113,32,123,10,0,0,0,0,0,0,32,32,101,120,99,104,32,49,46,57,49,32,109,117,108,32,101,120,99,104,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,51,32,49,32,114,111,108,108,125,32,100,101,102,10,0,0,0,0,0,0,0,32,32,45,48,46,57,56,52,52,32,109,117,108,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,53,32,49,32,114,111,108,108,32,45,48,46,50,56,57,49,32,109,117,108,32,101,120,99,104,32,45,48,46,53,51,51,56,32,109,117,108,32,97,100,100,10,0,0,105,115,95,106,117,109,112,40,111,112,101,114,97,116,111,114,41,32,124,124,32,40,106,117,109,112,95,111,102,102,115,101,116,32,61,61,32,49,41,0,78,111,32,102,105,108,108,101,100,32,112,111,108,121,103,111,110,115,0,0,0,0,0,0,32,32,67,111,110,115,116,114,97,105,110,32,52,32,49,32,114,111,108,108,32,51,32,99,111,112,121,32,45,48,46,48,50,55,57,32,109,117,108,32,101,120,99,104,32,49,46,57,57,57,32,109,117,108,32,97,100,100,32,101,120,99,104,10,0,0,0,0,0,0,0,0,112,109,36,51,100,0,0,0,32,32,51,32,99,111,112,121,32,45,48,46,57,48,49,55,32,109,117,108,32,101,120,99,104,32,45,48,46,49,49,56,55,32,109,117,108,32,97,100,100,32,101,120,99,104,32,48,46,48,53,56,53,32,109,117,108,32,101,120,99,104,32,97,100,100,10,0,0,0,0,0,9,67,111,109,109,101,110,116,115,32,99,104,97,114,115,32,97,114,101,32,34,37,115,34,10,0,0,0,0,0,0,0,112,111,105,110,116,36,116,121,112,101,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,99,105,114,99,108,101,32,114,97,100,105,117,115,32,0,0,0,0,0,0,0,0,47,88,89,90,50,82,71,66,32,123,0,0,0,0,0,0,32,32,49,32,101,120,99,104,32,115,117,98,32,101,120,99,104,32,49,32,101,120,99,104,32,115,117,98,32,51,32,50,32,114,111,108,108,32,49,32,101,120,99,104,32,115,117,98,32,51,32,49,32,114,111,108,108,32,101,120,99,104,32,125,32,100,101,102,10,0,0,0,67,116,114,108,45,0,0,0,47,67,77,89,50,82,71,66,32,123,0,0,0,0,0,0,102,108,105,112,32,120,0,0,87,97,114,110,105,110,103,58,32,101,109,112,116,121,32,37,115,32,114,97,110,103,101,32,91,37,103,58,37,103,93,44,32,0,0,0,0,0,0,0,32,32,48,46,54,50,49,32,109,117,108,32,101,120,99,104,32,45,48,46,57,53,54,32,109,117,108,32,97,100,100,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,51,32,49,32,114,111,108,108,32,125,32,100,101,102,10,0,0,0,32,32,51,32,99,111,112,121,32,45,48,46,54,52,55,32,109,117,108,32,101,120,99,104,32,45,48,46,50,55,50,32,109,117,108,32,97,100,100,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,53,32,49,32,114,111,108,108,10,0,32,32,51,32,99,111,112,121,32,45,49,46,55,48,50,32,109,117,108,32,101,120,99,104,32,45,49,46,49,48,53,32,109,117,108,32,97,100,100,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,52,32,49,32,114,111,108,108,10,0,47,89,73,81,50,82,71,66,32,123,10,0,0,0,0,0,107,101,121,32,97,114,114,97,121,0,0,0,0,0,0,0,32,32,100,117,112,32,48,32,108,116,32,123,48,32,101,120,99,104,32,112,111,112,125,123,100,117,112,32,49,32,103,116,32,123,49,32,101,120,99,104,32,112,111,112,125,32,105,102,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,102,105,108,108,101,100,32,112,111,108,121,103,111,110,115,58,0,0,0,0,0,0,0,0,47,67,111,110,115,116,114,97,105,110,32,123,10,0,0,0,112,97,36,114,97,109,101,116,114,105,99,0,0,0,0,0,32,32,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,0,0,99,111,109,36,109,101,110,116,115,0,0,0,0,0,0,0,111,117,116,36,108,105,101,114,115,0,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,114,101,99,116,97,110,103,108,101,32,37,115,32,102,99,32,0,0,0,0,0,0,9,32,123,72,83,86,118,32,72,83,86,112,32,72,83,86,113,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,96,37,115,58,37,100,32,111,111,112,115,46,39,10,0,0,9,32,123,51,32,72,83,86,105,32,101,113,32,123,72,83,86,112,32,72,83,86,113,32,72,83,86,118,125,123,52,32,72,83,86,105,32,101,113,32,123,72,83,86,116,32,72,83,86,112,32,72,83,86,118,125,10,0,0,0,0,0,0,0,9,32,123,49,32,72,83,86,105,32,101,113,32,123,72,83,86,113,32,72,83,86,118,32,72,83,86,112,125,123,50,32,72,83,86,105,32,101,113,32,123,72,83,86,112,32,72,83,86,118,32,72,83,86,116,125,10,0,0,0,0,0,0,0,10,9,32,32,32,32,68,105,114,101,99,116,105,111,110,58,32,0,0,0,0,0,0,0,9,32,47,72,83,86,105,32,72,83,86,105,32,54,32,109,111,100,32,100,101,102,32,48,32,72,83,86,105,32,101,113,32,123,72,83,86,118,32,72,83,86,116,32,72,83,86,112,125,10,0,0,0,0,0,0,78,111,32,112,111,105,110,116,115,32,40,118,105,115,105,98,108,101,32,111,114,32,105,110,118,105,115,105,98,108,101,41,32,116,111,32,112,108,111,116,46,10,10,0,0,0,0,0,9,32,47,72,83,86,116,32,72,83,86,118,32,49,46,48,32,72,83,86,115,32,49,46,48,32,72,83,86,102,32,115,117,98,32,109,117,108,32,115,117,98,32,109,117,108,32,100,101,102,10,0,0,0,0,0,9,32,47,72,83,86,113,32,72,83,86,118,32,49,46,48,32,72,83,86,115,32,72,83,86,102,32,109,117,108,32,115,117,98,32,109,117,108,32,100,101,102,32,10,0,0,0,0,32,32,32,32,47,72,83,86,102,32,101,120,99,104,32,100,101,102,32,47,72,83,86,105,32,101,120,99,104,32,99,118,105,32,100,101,102,32,47,72,83,86,112,32,72,83,86,118,32,49,46,48,32,72,83,86,115,32,115,117,98,32,109,117,108,32,100,101,102,10,0,0,103,114,97,112,104,98,111,120,0,0,0,0,0,0,0,0,32,32,123,32,47,72,83,86,115,32,101,120,99,104,32,100,101,102,32,47,72,83,86,118,32,101,120,99,104,32,100,101,102,32,54,46,48,32,109,117,108,32,100,117,112,32,102,108,111,111,114,32,100,117,112,32,51,32,49,32,114,111,108,108,32,115,117,98,10,32,0,0,66,121,116,101,79,114,100,101,114,0,0,0,0,0,0,0,110,111,110,45,105,110,116,101,103,101,114,32,112,97,115,115,101,100,32,116,111,32,98,111,111,108,101,97,110,32,111,112,101,114,97,116,111,114,0,0,37,50,100,0,0,0,0,0,32,32,101,120,99,104,32,100,117,112,32,48,46,48,32,101,113,32,123,112,111,112,32,101,120,99,104,32,112,111,112,32,100,117,112,32,100,117,112,125,32,37,32,97,99,104,114,111,109,97,116,105,99,32,103,114,97,121,10,0,0,0,0,0,111,36,117,116,112,117,116,0,47,72,83,86,50,82,71,66,32,123,0,0,0,0,0,0,9,100,97,116,97,102,105,108,101,32,102,105,101,108,100,115,32,115,101,112,97,114,97,116,101,100,32,98,121,32,119,104,105,116,101,115,112,97,99,101,10,0,0,0,0,0,0,0,110,111,111,117,116,36,108,105,101,114,115,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,102,105,108,108,32,0,47,99,70,37,105,32,123,37,115,125,32,98,105,110,100,32,100,101,102,9,37,37,32,37,115,10,0,0,0,0,0,0,32,32,32,32,123,47,100,103,100,120,118,97,108,32,100,103,100,120,32,100,101,102,32,114,101,100,118,97,108,117,101,32,103,114,101,101,110,118,97,108,117,101,32,98,108,117,101,118,97,108,117,101,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,32,32,123,82,101,100,65,32,103,105,100,120,32,103,101,116,32,71,114,101,101,110,65,32,103,105,100,120,32,103,101,116,32,66,108,117,101,65,32,103,105,100,120,32,103,101,116,125,10,0,0,0,0,0,32,32,103,114,97,121,105,110,100,101,120,32,103,114,97,121,118,32,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,97,98,115,32,49,101,45,53,32,108,101,10,0,0,0,0,0,0,0,47,105,110,116,101,114,112,111,108,97,116,101,32,123,10,0,32,32,66,108,117,101,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,103,100,120,118,97,108,32,109,117,108,32,97,100,100,125,32,100,101,102,10,0,0,0,0,0,0,47,98,108,117,101,118,97,108,117,101,32,123,66,108,117,101,65,32,103,105,100,120,32,103,101,116,32,66,108,117,101,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,0,0,0,0,0,32,32,71,114,101,101,110,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,103,100,120,118,97,108,32,109,117,108,32,97,100,100,125,32,100,101,102,10,0,0,0,0,0,115,116,97,99,107,32,111,118,101,114,102,108,111,119,0,0,120,94,50,0,0,0,0,0,112,97,116,116,101,114,110,32,102,105,108,108,0,0,0,0,47,103,114,101,101,110,118,97,108,117,101,32,123,71,114,101,101,110,65,32,103,105,100,120,32,103,101,116,32,71,114,101,101,110,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,0,0,111,114,36,105,103,105,110,0,32,32,82,101,100,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,103,100,120,118,97,108,32,109,117,108,32,97,100,100,125,32,100,101,102,10,0,0,0,0,0,0,0,9,100,97,116,97,102,105,108,101,32,102,105,101,108,100,115,32,115,101,112,97,114,97,116,101,100,32,98,121,32,34,37,99,34,10,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,100,97,116,97,39,44,32,39,102,117,110,99,116,105,111,110,39,44,32,39,108,105,110,101,39,44,32,39,102,105,108,108,39,44,32,39,114,101,99,116,97,110,103,108,101,39,44,32,39,99,105,114,99,108,101,39,44,32,39,101,108,108,105,112,115,101,39,32,111,114,32,39,97,114,114,111,119,39,0,0,0,0,0,0,0,47,114,101,100,118,97,108,117,101,32,123,82,101,100,65,32,103,105,100,120,32,103,101,116,32,82,101,100,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,96,37,115,39,10,0,0,0,32,32,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,105,118,125,32,100,101,102,32,10,0,47,100,103,100,120,32,123,103,114,97,121,118,32,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,71,114,97,121,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,32,32,123,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,103,114,97,121,118,32,103,101,32,123,101,120,105,116,125,32,105,102,32,47,103,105,100,120,32,103,105,100,120,32,49,32,97,100,100,32,100,101,102,125,32,108,111,111,112,125,32,100,101,102,10,0,0,0,47,103,114,97,121,105,110,100,101,120,32,123,47,103,105,100,120,32,48,32,100,101,102,10,0,0,0,0,0,0,0,0,93,32,100,101,102,10,0,0,47,37,115,32,91,0,0,0,66,108,117,101,65,0,0,0,78,111,110,45,110,117,109,101,114,105,99,32,115,116,114,105,110,103,32,102,111,117,110,100,32,119,104,101,114,101,32,97,32,110,117,109,101,114,105,99,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,116,97,103,32,109,117,115,116,32,98,101,32,62,32,122,101,114,111,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,0,0,0,0,0,0,0,71,114,101,101,110,65,0,0,111,102,36,102,115,101,116,115,0,0,0,0,0,0,0,0,82,101,100,65,0,0,0,0,115,101,112,36,97,114,97,116,111,114,0,0,0,0,0,0,117,36,115,101,114,115,116,121,108,101,115,0,0,0,0,0,71,114,97,121,65,0,0,0,37,99,32,0,0,0,0,0,32,100,101,102,10,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,46,32,87,105,108,108,32,98,101,32,82,71,66,10,0,0,0,0,0,10,9,32,32,32,32,71,101,110,101,114,97,116,101,32,99,111,111,114,100,105,110,97,116,101,115,58,32,37,115,0,0,40,88,89,90,41,0,0,0,40,89,73,81,41,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,45,49,53,46,49,53,115,32,32,32,37,115,0,0,0,0,0,0,0,0,40,67,77,89,41,0,0,0,40,72,83,86,41,0,0,0,40,82,71,66,41,0,0,0,115,116,97,99,107,32,117,110,100,101,114,102,108,111,119,32,40,102,117,110,99,116,105,111,110,32,99,97,108,108,32,119,105,116,104,32,109,105,115,115,105,110,103,32,112,97,114,97,109,101,116,101,114,115,63,41,0,0,0,0,0,0,0,0,32,32,108,119,32,37,49,100,37,99,0,0,0,0,0,0,47,67,111,108,111,114,83,112,97,99,101,32,0,0,0,0,120,37,100,0,0,0,0,0,110,111,109,99,98,116,36,105,99,115,0,0,0,0,0,0,32,32,47,103,32,123,115,116,114,111,107,101,32,112,109,51,100,114,111,117,110,100,32,112,109,51,100,71,97,109,109,97,32,101,120,112,32,115,101,116,103,114,97,121,125,32,98,105,110,100,32,100,101,102,10,0,9,34,37,115,34,32,105,110,32,100,97,116,97,102,105,108,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,109,105,115,115,105,110,103,32,118,97,108,117,101,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,117,110,105,116,115,32,123,120,121,124,120,120,124,121,121,125,39,44,32,39,97,110,103,108,101,32,60,110,117,109,98,101,114,62,39,32,111,114,32,39,115,105,122,101,32,60,112,111,115,105,116,105,111,110,62,39,0,0,0,0,0,115,101,116,32,98,111,120,119,105,100,116,104,32,37,103,32,37,115,10,0,0,0,0,0,125,123,10,0,0,0,0,0,32,37,45,49,50,115,32,0,32,32,125,32,105,102,101,108,115,101,10,0,0,0,0,0,10,32,32,32,32,32,32,32,83,101,108,101,99,116,83,112,97,99,101,32,115,101,116,114,103,98,99,111,108,111,114,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,103,112,95,105,110,112,117,116,95,108,105,110,101,0,0,0,99,70,37,105,32,67,111,110,115,116,114,97,105,110,32,0,99,70,37,105,32,67,111,110,115,116,114,97,105,110,32,101,120,99,104,32,0,0,0,0,36,40,0,0,0,0,0,0,99,70,37,105,32,67,111,110,115,116,114,97,105,110,32,101,120,99,104,32,100,117,112,32,0,0,0,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,99,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,115,0,0,0,49,32,101,120,99,104,32,115,117,98,32,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,100,97,116,97,39,44,32,39,102,117,110,99,116,105,111,110,39,44,32,39,108,105,110,101,39,44,32,39,102,105,108,108,39,32,111,114,32,39,97,114,114,111,119,39,0,112,109,0,0,0,0,0,0,32,32,47,103,32,123,115,116,114,111,107,101,32,112,109,51,100,114,111,117,110,100,32,100,117,112,32,0,0,0,0,0,10,119,97,114,110,105,110,103,58,32,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,115,116,97,99,107,32,110,111,116,32,101,109,112,116,121,33,10,32,32,32,32,32,32,32,32,32,32,40,102,117,110,99,116,105,111,110,32,99,97,108,108,101,100,32,119,105,116,104,32,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101,114,115,63,41,10,0,0,0,0,0,0,37,100,0,0,0,0,0,0,32,32,125,123,10,0,0,0,73,110,102,0,0,0,0,0,109,99,98,116,36,105,99,115,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,83,101,108,101,99,116,83,112,97,99,101,32,115,101,116,114,103,98,99,111,108,111,114,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,9,78,111,32,109,105,115,115,105,110,103,32,100,97,116,97,32,115,116,114,105,110,103,32,115,101,116,32,102,111,114,32,100,97,116,97,102,105,108,101,10,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,120,121,39,44,32,39,120,120,39,32,111,114,32,39,121,121,39,0,0,0,0,115,101,116,32,98,111,120,119,105,100,116,104,10,0,0,0,32,32,32,32,47,103,32,123,115,116,114,111,107,101,32,112,109,51,100,114,111,117,110,100,32,47,103,114,97,121,118,32,101,120,99,104,32,100,101,102,32,105,110,116,101,114,112,111,108,97,116,101,10,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,105,110,100,105,99,97,116,101,115,32,116,104,105,115,32,107,101,121,32,105,115,32,97,99,116,105,118,101,32,102,114,111,109,32,97,108,108,32,112,108,111,116,32,119,105,110,100,111,119,115,10,0,0,0,0,0,32,32,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,123,32,37,37,32,73,110,116,101,114,112,111,108,97,116,105,111,110,32,118,115,46,32,82,71,66,45,70,111,114,109,117,108,97,10,0,67,111,108,111,114,32,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,111,114,32,123,32,37,32,67,79,76,79,85,82,32,118,115,46,32,71,82,65,89,32,109,97,112,10,0,0,0,0,0,101,10,0,0,0,0,0,0,107,111,105,56,114,0,0,0,102,97,108,115,101,32,123,32,37,32,67,79,76,79,85,82,32,118,115,46,32,71,82,65,89,32,109,97,112,10,0,0,32,32,112,105,120,101,108,0,47,112,109,51,100,71,97,109,109,97,32,49,46,48,32,37,103,32,71,97,109,109,97,32,109,117,108,32,100,105,118,32,100,101,102,10,0,0,0,0,117,109,105,110,117,115,0,0,9,123,112,111,112,32,49,125,32,123,109,97,120,99,111,108,111,114,115,32,109,117,108,32,102,108,111,111,114,32,109,97,120,99,111,108,111,114,115,32,49,32,115,117,98,32,100,105,118,125,32,105,102,101,108,115,101,125,32,105,102,125,32,100,101,102,10,0,0,0,0,0,47,112,109,51,100,114,111,117,110,100,32,123,109,97,120,99,111,108,111,114,115,32,48,32,103,116,32,123,100,117,112,32,49,32,103,101,10,0,0,0,46,46,47,116,101,114,109,47,112,111,115,116,46,116,114,109,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,97,110,103,108,101,40,41,0,115,104,111,119,32,116,105,99,115,99,97,108,101,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,32,39,37,99,39,10,0,0,0,110,111,109,122,116,36,105,99,115,0,0,0,0,0,0,0,9,32,32,32,32,68,105,109,101,110,115,105,111,110,58,32,0,0,0,0,0,0,0,0,104,105,36,115,116,111,114,121,0,0,0,0,0,0,0,0,47,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,116,114,117,101,32,100,101,102,10,0,0,0,0,109,105,115,115,36,105,110,103,0,0,0,0,0,0,0,0,121,121,0,0,0,0,0,0,47,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,102,97,108,115,101,32,100,101,102,10,0,0,0,37,48,46,52,102,9,37,48,46,52,102,10,0,0,0,0,99,108,111,115,101,32,116,104,105,115,32,112,108,111,116,32,119,105,110,100,111,119,0,0,47,109,97,120,99,111,108,111,114,115,32,37,105,32,100,101,102,10,0,0,0,0,0,0,103,115,97,118,101,32,37,32,99,111,108,111,117,114,32,112,97,108,101,116,116,101,32,98,101,103,105,110,10,0,0,0,37,115,32,104,97,115,32,37,115,32,99,111,111,114,100,32,111,102,32,37,103,59,32,109,117,115,116,32,98,101,32,97,98,111,118,101,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,33,0,0,0,103,114,101,115,116,111,114,101,32,37,32,99,111,108,111,117,114,32,112,97,108,101,116,116,101,32,101,110,100,10,0,0,37,115,32,103,32,0,0,0,49,32,103,32,0,0,0,0,45,82,69,65,68,76,73,78,69,32,32,0,0,0,0,0,48,32,103,32,0,0,0,0,37,51,46,50,102,32,37,51,46,50,102,32,37,51,46,50,102,32,67,32,0,0,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,109,97,103,110,105,116,117,100,101,40,41,0,0,0,0,0,99,97,110,39,116,32,114,111,116,97,116,101,32,116,101,120,116,0,0,0,0,0,0,0,76,67,37,49,99,32,115,101,116,114,103,98,99,111,108,111,114,10,0,0,0,0,0,0,105,110,118,97,108,105,100,32,99,111,109,112,108,101,120,32,99,111,110,115,116,97,110,116,0,0,0,0,0,0,0,0,109,122,116,36,105,99,115,0,10,9,32,32,82,101,99,111,114,100,32,37,100,58,10,0,80,76,32,0,0,0,0,0,9,109,111,117,115,101,32,105,115,32,111,102,102,10,0,0,101,120,112,101,99,116,105,110,103,32,100,97,116,97,102,105,108,101,32,109,111,100,105,102,105,101,114,0,0,0,0,0,112,110,103,0,0,0,0,0,120,120,0,0,0,0,0,0,115,101,116,32,37,115,100,97,116,97,32,37,115,10,0,0,32,80,97,116,116,101,114,110,37,100,32,102,105,108,108,32,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,113,0,0,0,0,0,0,0,32,37,46,49,102,32,80,111,108,121,70,105,108,108,10,0,32,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,116,114,117,101,32,100,101,102,10,0,32,37,46,50,102,32,80,111,108,121,70,105,108,108,10,0,32,49,32,80,111,108,121,70,105,108,108,10,0,0,0,0,32,37,105,32,37,105,32,76,0,0,0,0,0,0,0,0,10,84,101,114,109,105,110,97,108,32,116,121,112,101,32,115,101,116,32,116,111,32,39,37,115,39,10,0,0,0,0,0,32,37,105,32,37,105,32,86,0,0,0,0,0,0,0,0,103,115,97,118,101,32,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,105,109,97,103,40,41,0,0,32,114,111,116,97,116,101,100,32,98,121,32,45,52,53,32,100,101,103,0,0,0,0,0,32,37,105,32,37,105,32,37,105,32,37,105,32,37,105,32,37,105,32,104,10,0,0,0,110,111,109,121,50,116,36,105,99,115,0,0,0,0,0,0,10,9,32,32,68,101,102,97,117,108,116,32,98,105,110,97,114,121,32,102,111,114,109,97,116,58,32,37,115,0,0,0,99,116,114,108,45,0,0,0,37,105,32,37,105,32,78,0,110,111,116,32,0,0,0,0,42,114,101,116,117,114,110,95,110,117,109,95,98,121,116,101,115,32,60,61,32,109,97,120,95,101,110,99,111,100,101,100,95,98,121,116,101,115,0,0,117,110,105,116,36,115,0,0,48,32,121,48,32,78,32,49,32,48,32,86,32,48,32,121,115,116,101,112,32,86,32,45,49,32,48,32,102,10,0,0,115,101,116,32,116,105,109,101,102,109,116,32,37,115,32,34,37,115,34,10,0,0,0,0,112,100,112,32,40,109,105,100,100,108,101,41,0,0,0,0,85,110,101,120,112,101,99,116,101,100,32,125,0,0,0,0,102,105,118,101,95,100,105,97,103,32,104,101,108,112,32,118,97,114,115,0,0,0,0,0,32,37,45,49,50,115,32,42,32,37,115,10,0,0,0,0,126,62,0,0,0,0,0,0,115,116,114,95,99,111,110,115,116,0,0,0,0,0,0,0,37,49,120,0,0,0,0,0,44,32,39,45,39,32,119,32,108,32,116,105,116,108,101,32,39,78,84,83,67,39,32,108,116,32,45,49,0,0,0,0,101,110,99,111,100,101,100,32,105,109,97,103,101,0,0,0,37,115,105,109,97,103,101,10,0,0,0,0,0,0,0,0,37,115,102,97,108,115,101,32,51,10,37,115,99,111,108,111,114,105,109,97,103,101,10,0,32,32,99,117,114,114,101,110,116,102,105,108,101,32,47,65,83,67,73,73,56,53,68,101,99,111,100,101,32,102,105,108,116,101,114,10,0,0,0,0,68,105,100,32,121,111,117,32,116,114,121,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,102,105,108,101,32,110,97,109,101,32,117,115,105,110,103,32,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,120,32,111,114,32,121,63,0,0,0,0,0,0,0,0,32,114,111,116,97,116,101,100,32,98,121,32,43,52,53,32,100,101,103,0,0,0,0,0,123,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,104,101,120,115,116,114,105,110,103,32,112,111,112,125,10,0,0,0,0,0,0,0,109,121,50,116,36,105,99,115,0,0,0,0,0,0,0,0,10,9,32,32,70,105,108,101,32,69,110,100,105,97,110,110,101,115,115,58,32,37,115,0,47,105,109,97,103,101,98,117,102,32,37,100,32,115,116,114,105,110,103,32,100,101,102,10,0,0,0,0,0,0,0,0,9,99,111,109,109,117,110,105,99,97,116,105,111,110,32,99,111,109,109,97,110,100,115,32,119,105,108,108,32,37,115,98,101,32,115,104,111,119,110,10,0,0,0,0,0,0,0,0,97,110,103,36,108,101,0,0,58,32,0,0,0,0,0,0,117,110,115,101,116,32,98,111,114,100,101,114,10,0,0,0,37,115,91,32,37,100,32,48,32,48,32,37,100,32,48,32,48,32,93,10,0,0,0,0,114,97,105,115,101,32,103,110,117,112,108,111,116,32,99,111,110,115,111,108,101,32,119,105,110,100,111,119,0,0,0,0,37,115,37,100,32,37,100,32,37,100,10,0,0,0,0,0,37,115,37,100,32,37,100,32,115,99,97,108,101,10,0,0,98,108,117,101,39,119,32,108,32,108,116,32,51,32,108,99,32,114,103,98,32,39,98,108,117,101,39,0,0,0,0,0,121,0,0,0,0,0,0,0,37,115,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,37,115,123,112,109,51,100,71,97,109,109,97,32,101,120,112,125,32,115,101,116,116,114,97,110,115,102,101,114,10,0,0,9,32,32,87,105,108,108,32,37,115,117,115,101,32,111,116,104,101,114,32,100,105,97,103,111,110,97,108,32,105,102,32,105,116,32,103,105,118,101,115,32,97,32,108,101,115,115,32,106,97,103,103,121,32,111,117,116,108,105,110,101,10,9,32,32,87,105,108,108,32,37,115,100,114,97,119,32,100,105,97,103,111,110,97,108,32,118,105,115,105,98,108,121,32,105,102,32,113,117,97,100,114,97,110,103,108,101,32,105,115,32,39,98,101,110,116,32,111,118,101,114,39,10,0,0,0,0,0,37,115,103,115,97,118,101,10,0,0,0,0,0,0,0,0,37,37,37,37,69,110,100,73,109,97,103,101,10,0,0,0,99,111,110,116,111,117,114,32,101,100,103,101,0,0,0,0,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,101,110,99,111,117,110,116,101,114,101,100,32,97,32,115,116,114,105,110,103,32,119,104,101,110,32,101,120,112,101,99,116,105,110,103,32,97,32,110,117,109,98,101,114,0,0,0,0,114,111,116,97,116,101,100,32,99,101,43,110,116,114,101,100,32,116,101,120,116,0,0,0,10,73,110,116,101,114,112,114,101,116,76,101,118,101,108,49,32,110,111,116,32,123,10,32,32,103,114,101,115,116,111,114,101,10,125,32,105,102,10,0,110,111,109,121,116,36,105,99,115,0,0,0,0,0,0,0,10,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,9,122,111,111,109,106,117,109,112,32,105,115,32,37,115,10,0,0,0,0,0,0,0,0,115,101,116,32,98,111,114,100,101,114,32,37,100,32,37,115,0,0,0,0,0,0,0,0,32,32,47,73,110,116,101,114,112,111,108,97,116,101,32,102,97,108,115,101,10,62,62,10,105,109,97,103,101,10,0,0,83,112,97,99,101,0,0,0,32,32,47,77,117,108,116,105,112,108,101,68,97,116,97,83,111,117,114,99,101,115,32,102,97,108,115,101,10,0,0,0,32,32,47,68,97,116,97,83,111,117,114,99,101,32,99,117,114,114,101,110,116,102,105,108,101,32,47,65,83,67,73,73,56,53,68,101,99,111,100,101,32,102,105,108,116,101,114,10,0,0,0,0,0,0,0,0,103,114,101,101,110,39,119,32,108,32,108,116,32,50,32,108,99,32,114,103,98,32,39,103,114,101,101,110,39,0,0,0,32,32,47,68,97,116,97,83,111,117,114,99,101,32,123,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,104,101,120,115,116,114,105,110,103,32,112,111,112,125,10,0,112,118,101,114,116,0,0,0,32,32,47,68,101,99,111,100,101,32,91,32,48,32,37,100,32,93,10,0,0,0,0,0,32,32,47,66,105,116,115,80,101,114,67,111,109,112,111,110,101,110,116,32,37,100,10,32,32,47,73,109,97,103,101,77,97,116,114,105,120,32,91,32,37,100,32,48,32,48,32,37,100,32,48,32,48,32,93,10,0,0,0,0,0,0,0,0,32,61,9,10,0,0,0,0,60,60,10,32,32,47,73,109,97,103,101,84,121,112,101,32,49,10,32,32,47,87,105,100,116,104,32,37,100,10,32,32,47,72,101,105,103,104,116,32,37,100,10,0,0,0,0,0,115,116,0,0,0,0,0,0,37,37,37,37,69,110,100,80,97,108,101,116,116,101,10,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,114,101,97,108,40,41,0,0,10,32,32,62,10,93,32,115,101,116,99,111,108,111,114,115,112,97,99,101,10,0,0,0,114,105,103,104,116,32,106,117,115,116,105,102,105,101,100,0,68,97,116,97,84,121,112,101,0,0,0,0,0,0,0,0,109,121,116,36,105,99,115,0,32,37,50,46,50,120,37,50,46,50,120,37,50,46,50,120,0,0,0,0,0,0,0,0,9,66,117,116,116,111,110,32,50,32,100,114,97,119,115,32,116,101,109,112,111,114,97,114,121,32,108,97,98,101,108,115,10,0,0,0,0,0,0,0,114,36,97,100,105,117,115,0,117,110,0,0,0,0,0,0,91,32,47,73,110,100,101,120,101,100,10,32,32,47,68,101,118,105,99,101,82,71,66,32,37,100,10,32,32,60,0,0,32,37,45,49,50,115,32,32,32,37,115,10,0,0,0,0,37,37,37,37,66,101,103,105,110,80,97,108,101,116,116,101,10,0,0,0,0,0,0,0,37,100,32,37,100,32,115,99,97,108,101,10,0,0,0,0,114,101,100,39,119,32,108,32,108,116,32,49,32,108,99,32,114,103,98,32,39,114,101,100,39,0,0,0,0,0,0,0,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,0,0,103,115,97,118,101,10,0,0,125,32,123,10,0,0,0,0,67,111,117,108,100,32,110,111,116,32,114,101,110,97,109,101,32,102,105,108,101,32,37,115,32,116,111,32,37,115,0,0,32,32,52,48,32,45,49,49,48,32,82,10,32,32,40,80,83,32,108,101,118,101,108,32,50,32,105,109,97,103,101,41,32,76,115,104,111,119,10,32,32,37,37,32,82,101,97,100,32,100,97,116,97,32,98,117,116,32,105,103,110,111,114,101,32,105,116,10,32,32,47,105,109,97,103,101,98,117,102,32,37,100,32,115,116,114,105,110,103,32,100,101,102,10,32,32,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,115,116,114,105,110,103,10,0,0,0,0,0,0,0,0,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,0,105,115,111,32,99,117,114,118,101,0,0,0,0,0,0,0,118,97,108,117,101,0,0,0,100,117,112,32,109,117,108,0,99,101,110,116,114,101,43,100,32,116,101,120,116,0,0,0,32,32,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,115,116,114,105,110,103,10,125,32,123,10,0,0,110,111,109,120,50,116,36,105,99,115,0,0,0,0,0,0,10,9,32,32,70,105,108,101,32,84,121,112,101,58,32,0,32,32,47,105,109,97,103,101,98,117,102,32,37,100,32,115,116,114,105,110,103,32,100,101,102,10,0,0,0,0,0,0,9,66,117,116,116,111,110,32,50,32,100,114,97,119,115,32,112,101,114,115,105,115,116,101,110,116,32,108,97,98,101,108,115,32,119,105,116,104,32,111,112,116,105,111,110,115,32,34,37,115,34,10,0,0,0,0,115,116,121,108,101,32,110,111,116,32,117,115,97,98,108,101,32,102,111,114,32,102,117,110,99,116,105,111,110,32,112,108,111,116,115,44,32,108,101,102,116,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,37,115,115,101,116,32,99,108,105,112,32,112,111,105,110,116,115,10,37,115,115,101,116,32,99,108,105,112,32,111,110,101,10,37,115,115,101,116,32,99,108,105,112,32,116,119,111,10,115,101,116,32,98,97,114,32,37,102,32,37,115,10,0,0,32,32,52,48,32,45,49,49,48,32,82,10,32,32,40,80,83,32,108,101,118,101,108,32,50,32,105,109,97,103,101,41,32,76,115,104,111,119,10,32,32,37,32,82,101,97,100,32,100,97,116,97,32,98,117,116,32,105,103,110,111,114,101,32,105,116,10,0,0,0,0,0,101,120,112,97,110,100,105,110,103,32,99,117,114,118,101,32,112,111,105,110,116,115,0,0,122,111,111,109,32,111,117,116,32,111,110,108,121,32,116,104,101,32,88,32,97,120,105,115,46,0,0,0,0,0,0,0,32,32,37,100,32,37,100,32,76,10,0,0,0,0,0,0,32,32,48,32,37,100,32,86,10,0,0,0,0,0,0,0,39,45,39,116,105,116,39,0,32,32,37,100,32,48,32,86,10,0,0,0,0,0,0,0,32,32,37,100,32,37,100,32,77,10,0,0,0,0,0,0,45,45,118,101,114,115,105,111,110,0,0,0,0,0,0,0,73,110,116,101,114,112,114,101,116,76,101,118,101,108,49,32,123,10,32,32,37,37,32,67,111,110,115,116,114,117,99,116,32,97,32,98,111,120,32,105,110,115,116,101,97,100,32,111,102,32,105,109,97,103,101,10,32,32,76,84,98,10,0,0,46,111,108,100,0,0,0,0,103,115,97,118,101,32,37,100,32,37,100,32,78,32,37,100,32,37,100,32,76,32,37,100,32,37,100,32,76,32,37,100,32,37,100,32,76,32,90,32,99,108,105,112,10,0,0,0,37,37,37,37,66,101,103,105,110,73,109,97,103,101,10,0,101,120,105,115,116,115,0,0,108,101,102,116,32,106,117,115,116,105,102,105,101,100,0,0,71,78,85,80,76,79,84,32,40,112,111,115,116,46,116,114,109,41,58,32,32,67,111,109,112,111,110,101,110,116,32,98,105,116,115,32,40,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,46,10,0,109,120,50,116,36,105,99,115,0,0,0,0,0,0,0,0,9,68,101,102,97,117,108,116,32,98,105,110,97,114,121,32,100,97,116,97,32,102,105,108,101,32,115,101,116,116,105,110,103,115,32,40,105,110,45,102,105,108,101,32,115,101,116,116,105,110,103,115,32,109,97,121,32,111,118,101,114,114,105,100,101,41,58,10,0,0,0,0,47,37,115,32,37,115,0,0,9,97,108,116,101,114,110,97,116,105,118,101,32,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,50,32,105,115,32,39,37,115,39,10,0,0,0,0,0,0,0,99,97,110,110,111,116,32,111,112,101,110,32,116,97,98,108,101,32,111,117,116,112,117,116,32,102,105,108,101,0,0,0,35,32,115,101,116,32,116,101,114,109,105,110,97,108,32,117,110,107,110,111,119,110,10,0,114,101,101,110,99,111,100,101,75,79,73,56,85,32,100,101,102,10,0,0,0,0,0,0,60,115,104,105,102,116,45,99,111,110,116,114,111,108,45,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,49,50,53,49,32,100,101,102,10,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,49,50,53,48,32,100,101,102,10,0,0,0,0,0,114,101,101,110,99,111,100,101,75,79,73,56,82,32,100,101,102,10,0,0,0,0,0,0,99,111,110,115,116,97,110,116,32,101,120,112,114,101,115,115,105,111,110,32,114,101,113,117,105,114,101,100,0,0,0,0,114,101,101,110,99,111,100,101,67,80,56,53,50,32,100,101,102,10,0,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,56,53,48,32,100,101,102,10,0,0,0,0,0,0,70,73,84,95,76,73,77,73,84,0,0,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,52,51,55,32,100,101,102,10,0,0,0,0,0,0,118,101,99,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,49,53,32,100,101,102,10,0,0,0,0,0,0,101,120,105,115,116,0,0,0])
-.concat([115,101,116,32,116,101,114,109,111,112,116,32,110,111,101,110,104,0,0,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,57,32,100,101,102,10,0,0,0,0,0,0,0,110,111,109,120,116,36,105,99,115,0,0,0,0,0,0,0,100,97,116,97,102,105,108,101,32,99,111,108,117,109,110,115,32,98,105,110,97,114,121,32,105,110,102,111,114,109,97,116,105,111,110,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,50,32,100,101,102,10,0,0,0,0,0,0,0,9,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,50,32,105,115,32,37,100,10,0,0,0,0,0,35,32,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,114,101,101,110,99,111,100,101,73,83,79,32,100,101,102,10,0,0,0,0,0,0,0,0,122,111,111,109,32,105,110,32,111,110,108,121,32,116,104,101,32,88,32,97,120,105,115,46,0,0,0,0,0,0,0,0,80,111,115,116,83,99,114,105,112,116,32,70,111,110,116,32,114,101,99,111,114,100,0,0,123,125,91,93,40,41,32,0,99,97,110,110,111,116,32,119,114,105,116,101,32,116,101,109,112,111,114,97,114,121,32,102,105,108,101,0,0,0,0,0,83,121,109,98,111,108,45,79,98,108,105,113,117,101,0,0,37,115,40,0,0,0,0,0,71,78,85,80,76,79,84,95,70,79,78,84,80,65,84,72,0,0,0,0,0,0,0,0,91,40,37,115,41,32,37,46,49,102,32,37,46,49,102,32,37,115,32,37,115,32,37,100,32,0,0,0,0,0,0,0,70,73,84,95,77,65,88,73,84,69,82,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,83,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,115,0,0,0,69,78,72,80,83,95,111,112,101,110,115,101,113,117,101,110,99,101,0,0,0,0,0,0,71,78,85,84,69,82,77,0,97,109,0,0,0,0,0,0,88,89,114,101,115,116,111,114,101,10,0,0,0,0,0,0,115,121,115,116,101,109,0,0,69,110,104,97,110,99,101,100,32,116,101,120,116,58,32,32,32,123,120,64,95,123,48,125,94,123,110,43,49,125,125,0,88,89,115,97,118,101,10,0,109,120,116,36,105,99,115,0,99,111,108,32,62,32,48,0,41,93,10,0,0,0,0,0,9,97,108,116,101,114,110,97,116,105,118,101,32,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,49,32,105,115,32,39,37,115,39,10,0,0,0,0,0,0,0,79,112,116,105,111,110,115,32,97,114,101,32,39,37,115,39,10,0,0,0,0,0,0,0,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,0,0,0,0,0,0,0,0,117,110,105,37,48,52,108,88,0,0,0,0,0,0,0,0,60,115,104,105,102,116,45,99,111,110,116,114,111,108,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,0,0,117,37,108,88,0,0,0,0,37,115,47,0,0,0,0,0,99,111,109,98,105,110,97,116,105,111,110,32,114,103,98,32,111,114,32,103,98,114,32,111,114,32,98,114,103,32,101,116,99,46,32,101,120,112,101,99,116,101,100,0,0,0,0,0,37,37,32,69,110,100,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,0,0,99,112,49,50,53,52,0,0,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,97,98,108,101,0,0,0,0,0,32,100,101,108,116,97,95,120,32,100,101,108,116,97,95,121,0,0,0,0,0,0,0,0,37,37,32,66,101,103,105,110,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,98,110,111,116,0,0,0,0,115,116,114,111,107,101,10,0,70,73,84,95,83,84,65,82,84,95,76,65,77,66,68,65,0,0,0,0,0,0,0,0,94,80,89,94,45,10,94,73,79,76,10,94,73,83,89,78,84,65,88,48,48,48,48,48,94,70,94,73,66,49,49,48,48,48,94,73,74,48,48,48,48,48,94,73,84,48,48,48,48,48,10,0,0,0,0,0,94,80,78,94,45,10,0,0,116,101,115,116,32,111,102,32,99,104,97,114,97,99,116,101,114,32,119,105,100,116,104,58,0,0,0,0,0,0,0,0,94,73,71,69,10,94,45,94,44,0,0,0,0,0,0,0,109,117,108,116,105,36,112,108,111,116,0,0,0,0,0,0,69,114,114,111,114,32,97,115,115,105,103,110,105,110,103,32,109,101,109,111,114,121,32,102,111,114,32,98,105,110,97,114,121,32,102,105,108,101,32,100,97,116,97,32,114,101,99,111,114,100,115,0,0,0,0,0,63,0,0,0,0,0,0,0,94,73,71,86,10,0,0,0,9,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,49,32,105,115,32,37,100,10,0,0,0,0,0,112,111,112,0,0,0,0,0,98,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,102,105,108,101,32,37,115,0,0,32,111,102,102,115,101,116,32,0,0,0,0,0,0,0,0,94,85,37,48,53,100,58,37,48,53,100,10,0,0,0,0,32,122,111,111,109,32,111,117,116,46,0,0,0,0,0,0,94,68,37,48,53,100,58,37,48,53,100,10,0,0,0,0,73,108,108,101,103,97,108,32,115,101,101,100,32,118,97,108,117,101,0,0,0,0,0,0,94,86,48,10,0,0,0,0,94,80,86,51,48,50,49,48,48,94,71,10,94,86,51,10,0,0,0,0,0,0,0,0,94,80,86,50,48,50,48,53,48,94,71,10,94,86,50,10,0,0,0,0,0,0,0,0,94,80,86,49,48,50,48,50,53,94,71,10,94,86,49,10,0,0,0,0,0,0,0,0,70,73,84,95,76,65,77,66,68,65,95,70,65,67,84,79,82,0,0,0,0,0,0,0,99,111,109,112,105,108,101,95,111,112,116,105,111,110,115,0,94,80,87,37,48,50,100,10,0,0,0,0,0,0,0,0,101,120,116,101,110,100,32,105,110,112,117,116,32,108,105,110,101,0,0,0,0,0,0,0,10,94,73,71,86,10,0,0,115,116,114,112,116,105,109,101,0,0,0,0,0,0,0,0,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,0,0,0,0,94,73,71,69,10,0,0,0,109,111,36,117,115,101,0,0,98,105,110,97,114,121,32,102,105,108,101,32,100,97,116,97,32,114,101,99,111,114,100,115,0,0,0,0,0,0,0,0,65,114,105,97,108,0,0,0,9,102,111,114,109,97,116,116,105,110,103,32,110,117,109,98,101,114,115,32,119,105,116,104,32,34,37,115,34,10,0,0,110,111,102,112,101,95,116,114,97,112,0,0,0,0,0,0,106,112,103,0,0,0,0,0,112,117,115,104,0,0,0,0,99,104,97,114,97,99,116,101,114,32,0,0,0,0,0,0,60,116,115,112,97,110,32,102,111,110,116,45,115,105,122,101,61,34,37,46,49,102,112,116,34,32,100,121,61,34,37,46,50,102,112,116,34,62,60,47,116,115,112,97,110,62,0,0,60,99,111,110,116,114,111,108,45,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,37,99,0,0,0,0,0,0,99,111,110,116,111,117,114,32,99,110,116,114,95,115,116,114,117,99,116,0,0,0,0,0,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,54,120,34,32,0,0,0,0,0,99,111,110,118,101,114,116,32,98,97,99,107,32,34,37,115,34,32,45,32,37,100,47,37,100,47,37,100,58,58,37,100,58,37,100,58,37,100,32,44,32,119,100,97,121,61,37,100,44,32,121,100,97,121,61,37,100,10,0,0,0,0,0,0,32,93,32,37,115,114,101,118,101,114,115,101,32,37,115,119,114,105,116,101,98,97,99,107,0,0,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,32,37,51,46,49,102,32,0,0,0,0,0,0,0,0,34,116,105,116,108,101,34,32,97,108,108,111,119,101,100,32,111,110,108,121,32,97,102,116,101,114,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,115,111,108,105,100,32,0,0,105,115,111,32,99,117,114,118,101,32,112,111,105,110,116,115,0,0,0,0,0,0,0,0,100,97,115,104,101,100,32,0,70,73,84,95,83,67,82,73,80,84,0,0,0,0,0,0,98,117,116,116,32,0,0,0,102,111,114,0,0,0,0,0,109,97,116,114,105,120,32,114,111,119,32,112,111,105,110,116,101,114,115,0,0,0,0,0,102,111,110,116,102,105,108,101,32,34,37,115,34,32,0,0,115,116,114,102,116,105,109,101,0,0,0,0,0,0,0,0,98,101,122,105,101,114,32,99,111,101,102,102,105,99,105,101,110,116,115,0,0,0,0,0,77,111,117,115,101,32,97,110,100,32,104,111,116,107,101,121,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,104,105,116,58,32,104,32,114,32,109,32,54,0,0,0,110,97,109,101,32,34,37,115,34,32,0,0,0,0,0,0,98,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,69,113,117,97,108,32,40,39,61,39,41,32,115,121,109,98,111,108,32,114,101,113,117,105,114,101,100,0,0,0,0,0,97,108,116,45,0,0,0,0,115,116,97,110,100,97,108,111,110,101,32,0,0,0,0,0,9,100,111,117,98,108,101,32,99,108,105,99,107,32,114,101,115,111,108,117,116,105,111,110,32,105,115,32,111,102,102,10,0,0,0,0,0,0,0,0,89,111,117,32,99,97,110,39,116,32,99,104,97,110,103,101,32,116,104,101,32,116,101,114,109,105,110,97,108,32,105,110,32,109,117,108,116,105,112,108,111,116,32,109,111,100,101,0,123,32,121,48,32,103,32,0,115,99,114,101,101,110,32,0,109,111,117,115,105,110,103,32,0,0,0,0,0,0,0,0,108,111,97,100,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,0,0,0,101,110,104,97,110,99,101,100,0,0,0,0,0,0,0,0,122,111,111,109,32,105,110,32,116,111,119,97,114,100,32,116,104,101,32,99,101,110,116,101,114,32,111,102,32,116,104,101,32,112,108,111,116,46,0,0,112,109,51,100,32,112,97,108,101,116,116,101,32,99,111,108,111,114,0,0,0,0,0,0,102,97,99,116,111,114,105,97,108,32,40,33,41,32,97,114,103,117,109,101,110,116,32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,0,0,0,0,0,0,0,32,100,121,110,97,109,105,99,0,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,61,32,37,102,32,45,32,37,100,47,37,100,47,37,100,58,58,37,100,58,37,100,58,37,100,32,44,32,119,100,97,121,61,37,100,44,32,121,100,97,121,61,37,100,10,0,0,32,102,105,120,101,100,0,0,115,105,122,101,32,37,100,44,37,100,37,115,32,37,115,32,102,110,97,109,101,32,39,37,115,39,32,32,102,115,105,122,101,32,37,103,32,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,116,101,114,109,105,110,97,108,32,111,112,116,105,111,110,0,0,0,0,98,97,99,107,103,36,114,111,117,110,100,0,0,0,0,0,100,97,115,104,36,101,100,0,32,32,116,101,114,109,105,110,97,108,32,116,101,115,116,0,114,111,117,110,100,36,101,100,0,0,0,0,0,0,0,0,116,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,111,112,116,105,111,110,32,101,120,112,101,99,116,101,100,0,70,111,110,116,32,102,105,108,101,110,97,109,101,32,101,120,112,101,99,116,101,100,0,0,9,100,111,117,98,108,101,32,99,108,105,99,107,32,114,101,115,111,108,117,116,105,111,110,32,105,115,32,37,100,32,109,115,10,0,0,0,0,0,0,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,117,115,105,110,103,32,39,115,101,116,32,116,101,114,109,111,112,116,105,111,110,39,0,0,0,0,115,101,99,111,110,100,32,0,102,111,110,116,102,105,108,101,0,0,0,0,0,0,0,0,60,99,111,110,116,114,111,108,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,102,115,105,122,101,58,32,101,120,112,101,99,116,105,110,103,32,102,111,110,116,32,115,105,122,101,0,0,0,0,0,0,102,115,36,105,122,101,0,0,115,109,111,111,116,104,32,112,97,108,101,116,116,101,32,105,110,32,37,115,58,32,117,115,105,110,103,32,37,105,32,111,102,32,37,105,32,97,118,97,105,108,97,98,108,101,32,99,111,108,111,114,32,112,111,115,105,116,105,111,110,115,10,0,37,115,32,114,97,110,103,101,32,109,117,115,116,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,0,0,0,102,110,36,97,109,101,0,0,102,105,36,120,101,100,0,0,86,97,108,117,101,32,115,116,111,114,101,100,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,32,104,97,110,100,108,105,110,103,32,105,115,32,105,108,108,101,103,97,108,33,33,33,10,0,0,0,0,100,36,121,110,97,109,105,99,0,0,0,0,0,0,0,0,110,97,109,101,32,109,117,115,116,32,99,111,110,116,97,105,110,32,111,110,108,121,32,97,108,112,104,97,110,117,109,101,114,105,99,115,32,111,114,32,95,0,0,0,0,0,0,0,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,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,95,49,50,51,52,53,54,55,56,57,48,0,119,111,114,100,0,0,0,0,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,97,32,112,108,111,116,32,110,97,109,101,0,0,0,114,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,110,97,109,101,0,0,0,0,9,110,111,32,112,111,108,97,114,32,100,105,115,116,97,110,99,101,32,116,111,32,114,117,108,101,114,32,119,105,108,108,32,98,101,32,115,104,111,119,110,10,0,0,0,0,0,0,100,101,108,97,121,0,0,0,102,105,114,115,116,32,0,0,109,111,117,115,36,105,110,103,0,0,0,0,0,0,0,0,115,99,114,111,108,108,32,114,105,103,104,116,46,0,0,0,109,111,117,115,101,0,0,0,121,32,115,105,122,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,101,120,116,101,110,100,32,105,110,32,100,111,95,115,121,115,116,101,109,95,102,117,110,99,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,121,32,115,105,122,101,0,0,0,0,0,0,0,0,112,111,108,121,103,111,110,0,120,32,115,105,122,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,120,32,115,105,122,101,0,0,0,0,0,0,0,0,115,36,105,122,101,0,0,0,67,97,110,110,111,116,32,109,105,120,32,115,99,114,101,101,110,32,111,114,32,99,104,97,114,97,99,116,101,114,32,99,111,111,114,100,115,32,119,105,116,104,32,112,108,111,116,32,99,111,111,114,100,115,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,105,115,32,101,109,112,116,121,0,115,117,98,115,116,114,0,0,115,101,116,32,116,101,114,109,111,112,116,32,101,110,104,0,67,111,109,109,97,110,100,32,39,37,115,39,32,103,101,110,101,114,97,116,101,115,32,101,109,112,116,121,32,111,117,116,112,117,116,0,0,0,0,0,67,111,109,109,97,110,100,32,39,37,115,39,32,103,101,110,101,114,97,116,101,100,32,101,114,114,111,114,32,101,120,105,116,99,111,100,101,32,37,100,0,0,0,0,0,0,0,0,108,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,68,105,109,95,50,0,0,0,9,100,105,115,116,97,110,99,101,32,116,111,32,114,117,108,101,114,32,119,105,108,108,32,98,101,32,115,104,111,119,32,105,110,32,112,111,108,97,114,32,99,111,111,114,100,105,110,97,116,101,115,10,0,0,0,103,105,102,0,0,0,0,0,111,98,106,101,99,116,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,110,116,32,39,37,115,39,10,0,0,60,115,104,105,102,116,45,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,0,0,102,111,110,116,45,102,97,109,105,108,121,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,0,0,0,42,118,101,114,121,42,32,108,111,110,103,32,115,121,115,116,101,109,32,99,97,108,108,32,111,117,116,112,117,116,32,104,97,115,32,98,101,101,110,32,116,114,117,110,99,97,116,101,100,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,101,120,101,99,117,116,101,32,112,105,112,101,32,39,37,115,39,0,0,0,0,0,10,9,60,99,105,114,99,108,101,32,105,100,61,39,103,112,68,111,116,39,32,114,61,39,48,46,53,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,48,46,53,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,48,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,45,49,44,48,32,104,50,32,77,48,44,45,49,32,118,50,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,49,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,45,49,44,45,49,32,76,49,44,49,32,77,49,44,45,49,32,76,45,49,44,49,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,50,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,45,49,44,48,32,76,49,44,48,32,77,48,44,45,49,32,76,48,44,49,32,77,45,49,44,45,49,32,76,49,44,49,32,77,45,49,44,49,32,76,49,44,45,49,39,47,62,10,9,60,114,101,99,116,32,105,100,61,39,103,112,80,116,51,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,120,61,39,45,49,39,32,121,61,39,45,49,39,32,119,105,100,116,104,61,39,50,39,32,104,101,105,103,104,116,61,39,50,39,47,62,10,9,60,114,101,99,116,32,105,100,61,39,103,112,80,116,52,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,120,61,39,45,49,39,32,121,61,39,45,49,39,32,119,105,100,116,104,61,39,50,39,32,104,101,105,103,104,116,61,39,50,39,47,62,10,9,60,99,105,114,99,108,101,32,105,100,61,39,103,112,80,116,53,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,99,120,61,39,48,39,32,99,121,61,39,48,39,32,114,61,39,49,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,53,39,32,105,100,61,39,103,112,80,116,54,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,55,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,48,44,45,49,46,51,51,32,76,45,49,46,51,51,44,48,46,54,55,32,76,49,46,51,51,44,48,46,54,55,32,122,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,55,39,32,105,100,61,39,103,112,80,116,56,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,55,39,32,105,100,61,39,103,112,80,116,57,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,116,114,97,110,115,102,111,114,109,61,39,114,111,116,97,116,101,40,49,56,48,41,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,57,39,32,105,100,61,39,103,112,80,116,49,48,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,51,39,32,105,100,61,39,103,112,80,116,49,49,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,116,114,97,110,115,102,111,114,109,61,39,114,111,116,97,116,101,40,52,53,41,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,49,49,39,32,105,100,61,39,103,112,80,116,49,50,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,60,47,100,101,102,115,62,10,0,60,100,101,102,115,62,10,0,9,37,115,32,114,97,110,103,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,91,0,0,0,0,0,0,0,47,62,10,0,0,0,0,0,32,102,105,108,108,61,34,35,37,48,54,120,34,0,0,0,115,116,114,115,116,114,116,0,85,110,107,110,111,119,110,32,111,114,32,97,109,98,105,103,117,111,117,115,32,116,101,114,109,105,110,97,108,32,110,97,109,101,32,39,37,115,39,10,0,0,0,0,0,0,0,0,60,103,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,62,10,10,0,0,0,0,0,0,0,109,97,114,36,103,105,110,0,60,103,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,32,111,110,99,108,105,99,107,61,34,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,32,111,110,109,111,117,115,101,109,111,118,101,61,34,103,110,117,112,108,111,116,95,115,118,103,46,109,111,118,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,62,10,10,0,9,110,111,32,122,111,111,109,32,99,111,111,114,100,105,110,97,116,101,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,10,0,0,0,0,0,10,60,33,45,45,32,65,108,115,111,32,116,114,97,99,107,32,109,111,117,115,101,32,119,104,101,110,32,105,116,32,105,115,32,111,110,32,97,32,112,108,111,116,32,101,108,101,109,101,110,116,32,45,45,62,10,0,0,0,0,0,0,0,0,32,102,105,108,108,115,116,121,108,101,32,0,0,0,0,0,115,99,114,111,108,108,32,108,101,102,116,32,40,105,110,32,45,88,32,100,105,114,101,99,116,105,111,110,41,46,0,0,111,110,99,108,105,99,107,61,34,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,32,32,111,110,109,111,117,115,101,109,111,118,101,61,34,103,110,117,112,108,111,116,95,115,118,103,46,109,111,118,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,47,62,10,0,0,0,0,0,0,0,32,102,105,108,108,61,34,35,37,48,54,120,34,32,115,116,114,111,107,101,61,34,98,108,97,99,107,34,32,115,116,114,111,107,101,45,119,105,100,116,104,61,34,49,34,10,0,0,100,111,95,115,121,115,116,101,109,95,102,117,110,99,0,0,60,114,101,99,116,32,120,61,34,37,100,34,32,121,61,34,37,100,34,32,119,105,100,116,104,61,34,37,100,34,32,104,101,105,103,104,116,61,34,37,100,34,0,0,0,0,0,0,10,60,33,45,45,32,84,105,101,32,109,111,117,115,105,110,103,32,116,111,32,101,110,116,105,114,101,32,98,111,117,110,100,105,110,103,32,98,111,120,32,111,102,32,116,104,101,32,112,108,111,116,32,45,45,62,10,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,106,97,118,97,83,99,114,105,112,116,34,32,84,89,80,69,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,62,32,60,33,91,67,68,65,84,65,91,10,0,0,0,0,0,0,0,35,32,70,73,88,69,68,0,70,97,105,108,101,100,32,116,111,32,105,110,115,101,114,116,32,106,97,118,97,115,99,114,105,112,116,32,102,105,108,101,32,37,115,10,0,0,0,0,115,116,114,108,101,110,0,0,106,97,118,97,115,99,114,105,112,116,32,110,97,109,101,0,109,97,112,36,112,105,110,103,51,100,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,106,115,0,0,9,122,111,111,109,32,99,111,111,114,100,105,110,97,116,101,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,10,0,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,120,108,105,110,107,58,104,114,101,102,61,34,37,115,103,110,117,112,108,111,116,95,115,118,103,46,106,115,34,47,62,10,0,60,115,104,105,102,116,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,39,99,97,108,108,32,60,102,105,108,101,62,39,0,0,0,0,106,115,100,105,114,0,0,0,112,111,112,101,110,32,102,97,105,108,101,100,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,47,106,115,0,60,100,101,115,99,62,80,114,111,100,117,99,101,100,32,98,121,32,71,78,85,80,76,79,84,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,32,60,47,100,101,115,99,62,10,10,0,0,0,0,71,110,117,112,108,111,116,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,0,0,0,0,0,60,116,105,116,108,101,62,37,115,60,47,116,105,116,108,101,62,10,0,0,0,0,0,0,62,10,10,0,0,0,0,0,103,112,114,105,110,116,102,0,84,101,114,109,105,110,97,108,32,116,121,112,101,32,115,101,116,32,116,111,32,39,37,115,39,10,0,0,0,0,0,0,32,120,109,108,110,115,58,120,108,105,110,107,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,120,108,105,110,107,34,10,0,0,0,0,109,97,112,36,112,105,110,103,0,0,0,0,0,0,0,0,112,108,111,116,32,116,105,116,108,101,0,0,0,0,0,0,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,115,118,103,34,10,0,0,0,0,9,109,111,117,115,101,32,105,115,32,111,110,10,0,0,0,10,32,118,105,101,119,66,111,120,61,34,48,32,48,32,37,117,32,37,117,34,10,0,0,115,99,114,111,108,108,32,100,111,119,110,46,0,0,0,0,46,46,0,0,0,0,0,0,10,32,119,105,100,116,104,61,34,37,117,34,32,104,101,105,103,104,116,61,34,37,117,34,32,0,0,0,0,0,0,0,111,110,108,111,97,100,61,34,105,102,32,40,116,121,112,101,111,102,40,103,110,117,112,108,111,116,95,115,118,103,41,33,61,39,117,110,100,101,102,105,110,101,100,39,41,32,103,110,117,112,108,111,116,95,115,118,103,46,73,110,105,116,40,101,118,116,41,34,32,0,0,0,37,115,32,105,115,32,110,111,116,32,97,32,115,116,114,105,110,103,32,118,97,114,105,97,98,108,101,0,0,0,0,0,60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,37,115,32,115,116,97,110,100,97,108,111,110,101,61,34,110,111,34,63,62,10,60,33,68,79,67,84,89,80,69,32,115,118,103,32,80,85,66,76,73,67,32,34,45,47,47,87,51,67,47,47,68,84,68,32,83,86,71,32,49,46,49,47,47,69,78,34,32,10,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,71,114,97,112,104,105,99,115,47,83,86,71,47,49,46,49,47,68,84,68,47,115,118,103,49,49,46,100,116,100,34,62,10,60,115,118,103,32,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,117,116,102,45,56,34,32,0,0,0,0,0,0,0,102,111,110,116,112,97,116,104,32,61,61,32,78,85,76,76,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,83,104,105,102,116,95,74,73,83,34,32,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,103,10,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,84,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,116,0,0,0,101,110,99,111,100,105,110,103,61,34,107,111,105,56,45,117,34,32,0,0,0,0,0,0,68,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,32,45,32,112,108,101,97,115,101,32,117,115,101,32,39,115,101,116,32,116,105,99,115,32,115,99,97,108,101,32,100,101,102,97,117,108,116,39,0,37,89,45,37,109,45,37,100,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,107,111,105,56,45,114,34,32,0,0,0,0,0,0,87,97,114,110,105,110,103,58,32,115,99,97,108,101,32,105,110,116,101,114,102,97,99,101,32,105,115,32,110,111,116,32,110,117,108,108,95,115,99,97,108,101,32,45,32,109,97,121,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,109,117,108,116,105,112,108,111,116,10,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,119,105,110,100,111,119,115,45,49,50,53,49,34,32,0,0,0,0,0,0,0,0,109,97,99,36,114,111,115,0,116,105,109,101,99,111,108,117,109,110,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,119,105,110,100,111,119,115,45,49,50,53,48,34,32,0,0,0,0,0,0,0,0,9,108,97,115,116,32,112,108,111,116,32,99,111,109,109,97,110,100,32,119,97,115,58,32,37,115,10,0,0,0,0,0,102,99,32,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,99,112,57,53,48,34,32,0,0,0,0,0,0,0,60,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,98,109,45,56,53,50,34,32,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,98,109,45,56,53,48,34,32,0,0,0,0,0,115,116,114,105,110,103,32,118,97,114,105,97,98,108,101,0,99,112,49,50,53,49,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,49,53,34,32,0,32,108,97,98,101,108,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,57,34,32,0,0,108,110,111,116,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,50,34,32,0,0,105,110,105,116,105,97,108,32,115,101,116,32,111,102,32,102,114,101,101,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,49,34,32,0,0,35,37,50,46,50,88,37,50,46,50,88,37,50,46,50,88,0,0,0,0,0,0,0,0,116,109,95,121,100,97,121,0,120,49,49,0,0,0,0,0,60,47,115,118,103,62,10,10,0,0,0,0,0,0,0,0,108,111,103,36,115,99,97,108,101,0,0,0,0,0,0,0,64,67,79,76,85,77,78,72,69,65,68,64,0,0,0,0,32,32,32,32,111,110,99,108,105,99,107,61,39,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,71,114,105,100,40,41,59,39,47,62,10,0,0,0,0,0,0,61,32,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,112,97,114,97,109,101,116,114,105,99,32,109,111,100,101,0,0,108,119,32,37,46,49,102,32,0,0,0,0,0,0,0,0,10,32,32,60,105,109,97,103,101,32,120,61,39,49,48,39,32,121,61,39,37,100,39,32,119,105,100,116,104,61,39,49,54,39,32,104,101,105,103,104,116,61,39,49,54,39,32,120,108,105,110,107,58,104,114,101,102,61,39,103,114,105,100,46,112,110,103,39,10,0,0,0,115,99,114,111,108,108,32,117,112,32,40,105,110,32,43,89,32,100,105,114,101,99,116,105,111,110,41,46,0,0,0,0,102,111,110,116,112,97,116,104,95,102,117,108,108,110,97,109,101,0,0,0,0,0,0,0,32,32,118,105,115,105,98,105,108,105,116,121,61,34,104,105,100,100,101,110,34,62,32,60,47,116,101,120,116,62,10,0,37,115,32,101,114,114,111,114,10,0,0,0,0,0,0,0,32,32,102,111,110,116,45,115,105,122,101,61,34,49,50,34,32,102,111,110,116,45,102,97,109,105,108,121,61,34,65,114,105,97,108,34,10,0,0,0,115,121,115,116,101,109,40,41,32,102,97,105,108,101,100,0,10,32,32,60,116,101,120,116,32,105,100,61,34,99,111,111,114,100,95,116,101,120,116,34,32,116,101,120,116,45,97,110,99,104,111,114,61,34,115,116,97,114,116,34,32,112,111,105,110,116,101,114,45,101,118,101,110,116,115,61,34,110,111,110,101,34,10,0,0,0,0,0,93,93,62,10,60,47,115,99,114,105,112,116,62,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,34,59,10,0,0,0,0,0,0,114,101,115,117,108,116,97,110,116,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,114,32,100,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,0,0,0,0,68,97,116,101,84,105,109,101,0,0,0,0,0,0,0,0,84,105,109,101,0,0,0,0,116,109,95,119,100,97,121,0,88,49,49,0,0,0,0,0,68,97,116,101,0,0,0,0,108,111,99,36,97,108,101,0,97,110,97,108,121,122,101,95,115,103,108,95,99,111,108,117,109,110,0,0,0,0,0,0,99,111,108,117,109,110,104,101,97,100,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,37,115,34,59,10,0,0,0,0,9,37,45,42,115,32,0,0,102,112,101,95,116,114,97,112,0,0,0,0,0,0,0,0,102,110,97,109,101,0,0,0,106,112,101,103,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,32,61,32,37,46,51,102,59,10,0,0,0,0,0,60,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,114,101,99,117,114,115,105,118,101,102,117,108,108,110,97,109,101,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,32,61,32,37,46,51,102,59,10,0,0,0,0,0,116,114,97,99,101,95,99,111,110,116,111,117,114,58,32,117,110,101,120,112,101,99,116,101,100,32,101,110,100,32,111,102,32,99,111,110,116,111,117,114,10,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,108,111,103,97,120,105,115,95,114,32,61,32,37,100,59,10,0,0,0,0,0,0,0,73,109,112,111,115,115,105,98,108,101,32,99,97,115,101,32,105,110,32,115,119,105,116,99,104,0,0,0,0,0,0,0,32,58,32,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,108,111,103,97,120,105,115,95,121,32,61,32,37,100,59,10,0,0,0,0,0,0,0,112,109,51,100,32,115,99,97,110,32,97,114,114,97,121,0,116,36,105,116,108,101,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,108,111,103,97,120,105,115,95,120,32,61,32,37,100,59,10,0,0,0,0,0,0,0,108,97,98,101,108,112,111,105,110,116,32,116,101,120,116,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,67,111,117,108,100,32,110,111,116,32,108,105,110,101,98,117,102,102,101,114,32,115,116,100,111,117,116,10,0,0,0,0,10,10,32,73,116,101,114,97,116,105,111,110,32,37,100,10,32,87,83,83,82,32,32,32,32,32,32,32,32,58,32,37,45,49,53,103,32,32,32,100,101,108,116,97,40,87,83,83,82,41,47,87,83,83,82,32,32,32,58,32,37,103,10,32,100,101,108,116,97,40,87,83,83,82,41,32,58,32,37,45,49,53,103,32,32,32,108,105,109,105,116,32,102,111,114,32,115,116,111,112,112,105,110,103,32,58,32,37,103,10,32,108,97,109,98,100,97,9,32,32,58,32,37,103,10,10,37,115,32,112,97,114,97,109,101,116,101,114,32,118,97,108,117,101,115,10,10,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,121,50,109,97,120,0,69,120,112,101,99,116,105,110,103,32,105,116,101,114,97,116,111,114,32,9,102,111,114,32,91,60,118,97,114,62,32,61,32,60,115,116,97,114,116,62,32,58,32,60,101,110,100,62,93,10,9,9,9,111,114,9,102,111,114,32,91,60,118,97,114,62,32,105,110,32,34,115,116,114,105,110,103,32,111,102,32,119,111,114,100,115,34,93,0,0,0,0,0,0,0,0,71,80,86,65,76,95,89,50,95,77,65,88,0,0,0,0,116,109,95,121,101,97,114,0,117,110,107,110,111,119,110,32,111,114,32,97,109,98,105,103,117,111,117,115,32,116,101,114,109,105,110,97,108,32,116,121,112,101,59,32,116,121,112,101,32,106,117,115,116,32,39,115,101,116,32,116,101,114,109,105,110,97,108,39,32,102,111,114,32,97,32,108,105,115,116,0,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,109,105,115,115,105,110,103,32,98,108,111,99,107,32,116,101,114,109,105,110,97,116,111,114,32,125,0,0,0,0,0,0,0,0,108,111,97,36,100,112,97,116,104,0,0,0,0,0,0,0,98,108,97,110,107,0,0,0,116,117,114,110,105,110,103,32,114,117,108,101,114,32,111,110,46,10,0,0,0,0,0,0,71,80,86,65,76,95,89,50,95,77,73,78,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,105,110,32,115,101,116,32,116,105,99,115,0,0,0,0,0,0,0,0,123,32,48,46,57,57,57,57,57,32,121,48,32,115,117,98,32,103,32,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,99,97,108,108,0,0,0,0,121,32,112,111,115,0,0,0,118,101,114,116,105,99,97,108,32,109,111,116,105,111,110,32,45,45,32,99,104,97,110,103,101,32,120,121,112,108,97,110,101,0,0,0,0,0,0,0,102,97,105,108,115,97,102,101,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,50,109,97,120,0,99,97,110,32,111,110,108,121,32,109,111,100,32,105,110,116,115,0,0,0,0,0,0,0,71,80,86,65,76,95,88,50,95,77,65,88,0,0,0,0,83,111,114,114,121,44,32,110,111,32,104,101,108,112,32,102,111,114,32,39,37,115,39,10,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,0,71,80,86,65,76,95,88,50,95,77,73,78,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,114,109,105,110,32,61,32,37,103,59,10,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,116,114,117,101,0,0,0,0,116,109,95,109,111,110,0,0,117,110,107,110,111,119,110,0,103,110,117,112,108,111,116,95,115,118,103,46,112,111,108,97,114,95,109,111,100,101,32,61,32,37,115,59,10,0,0,0,108,116,0,0,0,0,0,0,105,110,100,101,120,95,109,97,120,0,0,0,0,0,0,0,112,97,114,116,105,97,108,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,99,111,108,117,109,110,32,37,100,32,104,101,97,100,101,114,32,37,115,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,121,109,97,120,0,0,68,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,32,45,32,112,108,101,97,115,101,32,117,115,101,32,39,115,101,116,32,116,105,99,115,32,115,99,97,108,101,39,32,107,101,121,119,111,114,100,0,71,80,86,65,76,95,89,95,77,65,88,0,0,0,0,0,60,83,104,105,102,116,45,66,50,45,77,111,116,105,111,110,62,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,121,109,105,110,0,0,71,80,86,65,76,95,89,95,77,73,78,0,0,0,0,0,72,101,108,112,32,116,111,112,105,99,58,32,0,0,0,0])
-.concat([118,0,0,0,0,0,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,32,102,111,114,32,37,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,116,112,105,99,32,92,115,112,101,99,105,97,108,115,10,37,37,32,32,32,32,32,32,32,32,32,32,119,105,116,104,32,37,100,32,112,111,105,110,116,32,116,121,112,101,115,32,97,110,100,32,37,100,32,108,105,110,101,32,116,121,112,101,115,10,37,37,32,79,112,116,105,111,110,115,58,32,112,111,105,110,116,115,105,122,101,32,61,32,37,100,44,32,108,105,110,101,119,105,100,116,104,32,61,32,37,100,44,32,105,110,116,101,114,118,97,108,32,61,32,37,102,10,37,37,32,84,111,32,99,104,97,110,103,101,32,97,98,111,118,101,32,111,112,116,105,111,110,115,44,32,115,97,121,58,10,37,37,32,115,101,116,32,116,101,114,109,105,110,97,108,32,116,112,105,99,32,112,111,105,110,116,115,105,122,101,95,118,97,108,117,101,32,108,105,110,101,119,105,100,116,104,95,118,97,108,117,101,32,105,110,116,101,114,118,97,108,95,118,97,108,117,101,10,37,37,32,40,112,111,105,110,116,115,105,122,101,32,97,110,100,32,108,105,110,101,119,105,100,116,104,32,45,32,105,110,116,101,103,101,114,115,32,105,110,32,109,105,108,108,105,45,105,110,99,104,101,115,46,10,37,37,32,32,105,110,116,101,114,118,97,108,32,45,32,97,32,102,108,111,97,116,32,105,110,32,105,110,99,104,101,115,46,32,32,73,102,32,122,101,114,111,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,10,37,37,32,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,99,104,111,115,101,110,46,41,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,105,110,125,37,37,10,0,0,0,0,37,115,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,37,100,44,37,100,41,37,37,32,37,115,10,0,0,0,64,74,1,0,0,0,0,0,184,73,1,0,1,0,0,0,0,0,0,0,2,0,0,0,232,195,1,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,144,245,1,0,2,0,0,0,40,245,1,0,2,0,0,0,32,50,1,0,3,0,0,0,232,49,1,0,4,0,0,0,200,49,1,0,5,0,0,0,40,195,1,0,6,0,0,0,192,49,1,0,7,0,0,0,192,229,1,0,8,0,0,0,72,236,1,0,10,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,166,1,0,200,165,1,0,248,164,1,0,184,164,1,0,88,164,1,0,8,164,1,0,176,163,1,0,120,163,1,0,64,163,1,0,232,162,1,0,152,162,1,0,248,161,1,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,98,101,103,105,110,123,116,101,120,100,114,97,119,125,10,92,110,111,114,109,97,108,115,105,122,101,10,92,105,102,120,92,112,97,116,104,68,69,70,73,78,69,68,92,114,101,108,97,120,92,101,108,115,101,92,108,101,116,92,112,97,116,104,68,69,70,73,78,69,68,92,114,101,108,97,120,10,32,92,100,101,102,92,81,116,71,102,114,123,92,105,102,120,32,40,92,84,71,114,101,32,92,108,101,116,92,89,104,101,116,84,92,99,112,97,116,104,92,101,108,115,101,92,108,101,116,92,89,104,101,116,84,92,114,101,108,97,120,92,102,105,92,89,104,101,116,84,125,10,32,92,100,101,102,92,112,97,116,104,32,40,35,49,32,35,50,41,123,92,109,111,118,101,32,40,35,49,32,35,50,41,92,102,117,116,117,114,101,108,101,116,92,84,71,114,101,92,81,116,71,102,114,125,10,32,92,100,101,102,92,99,112,97,116,104,32,40,35,49,32,35,50,41,123,92,108,118,101,99,32,40,35,49,32,35,50,41,92,102,117,116,117,114,101,108,101,116,92,84,71,114,101,92,81,116,71,102,114,125,10,92,102,105,10,92,100,114,97,119,100,105,109,32,112,116,10,92,115,101,116,117,110,105,116,115,99,97,108,101,32,37,50,46,50,102,10,92,108,105,110,101,119,100,32,37,100,10,92,116,101,120,116,114,101,102,32,104,58,76,32,118,58,67,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,18,0,0,0,0,0,0,255,255,255,255,0,0,0,0,112,23,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,152,190,2,0,192,31,1,0,184,31,1,0,72,31,1,0,24,31,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,32,3,0,240,30,3,0,160,31,3,0,8,32,3,0,240,31,3,0,192,31,3,0,232,30,3,0,144,31,3,0,184,31,3,0,0,0,0,0,56,32,3,0,8,32,3,0,240,31,3,0,200,31,3,0,192,31,3,0,184,31,3,0,160,31,3,0,144,31,3,0,128,31,3,0,56,31,3,0,24,31,3,0,8,31,3,0,240,30,3,0,232,30,3,0,216,30,3,0,184,30,3,0,152,30,3,0,144,30,3,0,128,30,3,0,64,30,3,0,48,30,3,0,248,29,3,0,208,29,3,0,176,29,3,0,160,29,3,0,152,29,3,0,112,29,3,0,104,29,3,0,88,29,3,0,40,29,3,0,8,29,3,0,248,28,3,0,224,28,3,0,216,28,3,0,184,28,3,0,176,28,3,0,160,28,3,0,152,28,3,0,64,28,3,0,40,28,3,0,16,28,3,0,216,27,3,0,208,27,3,0,200,27,3,0,192,27,3,0,184,27,3,0,168,27,3,0,160,27,3,0,144,27,3,0,64,27,3,0,48,27,3,0,240,26,3,0,232,26,3,0,224,26,3,0,216,26,3,0,208,26,3,0,184,26,3,0,176,26,3,0,160,26,3,0,80,26,3,0,64,26,3,0,48,26,3,0,208,25,3,0,200,25,3,0,192,25,3,0,136,25,3,0,112,25,3,0,88,25,3,0,80,25,3,0,32,25,3,0,16,25,3,0,248,24,3,0,224,24,3,0,216,24,3,0,208,24,3,0,200,24,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,254,1,0,3,0,0,0,32,50,1,0,0,0,0,0,232,49,1,0,1,0,0,0,184,208,2,0,2,0,0,0,0,224,1,0,4,0,0,0,192,218,1,0,5,0,0,0,152,208,2,0,9,0,0,0,144,195,1,0,10,0,0,0,80,195,1,0,10,0,0,0,72,208,2,0,11,0,0,0,56,208,2,0,12,0,0,0,24,208,2,0,12,0,0,0,232,247,1,0,13,0,0,0,80,248,1,0,14,0,0,0,48,246,1,0,15,0,0,0,224,245,1,0,15,0,0,0,144,245,1,0,16,0,0,0,40,245,1,0,16,0,0,0,192,253,1,0,39,0,0,0,248,207,2,0,17,0,0,0,224,207,2,0,18,0,0,0,200,207,2,0,19,0,0,0,16,24,2,0,21,0,0,0,112,207,2,0,20,0,0,0,200,210,2,0,22,0,0,0,176,210,2,0,23,0,0,0,80,207,2,0,24,0,0,0,96,244,1,0,30,0,0,0,48,207,2,0,25,0,0,0,32,207,2,0,26,0,0,0,96,211,2,0,27,0,0,0,24,211,2,0,28,0,0,0,192,229,1,0,29,0,0,0,224,252,1,0,7,0,0,0,24,253,1,0,8,0,0,0,200,251,1,0,37,0,0,0,72,251,1,0,38,0,0,0,56,117,1,0,31,0,0,0,240,206,2,0,32,0,0,0,224,206,2,0,33,0,0,0,152,206,2,0,34,0,0,0,72,206,2,0,35,0,0,0,48,206,2,0,36,0,0,0,232,205,2,0,40,0,0,0,200,205,2,0,41,0,0,0,136,82,3,0,42,0,0,0,184,205,2,0,43,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,44,49,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,101,118,101,108,49,32,83,117,112,112,114,101,115,115,80,68,70,77,97,114,107,32,111,114,32,10,123,125,32,123,10,47,83,68,105,99,116,32,49,48,32,100,105,99,116,32,100,101,102,10,115,121,115,116,101,109,100,105,99,116,32,47,112,100,102,109,97,114,107,32,107,110,111,119,110,32,110,111,116,32,123,10,32,32,117,115,101,114,100,105,99,116,32,47,112,100,102,109,97,114,107,32,115,121,115,116,101,109,100,105,99,116,32,47,99,108,101,97,114,116,111,109,97,114,107,32,103,101,116,32,112,117,116,10,125,32,105,102,10,83,68,105,99,116,32,98,101,103,105,110,32,91,10,32,32,47,84,105,116,108,101,32,40,37,115,41,10,32,32,47,83,117,98,106,101,99,116,32,40,103,110,117,112,108,111,116,32,112,108,111,116,41,10,32,32,47,67,114,101,97,116,111,114,32,40,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,41,10,32,32,47,65,117,116,104,111,114,32,40,37,115,41,10,37,37,32,32,47,80,114,111,100,117,99,101,114,32,40,103,110,117,112,108,111,116,41,10,37,37,32,32,47,75,101,121,119,111,114,100,115,32,40,41,10,32,32,47,67,114,101,97,116,105,111,110,68,97,116,101,32,40,37,115,41,10,32,32,47,68,79,67,73,78,70,79,32,112,100,102,109,97,114,107,10,101,110,100,10,125,32,105,102,101,108,115,101,10,0,0,0,37,37,37,37,69,110,100,67,111,109,109,101,110,116,115,10,37,37,37,37,66,101,103,105,110,80,114,111,108,111,103,10,47,103,110,117,100,105,99,116,32,50,53,54,32,100,105,99,116,32,100,101,102,10,103,110,117,100,105,99,116,32,98,101,103,105,110,10,37,37,10,37,37,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,114,117,101,47,102,97,108,115,101,32,102,108,97,103,115,32,109,97,121,32,98,101,32,101,100,105,116,101,100,32,98,121,32,104,97,110,100,32,105,102,32,100,101,115,105,114,101,100,46,10,37,37,32,84,104,101,32,117,110,105,116,32,108,105,110,101,32,119,105,100,116,104,32,97,110,100,32,103,114,97,121,115,99,97,108,101,32,105,109,97,103,101,32,103,97,109,109,97,32,99,111,114,114,101,99,116,105,111,110,32,109,97,121,32,97,108,115,111,32,98,101,32,99,104,97,110,103,101,100,46,10,37,37,10,47,67,111,108,111,114,32,37,115,32,100,101,102,10,47,66,108,97,99,107,116,101,120,116,32,37,115,32,100,101,102,10,47,83,111,108,105,100,32,37,115,32,100,101,102,10,47,68,97,115,104,108,101,110,103,116,104,32,37,103,32,100,101,102,10,47,76,97,110,100,115,99,97,112,101,32,37,115,32,100,101,102,10,47,76,101,118,101,108,49,32,37,115,32,100,101,102,10,47,82,111,117,110,100,101,100,32,37,115,32,100,101,102,10,47,67,108,105,112,84,111,66,111,117,110,100,105,110,103,66,111,120,32,37,115,32,100,101,102,10,47,83,117,112,112,114,101,115,115,80,68,70,77,97,114,107,32,102,97,108,115,101,32,100,101,102,10,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,102,97,108,115,101,32,100,101,102,10,47,103,110,117,108,105,110,101,119,105,100,116,104,32,37,46,51,102,32,100,101,102,10,47,117,115,101,114,108,105,110,101,119,105,100,116,104,32,103,110,117,108,105,110,101,119,105,100,116,104,32,100,101,102,10,47,71,97,109,109,97,32,49,46,48,32,100,101,102,10,47,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,123,37,46,51,102,32,37,46,51,102,32,37,46,51,102,125,32,100,101,102,10,37,37,10,47,118,115,104,105,102,116,32,37,100,32,100,101,102,10,47,100,108,49,32,123,10,32,32,37,46,49,102,32,68,97,115,104,108,101,110,103,116,104,32,109,117,108,32,109,117,108,10,32,32,82,111,117,110,100,101,100,32,123,32,99,117,114,114,101,110,116,108,105,110,101,119,105,100,116,104,32,48,46,55,53,32,109,117,108,32,115,117,98,32,100,117,112,32,48,32,108,101,32,123,32,112,111,112,32,48,46,48,49,32,125,32,105,102,32,125,32,105,102,10,125,32,100,101,102,10,47,100,108,50,32,123,10,32,32,37,46,49,102,32,68,97,115,104,108,101,110,103,116,104,32,109,117,108,32,109,117,108,10,32,32,82,111,117,110,100,101,100,32,123,32,99,117,114,114,101,110,116,108,105,110,101,119,105,100,116,104,32,48,46,55,53,32,109,117,108,32,97,100,100,32,125,32,105,102,10,125,32,100,101,102,10,47,104,112,116,95,32,37,46,49,102,32,100,101,102,10,47,118,112,116,95,32,37,46,49,102,32,100,101,102,10,47,104,112,116,32,104,112,116,95,32,100,101,102,10,47,118,112,116,32,118,112,116,95,32,100,101,102,10,0,0,0,0,0,0,37,37,37,37,67,114,101,97,116,111,114,58,32,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,37,37,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,37,115,10,37,37,37,37,68,111,99,117,109,101,110,116,70,111,110,116,115,58,32,37,115,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,153,1,0,40,153,1,0,224,152,1,0,200,152,1,0,184,152,1,0,112,152,1,0,88,152,1,0,64,152,1,0,48,152,1,0,24,152,1,0,112,151,1,0,232,150,1,0,0,0,0,0,0,0,0,0,224,148,1,0,192,148,1,0,176,148,1,0,160,148,1,0,144,148,1,0,40,148,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,49,1,0,112,51,1,0,64,179,2,0,21,177,0,0,148,132,0,0,32,50,1,0,128,51,1,0,56,179,2,0,148,132,0,0,21,177,0,0,40,139,3,0,0,0,0,0,64,178,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,195,1,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,40,195,1,0,2,0,0,0,80,248,1,0,3,0,0,0,232,194,1,0,4,0,0,0,184,194,1,0,5,0,0,0,96,194,1,0,6,0,0,0,24,194,1,0,7,0,0,0,80,193,1,0,11,0,0,0,232,192,1,0,8,0,0,0,144,192,1,0,9,0,0,0,88,192,1,0,10,0,0,0,0,192,1,0,14,0,0,0,208,191,1,0,15,0,0,0,152,191,1,0,16,0,0,0,104,191,1,0,12,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,254,255,255,255,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,208,2,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,48,195,2,0,2,0,0,0,24,195,2,0,3,0,0,0,224,194,2,0,4,0,0,0,216,194,2,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,192,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,5,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,0,0,192,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63,15,0,0,0,10,0,0,0,15,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,10,0,0,0,15,0,0,0,10,0,0,0,15,0,0,0,0,0,0,0,0,0,192,63,20,0,0,0,10,0,0,0,5,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,10,0,0,0,6,0,0,0,10,0,0,0,6,0,0,0,0,0,0,0,0,0,192,63,15,0,0,0,6,0,0,0,5,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,10,0,0,0,6,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,5,0,0,0,6,0,0,0,5,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,150,1,0,152,190,2,0,152,150,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,130,1,0,208,129,1,0,184,105,1,0,80,105,1,0,240,104,1,0,176,104,1,0,56,104,1,0,0,129,1,0,8,104,1,0,216,103,1,0,88,103,1,0,208,102,1,0,144,102,1,0,104,102,1,0,0,102,1,0,0,0,0,0,176,97,1,0,0,0,0,0,160,97,1,0,1,0,0,0,48,254,1,0,2,0,0,0,120,97,1,0,3,0,0,0,88,97,1,0,4,0,0,0,56,97,1,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,204,204,62,0,0,0,0,205,204,204,62,0,0,160,64,205,204,76,63,0,0,0,0,0,0,128,63,0,0,160,64,154,153,153,63,0,0,0,0,0,0,128,63,0,0,32,65,10,0,0,0,0,0,0,0,100,111,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,4,0,0,0,0,0,0,0,0,3,8,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,16,6,3,6,0,0,0,0,0,0,16,6,8,6,0,0,0,0,0,0,16,4,1,4,8,4,1,4,0,0,16,4,1,8,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,9,0,0,0,0,0,0,228,12,0,0,0,0,0,0,36,9,0,0,0,0,0,0,228,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,50,1,0,0,0,0,0,232,49,1,0,1,0,0,0,0,0,0,0,2,0,0,0,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,255,255,255,0,0,0,0,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,181,2,0,88,181,2,0,72,181,2,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,246,255,255,255,0,0,0,0,112,249,1,0,0,0,0,0,208,250,1,0,1,0,0,0,40,250,1,0,1,0,0,0,144,175,2,0,2,0,0,0,136,175,2,0,3,0,0,0,112,175,2,0,4,0,0,0,56,86,3,0,5,0,0,0,80,175,2,0,6,0,0,0,216,174,2,0,7,0,0,0,0,0,0,0,8,0,0,0,6,0,0,0,0,0,0,0,152,190,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-.concat([136,193,2,0,128,193,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,52,16,0,0,0,0,0,0,120,193,2,0,40,193,2,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,34,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,208,192,2,0,144,192,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,5,16,0,0,0,0,0,0,40,192,2,0,8,192,2,0,108,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,45,16,0,0,0,0,0,0,216,191,2,0,200,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,72,16,0,0,0,0,0,0,128,191,2,0,120,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,218,64,0,0,0,0,0,0,104,191,2,0,176,98,1,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,3,16,0,0,0,0,0,0,40,191,2,0,16,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,101,16,0,0,0,0,0,0,200,190,2,0,136,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,6,16,0,0,0,0,0,0,104,190,2,0,80,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,17,16,0,0,0,0,0,0,64,190,2,0,32,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,1,0,0,0,10,17,0,0,0,0,0,0,8,190,2,0,248,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,5,66,0,0,0,0,0,0,216,189,2,0,200,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,4,0,0,0,3,0,0,0,44,16,0,0,0,0,0,0,144,189,2,0,24,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,1,0,0,0,0,0,0,0,20,16,0,0,0,0,0,0,248,188,2,0,208,188,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,201,16,0,0,0,0,0,0,168,188,2,0,144,188,2,0,109,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,46,65,0,0,0,0,0,0,128,188,2,0,96,188,2,0,108,72,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,1,0,0,0,0,0,0,0,170,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,152,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,1,0,0,0,7,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,32,32,114,117,108,101,114,58,32,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,84,2,0,152,190,2,0,152,190,2,0,24,84,2,0,8,84,2,0,248,83,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,73,84,95,76,79,71,0,176,4,0,0,0,0,0,0,176,4,0,0,0,0,0,0,51,46,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,160,2,0,3,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,80,248,1,0,15,0,0,0,24,160,2,0,12,0,0,0,192,229,1,0,9,0,0,0,240,159,2,0,10,0,0,0,96,255,1,0,4,0,0,0,232,49,1,0,7,0,0,0,200,159,2,0,5,0,0,0,232,195,1,0,0,0,0,0,184,159,2,0,13,0,0,0,152,159,2,0,6,0,0,0,120,97,1,0,8,0,0,0,144,159,2,0,2,0,0,0,232,247,1,0,14,0,0,0,144,245,1,0,11,0,0,0,112,159,2,0,11,0,0,0,24,159,2,0,18,0,0,0,240,158,2,0,16,0,0,0,192,158,2,0,19,0,0,0,176,158,2,0,17,0,0,0,144,158,2,0,20,0,0,0,0,0,0,0,21,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,6,0,0,0,0,0,0,0,26,0,0,0,11,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,134,1,0,0,0,0,0,176,132,1,0,1,0,0,0,8,131,1,0,2,0,0,0,88,128,1,0,3,0,0,0,0,126,1,0,4,0,0,0,152,123,1,0,5,0,0,0,112,121,1,0,6,0,0,0,208,119,1,0,7,0,0,0,0,118,1,0,8,0,0,0,24,116,1,0,9,0,0,0,80,114,1,0,10,0,0,0,152,111,1,0,11,0,0,0,48,109,1,0,12,0,0,0,232,105,1,0,13,0,0,0,176,102,1,0,14,0,0,0,16,100,1,0,15,0,0,0,216,97,1,0,16,0,0,0,224,95,1,0,17,0,0,0,16,93,1,0,18,0,0,0,32,91,1,0,19,0,0,0,232,88,1,0,20,0,0,0,224,83,1,0,21,0,0,0,200,79,1,0,22,0,0,0,240,74,1,0,23,0,0,0,200,72,1,0,24,0,0,0,128,69,1,0,25,0,0,0,240,65,1,0,26,0,0,0,192,59,1,0,27,0,0,0,216,54,1,0,28,0,0,0,0,52,1,0,29,0,0,0,216,49,1,0,30,0,0,0,8,48,1,0,31,0,0,0,224,45,1,0,32,0,0,0,128,43,1,0,33,0,0,0,56,41,1,0,34,0,0,0,0,0,0,0,255,255,255,255,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,3,0,200,23,3,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,78,1,0,0,138,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,19,3,0,64,19,3,0,0,19,3,0,192,18,3,0,112,18,3,0,16,18,3,0,192,17,3,0,112,17,3,0,208,16,3,0,104,16,3,0,8,16,3,0,232,15,3,0,216,15,3,0,128,15,3,0,248,14,3,0,160,14,3,0,96,14,3,0,56,14,3,0,136,13,3,0,88,13,3,0,224,12,3,0,120,12,3,0,0,12,3,0,184,11,3,0,128,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,255,0,0,0,128,0,128,0,0,0,0,128,128,0,0,0,0,0,128,128,128,0,0,128,64,0,128,128,0,0,128,0,128,0,192,192,192,0,0,255,255,0,255,255,0,0,0,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,9,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,130,1,0,112,130,1,0,48,130,1,0,208,129,1,0,0,129,1,0,200,128,1,0,72,128,1,0,48,128,1,0,32,128,1,0,200,127,1,0,160,127,1,0,120,127,1,0,64,127,1,0,16,127,1,0,176,126,1,0,40,126,1,0,216,125,1,0,168,125,1,0,72,128,1,0,48,128,1,0,200,127,1,0,160,127,1,0,0,0,0,0,0,0,0,0,120,125,1,0,48,125,1,0,248,124,1,0,200,124,1,0,152,124,1,0,104,124,1,0,72,128,1,0,200,127,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,119,1,0,128,119,1,0,88,119,1,0,160,119,1,0,64,119,1,0,0,0,0,0,0,0,0,0,0,0,0,0,160,119,1,0,128,119,1,0,88,119,1,0,16,119,1,0,240,118,1,0,208,118,1,0,120,118,1,0,0,0,0,0,160,119,1,0,128,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,10,84,65,66,76,69,10,32,32,50,10,76,84,89,80,69,10,32,55,48,10,32,32,32,32,37,100,10,48,10,76,84,89,80,69,10,32,32,50,10,67,79,78,84,73,78,85,79,85,83,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,83,111,108,105,100,32,108,105,110,101,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,32,48,10,32,52,48,10,48,46,48,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,68,65,83,72,69,68,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,50,10,32,52,48,10,48,46,55,53,10,32,52,57,10,48,46,53,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,72,73,68,68,69,78,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,50,10,32,52,48,10,48,46,51,55,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,49,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,67,69,78,84,69,82,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,52,10,32,52,48,10,50,46,48,10,32,52,57,10,49,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,80,72,65,78,84,79,77,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,95,95,95,32,95,32,95,32,95,95,95,95,95,32,95,32,95,32,95,95,95,95,95,32,95,32,95,32,95,95,95,95,95,32,95,32,95,32,95,95,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,54,10,32,52,48,10,50,46,53,10,32,52,57,10,49,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,68,79,84,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,50,10,32,52,48,10,48,46,50,53,10,32,52,57,10,48,46,48,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,68,65,83,72,68,79,84,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,52,10,32,52,48,10,49,46,48,10,32,52,57,10,48,46,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,48,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,69,78,68,84,65,66,10,0,0,0,0,0,0,0,57,57,57,10,37,37,32,71,78,85,80,76,79,84,58,32,100,120,102,32,102,105,108,101,32,102,111,114,32,65,117,116,111,67,97,100,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,72,69,65,68,69,82,10,32,32,57,10,36,69,88,84,77,73,78,10,32,49,48,10,48,46,48,48,48,10,32,50,48,10,48,46,48,48,48,10,32,32,57,10,36,69,88,84,77,65,88,10,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,32,57,10,36,76,73,77,77,73,78,10,32,49,48,10,48,46,48,48,48,10,32,50,48,10,48,46,48,48,48,10,32,32,57,10,36,76,73,77,77,65,88,10,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,32,57,10,36,84,69,88,84,83,84,89,76,69,10,32,32,55,10,37,115,10,32,32,57,10,36,84,69,88,84,83,73,90,69,10,32,52,48,10,37,45,54,46,51,102,10,32,32,57,10,36,80,76,73,78,69,87,73,68,10,32,52,48,10,37,45,54,46,52,102,10,32,32,57,10,36,76,84,83,67,65,76,69,10,32,32,52,48,10,37,45,54,46,51,102,10,32,32,57,10,36,67,79,79,82,68,83,10,32,55,48,10,32,32,49,10,32,32,57,10,36,67,69,76,84,89,80,69,10,32,54,10,66,89,76,65,89,69,82,10,32,32,57,10,36,67,76,65,89,69,82,10,32,32,56,10,48,10,32,32,57,10,36,67,69,67,79,76,79,82,10,32,54,50,10,32,32,32,37,115,10,32,32,57,10,36,77,69,78,85,10,32,32,49,10,97,99,97,100,10,32,32,48,10,69,78,68,83,69,67,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,84,65,66,76,69,83,10,0,0,0,0,0,208,149,2,0,0,0,0,0,200,149,2,0,1,0,0,0,0,224,1,0,2,0,0,0,184,149,2,0,3,0,0,0,192,253,1,0,4,0,0,0,0,0,0,0,5,0,0,0,42,35,36,37,64,38,61,0,0,0,0,0,0,0,0,0,200,172,3,0,0,0,0,0,255,255,255,255,255,255,15,0,255,0,255,0,255,15,240,0,255,127,240,0,7,7,7,7,255,7,255,7,255,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,208,2,0,0,0,0,0,112,249,1,0,1,0,0,0,248,142,2,0,2,0,0,0,224,142,2,0,2,0,0,0,0,0,0,0,3,0,0,0,49,46,48,0,0,0,0,0,50,48,49,49,45,49,49,45,48,53,0,0,0,0,0,0,99,101,110,116,101,114,0,0,0,0,108,101,102,116,0,0,0,0,0,0,114,105,103,104,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,64,0,0,0,0,0,0,8,64,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,20,64,0,0,0,0,0,0,8,64,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,48,254,1,0,0,0,0,0,192,253,1,0,1,0,0,0,88,253,1,0,2,0,0,0,24,253,1,0,3,0,0,0,224,252,1,0,4,0,0,0,144,252,1,0,5,0,0,0,0,252,1,0,6,0,0,0,200,251,1,0,7,0,0,0,72,251,1,0,8,0,0,0,208,250,1,0,9,0,0,0,40,250,1,0,9,0,0,0,112,249,1,0,10,0,0,0,80,248,1,0,11,0,0,0,232,247,1,0,12,0,0,0,128,247,1,0,13,0,0,0,48,26,2,0,14,0,0,0,8,247,1,0,15,0,0,0,16,24,2,0,16,0,0,0,96,3,2,0,17,0,0,0,152,246,1,0,18,0,0,0,48,246,1,0,19,0,0,0,224,245,1,0,19,0,0,0,144,245,1,0,20,0,0,0,40,245,1,0,20,0,0,0,96,244,1,0,21,0,0,0,216,243,1,0,21,0,0,0,128,243,1,0,22,0,0,0,248,242,1,0,23,0,0,0,104,242,1,0,22,0,0,0,8,242,1,0,22,0,0,0,184,241,1,0,23,0,0,0,240,240,1,0,24,0,0,0,120,240,1,0,25,0,0,0,192,229,1,0,27,0,0,0,232,239,1,0,26,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,50,1,0,0,0,0,0,24,135,2,0,1,0,0,0,224,155,2,0,2,0,0,0,0,135,2,0,11,0,0,0,232,134,2,0,11,0,0,0,152,208,2,0,3,0,0,0,144,195,1,0,4,0,0,0,80,195,1,0,4,0,0,0,56,117,1,0,5,0,0,0,200,134,2,0,6,0,0,0,80,248,1,0,7,0,0,0,40,195,1,0,8,0,0,0,184,134,2,0,9,0,0,0,40,245,1,0,9,0,0,0,176,134,2,0,10,0,0,0,136,82,3,0,12,0,0,0,0,0,0,0,13,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,1,0,0,0,8,0,0,0,1,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,1,0,0,0,13,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,6,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,7,0,0,0,4,0,0,0,11,0,0,0,4,0,0,0,12,0,0,0,4,0,0,0,15,0,0,0,4,0,0,0,16,0,0,0,4,0,0,0,17,0,0,0,4,0,0,0,18,0,0,0,4,0,0,0,19,0,0,0,5,0,0,0,2,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,10,0,0,0,5,0,0,0,14,0,0,0,5,0,0,0,15,0,0,0,5,0,0,0,16,0,0,0,5,0,0,0,18,0,0,0,5,0,0,0,22,0,0,0,5,0,0,0,23,0,0,0,5,0,0,0,24,0,0,0,5,0,0,0,27,0,0,0,5,0,0,0,28,0,0,0,5,0,0,0,29,0,0,0,5,0,0,0,30,0,0,0,5,0,0,0,34,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,9,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,192,229,1,0,1,0,0,0,128,91,2,0,2,0,0,0,64,85,3,0,3,0,0,0,192,253,1,0,0,0,0,0,152,10,2,0,4,0,0,0,136,85,3,0,7,0,0,0,168,85,3,0,7,0,0,0,120,91,2,0,8,0,0,0,0,224,1,0,9,0,0,0,192,218,1,0,10,0,0,0,40,245,1,0,6,0,0,0,144,245,1,0,6,0,0,0,72,91,2,0,5,0,0,0,96,244,1,0,11,0,0,0,176,1,2,0,12,0,0,0,152,82,3,0,13,0,0,0,48,246,1,0,14,0,0,0,224,245,1,0,14,0,0,0,176,82,3,0,15,0,0,0,16,24,2,0,16,0,0,0,136,82,3,0,17,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,128,2,0,8,128,2,0,224,127,2,0,184,127,2,0,40,127,2,0,216,126,2,0,144,126,2,0,120,126,2,0,80,126,2,0,208,125,2,0,168,125,2,0,112,125,2,0,88,125,2,0,16,125,2,0,248,124,2,0,224,124,2,0,192,124,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-, "i8", ALLOC_NONE, Runtime.GLOBAL_BASE)
-function runPostSets() {
-}
-if (!awaitingMemoryInitializer) runPostSets();
-var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);
-assert(tempDoublePtr % 8 == 0);
-function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
- HEAP8[tempDoublePtr] = HEAP8[ptr];
- HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
- HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
- HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
-}
-function copyTempDouble(ptr) {
- HEAP8[tempDoublePtr] = HEAP8[ptr];
- HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
- HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
- HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
- HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
- HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
- HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
- HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
-}
- var _log=Math.log;
- var _fabs=Math.abs;
- var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:35,EIDRM:36,ECHRNG:37,EL2NSYNC:38,EL3HLT:39,EL3RST:40,ELNRNG:41,EUNATCH:42,ENOCSI:43,EL2HLT:44,EDEADLK:45,ENOLCK:46,EBADE:50,EBADR:51,EXFULL:52,ENOANO:53,EBADRQC:54,EBADSLT:55,EDEADLOCK:56,EBFONT:57,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:74,ELBIN:75,EDOTDOT:76,EBADMSG:77,EFTYPE:79,ENOTUNIQ:80,EBADFD:81,EREMCHG:82,ELIBACC:83,ELIBBAD:84,ELIBSCN:85,ELIBMAX:86,ELIBEXEC:87,ENOSYS:88,ENMFILE:89,ENOTEMPTY:90,ENAMETOOLONG:91,ELOOP:92,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:106,EPROTOTYPE:107,ENOTSOCK:108,ENOPROTOOPT:109,ESHUTDOWN:110,ECONNREFUSED:111,EADDRINUSE:112,ECONNABORTED:113,ENETUNREACH:114,ENETDOWN:115,ETIMEDOUT:116,EHOSTDOWN:117,EHOSTUNREACH:118,EINPROGRESS:119,EALREADY:120,EDESTADDRREQ:121,EMSGSIZE:122,EPROTONOSUPPORT:123,ESOCKTNOSUPPORT:124,EADDRNOTAVAIL:125,ENETRESET:126,EISCONN:127,ENOTCONN:128,ETOOMANYREFS:129,EPROCLIM:130,EUSERS:131,EDQUOT:132,ESTALE:133,ENOTSUP:134,ENOMEDIUM:135,ENOSHARE:136,ECASECLASH:137,EILSEQ:138,EOVERFLOW:139,ECANCELED:140,ENOTRECOVERABLE:141,EOWNERDEAD:142,ESTRPIPE:143};
- var ___errno_state=0;function ___setErrNo(value) {
- // For convenient setting and returning of errno.
- HEAP32[((___errno_state)>>2)]=value
- return value;
- }
- var _stdin=allocate(1, "i32*", ALLOC_STATIC);
- var _stdout=allocate(1, "i32*", ALLOC_STATIC);
- var _stderr=allocate(1, "i32*", ALLOC_STATIC);
- var __impure_ptr=allocate(1, "i32*", ALLOC_STATIC);var FS={currentPath:"/",nextInode:2,streams:[null],ignorePermissions:true,createFileHandle:function (stream, fd) {
- if (typeof stream === 'undefined') {
- stream = null;
- }
- if (!fd) {
- if (stream && stream.socket) {
- for (var i = 1; i < 64; i++) {
- if (!FS.streams[i]) {
- fd = i;
- break;
- }
- }
- assert(fd, 'ran out of low fds for sockets');
- } else {
- fd = Math.max(FS.streams.length, 64);
- for (var i = FS.streams.length; i < fd; i++) {
- FS.streams[i] = null; // Keep dense
- }
- }
- }
- // Close WebSocket first if we are about to replace the fd (i.e. dup2)
- if (FS.streams[fd] && FS.streams[fd].socket && FS.streams[fd].socket.close) {
- FS.streams[fd].socket.close();
- }
- FS.streams[fd] = stream;
- return fd;
- },removeFileHandle:function (fd) {
- FS.streams[fd] = null;
- },joinPath:function (parts, forceRelative) {
- var ret = parts[0];
- for (var i = 1; i < parts.length; i++) {
- if (ret[ret.length-1] != '/') ret += '/';
- ret += parts[i];
- }
- if (forceRelative && ret[0] == '/') ret = ret.substr(1);
- return ret;
- },absolutePath:function (relative, base) {
- if (typeof relative !== 'string') return null;
- if (base === undefined) base = FS.currentPath;
- if (relative && relative[0] == '/') base = '';
- var full = base + '/' + relative;
- var parts = full.split('/').reverse();
- var absolute = [''];
- while (parts.length) {
- var part = parts.pop();
- if (part == '' || part == '.') {
- // Nothing.
- } else if (part == '..') {
- if (absolute.length > 1) absolute.pop();
- } else {
- absolute.push(part);
- }
- }
- return absolute.length == 1 ? '/' : absolute.join('/');
- },analyzePath:function (path, dontResolveLastLink, linksVisited) {
- var ret = {
- isRoot: false,
- exists: false,
- error: 0,
- name: null,
- path: null,
- object: null,
- parentExists: false,
- parentPath: null,
- parentObject: null
- };
- path = FS.absolutePath(path);
- if (path == '/') {
- ret.isRoot = true;
- ret.exists = ret.parentExists = true;
- ret.name = '/';
- ret.path = ret.parentPath = '/';
- ret.object = ret.parentObject = FS.root;
- } else if (path !== null) {
- linksVisited = linksVisited || 0;
- path = path.slice(1).split('/');
- var current = FS.root;
- var traversed = [''];
- while (path.length) {
- if (path.length == 1 && current.isFolder) {
- ret.parentExists = true;
- ret.parentPath = traversed.length == 1 ? '/' : traversed.join('/');
- ret.parentObject = current;
- ret.name = path[0];
- }
- var target = path.shift();
- if (!current.isFolder) {
- ret.error = ERRNO_CODES.ENOTDIR;
- break;
- } else if (!current.read) {
- ret.error = ERRNO_CODES.EACCES;
- break;
- } else if (!current.contents.hasOwnProperty(target)) {
- ret.error = ERRNO_CODES.ENOENT;
- break;
- }
- current = current.contents[target];
- if (current.link && !(dontResolveLastLink && path.length == 0)) {
- if (linksVisited > 40) { // Usual Linux SYMLOOP_MAX.
- ret.error = ERRNO_CODES.ELOOP;
- break;
- }
- var link = FS.absolutePath(current.link, traversed.join('/'));
- ret = FS.analyzePath([link].concat(path).join('/'),
- dontResolveLastLink, linksVisited + 1);
- return ret;
- }
- traversed.push(target);
- if (path.length == 0) {
- ret.exists = true;
- ret.path = traversed.join('/');
- ret.object = current;
- }
- }
- }
- return ret;
- },findObject:function (path, dontResolveLastLink) {
- FS.ensureRoot();
- var ret = FS.analyzePath(path, dontResolveLastLink);
- if (ret.exists) {
- return ret.object;
- } else {
- ___setErrNo(ret.error);
- return null;
- }
- },createObject:function (parent, name, properties, canRead, canWrite) {
- if (!parent) parent = '/';
- if (typeof parent === 'string') parent = FS.findObject(parent);
- if (!parent) {
- ___setErrNo(ERRNO_CODES.EACCES);
- throw new Error('Parent path must exist.');
- }
- if (!parent.isFolder) {
- ___setErrNo(ERRNO_CODES.ENOTDIR);
- throw new Error('Parent must be a folder.');
- }
- if (!parent.write && !FS.ignorePermissions) {
- ___setErrNo(ERRNO_CODES.EACCES);
- throw new Error('Parent folder must be writeable.');
- }
- if (!name || name == '.' || name == '..') {
- ___setErrNo(ERRNO_CODES.ENOENT);
- throw new Error('Name must not be empty.');
- }
- if (parent.contents.hasOwnProperty(name)) {
- ___setErrNo(ERRNO_CODES.EEXIST);
- throw new Error("Can't overwrite object.");
- }
- parent.contents[name] = {
- read: canRead === undefined ? true : canRead,
- write: canWrite === undefined ? false : canWrite,
- timestamp: Date.now(),
- inodeNumber: FS.nextInode++
- };
- for (var key in properties) {
- if (properties.hasOwnProperty(key)) {
- parent.contents[name][key] = properties[key];
- }
- }
- return parent.contents[name];
- },createFolder:function (parent, name, canRead, canWrite) {
- var properties = {isFolder: true, isDevice: false, contents: {}};
- return FS.createObject(parent, name, properties, canRead, canWrite);
- },createPath:function (parent, path, canRead, canWrite) {
- var current = FS.findObject(parent);
- if (current === null) throw new Error('Invalid parent.');
- path = path.split('/').reverse();
- while (path.length) {
- var part = path.pop();
- if (!part) continue;
- if (!current.contents.hasOwnProperty(part)) {
- FS.createFolder(current, part, canRead, canWrite);
- }
- current = current.contents[part];
- }
- return current;
- },createFile:function (parent, name, properties, canRead, canWrite) {
- properties.isFolder = false;
- return FS.createObject(parent, name, properties, canRead, canWrite);
- },createDataFile:function (parent, name, data, canRead, canWrite) {
- if (typeof data === 'string') {
- var dataArray = new Array(data.length);
- for (var i = 0, len = data.length; i < len; ++i) dataArray[i] = data.charCodeAt(i);
- data = dataArray;
- }
- var properties = {
- isDevice: false,
- contents: data.subarray ? data.subarray(0) : data // as an optimization, create a new array wrapper (not buffer) here, to help JS engines understand this object
- };
- return FS.createFile(parent, name, properties, canRead, canWrite);
- },createLazyFile:function (parent, name, url, canRead, canWrite) {
- if (typeof XMLHttpRequest !== 'undefined') {
- if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
- // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
- var LazyUint8Array = function() {
- this.lengthKnown = false;
- this.chunks = []; // Loaded chunks. Index is the chunk number
- }
- LazyUint8Array.prototype.get = function(idx) {
- if (idx > this.length-1 || idx < 0) {
- return undefined;
- }
- var chunkOffset = idx % this.chunkSize;
- var chunkNum = Math.floor(idx / this.chunkSize);
- return this.getter(chunkNum)[chunkOffset];
- }
- LazyUint8Array.prototype.setDataGetter = function(getter) {
- this.getter = getter;
- }
- LazyUint8Array.prototype.cacheLength = function() {
- // Find length
- var xhr = new XMLHttpRequest();
- xhr.open('HEAD', url, false);
- xhr.send(null);
- if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
- var datalength = Number(xhr.getResponseHeader("Content-length"));
- var header;
- var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
- var chunkSize = 1024*1024; // Chunk size in bytes
- if (!hasByteServing) chunkSize = datalength;
- // Function to get a range from the remote URL.
- var doXHR = (function(from, to) {
- if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
- if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");
- // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, false);
- if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
- // Some hints to the browser that we want binary data.
- if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
- if (xhr.overrideMimeType) {
- xhr.overrideMimeType('text/plain; charset=x-user-defined');
- }
- xhr.send(null);
- if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
- if (xhr.response !== undefined) {
- return new Uint8Array(xhr.response || []);
- } else {
- return intArrayFromString(xhr.responseText || '', true);
- }
- });
- var lazyArray = this;
- lazyArray.setDataGetter(function(chunkNum) {
- var start = chunkNum * chunkSize;
- var end = (chunkNum+1) * chunkSize - 1; // including this byte
- end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
- if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
- lazyArray.chunks[chunkNum] = doXHR(start, end);
- }
- if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
- return lazyArray.chunks[chunkNum];
- });
- this._length = datalength;
- this._chunkSize = chunkSize;
- this.lengthKnown = true;
- }
- var lazyArray = new LazyUint8Array();
- Object.defineProperty(lazyArray, "length", {
- get: function() {
- if(!this.lengthKnown) {
- this.cacheLength();
- }
- return this._length;
- }
- });
- Object.defineProperty(lazyArray, "chunkSize", {
- get: function() {
- if(!this.lengthKnown) {
- this.cacheLength();
- }
- return this._chunkSize;
- }
- });
- var properties = { isDevice: false, contents: lazyArray };
- } else {
- var properties = { isDevice: false, url: url };
- }
- return FS.createFile(parent, name, properties, canRead, canWrite);
- },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile) {
- Browser.init();
- var fullname = FS.joinPath([parent, name], true);
- function processData(byteArray) {
- function finish(byteArray) {
- if (!dontCreateFile) {
- FS.createDataFile(parent, name, byteArray, canRead, canWrite);
- }
- if (onload) onload();
- removeRunDependency('cp ' + fullname);
- }
- var handled = false;
- Module['preloadPlugins'].forEach(function(plugin) {
- if (handled) return;
- if (plugin['canHandle'](fullname)) {
- plugin['handle'](byteArray, fullname, finish, function() {
- if (onerror) onerror();
- removeRunDependency('cp ' + fullname);
- });
- handled = true;
- }
- });
- if (!handled) finish(byteArray);
- }
- addRunDependency('cp ' + fullname);
- if (typeof url == 'string') {
- Browser.asyncLoad(url, function(byteArray) {
- processData(byteArray);
- }, onerror);
- } else {
- processData(url);
- }
- },createLink:function (parent, name, target, canRead, canWrite) {
- var properties = {isDevice: false, link: target};
- return FS.createFile(parent, name, properties, canRead, canWrite);
- },createDevice:function (parent, name, input, output) {
- if (!(input || output)) {
- throw new Error('A device must have at least one callback defined.');
- }
- var ops = {isDevice: true, input: input, output: output};
- return FS.createFile(parent, name, ops, Boolean(input), Boolean(output));
- },forceLoadFile:function (obj) {
- if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
- var success = true;
- if (typeof XMLHttpRequest !== 'undefined') {
- throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
- } else if (Module['read']) {
- // Command-line.
- try {
- // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
- // read() will try to parse UTF8.
- obj.contents = intArrayFromString(Module['read'](obj.url), true);
- } catch (e) {
- success = false;
- }
- } else {
- throw new Error('Cannot load without read() or XMLHttpRequest.');
- }
- if (!success) ___setErrNo(ERRNO_CODES.EIO);
- return success;
- },ensureRoot:function () {
- if (FS.root) return;
- // The main file system tree. All the contents are inside this.
- FS.root = {
- read: true,
- write: true,
- isFolder: true,
- isDevice: false,
- timestamp: Date.now(),
- inodeNumber: 1,
- contents: {}
- };
- },init:function (input, output, error) {
- // Make sure we initialize only once.
- assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');
- FS.init.initialized = true;
- FS.ensureRoot();
- // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
- input = input || Module['stdin'];
- output = output || Module['stdout'];
- error = error || Module['stderr'];
- // Default handlers.
- var stdinOverridden = true, stdoutOverridden = true, stderrOverridden = true;
- if (!input) {
- stdinOverridden = false;
- input = function() {
- if (!input.cache || !input.cache.length) {
- var result;
- if (typeof window != 'undefined' &&
- typeof window.prompt == 'function') {
- // Browser.
- result = window.prompt('Input: ');
- if (result === null) result = String.fromCharCode(0); // cancel ==> EOF
- } else if (typeof readline == 'function') {
- // Command line.
- result = readline();
- }
- if (!result) result = '';
- input.cache = intArrayFromString(result + '\n', true);
- }
- return input.cache.shift();
- };
- }
- var utf8 = new Runtime.UTF8Processor();
- function simpleOutput(val) {
- if (val === null || val === 10) {
- output.printer(output.buffer.join(''));
- output.buffer = [];
- } else {
- output.buffer.push(utf8.processCChar(val));
- }
- }
- if (!output) {
- stdoutOverridden = false;
- output = simpleOutput;
- }
- if (!output.printer) output.printer = Module['print'];
- if (!output.buffer) output.buffer = [];
- if (!error) {
- stderrOverridden = false;
- error = simpleOutput;
- }
- if (!error.printer) error.printer = Module['print'];
- if (!error.buffer) error.buffer = [];
- // Create the temporary folder, if not already created
- try {
- FS.createFolder('/', 'tmp', true, true);
- } catch(e) {}
- // Create the I/O devices.
- var devFolder = FS.createFolder('/', 'dev', true, true);
- var stdin = FS.createDevice(devFolder, 'stdin', input);
- var stdout = FS.createDevice(devFolder, 'stdout', null, output);
- var stderr = FS.createDevice(devFolder, 'stderr', null, error);
- FS.createDevice(devFolder, 'tty', input, output);
- FS.createDevice(devFolder, 'null', function(){}, function(){});
- // Create default streams.
- FS.streams[1] = {
- path: '/dev/stdin',
- object: stdin,
- position: 0,
- isRead: true,
- isWrite: false,
- isAppend: false,
- isTerminal: !stdinOverridden,
- error: false,
- eof: false,
- ungotten: []
- };
- FS.streams[2] = {
- path: '/dev/stdout',
- object: stdout,
- position: 0,
- isRead: false,
- isWrite: true,
- isAppend: false,
- isTerminal: !stdoutOverridden,
- error: false,
- eof: false,
- ungotten: []
- };
- FS.streams[3] = {
- path: '/dev/stderr',
- object: stderr,
- position: 0,
- isRead: false,
- isWrite: true,
- isAppend: false,
- isTerminal: !stderrOverridden,
- error: false,
- eof: false,
- ungotten: []
- };
- // TODO: put these low in memory like we used to assert on: assert(Math.max(_stdin, _stdout, _stderr) < 15000); // make sure these are low, we flatten arrays with these
- HEAP32[((_stdin)>>2)]=1;
- HEAP32[((_stdout)>>2)]=2;
- HEAP32[((_stderr)>>2)]=3;
- // Other system paths
- FS.createPath('/', 'dev/shm/tmp', true, true); // temp files
- // Newlib initialization
- for (var i = FS.streams.length; i < Math.max(_stdin, _stdout, _stderr) + 4; i++) {
- FS.streams[i] = null; // Make sure to keep FS.streams dense
- }
- FS.streams[_stdin] = FS.streams[1];
- FS.streams[_stdout] = FS.streams[2];
- FS.streams[_stderr] = FS.streams[3];
- allocate([ allocate(
- [0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0],
- 'void*', ALLOC_NORMAL) ], 'void*', ALLOC_NONE, __impure_ptr);
- },quit:function () {
- if (!FS.init.initialized) return;
- // Flush any partially-printed lines in stdout and stderr. Careful, they may have been closed
- if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output(10);
- if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output(10);
- },standardizePath:function (path) {
- if (path.substr(0, 2) == './') path = path.substr(2);
- return path;
- },deleteFile:function (path) {
- path = FS.analyzePath(path);
- if (!path.parentExists || !path.exists) {
- throw 'Invalid path ' + path;
- }
- delete path.parentObject.contents[path.name];
- }};
- function _send(fd, buf, len, flags) {
- var info = FS.streams[fd];
- if (!info) return -1;
- info.sender(HEAPU8.subarray(buf, buf+len));
- return len;
- }
- function _pwrite(fildes, buf, nbyte, offset) {
- // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
- var stream = FS.streams[fildes];
- if (!stream || stream.object.isDevice) {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- } else if (!stream.isWrite) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return -1;
- } else if (stream.object.isFolder) {
- ___setErrNo(ERRNO_CODES.EISDIR);
- return -1;
- } else if (nbyte < 0 || offset < 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- } else {
- var contents = stream.object.contents;
- while (contents.length < offset) contents.push(0);
- for (var i = 0; i < nbyte; i++) {
- contents[offset + i] = HEAPU8[(((buf)+(i))|0)];
- }
- stream.object.timestamp = Date.now();
- return i;
- }
- }function _write(fildes, buf, nbyte) {
- // ssize_t write(int fildes, const void *buf, size_t nbyte);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
- var stream = FS.streams[fildes];
- if (stream && ('socket' in stream)) {
- return _send(fildes, buf, nbyte, 0);
- } else if (!stream) {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- } else if (!stream.isWrite) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return -1;
- } else if (nbyte < 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- } else {
- if (stream.object.isDevice) {
- if (stream.object.output) {
- for (var i = 0; i < nbyte; i++) {
- try {
- stream.object.output(HEAP8[(((buf)+(i))|0)]);
- } catch (e) {
- ___setErrNo(ERRNO_CODES.EIO);
- return -1;
- }
- }
- stream.object.timestamp = Date.now();
- return i;
- } else {
- ___setErrNo(ERRNO_CODES.ENXIO);
- return -1;
- }
- } else {
- var bytesWritten = _pwrite(fildes, buf, nbyte, stream.position);
- if (bytesWritten != -1) stream.position += bytesWritten;
- return bytesWritten;
- }
- }
- }function _fwrite(ptr, size, nitems, stream) {
- // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html
- var bytesToWrite = nitems * size;
- if (bytesToWrite == 0) return 0;
- var bytesWritten = _write(stream, ptr, bytesToWrite);
- if (bytesWritten == -1) {
- if (FS.streams[stream]) FS.streams[stream].error = true;
- return 0;
- } else {
- return Math.floor(bytesWritten / size);
- }
- }
- Module["_strlen"] = _strlen;
- function __reallyNegative(x) {
- return x < 0 || (x === 0 && (1/x) === -Infinity);
- }function __formatString(format, varargs) {
- var textIndex = format;
- var argIndex = 0;
- function getNextArg(type) {
- // NOTE: Explicitly ignoring type safety. Otherwise this fails:
- // int x = 4; printf("%c\n", (char)x);
- var ret;
- if (type === 'double') {
- ret = HEAPF64[(((varargs)+(argIndex))>>3)];
- } else if (type == 'i64') {
- ret = [HEAP32[(((varargs)+(argIndex))>>2)],
- HEAP32[(((varargs)+(argIndex+8))>>2)]];
- argIndex += 8; // each 32-bit chunk is in a 64-bit block
- } else {
- type = 'i32'; // varargs are always i32, i64, or double
- ret = HEAP32[(((varargs)+(argIndex))>>2)];
- }
- argIndex += Math.max(Runtime.getNativeFieldSize(type), Runtime.getAlignSize(type, null, true));
- return ret;
- }
- var ret = [];
- var curr, next, currArg;
- while(1) {
- var startTextIndex = textIndex;
- curr = HEAP8[(textIndex)];
- if (curr === 0) break;
- next = HEAP8[((textIndex+1)|0)];
- if (curr == 37) {
- // Handle flags.
- var flagAlwaysSigned = false;
- var flagLeftAlign = false;
- var flagAlternative = false;
- var flagZeroPad = false;
- flagsLoop: while (1) {
- switch (next) {
- case 43:
- flagAlwaysSigned = true;
- break;
- case 45:
- flagLeftAlign = true;
- break;
- case 35:
- flagAlternative = true;
- break;
- case 48:
- if (flagZeroPad) {
- break flagsLoop;
- } else {
- flagZeroPad = true;
- break;
- }
- default:
- break flagsLoop;
- }
- textIndex++;
- next = HEAP8[((textIndex+1)|0)];
- }
- // Handle width.
- var width = 0;
- if (next == 42) {
- width = getNextArg('i32');
- textIndex++;
- next = HEAP8[((textIndex+1)|0)];
- } else {
- while (next >= 48 && next <= 57) {
- width = width * 10 + (next - 48);
- textIndex++;
- next = HEAP8[((textIndex+1)|0)];
- }
- }
- // Handle precision.
- var precisionSet = false;
- if (next == 46) {
- var precision = 0;
- precisionSet = true;
- textIndex++;
- next = HEAP8[((textIndex+1)|0)];
- if (next == 42) {
- precision = getNextArg('i32');
- textIndex++;
- } else {
- while(1) {
- var precisionChr = HEAP8[((textIndex+1)|0)];
- if (precisionChr < 48 ||
- precisionChr > 57) break;
- precision = precision * 10 + (precisionChr - 48);
- textIndex++;
- }
- }
- next = HEAP8[((textIndex+1)|0)];
- } else {
- var precision = 6; // Standard default.
- }
- // Handle integer sizes. WARNING: These assume a 32-bit architecture!
- var argSize;
- switch (String.fromCharCode(next)) {
- case 'h':
- var nextNext = HEAP8[((textIndex+2)|0)];
- if (nextNext == 104) {
- textIndex++;
- argSize = 1; // char (actually i32 in varargs)
- } else {
- argSize = 2; // short (actually i32 in varargs)
- }
- break;
- case 'l':
- var nextNext = HEAP8[((textIndex+2)|0)];
- if (nextNext == 108) {
- textIndex++;
- argSize = 8; // long long
- } else {
- argSize = 4; // long
- }
- break;
- case 'L': // long long
- case 'q': // int64_t
- case 'j': // intmax_t
- argSize = 8;
- break;
- case 'z': // size_t
- case 't': // ptrdiff_t
- case 'I': // signed ptrdiff_t or unsigned size_t
- argSize = 4;
- break;
- default:
- argSize = null;
- }
- if (argSize) textIndex++;
- next = HEAP8[((textIndex+1)|0)];
- // Handle type specifier.
- switch (String.fromCharCode(next)) {
- case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {
- // Integer.
- var signed = next == 100 || next == 105;
- argSize = argSize || 4;
- var currArg = getNextArg('i' + (argSize * 8));
- var origArg = currArg;
- var argText;
- // Flatten i64-1 [low, high] into a (slightly rounded) double
- if (argSize == 8) {
- currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);
- }
- // Truncate to requested size.
- if (argSize <= 4) {
- var limit = Math.pow(256, argSize) - 1;
- currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);
- }
- // Format the number.
- var currAbsArg = Math.abs(currArg);
- var prefix = '';
- if (next == 100 || next == 105) {
- if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else
- argText = reSign(currArg, 8 * argSize, 1).toString(10);
- } else if (next == 117) {
- if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else
- argText = unSign(currArg, 8 * argSize, 1).toString(10);
- currArg = Math.abs(currArg);
- } else if (next == 111) {
- argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);
- } else if (next == 120 || next == 88) {
- prefix = (flagAlternative && currArg != 0) ? '0x' : '';
- if (argSize == 8 && i64Math) {
- if (origArg[1]) {
- argText = (origArg[1]>>>0).toString(16);
- var lower = (origArg[0]>>>0).toString(16);
- while (lower.length < 8) lower = '0' + lower;
- argText += lower;
- } else {
- argText = (origArg[0]>>>0).toString(16);
- }
- } else
- if (currArg < 0) {
- // Represent negative numbers in hex as 2's complement.
- currArg = -currArg;
- argText = (currAbsArg - 1).toString(16);
- var buffer = [];
- for (var i = 0; i < argText.length; i++) {
- buffer.push((0xF - parseInt(argText[i], 16)).toString(16));
- }
- argText = buffer.join('');
- while (argText.length < argSize * 2) argText = 'f' + argText;
- } else {
- argText = currAbsArg.toString(16);
- }
- if (next == 88) {
- prefix = prefix.toUpperCase();
- argText = argText.toUpperCase();
- }
- } else if (next == 112) {
- if (currAbsArg === 0) {
- argText = '(nil)';
- } else {
- prefix = '0x';
- argText = currAbsArg.toString(16);
- }
- }
- if (precisionSet) {
- while (argText.length < precision) {
- argText = '0' + argText;
- }
- }
- // Add sign if needed
- if (flagAlwaysSigned) {
- if (currArg < 0) {
- prefix = '-' + prefix;
- } else {
- prefix = '+' + prefix;
- }
- }
- // Add padding.
- while (prefix.length + argText.length < width) {
- if (flagLeftAlign) {
- argText += ' ';
- } else {
- if (flagZeroPad) {
- argText = '0' + argText;
- } else {
- prefix = ' ' + prefix;
- }
- }
- }
- // Insert the result into the buffer.
- argText = prefix + argText;
- argText.split('').forEach(function(chr) {
- ret.push(chr.charCodeAt(0));
- });
- break;
- }
- case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {
- // Float.
- var currArg = getNextArg('double');
- var argText;
- if (isNaN(currArg)) {
- argText = 'nan';
- flagZeroPad = false;
- } else if (!isFinite(currArg)) {
- argText = (currArg < 0 ? '-' : '') + 'inf';
- flagZeroPad = false;
- } else {
- var isGeneral = false;
- var effectivePrecision = Math.min(precision, 20);
- // Convert g/G to f/F or e/E, as per:
- // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html
- if (next == 103 || next == 71) {
- isGeneral = true;
- precision = precision || 1;
- var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);
- if (precision > exponent && exponent >= -4) {
- next = ((next == 103) ? 'f' : 'F').charCodeAt(0);
- precision -= exponent + 1;
- } else {
- next = ((next == 103) ? 'e' : 'E').charCodeAt(0);
- precision--;
- }
- effectivePrecision = Math.min(precision, 20);
- }
- if (next == 101 || next == 69) {
- argText = currArg.toExponential(effectivePrecision);
- // Make sure the exponent has at least 2 digits.
- if (/[eE][-+]\d$/.test(argText)) {
- argText = argText.slice(0, -1) + '0' + argText.slice(-1);
- }
- } else if (next == 102 || next == 70) {
- argText = currArg.toFixed(effectivePrecision);
- if (currArg === 0 && __reallyNegative(currArg)) {
- argText = '-' + argText;
- }
- }
- var parts = argText.split('e');
- if (isGeneral && !flagAlternative) {
- // Discard trailing zeros and periods.
- while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&
- (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {
- parts[0] = parts[0].slice(0, -1);
- }
- } else {
- // Make sure we have a period in alternative mode.
- if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';
- // Zero pad until required precision.
- while (precision > effectivePrecision++) parts[0] += '0';
- }
- argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');
- // Capitalize 'E' if needed.
- if (next == 69) argText = argText.toUpperCase();
- // Add sign.
- if (flagAlwaysSigned && currArg >= 0) {
- argText = '+' + argText;
- }
- }
- // Add padding.
- while (argText.length < width) {
- if (flagLeftAlign) {
- argText += ' ';
- } else {
- if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
- argText = argText[0] + '0' + argText.slice(1);
- } else {
- argText = (flagZeroPad ? '0' : ' ') + argText;
- }
- }
- }
- // Adjust case.
- if (next < 97) argText = argText.toUpperCase();
- // Insert the result into the buffer.
- argText.split('').forEach(function(chr) {
- ret.push(chr.charCodeAt(0));
- });
- break;
- }
- case 's': {
- // String.
- var arg = getNextArg('i8*');
- var argLength = arg ? _strlen(arg) : '(null)'.length;
- if (precisionSet) argLength = Math.min(argLength, precision);
- if (!flagLeftAlign) {
- while (argLength < width--) {
- ret.push(32);
- }
- }
- if (arg) {
- for (var i = 0; i < argLength; i++) {
- ret.push(HEAPU8[((arg++)|0)]);
- }
- } else {
- ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));
- }
- if (flagLeftAlign) {
- while (argLength < width--) {
- ret.push(32);
- }
- }
- break;
- }
- case 'c': {
- // Character.
- if (flagLeftAlign) ret.push(getNextArg('i8'));
- while (--width > 0) {
- ret.push(32);
- }
- if (!flagLeftAlign) ret.push(getNextArg('i8'));
- break;
- }
- case 'n': {
- // Write the length written so far to the next parameter.
- var ptr = getNextArg('i32*');
- HEAP32[((ptr)>>2)]=ret.length
- break;
- }
- case '%': {
- // Literal percent sign.
- ret.push(curr);
- break;
- }
- default: {
- // Unknown specifiers remain untouched.
- for (var i = startTextIndex; i < textIndex + 2; i++) {
- ret.push(HEAP8[(i)]);
- }
- }
- }
- textIndex += 2;
- // TODO: Support a/A (hex float) and m (last error) specifiers.
- // TODO: Support %1${specifier} for arg selection.
- } else {
- ret.push(curr);
- textIndex += 1;
- }
- }
- return ret;
- }function _fprintf(stream, format, varargs) {
- // int fprintf(FILE *restrict stream, const char *restrict format, ...);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
- var result = __formatString(format, varargs);
- var stack = Runtime.stackSave();
- var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);
- Runtime.stackRestore(stack);
- return ret;
- }
- Module["_strcpy"] = _strcpy;
- function _strncmp(px, py, n) {
- var i = 0;
- while (i < n) {
- var x = HEAPU8[(((px)+(i))|0)];
- var y = HEAPU8[(((py)+(i))|0)];
- if (x == y && x == 0) return 0;
- if (x == 0) return -1;
- if (y == 0) return 1;
- if (x == y) {
- i ++;
- continue;
- } else {
- return x > y ? 1 : -1;
- }
- }
- return 0;
- }function _strcmp(px, py) {
- return _strncmp(px, py, TOTAL_MEMORY);
- }
- var _exp=Math.exp;
- var _ceil=Math.ceil;
- function _log10(x) {
- return Math.log(x) / Math.LN10;
- }
- function _snprintf(s, n, format, varargs) {
- // int snprintf(char *restrict s, size_t n, const char *restrict format, ...);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
- var result = __formatString(format, varargs);
- var limit = (n === undefined) ? result.length
- : Math.min(result.length, Math.max(n - 1, 0));
- if (s < 0) {
- s = -s;
- var buf = _malloc(limit+1);
- HEAP32[((s)>>2)]=buf;
- s = buf;
- }
- for (var i = 0; i < limit; i++) {
- HEAP8[(((s)+(i))|0)]=result[i];
- }
- if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0;
- return result.length;
- }function _sprintf(s, format, varargs) {
- // int sprintf(char *restrict s, const char *restrict format, ...);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
- return _snprintf(s, undefined, format, varargs);
- }
- Module["_strcat"] = _strcat;
- function _strchr(ptr, chr) {
- ptr--;
- do {
- ptr++;
- var val = HEAP8[(ptr)];
- if (val == chr) return ptr;
- } while (val);
- return 0;
- }
- var _floor=Math.floor;
- var _llvm_pow_f64=Math.pow;
- Module["_memcpy"] = _memcpy;var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;
- Module["_memset"] = _memset;var _llvm_memset_p0i8_i32=_memset;
- function _ftell(stream) {
- // long ftell(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/ftell.html
- if (FS.streams[stream]) {
- stream = FS.streams[stream];
- if (stream.object.isDevice) {
- ___setErrNo(ERRNO_CODES.ESPIPE);
- return -1;
- } else {
- return stream.position;
- }
- } else {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- }
- }
- function _lseek(fildes, offset, whence) {
- // off_t lseek(int fildes, off_t offset, int whence);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/lseek.html
- if (FS.streams[fildes] && !FS.streams[fildes].object.isDevice) {
- var stream = FS.streams[fildes];
- var position = offset;
- if (whence === 1) { // SEEK_CUR.
- position += stream.position;
- } else if (whence === 2) { // SEEK_END.
- position += stream.object.contents.length;
- }
- if (position < 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- } else {
- stream.ungotten = [];
- stream.position = position;
- return position;
- }
- } else {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- }
- }function _fseek(stream, offset, whence) {
- // int fseek(FILE *stream, long offset, int whence);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fseek.html
- var ret = _lseek(stream, offset, whence);
- if (ret == -1) {
- return -1;
- } else {
- FS.streams[stream].eof = false;
- return 0;
- }
- }function _rewind(stream) {
- // void rewind(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/rewind.html
- _fseek(stream, 0, 0); // SEEK_SET.
- if (FS.streams[stream]) FS.streams[stream].error = false;
- }
- function _recv(fd, buf, len, flags) {
- var info = FS.streams[fd];
- if (!info) return -1;
- if (!info.hasData()) {
- ___setErrNo(ERRNO_CODES.EAGAIN); // no data, and all sockets are nonblocking, so this is the right behavior
- return -1;
- }
- var buffer = info.inQueue.shift();
- if (len < buffer.length) {
- if (info.stream) {
- // This is tcp (reliable), so if not all was read, keep it
- info.inQueue.unshift(buffer.subarray(len));
- }
- buffer = buffer.subarray(0, len);
- }
- HEAPU8.set(buffer, buf);
- return buffer.length;
- }
- function _pread(fildes, buf, nbyte, offset) {
- // ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html
- var stream = FS.streams[fildes];
- if (!stream || stream.object.isDevice) {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- } else if (!stream.isRead) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return -1;
- } else if (stream.object.isFolder) {
- ___setErrNo(ERRNO_CODES.EISDIR);
- return -1;
- } else if (nbyte < 0 || offset < 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- } else {
- var bytesRead = 0;
- while (stream.ungotten.length && nbyte > 0) {
- HEAP8[((buf++)|0)]=stream.ungotten.pop()
- nbyte--;
- bytesRead++;
- }
- var contents = stream.object.contents;
- var size = Math.min(contents.length - offset, nbyte);
- if (contents.subarray) { // typed array
- HEAPU8.set(contents.subarray(offset, offset+size), buf);
- } else
- if (contents.slice) { // normal array
- for (var i = 0; i < size; i++) {
- HEAP8[(((buf)+(i))|0)]=contents[offset + i]
- }
- } else {
- for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
- HEAP8[(((buf)+(i))|0)]=contents.get(offset + i)
- }
- }
- bytesRead += size;
- return bytesRead;
- }
- }function _read(fildes, buf, nbyte) {
- // ssize_t read(int fildes, void *buf, size_t nbyte);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html
- var stream = FS.streams[fildes];
- if (stream && ('socket' in stream)) {
- return _recv(fildes, buf, nbyte, 0);
- } else if (!stream) {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- } else if (!stream.isRead) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return -1;
- } else if (nbyte < 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- } else {
- var bytesRead;
- if (stream.object.isDevice) {
- if (stream.object.input) {
- bytesRead = 0;
- while (stream.ungotten.length && nbyte > 0) {
- HEAP8[((buf++)|0)]=stream.ungotten.pop()
- nbyte--;
- bytesRead++;
- }
- for (var i = 0; i < nbyte; i++) {
- try {
- var result = stream.object.input();
- } catch (e) {
- ___setErrNo(ERRNO_CODES.EIO);
- return -1;
- }
- if (result === undefined && bytesRead === 0) {
- ___setErrNo(ERRNO_CODES.EAGAIN);
- return -1;
- }
- if (result === null || result === undefined) break;
- bytesRead++;
- HEAP8[(((buf)+(i))|0)]=result
- }
- return bytesRead;
- } else {
- ___setErrNo(ERRNO_CODES.ENXIO);
- return -1;
- }
- } else {
- var ungotSize = stream.ungotten.length;
- bytesRead = _pread(fildes, buf, nbyte, stream.position);
- if (bytesRead != -1) {
- stream.position += (stream.ungotten.length - ungotSize) + bytesRead;
- }
- return bytesRead;
- }
- }
- }function _fread(ptr, size, nitems, stream) {
- // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html
- var bytesToRead = nitems * size;
- if (bytesToRead == 0) return 0;
- var bytesRead = _read(stream, ptr, bytesToRead);
- var streamObj = FS.streams[stream];
- if (bytesRead == -1) {
- if (streamObj) streamObj.error = true;
- return 0;
- } else {
- if (bytesRead < bytesToRead) streamObj.eof = true;
- return Math.floor(bytesRead / size);
- }
- }
- function _close(fildes) {
- // int close(int fildes);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/close.html
- if (FS.streams[fildes]) {
- if (FS.streams[fildes].currentEntry) {
- _free(FS.streams[fildes].currentEntry);
- }
- FS.streams[fildes] = null;
- return 0;
- } else {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- }
- }
- function _fsync(fildes) {
- // int fsync(int fildes);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fsync.html
- if (FS.streams[fildes]) {
- // We write directly to the file system, so there's nothing to do here.
- return 0;
- } else {
- ___setErrNo(ERRNO_CODES.EBADF);
- return -1;
- }
- }function _fclose(stream) {
- // int fclose(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fclose.html
- _fsync(stream);
- return _close(stream);
- }
- function _strcspn(pstr, pset) {
- var str = pstr, set, strcurr, setcurr;
- while (1) {
- strcurr = HEAP8[(str)];
- if (!strcurr) return str - pstr;
- set = pset;
- while (1) {
- setcurr = HEAP8[(set)];
- if (!setcurr || setcurr == strcurr) break;
- set++;
- }
- if (setcurr) return str - pstr;
- str++;
- }
- }
- Module["_strncpy"] = _strncpy;
- function _isspace(chr) {
- return chr in { 32: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0 };
- }function __parseInt(str, endptr, base, min, max, bits, unsign) {
- // Skip space.
- while (_isspace(HEAP8[(str)])) str++;
- // Check for a plus/minus sign.
- var multiplier = 1;
- if (HEAP8[(str)] == 45) {
- multiplier = -1;
- str++;
- } else if (HEAP8[(str)] == 43) {
- str++;
- }
- // Find base.
- var finalBase = base;
- if (!finalBase) {
- if (HEAP8[(str)] == 48) {
- if (HEAP8[((str+1)|0)] == 120 ||
- HEAP8[((str+1)|0)] == 88) {
- finalBase = 16;
- str += 2;
- } else {
- finalBase = 8;
- str++;
- }
- }
- } else if (finalBase==16) {
- if (HEAP8[(str)] == 48) {
- if (HEAP8[((str+1)|0)] == 120 ||
- HEAP8[((str+1)|0)] == 88) {
- str += 2;
- }
- }
- }
- if (!finalBase) finalBase = 10;
- // Get digits.
- var chr;
- var ret = 0;
- while ((chr = HEAP8[(str)]) != 0) {
- var digit = parseInt(String.fromCharCode(chr), finalBase);
- if (isNaN(digit)) {
- break;
- } else {
- ret = ret * finalBase + digit;
- str++;
- }
- }
- // Apply sign.
- ret *= multiplier;
- // Set end pointer.
- if (endptr) {
- HEAP32[((endptr)>>2)]=str
- }
- // Unsign if needed.
- if (unsign) {
- if (Math.abs(ret) > max) {
- ret = max;
- ___setErrNo(ERRNO_CODES.ERANGE);
- } else {
- ret = unSign(ret, bits);
- }
- }
- // Validate range.
- if (ret > max || ret < min) {
- ret = ret > max ? max : min;
- ___setErrNo(ERRNO_CODES.ERANGE);
- }
- if (bits == 64) {
- return ((asm["setTempRet0"](Math.min(Math.floor((ret)/(+(4294967296))), (+(4294967295)))>>>0),ret>>>0)|0);
- }
- return ret;
- }function _strtol(str, endptr, base) {
- return __parseInt(str, endptr, base, -2147483648, 2147483647, 32); // LONG_MIN, LONG_MAX.
- }function _atoi(ptr) {
- return _strtol(ptr, null, 10);
- }
- function _strstr(ptr1, ptr2) {
- var check = 0, start;
- do {
- if (!check) {
- start = ptr1;
- check = ptr2;
- }
- var curr1 = HEAP8[((ptr1++)|0)];
- var curr2 = HEAP8[((check++)|0)];
- if (curr2 == 0) return start;
- if (curr2 != curr1) {
- // rewind to one character after start, to find ez in eeez
- ptr1 = start + 1;
- check = 0;
- }
- } while (curr1);
- return 0;
- }
- Module["_memcmp"] = _memcmp;
- function _fputs(s, stream) {
- // int fputs(const char *restrict s, FILE *restrict stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html
- return _write(stream, s, _strlen(s));
- }
- Module["_memmove"] = _memmove;var _llvm_memmove_p0i8_p0i8_i32=_memmove;
- function _fflush(stream) {
- // int fflush(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
- var flush = function(filedes) {
- // Right now we write all data directly, except for output devices.
- if (FS.streams[filedes] && FS.streams[filedes].object.output) {
- if (!FS.streams[filedes].isTerminal) { // don't flush terminals, it would cause a \n to also appear
- FS.streams[filedes].object.output(null);
- }
- }
- };
- try {
- if (stream === 0) {
- for (var i = 0; i < FS.streams.length; i++) if (FS.streams[i]) flush(i);
- } else {
- flush(stream);
- }
- return 0;
- } catch (e) {
- ___setErrNo(ERRNO_CODES.EIO);
- return -1;
- }
- }
- function __exit(status) {
- // void _exit(int status);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
- function ExitStatus() {
- this.name = "ExitStatus";
- this.message = "Program terminated with exit(" + status + ")";
- this.status = status;
- Module.print('Exit Status: ' + status);
- };
- ExitStatus.prototype = new Error();
- ExitStatus.prototype.constructor = ExitStatus;
- exitRuntime();
- ABORT = true;
- throw new ExitStatus();
- }function _exit(status) {
- __exit(status);
- }
- function _fgetc(stream) {
- // int fgetc(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html
- if (!FS.streams[stream]) return -1;
- var streamObj = FS.streams[stream];
- if (streamObj.eof || streamObj.error) return -1;
- var ret = _read(stream, _fgetc.ret, 1);
- if (ret == 0) {
- streamObj.eof = true;
- return -1;
- } else if (ret == -1) {
- streamObj.error = true;
- return -1;
- } else {
- return HEAPU8[((_fgetc.ret)|0)];
- }
- }function _fgets(s, n, stream) {
- // char *fgets(char *restrict s, int n, FILE *restrict stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgets.html
- if (!FS.streams[stream]) return 0;
- var streamObj = FS.streams[stream];
- if (streamObj.error || streamObj.eof) return 0;
- var byte_;
- for (var i = 0; i < n - 1 && byte_ != 10; i++) {
- byte_ = _fgetc(stream);
- if (byte_ == -1) {
- if (streamObj.error || (streamObj.eof && i == 0)) return 0;
- else if (streamObj.eof) break;
- }
- HEAP8[(((s)+(i))|0)]=byte_
- }
- HEAP8[(((s)+(i))|0)]=0
- return s;
- }
- function _usleep(useconds) {
- // int usleep(useconds_t useconds);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html
- // We're single-threaded, so use a busy loop. Super-ugly.
- var msec = useconds / 1000;
- var start = Date.now();
- while (Date.now() - start < msec) {
- // Do nothing.
- }
- return 0;
- }
- function _fputc(c, stream) {
- // int fputc(int c, FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html
- var chr = unSign(c & 0xFF);
- HEAP8[((_fputc.ret)|0)]=chr
- var ret = _write(stream, _fputc.ret, 1);
- if (ret == -1) {
- if (FS.streams[stream]) FS.streams[stream].error = true;
- return -1;
- } else {
- return chr;
- }
- }
- function _pclose(stream) {
- // int pclose(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/pclose.html
- // We allow only one process, so no pipes.
- ___setErrNo(ERRNO_CODES.ECHILD);
- return -1;
- }
- function _puts(s) {
- // int puts(const char *s);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html
- // NOTE: puts() always writes an extra newline.
- var stdout = HEAP32[((_stdout)>>2)];
- var ret = _fputs(s, stdout);
- if (ret < 0) {
- return ret;
- } else {
- var newlineRet = _fputc(10, stdout);
- return (newlineRet < 0) ? -1 : ret + 1;
- }
- }
- var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"No message of desired type",36:"Identifier removed",37:"Channel number out of range",38:"Level 2 not synchronized",39:"Level 3 halted",40:"Level 3 reset",41:"Link number out of range",42:"Protocol driver not attached",43:"No CSI structure available",44:"Level 2 halted",45:"Deadlock condition",46:"No record locks available",50:"Invalid exchange",51:"Invalid request descriptor",52:"Exchange full",53:"No anode",54:"Invalid request code",55:"Invalid slot",56:"File locking deadlock error",57:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",74:"Multihop attempted",75:"Inode is remote (not really error)",76:"Cross mount point (not really error)",77:"Trying to read unreadable message",79:"Inappropriate file type or format",80:"Given log. name not unique",81:"f.d. invalid for this operation",82:"Remote address changed",83:"Can\t access a needed shared lib",84:"Accessing a corrupted shared lib",85:".lib section in a.out corrupted",86:"Attempting to link in too many libs",87:"Attempting to exec a shared library",88:"Function not implemented",89:"No more files",90:"Directory not empty",91:"File or path name too long",92:"Too many symbolic links",95:"Operation not supported on transport endpoint",96:"Protocol family not supported",104:"Connection reset by peer",105:"No buffer space available",106:"Address family not supported by protocol family",107:"Protocol wrong type for socket",108:"Socket operation on non-socket",109:"Protocol not available",110:"Can't send after socket shutdown",111:"Connection refused",112:"Address already in use",113:"Connection aborted",114:"Network is unreachable",115:"Network interface is not configured",116:"Connection timed out",117:"Host is down",118:"Host is unreachable",119:"Connection already in progress",120:"Socket already connected",121:"Destination address required",122:"Message too long",123:"Unknown protocol",124:"Socket type not supported",125:"Address not available",126:"ENETRESET",127:"Socket is already connected",128:"Socket is not connected",129:"TOOMANYREFS",130:"EPROCLIM",131:"EUSERS",132:"EDQUOT",133:"ESTALE",134:"Not supported",135:"No medium (in tape drive)",136:"No such host or network path",137:"Filename exists with different case",138:"EILSEQ",139:"Value too large for defined data type",140:"Operation canceled",141:"State not recoverable",142:"Previous owner died",143:"Streams pipe error"};function _strerror_r(errnum, strerrbuf, buflen) {
- if (errnum in ERRNO_MESSAGES) {
- if (ERRNO_MESSAGES[errnum].length > buflen - 1) {
- return ___setErrNo(ERRNO_CODES.ERANGE);
- } else {
- var msg = ERRNO_MESSAGES[errnum];
- for (var i = 0; i < msg.length; i++) {
- HEAP8[(((strerrbuf)+(i))|0)]=msg.charCodeAt(i)
- }
- HEAP8[(((strerrbuf)+(i))|0)]=0
- return 0;
- }
- } else {
- return ___setErrNo(ERRNO_CODES.EINVAL);
- }
- }function _strerror(errnum) {
- if (!_strerror.buffer) _strerror.buffer = _malloc(256);
- _strerror_r(errnum, _strerror.buffer, 256);
- return _strerror.buffer;
- }
- function ___errno_location() {
- return ___errno_state;
- }function _perror(s) {
- // void perror(const char *s);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/perror.html
- var stdout = HEAP32[((_stdout)>>2)];
- if (s) {
- _fputs(s, stdout);
- _fputc(58, stdout);
- _fputc(32, stdout);
- }
- var errnum = HEAP32[((___errno_location())>>2)];
- _puts(_strerror(errnum));
- }
- function _popen(command, mode) {
- // FILE *popen(const char *command, const char *mode);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/popen.html
- // We allow only one process, so no pipes.
- ___setErrNo(ERRNO_CODES.EMFILE);
- return 0;
- }
- var ___dirent_struct_layout={__size__:1040,d_ino:0,d_name:4,d_off:1028,d_reclen:1032,d_type:1036};function _open(path, oflag, varargs) {
- // int open(const char *path, int oflag, ...);
- // http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html
- // NOTE: This implementation tries to mimic glibc rather than strictly
- // following the POSIX standard.
- var mode = HEAP32[((varargs)>>2)];
- // Simplify flags.
- var accessMode = oflag & 3;
- var isWrite = accessMode != 0;
- var isRead = accessMode != 1;
- var isCreate = Boolean(oflag & 512);
- var isExistCheck = Boolean(oflag & 2048);
- var isTruncate = Boolean(oflag & 1024);
- var isAppend = Boolean(oflag & 8);
- // Verify path.
- var origPath = path;
- path = FS.analyzePath(Pointer_stringify(path));
- if (!path.parentExists) {
- ___setErrNo(path.error);
- return -1;
- }
- var target = path.object || null;
- var finalPath;
- // Verify the file exists, create if needed and allowed.
- if (target) {
- if (isCreate && isExistCheck) {
- ___setErrNo(ERRNO_CODES.EEXIST);
- return -1;
- }
- if ((isWrite || isCreate || isTruncate) && target.isFolder) {
- ___setErrNo(ERRNO_CODES.EISDIR);
- return -1;
- }
- if (isRead && !target.read || isWrite && !target.write) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return -1;
- }
- if (isTruncate && !target.isDevice) {
- target.contents = [];
- } else {
- if (!FS.forceLoadFile(target)) {
- ___setErrNo(ERRNO_CODES.EIO);
- return -1;
- }
- }
- finalPath = path.path;
- } else {
- if (!isCreate) {
- ___setErrNo(ERRNO_CODES.ENOENT);
- return -1;
- }
- if (!path.parentObject.write) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return -1;
- }
- target = FS.createDataFile(path.parentObject, path.name, [],
- mode & 0x100, mode & 0x80); // S_IRUSR, S_IWUSR.
- finalPath = path.parentPath + '/' + path.name;
- }
- // Actually create an open stream.
- var id;
- if (target.isFolder) {
- var entryBuffer = 0;
- if (___dirent_struct_layout) {
- entryBuffer = _malloc(___dirent_struct_layout.__size__);
- }
- var contents = [];
- for (var key in target.contents) contents.push(key);
- id = FS.createFileHandle({
- path: finalPath,
- object: target,
- // An index into contents. Special values: -2 is ".", -1 is "..".
- position: -2,
- isRead: true,
- isWrite: false,
- isAppend: false,
- error: false,
- eof: false,
- ungotten: [],
- // Folder-specific properties:
- // Remember the contents at the time of opening in an array, so we can
- // seek between them relying on a single order.
- contents: contents,
- // Each stream has its own area for readdir() returns.
- currentEntry: entryBuffer
- });
- } else {
- id = FS.createFileHandle({
- path: finalPath,
- object: target,
- position: 0,
- isRead: isRead,
- isWrite: isWrite,
- isAppend: isAppend,
- error: false,
- eof: false,
- ungotten: []
- });
- }
- return id;
- }function _fopen(filename, mode) {
- // FILE *fopen(const char *restrict filename, const char *restrict mode);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fopen.html
- var flags;
- mode = Pointer_stringify(mode);
- if (mode[0] == 'r') {
- if (mode.indexOf('+') != -1) {
- flags = 2;
- } else {
- flags = 0;
- }
- } else if (mode[0] == 'w') {
- if (mode.indexOf('+') != -1) {
- flags = 2;
- } else {
- flags = 1;
- }
- flags |= 512;
- flags |= 1024;
- } else if (mode[0] == 'a') {
- if (mode.indexOf('+') != -1) {
- flags = 2;
- } else {
- flags = 1;
- }
- flags |= 512;
- flags |= 8;
- } else {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return 0;
- }
- var ret = _open(filename, flags, allocate([0x1FF, 0, 0, 0], 'i32', ALLOC_STACK)); // All creation permissions.
- return (ret == -1) ? 0 : ret;
- }
- var _putc=_fputc;
- function _getcwd(buf, size) {
- // char *getcwd(char *buf, size_t size);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/getcwd.html
- if (size == 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return 0;
- } else if (size < FS.currentPath.length + 1) {
- ___setErrNo(ERRNO_CODES.ERANGE);
- return 0;
- } else {
- for (var i = 0; i < FS.currentPath.length; i++) {
- HEAP8[(((buf)+(i))|0)]=FS.currentPath.charCodeAt(i)
- }
- HEAP8[(((buf)+(i))|0)]=0
- return buf;
- }
- }
- var _environ=allocate(1, "i32*", ALLOC_STATIC);var ___environ=_environ;function ___buildEnvironment(env) {
- // WARNING: Arbitrary limit!
- var MAX_ENV_VALUES = 64;
- var TOTAL_ENV_SIZE = 1024;
- // Statically allocate memory for the environment.
- var poolPtr;
- var envPtr;
- if (!___buildEnvironment.called) {
- ___buildEnvironment.called = true;
- // Set default values. Use string keys for Closure Compiler compatibility.
- ENV['USER'] = 'root';
- ENV['PATH'] = '/';
- ENV['PWD'] = '/';
- ENV['HOME'] = '/home/emscripten';
- ENV['LANG'] = 'en_US.UTF-8';
- ENV['_'] = './this.program';
- // Allocate memory.
- poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC);
- envPtr = allocate(MAX_ENV_VALUES * 4,
- 'i8*', ALLOC_STATIC);
- HEAP32[((envPtr)>>2)]=poolPtr
- HEAP32[((_environ)>>2)]=envPtr;
- } else {
- envPtr = HEAP32[((_environ)>>2)];
- poolPtr = HEAP32[((envPtr)>>2)];
- }
- // Collect key=value lines.
- var strings = [];
- var totalSize = 0;
- for (var key in env) {
- if (typeof env[key] === 'string') {
- var line = key + '=' + env[key];
- strings.push(line);
- totalSize += line.length;
- }
- }
- if (totalSize > TOTAL_ENV_SIZE) {
- throw new Error('Environment size exceeded TOTAL_ENV_SIZE!');
- }
- // Make new.
- var ptrSize = 4;
- for (var i = 0; i < strings.length; i++) {
- var line = strings[i];
- for (var j = 0; j < line.length; j++) {
- HEAP8[(((poolPtr)+(j))|0)]=line.charCodeAt(j);
- }
- HEAP8[(((poolPtr)+(j))|0)]=0;
- HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr;
- poolPtr += line.length + 1;
- }
- HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0;
- }var ENV={};function _getenv(name) {
- // char *getenv(const char *name);
- // http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html
- if (name === 0) return 0;
- name = Pointer_stringify(name);
- if (!ENV.hasOwnProperty(name)) return 0;
- if (_getenv.ret) _free(_getenv.ret);
- _getenv.ret = allocate(intArrayFromString(ENV[name]), 'i8', ALLOC_NORMAL);
- return _getenv.ret;
- }
- function _strncat(pdest, psrc, num) {
- var len = _strlen(pdest);
- var i = 0;
- while(1) {
- HEAP8[((pdest+len+i)|0)]=HEAP8[((psrc+i)|0)];
- if (HEAP8[(((pdest)+(len+i))|0)] == 0) break;
- i ++;
- if (i == num) {
- HEAP8[(((pdest)+(len+i))|0)]=0
- break;
- }
- }
- return pdest;
- }
- function _printf(format, varargs) {
- // int printf(const char *restrict format, ...);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
- var stdout = HEAP32[((_stdout)>>2)];
- return _fprintf(stdout, format, varargs);
- }
- function _system(command) {
- // int system(const char *command);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/system.html
- // Can't call external programs.
- ___setErrNo(ERRNO_CODES.EAGAIN);
- return -1;
- }
- function _isalpha(chr) {
- return (chr >= 97 && chr <= 122) ||
- (chr >= 65 && chr <= 90);
- }
- function _isalnum(chr) {
- return (chr >= 48 && chr <= 57) ||
- (chr >= 97 && chr <= 122) ||
- (chr >= 65 && chr <= 90);
- }
- var _getc=_fgetc;
- function _chdir(path) {
- // int chdir(const char *path);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/chdir.html
- // NOTE: The path argument may be a string, to simplify fchdir().
- if (typeof path !== 'string') path = Pointer_stringify(path);
- path = FS.analyzePath(path);
- if (!path.exists) {
- ___setErrNo(path.error);
- return -1;
- } else if (!path.object.isFolder) {
- ___setErrNo(ERRNO_CODES.ENOTDIR);
- return -1;
- } else {
- FS.currentPath = path.path;
- return 0;
- }
- }
- function _tmpnam(s, dir, prefix) {
- // char *tmpnam(char *s);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpnam.html
- // NOTE: The dir and prefix arguments are for internal use only.
- var folder = FS.findObject(dir || '/tmp');
- if (!folder || !folder.isFolder) {
- dir = '/tmp';
- folder = FS.findObject(dir);
- if (!folder || !folder.isFolder) return 0;
- }
- var name = prefix || 'file';
- do {
- name += String.fromCharCode(65 + Math.floor(Math.random() * 25));
- } while (name in folder.contents);
- var result = dir + '/' + name;
- if (!_tmpnam.buffer) _tmpnam.buffer = _malloc(256);
- if (!s) s = _tmpnam.buffer;
- for (var i = 0; i < result.length; i++) {
- HEAP8[(((s)+(i))|0)]=result.charCodeAt(i);
- }
- HEAP8[(((s)+(i))|0)]=0;
- return s;
- }function _tmpfile() {
- // FILE *tmpfile(void);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpfile.html
- // TODO: Delete the created file on closing.
- if (_tmpfile.mode) {
- _tmpfile.mode = allocate(intArrayFromString('w+'), 'i8', ALLOC_NORMAL);
- }
- return _fopen(_tmpnam(0), _tmpfile.mode);
- }
- function _memchr(ptr, chr, num) {
- chr = unSign(chr);
- for (var i = 0; i < num; i++) {
- if (HEAP8[(ptr)] == chr) return ptr;
- ptr++;
- }
- return 0;
- }
- var _sqrt=Math.sqrt;
- function _fileno(stream) {
- // int fileno(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
- // We use file descriptor numbers and FILE* streams interchangeably.
- return stream;
- }
- function _fdopen(fildes, mode) {
- // FILE *fdopen(int fildes, const char *mode);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/fdopen.html
- if (FS.streams[fildes]) {
- var stream = FS.streams[fildes];
- mode = Pointer_stringify(mode);
- if ((mode.indexOf('w') != -1 && !stream.isWrite) ||
- (mode.indexOf('r') != -1 && !stream.isRead) ||
- (mode.indexOf('a') != -1 && !stream.isAppend) ||
- (mode.indexOf('+') != -1 && (!stream.isRead || !stream.isWrite))) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return 0;
- } else {
- stream.error = false;
- stream.eof = false;
- return fildes;
- }
- } else {
- ___setErrNo(ERRNO_CODES.EBADF);
- return 0;
- }
- }
- var ___stat_struct_layout={__size__:68,st_dev:0,st_ino:4,st_mode:8,st_nlink:12,st_uid:16,st_gid:20,st_rdev:24,st_size:28,st_atime:32,st_spare1:36,st_mtime:40,st_spare2:44,st_ctime:48,st_spare3:52,st_blksize:56,st_blocks:60,st_spare4:64};function _stat(path, buf, dontResolveLastLink) {
- // http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html
- // int stat(const char *path, struct stat *buf);
- // NOTE: dontResolveLastLink is a shortcut for lstat(). It should never be
- // used in client code.
- var obj = FS.findObject(Pointer_stringify(path), dontResolveLastLink);
- if (obj === null || !FS.forceLoadFile(obj)) return -1;
- var offsets = ___stat_struct_layout;
- // Constants.
- HEAP32[(((buf)+(offsets.st_nlink))>>2)]=1
- HEAP32[(((buf)+(offsets.st_uid))>>2)]=0
- HEAP32[(((buf)+(offsets.st_gid))>>2)]=0
- HEAP32[(((buf)+(offsets.st_blksize))>>2)]=4096
- // Variables.
- HEAP32[(((buf)+(offsets.st_ino))>>2)]=obj.inodeNumber
- var time = Math.floor(obj.timestamp / 1000);
- if (offsets.st_atime === undefined) {
- offsets.st_atime = offsets.st_atim.tv_sec;
- offsets.st_mtime = offsets.st_mtim.tv_sec;
- offsets.st_ctime = offsets.st_ctim.tv_sec;
- var nanosec = (obj.timestamp % 1000) * 1000;
- HEAP32[(((buf)+(offsets.st_atim.tv_nsec))>>2)]=nanosec
- HEAP32[(((buf)+(offsets.st_mtim.tv_nsec))>>2)]=nanosec
- HEAP32[(((buf)+(offsets.st_ctim.tv_nsec))>>2)]=nanosec
- }
- HEAP32[(((buf)+(offsets.st_atime))>>2)]=time
- HEAP32[(((buf)+(offsets.st_mtime))>>2)]=time
- HEAP32[(((buf)+(offsets.st_ctime))>>2)]=time
- var mode = 0;
- var size = 0;
- var blocks = 0;
- var dev = 0;
- var rdev = 0;
- if (obj.isDevice) {
- // Device numbers reuse inode numbers.
- dev = rdev = obj.inodeNumber;
- size = blocks = 0;
- mode = 0x2000; // S_IFCHR.
- } else {
- dev = 1;
- rdev = 0;
- // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
- // but this is not required by the standard.
- if (obj.isFolder) {
- size = 4096;
- blocks = 1;
- mode = 0x4000; // S_IFDIR.
- } else {
- var data = obj.contents || obj.link;
- size = data.length;
- blocks = Math.ceil(data.length / 4096);
- mode = obj.link === undefined ? 0x8000 : 0xA000; // S_IFREG, S_IFLNK.
- }
- }
- HEAP32[(((buf)+(offsets.st_dev))>>2)]=dev;
- HEAP32[(((buf)+(offsets.st_rdev))>>2)]=rdev;
- HEAP32[(((buf)+(offsets.st_size))>>2)]=size
- HEAP32[(((buf)+(offsets.st_blocks))>>2)]=blocks
- if (obj.read) mode |= 0x16D; // S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH.
- if (obj.write) mode |= 0x92; // S_IWUSR | S_IWGRP | S_IWOTH.
- HEAP32[(((buf)+(offsets.st_mode))>>2)]=mode
- return 0;
- }
- function _feof(stream) {
- // int feof(FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/feof.html
- return Number(FS.streams[stream] && FS.streams[stream].eof);
- }
- function _setlocale(category, locale) {
- if (!_setlocale.ret) _setlocale.ret = allocate([0], 'i8', ALLOC_NORMAL);
- return _setlocale.ret;
- }
- function ___fpclassifyf(x) {
- if (isNaN(x)) return 0;
- if (!isFinite(x)) return 1;
- if (x == 0) return 2;
- // FP_SUBNORMAL..?
- return 4;
- }var ___fpclassifyd=___fpclassifyf;
- var _cos=Math.cos;
- var _sin=Math.sin;
- Module["_tolower"] = _tolower;
- Module["_strncasecmp"] = _strncasecmp;
- Module["_strcasecmp"] = _strcasecmp;
- function _strrchr(ptr, chr) {
- var ptr2 = ptr + _strlen(ptr);
- do {
- if (HEAP8[(ptr2)] == chr) return ptr2;
- ptr2--;
- } while (ptr2 >= ptr);
- return 0;
- }
- function _strspn(pstr, pset) {
- var str = pstr, set, strcurr, setcurr;
- while (1) {
- strcurr = HEAP8[(str)];
- if (!strcurr) return str - pstr;
- set = pset;
- while (1) {
- setcurr = HEAP8[(set)];
- if (!setcurr || setcurr == strcurr) break;
- set++;
- }
- if (!setcurr) return str - pstr;
- str++;
- }
- }
- function _strpbrk(ptr1, ptr2) {
- var curr;
- var searchSet = {};
- while (1) {
- var curr = HEAP8[((ptr2++)|0)];
- if (!curr) break;
- searchSet[curr] = 1;
- }
- while (1) {
- curr = HEAP8[(ptr1)];
- if (!curr) break;
- if (curr in searchSet) return ptr1;
- ptr1++;
- }
- return 0;
- }
- function __isFloat(text) {
- return !!(/^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?$/.exec(text));
- }function __scanString(format, get, unget, varargs) {
- if (!__scanString.whiteSpace) {
- __scanString.whiteSpace = {};
- __scanString.whiteSpace[32] = 1;
- __scanString.whiteSpace[9] = 1;
- __scanString.whiteSpace[10] = 1;
- __scanString.whiteSpace[11] = 1;
- __scanString.whiteSpace[12] = 1;
- __scanString.whiteSpace[13] = 1;
- __scanString.whiteSpace[' '] = 1;
- __scanString.whiteSpace['\t'] = 1;
- __scanString.whiteSpace['\n'] = 1;
- __scanString.whiteSpace['\v'] = 1;
- __scanString.whiteSpace['\f'] = 1;
- __scanString.whiteSpace['\r'] = 1;
- }
- // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf.
- // TODO: Support all format specifiers.
- format = Pointer_stringify(format);
- var soFar = 0;
- if (format.indexOf('%n') >= 0) {
- // need to track soFar
- var _get = get;
- get = function() {
- soFar++;
- return _get();
- }
- var _unget = unget;
- unget = function() {
- soFar--;
- return _unget();
- }
- }
- var formatIndex = 0;
- var argsi = 0;
- var fields = 0;
- var argIndex = 0;
- var next;
- mainLoop:
- for (var formatIndex = 0; formatIndex < format.length;) {
- if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') {
- var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
- argIndex += Runtime.getAlignSize('void*', null, true);
- HEAP32[((argPtr)>>2)]=soFar;
- formatIndex += 2;
- continue;
- }
- // TODO: Support strings like "%5c" etc.
- if (format[formatIndex] === '%' && format[formatIndex+1] == 'c') {
- var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
- argIndex += Runtime.getAlignSize('void*', null, true);
- fields++;
- next = get();
- HEAP8[(argPtr)]=next
- formatIndex += 2;
- continue;
- }
- // remove whitespace
- while (1) {
- next = get();
- if (next == 0) return fields;
- if (!(next in __scanString.whiteSpace)) break;
- }
- unget();
- if (format[formatIndex] === '%') {
- formatIndex++;
- var suppressAssignment = false;
- if (format[formatIndex] == '*') {
- suppressAssignment = true;
- formatIndex++;
- }
- var maxSpecifierStart = formatIndex;
- while (format[formatIndex].charCodeAt(0) >= 48 &&
- format[formatIndex].charCodeAt(0) <= 57) {
- formatIndex++;
- }
- var max_;
- if (formatIndex != maxSpecifierStart) {
- max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10);
- }
- var long_ = false;
- var half = false;
- var longLong = false;
- if (format[formatIndex] == 'l') {
- long_ = true;
- formatIndex++;
- if (format[formatIndex] == 'l') {
- longLong = true;
- formatIndex++;
- }
- } else if (format[formatIndex] == 'h') {
- half = true;
- formatIndex++;
- }
- var type = format[formatIndex];
- formatIndex++;
- var curr = 0;
- var buffer = [];
- // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later
- if (type == 'f' || type == 'e' || type == 'g' ||
- type == 'F' || type == 'E' || type == 'G') {
- var last = 0;
- next = get();
- while (next > 0) {
- buffer.push(String.fromCharCode(next));
- if (__isFloat(buffer.join(''))) {
- last = buffer.length;
- }
- next = get();
- }
- for (var i = 0; i < buffer.length - last + 1; i++) {
- unget();
- }
- buffer.length = last;
- } else {
- next = get();
- var first = true;
- while ((curr < max_ || isNaN(max_)) && next > 0) {
- if (!(next in __scanString.whiteSpace) && // stop on whitespace
- (type == 's' ||
- ((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) ||
- (first && next == 45))) ||
- ((type === 'x' || type === 'X') && (next >= 48 && next <= 57 ||
- next >= 97 && next <= 102 ||
- next >= 65 && next <= 70))) &&
- (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up
- buffer.push(String.fromCharCode(next));
- next = get();
- curr++;
- first = false;
- } else {
- break;
- }
- }
- unget();
- }
- if (buffer.length === 0) return 0; // Failure.
- if (suppressAssignment) continue;
- var text = buffer.join('');
- var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
- argIndex += Runtime.getAlignSize('void*', null, true);
- switch (type) {
- case 'd': case 'u': case 'i':
- if (half) {
- HEAP16[((argPtr)>>1)]=parseInt(text, 10);
- } else if (longLong) {
- (tempI64 = [parseInt(text, 10)>>>0,Math.min(Math.floor((parseInt(text, 10))/(+(4294967296))), (+(4294967295)))>>>0],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]);
- } else {
- HEAP32[((argPtr)>>2)]=parseInt(text, 10);
- }
- break;
- case 'X':
- case 'x':
- HEAP32[((argPtr)>>2)]=parseInt(text, 16)
- break;
- case 'F':
- case 'f':
- case 'E':
- case 'e':
- case 'G':
- case 'g':
- case 'E':
- // fallthrough intended
- if (long_) {
- HEAPF64[((argPtr)>>3)]=parseFloat(text)
- } else {
- HEAPF32[((argPtr)>>2)]=parseFloat(text)
- }
- break;
- case 's':
- var array = intArrayFromString(text);
- for (var j = 0; j < array.length; j++) {
- HEAP8[(((argPtr)+(j))|0)]=array[j]
- }
- break;
- }
- fields++;
- } else if (format[formatIndex] in __scanString.whiteSpace) {
- next = get();
- while (next in __scanString.whiteSpace) {
- if (next <= 0) break mainLoop; // End of input.
- next = get();
- }
- unget(next);
- formatIndex++;
- } else {
- // Not a specifier.
- next = get();
- if (format[formatIndex].charCodeAt(0) !== next) {
- unget(next);
- break mainLoop;
- }
- formatIndex++;
- }
- }
- return fields;
- }function _sscanf(s, format, varargs) {
- // int sscanf(const char *restrict s, const char *restrict format, ... );
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html
- var index = 0;
- var get = function() { return HEAP8[(((s)+(index++))|0)]; };
- var unget = function() { index--; };
- return __scanString(format, get, unget, varargs);
- }
- var _atan2=Math.atan2;
- var ___errno=___errno_location;
- function _putchar(c) {
- // int putchar(int c);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html
- return _fputc(c, HEAP32[((_stdout)>>2)]);
- }
- Module["_saveSetjmp"] = _saveSetjmp;
- Module["_testSetjmp"] = _testSetjmp;var _setjmp=undefined;
- function _signal(sig, func) {
- // TODO
- return 0;
- }
- function _toupper(chr) {
- if (chr >= 97 && chr <= 122) {
- return chr - 97 + 65;
- } else {
- return chr;
- }
- }
- function _longjmp(env, value) {
- asm['setThrew'](env, value || 1);
- throw 'longjmp';
- }
- function _time(ptr) {
- var ret = Math.floor(Date.now()/1000);
- if (ptr) {
- HEAP32[((ptr)>>2)]=ret
- }
- return ret;
- }
- var ___tm_struct_layout={__size__:44,tm_sec:0,tm_min:4,tm_hour:8,tm_mday:12,tm_mon:16,tm_year:20,tm_wday:24,tm_yday:28,tm_isdst:32,tm_gmtoff:36,tm_zone:40};
- var ___tm_current=allocate(4*26, "i8", ALLOC_STATIC);
- var ___tm_timezones={};
- var __tzname=allocate(8, "i32*", ALLOC_STATIC);
- var __daylight=allocate(1, "i32*", ALLOC_STATIC);
- var __timezone=allocate(1, "i32*", ALLOC_STATIC);function _tzset() {
- // TODO: Use (malleable) environment variables instead of system settings.
- if (_tzset.called) return;
- _tzset.called = true;
- HEAP32[((__timezone)>>2)]=-(new Date()).getTimezoneOffset() * 60
- var winter = new Date(2000, 0, 1);
- var summer = new Date(2000, 6, 1);
- HEAP32[((__daylight)>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset())
- var winterName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | winter.toString().match(/\(([A-Z]+)\)/)[1];
- var summerName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | summer.toString().match(/\(([A-Z]+)\)/)[1];
- var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL);
- var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL);
- HEAP32[((__tzname)>>2)]=winterNamePtr
- HEAP32[(((__tzname)+(4))>>2)]=summerNamePtr
- }function _localtime_r(time, tmPtr) {
- _tzset();
- var offsets = ___tm_struct_layout;
- var date = new Date(HEAP32[((time)>>2)]*1000);
- HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)]=date.getSeconds()
- HEAP32[(((tmPtr)+(offsets.tm_min))>>2)]=date.getMinutes()
- HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)]=date.getHours()
- HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)]=date.getDate()
- HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)]=date.getMonth()
- HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]=date.getFullYear()-1900
- HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=date.getDay()
- var start = new Date(date.getFullYear(), 0, 1);
- var yday = Math.floor((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
- HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday
- HEAP32[(((tmPtr)+(offsets.tm_gmtoff))>>2)]=start.getTimezoneOffset() * 60
- var dst = Number(start.getTimezoneOffset() != date.getTimezoneOffset());
- HEAP32[(((tmPtr)+(offsets.tm_isdst))>>2)]=dst
- var timezone = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | date.toString().match(/\(([A-Z]+)\)/)[1];
- if (!(timezone in ___tm_timezones)) {
- ___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL);
- }
- HEAP32[(((tmPtr)+(offsets.tm_zone))>>2)]=___tm_timezones[timezone]
- return tmPtr;
- }function _localtime(time) {
- return _localtime_r(time, ___tm_current);
- }
- var ___tm_formatted=allocate(4*26, "i8", ALLOC_STATIC);
- function _mktime(tmPtr) {
- _tzset();
- var offsets = ___tm_struct_layout;
- var year = HEAP32[(((tmPtr)+(offsets.tm_year))>>2)];
- var timestamp = new Date(year >= 1900 ? year : year + 1900,
- HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)],
- HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)],
- HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)],
- HEAP32[(((tmPtr)+(offsets.tm_min))>>2)],
- HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)],
- 0).getTime() / 1000;
- HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=new Date(timestamp).getDay()
- var yday = Math.round((timestamp - (new Date(year, 0, 1)).getTime()) / (1000 * 60 * 60 * 24));
- HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday
- return timestamp;
- }function _asctime_r(tmPtr, buf) {
- var date = new Date(_mktime(tmPtr)*1000);
- var formatted = date.toString();
- var datePart = formatted.replace(/\d{4}.*/, '').replace(/ 0/, ' ');
- var timePart = formatted.match(/\d{2}:\d{2}:\d{2}/)[0];
- formatted = datePart + timePart + ' ' + date.getFullYear() + '\n';
- formatted.split('').forEach(function(chr, index) {
- HEAP8[(((buf)+(index))|0)]=chr.charCodeAt(0)
- });
- HEAP8[(((buf)+(25))|0)]=0
- return buf;
- }function _asctime(tmPtr) {
- return _asctime_r(tmPtr, ___tm_formatted);
- }function _ctime(timer) {
- return _asctime(_localtime(timer));
- }
- var _llvm_va_start=undefined;
- function _vfprintf(s, f, va_arg) {
- return _fprintf(s, f, HEAP32[((va_arg)>>2)]);
- }
- function _llvm_va_end() {}
- function _rename(old, new_) {
- // int rename(const char *old, const char *new);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/rename.html
- var oldObj = FS.analyzePath(Pointer_stringify(old));
- var newObj = FS.analyzePath(Pointer_stringify(new_));
- if (newObj.path == oldObj.path) {
- return 0;
- } else if (!oldObj.exists) {
- ___setErrNo(oldObj.error);
- return -1;
- } else if (oldObj.isRoot || oldObj.path == FS.currentPath) {
- ___setErrNo(ERRNO_CODES.EBUSY);
- return -1;
- } else if (newObj.parentPath &&
- newObj.parentPath.indexOf(oldObj.path) == 0) {
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- } else if (newObj.exists && newObj.object.isFolder) {
- ___setErrNo(ERRNO_CODES.EISDIR);
- return -1;
- } else {
- delete oldObj.parentObject.contents[oldObj.name];
- newObj.parentObject.contents[newObj.name] = oldObj.object;
- return 0;
- }
- }
- function _strftime(s, maxsize, format, timeptr) {
- // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);
- // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html
- // TODO: Implement.
- return 0;
- }
- function _qsort(base, num, size, cmp) {
- if (num == 0 || size == 0) return;
- // forward calls to the JavaScript sort method
- // first, sort the items logically
- var comparator = function(x, y) {
- return Runtime.dynCall('iii', cmp, [x, y]);
- }
- var keys = [];
- for (var i = 0; i < num; i++) keys.push(i);
- keys.sort(function(a, b) {
- return comparator(base+a*size, base+b*size);
- });
- // apply the sort
- var temp = _malloc(num*size);
- _memcpy(temp, base, num*size);
- for (var i = 0; i < num; i++) {
- if (keys[i] == i) continue; // already in place
- _memcpy(base+i*size, temp+keys[i]*size, size);
- }
- _free(temp);
- }
- function _gettimeofday(ptr) {
- // %struct.timeval = type { i32, i32 }
- var now = Date.now();
- HEAP32[((ptr)>>2)]=Math.floor(now/1000); // seconds
- HEAP32[(((ptr)+(4))>>2)]=Math.floor((now-1000*Math.floor(now/1000))*1000); // microseconds
- return 0;
- }
- function _opendir(dirname) {
- // DIR *opendir(const char *dirname);
- // http://pubs.opengroup.org/onlinepubs/007908799/xsh/opendir.html
- // NOTE: Calculating absolute path redundantly since we need to associate it
- // with the opened stream.
- var path = FS.absolutePath(Pointer_stringify(dirname));
- if (path === null) {
- ___setErrNo(ERRNO_CODES.ENOENT);
- return 0;
- }
- var target = FS.findObject(path);
- if (target === null) return 0;
- if (!target.isFolder) {
- ___setErrNo(ERRNO_CODES.ENOTDIR);
- return 0;
- } else if (!target.read) {
- ___setErrNo(ERRNO_CODES.EACCES);
- return 0;
- }
- var contents = [];
- for (var key in target.contents) contents.push(key);
- var id = FS.createFileHandle({
- path: path,
- object: target,
- // An index into contents. Special values: -2 is ".", -1 is "..".
- position: -2,
- isRead: true,
- isWrite: false,
- isAppend: false,
- error: false,
- eof: false,
- ungotten: [],
- // Folder-specific properties:
- // Remember the contents at the time of opening in an array, so we can
- // seek between them relying on a single order.
- contents: contents,
- // Each stream has its own area for readdir() returns.
- currentEntry: _malloc(___dirent_struct_layout.__size__)
- });
- return id;
- }
- function _readdir_r(dirp, entry, result) {
- // int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
- // http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html
- if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) {
- return ___setErrNo(ERRNO_CODES.EBADF);
- }
- var stream = FS.streams[dirp];
- var loc = stream.position;
- var entries = 0;
- for (var key in stream.contents) entries++;
- if (loc < -2 || loc >= entries) {
- HEAP32[((result)>>2)]=0
- } else {
- var name, inode, type;
- if (loc === -2) {
- name = '.';
- inode = 1; // Really undefined.
- type = 4; //DT_DIR
- } else if (loc === -1) {
- name = '..';
- inode = 1; // Really undefined.
- type = 4; //DT_DIR
- } else {
- var object;
- name = stream.contents[loc];
- object = stream.object.contents[name];
- inode = object.inodeNumber;
- type = object.isDevice ? 2 // DT_CHR, character device.
- : object.isFolder ? 4 // DT_DIR, directory.
- : object.link !== undefined ? 10 // DT_LNK, symbolic link.
- : 8; // DT_REG, regular file.
- }
- stream.position++;
- var offsets = ___dirent_struct_layout;
- HEAP32[(((entry)+(offsets.d_ino))>>2)]=inode
- HEAP32[(((entry)+(offsets.d_off))>>2)]=stream.position
- HEAP32[(((entry)+(offsets.d_reclen))>>2)]=name.length + 1
- for (var i = 0; i < name.length; i++) {
- HEAP8[(((entry + offsets.d_name)+(i))|0)]=name.charCodeAt(i)
- }
- HEAP8[(((entry + offsets.d_name)+(i))|0)]=0
- HEAP8[(((entry)+(offsets.d_type))|0)]=type
- HEAP32[((result)>>2)]=entry
- }
- return 0;
- }function _readdir(dirp) {
- // struct dirent *readdir(DIR *dirp);
- // http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html
- if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) {
- ___setErrNo(ERRNO_CODES.EBADF);
- return 0;
- } else {
- if (!_readdir.result) _readdir.result = _malloc(4);
- _readdir_r(dirp, FS.streams[dirp].currentEntry, _readdir.result);
- if (HEAP32[((_readdir.result)>>2)] === 0) {
- return 0;
- } else {
- return FS.streams[dirp].currentEntry;
- }
- }
- }
- function _closedir(dirp) {
- // int closedir(DIR *dirp);
- // http://pubs.opengroup.org/onlinepubs/007908799/xsh/closedir.html
- if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) {
- return ___setErrNo(ERRNO_CODES.EBADF);
- } else {
- _free(FS.streams[dirp].currentEntry);
- FS.streams[dirp] = null;
- return 0;
- }
- }
- function _ungetc(c, stream) {
- // int ungetc(int c, FILE *stream);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html
- if (FS.streams[stream]) {
- c = unSign(c & 0xFF);
- FS.streams[stream].ungotten.push(c);
- return c;
- } else {
- return -1;
- }
- }
- function _fmod(x, y) {
- return x % y;
- }
- function _gmtime_r(time, tmPtr) {
- var date = new Date(HEAP32[((time)>>2)]*1000);
- var offsets = ___tm_struct_layout;
- HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)]=date.getUTCSeconds()
- HEAP32[(((tmPtr)+(offsets.tm_min))>>2)]=date.getUTCMinutes()
- HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)]=date.getUTCHours()
- HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)]=date.getUTCDate()
- HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)]=date.getUTCMonth()
- HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]=date.getUTCFullYear()-1900
- HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=date.getUTCDay()
- HEAP32[(((tmPtr)+(offsets.tm_gmtoff))>>2)]=0
- HEAP32[(((tmPtr)+(offsets.tm_isdst))>>2)]=0
- var start = new Date(date.getFullYear(), 0, 1);
- var yday = Math.round((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
- HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday
- var timezone = "GMT";
- if (!(timezone in ___tm_timezones)) {
- ___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL);
- }
- HEAP32[(((tmPtr)+(offsets.tm_zone))>>2)]=___tm_timezones[timezone]
- return tmPtr;
- }function _gmtime(time) {
- return _gmtime_r(time, ___tm_current);
- }
- function _setvbuf(stream, buf, type, size) {
- // int setvbuf(FILE *restrict stream, char *restrict buf, int type, size_t size);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/setvbuf.html
- // TODO: Implement custom buffering.
- return 0;
- }function _setbuf(stream, buf) {
- // void setbuf(FILE *restrict stream, char *restrict buf);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/setbuf.html
- if (buf) _setvbuf(stream, buf, 0, 8192); // _IOFBF, BUFSIZ.
- else _setvbuf(stream, buf, 2, 8192); // _IONBF, BUFSIZ.
- }
- function _atexit(func, arg) {
- __ATEXIT__.unshift({ func: func, arg: arg });
- }
- function _isatty(fildes) {
- // int isatty(int fildes);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/isatty.html
- if (!FS.streams[fildes]) {
- ___setErrNo(ERRNO_CODES.EBADF);
- return 0;
- }
- if (FS.streams[fildes].isTerminal) return 1;
- ___setErrNo(ERRNO_CODES.ENOTTY);
- return 0;
- }
- var ___utsname_struct_layout={__size__:160,sysname:0,nodename:32,release:64,version:96,machine:128};function _uname(name) {
- // int uname(struct utsname *name);
- // http://pubs.opengroup.org/onlinepubs/009695399/functions/uname.html
- function copyString(element, value) {
- var offset = ___utsname_struct_layout[element];
- for (var i = 0; i < value.length; i++) {
- HEAP8[(((name)+(offset + i))|0)]=value.charCodeAt(i)
- }
- HEAP8[(((name)+(offset + i))|0)]=0
- }
- if (name === 0) {
- return -1;
- } else {
- copyString('sysname', 'Emscripten');
- copyString('nodename', 'emscripten');
- copyString('release', '1.0');
- copyString('version', '#1');
- copyString('machine', 'x86-JS');
- return 0;
- }
- }
- function _nl_langinfo(item) {
- // char *nl_langinfo(nl_item item);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/nl_langinfo.html
- var result;
- switch (item) {
- case 0:
- result = 'ANSI_X3.4-1968';
- break;
- case 1:
- result = '%a %b %e %H:%M:%S %Y';
- break;
- case 2:
- result = '%m/%d/%y';
- break;
- case 3:
- result = '%H:%M:%S';
- break;
- case 4:
- result = '%I:%M:%S %p';
- break;
- case 5:
- result = 'AM';
- break;
- case 6:
- result = 'PM';
- break;
- case 7:
- result = 'Sunday';
- break;
- case 8:
- result = 'Monday';
- break;
- case 9:
- result = 'Tuesday';
- break;
- case 10:
- result = 'Wednesday';
- break;
- case 11:
- result = 'Thursday';
- break;
- case 12:
- result = 'Friday';
- break;
- case 13:
- result = 'Saturday';
- break;
- case 14:
- result = 'Sun';
- break;
- case 15:
- result = 'Mon';
- break;
- case 16:
- result = 'Tue';
- break;
- case 17:
- result = 'Wed';
- break;
- case 18:
- result = 'Thu';
- break;
- case 19:
- result = 'Fri';
- break;
- case 20:
- result = 'Sat';
- break;
- case 21:
- result = 'January';
- break;
- case 22:
- result = 'February';
- break;
- case 23:
- result = 'March';
- break;
- case 24:
- result = 'April';
- break;
- case 25:
- result = 'May';
- break;
- case 26:
- result = 'June';
- break;
- case 27:
- result = 'July';
- break;
- case 28:
- result = 'August';
- break;
- case 29:
- result = 'September';
- break;
- case 30:
- result = 'October';
- break;
- case 31:
- result = 'November';
- break;
- case 32:
- result = 'December';
- break;
- case 33:
- result = 'Jan';
- break;
- case 34:
- result = 'Feb';
- break;
- case 35:
- result = 'Mar';
- break;
- case 36:
- result = 'Apr';
- break;
- case 37:
- result = 'May';
- break;
- case 38:
- result = 'Jun';
- break;
- case 39:
- result = 'Jul';
- break;
- case 40:
- result = 'Aug';
- break;
- case 41:
- result = 'Sep';
- break;
- case 42:
- result = 'Oct';
- break;
- case 43:
- result = 'Nov';
- break;
- case 44:
- result = 'Dec';
- break;
- case 49:
- result = '';
- break;
- case 50:
- result = '.';
- break;
- case 51:
- result = '';
- break;
- case 52:
- result = '^[yY]';
- break;
- case 53:
- result = '^[nN]';
- break;
- case 56:
- result = '-';
- break;
- case 45:
- case 46:
- case 47:
- case 48:
- default:
- result = '';
- break;
- }
- var me = _nl_langinfo;
- if (!me.ret) me.ret = _malloc(32);
- for (var i = 0; i < result.length; i++) {
- HEAP8[(((me.ret)+(i))|0)]=result.charCodeAt(i)
- }
- HEAP8[(((me.ret)+(i))|0)]=0
- return me.ret;
- }
- function _iconv_open() {
- Module['printErr']('missing function: iconv_open'); abort(-1);
- }
- function _iconv() {
- Module['printErr']('missing function: iconv'); abort(-1);
- }
- function _iconv_close() {
- Module['printErr']('missing function: iconv_close'); abort(-1);
- }
- function _localeconv() {
- // %struct.timeval = type { char* decimal point, other stuff... }
- // var indexes = Runtime.calculateStructAlignment({ fields: ['i32', 'i32'] });
- var me = _localeconv;
- if (!me.ret) {
- me.ret = allocate([allocate(intArrayFromString('.'), 'i8', ALLOC_NORMAL)], 'i8*', ALLOC_NORMAL); // just decimal point, for now
- }
- return me.ret;
- }
- function _isprint(chr) {
- return 0x1F < chr && chr < 0x7F;
- }
- function _erfc(x) {
- var MATH_TOLERANCE = 1E-12;
- var ONE_SQRTPI = 0.564189583547756287;
- var a = 1;
- var b = x;
- var c = x;
- var d = x * x + 0.5;
- var n = 1.0;
- var q2 = b / d;
- var q1, t;
- if (Math.abs(x) < 2.2) {
- return 1.0 - _erf(x);
- }
- if (x < 0) {
- return 2.0 - _erfc(-x);
- }
- do {
- t = a * n + b * x;
- a = b;
- b = t;
- t = c * n + d * x;
- c = d;
- d = t;
- n += 0.5;
- q1 = q2;
- q2 = b / d;
- } while (Math.abs(q1 - q2) / q2 > MATH_TOLERANCE);
- return (ONE_SQRTPI * Math.exp(- x * x) * q2);
- }function _erf(x) {
- var MATH_TOLERANCE = 1E-12;
- var TWO_SQRTPI = 1.128379167095512574;
- var sum = x;
- var term = x;
- var xsqr = x*x;
- var j = 1;
- if (Math.abs(x) > 2.2) {
- return 1.0 - _erfc(x);
- }
- do {
- term *= xsqr / j;
- sum -= term / (2 * j + 1);
- ++j;
- term *= xsqr / j;
- sum += term / (2 * j + 1);
- ++j;
- } while (Math.abs(term / sum) > MATH_TOLERANCE);
- return (TWO_SQRTPI * sum);
- }
- function _lgamma() {
- Module['printErr']('missing function: lgamma'); abort(-1);
- }
- function ___signgam() {
- Module['printErr']('missing function: __signgam'); abort(-1);
- }
- function _modf(x, intpart) {
- HEAPF64[((intpart)>>3)]=Math.floor(x)
- return x - HEAPF64[((intpart)>>3)];
- }
- function _cosh(x) {
- var p = Math.pow(Math.E, x);
- return (p + (1 / p)) / 2;
- }
- function _sinh(x) {
- var p = Math.pow(Math.E, x);
- return (p - (1 / p)) / 2;
- }
- var _tan=Math.tan;
- var _asin=Math.asin;
- var _acos=Math.acos;
- var _atan=Math.atan;
- function _sleep(seconds) {
- // unsigned sleep(unsigned seconds);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/sleep.html
- return _usleep(seconds * 1e6);
- }
- function _strdup(ptr) {
- var len = _strlen(ptr);
- var newStr = _malloc(len + 1);
- _memcpy(newStr, ptr, len);
- HEAP8[(((newStr)+(len))|0)]=0;
- return newStr;
- }
- function _vsnprintf(s, n, format, va_arg) {
- return _snprintf(s, n, format, HEAP32[((va_arg)>>2)]);
- }
- function _abort() {
- ABORT = true;
- throw 'abort() at ' + (new Error().stack);
- }
- function _sysconf(name) {
- // long sysconf(int name);
- // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
- switch(name) {
- case 8: return PAGE_SIZE;
- case 54:
- case 56:
- case 21:
- case 61:
- case 63:
- case 22:
- case 67:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
- case 69:
- case 28:
- case 101:
- case 70:
- case 71:
- case 29:
- case 30:
- case 199:
- case 75:
- case 76:
- case 32:
- case 43:
- case 44:
- case 80:
- case 46:
- case 47:
- case 45:
- case 48:
- case 49:
- case 42:
- case 82:
- case 33:
- case 7:
- case 108:
- case 109:
- case 107:
- case 112:
- case 119:
- case 121:
- return 200809;
- case 13:
- case 104:
- case 94:
- case 95:
- case 34:
- case 35:
- case 77:
- case 81:
- case 83:
- case 84:
- case 85:
- case 86:
- case 87:
- case 88:
- case 89:
- case 90:
- case 91:
- case 94:
- case 95:
- case 110:
- case 111:
- case 113:
- case 114:
- case 115:
- case 116:
- case 117:
- case 118:
- case 120:
- case 40:
- case 16:
- case 79:
- case 19:
- return -1;
- case 92:
- case 93:
- case 5:
- case 72:
- case 6:
- case 74:
- case 92:
- case 93:
- case 96:
- case 97:
- case 98:
- case 99:
- case 102:
- case 103:
- case 105:
- return 1;
- case 38:
- case 66:
- case 50:
- case 51:
- case 4:
- return 1024;
- case 15:
- case 64:
- case 41:
- return 32;
- case 55:
- case 37:
- case 17:
- return 2147483647;
- case 18:
- case 1:
- return 47839;
- case 59:
- case 57:
- return 99;
- case 68:
- case 58:
- return 2048;
- case 0: return 2097152;
- case 3: return 65536;
- case 14: return 32768;
- case 73: return 32767;
- case 39: return 16384;
- case 60: return 1000;
- case 106: return 700;
- case 52: return 256;
- case 62: return 255;
- case 2: return 100;
- case 65: return 64;
- case 36: return 20;
- case 100: return 16;
- case 20: return 6;
- case 53: return 4;
- case 10: return 1;
- }
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- }
- function _sbrk(bytes) {
- // Implement a Linux-like 'memory area' for our 'process'.
- // Changes the size of the memory area by |bytes|; returns the
- // address of the previous top ('break') of the memory area
- // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
- var self = _sbrk;
- if (!self.called) {
- DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned
- self.called = true;
- assert(Runtime.dynamicAlloc);
- self.alloc = Runtime.dynamicAlloc;
- Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
- }
- var ret = DYNAMICTOP;
- if (bytes != 0) self.alloc(bytes);
- return ret; // Previous break location.
- }
- function _llvm_lifetime_start() {}
- function _llvm_lifetime_end() {}
- var _llvm_memset_p0i8_i64=_memset;
- var _llvm_memcpy_p0i8_p0i8_i64=_memcpy;
- function _llvm_trap() {
- throw 'trap! ' + new Error().stack;
- }
- var Browser={mainLoop:{scheduler:null,shouldPause:false,paused:false,queue:[],pause:function () {
- Browser.mainLoop.shouldPause = true;
- },resume:function () {
- if (Browser.mainLoop.paused) {
- Browser.mainLoop.paused = false;
- Browser.mainLoop.scheduler();
- }
- Browser.mainLoop.shouldPause = false;
- },updateStatus:function () {
- if (Module['setStatus']) {
- var message = Module['statusMessage'] || 'Please wait...';
- var remaining = Browser.mainLoop.remainingBlockers;
- var expected = Browser.mainLoop.expectedBlockers;
- if (remaining) {
- if (remaining < expected) {
- Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
- } else {
- Module['setStatus'](message);
- }
- } else {
- Module['setStatus']('');
- }
- }
- }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
- if (Browser.initted) return;
- Browser.initted = true;
- try {
- new Blob();
- Browser.hasBlobConstructor = true;
- } catch(e) {
- Browser.hasBlobConstructor = false;
- console.log("warning: no blob constructor, cannot create blobs with mimetypes");
- }
- Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
- Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs");
- // Support for plugins that can process preloaded files. You can add more of these to
- // your app by creating and appending to Module.preloadPlugins.
- //
- // Each plugin is asked if it can handle a file based on the file's name. If it can,
- // it is given the file's raw data. When it is done, it calls a callback with the file's
- // (possibly modified) data. For example, a plugin might decompress a file, or it
- // might create some side data structure for use later (like an Image element, etc.).
- function getMimetype(name) {
- return {
- 'jpg': 'image/jpeg',
- 'jpeg': 'image/jpeg',
- 'png': 'image/png',
- 'bmp': 'image/bmp',
- 'ogg': 'audio/ogg',
- 'wav': 'audio/wav',
- 'mp3': 'audio/mpeg'
- }[name.substr(name.lastIndexOf('.')+1)];
- }
- if (!Module["preloadPlugins"]) Module["preloadPlugins"] = [];
- var imagePlugin = {};
- imagePlugin['canHandle'] = function(name) {
- return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/.exec(name);
- };
- imagePlugin['handle'] = function(byteArray, name, onload, onerror) {
- var b = null;
- if (Browser.hasBlobConstructor) {
- try {
- b = new Blob([byteArray], { type: getMimetype(name) });
- } catch(e) {
- Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
- }
- }
- if (!b) {
- var bb = new Browser.BlobBuilder();
- bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
- b = bb.getBlob();
- }
- var url = Browser.URLObject.createObjectURL(b);
- var img = new Image();
- img.onload = function() {
- assert(img.complete, 'Image ' + name + ' could not be decoded');
- var canvas = document.createElement('canvas');
- canvas.width = img.width;
- canvas.height = img.height;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, 0, 0);
- Module["preloadedImages"][name] = canvas;
- Browser.URLObject.revokeObjectURL(url);
- if (onload) onload(byteArray);
- };
- img.onerror = function(event) {
- console.log('Image ' + url + ' could not be decoded');
- if (onerror) onerror();
- };
- img.src = url;
- };
- Module['preloadPlugins'].push(imagePlugin);
- var audioPlugin = {};
- audioPlugin['canHandle'] = function(name) {
- return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
- };
- audioPlugin['handle'] = function(byteArray, name, onload, onerror) {
- var done = false;
- function finish(audio) {
- if (done) return;
- done = true;
- Module["preloadedAudios"][name] = audio;
- if (onload) onload(byteArray);
- }
- function fail() {
- if (done) return;
- done = true;
- Module["preloadedAudios"][name] = new Audio(); // empty shim
- if (onerror) onerror();
- }
- if (Browser.hasBlobConstructor) {
- try {
- var b = new Blob([byteArray], { type: getMimetype(name) });
- } catch(e) {
- return fail();
- }
- var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
- var audio = new Audio();
- audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
- audio.onerror = function(event) {
- if (done) return;
- console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
- function encode64(data) {
- var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
- var PAD = '=';
- var ret = '';
- var leftchar = 0;
- var leftbits = 0;
- for (var i = 0; i < data.length; i++) {
- leftchar = (leftchar << 8) | data[i];
- leftbits += 8;
- while (leftbits >= 6) {
- var curr = (leftchar >> (leftbits-6)) & 0x3f;
- leftbits -= 6;
- ret += BASE[curr];
- }
- }
- if (leftbits == 2) {
- ret += BASE[(leftchar&3) << 4];
- ret += PAD + PAD;
- } else if (leftbits == 4) {
- ret += BASE[(leftchar&0xf) << 2];
- ret += PAD;
- }
- return ret;
- }
- audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
- finish(audio); // we don't wait for confirmation this worked - but it's worth trying
- };
- audio.src = url;
- // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
- Browser.safeSetTimeout(function() {
- finish(audio); // try to use it even though it is not necessarily ready to play
- }, 10000);
- } else {
- return fail();
- }
- };
- Module['preloadPlugins'].push(audioPlugin);
- // Canvas event setup
- var canvas = Module['canvas'];
- canvas.requestPointerLock = canvas['requestPointerLock'] ||
- canvas['mozRequestPointerLock'] ||
- canvas['webkitRequestPointerLock'];
- canvas.exitPointerLock = document['exitPointerLock'] ||
- document['mozExitPointerLock'] ||
- document['webkitExitPointerLock'] ||
- function(){}; // no-op if function does not exist
- canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
- function pointerLockChange() {
- Browser.pointerLock = document['pointerLockElement'] === canvas ||
- document['mozPointerLockElement'] === canvas ||
- document['webkitPointerLockElement'] === canvas;
- }
- document.addEventListener('pointerlockchange', pointerLockChange, false);
- document.addEventListener('mozpointerlockchange', pointerLockChange, false);
- document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
- if (Module['elementPointerLock']) {
- canvas.addEventListener("click", function(ev) {
- if (!Browser.pointerLock && canvas.requestPointerLock) {
- canvas.requestPointerLock();
- ev.preventDefault();
- }
- }, false);
- }
- },createContext:function (canvas, useWebGL, setInModule) {
- var ctx;
- try {
- if (useWebGL) {
- ctx = canvas.getContext('experimental-webgl', {
- alpha: false
- });
- } else {
- ctx = canvas.getContext('2d');
- }
- if (!ctx) throw ':(';
- } catch (e) {
- Module.print('Could not create canvas - ' + e);
- return null;
- }
- if (useWebGL) {
- // Set the background of the WebGL canvas to black
- canvas.style.backgroundColor = "black";
- // Warn on context loss
- canvas.addEventListener('webglcontextlost', function(event) {
- alert('WebGL context lost. You will need to reload the page.');
- }, false);
- }
- if (setInModule) {
- Module.ctx = ctx;
- Module.useWebGL = useWebGL;
- Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
- Browser.init();
- }
- return ctx;
- },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {
- Browser.lockPointer = lockPointer;
- Browser.resizeCanvas = resizeCanvas;
- if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
- if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;
- var canvas = Module['canvas'];
- function fullScreenChange() {
- Browser.isFullScreen = false;
- if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
- document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
- document['fullScreenElement'] || document['fullscreenElement']) === canvas) {
- canvas.cancelFullScreen = document['cancelFullScreen'] ||
- document['mozCancelFullScreen'] ||
- document['webkitCancelFullScreen'];
- canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
- if (Browser.lockPointer) canvas.requestPointerLock();
- Browser.isFullScreen = true;
- if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
- } else if (Browser.resizeCanvas){
- Browser.setWindowedCanvasSize();
- }
- if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
- }
- if (!Browser.fullScreenHandlersInstalled) {
- Browser.fullScreenHandlersInstalled = true;
- document.addEventListener('fullscreenchange', fullScreenChange, false);
- document.addEventListener('mozfullscreenchange', fullScreenChange, false);
- document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
- }
- canvas.requestFullScreen = canvas['requestFullScreen'] ||
- canvas['mozRequestFullScreen'] ||
- (canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
- canvas.requestFullScreen();
- },requestAnimationFrame:function (func) {
- if (!window.requestAnimationFrame) {
- window.requestAnimationFrame = window['requestAnimationFrame'] ||
- window['mozRequestAnimationFrame'] ||
- window['webkitRequestAnimationFrame'] ||
- window['msRequestAnimationFrame'] ||
- window['oRequestAnimationFrame'] ||
- window['setTimeout'];
- }
- window.requestAnimationFrame(func);
- },safeCallback:function (func) {
- return function() {
- if (!ABORT) return func.apply(null, arguments);
- };
- },safeRequestAnimationFrame:function (func) {
- return Browser.requestAnimationFrame(function() {
- if (!ABORT) func();
- });
- },safeSetTimeout:function (func, timeout) {
- return setTimeout(function() {
- if (!ABORT) func();
- }, timeout);
- },safeSetInterval:function (func, timeout) {
- return setInterval(function() {
- if (!ABORT) func();
- }, timeout);
- },getUserMedia:function (func) {
- if(!window.getUserMedia) {
- window.getUserMedia = navigator['getUserMedia'] ||
- navigator['mozGetUserMedia'];
- }
- window.getUserMedia(func);
- },getMovementX:function (event) {
- return event['movementX'] ||
- event['mozMovementX'] ||
- event['webkitMovementX'] ||
- 0;
- },getMovementY:function (event) {
- return event['movementY'] ||
- event['mozMovementY'] ||
- event['webkitMovementY'] ||
- 0;
- },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
- if (Browser.pointerLock) {
- // When the pointer is locked, calculate the coordinates
- // based on the movement of the mouse.
- // Workaround for Firefox bug 764498
- if (event.type != 'mousemove' &&
- ('mozMovementX' in event)) {
- Browser.mouseMovementX = Browser.mouseMovementY = 0;
- } else {
- Browser.mouseMovementX = Browser.getMovementX(event);
- Browser.mouseMovementY = Browser.getMovementY(event);
- }
- Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
- Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
- } else {
- // Otherwise, calculate the movement based on the changes
- // in the coordinates.
- var rect = Module["canvas"].getBoundingClientRect();
- var x = event.pageX - (window.scrollX + rect.left);
- var y = event.pageY - (window.scrollY + rect.top);
- // the canvas might be CSS-scaled compared to its backbuffer;
- // SDL-using content will want mouse coordinates in terms
- // of backbuffer units.
- var cw = Module["canvas"].width;
- var ch = Module["canvas"].height;
- x = x * (cw / rect.width);
- y = y * (ch / rect.height);
- Browser.mouseMovementX = x - Browser.mouseX;
- Browser.mouseMovementY = y - Browser.mouseY;
- Browser.mouseX = x;
- Browser.mouseY = y;
- }
- },xhrLoad:function (url, onload, onerror) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, true);
- xhr.responseType = 'arraybuffer';
- xhr.onload = function() {
- if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
- onload(xhr.response);
- } else {
- onerror();
- }
- };
- xhr.onerror = onerror;
- xhr.send(null);
- },asyncLoad:function (url, onload, onerror, noRunDep) {
- Browser.xhrLoad(url, function(arrayBuffer) {
- assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
- onload(new Uint8Array(arrayBuffer));
- if (!noRunDep) removeRunDependency('al ' + url);
- }, function(event) {
- if (onerror) {
- onerror();
- } else {
- throw 'Loading data file "' + url + '" failed.';
- }
- });
- if (!noRunDep) addRunDependency('al ' + url);
- },resizeListeners:[],updateResizeListeners:function () {
- var canvas = Module['canvas'];
- Browser.resizeListeners.forEach(function(listener) {
- listener(canvas.width, canvas.height);
- });
- },setCanvasSize:function (width, height, noUpdates) {
- var canvas = Module['canvas'];
- canvas.width = width;
- canvas.height = height;
- if (!noUpdates) Browser.updateResizeListeners();
- },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
- var canvas = Module['canvas'];
- this.windowedWidth = canvas.width;
- this.windowedHeight = canvas.height;
- canvas.width = screen.width;
- canvas.height = screen.height;
- var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
- flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
- HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
- Browser.updateResizeListeners();
- },setWindowedCanvasSize:function () {
- var canvas = Module['canvas'];
- canvas.width = this.windowedWidth;
- canvas.height = this.windowedHeight;
- var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
- flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
- HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
- Browser.updateResizeListeners();
- }};
-__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;
-___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
-_fgetc.ret = allocate([0], "i8", ALLOC_STATIC);
-_fputc.ret = allocate([0], "i8", ALLOC_STATIC);
-___buildEnvironment(ENV);
-Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
- Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };
- Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };
- Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };
- Module["getUserMedia"] = function() { Browser.getUserMedia() }
-STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
-staticSealed = true; // seal the static portion of memory
-STACK_MAX = STACK_BASE + 5242880;
-DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);
-assert(DYNAMIC_BASE < TOTAL_MEMORY); // Stack must fit in TOTAL_MEMORY; allocations from here on may enlarge TOTAL_MEMORY
-var Math_min = Math.min;
-function invoke_viiiii(index,a1,a2,a3,a4,a5) {
- try {
- Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_viffiii(index,a1,a2,a3,a4,a5,a6) {
- try {
- Module["dynCall_viffiii"](index,a1,a2,a3,a4,a5,a6);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_vf(index,a1) {
- try {
- Module["dynCall_vf"](index,a1);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_i(index) {
- try {
- return Module["dynCall_i"](index);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_vi(index,a1) {
- try {
- Module["dynCall_vi"](index,a1);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_vii(index,a1,a2) {
- try {
- Module["dynCall_vii"](index,a1,a2);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_ii(index,a1) {
- try {
- return Module["dynCall_ii"](index,a1);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_iff(index,a1,a2) {
- try {
- return Module["dynCall_iff"](index,a1,a2);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_iiii(index,a1,a2,a3) {
- try {
- return Module["dynCall_iiii"](index,a1,a2,a3);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_viii(index,a1,a2,a3) {
- try {
- Module["dynCall_viii"](index,a1,a2,a3);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_v(index) {
- try {
- Module["dynCall_v"](index);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_vifiii(index,a1,a2,a3,a4,a5) {
- try {
- Module["dynCall_vifiii"](index,a1,a2,a3,a4,a5);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_iiiii(index,a1,a2,a3,a4) {
- try {
- return Module["dynCall_iiiii"](index,a1,a2,a3,a4);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_fii(index,a1,a2) {
- try {
- return Module["dynCall_fii"](index,a1,a2);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function invoke_iii(index,a1,a2) {
- try {
- return Module["dynCall_iii"](index,a1,a2);
- } catch(e) {
- if (typeof e !== 'number' && e !== 'longjmp') throw e;
- asm["setThrew"](1, 0);
- }
-}
-function asmPrintInt(x, y) {
- Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);
-}
-function asmPrintFloat(x, y) {
- Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);
-}
-// EMSCRIPTEN_START_ASM
-var asm=(function(global,env,buffer){"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env._stderr|0;var n=env._stdout|0;var o=env._stdin|0;var p=+env.NaN;var q=+env.Infinity;var r=0;var s=0;var t=0;var u=0;var v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0.0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=global.Math.floor;var P=global.Math.abs;var Q=global.Math.sqrt;var R=global.Math.pow;var S=global.Math.cos;var T=global.Math.sin;var U=global.Math.tan;var V=global.Math.acos;var W=global.Math.asin;var X=global.Math.atan;var Y=global.Math.atan2;var Z=global.Math.exp;var _=global.Math.log;var $=global.Math.ceil;var aa=global.Math.imul;var ab=env.abort;var ac=env.assert;var ad=env.asmPrintInt;var ae=env.asmPrintFloat;var af=env.copyTempDouble;var ag=env.copyTempFloat;var ah=env.min;var ai=env.invoke_viiiii;var aj=env.invoke_viffiii;var ak=env.invoke_vf;var al=env.invoke_i;var am=env.invoke_vi;var an=env.invoke_vii;var ao=env.invoke_ii;var ap=env.invoke_iff;var aq=env.invoke_iiii;var ar=env.invoke_viii;var as=env.invoke_v;var at=env.invoke_vifiii;var au=env.invoke_iiiii;var av=env.invoke_fii;var aw=env.invoke_iii;var ax=env._lseek;var ay=env.__scanString;var az=env._fclose;var aA=env._uname;var aB=env._sleep;var aC=env.__isFloat;var aD=env._fflush;var aE=env._strtol;var aF=env._fputc;var aG=env._iconv;var aH=env.___signgam;var aI=env._fwrite;var aJ=env._send;var aK=env._fputs;var aL=env._tmpnam;var aM=env._isspace;var aN=env._localtime;var aO=env._read;var aP=env._ceil;var aQ=env._strstr;var aR=env._fileno;var aS=env._perror;var aT=env._ctime;var aU=env._fsync;var aV=env._signal;var aW=env._opendir;var aX=env._fmod;var aY=env._strcmp;var aZ=env._memchr;var a_=env._strncmp;var a$=env._tmpfile;var a0=env._snprintf;var a1=env._fgetc;var a2=env._pclose;var a3=env._readdir;var a4=env._cosh;var a5=env._atexit;var a6=env._fgets;var a7=env._close;var a8=env._strchr;var a9=env._asin;var ba=env._llvm_lifetime_start;var bb=env.___setErrNo;var bc=env._ftell;var bd=env._exit;var be=env._sprintf;var bf=env._llvm_lifetime_end;var bg=env._asctime;var bh=env._strrchr;var bi=env._iconv_open;var bj=env._modf;var bk=env._strcspn;var bl=env._getcwd;var bm=env._gmtime;var bn=env._localtime_r;var bo=env._asctime_r;var bp=env._recv;var bq=env._cos;var br=env._putchar;var bs=env._isalnum;var bt=env._popen;var bu=env._erfc;var bv=env.__exit;var bw=env._strftime;var bx=env._llvm_va_end;var by=env._tzset;var bz=env._sinh;var bA=env._setlocale;var bB=env._isprint;var bC=env._toupper;var bD=env._printf;var bE=env._pread;var bF=env._fopen;var bG=env._open;var bH=env._usleep;var bI=env._log;var bJ=env._puts;var bK=env._mktime;var bL=env._fdopen;var bM=env._qsort;var bN=env._system;var bO=env._isalpha;var bP=env._strdup;var bQ=env._log10;var bR=env._closedir;var bS=env._isatty;var bT=env.__formatString;var bU=env._getenv;var bV=env._gettimeofday;var bW=env._atoi;var bX=env._vfprintf;var bY=env._chdir;var bZ=env._llvm_pow_f64;var b_=env._sbrk;var b$=env._localeconv;var b0=env.___errno_location;var b1=env._strerror;var b2=env._lgamma;var b3=env._erf;var b4=env._strspn;var b5=env.__parseInt;var b6=env._ungetc;var b7=env._llvm_trap;var b8=env._rename;var b9=env._vsnprintf;var ca=env._sscanf;var cb=env._sysconf;var cc=env._acos;var cd=env._fread;var ce=env._abort;var cf=env._fprintf;var cg=env.___fpclassifyf;var ch=env._tan;var ci=env.___buildEnvironment;var cj=env._feof;var ck=env._strncat;var cl=env._gmtime_r;var cm=env._fabs;var cn=env._floor;var co=env.__reallyNegative;var cp=env._fseek;var cq=env._sqrt;var cr=env._write;var cs=env._rewind;var ct=env._sin;var cu=env._stat;var cv=env._longjmp;var cw=env._atan;var cx=env._readdir_r;var cy=env._strpbrk;var cz=env._iconv_close;var cA=env._setbuf;var cB=env._nl_langinfo;var cC=env._pwrite;var cD=env._strerror_r;var cE=env._atan2;var cF=env._exp;var cG=env._time;var cH=env._setvbuf;
-// EMSCRIPTEN_START_FUNCS
-function cX(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7>>3<<3;return b|0}function cY(){return i|0}function cZ(a){a=a|0;i=a}function c_(a,b){a=a|0;b=b|0;if((r|0)==0){r=a;s=b}}function c$(a){a=a|0;E=a}function c0(a){a=a|0;F=a}function c1(a){a=a|0;G=a}function c2(a){a=a|0;H=a}function c3(a){a=a|0;I=a}function c4(a){a=a|0;J=a}function c5(a){a=a|0;K=a}function c6(a){a=a|0;L=a}function c7(a){a=a|0;M=a}function c8(a){a=a|0;N=a}function c9(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,x=0.0;d=i;i=i+96|0;e=d|0;f=d+48|0;do{if((c[64808+(b*688&-1)>>2]|0)==1){if((a[64812+(b*688&-1)|0]&1)==0){break}g=4968+(b*51&-1)|0;a[g]=0;j=4608+(b<<2)|0;k=+da(c[j>>2]|0,+h[64664+(b*688&-1)>>3]);t3(e,k);k=+da(c[j>>2]|0,+h[64672+(b*688&-1)>>3]);t3(f,k);l=c[f+20>>2]|0;m=c[e+20>>2]|0;n=(l|0)==(m|0);do{if(n){if((c[f+28>>2]|0)!=(c[e+28>>2]|0)){break}if((c[f+8>>2]|0)!=(c[e+8>>2]|0)){a[g]=a[172544]|0;a[g+1|0]=a[172545|0]|0;a[g+2|0]=a[172546|0]|0}o=c[j>>2]|0;if(o>>>0>=4){p=g;i=d;return p|0}if((a[g]|0)!=0){q=(uA(g|0)|0)+(4968+(b*51&-1))|0;w=58;a[q]=w&255;w=w>>8;a[q+1|0]=w&255}q=(uA(g|0)|0)+(4968+(b*51&-1))|0;a[q]=a[164672]|0;a[q+1|0]=a[164673|0]|0;a[q+2|0]=a[164674|0]|0;if(o>>>0>=3){p=g;i=d;return p|0}o=(uA(g|0)|0)+(4968+(b*51&-1))|0;w=5449018;a[o]=w&255;w=w>>8;a[o+1|0]=w&255;w=w>>8;a[o+2|0]=w&255;w=w>>8;a[o+3|0]=w&255;p=g;i=d;return p|0}}while(0);o=64813+(b*688&-1)|0;q=a8(o|0,109)|0;r=q>>>0<(a8(o|0,100)|0)>>>0;do{if(n){if(r){a[g]=a[145768]|0;a[g+1|0]=a[145769|0]|0;a[g+2|0]=a[145770|0]|0;a[g+3|0]=a[145771|0]|0;a[g+4|0]=a[145772|0]|0;a[g+5|0]=a[145773|0]|0;break}else{a[g]=a[143792]|0;a[g+1|0]=a[143793|0]|0;a[g+2|0]=a[143794|0]|0;a[g+3|0]=a[143795|0]|0;a[g+4|0]=a[143796|0]|0;a[g+5|0]=a[143797|0]|0;break}}else{o=g;q=o|0;w=r?623865125:623862821;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;w=w>>8;a[q+2|0]=w&255;w=w>>8;a[q+3|0]=w&255;q=o+4|0;w=r?2436964:2436973;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;w=w>>8;a[q+2|0]=w&255;w=w>>8;a[q+3|0]=w&255;q=(uA(g|0)|0)+(4968+(b*51&-1))|0;if(((l|0)/100&-1|0)==((m|0)/100&-1|0)){w=121;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;break}else{w=89;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;break}}}while(0);if((c[j>>2]|0)>>>0>=5){p=g;i=d;return p|0}m=(uA(g|0)|0)+(4968+(b*51&-1))|0;a[m]=a[142240]|0;a[m+1|0]=a[142241|0]|0;a[m+2|0]=a[142242|0]|0;a[m+3|0]=a[142243|0]|0;a[m+4|0]=a[142244|0]|0;a[m+5|0]=a[142245|0]|0;a[m+6|0]=a[142246|0]|0;p=g;i=d;return p|0}}while(0);e=4968+(b*51&-1)|0;uB(e|0,64864+(b*688&-1)|0);if((aY(e|0,186288)|0)!=0){p=e;i=d;return p|0}k=+h[64664+(b*688&-1)>>3];if((a[64788+(b*688&-1)|0]&1)==0){s=+h[64672+(b*688&-1)>>3];t=k}else{u=+h[64800+(b*688&-1)>>3];x=+Z(+(k*u));s=+Z(+(+h[64672+(b*688&-1)>>3]*u));t=x}b=~~+$(+(-0.0- +bQ(+(+P(+(s-t))))));if(t*s>0.0&(b|0)>4){f=(b|0)>14?14:b;be(e|0,180872,(v=i,i=i+8|0,c[v>>2]=f,v)|0);p=e;i=d;return p|0}else{a[e]=a[170912]|0;a[e+1|0]=a[170913|0]|0;a[e+2|0]=a[170914|0]|0;p=e;i=d;return p|0}return 0}function da(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,h=0,j=0;d=i;i=i+48|0;e=d|0;if(a>>>0<2){f=b;i=d;return+f}t3(e,b);g=e|0;if((c[g>>2]|0)>55){h=e+4|0;c[h>>2]=(c[h>>2]|0)+1}c[g>>2]=0;do{if(a>>>0>2){g=e+4|0;if((c[g>>2]|0)>55){h=e+8|0;c[h>>2]=(c[h>>2]|0)+1}c[g>>2]=0;if(a>>>0<=3){break}g=e+8|0;if((c[g>>2]|0)>22){c[g>>2]=0;c[e+12>>2]=0;g=e+28|0;c[g>>2]=(c[g>>2]|0)+1;b=+t2(e);t3(e,b)}if(a>>>0<=5){break}g=e+12|0;do{if((c[g>>2]|0)>25){h=e+16|0;j=(c[h>>2]|0)+1|0;c[h>>2]=j;if((j|0)<=11){break}j=e+20|0;c[j>>2]=(c[j>>2]|0)+1;c[h>>2]=0}}while(0);c[g>>2]=1}}while(0);f=+t2(e);i=d;return+f}function db(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;do{if((a|0)==0){f=ut(b)|0;if((f|0)!=0){g=f;break}gk();f=ut(b)|0;if((f|0)!=0|(d|0)==0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=d,v)|0);return 0}else{f=uv(a,b)|0;if((f|0)!=0){g=f;break}gk();f=uv(a,b)|0;if((f|0)!=0|(d|0)==0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=d,v)|0);return 0}}while(0);i=e;return g|0}function dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0,n=0.0,o=0,p=0,q=0;d=i;e=64664+(a*688&-1)|0;f=+h[e>>3];g=64672+(a*688&-1)|0;j=+h[g>>3];k=(b|0)!=0;do{if(k){if(!(f==8.988465674311579e+307|j==-8.988465674311579e+307)){break}uf(c[13898]|0,b,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(j-f!=0.0){i=d;return}b=64648+(a*688&-1)|0;l=c[b>>2]|0;if((l|0)==0){uf(-1,197584,(v=i,i=i+8|0,c[v>>2]=56832+(a*24&-1),v)|0)}if(j==0.0){n=1.0}else{n=+P(+j)*.01}o=(a|0)!=0|k;if(o){k=c[m>>2]|0;p=56832+(a*24&-1)|0;cf(k|0,206616,(v=i,i=i+24|0,c[v>>2]=p,h[v+8>>3]=f,h[v+16>>3]=j,v)|0);q=c[b>>2]|0}else{q=l}if((q&1|0)!=0){h[e>>3]=+h[e>>3]-n}if((q&2|0)!=0){h[g>>3]=n+ +h[g>>3]}if(!o){i=d;return}n=+h[g>>3];cf(c[m>>2]|0,202928,(v=i,i=i+16|0,h[v>>3]=+h[e>>3],h[v+8>>3]=n,v)|0);i=d;return}function dd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,Q=0.0,S=0,T=0.0,U=0.0;e=i;f=c[64648+(b*688&-1)>>2]|0;g=(f&1|0)==0;if(g){j=0}else{j=(f&4|0)==0}k=(f&2|0)==0;if(k){l=0}else{l=(f&8|0)==0}do{if(!g){if((c[64728+(b*688&-1)>>2]&2|0)==0){break}f=64664+(b*688&-1)|0;m=+h[64744+(b*688&-1)>>3];if(+h[f>>3]<=m){break}h[f>>3]=m}}while(0);do{if(!k){if((c[64732+(b*688&-1)>>2]&1|0)==0){break}g=64672+(b*688&-1)|0;m=+h[64752+(b*688&-1)>>3];if(+h[g>>3]>=m){break}h[g>>3]=m}}while(0);if((c[64916+(b*688&-1)>>2]|0)==0){i=e;return}k=64920+(b*688&-1)|0;g=c[k>>2]|0;do{if((g|0)==2){m=+h[64960+(b*688&-1)>>3];h[4880+(b<<3)>>3]=m;if(j){n=+h[64952+(b*688&-1)>>3]==-8.988465674311579e+307}else{n=0}if(!l){o=0;p=n;q=m;break}o=+h[64968+(b*688&-1)>>3]==8.988465674311579e+307;p=n;q=m}else if((g|0)==1){m=+h[64664+(b*688&-1)>>3]- +h[64672+(b*688&-1)>>3];r=+P(+m);do{if(m==0.0){s=1.0}else{if(r>=8.988465674311579e+307){uf(-1,98888,(v=i,i=i+8|0,c[v>>2]=56832+(b*24&-1),v)|0)}t=+R(10.0,+(+O(+(+bQ(+r)))));u=r/t;w=+(d|0);x=w/u;do{if(x>40.0){y=.05}else{if(x>20.0){y=.1;break}if(x>10.0){y=.2;break}if(x>4.0){y=.5;break}if(x>2.0){y=1.0;break}if(x>.5){y=2.0;break}y=+$(+u)}}while(0);u=t*y;x=(a[64788+(b*688&-1)|0]&1)!=0&u<1.0?1.0:u;if((c[64808+(b*688&-1)>>2]|0)!=1){s=x;break}f=(d*3&-1|0)/5&-1;z=4608+(b<<2)|0;c[z>>2]=1;do{if(x>5.0){u=r/60.0;A=+R(12.0,+(+O(+(+_(+u)/2.4849066497880004))));B=u/A;u=+(f|0)/B;do{if(u>24.0){C=A/24.0}else{if(u>12.0){C=A/12.0;break}if(u>6.0){C=A/6.0;break}if(u>4.0){C=A*.25;break}if(u>2.0){C=A*.5;break}if(u>1.0){C=A;break}if(u>.5){C=A*2.0;break}if(u>.3333333333333333){C=A*3.0;break}else{C=A*+$(+B);break}}}while(0);B=C*60.0;if(B<60.0){D=B;break}c[z>>2]=2;D=B}else{D=x}}while(0);do{if(D>300.0){x=r/3600.0;t=+R(12.0,+(+O(+(+_(+x)/2.4849066497880004))));B=x/t;x=+(f|0)/B;do{if(x>24.0){E=t/24.0}else{if(x>12.0){E=t/12.0;break}if(x>6.0){E=t/6.0;break}if(x>4.0){E=t*.25;break}if(x>2.0){E=t*.5;break}if(x>1.0){E=t;break}if(x>.5){E=t*2.0;break}if(x>.3333333333333333){E=t*3.0;break}else{E=t*+$(+B);break}}}while(0);B=E*3600.0;if(B<3600.0){F=B;break}c[z>>2]=3;F=B}else{F=D}}while(0);do{if(F>3600.0){B=r/86400.0;t=+R(12.0,+(+O(+(+_(+B)/2.4849066497880004))));x=B/t;B=+(f|0)/x;do{if(B>24.0){G=t/24.0}else{if(B>12.0){G=t/12.0;break}if(B>6.0){G=t/6.0;break}if(B>4.0){G=t*.25;break}if(B>2.0){G=t*.5;break}if(B>1.0){G=t;break}if(B>.5){G=t*2.0;break}if(B>.3333333333333333){G=t*3.0;break}else{G=t*+$(+x);break}}}while(0);x=G*86400.0;if(x<86400.0){H=x;break}c[z>>2]=4;H=x}else{H=F}}while(0);do{if(H>172800.0){x=r/604800.0;t=+R(10.0,+(+O(+(+bQ(+x)))));B=x/t;x=w/B;do{if(x>40.0){I=.05}else{if(x>20.0){I=.1;break}if(x>10.0){I=.2;break}if(x>4.0){I=.5;break}if(x>2.0){I=1.0;break}if(x>.5){I=2.0;break}I=+$(+B)}}while(0);B=t*I*604800.0;x=B<604800.0?604800.0:B;if(x<604800.0){J=x;break}c[z>>2]=5;J=x}else{J=H}}while(0);do{if(J>1814400.0){x=r/2629800.0;B=+R(10.0,+(+O(+(+bQ(+x)))));A=x/B;x=w/A;do{if(x>40.0){K=.05}else{if(x>20.0){K=.1;break}if(x>10.0){K=.2;break}if(x>4.0){K=.5;break}if(x>2.0){K=1.0;break}if(x>.5){K=2.0;break}K=+$(+A)}}while(0);A=B*K*2629800.0;x=A<2629800.0?2629800.0:A;if(x<2629800.0){L=x;break}c[z>>2]=6;L=x}else{L=J}}while(0);if(L<=2629800.0){s=L;break}w=r/31557600.0;x=+R(12.0,+(+O(+(+_(+w)/2.4849066497880004))));A=w/x;w=+(f|0)/A;do{if(w>24.0){M=x/24.0}else{if(w>12.0){M=x/12.0;break}if(w>6.0){M=x/6.0;break}if(w>4.0){M=x*.25;break}if(w>2.0){M=x*.5;break}if(w>1.0){M=x;break}if(w>.5){M=x*2.0;break}if(w>.3333333333333333){M=x*3.0;break}else{M=x*+$(+A);break}}}while(0);A=M*31557600.0;if(A<31557600.0){s=A;break}c[z>>2]=7;s=A}}while(0);h[4880+(b<<3)>>3]=s;o=l;p=j;q=s}else{o=0;p=0;q=0.0}}while(0);j=(c[64808+(b*688&-1)>>2]|0)==1;do{if(j){if((c[k>>2]|0)!=2){break}if(q>=31536.0e3){c[4608+(b<<2)>>2]=7;break}if(q>=2419200.0){c[4608+(b<<2)>>2]=6;break}if(q>=604800.0){c[4608+(b<<2)>>2]=5;break}if(q>=86400.0){c[4608+(b<<2)>>2]=4;break}if(q>=3600.0){c[4608+(b<<2)>>2]=3;break}l=4608+(b<<2)|0;if(q<60.0){c[l>>2]=1;break}else{c[l>>2]=2;break}}}while(0);do{if(p){k=64664+(b*688&-1)|0;q=+h[k>>3];l=q>=+h[64672+(b*688&-1)>>3];s=+h[4880+(b<<3)>>3];M=q/s;if(l){N=+$(+M)}else{N=+O(+M)}M=s*N;do{if(j){s=+da(c[4608+(b<<2)>>2]|0,M);if(s>M&l){Q=s;break}if(s<M&(l^1)){Q=s}else{S=231}}else{S=231}}while(0);if((S|0)==231){Q=M}h[k>>3]=Q;if((c[64728+(b*688&-1)>>2]&1|0)==0){break}s=+h[64736+(b*688&-1)>>3];if(Q>=s){break}h[k>>3]=s}}while(0);do{if(o){j=64672+(b*688&-1)|0;Q=+h[j>>3];p=+h[64664+(b*688&-1)>>3]<Q;N=+h[4880+(b<<3)>>3];s=Q/N;if(p){T=+$(+s)}else{T=+O(+s)}s=N*T;do{if((c[64808+(b*688&-1)>>2]|0)==1){N=+da(c[4608+(b<<2)>>2]|0,s);if(N>s&p){U=N;break}if(N<s&(p^1)){U=N}else{S=242}}else{S=242}}while(0);if((S|0)==242){U=s}h[j>>3]=U;if((c[64732+(b*688&-1)>>2]&2|0)==0){break}M=+h[64760+(b*688&-1)>>3];if(U<=M){break}h[j>>3]=M}}while(0);c9(b);i=e;return}function de(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0,N=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0;e=i;i=i+432|0;f=e|0;g=e+48|0;j=e+96|0;k=e+152|0;l=e+208|0;m=e+264|0;n=e+320|0;o=e+376|0;p=64920+(b*688&-1)|0;q=c[65040+(b*688&-1)>>2]|0;r=+h[65048+(b*688&-1)>>3];s=j;c[s>>2]=c[10012];c[s+4>>2]=c[10013];c[s+8>>2]=c[10014];c[s+12>>2]=c[10015];c[s+16>>2]=c[10016];c[s+20>>2]=c[10017];c[s+24>>2]=c[10018];c[s+28>>2]=c[10019];c[s+32>>2]=c[10020];c[s+36>>2]=c[10021];c[s+40>>2]=c[10022];c[s+44>>2]=c[10023];c[s+48>>2]=c[10024];c[s+52>>2]=c[10025];t=k;c[t>>2]=c[8694];c[t+4>>2]=c[8695];c[t+8>>2]=c[8696];c[t+12>>2]=c[8697];c[t+16>>2]=c[8698];c[t+20>>2]=c[8699];c[t+24>>2]=c[8700];c[t+28>>2]=c[8701];c[t+32>>2]=c[8702];c[t+36>>2]=c[8703];c[t+40>>2]=c[8704];c[t+44>>2]=c[8705];c[t+48>>2]=c[8706];c[t+52>>2]=c[8707];if((a[65036+(b*688&-1)|0]&1)==0){c[j+4>>2]=-3}if((a[65037+(b*688&-1)|0]&1)==0){c[k+4>>2]=-3}u=64944+(b*688&-1)|0;do{if((c[u>>2]|0)==0){w=64664+(b*688&-1)|0;x=64672+(b*688&-1)|0;y=64788+(b*688&-1)|0}else{z=64672+(b*688&-1)|0;A=+h[z>>3];B=64664+(b*688&-1)|0;C=+h[B>>3];D=(A-C)/10.0*.01;E=64788+(b*688&-1)|0;if((a[E]&1)==0){F=1.0}else{F=+bQ(+(+h[64792+(b*688&-1)>>3]))}if((a[30528]&1)==0){G=C;H=A;I=0.0}else{J=c[200]|0;G=+h[64664+(J*688&-1)>>3];H=+h[64672+(J*688&-1)>>3];I=(c[17366]&1|0)==0?+h[8685]:0.0}A=G-D;C=D+H;J=c[u>>2]|0;if((J|0)!=0){K=(b|0)==7;L=A<C;M=m;N=j+4|0;Q=n;S=64808+(b*688&-1)|0;T=l|0;U=4968+(b*51&-1)|0;V=64800+(b*688&-1)|0;W=J;do{if(K){D=+h[W>>3];if((a[69604]&1)==0){X=I;Y=D}else{aa=+_(+D);ab=+h[8702];X=+_(+I)/ab;Y=aa/ab}ac=Y-X;ad=D}else{D=+h[W>>3];if((a[E]&1)==0){ae=D}else{ab=+_(+D);ae=ab/+h[V>>3]}ac=ae-I;ad=D}if(L){if(!(ac<A|ac>C)){af=272}}else{if(!(ac<C|ac>A)){af=272}}do{if((af|0)==272){af=0;J=W+12|0;ag=c[W+8>>2]|0;do{if((c[J>>2]|0)<0){ah=ag;ai=ag;af=280}else{if((ag|0)==0){af=275}else{if((a8(ag|0,37)|0)==0){aj=ag}else{af=275}}do{if((af|0)==275){af=0;ak=(ag|0)!=0?ag:U;if((c[S>>2]|0)==1){t3(g,ad);D=ad- +O(+ad);t4(T,49,ak,g,D);aj=T;break}else{ud(T,50,ak,F,ad);aj=T;break}}}while(0);ak=(c[J>>2]|0)>0;al=ak?0:aj;if(!ak){ah=aj;ai=al;af=280;break}c[M>>2]=c[t>>2];c[M+4>>2]=c[t+4>>2];c[M+8>>2]=c[t+8>>2];c[M+12>>2]=c[t+12>>2];c[M+16>>2]=c[t+16>>2];c[M+20>>2]=c[t+20>>2];c[M+24>>2]=c[t+24>>2];c[M+28>>2]=c[t+28>>2];c[M+32>>2]=c[t+32>>2];c[M+36>>2]=c[t+36>>2];c[M+40>>2]=c[t+40>>2];c[M+44>>2]=c[t+44>>2];c[M+48>>2]=c[t+48>>2];c[M+52>>2]=c[t+52>>2];am=aj;an=al}}while(0);if((af|0)==280){af=0;c[M>>2]=c[s>>2];c[M+4>>2]=c[s+4>>2];c[M+8>>2]=c[s+8>>2];c[M+12>>2]=c[s+12>>2];c[M+16>>2]=c[s+16>>2];c[M+20>>2]=c[s+20>>2];c[M+24>>2]=c[s+24>>2];c[M+28>>2]=c[s+28>>2];c[M+32>>2]=c[s+32>>2];c[M+36>>2]=c[s+36>>2];c[M+40>>2]=c[s+40>>2];c[M+44>>2]=c[s+44>>2];c[M+48>>2]=c[s+48>>2];c[M+52>>2]=c[s+52>>2];am=ah;an=ai}cT[d&15](b,ac,an,m,0);if(!K){break}if((c[17433]&4|0)==0){break}ag=c[N>>2]|0;c[N>>2]=-3;al=(c[J>>2]|0)>0;if(al){c[Q>>2]=c[t>>2];c[Q+4>>2]=c[t+4>>2];c[Q+8>>2]=c[t+8>>2];c[Q+12>>2]=c[t+12>>2];c[Q+16>>2]=c[t+16>>2];c[Q+20>>2]=c[t+20>>2];c[Q+24>>2]=c[t+24>>2];c[Q+28>>2]=c[t+28>>2];c[Q+32>>2]=c[t+32>>2];c[Q+36>>2]=c[t+36>>2];c[Q+40>>2]=c[t+40>>2];c[Q+44>>2]=c[t+44>>2];c[Q+48>>2]=c[t+48>>2];c[Q+52>>2]=c[t+52>>2]}else{c[Q>>2]=c[s>>2];c[Q+4>>2]=c[s+4>>2];c[Q+8>>2]=c[s+8>>2];c[Q+12>>2]=c[s+12>>2];c[Q+16>>2]=c[s+16>>2];c[Q+20>>2]=c[s+20>>2];c[Q+24>>2]=c[s+24>>2];c[Q+28>>2]=c[s+28>>2];c[Q+32>>2]=c[s+32>>2];c[Q+36>>2]=c[s+36>>2];c[Q+40>>2]=c[s+40>>2];c[Q+44>>2]=c[s+44>>2];c[Q+48>>2]=c[s+48>>2];c[Q+52>>2]=c[s+52>>2]}cT[d&15](7,-0.0-ac,al?0:am,n,0);c[N>>2]=ag}}while(0);W=c[W+16>>2]|0;}while((W|0)!=0)}if((c[p>>2]|0)!=3){w=B;x=z;y=E;break}i=e;return}}while(0);ac=+h[w>>3];ad=+h[x>>3];if((a[y]&1)==0){ao=1.0}else{ao=+bQ(+(+h[64792+(b*688&-1)>>3]))}x=ad<ac;F=x?ad:ac;I=x?ac:ad;x=p|0;p=c[x>>2]|0;do{if((p|0)==2){if((a[y]&1)==0|(b|0)==7){ad=+h[64952+(b*688&-1)>>3];ac=+h[64960+(b*688&-1)>>3];ae=+h[64968+(b*688&-1)>>3];if(ad==-8.988465674311579e+307){ap=ac*+O(+(F/ac))}else{ap=ad}if(ae!=8.988465674311579e+307){aq=ae;ar=ac;as=ap;break}aq=ac*+$(+(I/ac));ar=ac;as=ap;break}ac=+h[64968+(b*688&-1)>>3];if(ac<=0.0){i=e;return}ae=+h[64960+(b*688&-1)>>3];if(ae<=0.0){i=e;return}ad=+_(+ae);ae=+h[64800+(b*688&-1)>>3];X=ad/ae;ad=+h[64952+(b*688&-1)>>3];if(ad>0.0){at=+_(+ad)/ae}else{at=X*+O(+(F/X))}if(ac==8.988465674311579e+307){aq=X*+$(+(I/X));ar=X;as=at;break}else{aq=+_(+ac)/ae;ar=X;as=at;break}}else if((p|0)==1){X=+h[4880+(b<<3)>>3];ae=X*+O(+(F/X));aq=X*+$(+(I/X));ar=X;as=ae}else if((p|0)==4){ae=+O(+F);X=+$(+I);ac=+O(+((X-ae)/12.0));if(ac>=1.0){aq=X;ar=ac;as=ae;break}aq=X;ar=1.0;as=ae}else if((p|0)==5){ae=+O(+F);X=+$(+I);ac=+O(+((X-ae)/14.0));if(ac>=1.0){aq=X;ar=ac;as=ae;break}aq=X;ar=1.0;as=ae}else{uk(140640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);p=aq<as;at=p?aq:as;ap=p?as:aq;aq=+P(+ar);L424:do{if((q|0)==0){au=0;av=1.0;aw=1.0;ax=0.0}else{if(+h[65064+(b*688&-1)>>3]==0.0){au=q;av=1.0;aw=1.0;ax=0.0;break}do{if((q|0)==2){if(r<=0.0){au=0;av=1.0;aw=1.0;ax=0.0;break L424}as=aq/r;if((a[y]&1)==0){ay=2;az=aq;aA=as;break}ae=+h[64792+(b*688&-1)>>3];ay=2;az=aq*ae;aA=as*ae}else{if((a[y]&1)!=0){if(aq<=1.5){ae=+h[64792+(b*688&-1)>>3];as=ap-at;if(as>=10.0){au=0;av=ae;aw=1.0;ax=0.0;break L424}au=q;av=ae;aw=as<5.0?1.0:3.0;ax=2.0;break L424}as=aq*.2;if(aq<65535.0){aB=+(~~as|0)}else{aB=as}ay=q;az=aq;aA=aB<1.0?1.0:aB;break}if((c[64808+(b*688&-1)>>2]|0)!=1){if((q|0)!=3){au=0;av=1.0;aw=1.0;ax=0.0;break L424}as=+P(+aq);ay=3;az=aq;aA=aq*((~~(as/+R(10.0,+(+O(+(+bQ(+as))))))|0)==2?.5:.2);break}p=c[4608+(b<<2)>>2]|0;w=(p|0)<1?1:p;do{if((w|0)==1|(w|0)==2){if(aq<1440.0){aC=aq<720.0?aq<360.0?aq<120.0?aq<60.0?aq<20.0?aq<10.0?aq<5.0?0.0:1.0:5.0:10.0:20.0:60.0:120.0:180.0;break}aC=360.0}else if((w|0)==3){if(aq<86400.0){aC=aq<43200.0?aq<21600.0?aq<7200.0?aq<3600.0?aq<1200.0?0.0:600.0:1800.0:3600.0:7200.0:10800.0;break}aC=21600.0}else if((w|0)==4){if(aq<=172800.0){aC=aq>86400.0?43200.0:aq>46800.0?21600.0:aq>25200.0?10800.0:aq>14400.0?7200.0:aq>7200.0?3600.0:0.0;break}aC=86400.0}else if((w|0)==5){if(aq<=604800.0){aC=aq>172800.0?86400.0:0.0;break}aC=604800.0}else if((w|0)==6){if(aq<=63115200.0){aC=aq>15778800.0?7889400.0:aq>5259600.0?2629800.0:aq>1296.0e3?864.0e3:aq>172800.0?86400.0:0.0;break}aC=31557600.0}else if((w|0)==7){if(aq<=946728.0e4){aC=aq>631152.0e4?157788.0e4:aq>315576.0e4?631152.0e3:aq>157788.0e4?315576.0e3:aq>315576.0e3?157788.0e3:aq>63115200.0?31557600.0:aq>15778800.0?7889400.0:aq>5259600.0?2629800.0:0.0;break}aC=315576.0e4}else{aC=0.0}}while(0);ay=q;az=aq*.9;aA=aC}}while(0);if(aA>0.0){au=ay;av=az;aw=aA;ax=aA;break}au=0;av=az;aw=aA;ax=aA}}while(0);aA=aq*.01;az=ap+aA;ap=+P(+I);if(aq<ap+ +P(+F)){aD=I+aA;aE=F-aA}else{aD=I;aE=F}if(ar==0.0){i=e;return}ar=(aD-aE)/aq;if(ar>+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)){uh(-1,138720,(v=i,i=i+8|0,h[v>>3]=ar,v)|0);i=e;return}h[111]=at-aq;h[110]=at;L473:do{if(+h[110]>az){aF=aq}else{ar=aq*.25;while(1){if(+P(+(+h[110]- +h[111]))<ar){break}h[111]=+h[110];h[110]=aq+ +h[110];if(+h[110]>az){aF=aq;break L473}}uh(-1,137120,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aF=az-at}}while(0);if(at>az){i=e;return}ay=(b|0)==7;q=(au|0)==0;au=65064+(b*688&-1)|0;E=64808+(b*688&-1)|0;z=4608+(b<<2)|0;B=aE<aD;aq=aF*.01;ar=at-aq;F=az+aq;w=ar<F;p=aF>1.5;n=64800+(b*688&-1)|0;am=o|0;o=4968+(b*51&-1)|0;s=65024+(b*688&-1)|0;t=j+4|0;m=64712+(b*688&-1)|0;an=64720+(b*688&-1)|0;I=at;at=0.0;while(1){do{if(ay){aG=at;aH=I}else{if((a[y]&1)!=0){aG=+Z(+(I*+h[n>>3]));aH=I;break}if((c[E>>2]|0)==1){aI=+da(c[z>>2]|0,I)}else{aI=I}aG=+P(+aI)<aq?0.0:aI;aH=aI}}while(0);if(aH>aD){af=427;break}L495:do{if(aH<aE){aJ=aH;af=382}else{ai=c[x>>2]|0;if((ai|0)==5){ah=(~~+O(+(aG+.5))|0)%7&-1;cT[d&15](b,aH,72464+(((ah|0)<0?ah+7|0:ah)<<3)|0,j,c[u>>2]|0);aJ=aH;af=382;break}else if((ai|0)==4){ai=(~~+O(+(aG+-1.0))|0)%12&-1;cT[d&15](b,aH,72368+(((ai|0)<0?ai+12|0:ai)<<3)|0,j,c[u>>2]|0);aJ=aH;af=382;break}else{do{if((c[E>>2]|0)==1){t3(f,aG);aA=aG- +O(+aG);t4(am,49,o,f,aA);aK=aH}else{if((a[30528]&1)==0){ud(am,50,o,ao,aG);aK=aH;break}aA=+h[8685];ap=(c[17366]&1|0)==0?aA:0.0;aC=+P(+aG)+ap;if(ay){if((a[y]&1)==0){aL=aA;aM=I}else{ap=+_(+I);aB=+h[n>>3];aL=+_(+aA)/aB;aM=ap/aB}aN=I;aO=aM-aL}else{aN=aC;aO=aH}ud(am,50,o,ao,aN);aK=aO}}while(0);do{if((a[s]&1)!=0){aC=+h[m>>3];aB=+h[an>>3];if(aC<aB){if(aK<aC|aK>aB){break L495}else{break}}else{if(aK<aB|aK>aC){break L495}else{break}}}}while(0);cT[d&15](b,aK,am,j,c[u>>2]|0);if(!ay){aJ=aK;af=382;break}if((c[17433]&4|0)==0){aJ=aK;af=382;break}ai=c[t>>2]|0;c[t>>2]=-3;cT[d&15](7,-0.0-aK,am,j,c[u>>2]|0);c[t>>2]=ai;aJ=aK;af=382;break}}}while(0);L522:do{if((af|0)==382){af=0;if(q){break}if(+h[au>>3]==0.0|ax>=av){break}if(p){aC=ax;while(1){if((c[E>>2]|0)==1){aP=+da((c[z>>2]|0)-1|0,aJ+aC)}else{aP=aJ+aC}if(B){if(!(aP<aE|aP>aD)){af=392}}else{if(!(aP<aD|aP>aE)){af=392}}do{if((af|0)==392){af=0;if(w){if(aP<ar|aP>F){break}}else{if(aP<F|aP>ar){break}}cT[d&15](b,aP,0,k,0)}}while(0);aC=aw+aC;if(aC>=av){break L522}}}if(B){aC=ax;do{if((c[E>>2]|0)==1){aQ=+da((c[z>>2]|0)-1|0,aJ+aC)}else{if((a[y]&1)==0){aR=aC}else{aB=+_(+aC);aR=aB/+h[n>>3]}aQ=aJ+aR}do{if(!(aQ<aE|aQ>aD)){if(w){if(aQ<ar|aQ>F){break}}else{if(aQ<F|aQ>ar){break}}cT[d&15](b,aQ,0,k,0)}}while(0);aC=aw+aC;}while(aC<av)}else{aC=ax;do{if((c[E>>2]|0)==1){aS=+da((c[z>>2]|0)-1|0,aJ+aC)}else{if((a[y]&1)==0){aT=aC}else{aB=+_(+aC);aT=aB/+h[n>>3]}aS=aJ+aT}do{if(!(aS<aD|aS>aE)){if(w){if(aS<ar|aS>F){break}}else{if(aS<F|aS>ar){break}}cT[d&15](b,aS,0,k,0)}}while(0);aC=aw+aC;}while(aC<av)}}}while(0);aC=aF+I;if(aC>az){af=428;break}else{I=aC;at=aG}}if((af|0)==427){i=e;return}else if((af|0)==428){i=e;return}}function df(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0,A=0;g=c[3524]|0;i=(b&3|0)==1;j=(b&-4|0)==4;if(e>>>0>3){k=64768+(e*688&-1)|0;l=64772+(e*688&-1)|0}else{k=64772+(e*688&-1)|0;l=64768+(e*688&-1)|0}m=c[k>>2]|0;k=c[l>>2]|0;l=64916+(b*688&-1)|0;if((c[l>>2]|0)==0){return}n=65032+(b*688&-1)|0;o=c[n>>2]|0;do{if((o|0)==-270){if((cO[c[g+72>>2]&255](-270)|0)==0){p=c[n>>2]|0;q=441;break}if(i){c[1398]=1;r=j?0:2}else{c[1398]=j?0:2;r=1}c[1384]=r;c[6586]=-270;if((b|0)!=1){break}c[d>>2]=(c[d>>2]|0)+((c[g+16>>2]|0)>>>1)}else{p=o;q=441}}while(0);L599:do{if((q|0)==441){do{if((p|0)!=0){if((cO[c[g+72>>2]&255](p)|0)==0){break}if((b|0)==5){c[1398]=0}else if((b|0)==2){c[1398]=0}else if((b|0)==6){c[1398]=0}else if((b|0)==1){c[d>>2]=~~(+(c[d>>2]|0)+ +((c[g+20>>2]|0)>>>0>>>0)*2.5);c[1398]=2}else{c[1398]=0}c[1384]=1;c[6586]=c[n>>2];break L599}}while(0);if(i){c[1398]=j?0:2;s=1}else{c[1398]=1;s=j?2:0}c[1384]=s;c[6586]=0}}while(0);if((a[65272+(b*688&-1)|0]&1)==0){c[65128+(b*688&-1)>>2]=c[1398]}else{c[1398]=c[65128+(b*688&-1)>>2]}s=c[l>>2]|0;l=(s&4|0)==0;c[1396]=l?-1:m;do{if((s&2|0)==0){q=481}else{if((a[64788+(e*688&-1)|0]&1)!=0){q=481;break}t=+h[64664+(e*688&-1)>>3];u=+h[64672+(e*688&-1)>>3];if(t<u){if(t>0.0|u<0.0){q=481;break}}else{if(u>0.0|t<0.0){q=481;break}}m=~~(+(c[64768+(e*688&-1)>>2]|0)+(0.0-t)*+h[64776+(e*688&-1)>>3]+.5);c[1394]=m;n=j?1:-1;c[1400]=n;if(!l){c[1396]=m}p=aa(m-k|0,j?-1:1);if(i){o=g+20|0;do{if(p>>>0>((c[o>>2]|0)*3&-1)>>>0){q=469}else{r=c[11692]|0;if(j){if((r&8|0)==0){q=469;break}else{v=k;break}}else{if((r&2|0)==0){q=469;break}else{v=k;break}}}}while(0);if((q|0)==469){v=m}c[1392]=v;c[1392]=aa(c[o>>2]|0,n)+v;break}r=g+16|0;do{if(p>>>0>c[r>>2]<<1>>>0){t=+(m|0);if(j){w=0.0;x=t;q=479}else{y=t;q=478}}else{z=c[11692]|0;if(j){if((z&4|0)!=0){A=k;break}w=0.0;x=+(m|0);q=479;break}else{if((z&1|0)!=0){A=k;break}y=+(m|0);q=478;break}}}while(0);if((q|0)==478){w=+((c[g+24>>2]|0)>>>0>>>0)*(-0.0- +h[65056+(b*688&-1)>>3]);x=y;q=479}if((q|0)==479){A=~~(x+w)}c[1392]=A;c[1392]=A-(c[r>>2]|0)}}while(0);if((q|0)==481){c[1394]=k;c[1400]=aa((a[65072+(b*688&-1)|0]&1)!=0?1:-1,j?-1:1);c[1392]=c[d>>2]}de(b,f);cO[c[g+72>>2]&255](0);return}function dg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e|0;g=+h[64664+(d*688&-1)>>3];if(g>0.0){j=+h[64672+(d*688&-1)>>3];if(j>0.0){k=j}else{l=488}}else{l=488}do{if((l|0)==488){if((a[64788+(d*688&-1)|0]&1)!=0){k=+h[64672+(d*688&-1)>>3];break}do{if(g<0.0){j=+h[64672+(d*688&-1)>>3];if(j>=0.0){break}if(j<g){m=64768+(d*688&-1)|0}else{m=64772+(d*688&-1)|0}c[64784+(d*688&-1)>>2]=c[m>>2];i=e;return}}while(0);c[64784+(d*688&-1)>>2]=~~(+(c[64768+(d*688&-1)>>2]|0)+(0.0-g)*+h[64776+(d*688&-1)>>3]+.5);n=c[65284+(b*688&-1)>>2]|0;if((n|0)<=-3){i=e;return}o=f;p=65320+(b*688&-1)|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];do{if((c[65280+(b*688&-1)>>2]|0)!=0){j=+h[65304+(b*688&-1)>>3];p=c[(c[3524]|0)+92>>2]|0;if(j<0.0){cK[p&63](+h[3817]);break}else{cK[p&63](j);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[65296+(b*688&-1)>>3]);p=c[(c[3524]|0)+64>>2]|0;if((n|0)<-5){cM[p&511](-2)}else{cM[p&511](n)}p=c[3524]|0;do{if((a[65312+(b*688&-1)|0]&1)==0){if((c[p+96>>2]&1024|0)!=0){q=p;break}c[f>>2]=1;c[f+4>>2]=n;l=511}else{l=511}}while(0);if((l|0)==511){fn(f,p);q=c[3524]|0}n=c[q+56>>2]|0;if((b&3|0)==2){o=64784+(d*688&-1)|0;cN[n&255](c[64768+(b*688&-1)>>2]|0,c[o>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[64772+(b*688&-1)>>2]|0,c[o>>2]|0);i=e;return}else{o=64784+(d*688&-1)|0;cN[n&255](c[o>>2]|0,c[64768+(b*688&-1)>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[o>>2]|0,c[64772+(b*688&-1)>>2]|0);i=e;return}}}while(0);if(k<g){r=64772+(d*688&-1)|0}else{r=64768+(d*688&-1)|0}c[64784+(d*688&-1)>>2]=c[r>>2];i=e;return}function dh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0;g=i;i=i+208|0;j=g|0;k=g+24|0;l=g+48|0;m=g+72|0;n=g+96|0;o=g+144|0;p=g+152|0;q=g+200|0;r=(f|0)==1;s=(f|0)==2;if((f-1|0)>>>0>=2){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=133592,v)|0)}t=c[13898]|0;u=(c[8272]|0)>(t|0);L710:do{if(u){w=c[1054]|0;if((a[w+(t*40&-1)|0]&1)==0){x=533;break}y=c[w+(t*40&-1)+36>>2]|0;z=w+(t*40&-1)+32|0;w=c[10036]|0;A=0;while(1){if((A|0)>=(y|0)){break}if((a[w+((c[z>>2]|0)+A|0)|0]|0)==(a[A+134808|0]|0)){A=A+1|0}else{x=533;break L710}}if((A|0)!=1){x=533;break}c[e>>2]=c[e>>2]|f;if(r){z=64728+(b*688&-1)|0;c[z>>2]=c[z>>2]&-2;h[64736+(b*688&-1)>>3]=0.0}else{z=64732+(b*688&-1)|0;c[z>>2]=c[z>>2]&-2;h[64752+(b*688&-1)>>3]=0.0}z=(c[13898]|0)+1|0;c[13898]=z;B=z}else{x=533}}while(0);L722:do{if((x|0)==533){a[25288]=1;L724:do{if((c[64808+(b*688&-1)>>2]|0)==1){z=c[1054]|0;w=(a[z+(t*40&-1)|0]&1)==0;if(w){x=536}else{y=c[10036]|0;C=a[y+(c[z+(t*40&-1)+32>>2]|0)|0]|0;if((C<<24>>24|0)==39|(C<<24>>24|0)==34){D=y}else{x=536}}if((x|0)==536){y=c[10810]|0;if((y|0)==0){x=558;break}C=z+(t*40&-1)+36|0;E=z+(t*40&-1)+32|0;F=c[10036]|0;G=y;L731:while(1){y=c[G+4>>2]|0;L733:do{if(!(w|u^1)){H=c[C>>2]|0;I=0;while(1){if((I|0)>=(H|0)){break}if((a[F+((c[E>>2]|0)+I|0)|0]|0)==(a[y+I|0]|0)){I=I+1|0}else{break L733}}if((a[y+I|0]|0)==0){break L731}}}while(0);y=c[G>>2]|0;if((y|0)==0){x=558;break L724}else{G=y}}if((a[G+8|0]&1)!=0){x=558;break}if((c[G+16>>2]|0)==3){D=F}else{x=558;break}}L743:do{if(u){L745:do{if(!w){E=c[z+(t*40&-1)+36>>2]|0;C=z+(t*40&-1)+32|0;y=0;while(1){if((y|0)>=(E|0)){break}if((a[D+((c[C>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L745}}if((y|0)==1){J=0;break L743}}}while(0);a[14176]=1;is(m);a[14176]=0;if((c[m>>2]|0)==3){J=c[m+8>>2]|0;break}else{c[13898]=t;J=0;break}}else{J=0}}while(0);if((t1(J,64813+(b*688&-1)|0,n,o)|0)==0){K=0.0}else{L=+t2(n);K=L+ +h[o>>3]}uu(J);M=K}else{x=558}}while(0);do{if((x|0)==558){A=is(l)|0;z=c[A>>2]|0;if((z|0)==1){N=+(c[A+8>>2]|0)}else if((z|0)==2){N=+h[A+8>>3]}else if((z|0)==3){N=+uz(c[A+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=l|0;if((c[A>>2]|0)!=3){M=N;break}uu(c[l+8>>2]|0);c[A>>2]=1;M=N}}while(0);a[25288]=0;A=c[13898]|0;z=c[8272]|0;if((A|0)>=(z|0)){uf(A,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=c[1054]|0;F=(a[w+(A*40&-1)|0]&1)==0;L772:do{if(!F){G=c[w+(A*40&-1)+36>>2]|0;C=w+(A*40&-1)+32|0;E=c[10036]|0;I=0;while(1){if((I|0)>=(G|0)){x=570;break}if((a[E+((c[C>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{break}}do{if((x|0)==570){if((I|0)!=1){break}uf(A,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(F){break}I=c[w+(A*40&-1)+36>>2]|0;C=w+(A*40&-1)+32|0;E=c[10036]|0;G=0;while(1){if((G|0)>=(I|0)){x=576;break}if((a[E+((c[C>>2]|0)+G|0)|0]|0)==(a[G+136608|0]|0)){G=G+1|0}else{break}}do{if((x|0)==576){if((G|0)!=1){break}C=A+1|0;c[13898]=C;if((C|0)>=(z|0)){uf(C,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}I=(a[w+(C*40&-1)|0]&1)==0;if(I){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}H=c[w+(C*40&-1)+36>>2]|0;O=w+(C*40&-1)+32|0;P=0;while(1){if((P|0)>=(H|0)){x=582;break}if((a[E+((c[O>>2]|0)+P|0)|0]|0)==(a[P+103664|0]|0)){P=P+1|0}else{break}}do{if((x|0)==582){if((P|0)!=1){break}uf(C,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(I){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}P=c[w+(C*40&-1)+36>>2]|0;O=w+(C*40&-1)+32|0;H=0;while(1){if((H|0)>=(P|0)){break}if((a[E+((c[O>>2]|0)+H|0)|0]|0)==(a[H+134808|0]|0)){H=H+1|0}else{x=695;break}}if((x|0)==695){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((H|0)!=1){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[e>>2]=c[e>>2]|f;if(r){O=64728+(b*688&-1)|0;c[O>>2]=c[O>>2]|1;h[64736+(b*688&-1)>>3]=M}else{O=64732+(b*688&-1)|0;c[O>>2]=c[O>>2]|1;h[64752+(b*688&-1)>>3]=M}O=(c[13898]|0)+1|0;c[13898]=O;B=O;break L722}}while(0);if(F){break}E=c[w+(A*40&-1)+36>>2]|0;G=w+(A*40&-1)+32|0;O=c[10036]|0;P=0;while(1){if((P|0)>=(E|0)){break}if((a[O+((c[G>>2]|0)+P|0)|0]|0)==(a[P+138304|0]|0)){P=P+1|0}else{break L772}}if((P|0)!=1){break}uf(A,123680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[e>>2]=c[e>>2]&(f^-1);if(r){c[64728+(b*688&-1)>>2]=0;h[64744+(b*688&-1)>>3]=0.0}else{c[64732+(b*688&-1)>>2]=0;h[64760+(b*688&-1)>>3]=0.0}h[d>>3]=M;B=c[13898]|0}}while(0);d=c[8272]|0;l=(B|0)>=(d|0);L830:do{if((c[e>>2]&f|0)==0){if(l){break}J=c[1054]|0;L923:do{if((a[J+(B*40&-1)|0]&1)!=0){o=c[J+(B*40&-1)+36>>2]|0;n=J+(B*40&-1)+32|0;t=c[10036]|0;m=0;while(1){if((m|0)>=(o|0)){break}if((a[t+((c[n>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{break L923}}if((m|0)==1){break L830}}}while(0);J=c[1054]|0;L930:do{if((a[J+(B*40&-1)|0]&1)!=0){n=c[J+(B*40&-1)+36>>2]|0;t=J+(B*40&-1)+32|0;o=c[10036]|0;P=0;while(1){if((P|0)>=(n|0)){break}if((a[o+((c[t>>2]|0)+P|0)|0]|0)==(a[P+136608|0]|0)){P=P+1|0}else{break L930}}if((P|0)!=1){break}uf(B,122232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);J=c[1054]|0;if((a[J+(B*40&-1)|0]&1)==0){break}t=c[J+(B*40&-1)+36>>2]|0;o=J+(B*40&-1)+32|0;J=c[10036]|0;n=0;while(1){if((n|0)>=(t|0)){break}if((a[J+((c[o>>2]|0)+n|0)|0]|0)==(a[n+138304|0]|0)){n=n+1|0}else{break L830}}if((n|0)!=1){break}uf(B,122232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if(l){uf(B,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[1054]|0;L835:do{if((a[o+(B*40&-1)|0]&1)!=0){J=c[o+(B*40&-1)+36>>2]|0;t=o+(B*40&-1)+32|0;m=c[10036]|0;D=0;while(1){if((D|0)>=(J|0)){break}if((a[m+((c[t>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L835}}if((D|0)!=1){break}uf(B,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);o=c[1054]|0;L843:do{if((a[o+(B*40&-1)|0]&1)!=0){n=c[o+(B*40&-1)+36>>2]|0;t=o+(B*40&-1)+32|0;m=c[10036]|0;J=0;while(1){if((J|0)>=(n|0)){break}if((a[m+((c[t>>2]|0)+J|0)|0]|0)==(a[J+136608|0]|0)){J=J+1|0}else{break L843}}if((J|0)!=1){break}t=B+1|0;c[13898]=t;if((t|0)>=(d|0)){uf(t,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=(a[o+(t*40&-1)|0]&1)==0;L853:do{if(!n){D=c[o+(t*40&-1)+36>>2]|0;P=o+(t*40&-1)+32|0;u=0;while(1){if((u|0)>=(D|0)){break}if((a[m+((c[P>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break L853}}if((u|0)!=1){break}uf(t,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);L861:do{if((c[64808+(b*688&-1)>>2]|0)==1){do{if(n){x=627}else{J=a[m+(c[o+(t*40&-1)+32>>2]|0)|0]|0;if(!((J<<24>>24|0)==39|(J<<24>>24|0)==34)){x=627;break}Q=j;x=639}}while(0);if((x|0)==627){u=c[10810]|0;if((u|0)==0){x=649;break}J=o+(t*40&-1)+36|0;P=o+(t*40&-1)+32|0;D=u;L869:while(1){u=c[D+4>>2]|0;L871:do{if(!n){C=c[J>>2]|0;H=0;while(1){if((H|0)>=(C|0)){break}if((a[m+((c[P>>2]|0)+H|0)|0]|0)==(a[u+H|0]|0)){H=H+1|0}else{break L871}}if((a[u+H|0]|0)==0){break L869}}}while(0);u=c[D>>2]|0;if((u|0)==0){x=649;break L861}else{D=u}}if((a[D+8|0]&1)!=0){x=649;break}if((c[D+16>>2]|0)!=3){x=649;break}P=j;if(n){R=P;x=643}else{Q=P;x=639}}L881:do{if((x|0)==639){P=c[o+(t*40&-1)+36>>2]|0;J=o+(t*40&-1)+32|0;u=0;while(1){if((u|0)>=(P|0)){break}if((a[m+((c[J>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{R=Q;x=643;break L881}}if((u|0)==1){S=0;T=Q}else{R=Q;x=643}}}while(0);do{if((x|0)==643){a[14176]=1;is(j);a[14176]=0;if((c[j>>2]|0)==3){S=c[j+8>>2]|0;T=R;break}else{c[13898]=t;S=0;T=R;break}}}while(0);if((t1(S,64813+(b*688&-1)|0,p,q)|0)==0){U=0.0}else{M=+t2(p);U=M+ +h[q>>3]}uu(S);V=U}else{x=649}}while(0);do{if((x|0)==649){t=is(k)|0;m=c[t>>2]|0;if((m|0)==1){W=+(c[t+8>>2]|0)}else if((m|0)==2){W=+h[t+8>>3]}else if((m|0)==3){W=+uz(c[t+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=k|0;if((c[t>>2]|0)!=3){V=W;break}uu(c[k+8>>2]|0);c[t>>2]=1;V=W}}while(0);if(r){t=64728+(b*688&-1)|0;c[t>>2]=c[t>>2]|2;h[64744+(b*688&-1)>>3]=V;break L830}else{t=64732+(b*688&-1)|0;c[t>>2]=c[t>>2]|2;h[64760+(b*688&-1)>>3]=V;break L830}}}while(0);o=c[1054]|0;L910:do{if((a[o+(B*40&-1)|0]&1)!=0){t=c[o+(B*40&-1)+36>>2]|0;m=o+(B*40&-1)+32|0;n=c[10036]|0;D=0;while(1){if((D|0)>=(t|0)){break}if((a[n+((c[m>>2]|0)+D|0)|0]|0)==(a[D+138304|0]|0)){D=D+1|0}else{break L910}}if((D|0)!=1){break}uf(B,123680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(r){o=64728+(b*688&-1)|0;c[o>>2]=c[o>>2]&-3;h[64744+(b*688&-1)>>3]=0.0;break}else{o=64732+(b*688&-1)|0;c[o>>2]=c[o>>2]&-3;h[64760+(b*688&-1)>>3]=0.0;break}}}while(0);if((c[e>>2]&f|0)==0){i=g;return}do{if(r){f=64728+(b*688&-1)|0;if((c[f>>2]|0)!=3){break}if(+h[64744+(b*688&-1)>>3]>=+h[64736+(b*688&-1)>>3]){break}uh(c[13898]|0,120752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[f>>2]=0}}while(0);if(!s){i=g;return}s=64732+(b*688&-1)|0;if((c[s>>2]|0)!=3){i=g;return}if(+h[64760+(b*688&-1)>>3]>=+h[64752+(b*688&-1)>>3]){i=g;return}uh(c[13898]|0,120752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[s>>2]=0;i=g;return}function di(a,b,d,e,f){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;f=i;a=e;e=i;i=i+56|0;uD(e,a,56);do{if((d|0)!=0){a=ga(d,0)|0;if((a|0)<=(c[216]|0)){break}c[216]=a}}while(0);i=f;return}function dj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0.0;g=i;i=i+8|0;j=g|0;c[j>>2]=f;k=c[13898]|0;l=c[8272]|0;m=(l|0)>(k|0);if(!m){uf(k,116248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}n=c[1054]|0;do{if((a[n+(k*40&-1)|0]&1)!=0){o=c[n+(k*40&-1)+36>>2]|0;p=n+(k*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(o|0)){s=723;break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+78864|0]|0)){r=r+1|0}else{break}}do{if((s|0)==723){if((r|0)!=1){break}c[64728+(b*688&-1)>>2]=0;c[64732+(b*688&-1)>>2]=0;t=f;i=g;return t|0}}while(0);if(m){break}uf(k,116248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);m=c[1054]|0;f=(a[m+(k*40&-1)|0]&1)==0;L984:do{if(f){s=742}else{n=c[m+(k*40&-1)+36>>2]|0;r=m+(k*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){s=730;break}if((a[p+((c[r>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}do{if((s|0)==730){if((q|0)!=1){break}uf(k,116248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);if(f){s=742;break}q=c[m+(k*40&-1)+36>>2]|0;r=m+(k*40&-1)+32|0;p=c[10036]|0;n=0;while(1){if((n|0)>=(q|0)){s=736;break}if((a[p+((c[r>>2]|0)+n|0)|0]|0)==(a[n+187176|0]|0)){n=n+1|0}else{break}}if((s|0)==736){if((n|0)==2){u=k;w=l;break}}if(f){s=742;break}r=c[m+(k*40&-1)+36>>2]|0;p=m+(k*40&-1)+32|0;q=c[10036]|0;o=0;while(1){if((o|0)>=(r|0)){break}if((a[q+((c[p>>2]|0)+o|0)|0]|0)==(a[o+183584|0]|0)){o=o+1|0}else{s=742;break L984}}if((o|0)==1){u=k;w=l}else{s=742}}}while(0);if((s|0)==742){dh(b,d,j,1);u=c[13898]|0;w=c[8272]|0}l=(w|0)>(u|0);if(!l){uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}k=c[1054]|0;do{if((a[k+(u*40&-1)|0]&1)==0){s=750}else{m=c[k+(u*40&-1)+36>>2]|0;f=k+(u*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(m|0)){s=748;break}if((a[p+((c[f>>2]|0)+q|0)|0]|0)==(a[q+187176|0]|0)){q=q+1|0}else{break}}if((s|0)==748){if((q|0)==2){x=k;y=p;break}}if(l){s=750;break}uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);do{if((s|0)==750){l=c[1054]|0;if((a[l+(u*40&-1)|0]&1)==0){uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}k=c[l+(u*40&-1)+36>>2]|0;f=l+(u*40&-1)+32|0;m=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){break}if((a[m+((c[f>>2]|0)+o|0)|0]|0)==(a[o+183584|0]|0)){o=o+1|0}else{s=774;break}}if((s|0)==774){uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((o|0)==1){x=l;y=m;break}uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);f=u+1|0;c[13898]=f;L1033:do{if((w|0)>(f|0)){if((a[x+(f*40&-1)|0]&1)==0){s=762;break}u=c[x+(f*40&-1)+36>>2]|0;k=x+(f*40&-1)+32|0;p=0;while(1){if((p|0)>=(u|0)){break}if((a[y+((c[k>>2]|0)+p|0)|0]|0)==(a[p+78864|0]|0)){p=p+1|0}else{s=762;break L1033}}if((p|0)!=1){s=762}}else{s=762}}while(0);if((s|0)==762){dh(b,e,j,2)}s=c[j>>2]|0;if((s&3|0)!=0){t=s;i=g;return t|0}z=+h[e>>3];A=+h[d>>3];if(z>=A){t=s;i=g;return t|0}h[d>>3]=z;h[e>>3]=A;e=64656+(b*688&-1)|0;c[e>>2]=c[e>>2]|2;t=s;i=g;return t|0}function dk(){var b=0,d=0,e=0.0,f=0.0,g=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;b=i;d=c[16679]|0;e=+h[8341];if((d&1|0)==0|e<8.988465674311579e+307){f=e}else{e=+h[64664+((c[34]|0)*688&-1)>>3];if((a[64788]&1)==0){g=e}else{g=+Z(+(e*+h[8100]))}h[8341]=g;f=g}j=(a[66852]&1)==0;do{if(j){k=f}else{if(f>0.0){g=+_(+f);k=g/+h[8358];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=112752,c[v+8>>2]=56904,h[v+16>>3]=f,v)|0);return 0}}}while(0);h[8341]=k;f=+h[8342];if((d&2|0)==0|f>-8.988465674311579e+307){l=f}else{f=+h[64672+((c[34]|0)*688&-1)>>3];if((a[64788]&1)==0){m=f}else{m=+Z(+(f*+h[8100]))}h[8342]=m;l=m}do{if(j){n=l}else{if(l>0.0){m=+_(+l);n=m/+h[8358];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=112752,c[v+8>>2]=56904,h[v+16>>3]=l,v)|0);return 0}}}while(0);h[8342]=n;if(k<=n){i=b;return 1}h[8342]=k;h[8341]=n;i=b;return 1}function dl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0;e=i;i=i+328|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=e+96|0;m=e+120|0;n=e+144|0;o=e+152|0;p=e+160|0;q=e+208|0;r=e+216|0;s=e+264|0;t=e+272|0;u=e+320|0;c[o>>2]=d;uE(b|0,0,40);dm(o,n);d=c[o>>2]|0;c[b>>2]=d;w=c[n>>2]|0;L1080:do{if((w|0)>-1){if((c[64808+((w+2|0)*688&-1)>>2]|0)!=1){x=826;break}y=c[13898]|0;z=c[1054]|0;A=(a[z+(y*40&-1)|0]&1)==0;if(A){x=804}else{B=c[10036]|0;C=a[B+(c[z+(y*40&-1)+32>>2]|0)|0]|0;if((C<<24>>24|0)==39|(C<<24>>24|0)==34){D=B}else{x=804}}if((x|0)==804){B=c[10810]|0;if((B|0)==0){x=826;break}C=c[8272]|0;E=z+(y*40&-1)+36|0;F=z+(y*40&-1)+32|0;G=c[10036]|0;H=B;L1088:while(1){B=c[H+4>>2]|0;L1090:do{if(!((C|0)<=(y|0)|A)){I=c[E>>2]|0;J=0;while(1){if((J|0)>=(I|0)){break}if((a[G+((c[F>>2]|0)+J|0)|0]|0)==(a[B+J|0]|0)){J=J+1|0}else{break L1090}}if((a[B+J|0]|0)==0){break L1088}}}while(0);B=c[H>>2]|0;if((B|0)==0){x=826;break L1080}else{H=B}}if((a[H+8|0]&1)!=0){x=826;break}if((c[H+16>>2]|0)==3){D=G}else{x=826;break}}L1100:do{if((y|0)<(c[8272]|0)){L1102:do{if(!A){F=c[z+(y*40&-1)+36>>2]|0;E=z+(y*40&-1)+32|0;C=0;while(1){if((C|0)>=(F|0)){break}if((a[D+((c[E>>2]|0)+C|0)|0]|0)==(a[C+103664|0]|0)){C=C+1|0}else{break L1102}}if((C|0)==1){K=0;break L1100}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[l>>2]|0)==3){K=c[l+8>>2]|0;break}else{c[13898]=y;K=0;break}}else{K=0}}while(0);if((t1(K,66189,p,q)|0)!=0){L=+t2(p);h[b+16>>3]=L+ +h[q>>3]}uu(K)}else{x=826}}while(0);if((x|0)==826){K=is(k)|0;q=c[K>>2]|0;if((q|0)==1){M=+(c[K+8>>2]|0)}else if((q|0)==2){M=+h[K+8>>3]}else if((q|0)==3){M=+uz(c[K+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}K=k|0;if((c[K>>2]|0)==3){uu(c[k+8>>2]|0);c[K>>2]=1}h[b+16>>3]=M}K=c[13898]|0;L1128:do{if((c[8272]|0)>(K|0)){k=c[1054]|0;if((a[k+(K*40&-1)|0]&1)==0){x=874;break}q=c[k+(K*40&-1)+36>>2]|0;p=k+(K*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(q|0)){break}if((a[k+((c[p>>2]|0)+l|0)|0]|0)==(a[l+148464|0]|0)){l=l+1|0}else{x=874;break L1128}}if((l|0)!=1){x=874;break}c[13898]=K+1;dm(o,n);p=c[o>>2]|0;c[b+4>>2]=p;k=c[n>>2]|0;L1136:do{if((k|0)>-1){if((c[64808+((k+1|0)*688&-1)>>2]|0)!=1){break}q=c[13898]|0;D=c[1054]|0;w=(a[D+(q*40&-1)|0]&1)==0;if(w){x=844}else{y=c[10036]|0;z=a[y+(c[D+(q*40&-1)+32>>2]|0)|0]|0;if((z<<24>>24|0)==39|(z<<24>>24|0)==34){N=y}else{x=844}}if((x|0)==844){y=c[10810]|0;if((y|0)==0){break}z=c[8272]|0;A=D+(q*40&-1)+36|0;G=D+(q*40&-1)+32|0;H=c[10036]|0;E=y;L1144:while(1){y=c[E+4>>2]|0;L1146:do{if(!((z|0)<=(q|0)|w)){F=c[A>>2]|0;J=0;while(1){if((J|0)>=(F|0)){break}if((a[H+((c[G>>2]|0)+J|0)|0]|0)==(a[y+J|0]|0)){J=J+1|0}else{break L1146}}if((a[y+J|0]|0)==0){break L1144}}}while(0);y=c[E>>2]|0;if((y|0)==0){break L1136}else{E=y}}if((a[E+8|0]&1)!=0){break}if((c[E+16>>2]|0)==3){N=H}else{break}}L1156:do{if((q|0)<(c[8272]|0)){L1158:do{if(!w){G=c[D+(q*40&-1)+36>>2]|0;A=D+(q*40&-1)+32|0;z=0;while(1){if((z|0)>=(G|0)){break}if((a[N+((c[A>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L1158}}if((z|0)==1){O=0;break L1156}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[j>>2]|0)==3){O=c[j+8>>2]|0;break}else{c[13898]=q;O=0;break}}else{O=0}}while(0);if((t1(O,65501,r,s)|0)!=0){M=+t2(r);h[b+24>>3]=M+ +h[s>>3]}uu(O);P=p;break L1128}}while(0);k=is(g)|0;l=c[k>>2]|0;if((l|0)==1){Q=+(c[k+8>>2]|0)}else if((l|0)==2){Q=+h[k+8>>3]}else if((l|0)==3){Q=+uz(c[k+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=g|0;if((c[k>>2]|0)==3){uu(c[g+8>>2]|0);c[k>>2]=1}h[b+24>>3]=Q;P=p}else{x=874}}while(0);if((x|0)==874){h[b+24>>3]=0.0;c[b+4>>2]=d;P=d}d=c[13898]|0;g=c[8272]|0;L1185:do{if((g|0)>(d|0)){O=c[1054]|0;if((a[O+(d*40&-1)|0]&1)==0){break}s=c[O+(d*40&-1)+36>>2]|0;r=O+(d*40&-1)+32|0;j=c[10036]|0;N=0;while(1){if((N|0)>=(s|0)){break}if((a[j+((c[r>>2]|0)+N|0)|0]|0)==(a[N+148464|0]|0)){N=N+1|0}else{break L1185}}if((N|0)!=1){break}r=d+1|0;s=(a[O+(r*40&-1)|0]&1)==0;if(!s){p=a[j+(c[O+(r*40&-1)+32>>2]|0)|0]|0;if((p<<24>>24|0)==39|(p<<24>>24|0)==34){break}}p=c[10810]|0;L1196:do{if((p|0)==0){R=O+(r*40&-1)+36|0;S=O+(r*40&-1)+32|0}else{K=O+(r*40&-1)+36|0;k=O+(r*40&-1)+32|0;l=p;L1199:while(1){q=c[l+4>>2]|0;L1201:do{if(!((g|0)<=(r|0)|s)){D=c[K>>2]|0;w=0;while(1){if((w|0)>=(D|0)){break}if((a[j+((c[k>>2]|0)+w|0)|0]|0)==(a[q+w|0]|0)){w=w+1|0}else{break L1201}}if((a[q+w|0]|0)==0){break L1199}}}while(0);q=c[l>>2]|0;if((q|0)==0){R=K;S=k;break L1196}else{l=q}}if((a[l+8|0]&1)!=0){R=K;S=k;break}if((c[l+16>>2]|0)==3){break L1185}else{R=K;S=k}}}while(0);p=c[R>>2]|0;O=c[S>>2]|0;L1211:do{if((p|0)>0&(s^1)){N=0;q=0;D=O;while(1){if((a[N+205224|0]|0)==(a[j+(N+D|0)|0]|0)){T=D;U=q}else{if((N|0)!=7){break}T=D-1|0;U=1}z=N+1|0;if((z|0)<(U+p|0)){N=z;q=U;D=T}else{x=899;break}}if((x|0)==899){if((U|0)!=0){break L1185}if((N|0)==6|(N|0)==12){break L1185}}if((p|0)>0&(s^1)){V=0}else{break}do{if((a[V+217064|0]|0)!=(a[j+(V+O|0)|0]|0)){break L1211}V=V+1|0;}while((V|0)<(p|0));if((V|0)==3){break L1185}}}while(0);c[13898]=r;dm(o,n);c[b+8>>2]=c[o>>2];p=c[n>>2]|0;L1227:do{if((p|0)>-1){if((c[64808+(p*688&-1)>>2]|0)!=1){break}O=c[13898]|0;j=c[1054]|0;s=(a[j+(O*40&-1)|0]&1)==0;if(s){x=909}else{N=c[10036]|0;D=a[N+(c[j+(O*40&-1)+32>>2]|0)|0]|0;if((D<<24>>24|0)==39|(D<<24>>24|0)==34){W=N}else{x=909}}if((x|0)==909){N=c[10810]|0;if((N|0)==0){break}D=c[8272]|0;q=j+(O*40&-1)+36|0;k=j+(O*40&-1)+32|0;K=c[10036]|0;l=N;L1235:while(1){N=c[l+4>>2]|0;L1237:do{if(!((D|0)<=(O|0)|s)){z=c[q>>2]|0;H=0;while(1){if((H|0)>=(z|0)){break}if((a[K+((c[k>>2]|0)+H|0)|0]|0)==(a[N+H|0]|0)){H=H+1|0}else{break L1237}}if((a[N+H|0]|0)==0){break L1235}}}while(0);N=c[l>>2]|0;if((N|0)==0){break L1227}else{l=N}}if((a[l+8|0]&1)!=0){break}if((c[l+16>>2]|0)==3){W=K}else{break}}L1247:do{if((O|0)<(c[8272]|0)){L1249:do{if(!s){k=c[j+(O*40&-1)+36>>2]|0;q=j+(O*40&-1)+32|0;D=0;while(1){if((D|0)>=(k|0)){break}if((a[W+((c[q>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L1249}}if((D|0)==1){X=0;break L1247}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[f>>2]|0)==3){X=c[f+8>>2]|0;break}else{c[13898]=O;X=0;break}}else{X=0}}while(0);if((t1(X,64813,t,u)|0)!=0){Q=+t2(t);h[b+32>>3]=Q+ +h[u>>3]}uu(X);i=e;return}}while(0);p=is(m)|0;r=c[p>>2]|0;if((r|0)==1){Y=+(c[p+8>>2]|0)}else if((r|0)==2){Y=+h[p+8>>3]}else if((r|0)==3){Y=+uz(c[p+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=m|0;if((c[p>>2]|0)==3){uu(c[m+8>>2]|0);c[p>>2]=1}h[b+32>>3]=Y;i=e;return}}while(0);h[b+32>>3]=0.0;c[b+8>>2]=P;i=e;return}function dm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=c[13898]|0;f=c[1054]|0;g=c[f+(e*40&-1)+36>>2]|0;h=c[f+(e*40&-1)+32>>2]|0;i=(a[f+(e*40&-1)|0]&1)==0;L1278:do{if((g|0)>0&(i^1)){f=c[10036]|0;j=0;k=0;l=h;while(1){if((a[j+101440|0]|0)==(a[f+(j+l|0)|0]|0)){m=l;n=k}else{if((j|0)!=3){break}m=l-1|0;n=1}o=j+1|0;if((o|0)<(n+g|0)){j=o;k=n;l=m}else{p=950;break}}do{if((p|0)==950){if((n|0)==0){if(!((j|0)==5|(j|0)==2)){break}}c[13898]=e+1;c[b>>2]=0;p=990;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}j=c[10036]|0;l=0;k=0;f=h;while(1){if((a[l+100944|0]|0)==(a[j+(l+f|0)|0]|0)){q=f;r=k}else{if((l|0)!=3){break}q=f-1|0;r=1}o=l+1|0;if((o|0)<(r+g|0)){l=o;k=r;f=q}else{p=959;break}}do{if((p|0)==959){if((r|0)==0){if(!((l|0)==6|(l|0)==2)){break}}c[13898]=e+1;c[b>>2]=1;p=991;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}l=c[10036]|0;f=0;k=0;j=h;while(1){if((a[f+148408|0]|0)==(a[l+(f+j|0)|0]|0)){s=j;t=k}else{if((f|0)!=2){break}s=j-1|0;t=1}o=f+1|0;if((o|0)<(t+g|0)){f=o;k=t;j=s}else{p=968;break}}do{if((p|0)==968){if((t|0)==0){if(!((f|0)==5|(f|0)==1)){break}}c[13898]=e+1;c[b>>2]=2;p=992;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}f=c[10036]|0;j=0;k=0;l=h;while(1){if((a[j+142056|0]|0)==(a[f+(j+l|0)|0]|0)){u=l;v=k}else{if((j|0)!=2){break}u=l-1|0;v=1}o=j+1|0;if((o|0)<(v+g|0)){j=o;k=v;l=u}else{p=977;break}}do{if((p|0)==977){if((v|0)==0){if(!((j|0)==6|(j|0)==1)){break}}c[13898]=e+1;c[b>>2]=3;p=992;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}j=c[10036]|0;l=0;k=0;f=h;while(1){if((a[l+99320|0]|0)==(a[j+(l+f|0)|0]|0)){w=f;x=k}else{if((l|0)!=4){p=989;break L1278}w=f-1|0;x=1}o=l+1|0;if((o|0)<(x+g|0)){l=o;k=x;f=w}else{break}}if((x|0)==0){if(!((l|0)==3|(l|0)==9)){p=989;break}}c[13898]=e+1;c[b>>2]=4;p=992}else{p=989}}while(0);if((p|0)==989){e=c[b>>2]|0;if((e|0)==0){p=990}else if((e|0)==1){p=991}else{p=992}}if((p|0)==992){c[d>>2]=-1;return}else if((p|0)==990){c[d>>2]=0;return}else if((p|0)==991){c[d>>2]=4;return}}function dn(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=c[8272]|0;d=c[13898]|0;L1352:while(1){e=d+1|0;c[13898]=e;L1354:do{if((b|0)>(d|0)){f=c[1054]|0;if((a[f+(d*40&-1)|0]&1)==0){g=1004;break}h=c[f+(d*40&-1)+36>>2]|0;i=f+(d*40&-1)+32|0;f=c[10036]|0;j=0;while(1){if((j|0)>=(h|0)){break}if((a[f+((c[i>>2]|0)+j|0)|0]|0)==(a[j+78864|0]|0)){j=j+1|0}else{g=1004;break L1354}}if(!((j|0)!=1&(e|0)<(b|0))){g=1011;break L1352}}else{g=1004}}while(0);if((g|0)==1004){g=0;if((e|0)>=(b|0)){g=1012;break}}i=c[1054]|0;if((a[i+(e*40&-1)|0]&1)==0){d=e;continue}f=c[i+(e*40&-1)+36>>2]|0;h=i+(e*40&-1)+32|0;i=c[10036]|0;k=0;while(1){if((k|0)>=(f|0)){break}if((a[i+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{d=e;continue L1352}}if((k|0)==1){g=1013;break}else{d=e}}if((g|0)==1013){return}else if((g|0)==1011){return}else if((g|0)==1012){return}}function dp(b,d,e,f){b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0;g=i;i=i+24|0;j=g|0;k=(d|0)!=0;if((f|0)<0&(k^1)){i=g;return}if((a[64976+(b*688&-1)|0]&1)==0){c[64920+(b*688&-1)>>2]=3}l=64944+(b*688&-1)|0;b=c[l>>2]|0;m=j+16|0;c[m>>2]=b;h[j>>3]=-1.7976931348623157e+308;n=j;j=b;while(1){o=n+16|0;if((j|0)==0){p=1022;break}q=+h[j>>3];if(q>=e){p=1021;break}n=j;j=c[j+16>>2]|0}do{if((p|0)==1021){if(q>e){p=1022;break}if(q!=e){uh(-1,105096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);r=c[o>>2]|0}else{r=j}if((c[r+12>>2]|0)<(f|0)){i=g;return}n=r+8|0;b=c[n>>2]|0;if((b|0)==0){s=r;break}uu(b);c[n>>2]=0;s=r}}while(0);if((p|0)==1022){p=ut(24)|0;if((p|0)==0){gk();t=ut(24)|0}else{t=p}p=t;h[t>>3]=e;c[t+12>>2]=f;c[t+16>>2]=c[o>>2];c[o>>2]=p;s=p}if(k){c[s+8>>2]=bP(d|0)|0}else{c[s+8>>2]=0}c[l>>2]=c[m>>2];i=g;return}function dq(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[13898]|0;if((c[8272]|0)<=(e|0)){i=d;return}f=c[1054]|0;if((a[f+(e*40&-1)|0]&1)==0){i=d;return}g=c[f+(e*40&-1)+36>>2]|0;h=f+(e*40&-1)+32|0;f=c[10036]|0;j=0;while(1){if((j|0)>=(g|0)){break}if((a[f+((c[h>>2]|0)+j|0)|0]|0)==(a[j+78280|0]|0)){j=j+1|0}else{k=1056;break}}if((k|0)==1056){i=d;return}if((j|0)!=1){i=d;return}c[13898]=e+1;e=64648+(b*688&-1)|0;c[e>>2]=dj(b,64664+(b*688&-1)|0,64672+(b*688&-1)|0,c[e>>2]|0)|0;e=c[13898]|0;L1421:do{if((c[8272]|0)>(e|0)){b=c[1054]|0;if((a[b+(e*40&-1)|0]&1)==0){break}j=c[b+(e*40&-1)+36>>2]|0;k=b+(e*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(j|0)){break}if((a[b+((c[k>>2]|0)+h|0)|0]|0)==(a[h+78864|0]|0)){h=h+1|0}else{break L1421}}if((h|0)!=1){break}c[13898]=e+1;i=d;return}}while(0);uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dr(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=c[13898]|0;if((c[8272]|0)<=(g|0)){h=e;i=f;return h|0}j=c[1054]|0;if((a[j+(g*40&-1)|0]&1)==0){h=e;i=f;return h|0}k=c[j+(g*40&-1)+36>>2]|0;l=j+(g*40&-1)+32|0;m=c[10036]|0;n=0;while(1){if((n|0)>=(k|0)){break}if((a[m+((c[l>>2]|0)+n|0)|0]|0)==(a[n+78280|0]|0)){n=n+1|0}else{h=e;o=1085;break}}if((o|0)==1085){i=f;return h|0}if((n|0)!=1){h=e;i=f;return h|0}n=g+1|0;c[13898]=n;L1447:do{if((a[j+(n*40&-1)|0]&1)==0){p=e}else{if((bO(d[m+(c[j+(n*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(n*40&-1)+32>>2]|0)|0]|0)!=95){p=e;break}}g=c[13898]|0;l=g+1|0;if((c[8272]|0)<=(l|0)){p=e;break}k=c[1054]|0;if((a[k+(l*40&-1)|0]&1)==0){p=e;break}q=c[k+(l*40&-1)+36>>2]|0;r=k+(l*40&-1)+32|0;l=c[10036]|0;k=0;while(1){if((k|0)>=(q|0)){break}if((a[l+((c[r>>2]|0)+k|0)|0]|0)==(a[k+115e3|0]|0)){k=k+1|0}else{p=e;break L1447}}if((k|0)!=1){p=e;break}c[13898]=g+2;p=g}}while(0);e=64648+(b*688&-1)|0;c[e>>2]=dj(b,64664+(b*688&-1)|0,64672+(b*688&-1)|0,c[e>>2]|0)|0;e=c[13898]|0;if((c[8272]|0)<=(e|0)){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}b=c[1054]|0;if((a[b+(e*40&-1)|0]&1)==0){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}n=c[b+(e*40&-1)+36>>2]|0;j=b+(e*40&-1)+32|0;b=c[10036]|0;m=0;while(1){if((m|0)>=(n|0)){break}if((a[b+((c[j>>2]|0)+m|0)|0]|0)==(a[m+78864|0]|0)){m=m+1|0}else{o=1089;break}}if((o|0)==1089){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((m|0)!=1){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}c[13898]=e+1;h=p;i=f;return h|0}function ds(){var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0;d=i;e=hA(c[11932]|0,78360)|0;if((e|0)==0){uj(-1,146640,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}else{f=0;g=0}L1479:while(1){if((g|0)!=0){if((a_(f+(g-2|0)|0,86144,2)|0)==0){j=1104;break}}k=g+512|0;l=g+513|0;do{if((f|0)==0){m=ut(l)|0;if((m|0)!=0){n=m;break}gk();m=ut(l)|0;if((m|0)==0){j=1099;break L1479}else{n=m}}else{n=db(f,l,127720)|0}}while(0);l=n+g|0;a[l]=0;if((cd(l|0,512,1,e|0)|0)==0){j=1102;break}a[n+k|0]=0;f=n;g=k}if((j|0)==1099){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=127720,v)|0)}else if((j|0)==1102){uu(n);uj(-1,113448,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}else if((j|0)==1104){az(e|0);e=c[11864]|0;do{if((e|0)<1){n=1-e|0;do{if((c[11880]|0)<1){l=db(c[12172]|0,232,216568)|0;c[12172]=l;if((l|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11880]=1;break}}}while(0);if((n|0)<=0){break}k=c[12172]|0;l=0;m=c[11864]|0;do{uD(k+(m*232&-1)|0,48440,232);m=(c[11864]|0)+1|0;c[11864]=m;l=l+1|0;}while((l|0)<(n|0))}}while(0);e=aQ(f|0,100248)|0;L1506:do{if((e|0)==0){j=1122}else{n=a8(e+18|0,61)|0;do{n=n+1|0;}while((aM(a[n]|0|0)|0)!=0);if((n|0)==0){j=1122;break}l=bk(n|0,95048)|0;m=db(c[11932]|0,l+1|0,88488)|0;c[11932]=m;uF(m|0,n|0,l|0);a[(c[11932]|0)+l|0]=0;l=aQ(f|0,78632)|0;do{if((l|0)!=0){m=a8(l+22|0,61)|0;do{m=m+1|0;}while((aM(a[m]|0|0)|0)!=0);if((m|0)==0){break}k=bW(m|0)|0;c[(c[12172]|0)+128>>2]=k;break L1506}}while(0);c[(c[12172]|0)+128>>2]=0}}while(0);if((j|0)==1122){c[(c[12172]|0)+128>>2]=g}c[(c[12172]|0)+152>>2]=1;c[(c[12172]|0)+156>>2]=-1;a[(c[12172]|0)+124|0]=1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;eQ(1);g=c[11950]|0;if((c[11884]|0)<1){j=db(g,12,215112)|0;c[11950]=j;c[11884]=1;o=j}else{o=g}c[o>>2]=0;o=c[11950]|0;if((c[11884]|0)<2){g=db(o,24,215112)|0;c[11950]=g;c[11884]=2;p=g}else{p=o}c[p+12>>2]=0;c[11870]=1;c[262]=1;p=aQ(f|0,73608)|0;do{if((p|0)!=0){o=a8(p+5|0,61)|0;do{o=o+1|0;}while((aM(a[o]|0|0)|0)!=0);if((o|0)==0){break}g=bW(o|0)|0;c[(c[12172]|0)+140>>2]=g}}while(0);p=aQ(f|0,218896)|0;do{if((p|0)!=0){g=a8(p+5|0,61)|0;do{g=g+1|0;}while((aM(a[g]|0|0)|0)!=0);if((g|0)==0){break}o=bW(g|0)|0;c[(c[12172]|0)+144>>2]=o}}while(0);p=aQ(f|0,213352)|0;L1542:do{if((p|0)!=0){o=a8(p+8|0,61)|0;do{o=o+1|0;}while((aM(a[o]|0|0)|0)!=0);if((o|0)==0){break}else{q=-1}while(1){r=q+1|0;g=c[46440+(r*12&-1)>>2]|0;if((r|0)==12){break L1542}if((a_(o|0,g|0,uA(g|0)|0)|0)==0){break}else{q=r}}if((r|0)<=-1){break}o=b[46448+(r*12&-1)>>1]|0;if((o|0)==1){g=1328>>>(r>>>0);do{if((g&1|0)==0){j=2752>>>(r>>>0);if(((j|g)&1|0)!=0){s=(j&1|0)!=0?11:5;break}if((q-1|0)>>>0<2){s=3;break}s=r>>>0<2?1:12}else{s=7}}while(0);g=c[11950]|0;if((c[11884]|0)<1){j=db(g,12,215112)|0;c[11950]=j;c[11884]=1;t=j}else{t=g}c[t+4>>2]=s;b[(c[11950]|0)+8>>1]=b[48036+(s<<4)>>1]|0;break}else if((o|0)==2){if((1328>>>(r>>>0)&1|0)==0){u=(2752>>>(r>>>0)&1|0)!=0?9:12}else{u=8}g=c[11950]|0;if((c[11884]|0)<1){j=db(g,12,215112)|0;c[11950]=j;c[11884]=1;w=j}else{w=g}c[w+4>>2]=u;b[(c[11950]|0)+8>>1]=b[48036+(u<<4)>>1]|0;break}else if((o|0)==0){g=1328>>>(r>>>0);do{if((g&1|0)==0){j=2752>>>(r>>>0);if(((j|g)&1|0)!=0){x=(j&1|0)!=0?10:4;break}if((q-1|0)>>>0<2){x=2;break}x=r>>>0<2?0:12}else{x=6}}while(0);g=c[11950]|0;if((c[11884]|0)<1){o=db(g,12,215112)|0;c[11950]=o;c[11884]=1;y=o}else{y=g}c[y+4>>2]=x;b[(c[11950]|0)+8>>1]=b[48036+(x<<4)>>1]|0;break}else{break}}}while(0);x=aQ(f|0,207688)|0;L1579:do{if((x|0)!=0){y=a8(x+9|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}do{if((aY(y|0,149792)|0)==0){z=0}else{r=(a_(y|0,149792,12)|0)!=0;if((aY(y|0,147968)|0)==0){z=1;break}q=(a_(y|0,147968,13)|0)==0&r?1:r<<31>>31;if((q|0)>-1){z=q}else{break L1579}}}while(0);c[12208]=c[46604+(z<<3)>>2]}}while(0);z=aQ(f|0,203264)|0;do{if((z|0)!=0){x=a8(z+8|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){break}A=+uz(x,0);y=c[12172]|0;h[y+200>>3]=A;c[y+192>>2]=1}}while(0);z=aQ(f|0,198216)|0;do{if((z|0)!=0){y=a8(z+8|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}A=+uz(y,0);x=c[12172]|0;h[x+208>>3]=A;c[x+192>>2]=1}}while(0);z=aQ(f|0,186936)|0;do{if((z|0)!=0){x=a8(z+8|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){break}A=+uz(x,0);y=c[12172]|0;h[y+200>>3]=A;c[y+192>>2]=2}}while(0);z=aQ(f|0,181632)|0;do{if((z|0)!=0){y=a8(z+8|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}A=+uz(y,0);x=c[12172]|0;h[x+208>>3]=A;c[x+192>>2]=2}}while(0);z=aQ(f|0,177440)|0;do{if((z|0)!=0){x=a8(z+7|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){break}A=+uz(x,0);h[(c[12172]|0)+168>>3]=A}}while(0);z=aQ(f|0,172936)|0;do{if((z|0)!=0){y=a8(z+7|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}A=+uz(y,0);h[(c[12172]|0)+176>>3]=A}}while(0);z=aQ(f|0,169160)|0;if((z|0)==0){uu(f);i=d;return}x=a8(z+10|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){uu(f);i=d;return}do{if((aY(x|0,155800)|0)==0){c[(c[12172]|0)+152>>2]=1;B=(c[12172]|0)+156|0}else{if((aY(x|0,151720)|0)==0){c[(c[12172]|0)+152>>2]=1;C=(c[12172]|0)+156|0}else{z=(a_(x|0,155800,11)|0)!=0;q=(a_(x|0,151720,9)|0)==0&z;c[(c[12172]|0)+152>>2]=1;z=(c[12172]|0)+156|0;if(q){C=z}else{B=z;break}}c[C>>2]=1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;uu(f);i=d;return}}while(0);c[B>>2]=-1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;uu(f);i=d;return}}function dt(){du(0)}function du(a){a=a|0;uf(-1,164848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dv(){du(0)}function dw(){du(0)}function dx(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0;d=i;i=i+16|0;e=d|0;f=c[12372]|0;if((f|0)==2|(f|0)==5){g=(c[12374]<<4&65520)+f|0;j=1226}else if((f|0)==1|(f|0)==4){g=(c[12373]<<4&65520)+f|0;j=1226}else if((f|0)==0){c[b+8>>2]=1601}else{g=0;j=1226}if((j|0)==1226){c[b+8>>2]=g}cN[c[(c[3524]|0)+148>>2]&255](4,b);if((c[7661]|0)==0){i=d;return}g=e;c[g>>2]=c[7654];c[g+4>>2]=c[30620>>2];c[g+8>>2]=c[30624>>2];c[g+12>>2]=c[30628>>2];g=c[7645]|0;do{if((c[7644]|0)!=0){k=+h[3825];f=c[(c[3524]|0)+92>>2]|0;if(k<0.0){cK[f&63](+h[3817]);break}else{cK[f&63](k);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[3824]);f=c[(c[3524]|0)+64>>2]|0;if((g|0)<-5){cM[f&511](-2)}else{cM[f&511](g)}f=c[3524]|0;do{if((a[30608]&1)==0){if((c[f+96>>2]&1024|0)!=0){l=f;break}c[e>>2]=1;c[e+4>>2]=g;j=1238}else{j=1238}}while(0);if((j|0)==1238){fn(e,f);l=c[3524]|0}f=b|0;e=b+4|0;cN[c[l+56>>2]&255](c[f>>2]|0,c[e>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[b+36>>2]|0,c[b+40>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[b+24>>2]|0,c[b+28>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[b+12>>2]|0,c[b+16>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[f>>2]|0,c[e>>2]|0);i=d;return}function dy(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;b=i;i=i+48|0;d=b|0;e=+h[64664+((c[200]|0)*688&-1)>>3];f=+h[91];g=+h[96];j=+h[64664+((c[144]|0)*688&-1)>>3];k=+h[21];l=+h[68];m=+h[5279];n=+h[2];o=+h[12];p=+h[403];q=+h[391];r=+h[395];s=+h[399];t=+h[404];u=+h[392];v=+h[396];w=+h[400];x=+h[406];y=+h[394];z=+h[398];A=+h[402];B=+(c[180]|0);C=c[186]|0;D=+(c[40]|0);E=c[46]|0;F=0;do{G=(+h[a+(F<<5)>>3]-e)*f+g+-1.0;H=(+h[a+(F<<5)+8>>3]-j)*k+l+-1.0;I=(+h[a+(F<<5)+16>>3]-m)*n+o+-1.0;J=x+G*y+H*z+I*A;K=J==0.0?1.0e-5:J;c[d+(F*12&-1)>>2]=~~((p+G*q+H*r+I*s)/K*B)+C;c[d+(F*12&-1)+4>>2]=~~((t+G*u+H*v+I*w)/K*D)+E;F=F+1|0;}while((F|0)<4);dx(d|0);i=b;return}function dz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=c[(c[3524]|0)+136>>2]|0;if((d|0)==0){e=1;i=b;return e|0}f=cO[d&255](0)|0;c[5169]=f;if((f|0)==0){if((uG(29056,20648,1024)|0)==0){e=0;i=b;return e|0}d=c[(c[3524]|0)+136>>2]|0;cO[d&255](20648);uD(29056,20648,1024);e=0;i=b;return e|0}d=c[5168]|0;do{if((d|0)>0){if((c[5163]|0)==100){c[5169]=f;g=f;break}if((f|0)<=(d|0)){g=f;break}c[5169]=d;g=d}else{g=f}}while(0);d=c[7264]|0;do{if((d|0)>-1&(c[5162]|0)==(d|0)){if((c[5163]|0)!=(c[7265]|0)){h=1261;break}if((c[5164]|0)!=(c[7266]|0)){h=1261;break}if((c[5165]|0)!=(c[7267]|0)){h=1261;break}if((c[5166]|0)!=(c[7268]|0)){h=1261;break}if(!((a[20668]|0)==(a[29076]|0)&(g|0)==(c[7271]|0))){h=1261}}else{h=1261}}while(0);do{if((h|0)==1261){if((a[37400]&1)==0){break}d=c[m>>2]|0;j=c[c[3524]>>2]|0;cf(d|0,218032,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=g,c[v+16>>2]=f,v)|0)}}while(0);uD(29056,20648,1024);f=c[5170]|0;if((f|0)!=0){uu(f);c[5170]=0}f=(c[5169]|0)*24&-1;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){k=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217512,v)|0);return 0}else{k=g}}while(0);g=k;c[5170]=g;k=c[5169]|0;L1722:do{if((k|0)>0){f=0;h=k;j=g;while(1){fq(+(f|0)/+(h-1|0),j+(f*24&-1)|0);d=f+1|0;l=c[5169]|0;if((d|0)>=(l|0)){break L1722}f=d;h=l;j=c[5170]|0}}}while(0);cO[c[(c[3524]|0)+136>>2]&255](20648);e=0;i=b;return e|0}function dA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0;d=i;e=a*12&-1;f=ut(e)|0;do{if((f|0)==0){gk();g=ut(e)|0;if((g|0)!=0){j=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=164072,v)|0)}else{j=f}}while(0);f=j;if((a|0)>0){e=0;do{k=(+h[b+(e<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;l=(+h[b+(e<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;m=(+h[b+(e<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;n=+h[406]+k*+h[394]+l*+h[398]+m*+h[402];o=n==0.0?1.0e-5:n;g=~~((+h[404]+k*+h[392]+l*+h[396]+m*+h[400])/o*+(c[40]|0))+(c[46]|0)|0;c[f+(e*12&-1)>>2]=~~((+h[403]+k*+h[391]+l*+h[395]+m*+h[399])/o*+(c[180]|0))+(c[186]|0);c[f+(e*12&-1)+4>>2]=g;e=e+1|0;}while((e|0)<(a|0))}e=c[12372]|0;if((e|0)==1|(e|0)==4){p=(c[12373]<<4&65520)+e|0}else if((e|0)==2|(e|0)==5){p=(c[12374]<<4&65520)+e|0}else if((e|0)==0){c[j+8>>2]=1601;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,f);uu(j);i=d;return}else{p=0}c[j+8>>2]=p;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,f);uu(j);i=d;return}function dB(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;e=i;f=a*12&-1;g=ut(f)|0;do{if((g|0)==0){gk();j=ut(f)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=136792,v)|0)}else{k=g}}while(0);g=k;if((a|0)>0){f=0;do{l=(+h[b+(f<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;m=(+h[b+(f<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;n=(d- +h[5279])*+h[2]+ +h[12]+-1.0;o=+h[406]+l*+h[394]+m*+h[398]+n*+h[402];p=o==0.0?1.0e-5:o;j=~~((+h[404]+l*+h[392]+m*+h[396]+n*+h[400])/p*+(c[40]|0))+(c[46]|0)|0;c[g+(f*12&-1)>>2]=~~((+h[403]+l*+h[391]+m*+h[395]+n*+h[399])/p*+(c[180]|0))+(c[186]|0);c[g+(f*12&-1)+4>>2]=j;f=f+1|0;}while((f|0)<(a|0))}f=c[12372]|0;if((f|0)==0){c[k+8>>2]=1601;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,g);uu(k);i=e;return}else if((f|0)==1|(f|0)==4){t=(c[12373]<<4&65520)+f|0}else if((f|0)==2|(f|0)==5){t=(c[12374]<<4&65520)+f|0}else{t=0}c[k+8>>2]=t;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,g);uu(k);i=e;return}function dC(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;j=i;i=i+64|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+48|0;o=j+56|0;p=(e|0)!=0;q=c[3524]|0;r=~~(+((c[q+28>>2]|0)>>>0>>>0)*(p?+h[8390]:+h[8391])*((a[67136]&1)!=0?-1.0:1.0));s=+h[8341];t=(d-s)/(+h[8342]-s);if((a[54017]|0)==104){u=c[13528]|0;v=~~(+(u|0)+t*+((c[13529]|0)-u|0));u=c[13530]|0;w=u-r|0;x=v;y=u;z=v}else{v=c[13529]|0;u=c[13530]|0;A=~~(+(u|0)+t*+((c[13531]|0)-u|0));w=A;x=v+r|0;y=A;z=v}v=c[f+4>>2]|0;do{if((v|0)>-3){A=m;u=f+40|0;c[A>>2]=c[u>>2];c[A+4>>2]=c[u+4>>2];c[A+8>>2]=c[u+8>>2];c[A+12>>2]=c[u+12>>2];do{if((c[f>>2]|0)!=0){t=+h[f+24>>3];u=c[q+92>>2]|0;if(t<0.0){cK[u&63](+h[3817]);break}else{cK[u&63](t);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[f+16>>3]);u=c[(c[3524]|0)+64>>2]|0;if((v|0)<-5){cM[u&511](-2)}else{cM[u&511](v)}u=c[3524]|0;do{if((a[f+32|0]&1)==0){if((c[u+96>>2]&1024|0)!=0){B=u;break}c[m>>2]=1;c[m+4>>2]=v;C=1317}else{C=1317}}while(0);if((C|0)==1317){fn(m,u);B=c[3524]|0}A=c[B+56>>2]|0;if((a[54017]|0)==104){cN[A&255](z,c[13530]|0);cN[c[(c[3524]|0)+60>>2]&255](z,c[13531]|0)}else{cN[A&255](c[13528]|0,y);cN[c[(c[3524]|0)+60>>2]&255](c[13529]|0,y)}A=l;c[A>>2]=c[14084];c[A+4>>2]=c[56340>>2];c[A+8>>2]=c[56344>>2];c[A+12>>2]=c[56348>>2];A=c[14075]|0;do{if((c[14074]|0)!=0){t=+h[7040];D=c[(c[3524]|0)+92>>2]|0;if(t<0.0){cK[D&63](+h[3817]);break}else{cK[D&63](t);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);u=c[(c[3524]|0)+64>>2]|0;if((A|0)<-5){cM[u&511](-2)}else{cM[u&511](A)}u=c[3524]|0;if((a[56328]&1)==0){if((c[u+96>>2]&1024|0)!=0){E=u;break}c[l>>2]=1;c[l+4>>2]=A}fn(l,u);E=c[3524]|0}else{E=q}}while(0);cN[c[E+56>>2]&255](z,y);cN[c[(c[3524]|0)+60>>2]&255](x,w);do{if(p){L1804:do{if((g|0)==0){F=e}else{t=+h[8342]- +h[8341];E=g;while(1){if(+P(+((d- +h[E>>3])/t))<=.001){F=0;break L1804}q=c[E+16>>2]|0;if((q|0)==0){F=e;break}else{E=q}}}}while(0);fx(64984+(b*688&-1)|0,n,o,123416);A=64928+(b*688&-1)|0;if((c[A>>2]|0)!=0){fn(A,c[3524]|0)}do{if((a[54017]|0)==104){A=c[3524]|0;E=(c[13530]|0)-(c[A+16>>2]|0)|0;q=65032+(b*688&-1)|0;l=c[q>>2]|0;do{if((l|0)==0){G=0}else{if((cO[c[A+72>>2]&255](l)|0)==0){G=0;break}G=c[q>>2]|0}}while(0);q=E+((r|0)>0?-r|0:0)|0;l=(G|0)!=0;if((a[65272+(b*688&-1)|0]&1)==0){H=l&1^1}else{H=c[65128+(b*688&-1)>>2]|0}ln((c[n>>2]|0)+x|0,(c[o>>2]|0)+((q|0)<0?0:q)|0,F,H,1,G,c[64924+(b*688&-1)>>2]|0);if(!l){break}l=c[(c[3524]|0)+72>>2]|0;cO[l&255](0)}else{if((a[65272+(b*688&-1)|0]&1)==0){I=0}else{I=c[65128+(b*688&-1)>>2]|0}ln((((c[13529]|0)+((r|0)>0?r:0)|0)+(c[(c[3524]|0)+20>>2]|0)|0)+(c[n>>2]|0)|0,(c[o>>2]|0)+w|0,F,I,1,0,c[64924+(b*688&-1)>>2]|0)}}while(0);l=k;c[l>>2]=c[14084];c[l+4>>2]=c[56340>>2];c[l+8>>2]=c[56344>>2];c[l+12>>2]=c[56348>>2];l=c[14075]|0;do{if((c[14074]|0)!=0){t=+h[7040];q=c[(c[3524]|0)+92>>2]|0;if(t<0.0){cK[q&63](+h[3817]);break}else{cK[q&63](t);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);q=c[(c[3524]|0)+64>>2]|0;if((l|0)<-5){cM[q&511](-2)}else{cM[q&511](l)}q=c[3524]|0;if((a[56328]&1)==0){if((c[q+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=l}fn(k,q)}}while(0);if((c[16745]&4|0)==0){i=j;return}if((a[54017]|0)==104){k=c[13531]|0;J=k+r|0;K=x;L=k;M=z}else{z=c[13528]|0;J=w;K=z-r|0;L=y;M=z}cN[c[(c[3524]|0)+56>>2]&255](M,L);cN[c[(c[3524]|0)+60>>2]&255](K,J);i=j;return}function dD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0.0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0.0,aW=0.0,aX=0,aY=0,aZ=0,a_=0.0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0;d=i;i=i+304|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=d+80|0;m=d+128|0;n=d+136|0;o=d+144|0;p=d+152|0;q=d+160|0;r=d+168|0;s=d+176|0;t=d+184|0;u=d+192|0;w=d+232|0;x=d+272|0;y=d+280|0;z=d+288|0;A=d+296|0;B=c[10028]|0;C=a[54016]|0;if(C<<24>>24==110){i=d;return}D=c[3524]|0;if((c[D+148>>2]|0)==0){i=d;return}do{if(C<<24>>24==117){do{if((a[37384]&1)==0){fR(54032,o,p,106096);c[13528]=~~+h[o>>3];c[13530]=~~+h[p>>3];fN(54072,q,r,106096);E=~~+h[q>>3];c[13529]=E;F=~~+h[r>>3];c[13531]=F;G=E;H=F}else{if((c[5094]|0)==0){F=D+8|0;c[13528]=~~(+h[6756]*+((c[F>>2]|0)>>>0>>>0)+.5);E=D+12|0;c[13530]=~~(+h[6757]*+((c[E>>2]|0)>>>0>>>0)+.5);I=~~(+h[6761]*+(((c[F>>2]|0)-1|0)>>>0>>>0)+.5);c[13529]=I;F=~~(+h[6762]*+(((c[E>>2]|0)-1|0)>>>0>>>0)+.5);c[13531]=F;G=I;H=F;break}else{fK(54032,s,t,106096);c[13528]=~~+h[s>>3];c[13530]=~~+h[t>>3];fx(54072,54116,54124,106096);G=c[13529]|0;H=c[13531]|0;break}}}while(0);F=c[13528]|0;I=G+F|0;c[13529]=I;E=c[13530]|0;J=H+E|0;c[13531]=J;K=E;L=J;M=F;N=I}else{do{if((b|0)!=2|(c[5094]|0)!=0){if((a[37384]&1)==0){uE(u|0,0,40);c[u>>2]=2;c[u+4>>2]=2;c[u+8>>2]=2;h[u+16>>3]=1.025;uE(w|0,0,40);c[w>>2]=2;c[w+4>>2]=2;c[w+8>>2]=2;h[w+16>>3]=.05;h[w+24>>3]=1.0;fR(u,m,n,106096);I=~~+h[m>>3];c[13530]=~~+h[n>>3];c[13528]=I+(c[13507]|0);fN(w,x,y,106096);I=c[13528]|0;F=~~(+h[x>>3]+ +(I|0));c[13529]=F;J=c[13530]|0;E=~~(+h[y>>3]+ +(J|0));c[13531]=E;O=J;P=E;Q=I;R=F;break}else{F=c[200]|0;S=+h[64672+(F*688&-1)>>3];T=+h[64664+(F*688&-1)>>3];U=S-T;F=c[144]|0;V=+h[64664+(F*688&-1)>>3];W=+h[91];X=+h[96];Y=(S+U*.025-T)*W+X+-1.0;Z=+h[21];_=+h[68];$=(V-V)*Z+_+-1.0;aa=+h[5279];ab=+h[2];ac=+h[12];ad=(+h[7076]-aa)*ab+ac+-1.0;ae=+h[403];af=+h[391];ag=+h[395];ah=+h[399];ai=+h[404];aj=+h[392];ak=+h[396];al=+h[400];am=+h[406];an=+h[394];ao=+h[398];ap=+h[402];aq=am+Y*an+$*ao+ad*ap;ar=aq==0.0?1.0e-5:aq;aq=+(c[180]|0);I=c[186]|0;E=~~((ae+Y*af+$*ag+ad*ah)/ar*aq)+I|0;as=+(c[40]|0);J=c[46]|0;at=~~((ai+Y*aj+$*ak+ad*al)/ar*as)+J|0;c[13528]=E;c[13530]=at;ar=(U*.075+S-T)*W+X+-1.0;X=(+h[64672+(F*688&-1)>>3]-V)*Z+_+-1.0;_=(+h[6915]-aa)*ab+ac+-1.0;ac=am+ar*an+X*ao+_*ap;ap=ac==0.0?1.0e-5:ac;F=~~((ae+ar*af+X*ag+_*ah)/ap*aq)+I|0;I=~~((ai+ar*aj+X*ak+_*al)/ap*as)+J|0;c[13529]=F;c[13531]=I;O=at;P=I;Q=E;R=F;break}}else{as=+(c[186]|0);ap=+(c[180]|0);F=~~(as+ap*.709);c[13528]=F;E=~~(as+ap*.778);c[13529]=E;ap=+(c[46]|0);as=+(c[40]|0);I=~~(ap-as*.147);c[13530]=I;at=~~(ap+as*.497);c[13531]=at;O=I;P=at;Q=F;R=E}}while(0);if((a[54017]|0)!=118){K=O;L=P;M=Q;N=R;break}as=+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0);E=~~(+h[8390]*((a[67136]&1)!=0?-1.0:1.0)*as);F=c[144]|0;at=~~(as*+h[65056+(F*688&-1)>>3]*((a[65072+(F*688&-1)|0]&1)!=0?-1.0:1.0));do{if((E|0)>0){if((c[16745]&4|0)==0){au=Q;av=R;break}F=Q+E|0;c[13528]=F;I=R+E|0;c[13529]=I;au=F;av=I}else{au=Q;av=R}}while(0);if((at|0)<=0){K=O;L=P;M=au;N=av;break}if((c[16401]&4|0)==0){K=O;L=P;M=au;N=av;break}E=au+at|0;c[13528]=E;I=av+at|0;c[13529]=I;K=O;L=P;M=E;N=I}}while(0);if((K|0)>(L|0)){c[13531]=K;c[13530]=L;aw=L;ax=K}else{aw=K;ax=L}if((c[(c[3524]|0)+96>>2]&16|0)==0){if((a[54017]|0)==118){L=l+36|0;c[L>>2]=M;K=l|0;c[K>>2]=M;P=l+24|0;c[P>>2]=N;O=l+12|0;c[O>>2]=N;ay=ax-aw|0;az=ax;aA=aw;aB=l+16|0;aC=l+4|0;aD=l+40|0;aE=l+28|0;aF=L;aG=K;aH=P;aJ=O}else{O=l+16|0;c[O>>2]=aw;P=l+4|0;c[P>>2]=aw;K=l+40|0;c[K>>2]=ax;L=l+28|0;c[L>>2]=ax;ay=N-M|0;az=N;aA=M;aB=O;aC=P;aD=K;aE=L;aF=l+36|0;aG=l|0;aH=l+24|0;aJ=l+12|0}as=+(ay|0)*.0078125;ap=+(az-aA|0);ay=1-aA|0;L=l+8|0;K=l|0;l=k|0;P=k+8|0;O=k+4|0;av=aA;au=0;R=0;while(1){Q=~~(as*+(R+1|0))+aA|0;al=+(ay+av|0)/ap;if((a[20668]|0)==110){aK=1.0-al}else{aK=al}y=(c[3524]|0)+144|0;if((c[y>>2]|0)!=0){c[l>>2]=5;h[P>>3]=aK;c[O>>2]=0;cM[c[y>>2]&511](k)}L1909:do{if((c[5163]|0)==100){y=c[5172]|0;x=c[5173]|0;w=au;n=au;while(1){if((w|0)>=(y|0)){aL=R;aM=n;aN=Q;break L1909}aO=~~(ap*+h[x+(w<<5)>>3])+aA|0;if((av|0)<(aO|0)){if((Q|0)>(aO|0)){break}else{aP=n}}else{aP=w}if((Q|0)<(aO|0)){aL=R;aM=aP;aN=Q;break L1909}else{w=w+1|0;n=aP}}aL=R-1|0;aM=n;aN=aO}else{aL=R;aM=au;aN=Q}}while(0);if((a[54017]|0)==118){c[aB>>2]=av;c[aC>>2]=av;Q=aN+1|0;at=(az|0)<(Q|0)?az:Q;c[aD>>2]=at;c[aE>>2]=at}else{c[aF>>2]=av;c[aG>>2]=av;at=aN+1|0;Q=(az|0)<(at|0)?az:at;c[aH>>2]=Q;c[aJ>>2]=Q}Q=c[12372]|0;if((Q|0)==0){aQ=1601}else if((Q|0)==1|(Q|0)==4){aR=(c[12373]<<4&65520)+Q|0;aS=1421}else if((Q|0)==2|(Q|0)==5){aR=(c[12374]<<4&65520)+Q|0;aS=1421}else{aR=0;aS=1421}if((aS|0)==1421){aS=0;aQ=aR}c[L>>2]=aQ;cN[c[(c[3524]|0)+148>>2]&255](4,K);Q=aL+1|0;if((Q|0)<128){av=aN;au=aM;R=Q}else{break}}}else{aI(92952,104,1,B|0);R=c[13530]|0;cf(B|0,85112,(v=i,i=i+32|0,c[v>>2]=c[13528],c[v+8>>2]=R,c[v+16>>2]=N-M,c[v+24>>2]=ax-aw,v)|0);aI(76928,42,1,B|0);if((a[20668]|0)==110){aI(224696,19,1,B|0)}else{aI(217376,7,1,B|0)}if((a[54017]|0)==118){aI(211744,30,1,B|0)}else{aI(205632,30,1,B|0)}aI(202264,85,1,B|0)}do{if((a[54018]|0)!=0){B=c[13505]|0;do{if((B|0)>-1){aw=c[14074]|0;ap=+h[7039];aK=+h[7040];ax=a[56328]|0;as=+h[7043];M=43280;while(1){aT=c[M>>2]|0;if((aT|0)==0){aS=1429;break}if((c[aT+4>>2]|0)==(B|0)){aS=1428;break}else{M=aT|0}}L1952:do{if((aS|0)==1428){M=c[aT+12>>2]|0;n=a[aT+40|0]|0;N=(n&1)==0;aU=M;aV=+h[aT+24>>3];aW=+h[aT+32>>3];aX=n;aY=N?1:c[aT+48>>2]|0;aZ=N?M:c[aT+52>>2]|0;a_=+h[aT+56>>3]}else if((aS|0)==1429){M=c[8798]|0;N=(M|0)>0;n=B;L1955:while(1){R=43264;while(1){a$=c[R>>2]|0;if((a$|0)==0){break}if((c[a$+4>>2]|0)==(n|0)){break L1955}else{R=a$|0}}R=n-1|0;if(!((n|0)>(M|0)&N)){aU=R;aV=ap;aW=aK;aX=ax;aY=1;aZ=R;a_=as;break L1952}n=((R|0)%(M|0)&-1)+1|0}M=c[a$+12>>2]|0;al=+h[a$+24>>3];_=+h[a$+32>>3];N=a[a$+40|0]|0;R=c[a$+48>>2]|0;aM=c[a$+52>>2]|0;ak=+h[a$+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){aU=n;aV=al;aW=_;aX=0;aY=R;aZ=aM;a_=ak;break}au=(N&1)==0;aU=M;aV=al;aW=_;aX=N;aY=au?1:R;aZ=au?M:aM;a_=ak}}while(0);ax=j|0;c[ax>>2]=aY;aM=j+4|0;c[aM>>2]=aZ;h[j+8>>3]=a_;do{if((aw|0)!=0){M=c[(c[3524]|0)+92>>2]|0;if(aW<0.0){cK[M&63](+h[3817]);break}else{cK[M&63](aW);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](aV);aw=c[(c[3524]|0)+64>>2]|0;if((aU|0)<-5){cM[aw&511](-2)}else{cM[aw&511](aU)}aw=c[3524]|0;if((aX&1)==0){if((c[aw+96>>2]&1024|0)!=0){break}c[ax>>2]=1;c[aM>>2]=aU}fn(j,aw)}else{aw=g;c[aw>>2]=c[14084];c[aw+4>>2]=c[56340>>2];c[aw+8>>2]=c[56344>>2];c[aw+12>>2]=c[56348>>2];aw=c[14075]|0;do{if((c[14074]|0)!=0){as=+h[7040];M=c[(c[3524]|0)+92>>2]|0;if(as<0.0){cK[M&63](+h[3817]);break}else{cK[M&63](as);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);aM=c[(c[3524]|0)+64>>2]|0;if((aw|0)<-5){cM[aM&511](-2)}else{cM[aM&511](aw)}aM=c[3524]|0;if((a[56328]&1)==0){if((c[aM+96>>2]&1024|0)!=0){break}c[g>>2]=1;c[g+4>>2]=aw}fn(g,aM)}}while(0);B=c[3524]|0;aM=c[B+172>>2]|0;if((aM|0)==0){a0=B}else{cM[aM&511](0);a0=c[3524]|0}cN[c[a0+56>>2]&255](c[13528]|0,c[13530]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13529]|0,c[13530]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13529]|0,c[13531]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13528]|0,c[13531]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13528]|0,c[13530]|0);aM=c[(c[3524]|0)+172>>2]|0;if((aM|0)!=0){cM[aM&511](1)}aM=f;c[aM>>2]=c[14084];c[aM+4>>2]=c[56340>>2];c[aM+8>>2]=c[56344>>2];c[aM+12>>2]=c[56348>>2];aM=c[14075]|0;do{if((c[14074]|0)!=0){as=+h[7040];B=c[(c[3524]|0)+92>>2]|0;if(as<0.0){cK[B&63](+h[3817]);break}else{cK[B&63](as);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);B=c[(c[3524]|0)+64>>2]|0;if((aM|0)<-5){cM[B&511](-2)}else{cM[B&511](aM)}B=c[3524]|0;if((a[56328]&1)==0){if((c[B+96>>2]&1024|0)!=0){break}c[f>>2]=1;c[f+4>>2]=aM}fn(f,B)}}while(0);if((c[16745]|0)!=0){f=e;c[f>>2]=c[14084];c[f+4>>2]=c[56340>>2];c[f+8>>2]=c[56344>>2];c[f+12>>2]=c[56348>>2];f=c[14075]|0;do{if((c[14074]|0)!=0){aV=+h[7040];a0=c[(c[3524]|0)+92>>2]|0;if(aV<0.0){cK[a0&63](+h[3817]);break}else{cK[a0&63](aV);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);a0=c[(c[3524]|0)+64>>2]|0;if((f|0)<-5){cM[a0&511](-2)}else{cM[a0&511](f)}a0=c[3524]|0;do{if((a[56328]&1)==0){if((c[a0+96>>2]&1024|0)!=0){break}c[e>>2]=1;c[e+4>>2]=f;aS=1485}else{aS=1485}}while(0);if((aS|0)==1485){fn(e,a0)}de(3,8)}if((c[16801]|0)==0){i=d;return}fn(67216,c[3524]|0);aV=+h[8390];a0=(a[67136]&1)!=0;do{if((a[54017]|0)==104){e=~~(aV*(a0?1.0:-1.0)*+((c[(c[3524]|0)+24>>2]|0)>>>0>>>0));fx(67288,z,A,98672);aS=(c[z>>2]|0)+(((c[13529]|0)+(c[13528]|0)|0)/2&-1)|0;c[z>>2]=aS;f=~~(+(c[A>>2]|0)+(+(c[13530]|0)+ +((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)*-2.7))+((e|0)<0?e:0)|0;c[A>>2]=f;if((aS|0)<0){c[z>>2]=0;a1=0}else{a1=aS}if((f|0)<0){c[A>>2]=0;a2=0}else{a2=f}ln(a1,a2,c[16801]|0,1,1,0,c[16802]|0)}else{f=~~(aV*(a0?-1.0:1.0)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));c[216]=0;if((c[16745]&1|0)!=0){c[216]=0;de(3,14)}fx(67288,z,A,98672);aS=c[3524]|0;e=~~(+(c[z>>2]|0)+(+(c[13529]|0)+(+(c[216]|0)+1.5)*+((c[aS+20>>2]|0)>>>0>>>0)))+((f|0)>0?f:0)|0;c[z>>2]=e;f=(c[A>>2]|0)+(((c[13531]|0)+(c[13530]|0)|0)/2&-1)|0;c[A>>2]=f;if((e|0)<0){c[z>>2]=0;a3=0}else{a3=e}if((f|0)<0){c[A>>2]=0;a4=0}else{a4=f}f=(cO[c[aS+72>>2]&255](c[16799]|0)|0)==0;aS=c[16801]|0;if(f){ln(a3,a4,aS,0,0,0,c[16802]|0);break}else{ln(a3,a4,aS,1,0,c[16799]|0,c[16802]|0);aS=c[(c[3524]|0)+72>>2]|0;cO[aS&255](0);break}}}while(0);if((c[16804]|0)==0){i=d;return}cM[c[(c[3524]|0)+64>>2]&511](-2);i=d;return}function dE(){c[13544]=(c[13544]|0)+1;c[13898]=(c[13898]|0)+1;return}function dF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,n=0,p=0,q=0;c[12906]=b;do{if((d|0)==0){if((a[37400]&1)!=0){e=b;f=0;break}c[8272]=0;c[13898]=0;a[c[10036]|0]=0;e=b;f=0}else{e=b;f=d}}while(0);L2054:while(1){d=(c[10036]|0)+f|0;b=(c[10034]|0)-f|0;if((a[37400]&1)!=0){g=c[m>>2]|0;aK(e|0,g|0)}if((a6(d|0,b|0,c[o>>2]|0)|0)==0){h=1518;break}b=c[10036]|0;d=uA(b|0)|0;g=d-1|0;if((g|0)<=-1){break}i=b+g|0;b=a[i]|0;do{if(b<<24>>24==10){a[i]=0;do{if((g|0)>0){j=d-2|0;k=(c[10036]|0)+j|0;if((a[k]|0)!=13){l=g;break}a[k]=0;l=j}else{l=g}}while(0);j=(((l|0)>0)<<31>>31)+l|0;n=j;p=a[(c[10036]|0)+j|0]|0}else{if((d+1|0)>>>0<(c[10034]|0)>>>0){n=g;p=b;break}dG();e=138304;f=d;continue L2054}}while(0);d=p<<24>>24==92;if(d){e=138304;f=d?n:f}else{q=0;h=1533;break}}if((h|0)==1533){return q|0}do{if((h|0)==1518){if((a[37400]&1)!=0){n=c[m>>2]|0;aF(10,n|0)}a[(c[10036]|0)+f|0]=0;c[9354]=(c[9354]|0)+1;if((f|0)>0&(c[12918]|0)==0){break}else{q=1}return q|0}}while(0);q=0;return q|0}function dG(){var b=0,d=0,e=0,f=0;b=i;d=c[10034]|0;if((d|0)!=0){c[10036]=db(c[10036]|0,d+1024|0,216480)|0;c[10034]=(c[10034]|0)+1024;i=b;return}d=ut(1024)|0;do{if((d|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=209632,v)|0)}else{f=d}}while(0);c[10036]=f;c[10034]=1024;a[f]=0;i=b;return}function dH(){var a=0,b=0,d=0,e=0;a=i;b=c[1052]|0;if((b|0)!=0){d=db(c[1054]|0,(b*40&-1)+16e3|0,136360)|0;c[1054]=d;uE(d+((c[1052]|0)*40&-1)|0,0,16e3);c[1052]=(c[1052]|0)+400;i=a;return}d=ut(16e3)|0;do{if((d|0)==0){gk();b=ut(16e3)|0;if((b|0)!=0){e=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163112,v)|0)}else{e=d}}while(0);c[1054]=e;c[1052]=400;uE(e|0,0,16e3);i=a;return}function dI(){var b=0,d=0,e=0;b=i;do{if((a[33512]&1)==0){if((dF(105808,0)|0)==0){break}else{d=1}i=b;return d|0}else{do{if((a[14080]&1)!=0){do{if((a[37400]&1)!=0){e=c[(c[3524]|0)+96>>2]|0;if((e&1|0)!=0){break}if((c[10030]|0)!=(c[n>>2]|0)){if((e&2|0)==0){break}}lm();if((c[(c[3524]|0)+96>>2]&2|0)==0){uf(-1,100528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{uf(-1,101160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}}while(0);if(a[13032]|0){break}e=c[(c[3524]|0)+100>>2]|0;if((e|0)==0){break}cS[e&511]();a[13032]=1}}while(0);if((dF(123048,0)|0)==0){break}else{d=1}i=b;return d|0}}while(0);a[25280]=a[37400]&1;d=(dJ()|0)!=0&1;i=b;return d|0}function dJ(){var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0;b=i;do{if((a[43472]&1)!=0){if((dK()|0)==0){break}if((dK()|0)==0){break}if((dK()|0)==0){break}if((dK()|0)==0){break}uf(-1,98448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);e=c[10036]|0;while(1){if((aM(d[e]|0|0)|0)==0){break}else{e=e+1|0}}do{if((a8(e|0,35)|0)!=0){f=jl(40144,40136)|0;c[8272]=f;g=(c[10036]|0)+(c[(c[1054]|0)+(f*40&-1)+32>>2]|0)|0;if((a[g]|0)!=35){break}a[g]=0}}while(0);g=c[10036]|0;if((e|0)==(g|0)){h=e}else{uH(g|0,e|0,uA(e|0)|0);g=uA(e|0)|0;a[(c[10036]|0)+g|0]=0;h=c[10036]|0}if((a[h]|0)==33){g=h+1|0;if((g|0)==0){j=0;i=b;return j|0}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}bN(g|0);j=0;i=b;return j|0}c[9368]=0;g=jl(40144,40136)|0;c[8272]=g;h=c[12918]|0;if((h|0)<0){uf(-1,211816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}do{if((h|0)>0){while(1){if((a[37400]&1)==0){if((a[33232]&1)==0){k=1600;break}}e=c[10036]|0;f=e+(uA(e|0)|0)|0;w=59;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;if((dF(76720,uA(c[10036]|0)|0)|0)!=0){k=1597;break}f=jl(40144,40136)|0;c[8272]=f;e=(c[10036]|0)+(c[(c[1054]|0)+(f*40&-1)+32>>2]|0)|0;if((a[e]|0)==35){a[e]=0}if((c[12918]|0)<=0){k=1601;break}}if((k|0)==1597){uf(-1,224544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1600){uf(-1,224544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1601){l=c[8272]|0;break}}else{l=g}}while(0);c[13898]=0;if((l|0)>0){m=0}else{j=0;i=b;return j|0}L2171:while(1){a[55600]=0;a[55651]=0;a[55702]=0;a[55753]=0;a[55804]=0;a[55855]=0;a[55906]=0;a[55957]=0;a[56008]=0;a[56059]=0;a[56110]=0;a[56161]=0;if((t9(m)|0)==0){l=c[13898]|0;g=c[1054]|0;h=c[g+(l*40&-1)+36>>2]|0;e=c[g+(l*40&-1)+32>>2]|0;f=(a[g+(l*40&-1)|0]&1)==0;l=(h|0)>0;g=c[10036]|0;n=53600;o=133488;L2176:while(1){L2178:do{if(!f){if(l){p=0;q=0;r=e;while(1){s=a[o+p|0]|0;if(s<<24>>24==(a[g+(p+r|0)|0]|0)){t=r;u=q}else{if(s<<24>>24!=36){break L2178}t=r-1|0;u=1}x=p+1|0;if((x|0)<(u+h|0)){p=x;q=u;r=t}else{break}}if((u|0)==0){y=x}else{z=n;break L2176}}else{y=0}r=a[o+y|0]|0;if((r<<24>>24|0)==36|(r<<24>>24|0)==0){z=n;break L2176}}}while(0);r=n+8|0;q=c[r>>2]|0;if((q|0)==0){z=r;break}else{n=r;o=q}}cS[c[z+4>>2]&511]()}else{dT()}if((c[13484]|0)!=0){k=1617;break}A=c[13898]|0;o=c[8272]|0;L2193:do{if((A|0)<(o|0)){n=c[1054]|0;h=(a[n+(A*40&-1)|0]&1)==0;if(h){k=1649;break L2171}g=c[n+(A*40&-1)+36>>2]|0;e=n+(A*40&-1)+32|0;l=c[10036]|0;f=0;while(1){if((f|0)>=(g|0)){k=1623;break}if((a[l+((c[e>>2]|0)+f|0)|0]|0)==(a[f+103664|0]|0)){f=f+1|0}else{break}}do{if((k|0)==1623){k=0;if((f|0)!=1){break}e=A+1|0;c[13898]=e;B=e;break L2193}}while(0);if(h){k=1651;break L2171}f=c[n+(A*40&-1)+36>>2]|0;e=n+(A*40&-1)+32|0;l=c[10036]|0;g=0;while(1){if((g|0)>=(f|0)){k=1630;break}if((a[l+((c[e>>2]|0)+g|0)|0]|0)==(a[g+126728|0]|0)){g=g+1|0}else{break}}do{if((k|0)==1630){k=0;if((g|0)!=1){break}c[13544]=(c[13544]|0)+1;e=A+1|0;c[13898]=e;B=e;break L2193}}while(0);if(h){k=1647;break L2171}g=c[n+(A*40&-1)+36>>2]|0;e=n+(A*40&-1)+32|0;l=c[10036]|0;f=0;while(1){if((f|0)>=(g|0)){break}if((a[l+((c[e>>2]|0)+f|0)|0]|0)==(a[f+125616|0]|0)){f=f+1|0}else{k=1650;break L2171}}if((f|0)!=1){k=1648;break L2171}e=c[13544]|0;if((e|0)==0){k=1638;break L2171}c[13544]=e-1;e=A+1|0;c[13898]=e;B=e}else{B=A}}while(0);if((B|0)<(o|0)){m=B}else{j=0;k=1646;break}}if((k|0)==1646){i=b;return j|0}else if((k|0)==1647){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1648){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1649){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1638){uf(A,103896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1617){c[13484]=0;j=1;i=b;return j|0}else if((k|0)==1650){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1651){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}return 0}function dK(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;b=i;if((a8(c[10036]|0,64)|0)==0){d=0;i=b;return d|0}e=c[10034]|0;f=ut(e)|0;do{if((f|0)==0){gk();g=ut(e)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=222744,v)|0);return 0}else{h=f}}while(0);f=c[10036]|0;e=uA(f|0)|0;g=c[10034]|0;j=e>>>0<g>>>0?e:g-1|0;uF(h|0,f|0,j|0);a[h+j|0]=0;L2237:do{if((j|0)==0|(h|0)==0){k=0;l=0}else{f=0;g=0;e=j;m=0;n=0;o=h;p=0;q=0;while(1){r=a[o]|0;if(r<<24>>24==0){k=m;l=n;break L2237}s=r<<24>>24;L2241:do{if((s|0)==64){do{if(q|p|g){t=r}else{u=o+1|0;if((bO(a[u]|0|0)|0)==0){t=a[o]|0;break}else{w=u}while(1){if((bs(a[w]|0|0)|0)==0){x=a[w]|0;if(x<<24>>24!=95){break}}w=w+1|0}a[w]=0;y=e6(u)|0;do{if((y|0)==0){z=1671}else{if((c[y+16>>2]|0)!=3){z=1671;break}A=n+1|0;B=c[y+24>>2]|0;C=m+e|0;D=C+(uA(B|0)|0)|0;if(D>>>0>(c[10034]|0)>>>0){do{dG();D=C+(uA(B|0)|0)|0;}while(D>>>0>(c[10034]|0)>>>0)}C=a[B]|0;if(C<<24>>24==0){E=A;F=m;break}else{G=m;H=B;I=C}while(1){C=H+1|0;D=G+1|0;a[(c[10036]|0)+G|0]=I;J=a[C]|0;if(J<<24>>24==0){E=A;F=D;break}else{G=D;H=C;I=J}}}}while(0);if((z|0)==1671){z=0;uh(-1,221968,(v=i,i=i+8|0,c[v>>2]=u,v)|0);E=n;F=m}a[w]=x;K=0;L=0;M=w-1|0;N=E;O=F;P=0;Q=0;break L2241}}while(0);a[(c[10036]|0)+m|0]=t;K=q;L=p;M=o;N=n;O=m+1|0;P=g;Q=0}else if((s|0)==34){a[(c[10036]|0)+m|0]=r;K=q;L=p^(f^1);M=o;N=n;O=m+1|0;P=g;Q=0}else if((s|0)==39){a[(c[10036]|0)+m|0]=r;K=q^1;L=p;M=o;N=n;O=m+1|0;P=g;Q=0}else if((s|0)==92){a[(c[10036]|0)+m|0]=r;K=q;L=p;M=o;N=n;O=m+1|0;P=g;Q=f^p}else if((s|0)==35){if(q){R=g;z=1679;break}R=g|p^1;z=1679}else{R=g;z=1679}}while(0);if((z|0)==1679){z=0;a[(c[10036]|0)+m|0]=r;K=q;L=p;M=o;N=n;O=m+1|0;P=R;Q=0}s=M+1|0;y=e-1|0;if((y|0)==0|(s|0)==0){k=O;l=N;break}else{f=Q;g=P;e=y;m=O;n=N;o=s;p=L;q=K}}}}while(0);a[(c[10036]|0)+k|0]=0;uu(h);d=l;i=b;return d|0}function dL(b){b=b|0;var d=0,e=0;d=i;if((c[8501]|0)!=0){e=c[m>>2]|0;cf(e|0,154696,(v=i,i=i+8|0,c[v>>2]=b,v)|0)}hx(0,0,b);e=c[10034]|0;if(e>>>0<((uA(b|0)|0)+1|0)>>>0){do{dG();e=c[10034]|0;}while(e>>>0<((uA(b|0)|0)+1|0)>>>0)}uB(c[10036]|0,b|0);a[25280]=0;c[13484]=dJ()|0;hy();i=d;return}function dM(b){b=b|0;var d=0,e=0;d=i;if((b|0)==0){e=0}else{e=bP(b|0)|0}dL(e);if((a[872]&1)!=0&(c[6928]|0)!=0){if((c[8501]|0)!=0){e=c[m>>2]|0;aI(196688,8,1,e|0)}dO();i=d;return}if((a[27704]&1)==0){dP();i=d;return}else{uh(-1,185416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}}function dN(){var a=0,b=0;a=i;b=c[13544]|0;if((b|0)==0){uf(c[13898]|0,103896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[13544]=b-1;c[13898]=(c[13898]|0)+1;i=a;return}}function dO(){var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;b=i;d=c[10814]|0;e=c[6928]|0;if((d|0)==0&(e|0)==2){uf(-1,87408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[10828]|0;if((f|0)==0&(e|0)==3){uf(-1,87408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((e|0)==0){uh(-1,86328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);dP();i=b;return}g=c[16507]|0;c[16506]=g;do{if((g&1|0)==0){j=+h[8257];if((a[66164]&1)==0){k=j;break}l=+_(+j);k=l/+h[8272]}else{k=8.988465674311578e+304}}while(0);h[8255]=k;m=a[66164]|0;do{if((g&2|0)==0){k=+h[8258];if((m&1)==0){n=k;break}l=+_(+k);n=l/+h[8272]}else{n=-8.988465674311578e+304}}while(0);h[8256]=n;if((m&1)==0){o=0.0}else{o=+_(+(+h[8271]))}h[8272]=o;m=c[16335]|0;c[16334]=m;do{if((m&1|0)==0){o=+h[8171];if((a[65476]&1)==0){p=o;break}n=+_(+o);p=n/+h[8186]}else{p=8.988465674311578e+304}}while(0);h[8169]=p;g=a[65476]|0;do{if((m&2|0)==0){p=+h[8172];if((g&1)==0){q=p;break}n=+_(+p);q=n/+h[8186]}else{q=-8.988465674311578e+304}}while(0);h[8170]=q;if((g&1)==0){r=0.0}else{r=+_(+(+h[8185]))}h[8186]=r;g=c[17195]|0;c[17194]=g;do{if((g&1|0)==0){r=+h[8601];if((a[68916]&1)==0){s=r;break}q=+_(+r);s=q/+h[8616]}else{s=8.988465674311578e+304}}while(0);h[8599]=s;m=a[68916]|0;do{if((g&2|0)==0){s=+h[8602];if((m&1)==0){t=s;break}q=+_(+s);t=q/+h[8616]}else{t=-8.988465674311578e+304}}while(0);h[8600]=t;if((m&1)==0){u=0.0}else{u=+_(+(+h[8615]))}h[8616]=u;m=c[17023]|0;c[17022]=m;do{if((m&1|0)==0){u=+h[8515];if((a[68228]&1)==0){w=u;break}t=+_(+u);w=t/+h[8530]}else{w=8.988465674311578e+304}}while(0);h[8513]=w;g=a[68228]|0;do{if((m&2|0)==0){w=+h[8516];if((g&1)==0){x=w;break}t=+_(+w);x=t/+h[8530]}else{x=-8.988465674311578e+304}}while(0);h[8514]=x;if((g&1)==0){y=0.0}else{y=+_(+(+h[8529]))}h[8530]=y;g=c[17539]|0;if((g&1|0)==0){y=+h[8773];if((a[70292]&1)==0){z=y}else{x=+_(+y);z=x/+h[8788]}h[8771]=z}if((g&2|0)==0){z=+h[8774];if((a[70292]&1)==0){A=z}else{x=+_(+z);A=x/+h[8788]}h[8772]=A}g=c[17367]|0;if((g&1|0)==0){A=+h[8687];if((a[69604]&1)==0){B=A}else{x=+_(+A);B=x/+h[8702]}h[8685]=B}if((g&2|0)==0){B=+h[8688];if((a[69604]&1)==0){C=B}else{x=+_(+B);C=x/+h[8702]}h[8686]=C}g=c[16163]|0;if((g&1|0)==0){C=+h[8085];if((a[64788]&1)==0){D=C}else{x=+_(+C);D=x/+h[8100]}h[8083]=D}if((g&2|0)==0){D=+h[8086];if((a[64788]&1)==0){E=D}else{x=+_(+D);E=x/+h[8100]}h[8084]=E}g=c[16679]|0;if((g&1|0)==0){E=+h[8343];if((a[66852]&1)==0){F=E}else{x=+_(+E);F=x/+h[8358]}h[8341]=F}if((g&2|0)==0){F=+h[8344];if((a[66852]&1)==0){G=F}else{x=+_(+F);G=x/+h[8358]}h[8342]=G}if((e|0)==2){iU(d,c[6930]|0)}else if((e|0)==3){i$(f,c[6930]|0)}if((c[16508]&2|0)!=0){G=+h[8256];h[8256]=+h[8255];h[8255]=G}if((c[16336]&2|0)!=0){G=+h[8170];h[8170]=+h[8169];h[8169]=G}if((c[17196]&2|0)!=0){G=+h[8600];h[8600]=+h[8599];h[8599]=G}if((c[17024]&2|0)!=0){G=+h[8514];h[8514]=+h[8513];h[8513]=G}f=c[6928]|0;if((f|0)==2){fS(c[10814]|0,c[6930]|0);i=b;return}else if((f|0)==3){fv(c[10828]|0,c[6930]|0,0);i=b;return}else{uf(-1,85504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function dP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;b=i;d=c[13898]|0;e=c[8272]|0;f=(e|0)>(d|0);L2430:do{if(f){g=c[1054]|0;if((a[g+(d*40&-1)|0]&1)!=0){h=c[g+(d*40&-1)+36>>2]|0;j=g+(d*40&-1)+32|0;g=c[10036]|0;k=0;while(1){if((k|0)>=(h|0)){l=1801;break}if((a[g+((c[j>>2]|0)+k|0)|0]|0)==(a[k+78280|0]|0)){k=k+1|0}else{break}}do{if((l|0)==1801){if((k|0)!=1){break}uf(d,77152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(!f){l=1804;break}}k=c[1054]|0;L2442:do{if((a[k+(d*40&-1)|0]&1)==0){m=k+(d*40&-1)+32|0}else{j=c[k+(d*40&-1)+36>>2]|0;g=k+(d*40&-1)+32|0;h=c[10036]|0;n=0;while(1){if((n|0)>=(j|0)){break}if((a[h+((c[g>>2]|0)+n|0)|0]|0)==(a[n+103664|0]|0)){n=n+1|0}else{m=g;break L2442}}if((n|0)==1){o=k;p=h;l=1811;break L2430}else{m=g}}}while(0);j=e-1|0;q=uA(c[6924]|0)|0;r=c[k+(j*40&-1)+32>>2]|0;s=c[k+(j*40&-1)+36>>2]|0;j=c[m>>2]|0;t=(((q+3|0)+r|0)+s|0)-j|0;q=s+r|0;r=db(0,(q+1|0)-j|0,116456)|0;j=c[(c[1054]|0)+(d*40&-1)+32>>2]|0;L2450:do{if((j|0)<(q|0)){s=j;u=r;while(1){w=a[(c[10036]|0)+s|0]|0;if(w<<24>>24==0){x=u;break L2450}y=u+1|0;a[u]=w;w=s+1|0;if((w|0)<(q|0)){s=w;u=y}else{x=y;break}}}else{x=r}}while(0);a[x]=0;if((c[10034]|0)>>>0<t>>>0){do{dG();}while((c[10034]|0)>>>0<t>>>0)}t=c[10036]|0;q=c[6924]|0;uB(t|0,q|0);q=c[10036]|0;t=q+(uA(q|0)|0)|0;a[t]=a[86120]|0;a[t+1|0]=a[86121|0]|0;a[t+2|0]=a[86122|0]|0;t=c[10036]|0;uC(t|0,r|0);uu(r)}else{l=1804}}while(0);if((l|0)==1804){o=c[1054]|0;p=c[10036]|0;l=1811}if((l|0)==1811){l=p+(c[o+(d*40&-1)+32>>2]|0)|0;d=uA(c[6924]|0)|0;o=uA(l|0)|0;x=o+1|0;uH(p|0,l|0,x|0);l=(d+1|0)+o|0;if((c[10034]|0)>>>0<l>>>0){do{dG();}while((c[10034]|0)>>>0<l>>>0)}l=c[10036]|0;uH(l+d|0,l|0,x|0);uD(c[10036]|0,c[6924]|0,d)}c[7738]=0;c[6928]=0;a[25280]=0;c[8272]=jl(40144,40136)|0;c[13898]=1;if((a[37384]&1)==0){iS();i=b;return}else{iZ();i=b;return}}function dQ(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+56|0;d=b|0;e=d|0;f=(c[13898]|0)+1|0;c[13898]=f;g=c[8272]|0;if((f|0)>=(g|0)){i=b;return}h=d|0;j=f;f=g;L2477:while(1){g=c[1054]|0;k=c[g+(j*40&-1)+36>>2]|0;L2479:do{if((a[g+(j*40&-1)|0]&1)==0){l=c[10036]|0;m=g+(j*40&-1)+32|0}else{n=g+(j*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(k|0)){break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{l=o;m=n;break L2479}}if((p|0)==1){q=1848;break L2477}else{l=o;m=n}}}while(0);uD(e|0,l+(c[m>>2]|0)|0,(k|0)<49?k:49);a[d+((k|0)>49?49:k)|0]=0;r=j+1|0;L2487:do{if((f|0)>(r|0)){if((a[g+(r*40&-1)|0]&1)==0){s=0;t=j;break}u=c[g+(r*40&-1)+36>>2]|0;v=g+(r*40&-1)+32|0;w=0;while(1){if((w|0)>=(u|0)){break}if((a[l+((c[v>>2]|0)+w|0)|0]|0)==(a[w+134808|0]|0)){w=w+1|0}else{s=0;t=j;break L2487}}if((w|0)!=1){s=0;t=j;break}c[13898]=r;s=1;t=r}else{s=0;t=j}}while(0);do{if((a_(h|0,167320,6)|0)==0){x=t;y=f}else{if((a_(h|0,126208,6)|0)==0){x=t;y=f;break}e2(h,s);x=c[13898]|0;y=c[8272]|0}}while(0);r=x+1|0;c[13898]=r;if((r|0)<(y|0)){j=r;f=y}else{q=1847;break}}if((q|0)==1847){i=b;return}else if((q|0)==1848){i=b;return}}function dR(){dU(0);return}function dS(){dU(1);return}function dT(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+696|0;d=b|0;e=b+56|0;f=b+80|0;g=c[13898]|0;h=g+1|0;j=c[8272]|0;k=c[1054]|0;L2506:do{if((j|0)>(h|0)){if((a[k+(h*40&-1)|0]&1)==0){break}l=c[k+(h*40&-1)+36>>2]|0;m=k+(h*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+199040|0]|0)){o=o+1|0}else{break L2506}}if((o|0)!=1){break}uD(f|0,55600,612);m=0;l=g;L2514:while(1){p=l+2|0;c[13898]=p;q=c[k+(p*40&-1)+36>>2]|0;r=(q|0)>49?49:q;q=c[k+(p*40&-1)+32>>2]|0;s=0;while(1){t=s+1|0;a[55600+(m*51&-1)+s|0]=a[n+q|0]|0;if((t|0)==(r|0)){break}else{q=q+1|0;s=t}}u=m+1|0;a[55600+(m*51&-1)+r|0]=0;w=l+3|0;x=(j|0)>(w|0);if(!x){break}if((a[k+(w*40&-1)|0]&1)==0){y=1867;break}s=c[k+(w*40&-1)+36>>2]|0;q=k+(w*40&-1)+32|0;t=0;while(1){if((t|0)>=(s|0)){break}if((a[n+((c[q>>2]|0)+t|0)|0]|0)==(a[t+148464|0]|0)){t=t+1|0}else{y=1866;break L2514}}if((t|0)==1&(u|0)<12){m=u;l=p}else{y=1866;break}}if((y|0)==1866){if(x){y=1867}}L2527:do{if((y|0)==1867){if((a[k+(w*40&-1)|0]&1)==0){break}m=c[k+(w*40&-1)+36>>2]|0;o=k+(w*40&-1)+32|0;q=0;while(1){if((q|0)>=(m|0)){break}if((a[n+((c[o>>2]|0)+q|0)|0]|0)==(a[q+148464|0]|0)){q=q+1|0}else{break L2527}}if((q|0)!=1){break}uf(l+4|0,172072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);o=l+5|0;c[13898]=o;if((o|0)>=(j|0)){uf(o,168144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L2539:do{if((a[k+(o*40&-1)|0]&1)!=0){m=c[k+(o*40&-1)+36>>2]|0;p=k+(o*40&-1)+32|0;t=0;while(1){if((t|0)>=(m|0)){break}if((a[n+((c[p>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L2539}}if((t|0)!=1){break}uf(o,168144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);o=iv(g)|0;c[11670]=o;c[o+16>>2]=u;it();n=c[18070]|0;l=db(n,c[n>>2]<<5|8,105624)|0;c[18070]=0;if((l|0)==0){uf(g,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=o+8|0;p=c[n>>2]|0;if((p|0)!=0){e1(p)}c[n>>2]=l;uD(55600,f|0,612);l=o+12|0;n=(c[13898]|0)-1|0;p=c[1054]|0;m=(c[p+(n*40&-1)+36>>2]|0)+(c[p+(n*40&-1)+32>>2]|0)|0;n=db(c[l>>2]|0,(m+1|0)-(c[p+(g*40&-1)+32>>2]|0)|0,116456)|0;c[l>>2]=n;p=c[(c[1054]|0)+(g*40&-1)+32>>2]|0;L2553:do{if((p|0)<(m|0)){q=p;s=n;while(1){r=a[(c[10036]|0)+q|0]|0;if(r<<24>>24==0){z=s;break L2553}A=s+1|0;a[s]=r;r=q+1|0;if((r|0)<(m|0)){q=r;s=A}else{z=A;break}}}else{z=n}}while(0);a[z]=0;c[11670]=0;n=o+4|0;m=(uA(c[n>>2]|0)|0)+8|0;p=ut(m)|0;do{if((p|0)==0){gk();s=ut(m)|0;if((s|0)!=0){B=s;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=154560,v)|0)}else{B=p}}while(0);a[B]=a[151320]|0;a[B+1|0]=a[151321|0]|0;a[B+2|0]=a[151322|0]|0;a[B+3|0]=a[151323|0]|0;a[B+4|0]=a[151324|0]|0;a[B+5|0]=a[151325|0]|0;a[B+6|0]=a[151326|0]|0;uC(B|0,c[n>>2]|0);p=c[l>>2]|0;m=e6(B)|0;L2562:do{if((m|0)!=0){o=m+8|0;do{if((a[o]&1)==0){s=c[m+24>>2]|0;if((aY(s|0,p|0)|0)==0){break L2562}q=m+16|0;if((c[q>>2]|0)!=3){break}uu(s);c[q>>2]=1}else{a[o]=0}}while(0);if((p|0)==0){C=0}else{C=bP(p|0)|0}c[m+16>>2]=3;c[m+24>>2]=C}}while(0);uu(B);i=b;return}}while(0);B=c[10036]|0;C=k+(g*40&-1)+32|0;z=B+(c[C>>2]|0)|0;if((a_(z|0,167320,6)|0)==0){uf(g,145392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a_(z|0,126208,6)|0)==0){uf(g,145392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=g+2;z=d|0;f=c[k+(g*40&-1)+36>>2]|0;g=(f|0)>49?49:f;f=c[C>>2]|0;C=0;while(1){k=C+1|0;a[d+C|0]=a[B+f|0]|0;if((k|0)==(g|0)){break}else{f=f+1|0;C=k}}a[d+g|0]=0;g=e6(z)|0;is(e);z=g+8|0;do{if((a[z]&1)==0){d=g+16|0;if((c[d>>2]|0)!=3){break}uu(c[g+24>>2]|0);c[d>>2]=1}}while(0);d=g+16|0;g=e;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[d+16>>2]=c[g+16>>2];c[d+20>>2]=c[g+20>>2];a[z]=0;i=b;return}function dU(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+24|0;e=d|0;f=c[13898]|0;g=f+1|0;c[13898]=g;h=c[8272]|0;if((g|0)>=(h|0)){i=d;return}j=c[1054]|0;k=(a[j+(g*40&-1)|0]&1)==0;L2594:do{if(k){l=g}else{m=c[j+(g*40&-1)+36>>2]|0;n=j+(g*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(m|0)){q=1921;break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}do{if((q|0)==1921){if((p|0)!=1){break}i=d;return}}while(0);if(k){l=g;break}p=c[j+(g*40&-1)+36>>2]|0;n=j+(g*40&-1)+32|0;o=c[10036]|0;m=0;while(1){if((m|0)>=(p|0)){q=1926;break}if((a[o+((c[n>>2]|0)+m|0)|0]|0)==(a[m+202112|0]|0)){m=m+1|0}else{q=1927;break}}if((q|0)==1926){if((m|0)!=1){q=1927}}if((q|0)==1927){if(k){l=g;break}n=c[j+(g*40&-1)+36>>2]|0;o=j+(g*40&-1)+32|0;p=c[10036]|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+r|0)|0]|0)==(a[r+129568|0]|0)){r=r+1|0}else{l=g;break L2594}}if((r|0)!=1){l=g;break}}o=f+2|0;c[13898]=o;l=o}}while(0);L2618:do{if((l|0)<(h|0)){f=(a[j+(l*40&-1)|0]&1)==0;do{if(!f){g=c[j+(l*40&-1)+36>>2]|0;k=j+(l*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(g|0)){q=1938;break}if((a[o+((c[k>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{q=1939;break}}if((q|0)==1938){if((p|0)==1|f^1){break L2618}else{break}}else if((q|0)==1939){if(f){break}else{break L2618}}}}while(0);f=is(e)|0;r=c[f>>2]|0;if((r|0)==3){k=c[f+8>>2]|0;uz(k,0)}else if(!((r|0)==1|(r|0)==2)){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=e|0;if((c[r>>2]|0)==3){uu(c[e+8>>2]|0);c[r>>2]=1}c[13898]=(c[13898]|0)+1;i=d;return}}while(0);if((b|0)==0){uf(l,136616,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(l,138312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function dV(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;b=i;d=c[13898]|0;e=d+1|0;c[13898]=e;f=c[8272]|0;g=(e|0)<(f|0);L2642:do{if(g){h=c[1054]|0;j=(a[h+(e*40&-1)|0]&1)==0;if(!j){k=c[h+(e*40&-1)+36>>2]|0;l=h+(e*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){p=1958;break}if((a[n+((c[l>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{p=1959;break}}if((p|0)==1959){if(!j){p=1960}}else if((p|0)==1958){if(!((o|0)==1|j)){p=1960}}L2652:do{if((p|0)==1960){l=c[h+(e*40&-1)+36>>2]|0;n=h+(e*40&-1)+32|0;k=c[10036]|0;q=0;while(1){if((q|0)>=(l|0)){break}if((a[k+((c[n>>2]|0)+q|0)|0]|0)==(a[q+124624|0]|0)){q=q+1|0}else{break L2652}}if((q|0)!=1){break}n=c[14128]|0;if((n|0)==0){r=e}else{k=n;while(1){n=k+12|0;l=c[n>>2]|0;if((l|0)!=0){uu(l);c[n>>2]=0}n=c[k+24>>2]|0;uu(k);if((n|0)==0){break}else{k=n}}r=c[13898]|0}c[14128]=0;c[13898]=r+1;i=b;return}}while(0);if(!g){s=0;t=e;break}}h=c[1054]|0;j=(a[h+(e*40&-1)|0]&1)==0;if(j){s=0;t=e;break}o=c[h+(e*40&-1)+36>>2]|0;k=h+(e*40&-1)+32|0;h=c[10036]|0;q=0;while(1){if((q|0)>=(o|0)){p=1975;break}if((a[h+((c[k>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}if((p|0)==1975){if((q|0)==1){s=0;t=e;break}}if(!((o|0)>0&(j^1))){s=0;t=e;break}h=c[10036]|0;n=0;l=0;u=c[k>>2]|0;while(1){if((a[n+133296|0]|0)==(a[h+(n+u|0)|0]|0)){w=u;x=l}else{if((n|0)!=3){s=0;t=e;break L2642}w=u-1|0;x=1}y=n+1|0;if((y|0)<(x+o|0)){n=y;l=x;u=w}else{break}}if((x|0)==0){if(!((n|0)==2|(n|0)==10)){s=0;t=e;break}}u=d+2|0;c[13898]=u;s=1;t=u}else{s=0;t=e}}while(0);L2689:do{if((t|0)<(f|0)){e=c[1054]|0;L2691:do{if((a[e+(t*40&-1)|0]&1)==0){z=c[10036]|0;A=e+(t*40&-1)+32|0}else{d=c[e+(t*40&-1)+36>>2]|0;x=e+(t*40&-1)+32|0;w=c[10036]|0;g=0;while(1){if((g|0)>=(d|0)){break}if((a[w+((c[x>>2]|0)+g|0)|0]|0)==(a[g+103664|0]|0)){g=g+1|0}else{z=w;A=x;break L2691}}if((g|0)==1){B=0;C=t;D=f;break L2689}else{z=w;A=x}}}while(0);e=z+(c[A>>2]|0)|0;n=e;d=(a8(e|0,32)|0)-n|0;do{if((d|0)<0){r=(a8(e|0,0)|0)-n|0;if((r|0)>=0){E=r;break}r=c[m>>2]|0;cf(r|0,131904,(v=i,i=i+16|0,c[v>>2]=130592,c[v+8>>2]=754,v)|0);i=b;return}else{E=d}}while(0);d=E+1|0;n=ut(d)|0;do{if((n|0)==0){gk();e=ut(d)|0;if((e|0)!=0){F=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129544,v)|0)}else{F=n}}while(0);n=c[13898]|0;d=c[1054]|0;e=a[d+(n*40&-1)|0]|0;do{if((e&1)==0){p=2e3}else{r=c[d+(n*40&-1)+32>>2]|0;u=c[10036]|0;l=a[u+r|0]|0;if(!((l<<24>>24|0)==39|(l<<24>>24|0)==34)){p=2e3;break}l=(c[d+(n*40&-1)+36>>2]|0)-2|0;L2711:do{if((l|0)>0){o=r;h=0;k=u;while(1){j=o+1|0;q=h+1|0;a[F+h|0]=a[k+j|0]|0;if((q|0)==(l|0)){G=l;break L2711}o=j;h=q;k=c[10036]|0}}else{G=0}}while(0);a[F+G|0]=0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(n*40&-1)+32>>2]|0)|0]|0)==34){ua(F);break}else{H=F;I=F}while(1){l=a[I]|0;if((l<<24>>24|0)==0){break}else if((l<<24>>24|0)==39){u=I+1|0;r=(a[u]|0)==39?u:I;J=r;K=a[r]|0}else{J=I;K=l}a[H]=K;H=H+1|0;I=J+1|0}a[H]=0}}while(0);L2724:do{if((p|0)==2e3){if((n|0)<(c[8272]|0)){L=F;M=n;N=d;O=e}else{break}while(1){l=c[N+(M*40&-1)+36>>2]|0;r=N+(M*40&-1)+32|0;L2728:do{if((O&1)!=0){u=c[10036]|0;x=0;while(1){if((x|0)>=(l|0)){break}if((a[u+((c[r>>2]|0)+x|0)|0]|0)==(a[x+103664|0]|0)){x=x+1|0}else{break L2728}}if((x|0)==1){break L2724}}}while(0);u=c[r>>2]|0;w=0;while(1){g=w+1|0;a[L+w|0]=a[(c[10036]|0)+u|0]|0;if((g|0)==(l|0)){break}u=u+1|0;w=g}a[L+l|0]=0;w=c[13898]|0;u=c[1054]|0;r=c[u+(w*40&-1)+36>>2]|0;g=a[(c[10036]|0)+((c[u+(w*40&-1)+32>>2]|0)+r|0)|0]|0;if((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==0){break L2724}g=w+1|0;c[13898]=g;if((g|0)>=(c[8272]|0)){break L2724}L=L+r|0;M=g;N=u;O=a[u+(g*40&-1)|0]|0}}}while(0);e=(c[13898]|0)+1|0;c[13898]=e;B=F;C=e;D=c[8272]|0}else{B=0;C=t;D=f}}while(0);L2743:do{if((C|0)<(D|0)){f=c[1054]|0;L2745:do{if((a[f+(C*40&-1)|0]&1)==0){P=c[10036]|0}else{t=c[f+(C*40&-1)+36>>2]|0;F=f+(C*40&-1)+32|0;O=c[10036]|0;N=0;while(1){if((N|0)>=(t|0)){break}if((a[O+((c[F>>2]|0)+N|0)|0]|0)==(a[N+103664|0]|0)){N=N+1|0}else{P=O;break L2745}}if((N|0)==1){Q=0;break L2743}else{P=O}}}while(0);f=(uA(P|0)|0)+1|0;F=ut(f)|0;do{if((F|0)==0){gk();t=ut(f)|0;if((t|0)!=0){R=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=128272,v)|0)}else{R=F}}while(0);F=c[13898]|0;f=c[1054]|0;t=a[f+(F*40&-1)|0]|0;do{if((t&1)!=0){M=c[f+(F*40&-1)+32>>2]|0;L=c[10036]|0;p=a[L+M|0]|0;if(!((p<<24>>24|0)==39|(p<<24>>24|0)==34)){break}p=(c[f+(F*40&-1)+36>>2]|0)-2|0;L2760:do{if((p|0)>0){H=M;J=0;I=L;while(1){K=H+1|0;G=J+1|0;a[R+J|0]=a[I+K|0]|0;if((G|0)==(p|0)){S=p;break L2760}H=K;J=G;I=c[10036]|0}}else{S=0}}while(0);a[R+S|0]=0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(F*40&-1)+32>>2]|0)|0]|0)==34){ua(R)}else{p=R;L=R;while(1){M=a[L]|0;if((M<<24>>24|0)==39){O=L+1|0;N=(a[O]|0)==39?O:L;T=N;U=a[N]|0}else if((M<<24>>24|0)==0){break}else{T=L;U=M}a[p]=U;p=p+1|0;L=T+1|0}a[p]=0}c[13898]=(c[13898]|0)+1;Q=R;break L2743}}while(0);if((F|0)<(c[8272]|0)){V=R;W=F;X=f;Y=t}else{Q=R;break}while(1){L=c[X+(W*40&-1)+36>>2]|0;M=X+(W*40&-1)+32|0;L2777:do{if((Y&1)!=0){N=c[10036]|0;O=0;while(1){if((O|0)>=(L|0)){break}if((a[N+((c[M>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L2777}}if((O|0)==1){Q=R;break L2743}}}while(0);p=c[M>>2]|0;N=0;while(1){I=N+1|0;a[V+N|0]=a[(c[10036]|0)+p|0]|0;if((I|0)==(L|0)){break}p=p+1|0;N=I}a[V+L|0]=0;N=c[13898]|0;p=c[1054]|0;M=c[p+(N*40&-1)+36>>2]|0;I=V+M|0;J=a[(c[10036]|0)+((c[p+(N*40&-1)+32>>2]|0)+M|0)|0]|0;if((J<<24>>24|0)==32|(J<<24>>24|0)==9|(J<<24>>24|0)==0){J=V+(M+1|0)|0;a[I]=32;a[J]=0;Z=J;_=c[13898]|0}else{Z=I;_=N}N=_+1|0;c[13898]=N;if((N|0)>=(c[8272]|0)){Q=R;break L2743}I=c[1054]|0;V=Z;W=N;X=I;Y=a[I+(N*40&-1)|0]|0}}else{Q=0}}while(0);hR(B,Q,s);i=b;return}function dW(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b|0;e=b+24|0;c[e>>2]=0;f=(c[13898]|0)+1|0;c[13898]=f;L2795:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L2797:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L2797}}if((l|0)==1){break L2795}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=f;break}g=c[d+8>>2]|0;c[e>>2]=g;if((g|0)!=0){iQ(e);g=c[e>>2]|0;hw(hA(g,193632)|0,g,1);i=b;return}m=c[13898]|0;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[e>>2]=0;m=f;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dX(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b|0;e=b+24|0;c[e>>2]=0;f=(c[13898]|0)+1|0;c[13898]=f;L2814:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L2816:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L2816}}if((l|0)==1){break L2814}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=f;break}g=c[d+8>>2]|0;c[e>>2]=g;if((g|0)==0){m=c[13898]|0;uf(m,124592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}iQ(e);g=c[e>>2]|0;if((bY(g|0)|0)==0){e7(5);uu(g);i=b;return}else{uf(c[13898]|0,123232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=0;m=f;uf(m,124592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dY(){var b=0,d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0;if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);b=c[3524]|0;if((c[b+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;d=b+8|0;c[13881]=(c[d>>2]|0)-1;c[13882]=0;e=b+12|0;c[13883]=(c[e>>2]|0)-1;if((a[33512]&1)==0){lh();a[25280]=0;f=c[13898]|0;h=f+1|0;c[13898]=h;return}i=c[b+108>>2]|0;if((i|0)==0){lh();a[25280]=0;f=c[13898]|0;h=f+1|0;c[13898]=h;return}j=+((c[d>>2]|0)>>>0>>>0);k=+((c[e>>2]|0)>>>0>>>0);cI[i&63](0,~~(+g[184]*j),~~(+g[44]*k),~~(j*+g[178]),~~(k*+g[38]));lh();a[25280]=0;f=c[13898]|0;h=f+1|0;c[13898]=h;return}function dZ(){var a=0;a=i;c[13898]=(c[13898]|0)+1;uh(-1,116984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=a;return}function d_(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+24|0;d=b|0;e=(c[13898]|0)+1|0;c[13898]=e;L2860:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L2862:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;h=f+(e*40&-1)+32|0;j=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[j+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L2862}}if((k|0)==1){l=e;break L2860}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=e;l=e;break}f=c[d+8>>2]|0;if((f|0)==0){l=c[13898]|0;break}else{dL(f);i=b;return}}else{l=e}}while(0);uf(l,122e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function d$(){var b=0,d=0,e=0,f=0,g=0;b=(c[13898]|0)+1|0;if((c[8272]|0)<=(b|0)){c[13484]=1;return}d=c[1054]|0;if((a[d+(b*40&-1)|0]&1)==0){c[13484]=1;return}e=c[d+(b*40&-1)+36>>2]|0;f=d+(b*40&-1)+32|0;b=c[10036]|0;d=0;while(1){if((d|0)>=(e|0)){break}if((a[b+((c[f>>2]|0)+d|0)|0]|0)==(a[d+78208|0]|0)){d=d+1|0}else{g=2133;break}}if((g|0)==2133){c[13484]=1;return}if((d|0)==7){bd(0)}else{c[13484]=1;return}}function d0(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;b=i;i=i+24|0;d=b|0;e=(c[13898]|0)+1|0;c[13898]=e;if((c[8272]|0)<=(e|0)){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[1054]|0;if((a[f+(e*40&-1)|0]&1)==0){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[f+(e*40&-1)+36>>2]|0;j=f+(e*40&-1)+32|0;f=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[f+((c[j>>2]|0)+k|0)|0]|0)==(a[k+199040|0]|0)){k=k+1|0}else{l=2234;break}}if((l|0)==2234){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((k|0)!=1){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=is(d)|0;k=c[e>>2]|0;if((k|0)==1){m=+(c[e+8>>2]|0)}else if((k|0)==3){m=+uz(c[e+8>>2]|0,0)}else if((k|0)==2){m=+h[e+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d|0;if((c[e>>2]|0)==3){uu(c[d+8>>2]|0);c[e>>2]=1}e=c[13898]|0;d=c[8272]|0;k=(d|0)>(e|0);L2917:do{if(k){j=c[1054]|0;if((a[j+(e*40&-1)|0]&1)==0){break}f=c[j+(e*40&-1)+36>>2]|0;g=j+(e*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(f|0)){break}if((a[n+((c[g>>2]|0)+o|0)|0]|0)==(a[o+126728|0]|0)){o=o+1|0}else{break L2917}}if((o|0)!=1){break}f=c[g>>2]|0;p=e+1|0;c[13898]=p;q=1;r=p;while(1){if((r|0)>=(d|0)){l=2159;break}L2928:do{if((a[j+(r*40&-1)|0]&1)==0){l=2166}else{p=c[j+(r*40&-1)+36>>2]|0;s=j+(r*40&-1)+32|0;t=0;while(1){if((t|0)>=(p|0)){break}if((a[n+((c[s>>2]|0)+t|0)|0]|0)==(a[t+126728|0]|0)){t=t+1|0}else{l=2166;break L2928}}if((t|0)!=1){l=2166;break}u=q+1|0}}while(0);if((l|0)==2166){l=0;L2937:do{if((a[j+(r*40&-1)|0]&1)==0){w=0}else{s=c[j+(r*40&-1)+36>>2]|0;p=j+(r*40&-1)+32|0;x=0;while(1){if((x|0)>=(s|0)){break}if((a[n+((c[p>>2]|0)+x|0)|0]|0)==(a[x+125616|0]|0)){x=x+1|0}else{w=0;break L2937}}w=((x|0)==1)<<31>>31}}while(0);u=w+q|0}p=r+1|0;if((u|0)==0){y=p;break}else{q=u;r=p}}if((l|0)==2159){y=r+1|0}q=c[j+(r*40&-1)+32>>2]|0;c[13898]=y;L2948:do{if((d|0)>(y|0)){if((a[j+(y*40&-1)|0]&1)==0){z=0;A=0;B=y;break}g=c[j+(y*40&-1)+36>>2]|0;o=j+(y*40&-1)+32|0;p=0;while(1){if((p|0)>=(g|0)){break}if((a[n+((c[o>>2]|0)+p|0)|0]|0)==(a[p+200904|0]|0)){p=p+1|0}else{z=0;A=0;B=y;break L2948}}if((p|0)!=4){z=0;A=0;B=y;break}o=y+1|0;c[13898]=o;if((d|0)<=(o|0)){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[j+(o*40&-1)|0]&1)==0){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[j+(o*40&-1)+36>>2]|0;s=j+(o*40&-1)+32|0;t=0;while(1){if((t|0)>=(g|0)){break}if((a[n+((c[s>>2]|0)+t|0)|0]|0)==(a[t+126728|0]|0)){t=t+1|0}else{l=2242;break}}if((l|0)==2242){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)!=1){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[s>>2]|0;p=y+2|0;c[13898]=p;C=1;D=p;while(1){if((D|0)>=(d|0)){l=2188;break}L2974:do{if((a[j+(D*40&-1)|0]&1)==0){l=2195}else{p=c[j+(D*40&-1)+36>>2]|0;E=j+(D*40&-1)+32|0;F=0;while(1){if((F|0)>=(p|0)){break}if((a[n+((c[E>>2]|0)+F|0)|0]|0)==(a[F+126728|0]|0)){F=F+1|0}else{l=2195;break L2974}}if((F|0)!=1){l=2195;break}G=C+1|0}}while(0);if((l|0)==2195){l=0;L2983:do{if((a[j+(D*40&-1)|0]&1)==0){H=0}else{x=c[j+(D*40&-1)+36>>2]|0;E=j+(D*40&-1)+32|0;p=0;while(1){if((p|0)>=(x|0)){break}if((a[n+((c[E>>2]|0)+p|0)|0]|0)==(a[p+125616|0]|0)){p=p+1|0}else{H=0;break L2983}}H=((p|0)==1)<<31>>31}}while(0);G=H+C|0}E=D+1|0;if((G|0)==0){I=E;break}else{C=G;D=E}}if((l|0)==2188){I=D+1|0}C=c[j+(D*40&-1)+32>>2]|0;c[13898]=I;z=C;A=g;B=I}else{z=0;A=0;B=y}}while(0);j=m!=0.0;n=j?f:A;a[37480]=j&1;r=(A|0)==0;a[37464]=r&1;c[13544]=(c[13544]|0)+1;if(j|r^1){r=(j?q:z)-n|0;j=ut(r)|0;do{if((j|0)==0){gk();C=ut(r)|0;if((C|0)!=0){J=C;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{J=j}}while(0);uD(J|0,(c[10036]|0)+(n+1|0)|0,r);a[J+(r-1|0)|0]=0;dL(J);K=c[13898]|0}else{K=B}c[13898]=K-1;i=b;return}}while(0);if((c[13544]|0)>0){uf(e,107896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9368]=(c[9368]|0)+1;if(m!=0.0){K=d-1|0;B=c[1054]|0;J=(c[B+(K*40&-1)+36>>2]|0)+(c[B+(K*40&-1)+32>>2]|0)|0;K=e-1|0;c[13898]=K;c[B+(K*40&-1)+36>>2]=1;K=J+2|0;c[(c[1054]|0)+((c[13898]|0)*40&-1)+32>>2]=K;a[(c[10036]|0)+K|0]=59;a[(c[10036]|0)+(J+3|0)|0]=0;a[37480]=1;i=b;return}L3011:do{if(k){J=e;L3012:while(1){L3014:do{if((J|0)<(d|0)){K=c[1054]|0;B=J;while(1){L3018:do{if((a[K+(B*40&-1)|0]&1)==0){l=2221}else{z=c[K+(B*40&-1)+36>>2]|0;A=K+(B*40&-1)+32|0;y=c[10036]|0;I=0;while(1){if((I|0)>=(z|0)){break}if((a[y+((c[A>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{l=2221;break L3018}}A=B+1|0;c[13898]=A;if((I|0)==1){L=A;break L3014}else{M=A}}}while(0);if((l|0)==2221){l=0;p=B+1|0;c[13898]=p;M=p}if((M|0)<(d|0)){B=M}else{N=M;l=2216;break}}}else{N=J;l=2216}}while(0);if((l|0)==2216){l=0;g=N+1|0;c[13898]=g;L=g}L3030:do{if((d|0)>(L|0)){g=c[1054]|0;if((a[g+(L*40&-1)|0]&1)==0){break}D=c[g+(L*40&-1)+36>>2]|0;B=g+(L*40&-1)+32|0;g=c[10036]|0;K=0;while(1){if((K|0)>=(D|0)){break}if((a[g+((c[B>>2]|0)+K|0)|0]|0)==(a[K+200904|0]|0)){K=K+1|0}else{break L3030}}if((K|0)==4){break L3012}}}while(0);if((L|0)<(d|0)){J=L}else{break L3011}}a[37480]=0;c[13898]=L-1;i=b;return}}while(0);c[8272]=0;c[13898]=0;i=b;return}function d1(){return}function d2(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;b=i;d=c[13898]|0;e=d+1|0;f=c[8272]|0;L3044:do{if((f|0)>(e|0)){g=c[1054]|0;if((a[g+(e*40&-1)|0]&1)==0){break}h=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+126728|0]|0)){l=l+1|0}else{break L3044}}if((l|0)!=1){break}if((a[37464]&1)==0){uf(d,106968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[37464]=0;c[13898]=e;h=c[j>>2]|0;m=d+2|0;c[13898]=m;n=1;o=m;while(1){if((o|0)>=(f|0)){p=2256;break}L3058:do{if((a[g+(o*40&-1)|0]&1)==0){p=2263}else{m=c[g+(o*40&-1)+36>>2]|0;q=g+(o*40&-1)+32|0;r=0;while(1){if((r|0)>=(m|0)){break}if((a[k+((c[q>>2]|0)+r|0)|0]|0)==(a[r+126728|0]|0)){r=r+1|0}else{p=2263;break L3058}}if((r|0)!=1){p=2263;break}s=n+1|0}}while(0);if((p|0)==2263){p=0;L3067:do{if((a[g+(o*40&-1)|0]&1)==0){t=0}else{q=c[g+(o*40&-1)+36>>2]|0;m=g+(o*40&-1)+32|0;u=0;while(1){if((u|0)>=(q|0)){break}if((a[k+((c[m>>2]|0)+u|0)|0]|0)==(a[u+125616|0]|0)){u=u+1|0}else{t=0;break L3067}}t=((u|0)==1)<<31>>31}}while(0);s=t+n|0}m=o+1|0;if((s|0)==0){w=m;break}else{n=s;o=m}}if((p|0)==2256){w=o+1|0}n=c[g+(o*40&-1)+32>>2]|0;c[13898]=w-1;c[13544]=(c[13544]|0)+1;if((a[37480]&1)!=0){i=b;return}k=n-h|0;n=ut(k)|0;do{if((n|0)==0){gk();j=ut(k)|0;if((j|0)!=0){x=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{x=n}}while(0);uD(x|0,(c[10036]|0)+(h+1|0)|0,k);a[x+(k-1|0)|0]=0;dL(x);i=b;return}}while(0);x=c[9368]|0;if((x|0)<1){uf(d,106008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9368]=x-1;if((a[37480]&1)==0){x=c[1054]|0;w=c[x+(d*40&-1)+32>>2]|0;c[x+(d*40&-1)+36>>2]=1;a[(c[10036]|0)+w|0]=59;a[(c[10036]|0)+(w+1|0)|0]=32;a[(c[10036]|0)+(w+2|0)|0]=32;a[(c[10036]|0)+(w+3|0)|0]=32;a[37480]=1;i=b;return}else{c[8272]=0;c[13898]=0;i=b;return}}function d3(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0;b=i;c[13898]=(c[13898]|0)+1;d=iw()|0;e=c[13898]|0;f=c[8272]|0;if((f|0)<=(e|0)){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[1054]|0;if((a[g+(e*40&-1)|0]&1)==0){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+126728|0]|0)){l=l+1|0}else{m=2323;break}}if((m|0)==2323){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)!=1){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[j>>2]|0;j=e+1|0;c[13898]=j;e=1;h=j;while(1){if((h|0)>=(f|0)){m=2295;break}L3114:do{if((a[g+(h*40&-1)|0]&1)==0){m=2302}else{j=c[g+(h*40&-1)+36>>2]|0;n=g+(h*40&-1)+32|0;o=0;while(1){if((o|0)>=(j|0)){break}if((a[k+((c[n>>2]|0)+o|0)|0]|0)==(a[o+126728|0]|0)){o=o+1|0}else{m=2302;break L3114}}if((o|0)!=1){m=2302;break}p=e+1|0}}while(0);if((m|0)==2302){m=0;L3123:do{if((a[g+(h*40&-1)|0]&1)==0){q=0}else{n=c[g+(h*40&-1)+36>>2]|0;j=g+(h*40&-1)+32|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[k+((c[j>>2]|0)+r|0)|0]|0)==(a[r+125616|0]|0)){r=r+1|0}else{q=0;break L3123}}q=((r|0)==1)<<31>>31}}while(0);p=q+e|0}j=h+1|0;if((p|0)==0){s=j;break}else{e=p;h=j}}if((m|0)==2295){s=h+1|0}m=c[g+(h*40&-1)+32>>2]|0;c[13544]=(c[13544]|0)+1;c[13898]=s-1;s=m-l|0;m=s+2|0;h=ut(m)|0;do{if((h|0)==0){gk();g=ut(m)|0;if((g|0)!=0){t=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{t=h}}while(0);uD(t|0,(c[10036]|0)+(l+1|0)|0,s);a[t+(s-1|0)|0]=0;s=(d|0)==0;do{if(!s){if((a[d+38|0]&1)==0){break}l=t;w=59;a[l]=w&255;w=w>>8;a[l+1|0]=w&255}}while(0);l=(t|0)==0;do{if(l){u=0}else{u=bP(t|0)|0}dL(u);}while(ix(d)|0);uu(t);if(s){i=b;return}else{x=d}while(1){d=c[x>>2]|0;uu(c[x+12>>2]|0);uu(x);if((d|0)==0){break}else{x=d}}i=b;return}function d4(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0.0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=(c[13898]|0)+1|0;c[13898]=f;g=is(e)|0;j=c[g>>2]|0;if((j|0)==1){k=+(c[g+8>>2]|0)}else if((j|0)==2){k=+h[g+8>>3]}else if((j|0)==3){k=+uz(c[g+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e|0;if((c[g>>2]|0)==3){uu(c[e+8>>2]|0);c[g>>2]=1}g=c[13898]|0;e=c[8272]|0;if((e|0)<=(g|0)){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[1054]|0;if((a[j+(g*40&-1)|0]&1)==0){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[j+(g*40&-1)+36>>2]|0;m=j+(g*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+126728|0]|0)){o=o+1|0}else{p=2374;break}}if((p|0)==2374){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)!=1){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[m>>2]|0;m=g+1|0;c[13898]=m;g=1;l=m;while(1){if((l|0)>=(e|0)){p=2344;break}L3181:do{if((a[j+(l*40&-1)|0]&1)==0){p=2351}else{m=c[j+(l*40&-1)+36>>2]|0;q=j+(l*40&-1)+32|0;r=0;while(1){if((r|0)>=(m|0)){break}if((a[n+((c[q>>2]|0)+r|0)|0]|0)==(a[r+126728|0]|0)){r=r+1|0}else{p=2351;break L3181}}if((r|0)!=1){p=2351;break}s=g+1|0}}while(0);if((p|0)==2351){p=0;L3190:do{if((a[j+(l*40&-1)|0]&1)==0){t=0}else{q=c[j+(l*40&-1)+36>>2]|0;m=j+(l*40&-1)+32|0;u=0;while(1){if((u|0)>=(q|0)){break}if((a[n+((c[m>>2]|0)+u|0)|0]|0)==(a[u+125616|0]|0)){u=u+1|0}else{t=0;break L3190}}t=((u|0)==1)<<31>>31}}while(0);s=t+g|0}m=l+1|0;if((s|0)==0){w=m;break}else{g=s;l=m}}if((p|0)==2344){w=l+1|0}s=(c[j+(l*40&-1)+32>>2]|0)-o|0;l=ut(s)|0;do{if((l|0)==0){gk();j=ut(s)|0;if((j|0)!=0){x=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{x=l}}while(0);uD(x|0,(c[10036]|0)+(o+1|0)|0,s);a[x+(s-1|0)|0]=0;c[13544]=(c[13544]|0)+1;if(k==0.0){uu(x);c[13898]=w;i=b;return}s=d|0;o=d+8|0;while(1){dL(bP(x|0)|0);c[13898]=f;l=is(d)|0;j=c[l>>2]|0;if((j|0)==1){y=+(c[l+8>>2]|0)}else if((j|0)==3){y=+uz(c[l+8>>2]|0,0)}else if((j|0)==2){y=+h[l+8>>3]}else{p=2367;break}if((c[s>>2]|0)==3){uu(c[o>>2]|0);c[s>>2]=1}if(y==0.0){p=2377;break}}if((p|0)==2377){uu(x);c[13898]=w;i=b;return}else if((p|0)==2367){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function d5(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,o=0;b=i;i=i+32|0;d=b|0;e=b+24|0;f=(c[13898]|0)+1|0;c[13898]=f;L3222:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L3224:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L3224}}if((l|0)==1){break L3222}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=f;break}g=c[d+8>>2]|0;c[e>>2]=g;if((g|0)==0){m=c[13898]|0;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}iQ(e);g=c[e>>2]|0;if((aY(g|0,202112)|0)==0){o=c[n>>2]|0;hw(o,g,0);i=b;return}else{o=hA(g,193632)|0;hw(o,g,0);i=b;return}}}while(0);c[e>>2]=0;m=f;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function d6(){var b=0;b=c[13898]|0;c[13898]=b+1;c[7738]=b;a[30664]=0;hY(1);a[(e6(159824)|0)+8|0]=1;a[(e6(159208)|0)+8|0]=1;a[(e6(158720)|0)+8|0]=1;a[(e6(158096)|0)+8|0]=1;a[(e6(164136)|0)+8|0]=1;a[(e6(156232)|0)+8|0]=1;a[(e6(155120)|0)+8|0]=1;a[(e6(154768)|0)+8|0]=1;iS();return}function d7(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+24|0;d=b|0;if((c[7262]|0)==0){c[7262]=c[m>>2]}a[25280]=0;e=d|0;f=d+8|0;g=0;h=c[13898]|0;L3250:while(1){c[13898]=h+1;is(d);do{if((c[e>>2]|0)==3){j=c[f>>2]|0;k=c[7262]|0;aK(j|0,k|0);if((c[e>>2]|0)!=3){l=0;break}uu(c[f>>2]|0);c[e>>2]=1;l=0}else{if((g|0)!=0){k=c[7262]|0;aF(32,k|0)}j5(c[7262]|0,d,0);l=1}}while(0);k=c[13898]|0;if((k|0)>=(c[8272]|0)){break}j=c[1054]|0;n=(a[j+(k*40&-1)|0]&1)==0;if(n){break}o=c[j+(k*40&-1)+36>>2]|0;p=j+(k*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(o|0)){s=2413;break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+103664|0]|0)){r=r+1|0}else{s=2414;break}}if((s|0)==2413){s=0;if((r|0)==1|n){break}}else if((s|0)==2414){s=0;if(n){break}}p=c[j+(k*40&-1)+36>>2]|0;q=j+(k*40&-1)+32|0;o=c[10036]|0;t=0;while(1){if((t|0)>=(p|0)){break}if((a[o+((c[q>>2]|0)+t|0)|0]|0)==(a[t+148464|0]|0)){t=t+1|0}else{break L3250}}if((t|0)==1){g=l;h=k}else{break}}aF(10,c[7262]|0);aD(c[7262]|0);i=b;return}function d8(){c[13898]=(c[13898]|0)+1;dO();return}function d9(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;g=f+1|0;c[13898]=g;c[8026]=0;j=c[8272]|0;L3276:do{if((j|0)>(g|0)){k=c[1054]|0;if((a[k+(g*40&-1)|0]&1)==0){l=2487;break}n=c[k+(g*40&-1)+36>>2]|0;p=k+(g*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+218536|0]|0)){r=r+1|0}else{l=2487;break L3276}}if((r|0)!=5){l=2487;break}p=f+2|0;c[13898]=p;if(!((c[8496]|0)!=0&(c[3524]|0)!=0)){uh(-1,96888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);s=-1.0;break}L3287:do{if((p|0)<(j|0)){n=0;t=p;while(1){u=t;L3290:while(1){w=(a[k+(u*40&-1)|0]&1)==0;x=c[k+(u*40&-1)+36>>2]|0;y=k+(u*40&-1)+32|0;L3292:do{if(w){z=c[y>>2]|0}else{A=0;while(1){if((A|0)>=(x|0)){l=2434;break}if((a[q+((c[y>>2]|0)+A|0)|0]|0)==(a[A+103664|0]|0)){A=A+1|0}else{break}}if((l|0)==2434){l=0;if((A|0)==1){B=n;break L3287}}C=c[y>>2]|0;if((x|0)>0&(w^1)){D=0;E=0;F=C}else{z=C;break}while(1){if((a[D+101312|0]|0)==(a[q+(D+F|0)|0]|0)){G=F;H=E}else{if((D|0)!=3){z=C;break L3292}G=F-1|0;H=1}I=D+1|0;if((I|0)<(H+x|0)){D=I;E=H;F=G}else{break}}if((H|0)!=0){l=2442;break L3290}if((D|0)==2|(D|0)==8){l=2442;break L3290}else{z=C}}}while(0);J=(j|0)>(u|0);if(!J){B=n;break L3287}if(w){l=2451;break}else{K=0}while(1){if((K|0)>=(x|0)){break}if((a[q+(z+K|0)|0]|0)==(a[K+148464|0]|0)){K=K+1|0}else{l=2450;break L3290}}if((K|0)!=1){l=2450;break}x=u+1|0;c[13898]=x;if((x|0)<(j|0)){u=x}else{B=n;break L3287}}if((l|0)==2450){l=0;if(J){l=2451}else{B=n;break L3287}}else if((l|0)==2442){l=0;x=u+1|0;c[13898]=x;L=n|8;M=x}L3318:do{if((l|0)==2451){l=0;L3320:do{if((a[k+(u*40&-1)|0]&1)!=0){x=c[k+(u*40&-1)+36>>2]|0;w=k+(u*40&-1)+32|0;y=0;while(1){if((y|0)>=(x|0)){break}if((a[q+((c[w>>2]|0)+y|0)|0]|0)==(a[y+100784|0]|0)){y=y+1|0}else{break L3320}}if((y|0)!=3){break}w=u+1|0;c[13898]=w;L=n|63;M=w;break L3318}}while(0);if(!J){B=n;break L3287}if((a[k+(u*40&-1)|0]&1)!=0){w=c[k+(u*40&-1)+36>>2]|0;x=k+(u*40&-1)+32|0;C=0;while(1){if((C|0)>=(w|0)){l=2462;break}if((a[q+((c[x>>2]|0)+C|0)|0]|0)==(a[C+100080|0]|0)){C=C+1|0}else{break}}do{if((l|0)==2462){l=0;if((C|0)!=7){break}x=u+1|0;c[13898]=x;L=n|1;M=x;break L3318}}while(0);if(!J){B=n;break L3287}}L3339:do{if((a[k+(u*40&-1)|0]&1)!=0){C=c[k+(u*40&-1)+36>>2]|0;x=k+(u*40&-1)+32|0;w=0;while(1){if((w|0)>=(C|0)){break}if((a[q+((c[x>>2]|0)+w|0)|0]|0)==(a[w+99640|0]|0)){w=w+1|0}else{break L3339}}if((w|0)!=7){break}x=u+1|0;c[13898]=x;L=n|2;M=x;break L3318}}while(0);if(!J){B=n;break L3287}if((a[k+(u*40&-1)|0]&1)!=0){x=c[k+(u*40&-1)+36>>2]|0;C=k+(u*40&-1)+32|0;y=0;while(1){if((y|0)>=(x|0)){l=2476;break}if((a[q+((c[C>>2]|0)+y|0)|0]|0)==(a[y+99208|0]|0)){y=y+1|0}else{break}}do{if((l|0)==2476){l=0;if((y|0)!=7){break}C=u+1|0;c[13898]=C;L=n|4;M=C;break L3318}}while(0);if(!J){B=n;break L3287}}if((a[k+(u*40&-1)|0]&1)==0){B=n;break L3287}y=c[k+(u*40&-1)+36>>2]|0;C=k+(u*40&-1)+32|0;x=0;while(1){if((x|0)>=(y|0)){break}if((a[q+((c[C>>2]|0)+x|0)|0]|0)==(a[x+98600|0]|0)){x=x+1|0}else{B=n;break L3287}}if((x|0)!=5){B=n;break L3287}C=u+1|0;c[13898]=C;L=n|16;M=C}}while(0);if((M|0)<(j|0)){n=L;t=M}else{B=L;break}}}else{B=0}}while(0);c[8026]=(B|0)==0?7:B;q=e6(163432)|0;a[q+8|0]=0;c[q+16>>2]=1;c[q+24>>2]=-1;q=e6(164136)|0;a[q+8|0]=0;c[q+16>>2]=1;c[q+24>>2]=-1;s=-1.0}else{l=2487}}while(0);do{if((l|0)==2487){B=is(d)|0;L=c[B>>2]|0;if((L|0)==1){N=+(c[B+8>>2]|0)}else if((L|0)==2){N=+h[B+8>>3]}else if((L|0)==3){N=+uz(c[B+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=d|0;if((c[B>>2]|0)!=3){s=N;break}uu(c[d+8>>2]|0);c[B>>2]=1;s=N}}while(0);d=c[13898]|0;L3376:do{if((d|0)<(c[8272]|0)){B=c[1054]|0;L3378:do{if((a[B+(d*40&-1)|0]&1)!=0){L=c[B+(d*40&-1)+36>>2]|0;M=B+(d*40&-1)+32|0;j=c[10036]|0;J=0;while(1){if((J|0)>=(L|0)){break}if((a[j+((c[M>>2]|0)+J|0)|0]|0)==(a[J+103664|0]|0)){J=J+1|0}else{break L3378}}if((J|0)==1){l=2500;break L3376}}}while(0);uu(c[8028]|0);B=c[13898]|0;L3385:do{if((B|0)<(c[8272]|0)){M=c[1054]|0;L3387:do{if((a[M+(B*40&-1)|0]&1)!=0){j=c[M+(B*40&-1)+36>>2]|0;L=M+(B*40&-1)+32|0;K=c[10036]|0;z=0;while(1){if((z|0)>=(j|0)){break}if((a[K+((c[L>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L3387}}if((z|0)==1){break L3385}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)!=3){c[13898]=B;break}M=c[e+8>>2]|0;c[8028]=M;if((M|0)!=0){J=c[m>>2]|0;aK(M|0,J|0);O=1;break L3376}P=c[13898]|0;uf(P,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[8028]=0;P=B;uf(P,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=2500}}while(0);if((l|0)==2500){uu(c[8028]|0);c[8028]=bP(96376)|0;O=0}L3406:do{if(s<0.0){l=c[3524]|0;do{if((l|0)!=0){P=c[l+116>>2]|0;if((P|0)==0){break}cL[P&7]();break L3406}}while(0);l=c[8028]|0;B=uA(l|0)|0;P=c[o>>2]|0;a6(l|0,B|0,P|0)}}while(0);if(s>0.0){P=~~(s*1.0e6);bH(P|0)}if((O|0)==0|s<0.0){a[25280]=0;i=b;return}aF(10,c[m>>2]|0);a[25280]=0;i=b;return}function ea(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=c[7262]|0;do{if(!((f|0)==0|(f|0)==(c[m>>2]|0)|(f|0)==(c[n>>2]|0))){if((a[c[7260]|0]|0)==124){if((a2(f|0)|0)>=0){break}aS(c[7260]|0);break}else{if((az(f|0)|0)>=0){break}aS(c[7260]|0);break}}}while(0);f=c[7260]|0;if((f|0)!=0){uu(f)}c[7260]=0;if((b|0)==0){c[7262]=c[m>>2];i=e;return}if((aY(b|0,202112)|0)==0){c[7262]=c[n>>2];i=e;return}if((a[b]|0)!=124){f=bF(b|0,(d?205056:137896)|0)|0;c[7262]=f;if((f|0)==0){aS(b|0);i=e;return}else{c[7260]=b;i=e;return}}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=bt(b+1|0,137896)|0;c[7262]=f;if((f|0)==0){aS(b|0);i=e;return}else{c[7260]=b;i=e;return}}function eb(){var a=0,b=0,d=0,e=0;a=i;b=ut(4096)|0;do{if((b|0)==0){gk();d=ut(4096)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=88504,v)|0)}else{e=b}}while(0);bl(e|0,4096);cf(c[m>>2]|0,154696,(v=i,i=i+8|0,c[v>>2]=e,v)|0);uu(e);c[13898]=(c[13898]|0)+1;i=a;return}function ec(){var a=0,b=0;a=c[8804]|0;do{if((a|0)!=0){b=c[a>>2]|0;if((b|0)==0){break}cs(b|0)}}while(0);c[13898]=(c[13898]|0)+1;return}function ed(){c[13898]=(c[13898]|0)+1;aI(81576,27,1,c[m>>2]|0);return}function ee(){var b=0;b=c[13898]|0;c[13898]=b+1;c[7738]=b;a[30664]=0;hY(2);a[(e6(159824)|0)+8|0]=1;a[(e6(159208)|0)+8|0]=1;a[(e6(158720)|0)+8|0]=1;a[(e6(158096)|0)+8|0]=1;a[(e6(164136)|0)+8|0]=1;iZ();return}function ef(){k9();return}function eg(){var b=0,d=0,e=0;b=i;if((a[c[6924]|0]|0)==0){uf(c[13898]|0,84384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[27704]&1)!=0){a[27704]=0;iL()}d=c[3524]|0;e=c[13898]|0;if((d|0)==0){uf(e,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=e+1;if((c[d+96>>2]&8|0)==0){dP();i=b;return}cS[c[d+36>>2]&511]();dP();i=b;return}function eh(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;b=i;i=i+32|0;d=b|0;e=b+24|0;c[e>>2]=0;f=c[13898]|0;g=f+1|0;c[13898]=g;h=c[1054]|0;j=c[h+(g*40&-1)+36>>2]|0;k=c[h+(g*40&-1)+32>>2]|0;l=(a[h+(g*40&-1)|0]&1)==0;m=(j|0)>0;o=c[10036]|0;L3484:do{if(l){p=2648}else{L3486:do{if(m){q=0;r=0;s=k;while(1){if((a[q+98416|0]|0)==(a[o+(q+s|0)|0]|0)){t=s;u=r}else{if((q|0)!=1){break L3486}t=s-1|0;u=1}w=q+1|0;if((w|0)<(u+j|0)){q=w;r=u;s=t}else{break}}if((u|0)==0){x=w;p=2585}else{y=25296;break L3484}}else{x=0;p=2585}}while(0);if((p|0)==2585){s=a[x+98416|0]|0;if((s<<24>>24|0)==36|(s<<24>>24|0)==0){y=25296;break}}if(l){p=2648;break}L3498:do{if(m){s=0;r=0;q=k;while(1){if((a[s+97808|0]|0)==(a[o+(s+q|0)|0]|0)){z=q;A=r}else{if((s|0)!=1){break L3498}z=q-1|0;A=1}B=s+1|0;if((B|0)<(A+j|0)){s=B;r=A;q=z}else{break}}if((A|0)==0){C=B;p=2631}else{y=25304;break L3484}}else{C=0;p=2631}}while(0);if((p|0)==2631){q=a[C+97808|0]|0;if((q<<24>>24|0)==36|(q<<24>>24|0)==0){y=25304;break}}if(l){p=2648;break}L3510:do{if(m){q=0;r=0;s=k;while(1){if((a[q+97200|0]|0)==(a[o+(q+s|0)|0]|0)){D=s;E=r}else{if((q|0)!=1){break L3510}D=s-1|0;E=1}F=q+1|0;if((F|0)<(E+j|0)){q=F;r=E;s=D}else{break}}if((E|0)==0){G=F;p=2639}else{y=25312;break L3484}}else{G=0;p=2639}}while(0);if((p|0)==2639){s=a[G+97200|0]|0;if((s<<24>>24|0)==36|(s<<24>>24|0)==0){y=25312;break}}if(l){p=2648;break}if(m){s=0;r=0;q=k;while(1){if((a[s+96640|0]|0)==(a[o+(s+q|0)|0]|0)){H=q;I=r}else{if((s|0)!=1){p=2648;break L3484}H=q-1|0;I=1}J=s+1|0;if((J|0)<(I+j|0)){s=J;r=I;q=H}else{break}}if((I|0)==0){K=J}else{y=25320;break}}else{K=0}q=a[K+96640|0]|0;if((q<<24>>24|0)==36|(q<<24>>24|0)==0){y=25320}else{p=2648}}}while(0);if((p|0)==2648){y=25328}p=c[y+4>>2]|0;if((p-1|0)>>>0<4){y=f+2|0;c[13898]=y;L=y}else{L=g}L3537:do{if((L|0)<(c[8272]|0)){L3539:do{if((a[h+(L*40&-1)|0]&1)!=0){g=c[h+(L*40&-1)+36>>2]|0;y=h+(L*40&-1)+32|0;f=0;while(1){if((f|0)>=(g|0)){break}if((a[o+((c[y>>2]|0)+f|0)|0]|0)==(a[f+103664|0]|0)){f=f+1|0}else{break L3539}}if((f|0)==1){break L3537}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=L;break}y=c[d+8>>2]|0;c[e>>2]=y;if((y|0)==0){M=c[13898]|0;uf(M,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((a[y]|0)==124){if(a[14168]|0){N=bt(y+1|0,137896)|0;O=y;break}else{uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{iQ(e);g=c[e>>2]|0;if((aY(g|0,202112)|0)==0){N=c[n>>2]|0;O=g;break}else{N=hA(g,137896)|0;O=g;break}}}while(0);if((N|0)==0){uj(c[13898]|0,82848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==4){jI(N);i8(N);aI(172e3,9,1,N|0)}else if((p|0)==1){jI(N);y=c[10812]|0;if((y|0)!=0){g=y;do{y=c[g+12>>2]|0;if((y|0)!=0){cf(N|0,154696,(v=i,i=i+8|0,c[v>>2]=y,v)|0)}g=c[g>>2]|0;}while((g|0)!=0)}aI(172e3,9,1,N|0)}else if((p|0)==3){jI(N);jb(N);aI(172e3,9,1,N|0)}else if((p|0)==2){jd(N)}else{jc(N)}if((c[n>>2]|0)==(N|0)){uu(O);i=b;return}if((a[O]|0)==124){a2(N|0);uu(O);i=b;return}else{az(N|0);uu(O);i=b;return}}}while(0);c[e>>2]=0;M=L;uf(M,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function ei(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+24|0;d=b|0;e=(c[13898]|0)+1|0;c[13898]=e;if((e|0)>=(c[8272]|0)){f=0;uu(f);i=b;return}g=c[1054]|0;L3594:do{if((a[g+(e*40&-1)|0]&1)!=0){h=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L3594}}if((l|0)==1){f=0}else{break}uu(f);i=b;return}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=e;f=0;uu(f);i=b;return}e=c[d+8>>2]|0;if((e|0)==0){f=0;uu(f);i=b;return}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}bN(e|0);f=e;uu(f);i=b;return}function ej(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0.0;b=i;i=i+8312|0;d=b|0;e=b+2048|0;f=b+8192|0;g=b+8240|0;j=b+8248|0;k=b+8256|0;l=b+8304|0;n=c[13898]|0;o=n+1|0;c[13898]=o;p=c[3524]|0;if((p|0)==0){uf(o,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L3617:do{if((o|0)<(c[8272]|0)){q=c[1054]|0;r=(a[q+(o*40&-1)|0]&1)==0;L3619:do{if(r){s=c[10036]|0;t=2765}else{u=c[q+(o*40&-1)+36>>2]|0;w=q+(o*40&-1)+32|0;x=c[10036]|0;y=0;while(1){if((y|0)>=(u|0)){t=2680;break}if((a[x+((c[w>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break}}if((t|0)==2680){if((y|0)==1){break L3617}}z=c[w>>2]|0;A=(u|0)>0;if(r){s=x;t=2765;break}L3629:do{if(A){B=0;C=0;D=z;while(1){if((a[B+142016|0]|0)==(a[x+(B+D|0)|0]|0)){E=D;F=C}else{if((B|0)!=4){break L3629}E=D-1|0;F=1}G=B+1|0;if((G|0)<(F+u|0)){B=G;C=F;D=E}else{break}}if((F|0)==0){H=G;t=2689}else{I=5696;J=x;break L3619}}else{H=0;t=2689}}while(0);if((t|0)==2689){w=a[H+142016|0]|0;if((w<<24>>24|0)==36|(w<<24>>24|0)==0){I=5696;J=x;break}}if(r){s=x;t=2765;break}L3641:do{if(A){w=0;y=0;D=z;while(1){if((a[w+205488|0]|0)==(a[x+(w+D|0)|0]|0)){K=D;L=y}else{if((w|0)!=3){break L3641}K=D-1|0;L=1}M=w+1|0;if((M|0)<(L+u|0)){w=M;y=L;D=K}else{break}}if((L|0)==0){N=M;t=2759}else{I=5704;J=x;break L3619}}else{N=0;t=2759}}while(0);if((t|0)==2759){D=a[N+205488|0]|0;if((D<<24>>24|0)==36|(D<<24>>24|0)==0){I=5704;J=x;break}}if(r){s=x;t=2765;break}if(A){D=0;while(1){if((a[D+141856|0]|0)!=(a[x+(D+z|0)|0]|0)){s=x;t=2765;break L3619}y=D+1|0;if((y|0)<(u|0)){D=y}else{P=y;break}}}else{P=0}D=a[P+141856|0]|0;if((D<<24>>24|0)==36|(D<<24>>24|0)==0){I=5712;J=x}else{s=x;t=2765}}}while(0);if((t|0)==2765){I=5720;J=s}r=c[I+4>>2]|0;if((r|0)==2){if((c[p+136>>2]|0)==0){Q=0}else{Q=(c[p+144>>2]|0)!=0}D=a$()|0;u=c[13898]|0;z=u+1|0;c[13898]=z;L3666:do{if((z|0)<(c[8272]|0)){A=c[1054]|0;y=c[A+(z*40&-1)+36>>2]|0;L3668:do{if((a[A+(z*40&-1)|0]&1)==0){R=c[10036]|0;S=A+(z*40&-1)+32|0}else{w=A+(z*40&-1)+32|0;C=c[10036]|0;B=0;while(1){if((B|0)>=(y|0)){break}if((a[C+((c[w>>2]|0)+B|0)|0]|0)==(a[B+103664|0]|0)){B=B+1|0}else{R=C;S=w;break L3668}}if((B|0)==1){T=93664;break L3666}else{R=C;S=w}}}while(0);A=(y|0)!=3;x=A&1;U=R+(c[S>>2]|0)|0;if(A){V=x}else{A=((aZ(U|0,114,3)|0)==0&1)+x|0;x=A+((aZ(U|0,103,3)|0)==0&1)|0;V=x+((aZ(U|0,98,3)|0)==0&1)|0}if((V|0)==0){c[13898]=u+2;T=U;break}else{uf(z,215792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{T=93664}}while(0);if((D|0)==0){uf(-1,215320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{W=0}do{X=+(W|0)/255.0;h[d+(W<<3)>>3]=X;if((a[20668]|0)==110){Y=1.0-X}else{Y=X}fq(Y,e+(W*24&-1)|0);W=W+1|0;}while((W|0)<256);c[11254]=0;z=c[6924]|0;if((z|0)==0){Z=0}else{Z=bP(z|0)|0}z=a[37384]&1;aI(5992,208,1,D|0);if(Q){aI(5976,13,1,D|0)}aI(5728,243,1,D|0);aF(112,D|0);if((a[T]|0)!=0){u=0;do{if((u|0)>0){aF(44,D|0)}aI(214288,7,1,D|0);U=a[T+u|0]|0;if((U|0)==114){aI(213544,25,1,D|0)}else if((U|0)==103){aI(213024,29,1,D|0)}else if((U|0)==98){aI(212416,27,1,D|0)}u=u+1|0;}while(u>>>0<(uA(T|0)|0)>>>0)}aI(211904,28,1,D|0);aF(10,D|0);u=a[T]|0;U=0;do{if((u<<24>>24|0)==103){_=e+(U*24&-1)+8|0}else if((u<<24>>24|0)==114){_=e+(U*24&-1)|0}else{_=e+(U*24&-1)+16|0}X=+h[_>>3];cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(U<<3)>>3],h[v+8>>3]=X,v)|0);U=U+1|0;}while((U|0)<256);aI(210424,2,1,D|0);U=a[T+1|0]|0;u=0;do{if((U<<24>>24|0)==103){$=e+(u*24&-1)+8|0}else if((U<<24>>24|0)==114){$=e+(u*24&-1)|0}else{$=e+(u*24&-1)+16|0}X=+h[$>>3];cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(u<<3)>>3],h[v+8>>3]=X,v)|0);u=u+1|0;}while((u|0)<256);aI(210424,2,1,D|0);u=a[T+2|0]|0;U=0;do{if((u<<24>>24|0)==103){aa=e+(U*24&-1)+8|0}else if((u<<24>>24|0)==114){aa=e+(U*24&-1)|0}else{aa=e+(U*24&-1)+16|0}X=+h[aa>>3];cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(U<<3)>>3],h[v+8>>3]=X,v)|0);U=U+1|0;}while((U|0)<256);aI(210424,2,1,D|0);U=0;do{X=+h[e+(U*24&-1)>>3]*.299+ +h[e+(U*24&-1)+8>>3]*.587+ +h[e+(U*24&-1)+16>>3]*.114;cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(U<<3)>>3],h[v+8>>3]=X,v)|0);U=U+1|0;}while((U|0)<256);aI(210424,2,1,D|0);aI(6208,14,1,D|0);jI(D);jb(D);aI(172e3,9,1,D|0);cs(D|0);hw(D,0,0);c[11254]=1;uu(c[6924]|0);c[6924]=Z;a[37384]=z;c[8272]=0;c[13898]=0;i=b;return}else if((r|0)==3){U=k;c[g>>2]=0;c[j>>2]=0;u=n+2|0;c[13898]=u;if((a[q+(u*40&-1)|0]&1)==0){i=b;return}x=a[J+(c[q+(u*40&-1)+32>>2]|0)|0]|0;if(!((x<<24>>24|0)==39|(x<<24>>24|0)==34)){i=b;return}ub(g,u,u);u=(c[13898]|0)+1|0;c[13898]=u;x=c[1054]|0;do{if((a[x+(u*40&-1)|0]&1)!=0){A=a[(c[10036]|0)+(c[x+(u*40&-1)+32>>2]|0)|0]|0;if(!((A<<24>>24|0)==39|(A<<24>>24|0)==34)){break}ub(j,u,u);uE(U|0,0,44);A=c[j>>2]|0;ab=c[g>>2]|0;t1(A,ab,k,l);X=+t2(k);ac=c[m>>2]|0;ad=k+12|0;ae=c[ad>>2]|0;af=k+16|0;ag=(c[af>>2]|0)+1|0;ah=k+20|0;ai=(c[ah>>2]|0)%100&-1;aj=k+8|0;ak=c[aj>>2]|0;al=k+4|0;am=c[al>>2]|0;an=k|0;ao=c[an>>2]|0;ap=k+24|0;aq=c[ap>>2]|0;ar=k+28|0;as=c[ar>>2]|0;cf(ac|0,217600,(v=i,i=i+72|0,h[v>>3]=X,c[v+8>>2]=ae,c[v+16>>2]=ag,c[v+24>>2]=ai,c[v+32>>2]=ak,c[v+40>>2]=am,c[v+48>>2]=ao,c[v+56>>2]=aq,c[v+64>>2]=as,v)|0);uE(U|0,0,44);t3(k,X);as=uA(A|0)|0;t3(f,X);at=X- +O(+X);t4(A,as,ab,f,at);ab=c[m>>2]|0;as=c[ad>>2]|0;ad=(c[af>>2]|0)+1|0;af=(c[ah>>2]|0)%100&-1;ah=c[aj>>2]|0;aj=c[al>>2]|0;al=c[an>>2]|0;an=c[ap>>2]|0;ap=c[ar>>2]|0;cf(ab|0,216816,(v=i,i=i+72|0,c[v>>2]=A,c[v+8>>2]=as,c[v+16>>2]=ad,c[v+24>>2]=af,c[v+32>>2]=ah,c[v+40>>2]=aj,c[v+48>>2]=al,c[v+56>>2]=an,c[v+64>>2]=ap,v)|0);uu(A);c[13898]=(c[13898]|0)+1}}while(0);uu(c[g>>2]|0);i=b;return}else if((r|0)==1){lG();i=b;return}else{uf(o,80152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);lG();i=b;return}function ek(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=(c[13898]|0)+1|0;c[13898]=f;if((f|0)>=(c[8272]|0)){g=f;uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[1054]|0;L3758:do{if((a[h+(f*40&-1)|0]&1)!=0){j=c[h+(f*40&-1)+36>>2]|0;k=h+(f*40&-1)+32|0;l=c[10036]|0;m=0;while(1){if((m|0)>=(j|0)){break}if((a[l+((c[k>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{break L3758}}if((m|0)==1){g=f}else{break}uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)!=3){c[13898]=f;g=f;uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[e+8>>2]|0;e=c[13898]|0;if((f|0)==0){g=e;uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((e|0)>=(c[8272]|0)){n=0;fc(f,n);uu(n);uu(f);i=b;return}g=c[1054]|0;h=(a[g+(e*40&-1)|0]&1)==0;L3776:do{if(h){o=d}else{k=c[g+(e*40&-1)+36>>2]|0;l=g+(e*40&-1)+32|0;j=c[10036]|0;p=0;while(1){if((p|0)>=(k|0)){q=2788;break}if((a[j+((c[l>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}do{if((q|0)==2788){if((p|0)==1){n=0}else{break}fc(f,n);uu(n);uu(f);i=b;return}}while(0);p=d;if(h){o=p;break}l=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;m=0;while(1){if((m|0)>=(l|0)){break}if((a[k+((c[j>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{o=p;break L3776}}if((m|0)==1){r=e}else{o=p;break}uf(r,78672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=e;r=e;uf(r,78672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[d+8>>2]|0;if((e|0)!=0){n=e;fc(f,n);uu(n);uu(f);i=b;return}r=c[13898]|0;uf(r,78672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function el(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=c[13898]|0;d=c[8272]|0;L3802:do{if((b|0)<(d|0)){e=c[1054]|0;f=b;do{L3806:do{if((a[e+(f*40&-1)|0]&1)!=0){g=c[e+(f*40&-1)+36>>2]|0;h=e+(f*40&-1)+32|0;j=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[j+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L3806}}if((k|0)==1){break L3802}}}while(0);f=f+1|0;c[13898]=f;}while((f|0)<(d|0))}}while(0);uf(b,78216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function em(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;b=i;i=i+8|0;d=b|0;e=bU(140128)|0;f=(e|0)==0?138024:e;if((c[10010]|0)==0){e=ut(1024)|0;do{if((e|0)==0){gk();g=ut(1024)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74912,v)|0)}else{h=e}}while(0);c[10010]=h;h=ut(1024)|0;do{if((h|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){j=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74440,v)|0)}else{j=h}}while(0);c[10008]=j;a[j]=0;a[c[10010]|0]=0}if(!(a[40024]|0)){a[c[10008]|0]=0;a[c[10010]|0]=0}a[40024]=0;j=c[10010]|0;h=uA(j|0)|0;e=(c[13898]|0)+1|0;c[13898]=e;g=c[8272]|0;L3829:do{if((e|0)<(g|0)){k=c[1054]|0;l=e;while(1){L3833:do{if((a[k+(l*40&-1)|0]&1)!=0){m=c[k+(l*40&-1)+36>>2]|0;n=k+(l*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(m|0)){break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break L3833}}if((p|0)==1){q=l;break L3829}}}while(0);n=l+1|0;c[13898]=n;if((n|0)<(g|0)){l=n}else{q=n;break}}}else{q=e}}while(0);if((h|0)>0){a[j+h|0]=32;r=h+1|0;s=c[10010]|0;t=c[13898]|0}else{r=h;s=j;t=q}q=s+r|0;s=t-1|0;t=1024-r|0;r=c[1054]|0;j=(c[r+(s*40&-1)+36>>2]|0)+(c[r+(s*40&-1)+32>>2]|0)|0;s=c[r+(e*40&-1)+32>>2]|0;if((j-s|0)<(t|0)){u=j}else{u=(t-1|0)+s|0}L3847:do{if((s|0)<(u|0)){t=q;j=s;while(1){e=a[(c[10036]|0)+j|0]|0;if(e<<24>>24==0){w=t;break L3847}r=t+1|0;a[t]=e;e=j+1|0;if((e|0)<(u|0)){t=r;j=e}else{w=r;break}}}else{w=q}}while(0);a[w]=0;w=(c[10010]|0)+h|0;q=a[w]|0;if(q<<24>>24==0){x=w}else{u=w;s=w;w=0;j=q;while(1){do{if((aM(j&255|0)|0)==0){a[s]=a[u]|0;y=0;z=s+1|0}else{if(w){y=1;z=s;break}a[s]=32;y=1;z=s+1|0}}while(0);q=u+1|0;t=a[q]|0;if(t<<24>>24==0){x=z;break}else{u=q;s=z;w=y;j=t}}}a[x]=0;x=c[10010]|0;j=uA(x|0)|0;if((aY(x+((h|0)==0?0:h+1|0)|0,216168)|0)==0){a[d]=1;a[x+h|0]=0;A=1;B=c[10010]|0}else{a[d]=0;A=0;B=x}x=gm(B,f,d)|0;if((x|0)==1){B=c[10010]|0;bD(224888,(v=i,i=i+8|0,c[v>>2]=B,v)|0);C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else if((x|0)==0){a[25280]=0;if((a[d]&1)==0|A){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}A=(j|0)>0;L3873:while(1){j=c[10008]|0;if(A){uD(j|0,73672,13);B=c[10010]|0;ck(j|0,B|0,1008);B=c[10008]|0;y=B+(uA(B|0)|0)|0;a[y]=a[212304]|0;a[y+1|0]=a[212305|0]|0;a[y+2|0]=a[212306|0]|0;E=c[10008]|0}else{uD(j|0,225272,13);E=j}dF(E,0);j=jl(40144,40136)|0;c[8272]=j;c[13898]=0;if((j|0)<1){F=2870;break}j=c[1054]|0;L3880:do{if((a[j|0]&1)!=0){y=c[j+36>>2]|0;B=j+32|0;w=c[10036]|0;z=0;while(1){if((z|0)>=(y|0)){break}if((a[w+((c[B>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L3880}}if((z|0)==1){F=2871;break L3873}}}while(0);c[13898]=-1;a[40024]=1;em();if((a[d]&1)==0){F=2872;break}}if((F|0)==2870){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else if((F|0)==2871){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else if((F|0)==2872){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}}else if((x|0)==(-1|0)){aS(f|0);C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else{uf(-1,223936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function en(){var b=0,d=0,e=0,f=0,g=0;b=i;a[25280]=0;c[13898]=(c[13898]|0)+1;d=c[256]|0;if((d|0)==0){e=c[m>>2]|0;f=aF(10,e|0)|0;i=b;return}g=uF(46781,d|0,93)|0;if((uA(d|0)|0)>>>0>=93){a[46873]=0}if((bN(g|0)|0)==0){e=c[m>>2]|0;f=aF(10,e|0)|0;i=b;return}else{uj(-1,223328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function eo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=bt(b|0,193632|0)|0;if((f|0)==0){uj(-1,221448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}b=ut(1024)|0;do{if((b|0)==0){gk();g=ut(1024)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=220968,v)|0);return 0}else{h=b}}while(0);a[h]=0;b=h;h=0;g=1024;L3914:while(1){j=h;while(1){k=a1(f|0)|0;if((k|0)==-1){l=2898;break L3914}m=j+1|0;n=b+j|0;a[n]=k&255;if((m|0)==(g|0)){break}else{j=m}}if((g|0)>1048575){l=2896;break}m=g+1024|0;b=db(b,m,218568)|0;h=g;g=m}if((l|0)==2898){o=b+j|0;a[o]=0;p=a2(f|0)|0;q=uA(b|0)|0;r=q+1|0;s=db(b,r,220968)|0;c[d>>2]=s;i=e;return p|0}else if((l|0)==2896){uh(-1,219104,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);o=n;a[o]=0;p=a2(f|0)|0;q=uA(b|0)|0;r=q+1|0;s=db(b,r,220968)|0;c[d>>2]=s;i=e;return p|0}return 0}function ep(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0.0,S=0.0,T=0,U=0.0,V=0,W=0.0,X=0.0,Y=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0.0,bf=0.0,bg=0.0,bh=0,bi=0.0,bj=0.0,bk=0.0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bA=0.0,bB=0.0,bC=0.0,bD=0,bE=0,bF=0.0,bG=0,bH=0,bI=0,bJ=0.0,bK=0.0,bL=0,bM=0,bN=0,bO=0,bP=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0.0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0.0,b9=0,ca=0,cb=0.0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0.0;e=i;i=i+24|0;f=e|0;g=e+8|0;j=e+16|0;k=c[13374]|0;c[9348]=c[13378];c[13370]=0;l=d+8|0;n=c[l>>2]|0;h[15]=8.988465674311579e+307;h[70]=8.988465674311579e+307;h[98]=8.988465674311579e+307;h[16]=-8.988465674311579e+307;h[71]=-8.988465674311579e+307;h[99]=-8.988465674311579e+307;if((b|0)>0){o=(n|0)>0;p=0;q=d;r=-8.988465674311579e+307;s=-8.988465674311579e+307;t=-8.988465674311579e+307;u=8.988465674311579e+307;w=8.988465674311579e+307;x=8.988465674311579e+307;while(1){y=c[q+12>>2]|0;if(o){z=0;A=r;B=s;C=t;D=u;E=w;F=x;while(1){do{if((c[y+(z<<6)>>2]|0)==2){G=A;H=B;I=C;J=D;K=E;L=F}else{M=y+(z<<6)+8|0;N=+h[M>>3];if(N>A){h[99]=N;S=N}else{S=A}T=y+(z<<6)+16|0;N=+h[T>>3];if(N>B){h[71]=N;U=N}else{U=B}V=y+(z<<6)+24|0;N=+h[V>>3];if(N>C){h[16]=N;W=N}else{W=C}N=+h[M>>3];if(N<D){h[98]=N;X=N}else{X=D}N=+h[T>>3];if(N<E){h[70]=N;Y=N}else{Y=E}N=+h[V>>3];if(N>=F){G=S;H=U;I=W;J=X;K=Y;L=F;break}h[15]=N;G=S;H=U;I=W;J=X;K=Y;L=N}}while(0);V=z+1|0;if((V|0)<(n|0)){z=V;A=G;B=H;C=I;D=J;E=K;F=L}else{ab=G;ac=H;ad=I;ae=J;af=K;ag=L;break}}}else{ab=r;ac=s;ad=t;ae=u;af=w;ag=x}z=p+1|0;if((z|0)<(b|0)){p=z;q=c[q>>2]|0;r=ab;s=ac;t=ad;u=ae;w=af;x=ag}else{break}}}q=c[d+12>>2]|0;p=(c[l>>2]|0)-1|0;l=(p|0)>0;L3955:do{if(l){n=0;o=0;z=0;L3956:while(1){y=q+(z<<6)|0;V=z+1|0;T=q+(V<<6)|0;do{if((c[y>>2]|0)==0){if((c[T>>2]|0)!=0){ah=o;ai=n;break}M=ut(28)|0;if((M|0)==0){gk();aj=ut(28)|0;if((aj|0)==0){break L3956}else{ak=aj}}else{ak=M}M=ak;c[ak>>2]=0;c[ak+4>>2]=0;c[ak+8>>2]=y;c[ak+12>>2]=T;c[ak+16>>2]=0;c[ak+24>>2]=1;if((o|0)==0){ah=M;ai=M;break}c[o+16>>2]=M;ah=M;ai=n}else{ah=o;ai=n}}while(0);if((V|0)<(p|0)){n=ai;o=ah;z=V}else{al=ai;am=ah;break L3955}}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else{al=0;am=0}}while(0);L3968:do{if((b|0)>1){ah=al;ai=am;ak=0;z=2;o=q;n=d;T=al;y=0;L3969:while(1){M=c[n>>2]|0;aj=c[M+12>>2]|0;do{if((c[o>>2]|0)==0){if((c[aj>>2]|0)!=0){an=0;ao=ai;ap=T;break}aq=ut(28)|0;if((aq|0)==0){gk();ar=ut(28)|0;if((ar|0)==0){as=2935;break L3969}else{at=ar}}else{at=aq}aq=at;c[at>>2]=0;c[at+4>>2]=0;c[at+8>>2]=o;c[at+12>>2]=aj;c[at+16>>2]=0;c[at+24>>2]=1;if((ai|0)==0){an=aq;ao=aq;ap=aq;break}c[ai+16>>2]=aq;an=aq;ao=aq;ap=T}else{an=0;ao=ai;ap=T}}while(0);do{if(l){V=0;aq=ao;ar=0;au=ak;av=an;aw=ah;ax=0;ay=ap;az=y;while(1){do{if((aw|0)==0){aA=0;aB=0}else{if((c[aw+8>>2]|0)!=(o+(ax<<6)|0)){aA=aw;aB=0;break}aA=c[aw+16>>2]|0;aB=aw}}while(0);aC=ax+1|0;aD=o+(aC<<6)|0;aE=aj+(ax<<6)|0;aF=aD|0;aG=aE|0;do{if((c[aF>>2]|0)==0){if((c[aG>>2]|0)!=0){aH=au;aJ=0;aK=1;aL=aq;aM=ay;aN=az;break}aO=ut(28)|0;if((aO|0)==0){gk();aP=ut(28)|0;if((aP|0)==0){as=2946;break L3969}else{aQ=aP}}else{aQ=aO}aO=aQ;aP=aQ;c[aP>>2]=0;aR=aQ+4|0;c[aR>>2]=0;c[aQ+8>>2]=aD;c[aQ+12>>2]=aE;c[aQ+16>>2]=0;aS=aQ+24|0;c[aS>>2]=1;if((aq|0)==0){aT=aO}else{c[aq+16>>2]=aO;aT=ay}c[aS>>2]=3;if((av|0)==0|(aB|0)==0){aH=au;aJ=aO;aK=0;aL=aO;aM=aT;aN=az;break}aS=ut(16)|0;if((aS|0)==0){gk();aU=ut(16)|0;if((aU|0)==0){as=2952;break L3969}else{aV=aU}}else{aV=aS}aS=aV;c[aV>>2]=av;c[aV+4>>2]=aO;c[aV+8>>2]=aB;c[aV+12>>2]=0;aU=av|0;if((c[aU>>2]|0)==0){c[aU>>2]=aS}else{c[av+4>>2]=aS}if((c[aP>>2]|0)==0){c[aP>>2]=aS}else{c[aR>>2]=aS}aR=aB|0;if((c[aR>>2]|0)==0){c[aR>>2]=aS}else{c[aB+4>>2]=aS}if((au|0)==0){aH=aS;aJ=aO;aK=0;aL=aO;aM=aT;aN=aS;break}c[au+12>>2]=aS;aH=aS;aJ=aO;aK=0;aL=aO;aM=aT;aN=az}else{aH=au;aJ=0;aK=1;aL=aq;aM=ay;aN=az}}while(0);aO=aj+(aC<<6)|0;do{if((c[aG>>2]|0)==0){if((c[aO>>2]|0)!=0){aW=0;aX=ar;aY=V;break}aS=ut(28)|0;if((aS|0)==0){gk();aR=ut(28)|0;if((aR|0)==0){as=2968;break L3969}else{aZ=aR}}else{aZ=aS}aS=aZ;c[aZ>>2]=0;c[aZ+4>>2]=0;c[aZ+8>>2]=aE;c[aZ+12>>2]=aO;c[aZ+16>>2]=0;c[aZ+24>>2]=1;if((ar|0)==0){aW=aS;aX=aS;aY=aS;break}c[ar+16>>2]=aS;aW=aS;aX=aS;aY=V}else{aW=0;aX=ar;aY=V}}while(0);do{if((c[aF>>2]|0)==0){if((c[aO>>2]|0)!=0){a_=aH;a$=aL;a0=0;a1=aM;a2=aN;break}aE=ut(28)|0;if((aE|0)==0){gk();aG=ut(28)|0;if((aG|0)==0){as=2975;break L3969}else{a3=aG}}else{a3=aE}aE=a3;aG=a3;c[aG>>2]=0;aS=a3+4|0;c[aS>>2]=0;c[a3+8>>2]=aD;c[a3+12>>2]=aO;c[a3+16>>2]=0;c[a3+24>>2]=1;if((aL|0)==0){a4=aE}else{c[aL+16>>2]=aE;a4=aM}if(aK|(aW|0)==0){a_=aH;a$=aE;a0=aE;a1=a4;a2=aN;break}aR=ut(16)|0;if((aR|0)==0){gk();aP=ut(16)|0;if((aP|0)==0){as=2981;break L3969}else{a5=aP}}else{a5=aR}aR=a5;c[a5>>2]=aJ;c[a5+4>>2]=aW;c[a5+8>>2]=aE;c[a5+12>>2]=0;aP=aJ|0;if((c[aP>>2]|0)==0){c[aP>>2]=aR}else{c[aJ+4>>2]=aR}aP=aW|0;if((c[aP>>2]|0)==0){c[aP>>2]=aR}else{c[aW+4>>2]=aR}if((c[aG>>2]|0)==0){c[aG>>2]=aR}else{c[aS>>2]=aR}if((aH|0)==0){a_=aR;a$=aE;a0=aE;a1=a4;a2=aR;break}c[aH+12>>2]=aR;a_=aR;a$=aE;a0=aE;a1=a4;a2=aN}else{a_=aH;a$=aL;a0=0;a1=aM;a2=aN}}while(0);if((aC|0)<(p|0)){V=aY;aq=a$;ar=aX;au=a_;av=a0;aw=aA;ax=aC;ay=a1;az=a2}else{break}}if((aY|0)==0){a6=a$;a7=a_;a8=0;a9=a1;ba=a2;break}if((a1|0)==0){a6=aX;a7=a_;a8=aY;a9=aY;ba=a2;break}c[a$+16>>2]=aY;a6=aX;a7=a_;a8=aY;a9=a1;ba=a2}else{a6=ao;a7=ak;a8=0;a9=ap;ba=y}}while(0);if((z|0)>=(b|0)){bb=a9;bc=ba;break L3968}ah=a8;ai=a6;ak=a7;z=z+1|0;o=aj;n=M;T=a9;y=ba}if((as|0)==2968){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else if((as|0)==2935){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else if((as|0)==2952){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=170896,v)|0);return 0}else if((as|0)==2975){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else if((as|0)==2981){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=170896,v)|0);return 0}else if((as|0)==2946){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}}else{bb=al;bc=0}}while(0);al=(bb|0)==0;if(!al){ba=bb;do{if((c[ba>>2]|0)==0){as=3001}else{if((c[ba+4>>2]|0)==0){as=3001}}if((as|0)==3001){as=0;c[ba+24>>2]=2}ba=c[ba+16>>2]|0;}while((ba|0)!=0)}c[12922]=0;if((c[13372]|0)==0){ag=+h[16]- +h[15];if(ag==0.0){bd=0;i=e;return bd|0}x=+P(+ag);ba=(c[13374]<<1)+2|0;ag=+R(10.0,+(+O(+(+bQ(+x)))));af=x/ag;x=+(ba|0)/af;do{if(x>40.0){be=.05}else{if(x>20.0){be=.1;break}if(x>10.0){be=.2;break}if(x>4.0){be=.5;break}if(x>2.0){be=1.0;break}if(x>.5){be=2.0;break}be=+$(+af)}}while(0);af=ag*be;be=af*+O(+(+h[15]/af));bf=af;bg=be;bh=~~+O(+((+h[16]-be)/af))}else{bf=0.0;bg=0.0;bh=k}L4084:do{if((bh|0)>0){af=bf*.01;k=0;be=bg;L4086:while(1){ba=c[13372]|0;do{if((ba|0)==2){ag=+h[(c[11662]|0)+(k<<3)>>3];if((a[64788]&1)==0){bi=ag;break}x=+_(+ag);bi=x/+h[8100]}else if((ba|0)==0){x=bf+be;bi=+P(+x)<af?0.0:x}else if((ba|0)==1){a9=c[11662]|0;x=+h[a9>>3];if((a[64788]&1)==0){bj=+h[a9+8>>3];bk=x}else{ag=+_(+x);x=+h[8100];bj=+_(+(+h[a9+8>>3]))/x;bk=ag/x}bi=bk+ +(k|0)*bj}else{bi=be}}while(0);h[6688]=bi;ba=c[13370]|0;x=+h[98];ag=+h[99];w=+h[70];ae=+h[71];do{if(al){c[j>>2]=0}else{M=bb;aj=0;while(1){a9=M+20|0;if(+h[(c[M+8>>2]|0)+24>>3]>=bi^+h[(c[M+12>>2]|0)+24>>3]>=bi){a[a9]=1;bl=aj+1|0}else{a[a9]=0;bl=aj}a9=c[M+16>>2]|0;if((a9|0)==0){break}else{M=a9;aj=bl}}c[j>>2]=bl;if((bl|0)<=0){break}u=ag-x;ad=ae-w;aj=0;while(1){L4110:do{if((aj&1)==0){M=bb;while(1){if((a[M+20|0]&1)!=0){if((c[M+24>>2]|0)==2){break}}a9=c[M+16>>2]|0;if((a9|0)==0){bm=1;as=3037;break L4110}else{M=a9}}bn=eu(M,bi,j,0)|0;bo=aj;as=3043}else{bm=aj;as=3037}}while(0);do{if((as|0)==3037){as=0;aC=bb;while(1){if((a[aC+20|0]&1)!=0){if((c[aC+24>>2]|0)!=2){as=3042;break}}a9=c[aC+16>>2]|0;if((a9|0)==0){as=3041;break}else{aC=a9}}if((as|0)==3041){as=0;c[j>>2]=0;M=c[m>>2]|0;aI(76408,34,1,M|0);bp=bm;break}else if((as|0)==3042){as=0;bn=eu(aC,bi,j,1)|0;bo=1;as=3043;break}}}while(0);do{if((as|0)==3043){as=0;M=(bo&1)!=0;if((bn|0)==0){bp=bo;break}a9=c[9348]|0;L4130:do{if((a9|0)==1){do{if(M){bq=1}else{a7=bn;while(1){a6=c[a7+16>>2]|0;if((a6|0)==0){break}else{a7=a6}}t=+P(+(+h[99]- +h[98]));if(+P(+(+h[a7>>3]- +h[bn>>3]))>=t*1.0e-5){bq=0;break}t=+P(+(+h[71]- +h[70]));bq=+P(+(+h[a7+8>>3]- +h[bn+8>>3]))<t*1.0e-5}}while(0);a6=bn;a8=0;while(1){br=a8+1|0;b=c[a6+16>>2]|0;if((b|0)==0){bs=bn;break}else{a6=b;a8=br}}while(1){bt=bs+16|0;a6=c[bt>>2]|0;if((a6|0)==0){break}else{bs=a6}}do{if(bq){t=+P(+(+h[99]- +h[98]));if(+P(+(+h[bs>>3]- +h[bn>>3]))<t*1.0e-5){t=+P(+(+h[71]- +h[70]));if(+P(+(+h[bs+8>>3]- +h[bn+8>>3]))<t*1.0e-5){bu=br;break}}c[bt>>2]=bn;bu=a8+2|0}else{bu=br}}while(0);a8=bu<<3;a6=ut(a8)|0;if((a6|0)==0){gk();b=ut(a8)|0;if((b|0)==0){as=3081;break L4086}else{bv=b}}else{bv=a6}a6=bv;b=ut(a8)|0;if((b|0)==0){gk();ap=ut(a8)|0;if((ap|0)==0){as=3084;break L4086}else{bw=ap}}else{bw=b}b=bw;ap=ut(a8)|0;if((ap|0)==0){gk();ao=ut(a8)|0;if((ao|0)==0){as=3087;break L4086}else{bx=ao}}else{bx=ap}ap=bx;t=+h[11];L4158:do{if((bu|0)>2){ac=ad>t?ad:t;s=u>t?u:t;ao=bu*24&-1;a8=ut(ao)|0;if((a8|0)==0){gk();a2=ut(ao)|0;if((a2|0)==0){as=3091;break L4086}else{by=a2}}else{by=a8}a8=by;a2=bu-1|0;if((a2|0)>0){ao=0;a1=bn;while(1){aY=a1+16|0;a_=b+(ao<<3)|0;h[a_>>3]=+h[c[aY>>2]>>3]- +h[a1>>3];ab=+h[(c[aY>>2]|0)+8>>3]- +h[a1+8>>3];aX=ap+(ao<<3)|0;h[aX>>3]=ab;r=+h[a_>>3]/s;L=ab/ac;ab=+Q(+(r*r+L*L));a$=a6+(ao<<3)|0;h[a$>>3]=ab;h[a_>>3]=+h[a_>>3]/ab;h[aX>>3]=+h[aX>>3]/+h[a$>>3];a$=ao+1|0;if((a$|0)<(a2|0)){ao=a$;a1=c[aY>>2]|0}else{break}}}if(bq){h[a6+(a2<<3)>>3]=+h[a6>>3];h[b+(a2<<3)>>3]=+h[b>>3];h[ap+(a2<<3)>>3]=+h[ap>>3];bz=a2}else{bz=bu-2|0}a1=(bz|0)>0;if(a1){ao=0;while(1){a7=a6+(ao<<3)|0;h[a8+(ao*24&-1)>>3]=+h[a7>>3];aY=ao+1|0;a$=a6+(aY<<3)|0;h[a8+(ao*24&-1)+8>>3]=(+h[a7>>3]+ +h[a$>>3])*2.0;h[a8+(ao*24&-1)+16>>3]=+h[a$>>3];a$=b+(ao<<3)|0;h[a$>>3]=(+h[b+(aY<<3)>>3]- +h[a$>>3])*6.0;a7=ap+(ao<<3)|0;ab=(+h[ap+(aY<<3)>>3]- +h[a7>>3])*6.0;h[a7>>3]=ab;L=+h[a$>>3];r=L/s;K=ab/ac;ab=+Q(+(r*r+K*K))/8.5;if(ab>1.0){h[a$>>3]=L/ab;h[a7>>3]=+h[a7>>3]/ab}if((aY|0)<(bz|0)){ao=aY}else{break}}}if(!bq){ao=by;aY=by+8|0;h[aY>>3]=+h[ao>>3]+ +h[aY>>3];h[ao>>3]=0.0;ao=bz-1|0;aY=a8+(ao*24&-1)+16|0;a7=a8+(ao*24&-1)+8|0;h[a7>>3]=+h[aY>>3]+ +h[a7>>3];h[aY>>3]=0.0}L4180:do{if((bz|0)>=1){ac=+h[by+8>>3];if(ac<=0.0){break}s=+h[by>>3];aY=a8+((bz-1|0)*24&-1)+8|0;ab=+h[aY>>3];a7=bz-2|0;if((a7|0)>0){ao=0;L=s;K=ab;r=ac;while(1){a$=a8+(ao*24&-1)+16|0;J=+h[a$>>3];I=J/r;h[a$>>3]=I;H=L/r;h[a8+(ao*24&-1)>>3]=H;a$=ao+1|0;aX=a8+(a$*24&-1)+8|0;G=+h[aX>>3]-J*I;if(G<=0.0){break L4180}J=L*(-0.0-I);I=K-L*H;h[aX>>3]=G;if((a$|0)<(a7|0)){ao=a$;L=J;K=I;r=G}else{bA=J;bB=I;bC=G;break}}}else{bA=s;bB=ab;bC=ac}if((bz|0)>1){r=bA+ +h[a8+(a7*24&-1)+16>>3];K=r/bC;h[a8+(a7*24&-1)>>3]=K;L=bB-K*r;h[aY>>3]=L;if(L<=0.0){break}}et(a8,b,bz);et(a8,ap,bz);if(a1){ao=bz;while(1){a$=ao-1|0;h[b+(ao<<3)>>3]=+h[b+(a$<<3)>>3];h[ap+(ao<<3)>>3]=+h[ap+(a$<<3)>>3];if((a$|0)>0){ao=a$}else{break}}}if(bq){h[b>>3]=+h[b+(bz<<3)>>3];h[ap>>3]=+h[ap+(bz<<3)>>3]}else{h[b>>3]=+h[bw+8>>3];h[ap>>3]=+h[bx+8>>3];ao=bz+1|0;h[b+(ao<<3)>>3]=+h[b+(bz<<3)>>3];h[ap+(ao<<3)>>3]=+h[ap+(bz<<3)>>3]}uu(by);bD=a2;break L4158}}while(0);uu(by);uu(bv);uu(bw);uu(bx);if(!bq){bE=bn;break L4130}c[bt>>2]=0;bE=bn;break L4130}else{if((bu|0)>1){h[b>>3]=0.0;h[ap>>3]=0.0;h[bw+8>>3]=0.0;h[bx+8>>3]=0.0;h[a6>>3]=1.0;bD=bu-1|0;break}uu(bv);uu(bw);uu(bx);if(!bq){bE=bn;break L4130}c[bt>>2]=0;bE=bn;break L4130}}while(0);a2=aa(c[13366]|0,bD);a1=(bD|0)>0;if(a1){t=0.0;a8=0;do{t=t+ +h[a6+(a8<<3)>>3];a8=a8+1|0;}while((a8|0)<(bD|0));bF=t*.9999999}else{bF=0.0}ac=bF/+(a2|0);ab=+h[bn>>3];s=+h[bn+8>>3];a8=c[12922]|0;if((a8|0)>98){ao=ut(56)|0;if((ao|0)==0){gk();aY=ut(56)|0;if((aY|0)==0){as=3127;break L4086}else{bG=aY}}else{bG=ao}ao=bG;aY=c[12922]<<6;a7=ut(aY)|0;if((a7|0)==0){gk();a$=ut(aY)|0;if((a$|0)==0){as=3130;break L4086}else{bH=a$}}else{bH=a7}a7=bH;a$=bG+4|0;c[a$>>2]=a7;aY=c[12922]|0;L4220:do{if((aY|0)>0){aX=0;a_=a7;while(1){aA=aX<<1;h[a_+(aX<<6)+8>>3]=+h[51696+(aA<<3)>>3];h[(c[a$>>2]|0)+(aX<<6)+16>>3]=+h[51696+((aA|1)<<3)>>3];h[(c[a$>>2]|0)+(aX<<6)+24>>3]=+h[6688];aA=aX+1|0;if((aA|0)>=(aY|0)){break L4220}aX=aA;a_=c[a$>>2]|0}}}while(0);c[bG+44>>2]=aY;c[bG>>2]=c[13370];c[13370]=ao;a[bG+8|0]=0;a$=a8<<1;h[6462]=+h[51696+(a$-2<<3)>>3];h[6463]=+h[51696+(a$-1<<3)>>3];c[12922]=1;bI=1}else{bI=a8}a$=bI<<1;h[51696+(a$<<3)>>3]=ab;h[51696+((a$|1)<<3)>>3]=s;a$=bI+1|0;c[12922]=a$;L4226:do{if(a1){t=s;L=ab;r=ac+0.0;a7=bn;a2=0;a_=a$;while(1){aX=c[a7+16>>2]|0;aA=a6+(a2<<3)|0;K=+h[aA>>3];G=+h[aX>>3];I=+h[aX+8>>3];J=(G-L)/K;H=(I-t)/K;a0=a2+1|0;Y=+h[b+(a0<<3)>>3];X=+h[b+(a2<<3)>>3];W=(Y+X*2.0)/6.0;U=+h[ap+(a0<<3)>>3];S=+h[ap+(a2<<3)>>3];F=(U+S*2.0)/6.0;E=K*6.0;D=(Y-X)/E;X=(U-S)/E;if(r>K){bJ=r;bK=K;bL=a_}else{E=r;p=a_;while(1){S=E-K;U=L+E*(J+S*(W+D*E));Y=t+E*(H+S*(F+X*E));if((p|0)>98){aN=ut(56)|0;if((aN|0)==0){gk();aM=ut(56)|0;if((aM|0)==0){as=3141;break L4086}else{bM=aM}}else{bM=aN}aN=bM;aM=c[12922]<<6;aL=ut(aM)|0;if((aL|0)==0){gk();aH=ut(aM)|0;if((aH|0)==0){as=3144;break L4086}else{bN=aH}}else{bN=aL}aL=bN;aH=bM+4|0;c[aH>>2]=aL;aM=c[12922]|0;L4241:do{if((aM|0)>0){a4=0;aW=aL;while(1){aJ=a4<<1;h[aW+(a4<<6)+8>>3]=+h[51696+(aJ<<3)>>3];h[(c[aH>>2]|0)+(a4<<6)+16>>3]=+h[51696+((aJ|1)<<3)>>3];h[(c[aH>>2]|0)+(a4<<6)+24>>3]=+h[6688];aJ=a4+1|0;if((aJ|0)>=(aM|0)){break L4241}a4=aJ;aW=c[aH>>2]|0}}}while(0);c[bM+44>>2]=aM;c[bM>>2]=c[13370];c[13370]=aN;a[bM+8|0]=0;aH=p<<1;h[6462]=+h[51696+(aH-2<<3)>>3];h[6463]=+h[51696+(aH-1<<3)>>3];c[12922]=1;bO=1}else{bO=p}aH=bO<<1;h[51696+(aH<<3)>>3]=U;h[51696+((aH|1)<<3)>>3]=Y;aH=bO+1|0;c[12922]=aH;S=ac+E;C=+h[aA>>3];if(S>C){bJ=S;bK=C;bL=aH;break}else{E=S;p=aH}}}if((a0|0)>=(bD|0)){break L4226}t=I;L=G;r=bJ-bK;a7=aX;a2=a0;a_=bL}}}while(0);uu(bv);uu(bw);uu(bx);if(bq){c[bt>>2]=0}ap=ut(56)|0;if((ap|0)==0){gk();b=ut(56)|0;if((b|0)==0){as=3156;break L4086}else{bP=b}}else{bP=ap}ap=bP;b=c[12922]<<6;a6=ut(b)|0;if((a6|0)==0){gk();a$=ut(b)|0;if((a$|0)==0){as=3159;break L4086}else{bR=a$}}else{bR=a6}a6=bR;a$=bP+4|0;c[a$>>2]=a6;b=c[12922]|0;L4259:do{if((b|0)>0){a1=0;a8=a6;while(1){ao=a1<<1;h[a8+(a1<<6)+8>>3]=+h[51696+(ao<<3)>>3];h[(c[a$>>2]|0)+(a1<<6)+16>>3]=+h[51696+((ao|1)<<3)>>3];h[(c[a$>>2]|0)+(a1<<6)+24>>3]=+h[6688];ao=a1+1|0;if((ao|0)>=(b|0)){break L4259}a1=ao;a8=c[a$>>2]|0}}}while(0);c[bP+44>>2]=b;c[bP>>2]=c[13370];c[13370]=ap;a[bP+8|0]=0;c[12922]=0;bE=bn}else if((a9|0)==0){a$=bn;a6=c[12922]|0;do{ac=+h[a$>>3];ab=+h[a$+8>>3];if((a6|0)>98){a8=ut(56)|0;if((a8|0)==0){gk();a1=ut(56)|0;if((a1|0)==0){as=3049;break L4086}else{bS=a1}}else{bS=a8}a8=bS;a1=c[12922]<<6;ao=ut(a1)|0;if((ao|0)==0){gk();aY=ut(a1)|0;if((aY|0)==0){as=3052;break L4086}else{bT=aY}}else{bT=ao}ao=bT;aY=bS+4|0;c[aY>>2]=ao;a1=c[12922]|0;L4275:do{if((a1|0)>0){a_=0;a2=ao;while(1){a7=a_<<1;h[a2+(a_<<6)+8>>3]=+h[51696+(a7<<3)>>3];h[(c[aY>>2]|0)+(a_<<6)+16>>3]=+h[51696+((a7|1)<<3)>>3];h[(c[aY>>2]|0)+(a_<<6)+24>>3]=+h[6688];a7=a_+1|0;if((a7|0)>=(a1|0)){break L4275}a_=a7;a2=c[aY>>2]|0}}}while(0);c[bS+44>>2]=a1;c[bS>>2]=c[13370];c[13370]=a8;a[bS+8|0]=0;aY=a6<<1;h[6462]=+h[51696+(aY-2<<3)>>3];h[6463]=+h[51696+(aY-1<<3)>>3];c[12922]=1;bU=1}else{bU=a6}aY=bU<<1;h[51696+(aY<<3)>>3]=ac;h[51696+((aY|1)<<3)>>3]=ab;a6=bU+1|0;c[12922]=a6;a$=c[a$+16>>2]|0;}while((a$|0)!=0);a$=ut(56)|0;if((a$|0)==0){gk();a6=ut(56)|0;if((a6|0)==0){as=3060;break L4086}else{bV=a6}}else{bV=a$}a$=bV;a6=c[12922]<<6;ap=ut(a6)|0;if((ap|0)==0){gk();b=ut(a6)|0;if((b|0)==0){as=3063;break L4086}else{bW=b}}else{bW=ap}ap=bW;b=bV+4|0;c[b>>2]=ap;a6=c[12922]|0;L4288:do{if((a6|0)>0){aY=0;ao=ap;while(1){a2=aY<<1;h[ao+(aY<<6)+8>>3]=+h[51696+(a2<<3)>>3];h[(c[b>>2]|0)+(aY<<6)+16>>3]=+h[51696+((a2|1)<<3)>>3];h[(c[b>>2]|0)+(aY<<6)+24>>3]=+h[6688];a2=aY+1|0;if((a2|0)>=(a6|0)){break L4288}aY=a2;ao=c[b>>2]|0}}}while(0);c[bV+44>>2]=a6;c[bV>>2]=c[13370];c[13370]=a$;a[bV+8|0]=0;c[12922]=0;bE=bn}else if((a9|0)==2){do{if(M){bX=1}else{b=bn;while(1){ap=c[b+16>>2]|0;if((ap|0)==0){break}else{b=ap}}ab=+P(+(+h[99]- +h[98]));if(+P(+(+h[b>>3]- +h[bn>>3]))>=ab*1.0e-5){bX=0;break}ab=+P(+(+h[71]- +h[70]));bX=+P(+(+h[b+8>>3]- +h[bn+8>>3]))<ab*1.0e-5}}while(0);a$=c[13368]|0;a6=bn;ap=0;while(1){bY=ap+1|0;ao=c[a6+16>>2]|0;if((ao|0)==0){break}else{a6=ao;ap=bY}}a6=a$-1|0;if((bY|0)<2){bE=bn;break}ao=(a6|0)>(ap|0)?ap:a6;do{if(bX){a6=bn;while(1){bZ=a6+16|0;aY=c[bZ>>2]|0;if((aY|0)==0){break}else{a6=aY}}ab=+P(+(+h[99]- +h[98]));do{if(+P(+(+h[a6>>3]- +h[bn>>3]))<ab*1.0e-5){ac=+P(+(+h[71]- +h[70]));if(+P(+(+h[a6+8>>3]- +h[bn+8>>3]))>=ac*1.0e-5){b_=bY;b$=bn;break}b_=ap;b$=c[bn+16>>2]|0}else{b_=bY;b$=bn}}while(0);c[bZ>>2]=b$;b=b_+ao|0;b0=a6;b1=b;b2=+(ao|0);b3=b;as=3179}else{if((bY|0)<=(ao|0)){b4=bn;b5=ao;b6=bY;b7=0;b8=0.0;break}b0=0;b1=bY;b2=0.0;b3=bY-ao|0;as=3179}}while(0);L4314:do{if((as|0)==3179){as=0;ab=+(b3|0);ac=1.0/+(c[13366]|0);if(b2>=ab){b4=bn;b5=ao;b6=b1;b7=b0;b8=ab;break}ap=b1-ao|0;a$=2;G=b2;I=b2+1.0;b=ao;aY=bn;while(1){if(G>I){b9=c[aY+16>>2]|0;ca=b+1|0;cb=I+1.0}else{b9=aY;ca=b;cb=I}ev(G,b9,b1,ao,ca,bX,f,g);s=+h[f>>3];r=+h[g>>3];a8=c[12922]|0;if((a8|0)>98){a1=ut(56)|0;if((a1|0)==0){gk();a2=ut(56)|0;if((a2|0)==0){as=3186;break L4086}else{cc=a2}}else{cc=a1}a1=cc;a2=c[12922]<<6;a_=ut(a2)|0;if((a_|0)==0){gk();a0=ut(a2)|0;if((a0|0)==0){as=3189;break L4086}else{cd=a0}}else{cd=a_}a_=cd;a0=cc+4|0;c[a0>>2]=a_;a2=c[12922]|0;L4330:do{if((a2|0)>0){aX=0;a7=a_;while(1){p=aX<<1;h[a7+(aX<<6)+8>>3]=+h[51696+(p<<3)>>3];h[(c[a0>>2]|0)+(aX<<6)+16>>3]=+h[51696+((p|1)<<3)>>3];h[(c[a0>>2]|0)+(aX<<6)+24>>3]=+h[6688];p=aX+1|0;if((p|0)>=(a2|0)){break L4330}aX=p;a7=c[a0>>2]|0}}}while(0);c[cc+44>>2]=a2;c[cc>>2]=c[13370];c[13370]=a1;a[cc+8|0]=0;a0=a8<<1;h[6462]=+h[51696+(a0-2<<3)>>3];h[6463]=+h[51696+(a0-1<<3)>>3];c[12922]=1;ce=1}else{ce=a8}a0=ce<<1;h[51696+(a0<<3)>>3]=s;h[51696+((a0|1)<<3)>>3]=r;c[12922]=ce+1;if((a$|0)==(aa(c[13366]|0,ap)+1|0)){b4=b9;b5=ca;b6=b1;b7=b0;b8=ab;break L4314}Y=ac+G;if(Y<ab){a$=a$+1|0;G=Y;I=cb;b=ca;aY=b9}else{b4=b9;b5=ca;b6=b1;b7=b0;b8=ab;break}}}}while(0);ev(b8+-1.0e-5,b4,b6,ao,b5,bX,f,g);ab=+h[f>>3];I=+h[g>>3];aY=c[12922]|0;if((aY|0)>98){b=ut(56)|0;if((b|0)==0){gk();a$=ut(56)|0;if((a$|0)==0){as=3199;break L4086}else{cf=a$}}else{cf=b}b=cf;a$=c[12922]<<6;ap=ut(a$)|0;if((ap|0)==0){gk();a6=ut(a$)|0;if((a6|0)==0){as=3202;break L4086}else{cg=a6}}else{cg=ap}ap=cg;a6=cf+4|0;c[a6>>2]=ap;a$=c[12922]|0;L4346:do{if((a$|0)>0){a0=0;a_=ap;while(1){a7=a0<<1;h[a_+(a0<<6)+8>>3]=+h[51696+(a7<<3)>>3];h[(c[a6>>2]|0)+(a0<<6)+16>>3]=+h[51696+((a7|1)<<3)>>3];h[(c[a6>>2]|0)+(a0<<6)+24>>3]=+h[6688];a7=a0+1|0;if((a7|0)>=(a$|0)){break L4346}a0=a7;a_=c[a6>>2]|0}}}while(0);c[cf+44>>2]=a$;c[cf>>2]=c[13370];c[13370]=b;a[cf+8|0]=0;a6=aY<<1;h[6462]=+h[51696+(a6-2<<3)>>3];h[6463]=+h[51696+(a6-1<<3)>>3];c[12922]=1;ch=1}else{ch=aY}a6=ch<<1;h[51696+(a6<<3)>>3]=ab;h[51696+((a6|1)<<3)>>3]=I;c[12922]=ch+1;if(bX){c[b7+16>>2]=0}a6=ut(56)|0;if((a6|0)==0){gk();ap=ut(56)|0;if((ap|0)==0){as=3211;break L4086}else{ci=ap}}else{ci=a6}a6=ci;ap=c[12922]<<6;ao=ut(ap)|0;if((ao|0)==0){gk();a_=ut(ap)|0;if((a_|0)==0){as=3214;break L4086}else{cj=a_}}else{cj=ao}ao=cj;a_=ci+4|0;c[a_>>2]=ao;ap=c[12922]|0;L4361:do{if((ap|0)>0){a0=0;a7=ao;while(1){aX=a0<<1;h[a7+(a0<<6)+8>>3]=+h[51696+(aX<<3)>>3];h[(c[a_>>2]|0)+(a0<<6)+16>>3]=+h[51696+((aX|1)<<3)>>3];h[(c[a_>>2]|0)+(a0<<6)+24>>3]=+h[6688];aX=a0+1|0;if((aX|0)>=(ap|0)){break L4361}a0=aX;a7=c[a_>>2]|0}}}while(0);c[ci+44>>2]=ap;c[ci>>2]=c[13370];c[13370]=a6;a[ci+8|0]=0;c[12922]=0;bE=bn}else{bE=bn}}while(0);while(1){M=c[bE+16>>2]|0;uu(bE);if((M|0)==0){bp=bo;break}else{bE=M}}}}while(0);if((c[j>>2]|0)>0){aj=bp}else{break}}}}while(0);aj=c[13370]|0;if((aj|0)!=(ba|0)){a[aj+8|0]=1;aj=(c[13370]|0)+9|0;if((a[64788]&1)==0){ck=bi}else{ck=+Z(+(bi*+h[8100]))}ud(aj,32,53520,1.0,ck);h[(c[13370]|0)+48>>3]=bi}aj=k+1|0;if((aj|0)<(bh|0)){k=aj;be=bi}else{break L4084}}if((as|0)==3052){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3081){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=105064,v)|0);return 0}else if((as|0)==3084){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=98096,v)|0);return 0}else if((as|0)==3049){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3087){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=92152,v)|0);return 0}else if((as|0)==3091){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84352,v)|0);return 0}else if((as|0)==3127){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3063){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3060){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3130){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3141){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3144){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3156){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3159){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3186){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3189){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3199){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3202){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3211){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3214){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}}}while(0);if((bc|0)!=0){as=bc;while(1){bc=c[as+12>>2]|0;uu(as);if((bc|0)==0){break}else{as=bc}}}if(!al){al=bb;while(1){bb=c[al+16>>2]|0;uu(al);if((bb|0)==0){break}else{al=bb}}}bd=c[13370]|0;i=e;return bd|0}function eq(){a[47544]=0;a[47856]=1;return}function er(){a[47544]=1;a[47856]=1;return}function es(){return}function et(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0,g=0,i=0.0,j=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0;d=b+(c-1<<3)|0;e=+h[d>>3];f=c-2|0;if((f|0)>0){g=0;i=e;j=+h[b>>3];while(1){k=g+1|0;l=b+(k<<3)|0;m=+h[l>>3]- +h[a+(g*24&-1)+16>>3]*j;h[l>>3]=m;n=i- +h[a+(g*24&-1)>>3]*j;if((k|0)<(f|0)){g=k;i=n;j=m}else{o=n;break}}}else{o=e}g=(c|0)>1;if(g){h[d>>3]=o- +h[a+(f*24&-1)>>3]*+h[b+(f<<3)>>3]}if((c|0)>0){k=0;do{l=b+(k<<3)|0;h[l>>3]=+h[l>>3]/+h[a+(k*24&-1)+8>>3];k=k+1|0;}while((k|0)<(c|0))}o=+h[d>>3];if(g){g=b+(f<<3)|0;h[g>>3]=+h[g>>3]-o*+h[a+(f*24&-1)>>3]}g=c-3|0;if((g|0)<=-1){return}c=g;e=+h[b+(f<<3)>>3];while(1){f=b+(c<<3)|0;j=+h[f>>3]-(+h[a+(c*24&-1)+16>>3]*e+o*+h[a+(c*24&-1)>>3]);h[f>>3]=j;if((c|0)>0){c=c-1|0;e=j}else{break}}return}function eu(b,d,e,f){b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(!f){a[b+20|0]=0;c[e>>2]=(c[e>>2]|0)-1}do{if((c[b>>2]|0)==0){if((c[b+4>>2]|0)==0){g=0}else{break}return g|0}}while(0);f=ew(b,d)|0;i=0;j=b;k=f;while(1){l=c[j>>2]|0;if((l|0)==(i|0)){n=c[j+4>>2]|0}else{n=l}l=c[n>>2]|0;if((l|0)==(j|0)){o=0}else{o=(a[l+20|0]&1)==0?0:l}l=c[n+4>>2]|0;if((l|0)==(j|0)){p=o}else{p=(a[l+20|0]&1)==0?o:l}l=c[n+8>>2]|0;if((l|0)==(j|0)){q=p}else{q=(a[l+20|0]&1)==0?p:l}if((q|0)==0){r=3261;break}a[q+20|0]=0;c[e>>2]=(c[e>>2]|0)-1;l=q+24|0;do{if((c[l>>2]|0)==3){s=k}else{t=ew(q,d)|0;c[k+16>>2]=t;u=+P(+(+h[99]- +h[98]));if(+P(+(+h[k>>3]- +h[t>>3]))>=u*1.0e-5){s=t;break}u=+P(+(+h[71]- +h[70]));if(+P(+(+h[k+8>>3]- +h[t+8>>3]))>=u*1.0e-5){s=t;break}uu(t);s=k}}while(0);if((q|0)==(b|0)){r=3271;break}if((c[l>>2]|0)==2){r=3270;break}else{i=n;j=q;k=s}}if((r|0)==3270){c[s+16>>2]=0;g=f;return g|0}else if((r|0)==3261){c[k+16>>2]=0;if((f|0)!=0){k=f;while(1){q=c[k+16>>2]|0;uu(k);if((q|0)==0){break}else{k=q}}}aI(223848,41,1,c[m>>2]|0);g=0;return g|0}else if((r|0)==3271){c[s+16>>2]=0;h[f>>3]=+h[s>>3];h[f+8>>3]=+h[s+8>>3];g=f;return g|0}return 0}function ev(a,b,d,e,f,g,j,k){a=+a;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,w=0.0,x=0,y=0,z=0.0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0,K=0.0;l=i;m=f+e<<3;n=ut(m)|0;do{if((n|0)==0){gk();o=ut(m)|0;if((o|0)!=0){p=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=122288,v)|0)}else{p=n}}while(0);n=p;o=ut(m)|0;do{if((o|0)==0){gk();q=ut(m)|0;if((q|0)!=0){r=q;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=122288,v)|0)}else{r=o}}while(0);o=r;m=f-e|0;if((e|0)<0){s=n+(f<<3)|0;t=+h[s>>3];h[j>>3]=t;u=o+(f<<3)|0;w=+h[u>>3];h[k>>3]=w;uu(p);uu(r);i=l;return}else{x=m;y=b}while(1){h[n+(x<<3)>>3]=+h[y>>3];h[o+(x<<3)>>3]=+h[y+8>>3];b=x+1|0;if((b|0)>(f|0)){break}else{x=b;y=c[y+16>>2]|0}}if((e|0)<1){s=n+(f<<3)|0;t=+h[s>>3];h[j>>3]=t;u=o+(f<<3)|0;w=+h[u>>3];h[k>>3]=w;uu(p);uu(r);i=l;return}y=e+1|0;z=+(d-e|0);x=1;b=-1;while(1){q=x+m|0;if((q|0)<=(f|0)){A=y+b|0;B=f;while(1){do{if(g){C=+(A+B|0);D=+(B|0)}else{do{if((B|0)>(e|0)){if((B|0)>(d|0)){E=z;break}E=+(B-e|0)}else{E=0.0}}while(0);F=A+B|0;if((F|0)<=(e|0)){C=0.0;D=E;break}if((F|0)>(d|0)){C=z;D=E;break}C=+(F-e|0);D=E}}while(0);if(D==C){G=B-1|0}else{F=n+(B<<3)|0;H=a-D;I=C-D;J=B-1|0;K=C-a;h[F>>3]=H*+h[F>>3]/I+K*+h[n+(J<<3)>>3]/I;F=o+(B<<3)|0;h[F>>3]=H*+h[F>>3]/I+K*+h[o+(J<<3)>>3]/I;G=J}if((G|0)<(q|0)){break}else{B=G}}}B=x+1|0;q=x^-1;if((B|0)>(e|0)){break}else{x=B;b=q}}s=n+(f<<3)|0;t=+h[s>>3];h[j>>3]=t;u=o+(f<<3)|0;w=+h[u>>3];h[k>>3]=w;uu(p);uu(r);i=l;return}function ew(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0;d=i;e=a+8|0;f=+h[(c[e>>2]|0)+24>>3];g=a+12|0;j=(b-f)/(+h[(c[g>>2]|0)+24>>3]-f);f=j<0.0?0.0:j;j=f>1.0?1.0:f;a=ut(24)|0;do{if((a|0)==0){gk();k=ut(24)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=216768,v)|0);return 0}else{l=a}}while(0);f=1.0-j;h[l>>3]=j*+h[(c[g>>2]|0)+8>>3]+f*+h[(c[e>>2]|0)+8>>3];h[l+8>>3]=j*+h[(c[g>>2]|0)+16>>3]+f*+h[(c[e>>2]|0)+16>>3];i=d;return l|0}function ex(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=hA(c[11932]|0,78360)|0;if((g|0)==0){uj(-1,146640,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}h=e;if((cd(h|0,4,1,g|0)|0)==0){uj(-1,146480,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}j=c[e>>2]|0;k=j>>>0>65535?3:0;l=(k-2|0)>>>0<2;L4523:do{if(l){m=0;n=3;o=j&255;while(1){p=h+n|0;a[h+m|0]=a[p]|0;a[p]=o;p=m+1|0;q=n-1|0;if((p|0)>=(q|0)){break L4523}m=p;n=q;o=a[h+p|0]|0}}}while(0);j=(k-1|0)>>>0<2;if(j){k=h+2|0;o=a[k]|0;n=h+3|0;a[k]=a[n]|0;a[n]=o;o=a[h]|0;n=h+1|0;a[h]=a[n]|0;a[n]=o}o=f;if((cd(o|0,4,1,g|0)|0)==0){uj(-1,146280,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}if(l){l=0;n=3;do{h=o+l|0;k=a[h]|0;m=o+n|0;a[h]=a[m]|0;a[m]=k;l=l+1|0;n=n-1|0;}while((l|0)<(n|0))}if(j){j=o+2|0;n=a[j]|0;l=o+3|0;a[j]=a[l]|0;a[l]=n;n=a[o]|0;l=o+1|0;a[o]=a[l]|0;a[l]=n}az(g|0);a[47544]=0;a[47856]=1;c[(c[12172]|0)+128>>2]=8;c[(c[12172]|0)+140>>2]=c[e>>2];c[(c[12172]|0)+144>>2]=c[f>>2];c[(c[12172]|0)+152>>2]=1;c[(c[12172]|0)+156>>2]=-1;a[(c[12172]|0)+124|0]=1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;eQ(4);f=c[11950]|0;if((c[11884]|0)<1){e=db(f,12,215112)|0;c[11950]=e;c[11884]=1;r=e}else{r=f}c[r+4>>2]=1;b[(c[11950]|0)+8>>1]=b[24026]|0;r=c[11950]|0;if((c[11884]|0)<2){f=db(r,24,215112)|0;c[11950]=f;c[11884]=2;s=f}else{s=r}c[s+16>>2]=1;b[(c[11950]|0)+20>>1]=b[24026]|0;s=c[11950]|0;if((c[11884]|0)<3){r=db(s,36,215112)|0;c[11950]=r;c[11884]=3;t=r}else{t=s}c[t+28>>2]=1;b[(c[11950]|0)+32>>1]=b[24026]|0;t=c[11950]|0;if((c[11884]|0)<4){s=db(t,48,215112)|0;c[11950]=s;c[11884]=4;u=s}else{u=t}c[u+40>>2]=1;b[(c[11950]|0)+44>>1]=b[24026]|0;u=c[11950]|0;if((c[11884]|0)>=1){w=u;x=w|0;c[x>>2]=0;c[11870]=4;c[262]=2;c[265]=3;c[268]=4;c[271]=1;i=d;return}t=db(u,12,215112)|0;c[11950]=t;c[11884]=1;w=t;x=w|0;c[x>>2]=0;c[11870]=4;c[262]=2;c[265]=3;c[268]=4;c[271]=1;i=d;return}function ey(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aN=0,aO=0,aP=0,aQ=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,a_=0,a$=0,a0=0,a1=0.0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0.0,ba=0,bb=0.0,bd=0,be=0,bf=0,bg=0,bh=0.0,bi=0,bj=0,bk=0,bl=0.0,bm=0,bn=0,bo=0,bp=0.0,bq=0,br=0,bs=0,bu=0.0,bv=0,bw=0,bx=0,by=0.0,bz=0,bA=0.0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bM=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0.0,cq=0,cr=0,cs=0,ct=0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0.0,cF=0,cG=0,cH=0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cS=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0;k=i;i=i+504|0;l=k|0;p=k+24|0;q=k+48|0;r=k+72|0;s=k+96|0;t=k+120|0;u=k+144|0;x=k+168|0;y=k+192|0;z=k+216|0;A=k+240|0;B=k+264|0;C=k+288|0;D=k+312|0;E=k+336|0;F=k+424|0;G=k+432|0;H=(c[13898]|0)-1|0;a[43464]=1;if((c[12892]|0)!=0){ez();c[12892]=0}uu(c[11930]|0);c[11930]=0;c[11872]=0;uu(c[11902]|0);c[11902]=0;eA();c[11942]=-1;c[11900]=0;c[11898]=0;c[11904]=1;c[11762]=2147483647;uu(c[9356]|0);c[9356]=0;c[11946]=0;c[14126]=2;c[10874]=1;c[10872]=1;c[10808]=0;c[10806]=0;c[8834]=2147483647;c[8832]=2147483647;a[47544]=0;a[47856]=0;c[11858]=0;c[11864]=0;a[47584]=0;a[47464]=0;a[47736]=0;c[11944]=j;c[13488]=-99;a[32928]=0;a[48872]=0;if((f|0)>=8){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=95312,v)|0);return 0}if((e|0)==0){uf(c[13898]|0,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}I=c[11932]|0;do{if((a[e]|0)==0){if((I|0)==0){J=c[13898]|0;uf(J,94168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((a[I]|0)!=0){break}J=c[13898]|0;uf(J,94168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{uu(I);c[11932]=bP(e|0)|0}}while(0);e=c[60]|0;if((e|0)!=0){e1(e)}c[60]=0;e=c[13898]|0;I=c[8272]|0;L4579:do{if((e|0)<(I|0)){J=j+23|0;K=r|0;L=r+8|0;M=p|0;N=p+8|0;O=l|0;P=l+8|0;Q=q|0;R=q+8|0;S=z|0;T=z+8|0;U=y|0;V=y+8|0;W=x|0;X=x+8|0;Y=u|0;Z=u+8|0;_=t|0;$=t+8|0;ab=s|0;ac=s+8|0;ad=D|0;ae=D+8|0;af=C|0;ag=C+8|0;ah=B|0;ai=B+8|0;aj=A|0;ak=A+8|0;al=0;am=0;an=0;ao=0;ap=0;aq=e;ar=I;L4581:while(1){as=c[1054]|0;at=(a[as+(aq*40&-1)|0]&1)==0;if(at){break L4579}au=c[as+(aq*40&-1)+36>>2]|0;av=as+(aq*40&-1)+32|0;aw=c[10036]|0;ax=0;while(1){if((ax|0)>=(au|0)){ay=3362;break}if((a[aw+((c[av>>2]|0)+ax|0)|0]|0)==(a[ax+103664|0]|0)){ax=ax+1|0}else{break}}if((ay|0)==3362){ay=0;if((ax|0)==1){break L4579}}aw=c[av>>2]|0;if(!((au|0)>0&(at^1))){break L4579}az=c[10036]|0;aA=0;aB=0;aC=aw;while(1){if((a[aA+204608|0]|0)==(a[az+(aA+aC|0)|0]|0)){aD=aC;aF=aB}else{if((aA|0)!=3){ay=3393;break}aD=aC-1|0;aF=1}aG=aA+1|0;if((aG|0)<(aF+au|0)){aA=aG;aB=aF;aC=aD}else{ay=3369;break}}do{if((ay|0)==3369){ay=0;if((aF|0)==0){if(!((aA|0)==6|(aA|0)==2)){ay=3393;break}}aC=aq+1|0;c[13898]=aC;if((a[47856]&1)!=0){aH=aC;ay=4033;break L4581}a[47856]=1;a[47544]=1;c[12170]=0;c[12220]=0;c[12222]=0;c[12224]=0;c[11876]=0;aC=c[11950]|0;if((c[11884]|0)<1){aB=db(aC,12,215112)|0;c[11950]=aB;c[11884]=1;aI=aB}else{aI=aC}c[aI>>2]=0;aC=c[12172]|0;aB=c[11864]|0;if((aB|0)>0){az=0;av=aB;while(1){aB=aC+(az*232&-1)+224|0;ax=c[aB>>2]|0;if((ax|0)==0){aJ=av}else{uu(ax);c[aB>>2]=0;aJ=c[11864]|0}aB=az+1|0;if((aB|0)<(aJ|0)){az=aB;av=aJ}else{break}}}c[11864]=0;av=c[11862]|0;if((av|0)==0){c[12204]=c[12200];c[12208]=0;az=c[12172]|0;if((c[11880]|0)<1){aC=db(az,232,216568)|0;aB=aC;c[12172]=aB;if((aC|0)==0){ay=3388;break L4581}c[11880]=1;aK=c[11864]|0;aL=aB}else{aK=0;aL=az}uD(aL+(aK*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}else{c[12204]=c[12202];c[12208]=c[12206];if((av|0)>(c[11880]|0)){az=db(c[12172]|0,av*232&-1,216568)|0;c[12172]=az;if((az|0)==0){ay=3381;break L4581}c[11880]=av}az=c[12172]|0;aB=c[11864]|0;if((av|0)>0){aC=0;ax=aB;while(1){uD(az+(ax*232&-1)|0,48440,232);aG=(c[11864]|0)+1|0;c[11864]=aG;aN=aC+1|0;if((aN|0)<(av|0)){aC=aN;ax=aG}else{aO=aG;break}}}else{aO=aB}uD(az|0,c[12168]|0,aO*232&-1)}eB(ap,0);aP=ap;aQ=ao;aS=an;aT=am;aU=al}}while(0);L4629:do{if((ay|0)==3393){ay=0;if(!((au|0)>0&(at^1))){break L4579}aA=c[10036]|0;ax=0;aC=0;av=aw;while(1){if((a[ax+151232|0]|0)==(a[aA+(ax+av|0)|0]|0)){aV=av;aW=aC}else{if((ax|0)!=3){break}aV=av-1|0;aW=1}aG=ax+1|0;if((aG|0)<(aW+au|0)){ax=aG;aC=aW;av=aV}else{ay=3399;break}}do{if((ay|0)==3399){ay=0;if((aW|0)==0){if(!((ax|0)==6|(ax|0)==2)){break}}aX=aq+1|0;c[13898]=aX;if(ap){aH=aX;ay=4035;break L4581}if((a[47544]&1)==0){if((a[47856]&1)!=0){ay=3404;break L4581}}a[47544]=1;a[43464]=0;aP=1;aQ=ao;aS=an;aT=am;aU=al;break L4629}}while(0);if(!((au|0)>0&(at^1))){break L4579}ax=c[10036]|0;av=0;aC=0;aA=aw;while(1){if((a[av+91224|0]|0)==(a[ax+(av+aA|0)|0]|0)){aY=aA;a_=aC}else{if((av|0)!=6){break}aY=aA-1|0;a_=1}az=av+1|0;if((az|0)<(a_+au|0)){av=az;aC=a_;aA=aY}else{ay=3412;break}}do{if((ay|0)==3412){ay=0;if((a_|0)==0){if(!((av|0)==10|(av|0)==5)){break}}c[13898]=aq+1;a[47544]=1;a[47464]=1;a[43464]=0;aP=ap;aQ=ao;aS=an;aT=am;aU=al;break L4629}}while(0);if(!((au|0)>0&(at^1))){break L4579}av=c[10036]|0;aA=0;aC=0;ax=aw;while(1){if((a[aA+90656|0]|0)==(a[av+(aA+ax|0)|0]|0)){a$=ax;a0=aC}else{if((aA|0)!=1){break}a$=ax-1|0;a0=1}az=aA+1|0;if((az|0)<(a0+au|0)){aA=az;aC=a0;ax=a$}else{ay=3421;break}}do{if((ay|0)==3421){ay=0;if((a0|0)==0){if(!((aA|0)==0|(aA|0)==5)){break}}if(al){aH=aq;ay=4034;break L4581}if((a[47856]&1)!=0){if((a[47544]&1)!=0){ay=3426;break L4581}}ax=aq+1|0;c[13898]=ax;L4677:do{if((ax|0)<(ar|0)){L4679:do{if((a[as+(ax*40&-1)|0]&1)!=0){aC=c[as+(ax*40&-1)+36>>2]|0;av=as+(ax*40&-1)+32|0;az=c[10036]|0;aB=0;while(1){if((aB|0)>=(aC|0)){break}if((a[az+((c[av>>2]|0)+aB|0)|0]|0)==(a[aB+103664|0]|0)){aB=aB+1|0}else{break L4679}}if((aB|0)==1){ay=3435;break L4677}}}while(0);a[14176]=1;is(D);a[14176]=0;if((c[ad>>2]|0)!=3){c[13898]=ax;ay=3435;break}av=c[ae>>2]|0;c[9356]=av;if((av|0)==0){break}a[37432]=0;aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}else{ay=3435}}while(0);if((ay|0)==3435){ay=0;c[9356]=0}ax=is(C)|0;av=c[ax>>2]|0;if((av|0)==1){a1=+(c[ax+8>>2]|0)}else if((av|0)==2){a1=+h[ax+8>>3]}else if((av|0)==3){a1=+uz(c[ax+8>>2]|0,0)}else{ay=3442;break L4581}if((c[af>>2]|0)==3){uu(c[ag>>2]|0);c[af>>2]=1}ax=~~a1;c[11898]=ax;av=c[13898]|0;az=c[8272]|0;L4701:do{if((az|0)>(av|0)){aC=c[1054]|0;if((a[aC+(av*40&-1)|0]&1)==0){break}aG=c[aC+(av*40&-1)+36>>2]|0;aN=aC+(av*40&-1)+32|0;a2=c[10036]|0;a3=0;while(1){if((a3|0)>=(aG|0)){break}if((a[a2+((c[aN>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{break L4701}}if((a3|0)!=1){break}aN=av+1|0;c[13898]=aN;L4709:do{if((az|0)>(aN|0)){if((a[aC+(aN*40&-1)|0]&1)==0){ay=3458;break}aG=c[aC+(aN*40&-1)+36>>2]|0;a4=aC+(aN*40&-1)+32|0;a5=0;while(1){if((a5|0)>=(aG|0)){break}if((a[a2+((c[a4>>2]|0)+a5|0)|0]|0)==(a[a5+183584|0]|0)){a5=a5+1|0}else{ay=3458;break L4709}}if((a5|0)!=1){ay=3458;break}c[11762]=2147483647;a6=aN;a7=az}else{ay=3458}}while(0);if((ay|0)==3458){ay=0;aN=is(B)|0;a2=c[aN>>2]|0;if((a2|0)==3){a9=+uz(c[aN+8>>2]|0,0)}else if((a2|0)==1){a9=+(c[aN+8>>2]|0)}else if((a2|0)==2){a9=+h[aN+8>>3]}else{ay=3462;break L4581}if((c[ah>>2]|0)==3){uu(c[ai>>2]|0);c[ah>>2]=1}aN=~~a9;c[11762]=aN;ba=c[13898]|0;if((aN|0)<(c[11898]|0)){ay=3467;break L4581}a6=ba;a7=c[8272]|0}if((a7|0)<=(a6|0)){aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}aN=c[1054]|0;if((a[aN+(a6*40&-1)|0]&1)==0){aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}a2=c[aN+(a6*40&-1)+36>>2]|0;aC=aN+(a6*40&-1)+32|0;aN=c[10036]|0;a3=0;while(1){if((a3|0)>=(a2|0)){break}if((a[aN+((c[aC>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}}if((a3|0)!=1){aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}c[13898]=a6+1;aC=is(A)|0;aN=c[aC>>2]|0;if((aN|0)==1){bb=+(c[aC+8>>2]|0)}else if((aN|0)==2){bb=+h[aC+8>>3]}else if((aN|0)==3){bb=+uz(c[aC+8>>2]|0,0)}else{ay=3478;break L4581}if((c[aj>>2]|0)==3){uu(c[ak>>2]|0);c[aj>>2]=1}aC=~~bb;aN=(aC|0)>-1?aC:-aC|0;c[11904]=aN;if((aN|0)<1){ay=3482;break L4581}else{aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}}}while(0);c[11762]=ax;aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}}while(0);if(at){break L4579}L4747:do{if((au|0)>0){aA=c[10036]|0;az=0;av=0;aN=aw;while(1){if((a[az+90160|0]|0)==(a[aA+(az+aN|0)|0]|0)){bd=aN;be=av}else{if((az|0)!=2){break L4747}bd=aN-1|0;be=1}aC=az+1|0;if((aC|0)<(be+au|0)){az=aC;av=be;aN=bd}else{break}}if((be|0)==0){if(!((az|0)==1|(az|0)==5)){break}}if(am){aH=aq;ay=4036;break L4581}a[43464]=0;aN=aq+1|0;c[13898]=aN;L4760:do{if((ar|0)>(aN|0)){if((a[as+(aN*40&-1)|0]&1)==0){ay=3500;break}av=c[as+(aN*40&-1)+36>>2]|0;aA=as+(aN*40&-1)+32|0;ax=c[10036]|0;aC=0;while(1){if((aC|0)>=(av|0)){break}if((a[ax+((c[aA>>2]|0)+aC|0)|0]|0)==(a[aC+183584|0]|0)){aC=aC+1|0}else{ay=3500;break L4760}}if((aC|0)==1){bf=aN;bg=ar}else{ay=3500}}else{ay=3500}}while(0);if((ay|0)==3500){ay=0;aN=is(z)|0;az=c[aN>>2]|0;if((az|0)==1){bh=+(c[aN+8>>2]|0)}else if((az|0)==2){bh=+h[aN+8>>3]}else if((az|0)==3){bh=+uz(c[aN+8>>2]|0,0)}else{ay=3504;break L4581}if((c[S>>2]|0)==3){uu(c[T>>2]|0);c[S>>2]=1}aN=~~bh;c[10872]=aN;bi=c[13898]|0;if((aN|0)<1){ay=3509;break L4581}bf=bi;bg=c[8272]|0}L4779:do{if((bg|0)>(bf|0)){aN=c[1054]|0;if((a[aN+(bf*40&-1)|0]&1)==0){bj=bf;bk=bg;break}az=c[aN+(bf*40&-1)+36>>2]|0;aA=aN+(bf*40&-1)+32|0;ax=c[10036]|0;av=0;while(1){if((av|0)>=(az|0)){break}if((a[ax+((c[aA>>2]|0)+av|0)|0]|0)==(a[av+183584|0]|0)){av=av+1|0}else{bj=bf;bk=bg;break L4779}}if((av|0)!=1){bj=bf;bk=bg;break}aA=bf+1|0;c[13898]=aA;L4787:do{if((bg|0)>(aA|0)){if((a[aN+(aA*40&-1)|0]&1)==0){break}az=c[aN+(aA*40&-1)+36>>2]|0;aC=aN+(aA*40&-1)+32|0;a3=0;while(1){if((a3|0)>=(az|0)){break}if((a[ax+((c[aC>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{break L4787}}if((a3|0)==1){bj=aA;bk=bg;break L4779}}}while(0);aA=is(y)|0;ax=c[aA>>2]|0;if((ax|0)==1){bl=+(c[aA+8>>2]|0)}else if((ax|0)==2){bl=+h[aA+8>>3]}else if((ax|0)==3){bl=+uz(c[aA+8>>2]|0,0)}else{ay=3526;break L4581}if((c[U>>2]|0)==3){uu(c[V>>2]|0);c[U>>2]=1}aA=~~bl;c[10874]=aA;bm=c[13898]|0;if((aA|0)<1){ay=3531;break L4581}bj=bm;bk=c[8272]|0}else{bj=bf;bk=bg}}while(0);L4805:do{if((bk|0)>(bj|0)){aA=c[1054]|0;if((a[aA+(bj*40&-1)|0]&1)==0){bn=bj;bo=bk;break}ax=c[aA+(bj*40&-1)+36>>2]|0;aN=aA+(bj*40&-1)+32|0;av=c[10036]|0;aC=0;while(1){if((aC|0)>=(ax|0)){break}if((a[av+((c[aN>>2]|0)+aC|0)|0]|0)==(a[aC+183584|0]|0)){aC=aC+1|0}else{bn=bj;bo=bk;break L4805}}if((aC|0)!=1){bn=bj;bo=bk;break}aN=bj+1|0;c[13898]=aN;L4813:do{if((bk|0)>(aN|0)){if((a[aA+(aN*40&-1)|0]&1)==0){break}ax=c[aA+(aN*40&-1)+36>>2]|0;az=aA+(aN*40&-1)+32|0;a5=0;while(1){if((a5|0)>=(ax|0)){break}if((a[av+((c[az>>2]|0)+a5|0)|0]|0)==(a[a5+183584|0]|0)){a5=a5+1|0}else{break L4813}}if((a5|0)==1){bn=aN;bo=bk;break L4805}}}while(0);aN=is(x)|0;av=c[aN>>2]|0;if((av|0)==1){bp=+(c[aN+8>>2]|0)}else if((av|0)==2){bp=+h[aN+8>>3]}else if((av|0)==3){bp=+uz(c[aN+8>>2]|0,0)}else{ay=3548;break L4581}if((c[W>>2]|0)==3){uu(c[X>>2]|0);c[W>>2]=1}aN=~~bp;c[10806]=aN;bq=c[13898]|0;if((aN|0)<0){ay=3553;break L4581}bn=bq;bo=c[8272]|0}else{bn=bj;bo=bk}}while(0);L4831:do{if((bo|0)>(bn|0)){aN=c[1054]|0;if((a[aN+(bn*40&-1)|0]&1)==0){br=bn;bs=bo;break}av=c[aN+(bn*40&-1)+36>>2]|0;aA=aN+(bn*40&-1)+32|0;aC=c[10036]|0;az=0;while(1){if((az|0)>=(av|0)){break}if((a[aC+((c[aA>>2]|0)+az|0)|0]|0)==(a[az+183584|0]|0)){az=az+1|0}else{br=bn;bs=bo;break L4831}}if((az|0)!=1){br=bn;bs=bo;break}aA=bn+1|0;c[13898]=aA;L4839:do{if((bo|0)>(aA|0)){if((a[aN+(aA*40&-1)|0]&1)==0){break}av=c[aN+(aA*40&-1)+36>>2]|0;ax=aN+(aA*40&-1)+32|0;a3=0;while(1){if((a3|0)>=(av|0)){break}if((a[aC+((c[ax>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{break L4839}}if((a3|0)==1){br=aA;bs=bo;break L4831}}}while(0);aA=is(u)|0;aC=c[aA>>2]|0;if((aC|0)==1){bu=+(c[aA+8>>2]|0)}else if((aC|0)==2){bu=+h[aA+8>>3]}else if((aC|0)==3){bu=+uz(c[aA+8>>2]|0,0)}else{ay=3570;break L4581}if((c[Y>>2]|0)==3){uu(c[Z>>2]|0);c[Y>>2]=1}aA=~~bu;c[10808]=aA;bv=c[13898]|0;if((aA|0)<0){ay=3575;break L4581}br=bv;bs=c[8272]|0}else{br=bn;bs=bo}}while(0);L4857:do{if((bs|0)>(br|0)){aA=c[1054]|0;if((a[aA+(br*40&-1)|0]&1)==0){bw=br;bx=bs;break}aC=c[aA+(br*40&-1)+36>>2]|0;aN=aA+(br*40&-1)+32|0;az=c[10036]|0;ax=0;while(1){if((ax|0)>=(aC|0)){break}if((a[az+((c[aN>>2]|0)+ax|0)|0]|0)==(a[ax+183584|0]|0)){ax=ax+1|0}else{bw=br;bx=bs;break L4857}}if((ax|0)!=1){bw=br;bx=bs;break}aN=br+1|0;c[13898]=aN;L4865:do{if((bs|0)>(aN|0)){if((a[aA+(aN*40&-1)|0]&1)==0){break}aC=c[aA+(aN*40&-1)+36>>2]|0;av=aA+(aN*40&-1)+32|0;a5=0;while(1){if((a5|0)>=(aC|0)){break}if((a[az+((c[av>>2]|0)+a5|0)|0]|0)==(a[a5+183584|0]|0)){a5=a5+1|0}else{break L4865}}if((a5|0)==1){bw=aN;bx=bs;break L4857}}}while(0);aN=is(t)|0;az=c[aN>>2]|0;if((az|0)==1){by=+(c[aN+8>>2]|0)}else if((az|0)==2){by=+h[aN+8>>3]}else if((az|0)==3){by=+uz(c[aN+8>>2]|0,0)}else{ay=3592;break L4581}if((c[_>>2]|0)==3){uu(c[$>>2]|0);c[_>>2]=1}aN=~~by;c[8832]=aN;bz=c[13898]|0;if((aN|0)<(c[10806]|0)){ay=3597;break L4581}bw=bz;bx=c[8272]|0}else{bw=br;bx=bs}}while(0);if((bx|0)<=(bw|0)){aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}aN=c[1054]|0;if((a[aN+(bw*40&-1)|0]&1)==0){aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}az=c[aN+(bw*40&-1)+36>>2]|0;aA=aN+(bw*40&-1)+32|0;aN=c[10036]|0;ax=0;while(1){if((ax|0)>=(az|0)){break}if((a[aN+((c[aA>>2]|0)+ax|0)|0]|0)==(a[ax+183584|0]|0)){ax=ax+1|0}else{aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}}if((ax|0)!=1){aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}c[13898]=bw+1;aA=is(s)|0;aN=c[aA>>2]|0;if((aN|0)==1){bA=+(c[aA+8>>2]|0)}else if((aN|0)==2){bA=+h[aA+8>>3]}else if((aN|0)==3){bA=+uz(c[aA+8>>2]|0,0)}else{ay=3608;break L4581}if((c[ab>>2]|0)==3){uu(c[ac>>2]|0);c[ab>>2]=1}aA=~~bA;c[8834]=aA;if((aA|0)<(c[10808]|0)){ay=3612;break L4581}else{aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}}}while(0);if(!((au|0)>0&(at^1))){break L4579}aA=c[10036]|0;aN=0;az=0;av=aw;while(1){if((a[aN+89424|0]|0)==(a[aA+(aN+av|0)|0]|0)){bB=av;bC=az}else{if((aN|0)!=4){break}bB=av-1|0;bC=1}aC=aN+1|0;if((aC|0)<(bC+au|0)){aN=aC;az=bC;av=bB}else{ay=3619;break}}do{if((ay|0)==3619){ay=0;if((bC|0)==0){if((aN-3|0)>>>0>=2){break}}if(an){aH=aq;ay=4037;break L4581}c[13898]=aq+1;uB(55600,24544);c[11670]=232;w=121;a[55702]=w&255;w=w>>8;a[55703|0]=w&255;it();av=c[18070]|0;az=db(av,c[av>>2]<<5|8,105624)|0;c[18070]=0;c[60]=az;c[11670]=0;aP=ap;aQ=ao;aS=1;aT=am;aU=al;break L4629}}while(0);if(at){break L4579}L4914:do{if((au|0)>0){aN=c[10036]|0;az=0;av=0;aA=aw;while(1){if((a[az+89072|0]|0)==(a[aN+(az+aA|0)|0]|0)){bD=aA;bE=av}else{if((az|0)!=1){break L4914}bD=aA-1|0;bE=1}aC=az+1|0;if((aC|0)<(bE+au|0)){az=aC;av=bE;aA=bD}else{break}}if((bE|0)==0){if(!((az|0)==0|(az|0)==5)){break}}if(ao){aH=aq;ay=4038;break L4581}if((a[47856]&1)==0){bF=aq;bG=ar}else{eA();bF=c[13898]|0;bG=c[8272]|0}L4930:do{if((bF|0)<(bG|0)){aA=c[1054]|0;L4932:do{if((a[aA+(bF*40&-1)|0]&1)!=0){av=c[aA+(bF*40&-1)+36>>2]|0;aN=aA+(bF*40&-1)+32|0;ax=c[10036]|0;aC=0;while(1){if((aC|0)>=(av|0)){break}if((a[ax+((c[aN>>2]|0)+aC|0)|0]|0)==(a[aC+103664|0]|0)){aC=aC+1|0}else{break L4932}}if((aC|0)==1){bH=bF;bI=bG;break L4930}}}while(0);aN=bF+1|0;c[13898]=aN;if((a[aA+(aN*40&-1)|0]&1)==0){bH=aN;bI=bG;break}ax=c[aA+(aN*40&-1)+32>>2]|0;av=c[10036]|0;a5=a[av+ax|0]|0;if(!((a5<<24>>24|0)==39|(a5<<24>>24|0)==34)){bH=aN;bI=bG;break}L4941:do{if((aN|0)<(bG|0)){a5=c[aA+(aN*40&-1)+36>>2]|0;a3=0;while(1){if((a3|0)>=(a5|0)){ay=3647;break}if((a[av+(a3+ax|0)|0]|0)==(a[a3+103664|0]|0)){a3=a3+1|0}else{break}}if((ay|0)==3647){ay=0;if((a3|0)==1){ay=3650;break}}a[14176]=1;is(r);a[14176]=0;if((c[K>>2]|0)!=3){c[13898]=aN;ay=3650;break}a5=c[L>>2]|0;c[11930]=a5;if((a5|0)==0){bJ=0;break}else{bK=0;bM=a5}L4952:while(1){aC=a8(bM|0,37)|0;if((aC|0)==0){break}else{bN=aC}while(1){aC=bN+1|0;a2=a[aC]|0;if((aZ(140272,a2|0,15)|0)!=0){bN=aC;continue}if((a2|0)==108){break}else if(!((a2|0)==42|(a2|0)==37)){bJ=a5;break L4941}a2=a8(bN+2|0,37)|0;if((a2|0)==0){break L4952}else{bN=a2}}a2=bN+2|0;if((aZ(140120,a[a2]|0|0,7)|0)==0){bJ=a5;break L4941}else{bK=bK+1|0;bM=a2}}if((bK-1|0)>>>0<7){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}else{bJ=a5}}else{ay=3650}}while(0);if((ay|0)==3650){ay=0;c[11930]=0;bJ=0}uu(bJ);c[11930]=0;c[13898]=aN;bH=aN;bI=c[8272]|0}else{bH=bF;bI=bG}}while(0);L4964:do{if((bH|0)<(bI|0)){az=c[1054]|0;L4966:do{if((a[az+(bH*40&-1)|0]&1)==0){bO=0;bQ=bH;bR=bI;bS=az}else{ax=c[az+(bH*40&-1)+36>>2]|0;av=az+(bH*40&-1)+32|0;aA=c[10036]|0;a3=0;while(1){if((a3|0)>=(ax|0)){break}if((a[aA+((c[av>>2]|0)+a3|0)|0]|0)==(a[a3+103664|0]|0)){a3=a3+1|0}else{bO=0;bQ=bH;bR=bI;bS=az;break L4966}}if((a3|0)==1){bT=0;bU=bH;bV=bI;break L4964}else{bO=0;bQ=bH;bR=bI;bS=az}}}while(0);while(1){az=c[11870]|0;if((az|0)>=(f|0)){ay=3666;break L4581}aN=(bR|0)>(bQ|0);av=a[bS+(bQ*40&-1)|0]|0;L4975:do{if(aN){aA=(av&1)==0;if(aA){ay=3680;break}ax=c[bS+(bQ*40&-1)+36>>2]|0;a5=bS+(bQ*40&-1)+32|0;a2=c[10036]|0;aC=0;while(1){if((aC|0)>=(ax|0)){ay=3672;break}if((a[a2+((c[a5>>2]|0)+aC|0)|0]|0)==(a[aC+183584|0]|0)){aC=aC+1|0}else{break}}do{if((ay|0)==3672){ay=0;if((aC|0)!=1){break}c[1048+(az*12&-1)>>2]=az;c[11870]=az+1;bW=(az|0)>(bO|0)?az:bO;break L4975}}while(0);if(aA){ay=3680;break}aC=c[bS+(bQ*40&-1)+36>>2]|0;a5=bS+(bQ*40&-1)+32|0;a2=c[10036]|0;ax=0;while(1){if((ax|0)>=(aC|0)){break}if((a[a2+((c[a5>>2]|0)+ax|0)|0]|0)==(a[ax+199040|0]|0)){ax=ax+1|0}else{ay=3680;break L4975}}if((ax|0)!=1){ay=3680;break}a[43464]=0;c[11670]=0;c[18068]=-99;it();a5=c[18070]|0;a2=db(a5,c[a5>>2]<<5|8,105624)|0;c[18070]=0;a5=c[11870]|0;c[1056+(a5*12&-1)>>2]=a2;a2=c[18068]|0;c[11870]=a5+1;c[1048+(a5*12&-1)>>2]=a2;bW=(bO|0)<(a2|0)?a2:bO}else{ay=3680}}while(0);L4991:do{if((ay|0)==3680){ay=0;az=c[bS+(bQ*40&-1)+36>>2]|0;a3=c[bS+(bQ*40&-1)+32>>2]|0;a2=(av&1)==0;L4993:do{if((az|0)>0&(a2^1)){a5=c[10036]|0;aC=0;aA=0;a4=a3;while(1){if((a[aC+141928|0]|0)==(a[a5+(aC+a4|0)|0]|0)){bX=a4;bY=aA}else{if((aC|0)!=4){break}bX=a4-1|0;bY=1}aG=aC+1|0;if((aG|0)<(bY+az|0)){aC=aG;aA=bY;a4=bX}else{ay=3686;break}}do{if((ay|0)==3686){ay=0;if((bY|0)==0){if(!((aC|0)==3|(aC|0)==10)){break}}eY(3);bW=bO;break L4991}}while(0);if(a2){break}else{bZ=0;b_=0;b$=a3}while(1){if((a[bZ+141800|0]|0)==(a[a5+(bZ+b$|0)|0]|0)){b0=b$;b1=b_}else{if((bZ|0)!=5){b2=0;b3=0;b4=a3;break}b0=b$-1|0;b1=1}aC=bZ+1|0;if((aC|0)<(b1+az|0)){bZ=aC;b_=b1;b$=b0}else{ay=3694;break}}do{if((ay|0)==3694){ay=0;if((b1|0)==0){if(!((bZ|0)==4|(bZ|0)==11)){b2=0;b3=0;b4=a3;break}}eY(4);bW=bO;break L4991}}while(0);while(1){if((a[b2+141632|0]|0)==(a[a5+(b2+b4|0)|0]|0)){b5=b4;b6=b3}else{if((b2|0)!=4){b7=0;b8=0;b9=a3;break}b5=b4-1|0;b6=1}aC=b2+1|0;if((aC|0)<(b6+az|0)){b2=aC;b3=b6;b4=b5}else{ay=3701;break}}do{if((ay|0)==3701){ay=0;if((b6|0)==0){if(!((b2|0)==3|(b2|0)==10)){b7=0;b8=0;b9=a3;break}}eY(5);bW=bO;break L4991}}while(0);while(1){if((a[b7+141416|0]|0)==(a[a5+(b7+b9|0)|0]|0)){ca=b9;cb=b8}else{if((b7|0)!=5){cc=0;cd=0;ce=a3;break}ca=b9-1|0;cb=1}aC=b7+1|0;if((aC|0)<(cb+az|0)){b7=aC;b8=cb;b9=ca}else{ay=3708;break}}do{if((ay|0)==3708){ay=0;if((cb|0)==0){if(!((b7|0)==4|(b7|0)==11)){cc=0;cd=0;ce=a3;break}}eY(6);bW=bO;break L4991}}while(0);while(1){if((a[cc+141296|0]|0)==(a[a5+(cc+ce|0)|0]|0)){cf=ce;cg=cd}else{if((cc|0)!=4){ch=0;ci=0;cj=a3;break}cf=ce-1|0;cg=1}aC=cc+1|0;if((aC|0)<(cg+az|0)){cc=aC;cd=cg;ce=cf}else{ay=3715;break}}do{if((ay|0)==3715){ay=0;if((cg|0)==0){if(!((cc|0)==3|(cc|0)==10)){ch=0;ci=0;cj=a3;break}}eY(7);bW=bO;break L4991}}while(0);while(1){if((a[ch+141096|0]|0)==(a[a5+(ch+cj|0)|0]|0)){ck=cj;cl=ci}else{if((ch|0)!=5){cm=0;break}ck=cj-1|0;cl=1}aC=ch+1|0;if((aC|0)<(cl+az|0)){ch=aC;ci=cl;cj=ck}else{ay=3722;break}}do{if((ay|0)==3722){ay=0;if((cl|0)==0){if(!((ch|0)==4|(ch|0)==11)){cm=0;break}}eY(8);bW=bO;break L4991}}while(0);do{if((a[cm+128552|0]|0)!=(a[a5+(cm+a3|0)|0]|0)){break L4993}cm=cm+1|0;}while((cm|0)<(az|0));if((cm|0)!=3){break}eY(2);bW=bO;break L4991}}while(0);L5068:do{if(aN){L5070:do{if(!a2){ax=c[10036]|0;a5=0;while(1){if((a5|0)>=(az|0)){break}if((a[ax+(a5+a3|0)|0]|0)==(a[a5+103664|0]|0)){a5=a5+1|0}else{break L5070}}if((a5|0)==1){break L5068}}}while(0);a[14176]=1;is(p);a[14176]=0;if((c[M>>2]|0)!=3){c[13898]=bQ;break}ax=c[N>>2]|0;if((ax|0)==0){break}aC=ut(68)|0;if((aC|0)==0){gk();a4=ut(68)|0;if((a4|0)==0){ay=3740;break L4581}else{cn=a4}}else{cn=aC}c[cn>>2]=2;c[cn+8>>2]=1;c[cn+16>>2]=3;c[cn+24>>2]=ax;c[cn+40>>2]=42;c[cn+48>>2]=0;aC=c[11870]|0;c[1056+(aC*12&-1)>>2]=cn;a4=aC+1|0;c[11870]=a4;c[1048+(aC*12&-1)>>2]=-99;a[32928]=1;a[43464]=0;if((a4|0)!=2){bW=bO;break L4991}uu(c[11902]|0);c[11902]=bP(ax|0)|0;bW=bO;break L4991}}while(0);a3=is(l)|0;az=c[a3>>2]|0;if((az|0)==1){co=+(c[a3+8>>2]|0)}else if((az|0)==2){co=+h[a3+8>>3]}else if((az|0)==3){co=+uz(c[a3+8>>2]|0,0)}else{ay=3747;break L4581}if((c[O>>2]|0)==3){uu(c[P>>2]|0);c[O>>2]=1}a3=~~co;if((a3|0)<-2){ay=3751;break L4581}az=c[11870]|0;c[11870]=az+1;c[1048+(az*12&-1)>>2]=a3;bW=(a3|0)>(bO|0)?a3:bO}}while(0);aN=c[13898]|0;av=c[8272]|0;if((av|0)<=(aN|0)){bT=bW;bU=aN;bV=av;break L4964}a3=c[1054]|0;if((a[a3+(aN*40&-1)|0]&1)==0){bT=bW;bU=aN;bV=av;break L4964}az=c[a3+(aN*40&-1)+36>>2]|0;a2=a3+(aN*40&-1)+32|0;ax=c[10036]|0;a4=0;while(1){if((a4|0)>=(az|0)){break}if((a[ax+((c[a2>>2]|0)+a4|0)|0]|0)==(a[a4+183584|0]|0)){a4=a4+1|0}else{bT=bW;bU=aN;bV=av;break L4964}}if((a4|0)!=1){bT=bW;bU=aN;bV=av;break L4964}a2=aN+1|0;c[13898]=a2;if((a2|0)==0){bT=bW;bU=0;bV=av;break}else{bO=bW;bQ=a2;bR=av;bS=a3}}}else{bT=0;bU=bH;bV=bI}}while(0);if((a[47856]&1)==0){cq=bU;cr=bV}else{eQ(bT);cq=c[13898]|0;cr=c[8272]|0}if((cq|0)>=(cr|0)){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}a2=c[1054]|0;if((a[a2+(cq*40&-1)|0]&1)==0){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}ax=c[a2+(cq*40&-1)+36>>2]|0;az=a2+(cq*40&-1)+32|0;a2=c[10036]|0;aC=0;while(1){if((aC|0)>=(ax|0)){ay=3767;break}aA=c[az>>2]|0;if((a[a2+(aA+aC|0)|0]|0)==(a[aC+103664|0]|0)){aC=aC+1|0}else{cs=aA;break}}if((ay|0)==3767){ay=0;if((aC|0)==1){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}cs=c[az>>2]|0}aA=a[a2+cs|0]|0;if((aA<<24>>24|0)==39|(aA<<24>>24|0)==34){ct=0}else{aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}while(1){if((ct|0)>=(ax|0)){ay=3772;break}if((a[a2+(ct+cs|0)|0]|0)==(a[ct+103664|0]|0)){ct=ct+1|0}else{break}}if((ay|0)==3772){ay=0;if((ct|0)==1){break L4581}}a[14176]=1;is(q);a[14176]=0;if((c[Q>>2]|0)!=3){ay=3774;break L4581}a2=c[R>>2]|0;c[11930]=a2;if((a2|0)==0){ay=4050;break L4581}else{cv=0;cw=a2}L5123:while(1){a2=a8(cw|0,37)|0;if((a2|0)==0){break}else{cx=a2}while(1){a2=cx+1|0;ax=a[a2]|0;if((aZ(140272,ax|0,15)|0)!=0){cx=a2;continue}if((ax|0)==108){break}else if(!((ax|0)==42|(ax|0)==37)){ay=4051;break L4581}ax=a8(cx+2|0,37)|0;if((ax|0)==0){break L5123}else{cx=ax}}ax=cx+2|0;if((aZ(140120,a[ax]|0|0,7)|0)==0){ay=4052;break L4581}else{cv=cv+1|0;cw=ax}}if((cv-1|0)>>>0<7){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}else{ay=4053;break L4581}}}while(0);if(!((au|0)>0&(at^1))){break L4579}ax=c[10036]|0;a2=0;while(1){if((a[a2+88368|0]|0)!=(a[ax+(a2+aw|0)|0]|0)){break}cy=a2+1|0;if((cy|0)<(au|0)){a2=cy}else{ay=3788;break}}do{if((ay|0)==3788){ay=0;if((cy|0)!=8){break}c[13898]=aq+1;a[872]=1;aP=ap;aQ=ao;aS=an;aT=am;aU=al;break L4629}}while(0);if(!((au|0)>0&(at^1))){break L4579}a2=c[10036]|0;ax=0;az=0;aC=aw;while(1){if((a[ax+87120|0]|0)==(a[a2+(ax+aC|0)|0]|0)){cz=aC;cA=az}else{if((ax|0)!=6){break L4579}cz=aC-1|0;cA=1}aA=ax+1|0;if((aA|0)<(cA+au|0)){ax=aA;az=cA;aC=cz}else{break}}if((cA|0)==0){if(!((ax|0)==5|(ax|0)==11)){break L4579}}c[13898]=aq+1;a[J]=1;aP=ap;aQ=ao;aS=an;aT=am;aU=al}}while(0);au=c[13898]|0;aw=c[8272]|0;if((au|0)<(aw|0)){al=aU;am=aT;an=aS;ao=aQ;ap=aP;aq=au;ar=aw}else{break L4579}}if((ay|0)==3462){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3509){uf(bi,139088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3388){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3478){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3404){uf(aX,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3482){uf(c[13898]|0,139280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3526){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3531){uf(bm,139088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3575){uf(bv,138968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3442){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3381){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3426){uf(aq,139624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3570){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3467){uf(ba,139480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3504){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3548){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3553){uf(bq,138968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3592){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3597){uf(bz,138672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3608){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3612){uf(c[13898]|0,138528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3666){uf(bQ,82688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3740){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=179864,v)|0);return 0}else if((ay|0)==3747){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3751){uf(c[13898]|0,140816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3774){c[13898]=cq}else if((ay|0)==4033){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4034){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4035){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4036){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4037){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4038){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4050){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4051){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4052){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4053){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}c[11930]=0;cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);L5192:do{if((c[9056]|0)==2){if((c[11870]|0)==1){c[13488]=c[262];break}do{if((j|0)!=0){if((c[j+8>>2]|0)!=3){break}c[13488]=c[268];break L5192}}while(0);c[13488]=c[265]}}while(0);c[7638]=-1;c[8800]=0;c[11854]=0;c[11852]=0;c[11850]=0;if((c[8716]|0)>>>0<160){c[8716]=160;j=ut(160)|0;do{if((j|0)==0){gk();aq=ut(160)|0;if((aq|0)!=0){cC=aq;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84816,v)|0);return 0}else{cC=j}}while(0);c[8802]=cC}cC=c[11932]|0;j=a[cC]|0;L5209:do{if((j<<24>>24|0)==60){do{if((uA(cC|0)|0)>>>0>1){if((a[cC+1|0]|0)!=38){if((j<<24>>24|0)==60){break}else if((j<<24>>24|0)==45){ay=3830;break L5209}else if((j<<24>>24|0)==43){ay=3836;break L5209}else{ay=3840;break L5209}}aq=aE(cC+2|0,F|0,10)|0;c[12894]=aq;cB=c[F>>2]|0;if((a[cB]|0)!=0|(aq|0)<0){uf(H,84216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((cB|0)==((c[11932]|0)+2|0)){uf(H,84216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((aq|0)==(aR(c[o>>2]|0)|0)){uf(H,83392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=c[12894]|0;if((aq|0)==(aR(c[n>>2]|0)|0)){uf(H,83392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=c[12894]|0;if((aq|0)==(aR(c[m>>2]|0)|0)){uf(H,83392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=bL(c[12894]|0,193632)|0;c[12892]=aq;if((aq|0)!=0){break L5209}uf(H,80992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=bt(cC+1|0,193632)|0;c[12892]=aq;if((aq|0)==0){uj(H,79632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{a[47440]=1;break}}else if((j<<24>>24|0)==45){ay=3830}else if((j<<24>>24|0)==43){ay=3836}else{ay=3840}}while(0);do{if((ay|0)==3830){if((uA(cC|0)|0)!=1){ay=3840;break}a[30664]=1;a[872]=1;j=c[8804]|0;if((j|0)==0){c[12892]=0;ay=3834}else{F=c[j>>2]|0;c[12892]=F;if((F|0)==0){ay=3834}}if((ay|0)==3834){c[12892]=c[o>>2]}a[34104]=1}else if((ay|0)==3836){F=uA(cC|0)|0;if((F|0)==1){c[11854]=1;break}if(!((a[cC+1|0]|0)==43&(F|0)==2)){break}c[11854]=2}}while(0);do{if((ay|0)==3840){iQ(47728);do{if((cu(c[11932]|0,G|0)|0)>-1){if((c[G+8>>2]&61440|0)!=16384){break}uj(H,78896,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0);return 0}}while(0);cC=hA(c[11932]|0,(a[47856]&1)!=0?78360:193632)|0;c[12892]=cC;if((cC|0)!=0){break}uh(-1,77960,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0);a[47736]=1;cD=-1;i=k;return cD|0}}while(0);do{if((a[47544]&1)!=0){H=c[12892]|0;if((a[47856]&1)!=0){G=~~+eE(H);if((G|0)==0){uf(-1,146120,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((G|0)>1e8){uf(-1,145960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}co=+eE(H);h[5944]=co;if((G|0)>1){cC=(G<<2)-8|0;cp(H|0,cC|0,1);cE=+eE(H)}else{cE=co}h[5946]=cE;h[5945]=+eE(H);cp(H|0,0,2);cC=(bc(H|0)|0)>>>2;F=G+1|0;j=(cC|0)/(F|0)&-1;if((aa(j,F)|0)==(cC|0)){cC=G<<2^-4;cp(H|0,cC|0,2);h[5947]=+eE(H);c[(c[12172]|0)+140>>2]=G;c[(c[12172]|0)+144>>2]=j;cp(H|0,0,0);break}else{uf(-1,145728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}H=c[11940]|0;if((H|0)!=0){uu(H)}c[12170]=0;c[12220]=0;c[12222]=0;c[12224]=0;c[11876]=0;H=c[11950]|0;if((c[11884]|0)<1){j=db(H,12,215112)|0;c[11950]=j;c[11884]=1;cF=j}else{cF=H}c[cF>>2]=0;H=c[12172]|0;j=c[11864]|0;if((j|0)>0){G=0;cC=j;while(1){j=H+(G*232&-1)+224|0;F=c[j>>2]|0;if((F|0)==0){cG=cC}else{uu(F);c[j>>2]=0;cG=c[11864]|0}j=G+1|0;if((j|0)<(cG|0)){G=j;cC=cG}else{break}}}c[11864]=0;cC=c[11862]|0;if((cC|0)==0){c[12204]=c[12200];c[12208]=0;G=c[12172]|0;do{if((c[11880]|0)<1){H=db(G,232,216568)|0;j=H;c[12172]=j;if((H|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[11880]=1;cH=c[11864]|0;cI=j;break}}else{cH=0;cI=G}}while(0);uD(cI+(cH*232&-1)|0,48440,232);G=(c[11864]|0)+1|0;c[11864]=G;cJ=G;cK=cI}else{c[12204]=c[12202];c[12208]=c[12206];G=c[12172]|0;do{if((cC|0)>(c[11880]|0)){j=db(G,cC*232&-1,216568)|0;H=j;c[12172]=H;if((j|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[11880]=cC;cL=c[11864]|0;cM=H;break}}else{cL=0;cM=G}}while(0);if((cC|0)>0){G=0;H=cL;while(1){uD(cM+(H*232&-1)|0,48440,232);j=(c[11864]|0)+1|0;c[11864]=j;F=G+1|0;if((F|0)<(cC|0)){G=F;H=j}else{cN=j;break}}}else{cN=cL}uD(cM|0,c[12168]|0,cN*232&-1);cJ=c[11864]|0;cK=c[12172]|0}if((cJ|0)>0){H=0;G=cJ;while(1){cC=cK+(H*232&-1)+224|0;j=c[cC>>2]|0;if((j|0)==0){cO=G}else{uu(j);c[cC>>2]=0;cO=c[11864]|0}cC=H+1|0;if((cC|0)<(cO|0)){H=cC;G=cO}else{break}}}c[11864]=0;G=0;H=0;cC=0;j=0;F=0;aq=0;L5319:while(1){cB=cC;aH=j;cq=F;bQ=aq;L5321:while(1){cP=cB;while(1){bz=eV()|0;if((bz|0)==0){ay=3886;break L5321}else{cQ=bz}while(1){if((aM(d[cQ]|0|0)|0)==0){break}else{cQ=cQ+1|0}}cR=a[cQ]|0;if(cR<<24>>24!=0){if((a8(c[11948]|0,cR<<24>>24|0)|0)==0){break}}if((cP|0)==0){cP=0}else{ay=3891;break L5321}}if(a[34104]|0){if((cR<<24>>24|0)==101|(cR<<24>>24|0)==69){ay=3894;break}}cS=eX(cQ)|0;if((cS|0)==0){ay=3911;break}if(!((cq|0)==0|(cS|0)==(cq|0))){ay=3897;break L5319}cT=bQ+1|0;if((cT|0)>(aH|0)){ax=aH<<1;bz=(ax|0)>1?ax:1;cU=db(cP,aa(bz<<2,cS),145264)|0;cV=bz}else{cU=cP;cV=aH}if((cS|0)>0){cW=H;cX=G;cY=0;ay=3903;break}else{cB=cU;aH=cV;cq=cS;bQ=cT}}if((ay|0)==3886){ay=0;a[47736]=1;ay=3911}else if((ay|0)==3891){ay=0;c[11940]=cP}else if((ay|0)==3894){ay=0;a[47736]=1;ay=3911}else if((ay|0)==3903){while(1){ay=0;aH=c[11952]|0;do{if((cY|0)<(c[10806]|0)){if((c[aH+(cY*24&-1)+8>>2]|0)==1){ay=3906;break}g[cU+(cX<<2)>>2]=0.0}else{ay=3906}}while(0);if((ay|0)==3906){ay=0;g[cU+(cX<<2)>>2]=+h[aH+(cY*24&-1)>>3]}cB=cX+1|0;do{if((c[(c[11952]|0)+(cY*24&-1)+8>>2]|0)==1){cZ=cW}else{bz=cW+1|0;if((cW|0)!=0){cZ=bz;break}uh(-1,145016,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cZ=bz}}while(0);aH=cY+1|0;if((aH|0)<(cS|0)){cW=cZ;cX=cB;cY=aH;ay=3903}else{break}}G=cS+G|0;H=cZ;cC=cU;j=cV;F=cS;aq=cT;continue}if((ay|0)==3911){ay=0;c[11940]=cP;if((cP|0)==0){ay=3919;break}}aH=c[11864]|0;if((a[47464]&1)==0){c_=cq;c$=bQ}else{c_=cq-1|0;c$=bQ-1|0}bz=aH+1|0;ax=c[12172]|0;if((bz|0)>(c[11880]|0)){bq=db(ax,bz*232&-1,216568)|0;ba=bq;c[12172]=ba;if((bq|0)==0){ay=3916;break}c[11880]=bz;c0=c[11864]|0;c1=c[11940]|0;c2=ba}else{c0=aH;c1=cP;c2=ax}uD(c2+(c0*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1;c[c2+(aH*232&-1)+224>>2]=c1;c[11940]=0;c[(c[12172]|0)+(aH*232&-1)+140>>2]=c_;c[(c[12172]|0)+(aH*232&-1)+144>>2]=c$;c[(c[12172]|0)+(aH*232&-1)+148>>2]=0;c[12208]=0;G=0;H=0;cC=0;j=0;F=0;aq=0}if((ay|0)==3897){if((cP|0)==0){uf(-1,145560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}uu(cP);uf(-1,145560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3916){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3919){a[47736]=0;break}}}while(0);cP=a[47856]|0;c$=a[47544]|0;do{if((cP&1)==0){if((c$&1)!=0){ay=3922;break}a[47392]=0}else{ay=3922}}while(0);L5379:do{if((ay|0)==3922){a[47392]=1;c_=E;c1=(c$&1)==0;if((c$&cP&1)!=0){a[47464]=1}c2=c[13898]|0;c0=c[8272]|0;L5384:do{if((c2|0)<(c0|0)){cT=c[1054]|0;cS=c2;while(1){L5388:do{if((a[cT+(cS*40&-1)|0]&1)!=0){cV=c[cT+(cS*40&-1)+36>>2]|0;cU=cT+(cS*40&-1)+32|0;cZ=c[10036]|0;cY=0;while(1){if((cY|0)>=(cV|0)){ay=3930;break}if((a[cZ+((c[cU>>2]|0)+cY|0)|0]|0)==(a[cY+103664|0]|0)){cY=cY+1|0}else{break}}if((ay|0)==3930){ay=0;if((cY|0)==1){c3=cS;break L5384}}if((cV|0)<=0){break}cX=0;cW=0;cQ=c[cU>>2]|0;while(1){if((a[cX+196448|0]|0)==(a[cZ+(cX+cQ|0)|0]|0)){c4=cQ;c5=cW}else{if((cX|0)!=1){break L5388}c4=cQ-1|0;c5=1}cR=cX+1|0;if((cR|0)<(c5+cV|0)){cX=cR;cW=c5;cQ=c4}else{break}}if((c5|0)!=0){c3=cS;break L5384}if((cX|0)==0|(cX|0)==4){c3=cS;break L5384}}}while(0);cB=cS+1|0;c[13898]=cB;if((cB|0)<(c0|0)){cS=cB}else{c3=cB;break}}}else{c3=c2}}while(0);L5407:do{if((c3|0)<(c0|0)){cS=c[1054]|0;L5409:do{if((a[cS+(c3*40&-1)|0]&1)==0){c6=c[10036]|0}else{cT=c[cS+(c3*40&-1)+36>>2]|0;bQ=cS+(c3*40&-1)+32|0;cq=c[10036]|0;cB=0;while(1){if((cB|0)>=(cT|0)){break}if((a[cq+((c[bQ>>2]|0)+cB|0)|0]|0)==(a[cB+103664|0]|0)){cB=cB+1|0}else{c6=cq;break L5409}}if((cB|0)==1){c7=1;break L5407}else{c6=cq}}}while(0);bQ=c3+1|0;c[13898]=bQ;cT=c[cS+(bQ*40&-1)+36>>2]|0;cQ=c[cS+(bQ*40&-1)+32>>2]|0;cW=(a[cS+(bQ*40&-1)|0]&1)==0;bQ=(cT|0)>0;cV=30672;cZ=116448;L5417:while(1){L5419:do{if(!cW){if(bQ){cU=0;cY=0;cR=cQ;while(1){cO=a[cZ+cU|0]|0;if(cO<<24>>24==(a[c6+(cU+cR|0)|0]|0)){c8=cR;c9=cY}else{if(cO<<24>>24!=36){break L5419}c8=cR-1|0;c9=1}da=cU+1|0;if((da|0)<(c9+cT|0)){cU=da;cY=c9;cR=c8}else{break}}if((c9|0)==0){dc=da}else{dd=cV;break L5417}}else{dc=0}cR=a[cZ+dc|0]|0;if((cR<<24>>24|0)==36|(cR<<24>>24|0)==0){dd=cV;break L5417}}}while(0);cq=cV+8|0;cB=c[cq>>2]|0;if((cB|0)==0){dd=cq;break}else{cV=cq;cZ=cB}}cZ=c[dd+4>>2]|0;cV=c3+2|0;c[13898]=cV;if((cZ|0)!=-1){c7=cZ;break}uf(cV,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c7=1}}while(0);c[13898]=c2;c0=0;while(1){if(c0>>>0>=31){break}if((c[48912+(c0<<3)>>2]|0)==(c7|0)){break}else{c0=c0+1|0}}if((c0|0)==31){uf(c2,148528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}do{if(!c1){if((c[11876]|0)>3){uf(-1,148288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{eQ(3);break}}}while(0);do{if((c[11870]|0)==0){if((a[47544]&1)!=0){c1=b[48918+(c0<<3)>>1]|0;if((c1<<16>>16|0)==2){if((b[48916+(c0<<3)>>1]|0)==1){c[11870]=3;break}else{uf(-1,147704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}else if((c1<<16>>16|0)==1){if((b[48916+(c0<<3)>>1]|0)!=1){uf(-1,147704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((c[11856]|0)==2){c[11870]=3;break}else{c[11870]=2;c[265]=3;break}}else{uf(-1,147704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}c1=b[48916+(c0<<3)>>1]|0;cV=c1<<16>>16;if(c1<<16>>16==0){uf(c2,148528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}do{if((c[11864]|0)==0){ay=3976}else{if((a[(c[12172]|0)+124|0]&1)==0){ay=3976;break}if((b[48918+(c0<<3)>>1]|0)!=0){de=cV;break}uf(c2,148080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);do{if((ay|0)==3976){c1=(b[48918+(c0<<3)>>1]|0)+cV|0;if((c[11856]|0)!=2){de=c1;break}de=c1+1|0}}while(0);if((de|0)<8){c[11870]=de;eQ(de);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=147920,v)|0);return 0}}}while(0);c2=c[11864]|0;if((c2|0)==0){break}cV=c[12172]|0;if((a[cV+124|0]&1)==0){break}if((a[47544]&1)!=0){break}uD(c_|0,1048,84);if((c[cV>>2]|0)==0){if((c[cV+140>>2]|0)==0){df=0}else{ay=3994}}else{ay=3994}do{if((ay|0)==3994){if((c[cV+4>>2]|0)==0){if((c[cV+144>>2]|0)==0){df=1;break}}if((c[cV+8>>2]|0)==0){if((c[cV+148>>2]|0)==0){df=2;break}}df=3}}while(0);c1=c[11870]|0;cZ=c1+df|0;if((cZ|0)>6){uf(-1,146856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}uD(1048+(df*12&-1)|0,c_|0,c1*12&-1);if((df|0)!=0){c1=0;do{c[1048+(c1*12&-1)>>2]=c[cV+112+(c1<<2)>>2];c[1056+(c1*12&-1)>>2]=0;c1=c1+1|0;}while((c1|0)<(df|0))}c[11870]=cZ;if(!((c[11856]|0)==2&(c2|0)>0)){break}c1=48918+(c0<<3)|0;c_=0;cT=cZ;L5502:while(1){do{if((c[cV+(c_*232&-1)+8>>2]|0)==0){if((c[cV+(c_*232&-1)+148>>2]|0)!=0){dg=cT;break}cQ=b[c1>>1]|0;if(cQ<<16>>16>2){ay=4004;break L5502}do{if((c[cV+(c_*232&-1)+4>>2]|0)==0){if((c[cV+(c_*232&-1)+144>>2]|0)!=0){dh=cT;break}if(cQ<<16>>16>1){ay=4008;break L5502}if((cT|0)>6){ay=4011;break L5502}if((cT|0)>1){bQ=cT;while(1){cW=bQ-1|0;cS=1048+(bQ*12&-1)|0;cB=1048+(cW*12&-1)|0;c[cS>>2]=c[cB>>2];c[cS+4>>2]=c[cB+4>>2];c[cS+8>>2]=c[cB+8>>2];if((cW|0)>1){bQ=cW}else{break}}}c[265]=-4;c[267]=0;bQ=cT+1|0;c[11870]=bQ;dh=bQ}else{dh=cT}}while(0);if((dh|0)>6){ay=4016;break L5502}if((dh|0)>2){cQ=dh;while(1){bQ=cQ-1|0;cW=1048+(cQ*12&-1)|0;cB=1048+(bQ*12&-1)|0;c[cW>>2]=c[cB>>2];c[cW+4>>2]=c[cB+4>>2];c[cW+8>>2]=c[cB+8>>2];if((bQ|0)>2){cQ=bQ}else{break}}}c[268]=-5;c[270]=0;cQ=dh+1|0;c[11870]=cQ;dg=cQ}else{dg=cT}}while(0);cQ=c_+1|0;if((cQ|0)<(c2|0)){c_=cQ;cT=dg}else{break L5379}}if((ay|0)==4004){uf(-1,147376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4008){uf(-1,147096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4011){uf(-1,146856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4016){uf(-1,146856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}}while(0);do{if((a[47544]&1)==0){if((c[11864]|0)!=1){di=0;break}ay=c[12172]|0;if((c[ay+4>>2]|0)>0){di=1;break}di=(c[ay+144>>2]|0)>0&1}else{di=1}}while(0);a[47584]=di;cD=c[11870]|0;i=k;return cD|0}function ez(){var b=0,d=0,e=0;b=i;c[11874]=0;if((c[12892]|0)==0){i=b;return}d=c[60]|0;if((d|0)!=0){e1(d);c[60]=0}d=c[264]|0;if((d|0)!=0){e1(d);c[264]=0}d=c[267]|0;if((d|0)!=0){e1(d);c[267]=0}d=c[270]|0;if((d|0)!=0){e1(d);c[270]=0}d=c[273]|0;if((d|0)!=0){e1(d);c[273]=0}d=c[276]|0;if((d|0)!=0){e1(d);c[276]=0}d=c[279]|0;if((d|0)!=0){e1(d);c[279]=0}d=c[282]|0;if((d|0)!=0){e1(d);c[282]=0}if((a[47584]&1)!=0&(c[11864]|0)>0){d=0;do{uu(c[(c[12172]|0)+(d*232&-1)+224>>2]|0);c[(c[12172]|0)+(d*232&-1)+224>>2]=0;d=d+1|0;}while((d|0)<(c[11864]|0))}do{if(!(a[34104]|0)){d=c[12894]|0;if((d|0)==(aR(c[12892]|0)|0)){cs(c[12892]|0);d=c[m>>2]|0;e=c[12894]|0;cf(d|0,77344,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}e=c[12892]|0;if(a[47440]|0){a2(e|0);a[47440]=0;break}else{az(e|0);break}}}while(0);a[34104]=0;c[12892]=0;i=b;return}function eA(){var a=0;c[11870]=0;c[262]=1;c[263]=0;a=c[264]|0;if((a|0)!=0){e1(a);c[264]=0}c[12210]=99;c[265]=2;c[266]=0;a=c[267]|0;if((a|0)!=0){e1(a);c[267]=0}c[12211]=99;c[268]=3;c[269]=0;a=c[270]|0;if((a|0)!=0){e1(a);c[270]=0}c[12212]=99;c[271]=4;c[272]=0;a=c[273]|0;if((a|0)!=0){e1(a);c[273]=0}c[12213]=99;c[274]=5;c[275]=0;a=c[276]|0;if((a|0)!=0){e1(a);c[276]=0}c[12214]=99;c[277]=6;c[278]=0;a=c[279]|0;if((a|0)!=0){e1(a);c[279]=0}c[12215]=99;c[280]=7;c[281]=0;a=c[282]|0;if((a|0)==0){c[12216]=99;return}e1(a);c[282]=0;c[12216]=99;return}function eB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0;e=i;i=i+56|0;f=e|0;g=e+24|0;j=e+48|0;k=j;l=i;i=i+47|0;i=i+7>>3<<3;m=c[12202]|0;if((m|0)>-1){c[12204]=m}m=c[13898]|0;n=c[1054]|0;o=n+(m*40&-1)+36|0;p=c[o>>2]|0;q=n+(m*40&-1)+32|0;r=c[q>>2]|0;s=n+(m*40&-1)|0;L5605:do{if((a[s]&1)==0){t=0;u=4113}else{if((p|0)>0){w=c[10036]|0;x=0;y=0;z=r;while(1){if((a[x+179688|0]|0)==(a[w+(x+z|0)|0]|0)){A=z;B=y}else{if((x|0)!=4){t=0;u=4113;break L5605}A=z-1|0;B=1}C=x+1|0;if((C|0)<(B+p|0)){x=C;y=B;z=A}else{break}}if((B|0)!=0|(C|0)==4){u=4117;break}else{D=C}}else{D=0}t=(D|0)==9;u=4113}}while(0);if((u|0)==4113){if(t|(c[12204]|0)>-1){u=4117}else{E=m}}if((u|0)==4117){c[j>>2]=0;c[j+4>>2]=0;if(b){uf(m,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[47544]=0;j=c[o>>2]|0;L5624:do{if((a[s]&1)!=0&(j|0)>0){o=c[10036]|0;t=0;D=0;C=c[q>>2]|0;while(1){if((a[t+179688|0]|0)==(a[o+(t+C|0)|0]|0)){F=C;G=D}else{if((t|0)!=4){break L5624}F=C-1|0;G=1}B=t+1|0;if((B|0)<(G+j|0)){t=B;D=G;C=F}else{break}}if((G|0)==0){if(!((t|0)==3|(t|0)==8)){break}}C=m+1|0;c[13898]=C;if((c[8272]|0)<=(C|0)){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[n+(C*40&-1)|0]&1)==0){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=c[n+(C*40&-1)+36>>2]|0;o=n+(C*40&-1)+32|0;B=c[10036]|0;A=0;while(1){if((A|0)>=(D|0)){break}if((a[B+((c[o>>2]|0)+A|0)|0]|0)==(a[A+115e3|0]|0)){A=A+1|0}else{u=4519;break}}if((u|0)==4519){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((A|0)!=1){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=m+2|0;c[13898]=o;D=c[n+(o*40&-1)+36>>2]|0;uD(k|0,B+(c[n+(o*40&-1)+32>>2]|0)|0,(D|0)<7?D:7);a[k+((D|0)>7?7:D)|0]=0;D=0;while(1){t=c[48696+(D<<3)>>2]|0;if((t|0)==0){break}if((uK(k|0,t|0)|0)==0){u=4137;break}else{D=D+1|0}}if((u|0)==4137){c[14150]=c[48700+(D<<3)>>2];c[12204]=D}if((c[12204]|0)==(D|0)){c[13898]=m+3;break}else{uf(o,178808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((c[11856]|0)!=0){do{if((aY(201e3,c[48696+(c[12204]<<3)>>2]|0)|0)==0){m=bh(c[11932]|0,46)|0;k=m+1|0;do{if((m|0)!=0){n=c[12174]|0;if((n|0)==0){break}else{I=0;J=n}do{if((uK(k|0,J|0)|0)==0){c[14150]=c[48700+(I<<3)>>2]}I=I+1|0;J=c[48696+(I<<3)>>2]|0;}while((J|0)!=0)}}while(0);if((c[14150]|0)!=64){break}uf(-1,178808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);cS[c[14150]&511]()}if((c[11864]|0)>0){J=0;do{I=c[12172]|0;if((c[I+(J*232&-1)+140>>2]|0)==(c[12145]|0)){K=I}else{c[I+(J*232&-1)>>2]=0;c[(c[12172]|0)+(J*232&-1)+4>>2]=0;c[(c[12172]|0)+(J*232&-1)+8>>2]=0;K=c[12172]|0}do{if(+h[K+(J*232&-1)+168>>3]!=0.0){if((c[K+(J*232&-1)+112>>2]|0)==-3){h[K+(J*232&-1)+24>>3]=0.0}if((c[K+(J*232&-1)+116>>2]|0)==-3){h[K+(J*232&-1)+32>>3]=0.0}if((c[K+(J*232&-1)+120>>2]|0)!=-3){break}h[K+(J*232&-1)+40>>3]=0.0}}while(0);do{if(+h[K+(J*232&-1)+176>>3]!=0.0){if((c[K+(J*232&-1)+112>>2]|0)==-4){h[K+(J*232&-1)+24>>3]=0.0}if((c[K+(J*232&-1)+116>>2]|0)==-4){h[K+(J*232&-1)+32>>3]=0.0}if((c[K+(J*232&-1)+120>>2]|0)!=-4){break}h[K+(J*232&-1)+40>>3]=0.0}}while(0);do{if(+h[K+(J*232&-1)+184>>3]!=0.0){if((c[K+(J*232&-1)+112>>2]|0)==-5){h[K+(J*232&-1)+24>>3]=0.0}if((c[K+(J*232&-1)+116>>2]|0)==-5){h[K+(J*232&-1)+32>>3]=0.0}if((c[K+(J*232&-1)+120>>2]|0)!=-5){break}h[K+(J*232&-1)+40>>3]=0.0}}while(0);if((c[K+(J*232&-1)+192>>2]|0)!=0){c[K+(J*232&-1)+48>>2]=0}J=J+1|0;}while((J|0)<(c[11864]|0))}E=c[13898]|0}J=c[8272]|0;L5717:do{if((E|0)<(J|0)){K=l|0;I=f|0;k=f+8|0;m=g|0;o=g+8|0;D=0;n=0;H=0;G=0;F=0;j=0;q=0;s=0;B=0;C=0;A=0;t=0;p=0;r=0;z=0;y=0;x=E;w=J;L5719:while(1){L=c[1054]|0;M=(a[L+(x*40&-1)|0]&1)==0;N=c[L+(x*40&-1)+36>>2]|0;O=L+(x*40&-1)+32|0;L5721:do{if(M){uD(K|0,31040,47);P=c[O>>2]|0;u=4193}else{Q=c[10036]|0;R=0;while(1){if((R|0)>=(N|0)){u=4166;break}if((a[Q+((c[O>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break}}if((u|0)==4166){u=0;if((R|0)==1){S=y;break L5717}}uD(K|0,31040,47);Q=c[O>>2]|0;if(!((N|0)>0&(M^1))){P=Q;u=4193;break}T=c[10036]|0;U=0;V=0;W=Q;while(1){if((a[U+178256|0]|0)==(a[T+(U+W|0)|0]|0)){X=W;Y=V}else{if((U|0)!=3){break}X=W-1|0;Y=1}Z=U+1|0;if((Z|0)<(Y+N|0)){U=Z;V=Y;W=X}else{u=4173;break}}do{if((u|0)==4173){u=0;if((Y|0)==0){if(!((U|0)==2|(U|0)==6)){break}}if(r){u=4538;break L5719}_=x+1|0;c[13898]=_;if(b){u=4177;break L5719}a[47544]=0;eS();$=y;aa=z;ab=1;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5721}}while(0);if(!((N|0)>0&(M^1))){P=Q;u=4193;break}U=c[10036]|0;W=0;V=0;T=Q;while(1){if((a[W+177976|0]|0)==(a[U+(W+T|0)|0]|0)){ap=T;aq=V}else{if((W|0)!=3){P=Q;u=4193;break L5721}ap=T-1|0;aq=1}R=W+1|0;if((R|0)<(aq+N|0)){W=R;V=aq;T=ap}else{break}}if((aq|0)==0){if(!((W|0)==2|(W|0)==5)){P=Q;u=4193;break}}if(H){u=4544;break L5719}ar=x+1|0;c[13898]=ar;if(b){u=4190;break L5719}a[47544]=0;eS();if((c[11864]|0)>0){as=0}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=1;an=n;ao=D;break}while(1){a[(c[12172]|0)+(as*232&-1)+124|0]=1;T=as+1|0;if((T|0)<(c[11864]|0)){as=T}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=1;an=n;ao=D;break}}}}while(0);L5760:do{if((u|0)==4193){u=0;O=(w|0)>(x|0);L5762:do{if(O){if(M){S=y;break L5717}Q=c[10036]|0;W=0;while(1){if((W|0)>=(N|0)){u=4198;break}if((a[Q+(P+W|0)|0]|0)==(a[W+177688|0]|0)){W=W+1|0}else{u=4199;break}}if((u|0)==4198){u=0;if((W|0)!=2){u=4199}}do{if((u|0)==4199){u=0;if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4204;break}if((a[Q+(P+T|0)|0]|0)==(a[T+177448|0]|0)){T=T+1|0}else{break}}if((u|0)==4204){u=0;if((T|0)==2){break}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;V=0;while(1){if((V|0)>=(N|0)){u=4218;break}if((a[Q+(P+V|0)|0]|0)==(a[V+176840|0]|0)){V=V+1|0}else{u=4219;break}}if((u|0)==4218){u=0;if((V|0)!=2){u=4219}}do{if((u|0)==4219){u=0;if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4224;break}if((a[Q+(P+T|0)|0]|0)==(a[T+176376|0]|0)){T=T+1|0}else{break}}if((u|0)==4224){u=0;if((T|0)==2){break}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;U=0;while(1){if((U|0)>=(N|0)){u=4236;break}if((a[Q+(P+U|0)|0]|0)==(a[U+175576|0]|0)){U=U+1|0}else{break}}if((u|0)==4236){u=0;if((U|0)==2){u=4237;break L5719}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4243;break}if((a[Q+(P+T|0)|0]|0)==(a[T+174728|0]|0)){T=T+1|0}else{break}}do{if((u|0)==4243){u=0;if((T|0)!=5){break}if(t){u=4537;break L5719}U=x+1|0;c[13898]=U;L5814:do{if((w|0)>(U|0)){if((a[L+(U*40&-1)|0]&1)==0){break}R=c[L+(U*40&-1)+36>>2]|0;Z=L+(U*40&-1)+32|0;at=0;while(1){if((at|0)>=(R|0)){break}if((a[Q+((c[Z>>2]|0)+at|0)|0]|0)==(a[at+115e3|0]|0)){at=at+1|0}else{break L5814}}if((at|0)!=1){break}eT(1,0);$=y;aa=z;ab=r;ac=p;ad=1;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if((c[11864]|0)>0){au=0}else{$=y;aa=z;ab=r;ac=p;ad=1;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}while(1){c[(c[12172]|0)+(au*232&-1)+12>>2]=-1;U=au+1|0;if((U|0)<(c[11864]|0)){au=U}else{$=y;aa=z;ab=r;ac=p;ad=1;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}}}while(0);if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4259;break}if((a[Q+(P+T|0)|0]|0)==(a[T+174440|0]|0)){T=T+1|0}else{break}}do{if((u|0)==4259){u=0;if((T|0)!=5){break}if(p){u=4549;break L5719}U=c[12172]|0;if(!(H|(U|0)!=0)){u=4262;break L5719}Z=x+1|0;c[13898]=Z;L5836:do{if((w|0)>(Z|0)){if((a[L+(Z*40&-1)|0]&1)==0){break}R=c[L+(Z*40&-1)+36>>2]|0;av=L+(Z*40&-1)+32|0;aw=0;while(1){if((aw|0)>=(R|0)){break}if((a[Q+((c[av>>2]|0)+aw|0)|0]|0)==(a[aw+115e3|0]|0)){aw=aw+1|0}else{break L5836}}if((aw|0)!=1){break}eT(1,1);$=y;aa=z;ab=r;ac=1;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if((c[11864]|0)>0){ax=0;ay=U}else{$=y;aa=z;ab=r;ac=1;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}while(1){c[ay+(ax*232&-1)+16>>2]=-1;Z=ax+1|0;if((Z|0)>=(c[11864]|0)){$=y;aa=z;ab=r;ac=1;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}ax=Z;ay=c[12172]|0}}}while(0);if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4278;break}if((a[Q+(P+T|0)|0]|0)==(a[T+173304|0]|0)){T=T+1|0}else{break}}if((u|0)==4278){u=0;if((T|0)==5){u=4279;break L5719}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;U=0;while(1){if((U|0)>=(N|0)){u=4285;break}if((a[Q+(P+U|0)|0]|0)==(a[U+172952|0]|0)){U=U+1|0}else{break}}do{if((u|0)==4285){u=0;if((U|0)!=4){break}if(C){u=4535;break L5719}c[13898]=x+1;eT(2,-1);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=1;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!O){break L5762}if(M){S=y;break L5717}U=c[10036]|0;Q=0;while(1){if((Q|0)>=(N|0)){u=4293;break}if((a[U+(P+Q|0)|0]|0)==(a[Q+172536|0]|0)){Q=Q+1|0}else{break}}do{if((u|0)==4293){u=0;if((Q|0)!=6){break}if(A){u=4546;break L5719}c[13898]=x+1;eT(2,1);$=y;aa=z;ab=r;ac=p;ad=t;ae=1;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;U=0;while(1){if((U|0)>=(N|0)){break}if((a[Q+(P+U|0)|0]|0)==(a[U+172256|0]|0)){U=U+1|0}else{break L5762}}if((U|0)!=4){break L5762}if(z){u=4541;break L5719}c[13898]=x+1;eT(3,0);$=y;aa=1;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(n){u=4536;break L5719}if(!(H|(c[12172]|0)!=0)){u=4227;break L5719}c[13898]=x+1;eT(0,1);if((c[11864]|0)<=0){$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=1;ao=D;break L5760}V=c[12172]|0;Q=0;while(1){h[V+(Q*232&-1)+40>>3]=+h[V+(Q*232&-1)+32>>3];T=Q+1|0;if((T|0)<(c[11864]|0)){Q=T}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=1;ao=D;break L5760}}}}while(0);if(D){u=4540;break L5719}c[13898]=x+1;eT(0,0);W=c[11864]|0;if(n){az=W}else{if((W|0)<=0){$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=0;ao=1;break L5760}W=c[12172]|0;Q=0;while(1){h[W+(Q*232&-1)+32>>3]=+h[W+(Q*232&-1)+24>>3];V=Q+1|0;T=c[11864]|0;if((V|0)<(T|0)){Q=V}else{az=T;break}}}if((az|0)<=0){$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=1;break L5760}Q=c[12172]|0;W=0;while(1){h[Q+(W*232&-1)+40>>3]=+h[Q+(W*232&-1)+24>>3];T=W+1|0;if((T|0)<(c[11864]|0)){W=T}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=1;break L5760}}}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}O=c[10036]|0;W=0;Q=0;T=P;while(1){if((a[W+171944|0]|0)==(a[O+(W+T|0)|0]|0)){aA=T;aB=Q}else{if((W|0)!=5){break}aA=T-1|0;aB=1}V=W+1|0;if((V|0)<(aB+N|0)){W=V;Q=aB;T=aA}else{u=4310;break}}do{if((u|0)==4310){u=0;if((aB|0)==0){if(!((W|0)==4|(W|0)==9)){break}}if(z){u=4543;break L5719}c[13898]=x+1;if((c[11864]|0)<=0){$=y;aa=1;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}T=c[12172]|0;Q=0;while(1){O=T+(Q*232&-1)+112|0;c[O>>2]=c[12099];c[O+4>>2]=c[48400>>2];c[O+8>>2]=c[48404>>2];O=Q+1|0;if((O|0)<(c[11864]|0)){Q=O}else{$=y;aa=1;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}}}while(0);if(M){S=y;break L5717}L5921:do{if((N|0)>0){W=c[10036]|0;Q=0;T=0;O=P;while(1){if((a[Q+171624|0]|0)==(a[W+(Q+O|0)|0]|0)){aC=O;aD=T}else{if((Q|0)!=4){break L5921}aC=O-1|0;aD=1}V=Q+1|0;if((V|0)<(aD+N|0)){Q=V;T=aD;O=aC}else{break}}if((aD|0)==0){if(!((Q|0)==3|(Q|0)==6)){break}}if(G){u=4326;break L5719}if(F){u=4548;break L5719}c[13898]=x+1;eT(4,c[11856]|0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=1;al=0;am=H;an=n;ao=D;break L5760}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}O=c[10036]|0;T=0;W=0;V=P;while(1){if((a[T+185064|0]|0)==(a[O+(T+V|0)|0]|0)){aE=V;aF=W}else{if((T|0)!=3){break}aE=V-1|0;aF=1}Z=T+1|0;if((Z|0)<(aF+N|0)){T=Z;W=aF;V=aE}else{u=4335;break}}do{if((u|0)==4335){u=0;if((aF|0)==0){if(!((T|0)==2|(T|0)==6)){break}}if(F){u=4338;break L5719}if(G){u=4539;break L5719}c[13898]=x+1;eT(5,c[11856]|0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=0;al=1;am=H;an=n;ao=D;break L5760}}while(0);if(M){S=y;break L5717}L5952:do{if((N|0)>0){T=c[10036]|0;V=0;W=0;O=P;while(1){if((a[V+170712|0]|0)==(a[T+(V+O|0)|0]|0)){aG=O;aH=W}else{if((V|0)!=3){u=4350;break L5952}aG=O-1|0;aH=1}Z=V+1|0;if((Z|0)<(aH+N|0)){V=Z;W=aH;O=aG}else{break}}if((aH|0)!=0){break}if(!((V|0)==2|(V|0)==8)){u=4350}}else{u=4350}}while(0);do{if((u|0)==4350){u=0;if(!((N|0)>0&(M^1))){S=y;break L5717}O=c[10036]|0;W=0;T=0;Q=P;while(1){if((a[W+90456|0]|0)==(a[O+(W+Q|0)|0]|0)){aI=Q;aJ=T}else{if((W|0)!=3){break}aI=Q-1|0;aJ=1}Z=W+1|0;if((Z|0)<(aJ+N|0)){W=Z;T=aJ;Q=aI}else{u=4356;break}}if((u|0)==4356){u=0;if((aJ|0)!=0){break}if((W|0)==2|(W|0)==6){break}}if(M){S=y;break L5717}L5976:do{if((N|0)>0){Q=c[10036]|0;T=0;O=0;V=P;while(1){if((a[T+170128|0]|0)==(a[Q+(T+V|0)|0]|0)){aK=V;aL=O}else{if((T|0)!=4){break L5976}aK=V-1|0;aL=1}Z=T+1|0;if((Z|0)<(aL+N|0)){T=Z;O=aL;V=aK}else{break}}if((aL|0)==0){if(!((T|0)==3|(T|0)==13)){break}}if((c[11856]|0)==1){u=4370;break L5719}if(B){u=4545;break L5719}c[13898]=x+1;eT(7,0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=1;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}W=c[10036]|0;V=0;while(1){if((a[V+169288|0]|0)!=(a[W+(V+P|0)|0]|0)){break}aM=V+1|0;if((aM|0)<(N|0)){V=aM}else{u=4377;break}}do{if((u|0)==4377){u=0;if((aM|0)!=4){break}if(j){u=4550;break L5719}c[13898]=x+1;eT(8,0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=1;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(M){S=y;break L5717}L6001:do{if((N|0)>0){V=c[10036]|0;W=0;O=0;Q=P;while(1){if((a[W+168800|0]|0)==(a[V+(W+Q|0)|0]|0)){aN=Q;aO=O}else{if((W|0)!=3){break L6001}aN=Q-1|0;aO=1}Z=W+1|0;if((Z|0)<(aO+N|0)){W=Z;O=aO;Q=aN}else{break}}if((aO|0)==0){if(!((W|0)==2|(W|0)==6)){break}}if(q){u=4551;break L5719}aP=x+1|0;c[13898]=aP;if((w|0)<=(aP|0)){u=4515;break L5719}if((a[L+(aP*40&-1)|0]&1)==0){u=4516;break L5719}Q=c[L+(aP*40&-1)+36>>2]|0;O=L+(aP*40&-1)+32|0;V=c[10036]|0;T=0;while(1){if((T|0)>=(Q|0)){break}if((a[V+((c[O>>2]|0)+T|0)|0]|0)==(a[T+115e3|0]|0)){T=T+1|0}else{u=4513;break L5719}}if((T|0)!=1){u=4514;break L5719}aQ=x+2|0;c[13898]=aQ;O=c[L+(aQ*40&-1)+36>>2]|0;Q=c[L+(aQ*40&-1)+32>>2]|0;W=(a[L+(aQ*40&-1)|0]&1)==0;L6021:do{if((O|0)>0&(W^1)){Z=0;av=0;R=Q;while(1){if((a[Z+184456|0]|0)==(a[V+(Z+R|0)|0]|0)){aR=R;aS=av}else{if((Z|0)!=3){u=4405;break L6021}aR=R-1|0;aS=1}at=Z+1|0;if((at|0)<(aS+O|0)){Z=at;av=aS;R=aR}else{break}}if((aS|0)==0){if(!((Z|0)==2|(Z|0)==7)){u=4405;break}}c[12208]=0}else{u=4405}}while(0);L6032:do{if((u|0)==4405){u=0;T=(w|0)>(aQ|0);L6034:do{if(T){if(W){u=4521;break L5719}else{aT=0}while(1){if((aT|0)>=(O|0)){u=4409;break}if((a[V+(Q+aT|0)|0]|0)==(a[aT+167960|0]|0)){aT=aT+1|0}else{u=4410;break}}if((u|0)==4409){u=0;if((aT|0)!=4){u=4410}}if((u|0)==4410){u=0;if(!T){break}if(W){u=4522;break L5719}else{aU=0}while(1){if((aU|0)>=(O|0)){break}if((a[V+(Q+aU|0)|0]|0)==(a[aU+167400|0]|0)){aU=aU+1|0}else{break L6034}}if((aU|0)!=4){break}}c[12208]=c[12208]&3^3;break L6032}}while(0);L6050:do{if((O|0)>0&(W^1)){Z=0;R=0;av=Q;while(1){if((a[Z+167056|0]|0)==(a[V+(Z+av|0)|0]|0)){aV=av;aW=R}else{if((Z|0)!=3){break L6050}aV=av-1|0;aW=1}U=Z+1|0;if((U|0)<(aW+O|0)){Z=U;R=aW;av=aV}else{break}}if((aW|0)==0){if(!((Z|0)==2|(Z|0)==6)){break}}c[12208]=0;break L6032}}while(0);L6062:do{if(T){if(W){u=4523;break L5719}else{aX=0}while(1){if((aX|0)>=(O|0)){break}if((a[V+(Q+aX|0)|0]|0)==(a[aX+172296|0]|0)){aX=aX+1|0}else{break L6062}}if((aX|0)!=3){break}c[12208]=3;break L6032}}while(0);L6070:do{if((O|0)>0&(W^1)){Z=0;av=0;R=Q;while(1){if((a[Z+166640|0]|0)==(a[V+(Z+R|0)|0]|0)){aZ=R;a_=av}else{if((Z|0)!=3){u=4437;break L6070}aZ=R-1|0;a_=1}U=Z+1|0;if((U|0)<(a_+O|0)){Z=U;av=a_;R=aZ}else{break}}if((a_|0)!=0){break}if(!((Z|0)==2|(Z|0)==6)){u=4437}}else{u=4437}}while(0);if((u|0)==4437){u=0;if(W|T^1){u=4524;break L5719}else{a$=0}while(1){if((a$|0)>=(O|0)){break}if((a[V+(Q+a$|0)|0]|0)==(a[a$+166368|0]|0)){a$=a$+1|0}else{u=4525;break L5719}}if((a$|0)!=3){u=4526;break L5719}}c[12208]=1}}while(0);c[13898]=x+3;$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=1;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}Q=c[10036]|0;V=0;O=0;W=P;while(1){if((a[V+165520|0]|0)==(a[Q+(V+W|0)|0]|0)){a0=W;a1=O}else{if((V|0)!=4){S=y;break L5717}a0=W-1|0;a1=1}T=V+1|0;if((T|0)<(a1+N|0)){V=T;O=a1;W=a0}else{break}}if((a1|0)==0){if(!((V|0)==3|(V|0)==6)){S=y;break L5717}}if(y){u=4547;break L5719}a2=x+1|0;c[13898]=a2;if(b){u=4454;break L5719}a[47544]=0;if((w|0)<=(a2|0)){u=4527;break L5719}if((a[L+(a2*40&-1)|0]&1)==0){u=4528;break L5719}W=c[L+(a2*40&-1)+36>>2]|0;O=L+(a2*40&-1)+32|0;Q=c[10036]|0;T=0;while(1){if((T|0)>=(W|0)){break}if((a[Q+((c[O>>2]|0)+T|0)|0]|0)==(a[T+115e3|0]|0)){T=T+1|0}else{u=4529;break L5719}}if((T|0)!=1){u=4530;break L5719}a3=x+2|0;c[13898]=a3;if(!d){if((a3|0)>=(w|0)){a4=a3;u=4531;break L5719}L6111:do{if((a[L+(a3*40&-1)|0]&1)!=0){O=c[L+(a3*40&-1)+36>>2]|0;W=L+(a3*40&-1)+32|0;V=0;while(1){if((V|0)>=(O|0)){break}if((a[Q+((c[W>>2]|0)+V|0)|0]|0)==(a[V+103664|0]|0)){V=V+1|0}else{break L6111}}if((V|0)==1){a4=a3;u=4532;break L5719}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[m>>2]|0)!=3){u=4480;break L5719}Q=c[o>>2]|0;if((Q|0)==0){u=4482;break L5719}eU(Q);uu(Q);$=1;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}uu(c[11962]|0);Q=c[13898]|0;L6121:do{if((Q|0)<(c[8272]|0)){T=c[1054]|0;L6123:do{if((a[T+(Q*40&-1)|0]&1)!=0){W=c[T+(Q*40&-1)+36>>2]|0;O=T+(Q*40&-1)+32|0;R=c[10036]|0;av=0;while(1){if((av|0)>=(W|0)){break}if((a[R+((c[O>>2]|0)+av|0)|0]|0)==(a[av+103664|0]|0)){av=av+1|0}else{break L6123}}if((av|0)==1){a5=0;break L6121}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[I>>2]|0)==3){a5=c[k>>2]|0;break}else{c[13898]=Q;a5=0;break}}else{a5=0}}while(0);c[11962]=a5;$=1;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(s){u=4542;break L5719}c[13898]=x+1;eT(6,0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=1;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D}}while(0);L=c[13898]|0;N=c[8272]|0;if((L|0)<(N|0)){D=ao;n=an;H=am;G=al;F=ak;j=aj;q=ai;s=ah;B=ag;C=af;A=ae;t=ad;p=ac;r=ab;z=aa;y=$;x=L;w=N}else{S=$;break L5717}}if((u|0)==4227){uf(x,175848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4237){uf(x,175072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4177){uf(_,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4338){uf(x,K,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4279){uf(x,175072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4190){uf(ar,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4370){uf(x,169712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4513){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4514){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4515){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4516){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4521){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4522){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4523){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4524){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4525){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4526){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4527){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4528){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4529){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4530){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4531){uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4532){uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4535){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4536){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4537){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4538){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4539){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4540){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4541){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4542){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4543){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4544){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4545){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4546){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4547){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4548){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4549){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4550){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4551){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4454){uf(a2,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4326){uf(x,K,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4262){uf(x,173896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4480){c[13898]=a3;a4=a3;uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4482){a4=c[13898]|0;uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{S=0}}while(0);do{if(!d){if(!((c[11862]|0)!=0&(b^1))){break}uh(-1,163928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(S){i=e;return}S=c[11962]|0;if(!((a[47544]&1)==0&(S|0)!=0)){i=e;return}eU(S);uh(-1,163496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}function eC(f,j){f=f|0;j=j|0;var k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0.0,aD=0.0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aN=0,aO=0.0,aP=0.0,aQ=0.0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0.0,aX=0.0,aZ=0.0,a$=0.0,a0=0.0,a1=0.0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,bf=0,bg=0,bh=0,bi=0,bj=0.0,bk=0,bl=0.0,bm=0.0,bn=0,bo=0.0,bp=0,bq=0,br=0.0,bs=0.0,bt=0,bu=0,bv=0;k=i;i=i+216|0;l=k|0;n=k+24|0;o=k+48|0;p=k+96|0;q=k+104|0;r=k+152|0;s=k+160|0;t=k+168|0;u=k+192|0;x=c[12892]|0;if(!((x|0)!=0|(c[11854]|0)!=0)){y=-1;i=k;return y|0}if((a[47392]&1)==0){if((c[8716]|0)==0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=143056,v)|0);return 0}if((j|0)>=8){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=186808,v)|0);return 0}if(a[47736]|0){y=-1;i=k;return y|0}z=eV()|0;L6212:do{if((z|0)!=0){A=l|0;B=l+8|0;C=n|0;D=n+8|0;E=D;F=D;D=n+8|0;G=z;L6214:while(1){c[11900]=(c[11900]|0)+1;c[11874]=0;H=G;while(1){if((aM(d[H]|0|0)|0)==0){break}else{H=H+1|0}}I=a[H]|0;J=I<<24>>24==0;do{if(J){K=4799}else{if((a8(c[11948]|0,I<<24>>24|0)|0)==0){K=4799;break}if((c[9356]|0)==0){break}else{L=H;M=I}while(1){N=M<<24>>24;if(M<<24>>24==0){K=4793}else{if((a8(c[11948]|0,N|0)|0)==0){K=4793}}if((K|0)==4793){K=0;if((aM(N|0)|0)==0){break}}N=L+1|0;L=N;M=a[N]|0}if((a[L]|0)==0){break}N=c[9356]|0;if((a_(L|0,N|0,uA(N|0)|0)|0)!=0){break}a[37432]=1}}while(0);L6232:do{if((K|0)==4799){K=0;N=a[34104]|0;if(N){if((I<<24>>24|0)==101|(I<<24>>24|0)==69){K=4801;break L6214}else if((I<<24>>24|0)==0){K=4803}}else{if(J){K=4803}}if((K|0)==4803){K=0;c[7638]=-1;O=c[14126]|0;R=O+1|0;c[14126]=R;if((O|0)==0){c[8800]=(c[8800]|0)+1}do{if((R|0)==2){U=(c[11946]|0)+1|0;c[11946]=U;c[8800]=0;c[11942]=-1;V=c[9356]|0;if((V|0)!=0){if(a[37432]|0){K=4809;break L6214}}if((U|0)<=(c[11898]|0)){break L6232}if((U|0)<=(c[11762]|0)){W=V;break}if(N){break L6232}else{K=4813;break L6214}}else{W=c[9356]|0}}while(0);if((W|0)!=0){if(!(a[37432]|0)){break}}if((c[11946]|0)<(c[11898]|0)|(R|0)>2){break}else{K=4817;break L6214}}c[14126]=0;if((c[9356]|0)!=0){if(!(a[37432]|0)){break}}N=c[11946]|0;V=c[11898]|0;if((N|0)<(V|0)|(N|0)>(c[11762]|0)){break}if(((N-V|0)%(c[11904]|0)&-1|0)!=0){break}if((a[32928]&1)!=0|(c[13488]|0)>0){if(a[48872]|0){K=4824}}else{K=4824}if((K|0)==4824){K=0;V=c[8800]|0;N=c[10808]|0;if((V|0)<(N|0)|(V|0)>(c[8834]|0)){break}if(((V-N|0)%(c[10874]|0)&-1|0)!=0){break}N=(c[7638]|0)+1|0;c[7638]=N;V=c[10806]|0;if((N|0)<(V|0)|(N|0)>(c[8832]|0)){break}if(((N-V|0)%(c[10872]|0)&-1|0)!=0){break}}c[11942]=(c[11942]|0)+1;do{if((c[11930]|0)==0){eX(H)}else{do{if((c[11882]|0)<7){V=db(c[11952]|0,168,180032)|0;c[11952]=V;N=c[11882]|0;if((N|0)>=7){break}h[V+(N*24&-1)>>3]=0.0;c[V+(N*24&-1)+16>>2]=0;N=(c[11882]|0)+1|0;c[11882]=N;if((N|0)<7){X=N}else{break}do{N=c[11952]|0;h[N+(X*24&-1)>>3]=0.0;c[N+(X*24&-1)+16>>2]=0;X=(c[11882]|0)+1|0;c[11882]=X;}while((X|0)<7)}}while(0);N=c[11952]|0;V=ca(c[8802]|0,c[11930]|0,(v=i,i=i+56|0,c[v>>2]=N,c[v+8>>2]=N+24,c[v+16>>2]=N+48,c[v+24>>2]=N+72,c[v+32>>2]=N+96,c[v+40>>2]=N+120,c[v+48>>2]=N+144,v)|0)|0;c[11874]=V;if((V|0)==-1){K=4835;break L6214}if((V|0)>0){Y=0}else{break}do{c[(c[11952]|0)+(Y*24&-1)+8>>2]=1;c[(c[11952]|0)+(Y*24&-1)+12>>2]=0;Y=Y+1|0;}while((Y|0)<(c[11874]|0))}}while(0);do{if((c[11942]|0)==0){if(a[48872]|0){break}R=c[11874]|0;if((R|0)>0){V=0;while(1){uu(c[(c[11952]|0)+(V*24&-1)+16>>2]|0);N=eD(c[(c[11952]|0)+(V*24&-1)+12>>2]|0)|0;c[(c[11952]|0)+(V*24&-1)+16>>2]=N;N=V+1|0;U=c[11874]|0;if((N|0)<(U|0)){V=N}else{Z=U;break}}}else{Z=R}a[48872]=1;V=c[13488]|0;if((V|0)>(Z|0)){c[13488]=Z;_=Z}else{_=V}if((_|0)>0){K=4845;break L6214}if((a[32928]&1)!=0){K=4850;break L6214}}}while(0);V=c[11870]|0;U=c[11872]|0;N=(V|0)==0?7:U+V|0;$=U+j|0;ab=(N|0)>($|0)?$:N;if((ab|0)>0){ac=0;ad=1}else{ae=0;af=U;ag=V;break L6214}L6293:while(1){V=c[1048+(ac*12&-1)>>2]|0;c[12902]=ac;U=1052+(ac*12&-1)|0;N=c[U>>2]|0;L6295:do{if((N|0)>2){$=c[11944]|0;ah=($|0)==0;if(!ah){if((c[$+12>>2]|0)==474){ai=ad;break}}if((N|0)==5){aj=1;ak=1}else if((N|0)==6){aj=1;ak=5}else if((N|0)==7){aj=2;ak=0}else if((N|0)==8){aj=3;ak=3}else if((N|0)==4){aj=0;ak=6}else{aj=0;ak=2}do{if((ac|0)==1){if((aj|0)==0){al=+(c[11942]|0);break}else{al=+h[f+(aj-1<<3)>>3];break}}else{al=+h[f+(aj<<3)>>3]}}while(0);am=al;do{if(ah){an=am}else{if((c[$+12>>2]|0)!=392){an=am;break}if((ac|0)>1){if((aj|0)==0){ao=+(c[11942]|0)}else{ao=+h[f+(aj-1<<3)>>3]}ap=ao}else{ap=am}an=ap+ +h[(c[$+276>>2]|0)+16>>3]}}while(0);$=c[1056+(ac*12&-1)>>2]|0;if(($|0)==0){ah=eD(c[47056+(ac<<2)>>2]|0)|0;dp(ak,ah,an,-1);uu(ah);aq=ad;K=4942;break}a[43504]=1;e4($,l);a[43504]=0;if((c[A>>2]|0)==3){$=c[B>>2]|0;dp(ak,$,an,-1);uu($);c[A>>2]=1;aq=ad;K=4942;break}else{$=c[m>>2]|0;aI(142872,39,1,$|0);aq=ad;K=4942;break}}else{if((N|0)==2){$=eD(c[47056+(ac<<2)>>2]|0)|0;if((c[11944]|0)!=0){ah=c[11942]|0;ar=ut(192)|0;if((ar|0)==0){gk();as=ut(192)|0;if((as|0)==0){K=4883;break L6214}else{at=as}}else{at=ar}ar=at;if((c[(c[11944]|0)+224>>2]|0)==0){as=ut(192)|0;if((as|0)==0){gk();au=ut(192)|0;if((au|0)==0){K=4887;break L6214}else{av=au}}else{av=as}c[(c[11944]|0)+224>>2]=av;as=(c[11944]|0)+224|0;uE(c[as>>2]|0,0,192);c[(c[as>>2]|0)+4>>2]=-1}if(($|0)==0){aw=0}else{aw=bP($|0)|0}c[at+60>>2]=aw;c[at+4>>2]=ah;c[at+64>>2]=0;c[at>>2]=c[c[(c[11944]|0)+224>>2]>>2];c[c[(c[11944]|0)+224>>2]>>2]=ar}uu($);aq=ad;K=4942;break}$=c[1056+(ac*12&-1)>>2]|0;if(($|0)==0){if((V|0)==(-2|0)){h[f+(ac<<3)>>3]=+(c[11946]|0);aq=ad;K=4942;break}else if((V|0)==(-1|0)){h[f+(ac<<3)>>3]=+(c[8800]|0);aq=ad;K=4942;break}else if((V|0)==0){h[f+(ac<<3)>>3]=+(c[11942]|0);aq=ad;K=4942;break}else{if((V|0)<1){K=4928;break L6214}ar=c[48840+(ac<<2)>>2]|0;do{if((ar|0)!=99){if((c[64808+(ar*688&-1)>>2]|0)!=1){break}h[r>>3]=0.0;if((V|0)>(c[11874]|0)){K=4935;break L6293}ah=V-1|0;as=c[11952]|0;if((c[as+(ah*24&-1)+8>>2]|0)==-5){K=4935;break L6293}au=c[as+(ah*24&-1)+12>>2]|0;if((au|0)==0){K=4935;break L6293}if((t1(au,64813+(ar*688&-1)|0,q,r)|0)==0){K=4935;break L6293}am=+t2(q);h[f+(ac<<3)>>3]=am+ +h[r>>3];aq=ad;K=4942;break L6295}}while(0);if((N|0)==1){ax=ad;K=4945;break}if((V|0)>(c[11874]|0)){K=4941;break L6293}ar=V-1|0;au=c[11952]|0;ah=c[au+(ar*24&-1)+8>>2]|0;if((ah|0)==(-5|0)){y=-5;K=4984;break L6214}else if((ah|0)!=1){K=4941;break L6293}h[f+(ac<<3)>>3]=+h[au+(ar*24&-1)>>3];aq=ad;K=4942;break}}a[43504]=1;e4($,n);a[43504]=0;if((a[1960]&1)!=0){y=-2;K=4981;break L6214}ar=48840+(ac<<2)|0;au=c[ar>>2]|0;do{if((au|0)==99){ay=0;K=4908}else{if((c[64808+(au*688&-1)>>2]|0)!=1){ay=0;K=4908;break}ah=c[C>>2]|0;if((ah|0)==3){az=1;break}if((aY(64813+(au*688&-1)|0,132824)|0)!=0){ay=1;K=4908;break}as=ut(20)|0;if((as|0)==0){gk();aA=ut(20)|0;if((aA|0)==0){K=4901;break L6214}else{aB=aA}}else{aB=as}if((ah|0)==1){aC=+(c[F>>2]|0)}else if((ah|0)==2){aC=+h[D>>3]}else if((ah|0)==3){aC=+uz(c[E>>2]|0,0)}else{K=4906;break L6214}be(aB|0,142616,(v=i,i=i+8|0,h[v>>3]=aC,v)|0);c[C>>2]=3;c[E>>2]=aB;ay=1;K=4908}}while(0);do{if((K|0)==4908){K=0;au=c[C>>2]|0;if((au|0)==3){az=ay;break}else if((au|0)==1){aD=+(c[F>>2]|0)}else if((au|0)==2){aD=+h[D>>3]}else{K=4921;break L6214}h[f+(ac<<3)>>3]=aD;aq=ad;K=4942;break L6295}}while(0);if((c[U>>2]|0)==1){au=c[E>>2]|0;$=(uA(au|0)|0)+3|0;ah=ut($)|0;if((ah|0)==0){gk();as=ut($)|0;if((as|0)==0){K=4912;break L6214}else{aE=as}}else{aE=ah}a[aE]=34;ah=aE+1|0;uB(ah|0,au|0);au=aE+(uA(aE|0)|0)|0;w=34;a[au]=w&255;w=w>>8;a[au+1|0]=w&255;au=47088+(ac<<2)|0;uu(c[au>>2]|0);c[au>>2]=aE;c[47056+(ac<<2)>>2]=aE}do{if(az){h[p>>3]=0.0;au=c[E>>2]|0;if((t1(au,64813+((c[ar>>2]|0)*688&-1)|0,o,p)|0)==0){aF=0;aG=au;break}am=+t2(o);h[f+(ac<<3)>>3]=am+ +h[p>>3];aF=ad;aG=au}else{aF=ad;aG=c[E>>2]|0}}while(0);uu(aG);c[C>>2]=1;aq=aF;K=4942}}while(0);do{if((K|0)==4942){K=0;if((c[U>>2]|0)!=1){ai=aq;break}if((c[1056+(ac*12&-1)>>2]|0)==0){ax=aq;K=4945;break}if((c[47056+(ac<<2)>>2]|0)==0){ax=aq;K=4945}else{ai=aq}}}while(0);do{if((K|0)==4945){K=0;if(!((V|0)==(-1|0)|(V|0)==(-2|0)|(V|0)==0)){ai=ax;break}U=ut(32)|0;if((U|0)==0){gk();N=ut(32)|0;if((N|0)==0){K=4948;break L6214}else{aH=N}}else{aH=U}U=~~+h[f+(ac<<3)>>3];be(aH|0,21e4,(v=i,i=i+8|0,c[v>>2]=U,v)|0);U=47088+(ac<<2)|0;uu(c[U>>2]|0);c[U>>2]=aH;c[47056+(ac<<2)>>2]=aH;ai=ax}}while(0);V=ac+1|0;if((V|0)<(ab|0)){ac=V;ad=ai}else{aJ=ai;aK=V;break}}if((K|0)==4935){K=0;aJ=(c[11870]|0)==0?ad:0;aK=ac}else if((K|0)==4941){K=0;aJ=(c[11870]|0)==0?ad:0;aK=ac}if((aJ|0)!=0){K=4952;break L6214}}}while(0);G=eV()|0;if((G|0)==0){break L6212}}if((K|0)==4984){i=k;return y|0}else if((K|0)==4883){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142224,v)|0);return 0}else if((K|0)==4928){uf(-1,142440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4850){c[11942]=(c[11942]|0)-1;a[32928]=0;y=-9;i=k;return y|0}else if((K|0)==4887){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142224,v)|0);return 0}else if((K|0)==4912){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=181200,v)|0);return 0}else if((K|0)==4845){G=c[(c[11952]|0)+((_-1|0)*24&-1)+16>>2]|0;if((G|0)==0){c[11902]=0;y=-7;i=k;return y|0}C=bP(G|0)|0;c[11902]=C;if((C|0)==0){y=-7;i=k;return y|0}c[11942]=(c[11942]|0)-1;c[13488]=-99;a[32928]=0;y=-6;i=k;return y|0}else if((K|0)==4801){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4809){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4813){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4817){y=-3-O|0;i=k;return y|0}else if((K|0)==4835){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4921){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4952){ae=aK;af=c[11872]|0;ag=c[11870]|0}else if((K|0)==4901){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142728,v)|0);return 0}else if((K|0)==4981){i=k;return y|0}else if((K|0)==4906){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4948){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142320,v)|0);return 0}C=ae-af|0;if((ag|0)==0|(C|0)==(ag|0)|(C|0)==(j|0)){y=C;i=k;return y|0}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=180528,v)|0);return 0}}}while(0);c[11874]=0;a[47736]=1;y=-1;i=k;return y|0}ag=s;if((x|0)==0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=187320,v)|0);return 0}if((j|0)>=8){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=186808,v)|0);return 0}x=c[11876]|0;if((c[11884]|0)<=(x|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=186248,v)|0);return 0}if((x|0)==0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=185768,v)|0);return 0}if(a[47736]|0){y=-1;i=k;return y|0}do{if((c[11882]|0)<(x|0)){af=db(c[11952]|0,x*24&-1,180032)|0;c[11952]=af;ae=c[11882]|0;if((ae|0)>=(x|0)){break}h[af+(ae*24&-1)>>3]=0.0;c[af+(ae*24&-1)+16>>2]=0;ae=(c[11882]|0)+1|0;c[11882]=ae;if((ae|0)<(x|0)){aL=ae}else{break}do{ae=c[11952]|0;h[ae+(aL*24&-1)>>3]=0.0;c[ae+(aL*24&-1)+16>>2]=0;aL=(c[11882]|0)+1|0;c[11882]=aL;}while((aL|0)<(x|0))}}while(0);do{if((c[12222]|c[12224]|c[12220]|0)==0){x=c[12172]|0;aL=c[12170]|0;c[11788]=0;c[11787]=0;c[11786]=0;aD=+h[x+(aL*232&-1)+80>>3];if(+P(+aD)<.001){c[11822]=c[6578];c[11823]=c[6579];c[11824]=c[6580];c[11825]=c[6581];c[11826]=c[6582];c[11827]=c[6583];c[11828]=c[6584];c[11829]=c[6585];aN=0;aO=1.0;aP=0.0;aQ=0.0}else{aC=+S(+aD);h[5911]=aC;an=+T(+aD);aD=-0.0-an;h[5912]=aD;h[5913]=an;h[5914]=aC;aN=1;aO=aC;aP=aD;aQ=an}ae=x+(aL*232&-1)+88|0;an=+h[ae>>3];af=x+(aL*232&-1)+96|0;aD=+h[af>>3];aC=an*an+aD*aD;aK=x+(aL*232&-1)+104|0;aD=+h[aK>>3];ap=+Q(+(aC+aD*aD));ao=+Q(+aC);if(ap<1.0e-9|ao<ap*1.0e-4){uD(47320,26240,72);aR=0}else{aC=1.0/(ap*ao);h[5915]=an*aD*aC;h[5916]=aC*ap*(-0.0- +h[af>>3]);h[5917]=aC*ao*+h[ae>>3];h[5918]=aC*+h[af>>3]*+h[aK>>3];h[5919]=aC*ap*+h[ae>>3];h[5920]=aC*ao*+h[af>>3];h[5921]=ao*(-0.0-ao)*aC;h[5922]=0.0;h[5923]=aC*ao*+h[aK>>3];aR=1}aK=aN?1:aR;a[47128]=aK;if((a[47544]&1)==0){af=x+(aL*232&-1)+48|0;ae=x+(aL*232&-1)+192|0;O=x+(aL*232&-1)+124|0;_=0;do{aJ=x+(aL*232&-1)+(_<<2)|0;ac=c[aJ>>2]|0;do{if((ac|0)==0){if((c[x+(aL*232&-1)+140+(_<<2)>>2]|0)!=0){K=4589;break}aS=-3-(c[x+(aL*232&-1)+112+(_<<2)>>2]|0)|0;K=4595}else{K=4589}}while(0);do{if((K|0)==4589){K=0;ad=x+(aL*232&-1)+112+(_<<2)|0;if((a[O]&1)==0){aT=ac}else{c[1048+(_*12&-1)>>2]=c[ad>>2];aT=c[aJ>>2]|0}ai=-3-(c[ad>>2]|0)|0;if((aT|0)>0){c[47144+(ai<<2)>>2]=aT;aU=aT;aV=ai;break}if((aT|0)>=0){aS=ai;K=4595;break}c[47144+(ai<<2)>>2]=2147483647;aU=2147483647;aV=ai}}while(0);if((K|0)==4595){K=0;aJ=c[x+(aL*232&-1)+140+(aS<<2)>>2]|0;c[47144+(aS<<2)>>2]=aJ;aU=aJ;aV=aS}ao=+h[x+(aL*232&-1)+24+(_<<3)>>3];if(ao!=0.0){h[47240+(aV<<3)>>3]=ao;aW=ao}else{ao=+h[x+(aL*232&-1)+168+(aV<<3)>>3];h[47240+(aV<<3)>>3]=ao;aW=ao}ao=aW*+(aa(c[x+(aL*232&-1)+12+(_<<2)>>2]|0,c[x+(aL*232&-1)+152+(aV<<2)>>2]|0)|0);h[47240+(aV<<3)>>3]=ao;do{if((c[af>>2]|0)==0){if((c[ae>>2]|0)!=0){h[47176+(_<<3)>>3]=+h[x+(aL*232&-1)+200+(aV<<3)>>3];break}if((aU|0)>0){h[47176+(_<<3)>>3]=+(aU-1|0)*+P(+ao)*.5;break}else{h[47176+(_<<3)>>3]=0.0;break}}else{h[47176+(_<<3)>>3]=+h[x+(aL*232&-1)+56+(_<<3)>>3]}}while(0);aJ=c[af>>2]|0;if((aJ|0)==0){if((c[ae>>2]|0)==1){K=4608}else{K=4611}}else if((aJ|0)==1){K=4608}else{K=4611}do{if((K|0)==4608){K=0;if((aU|0)>0&ao<0.0){h[47264+(_<<3)>>3]=+(aU-1|0)*ao;break}else{h[47264+(_<<3)>>3]=0.0;break}}else if((K|0)==4611){K=0;if((aU|0)>0){h[47264+(_<<3)>>3]=+(aU-1|0)*ao*.5;break}else{h[47264+(_<<3)>>3]=0.0;break}}}while(0);_=_+1|0;}while((_|0)<3)}else{_=c[x+(aL*232&-1)+140>>2]|0;c[11786]=_;c[11787]=c[x+(aL*232&-1)+144>>2];if((_|0)==0){uf(-1,185128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}_=x+(aL*232&-1)+12|0;h[5911]=aO*+(c[_>>2]|0);h[5912]=aP*+(c[_>>2]|0);_=x+(aL*232&-1)+16|0;h[5913]=aQ*+(c[_>>2]|0);h[5914]=aO*+(c[_>>2]|0);_=x+(aL*232&-1)+48|0;if((c[_>>2]|0)==0){aX=(+h[5946]+ +h[5944])*.5}else{aX=+h[x+(aL*232&-1)+56>>3]}h[5897]=aX;if((c[_>>2]|0)==0){aZ=(+h[5947]+ +h[5945])*.5}else{aZ=+h[x+(aL*232&-1)+64>>3]}h[5898]=aZ;if((c[_>>2]|0)==0){a$=0.0}else{a$=+h[x+(aL*232&-1)+72>>3]}h[5899]=a$;if((c[_>>2]|0)==1){a0=+h[5944]}else{a0=(+h[5946]+ +h[5944])*.5}h[5908]=a0;if((c[_>>2]|0)==1){a1=+h[5945]}else{a1=(+h[5947]+ +h[5945])*.5}h[5909]=a1;h[5910]=0.0;c[11802]=0}do{if(aK<<24>>24==0){if(+h[5908]!=+h[5897]){a2=1;break}if(+h[5909]!=+h[5898]){a2=1;break}a2=+h[5910]!=+h[5899]&1}else{a2=1}}while(0);a[47128]=a2;aK=x+(aL*232&-1)+224|0;_=c[aK>>2]|0;c[11800]=_;ae=c[12208]|0;c[11792]=a[47816+(ae>>>0<3?ae:3)|0]|0;ae=c[x+(aL*232&-1)+128>>2]|0;c[11790]=ae;a[47224]=0;a[47232]=0;c[7638]=-1;c[8800]=0;c[11946]=aL;if((_|0)!=0|(c[12204]|0)>0){break}if((a[47856]&1)==0){break}if((a[47584]&1)==0){break}if((a[47464]&1)!=0){break}_=c[11876]|0;af=c[11950]|0;if((_|0)>0){O=0;aJ=0;while(1){ac=((c[af+(aJ*12&-1)>>2]|0)+O|0)+(e[af+(aJ*12&-1)+8>>1]|0)|0;ai=aJ+1|0;if((ai|0)<(_|0)){O=ac;aJ=ai}else{a3=ac;break}}}else{a3=0}aJ=c[11786]|0;O=aa((aJ|0)<1?1:aJ,(c[af+(_*12&-1)>>2]|0)+a3|0);aJ=c[11787]|0;aL=aa(O,(aJ|0)<1?1:aJ);aJ=c[11788]|0;O=aa(aL,(aJ|0)<1?1:aJ)+ae|0;aJ=ut(O)|0;do{if((aJ|0)==0){gk();aL=ut(O)|0;if((aL|0)!=0){a4=aL;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=184632,v)|0);return 0}else{a4=aJ}}while(0);c[11800]=a4;c[aK>>2]=a4;aJ=cd(c[11800]|0,1,O|0,c[12892]|0)|0;if((aJ|0)==(O|0)){break}uh(-1,184408,(v=i,i=i+16|0,c[v>>2]=O,c[v+8>>2]=aJ,v)|0);a[47736]=1;y=-1;i=k;return y|0}}while(0);L6578:do{if(!(a[47736]|0)){a4=s;a3=s;a2=s|0;aU=s;aV=s;aS=f+8|0;aT=f+16|0;aR=t|0;aN=t+8|0;aJ=aN;ae=aN;aN=t+8|0;_=0;L6580:while(1){if(a[47224]|0){K=4629;break}if(a[47232]|0){K=4631;break}af=c[11790]|0;if((af|0)==0){a5=0}else{aL=c[11800]|0;if((aL|0)==0){if((eR(af)|0)!=0){y=-1;K=4966;break}}else{c[11800]=aL+af}c[11790]=0;a5=0}while(1){af=c[(c[11950]|0)+(a5*12&-1)>>2]|0;do{if((af|0)!=0){aL=c[11800]|0;if((aL|0)==0){if((eR(af)|0)==0){break}else{y=-1;K=4967;break L6580}}else{c[11800]=aL+af;break}}}while(0);if((a5|0)==(c[11876]|0)){K=4642;break}do{if((c[11858]|0)==0){af=c[11800]|0;aL=(c[11950]|0)+(a5*12&-1)+8|0;x=b[aL>>1]|0;if((af|0)==0){if((cd(ag|0,x&65535|0,1,c[12892]|0)|0)==1){break}else{K=4649;break L6580}}if(x<<16>>16==0){break}else{a6=0;a7=af}while(1){af=a7+1|0;c[11800]=af;a[ag+a6|0]=a[a7]|0;x=a6+1|0;if((x|0)<(e[aL>>1]|0|0)){a6=x;a7=af}else{break}}}else{a[ag]=0}}while(0);aL=c[11792]|0;af=c[11950]|0;x=e[af+(a5*12&-1)+8>>1]|0;do{if((aL-2|0)>>>0<2){ac=x-1|0;if((ac|0)>0){a9=0;ba=ac}else{break}do{ac=ag+a9|0;ai=a[ac]|0;ad=ag+ba|0;a[ac]=a[ad]|0;a[ad]=ai;a9=a9+1|0;ba=ba-1|0;}while((a9|0)<(ba|0))}}while(0);do{if((aL-1|0)>>>0<2){ai=x-1|0;if((ai|0)>0){bb=ai}else{break}do{ai=ag+(bb-1|0)|0;ad=a[ai]|0;ac=ag+bb|0;a[ai]=a[ac]|0;a[ac]=ad;bb=bb-2|0;}while((bb|0)>0)}}while(0);x=c[af+(a5*12&-1)+4>>2]|0;if((x|0)==0){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(a[ag]|0|0);bc=aL}else if((x|0)==1){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((d[ag]|0)>>>0);bc=aL}else if((x|0)==2){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(b[a4>>1]|0|0);bc=aL}else if((x|0)==3){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((e[a4>>1]|0)>>>0);bc=aL}else if((x|0)==4){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(c[a3>>2]|0);bc=aL}else if((x|0)==5){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a3>>2]|0)>>>0>>>0);bc=aL}else if((x|0)==6){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(c[a3>>2]|0);bc=aL}else if((x|0)==7){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a3>>2]|0)>>>0>>>0);bc=aL}else if((x|0)==10){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a2>>2]|0)>>>0)+ +(c[a2+4>>2]|0)*4294967296.0;bc=aL}else if((x|0)==11){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a2>>2]|0)>>>0)+ +((c[a2+4>>2]|0)>>>0)*4294967296.0;bc=aL}else if((x|0)==8){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+g[aU>>2];bc=aL}else if((x|0)==9){x=c[11952]|0;h[x+(a5*24&-1)>>3]=+h[aV>>3];bc=x}else{K=4669;break L6580}c[bc+(a5*24&-1)+8>>2]=1;c[(c[11952]|0)+(a5*24&-1)+12>>2]=0;x=a[47544]|0;if((x&1)!=0){bd=x;break}a5=a5+1|0}if((K|0)==4642){K=0;bd=a[47544]|0}L6636:do{if((bd&1)==0){c[11942]=(c[7638]|0)+1;if((a5|0)==(c[11876]|0)){K=4702}else{K=4697;break L6580}}else{do{if((a[47464]&1)!=0){x=c[12224]|0;if(!((x|0)!=0|_)){h[5902]=+h[(c[11952]|0)+(a5*24&-1)>>3];bf=1;break L6636}if((c[12222]|x|c[12220]|0)!=0){break}x=c[11802]|0;aL=c[11786]|0;if((x|0)>=(aL|0)){break}ad=c[11784]|0;if((x|0)==0){ac=db(ad,aL<<2,183672)|0;aL=ac;c[11784]=aL;if((ac|0)==0){K=4682;break L6580}bg=c[11802]|0;bh=aL}else{bg=x;bh=ad}g[bh+(bg<<2)>>2]=+h[(c[11952]|0)+(a5*24&-1)>>3];ad=(c[11802]|0)+1|0;c[11802]=ad;bf=_&(ad|0)!=(c[11786]|0);break L6636}}while(0);c[11942]=~~+h[(c[11952]|0)+(a5*24&-1)>>3];af=c[11876]|0;if((af|0)>0){bi=af}else{K=4702;break}while(1){af=bi-1|0;if((bi|0)==1){ad=c[12224]|0;if((a[47464]&1)==0){bj=+(ad|0)}else{bj=+g[(c[11784]|0)+(ad<<2)>>2]}ad=c[11952]|0;h[ad+(af*24&-1)>>3]=bj;bk=ad}else if((bi|0)==2){if((a[47464]&1)==0){bl=+(c[12222]|0)}else{bl=+h[5902]}ad=c[11952]|0;h[ad+(af*24&-1)>>3]=bl;bk=ad}else{ad=c[11952]|0;h[ad+(af*24&-1)>>3]=+h[ad+(a5*24&-1)>>3];bk=ad}c[bk+(af*24&-1)+8>>2]=1;c[(c[11952]|0)+(af*24&-1)+12>>2]=0;if((af|0)>0){bi=af}else{K=4702;break}}}}while(0);do{if((K|0)==4702){K=0;af=c[12224]|0;ad=c[12222]|0;x=c[12220]|0;aL=af+1|0;c[12224]=aL;ac=c[11786]|0;do{if(!((ac|0)<1|(aL|0)<(ac|0))){c[12224]=0;ai=ad+1|0;c[12222]=ai;a[47224]=1;ax=c[11787]|0;if((ax|0)<0|(ai|0)<(ax|0)){break}c[12222]=0;ax=x+1|0;c[12220]=ax;ai=c[11788]|0;if((ai|0)<0|(ax|0)<(ai|0)){break}c[12220]=0;a[47232]=1;ai=(c[12170]|0)+1|0;c[12170]=ai;if((ai|0)<(c[11864]|0)){break}a[47736]=1}}while(0);ac=c[11946]|0;aL=c[11898]|0;if((ac|0)<(aL|0)|(ac|0)>(c[11762]|0)){bf=_;break}if(((ac-aL|0)%(c[11904]|0)&-1|0)!=0){bf=_;break}aL=c[8800]|0;ac=c[10808]|0;if((aL|0)<(ac|0)|(aL|0)>(c[8834]|0)){bf=_;break}if(((aL-ac|0)%(c[10874]|0)&-1|0)!=0){bf=_;break}ac=(c[7638]|0)+1|0;c[7638]=ac;aL=c[10806]|0;if((ac|0)<(aL|0)|(ac|0)>(c[8832]|0)){bf=_;break}if(((ac-aL|0)%(c[10872]|0)&-1|0)!=0){bf=_;break}c[11874]=c[11876];aL=c[11870]|0;ac=(aL|0)!=0?aL:7;aL=(ac|0)>(j|0)?j:ac;L6680:do{if((aL|0)>0){a1=+(x|0);a0=+(ad|0);a$=+(af|0);ac=0;L6682:while(1){ai=c[1048+(ac*12&-1)>>2]|0;ax=c[1056+(ac*12&-1)>>2]|0;do{if((ax|0)==0){if((ai|0)==(-5|0)){aH=c[(c[11944]|0)+12>>2]|0;if((aH|0)==400|(aH|0)==416){aZ=a1*+h[5907];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else{aZ=+h[c[11952]>>3];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}}else if((ai|0)==(-4|0)){aZ=a0*+h[5906];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==(-3|0)){aZ=a$*+h[5905];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==(-2|0)){aZ=+(c[11946]|0);h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==(-1|0)){aZ=+(c[8800]|0);h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==0){aZ=+(c[11942]|0);h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else{if((ai|0)<1){K=4738;break L6580}if((ai|0)>(c[11874]|0)){break L6682}aH=ai-1|0;aq=c[11952]|0;aF=c[aq+(aH*24&-1)+8>>2]|0;if((aF|0)==(-5|0)){y=-5;K=4971;break L6580}else if((aF|0)!=1){break L6682}aZ=+h[aq+(aH*24&-1)>>3];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}}else{a[43504]=1;e4(ax,t);a[43504]=0;if((a[1960]&1)!=0){y=-2;K=4970;break L6580}aH=c[aR>>2]|0;if((aH|0)==3){aq=c[aJ>>2]|0;if((c[1052+(ac*12&-1)>>2]|0)==1){aF=(uA(aq|0)|0)+3|0;aG=ut(aF)|0;if((aG|0)==0){gk();p=ut(aF)|0;if((p|0)==0){K=4721;break L6580}else{bn=p}}else{bn=aG}a[bn]=34;aG=bn+1|0;uB(aG|0,aq|0);aG=bn+(uA(bn|0)|0)|0;w=34;a[aG]=w&255;w=w>>8;a[aG+1|0]=w&255;aG=47088+(ac<<2)|0;uu(c[aG>>2]|0);c[aG>>2]=bn;c[47056+(ac<<2)>>2]=bn}uu(aq);c[aR>>2]=1;bm=+h[f+(ac<<3)>>3];break}else if((aH|0)==1){bo=+(c[ae>>2]|0)}else if((aH|0)==2){bo=+h[aN>>3]}else{K=4726;break L6580}h[f+(ac<<3)>>3]=bo;bm=bo}}while(0);if((cg(+bm)|0)==0){if((a[47584]&1)==0){y=-2;K=4972;break L6580}}ax=ac+1|0;if((ax|0)<(aL|0)){ac=ax}else{bp=1;bq=ax;break L6680}}bp=(c[11870]|0)==0&1;bq=ac}else{bp=1;bq=0}}while(0);do{if((a[47128]&1)!=0){a$=+h[f>>3]- +h[5908];a0=+h[aS>>3]- +h[5909];a1=a$*+h[5911]+a0*+h[5912];h[f>>3]=a1;aZ=a$*+h[5913]+a0*+h[5914];h[aS>>3]=aZ;if((c[11856]|0)==2){a0=+h[aT>>3]- +h[5910];a$=a1*+h[5915]+aZ*+h[5916]+a0*+h[5917];h[f>>3]=a$;aX=a1*+h[5918]+aZ*+h[5919]+a0*+h[5920];h[aS>>3]=aX;h[aT>>3]=a1*+h[5921]+aZ*+h[5922]+a0*+h[5923];br=a$;bs=aX}else{br=a1;bs=aZ}h[f>>3]=br+ +h[5897];h[aS>>3]=bs+ +h[5898];if((c[11856]|0)!=2){break}h[aT>>3]=+h[5899]+ +h[aT>>3]}}while(0);if((bp|0)==0){bf=_}else{K=4752;break L6580}}}while(0);if(a[47736]|0){break L6578}else{_=bf}}if((K|0)==4629){a[47224]=0;c[7638]=-1;c[8800]=(c[8800]|0)+1;y=-3;i=k;return y|0}else if((K|0)==4631){a[47232]=0;c[8800]=0;y=-4;i=k;return y|0}else if((K|0)==4649){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4669){uf(-1,184064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4682){uf(-1,183240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4697){if((cj(c[12892]|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((a5|0)!=0){uf(-1,182696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4721){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=181200,v)|0);return 0}else if((K|0)==4726){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4738){uf(-1,180832,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4752){_=c[11870]|0;if((c[11872]|0)>0){aT=u|0;aS=u+8|0;aN=_;while(1){ae=1052+(aN*12&-1)|0;do{if((c[ae>>2]|0)>2){aR=c[1056+(aN*12&-1)>>2]|0;if((aR|0)==0){break}a[43504]=1;e4(aR,u);a[43504]=0;aR=c[ae>>2]|0;if((aR|0)==4){bt=0;bu=6}else if((aR|0)==5){bt=1;bu=1}else if((aR|0)==6){bt=1;bu=5}else if((aR|0)==7){bt=2;bu=0}else if((aR|0)==8){bt=2;bu=3}else{bt=0;bu=2}if((c[aT>>2]|0)!=3){break}aR=c[aS>>2]|0;dp(bu,aR,+h[f+(bt<<3)>>3],-1);uu(aR);c[aT>>2]=1}}while(0);ae=aN+1|0;aR=c[11870]|0;if((ae|0)<((c[11872]|0)+aR|0)){aN=ae}else{bv=aR;break}}}else{bv=_}if((bv|0)==0|(bq|0)==(bv|0)|(bq|0)==(j|0)){y=bq;i=k;return y|0}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=180528,v)|0);return 0}}else if((K|0)==4966){i=k;return y|0}else if((K|0)==4967){i=k;return y|0}else if((K|0)==4970){i=k;return y|0}else if((K|0)==4971){i=k;return y|0}else if((K|0)==4972){i=k;return y|0}}}while(0);a[47736]=1;y=-1;i=k;return y|0}function eD(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;c=i;i=i+8|0;d=c|0;if((b|0)==0){e=0;i=c;return e|0}do{if((a[b]|0)==34){f=b+1|0;if((f|0)==0){g=0}else{g=bP(f|0)|0}a[g+(bk(g|0,132696)|0)|0]=0;h=g}else{f=a[47120]|0;if(f<<24>>24==0){j=bP(b|0)|0;a[j+(bk(j|0,84256)|0)|0]=0;h=j;break}else{j=d|0;a[j]=f;a[d+1|0]=34;a[d+2|0]=0;f=bP(b|0)|0;a[f+(bk(f|0,j|0)|0)|0]=0;h=f;break}}}while(0);ua(h);e=h;i=c;return e|0}function eE(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0;d=i;i=i+8|0;e=d|0;f=e;if((cd(f|0,4,1,b|0)|0)!=1){if((cj(b|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0.0}else{uf(-1,74632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0.0}}b=c[12208]|0;h=a[47816+(b>>>0<3?b:3)|0]|0;if((h-2|0)>>>0<2){b=0;j=3;do{k=f+b|0;l=a[k]|0;m=f+j|0;a[k]=a[m]|0;a[m]=l;b=b+1|0;j=j-1|0;}while((b|0)<(j|0))}if((h-1|0)>>>0>=2){n=+g[e>>2];i=d;return+n}h=f+2|0;j=a[h]|0;b=f+3|0;a[h]=a[b]|0;a[b]=j;j=a[f]|0;b=f+1|0;a[f]=a[b]|0;a[b]=j;n=+g[e>>2];i=d;return+n}function eF(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0;d=i;e=b+8|0;f=c[e>>2]|0;g=f-1|0;if((f|0)==0){f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+(c[11942]|0);k=f+1|0;c[6354]=k;c[14296+(k*24&-1)>>2]=2;h[14304+(k*24&-1)>>3]=j;h[14312+(k*24&-1)>>3]=0.0;i=d;return}do{if((g|0)<(c[11874]|0)){k=c[11952]|0;if((c[k+(g*24&-1)+8>>2]|0)!=1){break}f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+h[k+(g*24&-1)>>3];k=f+1|0;c[6354]=k;c[14296+(k*24&-1)>>2]=2;h[14304+(k*24&-1)>>3]=j;h[14312+(k*24&-1)>>3]=0.0;i=d;return}}while(0);a[1960]=1;g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=g+1|0;c[6354]=k;g=14296+(k*24&-1)|0;k=b;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];c[g+16>>2]=c[k+16>>2];c[g+20>>2]=c[k+20>>2];if((c[b>>2]|0)!=3){i=d;return}b=c[e>>2]|0;if((b|0)==0){i=d;return}e=bP(b|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;i=d;return}function eG(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;h[d>>3]=k;m=+h[14312+(e*24&-1)>>3];e=l;l=e;if((a[43504]&1)==0){uf((c[13898]|0)-1|0,74216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((g|0)==1){n=+(e|0);o=5045}else if((g|0)==2){n=k;o=5045}else if((g|0)==3){e=d;f=c[11874]|0;L6842:do{if((f|0)>0){p=0;q=f;while(1){r=c[(c[11952]|0)+(p*24&-1)+16>>2]|0;if((r|0)==0){s=q}else{if(ui(l,r+((a[r]|0)==34&1)|0)|0){break}s=c[11874]|0}r=p+1|0;if((r|0)<(s|0)){p=r;q=s}else{t=-9;break L6842}}q=p+1|0;if((c[11902]|0)!=0){t=q;break}r=c[(c[11952]|0)+(p*24&-1)+16>>2]|0;if((r|0)==0){u=0}else{u=bP(r|0)|0}c[11902]=u;t=q}else{t=-9}}while(0);uu(c[e>>2]|0);w=t;x=1}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)==5045){w=~~n;x=g}if((w|0)==(-2|0)){c[d>>2]=c[11946];g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=g+1|0;c[6354]=o;g=14296+(o*24&-1)|0;c[g>>2]=1;c[g+4>>2]=j;h[14304+(o*24&-1)>>3]=+h[d>>3];h[14312+(o*24&-1)>>3]=m;i=b;return}else if((w|0)==(-1|0)){c[d>>2]=c[8800];o=c[6354]|0;if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=o+1|0;c[6354]=g;o=14296+(g*24&-1)|0;c[o>>2]=1;c[o+4>>2]=j;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=m;i=b;return}else if((w|0)==0){n=+(c[11942]|0);h[d>>3]=n;g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=g+1|0;c[6354]=o;g=14296+(o*24&-1)|0;c[g>>2]=2;c[g+4>>2]=j;h[14304+(o*24&-1)>>3]=n;h[14312+(o*24&-1)>>3]=0.0;i=b;return}else{do{if(!((w|0)<1|(w|0)>(c[11874]|0))){o=w-1|0;g=c[11952]|0;if((c[g+(o*24&-1)+8>>2]|0)!=1){break}n=+h[g+(o*24&-1)>>3];h[d>>3]=n;o=c[6354]|0;if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=o+1|0;c[6354]=g;o=14296+(g*24&-1)|0;c[o>>2]=2;c[o+4>>2]=j;h[14304+(g*24&-1)>>3]=n;h[14312+(g*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;w=c[6354]|0;if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=w+1|0;c[6354]=g;w=14296+(g*24&-1)|0;c[w>>2]=x;c[w+4>>2]=j;j=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=m;g=j;if((x|0)!=3|(g|0)==0){i=b;return}x=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=x;i=b;return}}function eH(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0;b=i;i=i+104|0;d=b|0;e=b+8|0;f=b+40|0;g=b+72|0;j=c[6354]|0;if((j|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=j-1;k=14296+(j*24&-1)|0;l=c[k>>2]|0;m=c[k+4>>2]|0;k=14304+(j*24&-1)|0;n=+h[k>>3];o=c[k>>2]|0;h[d>>3]=n;p=+h[14312+(j*24&-1)>>3];j=o;o=j;if((a[43504]&1)==0){q=c[13898]|0;r=q-1|0;uf(r,73448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[47584]&1)!=0){q=c[13898]|0;r=q-1|0;uf(r,73448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)==3){r=d;q=c[11874]|0;L6902:do{if((q|0)>0){k=0;s=q;while(1){t=c[(c[11952]|0)+(k*24&-1)+16>>2]|0;if((t|0)==0){u=s}else{if(ui(o,t+((a[t]|0)==34&1)|0)|0){break}u=c[11874]|0}t=k+1|0;if((t|0)<(u|0)){k=t;s=u}else{w=5088;break L6902}}s=k+1|0;if((c[11902]|0)==0){t=c[(c[11952]|0)+(k*24&-1)+16>>2]|0;if((t|0)==0){x=0}else{x=bP(t|0)|0}c[11902]=x}if((s|0)==-9){w=5088}else{y=s}}else{w=5088}}while(0);do{if((w|0)==5088){if((a[47040]&1)==0){y=-9;break}a[47040]=0;uh(-1,72840,(v=i,i=i+8|0,c[v>>2]=c[r>>2],v)|0);x=c[11874]|0;if((x|0)>0){z=0;A=x}else{y=-9;break}while(1){x=c[(c[11952]|0)+(z*24&-1)+16>>2]|0;do{if((x|0)==0){B=A}else{u=x+((a[x]|0)==34&1)|0;if((a_(o|0,u|0,uA(o|0)|0)|0)!=0){B=A;break}uh(-1,225080,(v=i,i=i+16|0,c[v>>2]=z+1,c[v+8>>2]=x,v)|0);B=c[11874]|0}}while(0);x=z+1|0;if((x|0)<(B|0)){z=x;A=B}else{y=-9;break}}}}while(0);uu(c[r>>2]|0);C=y;D=1}else if((l|0)==1){E=+(j|0);w=5097}else if((l|0)==2){E=n;w=5097}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==5097){C=~~E;D=l}if((C|0)==(-2|0)){l=e|0;e=c[11946]|0;be(l|0,21e4,(v=i,i=i+8|0,c[v>>2]=e,v)|0);c[d>>2]=l;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=l+1|0;c[6354]=e;l=14296+(e*24&-1)|0;c[l>>2]=3;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(e*24&-1)>>3]=+h[d>>3];h[14312+(e*24&-1)>>3]=p;e=l;if((e|0)==0){i=b;return}l=bP(e|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;i=b;return}else if((C|0)==(-1|0)){l=f|0;be(l|0,21e4,(v=i,i=i+8|0,c[v>>2]=c[8800],v)|0);c[d>>2]=l;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=l+1|0;c[6354]=f;l=14296+(f*24&-1)|0;c[l>>2]=3;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(f*24&-1)>>3]=+h[d>>3];h[14312+(f*24&-1)>>3]=p;f=l;if((f|0)==0){i=b;return}l=bP(f|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;i=b;return}else if((C|0)==0){l=g|0;be(l|0,21e4,(v=i,i=i+8|0,c[v>>2]=c[11942],v)|0);c[d>>2]=l;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=3;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=p;g=l;if((g|0)==0){i=b;return}l=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;i=b;return}else{if((C|0)<1|(C|0)>(c[11874]|0)){a[1960]=1;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=D;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=p;g=l;if((D|0)!=3|(g|0)==0){i=b;return}D=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=D;i=b;return}else{D=eD(c[(c[11952]|0)+((C-1|0)*24&-1)+12>>2]|0)|0;c[d>>2]=D;C=c[6354]|0;if((C|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=C+1|0;c[6354]=g;C=14296+(g*24&-1)|0;c[C>>2]=3;c[C+4>>2]=m;m=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=p;g=m;if((g|0)!=0){m=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=m}uu(D);i=b;return}}}function eI(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0;b=i;i=i+8|0;d=b|0;if((a[43504]&1)==0){uf((c[13898]|0)-1|0,223600,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[d>>3]=l;n=+h[14312+(e*24&-1)>>3];e=m;if((j|0)==2){o=l;p=f}else if((j|0)==1){o=+(e|0);p=f}else if((j|0)==3){l=+uz(e,0);o=l;p=c[6354]|0}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13488]=~~o;c[d>>2]=222976;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=p+1|0;c[6354]=e;p=14296+(e*24&-1)|0;c[p>>2]=3;c[p+4>>2]=k;k=c[d>>2]|0;h[14304+(e*24&-1)>>3]=+h[d>>3];h[14312+(e*24&-1)>>3]=n;e=k;if((e|0)==0){i=b;return}k=bP(e|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=k;i=b;return}function eJ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f|0;j=c[g>>2]|0;k=f+4|0;f=c[k>>2]|0;l=14304+(d*24&-1)|0;m=+h[l>>3];n=c[l>>2]|0;h[b>>3]=m;o=14312+(d*24&-1)|0;p=+h[o>>3];q=n;do{if((j|0)==2){r=+P(+m);s=+P(+p);if(p==0.0){t=r;break}if(r>s){u=s/r;t=r*+Q(+(u*u+1.0));break}else{u=r/s;t=s*+Q(+(u*u+1.0));break}}else if((j|0)==1){t=+(((q|0)>-1?q:-q|0)|0)}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);q=~~t;j=q-1|0;if((q|0)>0&(j|0)<(c[11874]|0)){w=(c[(c[11952]|0)+(j*24&-1)+8>>2]|0)==1&1}else{w=0}c[b>>2]=w;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[g>>2]=1;c[k>>2]=f;h[l>>3]=+h[b>>3];h[o>>3]=p;i=a;return}}function eK(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,w=0,x=0;b=i;i=i+56|0;d=b|0;e=b+48|0;h[e>>3]=0.0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=14296+(f*24&-1)|0;k=c[j>>2]|0;l=c[j+4>>2]|0;j=14304+(f*24&-1)|0;m=+h[j>>3];n=+h[14312+(f*24&-1)>>3];f=c[j>>2]|0;j=f;do{if((k|0)==1){o=+(((f|0)>-1?f:-f|0)|0)}else if((k|0)==2){p=+P(+m);q=+P(+n);if(n==0.0){o=p;break}if(p>q){r=q/p;o=p*+Q(+(r*r+1.0));break}else{r=p/q;o=q*+Q(+(r*r+1.0));break}}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);s=~~o;if((a[43504]&1)==0){uf((c[13898]|0)-1|0,222536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=c[48840+(c[12902]<<2)>>2]|0;do{if((s|0)<1|(s|0)>(c[11874]|0)){u=g}else{w=c[(c[11952]|0)+((s-1|0)*24&-1)+12>>2]|0;if((w|0)==0){u=g;break}x=(t1(w,64813+(t*688&-1)|0,d,e)|0)==0;w=c[6354]|0;if(x){u=w;break}if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=+h[e>>3];r=+t2(d)+o;x=w+1|0;c[6354]=x;w=14296+(x*24&-1)|0;c[w>>2]=2;c[w+4>>2]=l;h[14304+(x*24&-1)>>3]=r;h[14312+(x*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=u+1|0;c[6354]=d;u=14296+(d*24&-1)|0;c[u>>2]=k;c[u+4>>2]=l;h[14304+(d*24&-1)>>3]=m;h[14312+(d*24&-1)>>3]=n;if((k|0)!=3|(f|0)==0){i=b;return}f=bP(j|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=f;i=b;return}function eL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[11902]|0;if((e|0)==0){i=d;return}if((c[b+12>>2]|0)==392&(c[9670]|0)==2){dp(2,e,+(c[b+280>>2]|0)+ +h[(c[b+276>>2]|0)+16>>3],-1);uu(c[11902]|0);c[11902]=0;i=d;return}f=b+16|0;g=c[f>>2]|0;do{if((g|0)!=0){if((a[b+21|0]&1)!=0){break}j=aQ(g|0,222976)|0;if((j|0)==0){i=d;return}k=uA(g|0)|0;l=(uA(e|0)|0)+k|0;k=ut(l)|0;do{if((k|0)==0){gk();m=ut(l)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=221744,v)|0)}else{n=k}}while(0);a[j]=0;k=c[f>>2]|0;l=c[11902]|0;m=j+12|0;be(n|0,172512,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=l,c[v+16>>2]=m,v)|0);uu(c[11902]|0);c[11902]=n}}while(0);if((a[b+22|0]&1)!=0){i=d;return}n=c[f>>2]|0;if((n|0)!=0){uu(n)}a[b+20|0]=a[36231]&1^1;c[f>>2]=c[11902];c[11902]=0;i=d;return}function eM(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0;d=i;i=i+48|0;e=d|0;f=d+24|0;g=c[13898]|0;j=g+1|0;c[13898]=j;k=(c[8272]|0)>(j|0);L7071:do{if(k){l=c[1054]|0;if((a[l+(j*40&-1)|0]&1)!=0){m=c[l+(j*40&-1)+36>>2]|0;n=l+(j*40&-1)+32|0;l=c[10036]|0;o=0;while(1){if((o|0)>=(m|0)){p=5212;break}if((a[l+((c[n>>2]|0)+o|0)|0]|0)==(a[o+199040|0]|0)){o=o+1|0}else{break}}do{if((p|0)==5212){if((o|0)!=1){break}c[13898]=g+2;n=is(f)|0;l=c[n>>2]|0;if((l|0)==2){q=+h[n+8>>3]}else if((l|0)==3){q=+uz(c[n+8>>2]|0,0)}else if((l|0)==1){q=+(c[n+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=f|0;if((c[n>>2]|0)==3){uu(c[f+8>>2]|0);c[n>>2]=1}n=~~q;c[13488]=n;c[13898]=(c[13898]|0)+1;r=n;break L7071}}while(0);if(!k){p=5236;break}}o=c[1054]|0;n=(a[o+(j*40&-1)|0]&1)==0;do{if(!n){l=c[o+(j*40&-1)+36>>2]|0;m=o+(j*40&-1)+32|0;s=c[10036]|0;t=0;while(1){if((t|0)>=(l|0)){p=5226;break}if((a[s+((c[m>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{p=5227;break}}if((p|0)==5226){if((t|0)==1|n^1){p=5236;break L7071}else{break}}else if((p|0)==5227){if(n){break}else{p=5236;break L7071}}}}while(0);n=is(e)|0;o=c[n>>2]|0;if((o|0)==1){u=+(c[n+8>>2]|0)}else if((o|0)==2){u=+h[n+8>>3]}else if((o|0)==3){u=+uz(c[n+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=e|0;if((c[n>>2]|0)==3){uu(c[e+8>>2]|0);c[n>>2]=1}n=~~u;c[13488]=n;r=n}else{p=5236}}while(0);do{if((p|0)==5236){if((c[11870]|0)==1){e=c[262]|0;c[13488]=e;r=e;break}if((c[b+8>>2]|0)==3){e=c[268]|0;c[13488]=e;r=e;break}else{e=c[265]|0;c[13488]=e;r=e;break}}}while(0);if((r|0)!=-99){i=d;return}c[b+16>>2]=bP(222976)|0;i=d;return}function eN(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,w=0,x=0.0,y=0.0,z=0;d=i;aI(214576,68,1,b|0);e=c[11862]|0;f=(e|0)==0;g=f?1:e;e=f?48440:c[12168]|0;aI(213904,15,1,b|0);f=c[12202]|0;if((f|0)>-1){j=c[48696+(f<<3)>>2]|0;aK(j|0,b|0)}else{aI(135560,4,1,b|0)}cf(b|0,212192,(v=i,i=i+8|0,c[v>>2]=c[47744+(c[12206]<<2)>>2],v)|0);j=c[11962]|0;cf(b|0,211640,(v=i,i=i+8|0,c[v>>2]=(j|0)!=0?j:135560,v)|0);if((g|0)>0){k=0}else{i=d;return}do{cf(b|0,211256,(v=i,i=i+8|0,c[v>>2]=k,v)|0);aI(210760,16,1,b|0);j=c[e+(k*232&-1)>>2]|0;do{if((j|0)<0){aI(210016,3,1,b|0);l=1}else{cf(b|0,21e4,(v=i,i=i+8|0,c[v>>2]=j,v)|0);f=c[e+(k*232&-1)+4>>2]|0;if((f|0)<=0){l=1;break}cf(b|0,209320,(v=i,i=i+8|0,c[v>>2]=f,v)|0);f=c[e+(k*232&-1)+8>>2]|0;if((f|0)<=0){l=2;break}cf(b|0,209320,(v=i,i=i+8|0,c[v>>2]=f,v)|0);l=3}}while(0);j=e+(k*232&-1)+124|0;cf(b|0,209120,(v=i,i=i+8|0,c[v>>2]=(a[j]&1)!=0?136424:136208,v)|0);do{if((a[j]&1)!=0){aI(207296,17,1,b|0);if((c[e+(k*232&-1)+12>>2]|0)==-1){aI(206608,6,1,b|0);m=0}else{m=1}f=l>>>0>1;L7143:do{if(f){if((c[e+(k*232&-1)+16>>2]|0)==-1){n=m?179864:86120;cf(b|0,205848,(v=i,i=i+8|0,c[v>>2]=n,v)|0);o=0}else{o=m}do{if((l|0)==3){if((c[e+(k*232&-1)+20>>2]|0)!=-1){p=1;break}n=o?179864:86120;cf(b|0,204712,(v=i,i=i+8|0,c[v>>2]=n,v)|0);q=1;r=5268;break L7143}else{p=0}}while(0);if(o){s=p;r=5267}else{q=p;r=5268}}else{if(m){s=0;r=5267;break}t=+h[e+(k*232&-1)+24>>3];cf(b|0,204152,(v=i,i=i+8|0,h[v>>3]=t,v)|0);u=0}}while(0);if((r|0)==5267){r=0;aI(204448,11,1,b|0);q=s;r=5268}do{if((r|0)==5268){r=0;t=+h[e+(k*232&-1)+24>>3];cf(b|0,204152,(v=i,i=i+8|0,h[v>>3]=t,v)|0);if(f){t=+h[e+(k*232&-1)+32>>3];cf(b|0,203944,(v=i,i=i+8|0,h[v>>3]=t,v)|0);if(!q){u=0;break}}else{if(!q){u=0;break}}t=+h[e+(k*232&-1)+40>>3];cf(b|0,203696,(v=i,i=i+8|0,h[v>>3]=t,v)|0);u=1}}while(0);n=e+(k*232&-1)+48|0;w=c[n>>2]|0;if((w|0)==1){aI(203456,13,1,b|0)}else if((w|0)==2){aI(203128,13,1,b|0)}if(((c[n>>2]|0)-1|0)>>>0<2){t=+h[e+(k*232&-1)+56>>3];x=+h[e+(k*232&-1)+64>>3];y=+h[e+(k*232&-1)+72>>3];cf(b|0,202912,(v=i,i=i+24|0,h[v>>3]=t,h[v+8>>3]=x,h[v+16>>3]=y,v)|0)}y=+h[e+(k*232&-1)+80>>3];cf(b|0,202576,(v=i,i=i+8|0,h[v>>3]=y,v)|0);y=+h[e+(k*232&-1)+88>>3];x=+h[e+(k*232&-1)+96>>3];t=+h[e+(k*232&-1)+104>>3];cf(b|0,201912,(v=i,i=i+24|0,h[v>>3]=y,h[v+8>>3]=x,h[v+16>>3]=t,v)|0);n=e+(k*232&-1)+112|0;w=0;while(1){if(w>>>0>=12){break}if((a_(n|0,48188+(w<<4)|0,12)|0)==0){r=5280;break}else{w=w+1|0}}if((r|0)==5280){r=0;aI(201312,12,1,b|0);n=(c[e+(k*232&-1)+8>>2]|0)!=0?132824:200424;z=c[48184+(w<<4)>>2]|0;cf(b|0,n|0,(v=i,i=i+8|0,c[v>>2]=z,v)|0)}cf(b|0,199512,(v=i,i=i+8|0,c[v>>2]=c[e+(k*232&-1)+128>>2],v)|0);if(f){z=c[e+(k*232&-1)+132>>2]|0;cf(b|0,199136,(v=i,i=i+8|0,c[v>>2]=z,v)|0)}if(!u){break}cf(b|0,198848,(v=i,i=i+8|0,c[v>>2]=c[e+(k*232&-1)+136>>2],v)|0)}}while(0);aF(10,b|0);k=k+1|0;}while((k|0)<(g|0));i=d;return}function eO(a){a=a|0;var d=0,f=0,g=0,h=0,j=0;d=i;aI(198008,82,1,a|0);f=0;do{aI(197576,3,1,a|0);g=48028+(f<<4)|0;if((b[g>>1]|0)!=0){h=48024+(f<<4)|0;j=0;do{cf(a|0,103640,(v=i,i=i+8|0,c[v>>2]=c[(c[h>>2]|0)+(j<<2)>>2],v)|0);j=j+1|0;}while((j|0)<(e[g>>1]|0|0))}cf(a|0,196376,(v=i,i=i+8|0,c[v>>2]=e[48036+(f<<4)>>1]|0,v)|0);f=f+1|0;}while(f>>>0<10);aI(195800,95,1,a|0);f=0;do{aI(197576,3,1,a|0);g=47868+(f<<4)|0;if((b[g>>1]|0)!=0){j=47864+(f<<4)|0;h=0;do{cf(a|0,103640,(v=i,i=i+8|0,c[v>>2]=c[(c[j>>2]|0)+(h<<2)>>2],v)|0);h=h+1|0;}while((h|0)<(e[g>>1]|0|0))}cf(a|0,194088,(v=i,i=i+8|0,c[v>>2]=e[47876+(f<<4)>>1]|0,v)|0);if((c[47872+(f<<4)>>2]|0)==12){aI(193568,40,1,a|0)}aF(10,a|0);f=f+1|0;}while(f>>>0<10);i=d;return}function eP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;b=i;d=(c[13898]|0)+1|0;c[13898]=d;if((d|0)>=(c[8272]|0)){uf(d,217808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[1054]|0;L7206:do{if((a[e+(d*40&-1)|0]&1)!=0){f=c[e+(d*40&-1)+36>>2]|0;g=e+(d*40&-1)+32|0;h=c[10036]|0;j=0;while(1){if((j|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+j|0)|0]|0)==(a[j+103664|0]|0)){j=j+1|0}else{break L7206}}if((j|0)!=1){break}uf(d,217808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);d=c[12172]|0;e=c[11864]|0;if((e|0)>0){g=0;h=e;while(1){e=d+(g*232&-1)+224|0;f=c[e>>2]|0;if((f|0)==0){k=h}else{uu(f);c[e>>2]=0;k=c[11864]|0}e=g+1|0;if((e|0)<(k|0)){g=e;h=k}else{break}}}c[11864]=0;if((c[12168]|0)==0){c[12204]=c[12200];c[12208]=0;k=c[12172]|0;do{if((c[11880]|0)<1){h=db(k,232,216568)|0;g=h;c[12172]=g;if((h|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11880]=1;l=c[11864]|0;m=g;break}}else{l=0;m=k}}while(0);uD(m+(l*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}else{c[12204]=c[12202];c[12208]=c[12206];l=c[11862]|0;do{if((l|0)>(c[11880]|0)){m=db(c[12172]|0,l*232&-1,216568)|0;c[12172]=m;if((m|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11880]=l;break}}}while(0);m=c[12172]|0;k=c[11864]|0;if((l|0)>0){g=0;h=k;while(1){uD(m+(h*232&-1)|0,48440,232);d=(c[11864]|0)+1|0;c[11864]=d;e=g+1|0;if((e|0)<(l|0)){g=e;h=d}else{n=d;break}}}else{n=k}uD(m|0,c[12168]|0,n*232&-1)}c[11856]=0;eB(0,1);c[12202]=c[12204];c[12206]=c[12208];n=c[12168]|0;m=c[11862]|0;if((m|0)>0){k=0;h=m;while(1){m=n+(k*232&-1)+224|0;g=c[m>>2]|0;if((g|0)==0){o=h}else{uu(g);c[m>>2]=0;o=c[11862]|0}m=k+1|0;if((m|0)<(o|0)){k=m;h=o}else{break}}}c[11862]=0;o=c[11864]|0;do{if((o|0)>(c[11878]|0)){h=db(c[12168]|0,o*232&-1,216568)|0;c[12168]=h;if((h|0)==0){c[11878]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11878]=o;break}}}while(0);h=c[12168]|0;k=c[11862]|0;if((o|0)>0){p=0;q=k}else{r=k;s=h;t=c[12172]|0;u=t;w=r*232&-1;uD(s|0,u|0,w);i=b;return}while(1){uD(h+(q*232&-1)|0,48440,232);k=(c[11862]|0)+1|0;c[11862]=k;n=p+1|0;if((n|0)<(o|0)){p=n;q=k}else{r=k;break}}s=h;t=c[12172]|0;u=t;w=r*232&-1;uD(s|0,u|0,w);i=b;return}function eQ(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[11876]|0;if((e|0)>=(a|0)){i=d;return}if((e|0)>0){f=c[(c[11950]|0)+((e-1|0)*12&-1)+4>>2]|0}else{f=8}e=48036+(f<<4)|0;g=a;while(1){h=g+1|0;if((h|0)<=0){j=5346;break}k=c[11950]|0;if((c[11884]|0)<(h|0)){l=db(k,h*12&-1,215112)|0;c[11950]=l;c[11884]=h;m=l}else{m=k}c[m+(g*12&-1)>>2]=0;if((g|0)<=0){j=5350;break}k=c[11950]|0;if((c[11884]|0)<(g|0)){l=db(k,g*12&-1,215112)|0;c[11950]=l;c[11884]=g;n=l}else{n=k}k=g-1|0;c[n+(k*12&-1)+4>>2]=f;b[(c[11950]|0)+(k*12&-1)+8>>1]=b[e>>1]|0;if((k|0)>(c[11876]|0)){g=k}else{j=5354;break}}if((j|0)==5354){c[11876]=a;i=d;return}else if((j|0)==5350){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((j|0)==5346){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}}function eR(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=d|0;do{if(a[47440]|0){f=b}else{if((a[30664]&1)!=0){f=b;break}if((cp(c[12892]|0,b|0,1)|0)==0){g=0;i=d;return g|0}if((cj(c[12892]|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a[47736]=1;g=-1;i=d;return g|0}}while(0);while(1){if((f|0)==0){g=0;h=5372;break}if((cd(e|0,1,1,c[12892]|0)|0)==1){f=f-1|0}else{break}}if((h|0)==5372){i=d;return g|0}if((cj(c[12892]|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a[47736]=1;g=-1;i=d;return g|0}function eS(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0.0;b=i;i=i+80|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=g|0;k=i;i=i+4|0;i=i+7>>3<<3;l=c[13898]|0;if((c[8272]|0)<=(l|0)){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=c[1054]|0;if((a[n+(l*40&-1)|0]&1)==0){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[n+(l*40&-1)+36>>2]|0;p=n+(l*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(o|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+115e3|0]|0)){r=r+1|0}else{s=5462;break}}if((s|0)==5462){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)!=1){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=c[12172]|0;r=c[11864]|0;if((r|0)>0){p=0;q=r;while(1){r=m+(p*232&-1)+224|0;o=c[r>>2]|0;if((o|0)==0){t=q}else{uu(o);c[r>>2]=0;t=c[11864]|0}r=p+1|0;if((r|0)<(t|0)){p=r;q=t}else{break}}u=c[13898]|0;w=c[1054]|0}else{u=l;w=n}c[11864]=0;n=e|0;l=e+8|0;t=g|0;q=g+1|0;p=d|0;m=d+8|0;r=f|0;o=f+8|0;x=0;y=u;u=w;L7326:while(1){w=y+1|0;c[13898]=w;L7328:do{if((a[u+(w*40&-1)|0]&1)==0){z=x+1|0;A=c[11864]|0;if((z|0)>(A|0)){B=A+1|0;if((B|0)>(c[11880]|0)){C=db(c[12172]|0,B*232&-1,216568)|0;c[12172]=C;if((C|0)==0){s=5391;break L7326}c[11880]=B;D=c[11864]|0}else{D=A}uD((c[12172]|0)+(D*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}A=is(e)|0;B=c[A>>2]|0;if((B|0)==2){E=+h[A+8>>3]}else if((B|0)==1){E=+(c[A+8>>2]|0)}else if((B|0)==3){E=+uz(c[A+8>>2]|0,0)}else{s=5398;break L7326}if((c[n>>2]|0)==3){uu(c[l>>2]|0);c[n>>2]=1}c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)>>2]=~~E;A=c[13898]|0;B=c[8272]|0;if((A|0)>=(B|0)){F=z;G=A;H=B;break}C=c[1054]|0;L7346:do{if((a[C+(A*40&-1)|0]&1)==0){I=c[10036]|0;J=C+(A*40&-1)+32|0;K=C+(A*40&-1)+36|0}else{L=C+(A*40&-1)+36|0;M=c[L>>2]|0;N=C+(A*40&-1)+32|0;O=c[10036]|0;P=0;while(1){if((P|0)>=(M|0)){break}if((a[O+((c[N>>2]|0)+P|0)|0]|0)==(a[P+103664|0]|0)){P=P+1|0}else{I=O;J=N;K=L;break L7346}}if((P|0)==1){F=z;G=A;H=B;break L7328}else{I=O;J=N;K=L}}}while(0);c[k>>2]=0;C=c[K>>2]|0;uD(j|0,I+(c[J>>2]|0)|0,(C|0)<5?C:5);a[g+((C|0)>5?5:C)|0]=0;if((a[t]|0)!=120){F=z;G=A;H=B;break}ca(q|0,21e4,(v=i,i=i+8|0,c[v>>2]=k,v)|0);c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)+4>>2]=c[k>>2];C=(c[13898]|0)+1|0;c[13898]=C;F=z;G=C;H=c[8272]|0}else{C=c[8272]|0;if((C|0)<=(w|0)){F=x;G=w;H=C;break}M=c[u+(w*40&-1)+36>>2]|0;Q=u+(w*40&-1)+32|0;R=c[10036]|0;S=0;while(1){if((S|0)>=(M|0)){break}if((a[R+((c[Q>>2]|0)+S|0)|0]|0)==(a[S+199040|0]|0)){S=S+1|0}else{F=x;G=w;H=C;break L7328}}if((S|0)!=1){F=x;G=w;H=C;break}c[13898]=y+2;Q=x+1|0;R=c[11864]|0;if((Q|0)>(R|0)){M=R+1|0;if((M|0)>(c[11880]|0)){z=db(c[12172]|0,M*232&-1,216568)|0;c[12172]=z;if((z|0)==0){s=5418;break L7326}c[11880]=M;T=c[11864]|0}else{T=R}uD((c[12172]|0)+(T*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}R=is(d)|0;M=c[R>>2]|0;if((M|0)==1){U=+(c[R+8>>2]|0)}else if((M|0)==2){U=+h[R+8>>3]}else if((M|0)==3){U=+uz(c[R+8>>2]|0,0)}else{s=5425;break L7326}if((c[p>>2]|0)==3){uu(c[m>>2]|0);c[p>>2]=1}c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)>>2]=~~U;R=c[13898]|0;M=c[8272]|0;L7377:do{if((M|0)>(R|0)){z=c[1054]|0;if((a[z+(R*40&-1)|0]&1)==0){V=R;W=M;break}B=c[z+(R*40&-1)+36>>2]|0;A=z+(R*40&-1)+32|0;z=c[10036]|0;X=0;while(1){if((X|0)>=(B|0)){break}if((a[z+((c[A>>2]|0)+X|0)|0]|0)==(a[X+148464|0]|0)){X=X+1|0}else{V=R;W=M;break L7377}}if((X|0)!=1){V=R;W=M;break}c[13898]=R+1;A=is(f)|0;z=c[A>>2]|0;if((z|0)==1){Y=+(c[A+8>>2]|0)}else if((z|0)==2){Y=+h[A+8>>3]}else if((z|0)==3){Y=+uz(c[A+8>>2]|0,0)}else{s=5438;break L7326}if((c[r>>2]|0)==3){uu(c[o>>2]|0);c[r>>2]=1}c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)+4>>2]=~~Y;V=c[13898]|0;W=c[8272]|0}else{V=R;W=M}}while(0);if((W|0)<=(V|0)){s=5459;break L7326}M=c[1054]|0;if((a[M+(V*40&-1)|0]&1)==0){s=5460;break L7326}R=c[M+(V*40&-1)+36>>2]|0;C=M+(V*40&-1)+32|0;M=c[10036]|0;S=0;while(1){if((S|0)>=(R|0)){break}if((a[M+((c[C>>2]|0)+S|0)|0]|0)==(a[S+131272|0]|0)){S=S+1|0}else{s=5457;break L7326}}if((S|0)!=1){s=5458;break L7326}C=V+1|0;c[13898]=C;F=Q;G=C;H=W}}while(0);if((H|0)<=(G|0)){s=5465;break}w=c[1054]|0;if((a[w+(G*40&-1)|0]&1)==0){s=5466;break}C=c[w+(G*40&-1)+36>>2]|0;M=w+(G*40&-1)+32|0;R=c[10036]|0;A=0;while(1){if((A|0)>=(C|0)){break}if((a[R+((c[M>>2]|0)+A|0)|0]|0)==(a[A+183584|0]|0)){A=A+1|0}else{s=5467;break L7326}}if((A|0)==1){x=F;y=G;u=w}else{s=5468;break}}if((s|0)==5391){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5457){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5458){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5460){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5438){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5459){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5466){i=b;return}else if((s|0)==5467){i=b;return}else if((s|0)==5468){i=b;return}else if((s|0)==5418){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5425){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5398){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5465){i=b;return}}function eT(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0;e=i;i=i+80|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;m=c[8272]|0;if((m|0)<=(l|0)){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[1054]|0;if((a[o+(l*40&-1)|0]&1)==0){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[o+(l*40&-1)+36>>2]|0;q=o+(l*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+115e3|0]|0)){s=s+1|0}else{t=5660;break}}if((t|0)==5660){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((s|0)!=1){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=l+1|0;c[13898]=n;if((n|0)>=(m|0)){i=e;return}l=f|0;s=f+8|0;q=j|0;p=k|0;u=(b|0)==4?1:2;w=j+16|0;x=j;y=j+8|0;j=g|0;z=g+8|0;A=0;B=n;n=o;o=m;m=r;L7441:while(1){r=(a[n+(B*40&-1)|0]&1)==0;L7443:do{if(!r){C=c[n+(B*40&-1)+36>>2]|0;D=n+(B*40&-1)+32|0;E=0;while(1){if((E|0)>=(C|0)){break}if((a[m+((c[D>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L7443}}if((E|0)==1){t=5677;break L7441}}}while(0);if((b|0)==4|(b|0)==5|(b|0)==7){if((o|0)<=(B|0)|r){F=B;t=5651;break}D=c[n+(B*40&-1)+36>>2]|0;C=n+(B*40&-1)+32|0;G=0;while(1){if((G|0)>=(D|0)){break}if((a[m+((c[C>>2]|0)+G|0)|0]|0)==(a[G+199040|0]|0)){G=G+1|0}else{F=B;t=5652;break L7441}}if((G|0)!=1){F=B;t=5654;break}C=B+1|0;c[13898]=C;if((C|0)<(o|0)){H=q;I=1;J=0;K=C;L=o;M=n}else{F=C;t=5653;break}L7467:while(1){C=I;N=K;while(1){D=(a[M+(N*40&-1)|0]&1)==0;L7471:do{if(!D){r=c[M+(N*40&-1)+36>>2]|0;O=M+(N*40&-1)+32|0;P=c[10036]|0;Q=0;while(1){if((Q|0)>=(r|0)){break}if((a[P+((c[O>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L7471}}if((Q|0)==1){F=N;t=5656;break L7441}}}while(0);if(C){break}if(D|(L|0)<=(N|0)){t=5648;break L7441}R=c[M+(N*40&-1)+36>>2]|0;S=M+(N*40&-1)+32|0;T=c[10036]|0;O=0;while(1){if((O|0)>=(R|0)){break}if((a[T+((c[S>>2]|0)+O|0)|0]|0)==(a[O+148464|0]|0)){O=O+1|0}else{U=0;break L7467}}if((O|0)!=1){U=0;break L7467}D=N+1|0;c[13898]=D;if((D|0)<(L|0)){C=1;N=D}else{F=D;t=5655;break L7441}}V=J+1|0;if((V|0)>=4){t=5507;break L7441}C=is(g)|0;E=c[C>>2]|0;if((E|0)==1){W=+(c[C+8>>2]|0)}else if((E|0)==3){W=+uz(c[C+8>>2]|0,0)}else if((E|0)==2){W=+h[C+8>>3]}else{t=5502;break L7441}if((c[j>>2]|0)==3){uu(c[z>>2]|0);c[j>>2]=1}h[H>>3]=W;C=c[13898]|0;E=c[8272]|0;if((C|0)>=(E|0)){F=C;t=5657;break L7441}H=H+8|0;I=0;J=V;K=C;L=E;M=c[1054]|0}while(1){if((U|0)>=(R|0)){break}if((a[T+((c[S>>2]|0)+U|0)|0]|0)==(a[U+131272|0]|0)){U=U+1|0}else{t=5649;break L7441}}if((U|0)!=1){t=5647;break}G=N+1|0;c[13898]=G;if((J|0)==0){F=G;t=5650;break}else{X=J}}else if((b|0)==3|(b|0)==2){X=1}else{G=is(f)|0;E=c[G>>2]|0;if((E|0)==2){Y=+h[G+8>>3]}else if((E|0)==3){Y=+uz(c[G+8>>2]|0,0)}else if((E|0)==1){Y=+(c[G+8>>2]|0)}else{t=5522;break}if((c[l>>2]|0)==3){uu(c[s>>2]|0);c[l>>2]=1}h[q>>3]=Y;X=1}if((A|0)>=(c[11864]|0)){t=5528;break}do{if((b|0)==7){if((X|0)!=3){t=5615;break L7441}Z=+h[q>>3];_=+h[y>>3];$=+h[w>>3];if(Z*Z+_*_+$*$<2.220446049250313e-14){t=5617;break L7441}G=(c[12172]|0)+(A*232&-1)+88|0;c[G>>2]=c[x>>2];c[G+4>>2]=c[x+4>>2];c[G+8>>2]=c[x+8>>2];c[G+12>>2]=c[x+12>>2];c[G+16>>2]=c[x+16>>2];c[G+20>>2]=c[x+20>>2]}else if((b|0)==2){aa=c[13898]|0;G=c[1054]|0;E=c[G+(aa*40&-1)+36>>2]|0;C=(E|0)>3?3:E;E=c[10036]|0;D=c[G+(aa*40&-1)+32>>2]|0;G=0;while(1){P=G+1|0;a[k+G|0]=a[E+D|0]|0;if((P|0)==(C|0)){break}else{D=D+1|0;G=P}}a[k+C|0]=0;G=uA(p|0)|0;if((G|0)!=(b4(p|0,154840)|0)){t=5542;break L7441}if((cy(p|0,154104)|0)!=0){G=c[12172]|0;if((c[G+(A*232&-1)>>2]|0)==0){t=5546;break L7441}c[G+(A*232&-1)+12>>2]=d}if((cy(p|0,153744)|0)!=0){G=c[12172]|0;if((c[G+(A*232&-1)+4>>2]|0)==0){t=5550;break L7441}c[G+(A*232&-1)+16>>2]=d}if((cy(p|0,153360)|0)!=0){G=c[12172]|0;if((c[G+(A*232&-1)+8>>2]|0)==0){t=5554;break L7441}c[G+(A*232&-1)+20>>2]=d}c[13898]=(c[13898]|0)+1}else if((b|0)==1){G=c[12172]|0;if((c[G+(A*232&-1)>>2]|0)==0){t=5538;break L7441}$=+h[q>>3];if($==0.0){c[G+(A*232&-1)+12+(d<<2)>>2]=0;break}if($!=1.0){t=5537;break L7441}c[G+(A*232&-1)+12+(d<<2)>>2]=1}else if((b|0)==0){$=+h[q>>3];h[(c[12172]|0)+(A*232&-1)+24+(d<<3)>>3]=$;if($<=0.0){t=5531;break L7441}}else if((b|0)==3){G=c[12172]|0;if((c[G+(A*232&-1)>>2]|0)==0){if((c[G+(A*232&-1)+140>>2]|0)==0){t=5659;break L7441}}if((c[G+(A*232&-1)+4>>2]|0)==0){if((c[G+(A*232&-1)+144>>2]|0)==0){t=5658;break L7441}}do{if((c[G+(A*232&-1)+8>>2]|0)==0){if((c[G+(A*232&-1)+148>>2]|0)!=0){t=5564;break}D=c[13898]|0;E=(c[8272]|0)>(D|0);P=c[1054]|0;r=P+(D*40&-1)|0;ab=P+(D*40&-1)+36|0;ac=P+(D*40&-1)+32|0;D=c[10036]|0;P=c[12094]|0;if(!E){t=5668;break L7441}do{if((a[r]&1)==0){t=5629}else{ad=c[ab>>2]|0;ae=0;while(1){if((ae|0)>=(ad|0)){t=5580;break}if((a[D+((c[ac>>2]|0)+ae|0)|0]|0)==(a[P+ae|0]|0)){ae=ae+1|0}else{break}}if((t|0)==5580){t=0;if((a[P+ae|0]|0)==0){af=0;break}}if(E){t=5629}else{t=5666;break L7441}}}while(0);L7551:do{if((t|0)==5629){t=0;P=c[12098]|0;L7553:do{if((a[r]&1)!=0){O=c[ab>>2]|0;ad=0;while(1){if((ad|0)>=(O|0)){break}if((a[D+((c[ac>>2]|0)+ad|0)|0]|0)==(a[P+ad|0]|0)){ad=ad+1|0}else{break L7553}}if((a[P+ad|0]|0)==0){af=1;break L7551}}}while(0);P=c[12102]|0;if(!E){t=5669;break L7441}if((a[r]&1)!=0){ae=c[ab>>2]|0;O=0;while(1){if((O|0)>=(ae|0)){t=5639;break}if((a[D+((c[ac>>2]|0)+O|0)|0]|0)==(a[P+O|0]|0)){O=O+1|0}else{break}}if((t|0)==5639){t=0;if((a[P+O|0]|0)==0){af=2;break}}if(!E){t=5667;break L7441}}ae=c[12106]|0;if((a[r]&1)==0){t=5670;break L7441}Q=c[ab>>2]|0;ag=0;while(1){if((ag|0)>=(Q|0)){break}if((a[D+((c[ac>>2]|0)+ag|0)|0]|0)==(a[ae+ag|0]|0)){ag=ag+1|0}else{t=5665;break L7441}}if((a[ae+ag|0]|0)==0){af=3}else{t=5664;break L7441}}}while(0);ac=G+(A*232&-1)+112|0;D=48380+(af<<4)|0;c[ac>>2]=c[D>>2];c[ac+4>>2]=c[D+4>>2];c[ac+8>>2]=c[D+8>>2]}else{t=5564}}while(0);if((t|0)==5564){t=0;C=c[13898]|0;D=(c[8272]|0)>(C|0);ac=c[1054]|0;ab=ac+(C*40&-1)|0;r=ac+(C*40&-1)+36|0;E=ac+(C*40&-1)+32|0;C=c[10036]|0;ac=0;L7579:while(1){Q=c[48184+(ac<<4)>>2]|0;L7581:do{if(D){if((a[ab]&1)==0){break}O=c[r>>2]|0;P=0;while(1){if((P|0)>=(O|0)){break}if((a[C+((c[E>>2]|0)+P|0)|0]|0)==(a[Q+P|0]|0)){P=P+1|0}else{break L7581}}if((a[Q+P|0]|0)==0){t=5571;break L7579}}}while(0);Q=ac+1|0;if(Q>>>0<12){ac=Q}else{ah=Q;break}}if((t|0)==5571){t=0;E=G+(A*232&-1)+112|0;C=48188+(ac<<4)|0;c[E>>2]=c[C>>2];c[E+4>>2]=c[C+4>>2];c[E+8>>2]=c[C+8>>2];ah=ac}if((ah|0)==12){t=5574;break L7441}}C=G+(A*232&-1)+152|0;c[C>>2]=c[12148];c[C+4>>2]=c[48596>>2];c[C+8>>2]=c[48600>>2];c[13898]=(c[13898]|0)+1}else if((b|0)==4|(b|0)==5){c[(c[12172]|0)+(A*232&-1)+48>>2]=u;if((d|0)==2){if((X|0)!=3){t=5592;break L7441}}else if((d|0)==0){if((X|0)!=3){t=5594;break L7441}}else if((d|0)==1){if((X|0)!=2){t=5589;break L7441}h[w>>3]=0.0}else{t=5595;break L7441}C=(c[12172]|0)+(A*232&-1)+56|0;c[C>>2]=c[x>>2];c[C+4>>2]=c[x+4>>2];c[C+8>>2]=c[x+8>>2];c[C+12>>2]=c[x+12>>2];c[C+16>>2]=c[x+16>>2];c[C+20>>2]=c[x+20>>2]}else if((b|0)==8){$=+h[q>>3];c[(c[12172]|0)+(A*232&-1)+128>>2]=~~$;C=c[(c[12172]|0)+(A*232&-1)+128>>2]|0;if(+(C|0)!=$|(C|0)<0){t=5586;break L7441}}else if((b|0)==6){C=c[13898]|0;E=c[1054]|0;r=a[E+(C*40&-1)|0]|0;L7602:do{if((c[8272]|0)>(C|0)){if((r&1)==0){t=5604;break}ab=c[E+(C*40&-1)+36>>2]|0;D=E+(C*40&-1)+32|0;Q=c[10036]|0;O=0;while(1){if((O|0)>=(ab|0)){break}if((a[Q+((c[D>>2]|0)+O|0)|0]|0)==(a[O+99680|0]|0)){O=O+1|0}else{t=5604;break L7602}}if((O|0)!=2){t=5604;break}h[q>>3]=+h[q>>3]*3.141592653589793;c[13898]=C+1}else{t=5604}}while(0);L7610:do{if((t|0)==5604){t=0;G=c[E+(C*40&-1)+36>>2]|0;if(!((r&1)!=0&(G|0)>0)){break}ac=c[10036]|0;D=0;Q=0;ab=c[E+(C*40&-1)+32>>2]|0;while(1){if((a[D+123032|0]|0)==(a[ac+(D+ab|0)|0]|0)){ai=ab;aj=Q}else{if((D|0)!=1){break L7610}ai=ab-1|0;aj=1}ag=D+1|0;if((ag|0)<(aj+G|0)){D=ag;Q=aj;ab=ai}else{break}}if((aj|0)==0){if(!((D|0)==0|(D|0)==7)){break}}h[q>>3]=+h[q>>3]*.017453292519943295;c[13898]=C+1}}while(0);h[(c[12172]|0)+(A*232&-1)+80>>3]=+h[q>>3]}else{t=5619;break L7441}}while(0);C=c[13898]|0;E=c[8272]|0;if((E|0)<=(C|0)){t=5674;break}r=c[1054]|0;if((a[r+(C*40&-1)|0]&1)==0){t=5675;break}ab=c[r+(C*40&-1)+36>>2]|0;Q=r+(C*40&-1)+32|0;G=c[10036]|0;ac=0;while(1){if((ac|0)>=(ab|0)){break}if((a[G+((c[Q>>2]|0)+ac|0)|0]|0)==(a[ac+183584|0]|0)){ac=ac+1|0}else{t=5676;break L7441}}if((ac|0)!=1){t=5671;break}Q=C+1|0;c[13898]=Q;if((Q|0)<(E|0)){A=A+1|0;B=Q;n=r;o=E;m=G}else{t=5672;break}}if((t|0)==5649){uf(N,148888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5650){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5651){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5652){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5542){uf(aa,154448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5546){uf(aa,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5528){uf(c[13898]|0,158272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5574){uf(c[13898]|0,152504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5592){uf(c[13898]|0,151520,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5615){uf(c[13898]|0,150440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5531){uf((c[13898]|0)-2|0,156288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5554){uf(c[13898]|0,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5550){uf(c[13898]|0,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5647){uf(N,148888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5648){uf(N,148888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5594){uf(c[13898]|0,151168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5595){uf(c[13898]|0,150960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5666){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5667){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5668){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5669){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5537){uf((c[13898]|0)-1|0,155200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5538){uf(c[13898]|0,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5589){uf(c[13898]|0,151648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5653){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5654){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5655){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5656){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5657){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5617){uf(c[13898]|0,150304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5619){uf(-1,150112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5670){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5671){i=e;return}else if((t|0)==5672){i=e;return}else if((t|0)==5674){i=e;return}else if((t|0)==5675){i=e;return}else if((t|0)==5676){i=e;return}else if((t|0)==5586){uf(c[13898]|0,151928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5502){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5522){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5507){uf(N-1|0,149640,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}else if((t|0)==5664){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5665){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5658){al=c[13898]|0;uf(al,152856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5659){al=c[13898]|0;uf(al,152856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5677){i=e;return}}function eU(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+8|0;g=f|0;c[g>>2]=d;h=8;j=0;k=d;L7680:while(1){d=k;while(1){l=a[d]|0;if((l<<24>>24|0)==0|(l<<24>>24|0)==34|(l<<24>>24|0)==39){m=5681;break L7680}else if((l<<24>>24|0)==37){break}else if((l<<24>>24|0)!=32){m=5715;break L7680}l=d+1|0;c[g>>2]=l;d=l}l=d+1|0;c[g>>2]=l;n=a[l]|0;o=n<<24>>24==42;if(o){p=d+2|0;c[g>>2]=p;q=p;r=a[p]|0}else{q=l;r=n}if(((r<<24>>24)-48|0)>>>0<10){n=aE(q|0,g|0,10)|0;s=n;t=c[g>>2]|0}else{s=1;t=q}n=b[23918]|0;L7692:do{if(n<<16>>16==0){u=0;m=5710}else{l=c[11958]|0;p=0;while(1){w=b[l+(p<<4)+4>>1]|0;if(w<<16>>16==0){x=0}else{y=c[l+(p<<4)>>2]|0;z=0;while(1){A=c[y+(z<<2)>>2]|0;B=uA(A|0)|0;if((a_(t|0,A|0,B|0)|0)==0){A=t+B|0;if((aZ(163032,a[A]|0|0,5)|0)!=0){C=A;D=p;E=47832;F=l;break L7692}}A=z+1|0;if((A|0)<(w&65535|0)){z=A}else{x=A;break}}}z=p+1|0;if((z|0)<(n&65535|0)){p=z}else{u=x;m=5710;break}}}}while(0);L7704:do{if((m|0)==5710){m=0;n=b[23922]|0;if(n<<16>>16==0){G=0;H=u}else{d=c[11960]|0;p=0;while(1){l=b[d+(p<<4)+4>>1]|0;if(l<<16>>16==0){I=0}else{z=c[d+(p<<4)>>2]|0;w=0;while(1){y=c[z+(w<<2)>>2]|0;A=uA(y|0)|0;if((a_(t|0,y|0,A|0)|0)==0){y=t+A|0;if((aZ(163032,a[y]|0|0,5)|0)!=0){C=y;D=p;E=47840;F=d;break L7704}}y=w+1|0;if((y|0)<(l&65535|0)){w=y}else{I=y;break}}}w=p+1|0;if((w|0)<(n&65535|0)){p=w}else{G=w;H=I;break}}}if((G|0)!=(e[23922]|0|0)){h=h;j=j;k=t;continue L7680}if((H|0)==(e[(c[11960]|0)+(G-1<<4)+4>>1]|0|0)){m=5714;break L7680}else{h=h;j=j;k=t;continue L7680}}}while(0);c[g>>2]=C;if(o){p=c[11950]|0;if((p|0)==0){m=5706;break}n=aa(e[F+(D<<4)+12>>1]|0,s);d=p+(j*12&-1)|0;c[d>>2]=n+(c[d>>2]|0);h=h;j=j;k=C;continue}if((s|0)>0){J=j;K=0}else{h=h;j=j;k=C;continue}while(1){L=J+1|0;d=J+2|0;if((d|0)<=0){m=5697;break L7680}n=c[11950]|0;if((c[11884]|0)<(d|0)){p=db(n,d*12&-1,215112)|0;c[11950]=p;c[11884]=d;M=p}else{M=n}c[M+(L*12&-1)>>2]=0;n=c[(c[E>>2]|0)+(D<<4)+8>>2]|0;if((L|0)<=0){m=5701;break L7680}p=c[11950]|0;if((c[11884]|0)<(L|0)){d=db(p,L*12&-1,215112)|0;c[11950]=d;c[11884]=L;N=d}else{N=p}c[N+(J*12&-1)+4>>2]=n;b[(c[11950]|0)+(J*12&-1)+8>>1]=b[48036+(n<<4)>>1]|0;n=K+1|0;if((n|0)<(s|0)){J=L;K=n}else{break}}h=c[(c[E>>2]|0)+(D<<4)+8>>2]|0;j=L;k=C}if((m|0)==5706){uf(-1,162376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==5714){uf(c[13898]|0,160672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==5715){uf(c[13898]|0,159280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==5701){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5697){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5681){if((j|0)>=(c[11876]|0)){O=j;c[11876]=O;i=f;return}C=48036+(h<<4)|0;k=j;while(1){j=k+1|0;if((j|0)<=0){m=5717;break}L=c[11950]|0;if((c[11884]|0)<(j|0)){D=db(L,j*12&-1,215112)|0;c[11950]=D;c[11884]=j;P=D}else{P=L}c[P+(k*12&-1)>>2]=0;if((k|0)<=0){m=5721;break}L=c[11950]|0;if((c[11884]|0)<(k|0)){D=db(L,k*12&-1,215112)|0;c[11950]=D;c[11884]=k;Q=D}else{Q=L}L=k-1|0;c[Q+(L*12&-1)>>2]=0;D=c[11950]|0;if((c[11884]|0)<(k|0)){E=db(D,k*12&-1,215112)|0;c[11950]=E;c[11884]=k;R=E}else{R=D}c[R+(L*12&-1)+4>>2]=h;b[(c[11950]|0)+(L*12&-1)+8>>1]=b[C>>1]|0;if((j|0)<(c[11876]|0)){k=j}else{O=j;m=5735;break}}if((m|0)==5717){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5721){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5735){c[11876]=O;i=f;return}}}function eV(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0;b=i;do{if(a[34104]|0){if((a[37400]&1)==0){break}d=c[m>>2]|0;aI(144664,24,1,d|0)}}while(0);d=c[11854]|0;if((d|0)==1){e=5741}else if((d|0)==0){if((a6(c[8802]|0,c[8716]|0,c[12892]|0)|0)==0){f=0;i=b;return f|0}if(a[34104]|0){c[9354]=(c[9354]|0)+1;g=0}else{g=0}while(1){j=c[8802]|0;k=(uA(j+g|0)|0)+g|0;if((k|0)>0){l=j+(k-1|0)|0;if((a[l]|0)==10){e=5792;break}}n=c[8716]|0;if((n-k|0)>>>0<32){o=n<<1;c[8716]=o;p=db(j,o,84816)|0;c[8802]=p;q=p;r=c[8716]|0}else{q=j;r=n}if((a6(q+k|0,r-k|0,c[12892]|0)|0)==0){e=5796;break}else{g=k}}if((e|0)==5792){a[l]=0;f=c[8802]|0;i=b;return f|0}else if((e|0)==5796){f=c[8802]|0;i=b;return f|0}}else{s=d}if((e|0)==5741){e=c[11852]|0;d=c[6352]|0;if((e|0)>=(d|0)){f=0;i=b;return f|0}if((e|0)==0){if((a[32936]&1)!=0){uf(-1,144512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((a[30528]&1)!=0){uf(-1,144512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if(+h[8256]==-8.988465674311579e+307){h[8256]=10.0}if(+h[8255]==8.988465674311579e+307){h[8255]=-10.0}l=c[200]|0;t=+h[64664+(l*688&-1)>>3];h[5960]=t;u=+h[64672+(l*688&-1)>>3];h[5961]=u;g=a[64788+(l*688&-1)|0]|0;do{if((g&1)==0){w=u;x=t}else{if(t>0.0&u>0.0){y=+_(+t);z=+h[64800+(l*688&-1)>>3];A=y/z;h[5960]=A;y=+_(+u)/z;h[5961]=y;w=y;x=A;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832+(l*24&-1),v)|0);return 0}}}while(0);u=(w-x)/+(d-1|0);h[5959]=u;B=x;C=u;D=l;E=g}else{g=c[200]|0;B=+h[5960];C=+h[5959];D=g;E=a[64788+(g*688&-1)|0]|0}u=B+ +(e|0)*C;if((E&1)==0){F=u}else{F=+Z(+(u*+h[64800+(D*688&-1)>>3]))}D=c[8802]|0;be(D|0,170912,(v=i,i=i+8|0,h[v>>3]=F,v)|0);c[11852]=(c[11852]|0)+1;s=c[11854]|0}if((s|0)==2){s=c[11852]|0;if((s|0)>=(c[11926]|0)&(s|0)>0){c[11852]=0;D=(c[11850]|0)+1|0;c[11850]=D;f=(D|0)<(c[11924]|0)?179864:0;i=b;return f|0}D=c[11850]|0;if((D|0)==0){if((c[6352]|0)<2|(c[6350]|0)<2|(c[9344]|0)<2|(c[9342]|0)<2){uf(-1,138240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}dc(2,145296);dc(1,143440);F=+h[8255];E=a[66164]|0;do{if((E&1)==0){h[5957]=F;G=+h[8256];H=F}else{if(F<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56880,h[v+16>>3]=F,v)|0);return 0}u=+_(+F);C=+h[8272];B=u/C;h[5957]=B;u=+h[8256];if(u>0.0){G=+_(+u)/C;H=B;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56880,h[v+16>>3]=u,v)|0);return 0}}}while(0);h[5958]=G;F=+h[8169];do{if((a[65476]&1)==0){h[5953]=F;I=+h[8170];J=F}else{if(F<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56856,h[v+16>>3]=F,v)|0);return 0}u=+_(+F);B=+h[8186];C=u/B;h[5953]=C;u=+h[8170];if(u>0.0){I=+_(+u)/B;J=C;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56856,h[v+16>>3]=u,v)|0);return 0}}}while(0);h[5954]=I;e=(a[38984]&1)==0?c[6352]|0:c[9344]|0;F=(G-H)/+(e-1|0);h[5956]=F;c[11926]=e;e=c[9342]|0;G=(I-J)/+(e-1|0);h[5955]=G;c[11924]=e;K=c[11852]|0;L=c[11850]|0;M=H;N=F;O=I;P=G;Q=E}else{K=s;L=D;M=+h[5957];N=+h[5956];O=+h[5954];P=+h[5955];Q=a[66164]|0}G=M+N*+(K|0);N=O-P*+(L|0);L=c[8802]|0;if((Q&1)==0){R=G}else{R=+Z(+(G*+h[8272]))}if((a[65476]&1)==0){S=N}else{S=+Z(+(N*+h[8186]))}be(L|0,143424,(v=i,i=i+16|0,h[v>>3]=R,h[v+8>>3]=S,v)|0);c[11852]=(c[11852]|0)+1}f=c[8802]|0;i=b;return f|0}function eW(a){a=a|0;c[9340]=c[a>>2];return}function eX(b){b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;i=i+16|0;f=e|0;g=e+8|0;uE(47056,0,28);c[11874]=0;if((a[b]|0)==0){j=0;i=e;return j|0}else{k=b;l=0}while(1){b=c[11882]|0;do{if((b|0)<=(l|0)){m=(b|0)<20?b+20|0:b<<1;n=db(c[11952]|0,m*24&-1,180032)|0;c[11952]=n;o=c[11882]|0;if((o|0)>=(m|0)){break}h[n+(o*24&-1)>>3]=0.0;c[n+(o*24&-1)+16>>2]=0;o=(c[11882]|0)+1|0;c[11882]=o;if((o|0)<(m|0)){p=o}else{break}do{o=c[11952]|0;h[o+(p*24&-1)>>3]=0.0;c[o+(p*24&-1)+16>>2]=0;p=(c[11882]|0)+1|0;c[11882]=p;}while((p|0)<(m|0))}}while(0);c[(c[11952]|0)+((c[11874]|0)*24&-1)+12>>2]=k;b=c[11874]|0;do{if((b|0)==((c[262]|0)-1|0)){c[11764]=k;if((c[263]|0)!=1){q=b;break}c[(c[11952]|0)+(b*24&-1)+8>>2]=1;q=c[11874]|0}else{q=b}}while(0);do{if((q|0)==((c[265]|0)-1|0)){c[11765]=k;if((c[266]|0)!=1){r=q;break}c[(c[11952]|0)+(q*24&-1)+8>>2]=1;r=c[11874]|0}else{r=q}}while(0);do{if((r|0)==((c[268]|0)-1|0)){c[11766]=k;if((c[269]|0)!=1){s=r;break}c[(c[11952]|0)+(r*24&-1)+8>>2]=1;s=c[11874]|0}else{s=r}}while(0);do{if((s|0)==((c[271]|0)-1|0)){c[11767]=k;if((c[272]|0)!=1){t=s;break}c[(c[11952]|0)+(s*24&-1)+8>>2]=1;t=c[11874]|0}else{t=s}}while(0);do{if((t|0)==((c[274]|0)-1|0)){c[11768]=k;if((c[275]|0)!=1){u=t;break}c[(c[11952]|0)+(t*24&-1)+8>>2]=1;u=c[11874]|0}else{u=t}}while(0);do{if((u|0)==((c[277]|0)-1|0)){c[11769]=k;if((c[278]|0)!=1){v=u;break}c[(c[11952]|0)+(u*24&-1)+8>>2]=1;v=c[11874]|0}else{v=u}}while(0);do{if((v|0)==((c[280]|0)-1|0)){c[11770]=k;if((c[281]|0)!=1){break}c[(c[11952]|0)+(v*24&-1)+8>>2]=1}}while(0);b=a[k]|0;if(b<<24>>24!=34|(a[47120]|0)==0){w=k;x=0;y=b}else{b=k+1|0;c[(c[11952]|0)+((c[11874]|0)*24&-1)+12>>2]=b;w=b;x=1;y=a[b]|0}L7903:do{if(y<<24>>24==34){c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=-5;c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=-8;c[11874]=(c[11874]|0)+1;if(x){z=w}else{A=w;B=5850}}else{b=c[8528]|0;do{if((b|0)!=0){m=uA(b|0)|0;if((a_(w|0,b|0,m|0)|0)!=0){break}o=w+m|0;if((aM(d[o]|0|0)|0)==0){if((a[o]|0)!=0){break}}c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=-5;C=+uz(133568,0);o=c[11874]|0;h[(c[11952]|0)+(o*24&-1)>>3]=C;c[11874]=o+1;if(x){A=w;B=5850;break L7903}else{z=w;break L7903}}}while(0);b=(c[11874]|0)+1|0;o=c[11870]|0;L7912:do{if((o|0)==0|a[43464]^1){B=5835}else{do{if((o|0)>0){if((c[262]|0)==(b|0)){B=5835;break L7912}if((o|0)<=1){D=w;break}if((c[265]|0)==(b|0)){B=5835;break L7912}if((o|0)<=2){D=w;break}if((c[268]|0)==(b|0)){B=5835;break L7912}if((o|0)<=3){D=w;break}if((c[271]|0)==(b|0)){B=5835;break L7912}if((o|0)<=4){D=w;break}if((c[274]|0)==(b|0)|(o|0)>5){B=5835;break L7912}else{D=w}}else{D=w}}while(0);while(1){m=(aM(d[D]|0|0)|0)!=0;E=a[D]|0;F=a[47120]|0;G=E<<24>>24!=F<<24>>24;if(!(m&G)){break}D=D+1|0}m=E<<24>>24==0?0:G&1;if(F<<24>>24==0|x^1){H=D;I=x;J=E}else{n=D;while(1){K=n+1|0;L=a[K]|0;if((L<<24>>24|0)==0|(L<<24>>24|0)==34){H=K;I=0;J=L;break}else{n=K}}}n=H;K=J;while(1){if((aM(K&255|0)|0)!=0){M=n;N=I;O=m;P=0;break L7912}L=a[n]|0;Q=n+1|0;if(L<<24>>24==0|L<<24>>24==(a[47120]|0)){M=n;N=I;O=m;P=0;break L7912}n=Q;K=a[Q]|0}}}while(0);if((B|0)==5835){B=0;C=+uz(w,f);h[(c[11952]|0)+((c[11874]|0)*24&-1)>>3]=C;o=c[f>>2]|0;M=w;N=x;O=(o|0)!=(w|0)&1;P=o-w|0}do{if((a[47712]&1)!=0&(O|0)==1){o=M+P|0;b=a[o]|0;if(!((b<<24>>24|0)==100|(b<<24>>24|0)==68|(b<<24>>24|0)==113|(b<<24>>24|0)==81)){R=1;break}a[o]=101;C=+uz(M,g);h[(c[11952]|0)+((c[11874]|0)*24&-1)>>3]=C;K=(c[g>>2]|0)!=(M|0)&1;a[o]=b;R=K}else{R=O}}while(0);c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=(R|0)==1&1;K=(cg(+(+h[(c[11952]|0)+((c[11874]|0)*24&-1)>>3]))|0)==0;b=c[11874]|0;if(K){c[(c[11952]|0)+(b*24&-1)+8>>2]=0;c[11874]=(c[11874]|0)+1;if(N){A=M;B=5850;break}else{z=M;break}}else{c[11874]=b+1;if(N){A=M;B=5850;break}else{z=M;break}}}}while(0);if((B|0)==5850){while(1){B=0;b=A+1|0;K=a[b]|0;if((K<<24>>24|0)==0|(K<<24>>24|0)==34){z=b;break}else{A=b;B=5850}}}b=a[47120]|0;L7951:do{if(b<<24>>24==0){K=z;while(1){if((aM(d[K]|0|0)|0)!=0){S=K;break}if((a[K]|0)==0){S=K;break}K=K+1|0}while(1){if((aM(d[S]|0|0)|0)==0){T=S;break L7951}S=S+1|0}}else{K=z;while(1){U=a[K]|0;if(!(U<<24>>24!=0&U<<24>>24!=b<<24>>24)){break}K=K+1|0}if(U<<24>>24==b<<24>>24){V=K}else{T=K;break}while(1){o=V+1|0;n=a[o]|0;if(n<<24>>24==0){T=o;break L7951}if((aM(n&255|0)|0)==0){T=o;break L7951}if((a[o]|0)==(a[47120]|0)){T=o;break}else{V=o}}}}while(0);b=c[11874]|0;if((a[T]|0)==0){j=b;break}else{k=T;l=b}}i=e;return j|0}function eY(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;d=i;i=i+24|0;e=d|0;f=(c[13898]|0)+2|0;c[13898]=f;g=c[1054]|0;L7970:do{if((a[g+(f*40&-1)|0]&1)!=0){j=c[10810]|0;L7972:do{if((j|0)!=0){k=(c[8272]|0)>(f|0);l=g+(f*40&-1)+36|0;m=g+(f*40&-1)+32|0;n=c[10036]|0;o=j;L7974:while(1){p=c[o+4>>2]|0;L7976:do{if(k){q=c[l>>2]|0;r=0;while(1){if((r|0)>=(q|0)){break}if((a[n+((c[m>>2]|0)+r|0)|0]|0)==(a[p+r|0]|0)){r=r+1|0}else{break L7976}}if((a[p+r|0]|0)==0){break L7974}}}while(0);p=c[o>>2]|0;if((p|0)==0){break L7972}else{o=p}}if((a[o+8|0]&1)!=0){break}if((c[o+16>>2]|0)==1){break L7970}}}while(0);it();j=c[18070]|0;m=db(j,c[j>>2]<<5|8,105624)|0;c[18070]=0;j=c[11870]|0;n=c[11872]|0;c[1056+((n+j|0)*12&-1)>>2]=m;a[43464]=0;s=1;t=c[13898]|0;u=j;w=n;x=t+1|0;c[13898]=x;y=w+u|0;z=1052+(y*12&-1)|0;c[z>>2]=b;A=1048+(y*12&-1)|0;c[A>>2]=s;B=w+1|0;c[11872]=B;i=d;return}}while(0);f=is(e)|0;g=c[f>>2]|0;if((g|0)==3){C=+uz(c[f+8>>2]|0,0)}else if((g|0)==2){C=+h[f+8>>3]}else if((g|0)==1){C=+(c[f+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e|0;if((c[f>>2]|0)==3){uu(c[e+8>>2]|0);c[f>>2]=1}f=~~C;e=c[11870]|0;g=c[11872]|0;c[1056+((g+e|0)*12&-1)>>2]=0;n=c[13898]|0;if((f|0)<1){uf(n,140472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{s=f;t=n;u=e;w=g;x=t+1|0;c[13898]=x;y=w+u|0;z=1052+(y*12&-1)|0;c[z>>2]=b;A=1048+(y*12&-1)|0;c[A>>2]=s;B=w+1|0;c[11872]=B;i=d;return}}function eZ(a){a=a|0;var b=0;a=c[6354]|0;if((c[14296+(a*24&-1)>>2]|0)==1){b=14304+(a*24&-1)|0;c[b>>2]=(c[b>>2]|0)!=0&1;i=i;return}else{uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function e_(a){a=a|0;var b=0,d=0;b=i;d=c[6354]|0;if((c[14296+(d*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14304+(d*24&-1)>>2]|0)==0){c[9340]=c[a>>2];i=b;return}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;i=b;return}function e$(a){a=a|0;var b=0,d=0;b=i;d=c[6354]|0;if((c[14296+(d*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14304+(d*24&-1)>>2]|0)!=0){c[9340]=c[a>>2];i=b;return}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;i=b;return}function e0(a){a=a|0;var b=0,d=0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;if((c[14296+(d*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14304+(d*24&-1)>>2]|0)!=0){i=b;return}c[9340]=c[a>>2];i=b;return}function e1(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if((a|0)==0){return}b=a|0;if((c[b>>2]|0)>0){d=0;do{e=a+8+(d<<5)|0;f=c[e>>2]|0;do{if((f|0)==1|(f|0)==31){g=a+8+(d<<5)+8|0;if((c[g>>2]|0)!=3){h=f;break}uu(c[a+8+(d<<5)+16>>2]|0);c[g>>2]=1;h=c[e>>2]|0}else{h=f}}while(0);if((h|0)==8){f=a+8+(d<<5)+8|0;e1(c[(c[f>>2]|0)+8>>2]|0);uu(c[f>>2]|0)}d=d+1|0;}while((d|0)<(c[b>>2]|0))}uu(a);return}function e2(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[10810]|0;if((e|0)==0){return}else{f=e}L8058:while(1){e=c[f+4>>2]|0;do{if(d){if((a_(b|0,e|0,uA(b|0)|0)|0)!=0){break}a[f+8|0]=1;g=f+16|0;if((c[g>>2]|0)!=3){break}uu(c[f+24>>2]|0);c[g>>2]=1}else{if((aY(b|0,e|0)|0)==0){break L8058}}}while(0);e=c[f>>2]|0;if((e|0)==0){h=5965;break}else{f=e}}if((h|0)==5965){return}a[f+8|0]=1;h=f+16|0;if((c[h>>2]|0)!=3){return}uu(c[f+24>>2]|0);c[h>>2]=1;return}function e3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=e6(b)|0;if((e|0)==0){return}b=e+8|0;do{if((a[b]&1)==0){if((aY(c[e+24>>2]|0,d|0)|0)==0){return}f=e+16|0;if((c[f>>2]|0)!=3){break}uu(c[e+24>>2]|0);c[f>>2]=1}else{a[b]=0}}while(0);if((d|0)==0){g=0}else{g=bP(d|0)|0}c[e+16>>2]=3;c[e+24>>2]=g;return}function e4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,t=0.0;e=i;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:a[1960]=0;k=al(4)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;c[k>>2]=0;c[6354]=-1;if((a[43504]&1)==0){f=3;break}else{f=2;break};case 2:if((a[47472]&1)==0){f=3;break}else{f=5;break};case 3:l=uL(42120,f,j)|0;f=27;break;case 27:if((l|0)==0){f=4;break}else{f=26;break};case 4:av(2,8,136);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;f=5;break;case 5:n=c[9340]|0;o=0;f=6;break;case 6:if((o|0)<(c[b>>2]|0)){f=7;break}else{f=9;break};case 7:k=c[b+8+(o<<5)>>2]|0;c[9340]=1;am(c[41164+(k<<3)>>2]|0,b+8+(o<<5)+8|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;p=c[9340]|0;if((k-37|0)>>>0<4|(p|0)==1){o=p+o|0;f=6;break}else{f=8;break};case 8:ar(6,-1|0,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;case 9:c[9340]=n;if((a[43504]&1)==0){f=11;break}else{f=10;break};case 10:if((a[47472]&1)==0){f=11;break}else{f=12;break};case 11:av(2,8,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;f=12;break;case 12:p=al(4)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;if((c[p>>2]|0)==33){f=14;break}else{f=13;break};case 13:p=al(4)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;if((c[p>>2]|0)==34){f=14;break}else{f=15;break};case 14:a[1960]=1;f=26;break;case 15:if((a[1960]&1)==0){f=16;break}else{f=26;break};case 16:q=c[6354]|0;if((q|0)<0){f=17;break}else{f=18;break};case 17:ar(6,-1|0,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;case 18:c[6354]=q-1;p=d;k=14296+(q*24&-1)|0;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];c[p+8>>2]=c[k+8>>2];c[p+12>>2]=c[k+12>>2];c[p+16>>2]=c[k+16>>2];c[p+20>>2]=c[k+20>>2];if((q|0)==0){f=20;break}else{f=19;break};case 19:au(4,209896,98,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;f=20;break;case 20:k=c[d>>2]|0;if((k|0)==1){f=21;break}else if((k|0)==2){f=22;break}else if((k|0)==3){t=0.0;f=24;break}else{f=23;break};case 21:t=+(c[d+8>>2]|0);f=24;break;case 22:t=+h[d+8>>3];f=24;break;case 23:ar(6,-1|0,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;case 24:if(t>8.988465674311579e+307|t<-8.988465674311579e+307){f=25;break}else{f=26;break};case 25:a[1960]=1;f=26;break;case 26:i=e;return;case-1:if((g|0)==3){l=s;f=27}r=s=0;break}}function e5(b){b=b|0;aV(8,136);a[1960]=1;cv(42120|0,1)}function e6(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=43240;while(1){f=c[e>>2]|0;if((f|0)==0){break}if((aY(b|0,c[f+4>>2]|0)|0)==0){g=f;h=5992;break}else{e=f|0}}if((h|0)==5992){i=d;return g|0}h=ut(40)|0;do{if((h|0)==0){gk();f=ut(40)|0;if((f|0)!=0){j=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0);return 0}else{j=h}}while(0);c[e>>2]=j;c[j>>2]=0;if((b|0)==0){k=0}else{k=bP(b|0)|0}c[(c[e>>2]|0)+4>>2]=k;a[(c[e>>2]|0)+8|0]=1;c[(c[e>>2]|0)+16>>2]=0;g=c[e>>2]|0;i=d;return g|0}function e7(b){b=b|0;var d=0,e=0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;if((b|0)==3|(b|0)==2|(b|0)==0){e=6024}else if((b|0)==1){e8(2);e8(1);e8(6);e8(5);e8(0);e8(3);e8(8);e8(9);e8(10);f=+h[8685];j=e6(205392)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+h[8701];j=e6(204792)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}j=c[16536]|0;f=+h[(c[3524]|0)+176>>3];k=e6(187496)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[16537]|0;f=+h[(c[3524]|0)+176>>3];k=e6(186968)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[16364]|0;f=+h[(c[3524]|0)+176>>3];k=e6(186448)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[16365]|0;f=+h[(c[3524]|0)+176>>3];k=e6(185848)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[13881]|0;k=e6(185384)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=j+1}j=c[13883]|0;k=e6(184936)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=j+1}j=a[37384]|0;k=e6(204536)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=(j&1^1)&255}j=a[37384]|0;k=e6(204264)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=j&1}j=c[5094]|0;k=e6(204008)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=(j|0)!=0&1}f=+g[3538];j=e6(196288)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+g[3536];j=e6(195744)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+g[3534];j=e6(148264)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+g[3532];j=e6(148040)|0;if((j|0)==0){i=d;return}a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0;i=d;return}do{if((e|0)==6024){j=c[3524]|0;L8156:do{if((j|0)==0){k=e6(202664)|0;if((k|0)==0){break}l=k+8|0;do{if((a[l]&1)==0){if((aY(c[k+24>>2]|0,225016)|0)==0){break L8156}m=k+16|0;if((c[m>>2]|0)!=3){n=m;break}uu(c[k+24>>2]|0);c[m>>2]=1;n=m}else{a[l]=0;n=k+16|0}}while(0);l=bP(225016)|0;c[n>>2]=3;c[k+24>>2]=l}else{e3(202664,c[j>>2]|0)}}while(0);j=e6(201560)|0;L8167:do{if((j|0)!=0){l=j+8|0;do{if((a[l]&1)==0){if((aY(c[j+24>>2]|0,13048)|0)==0){break L8167}m=j+16|0;if((c[m>>2]|0)!=3){o=m;break}uu(c[j+24>>2]|0);c[m>>2]=1;o=m}else{a[l]=0;o=j+16|0}}while(0);l=bP(13048)|0;c[o>>2]=3;c[j+24>>2]=l}}while(0);j=c[8244]|0;e3(200696,(j|0)!=0?j:179864);e3(199888,c[44936+(c[11252]<<2)>>2]|0);if((b|0)==3){p=43240}else if((b|0)==2){j=e6(199272)|0;if((j|0)==0){i=d;return}else{a[j+8|0]=0;c[j+16>>2]=1;c[j+24>>2]=1;break}}else{break}while(1){j=c[p>>2]|0;if((j|0)==0){e=6045;break}if((aY(198952,c[j+4>>2]|0)|0)==0){q=j;e=6049;break}else{p=j|0}}if((e|0)==6045){j=ut(40)|0;do{if((j|0)==0){gk();l=ut(40)|0;if((l|0)!=0){r=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0)}else{r=j}}while(0);c[p>>2]=r;c[r>>2]=0;j=bP(198952)|0;c[(c[p>>2]|0)+4>>2]=j;a[(c[p>>2]|0)+8|0]=1;c[(c[p>>2]|0)+16>>2]=0;j=c[p>>2]|0;if((j|0)==0){s=43240}else{q=j;e=6049}}do{if((e|0)==6049){j=q+8|0;if((a[j]&1)==0){s=43240;break}a[j]=0;f=+uz(40152,0);c[q+16>>2]=2;h[q+24>>3]=f;h[q+32>>3]=0.0;s=43240}}while(0);while(1){j=c[s>>2]|0;if((j|0)==0){e=6053;break}if((aY(198528,c[j+4>>2]|0)|0)==0){t=j;e=6057;break}else{s=j|0}}if((e|0)==6053){j=ut(40)|0;do{if((j|0)==0){gk();l=ut(40)|0;if((l|0)!=0){u=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0)}else{u=j}}while(0);c[s>>2]=u;c[u>>2]=0;j=bP(198528)|0;c[(c[s>>2]|0)+4>>2]=j;a[(c[s>>2]|0)+8|0]=1;c[(c[s>>2]|0)+16>>2]=0;j=c[s>>2]|0;if((j|0)==0){w=43240}else{t=j;e=6057}}L8202:do{if((e|0)==6057){if((a[t+8|0]&1)==0){w=43240;break}j=e6(198528)|0;if((j|0)==0){w=43240;break}l=j+8|0;do{if((a[l]&1)==0){if((aY(c[j+24>>2]|0,40160)|0)==0){w=43240;break L8202}k=j+16|0;if((c[k>>2]|0)!=3){x=k;break}uu(c[j+24>>2]|0);c[k>>2]=1;x=k}else{a[l]=0;x=j+16|0}}while(0);l=bP(40160)|0;c[x>>2]=3;c[j+24>>2]=l;w=43240}}while(0);while(1){l=c[w>>2]|0;if((l|0)==0){e=6067;break}if((aY(198248,c[l+4>>2]|0)|0)==0){y=l;e=6071;break}else{w=l|0}}if((e|0)==6067){l=ut(40)|0;do{if((l|0)==0){gk();k=ut(40)|0;if((k|0)!=0){z=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0)}else{z=l}}while(0);c[w>>2]=z;c[z>>2]=0;l=bP(198248)|0;c[(c[w>>2]|0)+4>>2]=l;a[(c[w>>2]|0)+8|0]=1;c[(c[w>>2]|0)+16>>2]=0;l=c[w>>2]|0;if((l|0)!=0){y=l;e=6071}}do{if((e|0)==6071){if((a[y+8|0]&1)==0){break}e3(198248,c[13388]|0)}}while(0);l=e6(104120)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=1;c[l+24>>2]=0}l=e6(204536)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=1;c[l+24>>2]=0}l=e6(204264)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=1;c[l+24>>2]=0}l=lt()|0;e3(197288,l);uu(l);e3(199888,c[44936+(c[11252]<<2)>>2]|0);l=e6(196632)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=2;h[l+24>>3]=3.141592653589793;h[l+32>>3]=0.0}f=+uz(133568,0);l=e6(196016)|0;if((l|0)==0){break}a[l+8|0]=0;c[l+16>>2]=2;h[l+24>>3]=f;h[l+32>>3]=0.0}}while(0);L8239:do{if((b-3|0)>>>0<2){y=e6(199272)|0;if((y|0)!=0){a[y+8|0]=0;c[y+16>>2]=1;c[y+24>>2]=0}y=e6(137752)|0;if((y|0)==0){break}w=y+8|0;do{if((a[w]&1)==0){if((a[c[y+24>>2]|0]|0)==0){break L8239}z=y+16|0;if((c[z>>2]|0)!=3){A=z;break}uu(c[y+24>>2]|0);c[z>>2]=1;A=z}else{a[w]=0;A=y+16|0}}while(0);w=bP(179864)|0;c[A>>2]=3;c[y+24>>2]=w}}while(0);if((b|0)==5|(b|0)==3){e=6094}else if((b|0)!=6){i=d;return}do{if((e|0)==6094){A=ut(4096)|0;do{if((A|0)==0){gk();w=ut(4096)|0;if((w|0)!=0){B=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193744,v)|0)}else{B=A}}while(0);bl(B|0,4096);e3(192848,B);uu(B);if((b|0)==6){break}i=d;return}}while(0);b=c[12900]|0;B=e6(191128)|0;if((B|0)==0){i=d;return}a[B+8|0]=0;c[B+16>>2]=1;c[B+24>>2]=b;i=d;return}function e8(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;d=i;i=i+24|0;e=64788+(b*688&-1)|0;f=+h[64664+(b*688&-1)>>3];if((a[e]&1)==0){g=+h[64672+(b*688&-1)>>3];j=f}else{k=+h[64800+(b*688&-1)>>3];l=+Z(+(f*k));g=+Z(+(+h[64672+(b*688&-1)>>3]*k));j=l}m=(c[64656+(b*688&-1)>>2]&2|0)!=0&j>g;l=m?j:g;k=m?g:j;m=d|0;n=56832+(b*24&-1)|0;be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=184544,c[v+8>>2]=n,c[v+16>>2]=184256,v)|0);o=a[m]|0;if(o<<24>>24!=0){p=m;q=o;do{a[p]=bC(q<<24>>24|0)&255;p=p+1|0;q=a[p]|0;}while(q<<24>>24!=0)}q=e6(m)|0;if((q|0)!=0){a[q+8|0]=0;c[q+16>>2]=2;h[q+24>>3]=k;h[q+32>>3]=0.0}be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=184544,c[v+8>>2]=n,c[v+16>>2]=183776,v)|0);q=a[m]|0;if(q<<24>>24!=0){p=m;o=q;do{a[p]=bC(o<<24>>24|0)&255;p=p+1|0;o=a[p]|0;}while(o<<24>>24!=0)}o=e6(m)|0;if((o|0)!=0){a[o+8|0]=0;c[o+16>>2]=2;h[o+24>>3]=l;h[o+32>>3]=0.0}l=+h[64792+(b*688&-1)>>3];be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=184544,c[v+8>>2]=n,c[v+16>>2]=183416,v)|0);o=a[m]|0;if(o<<24>>24!=0){p=m;q=o;do{a[p]=bC(q<<24>>24|0)&255;p=p+1|0;q=a[p]|0;}while(q<<24>>24!=0)}q=e6(m)|0;if((q|0)!=0){a[q+8|0]=0;c[q+16>>2]=2;h[q+24>>3]=l;h[q+32>>3]=0.0}if(b>>>0>=7){i=d;return}l=+h[64712+(b*688&-1)>>3];if((a[e]&1)==0){r=l}else{r=+Z(+(l*+h[64800+(b*688&-1)>>3]))}be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=182880,c[v+8>>2]=n,c[v+16>>2]=184256,v)|0);q=a[m]|0;if(q<<24>>24!=0){p=m;o=q;do{a[p]=bC(o<<24>>24|0)&255;p=p+1|0;o=a[p]|0;}while(o<<24>>24!=0)}o=e6(m)|0;if((o|0)!=0){a[o+8|0]=0;c[o+16>>2]=2;h[o+24>>3]=r;h[o+32>>3]=0.0}r=+h[64720+(b*688&-1)>>3];if((a[e]&1)==0){s=r}else{s=+Z(+(r*+h[64800+(b*688&-1)>>3]))}be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=182880,c[v+8>>2]=n,c[v+16>>2]=183776,v)|0);n=a[m]|0;if(n<<24>>24!=0){b=m;e=n;do{a[b]=bC(e<<24>>24|0)&255;b=b+1|0;e=a[b]|0;}while(e<<24>>24!=0)}e=e6(m)|0;if((e|0)==0){i=d;return}a[e+8|0]=0;c[e+16>>2]=2;h[e+24>>3]=s;h[e+32>>3]=0.0;i=d;return}function e9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}e=d+1|0;c[6354]=e;d=14296+(e*24&-1)|0;c[d>>2]=3;c[14304+(e*24&-1)>>2]=a;f=d+12|0;d=b|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];if((a|0)==0){g=e}else{e=bP(a|0)|0;a=c[6354]|0;c[14304+(a*24&-1)>>2]=e;g=a}if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a=g+1|0;c[6354]=a;g=14296+(a*24&-1)|0;c[g>>2]=1;c[14304+(a*24&-1)>>2]=-1;a=g+12|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];hb(0);d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[6354]=d-1;i=b;return c[14304+(d*24&-1)>>2]|0}return 0}function fa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=3;c[14304+(f*24&-1)>>2]=a;g=e+12|0;e=d|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if((a|0)==0){h=f}else{f=bP(a|0)|0;a=c[6354]|0;c[14304+(a*24&-1)>>2]=f;h=a}if((h|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a=h+1|0;c[6354]=a;h=14296+(a*24&-1)|0;c[h>>2]=1;c[14304+(a*24&-1)>>2]=b;b=h+12|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];hb(0);e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[6354]=e-1;i=d;return c[14304+(e*24&-1)>>2]|0}return 0}function fb(){var b=0,d=0;uD(42280,101104,9);b=a8(42280,0)|0;while(1){d=b-1|0;if((a[d]|0)==10){b=d}else{break}}d=b;w=10;a[d]=w&255;w=w>>8;a[d+1|0]=w&255;aK(42280,c[m>>2]|0);d=b+1|0;w=10;a[d]=w&255;w=w>>8;a[d+1|0]=w&255;d=c[8762]|0;if((d|0)!=0){cf(d|0,146328,(v=i,i=i+8|0,c[v>>2]=42280,v)|0);d=c[8762]|0;az(d|0);c[8762]=0}d=c[10062]|0;if((d|0)!=0){e1(d);c[10062]=0}aV(2,4);aV(13,1);uf(-1,130168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function fc(d,e){d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0.0,Q=0,R=0.0,S=0,T=0,U=0;f=i;i=i+968|0;g=f|0;j=f+256|0;k=f+512|0;l=f+576|0;m=f+704|0;n=f+960|0;o=j|0;do{if((e|0)==0){p=6169}else{if((a[e]|0)==0){p=6169;break}q=m|0;uF(q|0,d|0,256);if((uA(d|0)|0)>>>0<256){r=e;break}a[m+255|0]=0;r=e}}while(0);do{if((p|0)==6169){e=m|0;uB(e|0,d|0);q=m+(uA(e|0)|0)|0;a[q]=a[214408]|0;a[q+1|0]=a[214409|0]|0;a[q+2|0]=a[214410|0]|0;a[q+3|0]=a[214411|0]|0;a[q+4|0]=a[214412|0]|0;if((b8(d|0,e|0)|0)==0){r=d;break}be(42289,213616,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=e,v)|0);fb()}}while(0);d=m|0;e=g|0;g=(uA(d|0)|0)-1|0;q=m+g|0;L8361:do{if((g|0)<0){s=q}else{m=q;while(1){t=a[m]|0;if((t<<24>>24|0)==92|(t<<24>>24|0)==47|(t<<24>>24|0)==58){s=m;break L8361}t=m-1|0;if(t>>>0<d>>>0){s=t;break}else{m=t}}}}while(0);uB(e|0,s+1|0);s=hA(d,193632)|0;if((s|0)==0){be(42289,101576,(v=i,i=i+8|0,c[v>>2]=d,v)|0);fb()}d=bF(r|0,137896)|0;if((d|0)==0){be(42289,89920,(v=i,i=i+8|0,c[v>>2]=r,v)|0);fb()}L8372:do{if((a6(o|0,256,s|0)|0)!=0){r=l|0;q=l;g=l+126|0;m=k|0;t=k+63|0;u=0;L8374:while(1){w=o;while(1){x=a[w]|0;if((x<<24>>24|0)==35|(x<<24>>24|0)==0){aK(o|0,d|0);if((a6(o|0,256,s|0)|0)==0){break L8372}else{w=o;continue}}else if((x<<24>>24|0)==32|(x<<24>>24|0)==9|(x<<24>>24|0)==10){w=w+1|0;continue}else{break}}w=a8(o|0,35)|0;if((w|0)==0){b[q>>1]=10;y=o}else{uF(r|0,w|0,127);if((uA(w|0)|0)>>>0>=127){a[g]=0}a[w]=0;y=o}while(1){w=a[y]|0;if((w<<24>>24|0)==10|(w<<24>>24|0)==0){z=0;A=u;B=o;break}else if(!((w<<24>>24|0)==32|(w<<24>>24|0)==9|(w<<24>>24|0)==61)){p=6190;break}y=y+1|0}if((p|0)==6190){p=0;w=cy(y|0,213208)|0;if((w|0)==0){C=y+(uA(y|0)|0)|0}else{C=w}w=a[C]|0;a[C]=0;z=y;A=w;B=C+1|0}w=a[z]|0;if(w<<24>>24!=0){x=z;D=w;do{if((bs(D&255|0)|0)==0){if((a[x]|0)!=95){p=6244;break L8374}}x=x+1|0;D=a[x]|0;}while(D<<24>>24!=0)}if((uA(z|0)|0)>>>0>50){p=6243;break}uF(m|0,z|0,64);if((uA(z|0)|0)>>>0>=64){a[t]=0}if(A<<24>>24==61){E=B}else{D=a8(B|0,61)|0;if((D|0)==0){p=6203;break}E=D+1|0}D=E;while(1){x=a[D]|0;if((x<<24>>24|0)==10|(x<<24>>24|0)==0){F=0;G=A;H=E;break}else if(!((x<<24>>24|0)==32|(x<<24>>24|0)==9|(x<<24>>24|0)==61)){p=6208;break}D=D+1|0}if((p|0)==6208){p=0;x=cy(D|0,213208)|0;if((x|0)==0){I=D+(uA(D|0)|0)|0}else{I=x}x=a[I]|0;a[I]=0;F=D;G=x;H=I+1|0}if((ca(F|0,148448,(v=i,i=i+8|0,c[v>>2]=n,v)|0)|0)==0){p=6212;break}else{J=H}while(1){x=a[J]|0;if((x<<24>>24|0)==10|(x<<24>>24|0)==0){K=G;break}else if(!((x<<24>>24|0)==32|(x<<24>>24|0)==9|(x<<24>>24|0)==61)){p=6215;break}J=J+1|0}if((p|0)==6215){p=0;D=cy(J|0,213208)|0;if((D|0)==0){L=J+(uA(J|0)|0)|0}else{L=D}D=a[L]|0;a[L]=0;if((J|0)==0){K=D}else{p=6218;break}}D=43240;while(1){M=c[D>>2]|0;if((M|0)==0){p=6221;break}if((aY(m|0,c[M+4>>2]|0)|0)==0){p=6223;break}else{D=M|0}}if((p|0)==6223){p=0;D=c[M+16>>2]|0;if((D|0)==1){N=+(c[M+24>>2]|0)}else if((D|0)==3){N=+uz(c[M+24>>2]|0,0)}else if((D|0)==2){N=+h[M+24>>3]}else{p=6227;break}h[n>>3]=N;if(N==0.0){O=43240;p=6229}else{P=N}}else if((p|0)==6221){p=0;h[n>>3]=0.0;O=43240;p=6229}if((p|0)==6229){while(1){p=0;Q=c[O>>2]|0;if((Q|0)==0){R=0.0;break}if((aY(m|0,c[Q+4>>2]|0)|0)==0){p=6231;break}else{O=Q|0;p=6229}}do{if((p|0)==6231){p=0;if((c[Q+16>>2]|0)!=1){R=0.0;break}R=+(c[Q+24>>2]|0)}}while(0);h[n>>3]=R;P=R}be(o|0,170912,(v=i,i=i+8|0,h[v>>3]=P,v)|0);do{if((a8(o|0,46)|0)==0){if((a8(o|0,101)|0)!=0){break}D=j+(uA(o|0)|0)|0;a[D]=a[119960]|0;a[D+1|0]=a[119961|0]|0;a[D+2|0]=a[119962|0]|0}}while(0);cf(d|0,209168,(v=i,i=i+24|0,c[v>>2]=m,c[v+8>>2]=o,c[v+16>>2]=r,v)|0);if((a6(o|0,256,s|0)|0)==0){break L8372}else{u=K}}if((p|0)==6243){S=az(d|0)|0;T=az(s|0)|0;U=be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0)|0;fb()}else if((p|0)==6203){az(d|0);az(s|0);be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0);fb()}else if((p|0)==6212){az(d|0);az(s|0);be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0);fb()}else if((p|0)==6244){S=az(d|0)|0;T=az(s|0)|0;U=be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0)|0;fb()}else if((p|0)==6227){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((p|0)==6218){az(d|0);az(s|0);be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0);fb()}}}while(0);if((az(d|0)|0)!=0){uD(42289,203968,24);fb()}if((az(s|0)|0)==0){i=f;return}else{uD(42289,203968,24);fb()}}function fd(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,R=0.0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,$=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0.0,av=0,aw=0.0,ax=0,ay=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0,aJ=0,aL=0,aM=0,aN=0,aO=0,aP=0,aR=0,aS=0,aU=0.0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a2=0,a3=0,a4=0,a5=0,a7=0,a9=0,ba=0,bb=0.0,bc=0,bd=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0.0,bE=0,bG=0.0,bH=0.0,bI=0.0,bK=0,bL=0.0,bM=0,bN=0.0,bQ=0,bR=0,bS=0.0,bT=0,bV=0.0,bW=0.0,bX=0.0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0.0;b=i;i=i+320|0;e=b|0;f=b+8|0;g=b+16|0;j=b+40|0;k=b+88|0;l=b+136|0;n=b+216|0;p=b+240|0;q=b+272|0;r=q;s=i;i=i+56|0;t=i;i=i+4|0;i=i+7>>3<<3;u=i;i=i+688|0;w=i;i=i+8|0;x=i;i=i+1025|0;i=i+7>>3<<3;uE(p|0,-1|0,28);y=(c[13898]|0)+1|0;c[13898]=y;z=c[16507]|0;c[16506]=z;if((z&3|0)==0){A=+h[8258];B=+h[8257];if(A<B){C=66056;D=A}else{E=B;F=6250}}else{E=+h[8257];F=6250}if((F|0)==6250){C=66064;D=E}h[8255]=D;h[8256]=+h[C>>3];if((a[66164]&1)==0){G=0.0}else{G=+_(+(+h[8271]))}h[8272]=G;h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;C=c[16335]|0;c[16334]=C;if((C&3|0)==0){G=+h[8172];D=+h[8171];if(G<D){H=65368;I=G}else{J=D;F=6256}}else{J=+h[8171];F=6256}if((F|0)==6256){H=65376;I=J}h[8169]=I;h[8170]=+h[H>>3];if((a[65476]&1)==0){K=0.0}else{K=+_(+(+h[8185]))}h[8186]=K;h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;H=c[17539]|0;c[17538]=H;if((H&3|0)==0){K=+h[8774];I=+h[8773];if(K<I){L=70184;M=K}else{N=I;F=6262}}else{N=+h[8773];F=6262}if((F|0)==6262){L=70192;M=N}h[8771]=M;h[8772]=+h[L>>3];if((a[70292]&1)==0){R=0.0}else{R=+_(+(+h[8787]))}h[8788]=R;h[8777]=8.988465674311579e+307;h[8778]=-8.988465674311579e+307;L=c[17711]|0;c[17710]=L;if((L&3|0)==0){R=+h[8860];M=+h[8859];if(R<M){S=70872;T=R}else{U=M;F=6268}}else{U=+h[8859];F=6268}if((F|0)==6268){S=70880;T=U}h[8857]=T;h[8858]=+h[S>>3];if((a[70980]&1)==0){V=0.0}else{V=+_(+(+h[8873]))}h[8874]=V;h[8863]=8.988465674311579e+307;h[8864]=-8.988465674311579e+307;S=c[17883]|0;c[17882]=S;if((S&3|0)==0){V=+h[8946];T=+h[8945];if(V<T){W=71560;X=V}else{Y=T;F=6274}}else{Y=+h[8945];F=6274}if((F|0)==6274){W=71568;X=Y}h[8943]=X;h[8944]=+h[W>>3];if((a[71668]&1)==0){Z=0.0}else{Z=+_(+(+h[8959]))}h[8960]=Z;h[8949]=8.988465674311579e+307;h[8950]=-8.988465674311579e+307;W=c[16163]|0;c[16162]=W;do{if((W&3|0)==0){Z=+h[8086];X=+h[8085];if(Z>=X){$=X;ab=Z;F=6281;break}h[8083]=Z;ac=X}else{$=+h[8085];ab=+h[8086];F=6281}}while(0);if((F|0)==6281){h[8083]=(W&1|0)==0?$:8.988465674311579e+307;ac=(W&2|0)==0?ab:-8.988465674311579e+307}h[8084]=ac;if((a[64788]&1)==0){ad=0.0}else{ad=+_(+(+h[8099]))}h[8100]=ad;h[8089]=8.988465674311579e+307;h[8090]=-8.988465674311579e+307;c[200]=2;c[144]=1;c[34]=0;L8524:do{if((c[8272]|0)>(y|0)){W=u;S=p+24|0;L=-1;H=0;C=y;while(1){z=c[1054]|0;if((a[z+(C*40&-1)|0]&1)==0){ae=L;af=H;ag=C;break L8524}ah=c[z+(C*40&-1)+36>>2]|0;ai=z+(C*40&-1)+32|0;z=c[10036]|0;aj=0;while(1){if((aj|0)>=(ah|0)){break}if((a[z+((c[ai>>2]|0)+aj|0)|0]|0)==(a[aj+78280|0]|0)){aj=aj+1|0}else{ae=L;af=H;ag=C;break L8524}}if((aj|0)!=1){ae=L;af=H;ag=C;break L8524}if((H|0)>5){break}ai=c[42584+(H<<2)>>2]|0;uD(W|0,64648+(ai*688&-1)|0,688);c[S>>2]=c[p+(ai<<2)>>2];c[p+(H<<2)>>2]=dr(ai,-1)|0;ai=c[13898]|0;z=H+1|0;if((c[8272]|0)>(ai|0)){L=ai;H=z;C=ai}else{ae=ai;af=z;ag=ai;break L8524}}uf(C,192712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{ae=-1;af=0;ag=y}}while(0);y=c[10062]|0;if((y|0)!=0){e1(y);c[10062]=0}c[11670]=40240;uB(42608,24544);uB(42659,24595);y=0;do{H=c[p+(y<<2)>>2]|0;if((H|0)>-1){L=c[1054]|0;S=c[L+(H*40&-1)+36>>2]|0;W=(S|0)>49?49:S;S=c[10036]|0;ai=c[L+(H*40&-1)+32>>2]|0;H=0;while(1){L=H+1|0;a[55600+(y*51&-1)+H|0]=a[S+ai|0]|0;if((L|0)==(W|0)){break}else{ai=ai+1|0;H=L}}a[55600+(y*51&-1)+W|0]=0}else{uB(55600+(y*51&-1)|0,42608+(y*51&-1)|0)}y=y+1|0;}while((y|0)<5);it();y=c[18070]|0;H=db(y,c[y>>2]<<5|8,105624)|0;c[18070]=0;c[10062]=H;c[11670]=0;H=c[13898]|0;if((H|0)>=(c[8272]|0)){ak=H;uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=c[1054]|0;L8553:do{if((a[y+(H*40&-1)|0]&1)!=0){ai=c[y+(H*40&-1)+36>>2]|0;S=y+(H*40&-1)+32|0;C=c[10036]|0;L=0;while(1){if((L|0)>=(ai|0)){break}if((a[C+((c[S>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break L8553}}if((L|0)==1){ak=H}else{break}uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(n);a[14176]=0;if((c[n>>2]|0)!=3){c[13898]=H;ak=H;uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=c[n+8>>2]|0;if((y|0)==0){ak=c[13898]|0;uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[11856]=0;c[13486]=ey(y,7,0)|0;uu(y);y=c[13486]|0;if((y|0)<0){uf(-1,120240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)==1){uf(c[13898]|0,174456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}ak=(y|0)<3?1:y-2|0;c[8304]=ak;if((c[64808+((c[200]|0)*688&-1)>>2]|0)==1&(y|0)<2){uf(c[13898]|0,84448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[64808+((c[144]|0)*688&-1)>>2]|0)==1&(y|0)<1){uf(c[13898]|0,106024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((ak|0)>0){y=(ak|0)>1?ak:1;uD(48840,42584,y<<2);al=y}else{al=0}c[48840+(al<<2)>>2]=0;c[48840+(al+1<<2)>>2]=99;al=c[p+4>>2]|0;if((al|0)>-1&(ak|0)==1){uf(al,159352,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}al=ak+1|0;if((af|0)>(al|0)){uf(ae,152936,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}if((af|0)==(al|0)&(ak|0)<5){ak=af-1|0;af=c[42584+(ak<<2)>>2]|0;al=64648+(af*688&-1)|0;ae=al|0;y=c[34]|0;c[64648+(y*688&-1)>>2]=c[ae>>2];n=c[ae>>2]|0;if((n&1|0)==0){h[64664+(y*688&-1)>>3]=+h[64664+(af*688&-1)>>3];am=c[ae>>2]|0}else{am=n}if((am&2|0)==0){h[64672+(y*688&-1)>>3]=+h[64672+(af*688&-1)>>3]}uD(al|0,u|0,688);c[p+(ak<<2)>>2]=c[p+24>>2]}p=c[13898]|0;ak=43240;while(1){an=c[ak>>2]|0;if((an|0)==0){ao=43240;break}if((aY(214968,c[an+4>>2]|0)|0)==0){F=6337;break}else{ak=an|0}}do{if((F|0)==6337){ak=c[an+16>>2]|0;if((ak|0)==2){ap=+h[an+24>>3]}else if((ak|0)==3){ap=+uz(c[an+24>>2]|0,0)}else if((ak|0)==1){ap=+(c[an+24>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(!(ap<1.0&ap>0.0)){ao=43240;break}h[5479]=ap;ao=43240}}while(0);while(1){aq=c[ao>>2]|0;if((aq|0)==0){ar=0;break}if((aY(215432,c[aq+4>>2]|0)|0)==0){F=6346;break}else{ao=aq|0}}do{if((F|0)==6346){if((c[aq+16>>2]|0)!=1){ar=0;break}ar=c[aq+24>>2]|0}}while(0);c[8708]=ar;ar=43240;while(1){as=c[ar>>2]|0;if((as|0)==0){at=43240;break}if((aY(215960,c[as+4>>2]|0)|0)==0){F=6351;break}else{ar=as|0}}do{if((F|0)==6351){ar=c[as+16>>2]|0;if((ar|0)==1){au=+(c[as+24>>2]|0)}else if((ar|0)==2){au=+h[as+24>>3]}else if((ar|0)==3){au=+uz(c[as+24>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(au<=0.0){at=43240;break}h[1782]=au;bD(150480,(v=i,i=i+8|0,h[v>>3]=au,v)|0);at=43240}}while(0);while(1){av=c[at>>2]|0;if((av|0)==0){break}if((aY(216424,c[av+4>>2]|0)|0)==0){F=6360;break}else{at=av|0}}do{if((F|0)==6360){at=c[av+16>>2]|0;if((at|0)==1){aw=+(c[av+24>>2]|0)}else if((at|0)==2){aw=+h[av+24>>3]}else if((at|0)==3){aw=+uz(c[av+24>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(aw<=0.0){break}h[4485]=aw;h[4484]=aw;bD(148576,(v=i,i=i+8|0,h[v>>3]=aw,v)|0)}}while(0);uu(c[10638]|0);c[10638]=0;av=bU(217040)|0;if((av|0)!=0){c[10638]=bP(av|0)|0}av=fg()|0;at=c[8762]|0;do{if((at|0)==0){as=bF(av|0,205056)|0;c[8762]=as;if((as|0)!=0){ax=as;break}be(42289,144360,(v=i,i=i+8|0,c[v>>2]=av,v)|0);fb()}else{ax=at}}while(0);if((av|0)==0){ay=ax}else{uu(av);ay=c[8762]|0}aI(142744,82,1,ay|0);cG(t|0);ay=c[8762]|0;av=aT(t|0)|0;cf(ay|0,141312,(v=i,i=i+8|0,c[v>>2]=av,v)|0);av=p-1|0;p=c[1054]|0;ay=(c[p+(av*40&-1)+36>>2]|0)+(c[p+(av*40&-1)+32>>2]|0)|0;av=db(0,(ay+1|0)-(c[p+(H*40&-1)+32>>2]|0)|0,116456)|0;p=c[(c[1054]|0)+(H*40&-1)+32>>2]|0;L8653:do{if((p|0)<(ay|0)){t=p;ax=av;while(1){at=a[(c[10036]|0)+t|0]|0;if(at<<24>>24==0){aA=ax;break L8653}as=ax+1|0;a[ax]=at;at=t+1|0;if((at|0)<(ay|0)){t=at;ax=as}else{aA=as;break}}}else{aA=av}}while(0);a[aA]=0;cf(c[8762]|0,139528,(v=i,i=i+8|0,c[v>>2]=av,v)|0);aI(137608,17,1,c[8762]|0);uu(av);L8658:do{if((c[8304]|0)>0){av=0;while(1){aA=c[13486]|0;ay=c[8762]|0;if((av|0)>=(aA-1|0)){aB=ay;aC=aA;break L8658}cf(ay|0,135712,(v=i,i=i+8|0,c[v>>2]=55600+(av*51&-1),v)|0);ay=av+1|0;if((ay|0)<(c[8304]|0)){av=ay}else{F=6378;break}}}else{F=6378}}while(0);if((F|0)==6378){aB=c[8762]|0;aC=c[13486]|0}cf(aB|0,((aC|0)<3?134160:132576)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aC=c[8304]|0;if((aC|0)<0){aD=aC}else{aB=l|0;l=0;av=0;ay=aC;while(1){if((c[64648+(l*688&-1)>>2]&3|0)==3){aE=ay}else{aC=c[8762]|0;if((av|0)==0){aG=77416}else{aG=55600+(av*51&-1)|0}cf(aC|0,220408,(v=i,i=i+8|0,c[v>>2]=aG,v)|0);aA=64648+(l*688&-1)|0;do{if((c[aA>>2]&1|0)==0){if((c[64808+(l*688&-1)>>2]|0)==1){aF(34,aC|0);p=64813+(l*688&-1)|0;aw=+h[64664+(l*688&-1)>>3];t3(k,aw);au=aw- +O(+aw);t4(aB,80,p,k,au);aK(aB|0,aC|0);aF(34,aC|0);break}else{au=+h[64664+(l*688&-1)>>3];cf(aC|0,92736,(v=i,i=i+8|0,h[v>>3]=au,v)|0);break}}else{aF(42,aC|0)}}while(0);aI(223968,3,1,aC|0);do{if((c[aA>>2]&2|0)==0){if((c[64808+(l*688&-1)>>2]|0)==1){aF(34,aC|0);p=64813+(l*688&-1)|0;au=+h[64672+(l*688&-1)>>3];t3(j,au);aw=au- +O(+au);t4(aB,80,p,j,aw);aK(aB|0,aC|0);aF(34,aC|0);break}else{aw=+h[64672+(l*688&-1)>>3];cf(aC|0,92736,(v=i,i=i+8|0,h[v>>3]=aw,v)|0);break}}else{aF(42,aC|0)}}while(0);aI(89968,2,1,aC|0);aE=c[8304]|0}aA=av+1|0;if((aA|0)>(aE|0)){aD=aE;break}else{l=c[42584+(av<<2)>>2]|0;av=aA;ay=aE}}}c[8718]=2048;do{if((aD<<11|0)<1){c[10636]=0;aH=2048;F=6405}else{aE=aD<<14;ay=ut(aE)|0;do{if((ay|0)==0){gk();av=ut(aE)|0;if((av|0)!=0){aJ=av;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{aJ=ay}}while(0);ay=c[8718]|0;c[10636]=aJ;if((ay|0)>=1){aH=ay;F=6405;break}c[10634]=0;aL=0}}while(0);do{if((F|0)==6405){aJ=aH<<3;aD=ut(aJ)|0;do{if((aD|0)==0){gk();ay=ut(aJ)|0;if((ay|0)!=0){aM=ay;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{aM=aD}}while(0);aD=c[8718]|0;c[10634]=aM;if((aD|0)<1){aL=0;break}aJ=aD<<3;aD=ut(aJ)|0;do{if((aD|0)==0){gk();ay=ut(aJ)|0;if((ay|0)!=0){aN=ay;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{aN=aD}}while(0);aL=aN}}while(0);c[10878]=aL;c[8306]=0;uE(r|0,0,48);r=c[8270]|0;do{if((r|0)!=0){if((aY(r|0,139696)|0)==0){break}bA(4,r|0)}}while(0);r=s|0;aL=eC(r,7)|0;L8714:do{if((aL|0)==-1){aO=0}else{aN=q|0;aM=s+8|0;aH=0;aD=aL;while(1){aJ=c[8718]|0;if((c[8306]|0)>=(aJ|0)){ay=(aJ*3&-1|0)/2&-1;c[8718]=ay;aJ=aa(c[8304]|0,ay);if((aJ|0)<1){F=6420;break}ay=db(c[10636]|0,aJ<<3,215008)|0;c[10636]=ay;if((ay|0)==0){F=6711;break}ay=c[8718]|0;if((ay|0)<1){F=6423;break}aJ=db(c[10634]|0,ay<<3,215008)|0;c[10634]=aJ;if((aJ|0)==0){F=6714;break}aJ=c[8718]|0;if((aJ|0)<1){F=6426;break}ay=db(c[10878]|0,aJ<<3,215008)|0;c[10878]=ay;if((ay|0)==0){F=6716;break}ay=c[m>>2]|0;aJ=c[8718]|0;cf(ay|0,127672,(v=i,i=i+8|0,c[v>>2]=aJ,v)|0)}if((aD|0)==1){h[aM>>3]=+h[r>>3];h[r>>3]=+(c[11942]|0);F=6434}else if((aD|0)==(-5|0)|(aD|0)==(-2|0)|(aD|0)==(-3|0)|(aD|0)==(-4|0)){aP=aH}else if((aD|0)==0){F=6432;break}else{F=6434}L8729:do{if((F|0)==6434){F=0;aJ=aH+1|0;ay=c[8304]|0;L8731:do{if((ay|0)>0){aE=aa(ay,c[8306]|0);aC=c[10636]|0;av=0;while(1){aR=c[42584+(av<<2)>>2]|0;l=c[64648+(aR*688&-1)>>2]|0;if((l&1|0)==0){if(+h[s+(av<<3)>>3]<+h[64664+(aR*688&-1)>>3]){F=6438;break}}aw=+h[s+(av<<3)>>3];if((l&2|0)==0){if(aw>+h[64672+(aR*688&-1)>>3]){F=6441;break}}h[aC+(aE+av<<3)>>3]=aw;l=av+1|0;if((l|0)<(ay|0)){av=l}else{aS=l;break L8731}}if((F|0)==6441){F=0;av=q+(aR<<2)|0;c[av>>2]=(c[av>>2]|0)+1;aP=aJ;break L8729}else if((F|0)==6438){F=0;av=q+(aR<<2)|0;c[av>>2]=(c[av>>2]|0)+1;aP=aJ;break L8729}}else{aS=0}}while(0);ay=c[16162]|0;do{if((ay&1|0)==0){if(+h[s+(aS<<3)>>3]>=+h[8083]){break}c[aN>>2]=(c[aN>>2]|0)+1;aP=aJ;break L8729}}while(0);aw=+h[s+(aS<<3)>>3];if((ay&2|0)==0&aw>+h[8084]){c[aN>>2]=(c[aN>>2]|0)+1;aP=aJ;break}av=c[8306]|0;h[(c[10634]|0)+(av<<3)>>3]=aw;if((c[13486]|0)>2){aU=+h[s+(aS+1<<3)>>3]}else{aU=1.0}c[8306]=av+1;h[(c[10878]|0)+(av<<3)>>3]=aU;aP=aJ}}while(0);aj=eC(r,7)|0;if((aj|0)==-1){aO=aP;break L8714}else{aH=aP;aD=aj}}if((F|0)==6423){c[10634]=0;ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6420){c[10636]=0;ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6426){c[10878]=0;ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6711){ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6714){ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6716){ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6432){be(42289,126384,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0);fb()}}}while(0);ez();aW=c[8270]|0;do{if((aW|0)!=0){if((aY(aW|0,139696)|0)==0){break}bA(4,139696)}}while(0);aW=c[8306]|0;if((aW|0)<2){bD(125344,(v=i,i=i+8|0,c[v>>2]=aO,v)|0);aO=0;do{aX=c[42584+(aO<<2)>>2]|0;aP=c[q+(aX<<2)>>2]|0;do{if((aP|0)!=0){if((aO|0)<5){aZ=55600+(aO*51&-1)|0}else{aZ=77416}bD(124088,(v=i,i=i+16|0,c[v>>2]=aP,c[v+8>>2]=aZ,v)|0);r=64648+(aX*688&-1)|0;if((c[r>>2]&1|0)==0){aU=+h[64664+(aX*688&-1)>>3];bD(121384,(v=i,i=i+8|0,h[v>>3]=aU,v)|0)}else{bD(122672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[r>>2]&2|0)==0){aU=+h[64672+(aX*688&-1)>>3];bD(116464,(v=i,i=i+8|0,h[v>>3]=aU,v)|0);break}else{bJ(14192);break}}}while(0);aO=aO+1|0;}while((aO|0)<6);uD(42289,115544,16);fb()}aO=aa(c[8304]|0,aW);do{if((aO|0)<1){c[10636]=0;a_=aW;F=6471}else{aZ=db(c[10636]|0,aO<<3,215008)|0;q=c[8306]|0;c[10636]=aZ;if((q|0)>=1){a_=q;F=6471;break}c[10634]=0;a$=0;a0=q}}while(0);do{if((F|0)==6471){aO=db(c[10634]|0,a_<<3,215008)|0;aW=c[8306]|0;c[10634]=aO;if((aW|0)<1){a$=0;a0=aW;break}aO=db(c[10878]|0,aW<<3,215008)|0;a$=aO;a0=c[8306]|0}}while(0);c[10878]=a$;cf(c[8762]|0,114744,(v=i,i=i+8|0,c[v>>2]=a0,v)|0);if((c[13486]|0)<3){a0=c[8762]|0;aI(113544,54,1,a0|0)}a0=H-1|0;H=c[1054]|0;a$=(c[H+(a0*40&-1)+36>>2]|0)+(c[H+(a0*40&-1)+32>>2]|0)|0;a0=db(0,(a$+1|0)-(c[H+(ag*40&-1)+32>>2]|0)|0,116456)|0;H=c[(c[1054]|0)+(ag*40&-1)+32>>2]|0;L8802:do{if((H|0)<(a$|0)){ag=H;a_=a0;while(1){aO=a[(c[10036]|0)+ag|0]|0;if(aO<<24>>24==0){a2=a_;break L8802}aW=a_+1|0;a[a_]=aO;aO=ag+1|0;if((aO|0)<(a$|0)){ag=aO;a_=aW}else{a2=aW;break}}}else{a2=a0}}while(0);a[a2]=0;cf(c[8762]|0,108456,(v=i,i=i+8|0,c[v>>2]=a0,v)|0);uu(a0);c[8714]=32;a0=c[13898]|0;a2=a0+1|0;c[13898]=a2;if((c[8272]|0)<=(a0|0)){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a$=c[1054]|0;if((a[a$+(a0*40&-1)|0]&1)==0){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}H=c[a$+(a0*40&-1)+36>>2]|0;a_=a$+(a0*40&-1)+32|0;a0=c[10036]|0;a$=0;while(1){if((a$|0)>=(H|0)){break}if((a[a0+((c[a_>>2]|0)+a$|0)|0]|0)==(a[a$+107456|0]|0)){a$=a$+1|0}else{F=6705;break}}if((F|0)==6705){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a$|0)!=3){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a2=ut(256)|0;do{if((a2|0)==0){gk();a$=ut(256)|0;if((a$|0)!=0){a3=a$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{a3=a2}}while(0);a2=((c[8714]|0)*51&-1)+51|0;c[18130]=a3;a3=ut(a2)|0;do{if((a3|0)==0){gk();a$=ut(a2)|0;if((a$|0)!=0){a4=a$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=105592,v)|0)}else{a4=a3}}while(0);c[8236]=a4;c[8302]=0;a4=c[13898]|0;a3=c[1054]|0;a2=(a[a3+(a4*40&-1)|0]&1)==0;if(a2){F=6493}else{a$=a[(c[10036]|0)+(c[a3+(a4*40&-1)+32>>2]|0)|0]|0;if((a$<<24>>24|0)==39|(a$<<24>>24|0)==34){F=6503}else{F=6493}}L8832:do{if((F|0)==6493){a$=c[10810]|0;L8834:do{if((a$|0)!=0){a_=c[8272]|0;a0=a3+(a4*40&-1)+36|0;H=a3+(a4*40&-1)+32|0;ag=c[10036]|0;aW=a$;L8836:while(1){aO=c[aW+4>>2]|0;L8838:do{if(!((a_|0)<=(a4|0)|a2)){q=c[a0>>2]|0;aZ=0;while(1){if((aZ|0)>=(q|0)){break}if((a[ag+((c[H>>2]|0)+aZ|0)|0]|0)==(a[aO+aZ|0]|0)){aZ=aZ+1|0}else{break L8838}}if((a[aO+aZ|0]|0)==0){break L8836}}}while(0);aO=c[aW>>2]|0;if((aO|0)==0){break L8834}else{aW=aO}}if((a[aW+8|0]&1)!=0){break}if((c[aW+16>>2]|0)==3){F=6503;break L8832}}}while(0);a$=c[8762]|0;aI(99808,60,1,a$|0);a$=c[13898]|0;H=c[1054]|0;L8848:while(1){if((a[H+(a$*40&-1)|0]&1)==0){F=6725;break}ag=(bO(d[(c[10036]|0)+(c[H+(a$*40&-1)+32>>2]|0)|0]|0|0)|0)==0;a0=c[1054]|0;if(ag){if((a[(c[10036]|0)+(c[a0+(a$*40&-1)+32>>2]|0)|0]|0)!=95){F=6726;break}}ag=(c[8236]|0)+((c[8302]|0)*51&-1)|0;a_=c[13898]|0;aO=c[a0+(a_*40&-1)+32>>2]|0;aJ=c[a0+(a_*40&-1)+36>>2]|0;a_=((aJ|0)>50?50:aJ)+aO|0;L8854:do{if((aO|0)<(a_|0)){aJ=ag;a0=aO;while(1){ay=a[(c[10036]|0)+a0|0]|0;if(ay<<24>>24==0){a5=aJ;break L8854}q=aJ+1|0;a[aJ]=ay;ay=a0+1|0;if((ay|0)<(a_|0)){aJ=q;a0=ay}else{a5=q;break}}}else{a5=ag}}while(0);a[a5]=0;ag=c[8302]|0;a_=c[8714]|0;if((ag|0)<(a_|0)){a7=ag;a9=c[8236]|0}else{ag=a_*3&-1;a_=(ag|0)/2&-1;c[8714]=a_;if((ag|0)<2){F=6577;break}ag=db(c[18130]|0,a_<<3,215008)|0;c[18130]=ag;if((ag|0)==0){F=6728;break}ag=db(c[8236]|0,((c[8714]|0)*51&-1)+51|0,101064)|0;a_=ag;c[8236]=a_;if((ag|0)==0){F=6729;break}a7=c[8302]|0;a9=a_}a_=a9+(a7*51&-1)|0;ag=43240;while(1){ba=c[ag>>2]|0;if((ba|0)==0){F=6592;break}if((aY(a_|0,c[ba+4>>2]|0)|0)==0){F=6585;break}else{ag=ba|0}}do{if((F|0)==6585){F=0;ag=ba+8|0;if((a[ag]&1)!=0){a[ag]=0;c[ba+16>>2]=2;h[ba+24>>3]=1.0;h[ba+32>>3]=0.0;bb=1.0;break}ag=ba+16|0;aO=c[ag>>2]|0;if((aO|0)==2){bb=+h[ba+24>>3];break}else if((aO|0)==1){aU=+(c[ba+24>>2]|0);c[ag>>2]=2;h[ba+24>>3]=aU;h[ba+32>>3]=0.0;bb=aU;break}else if((aO|0)==3){bb=+uz(c[ba+24>>2]|0,0);break}else{F=6591;break L8848}}else if((F|0)==6592){F=0;aO=e6(a_)|0;c[aO+16>>2]=2;h[aO+24>>3]=1.0;h[aO+32>>3]=0.0;a[aO+8|0]=0;bb=1.0}}while(0);a_=c[8302]|0;h[(c[18130]|0)+(a_<<3)>>3]=bb;aO=a_+1|0;c[8302]=aO;a_=c[13898]|0;ag=a_+1|0;c[13898]=ag;if((c[8272]|0)<=(ag|0)){bc=aO;break L8832}aW=c[1054]|0;if((a[aW+(ag*40&-1)|0]&1)==0){bc=aO;break L8832}a0=c[aW+(ag*40&-1)+36>>2]|0;aJ=aW+(ag*40&-1)+32|0;ag=c[10036]|0;q=0;while(1){if((q|0)>=(a0|0)){break}if((a[ag+((c[aJ>>2]|0)+q|0)|0]|0)==(a[q+148464|0]|0)){q=q+1|0}else{bc=aO;break L8832}}if((q|0)!=1){bc=aO;break L8832}aJ=a_+2|0;c[13898]=aJ;if((aJ|0)==0){bc=aO;break L8832}else{a$=aJ;H=aW}}if((F|0)==6725){uD(42289,99416,23);fb()}else if((F|0)==6726){uD(42289,99416,23);fb()}else if((F|0)==6728){uD(42289,100336,43);fb()}else if((F|0)==6729){uD(42289,100336,43);fb()}else if((F|0)==6591){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((F|0)==6577){c[18130]=0;uD(42289,100336,43);fb()}}}while(0);if((F|0)==6503){uu(c[10644]|0);ba=c[13898]|0;L8897:do{if((ba|0)<(c[8272]|0)){a7=c[1054]|0;L8899:do{if((a[a7+(ba*40&-1)|0]&1)!=0){a9=c[a7+(ba*40&-1)+36>>2]|0;a5=a7+(ba*40&-1)+32|0;a2=c[10036]|0;a4=0;while(1){if((a4|0)>=(a9|0)){break}if((a[a2+((c[a5>>2]|0)+a4|0)|0]|0)==(a[a4+103664|0]|0)){a4=a4+1|0}else{break L8899}}if((a4|0)==1){bd=0;break L8897}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[g>>2]|0)==3){bd=c[g+8>>2]|0;break}else{c[13898]=ba;bd=0;break}}else{bd=0}}while(0);c[10644]=bd;ba=c[8762]|0;cf(ba|0,104576,(v=i,i=i+8|0,c[v>>2]=bd,v)|0);bd=hA(c[10644]|0,193632)|0;if((bd|0)==0){ba=c[10644]|0;be(42289,104048,(v=i,i=i+8|0,c[v>>2]=ba,v)|0);fb()}ba=x|0;L8913:do{if((a6(ba|0,1025,bd|0)|0)!=0){x=0;L8914:while(1){L8916:while(1){g=aQ(ba|0,221168)|0;if((g|0)==0){bf=0}else{a[g]=0;g=c[8762]|0;cf(g|0,103672,(v=i,i=i+8|0,c[v>>2]=ba,v)|0);bf=1}g=a8(ba|0,35)|0;if((g|0)==0){bg=ba}else{a[g]=0;bg=ba}while(1){g=a[bg]|0;if((g<<24>>24|0)==35|(g<<24>>24|0)==0){break}else if(!((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==10)){bh=ba;break L8916}bg=bg+1|0}if((a6(ba|0,1025,bd|0)|0)==0){break L8913}}while(1){a4=a[bh]|0;if((a4<<24>>24|0)==10|(a4<<24>>24|0)==0){bi=0;bj=ba;bk=x;break}else if(!((a4<<24>>24|0)==32|(a4<<24>>24|0)==9|(a4<<24>>24|0)==61)){F=6525;break}bh=bh+1|0}if((F|0)==6525){F=0;a4=cy(bh|0,213208)|0;if((a4|0)==0){bl=bh+(uA(bh|0)|0)|0}else{bl=a4}a4=a[bl]|0;a[bl]=0;bi=bh;bj=bl+1|0;bk=a4}a4=a[bi]|0;if(a4<<24>>24!=0){g=bi;a7=a4;do{if((bs(a7&255|0)|0)==0){if((a[g]|0)!=95){F=6720;break L8914}}g=g+1|0;a7=a[g]|0;}while(a7<<24>>24!=0)}if((uA(bi|0)|0)>>>0>50){F=6719;break}a7=c[8302]|0;g=c[8236]|0;uF(g+(a7*51&-1)|0,bi|0,51);if((uA(bi|0)|0)>>>0>=51){a[g+(a7*51&-1)+50|0]=0}if(bk<<24>>24==61){bm=bj}else{a7=a8(bj|0,61)|0;if((a7|0)==0){F=6538;break}bm=a7+1|0}a7=bm;while(1){g=a[a7]|0;if((g<<24>>24|0)==10|(g<<24>>24|0)==0){bn=0;bo=bm;bp=bk;break}else if(!((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==61)){F=6543;break}a7=a7+1|0}if((F|0)==6543){F=0;g=cy(a7|0,213208)|0;if((g|0)==0){bq=a7+(uA(a7|0)|0)|0}else{bq=g}g=a[bq]|0;a[bq]=0;bn=a7;bo=bq+1|0;bp=g}if((ca(bn|0,148448,(v=i,i=i+8|0,c[v>>2]=w,v)|0)|0)!=1){F=6547;break}if(bf){bb=+h[w>>3];g=e6((c[8236]|0)+((c[8302]|0)*51&-1)|0)|0;c[g+16>>2]=2;c[g+20>>2]=br;h[g+24>>3]=bb;h[g+32>>3]=0.0;a[g+8|0]=0;bt=bo}else{g=c[8302]|0;a4=c[8714]|0;if((g|0)<(a4|0)){bu=g}else{g=a4*3&-1;a4=(g|0)/2&-1;c[8714]=a4;if((g|0)<2){F=6552;break}g=db(c[18130]|0,a4<<3,215008)|0;c[18130]=g;if((g|0)==0){F=6709;break}g=db(c[8236]|0,((c[8714]|0)*51&-1)+51|0,101064)|0;c[8236]=g;if((g|0)==0){F=6710;break}bu=c[8302]|0}bb=+h[w>>3];c[8302]=bu+1;h[(c[18130]|0)+(bu<<3)>>3]=bb;bt=bo}while(1){g=a[bt]|0;if((g<<24>>24|0)==10|(g<<24>>24|0)==0){bv=bp;break}else if(!((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==61)){F=6560;break}bt=bt+1|0}if((F|0)==6560){F=0;a7=cy(bt|0,213208)|0;if((a7|0)==0){bw=bt+(uA(bt|0)|0)|0}else{bw=a7}a7=a[bw]|0;a[bw]=0;if((bt|0)==0){bv=a7}else{F=6564;break}}if((a6(ba|0,1025,bd|0)|0)==0){break L8913}else{x=bv}}if((F|0)==6709){bx=az(bd|0)|0;uD(42289,100336,43);fb()}else if((F|0)==6710){bx=az(bd|0)|0;uD(42289,100336,43);fb()}else if((F|0)==6719){by=az(bd|0)|0;uD(42289,101704,31);fb()}else if((F|0)==6720){by=az(bd|0)|0;uD(42289,101704,31);fb()}else if((F|0)==6552){c[18130]=0;bx=az(bd|0)|0;uD(42289,100336,43);fb()}else if((F|0)==6547){az(bd|0);uD(42289,101704,31);fb()}else if((F|0)==6564){az(bd|0);uD(42289,101704,31);fb()}else if((F|0)==6538){az(bd|0);uD(42289,101704,31);fb()}}}while(0);az(bd|0);bc=c[8302]|0}if((bc|0)<1){bz=0;bB=bc}else{bd=db(c[18130]|0,bc<<3,215008)|0;bz=bd;bB=c[8302]|0}c[18130]=bz;c[8236]=db(c[8236]|0,(bB*51&-1)+51|0,105592)|0;bB=c[8306]|0;bz=c[8302]|0;if((bB|0)<(bz|0)){uD(42289,98280,56);fb()}if((bz|0)>0){bd=c[18130]|0;bc=0;do{bx=bd+(bc<<3)|0;if(+h[bx>>3]==0.0){h[bx>>3]=1.0e-30}bc=bc+1|0;}while((bc|0)<(bz|0))}if((bz|0)==0){uh(-1,97624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{bc=c[18130]|0;h[e>>3]=1.0e+30;bd=hp(bz+bB|0,bz)|0;h[f>>3]=-1.0;aV(2,52);if((fh(bc,bd,e,f)|0)==1){uD(42289,96504,31);fb()}bb=+h[e>>3];aU=+h[f>>3];do{if((a[42560]&1)==0){bz=c[m>>2]|0;aw=bb-bb;if(bb>1.0e-30){bC=aw/bb}else{bC=0.0}au=+h[5479];cf(bz|0,224168,(v=i,i=i+56|0,c[v>>2]=0,h[v+8>>3]=bb,h[v+16>>3]=bC,h[v+24>>3]=aw,h[v+32>>3]=au,h[v+40>>3]=aU,c[v+48>>2]=222856,v)|0);if((c[8302]|0)>0){bE=0}else{bG=aw;break}while(1){au=+h[bc+(bE<<3)>>3];cf(bz|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bE*51&-1),h[v+8>>3]=au,v)|0);bB=bE+1|0;if((bB|0)<(c[8302]|0)){bE=bB}else{bG=aw;break}}}else{bG=bb-bb}}while(0);bE=c[8762]|0;if(bb>1.0e-30){bH=bG/bb}else{bH=0.0}bC=+h[5479];cf(bE|0,224168,(v=i,i=i+56|0,c[v>>2]=0,h[v+8>>3]=bb,h[v+16>>3]=bH,h[v+24>>3]=bG,h[v+32>>3]=bC,h[v+40>>3]=aU,c[v+48>>2]=222856,v)|0);if((c[8302]|0)>0){bz=0;do{bC=+h[bc+(bz<<3)>>3];cf(bE|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bz*51&-1),h[v+8>>3]=bC,v)|0);bz=bz+1|0;}while((bz|0)<(c[8302]|0))}bz=e6(96112)|0;a[bz+8|0]=0;c[bz+16>>2]=1;c[bz+24>>2]=0;a[1016]=0;bC=1.0e+30;bz=0;bE=2;bG=aU;L9027:while(1){if(a[51680]|0){aU=+h[e>>3];bB=c[m>>2]|0;bH=aU-bC;if(aU>1.0e-30){bI=bH/aU}else{bI=0.0}bb=+h[5479];bx=(bz|0)>0?223472:222856;cf(bB|0,224168,(v=i,i=i+56|0,c[v>>2]=bz,h[v+8>>3]=aU,h[v+16>>3]=bI,h[v+24>>3]=bH,h[v+32>>3]=bb,h[v+40>>3]=bG,c[v+48>>2]=bx,v)|0);if((c[8302]|0)>0){bx=0;do{bb=+h[bc+(bx<<3)>>3];cf(bB|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),h[v+8>>3]=bb,v)|0);bx=bx+1|0;}while((bx|0)<(c[8302]|0))}a[51680]=0;while(1){aI(74040,49,1,c[m>>2]|0);bx=a1(c[o>>2]|0)|0;if((bx|0)==99|(bx|0)==67){break}else if((bx|0)==(-1|0)|(bx|0)==115|(bx|0)==83){F=6637;break L9027}else if(!((bx|0)==101|(bx|0)==69)){continue}bx=c[10638]|0;bB=(bx|0)!=0?bx:136352;cf(c[m>>2]|0,72672,(v=i,i=i+8|0,c[v>>2]=bB,v)|0);if((c[8302]|0)>0){bx=0;do{bb=+h[(c[18130]|0)+(bx<<3)>>3];by=e6((c[8236]|0)+(bx*51&-1)|0)|0;c[by+16>>2]=2;h[by+24>>3]=bb;h[by+32>>3]=0.0;a[by+8|0]=0;bx=bx+1|0;}while((bx|0)<(c[8302]|0))}if((bB|0)==0){bK=0}else{bK=bP(bB|0)|0}dL(bK)}aI(73232,9,1,c[m>>2]|0)}if((bE|0)==2){bL=+h[e>>3];bM=bz+1|0}else{bL=bC;bM=bz}bx=fh(bc,bd,e,f)|0;if((bx|0)==1){bN=bL;bQ=bM;bR=1;break}else if((bx|0)==2){do{if((a[42560]&1)==0){bb=+h[e>>3];bH=+h[f>>3];by=c[m>>2]|0;aU=bb-bL;if(bb>1.0e-30){bS=aU/bb}else{bS=0.0}aw=+h[5479];bv=(bM|0)>0?223472:222856;cf(by|0,224168,(v=i,i=i+56|0,c[v>>2]=bM,h[v+8>>3]=bb,h[v+16>>3]=bS,h[v+24>>3]=aU,h[v+32>>3]=aw,h[v+40>>3]=bH,c[v+48>>2]=bv,v)|0);if((c[8302]|0)>0){bT=0}else{bV=bH;break}while(1){aw=+h[bc+(bT<<3)>>3];cf(by|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bT*51&-1),h[v+8>>3]=aw,v)|0);bv=bT+1|0;if((bv|0)<(c[8302]|0)){bT=bv}else{bV=bH;break}}}else{bV=+h[f>>3]}}while(0);if(bV<1.0e20){bW=bV}else{bN=bL;bQ=bM;bR=2;break}}else{bH=+h[f>>3];if(bH<1.0e20){bW=bH}else{bN=bL;bQ=bM;bR=bx;break}}by=c[8708]|0;if((by|0)!=0&(bM|0)>(by|0)){bN=bL;bQ=bM;bR=bx;break}if((bx|0)==3){bC=bL;bz=bM;bE=3;bG=bW;continue}bH=+h[e>>3];aw=bL-bH;if(bH>1.0e-30){bX=aw/bH}else{bX=aw}if(bX>+h[5479]){bC=bL;bz=bM;bE=bx;bG=bW}else{bN=bL;bQ=bM;bR=bx;break}}if((F|0)==6637){bM=c[m>>2]|0;aI(73744,5,1,bM|0);a[1016]=1;bN=bC;bQ=bz;bR=bE}aV(2,4);aV(13,1);bE=c[8708]|0;do{if((bE|0)>0&(bQ|0)>(bE|0)){fe(95552,(v=i,i=i+8|0,c[v>>2]=bE,v)|0)}else{if(a[1016]|0){fe(95160,(v=i,i=i+8|0,c[v>>2]=bQ,v)|0);break}else{fe(94448,(v=i,i=i+8|0,c[v>>2]=bQ,v)|0);bz=e6(96112)|0;a[bz+8|0]=0;c[bz+16>>2]=1;c[bz+24>>2]=1;break}}}while(0);bC=+h[e>>3];fe(93944,(v=i,i=i+8|0,h[v>>3]=bC,v)|0);bL=bC-bN;if(bC>1.0e-30){fe(93376,(v=i,i=i+8|0,h[v>>3]=bL/bC,v)|0)}else{fe(92448,(v=i,i=i+8|0,h[v>>3]=bL,v)|0)}if((bR|0)==1){uD(42289,96504,31);fb()}bR=c[8302]|0;if((a[42568]&1)!=0&(bR|0)>0){bQ=0;while(1){fi((c[8236]|0)+(bQ*51&-1)|0,0.0);bE=bQ+1|0;bz=c[8302]|0;if((bE|0)<(bz|0)){bQ=bE}else{bY=bz;break}}}else{bY=bR}bR=c[8306]|0;L9092:do{if((bR|0)==(bY|0)){fe(91680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(90880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(90496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(89976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bQ=c[8302]|0;if((bQ|0)>0){bZ=0}else{b_=bQ;break}while(1){bL=+h[bc+(bZ<<3)>>3];fe(89304,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bZ*51&-1),h[v+8>>3]=bL,v)|0);bQ=bZ+1|0;bz=c[8302]|0;if((bQ|0)<(bz|0)){bZ=bQ}else{b_=bz;break}}}else{if(bC<1.0e-30){fe(88552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(90496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(89976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bx=c[8302]|0;if((bx|0)>0){b$=0}else{b_=bx;break}while(1){bL=+h[bc+(b$<<3)>>3];fe(89304,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(b$*51&-1),h[v+8>>3]=bL,v)|0);bx=b$+1|0;bz=c[8302]|0;if((bx|0)<(bz|0)){b$=bx}else{b_=bz;break L9092}}}bz=bR-bY|0;bL=bC/+(bz|0);bN=+Q(+bL);fe(87584,(v=i,i=i+8|0,c[v>>2]=bz,v)|0);fe(86752,(v=i,i=i+8|0,h[v>>3]=bN,v)|0);fe(85792,(v=i,i=i+8|0,h[v>>3]=bL,v)|0);bx=e6(84600)|0;a[bx+8|0]=0;c[bx+16>>2]=1;c[bx+24>>2]=bz;bz=e6(84088)|0;a[bz+8|0]=0;c[bz+16>>2]=2;h[bz+24>>3]=bN;h[bz+32>>3]=0.0;bz=e6(83096)|0;a[bz+8|0]=0;c[bz+16>>2]=2;h[bz+24>>3]=bC;h[bz+32>>3]=0.0;hr(bd,0,0,0,c[8306]|0,c[8302]|0,0);bz=c[8306]|0;hs(bd,bd+(bz<<2)|0,c[8302]|0);bx=c[8302]|0;do{if((bx|0)<1){b0=bx;b1=0;b2=0}else{bQ=bx<<3;bE=ut(bQ)|0;do{if((bE|0)==0){gk();bM=ut(bQ)|0;if((bM|0)!=0){b3=bM;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{b3=bE}}while(0);bE=b3;bQ=c[8302]|0;if((bQ|0)>0){b4=0}else{b0=bQ;b1=0;b2=bE;break}while(1){bN=+h[(c[bd+(b4+bz<<2)>>2]|0)+(b4<<3)>>3];if(bN<=0.0){F=6678;break}h[bE+(b4<<3)>>3]=+Q(+bN);bM=b4+1|0;if((bM|0)<(bQ|0)){b4=bM}else{b5=0;break}}if((F|0)==6678){uD(42289,81952,66);fb()}while(1){bM=bE+(b5<<3)|0;bT=bd+(b5+bz<<2)|0;bK=0;do{by=(c[bT>>2]|0)+(bK<<3)|0;h[by>>3]=+h[by>>3]/(+h[bM>>3]*+h[bE+(bK<<3)>>3]);bK=bK+1|0;}while((bK|0)<=(b5|0));bK=b5+1|0;if((bK|0)<(bQ|0)){b5=bK}else{b0=bQ;b1=1;b2=bE;break}}}}while(0);bN=+Q(+(bC/+((c[8306]|0)-b0|0)));h[e>>3]=bN;if(b1){bx=0;do{bE=b2+(bx<<3)|0;h[bE>>3]=bN*+h[bE>>3];bx=bx+1|0;}while((bx|0)<(b0|0))}fe(80552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(79488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((c[8302]|0)>0){bx=0;do{bN=+h[bc+(bx<<3)>>3];bE=+P(+bN)<1.0e-30;bQ=b2+(bx<<3)|0;bL=+h[bQ>>3];if(bE){b6=0.0}else{b6=+P(+(bL*100.0/bN))}fe(78752,(v=i,i=i+40|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),h[v+8>>3]=bN,c[v+16>>2]=78264,h[v+24>>3]=bL,h[v+32>>3]=b6,v)|0);if((a[42568]&1)!=0){fi((c[8236]|0)+(bx*51&-1)|0,+h[bQ>>3])}bx=bx+1|0;}while((bx|0)<(c[8302]|0))}fe(77728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(77224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((c[8302]|0)>0){bx=0;do{fe(76616,(v=i,i=i+8|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),v)|0);bx=bx+1|0;}while((bx|0)<(c[8302]|0))}fe(140136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((c[8302]|0)>0){bx=0;do{fe(75944,(v=i,i=i+8|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),v)|0);bQ=bd+(bx+bz<<2)|0;bE=0;do{fe(75392,(v=i,i=i+8|0,h[v>>3]=+h[(c[bQ>>2]|0)+(bE<<3)>>3],v)|0);bE=bE+1|0;}while((bE|0)<=(bx|0));fe(140136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bx=bx+1|0;}while((bx|0)<(c[8302]|0))}uu(b2);b_=c[8302]|0}}while(0);b2=b_-1|0;b6=+h[bc+(b2<<3)>>3];b_=e6((c[8236]|0)+(b2*51&-1)|0)|0;c[b_+16>>2]=2;h[b_+24>>3]=b6;h[b_+32>>3]=0.0;a[b_+8|0]=0;h[f>>3]=-2.0;fh(bc,bd,e,f);uu(c[bd>>2]|0);uu(bd)}az(c[8762]|0);c[8762]=0;uu(c[10636]|0);uu(c[10634]|0);uu(c[10878]|0);uu(c[18130]|0);uu(c[8236]|0);bd=c[10062]|0;if((bd|0)!=0){e1(bd);c[10062]=0}bd=c[10036]|0;uF(35352,bd|0,512);if((uA(bd|0)|0)>>>0<512){i=b;return}a[35863]=0;i=b;return}function fe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e|0;g=f|0;h=f;c[h>>2]=d;c[h+4>>2]=0;if((a[42560]&1)==0){f=c[m>>2]|0;bX(f|0,b|0,g|0)}c[h>>2]=d;c[h+4>>2]=0;bX(c[8762]|0,b|0,g|0);i=e;return}function ff(b){b=b|0;aV(2,52);a[51680]=1;return}function fg(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[10568]|0;if((d|0)!=0){e=bP(d|0)|0;i=b;return e|0}d=bU(236952)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}f=a[d+((uA(d|0)|0)-1|0)|0]|0;if(!((f<<24>>24|0)==47|(f<<24>>24|0)==92)){e=bP(d|0)|0;i=b;return e|0}f=(uA(d|0)|0)+8|0;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=97072,v)|0);return 0}else{j=g}}while(0);uB(j|0,d|0);g=j+(uA(j|0)|0)|0;f=g|0;w=779381094;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;f=g+4|0;w=6778732;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;e=j;i=b;return e|0}}while(0);e=bP(42264)|0;i=b;return e|0}function fh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0;g=i;i=i+8|0;j=g|0;k=+h[f>>3];if(k!=-1.0){if(k==-2.0){uu(c[8730]|0);uu(c[8720]|0);uu(c[8728]|0);uu(c[8724]|0);uu(c[8726]|0);l=c[8722]|0;uu(c[l>>2]|0);uu(l);n=0;i=g;return n|0}l=c[8306]|0;o=c[8302]|0;if((o+l|0)>0){p=0;q=o;while(1){uD(c[(c[8722]|0)+(p<<2)>>2]|0,c[d+(p<<2)>>2]|0,q<<3);o=p+1|0;r=c[8306]|0;s=c[8302]|0;if((o|0)<(s+r|0)){p=o;q=s}else{t=r;break}}}else{t=l}uD(c[8720]|0,c[8730]|0,t<<3);t=c[8302]|0;if((t|0)>0){l=c[8306]|0;q=c[8722]|0;p=c[8720]|0;r=0;while(1){s=l+r|0;h[(c[q+(s<<2)>>2]|0)+(r<<3)>>3]=+h[f>>3];h[p+(s<<3)>>3]=0.0;s=r+1|0;if((s|0)<(t|0)){r=s}else{u=q;w=p;x=l;break}}}else{u=c[8722]|0;w=c[8720]|0;x=c[8306]|0}hr(u,w,c[8728]|0,c[8726]|0,x+t|0,t,1);t=c[8302]|0;if((t|0)>0){x=c[8728]|0;w=c[8724]|0;u=0;while(1){h[w+(u<<3)>>3]=+h[b+(u<<3)>>3]+ +h[x+(u<<3)>>3];l=u+1|0;if((l|0)<(t|0)){u=l}else{y=w;break}}}else{y=c[8724]|0}fj(y,c[8722]|0,c[8720]|0,j);k=+h[j>>3];if(k>=+h[e>>3]){if((a[42560]&1)==0){j=c[m>>2]|0;aF(42,j|0)}h[f>>3]=+h[4484]*+h[f>>3];n=3;i=g;return n|0}z=+h[f>>3];if(z>1.0e-20){if((a[42560]&1)==0){j=c[m>>2]|0;aF(47,j|0);A=+h[f>>3]}else{A=z}h[f>>3]=A/+h[4485]}h[e>>3]=k;if((c[8306]|0)>0){j=0;do{uD(c[d+(j<<2)>>2]|0,c[(c[8722]|0)+(j<<2)>>2]|0,c[8302]<<3);h[(c[8730]|0)+(j<<3)>>3]=+h[(c[8720]|0)+(j<<3)>>3];j=j+1|0;}while((j|0)<(c[8306]|0))}j=c[8302]|0;if((j|0)<=0){n=2;i=g;return n|0}y=c[8724]|0;w=0;while(1){h[b+(w<<3)>>3]=+h[y+(w<<3)>>3];u=w+1|0;if((u|0)<(j|0)){w=u}else{n=2;break}}i=g;return n|0}w=c[8302]|0;if((w|0)<1){B=0;C=w}else{j=w<<3;w=ut(j)|0;do{if((w|0)==0){gk();y=ut(j)|0;if((y|0)!=0){D=y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{D=w}}while(0);B=D;C=c[8302]|0}c[8724]=B;B=c[8306]|0;D=C+B|0;if((D|0)<1){E=0;F=B;G=C}else{C=D<<3;D=ut(C)|0;do{if((D|0)==0){gk();B=ut(C)|0;if((B|0)!=0){H=B;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{H=D}}while(0);E=H;F=c[8306]|0;G=c[8302]|0}c[8730]=E;E=G+F|0;if((E|0)<1){I=0;J=G}else{G=E<<3;E=ut(G)|0;do{if((E|0)==0){gk();F=ut(G)|0;if((F|0)!=0){K=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{K=E}}while(0);I=K;J=c[8302]|0}c[8720]=I;if((J|0)<1){L=0;M=J}else{I=J<<3;J=ut(I)|0;do{if((J|0)==0){gk();K=ut(I)|0;if((K|0)!=0){N=K;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{N=J}}while(0);L=N;M=c[8302]|0}c[8728]=L;L=c[8306]|0;N=M+L|0;if((N|0)<1){O=0;P=L;R=M}else{M=N<<3;N=ut(M)|0;do{if((N|0)==0){gk();L=ut(M)|0;if((L|0)!=0){S=L;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{S=N}}while(0);O=S;P=c[8306]|0;R=c[8302]|0}c[8726]=O;c[8722]=hp(R+P|0,R)|0;fj(b,d,c[8730]|0,e);k=+h[1782];if(k!=0.0){T=k;U=c[8302]|0}else{h[f>>3]=0.0;e=c[8306]|0;b=c[8302]|0;if((e|0)>0){R=0;k=0.0;while(1){if((b|0)>0){P=d+(R<<2)|0;O=0;A=k;while(1){z=+h[(c[P>>2]|0)+(O<<3)>>3];V=A+z*z;h[f>>3]=V;S=O+1|0;if((S|0)<(b|0)){O=S;A=V}else{W=V;break}}}else{W=k}O=R+1|0;if((O|0)<(e|0)){R=O;k=W}else{X=W;break}}}else{X=0.0}T=+Q(+(X/+(e|0)/+(b|0)));U=b}h[f>>3]=T;if((U|0)>0){Y=0}else{n=0;i=g;return n|0}while(1){if((Y|0)>0){f=c[8306]|0;b=0;do{h[(c[d+(f+Y<<2)>>2]|0)+(b<<3)>>3]=0.0;h[(c[d+(f+b<<2)>>2]|0)+(Y<<3)>>3]=0.0;b=b+1|0;}while((b|0)<(Y|0))}b=Y+1|0;if((b|0)<(U|0)){Y=b}else{n=0;break}}i=g;return n|0}function fi(b,d){b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0;e=i;f=(uA(b|0)|0)+5|0;g=ut(f)|0;do{if((g|0)==0){gk();j=ut(f)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=179864,v)|0)}else{k=g}}while(0);be(k|0,74544,(v=i,i=i+8|0,c[v>>2]=b,v)|0);b=e6(k)|0;c[b+16>>2]=2;h[b+24>>3]=d;h[b+32>>3]=0.0;a[b+8|0]=0;uu(k);i=e;return}function fj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0;f=i;h[e>>3]=0.0;g=c[8306]|0;if((g|0)<1){j=0}else{k=g<<3;g=ut(k)|0;do{if((g|0)==0){gk();l=ut(k)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{m=g}}while(0);j=m}m=c[8302]|0;if((m|0)<1){n=0}else{g=m<<3;m=ut(g)|0;do{if((m|0)==0){gk();k=ut(g)|0;if((k|0)!=0){o=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{o=m}}while(0);n=o}o=n;fk(a,d);m=c[8302]|0;if((m|0)>0){g=0;while(1){h[n+(g<<3)>>3]=+h[a+(g<<3)>>3];k=g+1|0;if((k|0)<(m|0)){g=k}else{p=0;break}}do{g=a+(p<<3)|0;q=+h[g>>3];r=+P(+q)<1.0e-30?1.0e-30:q;m=n+(p<<3)|0;h[m>>3]=r*1.001;fk(n,j);k=c[8306]|0;if((k|0)>0){q=r*.001;l=0;do{h[(c[b+(l<<2)>>2]|0)+(p<<3)>>3]=(+h[j+(l<<3)>>3]- +h[d+(l<<3)>>3])/q;l=l+1|0;}while((l|0)<(k|0))}h[m>>3]=+h[g>>3];p=p+1|0;}while((p|0)<(c[8302]|0))}uu(j);uu(o);o=c[8306]|0;if((o|0)<=0){i=f;return}j=c[10634]|0;p=c[10878]|0;n=c[8302]|0;a=0;do{k=d+(a<<3)|0;l=p+(a<<3)|0;q=(+h[k>>3]- +h[j+(a<<3)>>3])/+h[l>>3];h[k>>3]=q;h[e>>3]=+h[e>>3]+q*q;if((n|0)>0){k=b+(a<<2)|0;s=0;do{t=(c[k>>2]|0)+(s<<3)|0;h[t>>3]=+h[t>>3]/+h[l>>3];s=s+1|0;}while((s|0)<(n|0))}a=a+1|0;}while((a|0)<(o|0));i=f;return}function fk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0;e=i;i=i+24|0;f=e|0;if((c[8302]|0)>0){g=f|0;j=f+8|0;k=f+16|0;l=f;m=0;do{n=+h[b+(m<<3)>>3];c[g>>2]=2;h[j>>3]=n;h[k>>3]=0.0;o=e6((c[8236]|0)+(m*51&-1)|0)|0;p=o+16|0;c[p>>2]=c[l>>2];c[p+4>>2]=c[l+4>>2];c[p+8>>2]=c[l+8>>2];c[p+12>>2]=c[l+12>>2];c[p+16>>2]=c[l+16>>2];c[p+20>>2]=c[l+20>>2];a[o+8|0]=0;m=m+1|0;}while((m|0)<(c[8302]|0))}if((c[8306]|0)<=0){i=e;return}m=f|0;l=f+8|0;k=l;j=f+8|0;g=l;l=0;L9333:while(1){b=0;do{o=55600+(b*51&-1)|0;L9337:do{if((a[(e6(o)|0)+8|0]&1)==0){p=43240;while(1){q=c[p>>2]|0;if((q|0)==0){r=0.0;break L9337}if((aY(o|0,c[q+4>>2]|0)|0)==0){break}else{p=q|0}}p=c[q+16>>2]|0;if((p|0)==3){r=+uz(c[q+24>>2]|0,0);break}else if((p|0)==1){r=+(c[q+24>>2]|0);break}else if((p|0)==2){r=+h[q+24>>3];break}else{s=6863;break L9333}}else{r=0.0}}while(0);c[40264+(b*24&-1)>>2]=2;h[40272+(b*24&-1)>>3]=r;h[40280+(b*24&-1)>>3]=0.0;b=b+1|0;}while((b|0)<5);b=c[8304]|0;if((b|0)>0){o=c[10636]|0;p=0;do{n=+h[o+(aa(b,l)+p<<3)>>3];c[40264+(p*24&-1)>>2]=2;h[40272+(p*24&-1)>>3]=n;h[40280+(p*24&-1)>>3]=0.0;p=p+1|0;}while((p|0)<(b|0))}e4(c[10062]|0,f);if((a[1960]&1)!=0){s=6869;break}b=c[m>>2]|0;if((b|0)==2){t=+h[j>>3]}else if((b|0)==3){t=+uz(c[g>>2]|0,0)}else if((b|0)==1){t=+(c[k>>2]|0)}else{s=6874;break}h[d+(l<<3)>>3]=t;b=l+1|0;if((b|0)<(c[8306]|0)){l=b}else{s=6877;break}}if((s|0)==6869){uD(42289,221560,43);fb()}else if((s|0)==6874){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==6877){i=e;return}else if((s|0)==6863){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function fl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+32|0;g=f|0;h=f+16|0;j=c[a>>2]|0;k=c[b>>2]|0;l=c[13542]|0;if((l|0)==0){m=0;n=0;o=0}else{p=c[l>>2]|0;q=(p|0)>(j|0)&1;r=c[l+4>>2]|0;s=(r|0)<(j|0)?q|2:q;q=c[l+8>>2]|0;t=(q|0)>(k|0)?s|4:s;s=c[l+12>>2]|0;u=c[d>>2]|0;v=c[e>>2]|0;w=(p|0)>(u|0)&1;p=(r|0)<(u|0)?w|2:w;w=(q|0)>(v|0)?p|4:p;m=(s|0)<(v|0)?w|8:w;n=(s|0)<(k|0)?t|8:t;o=l}l=(n|0)!=0;t=l^1;s=(m|0)==0;if(s&t){x=1;i=f;return x|0}if((m&n|0)!=0){x=0;i=f;return x|0}n=c[d>>2]|0;m=n-j|0;w=c[e>>2]|0;v=w-k|0;do{if((w|0)==(k|0)){y=0;z=k}else{p=c[o+8>>2]|0;q=((aa(p-w|0,m)|0)/(v|0)&-1)+n|0;u=c[o>>2]|0;do{if((q|0)<(u|0)){A=0}else{if((q|0)>(c[o+4>>2]|0)){A=0;break}c[g>>2]=q;c[h>>2]=p;A=1}}while(0);p=o+12|0;q=n+((aa((c[p>>2]|0)-w|0,m)|0)/(v|0)&-1)|0;if((q|0)<(u|0)){y=A;z=w;break}if((q|0)>(c[o+4>>2]|0)){y=A;z=w;break}c[g+(A<<2)>>2]=q;c[h+(A<<2)>>2]=c[p>>2];y=A+1|0;z=w}}while(0);do{if((n|0)==(j|0)){B=y;C=j}else{w=c[o>>2]|0;A=z+((aa(w-n|0,v)|0)/(m|0)&-1)|0;p=o+8|0;q=c[p>>2]|0;do{if((A|0)<(q|0)){D=y;E=q}else{if((A|0)>(c[o+12>>2]|0)){D=y;E=q;break}c[g+(y<<2)>>2]=w;c[h+(y<<2)>>2]=A;D=y+1|0;E=c[p>>2]|0}}while(0);p=c[o+4>>2]|0;A=z+((aa(p-n|0,v)|0)/(m|0)&-1)|0;if((A|0)<(E|0)){B=D;C=n;break}if((A|0)>(c[o+12>>2]|0)){B=D;C=n;break}c[g+(D<<2)>>2]=p;c[h+(D<<2)>>2]=A;B=D+1|0;C=n}}while(0);if((B|0)<2){x=0;i=f;return x|0}B=(j|0)<(C|0);n=B?C:j;D=B?j:C;B=(k|0)<(z|0);o=B?z:k;E=B?k:z;L9395:do{if(s|t){B=c[g>>2]|0;if(l){y=aa(C-B|0,m);A=c[h>>2]|0;if((aa(z-A|0,v)+y|0)>0){c[a>>2]=B;c[b>>2]=A;break}else{c[a>>2]=c[g+4>>2];c[b>>2]=c[h+4>>2];break}}else{A=aa(B-j|0,m);y=c[h>>2]|0;if((aa(y-k|0,v)+A|0)>0){c[d>>2]=B;c[e>>2]=y;break}else{c[d>>2]=c[g+4>>2];c[e>>2]=c[h+4>>2];break}}}else{y=c[g+4>>2]|0;B=c[g>>2]|0;A=(aa(y-B|0,m)|0)<0;p=c[h+4>>2]|0;w=c[h>>2]|0;do{if(!A){if((aa(p-w|0,v)|0)<0){break}c[a>>2]=B;c[b>>2]=w;c[d>>2]=y;c[e>>2]=p;break L9395}}while(0);c[a>>2]=y;c[b>>2]=p;c[d>>2]=B;c[e>>2]=w}}while(0);v=c[a>>2]|0;if((v|0)<(D|0)|(v|0)>(n|0)){x=0;i=f;return x|0}v=c[d>>2]|0;if((v|0)<(D|0)|(v|0)>(n|0)){x=0;i=f;return x|0}n=c[b>>2]|0;if((n|0)<(E|0)|(n|0)>(o|0)){x=0;i=f;return x|0}else{x=c[e>>2]|0;i=f;return((x|0)<=(o|0)&(x|0)>=(E|0))<<31>>31|0}return 0}function fm(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+32|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;m=c[3524]|0;n=c[13542]|0;if((n|0)==0){o=1;p=f}else{q=c[n>>2]|0;r=(q|0)>(a|0)&1;s=c[n+4>>2]|0;t=(s|0)<(a|0)?r|2:r;r=c[n+8>>2]|0;a=(r|0)>(b|0)?t|4:t;t=c[n+12>>2]|0;n=(q|0)>(d|0)&1;q=(s|0)<(d|0)?n|2:n;n=(r|0)>(e|0)?q|4:q;o=(((t|0)<(e|0)?n|8:n)|0)==0;p=(((t|0)<(b|0)?a|8:a)|0)==0?f:f&-3}fl(h,j,k,l);cI[c[m+84>>2]&63](c[h>>2]|0,c[j>>2]|0,c[k>>2]|0,c[l>>2]|0,o?p:p&-2);i=g;return}function fn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;e=i;i=i+104|0;f=e|0;g=e+16|0;j=e+32|0;k=e+48|0;l=c[b>>2]|0;if((l|0)==2){m=c[b+4>>2]|0;n=43280;while(1){o=c[n>>2]|0;if((o|0)==0){p=6930;break}if((c[o+4>>2]|0)==(m|0)){p=6928;break}else{n=o|0}}do{if((p|0)==6930){n=c[8798]|0;q=(n|0)>0;r=m;L9433:while(1){s=43264;while(1){t=c[s>>2]|0;if((t|0)==0){break}if((c[t+4>>2]|0)==(r|0)){break L9433}else{s=t|0}}u=r-1|0;if(!((r|0)>(n|0)&q)){p=6940;break}r=((u|0)%(n|0)&-1)+1|0}if((p|0)==6940){c[k+4>>2]=u;c[k+40>>2]=1;c[k+44>>2]=u;c[k+8>>2]=u;break}n=k;q=t+8|0;c[n>>2]=c[q>>2];c[n+4>>2]=c[q+4>>2];c[n+8>>2]=c[q+8>>2];c[n+12>>2]=c[q+12>>2];c[n+16>>2]=c[q+16>>2];c[n+20>>2]=c[q+20>>2];c[n+24>>2]=c[q+24>>2];c[n+28>>2]=c[q+28>>2];c[n+32>>2]=c[q+32>>2];c[n+36>>2]=c[q+36>>2];c[n+40>>2]=c[q+40>>2];c[n+44>>2]=c[q+44>>2];c[n+48>>2]=c[q+48>>2];c[n+52>>2]=c[q+52>>2];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[k+4>>2]=r;a[k+32|0]=0;break}if((a[k+32|0]&1)!=0){break}c[k+40>>2]=1;c[k+44>>2]=c[k+4>>2]}else if((p|0)==6928){q=k;n=o+8|0;c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];c[q+16>>2]=c[n+16>>2];c[q+20>>2]=c[n+20>>2];c[q+24>>2]=c[n+24>>2];c[q+28>>2]=c[n+28>>2];c[q+32>>2]=c[n+32>>2];c[q+36>>2]=c[n+36>>2];c[q+40>>2]=c[n+40>>2];c[q+44>>2]=c[n+44>>2];c[q+48>>2]=c[n+48>>2];c[q+52>>2]=c[n+52>>2];if((a[k+32|0]&1)!=0){break}c[k+40>>2]=1;c[k+44>>2]=c[k+4>>2]}}while(0);o=k+40|0;v=o;w=c[o>>2]|0}else{v=b;w=l}do{if((w|0)==0){cM[c[d+64>>2]&511](-2);i=e;return}else if((w|0)==1){l=c[d+144>>2]|0;if((l|0)==0){cM[c[d+64>>2]&511](c[v+4>>2]|0);i=e;return}else{cM[l&511](v);i=e;return}}else if((w|0)==3){l=c[d+144>>2]|0;if((l|0)==0){break}cM[l&511](v);i=e;return}}while(0);do{if(a[31104]|0){if((c[d+144>>2]|0)==0){break}if((w|0)==6){x=+h[v+8>>3];l=c[34]|0;b=(a[66852]&1)==0;do{if((a[64788+(l*688&-1)|0]&1)==0){if(b){y=x;break}if(x>0.0){z=+_(+x);y=z/+h[8358];break}else{y=+h[8341];break}}else{if(b){y=+Z(+(x*+h[64800+(l*688&-1)>>3]));break}if(+h[64792+(l*688&-1)>>3]==+h[8357]){y=x;break}y=x*+h[64800+(l*688&-1)>>3]/+h[8358]}}while(0);x=+h[8341];do{if(x<y){z=+h[8342];if(z<=y){A=+((a[20668]|0)==112&1|0);break}B=(y-x)/(z-x);if((a[20668]|0)==112){A=B;break}A=1.0-B}else{A=+((a[20668]|0)!=112&1|0)}}while(0);l=(c[3524]|0)+144|0;if((c[l>>2]|0)==0){i=e;return}c[f>>2]=5;h[f+8>>3]=A;c[f+4>>2]=0;cM[c[l>>2]&511](f);i=e;return}else if((w|0)==4){x=+h[v+8>>3];B=+h[8341];do{if(B<x){z=+h[8342];if(z<=x){C=+((a[20668]|0)==112&1|0);break}D=(x-B)/(z-B);if((a[20668]|0)==112){C=D;break}C=1.0-D}else{C=+((a[20668]|0)!=112&1|0)}}while(0);l=(c[3524]|0)+144|0;if((c[l>>2]|0)==0){i=e;return}c[g>>2]=5;h[g+8>>3]=C;c[g+4>>2]=0;cM[c[l>>2]&511](g);i=e;return}else if((w|0)==5){B=+h[v+8>>3];if((a[20668]|0)==112){E=B}else{E=1.0-B}l=(c[3524]|0)+144|0;if((c[l>>2]|0)==0){i=e;return}c[j>>2]=5;h[j+8>>3]=E;c[j+4>>2]=0;cM[c[l>>2]&511](j);i=e;return}else{i=e;return}}}while(0);cM[c[d+64>>2]&511](-2);i=e;return}function fo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+32|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;if((c[b+88>>2]|0)==0){c[e>>2]=0;n=0}else{c[e>>2]=~~(+h[3817]*+((c[d+28>>2]|0)>>>0>>>0)*.5);n=~~(+h[3817]*+((c[d+24>>2]|0)>>>0>>>0)*.5)}c[f>>2]=n;n=b+144|0;if((a[37384]&1)==0){fN(n,l,m,91736);c[e>>2]=(c[e>>2]|0)+~~+h[l>>3];o=(c[f>>2]|0)+~~+h[m>>3]|0;c[f>>2]=o;i=g;return}else{fx(n,j,k,91736);c[e>>2]=(c[e>>2]|0)+(c[j>>2]|0);o=(c[f>>2]|0)+(c[k>>2]|0)|0;c[f>>2]=o;i=g;return}}function fp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0;f=i;i=i+48|0;g=f|0;j=f+16|0;k=f+32|0;l=f+40|0;fn(e+72|0,c[3524]|0);m=a[e+184|0]&1;do{if(m<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;n=c[(c[3524]|0)+88>>2]|0;if((n|0)==0){break}cO[n&255](179864)}}while(0);a[37456]=m;fo(e,c[3524]|0,k,l);m=e+52|0;n=c[m>>2]|0;do{if((n|0)==0){o=7011}else{if((cO[c[(c[3524]|0)+72>>2]&255](n)|0)==0){o=7011;break}ln((c[k>>2]|0)+b|0,(c[l>>2]|0)+d|0,c[e+60>>2]|0,c[e+48>>2]|0,0,c[m>>2]|0,c[e+64>>2]|0);p=c[(c[3524]|0)+72>>2]|0;cO[p&255](0)}}while(0);if((o|0)==7011){ln((c[k>>2]|0)+b|0,(c[l>>2]|0)+d|0,c[e+60>>2]|0,c[e+48>>2]|0,0,0,c[e+64>>2]|0)}if((c[e+88>>2]|0)==0){a[37456]=0;i=f;return}l=c[3524]|0;do{if((c[l+96>>2]&128|0)==0){if((b|0)<=0){a[37456]=0;i=f;return}if(!((c[l+8>>2]|0)>>>0>b>>>0&(d|0)>0)){a[37456]=0;i=f;return}if((c[l+12>>2]|0)>>>0>d>>>0){break}a[37456]=0;i=f;return}}while(0);k=g;m=e+128|0;c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];m=c[e+92>>2]|0;q=+h[e+112>>3];k=c[l+92>>2]|0;if(q<0.0){cK[k&63](+h[3817])}else{cK[k&63](q)}cK[c[(c[3524]|0)+112>>2]&63](+h[e+104>>3]);k=c[(c[3524]|0)+64>>2]|0;if((m|0)<-5){cM[k&511](-2)}else{cM[k&511](m)}k=c[3524]|0;do{if((a[e+120|0]&1)==0){if((c[k+96>>2]&1024|0)!=0){r=k;break}c[g>>2]=1;c[g+4>>2]=m;o=7026}else{o=7026}}while(0);if((o|0)==7026){fn(g,k);r=c[3524]|0}cR[c[r+80>>2]&127](b,d,c[e+96>>2]|0);e=j;c[e>>2]=c[14084];c[e+4>>2]=c[56340>>2];c[e+8>>2]=c[56344>>2];c[e+12>>2]=c[56348>>2];e=c[14075]|0;do{if((c[14074]|0)!=0){q=+h[7040];d=c[(c[3524]|0)+92>>2]|0;if(q<0.0){cK[d&63](+h[3817]);break}else{cK[d&63](q);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);d=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[d&511](-2)}else{cM[d&511](e)}d=c[3524]|0;do{if((a[56328]&1)==0){if((c[d+96>>2]&1024|0)==0){c[j>>2]=1;c[j+4>>2]=e;break}else{a[37456]=0;i=f;return}}}while(0);fn(j,d);a[37456]=0;i=f;return}function fq(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;d=i;ft(a,b);if((c[5163]|0)==103){i=d;return}e=c[5174]|0;if((e|0)==104){f=b|0;g=b+8|0;a=+h[g>>3];j=b+16|0;k=+h[j>>3];if(a==0.0){h[j>>3]=k;h[g>>3]=k;h[f>>3]=k;i=d;return}l=+h[f>>3]*6.0;n=~~+O(+l);o=l- +(n|0);l=k*(1.0-a);p=k*(1.0-a*o);q=k*(1.0-a*(1.0-o));r=(n|0)%6&-1;if((r|0)==1){h[f>>3]=p;h[g>>3]=k;h[j>>3]=l;i=d;return}else if((r|0)==0){h[f>>3]=k;h[g>>3]=q;h[j>>3]=l;i=d;return}else if((r|0)==4){h[f>>3]=q;h[g>>3]=l;h[j>>3]=k;i=d;return}else if((r|0)==3){h[f>>3]=l;h[g>>3]=p;h[j>>3]=k;i=d;return}else if((r|0)==2){h[f>>3]=l;h[g>>3]=k;h[j>>3]=q;i=d;return}else{h[f>>3]=k;h[g>>3]=l;h[j>>3]=p;i=d;return}}else if((e|0)==121){j=b|0;p=+h[j>>3];g=b+8|0;l=+h[g>>3];f=b+16|0;k=+h[f>>3];q=p-l*.956+k*.621;do{if(q<0.0){s=0.0}else{if(q>1.0){s=1.0;break}s=q}}while(0);h[j>>3]=s;s=p-l*.272-k*.647;do{if(s<0.0){t=0.0}else{if(s>1.0){t=1.0;break}t=s}}while(0);h[g>>3]=t;t=p-l*1.105-k*1.702;do{if(t<0.0){u=0.0}else{if(t>1.0){u=1.0;break}u=t}}while(0);h[f>>3]=u;i=d;return}else if((e|0)==99){f=b|0;g=b+8|0;u=+h[g>>3];j=b+16|0;t=+h[j>>3];k=1.0- +h[f>>3];do{if(k<0.0){w=0.0}else{if(k>1.0){w=1.0;break}w=k}}while(0);h[f>>3]=w;w=1.0-u;do{if(w<0.0){x=0.0}else{if(w>1.0){x=1.0;break}x=w}}while(0);h[g>>3]=x;x=1.0-t;do{if(x<0.0){y=0.0}else{if(x>1.0){y=1.0;break}y=x}}while(0);h[j>>3]=y;i=d;return}else if((e|0)==120){j=b|0;y=+h[j>>3];g=b+8|0;x=+h[g>>3];f=b+16|0;t=+h[f>>3];w=y*1.91-x*.5338-t*.2891;do{if(w<0.0){z=0.0}else{if(w>1.0){z=1.0;break}z=w}}while(0);h[j>>3]=z;z=y*-.9844+x*1.999-t*.0279;do{if(z<0.0){A=0.0}else{if(z>1.0){A=1.0;break}A=z}}while(0);h[g>>3]=A;A=y*.0585-x*.1187-t*.9017;do{if(A<0.0){B=0.0}else{if(A>1.0){B=1.0;break}B=A}}while(0);h[f>>3]=B;i=d;return}else if((e|0)==114){i=d;return}else{cf(c[m>>2]|0,91064,(v=i,i=i+24|0,c[v>>2]=179392,c[v+8>>2]=310,c[v+16>>2]=e<<24>>24,v)|0);i=d;return}}function fr(b,d){b=+b;d=d|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0;e=i;i=i+24|0;f=e|0;g=c[5168]|0;L9652:do{if((g|0)==0){j=b}else{k=+O(+(+(g|0)*b))/+(g-1|0);if((c[5163]|0)!=100){j=k;break}l=c[5172]|0;if((l|0)<3&k==0.0){j=k;break}m=c[5173]|0;n=0;o=k;while(1){if((n|0)>=(l|0)){j=o;break L9652}k=+h[m+(n<<5)>>3];p=n+1|0;q=+h[m+(p<<5)>>3];r=q>b;do{if(k<=b&r){if(!(o<k|o>q)){s=o;break}s=(k+q)*.5}else{s=o}}while(0);if(r){j=s;break}else{n=p;o=s}}}}while(0);fq(j,f);j=+h[f+8>>3];s=+h[f+16>>3];a[d|0]=~~(+h[f>>3]*255.0+.5);a[d+1|0]=~~(j*255.0+.5);a[d+2|0]=~~(s*255.0+.5);i=e;return}function fs(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0,U=0,V=0,W=0,X=0,Y=0;a=i;i=i+24|0;f=a|0;g=(b|0)<1?2e3:b;j=d>0.0?d:.003;b=ut(1600)|0;k=b;l=ut(2400)|0;m=l;ft(0.0,m);h[b>>3]=0.0;n=b+8|0;c[n>>2]=c[l>>2];c[n+4>>2]=c[l+4>>2];c[n+8>>2]=c[l+8>>2];c[n+12>>2]=c[l+12>>2];c[n+16>>2]=c[l+16>>2];c[n+20>>2]=c[l+20>>2];d=+(g|0);ft(1.0/d,l+24|0);do{if((g|0)>0){l=0;o=0.0;n=50;b=k;p=100;q=m;r=1;while(1){s=q;t=p;u=o;v=2;while(1){w=v+l|0;if((w|0)>(g|0)){x=s;y=t;z=u;break}A=+(w|0)/d;if((v|0)==(t|0)){B=v+50|0;C=uv(s,B<<5)|0;D=B}else{C=s;D=t}B=C+(v*24&-1)|0;ft(A,B);E=v-2|0;F=v-1|0;G=+h[C+(E*24&-1)>>3];H=+h[C+(E*24&-1)+8>>3];I=+h[C+(E*24&-1)+16>>3];J=+h[C+(F*24&-1)>>3];K=+h[C+(F*24&-1)+8>>3];L=+h[C+(F*24&-1)+16>>3];M=+h[B>>3];N=+h[C+(v*24&-1)+8>>3];O=+h[C+(v*24&-1)+16>>3];if(G<J&J>M){x=C;y=D;z=A;break}if(H<K&K>N){x=C;y=D;z=A;break}if(I<L&L>O){x=C;y=D;z=A;break}if(G>J&J<M){x=C;y=D;z=A;break}if(H>K&K<N){x=C;y=D;z=A;break}if(I>L&L<O){x=C;y=D;z=A;break}L=+h[C>>3];I=+h[C+8>>3];K=+h[C+16>>3];H=+(v|0);J=(M-L)/H;M=(N-I)/H;N=(O-K)/H;H=0.0;B=1;while(1){if((B|0)>=(v|0)){Q=H;break}O=+(B|0);G=+P(+(L+J*O- +h[C+(B*24&-1)>>3]));R=+P(+(I+M*O- +h[C+(B*24&-1)+8>>3]));S=+P(+(K+N*O- +h[C+(B*24&-1)+16>>3]));O=G>H?G:H;G=R>O?R:O;O=S>G?S:G;if(O<j){H=O;B=B+1|0}else{Q=O;break}}if(Q>j){x=C;y=D;z=A;break}else{s=C;t=D;u=A;v=v+1|0}}if((r|0)==(n|0)){t=r+25|0;T=uv(b,t<<5)|0;U=t}else{T=b;U=n}h[T+(r<<5)>>3]=z;t=T+(r<<5)+8|0;s=x+((v-1|0)*24&-1)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];c[t+16>>2]=c[s+16>>2];c[t+20>>2]=c[s+20>>2];V=r+1|0;t=x;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];c[t+16>>2]=c[s+16>>2];c[t+20>>2]=c[s+20>>2];s=x+24|0;t=x+(v*24&-1)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[s+16>>2]=c[t+16>>2];c[s+20>>2]=c[t+20>>2];if((w|0)<(g|0)){l=w;o=z;n=U;b=T;p=y;q=x;r=V}else{break}}ft(1.0,f);if((V|0)!=(U|0)){W=T;X=V;Y=x;break}W=uv(T,(V<<5)+32|0)|0;X=V;Y=x}else{ft(1.0,f);W=k;X=1;Y=m}}while(0);h[W+(X<<5)>>3]=1.0;m=W+(X<<5)+8|0;k=f;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];c[m+16>>2]=c[k+16>>2];c[m+20>>2]=c[k+20>>2];uu(Y);c[e>>2]=X+1;i=a;return W|0}function ft(b,d){b=+b;d=d|0;var e=0,f=0,g=0.0,j=0,k=0.0,l=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;e=i;i=i+24|0;f=e|0;do{if(b<0.0){g=0.0}else{if(b<=1.0){g=b;break}g=1.0}}while(0);j=c[5163]|0;if((j|0)==99){b=(+h[2706]/3.0+g*+h[2707])*6.283185307179586;k=+h[2705];if(k!=1.0){l=+R(+g,+(1.0/k))}else{l=g}k=(1.0-l)*l*+h[2708]*.5;n=+S(+b);o=+T(+b);b=l+k*(n*-.14861+o*1.78277);p=d|0;h[p>>3]=b;q=l+k*(n*-.29227-o*.90649);r=d+8|0;h[r>>3]=q;o=l+n*1.97294*k;s=d+16|0;h[s>>3]=o;do{if(b>1.0){h[p>>3]=1.0}else{if(b>=0.0){break}h[p>>3]=0.0}}while(0);do{if(q>1.0){h[r>>3]=1.0}else{if(q>=0.0){break}h[r>>3]=0.0}}while(0);if(o>1.0){h[s>>3]=1.0;i=e;return}if(o>=0.0){i=e;return}h[s>>3]=0.0;i=e;return}else if((j|0)==100){if(g<0.0){h[d>>3]=+h[(c[5173]|0)+8>>3];h[d+8>>3]=+h[(c[5173]|0)+16>>3];h[d+16>>3]=+h[(c[5173]|0)+24>>3];i=e;return}s=c[5172]|0;if(g>1.0){r=s-1|0;h[d>>3]=+h[(c[5173]|0)+(r<<5)+8>>3];h[d+8>>3]=+h[(c[5173]|0)+(r<<5)+16>>3];h[d+16>>3]=+h[(c[5173]|0)+(r<<5)+24>>3];i=e;return}L9731:do{if((s|0)>1){r=c[5173]|0;p=0;t=s-1|0;L9733:while(1){u=p;while(1){if((u|0)==(t|0)){w=t;x=r;break L9731}y=(u+t|0)/2&-1;if(+h[r+(y<<5)>>3]<g){u=y+1|0}else{p=u;t=y;continue L9733}}}}else{w=0;x=c[5173]|0}}while(0);s=x+(w<<5)+8|0;o=+h[x+(w<<5)>>3];if(o==g){h[d>>3]=+h[s>>3];h[d+8>>3]=+h[x+(w<<5)+16>>3];h[d+16>>3]=+h[x+(w<<5)+24>>3];i=e;return}else{t=w-1|0;q=+h[x+(t<<5)>>3];b=(g-q)/(o-q);q=+h[x+(t<<5)+8>>3];h[d>>3]=q+b*(+h[s>>3]-q);q=+h[x+(t<<5)+16>>3];h[d+8>>3]=q+b*(+h[x+(w<<5)+16>>3]-q);q=+h[x+(t<<5)+24>>3];h[d+16>>3]=q+b*(+h[x+(w<<5)+24>>3]-q);i=e;return}}else if((j|0)==114){h[d>>3]=+fu(c[5164]|0,g);h[d+8>>3]=+fu(c[5165]|0,g);h[d+16>>3]=+fu(c[5166]|0,g);i=e;return}else if((j|0)==102){c[5182]=2;h[2592]=g;h[2593]=0.0;e4(c[5178]|0,f);if((a[1960]&1)!=0){uf(-1,86464,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=f|0;x=c[w>>2]|0;if((x|0)==1){z=+(c[f+8>>2]|0)}else if((x|0)==3){z=+uz(c[f+8>>2]|0,0)}else if((x|0)==2){z=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(z<0.0){A=0.0}else{A=z>1.0?1.0:z}c[5260]=2;h[2631]=g;h[2632]=0.0;e4(c[5256]|0,f);if((a[1960]&1)!=0){uf(-1,85592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[w>>2]|0;if((x|0)==3){B=+uz(c[f+8>>2]|0,0)}else if((x|0)==1){B=+(c[f+8>>2]|0)}else if((x|0)==2){B=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(B<0.0){C=0.0}else{C=B>1.0?1.0:B}c[5338]=2;h[2670]=g;h[2671]=0.0;e4(c[5334]|0,f);if((a[1960]&1)!=0){uf(-1,84488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[w>>2]|0;if((x|0)==1){D=+(c[f+8>>2]|0)}else if((x|0)==3){D=+uz(c[f+8>>2]|0,0)}else if((x|0)==2){D=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(D<0.0){E=0.0}else{E=D>1.0?1.0:D}h[d>>3]=A;h[d+8>>3]=C;h[d+16>>3]=E;i=e;return}else if((j|0)==103){E=+R(+g,+(1.0/+h[2705]));h[d+16>>3]=E;h[d+8>>3]=E;h[d>>3]=E;i=e;return}else{cf(c[m>>2]|0,87488,(v=i,i=i+24|0,c[v>>2]=179392,c[v+8>>2]=272,c[v+16>>2]=j<<24>>24,v)|0);i=e;return}}function fu(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0,g=0.0,h=0.0;d=i;if((a|0)<0){e=1.0-b;f=-a|0}else{e=b;f=a}do{if((f|0)==18){g=+P(+(+S(+(e*360.0*.017453292519943295))))}else if((f|0)==33){g=+P(+(e*2.0+-.5))}else if((f|0)==0){h=0.0;i=d;return+h}else if((f|0)==25){g=+P(+(e*3.0+-2.0))}else if((f|0)==10){g=+S(+(e*90.0*.017453292519943295))}else if((f|0)==2){h=1.0;i=d;return+h}else if((f|0)==11){g=+P(+(e+-.5))}else if((f|0)==31){if(e<=.42){h=0.0;i=d;return+h}if(e<.92){g=e*2.0+-.84;break}else{h=1.0;i=d;return+h}}else if((f|0)==15){g=+T(+(e*360.0*.017453292519943295))}else if((f|0)==16){g=+S(+(e*360.0*.017453292519943295))}else if((f|0)==26){g=e*1.5+-.5}else if((f|0)==21){g=e*3.0}else if((f|0)==14){g=+P(+(+S(+(e*180.0*.017453292519943295))))}else if((f|0)==19){g=+P(+(+T(+(e*720.0*.017453292519943295))))}else if((f|0)==20){g=+P(+(+S(+(e*720.0*.017453292519943295))))}else if((f|0)==23){g=e*3.0+-2.0}else if((f|0)==24){g=+P(+(e*3.0+-1.0))}else if((f|0)==28){g=+P(+(e*1.5+-.5))}else if((f|0)==3){g=e}else if((f|0)==22){g=e*3.0+-1.0}else if((f|0)==29){g=+P(+(e*1.5+-1.0))}else if((f|0)==27){g=e*1.5+-1.0}else if((f|0)==1){h=.5;i=d;return+h}else if((f|0)==30){if(e<=.25){h=0.0;i=d;return+h}if(e<.57){g=e/.32+-.78125;break}else{h=1.0;i=d;return+h}}else if((f|0)==34){g=e*2.0}else if((f|0)==35){g=e*2.0+-.5}else if((f|0)==5){g=e*e*e}else if((f|0)==6){g=e*e*e*e}else if((f|0)==9){g=+T(+(e*90.0*.017453292519943295))}else if((f|0)==36){g=e*2.0+-1.0}else if((f|0)==4){g=e*e}else if((f|0)==12){b=e*2.0+-1.0;g=b*b}else if((f|0)==32){if(e<=.42){g=e*4.0;break}if(e>.92){g=e/.08-11.5;break}else{g=e*-2.0+1.84;break}}else if((f|0)==7){g=+Q(+e)}else if((f|0)==13){g=+T(+(e*180.0*.017453292519943295))}else if((f|0)==8){g=+Q(+(+Q(+e)))}else if((f|0)==17){g=+P(+(+T(+(e*360.0*.017453292519943295))))}else{cf(c[m>>2]|0,143136,(v=i,i=i+8|0,c[v>>2]=(c[5162]|0)-1,v)|0);bd(1);return 0.0}}while(0);if(g<=0.0){h=0.0;i=d;return+h}h=g<1.0?g:1.0;i=d;return+h}function fv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aO=0.0,aP=0,aQ=0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0,aY=0,aZ=0,a_=0.0,a$=0,a0=0,a1=0.0,a2=0.0,a3=0,a4=0.0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bx=0,by=0,bz=0,bA=0,bB=0.0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0.0,bY=0,bZ=0,b_=0.0,b$=0.0,b0=0.0,b1=0.0,b2=0.0,b3=0.0,b5=0.0,b6=0.0,b7=0.0,b8=0,b9=0,ca=0,cb=0.0,cc=0.0,cd=0.0,ce=0.0,cf=0.0,cg=0,ch=0,ci=0.0,cj=0,ck=0.0,cl=0.0,cm=0.0,cn=0.0,co=0.0,cp=0.0,cq=0.0,cr=0.0,cs=0.0,ct=0.0,cu=0.0,cv=0.0,cw=0.0,cx=0.0,cy=0.0,cz=0.0,cA=0.0,cB=0,cC=0,cD=0.0,cE=0,cF=0,cH=0,cI=0.0,cJ=0,cL=0,cP=0,cQ=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0.0,c7=0.0,c8=0,c9=0,da=0,db=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0.0,dk=0.0,dl=0,dm=0.0,dn=0,dp=0,dq=0.0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0.0,dx=0.0,dy=0,dA=0,dB=0,dC=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0.0,dR=0.0,dS=0,dT=0,dU=0,dV=0,dW=0.0,dX=0,dY=0,dZ=0,d_=0;f=i;i=i+1992|0;j=f|0;k=f+48|0;l=f+96|0;n=f+104|0;o=f+112|0;p=f+120|0;q=f+128|0;r=f+144|0;s=f+160|0;t=f+168|0;u=f+176|0;w=f+184|0;x=f+192|0;y=f+200|0;z=f+208|0;A=f+216|0;B=f+224|0;C=f+240|0;D=f+256|0;E=f+264|0;F=f+272|0;G=f+312|0;H=f+328|0;I=f+336|0;J=f+344|0;K=f+384|0;L=f+400|0;M=f+424|0;N=f+432|0;O=f+440|0;Q=f+448|0;R=f+456|0;U=f+464|0;V=f+472|0;W=f+480|0;X=f+488|0;Y=f+496|0;$=f+504|0;ab=f+512|0;ac=f+520|0;ad=f+528|0;ae=f+536|0;af=f+544|0;ag=f+552|0;ah=f+560|0;ai=f+568|0;aj=f+576|0;ak=f+584|0;al=f+600|0;am=f+608|0;an=f+616|0;ao=f+624|0;ap=f+632|0;aq=f+648|0;ar=f+664|0;as=f+672|0;at=f+680|0;au=f+688|0;av=f+696|0;aw=f+704|0;ax=f+712|0;ay=f+728|0;az=f+736|0;aA=f+864|0;aB=f+872|0;aC=f+880|0;aD=f+1912|0;aE=f+1920|0;aF=f+1928|0;aG=f+1936|0;aH=c[3524]|0;aJ=+g[3536]*.017453292519943295;aK=+S(+aJ);aL=+T(+aJ);uE(3136,0,24);uE(3176,0,32);h[401]=1.0;uE(3216,0,32);h[406]=1.0;h[391]=aK;aJ=-0.0-aL;h[392]=aJ;h[395]=aL;h[396]=aK;aL=+g[3538]*.017453292519943295;aM=+S(+aL);aO=+T(+aL);aL=-0.0-aO;aP=az;aQ=0;aR=aK;aK=aJ;aJ=0.0;aS=0.0;while(1){aT=aK*0.0;aU=aJ*0.0;aV=aS*0.0;h[az+(aQ<<5)>>3]=aR+0.0+aT+aU+aV;aW=aR*0.0+0.0;h[az+(aQ<<5)+8>>3]=aW+aM*aK+aO*aJ+aV;h[az+(aQ<<5)+16>>3]=aW+aK*aL+aM*aJ+aV;h[az+(aQ<<5)+24>>3]=aS+(aW+aT+aU);aX=aQ+1|0;if((aX|0)>=4){break}aQ=aX;aR=+h[3128+(aX<<5)>>3];aK=+h[3136+(aX<<5)>>3];aJ=+h[3144+(aX<<5)>>3];aS=+h[3152+(aX<<5)>>3]}c[782]=c[aP>>2];c[783]=c[aP+4>>2];c[784]=c[aP+8>>2];c[785]=c[aP+12>>2];c[786]=c[aP+16>>2];c[787]=c[aP+20>>2];c[788]=c[aP+24>>2];c[789]=c[aP+28>>2];aQ=az+32|0;c[790]=c[aQ>>2];c[3164>>2]=c[aQ+4>>2];c[3168>>2]=c[aQ+8>>2];c[3172>>2]=c[aQ+12>>2];c[3176>>2]=c[aQ+16>>2];c[3180>>2]=c[aQ+20>>2];c[3184>>2]=c[aQ+24>>2];c[3188>>2]=c[aQ+28>>2];aX=az+64|0;c[798]=c[aX>>2];c[3196>>2]=c[aX+4>>2];c[3200>>2]=c[aX+8>>2];c[3204>>2]=c[aX+12>>2];c[3208>>2]=c[aX+16>>2];c[3212>>2]=c[aX+20>>2];c[3216>>2]=c[aX+24>>2];c[3220>>2]=c[aX+28>>2];aY=az+96|0;c[806]=c[aY>>2];c[3228>>2]=c[aY+4>>2];c[3232>>2]=c[aY+8>>2];c[3236>>2]=c[aY+12>>2];c[3240>>2]=c[aY+16>>2];c[3244>>2]=c[aY+20>>2];c[3248>>2]=c[aY+24>>2];c[3252>>2]=c[aY+28>>2];aS=+g[3534]*.5;aZ=0;do{aJ=+h[3128+(aZ<<5)>>3];aK=+h[3136+(aZ<<5)>>3];aR=aK*0.0;aM=+h[3144+(aZ<<5)>>3];aL=aM*0.0;aO=+h[3152+(aZ<<5)>>3];aU=aO*0.0;h[az+(aZ<<5)>>3]=aS*aJ+0.0+aR+aL+aU;aT=aJ*0.0+0.0;h[az+(aZ<<5)+8>>3]=aT+aS*aK+aL+aU;aK=aT+aR;h[az+(aZ<<5)+16>>3]=aK+aS*aM+aU;h[az+(aZ<<5)+24>>3]=aO+(aK+aL);aZ=aZ+1|0;}while((aZ|0)<4);c[782]=c[aP>>2];c[783]=c[aP+4>>2];c[784]=c[aP+8>>2];c[785]=c[aP+12>>2];c[786]=c[aP+16>>2];c[787]=c[aP+20>>2];c[788]=c[aP+24>>2];c[789]=c[aP+28>>2];c[790]=c[aQ>>2];c[3164>>2]=c[aQ+4>>2];c[3168>>2]=c[aQ+8>>2];c[3172>>2]=c[aQ+12>>2];c[3176>>2]=c[aQ+16>>2];c[3180>>2]=c[aQ+20>>2];c[3184>>2]=c[aQ+24>>2];c[3188>>2]=c[aQ+28>>2];c[798]=c[aX>>2];c[3196>>2]=c[aX+4>>2];c[3200>>2]=c[aX+8>>2];c[3204>>2]=c[aX+12>>2];c[3208>>2]=c[aX+16>>2];c[3212>>2]=c[aX+20>>2];c[3216>>2]=c[aX+24>>2];c[3220>>2]=c[aX+28>>2];c[806]=c[aY>>2];c[3228>>2]=c[aY+4>>2];c[3232>>2]=c[aY+8>>2];c[3236>>2]=c[aY+12>>2];c[3240>>2]=c[aY+16>>2];c[3244>>2]=c[aY+20>>2];c[3248>>2]=c[aY+24>>2];c[3252>>2]=c[aY+28>>2];if((a[30528]&1)!=0){uk(83256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((a[624]&1)==0){aY=c[34]|0;aS=+h[64664+(aY*688&-1)>>3];a_=aS-(+h[64672+(aY*688&-1)>>3]-aS)*+h[77]}else{aS=+h[77];if((a[64788]&1)==0){a_=aS;break}aL=+_(+aS);a_=aL/+h[8100]}}while(0);h[7076]=a_;aY=c[200]|0;L9870:do{if((c[64916+(aY*688&-1)>>2]|0)==0){if((c[64916+((c[144]|0)*688&-1)>>2]|0)==0){a$=0}else{a0=7282;break}while(1){if(a$>>>0>=8){break}if((a[65036+(a$*688&-1)|0]&1)!=0){a0=7282;break L9870}if((a[65037+(a$*688&-1)|0]&1)==0){a$=a$+1|0}else{a0=7282;break L9870}}aX=c[34]|0;aL=+h[64664+(aX*688&-1)>>3];h[5279]=aL;aS=+h[64672+(aX*688&-1)>>3];h[6915]=aS;a1=aL;a2=aS}else{a0=7282}}while(0);do{if((a0|0)==7282){a$=c[34]|0;aS=+h[64664+(a$*688&-1)>>3];if((c[64656+(a$*688&-1)>>2]&2|0)==0){h[5279]=aS<a_?aS:a_;aL=+h[64672+(a$*688&-1)>>3];h[6915]=aL>a_?aL:a_;a1=aS;a2=aL;break}else{h[5279]=aS>a_?aS:a_;aL=+h[64672+(a$*688&-1)>>3];h[6915]=aL<a_?aL:a_;a1=aS;a2=aL;break}}}while(0);if(+h[64664+(aY*688&-1)>>3]==+h[64672+(aY*688&-1)>>3]){uk(175032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aY=c[144]|0;if(+h[64664+(aY*688&-1)>>3]==+h[64672+(aY*688&-1)>>3]){uk(141592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(a1==a2){uk(126608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}aY=c[(c[3524]|0)+104>>2]|0;if((aY|0)!=0){cS[aY&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);aY=c[3524]|0;if((c[aY+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[aY+8>>2]|0)-1;c[13882]=0;c[13883]=(c[aY+12>>2]|0)-1;a[25280]=0;cM[c[aY+168>>2]&511](1);aY=c[3524]|0;c[1100]=0;a$=aY+24|0;aX=aY+28|0;a2=+h[4524];if(a2<0.0){a3=0;a4=+h[3817]}else{a1=+h[3817];a3=~~(a2*+((c[aY+20>>2]|0)>>>0>>>0)+a1*+((c[aX>>2]|0)>>>0>>>0));a4=a1}c[9002]=a3;a1=+h[4525];a3=~~(a1*a4*+((c[a$>>2]|0)>>>0>>>0)*1.25);c[9022]=a3;aQ=aY+16|0;aP=c[aQ>>2]|0;if(a3>>>0<aP>>>0){c[9022]=~~(a1*+(aP>>>0>>>0))}aP=(d|0)>0;if(aP){a3=0;aZ=0;az=0;a5=b;while(1){a6=c[a5+16>>2]|0;do{if((a6|0)==0){a7=aZ;a9=a3}else{if((a[a6]|0)==0){a7=aZ;a9=a3;break}if((a[a5+22|0]&1)!=0){a7=aZ;a9=a3;break}ba=lp(a6)|0;a7=(ba|0)>(aZ|0)?ba:aZ;a9=a3+1|0}}while(0);do{if((c[11690]|0)==0){bb=a7;bc=a9}else{a6=a[35888]|0;if((a6&1)==0){bb=a7;bc=a9;break}ba=c[a5+256>>2]|0;if((ba|0)==0){bb=a7;bc=a9;break}else{bd=0;be=0;bf=ba;bg=a6}while(1){do{if((bg&1)==0){bh=be;bi=bd}else{if((a[bf+8|0]|0)==0){bh=be;bi=bd;break}a6=bf+9|0;ba=lp(a6)|0;bj=b4(a6|0,73808)|0;a6=ba-bj|0;bh=((ba|0)!=(bj|0)&1)+be|0;bi=(a6|0)>(bd|0)?a6:bd}}while(0);a6=c[bf>>2]|0;if((a6|0)==0){break}bd=bi;be=bh;bf=a6;bg=a[35888]|0}bb=(bi|0)>(a7|0)?bi:a7;bc=bh+a9|0}}while(0);a6=az+1|0;if((a6|0)<(d|0)){a3=bc;aZ=bb;az=a6;a5=c[a5>>2]|0}else{bk=bc;bl=bb;break}}}else{bk=0;bl=0}c[6962]=bk;c[8712]=bl;a1=+(ga(36288,ay)|0);bl=~~(a1-(+h[4524]+2.0));a1=+(c[ay>>2]|0);h[4487]=a1;bk=c[8712]|0;if((bl|0)>(bk|0)){c[8712]=bl;bm=bl}else{bm=bk}bk=bm+4|0;bm=aY+20|0;bl=aa(bk,c[bm>>2]|0);bb=c[9002]|0;bc=bl+bb|0;c[9028]=bc;bl=c[8786]|0;a5=(bl|0)==3;a4=+h[4395];do{if(a5){az=~~(a4*+((c[aY+8>>2]|0)>>>0>>>0)+.5);c[7938]=az;bn=az}else{az=c[bm>>2]|0;if(a4<0.0){aZ=(c[aX>>2]|0)+(az<<1)|0;c[7938]=aZ;bn=aZ;break}else{aZ=~~(a4*+(az>>>0>>>0)+.5);c[7938]=aZ;bn=aZ;break}}}while(0);aZ=c[6598]|0;az=(aZ|0)==3;if(az){bo=~~(+h[3301]*+((c[aY+8>>2]|0)>>>0>>>0)+.5)}else{bo=~~(+g[178]*+((c[aY+8>>2]|0)>>>0>>>0)- +(c[bm>>2]<<1>>>0>>>0)- +((c[aX>>2]|0)>>>0>>>0))}c[7939]=bo;a3=c[6962]|0;c[9014]=a3;c[9024]=1;a9=c[9339]|0;bh=(a9|0)>0;if((a3|0)>(a9|0)&bh){c[9014]=a9;a7=((a3-1|0)/(a9|0)&-1)+1|0;c[9024]=a7;bp=a9;bq=a7}else{bp=a3;bq=1}a7=a[36120]&1;bi=a7<<24>>24==0;do{if(bi){br=bp;bs=bc;bt=bq}else{if(!(((c[9031]|0)-1|0)>>>0<2&(c[9032]|0)==1)){br=bp;bs=bc;bt=bq;break}if((a3|0)>0){bg=bo-bn|0;bf=(bg>>>0)/((aa(c[bm>>2]|0,bk)+bb|0)>>>0)>>>0;be=a3-1|0;bd=((be|0)/(((bf|0)==0?1:bf)|0)&-1)+1|0;bf=(bd|0)>(a9|0)&bh?a9:bd;c[9014]=bf;bd=((be|0)/(bf|0)&-1)+1|0;c[9024]=bd;be=(bg|0)/(bd|0)&-1;c[9028]=be;br=bf;bs=be;bt=bd;break}else{c[9028]=0;c[9024]=0;c[9014]=0;br=0;bs=0;bt=0;break}}}while(0);bb=(c[14100]|0)==3;do{if(bb){bk=~~(+h[7052]*+((c[aY+12>>2]|0)>>>0>>>0)+.5);c[7940]=bk;bu=bk}else{a4=+h[7052];bk=c[aQ>>2]|0;if((c[5094]|0)!=0&a4>=0.0){bq=~~(a4*+(bk>>>0>>>0));c[7940]=bq;bu=bq;break}else{bq=~~(+(bk>>>0>>>0)*2.5+1.0);c[7940]=bq;bu=bq;break}}}while(0);do{if(a7<<24>>24!=0&(br|0)!=0){if(!(((c[9031]|0)-1|0)>>>0<2&(c[9032]|0)==1)){bv=bu;break}a4=+(aa(c[9022]|0,br)|0);bq=~~(+(bu|0)+(a4+a1*+((c[aQ>>2]|0)>>>0>>>0)));c[7940]=bq;bv=bq}else{bv=bu}}while(0);bu=c[1119]|0;L9970:do{if((bu|0)!=0){br=(c[1100]|0)+1|0;c[1100]=br;c[ay>>2]=0;a7=a[bu]|0;if(a7<<24>>24==0){break}else{bx=1;by=br;bz=a7}while(1){if(bz<<24>>24==92){a7=by+1|0;c[1100]=a7;bA=a7}else{bA=by}c[ay>>2]=bx;if(bx>>>0>=(uA(bu|0)|0)>>>0){break L9970}a7=a[bu+bx|0]|0;bx=bx+1|0;by=bA;bz=a7}}}while(0);bz=(c[1066]|0)==3;if(bz){bB=+h[535]*+((c[aY+12>>2]|0)>>>0>>>0)+.5}else{bB=+g[38]*+((c[aY+12>>2]|0)>>>0>>>0)- +((c[aQ>>2]|0)>>>0>>>0)*(+(c[1100]|0)+1.5)+-1.0}bA=~~bB;c[7941]=bA;do{if(bi){bC=bn;bD=bl;bE=aZ;bF=bo}else{by=c[9031]|0;if((by|0)==0){a0=7360}else if((by|0)==1|(by|0)==2){if((c[9032]|0)==3){a0=7360}else{bG=bt}}else{bG=bt}do{if((a0|0)==7360){bx=~~(+(((((bA-bv|0)>>>0)/((c[aQ>>2]|0)>>>0)>>>0)-1|0)>>>0>>>0)-a1);bu=(bx|0)>(a9|0)&bh?a9:bx;bx=(bu|0)==0?1:bu;c[ay>>2]=bx;if((a3|0)<=(bx|0)){bG=bt;break}bu=a3-1|0;a7=((bu|0)/(bx|0)&-1)+1|0;c[9024]=a7;c[9014]=((bu|0)/(a7|0)&-1)+1;bG=a7}}while(0);a7=by-1|0;bu=c[9032]|0;bx=(bu|0)!=3|a7>>>0>1;if(bx|az){bH=bx?aZ:3;bI=bo}else{bx=c[bm>>2]|0;br=((bo-bs|0)-aa(bG-1|0,bs)|0)+(bx<<1)|0;c[7939]=br;bH=aZ;bI=br}if(!(a7>>>0<2&(bu|0)==2)){bC=bn;bD=bl;bE=bH;bF=bI;break}if(a5){bC=bn;bD=3;bE=bH;bF=bI;break}bu=c[bm>>2]|0;a7=((bs+bn|0)+aa(bG-1|0,bs)|0)-(bu<<1)|0;c[7938]=a7;bC=a7;bD=bl;bE=bH;bF=bI}}while(0);bI=(c[5094]|0)==0;bH=c[18072]|0;do{if(bI&(bH|0)>0){bl=bA-bv|0;bs=bF-bC|0;if((bl|0)>(bs|0)){bG=(bl-bs|0)/2&-1;bn=bG+bv|0;c[7940]=bn;bm=bA-bG|0;c[7941]=bm;bJ=bF;bK=bC;bL=bm;bM=bn;break}else{bn=(bs-bl|0)/2&-1;bl=bn+bC|0;c[7938]=bl;bs=bF-bn|0;c[7939]=bs;bJ=bs;bK=bl;bL=bA;bM=bv;break}}else{bJ=bF;bK=bC;bL=bA;bM=bv}}while(0);bv=(bD|0)==3;if(bv){bN=bK}else{bD=~~(+(bK|0)+ +((c[aY+8>>2]|0)>>>0>>>0)*+g[184]);c[7938]=bD;bN=bD}bD=(bE|0)==3;if(bD){bO=bJ}else{bE=~~(+(bJ|0)+ +((c[aY+8>>2]|0)>>>0>>>0)*+g[184]);c[7939]=bE;bO=bE}if(bz){bP=bL}else{bE=~~(+(bL|0)+ +((c[aY+12>>2]|0)>>>0>>>0)*+g[44]);c[7941]=bE;bP=bE}if(bb){bQ=bM}else{bE=~~(+(bM|0)+ +((c[aY+12>>2]|0)>>>0>>>0)*+g[44]);c[7940]=bE;bQ=bE}bE=(bO+bN|0)/2&-1;c[186]=bE;aY=(bQ+bP|0)/2&-1;c[46]=aY;bM=bO-bN|0;bL=(bM<<2|0)/7&-1;c[180]=bL;bJ=bP-bQ|0;bK=(bJ<<2|0)/7&-1;c[40]=bK;if(bz|bb){bb=~~(+(bJ|0)/+g[3534]);c[40]=bb;bR=bb}else{bR=bK}if(bD|bv){bv=~~(+(bM|0)/+g[3534]);c[180]=bv;bS=bv}else{bS=bL}if((bR|0)==0){c[40]=1;bT=1}else{bT=bR}if((bS|0)==0){c[180]=1;bU=1}else{bU=bS}do{if(bI){if((c[(c[3524]|0)+96>>2]&128|0)==0){c[13542]=55520;bV=bU;bW=bT;break}else{c[13542]=0;bV=bU;bW=bT;break}}else{a1=+g[18074];do{if(a1!=0.0){do{if(a1<0.0){bS=c[200]|0;bB=+h[64672+(bS*688&-1)>>3]- +h[64664+(bS*688&-1)>>3];if(bB==0.0){a0=7392;break}bS=c[144]|0;bX=(-0.0-a1)*+P(+((+h[64672+(bS*688&-1)>>3]- +h[64664+(bS*688&-1)>>3])/bB))}else{a0=7392}}while(0);if((a0|0)==7392){bX=a1}if(!(bX>=.01&bX<=100.0)){bY=bU;bZ=bT;break}bB=+(bT|0);a4=+(bU|0);a2=bX*+((c[a$>>2]|0)>>>0>>>0)/+((c[aX>>2]|0)>>>0>>>0);if(bB/a4>a2){bS=~~(a4*a2);c[40]=bS;bY=bU;bZ=bS;break}else{bS=~~(bB/a2);c[180]=bS;bY=bS;bZ=bT;break}}else{bY=bU;bZ=bT}}while(0);c[13542]=31752;bV=bY;bW=bZ}}while(0);c[16536]=bN;c[16537]=bO;c[16364]=bQ;c[16365]=bP;bX=+h[5279];a1=+h[6915];c[16192]=~~bX;c[16193]=~~a1;a2=a1-bX;a1=2.0/a2*+g[3532];h[2]=a1;bP=c[144]|0;bB=+h[64664+(bP*688&-1)>>3];a4=2.0/(+h[64672+(bP*688&-1)>>3]-bB);h[21]=a4;bP=c[200]|0;a_=+h[64664+(bP*688&-1)>>3];aL=2.0/(+h[64672+(bP*688&-1)>>3]-a_);h[91]=aL;h[12]=0.0;h[68]=0.0;h[96]=0.0;do{if((bH|0)>1){do{if(a4>aL){aS=1.0-aL/a4;h[68]=aS;h[21]=aL;b_=aL;b$=0.0;b0=aL;b1=aS}else{if(aL<=a4){b_=aL;b$=0.0;b0=a4;b1=0.0;break}aS=1.0-a4/aL;h[96]=aS;h[91]=a4;b_=a4;b$=aS;b0=a4;b1=0.0}}while(0);if((bH|0)<=2){b2=a1;b3=b_;b5=b$;b6=b0;b7=b1;break}h[2]=b_;b2=b_;b3=b_;b5=b$;b6=b0;b7=b1}else{b2=a1;b3=aL;b5=0.0;b6=a4;b7=0.0}}while(0);a4=b2*a2*-.5+1.0;h[12]=a4;if(!bI){a2=+h[8255];aL=+h[8169];a1=(a2-a_)*b3+b5+-1.0;b1=(aL-bB)*b6+b7+-1.0;b0=a4+(0.0-bX)*b2+-1.0;b2=+h[403];bX=+h[391];a4=+h[395];b$=b0*+h[399];b_=+h[404];aS=+h[392];aK=+h[396];aO=b0*+h[400];aU=+h[406];aM=+h[394];aR=+h[398];aT=b0*+h[402];b0=aU+a1*aM+b1*aR+aT;aJ=b0==0.0?1.0e-5:b0;b0=+(bV|0);bV=~~((b2+a1*bX+b1*a4+b$)/aJ*b0)+bE|0;aW=+(bW|0);bW=~~((b_+a1*aS+b1*aK+aO)/aJ*aW)+aY|0;aJ=+h[8256];b1=+h[8170];a1=b5+b3*(aJ-a_)+-1.0;a_=b7+b6*(b1-bB)+-1.0;bB=aT+(aU+aM*a1+aR*a_);aR=bB==0.0?1.0e-5:bB;bI=~~(b0*((b$+(b2+bX*a1+a4*a_))/aR))+bE|0;bE=~~(aW*((aO+(b_+aS*a1+aK*a_))/aR))+aY|0;h[8269]=+(bI-bV|0)/(aJ-a2);h[8183]=+(bE-bW|0)/(b1-aL);c[16536]=bV;c[16537]=bI;c[16364]=bW;c[16365]=bE}bE=(e|0)!=0;if(!bE){do{if(a[31104]|0){if((dz()|0)!=0){b8=0;break}b8=(c[(c[3524]|0)+144>>2]|0)!=0&1}else{b8=0}}while(0);a[55536]=b8}fO(c[10818]|0,-1,3);b8=ax;c[b8>>2]=c[14084];c[b8+4>>2]=c[56340>>2];c[b8+8>>2]=c[56344>>2];c[b8+12>>2]=c[56348>>2];b8=c[14075]|0;do{if((c[14074]|0)!=0){aL=+h[7040];e=c[(c[3524]|0)+92>>2]|0;if(aL<0.0){cK[e&63](+h[3817]);break}else{cK[e&63](aL);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);e=c[(c[3524]|0)+64>>2]|0;if((b8|0)<-5){cM[e&511](-2)}else{cM[e&511](b8)}e=c[3524]|0;do{if((a[56328]&1)==0){if((c[e+96>>2]&1024|0)!=0){break}c[ax>>2]=1;c[ax+4>>2]=b8;a0=7425}else{a0=7425}}while(0);if((a0|0)==7425){fn(ax,e)}e=~~(+g[3536]/90.0);ax=c[200]|0;if((e+1&2|0)==0){aL=+h[64664+(ax*688&-1)>>3];h[14]=aL;b1=+h[64672+(ax*688&-1)>>3];h[3305]=b1;b8=c[144]|0;a2=+h[64672+(b8*688&-1)>>3];h[7088]=a2;b9=64664+(b8*688&-1)|0;ca=b8;cb=aL;cc=a2;cd=b1}else{b1=+h[64672+(ax*688&-1)>>3];h[14]=b1;a2=+h[64664+(ax*688&-1)>>3];h[3305]=a2;ax=c[144]|0;aL=+h[64664+(ax*688&-1)>>3];h[7088]=aL;b9=64672+(ax*688&-1)|0;ca=ax;cb=a2;cc=aL;cd=b1}b1=+h[b9>>3];h[5263]=b1;if((e&2|0)==0){h[13]=+h[64664+(ca*688&-1)>>3];ce=cd;cf=cb;cg=64672+(ca*688&-1)|0}else{h[13]=+h[64672+(ca*688&-1)>>3];ce=cb;cf=cd;cg=64664+(ca*688&-1)|0}h[3304]=+h[cg>>3];h[7089]=cf;h[5264]=ce;cg=+g[3538]>90.0;h[69]=cg?cf:ce;h[97]=cg?cc:b1;do{if((a[38984]&1)==0&(c[10026]|0)==0){fw(b,d,0,0)}else{if(!((c[5094]|0)!=0&(c[14088]|0)==0)){break}fw(b,d,3,0)}}while(0);if((a[38984]&1)==0&(c[10026]|0)==-1){fw(b,d,2,0)}cg=(c[5094]|0)==0;if(cg){b1=+h[7076];ca=c[200]|0;cc=+h[64664+(ca*688&-1)>>3];ce=+h[91];cf=+h[96];cd=(+h[14]-cc)*ce+cf+-1.0;e=c[144]|0;cb=+h[64664+(e*688&-1)>>3];aL=+h[21];a2=+h[68];aJ=(+h[13]-cb)*aL+a2+-1.0;aR=+h[5279];a_=+h[2];aK=+h[12];a1=(b1-aR)*a_+aK+-1.0;aS=+h[403];b_=+h[391];aO=+h[395];aW=+h[399];a4=a1*aW;bX=+h[406];b2=+h[394];b$=+h[398];b0=+h[402];bB=a1*b0;a1=bX+cd*b2+aJ*b$+bB;b9=c[180]|0;aM=+(b9|0);ax=c[186]|0;b8=~~((aS+cd*b_+aJ*aO+a4)/(a1==0.0?1.0e-5:a1)*aM)+ax|0;a1=cf+ce*(+h[7089]-cc)+-1.0;aJ=a2+aL*(+h[7088]-cb)+-1.0;cd=bB+(bX+b2*a1+b$*aJ);bW=~~(aM*((a4+(aS+b_*a1+aO*aJ))/(cd==0.0?1.0e-5:cd)))+ax|0;cd=cf+ce*(+h[3305]-cc)+-1.0;aJ=a2+aL*(+h[3304]-cb)+-1.0;a1=bB+(bX+b2*cd+b$*aJ);bI=~~(aM*((a4+(aS+b_*cd+aO*aJ))/(a1==0.0?1.0e-5:a1)))+ax|0;c[7938]=(b8|0)<(bW|0)?b8:bW;c[7939]=(bW|0)>(bI|0)?bW:bI;ch=ca;ci=cc;cj=e;ck=cb;cl=b1;cm=ce;cn=cf;co=aL;cp=a2;cq=aR;cr=a_;cs=aK;ct=aS;cu=b_;cv=aO;cw=aW;cx=bX;cy=b2;cz=b$;cA=b0;cB=b9;cC=ax}else{ax=c[200]|0;b0=+h[64664+(ax*688&-1)>>3];b9=c[144]|0;b$=+h[64664+(b9*688&-1)>>3];b2=+h[7076];bX=+h[91];aW=+h[96];aO=(b0-b0)*bX+aW+-1.0;b_=+h[21];aS=+h[68];aK=(b$-b$)*b_+aS+-1.0;a_=+h[5279];aR=+h[2];a2=+h[12];aL=(b2-a_)*aR+a2+-1.0;cf=+h[403];ce=+h[391];b1=+h[395];cb=+h[399];cc=aL*cb;a1=+h[404];aJ=+h[392];cd=+h[396];a4=aL*+h[400];aM=+h[406];bB=+h[394];aU=+h[398];aT=+h[402];b6=aL*aT;aL=aM+aO*bB+aK*aU+b6;b7=aL==0.0?1.0e-5:aL;e=c[180]|0;aL=+(e|0);ca=c[186]|0;b3=+(c[40]|0);bI=c[46]|0;b5=aW+bX*(+h[64672+(ax*688&-1)>>3]-b0)+-1.0;aV=aS+b_*(+h[64672+(b9*688&-1)>>3]-b$)+-1.0;cD=b6+(aM+bB*b5+aU*aV);b6=cD==0.0?1.0e-5:cD;c[7938]=~~((cf+aO*ce+aK*b1+cc)/b7*aL)+ca;c[7939]=~~(aL*((cc+(cf+ce*b5+b1*aV))/b6))+ca;c[7940]=~~(b3*((a4+(a1+aJ*b5+cd*aV))/b6))+bI;c[7941]=~~((a1+aO*aJ+aK*cd+a4)/b7*b3)+bI;ch=ax;ci=b0;cj=b9;ck=b$;cl=b2;cm=bX;cn=aW;co=b_;cp=aS;cq=a_;cr=aR;cs=a2;ct=cf;cu=ce;cv=b1;cw=cb;cx=aM;cy=bB;cz=aU;cA=aT;cB=e;cC=ca}if((c[1119]|0)!=0){if(cg){fx(4560,aA,aB,109288);cg=(c[aA>>2]|0)+(((c[7939]|0)+(c[7938]|0)|0)/2&-1)|0;ca=(c[aB>>2]|0)+(c[7941]|0)|0;cE=cg;cF=ca+aa(c[aH+20>>2]|0,c[1100]|0)|0}else{if((c[64916+(ch*688&-1)>>2]&4|0)==0){cH=0}else{ca=~~(+((c[(c[3524]|0)+24>>2]|0)>>>0>>>0)*+h[65056+(ch*688&-1)>>3]*((a[65072+(ch*688&-1)|0]&1)!=0?-1.0:1.0));cH=(ca|0)<0?0:ca}aT=(ci-ci)*cm+cn+-1.0;aU=(ck-ck)*co+cp+-1.0;bB=(cl-cq)*cr+cs+-1.0;cs=bB*cw;cw=bB*cA;cA=cx+aT*cy+aU*cz+cw;cr=cA==0.0?1.0e-5:cA;cA=+(cB|0);cB=~~((+h[404]+aT*+h[392]+aU*+h[396]+bB*+h[400])/cr*+(c[40]|0));ca=c[46]|0;bB=cn+cm*(+h[64672+(ch*688&-1)>>3]-ci)+-1.0;ci=cp+co*(+h[64672+(cj*688&-1)>>3]-ck)+-1.0;ck=cw+(cx+cy*bB+cz*ci);fx(4560,aA,aB,109288);cE=(c[aA>>2]|0)+(((~~(cA*((cs+(ct+cu*bB+cv*ci))/(ck==0.0?1.0e-5:ck)))+~~((ct+aT*cu+aU*cv+cs)/cr*cA)|0)+(cC<<1)|0)/2&-1)|0;cF=~~(+(((ca+cH|0)+cB|0)+(c[aB>>2]|0)|0)+ +((c[aH+16>>2]|0)>>>0>>>0)*(+(c[1100]|0)+1.0+-.5))}aB=a[4600]&1;do{if(aB<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;cB=c[(c[3524]|0)+88>>2]|0;if((cB|0)==0){break}cO[cB&255](179864)}}while(0);a[37456]=aB;fn(4488,aH);ln(cE,cF,c[1119]|0,1,0,0,c[1120]|0);if((c[1122]|0)!=0){cM[c[aH+64>>2]&511](-2)}a[37456]=0}L10120:do{if((c[1183]|0)!=0){fx(4816,aE,aF,109288);cF=c[aH+16>>2]|0;cE=(c[aE>>2]|0)+cF|0;if((c[1166]|0)==0){cI=+((((c[7941]|0)-cF|0)+(c[aF>>2]|0)|0)>>>0>>>0)}else{cI=+(cF>>>0>>>0)+(+g[44]*+h[64672+((c[144]|0)*688&-1)>>3]+ +(c[aF>>2]|0))}cF=~~cI;cG(aD|0);aB=aC|0;cB=c[1183]|0;cH=aN(aD|0)|0;bw(aB|0,1024,cB|0,cH|0);do{if((c[1164]|0)!=0){cH=aH+72|0;if((cO[c[cH>>2]&255](-270)|0)==0){break}cB=c[1184]|0;if((c[1166]|0)==0){ln(cE,cF,aB,2,0,-270,cB)}else{ln(cE,cF,aB,0,0,-270,cB)}cB=c[cH>>2]|0;cO[cB&255](0);break L10120}}while(0);cB=c[1184]|0;if((c[1166]|0)==0){ln(cE,cF,aB,0,0,0,cB);break}else{ln(cE,cF,aB,0,2,0,cB);break}}}while(0);do{if(!bE){if((a[55536]&1)==0){break}if(!(a[31104]|0)){break}if(!((a[54016]|0)!=110&(c[13506]|0)==0)){break}dD(2)}}while(0);fO(c[10818]|0,0,3);aD=c[10822]|0;aC=c[(c[3524]|0)+92>>2]|0;if((aC|0)!=0){cK[aC&63](+h[3817])}if((aD|0)!=0){aC=aD;do{if((c[aC+56>>2]|0)==0){fK(aC+8|0,at,au,202256);fp(~~+h[at>>3],~~+h[au>>3],aC)}aC=c[aC>>2]|0;}while((aC|0)!=0)}fy(0);cM[c[(c[3524]|0)+168>>2]&511](2);do{if((a[38984]&1)!=0){if((a[46752]&1)==0|bE){break}gs();c[225]=0;c[11605]=0;c[7625]=0}}while(0);if((a[36229]&1)==0){c[9010]=0;aC=c[9002]|0;c[9006]=aC;au=aH+20|0;at=c[8712]|0;c[8990]=aa(at+1|0,-(c[au>>2]|0)|0);c[8986]=-(c[au>>2]|0);aD=~~(+((c[au>>2]|0)>>>0>>>0)*(+h[4526]+ +(at+2|0)));c[8998]=aD;at=aC+(c[au>>2]|0)|0;c[8994]=at;cJ=0;cL=aC;cP=aD;cQ=at}else{at=c[9002]|0;aD=-at|0;c[9010]=aD;c[9006]=0;aC=aH+20|0;c[8990]=c[aC>>2];au=c[8712]|0;c[8986]=aa(au+1|0,c[aC>>2]|0);aF=~~(+((c[aC>>2]|0)>>>0>>>0)*(+(au+2|0)+ +h[4526]));c[8994]=aF;au=at+(c[aC>>2]|0)|0;c[8998]=au;cJ=aD;cL=0;cP=au;cQ=aF}c[9018]=(cL+cJ|0)/2&-1;cJ=c[9031]|0;L10163:do{if((a[36120]&1)==0){cT=0;cU=cP;a0=7507}else{do{if((cJ|0)==0){a0=7493}else if((cJ|0)==3){a0=7508;break L10163}else{if((c[9032]|0)!=1){a0=7493;break}cL=c[6962]|0;if((cL|0)<=0){cV=0;cW=cP;cX=c[aH+16>>2]|0;break}aF=c[7938]|0;au=(c[7939]|0)-aF|0;aD=(au|0)/(c[9028]|0)&-1;aC=(aD|0)<1?1:aD;c[9024]=aC;aD=cL-1|0;cL=(aD+aC|0)/(aC|0)&-1;c[9014]=cL;aC=c[9339]|0;if((cL|0)>(aC|0)&(aC|0)>0){c[9014]=aC;cY=aC}else{cY=cL}cL=(aD+cY|0)/(cY|0)&-1;c[9024]=cL;c[9028]=(au|0)/(cL|0)&-1;aD=aa(au,cP);au=((aD|0)/(aa(cQ+cP|0,cL)|0)&-1)+aF|0;cI=+g[44]*+((c[aH+12>>2]|0)>>>0>>>0);cA=cI+ +(aa(c[9022]|0,cY)|0);aF=c[aH+16>>2]|0;cV=~~(cA+(+h[4487]+2.0)*+(aF>>>0>>>0));cW=au;cX=aF}}while(0);L10174:do{if((a0|0)==7493){if((c[9044]|0)==0){aB=c[aH+16>>2]|0;cZ=((c[7941]|0)-(c[aH+24>>2]|0)|0)-aB|0;c_=aB}else{aB=(c[aH+24>>2]|0)+(c[7940]|0)|0;cA=+((aB+aa(c[9014]|0,c[9022]|0)|0)>>>0>>>0);aB=c[aH+16>>2]|0;cZ=~~(cA+ +h[4487]*+(aB>>>0>>>0));c_=aB}aB=(cJ|0)!=0;cF=c[9032]|0;if(aB&(cF|0)==3){cV=cZ;cW=((c[aH+28>>2]|0)+(c[7939]|0)|0)+cP|0;cX=c_;break}if(aB&(cF|0)==2){cV=cZ;cW=(c[aH+20>>2]<<1)+cP|0;cX=c_;break}if((c[9045]|0)==0){cV=cZ;cW=((c[aH+28>>2]|0)+(c[7938]|0)|0)+cP|0;cX=c_;break}do{if((c[6598]|0)==3){if((cJ-1|0)>>>0>=2){break}cV=cZ;cW=(((c[7939]|0)-cQ|0)+(c[9028]|0)|0)-(c[aH+20>>2]<<1)|0;cX=c_;break L10174}}while(0);cF=(c[7939]|0)-cQ|0;cV=cZ;cW=cF-aa((c[9024]|0)-1|0,c[9028]|0)|0;cX=c_}}while(0);c[56]=~~(+(cV|0)- +h[4487]*+(cX>>>0>>>0));cT=cV;cU=cW;a0=7507}}while(0);if((a0|0)==7507){if((cJ|0)==3){a0=7508}else{c$=cT;c0=cU;c1=cQ;c2=cP}}if((a0|0)==7508){fK(36136,ar,as,128552);c$=~~+h[as>>3];c0=~~+h[ar>>3];c1=c[8994]|0;c2=c[8998]|0}ar=(c1+c0|0)+aa((c[9024]|0)-1|0,c[9028]|0)|0;c[9335]=ar;c1=c0-c2|0;c[9334]=c1;cA=+(c$|0);c2=aH+16|0;c[9337]=~~(cA+ +((c[c2>>2]|0)>>>0>>>0)*+h[4487]);c[9336]=c$-aa(c[9014]|0,c[9022]|0);if((c1|0)<0){c[9334]=0;c3=0}else{c3=c1}c1=a[36120]|0;if((c1&1)==0|(a[36288]|0)==0){c4=c$;c5=c1}else{if((c[9330]|0)==3&+h[4666]<0.0){fn(36272,aH)}else{fn(37320,aH)}c1=aH+96|0;if((c[c1>>2]&32|0)==0){c6=0.0}else{c6=(a8(36288,94)|0)==0?0.0:.51}ln((c3+ar|0)/2&-1,~~(+(c[9337]|0)-(c6*.5+.5)*+((c[c2>>2]|0)>>>0>>>0)),36288,1,0,0,c[9329]|0);do{if((c[c1>>2]&32|0)==0){c7=c6}else{if((a8(36288,95)|0)==0){c7=c6;break}c7=c6+.3}}while(0);h[4487]=c7+ +h[4487];c6=c7*+((c[c2>>2]|0)>>>0>>>0);c[9336]=~~(+(c[9336]|0)-c6);cM[c[aH+64>>2]&511](-2);c4=~~(cA-c6);c5=a[36120]|0}c1=c[9059]|0;do{if((c5&1)!=0&(c1|0)>-3){ar=c[9336]|0;if((c[9337]|0)==(ar|0)){c8=c4;break}c3=~~(+h[4527]*.5*+((c[c2>>2]|0)>>>0>>>0));c[9336]=ar-(c3<<1);ar=c4-c3|0;c3=aq;c[c3>>2]=c[9068];c[c3+4>>2]=c[36276>>2];c[c3+8>>2]=c[36280>>2];c[c3+12>>2]=c[36284>>2];do{if((c[9058]|0)!=0){c6=+h[4532];c3=c[(c[3524]|0)+92>>2]|0;if(c6<0.0){cK[c3&63](+h[3817]);break}else{cK[c3&63](c6);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[4531]);c3=c[(c[3524]|0)+64>>2]|0;if((c1|0)<-5){cM[c3&511](-2)}else{cM[c3&511](c1)}c3=c[3524]|0;do{if((a[36264]&1)==0){if((c[c3+96>>2]&1024|0)!=0){c9=c3;break}c[aq>>2]=1;c[aq+4>>2]=c1;a0=7533}else{a0=7533}}while(0);if((a0|0)==7533){fn(aq,c3);c9=c[3524]|0}c$=c[c9+172>>2]|0;if((c$|0)!=0){cM[c$&511](0)}c$=aH+56|0;cN[c[c$>>2]&255](c[9334]|0,c[9336]|0);as=aH+60|0;cN[c[as>>2]&255](c[9334]|0,c[9337]|0);cN[c[as>>2]&255](c[9335]|0,c[9337]|0);cN[c[as>>2]&255](c[9335]|0,c[9336]|0);cN[c[as>>2]&255](c[9334]|0,c[9336]|0);cP=c[(c[3524]|0)+172>>2]|0;if((cP|0)!=0){cM[cP&511](1)}cN[c[c$>>2]&255](c[9334]|0,~~(+(c[9337]|0)- +h[4487]*+((c[c2>>2]|0)>>>0>>>0)));cN[c[as>>2]&255](c[9335]|0,~~(+(c[9337]|0)- +h[4487]*+((c[c2>>2]|0)>>>0>>>0)));c8=ar}else{c8=c4}}while(0);do{if((a[38984]&1)!=0&(c[9744]|0)==0){if((a[46752]&1)==0|bE){break}cM[c[(c[3524]|0)+168>>2]&511](6);gv(b,d);cM[c[(c[3524]|0)+168>>2]&511](7)}}while(0);c4=c8-((c[9022]|0)/2&-1)|0;c[56]=c4;do{if((d|0)==1){if((c[b+252>>2]|0)!=1){break}if((a[55536]&1)==0){break}if(!((c[b+12>>2]|0)==352|(c[7662]|0)==1)){break}c8=c[m>>2]|0;aI(94544,137,1,c8|0)}}while(0);if((c[11690]|0)==0&(a[55536]&1)!=0&(a[30641]|0)==100){c8=c[6952]|0;if((c8|0)!=0){uu(c8)}c[6952]=0;c[18084]=0;c[12904]=0;da=1}else{da=0}L10258:do{if(!(bE|aP^1)){c8=ap;c2=ap|0;c9=ap+4|0;aq=aG;c1=aG+4|0;c5=C;as=aG+40|0;c$=as;cP=aG|0;cQ=aG+16|0;cU=aG+32|0;cT=C|0;cJ=C+4|0;cW=aH+64|0;cV=B;cX=B|0;c_=B+4|0;cZ=aG+24|0;cY=j|0;cF=j+8|0;aB=j+16|0;cE=j+32|0;aF=j+40|0;au=k|0;cL=k+8|0;aD=k+16|0;aC=k+32|0;at=k+40|0;aE=aG+40|0;cB=r|0;cH=r+8|0;ca=r+4|0;cC=aG+44|0;aA=aG+48|0;cj=q;ch=q|0;cg=q+4|0;e=ak|0;b9=ak+4|0;ax=ak+8|0;bI=L|0;bW=K;b8=L+7|0;bV=K|0;aY=K+4|0;bH=J;bP=J+4|0;bQ=J+8|0;bO=J+16|0;bN=J|0;bZ=G;bY=G|0;bT=G+4|0;bU=F;aX=F+4|0;a$=F+8|0;by=F+16|0;bS=F|0;bR=c0;bL=c4;bv=0;bM=b;bD=1;while(1){if((a[55536]&1)==0){db=0}else{db=(a[bM+56|0]&1)!=0}if((c[bM+8>>2]|0)==4){dc=bv;dd=bL;de=bR}else{cM[c[(c[3524]|0)+168>>2]&511](6);if((a[55536]&1)!=0&(c[7662]|0)==1){i5(bM)}do{if((a[36120]&1)==0){df=0}else{bK=bM+16|0;bb=c[bK>>2]|0;if((bb|0)==0){df=0;break}if((a[bb]|0)==0){df=0;break}if((a[bM+22|0]&1)!=0){df=0;break}if((c[9330]|0)==0){cM[c[cW>>2]&511](-2)}else{fn(37320,aH)}bb=a[bM+20|0]&1;do{if(bb<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;bJ=c[(c[3524]|0)+88>>2]|0;if((bJ|0)==0){break}cO[bJ&255](179864)}}while(0);a[37456]=bb;fz(bR,bL,c[bK>>2]|0);a[37456]=0;df=1}}while(0);bJ=bM+24|0;bz=bM+64|0;c[c8>>2]=c[bz>>2];c[c8+4>>2]=c[bz+4>>2];c[c8+8>>2]=c[bz+8>>2];c[c8+12>>2]=c[bz+12>>2];bz=c[bM+28>>2]|0;bA=bJ|0;do{if((c[bA>>2]|0)!=0){c6=+h[bM+48>>3];bC=c[(c[3524]|0)+92>>2]|0;if(c6<0.0){cK[bC&63](+h[3817]);break}else{cK[bC&63](c6);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[bM+40>>3]);bC=c[(c[3524]|0)+64>>2]|0;if((bz|0)<-5){cM[bC&511](-2)}else{cM[bC&511](bz)}bC=bM+56|0;bF=c[3524]|0;do{if((a[bC]&1)==0){if((c[bF+96>>2]&1024|0)!=0){break}c[c2>>2]=1;c[c9>>2]=bz;a0=7580}else{a0=7580}}while(0);if((a0|0)==7580){a0=0;fn(ap,bF)}bz=bM+12|0;bl=c[bz>>2]|0;L10301:do{if((bl|0)==64){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}c[bM+32>>2]=-1;c[bA>>2]=1;do{if(df){if((a[bC]&1)!=0){fD(bM,bR,bL,-1);break}bs=c[13542]|0;bn=c[3524]|0;c[13542]=(c[bn+96>>2]&128|0)==0?55520:0;cM[c[bn+168>>2]&511](8);bn=(c[9018]|0)+bR|0;bm=c[13542]|0;if((bm|0)==0){a0=7690}else{bG=(c[bm>>2]|0)>(bn|0)&1;a5=(c[bm+4>>2]|0)<(bn|0)?bG|2:bG;bG=(c[bm+8>>2]|0)>(bL|0)?a5|4:a5;if((((c[bm+12>>2]|0)<(bL|0)?bG|8:bG)|0)==0){a0=7690}}if((a0|0)==7690){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bn,bL,-1)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bs}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}fE(bM,-1)}else if((bl|0)==225){do{if(df){if((a[bC]&1)!=0){fA(bM,bR,bL);break}bK=c[13542]|0;bb=c[3524]|0;c[13542]=(c[bb+96>>2]&128|0)==0?55520:0;cM[c[bb+168>>2]&511](8);bb=(c[9006]|0)+bR|0;c[M>>2]=(c[9010]|0)+bR;c[N>>2]=bL;c[O>>2]=bb;c[Q>>2]=bL;bb=c[3524]|0;if((fl(M,N,O,Q)|0)!=0){cN[c[bb+56>>2]&255](c[M>>2]|0,c[N>>2]|0);cN[c[bb+60>>2]&255](c[O>>2]|0,c[Q>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bK}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}bK=bM+260|0;bb=c[bK>>2]|0;bs=c[bb+12>>2]|0;bn=c[(c[bb>>2]|0)+12>>2]|0;bb=c[bM+88>>2]|0;bG=c[bM+92>>2]|0;c6=+h[bM+104>>3];cA=+h[bM+112>>3];bm=a[bM+120|0]|0;uD(bI|0,bM+121|0,23);a5=c[bM+144>>2]|0;c7=+h[bM+152>>3];aZ=c[bM+160>>2]|0;cI=+h[bM+168>>3];cr=+h[bM+176>>3];bo=c[bM+184>>2]|0;uD(bW|0,b8|0,16);do{if((bb|0)!=0){az=c[(c[3524]|0)+92>>2]|0;if(cA<0.0){cK[az&63](+h[3817]);break}else{cK[az&63](cA);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](c6);bb=c[(c[3524]|0)+64>>2]|0;if((bG|0)<-5){cM[bb&511](-2)}else{cM[bb&511](bG)}bb=c[3524]|0;do{if((bm&1)==0){if((c[bb+96>>2]&1024|0)!=0){break}c[bV>>2]=1;c[aY>>2]=bG;a0=7713}else{a0=7713}}while(0);if((a0|0)==7713){a0=0;fn(K,bb)}bG=c[200]|0;h[64776+(bG*688&-1)>>3]=+((c[7939]|0)-(c[7938]|0)|0)/(+h[64672+(bG*688&-1)>>3]- +h[64664+(bG*688&-1)>>3]);c[12912]=bo;c[12910]=0;if(c7>0.0){uE(bH|0,0,40);c[bP>>2]=2;c[bQ>>2]=2;h[bO>>3]=c7;c[bN>>2]=aZ;fN(J,H,I,123984);h[6458]=cI;h[6457]=cr;c[12910]=~~+h[H>>3]}if((c[(c[bK>>2]|0)+8>>2]|0)<=0){break}bG=bM+80|0;bm=a5;az=0;while(1){a3=bs+(az<<6)|0;bt=a3|0;do{if((c[bt>>2]|0)==2){dg=bm}else{ay=bn+(az<<6)|0;if((c[ay>>2]|0)==2){dg=bm;break}do{if((c[bG>>2]|0)==-3){a9=~~+h[bs+(az<<6)+32>>3];bh=43296;while(1){dh=c[bh>>2]|0;if((dh|0)==0){a0=7724;break}if((c[dh+4>>2]|0)==(a9|0)){a0=7725;break}else{bh=dh|0}}do{if((a0|0)==7724){a0=0;uD(bI|0,51521,23);uh(-1,79128,(v=i,i=i+8|0,c[v>>2]=a9,v)|0);uD(bZ|0,b8|0,16);di=0;dj=90.0;dk=15.0;dl=0;dm=0.0;dn=1;dp=0;dq=1.0;dr=-2}else if((a0|0)==7725){a0=0;bh=c[dh+16>>2]|0;aQ=c[dh+20>>2]|0;c6=+h[dh+32>>3];cA=+h[dh+40>>3];bi=a[dh+48|0]|0;uD(bI|0,dh+49|0,23);a7=c[dh+72>>2]|0;cs=+h[dh+80>>3];bu=c[dh+88>>2]|0;cv=+h[dh+96>>3];aU=+h[dh+104>>3];br=c[dh+112>>2]|0;uD(bZ|0,b8|0,16);if((bh|0)==0){di=br;dj=aU;dk=cv;dl=bu;dm=cs;dn=a7;dp=bi;dq=c6;dr=aQ;break}bh=c[(c[3524]|0)+92>>2]|0;if(cA<0.0){cK[bh&63](+h[3817]);di=br;dj=aU;dk=cv;dl=bu;dm=cs;dn=a7;dp=bi;dq=c6;dr=aQ;break}else{cK[bh&63](cA);di=br;dj=aU;dk=cv;dl=bu;dm=cs;dn=a7;dp=bi;dq=c6;dr=aQ;break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](dq);a9=c[(c[3524]|0)+64>>2]|0;if((dr|0)<-5){cM[a9&511](-2)}else{cM[a9&511](dr)}a9=c[3524]|0;do{if((dp&1)==0){if((c[a9+96>>2]&1024|0)!=0){break}c[bY>>2]=1;c[bT>>2]=dr;a0=7735}else{a0=7735}}while(0);if((a0|0)==7735){a0=0;fn(G,a9)}c[12912]=di;c[12910]=0;if(dm<=0.0){ds=dn;break}uE(bU|0,0,40);c[aX>>2]=2;c[a$>>2]=2;h[by>>3]=dm;c[bS>>2]=dl;fN(F,D,E,123984);h[6458]=dk;h[6457]=dj;c[12910]=~~+h[D>>3];ds=dn}else{fL(bM,a3);ds=bm}}while(0);if((c[bt>>2]|0)!=0){dg=ds;break}if((c[ay>>2]|0)!=0){dg=ds;break}c6=+h[64664+((c[200]|0)*688&-1)>>3];cs=+h[91];cv=+h[96];aU=(+h[bs+(az<<6)+8>>3]-c6)*cs+cv+-1.0;cA=+h[64664+((c[144]|0)*688&-1)>>3];cu=+h[21];aT=+h[68];ct=(+h[bs+(az<<6)+16>>3]-cA)*cu+aT+-1.0;ck=+h[5279];ci=+h[2];bB=+h[12];cz=(+h[bs+(az<<6)+24>>3]-ck)*ci+bB+-1.0;cy=+h[403];cx=+h[391];cw=+h[395];co=+h[399];cp=+h[404];cm=+h[392];cn=+h[396];cq=+h[400];cl=+h[406];aM=+h[394];cb=+h[398];b1=+h[402];ce=cl+aU*aM+ct*cb+cz*b1;cf=ce==0.0?1.0e-5:ce;ce=+(c[180]|0);aQ=c[186]|0;a2=+(c[40]|0);bi=c[46]|0;aR=cv+cs*(+h[bn+(az<<6)+8>>3]-c6)+-1.0;c6=aT+cu*(+h[bn+(az<<6)+16>>3]-cA)+-1.0;cA=bB+ci*(+h[bn+(az<<6)+24>>3]-ck)+-1.0;ck=cl+aM*aR+cb*c6+b1*cA;b1=ck==0.0?1.0e-5:ck;fm(~~((cy+aU*cx+ct*cw+cz*co)/cf*ce)+aQ|0,~~((cp+aU*cm+ct*cn+cz*cq)/cf*a2)+bi|0,~~(ce*((cy+cx*aR+cw*c6+co*cA)/b1))+aQ|0,~~(a2*((cp+cm*aR+cn*c6+cq*cA)/b1))+bi|0,ds);dg=ds}}while(0);bt=az+1|0;if((bt|0)<(c[(c[bK>>2]|0)+8>>2]|0)){bm=dg;az=bt}else{break}}}else if((bl|0)==416){c[bM+228>>2]=1;f3(bM,0)}else if((bl|0)==432){c[bM+228>>2]=2;f3(bM,0)}else if((bl|0)==295|(bl|0)==279|(bl|0)==311|(bl|0)==102|(bl|0)==86|(bl|0)==118|(bl|0)==137|(bl|0)==169|(bl|0)==252|(bl|0)==474|(bl|0)==257|(bl|0)==457|(bl|0)==489|(bl|0)==18){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}do{if(df){az=c[bM+32>>2]|0;if((a[bC]&1)!=0){fD(bM,bR,bL,az);break}bm=c[13542]|0;bK=c[3524]|0;c[13542]=(c[bK+96>>2]&128|0)==0?55520:0;cM[c[bK+168>>2]&511](8);bK=(c[9018]|0)+bR|0;bn=c[13542]|0;if((bn|0)==0){a0=7655}else{bs=(c[bn>>2]|0)>(bK|0)&1;bG=(c[bn+4>>2]|0)<(bK|0)?bs|2:bs;bs=(c[bn+8>>2]|0)>(bL|0)?bG|4:bG;if((((c[bn+12>>2]|0)<(bL|0)?bs|8:bs)|0)==0){a0=7655}}if((a0|0)==7655){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bK,bL,az)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bm}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}fE(bM,c[bM+32>>2]|0)}else if((bl|0)==368){if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}bm=c[c[bM+224>>2]>>2]|0;az=c[(c[3524]|0)+92>>2]|0;if((az|0)!=0){cK[az&63](+h[3817])}if((bm|0)==0){break}else{dt=bm}do{L10414:do{if((c[dt+56>>2]|0)==99){cr=(+h[dt+24>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;cI=(+h[dt+32>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;c7=(+h[dt+40>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;b1=+h[406]+cr*+h[394]+cI*+h[398]+c7*+h[402];cA=b1==0.0?1.0e-5:b1;bm=~~((+h[403]+cr*+h[391]+cI*+h[395]+c7*+h[399])/cA*+(c[180]|0))+(c[186]|0)|0;az=~~((+h[404]+cr*+h[392]+cI*+h[396]+c7*+h[400])/cA*+(c[40]|0))+(c[46]|0)|0;do{if((c[5094]|0)!=0){bK=c[13542]|0;if((bK|0)==0){break}bs=(c[bK>>2]|0)>(bm|0)&1;bn=(c[bK+4>>2]|0)<(bm|0)?bs|2:bs;bs=(c[bK+8>>2]|0)>(az|0)?bn|4:bn;if((((c[bK+12>>2]|0)<(az|0)?bs|8:bs)|0)!=0){break L10414}}}while(0);fp(bm,az,dt)}}while(0);dt=c[dt>>2]|0;}while((dt|0)!=0)}else if((bl|0)==400){c[bM+228>>2]=0;f3(bM,0)}else if((bl|0)==352){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}if(!((a[55536]&1)!=0&(c[7662]|0)!=1)){break}i5(bM);if(da){break}i3()}else if((bl|0)==153|(bl|0)==345|(bl|0)==33){if(df){ay=c[13542]|0;bs=c[3524]|0;c[13542]=(c[bs+96>>2]&128|0)==0?55520:0;cM[c[bs+168>>2]&511](8);bs=(c[9006]|0)+bR|0;c[al>>2]=(c[9010]|0)+bR;c[am>>2]=bL;c[an>>2]=bs;c[ao>>2]=bL;bs=c[3524]|0;if((fl(al,am,an,ao)|0)!=0){cN[c[bs+56>>2]&255](c[al>>2]|0,c[am>>2]|0);cN[c[bs+60>>2]&255](c[an>>2]|0,c[ao>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)==0){break L10301}}}while(0);ay=c[bM+260>>2]|0;bs=c[bM+64>>2]|0;do{if((a[55536]&1)==0){du=0}else{if((a[bM+239|0]&1)==0){du=0;break}du=+h[bM+72>>3]<0.0}}while(0);do{if(!((bs|0)!=3|du)){bK=c[bM+68>>2]|0;bn=(c[3524]|0)+144|0;if((c[bn>>2]|0)==0){break}c[e>>2]=3;c[b9>>2]=bK;h[ax>>3]=0.0;cM[c[bn>>2]&511](ak)}}while(0);if((ay|0)==0){break}else{dv=ay}do{bs=c[dv+12>>2]|0;bn=dv+8|0;if((c[bn>>2]|0)>0){bK=0;do{bG=bs+(bK<<6)|0;fL(bM,bG);a5=c[bG>>2]|0;L10451:do{if((a5|0)==0){cA=+h[bs+(bK<<6)+24>>3];c7=(+h[bs+(bK<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;cI=(+h[bs+(bK<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;cr=+h[5279];b1=+h[2];cq=+h[12];c6=(cA-cr)*b1+cq+-1.0;cn=+h[403]+c7*+h[391]+cI*+h[395];aR=+h[399];cm=+h[404]+c7*+h[392]+cI*+h[396];cp=+h[400];a2=+h[406]+c7*+h[394]+cI*+h[398];cI=+h[402];c7=a2+c6*cI;co=c7==0.0?1.0e-5:c7;c7=+(c[180]|0);bG=c[186]|0;aZ=~~((cn+c6*aR)/co*c7)+bG|0;cw=+(c[40]|0);bo=c[46]|0;bb=~~((cm+c6*cp)/co*cw)+bo|0;bt=c[34]|0;co=+h[64664+(bt*688&-1)>>3];c6=+h[64672+(bt*688&-1)>>3];if(co<c6){if(co>0.0|c6<0.0){a0=7602}else{a0=7601}}else{if(c6>0.0|co<0.0){a0=7602}else{a0=7601}}do{if((a0|0)==7601){a0=0;cx=(0.0-cr)*b1+cq+-1.0;cy=a2+cx*cI;ce=cy==0.0?1.0e-5:cy;dw=(cm+cx*cp)/ce;dx=(cn+cx*aR)/ce}else if((a0|0)==7602){a0=0;if(cA>0.0){if(co<0.0|co>cA){a0=7606}else{a0=7605}}else{if(co<cA|co>0.0){a0=7606}else{a0=7605}}if((a0|0)==7605){a0=0;ce=cq+b1*(co-cr)+-1.0;cx=a2+cI*ce;cy=cx==0.0?1.0e-5:cx;dw=(cm+cp*ce)/cy;dx=(cn+aR*ce)/cy;break}else if((a0|0)==7606){a0=0;cy=cq+b1*(c6-cr)+-1.0;ce=a2+cI*cy;cx=ce==0.0?1.0e-5:ce;dw=(cm+cp*cy)/cx;dx=(cn+aR*cy)/cx;break}}}while(0);a9=~~(cw*dw)+bo|0;bt=~~(c7*dx)+bG|0;c[8490]=bt;c[8488]=a9;c[ac>>2]=bt;c[ad>>2]=a9;c[ae>>2]=aZ;c[af>>2]=bb;a9=c[3524]|0;if((fl(ac,ad,ae,af)|0)!=0){cN[c[a9+56>>2]&255](c[ac>>2]|0,c[ad>>2]|0);cN[c[a9+60>>2]&255](c[ae>>2]|0,c[af>>2]|0)}c[8490]=aZ;c[8488]=bb}else if((a5|0)==1){a9=c[200]|0;aR=+h[64664+(a9*688&-1)>>3];cn=+h[64672+(a9*688&-1)>>3];cp=+h[bs+(bK<<6)+8>>3];if(aR<cn){if(cp<aR|cp>cn){break}}else{if(cp<cn|cp>aR){break}}a9=c[144]|0;cn=+h[64664+(a9*688&-1)>>3];cm=+h[64672+(a9*688&-1)>>3];cI=+h[bs+(bK<<6)+16>>3];if(cn<cm){if(cI<cn|cI>cm){break}}else{if(cI<cm|cI>cn){break}}a9=c[34]|0;cm=+h[64664+(a9*688&-1)>>3];a2=+h[64672+(a9*688&-1)>>3];if(cm<a2){if(cm>0.0|a2<0.0){a0=7624}else{a0=7619}}else{if(a2>0.0|cm<0.0){a0=7624}else{a0=7619}}do{if((a0|0)==7619){a0=0;cr=(cp-aR)*+h[91]+ +h[96]+-1.0;c6=(cI-cn)*+h[21]+ +h[68]+-1.0;b1=+h[5279];cq=+h[2];co=+h[12];cA=(0.0-b1)*cq+co+-1.0;cx=+h[403]+cr*+h[391]+c6*+h[395];cy=+h[399];ce=+h[404]+cr*+h[392]+c6*+h[396];cf=+h[400];cz=+h[406]+cr*+h[394]+c6*+h[398];c6=+h[402];cr=cz+cA*c6;ct=cr==0.0?1.0e-5:cr;cr=+(c[180]|0);a9=c[186]|0;bt=~~((cx+cA*cy)/ct*cr)+a9|0;aU=+(c[40]|0);a3=c[46]|0;bi=~~((ce+cA*cf)/ct*aU)+a3|0;ct=+h[bs+(bK<<6)+24>>3];if(ct>0.0){if(cm<=ct&cm>=0.0&cm!=0.0&cm!=ct){a0=7622}else{a0=7623}}else{if(cm<=0.0&cm>=ct&cm!=0.0&cm!=ct){a0=7622}else{a0=7623}}if((a0|0)==7622){a0=0;ct=(cm-b1)*cq+co+-1.0;cA=cz+ct*c6;ck=cA==0.0?1.0e-5:cA;dy=bi;dA=bt;dB=~~(aU*((ce+ct*cf)/ck))+a3|0;dC=~~(cr*((cx+ct*cy)/ck))+a9|0;break}else if((a0|0)==7623){a0=0;ck=(a2-b1)*cq+co+-1.0;co=cz+ck*c6;c6=co==0.0?1.0e-5:co;dy=bi;dA=bt;dB=~~(aU*((ce+ck*cf)/c6))+a3|0;dC=~~(cr*((cx+ck*cy)/c6))+a9|0;break}}else if((a0|0)==7624){a0=0;c6=+h[bs+(bK<<6)+24>>3];if(c6>0.0){if(cm<0.0|cm>c6){break L10451}if(a2<0.0|a2>c6){break L10451}}else{if(cm<c6|cm>0.0){break L10451}if(a2<c6|a2>0.0){break L10451}}c6=(cp-aR)*+h[91]+ +h[96]+-1.0;cy=(cI-cn)*+h[21]+ +h[68]+-1.0;ck=+h[5279];cx=+h[2];cr=+h[12];cf=(a2-ck)*cx+cr+-1.0;ce=+h[403]+c6*+h[391]+cy*+h[395];aU=+h[399];co=+h[404]+c6*+h[392]+cy*+h[396];cz=+h[400];cq=+h[406]+c6*+h[394]+cy*+h[398];cy=+h[402];c6=cq+cf*cy;b1=c6==0.0?1.0e-5:c6;c6=+(c[180]|0);a9=c[186]|0;ct=+(c[40]|0);a3=c[46]|0;cA=cr+cx*(cm-ck)+-1.0;ck=cq+cA*cy;cy=ck==0.0?1.0e-5:ck;dy=~~(ct*((co+cA*cz)/cy))+a3|0;dA=~~(c6*((ce+cA*aU)/cy))+a9|0;dB=~~((co+cf*cz)/b1*ct)+a3|0;dC=~~((ce+cf*aU)/b1*c6)+a9|0}}while(0);c[8490]=dA;c[8488]=dy;c[ag>>2]=dA;c[ah>>2]=dy;c[ai>>2]=dC;c[aj>>2]=dB;bb=c[3524]|0;if((fl(ag,ah,ai,aj)|0)!=0){cN[c[bb+56>>2]&255](c[ag>>2]|0,c[ah>>2]|0);cN[c[bb+60>>2]&255](c[ai>>2]|0,c[aj>>2]|0)}c[8490]=dC;c[8488]=dB}}while(0);bK=bK+1|0;}while((bK|0)<(c[bn>>2]|0))}dv=c[dv>>2]|0;}while((dv|0)!=0)}else if((bl|0)==51){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}do{if(df){if((a[bC]&1)!=0){fA(bM,bR,bL);break}ay=c[13542]|0;bn=c[3524]|0;c[13542]=(c[bn+96>>2]&128|0)==0?55520:0;cM[c[bn+168>>2]&511](8);bn=(c[9006]|0)+bR|0;c[R>>2]=(c[9010]|0)+bR;c[U>>2]=bL;c[V>>2]=bn;c[W>>2]=bL;bn=c[3524]|0;if((fl(R,U,V,W)|0)!=0){cN[c[bn+56>>2]&255](c[R>>2]|0,c[U>>2]|0);cN[c[bn+60>>2]&255](c[V>>2]|0,c[W>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}}while(0);if((a[38984]&1)==0){a0=7670}else{if((a[bM+236|0]&1)!=0){a0=7670}}do{if((a0|0)==7670){a0=0;if(db){fB(bM);break}else{fC(bM);break}}}while(0);do{if(df){ay=c[bM+32>>2]|0;if((a[bC]&1)!=0){fD(bM,bR,bL,ay);break}bn=c[13542]|0;bK=c[3524]|0;c[13542]=(c[bK+96>>2]&128|0)==0?55520:0;cM[c[bK+168>>2]&511](8);bK=(c[9018]|0)+bR|0;bs=c[13542]|0;if((bs|0)==0){a0=7678}else{a5=(c[bs>>2]|0)>(bK|0)&1;az=(c[bs+4>>2]|0)<(bK|0)?a5|2:a5;a5=(c[bs+8>>2]|0)>(bL|0)?az|4:az;if((((c[bs+12>>2]|0)<(bL|0)?a5|8:a5)|0)==0){a0=7678}}if((a0|0)==7678){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bK,bL,ay)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bn}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}fE(bM,c[bM+32>>2]|0)}else if((bl|0)==177|(bl|0)==184|(bl|0)==193|(bl|0)==209|(bl|0)==1){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}do{if(df){if((a[bC]&1)!=0){fA(bM,bR,bL);break}bn=c[13542]|0;ay=c[3524]|0;c[13542]=(c[ay+96>>2]&128|0)==0?55520:0;cM[c[ay+168>>2]&511](8);ay=(c[9006]|0)+bR|0;c[X>>2]=(c[9010]|0)+bR;c[Y>>2]=bL;c[$>>2]=ay;c[ab>>2]=bL;ay=c[3524]|0;if((fl(X,Y,$,ab)|0)!=0){cN[c[ay+56>>2]&255](c[X>>2]|0,c[Y>>2]|0);cN[c[ay+60>>2]&255](c[$>>2]|0,c[ab>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bn}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}if(db){fB(bM);break}else{fC(bM);break}}}while(0);do{if(df){bC=bv+1|0;if((bC|0)<(c[9014]|0)){dE=bC;dF=bL-(c[9022]|0)|0;dG=bR;break}else{dE=0;dF=c[56]|0;dG=(c[9028]|0)+bR|0;break}}else{dE=bv;dF=bL;dG=bR}}while(0);do{if((c[11690]|0)==0){dH=dE;dI=dF;dJ=dG}else{bC=c[bM+256>>2]|0;if((bC|0)==0){dH=dE;dI=dF;dJ=dG;break}bl=bJ;c[aq>>2]=c[bl>>2];c[aq+4>>2]=c[bl+4>>2];c[aq+8>>2]=c[bl+8>>2];c[aq+12>>2]=c[bl+12>>2];c[aq+16>>2]=c[bl+16>>2];c[aq+20>>2]=c[bl+20>>2];c[aq+24>>2]=c[bl+24>>2];c[aq+28>>2]=c[bl+28>>2];c[aq+32>>2]=c[bl+32>>2];c[aq+36>>2]=c[bl+36>>2];c[aq+40>>2]=c[bl+40>>2];c[aq+44>>2]=c[bl+44>>2];c[aq+48>>2]=c[bl+48>>2];c[aq+52>>2]=c[bl+52>>2];bl=(a[38984]&1)+(c[c1>>2]|0)|0;c[c1>>2]=bl;c[c5>>2]=c[c$>>2];c[c5+4>>2]=c[c$+4>>2];c[c5+8>>2]=c[c$+8>>2];c[c5+12>>2]=c[c$+12>>2];do{if((c[cP>>2]|0)!=0){cm=+h[cZ>>3];bA=c[(c[3524]|0)+92>>2]|0;if(cm<0.0){cK[bA&63](+h[3817]);break}else{cK[bA&63](cm);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[cQ>>3]);bA=c[(c[3524]|0)+64>>2]|0;if((bl|0)<-5){cM[bA&511](-2)}else{cM[bA&511](bl)}bA=c[3524]|0;do{if((a[cU]&1)==0){if((c[bA+96>>2]&1024|0)!=0){break}c[cT>>2]=1;c[cJ>>2]=bl;a0=7778}else{a0=7778}}while(0);if((a0|0)==7778){a0=0;fn(C,bA)}do{if((a[36120]&1)==0){dK=dE;dL=dF;dM=dG}else{bl=bM+16|0;bF=c[bl>>2]|0;if((bF|0)==0){dK=dE;dL=dF;dM=dG;break}if((a[bF]|0)==0){dK=dE;dL=dF;dM=dG;break}if((a[bM+22|0]&1)!=0){dK=dE;dL=dF;dM=dG;break}if((a[46752]&1)!=0){dK=dE;dL=dF;dM=dG;break}if((a[35888]&1)!=0){dK=dE;dL=dF;dM=dG;break}cM[c[cW>>2]&511](-2);fz(dG,dF,c[bl>>2]|0);c[cV>>2]=c[c$>>2];c[cV+4>>2]=c[c$+4>>2];c[cV+8>>2]=c[c$+8>>2];c[cV+12>>2]=c[c$+12>>2];bl=c[c1>>2]|0;do{if((c[cP>>2]|0)!=0){cm=+h[cZ>>3];bF=c[(c[3524]|0)+92>>2]|0;if(cm<0.0){cK[bF&63](+h[3817]);break}else{cK[bF&63](cm);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[cQ>>3]);bF=c[(c[3524]|0)+64>>2]|0;if((bl|0)<-5){cM[bF&511](-2)}else{cM[bF&511](bl)}bF=c[3524]|0;do{if((a[cU]&1)==0){if((c[bF+96>>2]&1024|0)!=0){break}c[cX>>2]=1;c[c_>>2]=bl;a0=7795}else{a0=7795}}while(0);if((a0|0)==7795){a0=0;fn(B,bF)}bl=c[bz>>2]|0;if((bl|0)==33|(bl|0)==1|(bl|0)==153|(bl|0)==345|(bl|0)==225|(bl|0)==177|(bl|0)==193|(bl|0)==209){bn=c[13542]|0;ay=c[3524]|0;c[13542]=(c[ay+96>>2]&128|0)==0?55520:0;cM[c[ay+168>>2]&511](8);ay=(c[9006]|0)+dG|0;c[x>>2]=(c[9010]|0)+dG;c[y>>2]=dF;c[z>>2]=ay;c[A>>2]=dF;ay=c[3524]|0;if((fl(x,y,z,A)|0)!=0){cN[c[ay+56>>2]&255](c[x>>2]|0,c[y>>2]|0);cN[c[ay+60>>2]&255](c[z>>2]|0,c[A>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bn}else if((bl|0)==295|(bl|0)==279|(bl|0)==311|(bl|0)==102|(bl|0)==86|(bl|0)==118|(bl|0)==169|(bl|0)==137|(bl|0)==252|(bl|0)==474|(bl|0)==257|(bl|0)==457|(bl|0)==489|(bl|0)==18){bn=c[bM+32>>2]|0;ay=c[13542]|0;bK=c[3524]|0;c[13542]=(c[bK+96>>2]&128|0)==0?55520:0;cM[c[bK+168>>2]&511](8);bK=(c[9018]|0)+dG|0;a5=c[13542]|0;if((a5|0)==0){a0=7802}else{bs=(c[a5>>2]|0)>(bK|0)&1;az=(c[a5+4>>2]|0)<(bK|0)?bs|2:bs;bs=(c[a5+8>>2]|0)>(dF|0)?az|4:az;if((((c[a5+12>>2]|0)<(dF|0)?bs|8:bs)|0)==0){a0=7802}}if((a0|0)==7802){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bK,dF,bn)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}else if((bl|0)==51){ay=c[13542]|0;bn=c[3524]|0;c[13542]=(c[bn+96>>2]&128|0)==0?55520:0;cM[c[bn+168>>2]&511](8);bn=(c[9006]|0)+dG|0;c[s>>2]=(c[9010]|0)+dG;c[t>>2]=dF;c[u>>2]=bn;c[w>>2]=dF;bn=c[3524]|0;if((fl(s,t,u,w)|0)!=0){cN[c[bn+56>>2]&255](c[s>>2]|0,c[t>>2]|0);cN[c[bn+60>>2]&255](c[u>>2]|0,c[w>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}else if((bl|0)==64){bl=c[13542]|0;ay=c[3524]|0;c[13542]=(c[ay+96>>2]&128|0)==0?55520:0;cM[c[ay+168>>2]&511](8);ay=(c[9018]|0)+dG|0;bn=c[13542]|0;if((bn|0)==0){a0=7809}else{bK=(c[bn>>2]|0)>(ay|0)&1;bs=(c[bn+4>>2]|0)<(ay|0)?bK|2:bK;bK=(c[bn+8>>2]|0)>(dF|0)?bs|4:bs;if((((c[bn+12>>2]|0)<(dF|0)?bK|8:bK)|0)==0){a0=7809}}if((a0|0)==7809){a0=0;cR[c[(c[3524]|0)+80>>2]&127](ay,dF,-1)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bl}bl=dE+1|0;if((bl|0)<(c[9014]|0)){dK=bl;dL=dF-(c[9022]|0)|0;dM=dG;break}else{dK=0;dL=c[56]|0;dM=(c[9028]|0)+dG|0;break}}}while(0);bA=bM+22|0;bl=bM+32|0;ay=dM;bK=dL;bn=dK;bs=bC;while(1){do{if((a[35888]&1)==0){dN=bn;dO=bK;dP=ay}else{if((a[bs+8|0]|0)==0){dN=bn;dO=bK;dP=ay;break}do{if((a[36120]&1)!=0){if((a[bA]&1)!=0){break}cM[c[cW>>2]&511](-2);fz(ay,bK,bs+9|0)}}while(0);do{if(db){if((c[aE>>2]|0)!=6){a0=7839;break}cm=+h[bs+48>>3];a5=c[34]|0;az=(a[66852]&1)==0;do{if((a[64788+(a5*688&-1)|0]&1)==0){if(az){dQ=cm;break}if(cm>0.0){a2=+_(+cm);dQ=a2/+h[8358];break}else{dQ=+h[8341];break}}else{if(az){dQ=+Z(+(cm*+h[64800+(a5*688&-1)>>3]));break}if(+h[64792+(a5*688&-1)>>3]==+h[8357]){dQ=cm;break}dQ=cm*+h[64800+(a5*688&-1)>>3]/+h[8358]}}while(0);cm=+h[8341];do{if(cm<dQ){a2=+h[8342];if(a2<=dQ){dR=+((a[20668]|0)==112&1|0);break}cn=(dQ-cm)/(a2-cm);if((a[20668]|0)==112){dR=cn;break}dR=1.0-cn}else{dR=+((a[20668]|0)!=112&1|0)}}while(0);a5=(c[3524]|0)+144|0;if((c[a5>>2]|0)==0){break}c[cB>>2]=5;h[cH>>3]=dR;c[ca>>2]=0;cM[c[a5>>2]&511](r)}else{a0=7839}}while(0);do{if((a0|0)==7839){a0=0;cm=+h[aA>>3];a5=c[c1>>2]|0;if((a5|0)==-6){c[c1>>2]=0;a[cU]=1;dS=0}else{dS=a5}L10667:do{if((a[30080]&1)==0){a0=7855}else{if((a[35888]&1)==0){a0=7855;break}a5=dS+1|0;c[c1>>2]=a5;az=dS+2|0;bm=43280;while(1){dT=c[bm>>2]|0;if((dT|0)==0){break}if((c[dT+4>>2]|0)==(az|0)){a0=7846;break}else{bm=dT|0}}if((a0|0)==7846){a0=0;bm=(a[dT+40|0]&1)==0;dU=bm?1:c[dT+48>>2]|0;dV=bm?c[dT+12>>2]|0:c[dT+52>>2]|0;dW=+h[dT+56>>3];dX=a5;break}bm=c[8798]|0;bb=(bm|0)>0;aZ=az;L10676:while(1){bG=43264;while(1){dY=c[bG>>2]|0;if((dY|0)==0){break}if((c[dY+4>>2]|0)==(aZ|0)){break L10676}else{bG=dY|0}}bG=aZ-1|0;if(!((aZ|0)>(bm|0)&bb)){dU=1;dV=bG;dW=cm;dX=a5;break L10667}aZ=((bG|0)%(bm|0)&-1)+1|0}bm=c[dY+48>>2]|0;aZ=c[dY+52>>2]|0;cn=+h[dY+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){dU=bm;dV=aZ;dW=cn;dX=a5;break}bb=(a[dY+40|0]&1)==0;dU=bb?1:bm;dV=bb?c[dY+12>>2]|0:aZ;dW=cn;dX=a5}}while(0);L10685:do{if((a0|0)==7855){a0=0;aZ=dS+1|0;c[c1>>2]=aZ;bb=c[8798]|0;bm=(bb|0)>0;az=dS+2|0;L10687:while(1){bG=43264;while(1){dZ=c[bG>>2]|0;if((dZ|0)==0){break}if((c[dZ+4>>2]|0)==(az|0)){break L10687}else{bG=dZ|0}}bG=az-1|0;if(!((az|0)>(bb|0)&bm)){dU=1;dV=bG;dW=cm;dX=aZ;break L10685}az=((bG|0)%(bb|0)&-1)+1|0}bb=c[dZ+48>>2]|0;az=c[dZ+52>>2]|0;cn=+h[dZ+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){dU=bb;dV=az;dW=cn;dX=aZ;break}bm=(a[dZ+40|0]&1)==0;dU=bm?1:bb;dV=bm?c[dZ+12>>2]|0:az;dW=cn;dX=aZ}}while(0);c[aE>>2]=dU;c[cC>>2]=dV;h[aA>>3]=dW;c[cj>>2]=c[c$>>2];c[cj+4>>2]=c[c$+4>>2];c[cj+8>>2]=c[c$+8>>2];c[cj+12>>2]=c[c$+12>>2];do{if((c[cP>>2]|0)!=0){cm=+h[cZ>>3];az=c[(c[3524]|0)+92>>2]|0;if(cm<0.0){cK[az&63](+h[3817]);break}else{cK[az&63](cm);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[cQ>>3]);az=c[(c[3524]|0)+64>>2]|0;if((dX|0)<-5){cM[az&511](-2)}else{cM[az&511](dX)}az=c[3524]|0;if((a[cU]&1)==0){if((c[az+96>>2]&1024|0)!=0){break}c[ch>>2]=1;c[cg>>2]=dX}fn(q,az)}}while(0);if((a[36120]&1)==0){dN=bn;dO=bK;dP=ay;break}if((a[bA]&1)!=0){dN=bn;dO=bK;dP=ay;break}az=c[bz>>2]|0;if((az|0)==33|(az|0)==1|(az|0)==51|(az|0)==153|(az|0)==345|(az|0)==225|(az|0)==177|(az|0)==193|(az|0)==209|(az|0)==352){bm=c[13542]|0;bb=c[3524]|0;c[13542]=(c[bb+96>>2]&128|0)==0?55520:0;cM[c[bb+168>>2]&511](8);bb=(c[9006]|0)+ay|0;c[l>>2]=(c[9010]|0)+ay;c[n>>2]=bK;c[o>>2]=bb;c[p>>2]=bK;bb=c[3524]|0;if((fl(l,n,o,p)|0)!=0){cN[c[bb+56>>2]&255](c[l>>2]|0,c[n>>2]|0);cN[c[bb+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bm}else if((az|0)==295|(az|0)==279|(az|0)==311|(az|0)==102|(az|0)==86|(az|0)==118|(az|0)==169|(az|0)==137|(az|0)==252|(az|0)==474|(az|0)==257|(az|0)==457|(az|0)==489|(az|0)==18){bm=c[bl>>2]|0;bb=c[13542]|0;a5=c[3524]|0;c[13542]=(c[a5+96>>2]&128|0)==0?55520:0;cM[c[a5+168>>2]&511](8);a5=(c[9018]|0)+ay|0;bG=c[13542]|0;if((bG|0)==0){a0=7882}else{bo=(c[bG>>2]|0)>(a5|0)&1;a9=(c[bG+4>>2]|0)<(a5|0)?bo|2:bo;bo=(c[bG+8>>2]|0)>(bK|0)?a9|4:a9;if((((c[bG+12>>2]|0)<(bK|0)?bo|8:bo)|0)==0){a0=7882}}if((a0|0)==7882){a0=0;cR[c[(c[3524]|0)+80>>2]&127](a5,bK,bm)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bb}else if((az|0)==64){az=c[13542]|0;bb=c[3524]|0;c[13542]=(c[bb+96>>2]&128|0)==0?55520:0;cM[c[bb+168>>2]&511](8);bb=(c[9018]|0)+ay|0;bm=c[13542]|0;if((bm|0)==0){a0=7886}else{a5=(c[bm>>2]|0)>(bb|0)&1;bo=(c[bm+4>>2]|0)<(bb|0)?a5|2:a5;a5=(c[bm+8>>2]|0)>(bK|0)?bo|4:bo;if((((c[bm+12>>2]|0)<(bK|0)?a5|8:a5)|0)==0){a0=7886}}if((a0|0)==7886){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bb,bK,-1)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=az}az=bn+1|0;if((az|0)<(c[9014]|0)){dN=az;dO=bK-(c[9022]|0)|0;dP=ay;break}else{dN=0;dO=c[56]|0;dP=(c[9028]|0)+ay|0;break}}}while(0);bF=c[bz>>2]|0;do{if((bF|0)==153|(bF|0)==345|(bF|0)==225|(bF|0)==33){if((c[11690]&2|0)==0){fG(bs,aG);break}az=bs+44|0;if((c[az>>2]|0)<=0){break}bb=bs+4|0;a5=0;do{bm=c[bb>>2]|0;bo=bm+(a5<<6)+24|0;cm=+h[bo>>3];cn=(+h[bm+(a5<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;a2=(+h[bm+(a5<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;cI=+h[5279];aR=+h[2];cp=+h[12];c7=(cm-cI)*aR+cp+-1.0;cw=+h[403]+cn*+h[391]+a2*+h[395];c6=+h[399];b1=+h[404]+cn*+h[392]+a2*+h[396];aU=+h[400];cf=+h[405]+cn*+h[393]+a2*+h[397];ce=+h[401];ct=+h[406]+cn*+h[394]+a2*+h[398];a2=+h[402];cn=ct+c7*a2;cz=cn==0.0?1.0e-5:cn;h[cY>>3]=(cw+c7*c6)/cz;h[cF>>3]=(b1+c7*aU)/cz;h[aB>>3]=(cf+c7*ce)/cz;h[cE>>3]=cm;c[aF>>2]=0;cm=(0.0-cI)*aR+cp+-1.0;cp=ct+cm*a2;a2=cp==0.0?1.0e-5:cp;h[au>>3]=(cw+cm*c6)/a2;h[cL>>3]=(b1+cm*aU)/a2;h[aD>>3]=(cf+cm*ce)/a2;h[aC>>3]=0.0;c[at>>2]=0;h[aC>>3]=+h[bo>>3];do{if((a[38984]&1)==0){a0=7898}else{if((a[46752]&1)==0){a0=7898;break}gt(j,k,aG)}}while(0);if((a0|0)==7898){a0=0;un(j,k,aG,as)}a5=a5+1|0;}while((a5|0)<(c[az>>2]|0))}else if((bF|0)==177|(bF|0)==193|(bF|0)==209|(bF|0)==1|(bF|0)==352){fF(bs,aG)}else if((bF|0)==51){fF(bs,aG);a0=7903}else if((bF|0)==295|(bF|0)==279|(bF|0)==311|(bF|0)==102|(bF|0)==86|(bF|0)==118|(bF|0)==169|(bF|0)==137|(bF|0)==252|(bF|0)==257|(bF|0)==457|(bF|0)==489|(bF|0)==64|(bF|0)==18){a0=7903}}while(0);if((a0|0)==7903){a0=0;fG(bs,aG)}bF=c[bs>>2]|0;if((bF|0)==0){dH=dN;dI=dO;dJ=dP;break}else{ay=dP;bK=dO;bn=dN;bs=bF}}}}while(0);cM[c[(c[3524]|0)+168>>2]&511](7);dc=dH;dd=dI;de=dJ}if((bD|0)>=(d|0)){break L10258}bR=de;bL=dd;bv=dc;bM=c[bM>>2]|0;bD=bD+1|0}}}while(0);if(da){i3()}da=a[38984]|0;do{if((da&1)!=0&(c[9744]|0)==1){if((a[46752]&1)==0|bE){d_=da;break}cM[c[(c[3524]|0)+168>>2]&511](6);gv(b,d);cM[c[(c[3524]|0)+168>>2]&511](7);d_=a[38984]|0}else{d_=da}}while(0);da=c[10026]|0;do{if((d_&1)!=0|(da|0)==1){fw(b,d,0,1)}else{if((da|0)!=-1){break}fw(b,d,1,1)}}while(0);if((c[5094]|0)!=0&(c[14088]|0)==1){fw(b,d,3,1)}do{if(!bE){if((a[55536]&1)==0){break}if(!(a[31104]|0)){break}if(!((a[54016]|0)!=110&(c[13506]|0)==1)){break}dD(2)}}while(0);fO(c[10818]|0,1,3);bE=c[10822]|0;d=c[(c[3524]|0)+92>>2]|0;if((d|0)!=0){cK[d&63](+h[3817])}if((bE|0)!=0){d=bE;do{if((c[d+56>>2]|0)==1){fK(d+8|0,av,aw,202256);fp(~~+h[av>>3],~~+h[aw>>3],d)}d=c[d>>2]|0;}while((d|0)!=0)}fy(1);d=c[200]|0;dW=+h[64664+(d*688&-1)>>3];aw=c[144]|0;dR=+h[64664+(aw*688&-1)>>3];dQ=+h[91];dx=+h[96];dw=(dW-dW)*dQ+dx+-1.0;dj=+h[21];dk=+h[68];dm=(dR-dR)*dj+dk+-1.0;dq=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;a2=+h[403];ce=+h[391];cm=a2+dw*ce;cf=+h[395];aU=dm*cf;b1=dq*+h[399];c6=+h[404];cw=+h[392];cp=c6+dw*cw;ct=+h[396];aR=dm*ct;cI=dq*+h[400];cz=+h[406];c7=+h[394];cn=cz+dw*c7;dw=+h[398];co=dm*dw;dm=dq*+h[402];dq=cn+co+dm;cy=dq==0.0?1.0e-5:dq;dq=+(c[180]|0);av=c[186]|0;bE=~~((cm+aU+b1)/cy*dq)+av|0;cA=+(c[40]|0);b=c[46]|0;da=~~((cp+aR+cI)/cy*cA)+b|0;c[18064]=bE;c[18062]=da;cy=(+h[64672+(d*688&-1)>>3]-dW)*dQ+dx+-1.0;dx=cz+cy*c7+co+dm;co=dx==0.0?1.0e-5:dx;c[18060]=(~~((a2+cy*ce+aU+b1)/co*dq)+av|0)-bE;c[18058]=(~~((c6+cy*cw+aR+cI)/co*cA)+b|0)-da;co=(+h[64672+(aw*688&-1)>>3]-dR)*dj+dk+-1.0;dk=cn+co*dw+dm;dm=dk==0.0?1.0e-5:dk;c[18056]=(~~((cm+co*cf+b1)/dm*dq)+av|0)-bE;c[18054]=(~~((cp+co*ct+cI)/dm*cA)+b|0)-da;do{if(a[31104]|0){da=c[(c[3524]|0)+140>>2]|0;if((da|0)==0){break}cS[da&511]()}}while(0);lh();if((a[38984]&1)==0){i=f;return}if((a[46752]&1)==0){i=f;return}uu(c[7628]|0);c[7628]=0;c[7624]=0;c[7625]=0;uu(c[11608]|0);c[11608]=0;c[11604]=0;c[11605]=0;uu(c[228]|0);c[228]=0;c[224]=0;c[225]=0;i=f;return}function fw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,_=0,$=0,aa=0.0,ab=0,ac=0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0,aF=0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0.0,aY=0.0,aZ=0.0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0.0,bn=0.0,bo=0,bp=0.0,bq=0.0,br=0.0,bs=0,bt=0.0,bu=0.0,bv=0.0,bw=0,bx=0,by=0,bz=0.0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0.0,bG=0,bH=0.0,bI=0.0,bJ=0,bK=0,bL=0.0,bM=0.0,bN=0.0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0.0,bU=0.0,bV=0.0,bW=0.0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0;j=i;i=i+1392|0;k=j|0;l=j+16|0;m=j+32|0;n=j+80|0;o=j+128|0;p=j+176|0;q=j+224|0;r=j+272|0;s=j+320|0;t=j+368|0;u=j+416|0;v=j+464|0;w=j+512|0;x=j+560|0;y=j+608|0;z=j+640|0;A=j+672|0;B=j+720|0;C=j+768|0;D=j+816|0;E=j+864|0;F=j+912|0;G=j+960|0;H=j+1008|0;I=j+1056|0;J=j+1064|0;K=j+1072|0;L=j+1080|0;M=j+1088|0;N=j+1136|0;Q=j+1184|0;R=j+1232|0;S=j+1280|0;T=j+1328|0;U=j+1376|0;V=j+1384|0;W=c[3524]|0;X=c[13542]|0;Z=c[11692]|0;_=(Z|0)!=0;L10803:do{if(_&(c[5094]|0)!=0){if((c[14088]|0)!=(f|0)){break}$=l;c[$>>2]=c[14084];c[$+4>>2]=c[56340>>2];c[$+8>>2]=c[56344>>2];c[$+12>>2]=c[56348>>2];$=c[14075]|0;do{if((c[14074]|0)!=0){aa=+h[7040];ab=c[W+92>>2]|0;if(aa<0.0){cK[ab&63](+h[3817]);break}else{cK[ab&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);ab=c[(c[3524]|0)+64>>2]|0;if(($|0)<-5){cM[ab&511](-2)}else{cM[ab&511]($)}ab=c[3524]|0;do{if((a[56328]&1)==0){if((c[ab+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=$;ac=7953}else{ac=7953}}while(0);if((ac|0)==7953){fn(l,ab)}do{if((c[11692]&15|0)==15){$=c[(c[3524]|0)+172>>2]|0;if(($|0)==0){break}cM[$&511](0)}}while(0);aa=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ad=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ae=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;af=+h[406]+aa*+h[394]+ad*+h[398]+ae*+h[402];ag=af==0.0?1.0e-5:af;cN[c[(c[3524]|0)+56>>2]&255](~~((+h[403]+aa*+h[391]+ad*+h[395]+ae*+h[399])/ag*+(c[180]|0))+(c[186]|0)|0,~~((+h[404]+aa*+h[392]+ad*+h[396]+ae*+h[400])/ag*+(c[40]|0))+(c[46]|0)|0);ag=(+h[7089]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ae=(+h[7088]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ad=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aa=+h[406]+ag*+h[394]+ae*+h[398]+ad*+h[402];af=aa==0.0?1.0e-5:aa;ab=~~((+h[403]+ag*+h[391]+ae*+h[395]+ad*+h[399])/af*+(c[180]|0))+(c[186]|0)|0;$=~~((+h[404]+ag*+h[392]+ae*+h[396]+ad*+h[400])/af*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&2|0)==0){cN[c[ah+56>>2]&255](ab,$)}else{cN[c[ah+60>>2]&255](ab,$)}af=(+h[3305]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ad=(+h[3304]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ae=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;ag=+h[406]+af*+h[394]+ad*+h[398]+ae*+h[402];aa=ag==0.0?1.0e-5:ag;$=~~((+h[403]+af*+h[391]+ad*+h[395]+ae*+h[399])/aa*+(c[180]|0))+(c[186]|0)|0;ab=~~((+h[404]+af*+h[392]+ad*+h[396]+ae*+h[400])/aa*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&8|0)==0){cN[c[ah+56>>2]&255]($,ab)}else{cN[c[ah+60>>2]&255]($,ab)}aa=(+h[5264]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ae=(+h[5263]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ad=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;af=+h[406]+aa*+h[394]+ae*+h[398]+ad*+h[402];ag=af==0.0?1.0e-5:af;ab=~~((+h[403]+aa*+h[391]+ae*+h[395]+ad*+h[399])/ag*+(c[180]|0))+(c[186]|0)|0;$=~~((+h[404]+aa*+h[392]+ae*+h[396]+ad*+h[400])/ag*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&4|0)==0){cN[c[ah+56>>2]&255](ab,$)}else{cN[c[ah+60>>2]&255](ab,$)}ag=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ad=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ae=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aa=+h[406]+ag*+h[394]+ad*+h[398]+ae*+h[402];af=aa==0.0?1.0e-5:aa;$=~~((+h[403]+ag*+h[391]+ad*+h[395]+ae*+h[399])/af*+(c[180]|0))+(c[186]|0)|0;ab=~~((+h[404]+ag*+h[392]+ad*+h[396]+ae*+h[400])/af*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&1|0)==0){cN[c[ah+56>>2]&255]($,ab)}else{cN[c[ah+60>>2]&255]($,ab)}if((c[11692]&15|0)!=15){break}ab=c[(c[3524]|0)+172>>2]|0;if((ab|0)==0){break}cM[ab&511](1)}else{if(!_){break}af=+h[7076];ae=+h[64664+((c[200]|0)*688&-1)>>3];ad=+h[91];ag=+h[96];aa=(+h[14]-ae)*ad+ag+-1.0;ai=+h[64664+((c[144]|0)*688&-1)>>3];aj=+h[21];ak=+h[68];al=(+h[13]-ai)*aj+ak+-1.0;am=(af- +h[5279])*+h[2]+ +h[12]+-1.0;an=+h[403];ao=+h[391];ap=+h[395];aq=am*+h[399];ar=+h[404];as=+h[392];at=+h[396];au=am*+h[400];av=+h[405];aw=+h[393];ax=+h[397];ay=am*+h[401];az=+h[406];aA=+h[394];aB=+h[398];aC=am*+h[402];am=az+aa*aA+al*aB+aC;aD=am==0.0?1.0e-5:am;h[m>>3]=(an+aa*ao+al*ap+aq)/aD;h[m+8>>3]=(ar+aa*as+al*at+au)/aD;h[m+16>>3]=(av+aa*aw+al*ax+ay)/aD;h[m+32>>3]=af;c[m+40>>2]=0;aD=(+h[7089]-ae)*ad+ag+-1.0;al=(+h[7088]-ai)*aj+ak+-1.0;aa=az+aD*aA+al*aB+aC;am=aa==0.0?1.0e-5:aa;h[n>>3]=(an+aD*ao+al*ap+aq)/am;h[n+8>>3]=(ar+aD*as+al*at+au)/am;h[n+16>>3]=(av+aD*aw+al*ax+ay)/am;h[n+32>>3]=af;c[n+40>>2]=0;am=(+h[3305]-ae)*ad+ag+-1.0;al=(+h[3304]-ai)*aj+ak+-1.0;aD=az+am*aA+al*aB+aC;aa=aD==0.0?1.0e-5:aD;h[o>>3]=(an+am*ao+al*ap+aq)/aa;h[o+8>>3]=(ar+am*as+al*at+au)/aa;h[o+16>>3]=(av+am*aw+al*ax+ay)/aa;h[o+32>>3]=af;c[o+40>>2]=0;aa=(+h[5264]-ae)*ad+ag+-1.0;ag=(+h[5263]-ai)*aj+ak+-1.0;ak=az+aa*aA+ag*aB+aC;aC=ak==0.0?1.0e-5:ak;h[p>>3]=(an+aa*ao+ag*ap+aq)/aC;h[p+8>>3]=(ar+aa*as+ag*at+au)/aC;h[p+16>>3]=(av+aa*aw+ag*ax+ay)/aC;h[p+32>>3]=af;c[p+40>>2]=0;ab=(e|0)!=2;do{if(ab){L10808:do{if((Z&4|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(o,p,56296);break L10808}}while(0);un(o,p,56296,56336)}}while(0);L10815:do{if((c[11692]&1|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(m,p,56296);break L10815}}while(0);un(m,p,56296,56336)}}while(0);if((e|0)==1){aE=0;break}aF=c[11692]|0;ac=7986}else{aF=Z;ac=7986}}while(0);L10823:do{if((ac|0)==7986){L10825:do{if((aF&2|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(m,n,56296);break L10825}}while(0);un(m,n,56296,56336)}}while(0);if((c[11692]&8|0)==0){aE=1;break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(o,n,56296);aE=1;break L10823}}while(0);un(o,n,56296,56336);aE=1}}while(0);do{if((a[46752]&1)==0){if((c[11690]&2|0)!=0){break}if((c[7662]|0)!=1){break L10803}if((cy(30632,213264)|0)==0){break L10803}}}while(0);af=+h[5279];$=c[200]|0;aC=+h[64664+($*688&-1)>>3];ay=+h[14]-aC;ax=+h[91];ag=+h[96];aw=ay*ax+ag+-1.0;ah=c[144]|0;aa=+h[64664+(ah*688&-1)>>3];av=+h[13]-aa;au=+h[21];at=+h[68];as=av*au+at+-1.0;ar=+h[2];aq=+h[12];ap=(af-af)*ar+aq+-1.0;ao=+h[403];an=+h[391];ak=+h[395];aB=ao+aw*an+as*ak;aA=+h[399];az=ap*aA;aj=+h[404];ai=+h[392];ad=+h[396];ae=aj+aw*ai+as*ad;al=+h[400];am=ap*al;aD=+h[405];aG=+h[393];aH=+h[397];aI=aD+aw*aG+as*aH;aJ=+h[401];aK=ap*aJ;aL=+h[406];aM=+h[394];aN=+h[398];aO=aL+aw*aM+as*aN;as=+h[402];aw=ap*as;ap=aO+aw;aP=ap==0.0?1.0e-5:ap;h[q>>3]=(aB+az)/aP;h[q+8>>3]=(ae+am)/aP;h[q+16>>3]=(aI+aK)/aP;h[q+32>>3]=af;c[q+40>>2]=0;aP=+h[7089]-aC;ap=aP*ax+ag+-1.0;aQ=+h[7088]-aa;aR=aQ*au+at+-1.0;aS=ao+ap*an+aR*ak;aT=aj+ap*ai+aR*ad;aU=aD+ap*aG+aR*aH;aV=aL+ap*aM+aR*aN;aR=aV+aw;ap=aR==0.0?1.0e-5:aR;h[r>>3]=(aS+az)/ap;h[r+8>>3]=(aT+am)/ap;h[r+16>>3]=(aU+aK)/ap;h[r+32>>3]=af;c[r+40>>2]=0;ap=(+h[3305]-aC)*ax+ag+-1.0;aR=(+h[3304]-aa)*au+at+-1.0;aW=ao+ap*an+aR*ak;aX=aj+ap*ai+aR*ad;aY=aD+ap*aG+aR*aH;aZ=aL+ap*aM+aR*aN;aR=aZ+aw;ap=aR==0.0?1.0e-5:aR;h[s>>3]=(aW+az)/ap;h[s+8>>3]=(aX+am)/ap;h[s+16>>3]=(aY+aK)/ap;h[s+32>>3]=af;c[s+40>>2]=0;ap=(+h[5264]-aC)*ax+ag+-1.0;ag=(+h[5263]-aa)*au+at+-1.0;at=ao+ap*an+ag*ak;ak=aj+ap*ai+ag*ad;ad=aD+ap*aG+ag*aH;aH=aL+ap*aM+ag*aN;aN=aH+aw;aw=aN==0.0?1.0e-5:aN;h[t>>3]=(at+az)/aw;h[t+8>>3]=(ak+am)/aw;h[t+16>>3]=(ad+aK)/aw;h[t+32>>3]=af;c[t+40>>2]=0;aw=+h[6915];aK=(aw-af)*ar+aq+-1.0;am=aK*aA;az=aK*al;aN=aK*aJ;ag=aK*as;aK=aO+ag;aM=aK==0.0?1.0e-5:aK;h[u>>3]=(aB+am)/aM;h[u+8>>3]=(ae+az)/aM;h[u+16>>3]=(aI+aN)/aM;h[u+32>>3]=aw;c[u+40>>2]=0;aM=aV+ag;aV=aM==0.0?1.0e-5:aM;h[v>>3]=(aS+am)/aV;h[v+8>>3]=(aT+az)/aV;h[v+16>>3]=(aU+aN)/aV;h[v+32>>3]=aw;c[v+40>>2]=0;aV=aZ+ag;aZ=aV==0.0?1.0e-5:aV;h[w>>3]=(aW+am)/aZ;h[w+8>>3]=(aX+az)/aZ;h[w+16>>3]=(aY+aN)/aZ;h[w+32>>3]=aw;c[w+40>>2]=0;aZ=aH+ag;ag=aZ==0.0?1.0e-5:aZ;h[x>>3]=(at+am)/ag;h[x+8>>3]=(ak+az)/ag;h[x+16>>3]=(ad+aN)/ag;h[x+32>>3]=aw;c[x+40>>2]=0;a_=c[11692]|0;L10843:do{if((a_&240|0)==240){L10965:do{if(aE){do{if((a[38984]&1)==0){ac=8005}else{if((a[46752]&1)==0){ac=8005;break}gt(q,u,56296)}}while(0);if((ac|0)==8005){un(q,u,56296,56336)}do{if((a[38984]&1)==0){ac=8009}else{if((a[46752]&1)==0){ac=8009;break}gt(r,v,56296)}}while(0);if((ac|0)==8009){un(r,v,56296,56336)}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(s,w,56296);break L10965}}while(0);un(s,w,56296,56336)}}while(0);if(!ab){break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(t,x,56296);break L10843}}while(0);un(t,x,56296,56336)}else{aw=+h[64672+($*688&-1)>>3];ag=aw-aC;a$=~~(ay/ag+.1);aN=+h[64672+(ah*688&-1)>>3];ad=aN-aa;a0=~~(av/ad+.1);a1=~~(aP/ag+.1);a2=~~(aQ/ad+.1);az=+h[7076];h[y+24>>3]=az;h[y+16>>3]=az;h[y+8>>3]=az;h[y>>3]=az;h[z+24>>3]=az;h[z+16>>3]=az;h[z+8>>3]=az;h[z>>3]=az;if((d|0)>0){a3=b;a4=d;while(1){a5=a4-1|0;a6=c[a3+260>>2]|0;a7=c[a3+8>>2]|0;do{if((a7|0)==3){if((c[a3+244>>2]|0)==0){break}a9=a3+252|0;ac=8023}else if((a7|0)!=4){a9=37368;ac=8023}}while(0);do{if((ac|0)==8023){ac=0;a7=c[a9>>2]|0;ba=c[a6+8>>2]|0;bb=c[a6+12>>2]|0;bc=c[bb>>2]|0;do{if((bc|0)==0){az=+h[bb+8>>3];ak=az-aC;am=+P(+ak);at=+h[11];if(am>=at){if(+P(+(az-aw))>=at){break}}az=+h[bb+16>>3];am=az-aa;if(+P(+am)>=at){if(+P(+(az-aN))>=at){break}}bd=~~(ak/(aw-aC)+.1);be=~~(am/ad+.1);bf=y+(bd<<4)+(be<<3)|0;am=+h[bb+24>>3];if(+h[bf>>3]<am){h[bf>>3]=am}bf=z+(bd<<4)+(be<<3)|0;if(+h[bf>>3]<=am){break}h[bf>>3]=am}}while(0);bf=ba-1|0;do{if((c[bb+(bf<<6)>>2]|0)==0){am=+h[bb+(bf<<6)+8>>3];ak=am-aC;at=+P(+ak);az=+h[11];if(at>=az){if(+P(+(am-aw))>=az){break}}am=+h[bb+(bf<<6)+16>>3];at=am-aa;if(+P(+at)>=az){if(+P(+(am-aN))>=az){break}}be=~~(ak/(aw-aC)+.1);bd=~~(at/ad+.1);bg=y+(be<<4)+(bd<<3)|0;at=+h[bb+(bf<<6)+24>>3];if(+h[bg>>3]<at){h[bg>>3]=at}bg=z+(be<<4)+(bd<<3)|0;if(+h[bg>>3]<=at){break}h[bg>>3]=at}}while(0);ba=a7-1|0;if((ba|0)==0){bh=a6;bi=bb;bj=bc}else{bg=a6;bd=ba;do{bg=c[bg>>2]|0;bd=bd-1|0;}while((bd|0)!=0);bd=c[bg+12>>2]|0;bh=bg;bi=bd;bj=c[bd>>2]|0}bd=bh+12|0;do{if((bj|0)==0){at=+h[bi+8>>3];ak=at-aC;az=+P(+ak);am=+h[11];if(az>=am){if(+P(+(at-aw))>=am){break}}at=+h[bi+16>>3];az=at-aa;if(+P(+az)>=am){if(+P(+(at-aN))>=am){break}}bc=~~(ak/(aw-aC)+.1);bb=~~(az/ad+.1);a7=y+(bc<<4)+(bb<<3)|0;az=+h[bi+24>>3];if(+h[a7>>3]<az){h[a7>>3]=az}a7=z+(bc<<4)+(bb<<3)|0;if(+h[a7>>3]<=az){break}h[a7>>3]=az}}while(0);bg=c[bd>>2]|0;if((c[bg+(bf<<6)>>2]|0)!=0){break}az=+h[bg+(bf<<6)+8>>3];ak=az-aC;am=+P(+ak);at=+h[11];if(am>=at){if(+P(+(az-aw))>=at){break}}az=+h[bg+(bf<<6)+16>>3];am=az-aa;if(+P(+am)>=at){if(+P(+(az-aN))>=at){break}}a7=~~(ak/ag+.1);bb=~~(am/ad+.1);bc=y+(a7<<4)+(bb<<3)|0;am=+h[bg+(bf<<6)+24>>3];if(+h[bc>>3]<am){h[bc>>3]=am}bc=z+(a7<<4)+(bb<<3)|0;if(+h[bc>>3]<=am){break}h[bc>>3]=am}}while(0);if((a5|0)>0){a3=c[a3>>2]|0;a4=a5}else{break}}}L10910:do{if(aE){L10912:do{if((a_&16|0)==0){ad=+h[y+(a$<<4)+(a0<<3)>>3];ag=+h[z+(a$<<4)+(a0<<3)>>3];if(ad==ag){break}aN=(ag-af)*ar+aq+-1.0;aw=aO+aN*as;am=aw==0.0?1.0e-5:aw;h[A>>3]=(aB+aN*aA)/am;h[A+8>>3]=(ae+aN*al)/am;h[A+16>>3]=(aI+aN*aJ)/am;h[A+32>>3]=ag;c[A+40>>2]=0;ag=(ad-af)*ar+aq+-1.0;am=aO+ag*as;aN=am==0.0?1.0e-5:am;h[B>>3]=(aB+ag*aA)/aN;h[B+8>>3]=(ae+ag*al)/aN;h[B+16>>3]=(aI+ag*aJ)/aN;h[B+32>>3]=ad;c[B+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(A,B,56296);break L10912}}while(0);un(A,B,56296,56336)}else{do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(q,u,56296);break L10912}}while(0);un(q,u,56296,56336)}}while(0);L10925:do{if((c[11692]&32|0)==0){ad=+h[y+(a1<<4)+(a2<<3)>>3];aN=+h[z+(a1<<4)+(a2<<3)>>3];if(ad==aN){break}ag=(+h[7089]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;am=(+h[7088]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aw=+h[5279];ak=+h[2];at=+h[12];az=(aN-aw)*ak+at+-1.0;aZ=+h[403]+ag*+h[391]+am*+h[395];aH=+h[399];aY=+h[404]+ag*+h[392]+am*+h[396];aX=+h[400];aW=+h[405]+ag*+h[393]+am*+h[397];aV=+h[401];aU=+h[406]+ag*+h[394]+am*+h[398];am=+h[402];ag=aU+az*am;aT=ag==0.0?1.0e-5:ag;h[C>>3]=(aZ+az*aH)/aT;h[C+8>>3]=(aY+az*aX)/aT;h[C+16>>3]=(aW+az*aV)/aT;h[C+32>>3]=aN;c[C+40>>2]=0;aN=(ad-aw)*ak+at+-1.0;at=aU+aN*am;am=at==0.0?1.0e-5:at;h[D>>3]=(aZ+aN*aH)/am;h[D+8>>3]=(aY+aN*aX)/am;h[D+16>>3]=(aW+aN*aV)/am;h[D+32>>3]=ad;c[D+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(C,D,56296);break L10925}}while(0);un(C,D,56296,56336)}else{do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(r,v,56296);break L10925}}while(0);un(r,v,56296,56336)}}while(0);if((c[11692]&64|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(s,w,56296);break L10910}}while(0);un(s,w,56296,56336);break}a5=1-a0|0;bf=1-a$|0;ad=+h[y+(bf<<4)+(a5<<3)>>3];am=+h[z+(bf<<4)+(a5<<3)>>3];if(ad==am){break}aV=(+h[3305]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aN=(+h[3304]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aW=+h[5279];aX=+h[2];aY=+h[12];aH=(am-aW)*aX+aY+-1.0;aZ=+h[403]+aV*+h[391]+aN*+h[395];at=+h[399];aU=+h[404]+aV*+h[392]+aN*+h[396];ak=+h[400];aw=+h[405]+aV*+h[393]+aN*+h[397];aT=+h[401];az=+h[406]+aV*+h[394]+aN*+h[398];aN=+h[402];aV=az+aH*aN;ag=aV==0.0?1.0e-5:aV;h[E>>3]=(aZ+aH*at)/ag;h[E+8>>3]=(aU+aH*ak)/ag;h[E+16>>3]=(aw+aH*aT)/ag;h[E+32>>3]=am;c[E+40>>2]=0;am=(ad-aW)*aX+aY+-1.0;aY=az+am*aN;aN=aY==0.0?1.0e-5:aY;h[F>>3]=(aZ+am*at)/aN;h[F+8>>3]=(aU+am*ak)/aN;h[F+16>>3]=(aw+am*aT)/aN;h[F+32>>3]=ad;c[F+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(E,F,56296);break L10910}}while(0);un(E,F,56296,56336)}}while(0);if(!ab){break}if((c[11692]&128|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(t,x,56296);break L10843}}while(0);un(t,x,56296,56336);break}a$=1-a2|0;a0=1-a1|0;ad=+h[y+(a0<<4)+(a$<<3)>>3];aN=+h[z+(a0<<4)+(a$<<3)>>3];if(ad==aN){break}aT=(+h[5264]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;am=(+h[5263]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aw=+h[5279];ak=+h[2];aU=+h[12];at=(aN-aw)*ak+aU+-1.0;aZ=+h[403]+aT*+h[391]+am*+h[395];aY=+h[399];az=+h[404]+aT*+h[392]+am*+h[396];aX=+h[400];aW=+h[405]+aT*+h[393]+am*+h[397];ag=+h[401];aH=+h[406]+aT*+h[394]+am*+h[398];am=+h[402];aT=aH+at*am;aV=aT==0.0?1.0e-5:aT;h[G>>3]=(aZ+at*aY)/aV;h[G+8>>3]=(az+at*aX)/aV;h[G+16>>3]=(aW+at*ag)/aV;h[G+32>>3]=aN;c[G+40>>2]=0;aN=(ad-aw)*ak+aU+-1.0;aU=aH+aN*am;am=aU==0.0?1.0e-5:aU;h[H>>3]=(aZ+aN*aY)/am;h[H+8>>3]=(az+aN*aX)/am;h[H+16>>3]=(aW+aN*ag)/am;h[H+32>>3]=ad;c[H+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(G,H,56296);break L10843}}while(0);un(G,H,56296,56336)}}while(0);L10990:do{if(aE){L10992:do{if((c[11692]&256|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(u,v,56296);break L10992}}while(0);un(u,v,56296,56336)}}while(0);if((c[11692]&512|0)==0){break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(w,v,56296);break L10990}}while(0);un(w,v,56296,56336)}}while(0);if(!ab){break}L11006:do{if((c[11692]&1024|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(u,x,56296);break L11006}}while(0);un(u,x,56296,56336)}}while(0);if((c[11692]&2048|0)==0){break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(w,x,56296);break L10803}}while(0);un(w,x,56296,56336)}}while(0);do{if((c[5094]|0)==0){if((e|0)!=3){break}i=j;return}else{x=c[10026]|0;if((((x|0)>-1?x:-x|0)|0)!=(f|0)|(e|0)==3){i=j;return}else{c[13542]=0;break}}}while(0);f=c[200]|0;x=(c[64916+(f*688&-1)>>2]|0)==0;if(x){if((c[65140+(f*688&-1)>>2]|0)!=0){ac=8133}}else{ac=8133}L11069:do{if((ac|0)==8133){w=c[144]|0;aJ=+h[64664+(w*688&-1)>>3];aI=+h[97];al=aJ+ +h[64672+(w*688&-1)>>3]-aI;ae=+h[64664+(f*688&-1)>>3];aA=(+h[64672+(f*688&-1)>>3]+ae)*.5;aB=+h[96]+ +h[91]*(aA-ae)+-1.0;ae=+h[21];as=+h[68];aO=(aI-aJ)*ae+as+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aq=+h[403]+aB*+h[391];ar=+h[395];af=aI*+h[399];aa=+h[404]+aB*+h[392];aC=+h[396];aQ=aI*+h[400];aP=+h[405]+aB*+h[393];av=+h[397];ay=aI*+h[401];ad=+h[406]+aB*+h[394];aB=+h[398];am=aI*+h[402];aI=ad+aO*aB+am;ag=aI==0.0?1.0e-5:aI;aI=(al-aJ)*ae+as+-1.0;as=ad+aI*aB+am;am=as==0.0?1.0e-5:as;as=+(c[40]|0);h[695]=((aq+aI*ar+af)/am-(aq+aO*ar+af)/ag)/as;h[694]=((aa+aI*aC+aQ)/am-(aa+aO*aC+aQ)/ag)/as;h[693]=((aP+aI*av+ay)/am-(aP+aO*av+ay)/ag)/as;as=+g[3538];if(as>90.0|(e|0)==1){if(as<=90.0|(e|0)==2|x){bk=f}else{ac=8136}}else{if(x){bk=f}else{ac=8136}}if((ac|0)==8136){de(2,10);bk=c[200]|0}if((c[65140+(bk*688&-1)>>2]|0)==0){break}as=+g[3538];do{if(as>90.0|(e|0)==2){if(as>90.0){w=c[5094]|0;if((e|0)!=1|(w|0)!=0){bl=w;ac=8144;break}else{break L11069}}if((c[5094]|0)==0){break L11069}bm=+h[97];ac=8145}else{bl=c[5094]|0;ac=8144}}while(0);do{if((ac|0)==8144){as=+h[97];if((bl|0)!=0){bm=as;ac=8145;break}ag=(as-al)*.25;do{if((c[65084+(bk*688&-1)>>2]|0)==-3){ay=+h[64664+(bk*688&-1)>>3];av=+h[91];aO=+h[96];aP=(ay-ay)*av+aO+-1.0;am=(as- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aQ=+h[403];aC=+h[391];aa=am*+h[395];af=aI*+h[399];ar=+h[404];aq=+h[392];aB=am*+h[396];ad=aI*+h[400];ae=+h[406];aJ=+h[394];aN=am*+h[398];am=aI*+h[402];aI=ae+aP*aJ+aN+am;aW=aI==0.0?1.0e-5:aI;aI=+(c[180]|0);w=c[186]|0;aX=+(c[40]|0);u=c[46]|0;az=aO+av*(+h[64672+(bk*688&-1)>>3]-ay)+-1.0;ay=am+(aN+(ae+aJ*az));aJ=ay==0.0?1.0e-5:ay;ay=+Y(+(+(~~(aX*((ad+(aB+(ar+aq*az)))/aJ))+u|0)- +(~~((ar+aP*aq+aB+ad)/aW*aX)+u|0)),+(+(~~(aI*((af+(aa+(aQ+aC*az)))/aJ))+w|0)- +(~~((aQ+aP*aC+aa+af)/aW*aI)+w|0)))/.017453292519943295;if(ay>0.0){bn=ay+.5}else{bn=ay+-.5}w=~~+O(+bn);ay=ag*.5;if(ay<=0.0){bo=w;bp=ay;break}bo=w+180|0;bp=ay}else{bo=0;bp=ag}}while(0);if((c[64916+(bk*688&-1)>>2]&2|0)==0){ag=(aA- +h[64664+(bk*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ay=(bp+as- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aW=+h[406]+ag*+h[394]+ay*+h[398]+aI*+h[402];af=aW==0.0?1.0e-5:aW;bq=(+h[403]+ag*+h[391]+ay*+h[395]+aI*+h[399])/af;br=(+h[404]+ag*+h[392]+ay*+h[396]+aI*+h[400])/af;bs=a[65072+(bk*688&-1)|0]|0}else{w=a[65072+(bk*688&-1)|0]|0;if((w&1)==0){bt=-0.0-bp}else{bt=bp}af=(aA- +h[64664+(bk*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aI=(bt*.5- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;ag=+h[406]+af*+h[394]+aI*+h[398]+ay*+h[402];aW=ag==0.0?1.0e-5:ag;bq=(+h[403]+af*+h[391]+aI*+h[395]+ay*+h[399])/aW;br=(+h[404]+af*+h[392]+aI*+h[396]+ay*+h[400])/aW;bs=w}if((bs&1)==0){aW=+h[65056+(bk*688&-1)>>3];ay=+((c[W+24>>2]|0)>>>0>>>0);bu=bq- +h[695]*aW*ay;bv=br-ay*aW*+h[694]}else{bu=bq;bv=br}bw=bo;bx=~~(bu*+(c[180]|0))+(c[186]|0)|0;by=~~(bv*+(c[40]|0))+(c[46]|0)|0}}while(0);if((ac|0)==8145){al=(aA- +h[64664+(bk*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aW=(bm- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aI=+h[406]+al*+h[394]+aW*+h[398]+ay*+h[402];af=aI==0.0?1.0e-5:aI;aI=+h[694];ag=+((c[W+16>>2]|0)>>>0>>>0);aa=(+h[404]+al*+h[392]+aW*+h[396]+ay*+h[400])/af-aI*ag;if((a[65072+(bk*688&-1)|0]&1)==0){bz=aa- +h[65056+(bk*688&-1)>>3]*aI*+((c[W+24>>2]|0)>>>0>>>0)}else{bz=aa}bw=c[65132+(bk*688&-1)>>2]|0;bx=~~((+h[403]+al*+h[391]+aW*+h[395]+ay*+h[399])/af*+(c[180]|0))+(c[186]|0)|0;by=(~~(bz*+(c[40]|0))+(c[46]|0)|0)-~~(ag*1.5)|0}fx(65224+(bk*688&-1)|0,I,J,207600);w=(c[I>>2]|0)+bx|0;u=(c[J>>2]|0)+by|0;v=c[200]|0;aE=a[65264+(v*688&-1)|0]&1;do{if(aE<<24>>24==0){bA=v}else{if((a[37456]&1)!=0){bA=v;break}a[37456]=1;H=c[(c[3524]|0)+88>>2]|0;if((H|0)==0){bA=v;break}cO[H&255](179864);bA=c[200]|0}}while(0);a[37456]=aE;fn(65152+(bA*688&-1)|0,W);do{if((bw|0)==0){ac=8169}else{if((cO[c[(c[3524]|0)+72>>2]&255](bw)|0)==0){ac=8169;break}v=c[200]|0;ln(w,u,c[65140+(v*688&-1)>>2]|0,1,0,bw,c[65144+(v*688&-1)>>2]|0);v=c[(c[3524]|0)+72>>2]|0;cO[v&255](0)}}while(0);if((ac|0)==8169){aE=c[200]|0;ln(w,u,c[65140+(aE*688&-1)>>2]|0,1,0,0,c[65144+(aE*688&-1)>>2]|0)}if((c[65152+((c[200]|0)*688&-1)>>2]|0)!=0){cM[c[W+64>>2]&511](-2)}a[37456]=0}}while(0);bw=c[144]|0;bA=(c[64916+(bw*688&-1)>>2]|0)==0;if(bA){if((c[65140+(bw*688&-1)>>2]|0)!=0){ac=8175}}else{ac=8175}L11129:do{if((ac|0)==8175){by=c[200]|0;bz=+h[64664+(by*688&-1)>>3];bm=+h[69];bv=bz+ +h[64672+(by*688&-1)>>3]-bm;bu=+h[64664+(bw*688&-1)>>3];br=(+h[64672+(bw*688&-1)>>3]+bu)*.5;bq=+h[91];bt=+h[96];bp=(bm-bz)*bq+bt+-1.0;bm=(br-bu)*+h[21]+ +h[68]+-1.0;bu=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bn=+h[403];aA=+h[391];ag=bm*+h[395];af=bu*+h[399];ay=+h[404];aW=+h[392];al=bm*+h[396];aa=bu*+h[400];aI=+h[405];aC=+h[393];aP=bm*+h[397];aQ=bu*+h[401];aJ=+h[406];az=+h[394];aX=bm*+h[398];bm=bu*+h[402];bu=aJ+bp*az+aX+bm;ad=bu==0.0?1.0e-5:bu;bu=(bv-bz)*bq+bt+-1.0;bt=aJ+bu*az+aX+bm;bm=bt==0.0?1.0e-5:bt;bt=+(c[180]|0);h[695]=((bn+bu*aA+ag+af)/bm-(bn+bp*aA+ag+af)/ad)/bt;h[694]=((ay+bu*aW+al+aa)/bm-(ay+bp*aW+al+aa)/ad)/bt;h[693]=((aI+bu*aC+aP+aQ)/bm-(aI+bp*aC+aP+aQ)/ad)/bt;bt=+g[3538];if(bt>90.0|(e|0)==1){if(bt<=90.0|(e|0)==2|bA){bB=bw}else{ac=8178}}else{if(bA){bB=bw}else{ac=8178}}if((ac|0)==8178){de(1,12);bB=c[144]|0}if((c[65140+(bB*688&-1)>>2]|0)==0){break}bt=+g[3538];do{if(bt>90.0|(e|0)==2){if(bt>90.0){by=c[5094]|0;if((e|0)!=1|(by|0)!=0){bC=by;ac=8186;break}else{break L11129}}if((c[5094]|0)==0){break L11129}bD=+h[69];ac=8187}else{bC=c[5094]|0;ac=8186}}while(0);do{if((ac|0)==8186){bt=+h[69];if((bC|0)!=0){bD=bt;ac=8187;break}ad=(bv-bt)*.25;do{if((c[65084+(bB*688&-1)>>2]|0)==-3){aQ=+h[64664+(bB*688&-1)>>3];aP=(bt- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aC=+h[21];bp=+h[68];aI=(aQ-aQ)*aC+bp+-1.0;bm=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bu=+h[403]+aP*+h[391];aa=+h[395];al=bm*+h[399];aW=+h[404]+aP*+h[392];ay=+h[396];af=bm*+h[400];ag=+h[406]+aP*+h[394];aP=+h[398];aA=bm*+h[402];bm=ag+aI*aP+aA;bn=bm==0.0?1.0e-5:bm;bm=+(c[180]|0);u=c[186]|0;aX=+(c[40]|0);w=c[46]|0;az=bp+aC*(+h[64672+(bB*688&-1)>>3]-aQ)+-1.0;aQ=aA+(ag+aP*az);aP=aQ==0.0?1.0e-5:aQ;aQ=+Y(+(+(~~(aX*((af+(aW+ay*az))/aP))+w|0)- +(~~((aW+aI*ay+af)/bn*aX)+w|0)),+(+(~~(bm*((al+(bu+aa*az))/aP))+u|0)- +(~~((bu+aI*aa+al)/bn*bm)+u|0)))/.017453292519943295;if(aQ>0.0){bE=aQ+.5}else{bE=aQ+-.5}u=~~+O(+bE);aQ=ad*.5;if(aQ<=0.0){bF=aQ;bG=u;break}bF=aQ;bG=u+180|0}else{bF=ad;bG=0}}while(0);if((c[64916+(bB*688&-1)>>2]&2|0)==0){u=c[200]|0;ad=(bt-bF- +h[64664+(u*688&-1)>>3])*+h[91]+ +h[96]+-1.0;as=(br- +h[64664+(bB*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aQ=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bm=+h[406]+ad*+h[394]+as*+h[398]+aQ*+h[402];bn=bm==0.0?1.0e-5:bm;bH=(+h[403]+ad*+h[391]+as*+h[395]+aQ*+h[399])/bn;bI=(+h[404]+ad*+h[392]+as*+h[396]+aQ*+h[400])/bn;bJ=u;bK=a[65072+(u*688&-1)|0]|0}else{u=c[200]|0;w=a[65072+(u*688&-1)|0]|0;if((w&1)==0){bL=bF}else{bL=-0.0-bF}bn=(bL*.5- +h[64664+(u*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aQ=(br- +h[64664+(bB*688&-1)>>3])*+h[21]+ +h[68]+-1.0;as=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;ad=+h[406]+bn*+h[394]+aQ*+h[398]+as*+h[402];bm=ad==0.0?1.0e-5:ad;bH=(+h[403]+bn*+h[391]+aQ*+h[395]+as*+h[399])/bm;bI=(+h[404]+bn*+h[392]+aQ*+h[396]+as*+h[400])/bm;bJ=u;bK=w}if((bK&1)==0){bm=+h[65056+(bJ*688&-1)>>3];as=+((c[W+28>>2]|0)>>>0>>>0);bM=bH- +h[695]*bm*as;bN=bI-as*bm*+h[694]}else{bM=bH;bN=bI}bO=bG;bP=0;bQ=~~(bN*+(c[40]|0))+(c[46]|0)|0;bR=~~(bM*+(c[180]|0))+(c[186]|0)|0;bS=bB}}while(0);if((ac|0)==8187){w=c[200]|0;bv=+h[64664+(w*688&-1)>>3];bm=+h[91];as=+h[96];aQ=(bD-bv)*bm+as+-1.0;bn=+h[64664+(bB*688&-1)>>3];ad=+h[21];al=+h[68];aa=(br-bn)*ad+al+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bu=+h[403];aP=+h[391];az=+h[395];aX=aI*+h[399];af=+h[404];ay=+h[392];aW=+h[396];ag=aI*+h[400];aA=+h[406];aC=+h[394];bp=+h[398];aJ=aI*+h[402];aI=aA+aQ*aC+aa*bp+aJ;bq=aI==0.0?1.0e-5:aI;aI=(bu+aQ*aP+aa*az+aX)/bq;bz=(af+aQ*ay+aa*aW+ag)/bq;u=c[64916+(bB*688&-1)>>2]|0;do{if((u&2|0)==0){bT=aI;bU=bz}else{if((a[64788+(w*688&-1)|0]&1)!=0){bT=aI;bU=bz;break}bq=+h[64672+(w*688&-1)>>3];if(bv<bq){if(bv>0.0|bq<0.0){bT=aI;bU=bz;break}}else{if(bq>0.0|bv<0.0){bT=aI;bU=bz;break}}bq=(0.0-bv)*bm+as+-1.0;aa=(bD-bn)*ad+al+-1.0;aQ=aA+bq*aC+aa*bp+aJ;aB=aQ==0.0?1.0e-5:aQ;bT=(bu+bq*aP+aa*az+aX)/aB;bU=(af+bq*ay+aa*aW+ag)/aB}}while(0);ag=+h[695];by=W+20|0;aW=bT-ag*+((c[by>>2]|0)>>>0>>>0);if((a[65072+(w*688&-1)|0]&1)==0){bV=aW- +h[65056+(w*688&-1)>>3]*ag*+((c[W+28>>2]|0)>>>0>>>0)}else{bV=aW}J=~~(bV*+(c[180]|0))+(c[186]|0)|0;bx=~~(bU*+(c[40]|0))+(c[46]|0)|0;c[216]=0;if((u&1|0)==0){bW=.5;bX=bB}else{c[216]=0;de(1,14);bW=+(c[216]|0)+.5;bX=c[144]|0}bO=c[65132+(bX*688&-1)>>2]|0;bP=2;bQ=bx;bR=J-~~(bW*+((c[by>>2]|0)>>>0>>>0))|0;bS=bX}fx(65224+(bS*688&-1)|0,K,L,207600);by=(c[K>>2]|0)+bR|0;J=(c[L>>2]|0)+bQ|0;bx=c[144]|0;I=a[65264+(bx*688&-1)|0]&1;do{if(I<<24>>24==0){bY=bx}else{if((a[37456]&1)!=0){bY=bx;break}a[37456]=1;bk=c[(c[3524]|0)+88>>2]|0;if((bk|0)==0){bY=bx;break}cO[bk&255](179864);bY=c[144]|0}}while(0);a[37456]=I;fn(65152+(bY*688&-1)|0,W);do{if((bO|0)==0){ac=8219}else{if((cO[c[(c[3524]|0)+72>>2]&255](bO)|0)==0){ac=8219;break}bx=c[144]|0;ln(by,J,c[65140+(bx*688&-1)>>2]|0,1,bP,bO,c[65144+(bx*688&-1)>>2]|0);bx=c[(c[3524]|0)+72>>2]|0;cO[bx&255](0)}}while(0);if((ac|0)==8219){I=c[144]|0;ln(by,J,c[65140+(I*688&-1)>>2]|0,1,bP,0,c[65144+(I*688&-1)>>2]|0)}if((c[65152+((c[144]|0)*688&-1)>>2]|0)!=0){cM[c[W+64>>2]&511](-2)}a[37456]=0}}while(0);L11198:do{if((c[64916+((c[34]|0)*688&-1)>>2]|0)!=0){if(!((e|0)!=1&(c[5094]|0)==0)){break}do{if((a[46752]&1)==0){if((c[11690]&2|0)!=0){break}if((a8(30632,115)|0)==0){break L11198}}}while(0);de(0,6)}}while(0);e=c[144]|0;L11206:do{if((c[65284+(e*688&-1)>>2]|0)>-3){J=c[200]|0;if((a[64788+(J*688&-1)|0]&1)!=0){break}bW=+h[64664+(J*688&-1)>>3];bU=+h[64672+(J*688&-1)>>3];if(bW<bU){if(bW>0.0|bU<0.0){break}}else{if(bU>0.0|bW<0.0){break}}bU=+h[64664+(e*688&-1)>>3];bV=+h[7076];bT=(0.0-bW)*+h[91]+ +h[96]+-1.0;bW=+h[21];bD=+h[68];bM=(bU-bU)*bW+bD+-1.0;bN=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bI=+h[403]+bT*+h[391];bH=+h[395];bL=bN*+h[399];bF=+h[404]+bT*+h[392];bE=+h[396];aW=bN*+h[400];ag=+h[405]+bT*+h[393];ay=+h[397];af=bN*+h[401];aX=+h[406]+bT*+h[394];bT=+h[398];az=bN*+h[402];bN=aX+bM*bT+az;aP=bN==0.0?1.0e-5:bN;h[M>>3]=(bI+bM*bH+bL)/aP;h[M+8>>3]=(bF+bM*bE+aW)/aP;h[M+16>>3]=(ag+bM*ay+af)/aP;h[M+32>>3]=bV;c[M+40>>2]=0;aP=(+h[64672+(e*688&-1)>>3]-bU)*bW+bD+-1.0;bD=aX+aP*bT+az;az=bD==0.0?1.0e-5:bD;h[N>>3]=(bI+aP*bH+bL)/az;h[N+8>>3]=(bF+aP*bE+aW)/az;h[N+16>>3]=(ag+aP*ay+af)/az;h[N+32>>3]=bV;c[N+40>>2]=0;J=65280+(e*688&-1)|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(M,N,J);break L11206}}while(0);un(M,N,J,65320+(e*688&-1)|0)}}while(0);e=c[34]|0;L11218:do{if((c[65284+(e*688&-1)>>2]|0)>-3){N=c[200]|0;if((a[64788+(N*688&-1)|0]&1)!=0){break}bV=+h[64664+(N*688&-1)>>3];az=+h[64672+(N*688&-1)>>3];if(bV<az){if(bV>0.0|az<0.0){break}}else{if(az>0.0|bV<0.0){break}}az=+h[64664+(e*688&-1)>>3];af=(0.0-bV)*+h[91]+ +h[96]+-1.0;bV=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=+h[5279];aP=+h[2];ag=+h[12];aW=(az-ay)*aP+ag+-1.0;bE=+h[403]+af*+h[391]+bV*+h[395];bF=+h[399];bL=+h[404]+af*+h[392]+bV*+h[396];bH=+h[400];bI=+h[405]+af*+h[393]+bV*+h[397];bD=+h[401];bT=+h[406]+af*+h[394]+bV*+h[398];bV=+h[402];af=bT+aW*bV;aX=af==0.0?1.0e-5:af;h[Q>>3]=(bE+aW*bF)/aX;h[Q+8>>3]=(bL+aW*bH)/aX;h[Q+16>>3]=(bI+aW*bD)/aX;h[Q+32>>3]=az;c[Q+40>>2]=0;az=+h[64672+(e*688&-1)>>3];aX=(az-ay)*aP+ag+-1.0;ag=bT+aX*bV;bV=ag==0.0?1.0e-5:ag;h[R>>3]=(bE+aX*bF)/bV;h[R+8>>3]=(bL+aX*bH)/bV;h[R+16>>3]=(bI+aX*bD)/bV;h[R+32>>3]=az;c[R+40>>2]=0;N=65280+(e*688&-1)|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(Q,R,N);break L11218}}while(0);un(Q,R,N,65320+(e*688&-1)|0)}}while(0);e=c[200]|0;R=c[65284+(e*688&-1)>>2]|0;L11230:do{if((R|0)>-3){Q=c[144]|0;if((a[64788+(Q*688&-1)|0]&1)!=0){break}az=+h[64664+(Q*688&-1)>>3];bV=+h[64672+(Q*688&-1)>>3];if(az<bV){if(az>0.0|bV<0.0){break}}else{if(bV>0.0|az<0.0){break}}Q=k;J=65320+(e*688&-1)|0;c[Q>>2]=c[J>>2];c[Q+4>>2]=c[J+4>>2];c[Q+8>>2]=c[J+8>>2];c[Q+12>>2]=c[J+12>>2];do{if((c[65280+(e*688&-1)>>2]|0)!=0){az=+h[65304+(e*688&-1)>>3];J=c[(c[3524]|0)+92>>2]|0;if(az<0.0){cK[J&63](+h[3817]);break}else{cK[J&63](az);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[65296+(e*688&-1)>>3]);N=c[(c[3524]|0)+64>>2]|0;if((R|0)<-5){cM[N&511](-2)}else{cM[N&511](R)}N=c[3524]|0;do{if((a[65312+(e*688&-1)|0]&1)==0){if((c[N+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=R;ac=8262}else{ac=8262}}while(0);if((ac|0)==8262){fn(k,N)}J=c[200]|0;az=+h[64664+(J*688&-1)>>3];bV=+h[7076];bD=+h[91];aX=+h[96];bI=(az-az)*bD+aX+-1.0;bH=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bL=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bF=+h[403];bE=+h[391];ag=bH*+h[395];bT=bL*+h[399];aP=+h[404];ay=+h[392];aW=bH*+h[396];af=bL*+h[400];bW=+h[405];bU=+h[393];bM=bH*+h[397];bN=bL*+h[401];bu=+h[406];aJ=+h[394];bp=bH*+h[398];bH=bL*+h[402];bL=bu+bI*aJ+bp+bH;aC=bL==0.0?1.0e-5:bL;h[S>>3]=(bF+bI*bE+ag+bT)/aC;h[S+8>>3]=(aP+bI*ay+aW+af)/aC;h[S+16>>3]=(bW+bI*bU+bM+bN)/aC;h[S+32>>3]=bV;c[S+40>>2]=0;aC=(+h[64672+(J*688&-1)>>3]-az)*bD+aX+-1.0;aX=bu+aC*aJ+bp+bH;bH=aX==0.0?1.0e-5:aX;h[T>>3]=(bF+aC*bE+ag+bT)/bH;h[T+8>>3]=(aP+aC*ay+aW+af)/bH;h[T+16>>3]=(bW+aC*bU+bM+bN)/bH;h[T+32>>3]=bV;c[T+40>>2]=0;Q=65280+(J*688&-1)|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(S,T,Q);break L11230}}while(0);un(S,T,Q,65320+(J*688&-1)|0)}}while(0);T=c[34]|0;S=c[5094]|0;if((c[65140+(T*688&-1)>>2]|0)!=0&(S|0)==0){do{if((a[46752]&1)==0){if((c[11690]&2|0)!=0){break}if((cy(30632,213264)|0)!=0){break}i=j;return}}while(0);bV=(+h[64672+(T*688&-1)>>3]+ +h[64664+(T*688&-1)>>3])*.5;if((c[64916+(T*688&-1)>>2]&2|0)==0){bH=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;bN=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bM=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bU=+h[406]+bH*+h[394]+bN*+h[398]+bM*+h[402];aC=bU==0.0?1.0e-5:bU;bZ=1;b_=(~~((+h[403]+bH*+h[391]+bN*+h[395]+bM*+h[399])/aC*+(c[180]|0))+(c[186]|0)|0)+((c[W+20>>2]|0)*-7&-1)|0;b$=~~((+h[404]+bH*+h[392]+bN*+h[396]+bM*+h[400])/aC*+(c[40]|0))+(c[46]|0)|0}else{aC=(0.0- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;bM=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bN=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bV=+h[406]+aC*+h[394]+bM*+h[398]+bN*+h[402];bH=bV==0.0?1.0e-5:bV;bZ=2;b_=(~~((+h[403]+aC*+h[391]+bM*+h[395]+bN*+h[399])/bH*+(c[180]|0))+(c[186]|0)|0)+((c[W+20>>2]|0)*-5&-1)|0;b$=~~((+h[404]+aC*+h[392]+bM*+h[396]+bN*+h[400])/bH*+(c[40]|0))+(c[46]|0)|0}fx(65224+(T*688&-1)|0,U,V,207600);T=(c[U>>2]|0)+b_|0;b_=(c[V>>2]|0)+b$|0;b$=c[34]|0;V=a[65264+(b$*688&-1)|0]&1;do{if(V<<24>>24==0){b0=b$}else{if((a[37456]&1)!=0){b0=b$;break}a[37456]=1;U=c[(c[3524]|0)+88>>2]|0;if((U|0)==0){b0=b$;break}cO[U&255](179864);b0=c[34]|0}}while(0);a[37456]=V;fn(65152+(b0*688&-1)|0,W);b0=c[34]|0;V=65132+(b0*688&-1)|0;if((c[65084+(b0*688&-1)>>2]|0)==-3){c[V>>2]=-270;b1=-270;ac=8281}else{b$=c[V>>2]|0;if((b$|0)==0){b2=b0;ac=8283}else{b1=b$;ac=8281}}do{if((ac|0)==8281){b$=(cO[c[(c[3524]|0)+72>>2]&255](b1)|0)==0;b0=c[34]|0;if(b$){b2=b0;ac=8283;break}ln(T,b_,c[65140+(b0*688&-1)>>2]|0,bZ,0,c[65132+(b0*688&-1)>>2]|0,c[65144+(b0*688&-1)>>2]|0);b0=c[(c[3524]|0)+72>>2]|0;cO[b0&255](0)}}while(0);if((ac|0)==8283){ln(T,b_,c[65140+(b2*688&-1)>>2]|0,bZ,0,0,c[65144+(b2*688&-1)>>2]|0)}if((c[65152+((c[34]|0)*688&-1)>>2]|0)!=0){cM[c[W+64>>2]&511](-2)}a[37456]=0;b3=c[5094]|0}else{b3=S}if((b3|0)==0){i=j;return}c[13542]=X;i=j;return}function fx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;h[g>>3]=+h[a+16>>3];h[j>>3]=+h[a+24>>3];h[k>>3]=+h[a+32>>3];l=(fM(a,e,g,j,k)|0)==0;m=+h[g>>3];if(!l){c[b>>2]=~~m;n=~~+h[j>>3];c[d>>2]=n;i=f;return}o=(m- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;m=(+h[j>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;p=(+h[k>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[406]+o*+h[394]+m*+h[398]+p*+h[402];r=q==0.0?1.0e-5:q;l=~~((+h[404]+o*+h[392]+m*+h[396]+p*+h[400])/r*+(c[40]|0))+(c[46]|0)|0;c[b>>2]=~~((+h[403]+o*+h[391]+m*+h[395]+p*+h[399])/r*+(c[180]|0))+(c[186]|0);c[d>>2]=l;if((c[a>>2]|0)==2){s=+h[64664+((c[200]|0)*688&-1)>>3]}else{s=0.0}h[g>>3]=s;g=(c[5094]|0)!=0;do{if((c[a+4>>2]|0)==2){l=c[144]|0;if(g){t=64672+(l*688&-1)|0}else{t=64664+(l*688&-1)|0}u=+h[t>>3]}else{if(!g){u=0.0;break}u=+h[64672+((c[144]|0)*688&-1)>>3]}}while(0);h[j>>3]=u;if((c[a+8>>2]|0)==2){v=+h[64664+((c[34]|0)*688&-1)>>3]}else{v=0.0}h[k>>3]=v;r=(s- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;s=(u- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;u=(v- +h[5279])*+h[2]+ +h[12]+-1.0;v=+h[406]+r*+h[394]+s*+h[398]+u*+h[402];p=v==0.0?1.0e-5:v;k=~~((+h[404]+r*+h[392]+s*+h[396]+u*+h[400])/p*+(c[40]|0));a=c[46]|0;c[b>>2]=(c[b>>2]|0)-(~~((+h[403]+r*+h[391]+s*+h[395]+u*+h[399])/p*+(c[180]|0))+(c[186]|0)|0);n=(c[d>>2]|0)-(k+a|0)|0;c[d>>2]=n;i=f;return}function fy(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0;d=i;i=i+120|0;e=d|0;f=d+8|0;g=d+16|0;j=d+56|0;k=d+72|0;l=d+80|0;m=d+88|0;n=d+96|0;o=d+104|0;p=d+112|0;q=c[13542]|0;c[13542]=(c[(c[3524]|0)+96>>2]&128|0)==0?55520:0;r=c[10826]|0;if((r|0)==0){c[13542]=q;i=d;return}s=j;t=j|0;u=j+4|0;v=g;w=g+4|0;x=g+8|0;y=g+16|0;z=g|0;A=r;do{if((c[A+100>>2]|0)==(b|0)){fK(A+8|0,m,n,123984);r=~~+h[m>>3];B=~~+h[n>>3];C=A+48|0;if((a[A+88|0]&1)==0){fK(C,k,l,123984);D=~~+h[k>>3];c[o>>2]=D;E=~~+h[l>>3];c[p>>2]=E;F=D;G=E}else{fx(C,o,p,123984);C=(c[o>>2]|0)+r|0;c[o>>2]=C;E=(c[p>>2]|0)+B|0;c[p>>2]=E;F=C;G=E}E=A+144|0;c[s>>2]=c[E>>2];c[s+4>>2]=c[E+4>>2];c[s+8>>2]=c[E+8>>2];c[s+12>>2]=c[E+12>>2];E=c[A+108>>2]|0;do{if((c[A+104>>2]|0)!=0){H=+h[A+128>>3];C=c[(c[3524]|0)+92>>2]|0;if(H<0.0){cK[C&63](+h[3817]);break}else{cK[C&63](H);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[A+120>>3]);C=c[(c[3524]|0)+64>>2]|0;if((E|0)<-5){cM[C&511](-2)}else{cM[C&511](E)}C=c[3524]|0;do{if((a[A+136|0]&1)==0){if((c[C+96>>2]&1024|0)!=0){break}c[t>>2]=1;c[u>>2]=E;I=8328}else{I=8328}}while(0);if((I|0)==8328){I=0;fn(j,C)}E=c[200]|0;h[64776+(E*688&-1)>>3]=+((c[7939]|0)-(c[7938]|0)|0)/(+h[64672+(E*688&-1)>>3]- +h[64664+(E*688&-1)>>3]);c[12912]=c[A+200>>2];c[12910]=0;H=+h[A+168>>3];if(H>0.0){uE(v|0,0,40);c[w>>2]=2;c[x>>2]=2;h[y>>3]=H;c[z>>2]=c[A+176>>2];fN(g,e,f,123984);h[6458]=+h[A+184>>3];h[6457]=+h[A+192>>3];c[12910]=~~+h[e>>3]}fm(r,B,F,G,c[A+160>>2]|0)}A=c[A>>2]|0;}while((A|0)!=0);c[13542]=q;i=d;return}function fz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;cM[c[(c[3524]|0)+168>>2]&511](8);e=c[(c[3524]|0)+76>>2]|0;do{if((c[9046]|0)!=0|(c[9031]|0)==3){if((cO[e&255](2)|0)==0){f=(c[8986]|0)+a|0;g=c[(c[3524]|0)+20>>2]|0;h=f-aa(lp(d)|0,g)|0;cR[c[(c[3524]|0)+68>>2]&127](h,b,d);break}else{cR[c[(c[3524]|0)+68>>2]&127]((c[8986]|0)+a|0,b,d);break}}else{cO[e&255](0);cR[c[(c[3524]|0)+68>>2]&127]((c[8990]|0)+a|0,b,d)}}while(0);cM[c[(c[3524]|0)+168>>2]&511](9);return}function fA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0,U=0.0,V=0,W=0,X=0;f=i;i=i+96|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+48|0;o=f+64|0;p=f+72|0;q=f+80|0;r=f+88|0;s=c[9006]|0;t=c[9010]|0;u=s-t|0;v=(u|0)>-1?u:-u|0;w=(v|0)>24?24:v;v=s+d|0;x=+(w|0);y=+(u|0)/x;u=t+d|0;t=b+64|0;s=c[t>>2]|0;if((s|0)==1){z=8345}else if((s|0)==3){if(+h[b+72>>3]>=0.0){z=8345}}else if((s|0)==2){if((c[b+28>>2]|0)!=-6){z=8345}}if((z|0)==8345){fn(t,c[3524]|0);t=c[13542]|0;z=c[3524]|0;c[13542]=(c[z+96>>2]&128|0)==0?55520:0;cM[c[z+168>>2]&511](8);z=(c[9006]|0)+d|0;c[o>>2]=(c[9010]|0)+d;c[p>>2]=e;c[q>>2]=z;c[r>>2]=e;z=c[3524]|0;if((fl(o,p,q,r)|0)!=0){cN[c[z+56>>2]&255](c[o>>2]|0,c[p>>2]|0);cN[c[z+60>>2]&255](c[q>>2]|0,c[r>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=t;i=f;return}t=(a[b+239|0]&1)==0;r=c[b+260>>2]|0;if((r|0)==0){i=f;return}q=c[b+252>>2]|0;b=0;z=r;A=-8.988465674311579e+307;B=-8.988465674311579e+307;C=8.988465674311579e+307;while(1){if((b|0)>=(q|0)){D=B;E=C;break}r=c[z+12>>2]|0;p=c[z+8>>2]|0;if((p|0)>0){o=0;F=A;G=B;H=C;while(1){do{if((c[r+(o<<6)>>2]|0)==0){if(t){I=r+(o<<6)+24|0}else{I=r+(o<<6)+32|0}J=+h[I>>3];d=J<H;K=d?J:H;L=d?G:F;if(J<=L){M=L;N=G;O=K;break}M=J;N=J;O=K}else{M=F;N=G;O=H}}while(0);d=o+1|0;if((d|0)<(p|0)){o=d;F=M;G=N;H=O}else{P=M;Q=N;R=O;break}}}else{P=A;Q=B;R=C}o=c[z>>2]|0;if((o|0)==0){D=Q;E=R;break}else{b=b+1|0;z=o;A=P;B=Q;C=R}}if(E>D){i=f;return}R=+h[8341];C=E>R?E:R;E=+h[8342];Q=D<E?D:E;do{if(R<C){if(E<=C){z=a[20668]|0;S=+(z<<24>>24==112&1|0);T=z;break}D=(C-R)/(E-R);z=a[20668]|0;if(z<<24>>24==112){S=D;T=112;break}S=1.0-D;T=z}else{z=a[20668]|0;S=+(z<<24>>24!=112&1|0);T=z}}while(0);do{if(R<Q){if(E<=Q){U=+(T<<24>>24==112&1|0);break}C=(Q-R)/(E-R);if(T<<24>>24==112){U=C;break}U=1.0-C}else{U=+(T<<24>>24!=112&1|0)}}while(0);R=(U-S)/x;if((c[9031]|0)==3){c[8490]=u;c[8488]=e}else{cN[c[(c[3524]|0)+56>>2]&255](u,e)}if((w|0)<1){i=f;return}T=m|0;z=m+8|0;b=m+4|0;I=n|0;t=n+8|0;q=n+4|0;o=u;p=1;while(1){if((p|0)==(w|0)){r=c[3524]|0;d=r+144|0;if((c[d>>2]|0)==0){V=r}else{c[T>>2]=5;h[z>>3]=U;c[b>>2]=0;cM[c[d>>2]&511](m);V=c[3524]|0}cN[c[V+56>>2]&255](o,e);W=v}else{x=+(p|0);d=c[3524]|0;r=d+144|0;if((c[r>>2]|0)==0){X=d}else{c[I>>2]=5;h[t>>3]=S+R*x;c[q>>2]=0;cM[c[r>>2]&511](n);X=c[3524]|0}cN[c[X+56>>2]&255](o,e);W=~~(y*x+.5)+u|0}if((c[9031]|0)==3){r=c[8488]|0;c[g>>2]=c[8490];c[j>>2]=r;c[k>>2]=W;c[l>>2]=e;r=c[3524]|0;if((fl(g,j,k,l)|0)!=0){cN[c[r+56>>2]&255](c[g>>2]|0,c[j>>2]|0);cN[c[r+60>>2]&255](c[k>>2]|0,c[l>>2]|0)}c[8490]=W;c[8488]=e}else{cN[c[(c[3524]|0)+60>>2]&255](W,e)}r=p+1|0;if((r|0)>(w|0)){break}else{o=W;p=r}}i=f;return}function fB(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0.0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0,aN=0,aO=0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0.0,aY=0.0,aZ=0.0,a_=0,a$=0,a0=0,a1=0,a2=0.0,a3=0.0,a4=0.0,a5=0.0,a6=0.0,a7=0.0,a8=0.0,a9=0.0,ba=0.0,bb=0.0,bc=0.0,bd=0,be=0.0,bf=0.0,bg=0.0,bh=0.0,bi=0.0,bj=0.0,bk=0.0,bl=0.0,bm=0.0,bn=0.0,bo=0.0,bp=0.0,bq=0.0,br=0.0,bs=0.0,bt=0.0,bu=0.0,bv=0.0,bw=0.0,bx=0.0,by=0.0,bz=0.0,bA=0.0,bB=0.0,bC=0.0,bD=0.0,bE=0.0,bF=0.0,bG=0.0,bH=0.0,bI=0.0,bJ=0.0,bK=0,bL=0,bM=0;d=i;i=i+208|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+48|0;m=d+56|0;n=d+64|0;o=d+72|0;p=d+80|0;q=d+96|0;r=d+104|0;s=d+112|0;t=d+120|0;u=d+128|0;w=d+144|0;x=d+152|0;y=d+160|0;z=d+168|0;A=d+176|0;B=d+192|0;C=d+200|0;D=C;E=i;i=i+8|0;F=E;G=i;i=i+8|0;H=i;i=i+8|0;I=i;i=i+8|0;J=i;i=i+16|0;K=i;i=i+16|0;L=i;i=i+16|0;c[C>>2]=0;c[C+4>>2]=0;c[E>>2]=0;c[E+4>>2]=0;M=a[b+239|0]|0;N=b+64|0;O=c[N>>2]|0;if((O|0)==3){fn(N,c[3524]|0);fC(b);i=d;return}else if((O|0)==2){fC(b);i=d;return}else{do{if((c[b+244>>2]|0)!=0){if((a[38984]&1)==0){break}i=d;return}}while(0);O=B|0;N=B+4|0;P=F+4|0;Q=D+4|0;R=b+260|0;S=b+252|0;i4(c[R>>2]|0,c[S>>2]|0,O,C);C=c[S>>2]|0;c[E>>2]=C;E=c[R>>2]|0;if((C|0)>0){R=0;S=E;while(1){b=R+1|0;T=c[S>>2]|0;if((b|0)<(C|0)){R=b;S=T}else{U=T;break}}}else{U=E}do{if((U|0)==0){V=8408}else{E=U;S=0;do{S=S+1|0;E=c[E>>2]|0;}while((E|0)!=0);if((S|0)<=0){V=8408;break}c[P>>2]=S;i4(U,S,N,Q)}}while(0);if((V|0)==8408){c[N>>2]=0}Q=(M&1)==0;M=A|0;U=A+8|0;P=A+4|0;E=u|0;R=u+8|0;C=u+4|0;T=p|0;b=p+8|0;W=p+4|0;X=J|0;Y=K|0;$=L|0;aa=J+8|0;J=K+8|0;K=L+8|0;L=k|0;ab=k+8|0;ac=k+4|0;ad=0;L11450:do{ae=(c[D+(ad<<2)>>2]|0)==0;af=ae?1:-1;ag=c[F+(ad<<2)>>2]|0;L11452:do{if((ag|0)>0){ah=c[B+(ad<<2)>>2]|0;ai=(ah|0)==0;aj=0;ak=0;do{if(ai){break L11452}al=c[ah+(aj<<2)>>2]|0;am=c[al+8>>2]|0;ak=ae?ak:am-1|0;an=c[al+12>>2]|0;ao=al+8|0;if((am|0)>0){am=2;al=0;ap=ak;while(1){aq=an+(ap<<6)|0;ar=c[aq>>2]|0;do{if((ar|0)==0){as=an+(ap<<6)+24|0;at=+h[as>>3];au=(+h[an+(ap<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;av=(+h[an+(ap<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aw=(at- +h[5279])*+h[2]+ +h[12]+-1.0;ax=+h[406]+au*+h[394]+av*+h[398]+aw*+h[402];ay=ax==0.0?1.0e-5:ax;az=~~((+h[403]+au*+h[391]+av*+h[395]+aw*+h[399])/ay*+(c[180]|0))+(c[186]|0)|0;aA=~~((+h[404]+au*+h[392]+av*+h[396]+aw*+h[400])/ay*+(c[40]|0))+(c[46]|0)|0;if((am|0)==0){aB=ap-af|0;if(Q){ay=+h[an+(aB<<6)+24>>3];aC=c[34]|0;aD=(a[64788+(aC*688&-1)|0]&1)==0;aE=(a[66852]&1)==0;do{if(aD){if(aE){aF=at;aG=ay;break}if(ay>0.0){aw=+_(+ay);aH=aw/+h[8358];V=8428;break}else{aI=+h[8341];V=8427;break}}else{if(aE){aI=+Z(+(ay*+h[64800+(aC*688&-1)>>3]));V=8427;break}if(+h[64792+(aC*688&-1)>>3]==+h[8357]){aJ=ay;V=8434;break}aJ=ay*+h[64800+(aC*688&-1)>>3]/+h[8358];V=8434}}while(0);do{if((V|0)==8427){V=0;if(aD){aH=aI;V=8428;break}if(!aE){aJ=aI;V=8434;break}aF=+Z(+(at*+h[64800+(aC*688&-1)>>3]));aG=aI}}while(0);do{if((V|0)==8428){V=0;if(aE){aF=at;aG=aH;break}if(at>0.0){ay=+_(+at);aF=ay/+h[8358];aG=aH;break}else{aF=+h[8341];aG=aH;break}}else if((V|0)==8434){V=0;if(+h[64792+(aC*688&-1)>>3]==+h[8357]){aF=at;aG=aJ;break}aF=at*+h[64800+(aC*688&-1)>>3]/+h[8358];aG=aJ}}while(0);aK=aG+aF}else{aK=+h[an+(aB<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}at=aK*.5;ay=+h[8341];do{if(ay<at){aw=+h[8342];if(aw<=at){aL=+((a[20668]|0)==112&1|0);break}av=(at-ay)/(aw-ay);if((a[20668]|0)==112){aL=av;break}aL=1.0-av}else{aL=+((a[20668]|0)!=112&1|0)}}while(0);aB=c[3524]|0;aC=aB+144|0;if((c[aC>>2]|0)==0){aM=aB}else{c[M>>2]=5;h[U>>3]=aL;c[P>>2]=0;cM[c[aC>>2]&511](A);aM=c[3524]|0}aC=c[8488]|0;c[w>>2]=c[8490];c[x>>2]=aC;c[y>>2]=az;c[z>>2]=aA;if((fl(w,x,y,z)|0)!=0){cN[c[aM+56>>2]&255](c[w>>2]|0,c[x>>2]|0);cN[c[aM+60>>2]&255](c[y>>2]|0,c[z>>2]|0)}c[8490]=az;c[8488]=aA;break}else if((am|0)==1){if((a[54160]&1)==0){c[8490]=az;c[8488]=aA;break}aC=ap-af|0;ul(an,aC,ap,G,H,I);ay=(+h[G>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;at=(+h[H>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;av=(+h[I>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;aw=+h[406]+ay*+h[394]+at*+h[398]+av*+h[402];au=aw==0.0?1.0e-5:aw;aB=~~((+h[403]+ay*+h[391]+at*+h[395]+av*+h[399])/au*+(c[180]|0))+(c[186]|0)|0;aE=~~((+h[404]+ay*+h[392]+at*+h[396]+av*+h[400])/au*+(c[40]|0))+(c[46]|0)|0;c[8490]=aB;c[8488]=aE;if(Q){au=+h[an+(aC<<6)+24>>3];aD=c[34]|0;aN=(a[64788+(aD*688&-1)|0]&1)==0;aO=(a[66852]&1)==0;L11513:do{if(aN){do{if(aO){aP=au}else{if(au>0.0){av=+_(+au);aP=av/+h[8358];break}else{aQ=+h[8341];V=8463;break L11513}}}while(0);aR=aP;aS=+h[as>>3];V=8464}else{if(aO){aQ=+Z(+(au*+h[64800+(aD*688&-1)>>3]));V=8463;break}if(+h[64792+(aD*688&-1)>>3]==+h[8357]){aT=au}else{aT=au*+h[64800+(aD*688&-1)>>3]/+h[8358]}aU=aT;aV=+h[as>>3];V=8465}}while(0);if((V|0)==8463){V=0;au=+h[as>>3];if(aN){aR=aQ;aS=au;V=8464}else{aU=aQ;aV=au;V=8465}}do{if((V|0)==8464){V=0;if(aO){aW=aS;aX=aR;break}if(aS>0.0){au=+_(+aS);aW=au/+h[8358];aX=aR;break}else{aW=+h[8341];aX=aR;break}}else if((V|0)==8465){V=0;if(aO){aW=+Z(+(aV*+h[64800+(aD*688&-1)>>3]));aX=aU;break}if(+h[64792+(aD*688&-1)>>3]==+h[8357]){aW=aV;aX=aU;break}aW=aV*+h[64800+(aD*688&-1)>>3]/+h[8358];aX=aU}}while(0);aY=aX+aW}else{aY=+h[an+(aC<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}au=aY*.5;av=+h[8341];do{if(av<au){at=+h[8342];if(at<=au){aZ=+((a[20668]|0)==112&1|0);break}ay=(au-av)/(at-av);if((a[20668]|0)==112){aZ=ay;break}aZ=1.0-ay}else{aZ=+((a[20668]|0)!=112&1|0)}}while(0);aC=c[3524]|0;aD=aC+144|0;if((c[aD>>2]|0)==0){a_=aB;a$=aE;a0=aC}else{c[E>>2]=5;h[R>>3]=aZ;c[C>>2]=0;cM[c[aD>>2]&511](u);a_=c[8490]|0;a$=c[8488]|0;a0=c[3524]|0}c[q>>2]=a_;c[r>>2]=a$;c[s>>2]=az;c[t>>2]=aA;if((fl(q,r,s,t)|0)!=0){cN[c[a0+56>>2]&255](c[q>>2]|0,c[r>>2]|0);cN[c[a0+60>>2]&255](c[s>>2]|0,c[t>>2]|0)}c[8490]=az;c[8488]=aA;break}else{c[8490]=az;c[8488]=aA;break}}else if((ar|0)==1){if((am|0)==0){if((a[54160]&1)==0){break}aD=ap-af|0;ul(an,aD,ap,G,H,I);av=(+h[G>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;au=(+h[H>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=(+h[I>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;at=+h[406]+av*+h[394]+au*+h[398]+ay*+h[402];aw=at==0.0?1.0e-5:at;aC=~~((+h[403]+av*+h[391]+au*+h[395]+ay*+h[399])/aw*+(c[180]|0))+(c[186]|0)|0;aO=~~((+h[404]+av*+h[392]+au*+h[396]+ay*+h[400])/aw*+(c[40]|0))+(c[46]|0)|0;if(Q){aw=+h[an+(aD<<6)+24>>3];aN=c[34]|0;as=(a[64788+(aN*688&-1)|0]&1)==0;a1=(a[66852]&1)==0;L11565:do{if(as){do{if(a1){a2=aw}else{if(aw>0.0){ay=+_(+aw);a2=ay/+h[8358];break}else{a3=+h[8341];V=8500;break L11565}}}while(0);a4=a2;a5=+h[an+(ap<<6)+24>>3];V=8501}else{if(a1){a3=+Z(+(aw*+h[64800+(aN*688&-1)>>3]));V=8500;break}if(+h[64792+(aN*688&-1)>>3]==+h[8357]){a6=aw}else{a6=aw*+h[64800+(aN*688&-1)>>3]/+h[8358]}a7=a6;a8=+h[an+(ap<<6)+24>>3];V=8502}}while(0);if((V|0)==8500){V=0;aw=+h[an+(ap<<6)+24>>3];if(as){a4=a3;a5=aw;V=8501}else{a7=a3;a8=aw;V=8502}}do{if((V|0)==8501){V=0;if(a1){a9=a5;ba=a4;break}if(a5>0.0){aw=+_(+a5);a9=aw/+h[8358];ba=a4;break}else{a9=+h[8341];ba=a4;break}}else if((V|0)==8502){V=0;if(a1){a9=+Z(+(a8*+h[64800+(aN*688&-1)>>3]));ba=a7;break}if(+h[64792+(aN*688&-1)>>3]==+h[8357]){a9=a8;ba=a7;break}a9=a8*+h[64800+(aN*688&-1)>>3]/+h[8358];ba=a7}}while(0);bb=ba+a9}else{bb=+h[an+(aD<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}aw=bb*.5;ay=+h[8341];do{if(ay<aw){au=+h[8342];if(au<=aw){bc=+((a[20668]|0)==112&1|0);break}av=(aw-ay)/(au-ay);if((a[20668]|0)==112){bc=av;break}bc=1.0-av}else{bc=+((a[20668]|0)!=112&1|0)}}while(0);aD=c[3524]|0;aN=aD+144|0;if((c[aN>>2]|0)==0){bd=aD}else{c[T>>2]=5;h[b>>3]=bc;c[W>>2]=0;cM[c[aN>>2]&511](p);bd=c[3524]|0}aN=c[8488]|0;c[l>>2]=c[8490];c[m>>2]=aN;c[n>>2]=aC;c[o>>2]=aO;if((fl(l,m,n,o)|0)!=0){cN[c[bd+56>>2]&255](c[l>>2]|0,c[m>>2]|0);cN[c[bd+60>>2]&255](c[n>>2]|0,c[o>>2]|0)}c[8490]=aC;c[8488]=aO;break}else if((am|0)!=1){break}if((a[54152]&1)==0){break}aN=ap-af|0;if(!(um(an,aN,ap,X,Y,$)|0)){break}ay=+h[64664+((c[200]|0)*688&-1)>>3];aw=+h[91];av=+h[96];au=(+h[X>>3]-ay)*aw+av+-1.0;at=+h[64664+((c[144]|0)*688&-1)>>3];ax=+h[21];be=+h[68];bf=(+h[Y>>3]-at)*ax+be+-1.0;bg=+h[5279];bh=+h[2];bi=+h[12];bj=(+h[$>>3]-bg)*bh+bi+-1.0;bk=+h[403];bl=+h[391];bm=+h[395];bn=+h[399];bo=+h[404];bp=+h[392];bq=+h[396];br=+h[400];bs=+h[406];bt=+h[394];bu=+h[398];bv=+h[402];bw=bs+au*bt+bf*bu+bj*bv;bx=bw==0.0?1.0e-5:bw;bw=+(c[180]|0);aD=c[186]|0;a1=~~((bk+au*bl+bf*bm+bj*bn)/bx*bw)+aD|0;by=+(c[40]|0);as=c[46]|0;aA=~~((bo+au*bp+bf*bq+bj*br)/bx*by)+as|0;bx=av+aw*(+h[aa>>3]-ay)+-1.0;ay=be+ax*(+h[J>>3]-at)+-1.0;at=bi+bh*(+h[K>>3]-bg)+-1.0;bg=bs+bt*bx+bu*ay+bv*at;bv=bg==0.0?1.0e-5:bg;az=~~(bw*((bk+bl*bx+bm*ay+bn*at)/bv))+aD|0;aD=~~(by*((bo+bp*bx+bq*ay+br*at)/bv))+as|0;c[8490]=a1;c[8488]=aA;if(Q){bv=+h[an+(aN<<6)+24>>3];as=c[34]|0;aE=(a[64788+(as*688&-1)|0]&1)==0;aB=(a[66852]&1)==0;L11615:do{if(aE){do{if(aB){bz=bv}else{if(bv>0.0){at=+_(+bv);bz=at/+h[8358];break}else{bA=+h[8341];V=8536;break L11615}}}while(0);bB=bz;bC=+h[an+(ap<<6)+24>>3];V=8537}else{if(aB){bA=+Z(+(bv*+h[64800+(as*688&-1)>>3]));V=8536;break}if(+h[64792+(as*688&-1)>>3]==+h[8357]){bD=bv}else{bD=bv*+h[64800+(as*688&-1)>>3]/+h[8358]}bE=bD;bF=+h[an+(ap<<6)+24>>3];V=8538}}while(0);if((V|0)==8536){V=0;bv=+h[an+(ap<<6)+24>>3];if(aE){bB=bA;bC=bv;V=8537}else{bE=bA;bF=bv;V=8538}}do{if((V|0)==8537){V=0;if(aB){bG=bC;bH=bB;break}if(bC>0.0){bv=+_(+bC);bG=bv/+h[8358];bH=bB;break}else{bG=+h[8341];bH=bB;break}}else if((V|0)==8538){V=0;if(aB){bG=+Z(+(bF*+h[64800+(as*688&-1)>>3]));bH=bE;break}if(+h[64792+(as*688&-1)>>3]==+h[8357]){bG=bF;bH=bE;break}bG=bF*+h[64800+(as*688&-1)>>3]/+h[8358];bH=bE}}while(0);bI=bH+bG}else{bI=+h[an+(aN<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}bv=bI*.5;at=+h[8341];do{if(at<bv){br=+h[8342];if(br<=bv){bJ=+((a[20668]|0)==112&1|0);break}ay=(bv-at)/(br-at);if((a[20668]|0)==112){bJ=ay;break}bJ=1.0-ay}else{bJ=+((a[20668]|0)!=112&1|0)}}while(0);aN=c[3524]|0;as=aN+144|0;if((c[as>>2]|0)==0){bK=a1;bL=aA;bM=aN}else{c[L>>2]=5;h[ab>>3]=bJ;c[ac>>2]=0;cM[c[as>>2]&511](k);bK=c[8490]|0;bL=c[8488]|0;bM=c[3524]|0}c[e>>2]=bK;c[f>>2]=bL;c[g>>2]=az;c[j>>2]=aD;if((fl(e,f,g,j)|0)!=0){cN[c[bM+56>>2]&255](c[e>>2]|0,c[f>>2]|0);cN[c[bM+60>>2]&255](c[g>>2]|0,c[j>>2]|0)}c[8490]=az;c[8488]=aD}else if((ar|0)!=2){V=8557;break L11450}}while(0);ar=al+1|0;if((ar|0)<(c[ao>>2]|0)){am=c[aq>>2]|0;al=ar;ap=ap+af|0}else{break}}}aj=aj+1|0;}while((aj|0)<(ag|0))}}while(0);ad=ad+1|0;}while((ad|0)<2);if((V|0)==8557){uk(203224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}V=c[O>>2]|0;if((V|0)!=0){uu(V)}V=c[N>>2]|0;if((V|0)==0){i=d;return}uu(V);i=d;return}}function fC(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0,ay=0;d=i;i=i+216|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+72|0;q=d+80|0;r=d+88|0;s=d+96|0;t=d+104|0;u=d+112|0;w=d+120|0;x=d+128|0;y=d+144|0;z=d+152|0;A=d+160|0;B=d+168|0;C=d+184|0;D=d+200|0;E=c[b+260>>2]|0;do{if((c[b+244>>2]|0)!=0){if((a[38984]&1)==0){break}i=d;return}}while(0);do{if((a[b+239|0]&1)==0){F=0}else{if((c[b+64>>2]|0)!=3){F=0;break}F=+h[b+72>>3]<0.0}}while(0);if((E|0)==0){i=d;return}G=x|0;H=x+4|0;I=x+8|0;J=B|0;K=C|0;L=D|0;M=B+8|0;B=C+8|0;C=D+8|0;D=b+64|0;N=D|0;O=b+68|0;b=E;L11686:while(1){E=c[b+12>>2]|0;P=b+8|0;if((c[P>>2]|0)>0){Q=0;R=2;while(1){do{if(F){S=(c[3524]|0)+144|0;if((c[S>>2]|0)==0){break}T=~~+h[E+(Q<<6)+32>>3];c[G>>2]=3;c[H>>2]=T;h[I>>3]=0.0;cM[c[S>>2]&511](x)}else{if((c[N>>2]|0)!=2){break}c[O>>2]=~~+h[E+(Q<<6)+32>>3];fn(D,c[3524]|0)}}while(0);S=E+(Q<<6)|0;T=c[S>>2]|0;do{if((T|0)==0){U=(+h[E+(Q<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;V=(+h[E+(Q<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;W=(+h[E+(Q<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;X=+h[406]+U*+h[394]+V*+h[398]+W*+h[402];Y=X==0.0?1.0e-5:X;Z=~~((+h[403]+U*+h[391]+V*+h[395]+W*+h[399])/Y*+(c[180]|0))+(c[186]|0)|0;_=~~((+h[404]+U*+h[392]+V*+h[396]+W*+h[400])/Y*+(c[40]|0))+(c[46]|0)|0;if((R|0)==0){$=c[8488]|0;c[s>>2]=c[8490];c[t>>2]=$;c[u>>2]=Z;c[w>>2]=_;$=c[3524]|0;if((fl(s,t,u,w)|0)!=0){cN[c[$+56>>2]&255](c[s>>2]|0,c[t>>2]|0);cN[c[$+60>>2]&255](c[u>>2]|0,c[w>>2]|0)}c[8490]=Z;c[8488]=_;break}else if((R|0)==1){if((a[54160]&1)==0){c[8490]=Z;c[8488]=_;break}ul(E,Q-1|0,Q,y,z,A);Y=(+h[y>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;W=(+h[z>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;V=(+h[A>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;U=+h[406]+Y*+h[394]+W*+h[398]+V*+h[402];X=U==0.0?1.0e-5:U;$=~~((+h[403]+Y*+h[391]+W*+h[395]+V*+h[399])/X*+(c[180]|0))+(c[186]|0)|0;aa=~~((+h[404]+Y*+h[392]+W*+h[396]+V*+h[400])/X*+(c[40]|0))+(c[46]|0)|0;c[8490]=$;c[8488]=aa;c[k>>2]=$;c[l>>2]=aa;c[m>>2]=Z;c[n>>2]=_;aa=c[3524]|0;if((fl(k,l,m,n)|0)!=0){cN[c[aa+56>>2]&255](c[k>>2]|0,c[l>>2]|0);cN[c[aa+60>>2]&255](c[m>>2]|0,c[n>>2]|0)}c[8490]=Z;c[8488]=_;break}else{c[8490]=Z;c[8488]=_;break}}else if((T|0)==1){if((R|0)==0){if((a[54160]&1)==0){break}ul(E,Q-1|0,Q,y,z,A);X=(+h[y>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;V=(+h[z>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;W=(+h[A>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;Y=+h[406]+X*+h[394]+V*+h[398]+W*+h[402];U=Y==0.0?1.0e-5:Y;_=~~((+h[403]+X*+h[391]+V*+h[395]+W*+h[399])/U*+(c[180]|0))+(c[186]|0)|0;Z=~~((+h[404]+X*+h[392]+V*+h[396]+W*+h[400])/U*+(c[40]|0))+(c[46]|0)|0;aa=c[8488]|0;c[e>>2]=c[8490];c[f>>2]=aa;c[g>>2]=_;c[j>>2]=Z;aa=c[3524]|0;if((fl(e,f,g,j)|0)!=0){cN[c[aa+56>>2]&255](c[e>>2]|0,c[f>>2]|0);cN[c[aa+60>>2]&255](c[g>>2]|0,c[j>>2]|0)}c[8490]=_;c[8488]=Z;break}else if((R|0)!=1){break}if((a[54152]&1)==0){break}if(!(um(E,Q-1|0,Q,J,K,L)|0)){break}U=+h[64664+((c[200]|0)*688&-1)>>3];W=+h[91];V=+h[96];X=(+h[J>>3]-U)*W+V+-1.0;Y=+h[64664+((c[144]|0)*688&-1)>>3];ab=+h[21];ac=+h[68];ad=(+h[K>>3]-Y)*ab+ac+-1.0;ae=+h[5279];af=+h[2];ag=+h[12];ah=(+h[L>>3]-ae)*af+ag+-1.0;ai=+h[403];aj=+h[391];ak=+h[395];al=+h[399];am=+h[404];an=+h[392];ao=+h[396];ap=+h[400];aq=+h[406];ar=+h[394];as=+h[398];at=+h[402];au=aq+X*ar+ad*as+ah*at;av=au==0.0?1.0e-5:au;au=+(c[180]|0);Z=c[186]|0;_=~~((ai+X*aj+ad*ak+ah*al)/av*au)+Z|0;aw=+(c[40]|0);aa=c[46]|0;$=~~((am+X*an+ad*ao+ah*ap)/av*aw)+aa|0;av=V+W*(+h[M>>3]-U)+-1.0;U=ac+ab*(+h[B>>3]-Y)+-1.0;Y=ag+af*(+h[C>>3]-ae)+-1.0;ae=aq+ar*av+as*U+at*Y;at=ae==0.0?1.0e-5:ae;ax=~~(au*((ai+aj*av+ak*U+al*Y)/at))+Z|0;Z=~~(aw*((am+an*av+ao*U+ap*Y)/at))+aa|0;c[8490]=_;c[8488]=$;c[o>>2]=_;c[p>>2]=$;c[q>>2]=ax;c[r>>2]=Z;$=c[3524]|0;if((fl(o,p,q,r)|0)!=0){cN[c[$+56>>2]&255](c[o>>2]|0,c[p>>2]|0);cN[c[$+60>>2]&255](c[q>>2]|0,c[r>>2]|0)}c[8490]=ax;c[8488]=Z}else if((T|0)!=2){ay=8605;break L11686}}while(0);T=Q+1|0;if((T|0)<(c[P>>2]|0)){Q=T;R=c[S>>2]|0}else{break}}}R=c[b>>2]|0;if((R|0)==0){ay=8611;break}else{b=R}}if((ay|0)==8605){uk(203224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ay|0)==8611){i=d;return}}function fD(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0.0,T=0.0,U=0;g=i;i=i+16|0;j=g|0;k=c[13542]|0;l=c[9006]|0;m=l+d|0;n=c[9010]|0;o=n+d|0;p=b+64|0;q=c[p>>2]|0;r=c[3524]|0;if((f|0)==-1){s=1.0}else{s=((+h[3817]+-1.0)*.5+1.0)*3.0}t=+(l-n|0);n=~~(t/(+((c[r+20>>2]|0)>>>0>>>0)*s)+.5);l=(n|0)<2?2:n;s=+(l|0);u=t/s;if((q|0)==1){v=8617}else if((q|0)==3){if(+h[b+72>>3]>=0.0){v=8617}}else if((q|0)==2){if((c[b+28>>2]|0)!=-6){v=8617}}if((v|0)==8617){fn(p,r);p=c[13542]|0;q=c[3524]|0;c[13542]=(c[q+96>>2]&128|0)==0?55520:0;cM[c[q+168>>2]&511](8);q=(c[9018]|0)+d|0;d=c[13542]|0;if((d|0)==0){v=8619}else{n=(c[d>>2]|0)>(q|0)&1;w=(c[d+4>>2]|0)<(q|0)?n|2:n;n=(c[d+8>>2]|0)>(e|0)?w|4:w;if((((c[d+12>>2]|0)<(e|0)?n|8:n)|0)==0){v=8619}}if((v|0)==8619){cR[c[(c[3524]|0)+80>>2]&127](q,e,f)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=p;i=g;return}p=(a[b+239|0]&1)==0;q=c[b+260>>2]|0;if((q|0)==0){i=g;return}n=c[b+252>>2]|0;b=0;d=q;t=-8.988465674311579e+307;x=-8.988465674311579e+307;y=8.988465674311579e+307;while(1){if((b|0)>=(n|0)){z=x;A=y;break}q=c[d+12>>2]|0;w=c[d+8>>2]|0;if((w|0)>0){B=0;C=t;D=x;E=y;while(1){do{if((c[q+(B<<6)>>2]|0)==0){if(p){F=q+(B<<6)+24|0}else{F=q+(B<<6)+32|0}G=+h[F>>3];H=G<E;I=H?G:E;J=H?D:C;if(G<=J){K=J;L=D;M=I;break}K=G;L=G;M=I}else{K=C;L=D;M=E}}while(0);H=B+1|0;if((H|0)<(w|0)){B=H;C=K;D=L;E=M}else{N=K;O=L;P=M;break}}}else{N=t;O=x;P=y}B=c[d>>2]|0;if((B|0)==0){z=O;A=P;break}else{b=b+1|0;d=B;t=N;x=O;y=P}}if(A>z){i=g;return}P=+h[8341];y=A>P?A:P;A=+h[8342];O=z<A?z:A;do{if(P<y){if(A<=y){d=a[20668]|0;Q=+(d<<24>>24==112&1|0);R=d;break}z=(y-P)/(A-P);d=a[20668]|0;if(d<<24>>24==112){Q=z;R=112;break}Q=1.0-z;R=d}else{d=a[20668]|0;Q=+(d<<24>>24!=112&1|0);R=d}}while(0);do{if(P<O){if(A<=O){S=+(R<<24>>24==112&1|0);break}y=(O-P)/(A-P);if(R<<24>>24==112){S=y;break}S=1.0-y}else{S=+(R<<24>>24!=112&1|0)}}while(0);P=(S-Q)/s;c[13542]=(c[r+96>>2]&128|0)==0?55520:0;if((l|0)>=0){r=j|0;R=j+8|0;d=j+4|0;b=0;do{F=(b|0)==(l|0);if(F){T=S}else{T=Q+P*+(b|0)}p=(c[3524]|0)+144|0;if((c[p>>2]|0)!=0){c[r>>2]=5;h[R>>3]=T;c[d>>2]=0;cM[c[p>>2]&511](j)}p=(b|0)==0;if(p|F){U=p?o:m}else{U=~~(u*+(b|0)+.5)+o|0}p=c[13542]|0;if((p|0)==0){v=8657}else{F=(c[p>>2]|0)>(U|0)&1;n=(c[p+4>>2]|0)<(U|0)?F|2:F;F=(c[p+8>>2]|0)>(e|0)?n|4:n;if((((c[p+12>>2]|0)<(e|0)?F|8:F)|0)==0){v=8657}}if((v|0)==8657){v=0;cR[c[(c[3524]|0)+80>>2]&127](U,e,f)}b=b+1|0;}while((b|0)<=(l|0))}c[13542]=k;i=g;return}function fE(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;i=i+16|0;f=e|0;g=c[3524]|0;j=c[b+260>>2]|0;if((j|0)==0){i=e;return}k=b+64|0;l=b+239|0;m=b+72|0;n=b+68|0;o=f|0;p=f+4|0;q=f+8|0;r=b+12|0;s=g+80|0;t=b+48|0;u=g+92|0;g=j;do{j=(c[k>>2]|0)==3;if((a[l]&1)!=0&j){v=+h[m>>3]<0.0}else{v=0}do{if(!(v|j^1)){w=c[n>>2]|0;x=(c[3524]|0)+144|0;if((c[x>>2]|0)==0){break}c[o>>2]=3;c[p>>2]=w;h[q>>3]=0.0;cM[c[x>>2]&511](f)}}while(0);j=g+8|0;x=c[j>>2]|0;if((x|0)>0){w=g+12|0;y=0;z=x;while(1){x=c[w>>2]|0;A=x+(y<<6)|0;do{if((c[A>>2]|0)==0){B=(+h[x+(y<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;C=(+h[x+(y<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;D=(+h[x+(y<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;E=+h[406]+B*+h[394]+C*+h[398]+D*+h[402];F=E==0.0?1.0e-5:E;G=~~((+h[403]+B*+h[391]+C*+h[395]+D*+h[399])/F*+(c[180]|0))+(c[186]|0)|0;H=~~((+h[404]+B*+h[392]+C*+h[396]+D*+h[400])/F*+(c[40]|0))+(c[46]|0)|0;I=c[13542]|0;if((I|0)!=0){J=(c[I>>2]|0)>(G|0)&1;K=(c[I+4>>2]|0)<(G|0)?J|2:J;J=(c[I+8>>2]|0)>(H|0)?K|4:K;if((((c[I+12>>2]|0)<(H|0)?J|8:J)|0)!=0){L=z;break}}fL(b,A);J=c[r>>2]|0;do{if((J|0)==18|(J|0)==51){if(+h[t>>3]!=-3.0){break}cK[c[u>>2]&63](+h[3817]*+h[x+(y<<6)+48>>3])}}while(0);cR[c[s>>2]&127](G,H,d);L=c[j>>2]|0}else{L=z}}while(0);x=y+1|0;if((x|0)<(L|0)){y=x;z=L}else{break}}}g=c[g>>2]|0;}while((g|0)!=0);i=e;return}function fF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=i;i=i+48|0;f=e|0;g=c[13542]|0;if((c[5094]|0)!=0){c[13542]=31752}j=c[11690]|0;if((j&2|0)==0){k=j}else{j=b+4|0;l=c[j>>2]|0;m=+h[l+24>>3];n=(+h[l+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;o=(+h[l+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;p=(m- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[404]+n*+h[392]+o*+h[396]+p*+h[400];r=+h[405]+n*+h[393]+o*+h[397]+p*+h[401];s=+h[406]+n*+h[394]+o*+h[398]+p*+h[402];t=s==0.0?1.0e-5:s;s=(+h[403]+n*+h[391]+o*+h[395]+p*+h[399])/t;l=f|0;h[l>>3]=s;p=q/t;u=f+8|0;h[u>>3]=p;q=r/t;v=f+16|0;h[v>>3]=q;w=f+32|0;h[w>>3]=m;x=f+40|0;c[x>>2]=0;if((a[38984]&1)==0){y=f;c[7612]=c[y>>2];c[7613]=c[y+4>>2];c[7614]=c[y+8>>2];c[7615]=c[y+12>>2];c[7616]=c[y+16>>2];c[7617]=c[y+20>>2];c[7618]=c[y+24>>2];c[7619]=c[y+28>>2];c[7620]=c[y+32>>2];c[7621]=c[y+36>>2];c[7622]=c[y+40>>2];c[7623]=c[y+44>>2];z=8695}else{if(q==-2.0){y=f;c[7612]=c[y>>2];c[7613]=c[y+4>>2];c[7614]=c[y+8>>2];c[7615]=c[y+12>>2];c[7616]=c[y+16>>2];c[7617]=c[y+20>>2];c[7618]=c[y+24>>2];c[7619]=c[y+28>>2];c[7620]=c[y+32>>2];c[7621]=c[y+36>>2];c[7622]=c[y+40>>2];c[7623]=c[y+44>>2]}else{h[v>>3]=q+.01;y=f;c[7612]=c[y>>2];c[7613]=c[y+4>>2];c[7614]=c[y+8>>2];c[7615]=c[y+12>>2];c[7616]=c[y+16>>2];c[7617]=c[y+20>>2];c[7618]=c[y+24>>2];c[7619]=c[y+28>>2];c[7620]=c[y+32>>2];c[7621]=c[y+36>>2];c[7622]=c[y+40>>2];c[7623]=c[y+44>>2]}if((a[46752]&1)==0){z=8695}}if((z|0)==8695){cN[c[(c[3524]|0)+56>>2]&255](~~(s*+(c[180]|0))+(c[186]|0)|0,~~(p*+(c[40]|0))+(c[46]|0)|0)}y=b+44|0;if((c[y>>2]|0)>1){A=1;do{B=c[j>>2]|0;p=+h[B+(A<<6)+24>>3];s=(+h[B+(A<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;q=(+h[B+(A<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;m=(p- +h[5279])*+h[2]+ +h[12]+-1.0;t=+h[404]+s*+h[392]+q*+h[396]+m*+h[400];r=+h[405]+s*+h[393]+q*+h[397]+m*+h[401];o=+h[406]+s*+h[394]+q*+h[398]+m*+h[402];n=o==0.0?1.0e-5:o;h[l>>3]=(+h[403]+s*+h[391]+q*+h[395]+m*+h[399])/n;h[u>>3]=t/n;t=r/n;h[v>>3]=t;h[w>>3]=p;c[x>>2]=0;if(!((a[38984]&1)==0|t==-2.0)){h[v>>3]=t+.01}up(f,d);A=A+1|0;}while((A|0)<(c[y>>2]|0))}k=c[11690]|0}do{if((k&1|0)!=0){y=b+4|0;A=c[y>>2]|0;t=+h[7076];p=(+h[A+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;n=(+h[A+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;r=(t- +h[5279])*+h[2]+ +h[12]+-1.0;m=+h[404]+p*+h[392]+n*+h[396]+r*+h[400];q=+h[405]+p*+h[393]+n*+h[397]+r*+h[401];s=+h[406]+p*+h[394]+n*+h[398]+r*+h[402];o=s==0.0?1.0e-5:s;s=(+h[403]+p*+h[391]+n*+h[395]+r*+h[399])/o;v=f|0;h[v>>3]=s;r=m/o;x=f+8|0;h[x>>3]=r;w=f+16|0;h[w>>3]=q/o;u=f+32|0;h[u>>3]=t;l=f+40|0;c[l>>2]=0;h[u>>3]=+h[A+24>>3];A=f;c[7612]=c[A>>2];c[7613]=c[A+4>>2];c[7614]=c[A+8>>2];c[7615]=c[A+12>>2];c[7616]=c[A+16>>2];c[7617]=c[A+20>>2];c[7618]=c[A+24>>2];c[7619]=c[A+28>>2];c[7620]=c[A+32>>2];c[7621]=c[A+36>>2];c[7622]=c[A+40>>2];c[7623]=c[A+44>>2];if((a[38984]&1)==0){z=8704}else{if((a[46752]&1)==0){z=8704}}if((z|0)==8704){cN[c[(c[3524]|0)+56>>2]&255](~~(s*+(c[180]|0))+(c[186]|0)|0,~~(r*+(c[40]|0))+(c[46]|0)|0)}A=b+44|0;if((c[A>>2]|0)>1){C=1}else{break}do{j=c[y>>2]|0;r=+h[7076];s=(+h[j+(C<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;t=(+h[j+(C<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;o=(r- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[404]+s*+h[392]+t*+h[396]+o*+h[400];m=+h[405]+s*+h[393]+t*+h[397]+o*+h[401];n=+h[406]+s*+h[394]+t*+h[398]+o*+h[402];p=n==0.0?1.0e-5:n;h[v>>3]=(+h[403]+s*+h[391]+t*+h[395]+o*+h[399])/p;h[x>>3]=q/p;h[w>>3]=m/p;h[u>>3]=r;c[l>>2]=0;h[u>>3]=+h[j+(C<<6)+24>>3];up(f,d);C=C+1|0;}while((C|0)<(c[A>>2]|0))}}while(0);if((c[5094]|0)==0){i=e;return}c[13542]=g;i=e;return}function fG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;e=i;i=i+48|0;f=e|0;g=c[11690]|0;do{if((g&2|0)==0){j=g}else{k=b+44|0;if((c[k>>2]|0)<=0){j=g;break}l=b+4|0;m=f|0;n=f+8|0;o=f+16|0;p=f+32|0;q=f+40|0;r=0;do{s=c[l>>2]|0;t=+h[s+(r<<6)+24>>3];u=(+h[s+(r<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;v=(+h[s+(r<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;w=(t- +h[5279])*+h[2]+ +h[12]+-1.0;x=+h[404]+u*+h[392]+v*+h[396]+w*+h[400];y=+h[405]+u*+h[393]+v*+h[397]+w*+h[401];z=+h[406]+u*+h[394]+v*+h[398]+w*+h[402];A=z==0.0?1.0e-5:z;h[m>>3]=(+h[403]+u*+h[391]+v*+h[395]+w*+h[399])/A;h[n>>3]=x/A;x=y/A;h[o>>3]=x;h[p>>3]=t;c[q>>2]=0;if(!((a[38984]&1)==0|x==-2.0)){h[o>>3]=x+.01}uo(f,d);r=r+1|0;}while((r|0)<(c[k>>2]|0));j=c[11690]|0}}while(0);if((j&1|0)==0){i=e;return}j=b+44|0;if((c[j>>2]|0)<=0){i=e;return}g=b+4|0;b=f|0;k=f+8|0;r=f+16|0;o=f+32|0;q=f+40|0;p=0;do{n=c[g>>2]|0;x=(+h[n+(p<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;t=(+h[n+(p<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;A=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;y=+h[404]+x*+h[392]+t*+h[396]+A*+h[400];w=+h[405]+x*+h[393]+t*+h[397]+A*+h[401];v=+h[406]+x*+h[394]+t*+h[398]+A*+h[402];u=v==0.0?1.0e-5:v;h[b>>3]=(+h[403]+x*+h[391]+t*+h[395]+A*+h[399])/u;h[k>>3]=y/u;h[r>>3]=w/u;c[q>>2]=0;h[o>>3]=+h[n+(p<<6)+24>>3];uo(f,d);p=p+1|0;}while((p|0)<(c[j>>2]|0));i=e;return}function fH(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0,W=0,X=0;j=i;i=i+144|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+80|0;o=j+128|0;p=j+136|0;q=(e|0)!=0;if(q){r=65056+(b*688&-1)|0}else{r=65064+(b*688&-1)|0}s=65072+(b*688&-1)|0;t=+h[r>>3]*((a[s]&1)!=0?1.0:-1.0);r=c[144]|0;u=+h[64664+(r*688&-1)>>3];v=+h[97];w=u+ +h[64672+(r*688&-1)>>3]-v;r=c[3524]|0;x=+h[7076];y=c[200]|0;z=(d- +h[64664+(y*688&-1)>>3])*+h[91]+ +h[96]+-1.0;A=(v-u)*+h[21]+ +h[68]+-1.0;u=(x- +h[5279])*+h[2]+ +h[12]+-1.0;v=+h[404]+z*+h[392]+A*+h[396]+u*+h[400];B=+h[405]+z*+h[393]+A*+h[397]+u*+h[401];C=+h[406]+z*+h[394]+A*+h[398]+u*+h[402];D=C==0.0?1.0e-5:C;E=m|0;h[E>>3]=(+h[403]+z*+h[391]+A*+h[395]+u*+h[399])/D;F=m+8|0;h[F>>3]=v/D;G=m+16|0;h[G>>3]=B/D;H=m+32|0;h[H>>3]=x;I=m+40|0;c[I>>2]=0;if((c[f+4>>2]|0)>-3){J=r+168|0;cM[c[J>>2]&511](3);x=+h[7076];D=(d- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;B=(w- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;v=(x- +h[5279])*+h[2]+ +h[12]+-1.0;u=+h[404]+D*+h[392]+B*+h[396]+v*+h[400];A=+h[405]+D*+h[393]+B*+h[397]+v*+h[401];z=+h[406]+D*+h[394]+B*+h[398]+v*+h[402];C=z==0.0?1.0e-5:z;h[n>>3]=(+h[403]+D*+h[391]+B*+h[395]+v*+h[399])/C;h[n+8>>3]=u/C;h[n+16>>3]=A/C;h[n+32>>3]=x;c[n+40>>2]=0;do{if((a[38984]&1)==0){K=8734}else{if((a[46752]&1)==0){K=8734;break}gt(m,n,f)}}while(0);if((K|0)==8734){un(m,n,f,f+40|0)}cM[c[J>>2]&511](4);L=c[200]|0}else{L=y}do{if((c[64916+(L*688&-1)>>2]&2|0)!=0){y=c[144]|0;if((a[64788+(y*688&-1)|0]&1)!=0){break}x=+h[64664+(y*688&-1)>>3];C=+h[64672+(y*688&-1)>>3];if(x<C){if(x>0.0|C<0.0){break}}else{if(C>0.0|x<0.0){break}}C=+h[7076];A=(d- +h[64664+(L*688&-1)>>3])*+h[91]+ +h[96]+-1.0;u=(0.0-x)*+h[21]+ +h[68]+-1.0;x=(C- +h[5279])*+h[2]+ +h[12]+-1.0;v=+h[404]+A*+h[392]+u*+h[396]+x*+h[400];B=+h[405]+A*+h[393]+u*+h[397]+x*+h[401];D=+h[406]+A*+h[394]+u*+h[398]+x*+h[402];z=D==0.0?1.0e-5:D;h[E>>3]=(+h[403]+A*+h[391]+u*+h[395]+x*+h[399])/z;h[F>>3]=v/z;h[G>>3]=B/z;h[H>>3]=C;c[I>>2]=0}}while(0);L=r+24|0;y=n|0;h[y>>3]=+h[E>>3]+t*+h[695]*+((c[L>>2]|0)>>>0>>>0);J=n+8|0;h[J>>3]=+h[F>>3]+t*+h[694]*+((c[L>>2]|0)>>>0>>>0);f=n+16|0;h[f>>3]=+h[G>>3]+t*+h[693]*+((c[L>>2]|0)>>>0>>>0);M=n+32|0;h[M>>3]=+h[H>>3];do{if((a[38984]&1)==0){K=8745}else{if((a[46752]&1)==0){K=8745;break}gt(m,n,56296)}}while(0);if((K|0)==8745){un(m,n,56296,56336)}N=l;c[N>>2]=c[14084];c[N+4>>2]=c[56340>>2];c[N+8>>2]=c[56344>>2];c[N+12>>2]=c[56348>>2];N=c[14075]|0;do{if((c[14074]|0)!=0){C=+h[7040];O=c[(c[3524]|0)+92>>2]|0;if(C<0.0){cK[O&63](+h[3817]);break}else{cK[O&63](C);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);O=c[(c[3524]|0)+64>>2]|0;if((N|0)<-5){cM[O&511](-2)}else{cM[O&511](N)}O=c[3524]|0;do{if((a[56328]&1)==0){if((c[O+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=N;K=8756}else{K=8756}}while(0);if((K|0)==8756){fn(l,O)}do{if(q){L11938:do{if((g|0)==0){Q=e}else{O=c[200]|0;C=+h[64672+(O*688&-1)>>3]- +h[64664+(O*688&-1)>>3];O=g;while(1){if(+P(+((d- +h[O>>3])/C))<=.001){Q=0;break L11938}l=c[O+16>>2]|0;if((l|0)==0){Q=e;break}else{O=l}}}}while(0);fx(64984+(b*688&-1)|0,o,p,99744);C=+h[695];z=+(c[180]|0);B=C*z;if(B<-.9){R=0}else{R=B<.9?1:2}O=c[5094]|0;do{if((O|0)==0){S=R}else{if((a[65272+(b*688&-1)|0]&1)==0){S=R;break}S=c[65128+(b*688&-1)>>2]|0}}while(0);B=+h[E>>3]-C*+((c[r+20>>2]|0)>>>0>>>0);h[y>>3]=B;v=+h[694];x=+h[F>>3]-v*+((c[r+16>>2]|0)>>>0>>>0);h[J>>3]=x;if((a[s]&1)==0){u=+h[65056+(b*688&-1)>>3];A=B-u*C*+((c[L>>2]|0)>>>0>>>0);h[y>>3]=A;D=x-u*v*+((c[L>>2]|0)>>>0>>>0);h[J>>3]=D;T=A;U=D}else{T=B;U=x}l=~~(T*z)+(c[186]|0)|0;N=~~(U*+(c[40]|0))+(c[46]|0)|0;V=64928+(b*688&-1)|0;if((c[V>>2]|0)==0){W=O}else{fn(V,r);W=c[5094]|0}V=c[65032+(b*688&-1)>>2]|0;if((W|0)==0|(V|0)==0){K=8773}else{if((cO[c[(c[3524]|0)+72>>2]&255](V)|0)==0){K=8773}else{X=V}}if((K|0)==8773){X=0}ln(l+(c[o>>2]|0)|0,N+(c[p>>2]|0)|0,Q,S,0,X,c[64924+(b*688&-1)>>2]|0);N=c[(c[3524]|0)+72>>2]|0;cO[N&255](0);N=k;c[N>>2]=c[14084];c[N+4>>2]=c[56340>>2];c[N+8>>2]=c[56344>>2];c[N+12>>2]=c[56348>>2];N=c[14075]|0;do{if((c[14074]|0)!=0){x=+h[7040];l=c[(c[3524]|0)+92>>2]|0;if(x<0.0){cK[l&63](+h[3817]);break}else{cK[l&63](x);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);O=c[(c[3524]|0)+64>>2]|0;if((N|0)<-5){cM[O&511](-2)}else{cM[O&511](N)}O=c[3524]|0;if((a[56328]&1)==0){if((c[O+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=N}fn(k,O)}}while(0);k=c[200]|0;if((c[64916+(k*688&-1)>>2]&4|0)==0){i=j;return}U=+h[7076];T=(d- +h[64664+(k*688&-1)>>3])*+h[91]+ +h[96]+-1.0;d=(w- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;w=(U- +h[5279])*+h[2]+ +h[12]+-1.0;z=+h[404]+T*+h[392]+d*+h[396]+w*+h[400];C=+h[405]+T*+h[393]+d*+h[397]+w*+h[401];x=+h[406]+T*+h[394]+d*+h[398]+w*+h[402];B=x==0.0?1.0e-5:x;x=(+h[403]+T*+h[391]+d*+h[395]+w*+h[399])/B;h[E>>3]=x;w=z/B;h[F>>3]=w;z=C/B;h[G>>3]=z;h[H>>3]=U;c[I>>2]=0;h[y>>3]=x-t*+h[695]*+((c[L>>2]|0)>>>0>>>0);h[J>>3]=w-t*+h[694]*+((c[L>>2]|0)>>>0>>>0);h[f>>3]=z-t*+h[693]*+((c[L>>2]|0)>>>0>>>0);h[M>>3]=U;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(m,n,56296);i=j;return}}while(0);un(m,n,56296,56336);i=j;return}function fI(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0.0,T=0.0,U=0,V=0.0,W=0,X=0.0,Y=0,Z=0,_=0,$=0;j=i;i=i+128|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+64|0;n=j+112|0;o=j+120|0;p=(e|0)!=0;if(p){q=65056+(b*688&-1)|0}else{q=65064+(b*688&-1)|0}r=65072+(b*688&-1)|0;s=+h[q>>3]*((a[r]&1)!=0?1.0:-1.0);q=c[200]|0;t=+h[64664+(q*688&-1)>>3];u=+h[69];v=t+ +h[64672+(q*688&-1)>>3]-u;q=c[3524]|0;w=+h[7076];x=(u-t)*+h[91]+ +h[96]+-1.0;y=c[144]|0;t=(d- +h[64664+(y*688&-1)>>3])*+h[21]+ +h[68]+-1.0;u=(w- +h[5279])*+h[2]+ +h[12]+-1.0;z=+h[404]+x*+h[392]+t*+h[396]+u*+h[400];A=+h[405]+x*+h[393]+t*+h[397]+u*+h[401];B=+h[406]+x*+h[394]+t*+h[398]+u*+h[402];C=B==0.0?1.0e-5:B;D=l|0;h[D>>3]=(+h[403]+x*+h[391]+t*+h[395]+u*+h[399])/C;E=l+8|0;h[E>>3]=z/C;F=l+16|0;h[F>>3]=A/C;G=l+32|0;h[G>>3]=w;H=l+40|0;c[H>>2]=0;if((c[f+4>>2]|0)>-3){I=q+168|0;cM[c[I>>2]&511](3);w=+h[7076];C=(v- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;A=(d- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;z=(w- +h[5279])*+h[2]+ +h[12]+-1.0;u=+h[404]+C*+h[392]+A*+h[396]+z*+h[400];t=+h[405]+C*+h[393]+A*+h[397]+z*+h[401];x=+h[406]+C*+h[394]+A*+h[398]+z*+h[402];B=x==0.0?1.0e-5:x;h[m>>3]=(+h[403]+C*+h[391]+A*+h[395]+z*+h[399])/B;h[m+8>>3]=u/B;h[m+16>>3]=t/B;h[m+32>>3]=w;c[m+40>>2]=0;do{if((a[38984]&1)==0){J=8801}else{if((a[46752]&1)==0){J=8801;break}gt(l,m,f)}}while(0);if((J|0)==8801){un(l,m,f,f+40|0)}cM[c[I>>2]&511](4);K=c[144]|0}else{K=y}do{if((c[64916+(K*688&-1)>>2]&2|0)!=0){y=c[200]|0;if((a[64788+(y*688&-1)|0]&1)!=0){break}w=+h[64664+(y*688&-1)>>3];B=+h[64672+(y*688&-1)>>3];if(w<B){if(w>0.0|B<0.0){break}}else{if(B>0.0|w<0.0){break}}B=+h[7076];t=(0.0-w)*+h[91]+ +h[96]+-1.0;w=(d- +h[64664+(K*688&-1)>>3])*+h[21]+ +h[68]+-1.0;u=(B- +h[5279])*+h[2]+ +h[12]+-1.0;z=+h[404]+t*+h[392]+w*+h[396]+u*+h[400];A=+h[405]+t*+h[393]+w*+h[397]+u*+h[401];C=+h[406]+t*+h[394]+w*+h[398]+u*+h[402];x=C==0.0?1.0e-5:C;h[D>>3]=(+h[403]+t*+h[391]+w*+h[395]+u*+h[399])/x;h[E>>3]=z/x;h[F>>3]=A/x;h[G>>3]=B;c[H>>2]=0}}while(0);K=q+28|0;y=m|0;h[y>>3]=+h[D>>3]+s*+h[695]*+((c[K>>2]|0)>>>0>>>0);I=m+8|0;h[I>>3]=+h[E>>3]+s*+h[694]*+((c[K>>2]|0)>>>0>>>0);f=m+16|0;h[f>>3]=+h[F>>3]+s*+h[693]*+((c[K>>2]|0)>>>0>>>0);L=m+32|0;h[L>>3]=+h[G>>3];do{if((a[38984]&1)==0){J=8812}else{if((a[46752]&1)==0){J=8812;break}gt(l,m,56296)}}while(0);if((J|0)==8812){un(l,m,56296,56336)}do{if(p){L12016:do{if((g|0)==0){M=e}else{N=c[144]|0;B=+h[64672+(N*688&-1)>>3]- +h[64664+(N*688&-1)>>3];N=g;while(1){if(+P(+((d- +h[N>>3])/B))<=.001){M=0;break L12016}O=c[N+16>>2]|0;if((O|0)==0){M=e;break}else{N=O}}}}while(0);fx(64984+(b*688&-1)|0,n,o,94352);B=+h[695];N=c[180]|0;x=B*+(N|0);if(x<-.9){Q=0}else{Q=x<.9?1:2}O=c[5094]|0;do{if((O|0)==0){R=Q}else{if((a[65272+(b*688&-1)|0]&1)==0){R=Q;break}R=c[65128+(b*688&-1)>>2]|0}}while(0);x=+h[D>>3]-B*+((c[q+20>>2]|0)>>>0>>>0);h[y>>3]=x;A=+h[694];z=+h[E>>3]-A*+((c[q+16>>2]|0)>>>0>>>0);h[I>>3]=z;if((a[r]&1)==0){u=+h[65056+(b*688&-1)>>3];w=x-u*B*+((c[K>>2]|0)>>>0>>>0);h[y>>3]=w;t=z-u*A*+((c[q+24>>2]|0)>>>0>>>0);h[I>>3]=t;S=w;T=t}else{S=x;T=z}U=64928+(b*688&-1)|0;if((c[U>>2]|0)==0){V=S;W=N;X=T;Y=O}else{fn(U,q);V=+h[y>>3];W=c[180]|0;X=+h[I>>3];Y=c[5094]|0}U=~~(V*+(W|0))+(c[186]|0)|0;Z=~~(X*+(c[40]|0))+(c[46]|0)|0;_=c[65032+(b*688&-1)>>2]|0;if((Y|0)==0|(_|0)==0){J=8829}else{if((cO[c[(c[3524]|0)+72>>2]&255](_)|0)==0){J=8829}else{$=_}}if((J|0)==8829){$=0}ln(U+(c[n>>2]|0)|0,Z+(c[o>>2]|0)|0,M,R,0,$,c[64924+(b*688&-1)>>2]|0);Z=c[(c[3524]|0)+72>>2]|0;cO[Z&255](0);Z=k;c[Z>>2]=c[14084];c[Z+4>>2]=c[56340>>2];c[Z+8>>2]=c[56344>>2];c[Z+12>>2]=c[56348>>2];Z=c[14075]|0;do{if((c[14074]|0)!=0){z=+h[7040];U=c[(c[3524]|0)+92>>2]|0;if(z<0.0){cK[U&63](+h[3817]);break}else{cK[U&63](z);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);O=c[(c[3524]|0)+64>>2]|0;if((Z|0)<-5){cM[O&511](-2)}else{cM[O&511](Z)}O=c[3524]|0;if((a[56328]&1)==0){if((c[O+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=Z}fn(k,O)}}while(0);k=c[144]|0;if((c[64916+(k*688&-1)>>2]&4|0)==0){i=j;return}X=+h[7076];V=(v- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;v=(d- +h[64664+(k*688&-1)>>3])*+h[21]+ +h[68]+-1.0;d=(X- +h[5279])*+h[2]+ +h[12]+-1.0;T=+h[404]+V*+h[392]+v*+h[396]+d*+h[400];S=+h[405]+V*+h[393]+v*+h[397]+d*+h[401];B=+h[406]+V*+h[394]+v*+h[398]+d*+h[402];z=B==0.0?1.0e-5:B;B=(+h[403]+V*+h[391]+v*+h[395]+d*+h[399])/z;h[D>>3]=B;d=T/z;h[E>>3]=d;T=S/z;h[F>>3]=T;h[G>>3]=X;c[H>>2]=0;h[y>>3]=B-s*+h[695]*+((c[K>>2]|0)>>>0>>>0);h[I>>3]=d-s*+h[694]*+((c[K>>2]|0)>>>0>>>0);h[f>>3]=T-s*+h[693]*+((c[K>>2]|0)>>>0>>>0);h[L>>3]=X;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(l,m,56296);i=j;return}}while(0);un(l,m,56296,56336);i=j;return}function fJ(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ab=0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0;j=i;i=i+176|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+64|0;n=j+112|0;o=j+160|0;p=j+168|0;q=(e|0)!=0;if(q){r=65056+(b*688&-1)|0}else{r=65064+(b*688&-1)|0}s=65072+(b*688&-1)|0;t=c[3524]|0;u=~~(+((c[t+28>>2]|0)>>>0>>>0)*+h[r>>3]*((a[s]&1)!=0?1.0:-1.0));if((c[64916+(b*688&-1)>>2]&2|0)==0){v=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;w=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;x=(d- +h[5279])*+h[2]+ +h[12]+-1.0;y=+h[404]+v*+h[392]+w*+h[396]+x*+h[400];z=+h[405]+v*+h[393]+w*+h[397]+x*+h[401];A=+h[406]+v*+h[394]+w*+h[398]+x*+h[402];B=A==0.0?1.0e-5:A;A=(+h[403]+v*+h[391]+w*+h[395]+x*+h[399])/B;h[l>>3]=A;x=y/B;h[l+8>>3]=x;y=z/B;h[l+16>>3]=y;h[l+32>>3]=d;c[l+40>>2]=0;C=A;D=x;E=y}else{y=(0.0- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;x=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;A=(d- +h[5279])*+h[2]+ +h[12]+-1.0;B=+h[404]+y*+h[392]+x*+h[396]+A*+h[400];z=+h[405]+y*+h[393]+x*+h[397]+A*+h[401];w=+h[406]+y*+h[394]+x*+h[398]+A*+h[402];v=w==0.0?1.0e-5:w;w=(+h[403]+y*+h[391]+x*+h[395]+A*+h[399])/v;h[l>>3]=w;A=B/v;h[l+8>>3]=A;B=z/v;h[l+16>>3]=B;h[l+32>>3]=d;c[l+40>>2]=0;C=w;D=A;E=B}if((c[f+4>>2]|0)>-3){r=t+168|0;cM[c[r>>2]&511](3);B=+h[64664+((c[200]|0)*688&-1)>>3];A=+h[91];w=+h[96];v=(+h[7089]-B)*A+w+-1.0;z=+h[64664+((c[144]|0)*688&-1)>>3];x=+h[21];y=+h[68];F=(+h[7088]-z)*x+y+-1.0;G=(d- +h[5279])*+h[2]+ +h[12]+-1.0;H=+h[403];I=+h[391];J=+h[395];K=G*+h[399];L=+h[404];M=+h[392];N=+h[396];O=G*+h[400];Q=+h[405];R=+h[393];S=+h[397];T=G*+h[401];U=+h[406];V=+h[394];W=+h[398];X=G*+h[402];G=U+v*V+F*W+X;Y=G==0.0?1.0e-5:G;t=m|0;h[t>>3]=(H+v*I+F*J+K)/Y;Z=m+8|0;h[Z>>3]=(L+v*M+F*N+O)/Y;_=m+16|0;h[_>>3]=(Q+v*R+F*S+T)/Y;$=m+32|0;h[$>>3]=d;c[m+40>>2]=0;Y=(+h[3305]-B)*A+w+-1.0;w=(+h[3304]-z)*x+y+-1.0;y=U+Y*V+w*W+X;X=y==0.0?1.0e-5:y;h[n>>3]=(H+Y*I+w*J+K)/X;h[n+8>>3]=(L+Y*M+w*N+O)/X;h[n+16>>3]=(Q+Y*R+w*S+T)/X;h[n+32>>3]=d;c[n+40>>2]=0;do{if((a[38984]&1)==0){aa=8861}else{if((a[46752]&1)==0){aa=8861;break}gt(l,m,f)}}while(0);if((aa|0)==8861){un(l,m,f,f+40|0)}do{if((a[38984]&1)==0){aa=8865}else{if((a[46752]&1)==0){aa=8865;break}gt(m,n,f)}}while(0);if((aa|0)==8865){un(m,n,f,f+40|0)}cM[c[r>>2]&511](4);r=l|0;f=l+8|0;n=l+16|0;ab=l+32|0;ac=+h[r>>3];ad=+h[f>>3];ae=+h[n>>3];af=+h[ab>>3];ag=r;ah=t;ai=f;aj=Z;ak=n;al=_;am=ab;an=$}else{ac=C;ad=D;ae=E;af=d;ag=l|0;ah=m|0;ai=l+8|0;aj=m+8|0;ak=l+16|0;al=m+16|0;am=l+32|0;an=m+32|0}E=+(u|0);h[ah>>3]=ac+E/+(c[180]|0);h[aj>>3]=ad;h[al>>3]=ae;h[an>>3]=af;do{if((a[38984]&1)==0){aa=8870}else{if((a[46752]&1)==0){aa=8870;break}gt(l,m,56296)}}while(0);if((aa|0)==8870){un(l,m,56296,56336)}do{if(q){L12097:do{if((g|0)==0){ao=e}else{u=c[34]|0;af=+h[64672+(u*688&-1)>>3]- +h[64664+(u*688&-1)>>3];u=g;while(1){if(+P(+((d- +h[u>>3])/af))<=.001){ao=0;break L12097}$=c[u+16>>2]|0;if(($|0)==0){ao=e;break}else{u=$}}}}while(0);fx(64984+(b*688&-1)|0,o,p,73288);u=~~(+h[ai>>3]*+(c[40]|0))+(c[46]|0)|0;$=c[3524]|0;ab=c[$+28>>2]|0;_=(~~(+h[ag>>3]*+(c[180]|0))+(c[186]|0)|0)-(ab<<1)|0;if((a[s]&1)==0){ap=~~(+(_>>>0>>>0)- +(ab>>>0>>>0)*+h[65056+(b*688&-1)>>3])}else{ap=_}_=64928+(b*688&-1)|0;ab=c[_>>2]|0;if((ab|0)==6){h[64936+(b*688&-1)>>3]=d;aa=8880}else if((ab|0)!=0){aa=8880}if((aa|0)==8880){fn(_,$)}ln((c[o>>2]|0)+ap|0,u+(c[p>>2]|0)|0,ao,2,1,0,c[64924+(b*688&-1)>>2]|0);u=k;c[u>>2]=c[14084];c[u+4>>2]=c[56340>>2];c[u+8>>2]=c[56344>>2];c[u+12>>2]=c[56348>>2];u=c[14075]|0;do{if((c[14074]|0)!=0){af=+h[7040];$=c[(c[3524]|0)+92>>2]|0;if(af<0.0){cK[$&63](+h[3817]);break}else{cK[$&63](af);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);$=c[(c[3524]|0)+64>>2]|0;if((u|0)<-5){cM[$&511](-2)}else{cM[$&511](u)}$=c[3524]|0;if((a[56328]&1)==0){if((c[$+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=u}fn(k,$)}}while(0);if((c[64916+((c[34]|0)*688&-1)>>2]&4|0)==0){i=j;return}af=(+h[3305]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ae=(+h[3304]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ad=(d- +h[5279])*+h[2]+ +h[12]+-1.0;ac=+h[404]+af*+h[392]+ae*+h[396]+ad*+h[400];D=+h[405]+af*+h[393]+ae*+h[397]+ad*+h[401];C=+h[406]+af*+h[394]+ae*+h[398]+ad*+h[402];X=C==0.0?1.0e-5:C;C=(+h[403]+af*+h[391]+ae*+h[395]+ad*+h[399])/X;h[ag>>3]=C;ad=ac/X;h[ai>>3]=ad;ac=D/X;h[ak>>3]=ac;h[am>>3]=d;c[l+40>>2]=0;h[ah>>3]=C-E/+(c[180]|0);h[aj>>3]=ad;h[al>>3]=ac;h[an>>3]=d;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(l,m,56296);i=j;return}}while(0);un(l,m,56296,56336);i=j;return}function fK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;h[g>>3]=+h[a+16>>3];h[j>>3]=+h[a+24>>3];h[k>>3]=+h[a+32>>3];l=(fM(a,e,g,j,k)|0)==0;m=+h[g>>3];if(l){n=(m- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;o=(+h[j>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;p=(+h[k>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[406]+n*+h[394]+o*+h[398]+p*+h[402];r=q==0.0?1.0e-5:q;q=(+h[404]+n*+h[392]+o*+h[396]+p*+h[400])/r;h[b>>3]=+(~~((+h[403]+n*+h[391]+o*+h[395]+p*+h[399])/r*+(c[180]|0))+(c[186]|0)|0);s=+(~~(q*+(c[40]|0))+(c[46]|0)|0);h[d>>3]=s;i=f;return}else{h[b>>3]=m;s=+h[j>>3];h[d>>3]=s;i=f;return}}function fL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0;e=i;i=i+48|0;f=e|0;g=e+16|0;j=e+32|0;k=b+64|0;l=c[k>>2]|0;if((l|0)==6|(l|0)==0){if((a[55536]&1)==0){i=e;return}if((a[b+56|0]&1)==0){i=e;return}if((a[b+239|0]&1)!=0){m=+h[d+32>>3];n=+h[8341];do{if(n<m){o=+h[8342];if(o<=m){p=+((a[20668]|0)==112&1|0);break}q=(m-n)/(o-n);if((a[20668]|0)==112){p=q;break}p=1.0-q}else{p=+((a[20668]|0)!=112&1|0)}}while(0);r=(c[3524]|0)+144|0;if((c[r>>2]|0)==0){i=e;return}c[g>>2]=5;h[g+8>>3]=p;c[g+4>>2]=0;cM[c[r>>2]&511](g);i=e;return}p=+h[d+24>>3];g=c[34]|0;r=(a[66852]&1)==0;do{if((a[64788+(g*688&-1)|0]&1)==0){if(r){s=p;break}if(p>0.0){n=+_(+p);s=n/+h[8358];break}else{s=+h[8341];break}}else{if(r){s=+Z(+(p*+h[64800+(g*688&-1)>>3]));break}if(+h[64792+(g*688&-1)>>3]==+h[8357]){s=p;break}s=p*+h[64800+(g*688&-1)>>3]/+h[8358]}}while(0);p=+h[8341];do{if(p<s){n=+h[8342];if(n<=s){t=+((a[20668]|0)==112&1|0);break}m=(s-p)/(n-p);if((a[20668]|0)==112){t=m;break}t=1.0-m}else{t=+((a[20668]|0)!=112&1|0)}}while(0);g=(c[3524]|0)+144|0;if((c[g>>2]|0)==0){i=e;return}c[f>>2]=5;h[f+8>>3]=t;c[f+4>>2]=0;cM[c[g>>2]&511](f);i=e;return}else if((l|0)==3){if((a[b+239|0]&1)==0){i=e;return}f=(c[3524]|0)+144|0;if((c[f>>2]|0)==0){i=e;return}g=~~+h[d+32>>3];c[j>>2]=3;c[j+4>>2]=g;h[j+8>>3]=0.0;cM[c[f>>2]&511](j);i=e;return}else if((l|0)==2){c[b+68>>2]=~~+h[d+32>>3];fn(k,c[3524]|0);i=e;return}else{i=e;return}}function fM(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;j=i;k=c[b>>2]|0;if((k|0)==4){h[e>>3]=+h[e>>3]*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)+.5;l=0;m=1;n=0}else if((k|0)==2){o=c[200]|0;p=+h[64664+(o*688&-1)>>3];h[e>>3]=p+ +h[e>>3]*(+h[64672+(o*688&-1)>>3]-p);l=1;m=0;n=0}else if((k|0)==3){h[e>>3]=+h[e>>3]*+(((c[(c[3524]|0)+8>>2]|0)-1|0)>>>0>>>0)+.5;l=0;m=0;n=1}else if((k|0)==0|(k|0)==1){p=+h[e>>3];do{if((a[66164]&1)==0){q=p}else{if(p>0.0){r=+_(+p);q=r/+h[8272];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56880,h[v+16>>3]=p,v)|0);return 0}}}while(0);h[e>>3]=q;l=1;m=0;n=0}else{l=0;m=0;n=0}e=c[b+4>>2]|0;if((e|0)==2){k=c[144]|0;if((c[5094]|0)==0){q=+h[64664+(k*688&-1)>>3];s=q+ +h[f>>3]*(+h[64672+(k*688&-1)>>3]-q)}else{q=+h[64672+(k*688&-1)>>3];s=q- +h[f>>3]*(q- +h[64664+(k*688&-1)>>3])}h[f>>3]=s;t=1;u=m;w=n}else if((e|0)==4){h[f>>3]=+h[f>>3]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)+.5;t=l;u=1;w=n}else if((e|0)==0|(e|0)==1){s=+h[f>>3];do{if((a[65476]&1)==0){x=s}else{if(s>0.0){q=+_(+s);x=q/+h[8186];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56856,h[v+16>>3]=s,v)|0);return 0}}}while(0);h[f>>3]=x;t=1;u=m;w=n}else if((e|0)==3){h[f>>3]=+h[f>>3]*+(((c[(c[3524]|0)+12>>2]|0)-1|0)>>>0>>>0)+.5;t=l;u=m;w=1}else{t=l;u=m;w=n}n=c[b+8>>2]|0;if((n|0)==2){b=c[34]|0;x=+h[64664+(b*688&-1)>>3];h[g>>3]=x+ +h[g>>3]*(+h[64672+(b*688&-1)>>3]-x);y=1;z=u;A=w}else if((n|0)==4){y=t;z=1;A=w}else if((n|0)==0|(n|0)==1){x=+h[g>>3];do{if((a[64788]&1)==0){B=x}else{if(x>0.0){s=+_(+x);B=s/+h[8100];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56832,h[v+16>>3]=x,v)|0);return 0}}}while(0);h[g>>3]=B;y=1;z=u;A=w}else if((n|0)==3){y=t;z=u;A=1}else{y=t;z=u;A=w}w=A|z;if(y&w){uk(218688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{i=j;return w&1|0}return 0}function fN(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;g=i;j=c[b>>2]|0;if((j|0)==2){h[d>>3]=+h[b+16>>3]*+((c[7939]|0)-(c[7938]|0)|0)}else if((j|0)==3){h[d>>3]=+h[b+16>>3]*+(((c[(c[3524]|0)+8>>2]|0)-1|0)>>>0>>>0)}else if((j|0)==4){h[d>>3]=+h[b+16>>3]*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}else if((j|0)==0){k=+h[b+16>>3];do{if((a[66164]&1)==0){l=k}else{if(k>0.0){m=+_(+k);l=m/+h[8272];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56880,h[v+16>>3]=k,v)|0)}}}while(0);h[d>>3]=l*+h[8269]}else if((j|0)==1){l=+h[b+16>>3];do{if((a[68916]&1)==0){n=l}else{if(l>0.0){k=+_(+l);n=k/+h[8616];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56976,h[v+16>>3]=l,v)|0)}}}while(0);h[d>>3]=n*+h[8613]}d=c[b+4>>2]|0;if((d|0)==4){h[e>>3]=+h[b+24>>3]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0);i=g;return}else if((d|0)==1){n=+h[b+24>>3];do{if((a[68228]&1)==0){o=n}else{if(n>0.0){l=+_(+n);o=l/+h[8530];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56952,h[v+16>>3]=n,v)|0)}}}while(0);h[e>>3]=o*+h[8527];i=g;return}else if((d|0)==0){o=+h[b+24>>3];do{if((a[65476]&1)==0){p=o}else{if(o>0.0){n=+_(+o);p=n/+h[8186];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56856,h[v+16>>3]=o,v)|0)}}}while(0);h[e>>3]=p*+h[8183];i=g;return}else if((d|0)==2){h[e>>3]=+h[b+24>>3]*+((c[7941]|0)-(c[7940]|0)|0);i=g;return}else if((d|0)==3){h[e>>3]=+h[b+24>>3]*+(((c[(c[3524]|0)+12>>2]|0)-1|0)>>>0>>>0);i=g;return}else{i=g;return}}function fO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0.0,aa=0.0,ab=0,ac=0,ad=0,ae=0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0,ak=0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0.0,aO=0.0,aP=0,aQ=0.0,aR=0;f=i;i=i+224|0;g=f|0;j=f+16|0;k=f+32|0;l=f+48|0;m=f+64|0;n=f+72|0;o=f+80|0;p=f+88|0;q=f+96|0;r=f+120|0;s=f+128|0;t=f+136|0;u=f+144|0;v=f+152|0;w=f+160|0;x=f+168|0;y=f+192|0;z=f+200|0;A=f+208|0;B=f+216|0;if((b|0)==0){i=f;return}C=x|0;D=(e|0)==2;E=k;F=x+7|0;x=k|0;G=k+4|0;H=j;I=j|0;J=j+4|0;K=g;L=g|0;M=g+4|0;N=q|0;O=l;P=q+7|0;q=l|0;Q=l+4|0;R=b;do{L12294:do{if((c[R+8>>2]|0)==(d|0)){b=R+52|0;S=c[b>>2]|0;do{if((S|0)==-7){if((c[R+12>>2]|0)!=1){T=9026;break}U=c[12302]|0;V=c[12303]|0;W=+h[6153];X=+h[6154];Y=a[49240]|0;uD(C|0,49241,23);Z=U;_=V;$=W;aa=X;ab=Y}else{T=9026}}while(0);if((T|0)==9026){T=0;Y=c[R+48>>2]|0;X=+h[R+64>>3];W=+h[R+72>>3];V=a[R+80|0]|0;uD(C|0,R+81|0,23);Z=Y;_=S;$=X;aa=W;ab=V}V=R+16|0;Y=V|0;if((c[Y>>2]|0)==3){if((c[R+12>>2]|0)==1){ac=49176}else{T=9029}}else{T=9029}if((T|0)==9029){T=0;ac=V}U=c[ac>>2]|0;if((U|0)==1|(U|0)==4){ad=(c[ac+4>>2]<<4&65520)+U|0}else if((U|0)==2|(U|0)==5){ad=(c[ac+8>>2]<<4&65520)+U|0}else{ad=0}U=c[R+12>>2]|0;if((U|0)==1){do{if((c[R+104>>2]|0)==1){ae=R+112|0;do{if(D){T=9089}else{if((c[ae>>2]|0)==3){T=9089;break}if((c[5094]|0)==0){break L12294}fK(ae,m,n,173728);fx(R+152|0,t,u,173728);W=+(c[t>>2]|0);h[r>>3]=W;X=+(c[u>>2]|0);h[s>>3]=X;af=W;ag=X}}while(0);if((T|0)==9089){T=0;fR(ae,m,n,173728);fN(R+152|0,r,s,173728);af=+h[r>>3];ag=+h[s>>3]}X=+h[m>>3]-af*.5;h[m>>3]=X;W=+h[n>>3]-ag*.5;h[n>>3]=W;ah=af+X;h[o>>3]=ah;ai=ag+W;h[p>>3]=ai;aj=(c[R+156>>2]|0)>>>0<2;ak=(c[R+152>>2]|0)>>>0<2;al=ah;am=X;an=ai;ao=W}else{ap=R+192|0;do{if(D){T=9096}else{if((c[ap>>2]|0)==3){if((c[R+232>>2]|0)==3){T=9096;break}}if((c[5094]|0)==0){break L12294}fK(ap,m,n,173728);fK(R+232|0,o,p,173728)}}while(0);if((T|0)==9096){T=0;fR(ap,m,n,173728);fR(R+232|0,o,p,173728)}W=+h[m>>3];ai=+h[o>>3];if(W>ai){h[m>>3]=ai;h[o>>3]=W;aq=W;ar=ai}else{aq=ai;ar=W}W=+h[n>>3];ai=+h[p>>3];if(W>ai){h[n>>3]=ai;h[p>>3]=W;as=W;at=ai}else{as=ai;at=W}if((c[R+192>>2]|0)==3){au=0}else{au=(c[R+232>>2]|0)!=3}if((c[R+196>>2]|0)==3){aj=0;ak=au;al=aq;am=ar;an=as;ao=at;break}aj=(c[R+236>>2]|0)!=3;ak=au;al=aq;am=ar;an=as;ao=at}}while(0);S=c[13542]|0;if((S|0)==0){av=al;aw=am;ax=an;ay=ao}else{do{if(ak){W=+(c[S>>2]|0);if(am<W){h[m>>3]=W;az=W}else{az=am}W=+(c[S+4>>2]|0);if(al<=W){aA=az;aB=al;break}h[o>>3]=W;aA=az;aB=W}else{aA=am;aB=al}}while(0);do{if(aj){W=+(c[S+8>>2]|0);if(ao<W){h[n>>3]=W;aC=W}else{aC=ao}W=+(c[S+12>>2]|0);if(an<=W){aD=aC;aE=an;break}h[p>>3]=W;aD=aC;aE=W}else{aD=ao;aE=an}}while(0);if(aA>aB|aD>aE){break}else{av=aB;aw=aA;ax=aE;ay=aD}}S=~~(av-aw);ae=~~(ax-ay);aF=~~aw;aG=~~ay;if((S|0)==0|(ae|0)==0){break}aH=c[b>>2]|0;if((aH|0)==-7){aI=c[12302]|0;aJ=c[12303]|0;W=+h[6153];ai=+h[6154];aK=a[49240]|0;uD(N|0,49241,23);aL=aI;aM=aJ;aN=W;aO=ai;aP=aK}else{aK=c[R+48>>2]|0;ai=+h[R+64>>3];W=+h[R+72>>3];aJ=a[R+80|0]|0;uD(N|0,R+81|0,23);aL=aK;aM=aH;aN=ai;aO=W;aP=aJ}if(aN>0.0){aQ=+h[R+64>>3]}else{aQ=aN}aJ=(c[Y>>2]|0)==3?49176:V;uD(O|0,P|0,16);do{if((aL|0)!=0){aH=c[(c[3524]|0)+92>>2]|0;if(aO<0.0){cK[aH&63](+h[3817]);break}else{cK[aH&63](aO);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](aQ);V=c[(c[3524]|0)+64>>2]|0;if((aM|0)<-5){cM[V&511](-2)}else{cM[V&511](aM)}V=c[3524]|0;do{if((aP&1)==0){if((c[V+96>>2]&1024|0)!=0){break}c[q>>2]=1;c[Q>>2]=aM;T=9135}else{T=9135}}while(0);if((T|0)==9135){T=0;fn(l,V)}Y=c[aJ>>2]|0;if((Y|0)==1|(Y|0)==4){aR=aJ+4|0;T=9139}else if((Y|0)==2|(Y|0)==5){aR=aJ+8|0;T=9139}do{if((T|0)==9139){T=0;b=(c[aR>>2]<<4&65520)+Y|0;if((b|0)==0){break}aH=c[(c[3524]|0)+108>>2]|0;if((aH|0)==0){break}cI[aH&63](b,aF,aG,S,ae)}}while(0);if(!(hG(aJ)|0)){break}cN[c[(c[3524]|0)+56>>2]&255](aF,aG);Y=ae+aG|0;cN[c[(c[3524]|0)+60>>2]&255](aF,Y);V=S+aF|0;cN[c[(c[3524]|0)+60>>2]&255](V,Y);cN[c[(c[3524]|0)+60>>2]&255](V,aG);cN[c[(c[3524]|0)+60>>2]&255](aF,aG);break}else if((U|0)==2){V=c[13542]|0;Y=R+112|0;do{if(D){T=9036}else{if((c[Y>>2]|0)==3){T=9036;break}if((c[5094]|0)==0){break L12294}fK(Y,v,w,173728);fx(R+152|0,A,B,173728);h[y>>3]=+(c[A>>2]|0)}}while(0);if((T|0)==9036){T=0;fR(Y,v,w,173728);fN(R+152|0,y,z,173728)}uD(E|0,F|0,16);do{if((Z|0)!=0){aG=c[(c[3524]|0)+92>>2]|0;if(aa<0.0){cK[aG&63](+h[3817]);break}else{cK[aG&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63]($);Y=c[(c[3524]|0)+64>>2]|0;if((_|0)<-5){cM[Y&511](-2)}else{cM[Y&511](_)}Y=c[3524]|0;do{if((ab&1)==0){if((c[Y+96>>2]&1024|0)!=0){break}c[x>>2]=1;c[G>>2]=_;T=9049}else{T=9049}}while(0);if((T|0)==9049){T=0;fn(k,Y)}do{if((c[R+112>>2]|0)==3){if((c[R+116>>2]|0)!=3){break}c[13542]=55520}}while(0);Y=R+192|0;aG=R+200|0;lq(~~+h[v>>3],~~+h[w>>3],+h[y>>3],+h[Y>>3],+h[aG>>3],ad);if(hG(ac)|0){lq(~~+h[v>>3],~~+h[w>>3],+h[y>>3],+h[Y>>3],+h[aG>>3],0)}c[13542]=V;break}else if((U|0)==3){uD(H|0,F|0,16);do{if((Z|0)!=0){aG=c[(c[3524]|0)+92>>2]|0;if(aa<0.0){cK[aG&63](+h[3817]);break}else{cK[aG&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63]($);V=c[(c[3524]|0)+64>>2]|0;if((_|0)<-5){cM[V&511](-2)}else{cM[V&511](_)}V=c[3524]|0;do{if((ab&1)==0){if((c[V+96>>2]&1024|0)!=0){break}c[I>>2]=1;c[J>>2]=_;T=9066}else{T=9066}}while(0);if((T|0)==9066){T=0;fn(j,V)}if(D){fP(2,R+104|0,ad,1)}else{if((c[5094]|0)==0){break}fP(3,R+104|0,ad,1)}if(!(hG(ac)|0)){break}fP(e,R+104|0,0,1);break}else if((U|0)==4){uD(K|0,F|0,16);do{if((Z|0)!=0){aG=c[(c[3524]|0)+92>>2]|0;if(aa<0.0){cK[aG&63](+h[3817]);break}else{cK[aG&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63]($);U=c[(c[3524]|0)+64>>2]|0;if((_|0)<-5){cM[U&511](-2)}else{cM[U&511](_)}U=c[3524]|0;do{if((ab&1)==0){if((c[U+96>>2]&1024|0)!=0){break}c[L>>2]=1;c[M>>2]=_;T=9083}else{T=9083}}while(0);if((T|0)==9083){T=0;fn(g,U)}V=R+104|0;fQ(e,V,ad);if(!(hG(ac)|0)){break}fQ(e,V,0);break}else{break}}}while(0);R=c[R>>2]|0;}while((R|0)!=0);i=f;return}function fP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0.0,K=0;f=i;i=i+1568|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+1472|0;o=f+1480|0;p=f+1488|0;q=f+1496|0;r=f+1504|0;s=f+1512|0;t=f+1520|0;u=f+1528|0;v=+h[b+88>>3]*.017453292519943295;w=+S(+v);x=+T(+v);v=+h[b+64>>3]*.5;y=+h[b+72>>3]*.5;z=u;A=b+48|0;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];c[z+16>>2]=c[A+16>>2];c[z+20>>2]=c[A+20>>2];c[z+24>>2]=c[A+24>>2];c[z+28>>2]=c[A+28>>2];c[z+32>>2]=c[A+32>>2];c[z+36>>2]=c[A+36>>2];A=c[3524]|0;B=+((c[A+24>>2]|0)>>>0>>>0)/+((c[A+28>>2]|0)>>>0>>>0);do{if(e){A=b+8|0;if((a|0)==2){fR(A,n,o,73152);break}else{fK(A,n,o,73152);break}}else{h[n>>3]=+h[b+24>>3];h[o>>3]=+h[b+32>>3]}}while(0);c[m+8>>2]=d;C=w*v;D=x*y;A=u+16|0;E=x*v;v=w*y;z=u+24|0;F=(a|0)==2;a=b|0;b=n;G=o;y=0.0;H=0;while(1){w=+S(+y);x=+T(+y);I=C*w-D*x;h[A>>3]=I;J=E*w+v*x;h[z>>3]=J;do{if(e){K=c[a>>2]|0;if(F){if((K|0)==2){fN(u,r,q,73152);h[z>>3]=+h[A>>3];fN(u,r,p,73152);break}else if((K|0)==0){fN(u,p,q,73152);break}else if((K|0)==1){fN(u,p,r,73152);h[A>>3]=+h[z>>3];fN(u,q,r,73152);break}else{break}}else{if((K|0)==2){fx(u,s,t,73152);h[q>>3]=+(c[t>>2]|0);h[z>>3]=+h[A>>3];fx(u,t,s,73152);h[p>>3]=+(c[s>>2]|0);break}else if((K|0)==0){fx(u,s,t,73152);h[p>>3]=+(c[s>>2]|0);h[q>>3]=+(c[t>>2]|0);break}else if((K|0)==1){fx(u,s,t,73152);h[p>>3]=+(c[s>>2]|0);h[A>>3]=+h[z>>3];fx(u,t,s,73152);h[q>>3]=+(c[t>>2]|0);break}else{break}}}else{h[p>>3]=I;h[q>>3]=J}}while(0);K=m+(H*12&-1)|0;c[K>>2]=~~(+h[n>>3]+ +h[p>>3]);J=+h[o>>3];I=+h[q>>3];if(e){c[m+(H*12&-1)+4>>2]=~~(J+I)}else{c[m+(H*12&-1)+4>>2]=~~(J+B*I)}fl(b,G,K,m+(H*12&-1)+4|0);K=H+1|0;if((K|0)<73){y=y+.08726646259971647;H=K}else{break}}H=m|0;if((d|0)!=0){d=c[(c[3524]|0)+148>>2]|0;if((d|0)==0){i=f;return}cN[d&255](72,H);i=f;return}H=0;while(1){d=c[m+(H*12&-1)+4>>2]|0;G=H+1|0;b=c[m+(G*12&-1)>>2]|0;e=c[m+(G*12&-1)+4>>2]|0;c[g>>2]=c[m+(H*12&-1)>>2];c[j>>2]=d;c[k>>2]=b;c[l>>2]=e;e=c[3524]|0;if((fl(g,j,k,l)|0)!=0){cN[c[e+56>>2]&255](c[g>>2]|0,c[j>>2]|0);cN[c[e+60>>2]&255](c[k>>2]|0,c[l>>2]|0)}if((G|0)<72){H=G}else{break}}i=f;return}function fQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;i=i+112|0;f=e|0;g=e+8|0;j=e+16|0;k=e+24|0;l=e+32|0;m=e+40|0;n=e+48|0;o=e+56|0;p=e+64|0;q=e+72|0;r=e+80|0;s=e+88|0;t=e+96|0;u=c[13542]|0;v=b+4|0;if((c[v>>2]|0)==0){i=e;return}w=b|0;b=c[w>>2]|0;if((b|0)<2){i=e;return}c[11720]=db(c[11720]|0,b*12&-1,218624)|0;c[11722]=db(c[11722]|0,(c[w>>2]|0)*24&-1,218624)|0;do{if((c[w>>2]|0)>0){b=(a|0)==3;x=0;y=0;z=c[v>>2]|0;while(1){A=z+(y*40&-1)|0;B=c[11720]|0;C=B+(y*12&-1)|0;D=B+(y*12&-1)+4|0;if(b){fK(A,r,s,213112);c[C>>2]=~~+h[r>>3];c[D>>2]=~~+h[s>>3]}else{fR(A,p,q,213112);c[C>>2]=~~+h[p>>3];c[D>>2]=~~+h[q>>3]}D=c[v>>2]|0;C=c[D+(y*40&-1)>>2]|0;if((C|0)==3){E=9189}else{if((c[D+(y*40&-1)+4>>2]|0)==3){E=9189}else{F=x}}if((E|0)==9189){E=0;F=1}if((C|0)==2){E=9192}else{if((c[D+(y*40&-1)+4>>2]|0)==2){E=9192}else{G=F}}if((E|0)==9192){E=0;G=1}C=y+1|0;if((C|0)<(c[w>>2]|0)){x=G;y=C;z=D}else{break}}if(!G){H=y;break}c[13542]=55520;H=y}else{H=-1}}while(0);G=c[3524]|0;do{if((c[G+148>>2]|0)==0|(d|0)==0){w=c[G+172>>2]|0;if((w|0)!=0){cM[w&511](0)}w=c[11720]|0;F=c[w>>2]|0;do{if((H|0)>0){v=0;q=w;p=F;do{s=c[q+(v*12&-1)+4>>2]|0;v=v+1|0;r=c[q+(v*12&-1)>>2]|0;a=c[q+(v*12&-1)+4>>2]|0;c[l>>2]=p;c[m>>2]=s;c[n>>2]=r;c[o>>2]=a;a=c[3524]|0;if((fl(l,m,n,o)|0)!=0){cN[c[a+56>>2]&255](c[l>>2]|0,c[m>>2]|0);cN[c[a+60>>2]&255](c[n>>2]|0,c[o>>2]|0)}q=c[11720]|0;p=c[q+(v*12&-1)>>2]|0}while((v|0)<(H|0));v=c[q>>2]|0;if((p|0)==(v|0)){I=v;J=q;K=H;E=9216;break}L=c[q+(H*12&-1)+4>>2]|0;M=c[q+4>>2]|0;N=q;O=v;P=H;E=9217}else{I=F;J=w;K=0;E=9216}}while(0);if((E|0)==9216){w=c[J+(K*12&-1)+4>>2]|0;F=c[J+4>>2]|0;if((w|0)!=(F|0)){L=w;M=F;N=J;O=I;P=K;E=9217}}do{if((E|0)==9217){c[f>>2]=c[N+(P*12&-1)>>2];c[g>>2]=L;c[j>>2]=O;c[k>>2]=M;F=c[3524]|0;if((fl(f,g,j,k)|0)==0){break}cN[c[F+56>>2]&255](c[f>>2]|0,c[g>>2]|0);cN[c[F+60>>2]&255](c[j>>2]|0,c[k>>2]|0)}}while(0);F=c[(c[3524]|0)+172>>2]|0;if((F|0)==0){break}cM[F&511](1)}else{F=t;w=1;y=0;v=0;L12560:while(1){Q=w;R=v;while(1){if((R|0)>=(H|0)){break L12560}a=c[11720]|0;r=(c[11722]|0)+(y*12&-1)|0;s=a+(R*12&-1)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];S=R+1|0;s=a+(S*12&-1)|0;c[F>>2]=c[s>>2];c[F+4>>2]=c[s+4>>2];c[F+8>>2]=c[s+8>>2];T=fl(a+(R*12&-1)|0,a+(R*12&-1)+4|0,a+(S*12&-1)|0,a+(S*12&-1)+4|0)|0;if((T|0)==0){Q=0;R=S}else{break}}q=((T|0)>0&1)+y|0;if((T|0)>=0){w=T;y=q;v=S;continue}p=c[11722]|0;a=c[11720]|0;s=p+(q*12&-1)|0;r=a+(R*12&-1)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];r=p+((q+1|0)*12&-1)|0;p=a+(S*12&-1)|0;c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[p>>2]=c[F>>2];c[p+4>>2]=c[F+4>>2];c[p+8>>2]=c[F+8>>2];w=T;y=q+2|0;v=S}if((Q|0)==1){v=c[11722]|0;w=v+(y*12&-1)|0;F=(c[11720]|0)+(R*12&-1)|0;c[w>>2]=c[F>>2];c[w+4>>2]=c[F+4>>2];c[w+8>>2]=c[F+8>>2];U=y+1|0;V=v}else{U=y;V=c[11722]|0}c[V+8>>2]=d;cN[c[(c[3524]|0)+148>>2]&255](U,c[11722]|0)}}while(0);c[13542]=u;i=e;return}function fR(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;g=i;j=c[b>>2]|0;if((j|0)==4){h[d>>3]=+h[b+16>>3]*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}else if((j|0)==2){k=c[7938]|0;h[d>>3]=+(k|0)+ +h[b+16>>3]*+((c[7939]|0)-k|0)}else if((j|0)==1){l=+h[b+16>>3];do{if((a[68916]&1)==0){m=l}else{if(l>0.0){n=+_(+l);m=n/+h[8616];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56976,h[v+16>>3]=l,v)|0)}}}while(0);h[d>>3]=+(~~(+(c[17224]|0)+(m- +h[8599])*+h[8613]+.5)|0)}else if((j|0)==3){h[d>>3]=+h[b+16>>3]*+(((c[(c[3524]|0)+8>>2]|0)-1|0)>>>0>>>0)}else if((j|0)==0){m=+h[b+16>>3];do{if((a[66164]&1)==0){o=m}else{if(m>0.0){l=+_(+m);o=l/+h[8272];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56880,h[v+16>>3]=m,v)|0)}}}while(0);h[d>>3]=+(~~(+(c[16536]|0)+(o- +h[8255])*+h[8269]+.5)|0)}j=c[b+4>>2]|0;if((j|0)==2){k=c[7940]|0;h[e>>3]=+(k|0)+ +h[b+24>>3]*+((c[7941]|0)-k|0)}else if((j|0)==3){h[e>>3]=+h[b+24>>3]*+(((c[(c[3524]|0)+12>>2]|0)-1|0)>>>0>>>0)}else if((j|0)==1){o=+h[b+24>>3];do{if((a[68228]&1)==0){p=o}else{if(o>0.0){m=+_(+o);p=m/+h[8530];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56952,h[v+16>>3]=o,v)|0)}}}while(0);h[e>>3]=+(~~(+(c[17052]|0)+(p- +h[8513])*+h[8527]+.5)|0)}else if((j|0)==0){p=+h[b+24>>3];do{if((a[65476]&1)==0){q=p}else{if(p>0.0){o=+_(+p);q=o/+h[8186];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56856,h[v+16>>3]=p,v)|0)}}}while(0);h[e>>3]=+(~~(+(c[16364]|0)+(q- +h[8169])*+h[8183]+.5)|0)}else if((j|0)==4){h[e>>3]=+h[b+24>>3]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)}h[d>>3]=+h[d>>3]+.5;h[e>>3]=+h[e>>3]+.5;i=g;return}function fS(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0.0,a6=0.0,a7=0.0,a8=0.0,a9=0.0,ba=0.0,bb=0.0,bc=0.0,bd=0.0,be=0.0,bf=0.0,bg=0.0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bx=0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0.0,ct=0.0,cu=0,cv=0,cw=0,cx=0,cz=0,cA=0.0,cB=0,cC=0.0,cD=0,cE=0,cF=0.0,cH=0.0,cJ=0.0,cL=0,cP=0,cQ=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,df=0,dh=0,di=0,dj=0,dl=0,dm=0,dn=0,dp=0,dq=0,dr=0.0,ds=0.0,dt=0.0,du=0.0,dv=0.0,dw=0.0,dx=0.0,dy=0.0,dA=0,dB=0,dC=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0.0,dK=0.0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0,dR=0,dS=0,dT=0,dU=0,dV=0.0,dW=0.0,dX=0.0,dY=0.0,dZ=0.0,d_=0,d$=0,d0=0,d1=0.0,d2=0.0,d3=0,d4=0,d5=0.0,d6=0.0,d7=0.0,d8=0.0,d9=0.0,ea=0,eb=0,ec=0,ed=0,ee=0,ef=0.0,eg=0.0,eh=0,ei=0.0,ej=0,ek=0,el=0.0,em=0,en=0,eo=0,ep=0,eq=0,er=0,es=0.0,et=0,eu=0,ev=0.0,ew=0.0,ex=0,ey=0,ez=0.0,eA=0.0,eB=0.0,eC=0,eD=0,eE=0,eF=0.0,eG=0,eH=0,eI=0,eJ=0,eK=0.0,eL=0.0,eM=0.0,eN=0,eO=0.0,eP=0.0,eQ=0.0,eR=0.0,eS=0.0,eT=0,eU=0.0,eV=0.0,eW=0,eX=0,eY=0.0,eZ=0.0,e_=0,e$=0,e0=0,e1=0,e2=0,e3=0,e4=0,e5=0,e6=0,e7=0,e8=0,e9=0,fa=0,fb=0.0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0.0,fi=0.0,fj=0;e=i;i=i+1424|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+56|0;q=e+64|0;r=e+80|0;s=e+352|0;t=e+368|0;u=e+384|0;w=e+392|0;x=e+400|0;y=e+416|0;z=e+424|0;A=e+432|0;B=e+496|0;C=e+504|0;D=e+512|0;E=e+552|0;F=e+568|0;G=e+576|0;H=e+584|0;I=e+624|0;J=e+640|0;K=e+768|0;L=e+776|0;M=e+784|0;N=e+808|0;O=e+816|0;Q=e+824|0;R=e+840|0;U=e+856|0;V=e+864|0;W=e+880|0;X=e+888|0;Y=e+896|0;Z=e+904|0;$=e+912|0;ab=e+920|0;ac=e+928|0;ad=e+936|0;ae=e+944|0;af=e+952|0;ag=e+960|0;ah=e+968|0;ai=e+976|0;aj=e+984|0;ak=e+992|0;al=e+1008|0;am=e+1016|0;an=e+1024|0;ao=e+1032|0;ap=e+1040|0;aq=e+1048|0;ar=e+1056|0;as=e+1064|0;at=e+1072|0;au=e+1080|0;av=e+1088|0;aw=e+1096|0;ax=e+1104|0;ay=e+1112|0;az=e+1120|0;aA=e+1128|0;aB=e+1136|0;aC=e+1144|0;aD=e+1152|0;aE=e+1160|0;aF=e+1168|0;aG=e+1176|0;aH=e+1184|0;aI=e+1192|0;aJ=e+1200|0;aK=e+1208|0;aL=e+1216|0;aM=e+1224|0;aO=e+1232|0;aP=e+1240|0;aQ=e+1248|0;aR=e+1256|0;aS=e+1264|0;aT=e+1272|0;aU=e+1280|0;aV=e+1288|0;aW=e+1296|0;aX=e+1304|0;aY=e+1312|0;aZ=e+1320|0;a_=e+1328|0;a$=e+1336|0;a0=e+1344|0;a1=e+1352|0;a2=e+1360|0;a3=e+1368|0;a4=c[3524]|0;c[aS>>2]=0;c[aT>>2]=0;c[200]=2;c[144]=1;if((c[14091]|0)==2){a5=+P(+(+h[8170]- +h[8169]));a6=a5*+h[7048]}else{a6=+h[7048]}if((c[1057]|0)==2){a5=+P(+(+h[8170]- +h[8169]));a7=a5*+h[531]}else{a7=+h[531]}if((c[8764]|0)==2){a5=+P(+(+h[8256]- +h[8255]));a8=a5*+h[4384]}else{a8=+h[4384]}if((c[6588]|0)==2){a5=+P(+(+h[8256]- +h[8255]));a9=a5*+h[3296]}else{a9=+h[3296]}a5=+h[8169];ba=+h[8170];if(a5<ba){bb=a5-a6;h[8169]=bb;bc=a7+ba;h[8170]=bc;bd=bb;be=bc}else{bc=ba-a6;h[8170]=bc;a6=a7+a5;h[8169]=a6;bd=a6;be=bc}bc=+h[8255];a6=+h[8256];if(bc<a6){a5=bc-a8;h[8255]=a5;a7=a9+a6;h[8256]=a7;bf=a5;bg=a7}else{a7=a6-a8;h[8256]=a7;a8=a9+bc;h[8255]=a8;bf=a8;bg=a7}if(bf==bg){uf(-1,126120,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(bd==be){uf(-1,124848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}lk();if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}bh=c[(c[3524]|0)+104>>2]|0;if((bh|0)!=0){cS[bh&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);bh=c[3524]|0;if((c[bh+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[bh+8>>2]|0)-1;c[13882]=0;c[13883]=(c[bh+12>>2]|0)-1;i6(0,1);c[ap>>2]=0;c[aq>>2]=0;c[ar>>2]=0;bh=c[3524]|0;bi=bh+72|0;bj=(cO[c[bi>>2]&255](-270)|0)!=0;bk=bj?c[1164]|0:0;bl=c[16602]|0;bm=c[17290]|0;bn=bj?c[16430]|0:0;bo=bj?c[17118]|0:0;a[35184]=a[36120]&1;c[1098]=0;c[206]=0;c[188]=0;c[148]=0;c[48]=0;c[174]=0;bp=c[1119]|0;if((bp|0)!=0){ga(bp,4392)}bp=c[16629]|0;if((bp|0)!=0){ga(bp,752)}do{if((c[(c[3524]|0)+96>>2]&32|0)!=0){bp=c[16629]|0;if((bp|0)==0){break}if((cy(bp|0,137224)|0)==0){break}c[188]=(c[188]|0)+1}}while(0);bp=c[17317]|0;if((bp|0)!=0){ga(bp,824)}bp=c[16457]|0;if((bp|0)!=0){ga(bp,192)}bp=c[17145]|0;if((bp|0)!=0){ga(bp,592)}do{if((c[16573]|0)!=0){ga(66240,696);if((c[174]|0)!=0|(c[16580]|0)==0){break}c[174]=1}}while(0);if((c[17261]|0)!=0){ga(68992,808)}if((c[16401]|0)!=0){ga(65552,ap)}if((c[17089]|0)!=0){ga(68304,aq)}bp=c[1183]|0;if((bp|0)!=0){ga(bp,ar)}if((c[1098]|0)==0){bq=0}else{fN(4560,as,at,135256);be=+(aa((c[1098]|0)+1|0,c[bh+16>>2]|0)>>>0>>>0);bq=~~(+h[at>>3]+be)}do{if((c[206]|0)==0){br=0;bs=c[17261]|0;bt=9319}else{fN(69352,au,av,135256);at=c[bh+16>>2]|0;be=+(aa(at,c[206]|0)>>>0>>>0);as=~~(+h[av>>3]+be);bp=c[17261]|0;if((bp|0)!=0){br=as;bs=bp;bt=9319;break}bu=0;bv=~~(+(at>>>0>>>0)*.5+ +(as|0));bx=1}}while(0);do{if((bt|0)==9319){if((bs&1|0)==0){bu=0;bv=br;bx=1;break}bu=aa(c[bh+16>>2]|0,c[202]|0);bv=br;bx=0}}while(0);do{if((a[69200]&1)==0){if(bx){if((c[16573]&5|0)!=5){by=0;break}}by=~~(+((c[bh+24>>2]|0)>>>0>>>0)*+h[8648])}else{by=0}}while(0);if((c[1183]|0)==0|(c[1166]|0)!=0){bz=0}else{fN(4816,aw,ax,135256);be=+(aa((c[ar>>2]|0)+2|0,c[bh+16>>2]|0)>>>0>>>0);bz=~~(+h[ax>>3]+be)}if((c[16457]|0)==0|bj){bA=0}else{fN(65912,ay,az,135256);be=+(aa(c[bh+16>>2]|0,c[48]|0)>>>0>>>0);bA=~~(+h[az>>3]+be)}if((c[17145]|0)==0|bj){bB=0}else{fN(68664,aA,aB,135256);be=+(aa(c[bh+16>>2]|0,c[148]|0)>>>0>>>0);bB=~~(+h[aB>>3]+be)}be=+g[38]+ +g[44];aB=bh+12|0;aA=~~(be*+(((c[aB>>2]|0)-1|0)>>>0>>>0)+.5);c[7941]=aA;bd=+h[535];do{if((c[1066]|0)==3){c[7941]=~~(bd*+(((c[aB>>2]|0)-1|0)>>>0>>>0))}else{if(bd>=0.0){c[7941]=aA-~~(bd*+((c[bh+16>>2]|0)>>>0>>>0)+.5);break}az=bv+bq|0;ay=bA+bz|0;ax=(ay|0)>(az|0)?ay:az;az=(by+bu|0)+((bB|0)>(ax|0)?bB:ax)|0;if((az|0)>(by|0)){bC=(c[bh+16>>2]|0)+az|0}else{bC=az}az=aA-bC|0;c[7941]=az;if((az|0)!=(~~(be*+(((c[aB>>2]|0)-1|0)>>>0>>>0)+.5)|0)){break}c[7941]=az-(c[bh+20>>2]<<1)}}while(0);if((c[8786]|0)==3){bD=+h[4395]*+((c[bh+8>>2]|0)>>>0>>>0)}else{be=+h[4395];bD=+g[184]*+((c[bh+8>>2]|0)>>>0>>>0)+ +((c[bh+20>>2]|0)>>>0>>>0)*(be>=0.0?be:1.0)}c[7938]=~~bD;if((c[6598]|0)==3){bE=+h[3301]*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)}else{bD=+h[3301];bE=(+g[178]+ +g[184])*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)- +((c[bh+20>>2]|0)>>>0>>>0)*(bD>=0.0?bD:2.0)}c[7939]=~~bE;bC=c[16573]|0;if((bC&2|0)==0){bF=0;bt=9351}else{bE=+h[8169];bD=+h[8170];if(bE<bD){if(bE>0.0|bD<0.0){bt=9349}else{bG=0}}else{if(bD>0.0|bE<0.0){bt=9349}else{bG=0}}if((bt|0)==9349){bG=1}if(+P(+(bE/(bD-bE)))<.05){bt=9352}else{bF=bG;bt=9351}}if((bt|0)==9351){if((bC&1|0)!=0|bF){bt=9352}else{bH=0}}if((bt|0)==9352){bH=aa((c[174]|0)+1|0,c[bh+16>>2]|0)}do{if((a[66448]&1)==0){if((bC&1|0)==0){if((c[17261]&5|0)!=5){bI=0;break}}bI=~~(+((c[bh+24>>2]|0)>>>0>>>0)*+h[8304])}else{bI=0}}while(0);do{if((c[188]|0)==0){bJ=0}else{fN(66600,aC,aD,135256);bE=+((c[bh+16>>2]|0)>>>0>>>0);bC=~~(bE*(+(c[188]|0)+.2)- +h[aD>>3]);if((c[16573]|0)!=0){bJ=bC;break}bJ=~~(bE*.5+ +(bC|0))}}while(0);if((c[1183]|0)!=0&(c[1166]|0)!=0){fN(4816,aE,aF,135256);bE=+(aa(c[bh+16>>2]|0,c[ar>>2]|0)>>>0>>>0);bK=~~(bE- +h[aF>>3])}else{bK=0}bE=+g[44];aF=~~(bE*+((c[aB>>2]|0)>>>0>>>0));c[7940]=aF;bD=+h[7052];do{if((c[14100]|0)==3){c[7940]=~~(bD*+((c[aB>>2]|0)>>>0>>>0))}else{if(bD>=0.0){c[7940]=~~(+(aF|0)+(bD*+((c[bh+16>>2]|0)>>>0>>>0)+.5));break}aE=(((bI+bH|0)+((bJ|0)>0?bJ:0)|0)+((bK|0)>0?bK:0)|0)+aF|0;c[7940]=aE;if((aE|0)!=(~~(bE*+((c[aB>>2]|0)>>>0>>>0))|0)){break}c[7940]=(c[bh+20>>2]<<1)+aE}}while(0);L12774:do{if((a[35184]&1)==0){bL=1;bN=0}else{bE=+h[3817];aF=~~(bE*+((c[bh+28>>2]|0)>>>0>>>0));c[8240]=aF;aE=~~(bE*+((c[bh+24>>2]|0)>>>0>>>0));c[8242]=aE;bE=+h[4524];if(bE<0.0){bO=0}else{bO=~~(+(aF|0)+bE*+((c[bh+20>>2]|0)>>>0>>>0))}c[9e3]=bO;bE=+h[4525];aF=~~(+(aE|0)*1.25*bE);c[9020]=aF;aE=bh+16|0;aD=c[aE>>2]|0;if(aF>>>0<aD>>>0){aC=~~(bE*+(aD>>>0>>>0));c[9020]=aC;bP=aC}else{bP=aF}if((bP|0)==0){c[9020]=1}if((d|0)>0){aF=0;aC=0;aD=0;bC=0;bF=b;while(1){bG=bF+16|0;aA=c[bG>>2]|0;do{if((aA|0)==0){bQ=aD;bR=aF}else{if((a[bF+22|0]&1)!=0){bQ=aD;bR=aF;break}az=a[bF+20|0]&1;do{if(az<<24>>24==0){bS=aA}else{if((a[37456]&1)!=0){bS=aA;break}a[37456]=1;ax=c[(c[3524]|0)+88>>2]|0;if((ax|0)==0){bS=aA;break}cO[ax&255](179864);bS=c[bG>>2]|0}}while(0);a[37456]=az;ax=lp(bS)|0;if((ax|0)==0){bT=aD;bU=aF}else{bT=aD+1|0;bU=(ax|0)>(aF|0)?ax:aF}a[37456]=0;bQ=bT;bR=bU}}while(0);bG=bF+12|0;aA=c[bG>>2]|0;ax=(aA|0)==392;if(ax&(bC|0)==392){bV=((c[bF+280>>2]|0)==0&(bQ|0)>1&1)+bQ|0}else{bV=bQ}do{if(ax){ay=c[bF+224>>2]|0;if((ay|0)==0){bW=bV;bX=bR;bY=392;break}aw=c[ay>>2]|0;if((aw|0)==0){bW=bV;bX=bR;bY=392;break}else{bZ=bR;b_=bV;b$=aw}do{b_=b_+1|0;aw=c[b$+60>>2]|0;if((aw|0)==0){b0=0}else{b0=lp(aw)|0}bZ=(b0|0)>(bZ|0)?b0:bZ;b$=c[b$>>2]|0;}while((b$|0)!=0);bW=b_;bX=bZ;bY=c[bG>>2]|0}else{bW=bV;bX=bR;bY=aA}}while(0);aA=aC+1|0;if((aA|0)<(d|0)){aF=bX;aC=aA;aD=bW;bC=bY;bF=c[bF>>2]|0}else{b1=bX;b2=bW;break}}}else{b1=0;b2=0}c[6960]=b2;c[8710]=b1;bF=ga(36288,aG)|0;bC=~~(+(bF|0)-(+h[4524]+2.0));bF=c[8710]|0;aD=(c[9047]|0)==1;if((bC|0)<=(bF|0)|aD){b3=bF}else{c[8710]=bC;b3=bC}bE=+(c[aG>>2]|0);h[4488]=bE;if((a[36229]&1)==0){c[9008]=0;bC=c[9e3]|0;c[9004]=bC;bF=bh+20|0;aC=~~(+((c[bF>>2]|0)>>>0>>>0)*(+(b3+1|0)+ +h[4526]));c[8988]=-aC;c[8984]=-(c[bF>>2]|0);c[8996]=aC;b4=(c[bF>>2]|0)+bC|0;b5=0;b6=bC;b7=aC}else{aC=c[9e3]|0;bC=-aC|0;c[9008]=bC;c[9004]=0;bF=bh+20|0;c[8988]=c[bF>>2];aF=~~(+((c[bF>>2]|0)>>>0>>>0)*(+(b3+1|0)+ +h[4526]));c[8984]=aF;aA=(c[bF>>2]|0)+aC|0;c[8996]=aA;b4=aF;b5=bC;b6=0;b7=aA}c[8992]=b4;c[9016]=(b5+b6|0)/2&-1;aA=b4+b7|0;c[9026]=aA;bC=c[6960]|0;c[9012]=bC;do{if(aD){aF=(c[7939]|0)-(c[7938]|0)|0;aC=(aF|0)/(aA|0)&-1;bF=c[9338]|0;bG=(bF|0)>0&(aC|0)>(bF|0)?bF:aC;if((bG|0)==0){c[9026]=aF;b8=1;b9=1;ca=aF}else{b8=0;b9=bG;ca=aA}bG=bC-1|0;aF=(bG+b9|0)/(b9|0)&-1;c[9012]=aF;if((aF|0)==0){cb=1}else{cb=(bG+aF|0)/(aF|0)&-1}bG=(cb|0)==0;cc=bG|b8<<24>>24!=0;cd=bG?1:cb;ce=aF;cf=ca}else{bD=+((c[aE>>2]|0)>>>0>>>0);aF=(~~(+((c[7941]|0)-(c[7940]|0)|0)- +h[4527]*bD-(bE+1.0)*bD)|0)/(c[9020]|0)&-1;bG=c[9339]|0;aC=(bG|0)>0&(aF|0)>(bG|0)?bG:aF;aF=(aC|0)==0;bG=aF?1:aC;if((bC|0)<=(bG|0)){cc=aF;cd=1;ce=bC;cf=aA;break}aC=bC-1|0;bF=(bG+aC|0)/(bG|0)&-1;bG=(bF|0)==0;ax=bG?1:bF;bF=(ax+aC|0)/(ax|0)&-1;c[9012]=bF;cc=bG|aF;cd=ax;ce=bF;cf=aA}}while(0);aA=c[9031]|0;if((aA|0)==1){if((c[9045]|0)!=1|(c[9044]|0)!=1){bt=9410}else{bt=9421}}else if((aA|0)==2){bt=9410}else{bt=9421}do{if((bt|0)==9410){aA=c[9032]|0;if((aA|0)==1&+h[7052]<0.0){bC=aa(c[9020]|0,ce);bD=+((c[aE>>2]|0)>>>0>>>0);aD=(((c[7940]|0)+bC|0)+~~((bE+1.0)*bD)|0)+~~(bD*+h[4527])|0;if((aD|0)>(c[7941]|0)){cg=0;break}c[7940]=aD;if(cc){cg=0;break}else{bL=cd;bN=0;break L12774}}if((aA|0)==0&+h[535]<0.0){aD=aa(c[9020]|0,ce);bD=+((c[aE>>2]|0)>>>0>>>0);bC=(((c[7941]|0)-aD|0)-~~((bE+1.0)*bD)|0)+~~(bD*+h[4527])|0;if((bC|0)<(c[7940]|0)){cg=0;break}c[7941]=bC;if(cc){cg=0;break}else{bL=cd;bN=0;break L12774}}if((aA|0)==2&+h[4395]<0.0){bC=aa(cd,cf);aD=c[7938]|0;bF=(aD+bC|0)>(c[7939]|0);ax=bF?0:bC;c[7938]=ax+aD;if(bF|cc){cg=ax;break}else{bL=cd;bN=ax;break L12774}}if(!((aA|0)==3&+h[3301]<0.0)){bt=9421;break}aA=aa(cd,cf);ax=(c[7939]|0)-aA|0;if((ax|0)<(c[7938]|0)){cg=0;break}c[7939]=ax;if(cc){cg=0}else{bL=cd;bN=0;break L12774}}}while(0);if((bt|0)==9421){if(cc){cg=0}else{bL=cd;bN=0;break}}uh(-1,133720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bL=cd;bN=cg}}while(0);dd(1,20);dd(5,20);do{if(a[31104]|0){dk();dc(3,132208);if((a[54016]|0)==110){break}dd(3,20)}}while(0);cg=c[16401]|0;if((cg&2|0)==0){ch=0;bt=9432}else{bE=+h[8255];bD=+h[8256];if(bE<bD){if(bE>0.0|bD<0.0){bt=9430}else{ci=0}}else{if(bD>0.0|bE<0.0){bt=9430}else{ci=0}}if((bt|0)==9430){ci=1}if(+P(+(bE/(bD-bE)))<.1){bt=9433}else{ch=ci;bt=9432}}if((bt|0)==9432){if((cg&1|0)!=0|ch){bt=9433}else{cj=0}}do{if((bt|0)==9433){if((bn|0)==0){c[216]=0;de(1,14);cj=aa((c[216]|0)+2|0,c[bh+20>>2]|0);break}else{cj=aa((c[ap>>2]|0)+2|0,c[bh+16>>2]|0);break}}}while(0);do{if((a[65760]&1)==0){if((c[16401]&1|0)==0){if((c[17089]&5|0)!=5){ck=0;break}}ck=~~(+((c[bh+28>>2]|0)>>>0>>>0)*+h[8218])}else{ck=0}}while(0);ap=bj^1;do{if((c[16457]|0)==0|ap){cl=0}else{fN(65912,aH,aI,135256);bj=c[bh+16>>2]|0;bE=+(aa(bj,c[48]|0)>>>0>>>0);ch=~~(bE- +h[aH>>3]);if((c[16401]|0)!=0){cl=ch;break}cl=~~(+(bj>>>0>>>0)*.5+ +(ch|0))}}while(0);aH=(bk|0)==0;if((c[1183]|0)==0|aH){cm=0}else{fN(4816,aJ,aK,135256);cm=~~((+(c[ar>>2]|0)+1.5)*+((c[bh+16>>2]|0)>>>0>>>0)- +h[aJ>>3])}if(+h[4395]<0.0){aJ=(bN|0)<(cm|0)?cm:bN;bN=bh+8|0;ar=ck+cj|0;c[7938]=(((aJ|0)<(cl|0)?cl:aJ)+ar|0)+~~(+g[184]*+((c[bN>>2]|0)>>>0>>>0));fN(4816,aL,aM,135256);aM=c[7938]|0;do{if(aH){aJ=~~+h[aL>>3];if((aM-ar|0)>=(-aJ|0)){cn=aM;break}aK=ar-aJ|0;c[7938]=aK;cn=aK}else{cn=aM}}while(0);aM=bh+20|0;if((cn|0)==(~~(+((c[bN>>2]|0)>>>0>>>0)*+g[184])|0)){bN=(c[aM>>2]<<1)+cn|0;c[7938]=bN;co=bN}else{co=cn}c[7938]=~~(+(co|0)+ +((c[aM>>2]|0)>>>0>>>0)*.5)}do{if((c[17089]&1|0)==0){cp=0}else{if((bo|0)==0){c[216]=0;de(5,14);cp=aa((c[216]|0)+2|0,c[bh+20>>2]|0);break}else{cp=aa((c[aq>>2]|0)+2|0,c[bh+16>>2]|0);break}}}while(0);aq=c[16580]|0;do{if((aq|0)==0){cq=0}else{aM=c[7939]|0;co=c[7938]|0;h[8269]=+(aM-co|0)/(+h[8256]- +h[8255]);c[16536]=co;c[16537]=aM;co=aq;cn=aM;L12904:while(1){aM=c[co+8>>2]|0;do{if((aM|0)==0){cr=cn}else{bE=+(lp(aM)|0);bN=c[16602]|0;bD=bE*+S(+(+(bN|0)*.017453292519943295));ar=~~(bD*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0));bD=+h[8257];bE=+h[8258];cs=+h[co>>3];if(bD<bE){if(cs<bD|cs>bE){cr=cn;break}}else{if(cs<bE|cs>bD){cr=cn;break}}if((a[66164]&1)==0){ct=cs}else{if(cs<=0.0){bt=9464;break L12904}bD=+_(+cs);ct=bD/+h[8272]}if((bN|0)==0){cu=(ar|0)/2&-1}else{cu=ar}bD=+(~~(+(c[16536]|0)+(ct- +h[8255])*+h[8269]+.5)|0)+ +(cu|0);if(+(cn|0)>=bD){cr=cn;break}cr=~~bD}}while(0);aM=c[co+16>>2]|0;if((aM|0)==0){break}else{co=aM;cn=cr}}if((bt|0)==9464){uk(210984,(v=i,i=i+24|0,c[v>>2]=130992,c[v+8>>2]=56880,h[v+16>>3]=cs,v)|0)}cn=cr-(c[7939]|0)|0;co=(c[(c[3524]|0)+8>>2]|0)>>>2;if(cn>>>0<=co>>>0){cq=cn;break}uh(-1,129936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cq=co}}while(0);do{if((a[68512]&1)==0){if((c[17089]&1|0)==0){if((c[16401]&5|0)!=5){cv=0;break}}cv=~~(+((c[bh+28>>2]|0)>>>0>>>0)*+h[8562])}else{cv=0}}while(0);do{if((c[17145]|0)==0|ap){cw=0}else{fN(68664,aO,aP,135256);cr=c[bh+16>>2]|0;cs=+(aa(cr,c[148]|0)>>>0>>>0);cu=~~(+h[aO>>3]+cs);if((c[17089]|0)!=0){cw=cu;break}cw=~~(+(cr>>>0>>>0)*.5+ +(cu|0))}}while(0);do{if((c[6598]|0)!=3){aO=a[54016]|0;if(a[31104]&aO<<24>>24!=110){if(!((aO<<24>>24|0)==110|(aO<<24>>24|0)==117)){aO=c[7939]|0;aP=~~(+(aO|0)- +(aO-(c[7938]|0)|0)*.1);c[7939]=aP;c[7939]=aP+((c[bh+20>>2]|0)*-3&-1)}c[13507]=0}if(+h[3301]>=0.0){break}aP=c[7939]|0;c[13507]=aP;aO=(((cw|0)>0?-cw|0:0)-(cv+cp|0)|0)+aP|0;c[7939]=aO;cu=bh+20|0;cs=(+g[178]+ +g[184])*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)- +(c[cu>>2]<<1>>>0>>>0);if(+(aO|0)>cs){cr=~~cs;c[7939]=cr;cx=cr}else{cx=aO}c[13507]=aP-cx;aP=c[(c[3524]|0)+8>>2]|0;if((aP-cx|0)>>>0<cq>>>0){aO=aP-cq|0;c[7939]=aO;cz=aO}else{cz=cx}c[7939]=~~(+(cz|0)- +((c[cu>>2]|0)>>>0>>>0))}}while(0);dd(2,20);dd(6,20);if((a[30528]&1)!=0){dd(7,10)}cs=+g[18074];do{if(cs!=0.0){do{if(cs<0.0){cz=c[200]|0;ct=+h[64672+(cz*688&-1)>>3]- +h[64664+(cz*688&-1)>>3];if(ct==0.0){bt=9497;break}cz=c[144]|0;cA=(-0.0-cs)*+P(+((+h[64672+(cz*688&-1)>>3]- +h[64664+(cz*688&-1)>>3])/ct))}else{bt=9497}}while(0);if((bt|0)==9497){cA=cs}if(!(cA>=.01&cA<=100.0)){break}cz=c[7941]|0;cx=c[7940]|0;cq=cz-cx|0;ct=+(cq|0);cu=c[7939]|0;aO=c[7938]|0;aP=cu-aO|0;bD=+(aP|0);bE=cA*+((c[bh+24>>2]|0)>>>0>>>0)/+((c[bh+28>>2]|0)>>>0>>>0);if(ct/bD>bE){cr=~~(bD*bE);if((c[14100]|0)==3){c[7941]=cr+cx;break}if((c[1066]|0)==3){c[7940]=cz-cr;break}else{aq=(cq-cr|0)/2&-1;c[7940]=aq+cx;c[7941]=cz-aq;break}}else{aq=~~(ct/bE);if((c[8786]|0)==3){c[7939]=aq+aO;break}if((c[6598]|0)==3){c[7938]=cu-aq;break}else{cz=(aP-aq|0)/2&-1;c[7938]=cz+aO;c[7939]=cu-cz;break}}}}while(0);cz=(bm|0)==0|ap;do{if((c[17261]&1|0)==0|cz){cB=bu}else{cA=+T(+(+(c[17290]|0)*.017453292519943295));bm=c[17314]|0;if((bm|0)==2){cC=cA*-1.0}else if((bm|0)==1){cC=+P(+cA)*.5}else{cC=cA}c[216]=0;de(6,14);bm=+h[535]<0.0;if(bm){c[7941]=(c[7941]|0)+bu}if(cC>0.0){cD=~~(+(bu|0)+cC*+(aa(c[216]|0,c[bh+20>>2]|0)|0))}else{cD=bu}if(!bm){cB=cD;break}c[7941]=(c[7941]|0)-cD;cB=cD}}while(0);cD=(bl|0)==0|ap;do{if((c[16573]&1|0)==0|cD){cE=bH}else{bl=c[16602]|0;do{if((bl|0)==(-270|0)){if((a[66648]&1)!=0){cF=-1.0;bt=9525;break}c[16626]=2;cH=-1.0;bt=9526}else if((bl|0)==90){cF=-1.0;bt=9525}else{cF=-0.0- +T(+(+(bl|0)*.017453292519943295));bt=9525}}while(0);if((bt|0)==9525){if((c[16626]|0)==2){cH=cF;bt=9526}else{cJ=cF}}if((bt|0)==9526){cJ=cH*-1.0}c[216]=0;de(2,14);bl=+h[7052]<0.0;if(bl){c[7940]=(c[7940]|0)-bH}if(cJ>0.0){cC=cJ*+(aa(c[216]|0,c[bh+20>>2]|0)|0);cL=~~(+((c[bh+16>>2]|0)>>>0>>>0)+cC)}else{cL=bH}if(!bl){cE=cL;break}c[7940]=(c[7940]|0)+cL;cE=cL}}while(0);cL=c[7941]|0;bH=c[7940]|0;if((cL|0)<(bH|0)){c[7941]=bH;c[7940]=cL;cP=bH;cQ=cL}else{cP=cL;cQ=bH}bH=((by+bv|0)+cB|0)+cP|0;c[208]=bH;do{if((cB|0)==0){cT=bH}else{if((bv|bq|0)==0){cT=bH;break}cL=(c[bh+16>>2]|0)+bH|0;c[208]=cL;cT=cL}}while(0);bH=cT+bq|0;c[1102]=bH;cT=((bA+by|0)+cB|0)+cP|0;c[50]=cT;c[150]=((bB+by|0)+cB|0)+cP;bB=bJ+bI|0;cL=bh+16|0;bl=~~(+(cQ-(cE+bB|0)|0)+ +((c[cL>>2]|0)>>>0>>>0)*(+(c[188]|0)+.2));c[190]=bl;bu=c[7938]|0;bm=(bu-ck|0)-cj|0;c[52]=bm;if(!((c[16457]|0)==0|ap)){c[52]=bm-cl}cl=(cv+cp|0)+(c[7939]|0)|0;c[152]=cl;if(!((c[17145]|0)==0|ap)){c[152]=(cl+cw|0)-aa(c[cL>>2]|0,c[148]|0)}cw=(bk|0)!=0;bk=(c[1166]|0)!=0;do{if(cw){if(bk){cU=(bJ-bK|0)+bl|0;bt=9551;break}else{c[1216]=(bz-(bv+bq|0)|0)+bH;bt=9552;break}}else{if(bk){c[1216]=(cQ-((bK+bB|0)+cE|0)|0)+(c[cL>>2]|0);bt=9553;break}if((bA|0)>0){c[1216]=cT+bz;bt=9553;break}else{cU=(((bz+by|0)+cB|0)+cP|0)+(c[bh+20>>2]|0)|0;bt=9551;break}}}while(0);if((bt|0)==9551){c[1216]=cU;if(cw){bt=9552}else{bt=9553}}if((bt|0)==9553){fN(4816,aQ,aR,135256);aR=c[7938]|0;cV=(aR-(ck+cj|0)|0)+~~+h[aQ>>3]|0;cW=c[7940]|0;cX=c[7941]|0;cY=aR}else if((bt|0)==9552){cV=bu-((ck+cj|0)+cm|0)|0;cW=cQ;cX=cP;cY=bu}c[1218]=cV;cV=bh+20|0;c[176]=(cW-bI|0)-(c[(cD?cL:cV)>>2]|0);if(cz){cZ=cB}else{cZ=c[cV>>2]|0}c[204]=(cX+by|0)+cZ;if((bn|0)==0){c_=c[cV>>2]|0}else{c_=cj-(c[cL>>2]|0)|0}c[36]=(cY-ck|0)-c_;c[146]=((c[7939]|0)+cv|0)+(c[((bo|0)==0?cV:cL)>>2]|0);cO[c[bi>>2]&255](0);bi=c[7941]|0;bo=c[7940]|0;cJ=+(bi-bo|0);h[8183]=cJ/(+h[8170]- +h[8169]);h[8527]=cJ/(+h[8514]- +h[8513]);cv=c[7939]|0;c_=c[7938]|0;cJ=+(cv-c_|0);h[8269]=cJ/(+h[8256]- +h[8255]);h[8613]=cJ/(+h[8600]- +h[8599]);c[16536]=c_;c[16537]=cv;c[16364]=bo;c[16365]=bi;c[17224]=c_;c[17225]=cv;c[17052]=bo;c[17053]=bi;ck=aa(c[9026]|0,bL);cJ=+((c[cL>>2]|0)>>>0>>>0);cH=+h[4488]*cJ;cL=~~(cH+ +(aa(c[9020]|0,c[9012]|0)|0));bL=cL+~~(cJ*+h[4527])|0;cL=c[9031]|0;do{if((cL|0)==1){if((c[9044]|0)==1&(c[9045]|0)==1){bt=9564}else{bt=9570}}else if((cL|0)==0){cY=c[9044]|0;if((cY|0)==0){cj=bi-(c[bh+24>>2]|0)|0;c[9337]=cj;c[9336]=cj-bL;bt=9565;break}else if((cY|0)==2){cY=(c[bh+24>>2]|0)+bo|0;c[9336]=cY;c[9337]=cY+bL;bt=9565;break}else{bt=9564;break}}else{if((cL-1|0)>>>0<2){bt=9570;break}fR(36136,an,ao,128552);cY=~~+h[an>>3];cj=~~+h[ao>>3];c[9334]=cY;bn=c[9045]|0;if((bn|0)==1){cZ=cY-((ck|0)/2&-1)|0;c[9334]=cZ;c$=cZ}else if((bn|0)==2){bn=cY-ck|0;c[9334]=bn;c$=bn}else{c$=cY}c[9335]=c$+ck;c[9337]=cj;cY=c[9044]|0;if((cY|0)==1){bn=((bL|0)/2&-1)+cj|0;c[9337]=bn;c0=bn}else if((cY|0)==2){cY=cj+bL|0;c[9337]=cY;c0=cY}else{c0=cj}c[9336]=c0-bL;c1=c[7939]|0;c2=c[7938]|0}}while(0);L13067:do{if((bt|0)==9564){c0=(bL|0)/2&-1;c$=(bo+bi|0)/2&-1;c[9336]=c$-c0;c[9337]=c$+c0;bt=9565}else if((bt|0)==9570){c0=c[9032]|0;do{if((c0|0)==0){c$=~~((+g[38]+ +g[44])*+((c[aB>>2]|0)>>>0>>>0)- +((c[bh+24>>2]|0)>>>0>>>0));c[9337]=c$;c[9336]=c$-bL}else if((c0|0)==1){c$=~~(+g[44]*+((c[aB>>2]|0)>>>0>>>0)+ +((c[bh+24>>2]|0)>>>0>>>0));c[9336]=c$;c[9337]=c$+bL}else{c$=c[9044]|0;if((c$|0)==0){c[9337]=bi;c[9336]=bi-bL}else if((c$|0)==1){c$=(bL|0)/2&-1;ao=(bo+bi|0)/2&-1;c[9336]=ao-c$;c[9337]=ao+c$}else{c[9336]=bo;c[9337]=bL+bo}if((c0|0)==2){c$=~~(+g[184]*+((c[bh+8>>2]|0)>>>0>>>0)+ +((c[cV>>2]|0)>>>0>>>0));c[9334]=c$;c[9335]=c$+ck;c1=cv;c2=c_;break L13067}else if((c0|0)==3){c$=~~((+g[178]+ +g[184])*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)- +((c[cV>>2]|0)>>>0>>>0));c[9335]=c$;c[9334]=c$-ck;c1=cv;c2=c_;break L13067}else{break}}}while(0);c0=c[9045]|0;if((c0|0)==0){c[9334]=c_;c[9335]=ck+c_;c1=cv;c2=c_;break}else if((c0|0)==1){c0=(ck|0)/2&-1;c$=(c_+cv|0)/2&-1;c[9334]=c$-c0;c[9335]=c$+c0;c1=cv;c2=c_;break}else{c[9335]=cv;c[9334]=cv-ck;c1=cv;c2=c_;break}}}while(0);do{if((bt|0)==9565){bh=c[9045]|0;if((bh|0)==0){bo=(c[cV>>2]|0)+c_|0;c[9334]=bo;c[9335]=bo+ck;c1=cv;c2=c_;break}else if((bh|0)==2){bh=cv-(c[cV>>2]|0)|0;c[9335]=bh;c[9334]=bh-ck;c1=cv;c2=c_;break}else{bh=(ck|0)/2&-1;bo=(c_+cv|0)/2&-1;c[9334]=bo-bh;c[9335]=bo+bh;c1=cv;c2=c_;break}}}while(0);c[13542]=31752;if((c1|0)<(c2|0)){bt=9593}else{if((c[7941]|0)<(c[7940]|0)){bt=9593}}if((bt|0)==9593){uh(-1,127328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(a[31104]|0){dz()}fO(c[10818]|0,-1,2);a[25280]=0;cM[c[(c[3524]|0)+168>>2]&511](1);c2=c[10026]|0;if((c2|0)==(-1|0)|(c2|0)==0){fT();c3=c[10026]|0}else{c3=c2}if((c3|0)==(-1|0)|(c3|0)==0){c[200]=2;c[144]=1;dg(2,1);dg(1,2);c[200]=6;c[144]=5;dg(6,5);dg(5,6)}if((c[11692]|0)!=0){fU()}if((c[16457]|0)!=0){c3=a[65952]&1;do{if(c3<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;c2=c[(c[3524]|0)+88>>2]|0;if((c2|0)==0){break}cO[c2&255](179864)}}while(0);a[37456]=c3;fn(65840,a4);c3=a4+72|0;if((cO[c[c3>>2]&255](c[16455]|0)|0)==0){ln(c[52]|0,c[50]|0,c[16457]|0,0,0,0,c[16458]|0)}else{fN(65912,aU,aV,141e3);ln(((c[a4+16>>2]|0)>>>1)+(c[52]|0)|0,~~(+(((c[7940]|0)+(c[7941]|0)|0)/2&-1|0)+ +h[aV>>3]),c[16457]|0,1,0,c[16455]|0,c[16458]|0);aV=c[c3>>2]|0;cO[aV&255](0)}if((c[16460]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[17145]|0)!=0){aV=a[68704]&1;do{if(aV<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;c3=c[(c[3524]|0)+88>>2]|0;if((c3|0)==0){break}cO[c3&255](179864)}}while(0);a[37456]=aV;fn(68592,a4);aV=a4+72|0;if((cO[c[aV>>2]&255](c[17143]|0)|0)==0){ln(c[152]|0,c[150]|0,c[17145]|0,2,0,0,c[17146]|0)}else{fN(68664,aW,aX,141e3);ln(((c[152]|0)-1|0)+((c[a4+16>>2]|0)>>>1)|0,~~(+(((c[7940]|0)+(c[7941]|0)|0)/2&-1|0)+ +h[aX>>3]),c[17145]|0,1,0,c[17143]|0,c[17146]|0);aX=c[aV>>2]|0;cO[aX&255](0)}if((c[17148]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[16629]|0)!=0){fN(66600,aY,aZ,141e3);aZ=~~(+(((c[7938]|0)+(c[7939]|0)|0)/2&-1|0)+ +h[aY>>3]);aY=(c[190]|0)-((c[a4+16>>2]|0)>>>1)|0;aX=a[66640]&1;do{if(aX<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;aV=c[(c[3524]|0)+88>>2]|0;if((aV|0)==0){break}cO[aV&255](179864)}}while(0);a[37456]=aX;fn(66528,a4);ln(aZ,aY,c[16629]|0,1,0,0,c[16630]|0);if((c[16632]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[1119]|0)!=0){fN(4560,a_,a$,141e3);a$=~~(+(((c[7939]|0)+(c[7938]|0)|0)/2&-1|0)+ +h[a_>>3]);a_=(c[1102]|0)-((c[a4+16>>2]|0)>>>1)|0;aY=a[4600]&1;do{if(aY<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;aZ=c[(c[3524]|0)+88>>2]|0;if((aZ|0)==0){break}cO[aZ&255](179864)}}while(0);a[37456]=aY;fn(4488,a4);ln(a$,a_,c[1119]|0,1,0,0,c[1120]|0);if((c[1122]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[17317]|0)!=0){fN(69352,a0,a1,141e3);a1=~~(+(((c[7938]|0)+(c[7939]|0)|0)/2&-1|0)+ +h[a0>>3]);a0=((c[208]|0)-1|0)-((c[a4+16>>2]|0)>>>1)|0;a_=a[69392]&1;do{if(a_<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;a$=c[(c[3524]|0)+88>>2]|0;if((a$|0)==0){break}cO[a$&255](179864)}}while(0);a[37456]=a_;fn(69280,a4);ln(a1,a0,c[17317]|0,1,0,0,c[17318]|0);if((c[17320]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[1183]|0)!=0){a0=c[1218]|0;a1=c[1216]|0;cG(a2|0);a_=ut(1025)|0;do{if((a_|0)==0){gk();a$=ut(1025)|0;if((a$|0)!=0){c4=a$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=126240,v)|0)}else{c4=a_}}while(0);a_=c[1183]|0;a$=aN(a2|0)|0;bw(c4|0,1024,a_|0,a$|0);do{if((c[1164]|0)==0){bt=9658}else{a$=a4+72|0;if((cO[c[a$>>2]&255](-270)|0)==0){bt=9658;break}a_=((c[a4+16>>2]|0)>>>1)+a0|0;a2=c[1184]|0;if((c[1166]|0)==0){ln(a_,a1,c4,2,0,-270,a2)}else{ln(a_,a1,c4,0,0,-270,a2)}a2=c[a$>>2]|0;cO[a2&255](0)}}while(0);do{if((bt|0)==9658){a2=a1-((c[a4+16>>2]|0)>>>1)|0;a$=c[1184]|0;if((c[1166]|0)==0){ln(a0,a2,c4,0,0,0,a$);break}else{ln(a0,a2,c4,0,2,0,a$);break}}}while(0);uu(c4)}do{if(a[31104]&(a[54016]|0)!=110){if(!((c[(c[3524]|0)+144>>2]|0)!=0&(c[13506]|0)==0)){break}dD(1)}}while(0);fO(c[10818]|0,0,2);c4=c[10822]|0;a0=c[(c[3524]|0)+92>>2]|0;if((a0|0)!=0){cK[a0&63](+h[3817])}if((c4|0)!=0){a0=c4;do{if((c[a0+56>>2]|0)==0){fR(a0+8|0,al,am,202256);fp(~~+h[al>>3],~~+h[am>>3],a0)}a0=c[a0>>2]|0;}while((a0|0)!=0)}fV(0);cM[c[(c[3524]|0)+168>>2]&511](2);if((a[35184]&1)!=0){fW(0,aS,aT)}a0=a4+168|0;am=(d|0)>0;al=ak;c4=ak|0;a1=ak+4|0;a$=a3;a3=a4+144|0;a2=a4+92|0;a_=a4+80|0;aY=s;aZ=s|0;aX=s+4|0;aV=V;aW=V|0;c3=V+4|0;aU=Q|0;c2=R|0;c1=Q+8|0;Q=R+8|0;R=J;c_=M|0;cv=I;ck=M+7|0;M=I|0;cV=I+4|0;bh=H;bo=H+4|0;bL=H+8|0;bi=H+16|0;aB=H|0;c0=J|0;c$=J|0;ao=J+72|0;an=J+80|0;cL=E;cj=E|0;cY=E+4|0;bn=D;cZ=D+4|0;by=D+8|0;cX=D+16|0;cB=D|0;cz=J+64|0;cD=J+8|0;bI=J+16|0;J=A+8|0;cW=A+40|0;bu=A+32|0;cP=A|0;cQ=A+16|0;cm=A+24|0;aR=A+48|0;aQ=A+56|0;cw=x;cU=x|0;bz=x+4|0;cT=t;bA=t|0;cE=t+4|0;bB=0;bK=0;L13212:while(1){cM[c[a0>>2]&511](10);bk=a[35184]|0;if(am){bH=0;bq=bB;bv=b;bl=0;bJ=bk;while(1){cM[c[(c[3524]|0)+168>>2]&511](6);cl=bv+304|0;c[200]=c[cl>>2];ap=bv+308|0;c[144]=c[ap>>2];cp=bv+24|0;bm=bv+64|0;c[al>>2]=c[bm>>2];c[al+4>>2]=c[bm+4>>2];c[al+8>>2]=c[bm+8>>2];c[al+12>>2]=c[bm+12>>2];cu=bv+28|0;aO=c[cu>>2]|0;aq=cp|0;do{if((c[aq>>2]|0)!=0){cJ=+h[bv+48>>3];aP=c[(c[3524]|0)+92>>2]|0;if(cJ<0.0){cK[aP&63](+h[3817]);break}else{cK[aP&63](cJ);break}}}while(0);aP=bv+40|0;cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);cx=c[(c[3524]|0)+64>>2]|0;if((aO|0)<-5){cM[cx&511](-2)}else{cM[cx&511](aO)}cx=bv+56|0;cr=c[3524]|0;do{if((a[cx]&1)==0){if((c[cr+96>>2]&1024|0)!=0){break}c[c4>>2]=1;c[a1>>2]=aO;bt=9686}else{bt=9686}}while(0);if((bt|0)==9686){bt=0;fn(ak,cr)}aO=bv+12|0;do{if((c[aO>>2]|0)==392){if((a[30080]&1)==0){c5=1}else{lK(cp,(c[cu>>2]|0)+1|0);c5=(c[aO>>2]|0)==392}if(!(c5&(bH|0)==392)){c6=bq;break}if((c[bv+280>>2]|0)!=0){c6=bq;break}cq=c[aT>>2]|0;co=c[54]|0;if((cq|0)==(co|0)){c6=bq;break}cn=bq+1|0;if((cn|0)<(c[9012]|0)){c[aT>>2]=cq-(c[9020]|0);c6=cn;break}else{c[aT>>2]=co;c[aS>>2]=(c[aS>>2]|0)+(c[9026]|0);c6=0;break}}else{c6=bq}}while(0);do{if((c[aO>>2]|0)==392&(c[9670]|0)==2){cr=bv+224|0;co=c[cr>>2]|0;if((co|0)==0){c7=0;c8=c6;break}if(!bK){if((a[36228]&1)!=0){c7=0;c8=c6;break}}cn=cp;c[a$>>2]=c[cn>>2];c[a$+4>>2]=c[cn+4>>2];c[a$+8>>2]=c[cn+8>>2];c[a$+12>>2]=c[cn+12>>2];c[a$+16>>2]=c[cn+16>>2];c[a$+20>>2]=c[cn+20>>2];c[a$+24>>2]=c[cn+24>>2];c[a$+28>>2]=c[cn+28>>2];c[a$+32>>2]=c[cn+32>>2];c[a$+36>>2]=c[cn+36>>2];c[a$+40>>2]=c[cn+40>>2];c[a$+44>>2]=c[cn+44>>2];c[a$+48>>2]=c[cn+48>>2];c[a$+52>>2]=c[cn+52>>2];cq=c[co>>2]|0;if((cq|0)==0){c9=c6;da=co}else{co=bv+200|0;aM=bv+64|0;ar=bv+68|0;bN=bv+32|0;aL=c6;aH=cq;while(1){cq=aH+4|0;c[cu>>2]=c[cq>>2];c[co>>2]=c[cq>>2];aK=aH+60|0;if((c[aK>>2]|0)!=0){aJ=(c[cq>>2]|0)+1|0;do{if((a[30080]&1)==0){cq=c[aq>>2]|0;aI=c[8798]|0;ch=(aI|0)>0;bj=aJ;L13260:while(1){cg=43264;while(1){df=c[cg>>2]|0;if((df|0)==0){break}if((c[df+4>>2]|0)==(bj|0)){break L13260}else{cg=df|0}}dh=bj-1|0;if(!((bj|0)>(aI|0)&ch)){bt=9715;break}bj=((dh|0)%(aI|0)&-1)+1|0}if((bt|0)==9715){bt=0;c[cu>>2]=dh;c[aM>>2]=1;c[ar>>2]=dh;c[bN>>2]=dh;break}aI=df+8|0;c[cn>>2]=c[aI>>2];c[cn+4>>2]=c[aI+4>>2];c[cn+8>>2]=c[aI+8>>2];c[cn+12>>2]=c[aI+12>>2];c[cn+16>>2]=c[aI+16>>2];c[cn+20>>2]=c[aI+20>>2];c[cn+24>>2]=c[aI+24>>2];c[cn+28>>2]=c[aI+28>>2];c[cn+32>>2]=c[aI+32>>2];c[cn+36>>2]=c[aI+36>>2];c[cn+40>>2]=c[aI+40>>2];c[cn+44>>2]=c[aI+44>>2];c[cn+48>>2]=c[aI+48>>2];c[cn+52>>2]=c[aI+52>>2];c[aq>>2]=cq;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[cu>>2]=bj;a[cx]=0;break}if((a[cx]&1)!=0){break}c[aM>>2]=1;c[ar>>2]=c[cu>>2]}else{lK(cp,aJ)}}while(0);fY(bv,c[aK>>2]|0,a4,c[aS>>2]|0,c[aT>>2]|0)}aJ=aL+1|0;if((aJ|0)<(c[9012]|0)){c[aT>>2]=(c[aT>>2]|0)-(c[9020]|0);di=aJ}else{c[aT>>2]=c[54];c[aS>>2]=(c[aS>>2]|0)+(c[9026]|0);di=0}aJ=c[aH>>2]|0;if((aJ|0)==0){break}else{aL=di;aH=aJ}}c9=di;da=c[cr>>2]|0}aH=c[da+64>>2]|0;if((aH|0)==0){dj=da}else{uu(aH);dj=da}while(1){aL=c[dj+60>>2]|0;if((aL|0)!=0){uu(aL)}aL=c[dj+64>>2]|0;if(!((aL|0)==0|(aL|0)==(aH|0))){uu(aL)}aL=c[dj>>2]|0;uu(dj);if((aL|0)==0){break}else{dj=aL}}c[cr>>2]=0;c[cn>>2]=c[a$>>2];c[cn+4>>2]=c[a$+4>>2];c[cn+8>>2]=c[a$+8>>2];c[cn+12>>2]=c[a$+12>>2];c[cn+16>>2]=c[a$+16>>2];c[cn+20>>2]=c[a$+20>>2];c[cn+24>>2]=c[a$+24>>2];c[cn+28>>2]=c[a$+28>>2];c[cn+32>>2]=c[a$+32>>2];c[cn+36>>2]=c[a$+36>>2];c[cn+40>>2]=c[a$+40>>2];c[cn+44>>2]=c[a$+44>>2];c[cn+48>>2]=c[a$+48>>2];c[cn+52>>2]=c[a$+52>>2];c7=0;c8=c9}else{aH=bv+16|0;aL=c[aH>>2]|0;if((aL|0)!=0){if((a[aL]|0)==0){c7=0;c8=c6;break}}if((c[bv+8>>2]|0)==4){c7=0;c8=c6;break}if(!bK){if((a[36228]&1)!=0){c7=(bJ&1)!=0;c8=c6;break}}aL=a[bv+20|0]&1;do{if(aL<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;ar=c[(c[3524]|0)+88>>2]|0;if((ar|0)==0){break}cO[ar&255](179864)}}while(0);a[37456]=aL;cn=bJ&1;do{if(cn<<24>>24==0){dl=c6}else{cr=c[aH>>2]|0;if((cr|0)==0){dl=c6;break}if((a[bv+22|0]&1)!=0){dl=c6;break}if((a[36230]&1)==0){dm=cr;dn=c[aT>>2]|0}else{cr=(((c[54]|0)+(c[9336]|0)|0)+((c[9020]|0)/2&-1)|0)-(c[aT>>2]|0)|0;c[aT>>2]=cr;dm=c[aH>>2]|0;dn=cr}fY(bv,dm,a4,c[aS>>2]|0,dn);dl=c6+1|0}}while(0);a[37456]=0;c7=cn<<24>>24!=0;c8=dl}}while(0);cp=bv+23|0;aH=a[cp]|0;L13316:do{if(!((aH&1)==0|bK)){aL=bv+300|0;if((c[aL>>2]|0)<=0){break}cr=bv+320|0;ar=0;aM=aH;while(1){do{if((aM&1)!=0){c[(c[cr>>2]|0)+(ar<<6)>>2]=0;bN=c[cl>>2]|0;cJ=+h[64664+(bN*688&-1)>>3];cH=+h[64672+(bN*688&-1)>>3];bN=c[cr>>2]|0;cF=+h[bN+(ar<<6)+8>>3];if(cJ<cH){if(cF<cJ|cF>cH){bt=9754}else{dp=bN}}else{if(cF<cH|cF>cJ){bt=9754}else{dp=bN}}if((bt|0)==9754){bt=0;c[bN+(ar<<6)>>2]=1;dp=c[cr>>2]|0}bN=c[ap>>2]|0;cJ=+h[64664+(bN*688&-1)>>3];cF=+h[64672+(bN*688&-1)>>3];cH=+h[dp+(ar<<6)+16>>3];if(cJ<cF){if(!(cH<cJ|cH>cF)){break}}else{if(!(cH<cF|cH>cJ)){break}}c[dp+(ar<<6)>>2]=1}}while(0);aK=ar+1|0;if((aK|0)>=(c[aL>>2]|0)){break L13316}ar=aK;aM=a[cp]|0}}}while(0);cp=bv+8|0;do{if(!((c[cp>>2]|0)==4|bK)){aH=c[aO>>2]|0;if((aH|0)==18){fZ(bv);break}else if((aH|0)==51){fX(bv);fZ(bv);break}else if((aH|0)==64){aM=bv+300|0;ar=c[aM>>2]|0;if((ar|0)<=0){break}aL=bv+320|0;cr=bv+316|0;cn=(c[3524]|0)+80|0;aK=0;bN=ar;while(1){ar=c[aL>>2]|0;if((c[ar+(aK<<6)>>2]|0)==0){co=c[200]|0;aJ=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[ar+(aK<<6)+8>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[144]|0;aI=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[ar+(aK<<6)+16>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=(c[cr>>2]|0)+(aK<<3)|0;f9(bv,co);cR[c[cn>>2]&127](aJ,aI,-1);dq=c[aM>>2]|0}else{dq=bN}aI=aK+1|0;if((aI|0)<(dq|0)){aK=aI;bN=dq}else{break}}}else if((aH|0)==295|(aH|0)==279|(aH|0)==311){fX(bv);f_(bv);fZ(bv);break}else if((aH|0)==102|(aH|0)==86|(aH|0)==118){f_(bv);fZ(bv);break}else if((aH|0)==137|(aH|0)==153){f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0);break}else if((aH|0)==392){if((c[14156]|0)==1){f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0)}do{if((c[9670]|0)==4){cK[c[(c[3524]|0)+112>>2]&63](+h[4840]);if(!(hG(49488)|0)){cM[c[(c[3524]|0)+64>>2]&511](c[cu>>2]|0)}f_(bv);c[aV>>2]=c[bm>>2];c[aV+4>>2]=c[bm+4>>2];c[aV+8>>2]=c[bm+8>>2];c[aV+12>>2]=c[bm+12>>2];bN=c[cu>>2]|0;do{if((c[aq>>2]|0)!=0){cJ=+h[bv+48>>3];aK=c[(c[3524]|0)+92>>2]|0;if(cJ<0.0){cK[aK&63](+h[3817]);break}else{cK[aK&63](cJ);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);aK=c[(c[3524]|0)+64>>2]|0;if((bN|0)<-5){cM[aK&511](-2)}else{cM[aK&511](bN)}aK=c[3524]|0;if((a[cx]&1)==0){if((c[aK+96>>2]&1024|0)!=0){break}c[aW>>2]=1;c[c3>>2]=bN}fn(V,aK)}}while(0);if((c[14156]|0)==1){break}f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0);break}else if((aH|0)==33){aK=c[64784+((c[200]|0)*688&-1)>>2]|0;aM=c[64784+((c[144]|0)*688&-1)>>2]|0;cn=bv+300|0;if((c[cn>>2]|0)<=0){break}cr=bv+320|0;aL=bv+316|0;aI=0;do{aJ=c[cr>>2]|0;L13380:do{if((c[aJ+(aI<<6)>>2]|0)!=2){co=c[200]|0;do{if((a[30528]&1)==0){cJ=+h[64664+(co*688&-1)>>3];cH=+h[64672+(co*688&-1)>>3];cF=+h[aJ+(aI<<6)+8>>3];if(cJ<cH){if(cF<cJ|cF>cH){break L13380}else{dr=cF;ds=cJ;break}}else{if(cF<cH|cF>cJ){break L13380}else{dr=cF;ds=cJ;break}}}else{dr=+h[aJ+(aI<<6)+8>>3];ds=+h[64664+(co*688&-1)>>3]}}while(0);bj=~~(+(c[64768+(co*688&-1)>>2]|0)+(dr-ds)*+h[64776+(co*688&-1)>>3]+.5);cq=c[144]|0;ar=~~(+(c[64768+(cq*688&-1)>>2]|0)+(+h[aJ+(aI<<6)+16>>3]- +h[64664+(cq*688&-1)>>3])*+h[64776+(cq*688&-1)>>3]+.5);cq=(c[aL>>2]|0)+(aI<<3)|0;f9(bv,cq);if((a[30528]&1)==0){c[ac>>2]=bj;c[ad>>2]=aM;c[ae>>2]=bj;c[af>>2]=ar;cq=c[3524]|0;if((fl(ac,ad,ae,af)|0)==0){break}cN[c[cq+56>>2]&255](c[ac>>2]|0,c[ad>>2]|0);cN[c[cq+60>>2]&255](c[ae>>2]|0,c[af>>2]|0);break}else{c[ag>>2]=aK;c[ah>>2]=aM;c[ai>>2]=bj;c[aj>>2]=ar;ar=c[3524]|0;if((fl(ag,ah,ai,aj)|0)==0){break}cN[c[ar+56>>2]&255](c[ag>>2]|0,c[ah>>2]|0);cN[c[ar+60>>2]&255](c[ai>>2]|0,c[aj>>2]|0);break}}}while(0);aI=aI+1|0;}while((aI|0)<(c[cn>>2]|0))}else if((aH|0)==169){if((c[14156]|0)!=1){f_(bv)}f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0);if((c[14156]|0)!=1){break}f_(bv);break}else if((aH|0)==345){cn=bv+244|0;aI=c[cn>>2]|0;if((aI|0)==13){f0(bv);break}else if((aI|0)==10){f0(bv);break}else{aI=c[3524]|0;c[U>>2]=0;if((c[aI+148>>2]|0)==0){fX(bv)}else{aI=bv+240|0;do{if((c[aI>>2]|0)==0){aM=aI;if((c[cp>>2]|0)==1){c[aM>>2]=c[10858];c[aM+4>>2]=c[10859];c[aM+8>>2]=c[10860];c[aM+12>>2]=c[10861];c[aM+16>>2]=c[10862];c[aM+20>>2]=c[10863];c[aM+24>>2]=c[10864];c[aM+28>>2]=c[10865];break}else{c[aM>>2]=c[10850];c[aM+4>>2]=c[10851];c[aM+8>>2]=c[10852];c[aM+12>>2]=c[10853];c[aM+16>>2]=c[10854];c[aM+20>>2]=c[10855];c[aM+24>>2]=c[10856];c[aM+28>>2]=c[10857];break}}}while(0);aI=c[cn>>2]|0;do{if((aI|0)==5){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8255];if(cJ<cF){h[aM>>3]=cF;dt=cF}else{dt=cJ}cJ=+h[8256];if(dt<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==7){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8599];if(cJ<cF){h[aM>>3]=cF;du=cF}else{du=cJ}cJ=+h[8600];if(du<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==6){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8169];if(cJ<cF){h[aM>>3]=cF;dv=cF}else{dv=cJ}cJ=+h[8170];if(dv<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==8){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8513];if(cJ<cF){h[aM>>3]=cF;dw=cF}else{dw=cJ}cJ=+h[8514];if(dw<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==9){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8255];if(cJ<cF){h[aM>>3]=cF;dx=cF}else{dx=cJ}cJ=+h[8256];if(dx>cJ){h[aM>>3]=cJ}aM=bv+256|0;cJ=+h[aM>>3];cF=+h[8169];if(cJ<cF){h[aM>>3]=cF;dy=cF}else{dy=cJ}cJ=+h[8170];if(dy<=cJ){break}h[aM>>3]=cJ}}while(0);aM=bv+300|0;if((c[aM>>2]|0)>0){aK=bv+320|0;aL=bv+264|0;cr=bv+248|0;aJ=2;bN=0;ar=0;bj=0;cq=0;ch=0;cg=2;while(1){ci=c[7934]|0;if((cg|0)>=(ci|0)){cd=ci+128|0;c[7934]=cd;c[7936]=db(c[7936]|0,cd*12&-1,140784)|0}cd=c[aK>>2]|0;ci=c[cd+(ch<<6)>>2]|0;L13454:do{if((ci|0)==1){cc=(c[cn>>2]|0)==0;if(cc){bt=10021}else{if((a[54152]&1)==0){dA=bj;dB=ar}else{bt=10021}}if((bt|0)==10021){bt=0;cf=c[200]|0;ce=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[cd+(ch<<6)+8>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[144]|0;ca=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[cd+(ch<<6)+16>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[13542]|0;if((cf|0)==0){dC=0}else{cb=(c[cf>>2]|0)>(ce|0)&1;b8=(c[cf+4>>2]|0)<(ce|0)?cb|2:cb;cb=(c[cf+8>>2]|0)>(ca|0)?b8|4:b8;dC=(c[cf+12>>2]|0)<(ca|0)?cb|8:cb}cb=dC&3;ca=dC&12;dA=(cb|0)==0?bj:cb;dB=(ca|0)==0?ar:ca}if((aJ|0)==0){if(!((a[54160]&1)!=0|cc)){if((a[54152]&1)==0){dE=cq;dF=dA;dG=dB;dH=bN;break}}ca=gb(cd,ch,N,O)|0;cb=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cb*688&-1)>>2]|0)+(+h[N>>3]- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);cb=c[144]|0;cf=~~(+(c[64768+(cb*688&-1)>>2]|0)+(+h[O>>3]- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);cb=c[U>>2]|0;c[U>>2]=cb+1;c[(c[7936]|0)+(cb*12&-1)+4>>2]=cf;dE=cq;dF=dA;dG=dB;dH=ca;break}else if((aJ|0)!=1){dE=cq;dF=dA;dG=dB;dH=bN;break}if(!cc){if((a[54152]&1)==0){dE=cq;dF=dA;dG=dB;dH=bN;break}}if(!(gc(cd,ch,aU,c2)|0)){dE=cq;dF=dA;dG=dB;dH=bN;break}cc=c[200]|0;cJ=+h[aU>>3];c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cJ- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;cF=+h[c2>>3];ca=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cF- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[U>>2]|0;c[U>>2]=cc+1;c[(c[7936]|0)+(cc*12&-1)+4>>2]=ca;ca=c[aK>>2]|0;cc=ca+(ch<<6)+8|0;cH=+h[cc>>3];cC=+h[ca+(ch<<6)+16>>3];cA=+h[c1>>3];h[cc>>3]=cA;cs=+h[Q>>3];h[(c[aK>>2]|0)+(ch<<6)+16>>3]=cs;cc=gb(c[aK>>2]|0,ch,N,O)|0;h[(c[aK>>2]|0)+(ch<<6)+8>>3]=cH;h[(c[aK>>2]|0)+(ch<<6)+16>>3]=cC;do{if((bN|0)==0){dI=cc}else{if((cc|0)==(bN|0)){dI=cq;break}gi(c[7936]|0,U,bN,cc,dB,dA);dI=cq}}while(0);cc=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cA- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;co=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cs- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[U>>2]|0;c[U>>2]=cc+1;c[(c[7936]|0)+(cc*12&-1)+4>>2]=co;co=ch-1|0;cc=c[aK>>2]|0;ca=cc+(co<<6)+8|0;cC=+h[ca>>3];cH=+h[cc+(co<<6)+16>>3];h[ca>>3]=cJ;h[(c[aK>>2]|0)+(co<<6)+16>>3]=cF;ca=gb(c[aK>>2]|0,ch,N,O)|0;h[(c[aK>>2]|0)+(co<<6)+8>>3]=cC;h[(c[aK>>2]|0)+(co<<6)+16>>3]=cH;dE=dI;dF=dA;dG=dB;dH=ca}else if((ci|0)==2){if((aJ|0)==2){dE=cq;dF=bj;dG=ar;dH=bN;break}if(!((cq|0)==0|(cq|0)==(bN|0))){gi(c[7936]|0,U,bN,cq,ar,bj)}gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;dE=0;dF=bj;dG=ar;dH=0}else if((ci|0)==0){ca=c[200]|0;cH=+(c[64768+(ca*688&-1)>>2]|0);cC=+h[cd+(ch<<6)+8>>3];bE=+h[64664+(ca*688&-1)>>3];ct=+h[64776+(ca*688&-1)>>3];ca=~~(cH+(cC-bE)*ct+.5);co=c[144]|0;bD=+h[cd+(ch<<6)+16>>3];cc=~~(+(c[64768+(co*688&-1)>>2]|0)+(bD- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);if((aJ|0)==0){do{if((c[aL>>2]|0)!=0){co=c[cn>>2]|0;if((co|0)==5|(co|0)==7){be=+h[cr>>3];cf=ch-1|0;bd=be- +h[cd+(cf<<6)+8>>3];bg=be-cC;if(bg*bd>=0.0){break}bf=+h[cd+(cf<<6)+16>>3];h[N>>3]=be;dJ=bf+bd*(bD-bf)/(bd-bg);dK=be}else if((co|0)==6|(co|0)==8){be=+h[cr>>3];co=ch-1|0;bg=be- +h[cd+(co<<6)+16>>3];bd=be-bD;bf=+h[cd+(co<<6)+8>>3];if(bd*bg>=0.0){break}a7=bf+bg*(cC-bf)/(bg-bd);h[N>>3]=a7;dJ=be;dK=a7}else{break}h[O>>3]=dJ;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(cH+ct*(dK-bE)+.5);co=c[144]|0;cf=~~(+(c[64768+(co*688&-1)>>2]|0)+(dJ- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cf;gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;cf=c[200]|0;c[c[7936]>>2]=~~(+(c[64768+(cf*688&-1)>>2]|0)+(dK- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[144]|0;co=~~(+(c[64768+(cf*688&-1)>>2]|0)+(dJ- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[U>>2]|0;c[U>>2]=cf+1;c[(c[7936]|0)+(cf*12&-1)+4>>2]=co}}while(0);c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break}else if((aJ|0)==1){do{if((c[cn>>2]|0)!=0){if((a[54152]&1)!=0){break}co=(a[54160]&1)==0;gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;if(co){c[c[7936]>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break L13454}else{co=c[aK>>2]|0;gb(co,ch,N,O);co=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[N>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[144]|0;cf=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[O>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cf;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;cf=c[U>>2]|0;c[U>>2]=cf+1;c[(c[7936]|0)+(cf*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break L13454}}}while(0);cf=gb(cd,ch,N,O)|0;do{if((bN|0)==0){dL=cf}else{if((cf|0)==(bN|0)){dL=cq;break}gi(c[7936]|0,U,bN,cf,ar,bj);dL=cq}}while(0);cf=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[N>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[144]|0;co=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[O>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[U>>2]|0;c[U>>2]=cf+1;c[(c[7936]|0)+(cf*12&-1)+4>>2]=co;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=dL;dF=bj;dG=ar;dH=bN;break}else{gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;c[c[7936]>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break}}else{dE=cq;dF=bj;dG=ar;dH=bN}}while(0);cd=ch+1|0;if((cd|0)>=(c[aM>>2]|0)){break}aJ=c[(c[aK>>2]|0)+(ch<<6)>>2]|0;bN=dH;ar=dG;bj=dF;cq=dE;ch=cd;cg=(c[U>>2]|0)+2|0}dM=dH;dN=dG;dO=dF;dP=dE;dQ=c[cn>>2]|0}else{dM=0;dN=0;dO=0;dP=0;dQ=aI}if((dQ|0)==0){if(!((dP|0)==0|(dP|0)==(dM|0))){bt=10045}}else{if(!((a[54152]&1)==0|(dP|0)==0|(dP|0)==(dM|0))){bt=10045}}if((bt|0)==10045){bt=0;gi(c[7936]|0,U,dM,dP,dN,dO)}gj(c[U>>2]|0,c[7936]|0,bv)}if(!(hG(bv+192|0)|0)){break}fX(bv);break}}else if((aH|0)==193){cg=c[3524]|0;ch=bv+300|0;if((c[ch>>2]|0)<=0){break}cq=bv+320|0;bj=cg+56|0;ar=cg+60|0;cg=0;bN=0;aK=0;aJ=2;aM=c[cq>>2]|0;while(1){cr=c[aM+(aK<<6)>>2]|0;if((cr|0)==0){aL=c[200]|0;cd=~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[aM+(aK<<6)+8>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5);aL=c[144]|0;ci=~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[aM+(aK<<6)+16>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5);do{if((aJ|0)==0){cN[c[ar>>2]&255](cg,ci);cN[c[ar>>2]&255](cd,ci)}else if((aJ|0)==1){if((a[54160]&1)==0){break}gf(aM,aK,Y,Z);aL=c[200]|0;co=~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[Y>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5);aL=c[144]|0;cN[c[bj>>2]&255](co,~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[Z>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5));cN[c[ar>>2]&255](co,ci);cN[c[ar>>2]&255](cd,ci)}}while(0);cN[c[bj>>2]&255](cd,ci);dR=ci;dS=cd}else if((cr|0)==1){L13532:do{if((aJ|0)==0){if((a[54160]&1)==0){dT=bN;dU=cg;break}gf(aM,aK,Y,Z);co=c[200]|0;aL=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[Y>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[144]|0;cf=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[Z>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);cN[c[ar>>2]&255](cg,cf);cN[c[ar>>2]&255](aL,cf);dT=cf;dU=aL}else if((aJ|0)==1){if((a[54152]&1)==0){dT=bN;dU=cg;break}aL=aK-1|0;bE=+h[aM+(aL<<6)+8>>3];ct=+h[aM+(aL<<6)+16>>3];cH=+h[aM+(aK<<6)+8>>3];cC=+h[aM+(aK<<6)+16>>3];aL=c[200]|0;bD=+h[64664+(aL*688&-1)>>3];if((bE>cH?bE:cH)<bD){dT=bN;dU=cg;break}cF=+h[64672+(aL*688&-1)>>3];if((bE<cH?bE:cH)>cF){dT=bN;dU=cg;break}cf=c[144]|0;cJ=+h[64664+(cf*688&-1)>>3];if((ct>cC?ct:cC)<cJ){dT=bN;dU=cg;break}cs=+h[64672+(cf*688&-1)>>3];if((ct<cC?ct:cC)>cs){dT=bN;dU=cg;break}co=cJ<cs;if(co){if(cC<cJ|cC>cs){bt=9876}else{bt=9880}}else{if(cC<cs|cC>cJ){bt=9876}else{bt=9881}}if((bt|0)==9876){bt=0;if(bD<cF){if(bE<bD|bE>cF){dT=bN;dU=cg;break}}else{if(bE<cF|bE>bD){dT=bN;dU=cg;break}}if(co){bt=9880}else{bt=9881}}if((bt|0)==9880){bt=0;if(cC<cJ|cC>cs){bt=9900}else{bt=9882}}else if((bt|0)==9881){bt=0;if(cC<cs|cC>cJ){bt=9901}else{bt=9882}}do{if((bt|0)==9882){bt=0;cb=bD<cF;if(cb){if(bE<bD|bE>cF){bt=9899}}else{if(bE<cF|bE>bD){bt=9899}}if((bt|0)==9899){bt=0;if(co){bt=9900;break}else{bt=9901;break}}do{if(co){if(ct>cs){dV=cs;break}if(ct>=cJ){dV=ct;break}dV=cJ}else{if(ct>cJ){dV=cJ;break}if(ct>=cs){dV=ct;break}dV=cs}}while(0);if(cb){if(cH>cF){dW=dV;dX=cC;dY=bE;dZ=cF;break}if(cH>=bD){dW=dV;dX=cC;dY=bE;dZ=cH;break}dW=dV;dX=cC;dY=bE;dZ=bD;break}else{if(cH>bD){dW=dV;dX=cC;dY=bE;dZ=bD;break}if(cH>=cF){dW=dV;dX=cC;dY=bE;dZ=cH;break}dW=dV;dX=cC;dY=bE;dZ=cF;break}}}while(0);if((bt|0)==9900){bt=0;if(cC<cJ|cC>cs){bt=9902}else{dW=cC;dX=cC;dY=bD;dZ=cF}}else if((bt|0)==9901){bt=0;if(cC<cs|cC>cJ){bt=9902}else{dW=cC;dX=cC;dY=bD;dZ=cF}}do{if((bt|0)==9902){bt=0;if(bD<cF){if(bE<bD|bE>cF){dT=bN;dU=cg;break L13532}else{dW=cJ;dX=cs;dY=bE;dZ=bE;break}}else{if(bE<cF|bE>bD){dT=bN;dU=cg;break L13532}else{dW=cJ;dX=cs;dY=bE;dZ=bE;break}}}}while(0);bE=+(c[64768+(aL*688&-1)>>2]|0);cs=+h[64776+(aL*688&-1)>>3];co=~~(bE+(dY-bD)*cs+.5);cF=+(c[64768+(cf*688&-1)>>2]|0);cC=+h[64776+(cf*688&-1)>>3];cc=~~(bE+(dZ-bD)*cs+.5);ca=~~(cF+(dX-cJ)*cC+.5);cN[c[bj>>2]&255](co,~~(cF+(dW-cJ)*cC+.5));cN[c[ar>>2]&255](co,ca);cN[c[ar>>2]&255](cc,ca);dT=ca;dU=cc}else{dT=bN;dU=cg}}while(0);cN[c[bj>>2]&255](dU,dT);dR=dT;dS=dU}else{dR=bN;dS=cg}cr=c[cq>>2]|0;cd=c[cr+(aK<<6)>>2]|0;ci=aK+1|0;if((ci|0)<(c[ch>>2]|0)){cg=dS;bN=dR;aK=ci;aJ=cd;aM=cr}else{break}}}else if((aH|0)==1){fX(bv);break}else if((aH|0)==177|(aH|0)==184){aM=c[3524]|0;do{if((aH&8|0)==0){d_=0;d$=0}else{if((c[aM+108>>2]|0)==0){d_=0;d$=0;break}aJ=c[bv+192>>2]|0;if((aJ|0)==1|(aJ|0)==4){d0=(c[bv+196>>2]<<4&65520)+aJ|0}else if((aJ|0)==2|(aJ|0)==5){d0=(c[bv+200>>2]<<4&65520)+aJ|0}else{d0=0}aJ=c[144]|0;do{if((a[64788+(aJ*688&-1)|0]&1)==0){h[ab>>3]=0.0;cC=+h[64664+(aJ*688&-1)>>3];cF=+h[64672+(aJ*688&-1)>>3];if(cC<cF){if(cF<0.0){h[ab>>3]=cF;d1=cF;d2=cC;break}if(cC<=0.0){d1=0.0;d2=cC;break}h[ab>>3]=cC;d1=cC;d2=cC;break}else{if(cC<0.0){h[ab>>3]=cC;d1=cC;d2=cC;break}if(cF<=0.0){d1=0.0;d2=cC;break}h[ab>>3]=cF;d1=cF;d2=cC;break}}else{cC=+h[64664+(aJ*688&-1)>>3];h[ab>>3]=cC;d1=cC;d2=cC}}while(0);d_=d0;d$=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(d1-d2)*+h[64776+(aJ*688&-1)>>3]+.5)}}while(0);aK=bv+300|0;if((c[aK>>2]|0)<=0){break}bN=bv+320|0;cg=aM+56|0;ch=(d_|0)==0;cq=aM+60|0;bj=aM+108|0;ar=0;aI=0;cn=0;cr=2;cd=c[bN>>2]|0;while(1){ci=c[cd+(cn<<6)>>2]|0;if((ci|0)==1){L13617:do{if((cr|0)==0){if((a[54160]&1)==0){d3=aI;d4=ar;break}gg(cd,cn,$,ab);cc=c[200]|0;ca=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[$>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;co=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[ab>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);if(ch){cN[c[cq>>2]&255](ca,aI);cN[c[cq>>2]&255](ca,co);d3=co;d4=ca;break}else{cI[c[bj>>2]&63](d_,ar,d$,ca-ar|0,aI-d$|0);d3=co;d4=ca;break}}else if((cr|0)==1){if((a[54152]&1)==0){d3=aI;d4=ar;break}ca=cn-1|0;cC=+h[cd+(ca<<6)+8>>3];cF=+h[cd+(ca<<6)+16>>3];cs=+h[cd+(cn<<6)+8>>3];bE=+h[cd+(cn<<6)+16>>3];ca=c[200]|0;cH=+h[64664+(ca*688&-1)>>3];if((cC>cs?cC:cs)<cH){d3=aI;d4=ar;break}ct=+h[64672+(ca*688&-1)>>3];if((cC<cs?cC:cs)>ct){d3=aI;d4=ar;break}co=c[144]|0;cA=+h[64664+(co*688&-1)>>3];if((cF>bE?cF:bE)<cA){d3=aI;d4=ar;break}a7=+h[64672+(co*688&-1)>>3];if((cF<bE?cF:bE)>a7){d3=aI;d4=ar;break}cc=cA<a7;if(cc){if(cF<cA|cF>a7){bt=9824}else{bt=9828}}else{if(cF<a7|cF>cA){bt=9824}else{bt=9829}}if((bt|0)==9824){bt=0;if(cH<ct){if(cs<cH|cs>ct){d3=aI;d4=ar;break}}else{if(cs<ct|cs>cH){d3=aI;d4=ar;break}}if(cc){bt=9828}else{bt=9829}}if((bt|0)==9828){bt=0;if(cF<cA|cF>a7){bt=9847}else{bt=9830}}else if((bt|0)==9829){bt=0;if(cF<a7|cF>cA){bt=9848}else{bt=9830}}do{if((bt|0)==9830){bt=0;do{if(cH<ct){if(cs<cH|cs>ct){bt=9846;break}if(cC>ct){d5=ct;break}if(cC>=cH){d5=cC;break}d5=cH}else{if(cs<ct|cs>cH){bt=9846;break}if(cC>cH){d5=cH;break}if(cC>=ct){d5=cC;break}d5=ct}}while(0);if((bt|0)==9846){bt=0;if(cc){bt=9847;break}else{bt=9848;break}}if(cc){if(bE>a7){d6=cF;d7=a7;d8=d5;d9=cs;break}if(bE>=cA){d6=cF;d7=bE;d8=d5;d9=cs;break}d6=cF;d7=cA;d8=d5;d9=cs;break}else{if(bE>cA){d6=cF;d7=cA;d8=d5;d9=cs;break}if(bE>=a7){d6=cF;d7=bE;d8=d5;d9=cs;break}d6=cF;d7=a7;d8=d5;d9=cs;break}}}while(0);if((bt|0)==9847){bt=0;if(cF<cA|cF>a7){bt=9849}else{d6=cF;d7=cF;d8=cH;d9=ct}}else if((bt|0)==9848){bt=0;if(cF<a7|cF>cA){bt=9849}else{d6=cF;d7=cF;d8=cH;d9=ct}}do{if((bt|0)==9849){bt=0;if(cH<ct){if(cC<cH|cC>ct){d3=aI;d4=ar;break L13617}else{d6=cA;d7=a7;d8=cs;d9=cs;break}}else{if(cC<ct|cC>cH){d3=aI;d4=ar;break L13617}else{d6=cA;d7=a7;d8=cs;d9=cs;break}}}}while(0);cs=+(c[64768+(ca*688&-1)>>2]|0);a7=+h[64776+(ca*688&-1)>>3];cc=~~(cs+(d8-cH)*a7+.5);cC=+(c[64768+(co*688&-1)>>2]|0);ct=+h[64776+(co*688&-1)>>3];cf=~~(cC+(d6-cA)*ct+.5);aL=~~(cs+(d9-cH)*a7+.5);cb=~~(cC+(d7-cA)*ct+.5);if(ch){cN[c[cg>>2]&255](cc,cf);cN[c[cq>>2]&255](aL,cf);cN[c[cq>>2]&255](aL,cb);d3=cb;d4=aL;break}else{cI[c[bj>>2]&63](d_,cc,d$,aL-cc|0,cf-d$|0);d3=cb;d4=aL;break}}else{d3=aI;d4=ar}}while(0);cN[c[cg>>2]&255](d4,d3);ea=d3;eb=d4}else if((ci|0)==0){aJ=c[200]|0;aL=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[cd+(cn<<6)+8>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);aJ=c[144]|0;cb=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[cd+(cn<<6)+16>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);do{if((cr|0)==1){if((a[54160]&1)==0){break}gg(cd,cn,$,ab);aJ=c[200]|0;cf=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[$>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);aJ=c[144]|0;cc=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[ab>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);if(ch){cN[c[cg>>2]&255](cf,cc);cN[c[cq>>2]&255](aL,cc);cN[c[cq>>2]&255](aL,cb);break}aJ=cc-d$|0;b8=c[bj>>2]|0;ce=aL-cf|0;if((aJ|0)<0){cI[b8&63](d_,cf,cc,ce,d$-cc|0);break}else{cI[b8&63](d_,cf,d$,ce,aJ);break}}else if((cr|0)==0){if(ch){cN[c[cq>>2]&255](aL,aI);cN[c[cq>>2]&255](aL,cb);break}aJ=aI-d$|0;ce=c[bj>>2]|0;cf=aL-ar|0;if((aJ|0)<0){cI[ce&63](d_,ar,aI,cf,d$-aI|0);break}else{cI[ce&63](d_,ar,d$,cf,aJ);break}}}while(0);cN[c[cg>>2]&255](aL,cb);ea=cb;eb=aL}else{ea=aI;eb=ar}ci=c[bN>>2]|0;aJ=c[ci+(cn<<6)>>2]|0;cf=cn+1|0;if((cf|0)<(c[aK>>2]|0)){ar=eb;aI=ea;cn=cf;cr=aJ;cd=ci}else{break}}}else if((aH|0)==225){cd=c[3524]|0;cr=c[bv+88>>2]|0;cn=c[bv+92>>2]|0;ct=+h[bv+104>>3];cC=+h[bv+112>>3];aI=a[bv+120|0]|0;uD(c_|0,bv+121|0,23);ar=c[bv+144>>2]|0;a7=+h[bv+152>>3];aK=c[bv+160>>2]|0;cs=+h[bv+168>>3];cF=+h[bv+176>>3];bN=c[bv+184>>2]|0;uD(cv|0,ck|0,16);do{if((cr|0)!=0){cg=c[cd+92>>2]|0;if(cC<0.0){cK[cg&63](+h[3817]);break}else{cK[cg&63](cC);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](ct);cr=c[(c[3524]|0)+64>>2]|0;if((cn|0)<-5){cM[cr&511](-2)}else{cM[cr&511](cn)}cr=c[3524]|0;do{if((aI&1)==0){if((c[cr+96>>2]&1024|0)!=0){break}c[M>>2]=1;c[cV>>2]=cn;bt=10059}else{bt=10059}}while(0);if((bt|0)==10059){bt=0;fn(I,cr)}c[12912]=bN;c[12910]=0;if(a7>0.0){uE(bh|0,0,40);c[bo>>2]=2;c[bL>>2]=2;h[bi>>3]=a7;c[aB>>2]=aK;fN(H,F,G,123984);h[6458]=cs;h[6457]=cF;c[12910]=~~+h[F>>3]}cn=bv+300|0;if((c[cn>>2]|0)<=0){break}aI=bv+320|0;cg=bv+80|0;bj=bv+316|0;cq=cd+84|0;ch=ar;aM=0;while(1){ci=c[aI>>2]|0;uD(R|0,ci+(aM<<6)|0,64);aJ=c[c$>>2]|0;L13717:do{if((aJ|0)==2){ec=ch}else{ct=+h[ci+(aM<<6)+56>>3];h[ao>>3]=ct;cC=+h[ci+(aM<<6)+40>>3];h[an>>3]=cC;do{if((c[cg>>2]|0)==-3){cf=~~+h[ci+(aM<<6)+24>>3];ce=43296;while(1){ed=c[ce>>2]|0;if((ed|0)==0){bt=10069;break}if((c[ed+4>>2]|0)==(cf|0)){bt=10070;break}else{ce=ed|0}}do{if((bt|0)==10069){bt=0;uD(c_|0,51521,23);uh(-1,79128,(v=i,i=i+8|0,c[v>>2]=cf,v)|0);uD(cL|0,ck|0,16);ee=0;ef=90.0;eg=15.0;eh=0;ei=0.0;ej=1;ek=0;el=1.0;em=-2}else if((bt|0)==10070){bt=0;ce=c[ed+16>>2]|0;b8=c[ed+20>>2]|0;bE=+h[ed+32>>3];cJ=+h[ed+40>>3];cc=a[ed+48|0]|0;uD(c_|0,ed+49|0,23);b9=c[ed+72>>2]|0;bD=+h[ed+80>>3];b7=c[ed+88>>2]|0;be=+h[ed+96>>3];bd=+h[ed+104>>3];b4=c[ed+112>>2]|0;uD(cL|0,ck|0,16);if((ce|0)==0){ee=b4;ef=bd;eg=be;eh=b7;ei=bD;ej=b9;ek=cc;el=bE;em=b8;break}ce=c[(c[3524]|0)+92>>2]|0;if(cJ<0.0){cK[ce&63](+h[3817]);ee=b4;ef=bd;eg=be;eh=b7;ei=bD;ej=b9;ek=cc;el=bE;em=b8;break}else{cK[ce&63](cJ);ee=b4;ef=bd;eg=be;eh=b7;ei=bD;ej=b9;ek=cc;el=bE;em=b8;break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](el);cf=c[(c[3524]|0)+64>>2]|0;if((em|0)<-5){cM[cf&511](-2)}else{cM[cf&511](em)}cf=c[3524]|0;do{if((ek&1)==0){if((c[cf+96>>2]&1024|0)!=0){break}c[cj>>2]=1;c[cY>>2]=em;bt=10080}else{bt=10080}}while(0);if((bt|0)==10080){bt=0;fn(E,cf)}c[12912]=ee;c[12910]=0;if(ei<=0.0){en=ej;break}uE(bn|0,0,40);c[cZ>>2]=2;c[by>>2]=2;h[cX>>3]=ei;c[cB>>2]=eh;fN(D,B,C,123984);h[6458]=eg;h[6457]=ef;c[12910]=~~+h[B>>3];en=ej}else{en=ch}}while(0);co=(c[bj>>2]|0)+(aM<<3)|0;f9(bv,co);co=c[200]|0;cA=+h[64664+(co*688&-1)>>3];cH=+h[64672+(co*688&-1)>>3];if(cA<cH){if(!(ct<cA|ct>cH)){bt=10086}}else{if(!(ct<cH|ct>cA)){bt=10086}}do{if((bt|0)==10086){bt=0;ca=c[144]|0;cH=+h[64664+(ca*688&-1)>>3];bE=+h[64672+(ca*688&-1)>>3];if(cH<bE){if(cC<cH|cC>bE){break}}else{if(cC<bE|cC>cH){break}}c[cz>>2]=0;bE=+(c[64768+(co*688&-1)>>2]|0);bD=+h[64776+(co*688&-1)>>3];b8=~~(bE+(ct-cA)*bD+.5);be=+(c[64768+(ca*688&-1)>>2]|0);bd=+h[64776+(ca*688&-1)>>3];ca=~~(be+(cC-cH)*bd+.5);if((aJ|0)==0){cI[c[cq>>2]&63](~~(bE+bD*(+h[cD>>3]-cA)+.5),~~(be+bd*(+h[bI>>3]-cH)+.5),b8,ca,en);ec=en;break L13717}else if((aJ|0)!=1){ec=en;break L13717}if((a[54160]&1)==0){ec=en;break L13717}gb(c0,1,K,L);cc=c[200]|0;b9=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[K>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;b7=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[L>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[cq>>2]|0;if((en&1|0)==0){cI[cc&63](b9,b7,b8,ca,0);ec=en;break L13717}else{cI[cc&63](b9,b7,b8,ca,1);ec=en;break L13717}}}while(0);c[cz>>2]=1;if((aJ|0)==1){if((a[54152]&1)==0){ec=en;break}if(!(gc(c0,1,aU,c2)|0)){ec=en;break}ca=c[200]|0;cC=+(c[64768+(ca*688&-1)>>2]|0);ct=+h[64664+(ca*688&-1)>>3];cH=+h[64776+(ca*688&-1)>>3];ca=c[144]|0;bd=+(c[64768+(ca*688&-1)>>2]|0);be=+h[64664+(ca*688&-1)>>3];bD=+h[64776+(ca*688&-1)>>3];cI[c[cq>>2]&63](~~(cC+(+h[aU>>3]-ct)*cH+.5),~~(bd+(+h[c2>>3]-be)*bD+.5),~~(cC+cH*(+h[c1>>3]-ct)+.5),~~(bd+bD*(+h[Q>>3]-be)+.5),0);ec=en;break}else if((aJ|0)!=0){ec=en;break}if((a[54160]&1)==0){ec=en;break}ca=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[cD>>3]-cA)*+h[64776+(co*688&-1)>>3]+.5);b8=c[144]|0;b7=~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[bI>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5);gb(c0,1,K,L);b8=c[200]|0;b9=~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[K>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5);b8=c[144]|0;cc=~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[L>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5);b8=c[cq>>2]|0;if((en&2|0)==0){cI[b8&63](ca,b7,b9,cc,0);ec=en;break}else{cI[b8&63](b9,cc,ca,b7,2);ec=en;break}}}while(0);aJ=aM+1|0;if((aJ|0)<(c[cn>>2]|0)){ch=ec;aM=aJ}else{break}}}else if((aH|0)==209){aM=c[3524]|0;ch=bv+300|0;cn=c[ch>>2]|0;if((cn|0)<=0){break}cq=bv+320|0;bj=c[cq>>2]|0;cg=0;aI=0;do{aI=((c[bj+(cg<<6)>>2]|0)>>>0<2&1)+aI|0;cg=cg+1|0;}while((cg|0)<(cn|0));if((aI|0)<2){break}cn=aI<<2;cg=ut(cn)|0;if((cg|0)==0){gk();bj=ut(cn)|0;if((bj|0)==0){bt=9914;break L13212}else{eo=bj}}else{eo=cg}cg=eo;bj=c[ch>>2]|0;if((bj|0)>0){cn=0;ar=0;cd=bj;while(1){if((c[(c[cq>>2]|0)+(cn<<6)>>2]|0)>>>0<2){c[cg+(ar<<2)>>2]=cn;ep=ar+1|0;eq=c[ch>>2]|0}else{ep=ar;eq=cd}bj=cn+1|0;if((bj|0)<(eq|0)){cn=bj;ar=ep;cd=eq}else{er=ep;break}}}else{er=0}c[9732]=bv;bM(eo|0,er|0,4,30);c[9732]=0;cd=c[144]|0;cF=+h[64664+(cd*688&-1)>>3];if((a[64788+(cd*688&-1)|0]&1)==0){es=0.0}else{cs=+h[64672+(cd*688&-1)>>3];es=cF<cs?cF:cs}ar=c[cg>>2]|0;cn=c[cq>>2]|0;cs=(+h[cn+(ar<<6)+8>>3]*3.0- +h[cn+(c[eo+4>>2]<<6)+8>>3])*.5;ch=c[200]|0;aI=~~(+(c[64768+(ch*688&-1)>>2]|0)+(cs- +h[64664+(ch*688&-1)>>3])*+h[64776+(ch*688&-1)>>3]+.5);c[W>>2]=aI;ch=~~(+(c[64768+(cd*688&-1)>>2]|0)+(es-cF)*+h[64776+(cd*688&-1)>>3]+.5);c[X>>2]=ch;cd=c[13542]|0;if((cd|0)==0){bt=9923}else{bj=(c[cd>>2]|0)>(aI|0)&1;aK=(c[cd+4>>2]|0)<(aI|0)?bj|2:bj;bj=(c[cd+8>>2]|0)>(ch|0)?aK|4:aK;if((((c[cd+12>>2]|0)<(ch|0)?bj|8:bj)|0)==0){bt=9923}else{et=ar;eu=cn}}if((bt|0)==9923){bt=0;cN[c[aM+56>>2]&255](aI,ch);et=c[cg>>2]|0;eu=c[cq>>2]|0}ch=er-1|0;cF=+h[eu+(et<<6)+16>>3];if((ch|0)>0){a7=cs;be=es;aI=1;cn=et;ar=eu;bD=cF;while(1){ev=(a[64788+((c[144]|0)*688&-1)|0]&1)!=0&bD<es?es:bD;bj=cg+(aI<<2)|0;ew=(+h[ar+(cn<<6)+8>>3]+ +h[ar+(c[bj>>2]<<6)+8>>3])*.5;gd(W,X,a7,be,ev);ge(W,X,a7,ew,ev);ex=c[bj>>2]|0;ey=c[cq>>2]|0;ez=+h[ey+(ex<<6)+16>>3];if((aI|0)>=(ch|0)){break}a7=ew;be=ev;aI=aI+1|0;cn=ex;ar=ey;bD=ez}eA=ew;eB=ev;eC=er-2|0;eD=ex;eE=ey;eF=ez}else{eA=cs;eB=es;eC=-1;eD=et;eE=eu;eF=cF}bD=(+h[eE+(eD<<6)+8>>3]*3.0- +h[eE+(c[cg+(eC<<2)>>2]<<6)+8>>3])*.5;gd(W,X,eA,eB,eF);ge(W,X,eA,bD,eF);gd(W,X,bD,eF,es);uu(eo);break}else if((aH|0)==257){f1(bv);break}else if((aH|0)==252){f2(bv);break}else if((aH|0)==474){ar=bv+320|0;cn=c[ar>>2]|0;aI=c[bv+288>>2]|0;ch=(aI|0)==0?1:aI;aI=bv+300|0;cq=c[aI>>2]|0;if((ch|0)<=0){break}aM=(ch|0)>1;bj=(cq|0)>0;cd=bv+292|0;aK=bv+48|0;bN=bv+32|0;bD=0.0;be=0.0;cr=0;aJ=cq;while(1){if(aM){c[aI>>2]=cq;do{if((a[56292]&1)==0){eG=cr}else{ci=c[cd>>2]|0;if((ci|0)==0){eG=cr;break}eG=c[ci+(cr<<2)>>2]|0}}while(0);ci=c[ar>>2]|0;if(bj){a7=+(eG|0);aL=0;cb=ci;while(1){h[cb+(aL<<6)+16>>3]=+h[cb+(aL<<6)+40>>3];c[(c[ar>>2]|0)+(aL<<6)>>2]=0;b7=c[ar>>2]|0;if(+h[b7+(aL<<6)+32>>3]!=a7){c[b7+(aL<<6)>>2]=2;h[(c[ar>>2]|0)+(aL<<6)+16>>3]=8.988465674311579e+307;eH=c[ar>>2]|0}else{eH=b7}b7=aL+1|0;if((b7|0)<(cq|0)){aL=b7;cb=eH}else{eI=eH;break}}}else{eI=ci}bM(eI|0,cq|0,64,12);cb=c[ar>>2]|0;aL=cq;while(1){b7=aL-1|0;if((c[cb+(b7<<6)>>2]|0)==2){aL=b7}else{break}}c[aI>>2]=aL;eJ=aL}else{eJ=aJ}if((eJ|0)<4){h[J>>3]=+h[(c[ar>>2]|0)+8>>3]+ +(cr|0)*+h[7035];h[cW>>3]=-8.988465674311579e+307;h[bu>>3]=8.988465674311579e+307;eK=be;eL=bD}else{if((eJ&1|0)==0){cb=(eJ|0)/2&-1;ci=c[ar>>2]|0;eM=(+h[ci+(cb-1<<6)+16>>3]+ +h[ci+(cb<<6)+16>>3])*.5;eN=ci}else{ci=c[ar>>2]|0;eM=+h[ci+(((eJ-1|0)/2&-1)<<6)+16>>3];eN=ci}if((eJ&3|0)==0){ci=(eJ|0)/4&-1;cb=eJ-ci|0;eO=(+h[eN+(cb<<6)+16>>3]+ +h[eN+(cb-1<<6)+16>>3])*.5;eP=(+h[eN+(ci-1<<6)+16>>3]+ +h[eN+(ci<<6)+16>>3])*.5}else{ci=(eJ+3|0)/4&-1;eO=+h[eN+(eJ-ci<<6)+16>>3];eP=+h[eN+(ci-1<<6)+16>>3]}L13836:do{if((c[14062]|0)==0){a7=(eO-eP)*+h[7032];bd=eP-a7;ci=0;while(1){if((ci|0)>=(eJ|0)){eQ=bd;break}ct=+h[eN+(ci<<6)+16>>3];if(ct<bd){ci=ci+1|0}else{eQ=ct;break}}bd=eO+a7;ci=eJ;while(1){co=ci-1|0;if((ci|0)<=0){eR=eQ;eS=bd;eT=eN;break L13836}cA=+h[eN+(co<<6)+16>>3];if(cA>bd){ci=co}else{eR=eQ;eS=cA;eT=eN;break}}}else{bd=+(eJ|0);a7=+h[7032];ci=0;co=eJ-1|0;cA=be;ct=bD;cb=eN;L13846:while(1){b7=1-ci|0;ca=co;cH=cA;cC=ct;cc=cb;while(1){if(+(b7+ca|0)/bd<a7){eR=cH;eS=cC;eT=cc;break L13836}eU=+h[cc+(ca<<6)+16>>3];eV=+h[cc+(ci<<6)+16>>3];bE=eU-eM;cJ=eM-eV;L13851:do{if(bE<cJ){eW=ca;eX=cc}else{b9=ca;b8=cc;while(1){b4=b9-1|0;if((b4|0)<=0){eW=b4;eX=b8;break L13851}if(+h[eN+(b4<<6)+16>>3]==+h[eN+(b9-2<<6)+16>>3]){b9=b4;b8=eN}else{eW=b4;eX=eN;break}}}}while(0);if(bE>cJ){ca=eW;cH=eV;cC=eU;cc=eX}else{break}}cc=ci+1|0;while(1){if((cc|0)>=(eW|0)){ci=cc;co=eW;cA=eV;ct=eU;cb=eX;continue L13846}ca=cc+1|0;if(+h[eX+(cc<<6)+16>>3]==+h[eX+(ca<<6)+16>>3]){cc=ca}else{ci=cc;co=eW;cA=eV;ct=eU;cb=eX;continue L13846}}}}}while(0);c[cP>>2]=0;ct=+h[eT+8>>3];if((c[cp>>2]|0)==0){h[J>>3]=(ct+ +h[eT+(eJ-1<<6)+8>>3])*.5;eY=+h[7035];eZ=+(cr|0)}else{cA=+h[7035];a7=+(cr|0);h[J>>3]=ct+a7*cA;eY=cA;eZ=a7}h[cQ>>3]=eP;h[cm>>3]=eO;h[bu>>3]=eR;h[cW>>3]=eS;h[aR>>3]=+h[eT+48>>3]+eZ*eY;h[aQ>>3]=eM;c[ar>>2]=A;c[aI>>2]=1;if((c[14068]|0)==257){f1(bv)}else{f2(bv)}c[ar>>2]=cn;c[aI>>2]=eJ;eK=eR;eL=eS}do{if((a[56264]&1)==0){e_=eJ}else{c[8240]=~~(+h[aK>>3]*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));aL=c[aI>>2]|0;if((aL|0)>0){e$=0;e0=aL}else{e_=aL;break}while(1){aL=c[ar>>2]|0;a7=+h[aL+(e$<<6)+16>>3];if(a7<+h[bu>>3]){bt=10156}else{if(a7>+h[cW>>3]){bt=10156}else{e1=e0}}do{if((bt|0)==10156){bt=0;if((c[aL+(e$<<6)>>2]|0)!=0){e1=e0;break}cb=c[200]|0;co=~~(+(c[64768+(cb*688&-1)>>2]|0)+(+h[J>>3]- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);cb=c[144]|0;ci=~~(+(c[64768+(cb*688&-1)>>2]|0)+(a7- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);if((a[54144]&1)!=0){cb=c[8240]|0;if((co|0)<(cb+(c[7938]|0)|0)){e1=e0;break}cc=c[8242]|0;if((ci|0)<(cc+(c[7940]|0)|0)){e1=e0;break}if((co|0)>((c[7939]|0)-cb|0)){e1=e0;break}if((ci|0)>((c[7941]|0)-cc|0)){e1=e0;break}}L13885:do{if((e$|0)<1){e2=co}else{cc=c[8240]|0;cb=1;ca=co;while(1){if(a7!=+h[aL+(e$-cb<<6)+16>>3]){e2=ca;break L13885}b7=aa((cb&1|0)==0?-cb|0:cb,cc)+ca|0;cf=cb+1|0;if((e$|0)<(cf|0)){e2=b7;break}else{cb=cf;ca=b7}}}}while(0);cR[c[(c[3524]|0)+80>>2]&127](e2,ci,c[bN>>2]|0);e1=c[aI>>2]|0}}while(0);aL=e$+1|0;if((aL|0)<(e1|0)){e$=aL;e0=e1}else{e_=e1;break}}}}while(0);aL=cr+1|0;if((aL|0)<(ch|0)){bD=eL;be=eK;cr=aL;aJ=e_}else{break}}}else if((aH|0)==352){uh(-1,108328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}else if((aH|0)==368){aJ=c[c[bv+224>>2]>>2]|0;cr=c[(c[3524]|0)+92>>2]|0;if((cr|0)!=0){cK[cr&63](+h[3817])}if((aJ|0)==0){break}else{e3=aJ}do{L13900:do{if((c[e3+56>>2]|0)==99){aJ=c[200]|0;be=+h[e3+24>>3];cr=c[144]|0;bD=+h[e3+32>>3];ch=~~(+(c[64768+(cr*688&-1)>>2]|0)+(bD- +h[64664+(cr*688&-1)>>3])*+h[64776+(cr*688&-1)>>3]+.5);cr=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(be- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);aJ=c[e3+8>>2]|0;do{if((aJ|0)==0){cF=+h[8255];cs=+h[8256];if(cF<cs){if(be<cF|be>cs){break L13900}else{break}}else{if(be<cs|be>cF){break L13900}else{break}}}else if((aJ|0)==1){cF=+h[8599];cs=+h[8600];if(cF<cs){if(be<cF|be>cs){break L13900}else{break}}else{if(be<cs|be>cF){break L13900}else{break}}}}while(0);aJ=c[e3+12>>2]|0;do{if((aJ|0)==0){be=+h[8169];cF=+h[8170];if(be<cF){if(bD<be|bD>cF){break L13900}else{break}}else{if(bD<cF|bD>be){break L13900}else{break}}}else if((aJ|0)==1){be=+h[8513];cF=+h[8514];if(be<cF){if(bD<be|bD>cF){break L13900}else{break}}else{if(bD<cF|bD>be){break L13900}else{break}}}}while(0);fp(cr,ch,e3)}}while(0);e3=c[e3>>2]|0;}while((e3|0)!=0)}else if((aH|0)==400){c[bv+228>>2]=0;f3(bv,0);break}else if((aH|0)==416){c[bv+228>>2]=1;f3(bv,0);break}else if((aH|0)==432){c[bv+228>>2]=2;f3(bv,0);break}else if((aH|0)==457){aJ=bv+192|0;aI=c[aJ>>2]|0;if((aI|0)==1|(aI|0)==4){e4=(c[bv+196>>2]<<4&65520)+aI|0}else if((aI|0)==2|(aI|0)==5){e4=(c[bv+200>>2]<<4&65520)+aI|0}else{e4=0}if((c[bv+208>>2]|0)==1){if((c[bv+212>>2]|0)==-3){e5=0}else{bt=10198}}else{bt=10198}if((bt|0)==10198){bt=0;e5=1}aI=bv+300|0;if((c[aI>>2]|0)<=0){break}bN=bv+320|0;ar=bv+316|0;aK=e5^1;cn=bv+24|0;cq=bv+48|0;bj=0;do{cd=c[bN>>2]|0;do{if((c[cd+(bj<<6)>>2]|0)==0){aM=c[200]|0;bD=+(c[64768+(aM*688&-1)>>2]|0);be=+h[64664+(aM*688&-1)>>3];cF=+h[64776+(aM*688&-1)>>3];aM=~~(bD+(+h[cd+(bj<<6)+8>>3]-be)*cF+.5);cg=c[144]|0;aL=~~(+(c[64768+(cg*688&-1)>>2]|0)+(+h[cd+(bj<<6)+16>>3]- +h[64664+(cg*688&-1)>>3])*+h[64776+(cg*688&-1)>>3]+.5);h[y>>3]=+(aM-~~(bD+cF*(+h[cd+(bj<<6)+48>>3]-be)+.5)|0);if(+h[cd+(bj<<6)+24>>3]==-1.0){fN(50952,y,z,184696);e6=c[bN>>2]|0}else{e6=cd}be=+h[e6+(bj<<6)+32>>3];cF=+h[e6+(bj<<6)+56>>3];do{if(!(f9(bv,(c[ar>>2]|0)+(bj<<3)|0)|aK)){c[cw>>2]=c[bm>>2];c[cw+4>>2]=c[bm+4>>2];c[cw+8>>2]=c[bm+8>>2];c[cw+12>>2]=c[bm+12>>2];cg=c[cu>>2]|0;do{if((c[cn>>2]|0)!=0){bD=+h[cq>>3];co=c[(c[3524]|0)+92>>2]|0;if(bD<0.0){cK[co&63](+h[3817]);break}else{cK[co&63](bD);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);co=c[(c[3524]|0)+64>>2]|0;if((cg|0)<-5){cM[co&511](-2)}else{cM[co&511](cg)}co=c[3524]|0;if((a[cx]&1)==0){if((c[co+96>>2]&1024|0)!=0){break}c[cU>>2]=1;c[bz>>2]=cg}fn(x,co)}}while(0);bD=+h[y>>3];lq(aM,aL,bD,be,cF,e4);if(!e5){break}hG(aJ);lq(aM,aL,bD,be,cF,0)}}while(0);bj=bj+1|0;}while((bj|0)<(c[aI>>2]|0))}else if((aH|0)==489){aI=ut(96)|0;if((aI|0)==0){gk();bj=ut(96)|0;if((bj|0)==0){bt=10221;break L13212}else{e7=bj}}else{e7=aI}aI=e7;bj=bv+192|0;aJ=c[bj>>2]|0;if((aJ|0)==1|(aJ|0)==4){e8=(c[bv+196>>2]<<4&65520)+aJ|0}else if((aJ|0)==2|(aJ|0)==5){e8=(c[bv+200>>2]<<4&65520)+aJ|0}else{e8=0}if((c[bv+208>>2]|0)==1){if((c[bv+212>>2]|0)==-3){e9=0}else{bt=10227}}else{bt=10227}if((bt|0)==10227){bt=0;e9=1}aJ=e7+48|0;cq=aJ;c[aJ>>2]=(c[cl>>2]|0)==6&1;c[e7+52>>2]=(c[ap>>2]|0)==5&1;aJ=e7;c[aJ>>2]=c[bv+272>>2];cn=bv+300|0;if((c[cn>>2]|0)>0){aK=bv+320|0;ar=e7+24|0;bN=e7+32|0;cd=e7+64|0;ch=e7+72|0;cr=e7+88|0;co=bv+316|0;ca=e9^1;cb=bv+24|0;cc=bv+48|0;b7=0;do{cf=c[aK>>2]|0;do{if((c[cf+(b7<<6)>>2]|0)==0){b8=c[200]|0;h[ar>>3]=+(~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[cf+(b7<<6)+8>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5)|0);b8=c[144]|0;h[bN>>3]=+(~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[(c[aK>>2]|0)+(b7<<6)+16>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5)|0);h[cd>>3]=+h[(c[aK>>2]|0)+(b7<<6)+48>>3];h[ch>>3]=+h[(c[aK>>2]|0)+(b7<<6)+56>>3];b8=c[aJ>>2]|0;if((b8|0)==0){fN(cq,u,w,73152);h[cd>>3]=+h[u>>3];h[ch>>3]=+h[w>>3]}else if((b8|0)==1){fN(cq,u,w,73152);bD=+h[u>>3];h[cd>>3]=+h[ch>>3];fN(cq,w,u,73152);h[cd>>3]=bD;h[ch>>3]=+h[w>>3]}else if((b8|0)==2){fN(cq,u,w,73152);bD=+h[w>>3];h[ch>>3]=+h[cd>>3];fN(cq,w,u,73152);h[cd>>3]=+h[u>>3];h[ch>>3]=bD}b8=c[aK>>2]|0;bD=+h[b8+(b7<<6)+24>>3];if(bD>-1.0){fa=b8;fb=bD}else{fN(49672,cd,ch,73152);b8=c[aK>>2]|0;fa=b8;fb=+h[b8+(b7<<6)+24>>3]}if(fb==-2.0){fc=49712}else{fc=fa+(b7<<6)+32|0}h[cr>>3]=+h[fc>>3];do{if(!(f9(bv,(c[co>>2]|0)+(b7<<3)|0)|ca)){c[cT>>2]=c[bm>>2];c[cT+4>>2]=c[bm+4>>2];c[cT+8>>2]=c[bm+8>>2];c[cT+12>>2]=c[bm+12>>2];b8=c[cu>>2]|0;do{if((c[cb>>2]|0)!=0){bD=+h[cc>>3];b9=c[(c[3524]|0)+92>>2]|0;if(bD<0.0){cK[b9&63](+h[3817]);break}else{cK[b9&63](bD);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);cg=c[(c[3524]|0)+64>>2]|0;if((b8|0)<-5){cM[cg&511](-2)}else{cM[cg&511](b8)}cg=c[3524]|0;if((a[cx]&1)==0){if((c[cg+96>>2]&1024|0)!=0){break}c[bA>>2]=1;c[cE>>2]=b8}fn(t,cg)}}while(0);fP(2,aI,e8,0);if(!e9){break}hG(bj);fP(2,aI,0,0)}}while(0);b7=b7+1|0;}while((b7|0)<(c[cn>>2]|0))}uu(e7);break}else{break}}}while(0);do{if(((a[36228]&1)==0|bK)&c7){if((c[bv+16>>2]|0)==0){fd=c8;break}if((a[bv+22|0]&1)!=0){fd=c8;break}ap=c[aO>>2]|0;if((ap|0)==51){do{if((c[bv+36>>2]|0)<0){cl=c[a3>>2]|0;if((cl|0)!=0){cM[cl&511](56688)}cK[c[a2>>2]&63](+h[3817]*+h[3818]);cR[c[a_>>2]&127]((c[9016]|0)+(c[aS>>2]|0)|0,c[aT>>2]|0,6);c[aY>>2]=c[bm>>2];c[aY+4>>2]=c[bm+4>>2];c[aY+8>>2]=c[bm+8>>2];c[aY+12>>2]=c[bm+12>>2];cl=c[cu>>2]|0;do{if((c[aq>>2]|0)!=0){cF=+h[bv+48>>3];cp=c[(c[3524]|0)+92>>2]|0;if(cF<0.0){cK[cp&63](+h[3817]);break}else{cK[cp&63](cF);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);cp=c[(c[3524]|0)+64>>2]|0;if((cl|0)<-5){cM[cp&511](-2)}else{cM[cp&511](cl)}cp=c[3524]|0;if((a[cx]&1)==0){if((c[cp+96>>2]&1024|0)!=0){break}c[aZ>>2]=1;c[aX>>2]=cl}fn(s,cp)}}while(0);fe=c[aO>>2]|0}else{fe=ap}do{if((fe|0)==64){cp=(c[9016]|0)+(c[aS>>2]|0)|0;cn=c[aT>>2]|0;b7=c[3524]|0;if((c[b7+96>>2]&128|0)==0){if((cp|0)<=0){break}if(!((c[b7+8>>2]|0)>>>0>cp>>>0&(cn|0)>0)){break}if((c[b7+12>>2]|0)>>>0<=cn>>>0){break}}cR[c[a_>>2]&127](cp,cn,-1)}else if((fe|0)!=474){if((fe&2|0)==0){break}if(+h[bv+48>>3]==-3.0){cK[c[a2>>2]&63](+h[3817])}cM[c[a0>>2]&511](8);cn=(c[9016]|0)+(c[aS>>2]|0)|0;cp=c[aT>>2]|0;b7=c[3524]|0;do{if((c[b7+96>>2]&128|0)==0){if((cn|0)<=0){break}if(!((c[b7+8>>2]|0)>>>0>cn>>>0&(cp|0)>0)){break}if((c[b7+12>>2]|0)>>>0>cp>>>0){bt=10287}}else{bt=10287}}while(0);if((bt|0)==10287){bt=0;cR[c[a_>>2]&127](cn,cp,c[bv+32>>2]|0)}cM[c[a0>>2]&511](9)}}while(0);if((a[36230]&1)!=0){c[aT>>2]=(((c[54]|0)+(c[9336]|0)|0)+((c[9020]|0)/2&-1)|0)-(c[aT>>2]|0)}if((c8|0)<(c[9012]|0)){c[aT>>2]=(c[aT>>2]|0)-(c[9020]|0);fd=c8;break}else{c[aT>>2]=c[54];c[aS>>2]=(c[aS>>2]|0)+(c[9026]|0);fd=0;break}}else{fd=c8}}while(0);cM[c[(c[3524]|0)+168>>2]&511](7);cx=bl+1|0;aP=a[35184]|0;if((cx|0)<(d|0)){bH=c[aO>>2]|0;bq=fd;bv=c[bv>>2]|0;bl=cx;bJ=aP}else{ff=fd;fg=aP;break}}}else{ff=bB;fg=bk}if((fg&1)==0){bt=10298;break}if((a[36228]&1)==0|bK){bt=10298;break}fW(1,aS,aT);bB=ff;bK=1}if((bt|0)==9914){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142288,v)|0)}else if((bt|0)==10221){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=148064,v)|0)}else if((bt|0)==10298){if((c[10026]|0)==1){fT()}do{if((a[30528]&1)!=0){if((a[27776]&1)==0){break}uD(r|0,31816,272);bK=c[200]|0;fb=+(c[64768+(bK*688&-1)>>2]|0);eK=+h[64664+(bK*688&-1)>>3];eL=+h[64776+(bK*688&-1)>>3];bK=~~(fb+(0.0-eK)*eL+.5);ff=c[144]|0;bB=~~(+(c[64768+(ff*688&-1)>>2]|0)+(0.0- +h[64664+(ff*688&-1)>>3])*+h[64776+(ff*688&-1)>>3]+.5);eS=(c[17366]&2|0)==0?+h[8688]:+h[8686];if((a[69604]&1)==0){fh=+h[8687];fi=eS}else{eR=+_(+eS);eS=+h[8702];fh=+_(+(+h[8687]))/eS;fi=eR/eS}ff=~~(fb+eL*(fi-fh-eK)+.5);aT=q;c[aT>>2]=c[14084];c[aT+4>>2]=c[56340>>2];c[aT+8>>2]=c[56344>>2];c[aT+12>>2]=c[56348>>2];aT=c[14075]|0;do{if((c[14074]|0)!=0){eK=+h[7040];aS=c[(c[3524]|0)+92>>2]|0;if(eK<0.0){cK[aS&63](+h[3817]);break}else{cK[aS&63](eK);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);bk=c[(c[3524]|0)+64>>2]|0;if((aT|0)<-5){cM[bk&511](-2)}else{cM[bk&511](aT)}bk=c[3524]|0;do{if((a[56328]&1)==0){if((c[bk+96>>2]&1024|0)!=0){fj=bk;break}c[q>>2]=1;c[q+4>>2]=aT;bt=10315}else{bt=10315}}while(0);if((bt|0)==10315){fn(q,bk);fj=c[3524]|0}c[m>>2]=bK;c[n>>2]=bB;c[o>>2]=ff;c[p>>2]=bB;if((fl(m,n,o,p)|0)!=0){cN[c[fj+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[fj+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}if(!((c[17366]&1|0)==0&+h[8687]!=0.0)){break}fO(r,1,2)}}while(0);if((c[10026]|0)==1){c[200]=2;c[144]=1;dg(2,1);dg(1,2);c[200]=6;c[144]=5;dg(6,5);dg(5,6)}if((c[11692]|0)!=0&(c[14088]|0)==1){fU()}do{if(a[31104]&(a[54016]|0)!=110){if(!((c[(c[3524]|0)+144>>2]|0)!=0&(c[13506]|0)==1)){break}dD(1)}}while(0);fO(c[10818]|0,1,2);r=c[10822]|0;p=c[(c[3524]|0)+92>>2]|0;if((p|0)!=0){cK[p&63](+h[3817])}if((r|0)!=0){p=r;do{if((c[p+56>>2]|0)==1){fR(p+8|0,k,l,202256);fp(~~+h[k>>3],~~+h[l>>3],p)}p=c[p>>2]|0;}while((p|0)!=0)}p=c[9682]|0;if((p|0)!=0){l=p;do{p=l+116|0;k=c[p>>2]|0;do{if((k|0)!=0){if((a[k]|0)==0){break}fN(38880,f,j,149952);r=c[200]|0;o=~~(+(c[64768+(r*688&-1)>>2]|0)+ +h[64776+(r*688&-1)>>3]*((+h[l+16>>3]+ +h[l+24>>3])*.5- +h[64664+(r*688&-1)>>3])+.5)+~~+h[f>>3]|0;r=c[3524]|0;fj=~~(+((c[190]|0)>>>0>>>0)+(+(~~+h[j>>3]|0)+ +((c[r+16>>2]|0)>>>0>>>0)*.25));n=l+128|0;fn(n,r);ln(o,fj,c[p>>2]|0,1,2,0,c[l+120>>2]|0);if((c[n>>2]|0)==0){break}cM[c[(c[3524]|0)+64>>2]&511](-2)}}while(0);l=c[l+48>>2]|0;}while((l|0)!=0)}fV(1);if(!(a[31104]|0)){lh();i=e;return}l=c[(c[3524]|0)+140>>2]|0;if((l|0)==0){lh();i=e;return}cS[l&511]();lh();i=e;return}}function fT(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0;b=i;i=i+64|0;d=b|0;e=b+8|0;f=b+16|0;g=b+24|0;j=b+32|0;k=b+48|0;l=c[3524]|0;m=k;c[m>>2]=c[14084];c[m+4>>2]=c[56340>>2];c[m+8>>2]=c[56344>>2];c[m+12>>2]=c[56348>>2];m=c[14075]|0;do{if((c[14074]|0)!=0){n=+h[7040];o=c[l+92>>2]|0;if(n<0.0){cK[o&63](+h[3817]);break}else{cK[o&63](n);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);o=c[(c[3524]|0)+64>>2]|0;if((m|0)<-5){cM[o&511](-2)}else{cM[o&511](m)}o=c[3524]|0;do{if((a[56328]&1)==0){if((c[o+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=m;p=10357}else{p=10357}}while(0);if((p|0)==10357){fn(k,o)}h[4483]=0.0;c[200]=2;c[144]=1;df(1,144,2,4);df(2,704,1,2);c[200]=6;c[144]=5;df(5,584,6,4);df(6,816,5,2);c[200]=2;c[144]=1;if(!((a[30528]&1)==0|(c[17433]|0)==0)){o=~~(+(c[16364]|0)+(0.0- +h[8169])*+h[8183]+.5);c[1394]=o;c[1396]=o;c[1392]=o-(c[l+16>>2]|0);o=c[17462]|0;c[6586]=o;do{if((o|0)==0){c[1398]=1}else{if((cO[c[l+72>>2]&255](o)|0)==0){break}c[1398]=(c[6586]|0)==-270?2:0}}while(0);if((a[70088]&1)!=0){c[1398]=c[17486]}de(7,2);o=c[l+72>>2]|0;cO[o&255](0)}if(+h[3815]==0.0){i=b;return}o=c[200]|0;l=~~(+(c[64768+(o*688&-1)>>2]|0)+(0.0- +h[64664+(o*688&-1)>>3])*+h[64776+(o*688&-1)>>3]+.5);o=c[144]|0;k=~~(+(c[64768+(o*688&-1)>>2]|0)+(0.0- +h[64664+(o*688&-1)>>3])*+h[64776+(o*688&-1)>>3]+.5);o=j;c[o>>2]=c[10022];c[o+4>>2]=c[40092>>2];c[o+8>>2]=c[40096>>2];c[o+12>>2]=c[40100>>2];o=c[10013]|0;do{if((c[10012]|0)!=0){n=+h[5009];m=c[(c[3524]|0)+92>>2]|0;if(n<0.0){cK[m&63](+h[3817]);break}else{cK[m&63](n);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[5008]);m=c[(c[3524]|0)+64>>2]|0;if((o|0)<-5){cM[m&511](-2)}else{cM[m&511](o)}m=c[3524]|0;do{if((a[40080]&1)==0){if((c[m+96>>2]&1024|0)!=0){break}c[j>>2]=1;c[j+4>>2]=o;p=10377}else{p=10377}}while(0);if((p|0)==10377){fn(j,m)}n=0.0;while(1){m=c[200]|0;q=+(c[64768+(m*688&-1)>>2]|0);r=+h[4483];s=r*+S(+n);j=~~(q+(s- +h[64664+(m*688&-1)>>3])*+h[64776+(m*688&-1)>>3]+.5);m=c[144]|0;s=+(c[64768+(m*688&-1)>>2]|0);q=r*+T(+n);p=~~(s+(q- +h[64664+(m*688&-1)>>3])*+h[64776+(m*688&-1)>>3]+.5);c[d>>2]=l;c[e>>2]=k;c[f>>2]=j;c[g>>2]=p;p=c[3524]|0;if((fl(d,e,f,g)|0)!=0){cN[c[p+56>>2]&255](c[d>>2]|0,c[e>>2]|0);cN[c[p+60>>2]&255](c[f>>2]|0,c[g>>2]|0)}if(n>=6.29){break}n=n+ +h[3815]}i=b;return}function fU(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0.0,l=0.0;b=i;i=i+16|0;d=b|0;e=d;c[e>>2]=c[14084];c[e+4>>2]=c[56340>>2];c[e+8>>2]=c[56344>>2];c[e+12>>2]=c[56348>>2];e=c[14075]|0;do{if((c[14074]|0)!=0){f=+h[7040];g=c[(c[3524]|0)+92>>2]|0;if(f<0.0){cK[g&63](+h[3817]);break}else{cK[g&63](f);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);g=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[g&511](-2)}else{cM[g&511](e)}g=c[3524]|0;do{if((a[56328]&1)==0){if((c[g+96>>2]&1024|0)!=0){break}c[d>>2]=1;c[d+4>>2]=e;j=10396}else{j=10396}}while(0);if((j|0)==10396){fn(d,g)}do{if((c[11692]&15|0)==15){g=c[(c[3524]|0)+172>>2]|0;if((g|0)==0){break}cM[g&511](0)}}while(0);cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7941]|0);do{if((c[11692]&2|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7940]|0)}else{if((a[65712]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7938]|0,c[7940]|0);break}else{f=+(c[16364]|0);k=+h[8169];l=+h[8183];g=~~(f+l*(+h[8175]-k)+.5);cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,~~(f+(+h[8176]-k)*l+.5));cN[c[(c[3524]|0)+60>>2]&255](c[7938]|0,g);cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7940]|0);break}}}while(0);do{if((c[11692]&1|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7940]|0)}else{if((a[66400]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7939]|0,c[7940]|0);break}else{l=+(c[16536]|0);k=+h[8255];f=+h[8269];g=~~(l+(+h[8262]-k)*f+.5);cN[c[(c[3524]|0)+56>>2]&255](~~(l+f*(+h[8261]-k)+.5),c[7940]|0);cN[c[(c[3524]|0)+60>>2]&255](g,c[7940]|0);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7940]|0);break}}}while(0);do{if((c[11692]&8|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7941]|0)}else{if((a[68464]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7939]|0,c[7941]|0);break}else{k=+(c[17052]|0);f=+h[8513];l=+h[8527];g=~~(k+l*(+h[8519]-f)+.5);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,~~(k+(+h[8520]-f)*l+.5));cN[c[(c[3524]|0)+60>>2]&255](c[7939]|0,g);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7940]|0);break}}}while(0);do{if((c[11692]&4|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7941]|0)}else{if((a[69152]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7938]|0,c[7941]|0);break}else{l=+(c[17224]|0);f=+h[8599];k=+h[8613];g=~~(l+(+h[8606]-f)*k+.5);cN[c[(c[3524]|0)+56>>2]&255](~~(l+k*(+h[8605]-f)+.5),c[7941]|0);cN[c[(c[3524]|0)+60>>2]&255](g,c[7941]|0);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7941]|0);break}}}while(0);if((c[11692]&15|0)!=15){i=b;return}g=c[(c[3524]|0)+172>>2]|0;if((g|0)==0){i=b;return}cM[g&511](1);i=b;return}function fV(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0;d=i;i=i+120|0;e=d|0;f=d+16|0;g=d+24|0;j=d+32|0;k=d+72|0;l=d+88|0;m=d+96|0;n=d+104|0;o=d+112|0;p=c[13542]|0;c[13542]=(c[(c[3524]|0)+96>>2]&128|0)==0?55520:0;q=c[10826]|0;if((q|0)!=0){r=k;s=k|0;t=k+4|0;u=j;v=j+4|0;w=j+8|0;x=j+16|0;y=j|0;z=q;do{if((c[z+100>>2]|0)==(b|0)){fR(z+8|0,l,m,123984);A=+h[l>>3];q=~~A;B=+h[m>>3];C=~~B;D=z+48|0;if((a[z+88|0]&1)==0){fR(D,n,o,123984);E=+h[o>>3];F=+h[n>>3]}else{fN(D,n,o,123984);E=B+ +h[o>>3];F=A+ +h[n>>3]}D=~~F;G=~~E;H=z+144|0;c[r>>2]=c[H>>2];c[r+4>>2]=c[H+4>>2];c[r+8>>2]=c[H+8>>2];c[r+12>>2]=c[H+12>>2];H=c[z+108>>2]|0;do{if((c[z+104>>2]|0)!=0){A=+h[z+128>>3];I=c[(c[3524]|0)+92>>2]|0;if(A<0.0){cK[I&63](+h[3817]);break}else{cK[I&63](A);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[z+120>>3]);I=c[(c[3524]|0)+64>>2]|0;if((H|0)<-5){cM[I&511](-2)}else{cM[I&511](H)}I=c[3524]|0;do{if((a[z+136|0]&1)==0){if((c[I+96>>2]&1024|0)!=0){break}c[s>>2]=1;c[t>>2]=H;J=10443}else{J=10443}}while(0);if((J|0)==10443){J=0;fn(k,I)}c[12912]=c[z+200>>2];c[12910]=0;A=+h[z+168>>3];if(A>0.0){uE(u|0,0,40);c[v>>2]=2;c[w>>2]=2;h[x>>3]=A;c[y>>2]=c[z+176>>2];fN(j,f,g,123984);h[6458]=+h[z+184>>3];h[6457]=+h[z+192>>3];c[12910]=~~+h[f>>3]}fm(q,C,D,G,c[z+160>>2]|0)}z=c[z>>2]|0;}while((z|0)!=0)}z=e;c[z>>2]=c[14084];c[z+4>>2]=c[56340>>2];c[z+8>>2]=c[56344>>2];c[z+12>>2]=c[56348>>2];z=c[14075]|0;do{if((c[14074]|0)!=0){E=+h[7040];f=c[(c[3524]|0)+92>>2]|0;if(E<0.0){cK[f&63](+h[3817]);break}else{cK[f&63](E);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);f=c[(c[3524]|0)+64>>2]|0;if((z|0)<-5){cM[f&511](-2)}else{cM[f&511](z)}f=c[3524]|0;do{if((a[56328]&1)==0){if((c[f+96>>2]&1024|0)==0){c[e>>2]=1;c[e+4>>2]=z;break}else{c[13542]=p;i=d;return}}}while(0);fn(e,f);c[13542]=p;i=d;return}function fW(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0,S=0.0,T=0,U=0;f=i;i=i+176|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+40|0;o=f+48|0;p=f+56|0;q=f+64|0;r=f+72|0;s=f+80|0;t=f+88|0;u=f+96|0;v=f+104|0;w=f+112|0;x=f+120|0;y=f+128|0;z=f+136|0;A=f+144|0;B=f+152|0;C=f+160|0;D=c[3524]|0;E=(c[8996]|0)+(c[9334]|0)|0;F=c[9337]|0;do{if(b){G=D+108|0;if((c[G>>2]|0)==0){break}H=c[9336]|0;if((a[36288]|0)==0){I=H}else{do{if((c[D+96>>2]&32|0)==0){J=0.0}else{K=(a8(36288,94)|0)==0?0.0:.51;if((a8(36288,95)|0)==0){J=K;break}J=K+.3}}while(0);I=~~(+(H|0)-J*+((c[D+16>>2]|0)>>>0>>>0))}cM[c[D+144>>2]&511](56688);L=c[9334]|0;cI[c[G>>2]&63](1601,L,I,(c[9335]|0)-L|0,(c[9337]|0)-I|0)}}while(0);if((a[36288]|0)==0){M=F;N=c[D+16>>2]|0}else{I=((c[9335]|0)+(c[9334]|0)|0)/2&-1;L=D+96|0;O=c[L>>2]|0;if((O&32|0)==0){P=0.0}else{P=(a8(36288,94)|0)==0?0.0:.51}if(b){Q=10476}else{if((a[36228]&1)==0){Q=10476}else{R=O}}if((Q|0)==10476){if((c[9330]|0)==3&+h[4666]<0.0){fn(36272,D)}else{fn(37320,D)}ln(I,~~(+(F|0)-(P*.5+.5)*+((c[D+16>>2]|0)>>>0>>>0)),36288,1,0,0,c[9329]|0);cM[c[D+64>>2]&511](-2);R=c[L>>2]|0}do{if((R&32|0)==0){S=P}else{if((a8(36288,95)|0)==0){S=P;break}S=P+.3}}while(0);P=S+ +h[4488];h[4488]=P;R=D+16|0;c[9336]=~~(+(c[9336]|0)-S*+((c[R>>2]|0)>>>0>>>0));L=c[R>>2]|0;M=~~(+(F|0)- +(L>>>0>>>0)*P);N=L}L=D+16|0;D=(M-~~(+h[4527]*.5*+(N>>>0>>>0))|0)+((c[9020]|0)/-2&-1)|0;c[54]=D;N=c[9059]|0;if((N|0)<=-3){c[d>>2]=E;c[e>>2]=D;i=f;return}M=c[13542]|0;F=c[3524]|0;c[13542]=(c[F+96>>2]&128|0)==0?55520:0;R=C;c[R>>2]=c[9068];c[R+4>>2]=c[36276>>2];c[R+8>>2]=c[36280>>2];c[R+12>>2]=c[36284>>2];do{if((c[9058]|0)!=0){P=+h[4532];R=c[F+92>>2]|0;if(P<0.0){cK[R&63](+h[3817]);break}else{cK[R&63](P);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[4531]);F=c[(c[3524]|0)+64>>2]|0;if((N|0)<-5){cM[F&511](-2)}else{cM[F&511](N)}F=c[3524]|0;do{if((a[36264]&1)==0){if((c[F+96>>2]&1024|0)!=0){T=F;break}c[C>>2]=1;c[C+4>>2]=N;Q=10495}else{Q=10495}}while(0);if((Q|0)==10495){fn(C,F);T=c[3524]|0}F=c[T+172>>2]|0;if((F|0)==0){U=T}else{cM[F&511](0);U=c[3524]|0}F=c[9334]|0;T=c[9336]|0;C=c[9337]|0;c[y>>2]=F;c[z>>2]=T;c[A>>2]=F;c[B>>2]=C;if((fl(y,z,A,B)|0)!=0){cN[c[U+56>>2]&255](c[y>>2]|0,c[z>>2]|0);cN[c[U+60>>2]&255](c[A>>2]|0,c[B>>2]|0)}B=c[9337]|0;A=c[9335]|0;c[u>>2]=c[9334];c[v>>2]=B;c[w>>2]=A;c[x>>2]=B;B=c[3524]|0;if((fl(u,v,w,x)|0)!=0){cN[c[B+56>>2]&255](c[u>>2]|0,c[v>>2]|0);cN[c[B+60>>2]&255](c[w>>2]|0,c[x>>2]|0)}x=c[9335]|0;w=c[9337]|0;B=c[9336]|0;c[q>>2]=x;c[r>>2]=w;c[s>>2]=x;c[t>>2]=B;B=c[3524]|0;if((fl(q,r,s,t)|0)!=0){cN[c[B+56>>2]&255](c[q>>2]|0,c[r>>2]|0);cN[c[B+60>>2]&255](c[s>>2]|0,c[t>>2]|0)}t=c[9336]|0;s=c[9334]|0;c[m>>2]=c[9335];c[n>>2]=t;c[o>>2]=s;c[p>>2]=t;t=c[3524]|0;if((fl(m,n,o,p)|0)!=0){cN[c[t+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[t+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}p=c[(c[3524]|0)+172>>2]|0;if((p|0)!=0){cM[p&511](1)}do{if((a[36288]|0)!=0){p=~~(+(c[9337]|0)- +h[4488]*+((c[L>>2]|0)>>>0>>>0));o=c[9335]|0;c[g>>2]=c[9334];c[j>>2]=p;c[k>>2]=o;c[l>>2]=p;p=c[3524]|0;if((fl(g,j,k,l)|0)==0){break}cN[c[p+56>>2]&255](c[g>>2]|0,c[j>>2]|0);cN[c[p+60>>2]&255](c[k>>2]|0,c[l>>2]|0)}}while(0);c[13542]=M;c[d>>2]=E;c[e>>2]=D;i=f;return}function fX(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+48|0;e=d|0;f=d+8|0;g=d+16|0;j=d+32|0;k=c[3524]|0;l=b+300|0;if((c[l>>2]|0)<=0){i=d;return}m=b+316|0;n=b+320|0;o=k+56|0;p=k+60|0;k=g|0;q=j|0;r=g+8|0;g=j+8|0;j=0;s=2;do{f9(b,(c[m>>2]|0)+(j<<3)|0);t=c[n>>2]|0;u=c[t+(j<<6)>>2]|0;do{if((u|0)==0){v=c[200]|0;w=~~(+(c[64768+(v*688&-1)>>2]|0)+(+h[t+(j<<6)+8>>3]- +h[64664+(v*688&-1)>>3])*+h[64776+(v*688&-1)>>3]+.5);v=c[144]|0;x=~~(+(c[64768+(v*688&-1)>>2]|0)+(+h[t+(j<<6)+16>>3]- +h[64664+(v*688&-1)>>3])*+h[64776+(v*688&-1)>>3]+.5);if((s|0)==0){cN[c[p>>2]&255](w,x);break}else if((s|0)==1){if((a[54160]&1)==0){cN[c[o>>2]&255](w,x);break}else{gb(t,j,e,f);v=c[200]|0;y=c[144]|0;cN[c[o>>2]&255](~~(+(c[64768+(v*688&-1)>>2]|0)+(+h[e>>3]- +h[64664+(v*688&-1)>>3])*+h[64776+(v*688&-1)>>3]+.5),~~(+(c[64768+(y*688&-1)>>2]|0)+(+h[f>>3]- +h[64664+(y*688&-1)>>3])*+h[64776+(y*688&-1)>>3]+.5));cN[c[p>>2]&255](w,x);break}}else{cN[c[o>>2]&255](w,x);cN[c[p>>2]&255](w,x);break}}else if((u|0)==1){if((s|0)==0){if((a[54160]&1)==0){break}gb(t,j,e,f);x=c[200]|0;w=c[144]|0;cN[c[p>>2]&255](~~(+(c[64768+(x*688&-1)>>2]|0)+(+h[e>>3]- +h[64664+(x*688&-1)>>3])*+h[64776+(x*688&-1)>>3]+.5),~~(+(c[64768+(w*688&-1)>>2]|0)+(+h[f>>3]- +h[64664+(w*688&-1)>>3])*+h[64776+(w*688&-1)>>3]+.5));break}else if((s|0)!=1){break}if((a[54152]&1)==0){break}if(!(gc(t,j,k,q)|0)){break}w=c[200]|0;x=c[144]|0;cN[c[o>>2]&255](~~(+(c[64768+(w*688&-1)>>2]|0)+(+h[k>>3]- +h[64664+(w*688&-1)>>3])*+h[64776+(w*688&-1)>>3]+.5),~~(+(c[64768+(x*688&-1)>>2]|0)+(+h[q>>3]- +h[64664+(x*688&-1)>>3])*+h[64776+(x*688&-1)>>3]+.5));x=c[200]|0;w=c[144]|0;cN[c[p>>2]&255](~~(+(c[64768+(x*688&-1)>>2]|0)+(+h[r>>3]- +h[64664+(x*688&-1)>>3])*+h[64776+(x*688&-1)>>3]+.5),~~(+(c[64768+(w*688&-1)>>2]|0)+(+h[g>>3]- +h[64664+(w*688&-1)>>3])*+h[64776+(w*688&-1)>>3]+.5))}}while(0);s=c[(c[n>>2]|0)+(j<<6)>>2]|0;j=j+1|0;}while((j|0)<(c[l>>2]|0));i=d;return}function fY(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0;j=i;i=i+280|0;k=j|0;l=j+8|0;m=j+16|0;n=j+24|0;o=j+32|0;p=j+40|0;q=j+48|0;r=j+56|0;s=j+64|0;t=j+72|0;u=j+80|0;w=j+88|0;x=j+96|0;y=j+104|0;z=j+112|0;A=j+152|0;B=j+160|0;C=j+168|0;D=j+176|0;E=j+184|0;F=j+192|0;G=j+200|0;H=j+208|0;I=j+216|0;J=j+224|0;K=j+232|0;L=j+240|0;M=j+248|0;N=j+256|0;O=j+264|0;P=j+272|0;Q=c[13542]|0;c[13542]=(c[(c[3524]|0)+96>>2]&128|0)==0?55520:0;R=e+168|0;cM[c[R>>2]&511](8);S=c[9330]|0;if((S|0)==0){cM[c[e+64>>2]&511](-2)}else if((S|0)!=7){fn(37320,e)}L14405:do{if((c[9046]|0)==0){ln((c[8988]|0)+f|0,g,d,0,0,0,c[9329]|0)}else{S=(cO[c[e+76>>2]&255](2)|0)==0;T=(c[8984]|0)+f|0;if(!S){ln(T,g,d,2,0,0,c[9329]|0);break}S=c[e+20>>2]|0;U=T-aa(lp(d)|0,S)|0;do{if(((c[9031]|0)-1|0)>>>0>=2){S=c[7938]|0;T=c[7939]|0;if((S|0)<(T|0)){if((U|0)<(S|0)|(U|0)>(T|0)){break L14405}else{break}}else{if((U|0)<(T|0)|(U|0)>(S|0)){break L14405}else{break}}}}while(0);ln(U,g,d,0,0,0,c[9329]|0)}}while(0);d=e+64|0;S=b+28|0;cM[c[d>>2]&511](c[S>>2]|0);T=b+56|0;if((a[T]&1)!=0){fn(b+64|0,e)}V=b+12|0;W=c[V>>2]|0;do{if((W&8|0)==0){X=10585}else{Y=c[e+108>>2]|0;if((Y|0)==0){X=10585;break}Z=b+192|0;_=Z|0;$=c[_>>2]|0;if(($|0)==1|($|0)==4){ab=(c[b+196>>2]<<4&65520)+$|0}else if(($|0)==2|($|0)==5){ab=(c[b+200>>2]<<4&65520)+$|0}else{ab=0}$=c[9008]|0;ac=$+f|0;ad=c[9020]|0;ae=(ad|0)/4&-1;af=g-ae|0;ag=c[9004]|0;ah=ag-$|0;ai=(ad|0)/2&-1;ad=(ag|0)==($|0);if(!((W|0)!=457|ad)){lq((c[9016]|0)+f|0,g,+(ae|0),0.0,360.0,ab);break}if(!((W|0)!=489|ad)){ae=ut(96)|0;do{if((ae|0)==0){gk();$=ut(96)|0;if(($|0)!=0){aj=$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151888,v)|0)}else{aj=ae}}while(0);h[aj+24>>3]=+((c[9016]|0)+f|0);h[aj+32>>3]=+(g|0);h[aj+64>>3]=+((ah<<1>>>0)/3>>>0>>>0>>>0);h[aj+72>>3]=+(ai>>>0>>>0);h[aj+88>>3]=0.0;fP(2,aj,ab,0);uu(aj);break}if(ad){break}ae=(ab|0)==0;if(ae){ak=W}else{cI[Y&63](ab,ac,af,ah,ai);ak=c[V>>2]|0}do{if((ak|0)==252){if((c[b+208>>2]|0)!=1){X=10566;break}if((c[b+212>>2]|0)==-3|ae){X=10568}else{X=10567}}else{X=10566}}while(0);if((X|0)==10566){if(ae){X=10568}else{X=10567}}if((X|0)==10567){if(hG(Z)|0){X=10568}}do{if((X|0)==10568){ai=c[3524]|0;ah=c[ai+172>>2]|0;if((ah|0)==0){al=ai}else{cM[ah&511](0);al=c[3524]|0}ah=g-((c[9020]|0)/4&-1)|0;ai=(c[9004]|0)+f|0;c[M>>2]=(c[9008]|0)+f;c[N>>2]=ah;c[O>>2]=ai;c[P>>2]=ah;if((fl(M,N,O,P)|0)!=0){cN[c[al+56>>2]&255](c[M>>2]|0,c[N>>2]|0);cN[c[al+60>>2]&255](c[O>>2]|0,c[P>>2]|0)}ah=(c[9004]|0)+f|0;ai=(c[9020]|0)/4&-1;c[I>>2]=ah;c[J>>2]=g-ai;c[K>>2]=ah;c[L>>2]=ai+g;ai=c[3524]|0;if((fl(I,J,K,L)|0)!=0){cN[c[ai+56>>2]&255](c[I>>2]|0,c[J>>2]|0);cN[c[ai+60>>2]&255](c[K>>2]|0,c[L>>2]|0)}ai=((c[9020]|0)/4&-1)+g|0;ah=(c[9008]|0)+f|0;c[E>>2]=(c[9004]|0)+f;c[F>>2]=ai;c[G>>2]=ah;c[H>>2]=ai;ai=c[3524]|0;if((fl(E,F,G,H)|0)!=0){cN[c[ai+56>>2]&255](c[E>>2]|0,c[F>>2]|0);cN[c[ai+60>>2]&255](c[G>>2]|0,c[H>>2]|0)}ai=(c[9008]|0)+f|0;ah=(c[9020]|0)/4&-1;c[A>>2]=ai;c[B>>2]=ah+g;c[C>>2]=ai;c[D>>2]=g-ah;ah=c[3524]|0;if((fl(A,B,C,D)|0)!=0){cN[c[ah+56>>2]&255](c[A>>2]|0,c[B>>2]|0);cN[c[ah+60>>2]&255](c[C>>2]|0,c[D>>2]|0)}ah=c[(c[3524]|0)+172>>2]|0;if((ah|0)==0){break}cM[ah&511](1)}}while(0);Z=c[_>>2]|0;if((Z|0)==0|(Z|0)==3){break}if((c[b+208>>2]|0)==1){if((c[b+212>>2]|0)==-3){break}}cM[c[d>>2]&511](c[S>>2]|0);if((a[T]&1)==0){break}fn(b+64|0,e)}}while(0);L14473:do{if((X|0)==10585){do{if((W|0)==225){if((c[e+84>>2]|0)==0){break}c[12912]=c[b+184>>2];c[12910]=0;am=+h[b+152>>3];if(am>0.0){uE(z|0,0,40);c[z+4>>2]=2;c[z+8>>2]=2;h[z+16>>3]=am;c[z>>2]=c[b+160>>2];fN(z,x,y,123984);h[6458]=+h[b+168>>3];h[6457]=+h[b+176>>3];c[12910]=~~+h[x>>3]}c[12910]=-1;fm((c[9008]|0)+f|0,g,(c[9004]|0)+f|0,g,c[b+144>>2]|0);break L14473}else{if((W&1|0)!=0){break}if((W&4|0)==0){break L14473}if((c[b+8>>2]|0)!=1){break L14473}}}while(0);_=(c[9004]|0)+f|0;c[s>>2]=(c[9008]|0)+f;c[t>>2]=g;c[u>>2]=_;c[w>>2]=g;_=c[3524]|0;if((fl(s,t,u,w)|0)==0){break}cN[c[_+56>>2]&255](c[s>>2]|0,c[t>>2]|0);cN[c[_+60>>2]&255](c[u>>2]|0,c[w>>2]|0)}}while(0);if((c[b+8>>2]|0)!=1){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}b=c[V>>2]|0;if((b&4|0)==0){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}if(!((b|0)!=252&+h[7077]>0.0)){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}b=(c[9008]|0)+f|0;V=e+28|0;e=c[V>>2]|0;w=e>>>0>3?e>>>1:1;c[o>>2]=b;c[p>>2]=w+g;c[q>>2]=b;c[r>>2]=g-w;w=c[3524]|0;if((fl(o,p,q,r)|0)!=0){cN[c[w+56>>2]&255](c[o>>2]|0,c[p>>2]|0);cN[c[w+60>>2]&255](c[q>>2]|0,c[r>>2]|0)}r=(c[9004]|0)+f|0;f=c[V>>2]|0;V=f>>>0>3?f>>>1:1;c[k>>2]=r;c[l>>2]=V+g;c[m>>2]=r;c[n>>2]=g-V;V=c[3524]|0;if((fl(k,l,m,n)|0)==0){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}cN[c[V+56>>2]&255](c[k>>2]|0,c[l>>2]|0);cN[c[V+60>>2]&255](c[m>>2]|0,c[n>>2]|0);an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}function fZ(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;d=i;i=i+16|0;e=d|0;f=c[b+36>>2]|0;g=c[3524]|0;j=b+300|0;k=c[j>>2]|0;if((k|0)<=0){i=d;return}l=b+12|0;m=(f|0)==0;n=b+320|0;o=(f|0)<0;p=g+144|0;q=g+92|0;r=g+80|0;g=e;s=b+64|0;t=b+28|0;u=b+24|0;v=b+40|0;w=b+56|0;x=e|0;y=e+4|0;z=b+48|0;A=b+316|0;B=b+32|0;C=0;D=k;while(1){k=c[l>>2]|0;if((k|0)!=51|m){E=10612}else{if(((C|0)%(f|0)&-1|0)==0){E=10612}else{F=D}}do{if((E|0)==10612){E=0;G=c[n>>2]|0;if((c[G+(C<<6)>>2]|0)!=0){F=D;break}H=c[200]|0;I=~~(+(c[64768+(H*688&-1)>>2]|0)+(+h[G+(C<<6)+8>>3]- +h[64664+(H*688&-1)>>3])*+h[64776+(H*688&-1)>>3]+.5);H=c[144]|0;J=~~(+(c[64768+(H*688&-1)>>2]|0)+(+h[G+(C<<6)+16>>3]- +h[64664+(H*688&-1)>>3])*+h[64776+(H*688&-1)>>3]+.5);if((a[54144]&1)!=0){H=c[8240]|0;if((I|0)<(H+(c[7938]|0)|0)){F=D;break}K=c[8242]|0;if((J|0)<(K+(c[7940]|0)|0)){F=D;break}if((I|0)>((c[7939]|0)-H|0)){F=D;break}if((J|0)>((c[7941]|0)-K|0)){F=D;break}}do{if((k|0)==18|(k|0)==51){if(+h[z>>3]==-3.0){cK[c[q>>2]&63](+h[3817]*+h[G+(C<<6)+24>>3]);L=c[l>>2]|0}else{L=k}if(!((L|0)==51&o)){break}K=c[p>>2]|0;if((K|0)!=0){cM[K&511](56688)}cK[c[q>>2]&63](+h[3817]*+h[3818]);cR[c[r>>2]&127](I,J,6);c[g>>2]=c[s>>2];c[g+4>>2]=c[s+4>>2];c[g+8>>2]=c[s+8>>2];c[g+12>>2]=c[s+12>>2];K=c[t>>2]|0;do{if((c[u>>2]|0)!=0){M=+h[z>>3];H=c[(c[3524]|0)+92>>2]|0;if(M<0.0){cK[H&63](+h[3817]);break}else{cK[H&63](M);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[v>>3]);H=c[(c[3524]|0)+64>>2]|0;if((K|0)<-5){cM[H&511](-2)}else{cM[H&511](K)}H=c[3524]|0;if((a[w]&1)==0){if((c[H+96>>2]&1024|0)!=0){break}c[x>>2]=1;c[y>>2]=K}fn(e,H)}}while(0);G=(c[A>>2]|0)+(C<<3)|0;f9(b,G);cR[c[r>>2]&127](I,J,c[B>>2]|0);F=c[j>>2]|0}}while(0);k=C+1|0;if((k|0)<(F|0)){C=k;D=F}else{break}}i=d;return}function f_(b){b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0,ab=0.0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0,av=0.0,aw=0,ax=0,ay=0,az=0.0,aA=0,aB=0,aC=0,aD=0,aE=0.0;d=c[3524]|0;e=c[d+28>>2]|0;if(e>>>0>3){f=+(e>>>1|0)}else{f=1.0}e=b+12|0;g=c[e>>2]|0;do{if((g|0)==102|(g|0)==118|(g|0)==169|(g|0)==295|(g|0)==311|(g|0)==392|(g|0)==345){i=b+300|0;if((c[i>>2]|0)<=0){j=g;break}k=b+320|0;l=b+276|0;m=b+280|0;n=b+316|0;o=d+108|0;p=b+192|0;q=d+56|0;r=d+60|0;s=0.0;t=0;while(1){u=c[k>>2]|0;L14555:do{if((c[u+(t<<6)>>2]|0)==2){v=s}else{w=+h[u+(t<<6)+8>>3];x=c[e>>2]|0;y=(x|0)==392;if(y){z=c[l>>2]|0;A=c[9671]|0;B=A+(c[z+8>>2]|0)|0;C=aa(B-1|0,t-1|0);D=+(B|0);E=(+h[u+(t<<6)+56>>3]- +h[u+(t<<6)+48>>3])/(D*2.0);F=(+((A|0)/2&-1|0)+(w+ +(C+(c[m>>2]|0)|0)))/D+(+h[z+16>>3]+.5)}else{E=s;F=w}z=c[200]|0;w=+h[64664+(z*688&-1)>>3];D=+h[64672+(z*688&-1)>>3];C=w<D;if(C){if(F<w|F>D){v=E;break}}else{if(F<D|F>w){v=E;break}}G=+(c[64768+(z*688&-1)>>2]|0);H=+h[64776+(z*688&-1)>>3];z=~~(G+(F-w)*H+.5);I=+h[u+(t<<6)+16>>3];A=c[144]|0;J=+h[64664+(A*688&-1)>>3];K=+h[64672+(A*688&-1)>>3];B=J<K;if(B){if(I<J|I>K){v=E;break}}else{if(I<K|I>J){v=E;break}}L=+(c[64768+(A*688&-1)>>2]|0);M=+h[64776+(A*688&-1)>>3];A=~~(L+(I-J)*M+.5);I=+h[u+(t<<6)+40>>3];N=+h[u+(t<<6)+32>>3];do{if(B){if(I<J){O=0}else{O=I<=K}if(N<J){P=O;R=10663;break}S=N<=K;if(O){T=S;R=10665}else{U=S;R=10666}}else{if(I<K){V=0}else{V=I<=J}if(N<K){P=V;R=10663;break}S=N<=J;if(V){T=S;R=10665}else{U=S;R=10666}}}while(0);do{if((R|0)==10663){R=0;if(!P){U=0;R=10666;break}W=0;X=~~(L+(I-J)*M+.5);R=10670}else if((R|0)==10665){R=0;B=~~(L+(I-J)*M+.5);if(T){Y=B;R=10669}else{W=0;X=B;R=10670}}}while(0);do{if((R|0)==10666){R=0;Z=K-J;if((I-K)*Z<0.0){B=~~(L+(J-J)*M+.5);if(U){Y=B;R=10669;break}else{W=1;X=B;R=10670;break}}else{B=~~(L+Z*M+.5);if(U){Y=B;R=10669;break}else{W=1;X=B;R=10670;break}}}}while(0);if((R|0)==10669){R=0;_=~~(L+(N-J)*M+.5);$=Y}else if((R|0)==10670){R=0;I=K-J;if((N-K)*I<0.0){ab=J-J}else{ab=I}B=~~(L+ab*M+.5);if((B|0)==(X|0)&W){v=E;break}else{_=B;$=X}}I=+h[u+(t<<6)+56>>3];Z=+h[u+(t<<6)+48>>3];do{if(y){ac=~~(G+(F-E-w)*H+.5);ad=~~(G+(F+E-w)*H+.5)}else{do{if(C){if(I<w){ae=0}else{ae=I<=D}if(Z<w){af=ae;R=10684;break}B=Z<=D;if(ae){ag=B;R=10686}else{ah=B;R=10687}}else{if(I<D){ai=0}else{ai=I<=w}if(Z<D){af=ai;R=10684;break}B=Z<=w;if(ai){ag=B;R=10686}else{ah=B;R=10687}}}while(0);do{if((R|0)==10684){R=0;if(!af){ah=0;R=10687;break}aj=0;ak=~~(G+(I-w)*H+.5);R=10691}else if((R|0)==10686){R=0;B=~~(G+(I-w)*H+.5);if(ag){al=B;R=10690}else{aj=0;ak=B;R=10691}}}while(0);do{if((R|0)==10687){R=0;am=D-w;if((I-D)*am<0.0){B=~~(G+(w-w)*H+.5);if(ah){al=B;R=10690;break}else{aj=1;ak=B;R=10691;break}}else{B=~~(G+am*H+.5);if(ah){al=B;R=10690;break}else{aj=1;ak=B;R=10691;break}}}}while(0);if((R|0)==10690){R=0;an=al;ao=~~(G+(Z-w)*H+.5)}else if((R|0)==10691){R=0;am=D-w;if((Z-D)*am<0.0){ap=w-w}else{ap=am}B=~~(G+ap*H+.5);if((B|0)==(ak|0)&aj){v=E;break L14555}else{an=ak;ao=B}}if((x|0)==392|(x|0)==345){ac=ao;ad=an;break}B=(c[n>>2]|0)+(t<<3)|0;f9(b,B);if((c[e>>2]|0)!=169){ac=ao;ad=an;break}if((c[o>>2]|0)==0){ac=ao;ad=an;break}hG(p);ac=ao;ad=an}}while(0);if((a[30528]&1)==0){cN[c[q>>2]&255](z,_);cN[c[r>>2]&255](z,$);H=+h[7077];if(H<0.0){cN[c[q>>2]&255](ac,_);cN[c[r>>2]&255](ad,_);cN[c[q>>2]&255](ac,$);cN[c[r>>2]&255](ad,$);v=E;break}if(H<=0.0){v=E;break}G=+(z>>>0>>>0);cN[c[q>>2]&255](~~(G-f*H),_);cN[c[r>>2]&255](~~(G+f*+h[7077]),_);cN[c[q>>2]&255](~~(G-f*+h[7077]),$);cN[c[r>>2]&255](~~(G+f*+h[7077]),$);v=E;break}x=ad-ac|0;C=aa(x,x);x=$-_|0;G=+((C+aa(x,x)|0)>>>0>>>0);H=+h[3817];if(G<=f*H*f*H*4.5){v=E;break}x=c[q>>2]|0;if((ac|0)==(ad|0)){cN[x&255](z,_);H=+(A>>>0>>>0);cN[c[r>>2]&255](z,~~(H-f*+h[3817]));cN[c[q>>2]&255](z,~~(H+f*+h[3817]));cN[c[r>>2]&255](z,$)}else{cN[x&255](ac,_);cN[c[r>>2]&255](ad,$)}H=+h[7077];if(H<=0.0){v=E;break}G=+(ac>>>0>>>0);w=+(ad>>>0>>>0);D=+($>>>0>>>0);Z=+(_>>>0>>>0);I=(G-w)/(D-Z+1.0e-10);M=+Q(+(I*I+1.0));L=f*H/M;H=G+L;J=G-L;cN[c[q>>2]&255](~~H,~~(Z+I*(H-G)));cN[c[r>>2]&255](~~J,~~(Z+I*(J-G)));G=f*+h[7077]/M;M=w+G;J=w-G;cN[c[q>>2]&255](~~M,~~(D+I*(M-w)));cN[c[r>>2]&255](~~J,~~(D+I*(J-w)));v=E}}while(0);u=t+1|0;if((u|0)<(c[i>>2]|0)){s=v;t=u}else{break}}j=c[e>>2]|0}else{j=g}}while(0);if(!((j|0)==86|(j|0)==118|(j|0)==279|(j|0)==311)){return}j=b+300|0;if((c[j>>2]|0)<=0){return}g=b+320|0;e=b+316|0;_=d+56|0;$=d+60|0;d=0;do{ad=c[g>>2]|0;do{if((c[ad+(d<<6)>>2]|0)!=2){v=+h[ad+(d<<6)+16>>3];ac=c[144]|0;E=+h[64664+(ac*688&-1)>>3];ap=+h[64672+(ac*688&-1)>>3];if(E<ap){if(v<E|v>ap){break}}else{if(v<ap|v>E){break}}an=~~(+(c[64768+(ac*688&-1)>>2]|0)+(v-E)*+h[64776+(ac*688&-1)>>3]+.5);E=+h[ad+(d<<6)+56>>3];v=+h[ad+(d<<6)+48>>3];ac=c[200]|0;ap=+h[64664+(ac*688&-1)>>3];F=+h[64672+(ac*688&-1)>>3];do{if(ap<F){if(E<ap){aq=0}else{aq=E<=F}if(v<ap){ar=aq;R=10727;break}ao=v<=F;if(aq){as=ao;R=10728}else{at=ao;R=10729}}else{if(E<F){au=0}else{au=E<=ap}if(v<F){ar=au;R=10727;break}ao=v<=ap;if(au){as=ao;R=10728}else{at=ao;R=10729}}}while(0);if((R|0)==10727){R=0;if(ar){as=0;R=10728}else{at=0;R=10729}}do{if((R|0)==10728){R=0;ao=c[64768+(ac*688&-1)>>2]|0;ab=+h[64776+(ac*688&-1)>>3];ak=~~(+(ao|0)+(E-ap)*ab+.5);if(as){av=ab;aw=ao;ax=ak;R=10732}else{ay=0;az=ab;aA=ao;aB=ak;R=10733}}else if((R|0)==10729){R=0;ab=F-ap;ak=c[64768+(ac*688&-1)>>2]|0;s=+(ak|0);if((E-F)*ab<0.0){w=+h[64776+(ac*688&-1)>>3];ao=~~(s+(ap-ap)*w+.5);if(at){av=w;aw=ak;ax=ao;R=10732;break}else{ay=1;az=w;aA=ak;aB=ao;R=10733;break}}else{w=+h[64776+(ac*688&-1)>>3];ao=~~(s+ab*w+.5);if(at){av=w;aw=ak;ax=ao;R=10732;break}else{ay=1;az=w;aA=ak;aB=ao;R=10733;break}}}}while(0);if((R|0)==10732){R=0;aC=~~(+(aw|0)+(v-ap)*av+.5);aD=ax}else if((R|0)==10733){R=0;E=F-ap;if((v-F)*E<0.0){aE=ap-ap}else{aE=E}ac=~~(+(aA|0)+aE*az+.5);if((ac|0)==(aB|0)&ay){break}else{aC=ac;aD=aB}}ac=(c[e>>2]|0)+(d<<3)|0;f9(b,ac);cN[c[_>>2]&255](aC,an);cN[c[$>>2]&255](aD,an);E=+h[7077];if(E<=0.0){break}w=+(an>>>0>>>0);cN[c[_>>2]&255](aC,~~(w-f*E));cN[c[$>>2]&255](aC,~~(w+f*+h[7077]));cN[c[_>>2]&255](aD,~~(w-f*+h[7077]));cN[c[$>>2]&255](aD,~~(w+f*+h[7077]))}}while(0);d=d+1|0;}while((d|0)<(c[j>>2]|0));return}function f$(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0,$=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0,af=0.0,ag=0.0,ah=0.0,ai=0,aj=0.0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0,aU=0.0,aV=0,aW=0,aX=0;e=i;i=i+112|0;f=e|0;g=e+56|0;j=c[3524]|0;k=b+12|0;l=b+300|0;do{if((c[k>>2]|0)==392){m=c[l>>2]|0;n=c[9670]|0;do{if((n|0)==1){if((c[b+280>>2]|0)!=0){break}c[3572]=0}else if((n|0)==2){c[3572]=0}}while(0);n=c[3568]|0;if((n|0)!=0){if((c[3572]|0)>=(m|0)){break}o=db(n,m<<6,91376)|0;c[3568]=o;n=c[3572]|0;if((n|0)<(m|0)){p=n;while(1){n=p+1|0;uE(o+(p<<6)+32|0,0,16);if((n|0)<(m|0)){p=n}else{break}}}c[3572]=m;break}p=m<<6;o=ut(p)|0;do{if((o|0)==0){gk();n=ut(p)|0;if((n|0)!=0){q=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=91376,v)|0)}else{q=o}}while(0);o=q;c[3568]=o;if((m|0)>0){p=0;while(1){n=p+1|0;uE(o+(p<<6)+32|0,0,16);if((n|0)<(m|0)){p=n}else{break}}}c[3572]=m}}while(0);q=c[l>>2]|0;if((q|0)<=0){i=e;return}p=b+320|0;o=b+276|0;n=g|0;r=g+4|0;s=g+40|0;t=g+44|0;u=g+8|0;w=g+40|0;x=g;y=g+32|0;g=b+200|0;z=f|0;A=f+4|0;B=f+40|0;C=f+44|0;D=f+8|0;E=f;F=f+32|0;G=f+40|0;f=b+280|0;H=b+192|0;I=H|0;J=j+56|0;K=j+60|0;L=j+108|0;M=b+208|0;N=j+64|0;O=b+28|0;P=b+56|0;Q=b+64|0;R=b+196|0;S=b+316|0;T=2;U=0.0;V=0;W=d;d=c[p>>2]|0;X=q;while(1){L14718:do{if((c[d+(V<<6)>>2]|0)>>>0<2){if(+h[d+(V<<6)+24>>3]<0.0){q=(T|0)==2;Y=+h[7030];do{if(q){if(Y<=0.0){Z=0.0;break}if((a[56232]&1)==0){Z=0.0;break}Z=Y*-.5}else{if(Y<0.0){Z=(+h[d+(V-1<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}if((a[56232]&1)==0){Z=Y*(+h[d+(V-1<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}else{Z=Y*-.5;break}}}while(0);do{if((V|0)<(X-1|0)){_=V+1|0;if((c[d+(_<<6)>>2]|0)==2){$=-0.0-Z;break}if(Y<0.0){$=(+h[d+(_<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}if((a[56232]&1)==0){$=Y*(+h[d+(_<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}else{$=Y*.5;break}}else{$=-0.0-Z}}while(0);if(q){ab=-0.0-$}else{ab=Z}Y=+h[d+(V<<6)+8>>3];ac=ab+Y;ad=$+Y}else{ac=+h[d+(V<<6)+48>>3];ad=+h[d+(V<<6)+56>>3]}_=c[k>>2]|0;if((_|0)==137){Y=+h[d+(V<<6)+32>>3];ae=c[144]|0;af=+h[64664+(ae*688&-1)>>3];ag=+h[64672+(ae*688&-1)>>3];do{if(af<ag){if(Y>ag){ah=ag;break}if(Y>=af){ah=Y;break}ah=af}else{if(Y>af){ah=af;break}if(Y>=ag){ah=Y;break}ah=ag}}while(0);ai=~~(+(c[64768+(ae*688&-1)>>2]|0)+(ah-af)*+h[64776+(ae*688&-1)>>3]+.5);aj=ah;ak=d+(V<<6)+40|0}else{ai=W;aj=U;ak=d+(V<<6)+16|0}ag=+h[ak>>3];do{if((_|0)==392){q=c[o>>2]|0;al=c[q+32>>2]|0;am=((al|0)>0?al:0)+V|0;al=c[9670]|0;if((al|0)==3|(al|0)==4){an=c[9671]|0;ao=an+(c[q+8>>2]|0)|0;ap=aa(ao-1|0,~~+h[d+(V<<6)+8>>3]-1|0);Y=+(ap+(c[f>>2]|0)|0);aq=+((an|0)/2&-1|0);ar=+(ao|0);as=+h[q+16>>3]+.5;at=(aq+(ac+Y))/ar+as;au=aj;av=(aq+(ad+Y))/ar+as;aw=ag;break}else if((al|0)==2){as=+h[q+16>>3];ar=+h[7030]*.5;Y=+(c[f>>2]|0);aq=as-ar+Y;ax=as+ar+Y;if((a[30080]&1)==0){ao=c[n>>2]|0;an=c[8798]|0;ap=(an|0)>0;ay=am;L14771:while(1){az=43264;while(1){aA=c[az>>2]|0;if((aA|0)==0){break}if((c[aA+4>>2]|0)==(ay|0)){aB=10821;break L14771}else{az=aA|0}}aC=ay-1|0;if(!((ay|0)>(an|0)&ap)){aB=10827;break}ay=((aC|0)%(an|0)&-1)+1|0}do{if((aB|0)==10821){aB=0;an=aA+8|0;c[x>>2]=c[an>>2];c[x+4>>2]=c[an+4>>2];c[x+8>>2]=c[an+8>>2];c[x+12>>2]=c[an+12>>2];c[x+16>>2]=c[an+16>>2];c[x+20>>2]=c[an+20>>2];c[x+24>>2]=c[an+24>>2];c[x+28>>2]=c[an+28>>2];c[x+32>>2]=c[an+32>>2];c[x+36>>2]=c[an+36>>2];c[x+40>>2]=c[an+40>>2];c[x+44>>2]=c[an+44>>2];c[x+48>>2]=c[an+48>>2];c[x+52>>2]=c[an+52>>2];c[n>>2]=ao;an=c[3524]|0;if((c[an+96>>2]&1024|0)!=0){c[r>>2]=ay;a[y]=0;aD=an;break}if((a[y]&1)!=0){aD=an;break}c[s>>2]=1;c[t>>2]=c[r>>2];aD=an}else if((aB|0)==10827){aB=0;c[r>>2]=aC;c[s>>2]=1;c[t>>2]=aC;c[u>>2]=aC;aD=c[3524]|0}}while(0);fn(w,aD)}else{ay=am+1|0;ao=c[z>>2]|0;an=43280;while(1){aE=c[an>>2]|0;if((aE|0)==0){aB=10805;break}if((c[aE+4>>2]|0)==(ay|0)){aB=10803;break}else{an=aE|0}}do{if((aB|0)==10803){aB=0;an=aE+8|0;c[E>>2]=c[an>>2];c[E+4>>2]=c[an+4>>2];c[E+8>>2]=c[an+8>>2];c[E+12>>2]=c[an+12>>2];c[E+16>>2]=c[an+16>>2];c[E+20>>2]=c[an+20>>2];c[E+24>>2]=c[an+24>>2];c[E+28>>2]=c[an+28>>2];c[E+32>>2]=c[an+32>>2];c[E+36>>2]=c[an+36>>2];c[E+40>>2]=c[an+40>>2];c[E+44>>2]=c[an+44>>2];c[E+48>>2]=c[an+48>>2];c[E+52>>2]=c[an+52>>2];c[z>>2]=ao;if((a[F]&1)!=0){break}c[B>>2]=1;c[C>>2]=c[A>>2]}else if((aB|0)==10805){aB=0;an=c[8798]|0;ap=(an|0)>0;az=ay;L14794:while(1){aF=43264;while(1){aG=c[aF>>2]|0;if((aG|0)==0){break}if((c[aG+4>>2]|0)==(az|0)){break L14794}else{aF=aG|0}}aH=az-1|0;if(!((az|0)>(an|0)&ap)){aB=10815;break}az=((aH|0)%(an|0)&-1)+1|0}if((aB|0)==10815){aB=0;c[A>>2]=aH;c[B>>2]=1;c[C>>2]=aH;c[D>>2]=aH;break}an=aG+8|0;c[E>>2]=c[an>>2];c[E+4>>2]=c[an+4>>2];c[E+8>>2]=c[an+8>>2];c[E+12>>2]=c[an+12>>2];c[E+16>>2]=c[an+16>>2];c[E+20>>2]=c[an+20>>2];c[E+24>>2]=c[an+24>>2];c[E+28>>2]=c[an+28>>2];c[E+32>>2]=c[an+32>>2];c[E+36>>2]=c[an+36>>2];c[E+40>>2]=c[an+40>>2];c[E+44>>2]=c[an+44>>2];c[E+48>>2]=c[an+48>>2];c[E+52>>2]=c[an+52>>2];c[z>>2]=ao;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[A>>2]=az;a[F]=0;break}if((a[F]&1)!=0){break}c[B>>2]=1;c[C>>2]=c[A>>2]}}while(0);fn(G,c[3524]|0)}c[g>>2]=am;aI=0;aJ=c[p>>2]|0;aK=ax;aL=aq}else if((al|0)==1){Y=+h[q+16>>3];aI=V;aJ=d;aK=ad+Y;aL=ac+Y}else{at=ac;au=aj;av=ad;aw=ag;break}Y=+h[aJ+(V<<6)+16>>3];ao=c[3568]|0;if(Y<0.0){ay=ao+(aI<<6)+32|0;ar=+h[ay>>3];h[ay>>3]=Y+ar;aM=ar}else{ay=ao+(aI<<6)+40|0;ar=+h[ay>>3];h[ay>>3]=Y+ar;aM=ar}ar=ag+aM;ay=c[144]|0;Y=+h[64664+(ay*688&-1)>>3];as=+h[64672+(ay*688&-1)>>3];ay=Y<as;if(ay&aM<Y){aB=10835}else{if(as<Y&aM>Y){aB=10835}else{aN=aM}}if((aB|0)==10835){aB=0;aN=Y}if(!(ay&aN>as)){if(!(as<Y&aN<as)){at=aL;au=aN;av=aK;aw=ar;break}}at=aL;au=as;av=aK;aw=ar}else{at=ac;au=aj;av=ad;aw=ag}}while(0);_=c[144]|0;ag=+h[64664+(_*688&-1)>>3];af=+h[64672+(_*688&-1)>>3];do{if(ag<af){if(aw>af){aO=af;break}if(aw>=ag){aO=aw;break}aO=ag}else{if(aw>ag){aO=ag;break}if(aw>=af){aO=aw;break}aO=af}}while(0);ae=c[200]|0;ar=+h[64664+(ae*688&-1)>>3];as=+h[64672+(ae*688&-1)>>3];do{if(ar<as){do{if(av>as){aP=as}else{if(av>=ar){aP=av;break}aP=ar}}while(0);if(at>as){aQ=as;aR=aP;break}if(at>=ar){aQ=at;aR=aP;break}aQ=ar;aR=aP}else{do{if(av>ar){aS=ar}else{if(av>=as){aS=av;break}aS=as}}while(0);if(at>ar){aQ=ar;aR=aS;break}if(at>=as){aQ=at;aR=aS;break}aQ=as;aR=aS}}while(0);if(aR==aQ){if(aR==ar|aR==as){aT=ai;aU=au;break}}aq=+(c[64768+(ae*688&-1)>>2]|0);ax=+h[64776+(ae*688&-1)>>3];q=~~(aq+(aQ-ar)*ax+.5);al=~~(aq+(aR-ar)*ax+.5);ax=+(c[64768+(_*688&-1)>>2]|0);aq=+h[64776+(_*688&-1)>>3];am=~~(ax+(aO-ag)*aq+.5);if((ai|0)==(am|0)){if(aO==ag|aO==af){aT=ai;aU=au;break}}ay=c[k>>2]|0;do{if((ay|0)==153|(ay|0)==137|(ay|0)==169){ao=(c[S>>2]|0)+(V<<3)|0;f9(b,ao);aV=ai}else if((ay|0)==392){if(((c[9670]|0)-1|0)>>>0>=2){aV=ai;break}aV=~~(ax+(au-ag)*aq+.5)}else{aV=ai}}while(0);ay=c[I>>2]|0;do{if((ay|0)!=0){_=c[L>>2]|0;if((_|0)==0){break}ae=al-q|0;ao=am-aV|0;an=(ae|0)<0;ap=an?al:q;aF=(an?q-al|0:ae)+1|0;ae=(ao|0)<0;an=ae?am:aV;aW=(ae?aV-am|0:ao)+1|0;if((ay|0)==1|(ay|0)==4){aX=(c[R>>2]<<4&65520)+ay|0}else if((ay|0)==2|(ay|0)==5){aX=(c[g>>2]<<4&65520)+ay|0}else{aX=0}cI[_&63](aX,ap,an,aF,aW);if(!(hG(H)|0)){aT=ai;aU=au;break L14718}}}while(0);ay=c[(c[3524]|0)+172>>2]|0;if((ay|0)!=0){cM[ay&511](0)}cN[c[J>>2]&255](q,aV);cN[c[K>>2]&255](q,am);cN[c[K>>2]&255](al,am);cN[c[K>>2]&255](al,aV);cN[c[K>>2]&255](q,aV);ay=c[(c[3524]|0)+172>>2]|0;if((ay|0)!=0){cM[ay&511](1)}if((c[L>>2]|0)==0){aT=ai;aU=au;break}if((c[M>>2]|0)==0){aT=ai;aU=au;break}cM[c[N>>2]&511](c[O>>2]|0);if((a[P]&1)==0){aT=ai;aU=au;break}fn(Q,j);aT=ai;aU=au}else{aT=W;aU=U}}while(0);m=c[p>>2]|0;ay=V+1|0;aW=c[l>>2]|0;if((ay|0)<(aW|0)){T=c[m+(V<<6)>>2]|0;U=aU;V=ay;W=aT;d=m;X=aW}else{break}}i=e;return}function f0(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;if((c[(c[3524]|0)+148>>2]|0)==0){f_(b);return}d=b+300|0;if(((c[d>>2]|0)-1|0)<=0){return}e=b+320|0;f=0;while(1){g=c[e>>2]|0;i=f+1|0;do{if((c[g+(f<<6)>>2]|0)!=2){if((c[g+(i<<6)>>2]|0)==2){break}j=+h[g+(f<<6)+8>>3];k=+h[g+(f<<6)+56>>3];l=+h[g+(f<<6)+16>>3];m=+h[g+(f<<6)+40>>3];n=+h[g+(i<<6)+8>>3];o=+h[g+(i<<6)+56>>3];p=+h[g+(i<<6)+16>>3];q=+h[g+(i<<6)+40>>3];if((a[30528]&1)==0){r=m-l;if(r*(q-p)<0.0){s=p-q;t=(n*r+j*s)/(r+s);s=m+(q-m)*(t-j)/(n-j);gh(j,k,l,m,t,t,s,s,b);gh(t,t,s,s,n,o,p,q,b);break}else{gh(j,k,l,m,n,o,p,q,b);break}}else{s=(p-l)/(n-j);t=(q-m)/(o-k);r=l-j*s;u=(m-k*t-r)/(s-t);t=r+s*u;if((j-u)*(u-n)>0.0){gh(j,k,l,m,u,u,t,t,b);gh(u,u,t,t,n,o,p,q,b);break}else{gh(j,k,l,m,n,o,p,q,b);break}}}}while(0);if((i|0)<((c[d>>2]|0)-1|0)){f=i}else{break}}return}function f1(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0,O=0;b=c[3524]|0;d=c[b+28>>2]|0;e=d>>>0<8;if(e){f=e?1.0:0.0}else{f=+(d>>>2|0)}d=a+300|0;if((c[d>>2]|0)<=0){return}e=a+320|0;g=a+316|0;i=b+56|0;j=b+60|0;b=a+12|0;k=0;do{l=c[e>>2]|0;do{if((c[l+(k<<6)>>2]|0)!=2){m=+h[l+(k<<6)+8>>3];n=c[200]|0;o=+h[64664+(n*688&-1)>>3];p=+h[64672+(n*688&-1)>>3];if(o<p){if(m<o|m>p){break}}else{if(m<p|m>o){break}}q=~~(+(c[64768+(n*688&-1)>>2]|0)+(m-o)*+h[64776+(n*688&-1)>>3]+.5);o=+h[l+(k<<6)+40>>3];m=+h[l+(k<<6)+32>>3];p=+h[l+(k<<6)+24>>3];r=+h[l+(k<<6)+16>>3];n=c[144]|0;s=+h[64664+(n*688&-1)>>3];t=+h[64672+(n*688&-1)>>3];do{if(s<t){if(o<s){u=0}else{u=o<=t}if(m<s){v=u;w=10920;break}x=m<=t;if(u){y=x;w=10921}else{z=x;w=10922}}else{if(o<t){A=0}else{A=o<=s}if(m<t){v=A;w=10920;break}x=m<=s;if(A){y=x;w=10921}else{z=x;w=10922}}}while(0);if((w|0)==10920){w=0;if(v){y=0;w=10921}else{z=0;w=10922}}do{if((w|0)==10921){w=0;x=c[64768+(n*688&-1)>>2]|0;B=+h[64776+(n*688&-1)>>3];C=~~(+(x|0)+(o-s)*B+.5);if(y){D=B;E=x;F=C;w=10925}else{G=0;H=B;I=x;J=C;w=10926}}else if((w|0)==10922){w=0;B=t-s;C=c[64768+(n*688&-1)>>2]|0;K=+(C|0);if((o-t)*B<0.0){L=+h[64776+(n*688&-1)>>3];x=~~(K+(s-s)*L+.5);if(z){D=L;E=C;F=x;w=10925;break}else{G=1;H=L;I=C;J=x;w=10926;break}}else{L=+h[64776+(n*688&-1)>>3];x=~~(K+B*L+.5);if(z){D=L;E=C;F=x;w=10925;break}else{G=1;H=L;I=C;J=x;w=10926;break}}}}while(0);if((w|0)==10926){w=0;o=t-s;if((m-t)*o<0.0){M=s-s}else{M=o}n=~~(+(I|0)+M*H+.5);if((n|0)==(J|0)&G){break}else{N=n;O=J}}else if((w|0)==10925){w=0;N=~~(+(E|0)+(m-s)*D+.5);O=F}n=(c[g>>2]|0)+(k<<3)|0;f9(a,n);cN[c[i>>2]&255](q,N);cN[c[j>>2]&255](q,O);o=+(q>>>0>>>0);n=c[144]|0;cN[c[i>>2]&255](~~(o-f*+h[7077]),~~(+(c[64768+(n*688&-1)>>2]|0)+(r- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));n=c[144]|0;cN[c[j>>2]&255](q,~~(+(c[64768+(n*688&-1)>>2]|0)+(r- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));n=c[144]|0;cN[c[i>>2]&255](~~(o+f*+h[7077]),~~(+(c[64768+(n*688&-1)>>2]|0)+(p- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));n=c[144]|0;cN[c[j>>2]&255](q,~~(+(c[64768+(n*688&-1)>>2]|0)+(p- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));if((c[b>>2]|0)!=474){break}n=c[144]|0;x=~~(+(c[64768+(n*688&-1)>>2]|0)+(+h[(c[e>>2]|0)+(k<<6)+56>>3]- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5);cN[c[i>>2]&255](~~(o-f*+h[7077]),x);cN[c[j>>2]&255](~~(o+f*+h[7077]),x)}}while(0);k=k+1|0;}while((k|0)<(c[d>>2]|0));return}function f2(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0.0,ab=0,ac=0,ad=0.0,ae=0,af=0,ag=0,ah=0.0,ai=0,aj=0,ak=0.0,al=0.0,am=0.0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0,aI=0,aJ=0,aK=0,aL=0.0,aM=0.0,aN=0,aO=0,aP=0.0,aQ=0,aR=0,aS=0.0,aT=0,aU=0,aV=0,aW=0;d=c[3524]|0;e=c[d+28>>2]|0;f=e>>>0<8;if(f){g=f?1.0:0.0}else{g=+(e>>>2|0)}e=b+300|0;f=c[e>>2]|0;if((f|0)<=0){return}i=b+320|0;j=b+192|0;k=b+208|0;l=d+64|0;m=b+28|0;n=b+56|0;o=b+64|0;p=b+316|0;q=d+56|0;r=d+60|0;s=b+12|0;t=b+144|0;u=b+152|0;v=j|0;w=d+108|0;x=b+196|0;y=b+200|0;z=b+212|0;A=2;B=0;C=c[i>>2]|0;D=f;while(1){do{if((c[C+(B<<6)>>2]|0)==2){E=A;F=C;G=D}else{H=+h[C+(B<<6)+8>>3];f=c[200]|0;I=+h[64664+(f*688&-1)>>3];J=+h[64672+(f*688&-1)>>3];K=I<J;if(K){if(H<I|H>J){E=A;F=C;G=D;break}}else{if(H<J|H>I){E=A;F=C;G=D;break}}L=+(c[64768+(f*688&-1)>>2]|0);M=+h[64776+(f*688&-1)>>3];f=~~(L+(H-I)*M+.5);N=+h[C+(B<<6)+40>>3];O=+h[C+(B<<6)+32>>3];P=+h[C+(B<<6)+24>>3];Q=+h[C+(B<<6)+16>>3];R=N<O;S=R?O:N;T=R?N:O;R=c[144]|0;O=+h[64664+(R*688&-1)>>3];N=+h[64672+(R*688&-1)>>3];U=O<N;do{if(U){if(S<O){V=0}else{V=S<=N}if(T<O){W=V;X=10952;break}Y=T<=N;if(V){Z=Y;X=10953}else{_=Y;X=10954}}else{if(S<N){$=0}else{$=S<=O}if(T<N){W=$;X=10952;break}Y=T<=O;if($){Z=Y;X=10953}else{_=Y;X=10954}}}while(0);if((X|0)==10952){X=0;if(W){Z=0;X=10953}else{_=0;X=10954}}do{if((X|0)==10953){X=0;Y=c[64768+(R*688&-1)>>2]|0;aa=+h[64776+(R*688&-1)>>3];ab=~~(+(Y|0)+(S-O)*aa+.5);if(Z){ac=1;ad=aa;ae=Y;af=ab;X=10957}else{ag=1;ah=aa;ai=Y;aj=ab;X=10958}}else if((X|0)==10954){X=0;aa=N-O;ab=c[64768+(R*688&-1)>>2]|0;ak=+(ab|0);if((S-N)*aa<0.0){al=+h[64776+(R*688&-1)>>3];Y=~~(ak+(O-O)*al+.5);if(_){ac=0;ad=al;ae=ab;af=Y;X=10957;break}else{ag=0;ah=al;ai=ab;aj=Y;X=10958;break}}else{al=+h[64776+(R*688&-1)>>3];Y=~~(ak+aa*al+.5);if(_){ac=0;ad=al;ae=ab;af=Y;X=10957;break}else{ag=0;ah=al;ai=ab;aj=Y;X=10958;break}}}}while(0);if((X|0)==10958){X=0;S=N-O;if((T-N)*S<0.0){am=O-O}else{am=S}R=~~(+(ai|0)+am*ah+.5);if((R|0)==(aj|0)&(ag^1)){E=A;F=C;G=D;break}else{an=R;ao=0;ap=ag;aq=ah;ar=ai;as=aj}}else if((X|0)==10957){X=0;an=~~(+(ae|0)+(T-O)*ad+.5);ao=1;ap=ac;aq=ad;ar=ae;as=af}S=+h[C+(B<<6)+48>>3];do{if(S!=H){al=H*2.0-S;do{if(K){do{if(al>J){at=J}else{if(al>=I){at=al;break}at=I}}while(0);if(S>J){au=J;av=at;break}if(S>=I){au=S;av=at;break}au=I;av=at}else{do{if(al>I){aw=I}else{if(al>=J){aw=al;break}aw=J}}while(0);if(S>I){au=I;av=aw;break}if(S>=J){au=S;av=aw;break}au=J;av=aw}}while(0);ax=L+(au-I)*M+.5;ay=L+(av-I)*M+.5}else{if((c[s>>2]|0)==474){al=+h[7030];if((a[56232]&1)!=0&al>0.0){az=al*.5}else{az=.25}ax=L+(H-az-I)*M+.5;ay=L+(H+az-I)*M+.5;break}al=+h[7030];if(al<0.0){aa=+(f|0);ak=g*+h[7077];ax=aa-ak;ay=aa+ak;break}ak=al*-.5;R=(A|0)==2;do{if(R){aA=ak}else{if((a[56232]&1)!=0){aA=ak;break}aA=al*(+h[C+(B-1<<6)+8>>3]-H)*.5}}while(0);ak=-0.0-aA;do{if((B|0)<(D-1|0)){Y=B+1|0;if((c[C+(Y<<6)>>2]|0)==2){aB=ak;break}if((a[56232]&1)==0){aB=(+h[C+(Y<<6)+8>>3]-H)*al*.5;break}else{aB=al*.5;break}}else{aB=ak}}while(0);if(R){aC=-0.0-aB}else{aC=aA}ak=H+aC;al=H+aB;do{if(K){do{if(al>J){aD=J}else{if(al>=I){aD=al;break}aD=I}}while(0);if(ak>J){aE=J;aF=aD;break}if(ak>=I){aE=ak;aF=aD;break}aE=I;aF=aD}else{do{if(al>I){aG=I}else{if(al>=J){aG=al;break}aG=J}}while(0);if(ak>I){aE=I;aF=aG;break}if(ak>=J){aE=ak;aF=aG;break}aE=J;aF=aG}}while(0);ax=L+(aE-I)*M+.5;ay=L+(aF-I)*M+.5}}while(0);K=~~ax;R=~~ay;do{if((R-K&1|0)==0){aH=R;aI=f}else{Y=R+1|0;ab=(((f-K|0)>(Y-f|0))<<31>>31)+f|0;if((ab-K|0)>=(Y-ab|0)){aH=Y;aI=ab;break}aH=Y;aI=ab+1|0}}while(0);do{if(U){if(Q<O){aJ=0}else{aJ=Q<=N}if(P<O){aK=0}else{aK=P<=N}do{if(Q>N){aL=N}else{if(Q>=O){aL=Q;break}aL=O}}while(0);if(P>N){aM=N;aN=aK;aO=aJ;aP=aL;break}if(P>=O){aM=P;aN=aK;aO=aJ;aP=aL;break}aM=O;aN=aK;aO=aJ;aP=aL}else{if(Q<N){aQ=0}else{aQ=Q<=O}if(P<N){aR=0}else{aR=P<=O}do{if(Q>O){aS=O}else{if(Q>=N){aS=Q;break}aS=N}}while(0);if(P>O){aM=O;aN=aR;aO=aQ;aP=aS;break}if(P>=N){aM=P;aN=aR;aO=aQ;aP=aS;break}aM=N;aN=aR;aO=aQ;aP=aS}}while(0);N=+(ar|0);U=~~(N+(aP-O)*aq+.5);f=~~(N+(aM-O)*aq+.5);R=(U|0)<(f|0);ab=R?U:f;Y=R?f:U;U=(ab|0)==(Y|0)&((aO|aN)^1);f=c[k>>2]|0;if((f|0)==1){if((c[z>>2]|0)!=-3){X=11032}}else if((f|0)!=0){X=11032}do{if((X|0)==11032){X=0;cM[c[l>>2]&511](c[m>>2]|0);if((a[n]&1)==0){break}fn(o,d)}}while(0);f=(c[p>>2]|0)+(B<<3)|0;f9(b,f);do{if(!((c[(c[3524]|0)+108>>2]|0)==0|U)){f=c[v>>2]|0;if((f|0)==2|(f|0)==5){aT=(c[y>>2]<<4&65520)+f|0}else if((f|0)==1|(f|0)==4){aT=(c[x>>2]<<4&65520)+f|0}else{aT=0}if(!((aT|0)!=0|aP>aM)){break}if((aT|0)==0){aU=(c[s>>2]|0)==474?0:1601}else{aU=aT}cI[c[w>>2]&63](aU,K,ab,aH-K|0,Y-ab|0);f=c[v>>2]|0;if((f|0)==2|(f|0)==5){aV=y}else if((f|0)==1|(f|0)==4){aV=x}else{break}if((c[aV>>2]<<4&65520|0)==(-f|0)){break}hG(j)}}while(0);cN[c[q>>2]&255](aI,an);cN[c[r>>2]&255](aI,ab);cN[c[q>>2]&255](aI,Y);cN[c[r>>2]&255](aI,as);do{if(!U){f=c[(c[3524]|0)+172>>2]|0;if((f|0)!=0){cM[f&511](0)}f=c[144]|0;cN[c[q>>2]&255](K,~~(+(c[64768+(f*688&-1)>>2]|0)+(aP- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](aH,~~(+(c[64768+(f*688&-1)>>2]|0)+(aP- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](aH,~~(+(c[64768+(f*688&-1)>>2]|0)+(aM- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](K,~~(+(c[64768+(f*688&-1)>>2]|0)+(aM- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](K,~~(+(c[64768+(f*688&-1)>>2]|0)+(aP- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[(c[3524]|0)+172>>2]|0;if((f|0)==0){break}cM[f&511](1)}}while(0);do{if((c[s>>2]|0)==474){O=+h[7077];if(O<0.0){aW=0;X=11056;break}aW=~~(+(aH-K|0)*.5-O*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));X=11056}else{if((c[t>>2]|0)!=3){break}O=+h[u>>3];if(O<=0.0){aW=0;X=11056;break}aW=~~(+(aH-K|0)*(1.0-O)*.5);X=11056}}while(0);do{if((X|0)==11056){X=0;if(ap){cN[c[q>>2]&255](aW+K|0,as);cN[c[r>>2]&255](aH-aW|0,as)}if(!ao){break}cN[c[q>>2]&255](aW+K|0,an);cN[c[r>>2]&255](aH-aW|0,an)}}while(0);if((c[s>>2]|0)==474){U=c[144]|0;f=~~(+(c[64768+(U*688&-1)>>2]|0)+(+h[(c[i>>2]|0)+(B<<6)+56>>3]- +h[64664+(U*688&-1)>>3])*+h[64776+(U*688&-1)>>3]+.5);cN[c[q>>2]&255](K,f);cN[c[r>>2]&255](aH,f)}do{if(aP>aM){if((c[(c[3524]|0)+108>>2]|0)!=0){break}cN[c[q>>2]&255](aI,ab);cN[c[r>>2]&255](aI,Y);f=(aI+K|0)/2&-1;cN[c[q>>2]&255](f,ab);cN[c[r>>2]&255](f,Y);f=(aH+aI|0)/2&-1;cN[c[q>>2]&255](f,ab);cN[c[r>>2]&255](f,Y)}}while(0);Y=c[i>>2]|0;E=c[Y+(B<<6)>>2]|0;F=Y;G=c[e>>2]|0}}while(0);Y=B+1|0;if((Y|0)<(G|0)){A=E;B=Y;C=F;D=G}else{break}}return}function f3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,$=0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0,ai=0.0,aj=0,ak=0.0,al=0,am=0,an=0.0,ao=0.0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0,aw=0.0,ax=0.0,ay=0,az=0.0,aA=0.0,aB=0.0,aC=0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0,aP=0,aQ=0.0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0.0,a5=0.0,a6=0.0,a7=0.0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0.0,bq=0.0,br=0.0,bs=0.0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0.0,bA=0.0,bB=0.0,bC=0.0,bD=0.0,bE=0.0,bF=0.0,bG=0.0,bH=0.0,bI=0.0,bJ=0.0,bK=0.0,bL=0.0,bM=0.0,bN=0.0,bO=0.0,bP=0.0,bQ=0.0,bR=0.0,bS=0.0,bT=0.0,bU=0.0,bV=0.0,bW=0.0,bX=0.0,bY=0.0,bZ=0.0,b_=0,b$=0,b0=0,b1=0.0,b2=0.0,b3=0,b4=0,b5=0.0,b6=0.0,b7=0,b8=0.0,b9=0,ca=0.0,cb=0;e=i;i=i+256|0;f=e|0;g=e+16|0;j=e+32|0;k=e+48|0;l=e+96|0;m=e+192|0;uE(j|0,-1|0,16);n=((c[b+8>>2]|0)-2|0)>>>0<2;if(n){o=c[b+260>>2]|0;p=o+12|0;q=o+8|0}else{p=b+320|0;q=b+300|0}o=c[p>>2]|0;p=c[q>>2]|0;q=c[b+228>>2]|0;if((p|0)<1){uh(-1,207376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}if((p|0)<4){uh(-1,203152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}r=c[200]|0;s=a[64788+(r*688&-1)|0]|0;t=(s&1)==0;L15142:do{if(n){do{if(t){u=c[144]|0;if((a[64788+(u*688&-1)|0]&1)!=0){break}if((a[64788+((c[34]|0)*688&-1)|0]&1)!=0){break}w=+h[64664+(r*688&-1)>>3];x=+h[91];y=+h[96];z=(+h[o+8>>3]-w)*x+y+-1.0;A=+h[64664+(u*688&-1)>>3];B=+h[21];C=+h[68];D=(+h[o+16>>3]-A)*B+C+-1.0;E=+h[5279];F=+h[2];G=+h[12];H=(+h[o+24>>3]-E)*F+G+-1.0;I=+h[403];J=+h[391];K=+h[395];L=+h[399];M=+h[404];N=+h[392];O=+h[396];Q=+h[400];R=+h[406];S=+h[394];T=+h[398];U=+h[402];V=R+z*S+D*T+H*U;W=V==0.0?1.0e-5:V;V=+(c[180]|0);u=c[186]|0;X=+(c[40]|0);Y=c[46]|0;$=p-1|0;ab=y+x*(+h[o+($<<6)+8>>3]-w)+-1.0;w=C+B*(+h[o+($<<6)+16>>3]-A)+-1.0;A=G+F*(+h[o+($<<6)+24>>3]-E)+-1.0;E=R+S*ab+T*w+U*A;U=E==0.0?1.0e-5:E;ac=+(~~(V*((I+J*ab+K*w+L*A)/U))+u|0);ad=+(~~(X*((M+N*ab+O*w+Q*A)/U))+Y|0);ae=+(~~((I+z*J+D*K+H*L)/W*V)+u|0);af=+(~~((M+z*N+D*O+H*Q)/W*X)+Y|0);break L15142}}while(0);uh(-1,198096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}else{do{if(t){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){break}Y=p-1|0;ac=+h[o+(Y<<6)+8>>3];ad=+h[o+(Y<<6)+16>>3];ae=+h[o+8>>3];af=+h[o+16>>3];break L15142}}while(0);Y=c[b+304>>2]|0;u=(a[64788+(Y*688&-1)|0]&1)==0;X=+h[o+8>>3];if(u){ag=X}else{ag=+Z(+(X*+h[64800+(Y*688&-1)>>3]))}$=c[b+308>>2]|0;ah=(a[64788+($*688&-1)|0]&1)==0;X=+h[o+16>>3];if(ah){ai=X}else{ai=+Z(+(X*+h[64800+($*688&-1)>>3]))}aj=p-1|0;X=+h[o+(aj<<6)+8>>3];if(u){ak=X}else{ak=+Z(+(X*+h[64800+(Y*688&-1)>>3]))}X=+h[o+(aj<<6)+16>>3];if(ah){ac=ak;ad=X;ae=ag;af=ai;break}ac=ak;ad=+Z(+(X*+h[64800+($*688&-1)>>3]));ae=ag;af=ai}}while(0);ai=af-ad;ag=ac-ae;L15166:do{if((p|0)>1){t=64664+(r*688&-1)|0;ak=+h[91];X=+h[96];$=c[144]|0;ah=64664+($*688&-1)|0;W=+h[21];Q=+h[68];H=+h[5279];O=+h[2];D=+h[12];N=+h[403];z=+h[391];M=+h[395];V=+h[399];L=+h[404];K=+h[392];J=+h[396];I=+h[400];U=+h[406];A=+h[394];w=+h[398];ab=+h[402];E=+(c[180]|0);aj=c[186]|0;T=+(c[40]|0);Y=c[46]|0;u=64788+($*688&-1)|0;$=b+304|0;al=b+308|0;S=ag;R=ai;F=-0.0-(ae*ai+af*ag);am=1;L15168:while(1){L15170:do{if(n){G=(+h[o+(am<<6)+8>>3]- +h[t>>3])*ak+X+-1.0;B=(+h[o+(am<<6)+16>>3]- +h[ah>>3])*W+Q+-1.0;C=(+h[o+(am<<6)+24>>3]-H)*O+D+-1.0;x=U+G*A+B*w+C*ab;y=x==0.0?1.0e-5:x;an=+(~~((N+G*z+B*M+C*V)/y*E)+aj|0);ao=+(~~((L+G*K+B*J+C*I)/y*T)+Y|0)}else{do{if((s&1)==0){if((a[u]&1)!=0){break}an=+h[o+(am<<6)+8>>3];ao=+h[o+(am<<6)+16>>3];break L15170}}while(0);ap=c[$>>2]|0;y=+h[o+(am<<6)+8>>3];if((a[64788+(ap*688&-1)|0]&1)==0){aq=y}else{aq=+Z(+(y*+h[64800+(ap*688&-1)>>3]))}ap=c[al>>2]|0;y=+h[o+(am<<6)+16>>3];if((a[64788+(ap*688&-1)|0]&1)==0){an=aq;ao=y;break}an=aq;ao=+Z(+(y*+h[64800+(ap*688&-1)>>3]))}}while(0);ap=F+(S*ao+R*an)<0.0;do{if((am|0)==1){if(!ap){ar=F;as=R;at=S;break}ar=-0.0-F;as=-0.0-R;at=-0.0-S}else{if(ap){break L15168}else{ar=F;as=R;at=S}}}while(0);ap=am+1|0;if((ap|0)<(p|0)){S=at;R=as;F=ar;am=ap}else{au=11111;break L15166}}if((am|0)==(p|0)){au=11111}else{av=am}}else{au=11111}}while(0);if((au|0)==11111){uh(-1,186832,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);av=p}s=(p|0)/(av|0)&-1;if(+(s|0)!=+(p|0)/+(av|0)){uh(-1,181552,(v=i,i=i+16|0,c[v>>2]=p,c[v+8>>2]=av,v)|0);i=e;return}c[j>>2]=0;r=av-1|0;c[j+4>>2]=r;c[j+12>>2]=p-1;al=p-av|0;c[j+8>>2]=al;L15195:do{if(n){$=c[200]|0;ar=(+h[o+(r<<6)+8>>3]- +h[64664+($*688&-1)>>3])*+h[91]+ +h[96]+-1.0;as=(+h[o+(r<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;at=(+h[o+(r<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;an=+h[406]+ar*+h[394]+as*+h[398]+at*+h[402];ao=an==0.0?1.0e-5:an;aw=+(~~((+h[403]+ar*+h[391]+as*+h[395]+at*+h[399])/ao*+(c[180]|0))+(c[186]|0)|0);ax=+(~~((+h[404]+ar*+h[392]+as*+h[396]+at*+h[400])/ao*+(c[40]|0))+(c[46]|0)|0);ay=$}else{$=c[200]|0;do{if((a[64788+($*688&-1)|0]&1)==0){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){break}aw=+h[o+(r<<6)+8>>3];ax=+h[o+(r<<6)+16>>3];ay=$;break L15195}}while(0);am=c[b+304>>2]|0;ao=+h[o+(r<<6)+8>>3];if((a[64788+(am*688&-1)|0]&1)==0){az=ao}else{az=+Z(+(ao*+h[64800+(am*688&-1)>>3]))}am=c[b+308>>2]|0;ao=+h[o+(r<<6)+16>>3];if((a[64788+(am*688&-1)|0]&1)==0){aw=az;ax=ao;ay=$;break}aw=az;ax=+Z(+(ao*+h[64800+(am*688&-1)>>3]));ay=$}}while(0);az=+(r|0);ao=(aw-ae)/az;ae=(ax-af)/az;am=s-1|0;af=+(am|0);at=(ac-aw)/af;aw=(ad-ax)/af;if(d){ax=+(r<<1|0);ad=+(am<<1|0);am=b+304|0;d=b+308|0;u=b+23|0;Y=0;do{do{if((a[64788+(ay*688&-1)|0]&1)==0){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){au=11127;break}aj=c[j+(Y<<2)>>2]|0;ac=+h[o+(aj<<6)+8>>3];as=+h[o+(aj<<6)+16>>3];aj=c[j+(((5-Y|0)%4&-1)<<2)>>2]|0;ah=c[j+(((Y+2|0)%4&-1)<<2)>>2]|0;aA=ac-(+h[o+(aj<<6)+8>>3]-ac)/ax-(+h[o+(ah<<6)+8>>3]-ac)/ad;aB=as-(+h[o+(aj<<6)+16>>3]-as)/ax-(+h[o+(ah<<6)+16>>3]-as)/ad;aC=c[am>>2]|0}else{au=11127}}while(0);if((au|0)==11127){au=0;$=c[am>>2]|0;ah=(a[64788+($*688&-1)|0]&1)==0;as=+h[o+(Y<<6)+8>>3];if(ah){aD=as}else{aD=+Z(+(as*+h[64800+($*688&-1)>>3]))}aj=c[d>>2]|0;t=(a[64788+(aj*688&-1)|0]&1)==0;ac=+h[o+(Y<<6)+16>>3];if(t){aE=ac}else{aE=+Z(+(ac*+h[64800+(aj*688&-1)>>3]))}ap=(5-Y|0)%4&-1;ar=+h[o+(ap<<6)+8>>3];if(ah){aF=as;aG=ar}else{an=+h[64800+($*688&-1)>>3];aq=+Z(+(ar*an));aF=+Z(+(as*an));aG=aq}aq=+h[o+(ap<<6)+16>>3];if(t){aH=ac;aI=aq}else{an=+h[64800+(aj*688&-1)>>3];ar=+Z(+(aq*an));aH=+Z(+(ac*an));aI=ar}ap=(Y+2|0)%4&-1;ar=+h[o+(ap<<6)+8>>3];if(ah){aJ=as;aK=ar}else{an=+h[64800+($*688&-1)>>3];aq=+Z(+(ar*an));aJ=+Z(+(as*an));aK=aq}aq=+h[o+(ap<<6)+16>>3];if(t){aL=ac;aM=aq}else{an=+h[64800+(aj*688&-1)>>3];as=+Z(+(aq*an));aL=+Z(+(ac*an));aM=as}aA=aD-(aG-aF)/ax-(aK-aJ)/ad;aB=aE-(aI-aH)/ax-(aM-aL)/ad;aC=$}L15235:do{if((aC|0)!=99){if(!(aA>-8.988465674311579e+307&aA<8.988465674311579e+307)){break}if((a[64788+(aC*688&-1)|0]&1)==0){aN=aA}else{if(aA<=0.0){break}as=+_(+aA);aN=as/+h[64800+(aC*688&-1)>>3]}if((a[u]&1)!=0|(aC|0)<0){break}$=64712+(aC*688&-1)|0;if(aN<+h[$>>3]){h[$>>3]=aN;aO=c[am>>2]|0}else{aO=aC}$=64664+(aO*688&-1)|0;do{if(aN<+h[$>>3]){if((c[64648+(aO*688&-1)>>2]&1|0)==0){break L15235}if((c[64728+(aO*688&-1)>>2]&1|0)==0){h[$>>3]=aN;break}as=+h[64736+(aO*688&-1)>>3];if(as>aN){h[$>>3]=as;break L15235}else{h[$>>3]=aN;break}}}while(0);$=c[am>>2]|0;aj=64720+($*688&-1)|0;if(aN>+h[aj>>3]){h[aj>>3]=aN;aP=c[am>>2]|0}else{aP=$}$=64672+(aP*688&-1)|0;if(aN<=+h[$>>3]){break}if((c[64648+(aP*688&-1)>>2]&2|0)==0){break}if((c[64732+(aP*688&-1)>>2]&2|0)==0){h[$>>3]=aN;break}as=+h[64760+(aP*688&-1)>>3];if(as<aN){h[$>>3]=as;break}else{h[$>>3]=aN;break}}}while(0);$=c[d>>2]|0;L15268:do{if(($|0)!=99){if(!(aB>-8.988465674311579e+307&aB<8.988465674311579e+307)){break}if((a[64788+($*688&-1)|0]&1)==0){aQ=aB}else{if(aB<=0.0){break}as=+_(+aB);aQ=as/+h[64800+($*688&-1)>>3]}if((a[u]&1)!=0|($|0)<0){break}aj=64712+($*688&-1)|0;if(aQ<+h[aj>>3]){h[aj>>3]=aQ;aR=c[d>>2]|0}else{aR=$}aj=64664+(aR*688&-1)|0;do{if(aQ<+h[aj>>3]){if((c[64648+(aR*688&-1)>>2]&1|0)==0){break L15268}if((c[64728+(aR*688&-1)>>2]&1|0)==0){h[aj>>3]=aQ;break}as=+h[64736+(aR*688&-1)>>3];if(as>aQ){h[aj>>3]=as;break L15268}else{h[aj>>3]=aQ;break}}}while(0);aj=c[d>>2]|0;t=64720+(aj*688&-1)|0;if(aQ>+h[t>>3]){h[t>>3]=aQ;aS=c[d>>2]|0}else{aS=aj}aj=64672+(aS*688&-1)|0;if(aQ<=+h[aj>>3]){break}if((c[64648+(aS*688&-1)>>2]&2|0)==0){break}if((c[64732+(aS*688&-1)>>2]&2|0)==0){h[aj>>3]=aQ;break}as=+h[64760+(aS*688&-1)>>3];if(as<aQ){h[aj>>3]=as;break}else{h[aj>>3]=aQ;break}}}while(0);Y=Y+1|0;}while((Y|0)<4);i=e;return}aQ=+P(+ao);aB=+P(+at);do{if(aQ<aB*.01|aB<aQ*.01){aN=+P(+ae);aA=+P(+aw);if(!(aN<aA*.01|aA<aN*.01)){aT=0;aU=0;break}if(!n){aT=1;aU=(a[b+232|0]&1)!=0;break}if((c[5094]|0)==0){aT=1;aU=1;break}aT=1;aU=(a[b+232|0]&1)!=0}else{aT=0;aU=0}}while(0);Y=(q|0)==0;do{if(Y){if((dz()|0)==0){aV=aU;aW=0;aX=0;aY=c[200]|0;break}else{i=e;return}}else{aS=(q|0)==1;d=(q|0)==2;do{if((q-1|0)>>>0<2){if((c[(c[3524]|0)+144>>2]|0)!=0){break}i=e;return}}while(0);if(!d){aV=aU;aW=0;aX=aS;aY=ay;break}aV=(c[(c[3524]|0)+96>>2]&512|0)==0|aU;aW=1;aX=aS;aY=ay}}while(0);ay=(a[64788+(aY*688&-1)|0]&1)==0;if(ay){if((a[64788+((c[144]|0)*688&-1)|0]&1)==0){aZ=aV}else{au=11205}}else{au=11205}if((au|0)==11205){aZ=1}aV=c[64652+(aY*688&-1)>>2]|0;if((aV&1|0)==0){a_=64680+(aY*688&-1)|0}else{a_=64664+(aY*688&-1)|0}aN=+h[a_>>3];if((aV&2|0)==0){a$=64688+(aY*688&-1)|0}else{a$=64672+(aY*688&-1)|0}aA=+h[a$>>3];a$=c[144]|0;aV=c[64652+(a$*688&-1)>>2]|0;if((aV&1|0)==0){a0=64680+(a$*688&-1)|0}else{a0=64664+(a$*688&-1)|0}ad=+h[a0>>3];if((aV&2|0)==0){a1=64688+(a$*688&-1)|0}else{a1=64672+(a$*688&-1)|0}aL=+h[a1>>3];if(n){a1=c[34]|0;aV=c[64652+(a1*688&-1)>>2]|0;if((aV&1|0)==0){a2=64680+(a1*688&-1)|0}else{a2=64664+(a1*688&-1)|0}if((aV&2|0)==0){a3=64688+(a1*688&-1)|0}else{a3=64672+(a1*688&-1)|0}a4=+h[a3>>3];a5=+h[a2>>3]}else{a4=0.0;a5=0.0}do{if(aT){if((c[(c[3524]|0)+152>>2]|0)==0|aZ){break}if(n){a6=1.0;a7=1.0}else{a6=+h[64776+(aY*688&-1)>>3]>0.0?1.0:-1.0;a7=+h[64776+(a$*688&-1)>>3]>0.0?1.0:-1.0}if(aQ>aB){a2=aw*a7>0.0;a3=ao*a6>0.0;a1=aa(a2?s:1,av)-(a3?av:1)|0;aV=-av|0;a8=av;a9=a3?1:-1;ba=(a3?aV:av)+(a2?aV:av)|0;bb=a1;bc=aa(s,av)}else{a1=at*a6>0.0;aV=ae*a7>0.0;a2=aa(a1?1:s,av)-(aV?1:av)|0;a3=aa(s,av);a8=s;a9=a1?av:-av|0;ba=aa(a3,a1?-1:1)+(aV?-1:1)|0;bb=a2;bc=a3}if(aX){bd=bc*3&-1}else{bd=aW?bc<<2:bc}a3=bd<<3;a2=ut(a3)|0;do{if((a2|0)==0){gk();aV=ut(a3)|0;if((aV|0)!=0){be=aV;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=177456,v)|0)}else{be=a2}}while(0);a2=be;aM=+h[o+8>>3];ax=((aM- +h[o+(r<<6)+8>>3])/az+(aM- +h[o+(al<<6)+8>>3])/af)*.5;aM=+h[o+16>>3];aH=((aM- +h[o+(r<<6)+16>>3])/az+(aM- +h[o+(al<<6)+16>>3])/af)*.5;aM=+h[o+24>>3];aI=((aM- +h[o+(r<<6)+24>>3])/az+(aM- +h[o+(al<<6)+24>>3])/af)*.5;do{if((p|0)>0){a3=aN<aA;aS=ad<aL;d=a5<a4;aV=a8;a1=0;a0=0;a_=bb;aU=0;aR=-1;u=0;aP=-1;am=0;L15375:while(1){aM=+h[o+(a_<<6)+8>>3];aE=+h[o+(a_<<6)+16>>3];aJ=+h[o+(a_<<6)+24>>3];aK=aM-ax;aF=ax+aM;aM=aE-aH;aG=aH+aE;aE=aJ-aI;aD=aI+aJ;do{if(a3){if(!(aK<aN|aK>aA)){au=11246;break}if(aF<aN|aF>aA){au=11257}else{au=11246}}else{if(!(aK<aA|aK>aN)){au=11246;break}if(aF<aA|aF>aN){au=11257}else{au=11246}}}while(0);L15382:do{if((au|0)==11246){au=0;do{if(aS){if(!(aM<ad|aM>aL)){break}if(aG<ad|aG>aL){au=11257;break L15382}}else{if(!(aM<aL|aM>ad)){break}if(aG<aL|aG>ad){au=11257;break L15382}}}while(0);if(!n){au=11273;break}if(d){if(!(aE<a5|aE>a4)){au=11273;break}if(aD<a5|aD>a4){au=11257;break}else{au=11273;break}}else{if(!(aE<a4|aE>a5)){au=11273;break}if(aD<a4|aD>a5){au=11257;break}else{au=11273;break}}}}while(0);L15396:do{if((au|0)==11257){au=0;do{if(aK<aF){if(!(aN<aK|aN>aF)){break}if(aA<aK|aA>aF){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}else{if(!(aN<aF|aN>aK)){break}if(aA<aF|aA>aK){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}}while(0);do{if(aM<aG){if(!(ad<aM|ad>aG)){break}if(aL<aM|aL>aG){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}else{if(!(ad<aG|ad>aM)){break}if(aL<aG|aL>aM){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}}while(0);if(!n){au=11273;break}if(aE<aD){if(!(a5<aE|a5>aD)){au=11273;break}if(a4<aE|a4>aD){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break}else{au=11273;break}}else{if(!(a5<aD|a5>aE)){au=11273;break}if(a4<aD|a4>aE){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break}else{au=11273;break}}}}while(0);do{if((au|0)==11273){au=0;if((aP|0)<0){bl=a_;bm=1;bn=1;bo=0}else{aO=((u|0)==0&1)+a0|0;aC=u+1|0;if((aO|0)!=1&(aC|0)>(a1|0)){au=11275;break L15375}else{bl=aP;bm=aC;bn=aO;bo=a1}}if(Y){aE=+h[o+(a_<<6)+32>>3];aD=+h[8341];do{if(aD<aE){aM=+h[8342];if(aM<=aE){bp=+((a[20668]|0)==112&1|0);break}aG=(aE-aD)/(aM-aD);if((a[20668]|0)==112){bp=aG;break}bp=1.0-aG}else{bp=+((a[20668]|0)!=112&1|0)}}while(0);h[a2+(aU<<3)>>3]=bp;bf=bl;bg=bm;bh=a_;bi=aU+1|0;bj=bn;bk=bo;break}aD=+h[o+(a_<<6)+40>>3];aE=+h[8341];do{if(aE<aD){aG=+h[8342];if(aG<=aD){bq=+((a[20668]|0)==112&1|0);break}aM=(aD-aE)/(aG-aE);if((a[20668]|0)==112){bq=aM;break}bq=1.0-aM}else{bq=+((a[20668]|0)!=112&1|0)}}while(0);aO=aU+1|0;h[a2+(aU<<3)>>3]=bq;aE=+h[o+(a_<<6)+48>>3];aD=+h[8341];do{if(aD<aE){aM=+h[8342];if(aM<=aE){br=+((a[20668]|0)==112&1|0);break}aG=(aE-aD)/(aM-aD);if((a[20668]|0)==112){br=aG;break}br=1.0-aG}else{br=+((a[20668]|0)!=112&1|0)}}while(0);aC=aU+2|0;h[a2+(aO<<3)>>3]=br;aD=+h[o+(a_<<6)+56>>3];aE=+h[8341];do{if(aE<aD){aG=+h[8342];if(aG<=aD){bs=+((a[20668]|0)==112&1|0);break}aM=(aD-aE)/(aG-aE);if((a[20668]|0)==112){bs=aM;break}bs=1.0-aM}else{bs=+((a[20668]|0)!=112&1|0)}}while(0);aO=aU+3|0;h[a2+(aC<<3)>>3]=bs;if(!aW){bf=bl;bg=bm;bh=a_;bi=aO;bj=bn;bk=bo;break}h[a2+(aO<<3)>>3]=+h[o+(a_<<6)+32>>3];bf=bl;bg=bm;bh=a_;bi=aU+4|0;bj=bn;bk=bo}}while(0);aO=a_+a9|0;j=aV-1|0;if((j|0)==0){if((bk|0)==0){bt=bg}else{if((bg|0)<1|(bg|0)==(bk|0)){bt=bk}else{au=11307;break}}bu=0;bv=aO+ba|0;bw=bt;bx=a8}else{bu=bg;bv=aO;bw=bk;bx=j}j=am+1|0;if((j|0)<(p|0)){aV=bx;a1=bw;a0=bj;a_=bv;aU=bi;aR=bh;u=bu;aP=bf;am=j}else{au=11310;break}}if((au|0)==11307){uh(-1,169296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}else if((au|0)==11310){if(!((bw|0)>0&(bj|0)>0)){break}if(n){aE=+h[64664+((c[200]|0)*688&-1)>>3];aD=+h[91];aM=+h[96];aG=(+h[o+(bf<<6)+8>>3]-aE)*aD+aM+-1.0;aK=+h[64664+((c[144]|0)*688&-1)>>3];aF=+h[21];aJ=+h[68];as=(+h[o+(bf<<6)+16>>3]-aK)*aF+aJ+-1.0;an=+h[5279];ac=+h[2];aq=+h[12];ar=(+h[o+(bf<<6)+24>>3]-an)*ac+aq+-1.0;ag=+h[403];ai=+h[391];F=+h[395];R=+h[399];S=+h[404];T=+h[392];I=+h[396];J=+h[400];K=+h[406];L=+h[394];E=+h[398];V=+h[402];M=K+aG*L+as*E+ar*V;z=M==0.0?1.0e-5:M;M=+(c[180]|0);am=c[186]|0;N=+(c[40]|0);aP=c[46]|0;ab=+P(+(ao+at))*.5;c[k>>2]=~~(+(~~((ag+aG*ai+as*F+ar*R)/z*M)+am|0)-ab);w=+P(+(ae+aw))*.5;c[k+4>>2]=~~(w+ +(~~((S+aG*T+as*I+ar*J)/z*N)+aP|0));z=(+h[o+(bh<<6)+8>>3]-aE)*aD+aM+-1.0;ar=(+h[o+(bh<<6)+16>>3]-aK)*aF+aJ+-1.0;as=(+h[o+(bh<<6)+24>>3]-an)*ac+aq+-1.0;aG=K+z*L+ar*E+as*V;A=aG==0.0?1.0e-5:aG;c[k+12>>2]=~~(ab+ +(~~((ag+z*ai+ar*F+as*R)/A*M)+am|0));c[k+16>>2]=~~(+(~~((S+z*T+ar*I+as*J)/A*N)+aP|0)-w);w=(aN-aE)*aD+aM+-1.0;A=(ad-aK)*aF+aJ+-1.0;as=(a5-an)*ac+aq+-1.0;ar=K+w*L+A*E+as*V;z=ar==0.0?1.0e-5:ar;c[k+24>>2]=~~((ag+w*ai+A*F+as*R)/z*M)+am;c[k+28>>2]=~~((S+w*T+A*I+as*J)/z*N)+aP;z=(aA-aE)*aD+aM+-1.0;aM=(aL-aK)*aF+aJ+-1.0;aJ=(a4-an)*ac+aq+-1.0;aq=K+z*L+aM*E+aJ*V;V=aq==0.0?1.0e-5:aq;c[k+36>>2]=~~((ag+z*ai+aM*F+aJ*R)/V*M)+am;c[k+40>>2]=~~((S+z*T+aM*I+aJ*J)/V*N)+aP}else{aP=c[200]|0;N=+(c[64768+(aP*688&-1)>>2]|0);V=+h[o+(bf<<6)+8>>3];J=a6*+P(+ax);aJ=+h[64664+(aP*688&-1)>>3];I=+h[64776+(aP*688&-1)>>3];c[k>>2]=~~(N+I*(V-J-aJ)+.5);aP=c[144]|0;V=+(c[64768+(aP*688&-1)>>2]|0);aM=+h[o+(bf<<6)+16>>3];T=a7*+P(+aH);z=+h[64664+(aP*688&-1)>>3];S=+h[64776+(aP*688&-1)>>3];c[k+4>>2]=~~(V+S*(aM+T-z)+.5);c[k+12>>2]=~~(N+(J+ +h[o+(bh<<6)+8>>3]-aJ)*I+.5);c[k+16>>2]=~~(V+(+h[o+(bh<<6)+16>>3]-T-z)*S+.5);c[k+24>>2]=~~(N+(aN-aJ)*I+.5);c[k+28>>2]=~~(V+(aL-z)*S+.5);c[k+36>>2]=~~(N+(aA-aJ)*I+.5);c[k+40>>2]=~~(V+(ad-z)*S+.5)}cI[c[(c[3524]|0)+152>>2]&63](bw,bj,a2,k|0,q);break}else if((au|0)==11275){uh(-1,172960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}}}while(0);uu(be);i=e;return}}while(0);if(ay){by=(a[64788+(a$*688&-1)|0]&1)!=0}else{by=1}if((c[(c[3524]|0)+148>>2]|0)==0){uf(-1,156360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(by){a$=c[b+304>>2]|0;ay=(a[64788+(a$*688&-1)|0]&1)==0;a7=+h[o+(r<<6)+8>>3];if(ay){a6=+h[o+8>>3];bz=a6;bA=a7;bB=a6}else{a6=+h[64800+(a$*688&-1)>>3];aw=+Z(+(a7*a6));a7=+h[o+8>>3];bz=+Z(+(a7*a6));bA=aw;bB=a7}be=c[b+308>>2]|0;q=(a[64788+(be*688&-1)|0]&1)==0;a7=+h[o+(r<<6)+16>>3];if(q){aw=+h[o+16>>3];bC=aw;bD=a7;bE=aw}else{aw=+h[64800+(be*688&-1)>>3];a6=+Z(+(a7*aw));a7=+h[o+16>>3];bC=+Z(+(a7*aw));bD=a6;bE=a7}k=c[b+312>>2]|0;bj=(a[64788+(k*688&-1)|0]&1)==0;a7=+h[o+(r<<6)+24>>3];if(bj){a6=+h[o+24>>3];bF=a6;bG=a7;bH=a6}else{a6=+h[64800+(k*688&-1)>>3];aw=+Z(+(a7*a6));a7=+h[o+24>>3];bF=+Z(+(a7*a6));bG=aw;bH=a7}a7=+h[o+(al<<6)+8>>3];if(ay){bI=bB;bJ=a7}else{aw=+h[64800+(a$*688&-1)>>3];a6=+Z(+(a7*aw));bI=+Z(+(bB*aw));bJ=a6}a6=+h[o+(al<<6)+16>>3];if(q){bK=bE;bL=a6}else{aw=+h[64800+(be*688&-1)>>3];bB=+Z(+(a6*aw));bK=+Z(+(bE*aw));bL=bB}bB=+h[o+(al<<6)+24>>3];if(bj){bM=bH;bN=bB}else{aw=+h[64800+(k*688&-1)>>3];bE=+Z(+(bB*aw));bM=+Z(+(bH*aw));bN=bE}bO=bA-bz;bP=bD-bC;bQ=bG-bF;bR=bJ-bI;bS=bL-bK;bT=bN-bM}else{bM=+h[o+8>>3];bN=+h[o+16>>3];bK=+h[o+24>>3];bO=+h[o+(r<<6)+8>>3]-bM;bP=+h[o+(r<<6)+16>>3]-bN;bQ=+h[o+(r<<6)+24>>3]-bK;bR=+h[o+(al<<6)+8>>3]-bM;bS=+h[o+(al<<6)+16>>3]-bN;bT=+h[o+(al<<6)+24>>3]-bK}bK=bO/az;bO=bP/az;bP=bQ/az;az=bR/af;bR=bS/af;bS=bT/af;af=(bK+az)*.5;bT=(bO+bR)*.5;bQ=(bP+bS)*.5;bN=(bK-az)*.5;bM=(bO-bR)*.5;bL=(bP-bS)*.5;if((s|0)<=0){i=e;return}al=b+304|0;r=o+8|0;k=b+308|0;bj=o+16|0;be=b+312|0;b=o+24|0;q=(av|0)>0;a$=l|0;ay=l+8|0;bw=l+16|0;bh=l+24|0;bf=l+32|0;bu=l+40|0;bi=l+48|0;bv=l+56|0;bx=l+64|0;p=l+72|0;bk=l+80|0;bg=l+88|0;a8=aN<aA;bt=ad<aL;ba=a5<a4;a9=n^1;bo=m|0;bn=m+8|0;bm=f|0;bl=f+8|0;bb=f+4|0;bd=m|0;bc=m+24|0;aX=m+4|0;aY=m+28|0;aZ=g|0;a2=g+4|0;aP=g+8|0;am=0;u=0;while(1){if(by){aR=c[al>>2]|0;bI=+h[r>>3];if((a[64788+(aR*688&-1)|0]&1)==0){bU=bI}else{bU=+Z(+(bI*+h[64800+(aR*688&-1)>>3]))}bI=+(am|0);aR=c[k>>2]|0;bJ=+h[bj>>3];if((a[64788+(aR*688&-1)|0]&1)==0){bV=bJ}else{bV=+Z(+(bJ*+h[64800+(aR*688&-1)>>3]))}aR=c[be>>2]|0;bJ=+h[b>>3];if((a[64788+(aR*688&-1)|0]&1)==0){bW=bJ}else{bW=+Z(+(bJ*+h[64800+(aR*688&-1)>>3]))}bX=bS*bI+bW;bY=bR*bI+bV;bZ=az*bI+bU}else{bI=+(am|0);bX=bS*bI+ +h[b>>3];bY=bR*bI+ +h[bj>>3];bZ=az*bI+ +h[r>>3]}if(q){aR=u;aU=0;while(1){do{if(aW){bI=+h[o+(aR<<6)+32>>3];if(bI==0.0){break}if(bI>=128.0){au=11354;break}if((c[(c[3524]|0)+96>>2]&512|0)!=0){au=11354}}else{au=11354}}while(0);L15534:do{if((au|0)==11354){au=0;bI=+(aU|0);bJ=bZ+bK*bI;bF=bY+bO*bI;bG=bX+bP*bI;bI=af+bJ;h[a$>>3]=bI;h[ay>>3]=bT+bF;h[bw>>3]=bQ+bG;h[bh>>3]=bN+bJ;h[bf>>3]=bM+bF;h[bu>>3]=bL+bG;h[bi>>3]=bJ-af;h[bv>>3]=bF-bT;h[bx>>3]=bG-bQ;h[p>>3]=bJ-bN;h[bk>>3]=bF-bM;h[bg>>3]=bG-bL;a_=(c[5094]|0)!=0|a9;a0=0;a1=0;bG=bI;while(1){if(a8){if(bG<aN|bG>aA){b_=a0}else{au=11358}}else{if(bG<aA|bG>aN){b_=a0}else{au=11358}}do{if((au|0)==11358){au=0;bI=+h[l+(a1*24&-1)+8>>3];if(bt){if(bI<ad|bI>aL){b_=a0;break}}else{if(bI<aL|bI>ad){b_=a0;break}}bI=+h[l+(a1*24&-1)+16>>3];if(ba){if(!(bI<=a4&bI>=a5|a_)){b_=a0;break}}else{if(!(bI<=a5&bI>=a4|a_)){b_=a0;break}}b_=a0+1|0}}while(0);aC=a1+1|0;if((aC|0)>=4){break}a0=b_;a1=aC;bG=+h[l+(aC*24&-1)>>3]}if((b_|0)<=0){break}c[bn>>2]=3;a1=(b_|0)<4;a0=0;do{do{if(n){bG=(+h[l+(a0*24&-1)>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;bI=(+h[l+(a0*24&-1)+8>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bF=(+h[l+(a0*24&-1)+16>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;bJ=+h[406]+bG*+h[394]+bI*+h[398]+bF*+h[402];bC=bJ==0.0?1.0e-5:bJ;a_=~~((+h[403]+bG*+h[391]+bI*+h[395]+bF*+h[399])/bC*+(c[180]|0))+(c[186]|0)|0;aC=~~((+h[404]+bG*+h[392]+bI*+h[396]+bF*+h[400])/bC*+(c[40]|0))+(c[46]|0)|0;c[m+(a0*12&-1)>>2]=a_;c[m+(a0*12&-1)+4>>2]=aC;b$=a_;b0=aC}else{aC=c[200]|0;bC=+(c[64768+(aC*688&-1)>>2]|0);if(!by){a_=~~(bC+(+h[l+(a0*24&-1)>>3]- +h[64664+(aC*688&-1)>>3])*+h[64776+(aC*688&-1)>>3]+.5);c[m+(a0*12&-1)>>2]=a_;aV=c[144]|0;d=~~(+(c[64768+(aV*688&-1)>>2]|0)+(+h[l+(a0*24&-1)+8>>3]- +h[64664+(aV*688&-1)>>3])*+h[64776+(aV*688&-1)>>3]+.5);c[m+(a0*12&-1)+4>>2]=d;b$=a_;b0=d;break}bF=+h[l+(a0*24&-1)>>3];if((a[64788+(aC*688&-1)|0]&1)==0){b1=bF}else{bI=+_(+bF);b1=bI/+h[64800+(aC*688&-1)>>3]}d=~~(bC+(b1- +h[64664+(aC*688&-1)>>3])*+h[64776+(aC*688&-1)>>3]+.5);c[m+(a0*12&-1)>>2]=d;aC=c[144]|0;bC=+(c[64768+(aC*688&-1)>>2]|0);bI=+h[l+(a0*24&-1)+8>>3];if((a[64788+(aC*688&-1)|0]&1)==0){b2=bI}else{bF=+_(+bI);b2=bF/+h[64800+(aC*688&-1)>>3]}a_=~~(bC+(b2- +h[64664+(aC*688&-1)>>3])*+h[64776+(aC*688&-1)>>3]+.5);c[m+(a0*12&-1)+4>>2]=a_;b$=d;b0=a_}}while(0);do{if(aT){if(!((c[(c[3524]|0)+108>>2]|0)!=0&a1)){break}a_=m+(a0*12&-1)|0;d=c[13542]|0;aC=c[d>>2]|0;if((b$|0)<(aC|0)){c[a_>>2]=aC;b3=aC}else{b3=b$}aC=c[d+4>>2]|0;if((b3|0)>(aC|0)){c[a_>>2]=aC}aC=m+(a0*12&-1)+4|0;a_=c[d+12>>2]|0;if((b0|0)>(a_|0)){c[aC>>2]=a_;b4=a_}else{b4=b0}a_=c[d+8>>2]|0;if((b4|0)>=(a_|0)){break}c[aC>>2]=a_}}while(0);a0=a0+1|0;}while((a0|0)<4);do{if(Y){if((c[o+(aR<<6)>>2]|0)==2){break L15534}a0=o+(aR<<6)+32|0;if((cg(+(+h[a0>>3]))|0)==0){break L15534}bC=+h[a0>>3];bF=+h[8341];do{if(bF<bC){bI=+h[8342];if(bI<=bC){b5=+((a[20668]|0)==112&1|0);break}bG=(bC-bF)/(bI-bF);if((a[20668]|0)==112){b5=bG;break}b5=1.0-bG}else{b5=+((a[20668]|0)!=112&1|0)}}while(0);a0=(c[3524]|0)+144|0;if((c[a0>>2]|0)==0){break}c[bm>>2]=5;h[bl>>3]=b5;c[bb>>2]=0;cM[c[a0>>2]&511](f)}else{bF=+h[o+(aR<<6)+40>>3];bC=+h[8341];do{if(bC<bF){bG=+h[8342];if(bG<=bF){a0=a[20668]|0;b6=+(a0<<24>>24==112&1|0);b7=a0;break}bI=(bF-bC)/(bG-bC);a0=a[20668]|0;if(a0<<24>>24==112){b6=bI;b7=112;break}b6=1.0-bI;b7=a0}else{a0=a[20668]|0;b6=+(a0<<24>>24!=112&1|0);b7=a0}}while(0);a0=~~(b6*255.0+.5);bF=+h[o+(aR<<6)+48>>3];do{if(bC<bF){bI=+h[8342];if(bI<=bF){b8=+(b7<<24>>24==112&1|0);b9=b7;break}bG=(bF-bC)/(bI-bC);if(b7<<24>>24==112){b8=bG;b9=112;break}b8=1.0-bG;b9=b7}else{b8=+(b7<<24>>24!=112&1|0);b9=b7}}while(0);a1=~~(b8*255.0+.5);bF=+h[o+(aR<<6)+56>>3];do{if(bC<bF){bG=+h[8342];if(bG<=bF){ca=+(b9<<24>>24==112&1|0);break}bI=(bF-bC)/(bG-bC);if(b9<<24>>24==112){ca=bI;break}ca=1.0-bI}else{ca=+(b9<<24>>24!=112&1|0)}}while(0);a_=(c[3524]|0)+144|0;if((c[a_>>2]|0)==0){break}c[aZ>>2]=3;c[a2>>2]=((a1<<8)+(a0<<16)|0)+~~(ca*255.0+.5);h[aP>>3]=0.0;cM[c[a_>>2]&511](g)}}while(0);do{if(aW){a_=~~(+h[o+(aR<<6)+32>>3]*100.0/255.0);if((a_|0)==0){break L15534}if((c[(c[3524]|0)+96>>2]&512|0)==0){break}c[bn>>2]=a_<<4|4}}while(0);a_=c[3524]|0;do{if(aT){aC=c[a_+108>>2]|0;if((aC|0)==0){break}d=c[bd>>2]|0;aV=c[bc>>2]|0;aS=c[aX>>2]|0;a3=c[aY>>2]|0;j=aV-d|0;aO=a3-aS|0;cI[aC&63](c[bn>>2]|0,(d|0)<(aV|0)?d:aV,(aS|0)<(a3|0)?aS:a3,(j|0)>-1?j:-j|0,(aO|0)>-1?aO:-aO|0);break L15534}}while(0);cN[c[a_+148>>2]&255](4,bo)}}while(0);aO=aU+1|0;if((aO|0)<(av|0)){aR=aR+1|0;aU=aO}else{break}}cb=av+u|0}else{cb=u}aU=am+1|0;if((aU|0)<(s|0)){am=aU;u=cb}else{break}}i=e;return}function f4(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0;d=c[(c[9732]|0)+320>>2]|0;e=+h[d+(c[a>>2]<<6)+8>>3];f=+h[d+(c[b>>2]<<6)+8>>3];if(e<f){g=-1;return g|0}g=e>f&1;return g|0}function f5(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a+16>>3];d=+h[b+16>>3];if(c>d){e=1;return e|0}e=(c<d)<<31>>31;return e|0}function f6(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;j=i;i=i+96|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+40|0;o=j+48|0;p=j+56|0;q=j+64|0;r=j+80|0;s=j+88|0;t=c[3524]|0;u=+(aa(c[t+24>>2]|0,c[1400]|0)|0);if((e|0)==0){v=65064+(b*688&-1)|0}else{v=65056+(b*688&-1)|0}w=~~(u*+h[v>>3]);v=c[200]|0;u=+(c[64768+(v*688&-1)>>2]|0);x=+h[64664+(v*688&-1)>>3];y=+h[64776+(v*688&-1)>>3];v=~~(u+(d-x)*y+.5);L15653:do{if((g|0)==0){z=e}else{A=(a[64788+(b*688&-1)|0]&1)==0;B=64800+(b*688&-1)|0;C=g;while(1){D=+h[C>>3];if(A){E=D}else{F=+_(+D);E=F/+h[B>>3]}G=~~(u+(E-x)*y+.5)-v|0;if((((G|0)>-1?G:-G|0)|0)<3){z=0;break L15653}G=c[C+16>>2]|0;if((G|0)==0){z=e;break}else{C=G}}}}while(0);e=c[f+4>>2]|0;if((e|0)>-3){g=t+168|0;cM[c[g>>2]&511](3);C=q;B=f+40|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];do{if((c[f>>2]|0)!=0){y=+h[f+24>>3];B=c[(c[3524]|0)+92>>2]|0;if(y<0.0){cK[B&63](+h[3817]);break}else{cK[B&63](y);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[f+16>>3]);B=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[B&511](-2)}else{cM[B&511](e)}B=c[3524]|0;do{if((a[f+32|0]&1)==0){if((c[B+96>>2]&1024|0)!=0){break}c[q>>2]=1;c[q+4>>2]=e;H=11474}else{H=11474}}while(0);if((H|0)==11474){fn(q,B)}L15680:do{if(+h[3815]!=0.0){B=c[200]|0;q=c[64768+(B*688&-1)>>2]|0;y=+h[64664+(B*688&-1)>>3];x=+h[64776+(B*688&-1)>>3];B=~~(+(q|0)+(d-y)*x+.5);e=c[144]|0;f=c[64768+(e*688&-1)>>2]|0;E=+h[64664+(e*688&-1)>>3];u=+h[64776+(e*688&-1)>>3];e=~~(+(f|0)+(0.0-E)*u+.5);F=+h[4483];do{if(F<d){h[4483]=d}else{D=-0.0-d;if(F>=D){break}h[4483]=D}}while(0);C=2;A=B;G=e;F=0.0;D=d;I=q;J=y;K=x;L=f;M=E;N=u;while(1){O=D*.9950041652780258-F*.09983341664682815;P=F*.9950041652780258+D*.09983341664682815;Q=~~(+(I|0)+(O-J)*K+.5);R=~~(+(L|0)+(P-M)*N+.5);c[m>>2]=A;c[n>>2]=G;c[o>>2]=Q;c[p>>2]=R;S=c[3524]|0;if((fl(m,n,o,p)|0)!=0){cN[c[S+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[S+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}if((C|0)>=64){break L15680}S=c[200]|0;T=c[144]|0;C=C+1|0;A=Q;G=R;F=P;D=O;I=c[64768+(S*688&-1)>>2]|0;J=+h[64664+(S*688&-1)>>3];K=+h[64776+(S*688&-1)>>3];L=c[64768+(T*688&-1)>>2]|0;M=+h[64664+(T*688&-1)>>3];N=+h[64776+(T*688&-1)>>3]}}else{do{if((a[35184]&1)!=0&(v|0)<(c[9335]|0)&(v|0)>(c[9334]|0)){L=c[9337]|0;I=c[7940]|0;if((L|0)<=(I|0)){U=I;break}G=c[9336]|0;A=c[7941]|0;if((G|0)>=(A|0)){U=I;break}if((G|0)>(I|0)){cN[c[t+56>>2]&255](v,I);cN[c[t+60>>2]&255](v,c[9336]|0);V=c[9337]|0;W=c[7941]|0}else{V=L;W=A}if((V|0)>=(W|0)){break L15680}cN[c[t+56>>2]&255](v,V);cN[c[t+60>>2]&255](v,c[7941]|0);break L15680}else{U=c[7940]|0}}while(0);cN[c[t+56>>2]&255](v,U);cN[c[t+60>>2]&255](v,c[7941]|0)}}while(0);U=l;c[U>>2]=c[14084];c[U+4>>2]=c[56340>>2];c[U+8>>2]=c[56344>>2];c[U+12>>2]=c[56348>>2];U=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];V=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[V&63](+h[3817]);break}else{cK[V&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);V=c[(c[3524]|0)+64>>2]|0;if((U|0)<-5){cM[V&511](-2)}else{cM[V&511](U)}V=c[3524]|0;do{if((a[56328]&1)==0){if((c[V+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=U;H=11504}else{H=11504}}while(0);if((H|0)==11504){fn(l,V)}cM[c[g>>2]&511](4)}g=t+56|0;cN[c[g>>2]&255](v,c[1394]|0);V=t+60|0;cN[c[V>>2]&255](v,(c[1394]|0)+w|0);l=c[1396]|0;if((l|0)>-1){cN[c[g>>2]&255](v,l);cN[c[V>>2]&255](v,(c[1396]|0)-w|0)}if((z|0)==0){i=j;return}fN(64984+(b*688&-1)|0,r,s,99744);w=64928+(b*688&-1)|0;if((c[w>>2]|0)!=0){fn(w,t)}ln(~~+h[r>>3]+v|0,~~+h[s>>3]+(c[1392]|0)|0,z,c[1398]|0,c[1384]|0,c[6586]|0,c[64924+(b*688&-1)>>2]|0);b=k;c[b>>2]=c[14084];c[b+4>>2]=c[56340>>2];c[b+8>>2]=c[56344>>2];c[b+12>>2]=c[56348>>2];b=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];z=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[z&63](+h[3817]);break}else{cK[z&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);z=c[(c[3524]|0)+64>>2]|0;if((b|0)<-5){cM[z&511](-2)}else{cM[z&511](b)}z=c[3524]|0;do{if((a[56328]&1)==0){if((c[z+96>>2]&1024|0)==0){c[k>>2]=1;c[k+4>>2]=b;break}else{i=j;return}}}while(0);fn(k,z);i=j;return}function f7(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0.0,J=0.0,K=0,L=0,M=0,N=0;j=i;i=i+96|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+40|0;o=j+48|0;p=j+56|0;q=j+64|0;r=j+80|0;s=j+88|0;t=c[3524]|0;u=+(aa(c[t+28>>2]|0,c[1400]|0)|0);if((e|0)==0){v=65064+(b*688&-1)|0}else{v=65056+(b*688&-1)|0}w=~~(u*+h[v>>3]);v=c[144]|0;u=+(c[64768+(v*688&-1)>>2]|0);x=+h[64664+(v*688&-1)>>3];y=+h[64776+(v*688&-1)>>3];v=~~(u+(d-x)*y+.5);L15753:do{if((g|0)==0){z=e}else{A=(a[64788+(b*688&-1)|0]&1)==0;B=64800+(b*688&-1)|0;C=g;while(1){D=+h[C>>3];if(A){E=D}else{F=+_(+D);E=F/+h[B>>3]}G=~~(u+(E-x)*y+.5)-v|0;if((((G|0)>-1?G:-G|0)|0)<3){z=0;break L15753}G=c[C+16>>2]|0;if((G|0)==0){z=e;break}else{C=G}}}}while(0);e=c[f+4>>2]|0;if((e|0)>-3){g=t+168|0;cM[c[g>>2]&511](3);C=q;B=f+40|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];do{if((c[f>>2]|0)!=0){y=+h[f+24>>3];B=c[(c[3524]|0)+92>>2]|0;if(y<0.0){cK[B&63](+h[3817]);break}else{cK[B&63](y);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[f+16>>3]);B=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[B&511](-2)}else{cM[B&511](e)}B=c[3524]|0;do{if((a[f+32|0]&1)==0){if((c[B+96>>2]&1024|0)!=0){break}c[q>>2]=1;c[q+4>>2]=e;H=11546}else{H=11546}}while(0);if((H|0)==11546){fn(q,B)}L15780:do{if(+h[3815]!=0.0){y=+h[4483];do{if(y<d){h[4483]=d}else{x=-0.0-d;if(y>=x){break}h[4483]=x}}while(0);B=c[200]|0;q=c[64768+(B*688&-1)>>2]|0;y=+h[64664+(B*688&-1)>>3];x=+h[64776+(B*688&-1)>>3];B=~~(+(q|0)+(0.0-y)*x+.5);e=c[144]|0;f=c[64768+(e*688&-1)>>2]|0;E=+h[64664+(e*688&-1)>>3];u=+h[64776+(e*688&-1)>>3];e=~~(+(f|0)+(d-E)*u+.5);c[8490]=B;c[8488]=e;F=d;D=0.0;C=2;A=B;B=e;e=q;I=y;y=x;q=f;x=E;E=u;while(1){u=D*.9950041652780258-F*.09983341664682815;J=F*.9950041652780258+D*.09983341664682815;f=~~(+(e|0)+(u-I)*y+.5);G=~~(+(q|0)+(J-x)*E+.5);c[m>>2]=A;c[n>>2]=B;c[o>>2]=f;c[p>>2]=G;K=c[3524]|0;if((fl(m,n,o,p)|0)!=0){cN[c[K+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[K+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}c[8490]=f;c[8488]=G;if((C|0)>=64){break L15780}K=c[200]|0;L=c[144]|0;F=J;D=u;C=C+1|0;A=f;B=G;e=c[64768+(K*688&-1)>>2]|0;I=+h[64664+(K*688&-1)>>3];y=+h[64776+(K*688&-1)>>3];q=c[64768+(L*688&-1)>>2]|0;x=+h[64664+(L*688&-1)>>3];E=+h[64776+(L*688&-1)>>3]}}else{do{if((a[35184]&1)!=0&(v|0)<(c[9337]|0)&(v|0)>(c[9336]|0)){q=c[9334]|0;e=c[7939]|0;if((q|0)>=(e|0)){break}B=c[9335]|0;A=c[7938]|0;if((B|0)<=(A|0)){break}if((q|0)>(A|0)){cN[c[t+56>>2]&255](A,v);cN[c[t+60>>2]&255](c[9334]|0,v);M=c[9335]|0;N=c[7939]|0}else{M=B;N=e}if((M|0)>=(N|0)){break L15780}cN[c[t+56>>2]&255](M,v);cN[c[t+60>>2]&255](c[7939]|0,v);break L15780}}while(0);cN[c[t+56>>2]&255](c[7938]|0,v);cN[c[t+60>>2]&255](c[7939]|0,v)}}while(0);M=l;c[M>>2]=c[14084];c[M+4>>2]=c[56340>>2];c[M+8>>2]=c[56344>>2];c[M+12>>2]=c[56348>>2];M=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];N=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[N&63](+h[3817]);break}else{cK[N&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);N=c[(c[3524]|0)+64>>2]|0;if((M|0)<-5){cM[N&511](-2)}else{cM[N&511](M)}N=c[3524]|0;do{if((a[56328]&1)==0){if((c[N+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=M;H=11575}else{H=11575}}while(0);if((H|0)==11575){fn(l,N)}cM[c[g>>2]&511](4)}g=t+56|0;cN[c[g>>2]&255](c[1394]|0,v);N=t+60|0;cN[c[N>>2]&255]((c[1394]|0)+w|0,v);l=c[1396]|0;if((l|0)>-1){cN[c[g>>2]&255](l,v);cN[c[N>>2]&255]((c[1396]|0)-w|0,v)}if((z|0)==0){i=j;return}fN(64984+(b*688&-1)|0,r,s,94352);w=64928+(b*688&-1)|0;if((c[w>>2]|0)!=0){fn(w,t)}ln(~~+h[r>>3]+(c[1392]|0)|0,~~+h[s>>3]+v|0,z,c[1398]|0,c[1384]|0,c[6586]|0,c[64924+(b*688&-1)>>2]|0);b=k;c[b>>2]=c[14084];c[b+4>>2]=c[56340>>2];c[b+8>>2]=c[56344>>2];c[b+12>>2]=c[56348>>2];b=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];z=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[z&63](+h[3817]);break}else{cK[z&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);z=c[(c[3524]|0)+64>>2]|0;if((b|0)<-5){cM[z&511](-2)}else{cM[z&511](b)}z=c[3524]|0;do{if((a[56328]&1)==0){if((c[z+96>>2]&1024|0)==0){c[k>>2]=1;c[k+4>>2]=b;break}else{i=j;return}}}while(0);fn(k,z);i=j;return}function f8(a){a=a|0;var b=0;if((a|0)==0){return}b=c[a+116>>2]|0;if((b|0)!=0){uu(b)}b=a+48|0;a=c[b>>2]|0;if((a|0)==0){return}else{f8(a);uu(c[b>>2]|0);c[b>>2]=0;return}}function f9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0;e=i;i=i+88|0;f=e|0;g=e+16|0;j=e+32|0;if((c[b+316>>2]|0)==0){k=0;i=e;return k|0}l=c[b+64>>2]|0;if(+h[b+72>>3]<0.0&(l|0)==3){m=(c[3524]|0)+144|0;if((c[m>>2]|0)==0){k=1;i=e;return k|0}n=~~+h[d>>3];c[g>>2]=3;c[g+4>>2]=n;h[g+8>>3]=0.0;cM[c[m>>2]&511](g);k=1;i=e;return k|0}if((l|0)==6){o=+h[d>>3];p=+h[8341];do{if(p<o){q=+h[8342];if(q<=o){r=+((a[20668]|0)==112&1|0);break}s=(o-p)/(q-p);if((a[20668]|0)==112){r=s;break}r=1.0-s}else{r=+((a[20668]|0)!=112&1|0)}}while(0);l=(c[3524]|0)+144|0;if((c[l>>2]|0)==0){k=1;i=e;return k|0}c[f>>2]=5;h[f+8>>3]=r;c[f+4>>2]=0;cM[c[l>>2]&511](f);k=1;i=e;return k|0}if((c[b+28>>2]|0)!=-6){k=0;i=e;return k|0}b=~~+h[d>>3];d=43280;while(1){t=c[d>>2]|0;if((t|0)==0){u=11624;break}if((c[t+4>>2]|0)==(b|0)){u=11622;break}else{d=t|0}}do{if((u|0)==11624){d=c[8798]|0;f=(d|0)>0;l=b;L15891:while(1){g=43264;while(1){v=c[g>>2]|0;if((v|0)==0){break}if((c[v+4>>2]|0)==(l|0)){break L15891}else{g=v|0}}w=l-1|0;if(!((l|0)>(d|0)&f)){u=11634;break}l=((w|0)%(d|0)&-1)+1|0}if((u|0)==11634){c[j+4>>2]=w;c[j+40>>2]=1;c[j+44>>2]=w;c[j+8>>2]=w;break}d=j;f=v+8|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];c[d+16>>2]=c[f+16>>2];c[d+20>>2]=c[f+20>>2];c[d+24>>2]=c[f+24>>2];c[d+28>>2]=c[f+28>>2];c[d+32>>2]=c[f+32>>2];c[d+36>>2]=c[f+36>>2];c[d+40>>2]=c[f+40>>2];c[d+44>>2]=c[f+44>>2];c[d+48>>2]=c[f+48>>2];c[d+52>>2]=c[f+52>>2];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[j+4>>2]=l;a[j+32|0]=0;break}if((a[j+32|0]&1)!=0){break}c[j+40>>2]=1;c[j+44>>2]=c[j+4>>2]}else if((u|0)==11622){f=j;d=t+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[f+16>>2]=c[d+16>>2];c[f+20>>2]=c[d+20>>2];c[f+24>>2]=c[d+24>>2];c[f+28>>2]=c[d+28>>2];c[f+32>>2]=c[d+32>>2];c[f+36>>2]=c[d+36>>2];c[f+40>>2]=c[d+40>>2];c[f+44>>2]=c[d+44>>2];c[f+48>>2]=c[d+48>>2];c[f+52>>2]=c[d+52>>2];if((a[j+32|0]&1)!=0){break}c[j+40>>2]=1;c[j+44>>2]=c[j+4>>2]}}while(0);fn(j+40|0,c[3524]|0);k=1;i=e;return k|0}function ga(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;do{if((b|0)!=0){if((a[b]|0)==0){break}f=(uA(b|0)|0)+2|0;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=87472,v)|0);return 0}else{j=g}}while(0);uB(j|0,b|0);g=j+(uA(j|0)|0)|0;w=10;a[g]=w&255;w=w>>8;a[g+1|0]=w&255;g=a8(j|0,10)|0;if((g|0)==0){k=0;l=0}else{f=j;h=0;m=0;n=g;while(1){a[n]=0;g=lp(f)|0;o=(g|0)>(h|0)?g:h;if((g|m|0)==0){if((a[b]|0)==10){p=11654}else{q=m}}else{p=11654}if((p|0)==11654){p=0;q=m+1|0}g=n+1|0;r=a8(g|0,10)|0;if((r|0)==0){k=o;l=q;break}else{f=g;h=o;m=q;n=r}}}if((d|0)!=0){c[d>>2]=l}uu(j);s=k;i=e;return s|0}}while(0);if((d|0)==0){s=0;i=e;return s|0}c[d>>2]=0;s=0;i=e;return s|0}function gb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];f=(c[a+(b<<6)>>2]|0)==0;l=f?j:g;m=f?k:i;n=f?g:j;j=f?i:k;f=n==-8.988465674311579e+307;b=j==-8.988465674311579e+307;if(f|b){h[d>>3]=l;h[e>>3]=m;if(!f){h[e>>3]=+h[64664+((c[144]|0)*688&-1)>>3];o=4;return o|0}if(b){o=5;return o|0}h[d>>3]=+h[64664+((c[200]|0)*688&-1)>>3];o=1;return o|0}do{if(m==j){h[e>>3]=m;b=l<n;f=c[200]|0;k=+h[64672+(f*688&-1)>>3];do{if(b){if(!(k<l|k>n)){p=11674;break}q=+h[64664+(f*688&-1)>>3];p=11677}else{if(!(k<n|k>l)){p=11674;break}r=+h[64664+(f*688&-1)>>3];p=11678}}while(0);do{if((p|0)==11674){if(k==l){i=+h[64664+(f*688&-1)>>3];if(b){q=i;p=11677;break}else{r=i;p=11678;break}}h[d>>3]=k;o=2;return o|0}}while(0);if((p|0)==11677){if(q<l|q>n){break}else{s=q}}else if((p|0)==11678){if(r<n|r>l){break}else{s=r}}if(s==l){break}h[d>>3]=s;o=1;return o|0}else{if(l==n){h[d>>3]=l;b=m<j;f=c[144]|0;k=+h[64672+(f*688&-1)>>3];do{if(b){if(!(k<m|k>j)){p=11687;break}t=+h[64664+(f*688&-1)>>3];p=11690}else{if(!(k<j|k>m)){p=11687;break}u=+h[64664+(f*688&-1)>>3];p=11691}}while(0);do{if((p|0)==11687){if(k==m){i=+h[64664+(f*688&-1)>>3];if(b){t=i;p=11690;break}else{u=i;p=11691;break}}h[e>>3]=k;o=8;return o|0}}while(0);if((p|0)==11691){if(u<j|u>m){break}else{v=u}}else if((p|0)==11690){if(t<m|t>j){break}else{v=t}}if(v==m){break}h[e>>3]=v;o=4;return o|0}b=m<j;f=c[144]|0;a=64664+(f*688&-1)|0;k=+h[a>>3];do{if(b){if(!(k<m|k>j)){p=11699;break}w=+h[64672+(f*688&-1)>>3];p=11705}else{if(!(k<j|k>m)){p=11699;break}x=+h[64672+(f*688&-1)>>3];p=11706}}while(0);if((p|0)==11699){do{if(k!=m&k!=j){i=l+(k-m)*((n-l)/(j-m));y=c[200]|0;g=+h[64664+(y*688&-1)>>3];z=+h[64672+(y*688&-1)>>3];if(g<z){if(i<g|i>z){break}}else{if(i<z|i>g){break}}h[d>>3]=i;h[e>>3]=+h[a>>3];o=4;return o|0}}while(0);i=+h[64672+(f*688&-1)>>3];if(b){w=i;p=11705}else{x=i;p=11706}}if((p|0)==11706){if(x<j|x>m){A=x}else{B=x;p=11707}}else if((p|0)==11705){if(w<m|w>j){A=w}else{B=w;p=11707}}do{if((p|0)==11707){a=64672+(f*688&-1)|0;if(!(B!=m&B!=j)){A=B;break}i=l+(B-m)*((n-l)/(j-m));y=c[200]|0;g=+h[64664+(y*688&-1)>>3];z=+h[64672+(y*688&-1)>>3];if(g<z){if(i<g|i>z){A=B;break}}else{if(i<z|i>g){A=B;break}}h[d>>3]=i;h[e>>3]=+h[a>>3];o=8;return o|0}}while(0);f=l<n;b=c[200]|0;i=+h[64664+(b*688&-1)>>3];do{if(f){if(!(i<l|i>n)){p=11717;break}C=+h[64672+(b*688&-1)>>3];p=11723}else{if(!(i<n|i>l)){p=11717;break}D=+h[64672+(b*688&-1)>>3];p=11724}}while(0);if((p|0)==11717){do{if(i!=l&i!=n){g=m+(i-l)*((j-m)/(n-l));if(k<A){if(g<k|g>A){break}}else{if(g<A|g>k){break}}h[d>>3]=i;h[e>>3]=g;o=1;return o|0}}while(0);i=+h[64672+(b*688&-1)>>3];if(f){C=i;p=11723}else{D=i;p=11724}}if((p|0)==11724){if(D<n|D>l){break}else{E=D}}else if((p|0)==11723){if(C<l|C>n){break}else{E=C}}if(!(E!=l&E!=n)){break}i=m+(E-l)*((j-m)/(n-l));if(k<A){if(i<k|i>A){break}}else{if(i<A|i>k){break}}h[d>>3]=E;h[e>>3]=i;o=2;return o|0}}while(0);h[d>>3]=l;h[e>>3]=m;o=0;return o|0}function gc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];b=g==-8.988465674311579e+307;a=j==-8.988465674311579e+307;f=i==-8.988465674311579e+307;l=k==-8.988465674311579e+307;if((((a?b?2:1:b&1)+(f&1)|0)+(l&1)|0)>1){m=0;return m|0}if(a|b){n=b?k:i;a=c[200]|0;o=64672+(a*688&-1)|0;p=+h[o>>3];q=+h[64664+(a*688&-1)>>3];if((b?j:g)<=(p>q?p:q)){m=0;return m|0}b=c[144]|0;p=+h[64664+(b*688&-1)>>3];r=+h[64672+(b*688&-1)>>3];do{if(p<r){if(n<p|n>r){m=0}else{break}return m|0}else{if(n<r|n>p){m=0}else{break}return m|0}}while(0);h[d>>3]=q;h[e>>3]=n;h[d+8>>3]=+h[o>>3];h[e+8>>3]=n;m=1;return m|0}if(l|f){n=f?j:g;l=c[144]|0;o=64664+(l*688&-1)|0;q=+h[o>>3];b=64672+(l*688&-1)|0;p=+h[b>>3];if((f?k:i)<=(q>p?q:p)){m=0;return m|0}f=c[200]|0;p=+h[64664+(f*688&-1)>>3];q=+h[64672+(f*688&-1)>>3];do{if(p<q){if(n<p|n>q){m=0}else{break}return m|0}else{if(n<q|n>p){m=0}else{break}return m|0}}while(0);h[d>>3]=n;h[e>>3]=+h[o>>3];h[d+8>>3]=n;h[e+8>>3]=+h[b>>3];m=1;return m|0}b=g==j;o=i==k;if(b&o){m=0;return m|0}if(b){b=c[200]|0;n=+h[64664+(b*688&-1)>>3];p=+h[64672+(b*688&-1)>>3];do{if(n<p){if(g<n|g>p){m=0}else{break}return m|0}else{if(g<p|g>n){m=0}else{break}return m|0}}while(0);b=c[144]|0;f=64664+(b*688&-1)|0;n=+h[f>>3];do{if(i<k){if(n<i|n>k){m=0}else{break}return m|0}else{if(n<k|n>i){m=0}else{break}return m|0}}while(0);h[d>>3]=g;h[e>>3]=+h[f>>3];h[d+8>>3]=g;h[e+8>>3]=+h[64672+(b*688&-1)>>3];m=1;return m|0}if(o){o=c[144]|0;n=+h[64664+(o*688&-1)>>3];p=+h[64672+(o*688&-1)>>3];do{if(n<p){if(i<n|i>p){m=0}else{break}return m|0}else{if(i<p|i>n){m=0}else{break}return m|0}}while(0);o=c[200]|0;n=+h[64664+(o*688&-1)>>3];do{if(g<j){if(n<g|n>j){m=0}else{break}return m|0}else{if(n<j|n>g){m=0}else{break}return m|0}}while(0);h[d>>3]=n;h[e>>3]=i;h[d+8>>3]=+h[64672+(o*688&-1)>>3];h[e+8>>3]=i;m=1;return m|0}else{o=c[200]|0;b=64664+(o*688&-1)|0;n=j-g;j=(+h[b>>3]-g)/n;f=64672+(o*688&-1)|0;p=(+h[f>>3]-g)/n;o=j>p;q=o?j:p;r=o?p:j;o=c[144]|0;l=64664+(o*688&-1)|0;j=k-i;k=(+h[l>>3]-i)/j;a=64672+(o*688&-1)|0;p=(+h[a>>3]-i)/j;o=k>p;s=o?k:p;t=o?p:k;k=r>t?r:t;t=k>0.0?k:0.0;k=q<s?q:s;s=k<1.0?k:1.0;if(t>s){m=0;return m|0}h[d>>3]=g+n*t;h[e>>3]=i+j*t;h[d+8>>3]=g+n*s;h[e+8>>3]=i+j*s;s=+h[b>>3];j=+h[f>>3];i=(j-s)*1.0e-5;n=s-i;s=j+i;i=+h[d>>3];if(n<s){if(!(i<n|i>s)){u=11778}}else{if(!(i<s|i>n)){u=11778}}do{if((u|0)==11778){n=+h[l>>3];i=+h[a>>3];s=(i-n)*1.0e-5;j=n-s;n=i+s;s=+h[e>>3];if(j<n){if(s<j|s>n){break}else{m=1}return m|0}else{if(s<n|s>j){break}else{m=1}return m|0}}}while(0);m=0;return m|0}return 0}function gd(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0;g=i;i=i+24|0;j=g|0;k=g+8|0;l=g+16|0;m=c[3524]|0;n=c[200]|0;c[j>>2]=~~(+(c[64768+(n*688&-1)>>2]|0)+(d- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5);n=c[144]|0;d=+(c[64768+(n*688&-1)>>2]|0);o=+h[64664+(n*688&-1)>>3];p=+h[64776+(n*688&-1)>>3];c[k>>2]=~~(d+(e-o)*p+.5);c[l>>2]=~~(d+(f-o)*p+.5);if((fl(j,k,j,l)|0)==0){i=g;return}n=c[j>>2]|0;cN[c[m+56>>2]&255](n,c[k>>2]|0);k=c[l>>2]|0;cN[c[m+60>>2]&255](n,k);c[a>>2]=n;c[b>>2]=k;i=g;return}function ge(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0;g=i;i=i+24|0;j=g|0;k=g+8|0;l=g+16|0;m=c[3524]|0;n=c[200]|0;o=+(c[64768+(n*688&-1)>>2]|0);p=+h[64664+(n*688&-1)>>3];q=+h[64776+(n*688&-1)>>3];c[j>>2]=~~(o+(d-p)*q+.5);c[k>>2]=~~(o+(e-p)*q+.5);n=c[144]|0;c[l>>2]=~~(+(c[64768+(n*688&-1)>>2]|0)+(f- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5);if((fl(j,l,k,l)|0)==0){i=g;return}n=c[l>>2]|0;cN[c[m+56>>2]&255](c[j>>2]|0,n);j=c[k>>2]|0;cN[c[m+60>>2]&255](j,n);c[a>>2]=j;c[b>>2]=n;i=g;return}function gf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];if((c[a+(b<<6)>>2]|0)==0){b=c[200]|0;a=64664+(b*688&-1)|0;l=+h[a>>3];f=64672+(b*688&-1)|0;m=+h[f>>3];if(l<m){if(g<l|g>m){n=11829}else{n=11821}}else{if(g<m|g>l){n=11829}else{n=11821}}if((n|0)==11829){h[e>>3]=k;l=+h[a>>3];m=+h[f>>3];do{if(l<m){if(j>m){o=m;break}if(j>=l){o=j;break}o=l}else{if(j>l){o=l;break}if(j>=m){o=j;break}o=m}}while(0);h[d>>3]=o;return}else if((n|0)==11821){h[d>>3]=g;f=c[144]|0;o=+h[64664+(f*688&-1)>>3];m=+h[64672+(f*688&-1)>>3];do{if(o<m){if(i>m){p=m;break}if(i>=o){p=i;break}p=o}else{if(i>o){p=o;break}if(i>=m){p=i;break}p=m}}while(0);h[e>>3]=p;return}}else{f=c[144]|0;a=64664+(f*688&-1)|0;p=+h[a>>3];b=64672+(f*688&-1)|0;m=+h[b>>3];if(p<m){if(k<p|k>m){n=11848}else{n=11840}}else{if(k<m|k>p){n=11848}else{n=11840}}if((n|0)==11840){h[e>>3]=k;f=c[200]|0;p=+h[64664+(f*688&-1)>>3];m=+h[64672+(f*688&-1)>>3];do{if(p<m){if(j>m){q=m;break}if(j>=p){q=j;break}q=p}else{if(j>p){q=p;break}if(j>=m){q=j;break}q=m}}while(0);h[d>>3]=q;return}else if((n|0)==11848){h[d>>3]=g;g=+h[a>>3];q=+h[b>>3];do{if(g<q){if(k>q){r=q;break}if(k>=g){r=k;break}r=g}else{if(k>g){r=g;break}if(k>=q){r=k;break}r=q}}while(0);h[e>>3]=r;return}}}function gg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];if((c[a+(b<<6)>>2]|0)==0){b=c[144]|0;a=64664+(b*688&-1)|0;l=+h[a>>3];f=64672+(b*688&-1)|0;m=+h[f>>3];if(l<m){if(i<l|i>m){n=11873}else{n=11865}}else{if(i<m|i>l){n=11873}else{n=11865}}if((n|0)==11865){h[e>>3]=i;b=c[200]|0;l=+h[64664+(b*688&-1)>>3];m=+h[64672+(b*688&-1)>>3];do{if(l<m){if(g>m){o=m;break}if(g>=l){o=g;break}o=l}else{if(g>l){o=l;break}if(g>=m){o=g;break}o=m}}while(0);h[d>>3]=o;return}else if((n|0)==11873){h[d>>3]=j;o=+h[a>>3];m=+h[f>>3];do{if(o<m){if(i>m){p=m;break}if(i>=o){p=i;break}p=o}else{if(i>o){p=o;break}if(i>=m){p=i;break}p=m}}while(0);h[e>>3]=p;return}}else{f=c[200]|0;a=64664+(f*688&-1)|0;p=+h[a>>3];b=64672+(f*688&-1)|0;m=+h[b>>3];if(p<m){if(j<p|j>m){n=11892}else{n=11884}}else{if(j<m|j>p){n=11892}else{n=11884}}if((n|0)==11892){h[e>>3]=i;i=+h[a>>3];p=+h[b>>3];do{if(i<p){if(j>p){q=p;break}if(j>=i){q=j;break}q=i}else{if(j>i){q=i;break}if(j>=p){q=j;break}q=p}}while(0);h[d>>3]=q;return}else if((n|0)==11884){h[d>>3]=j;d=c[144]|0;j=+h[64664+(d*688&-1)>>3];q=+h[64672+(d*688&-1)>>3];do{if(j<q){if(k>q){r=q;break}if(k>=j){r=k;break}r=j}else{if(k>j){r=j;break}if(k>=q){r=k;break}r=q}}while(0);h[e>>3]=r;return}}}function gh(b,d,e,f,g,j,k,l,m){b=+b;d=+d;e=+e;f=+f;g=+g;j=+j;k=+k;l=+l;m=m|0;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0.0,J=0.0,K=0,L=0,M=0.0;n=i;i=i+224|0;o=n|0;p=n+96|0;q=c[m+304>>2]|0;r=+h[64664+(q*688&-1)>>3];s=+h[64672+(q*688&-1)>>3];t=r<s?r:s;u=r>s?r:s;do{if(t<u){if(!(t>b|u<b)){break}if(!(t>g|u<g)){break}i=n;return}else{if(!(u>b|t<b)){break}if(!(u>g|t<g)){break}i=n;return}}while(0);s=g-b;if(t>b){r=t-b;v=t;w=(k-e)*r/s+e;x=(l-f)*r/s+f}else{v=b;w=e;x=f}if(u<g){f=u-g;y=u;z=f*(k-w)/s+k;A=f*(l-x)/s+l}else{y=g;z=k;A=l}q=(a[30528]&1)==0;l=y-v;B=c[m+308>>2]|0;k=+h[64664+(B*688&-1)>>3];g=+h[64672+(B*688&-1)>>3];s=k<g?k:g;f=k>g?k:g;if(w<s&x<s&z<s&A<s){i=n;return}if(w>f&x>f&z>f&A>f){i=n;return}B=c[200]|0;g=+(c[64768+(B*688&-1)>>2]|0);k=+h[64664+(B*688&-1)>>3];u=+h[64776+(B*688&-1)>>3];e=+(~~(g+(v-k)*u+.5)|0);h[p>>3]=e;B=c[144]|0;b=+(c[64768+(B*688&-1)>>2]|0);r=+h[64664+(B*688&-1)>>3];t=+h[64776+(B*688&-1)>>3];C=+(~~(b+(w-r)*t+.5)|0);h[p+8>>3]=C;D=+(~~(g+((q?v:d)-k)*u+.5)|0);h[p+16>>3]=D;d=+(~~(b+(x-r)*t+.5)|0);h[p+24>>3]=d;E=s-x;F=s-A;if(E!=F&E*F<0.0){h[p+40>>3]=+(~~(b+(s-r)*t+.5)|0);h[p+32>>3]=+(~~(g+(v+l*E/(E-F)-k)*u+.5)|0);G=3}else{G=2}F=f-x;E=f-A;if(F!=E&F*E<0.0){h[p+(G<<4)+8>>3]=+(~~(b+(f-r)*t+.5)|0);h[p+(G<<4)>>3]=+(~~(g+(v+l*F/(F-E)-k)*u+.5)|0);H=G+1|0}else{H=G}E=+(~~(g+((q?y:j)-k)*u+.5)|0);h[p+(H<<4)>>3]=E;j=+(~~(b+(A-r)*t+.5)|0);G=H+1|0;h[p+(H<<4)+8>>3]=j;F=+(~~(g+(y-k)*u+.5)|0);h[p+(G<<4)>>3]=F;y=+(~~(b+(z-r)*t+.5)|0);B=H+2|0;h[p+(G<<4)+8>>3]=y;I=s-w;J=s-z;if(I!=J&I*J<0.0){h[p+(B<<4)+8>>3]=+(~~(b+(s-r)*t+.5)|0);h[p+(B<<4)>>3]=+(~~(g+(v+l*I/(I-J)-k)*u+.5)|0);K=H+3|0}else{K=B}J=f-w;I=f-z;if(J!=I&J*I<0.0){h[p+(K<<4)+8>>3]=+(~~(b+(f-r)*t+.5)|0);h[p+(K<<4)>>3]=+(~~(g+(v+l*J/(J-I)-k)*u+.5)|0);L=K+1|0}else{L=K}if((L|0)>0){K=~~(b+(s-r)*t+.5);B=~~(b+(f-r)*t+.5);H=(K|0)<(B|0);f=+(B|0);s=+(K|0);K=0;do{c[o+(K*12&-1)>>2]=~~+h[p+(K<<4)>>3];B=p+(K<<4)+8|0;I=+h[B>>3];do{if(H){if(I>f){h[B>>3]=f;M=f;break}if(I>=s){M=I;break}h[B>>3]=s;M=s}else{if(I>s){h[B>>3]=s;M=s;break}if(I>=f){M=I;break}h[B>>3]=f;M=f}}while(0);c[o+(K*12&-1)+4>>2]=~~M;K=K+1|0;}while((K|0)<(L|0))}if(q){c[o+(L*12&-1)>>2]=x-w+(A-z)<0.0&1}else{z=+(~~(g+(0.0-k)*u+.5)|0);u=+(~~(b+(0.0-r)*t+.5)|0);t=e-z;e=C-u;C=D-z;D=d-u;d=F-z;F=y-u;y=E-z;z=j-u;c[o+(L*12&-1)>>2]=C*C+D*D-(t*t+e*e)+(y*y+z*z-(d*d+F*F))<0.0&1}gj(L,o|0,m);i=n;return}function gi(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;i=e|d;if((i|0)==12){j=(g&1|0)!=0;g=c[200]|0;if(j){k=+h[64664+(g*688&-1)>>3];l=(k-k)*+h[64776+(g*688&-1)>>3]}else{l=(+h[64672+(g*688&-1)>>3]- +h[64664+(g*688&-1)>>3])*+h[64776+(g*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(g*688&-1)>>2]|0)+l+.5);g=c[144]|0;if((d&8|0)==0){l=+h[64664+(g*688&-1)>>3];m=(l-l)*+h[64776+(g*688&-1)>>3]}else{m=(+h[64672+(g*688&-1)>>3]- +h[64664+(g*688&-1)>>3])*+h[64776+(g*688&-1)>>3]}n=~~(+(c[64768+(g*688&-1)>>2]|0)+m+.5);g=c[b>>2]|0;c[b>>2]=g+1;c[a+(g*12&-1)+4>>2]=n;n=c[200]|0;if(j){m=+h[64664+(n*688&-1)>>3];o=(m-m)*+h[64776+(n*688&-1)>>3]}else{o=(+h[64672+(n*688&-1)>>3]- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(n*688&-1)>>2]|0)+o+.5);n=c[144]|0;if((e&8|0)==0){o=+h[64664+(n*688&-1)>>3];p=(o-o)*+h[64776+(n*688&-1)>>3]}else{p=(+h[64672+(n*688&-1)>>3]- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]}j=~~(+(c[64768+(n*688&-1)>>2]|0)+p+.5);n=c[b>>2]|0;c[b>>2]=n+1;c[a+(n*12&-1)+4>>2]=j;return}else if((i|0)==3){j=c[200]|0;if((d&1|0)==0){q=(+h[64672+(j*688&-1)>>3]- +h[64664+(j*688&-1)>>3])*+h[64776+(j*688&-1)>>3]}else{p=+h[64664+(j*688&-1)>>3];q=(p-p)*+h[64776+(j*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(j*688&-1)>>2]|0)+q+.5);j=(f&8|0)!=0;f=c[144]|0;if(j){r=(+h[64672+(f*688&-1)>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]}else{q=+h[64664+(f*688&-1)>>3];r=(q-q)*+h[64776+(f*688&-1)>>3]}d=~~(+(c[64768+(f*688&-1)>>2]|0)+r+.5);f=c[b>>2]|0;c[b>>2]=f+1;c[a+(f*12&-1)+4>>2]=d;d=c[200]|0;if((e&1|0)==0){s=(+h[64672+(d*688&-1)>>3]- +h[64664+(d*688&-1)>>3])*+h[64776+(d*688&-1)>>3]}else{r=+h[64664+(d*688&-1)>>3];s=(r-r)*+h[64776+(d*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(d*688&-1)>>2]|0)+s+.5);d=c[144]|0;if(j){t=(+h[64672+(d*688&-1)>>3]- +h[64664+(d*688&-1)>>3])*+h[64776+(d*688&-1)>>3]}else{s=+h[64664+(d*688&-1)>>3];t=(s-s)*+h[64776+(d*688&-1)>>3]}j=~~(+(c[64768+(d*688&-1)>>2]|0)+t+.5);d=c[b>>2]|0;c[b>>2]=d+1;c[a+(d*12&-1)+4>>2]=j;return}else{j=c[200]|0;if((i&1|0)==0){u=(+h[64672+(j*688&-1)>>3]- +h[64664+(j*688&-1)>>3])*+h[64776+(j*688&-1)>>3]}else{t=+h[64664+(j*688&-1)>>3];u=(t-t)*+h[64776+(j*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(j*688&-1)>>2]|0)+u+.5);j=c[144]|0;if((i&8|0)==0){u=+h[64664+(j*688&-1)>>3];v=(u-u)*+h[64776+(j*688&-1)>>3]}else{v=(+h[64672+(j*688&-1)>>3]- +h[64664+(j*688&-1)>>3])*+h[64776+(j*688&-1)>>3]}i=~~(+(c[64768+(j*688&-1)>>2]|0)+v+.5);j=c[b>>2]|0;c[b>>2]=j+1;c[a+(j*12&-1)+4>>2]=i;return}}function gj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if((a|0)<1){return}e=c[d+244>>2]|0;do{if((e|0)==9){f=c[200]|0;c[b+(a*12&-1)>>2]=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+248>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);f=c[144]|0;c[b+(a*12&-1)+4>>2]=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+256>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);g=a+1|0}else if((e|0)==1){c[b+(a*12&-1)>>2]=c[b+((a-1|0)*12&-1)>>2];f=a+1|0;c[b+(f*12&-1)>>2]=c[b>>2];i=c[16364]|0;c[b+(f*12&-1)+4>>2]=i;c[b+(a*12&-1)+4>>2]=i;g=a+2|0}else if((e|0)==4){c[b+(a*12&-1)+4>>2]=c[b+((a-1|0)*12&-1)+4>>2];i=a+1|0;c[b+(i*12&-1)+4>>2]=c[b+4>>2];f=c[16537]|0;c[b+(i*12&-1)>>2]=f;c[b+(a*12&-1)>>2]=f;g=a+2|0}else if((e|0)==5|(e|0)==7){f=c[200]|0;i=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+248>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);f=a+1|0;c[b+(f*12&-1)>>2]=i;c[b+(a*12&-1)>>2]=i;c[b+(a*12&-1)+4>>2]=c[b+((a-1|0)*12&-1)+4>>2];c[b+(f*12&-1)+4>>2]=c[b+4>>2];if((a|0)>0){f=0;j=0;while(1){k=((c[b+(j*12&-1)>>2]|0)+f|0)-i|0;l=j+1|0;if((l|0)<(a|0)){f=k;j=l}else{m=k;break}}}else{m=0}n=a+2|0;o=m;p=12004}else if((e|0)==3){c[b+(a*12&-1)>>2]=c[b+((a-1|0)*12&-1)>>2];j=a+1|0;c[b+(j*12&-1)>>2]=c[b>>2];f=c[16365]|0;c[b+(j*12&-1)+4>>2]=f;c[b+(a*12&-1)+4>>2]=f;g=a+2|0}else if((e|0)==6|(e|0)==8){f=c[144]|0;j=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+248>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);f=a+1|0;c[b+(f*12&-1)+4>>2]=j;c[b+(a*12&-1)+4>>2]=j;c[b+(a*12&-1)>>2]=c[b+((a-1|0)*12&-1)>>2];c[b+(f*12&-1)>>2]=c[b>>2];if((a|0)>0){f=0;i=0;while(1){k=((c[b+(i*12&-1)+4>>2]|0)+f|0)-j|0;l=i+1|0;if((l|0)<(a|0)){f=k;i=l}else{q=k;break}}}else{q=0}n=a+2|0;o=q;p=12004}else if((e|0)==2){c[b+(a*12&-1)+4>>2]=c[b+((a-1|0)*12&-1)+4>>2];i=a+1|0;c[b+(i*12&-1)+4>>2]=c[b+4>>2];f=c[16536]|0;c[b+(i*12&-1)>>2]=f;c[b+(a*12&-1)>>2]=f;g=a+2|0}else if((e|0)==10|(e|0)==13){f=(c[b+(a*12&-1)>>2]|0)>0?1:-1;if((c[d+192>>2]|0)!=4){n=a;o=f;p=12004;break}i=b+24|0;j=c[i>>2]|0;k=(j|0)<(c[b>>2]|0)?-1:1;if((a|0)<=3){n=a;o=f;p=12004;break}l=b+36|0;r=c[l>>2]|0;if((j|0)==(r|0)){s=j-k|0;c[i>>2]=s;c[l>>2]=s;n=a;o=f;p=12004;break}if((a|0)<=4){n=a;o=f;p=12004;break}s=b+48|0;if((r|0)!=(c[s>>2]|0)){n=a;o=f;p=12004;break}i=r-k|0;c[l>>2]=i;c[s>>2]=i;n=a;o=f;p=12004}else{g=a}}while(0);do{if((p|0)==12004){a=c[d+264>>2]|0;if((a|0)>0&(o|0)<0){return}if(!((a|0)<0&(o|0)>0)){g=n;break}return}}while(0);n=c[d+192>>2]|0;if((n|0)==1|(n|0)==4){t=(c[d+196>>2]<<4&65520)+n|0}else if((n|0)==2|(n|0)==5){t=(c[d+200>>2]<<4&65520)+n|0}else{t=0}c[b+8>>2]=t;cN[c[(c[3524]|0)+148>>2]&255](g,b);return}function gk(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=c[8978]|0;if((b|0)==0){return}if((c[8982]|0)>0){d=0;e=b;while(1){uu(c[e+(d<<4)>>2]|0);f=c[8978]|0;do{if((a[f+(d<<4)+12|0]&1)==0){g=f}else{h=c[f+(d<<4)+8>>2]|0;if((h|0)==0){g=f;break}else{i=h}while(1){uu(c[i>>2]|0);h=c[i+4>>2]|0;uu(i);if((h|0)==0){break}else{i=h}}g=c[8978]|0}}while(0);f=d+1|0;if((f|0)<(c[8982]|0)){d=f;e=g}else{j=g;break}}}else{j=b}uu(j);c[8978]=0;c[8982]=0;return}function gl(a,b){a=a|0;b=b|0;return aY(c[a>>2]|0,c[b>>2]|0)|0}function gm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0;f=i;i=i+2048|0;g=f|0;h=f+1024|0;c[b0()>>2]=0;if((a_(39e3,d|0,1024)|0)!=0){gk()}do{if((c[8978]|0)==0){j=h|0;k=bF(d|0,193632)|0;c[9748]=k;if((k|0)==0){l=-1;i=f;return l|0}n=(a6(j|0,1023,k|0)|0)!=0;if(!(n&(a[j]|0)==63)){l=-1;i=f;return l|0}L16406:do{if((cj(c[9748]|0)|0)==0){n=h+1|0;k=1;p=0;q=0;L16408:while(1){if((a[j]|0)==63){a[h+(uA(n|0)|0)|0]=0;r=ut(20)|0;if((r|0)==0){gk();s=ut(20)|0;if((s|0)==0){t=12038;break}else{u=s}}else{u=r}r=u;c[u>>2]=bP(n|0)|0;c[u+16>>2]=c[8980];c[8980]=r;c[8982]=(c[8982]|0)+1;a[u+12|0]=k;c[u+8>>2]=0;c[u+4>>2]=0;s=bc(c[9748]|0)|0;if((a6(j|0,1023,c[9748]|0)|0)==0){x=s;y=r}else{k=0;p=s;q=r;continue}}else{x=p;y=q}r=ut(8)|0;if((r|0)==0){gk();s=ut(8)|0;if((s|0)==0){t=12042;break}else{z=s}}else{z=r}r=z;c[z>>2]=bP(j|0)|0;c[z+4>>2]=0;s=(a6(j|0,1023,c[9748]|0)|0)==0;if(s|(a[j]|0)==63){A=y}else{s=r;while(1){B=ut(8)|0;if((B|0)==0){gk();C=ut(8)|0;if((C|0)==0){t=12046;break L16408}else{D=C}}else{D=B}B=D;c[D>>2]=bP(j|0)|0;c[D+4>>2]=0;c[s+4>>2]=B;C=(a6(j|0,1023,c[9748]|0)|0)==0;if(C|(a[j]|0)==63){A=y;break}else{s=B}}}while(1){c[A+4>>2]=x;c[A+8>>2]=r;E=c[A+16>>2]|0;if((a[A+12|0]&1)!=0|(E|0)==0){break}else{A=E}}if((cj(c[9748]|0)|0)==0){k=1;p=x;q=E}else{break L16406}}if((t|0)==12038){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197768,v)|0);return 0}else if((t|0)==12042){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=202984,v)|0);return 0}else if((t|0)==12046){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=202984,v)|0);return 0}}}while(0);j=c[9748]|0;az(j|0);j=(c[8982]<<4)+16|0;q=ut(j)|0;do{if((q|0)==0){gk();p=ut(j)|0;if((p|0)!=0){F=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=206864,v)|0);return 0}else{F=q}}while(0);q=F;c[8978]=q;j=c[8980]|0;if((j|0)==0){G=q}else{p=j;j=0;k=q;while(1){c[k+(j<<4)>>2]=c[p>>2];c[(c[8978]|0)+(j<<4)+4>>2]=c[p+4>>2];c[(c[8978]|0)+(j<<4)+8>>2]=c[p+8>>2];a[(c[8978]|0)+(j<<4)+12|0]=a[p+12|0]&1;q=c[p+16>>2]|0;uu(p);if((q|0)==0){break}p=q;j=j+1|0;k=c[8978]|0}G=c[8978]|0}c[G+(c[8982]<<4)>>2]=0;c[(c[8978]|0)+(c[8982]<<4)+4>>2]=0;c[(c[8978]|0)+(c[8982]<<4)+8>>2]=0;bM(c[8978]|0,c[8982]|0,16,32);uF(39e3,d|0,1024);if((uA(d|0)|0)>>>0<1024){break}a[40023]=0}}while(0);d=c[8978]|0;G=d|0;F=c[G>>2]|0;if((F|0)==0){l=1;i=f;return l|0}E=bk(b|0,73808)|0;x=d;d=G;G=F;L16448:while(1){if((a_(b|0,G|0,E|0)|0)==0){do{if((a[G+E|0]|0)==0){H=G}else{F=x+16|0;A=F|0;y=c[A>>2]|0;if((y|0)==0){H=G;break}else{I=G;J=0;K=F;L=A;M=y}L16454:while(1){y=I+E|0;A=K;F=L;D=M;while(1){if((a_(G|0,D|0,E|0)|0)!=0){break L16454}if((a_(D|0,I|0,(bk(y|0,73808)|0)+E|0)|0)!=0){break}z=A+16|0;u=z|0;k=c[u>>2]|0;if((k|0)==0){break L16454}else{A=z;F=u;D=k}}if(J){N=D}else{y=c[m>>2]|0;cf(y|0,72704,(v=i,i=i+16|0,c[v>>2]=E,c[v+8>>2]=G,v)|0);y=c[m>>2]|0;cf(y|0,123448,(v=i,i=i+8|0,c[v>>2]=I,v)|0);N=c[F>>2]|0}cf(c[m>>2]|0,123448,(v=i,i=i+8|0,c[v>>2]=N,v)|0);y=A+16|0;k=y|0;u=c[k>>2]|0;if((u|0)==0){O=45032;break L16448}else{I=c[F>>2]|0;J=1;K=y;L=k;M=u}}if(J){O=45032;break L16448}H=c[d>>2]|0}}while(0);u=uA(H|0)|0;if((u|0)==(E|0)){P=E}else{k=u-E|0;y=(uA(b|0)|0)+k|0;if(y>>>0<E>>>0){Q=H}else{z=y;do{a[b+z|0]=a[b+(z-k|0)|0]|0;z=z-1|0;}while(z>>>0>=E>>>0);Q=c[d>>2]|0}uF(b|0,Q|0,u|0);P=u}if((a[b+P|0]|0)!=32){t=12080;break}z=P+1|0;R=x-16|0;S=(bk(b+z|0,73808)|0)+z|0}else{R=x;S=E}z=R+16|0;k=z|0;y=c[k>>2]|0;if((y|0)==0){l=1;t=12159;break}else{E=S;x=z;d=k;G=y}}if((t|0)==12159){i=f;return l|0}do{if((t|0)==12080){if((x|0)==0){l=1}else{O=x;break}i=f;return l|0}}while(0);x=O+8|0;if((c[x>>2]|0)==0){l=0;i=f;return l|0}gq();G=(e|0)==0;if(G){t=12084}else{if((a[e]&1)==0){t=12084}}do{if((t|0)==12084){d=c[x>>2]|0;if((d|0)==0){break}else{T=d}do{d=c[T>>2]|0;S=c[8250]|0;if((S|0)==(c[m>>2]|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){U=S}else{aI(125440,23,1,S|0);do{E=a1(c[o>>2]|0)|0}while(!((E|0)==(-1|0)|(E|0)==10));c[8238]=0;U=c[m>>2]|0}aK(d|0,U|0);c[8238]=(c[8238]|0)+1}else{aK(d|0,S|0)}T=c[T+4>>2]|0;}while((T|0)!=0)}}while(0);T=h|0;a[T]=0;U=O|0;x=c[U>>2]|0;u=uA(x|0)|0;E=O+16|0;R=c[E>>2]|0;do{if((R|0)==0){V=0}else{b=(u|0)==0;P=u+1|0;Q=O;H=0;J=0;M=0;L=E;K=R;I=x;L16505:while(1){N=(J|0)==0;y=Q;k=L;z=K;while(1){if((a_(z|0,I|0,u|0)|0)!=0){W=H;X=M;break L16505}j=z+u|0;if(b){if((a[y+28|0]&1)!=0){Y=j;t=12102}}else{if((a[j]|0)!=32){W=H;X=M;break L16505}Y=z+P|0;t=12102}if((t|0)==12102){t=0;if(N){break}if((a_(Y|0,J|0,bk(Y|0,73808)|0)|0)!=0){break}}j=k+16|0;p=c[j>>2]|0;if((p|0)==0){W=H;X=M;break L16505}else{y=k;k=j;z=p}}if((H|0)==0){if(b){uD(T|0,77784,25)}else{uD(T|0,94064,26);ck(T|0,I|0,996);z=h+(uA(T|0)|0)|0;a[z]=a[86832]|0;a[z+1|0]=a[86833|0]|0;a[z+2|0]=a[86834|0]|0}z=c[8250]|0;y=c[m>>2]|0;if((z|0)==(y|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){Z=z}else{aI(125440,23,1,z|0);do{z=a1(c[o>>2]|0)|0}while(!((z|0)==(-1|0)|(z|0)==10));c[8238]=0;Z=c[m>>2]|0}aK(T|0,Z|0);c[8238]=(c[8238]|0)+1}else{aK(T|0,y|0)}a[T]=0;_=1}else{_=H}z=M+1|0;c[g+(M<<2)>>2]=Y;N=k+16|0;S=c[N>>2]|0;if((S|0)==0){W=_;X=z;break}Q=k;H=_;J=Y;M=z;L=N;K=S;I=c[U>>2]|0}if((X|0)>0){$=0;aa=0;ab=0}else{V=W;break}while(1){I=c[g+($<<2)>>2]|0;K=bk(I|0,73808)|0;L=(ab|0)==0?4:aa;if((L|0)>0){M=0;do{J=h+(uA(T|0)|0)|0;w=32;a[J]=w&255;w=w>>8;a[J+1|0]=w&255;M=M+1|0;}while((M|0)<(L|0))}ck(T|0,I|0,K|0);L=18-K|0;if((L|0)<1){M=((K-18|0)>>>0)/18>>>0;ac=(36-K|0)+(M*18&-1)|0;ad=(ab+1|0)+M|0}else{ac=L;ad=ab}L=ad+1|0;if((L|0)>3){M=h+(uA(T|0)|0)|0;w=10;a[M]=w&255;w=w>>8;a[M+1|0]=w&255;M=c[8250]|0;k=c[m>>2]|0;if((M|0)==(k|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){ae=M}else{aI(125440,23,1,M|0);do{M=a1(c[o>>2]|0)|0}while(!((M|0)==(-1|0)|(M|0)==10));c[8238]=0;ae=c[m>>2]|0}aK(T|0,ae|0);c[8238]=(c[8238]|0)+1}else{aK(T|0,k|0)}a[T]=0;af=0}else{af=L}K=$+1|0;if((K|0)<(X|0)){$=K;aa=ac;ab=af}else{break}}if(!((W|0)>0&(af|0)>0)){V=W;break}K=h+(uA(T|0)|0)|0;w=10;a[K]=w&255;w=w>>8;a[K+1|0]=w&255;K=c[8250]|0;I=c[m>>2]|0;if((K|0)!=(I|0)){aK(T|0,I|0);V=W;break}if((c[8238]|0)<((c[6318]|0)-2|0)){ag=K}else{aI(125440,23,1,K|0);do{K=a1(c[o>>2]|0)|0}while(!((K|0)==(-1|0)|(K|0)==10));c[8238]=0;ag=c[m>>2]|0}aK(T|0,ag|0);c[8238]=(c[8238]|0)+1;V=W}}while(0);if(!G){a[e]=(V|0)!=0&1}V=c[8250]|0;e=c[m>>2]|0;if((V|0)==(e|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){ah=V}else{aI(125440,23,1,V|0);do{V=a1(c[o>>2]|0)|0}while(!((V|0)==(-1|0)|(V|0)==10));c[8238]=0;ah=c[m>>2]|0}aF(10,ah|0);c[8238]=(c[8238]|0)+1}else{aF(10,e|0)}e=c[8250]|0;if((e|0)==(c[m>>2]|0)){l=0;i=f;return l|0}a2(e|0);l=0;i=f;return l|0}function gn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0;d=c[11608]|0;e=c[228]|0;f=+h[e+((c[d+((c[a>>2]|0)*20&-1)+4>>2]|0)*48&-1)+16>>3]- +h[e+((c[d+((c[b>>2]|0)*20&-1)+4>>2]|0)*48&-1)+16>>3];if(f<-1.0e-5){g=-1;return g|0}g=f>1.0e-5&1;return g|0}function go(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;d=c[7628]|0;e=+h[d+((c[a>>2]|0)*104&-1)+56>>3]- +h[d+((c[b>>2]|0)*104&-1)+56>>3];if(e<-1.0e-5){f=-1;return f|0}f=e>1.0e-5&1;return f|0}function gp(){var b=0,d=0,e=0;b=i;cf(c[m>>2]|0,125144,(v=i,i=i+8|0,c[v>>2]=(c[9744]|0)==0?150704:150856,v)|0);d=c[9734]|0;e=c[9738]|0;cf(c[m>>2]|0,93824,(v=i,i=i+24|0,c[v>>2]=c[9742],c[v+8>>2]=d,c[v+16>>2]=e,v)|0);e=c[9738]|0;if((e|0)==2){d=c[m>>2]|0;aI(77648,56,1,d|0)}else if((e|0)==1){aI(86680,65,1,c[m>>2]|0)}else if((e|0)==3){aI(72584,61,1,c[m>>2]|0)}else{aI(218160,60,1,c[m>>2]|0)}e=a[38960]|0?211688:179864;cf(c[m>>2]|0,212512,(v=i,i=i+16|0,c[v>>2]=a[38944]|0?211688:179864,c[v+8>>2]=e,v)|0);i=b;return}function gq(){var b=0,d=0,e=0,f=0,g=0;b=i;d=bU(75160)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=bt(d|0,137896)|0;c[8250]=e;if((e|0)==0){break}i=b;return}}while(0);c[8250]=c[m>>2];d=bU(139752)|0;if((d|0)==0){f=12184}else{e=aE(d|0,0,0)|0;if((e|0)<3){f=12184}else{g=e}}if((f|0)==12184){g=24}c[6318]=g;c[8238]=0;i=b;return}function gr(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0;b=i;i=i+72|0;d=b|0;e=b+24|0;f=b+48|0;g=c[13898]|0;j=c[8272]|0;if((g|0)>=(j|0)){i=b;return}k=e|0;l=e+8|0;m=d|0;n=d+8|0;o=f|0;p=f+8|0;q=g;g=j;L16625:while(1){r=c[1054]|0;j=(a[r+(q*40&-1)|0]&1)==0;s=c[r+(q*40&-1)+36>>2]|0;L16627:do{if(j){t=c[10036]|0;u=r+(q*40&-1)+32|0}else{w=r+(q*40&-1)+32|0;x=c[10036]|0;y=0;while(1){if((y|0)>=(s|0)){break}if((a[x+((c[w>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{t=x;u=w;break L16627}}if((y|0)==1){z=12257;break L16625}else{t=x;u=w}}}while(0);A=c[u>>2]|0;B=(s|0)>0;C=24304;D=153928;L16635:while(1){L16637:do{if(!j){if(B){E=0;F=0;G=A;while(1){H=a[D+E|0]|0;if(H<<24>>24==(a[t+(E+G|0)|0]|0)){I=G;J=F}else{if(H<<24>>24!=36){break L16637}I=G-1|0;J=1}K=E+1|0;if((K|0)<(J+s|0)){E=K;F=J;G=I}else{break}}if((J|0)==0){L=K}else{M=C;break L16635}}else{L=0}G=a[D+L|0]|0;if((G<<24>>24|0)==36|(G<<24>>24|0)==0){M=C;break L16635}}}while(0);w=C+8|0;x=c[w>>2]|0;if((x|0)==0){M=w;break}else{C=w;D=x}}D=c[M+4>>2]|0;if((D|0)==0){z=12247;break}else if((D|0)==1){z=12208;break}else if((D|0)==3){c[9742]=0;N=q}else if((D|0)==6){c[9738]=3;N=q}else if((D|0)==2){c[13898]=q+1;C=is(e)|0;s=c[C>>2]|0;if((s|0)==3){O=+uz(c[C+8>>2]|0,0)}else if((s|0)==2){O=+h[C+8>>3]}else if((s|0)==1){O=+(c[C+8>>2]|0)}else{z=12219;break}if((c[k>>2]|0)==3){uu(c[l>>2]|0);c[k>>2]=1}c[9742]=~~O;C=(c[13898]|0)-1|0;c[13898]=C;N=C}else if((D|0)==5){c[13898]=q+1;C=is(f)|0;s=c[C>>2]|0;if((s|0)==2){P=+h[C+8>>3]}else if((s|0)==1){P=+(c[C+8>>2]|0)}else if((s|0)==3){P=+uz(c[C+8>>2]|0,0)}else{z=12236;break}if((c[o>>2]|0)==3){uu(c[p>>2]|0);c[o>>2]=1}C=~~P;c[9738]=(C-1|0)>>>0>2?3:C;C=(c[13898]|0)-1|0;c[13898]=C;N=C}else if((D|0)==7){a[38944]=0;N=q}else if((D|0)==8){a[38944]=1;N=q}else if((D|0)==12){c[9744]=0;N=q}else if((D|0)==11){c[9744]=1;N=q}else if((D|0)==9){a[38960]=0;N=q}else if((D|0)==10){a[38960]=1;N=q}else if((D|0)==4){c[13898]=q+1;D=is(d)|0;C=c[D>>2]|0;if((C|0)==1){Q=+(c[D+8>>2]|0)}else if((C|0)==2){Q=+h[D+8>>3]}else if((C|0)==3){Q=+uz(c[D+8>>2]|0,0)}else{z=12228;break}if((c[m>>2]|0)==3){uu(c[n>>2]|0);c[m>>2]=1}c[9734]=~~Q;D=(c[13898]|0)-1|0;c[13898]=D;N=D}else{N=q}D=N+1|0;c[13898]=D;C=c[8272]|0;if((D|0)<(C|0)){q=D;g=C}else{z=12255;break}}if((z|0)==12257){i=b;return}else if((z|0)==12247){uf(q,139344,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==12208){c[9742]=1;c[9734]=3;c[9738]=1;a[38944]=0;a[38960]=0;c[9744]=0;N=q+1|0;c[13898]=N;if((N|0)>=(g|0)){i=b;return}if((a[r+(N*40&-1)|0]&1)==0){uf(N,170328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[r+(N*40&-1)+36>>2]|0;q=r+(N*40&-1)+32|0;r=0;while(1){if((r|0)>=(g|0)){break}if((a[t+((c[q>>2]|0)+r|0)|0]|0)==(a[r+103664|0]|0)){r=r+1|0}else{z=12251;break}}if((z|0)==12251){uf(N,170328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){i=b;return}else{uf(N,170328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else if((z|0)==12255){i=b;return}else if((z|0)==12228){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==12219){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==12236){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function gs(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;if((c[9738]|0)<1){c[9738]=3}c[228]=0;b=ut(4800)|0;do{if((b|0)==0){gk();d=ut(4800)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else{e=b}}while(0);c[228]=e;c[224]=100;c[225]=0;c[226]=100;c[227]=48;c[11608]=0;e=ut(2e3)|0;do{if((e|0)==0){gk();b=ut(2e3)|0;if((b|0)!=0){f=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else{f=e}}while(0);c[11608]=f;c[11604]=100;c[11605]=0;c[11606]=100;c[11607]=20;c[7628]=0;f=ut(10400)|0;if((f|0)!=0){g=f;c[7628]=g;c[7624]=100;c[7625]=0;c[7626]=100;c[7627]=104;i=a;return}gk();f=ut(10400)|0;if((f|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else{g=f;c[7628]=g;c[7624]=100;c[7625]=0;c[7626]=100;c[7627]=104;i=a;return}}function gt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;i=i+8|0;f=e|0;if((c[7625]|0)==0){un(a,b,d,d+40|0);i=e;return}g=c[228]|0;if((g|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[225]|0;k=c[224]|0;do{if((j|0)<(k|0)){l=j;m=g}else{n=(c[226]|0)+k|0;if((n|0)==0){uu(g);c[228]=0;c[224]=0;c[225]=0;l=0;m=0;break}else{o=db(g,aa(c[227]|0,n),150384)|0;c[228]=o;c[224]=n;l=c[225]|0;m=o;break}}}while(0);c[225]=l+1;g=m;m=g+(l*48&-1)|0;k=a;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];c[m+16>>2]=c[k+16>>2];c[m+20>>2]=c[k+20>>2];c[m+24>>2]=c[k+24>>2];c[m+28>>2]=c[k+28>>2];c[m+32>>2]=c[k+32>>2];c[m+36>>2]=c[k+36>>2];c[m+40>>2]=c[k+40>>2];c[m+44>>2]=c[k+44>>2];k=(b|0)!=0;m=g+(l*48&-1)+24|0;if(k){c[m>>2]=0;g=c[228]|0;if((g|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a=c[225]|0;j=c[224]|0;do{if((a|0)<(j|0)){p=a;q=g}else{o=(c[226]|0)+j|0;if((o|0)==0){uu(g);c[228]=0;c[224]=0;c[225]=0;p=0;q=0;break}else{n=db(g,aa(c[227]|0,o),150384)|0;c[228]=n;c[224]=o;p=c[225]|0;q=n;break}}}while(0);c[225]=p+1;g=q;q=g+(p*48&-1)|0;j=b;c[q>>2]=c[j>>2];c[q+4>>2]=c[j+4>>2];c[q+8>>2]=c[j+8>>2];c[q+12>>2]=c[j+12>>2];c[q+16>>2]=c[j+16>>2];c[q+20>>2]=c[j+20>>2];c[q+24>>2]=c[j+24>>2];c[q+28>>2]=c[j+28>>2];c[q+32>>2]=c[j+32>>2];c[q+36>>2]=c[j+36>>2];c[q+40>>2]=c[j+40>>2];c[q+44>>2]=c[j+44>>2];c[g+(p*48&-1)+24>>2]=0;r=p}else{c[m>>2]=d;r=l}m=c[d+4>>2]|0;p=c[11608]|0;if((p|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[11605]|0;j=c[11604]|0;do{if((g|0)<(j|0)){s=p;t=g}else{q=(c[11606]|0)+j|0;if((q|0)==0){uu(p);c[11608]=0;c[11604]=0;c[11605]=0;s=0;t=0;break}else{b=db(p,aa(c[11607]|0,q),150384)|0;c[11608]=b;c[11604]=q;s=b;t=c[11605]|0;break}}}while(0);p=c[11607]|0;c[11605]=t+1;j=aa(p,t);t=s+j|0;p=c[228]|0;g=s+(j+8|0)|0;c[g>>2]=m;c[s+(j+12|0)>>2]=d;c[s+(j+16|0)>>2]=-1;m=t;do{if(+h[p+(l*48&-1)+16>>3]<+h[p+(r*48&-1)+16>>3]){c[m>>2]=r;c[s+(j+4|0)>>2]=l;if((c[d+8>>2]|0)!=-10){break}c[g>>2]=-11}else{c[m>>2]=l;c[s+(j+4|0)>>2]=r;if((c[d+8>>2]|0)!=-10){break}c[g>>2]=-10}}while(0);g=c[11608]|0;d=(t-g|0)/20&-1;c[f>>2]=c[8022];t=g;gu(d,c[t+(d*20&-1)>>2]|0,c[t+(d*20&-1)+4>>2]|0,f);if((c[11608]|0)==0){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[11605]|0;if((f|0)!=0){c[11605]=f-1}if((c[228]|0)==0){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[225]|0;if((f|0)==0){u=0}else{d=f-1|0;c[225]=d;u=d}if((u|0)==0|k^1){i=e;return}c[225]=u-1;i=e;return}function gu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0.0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0;f=i;i=i+56|0;g=f|0;j=f+8|0;k=c[228]|0;l=k;m=l+(b*48&-1)|0;n=l+(d*48&-1)|0;o=+h[l+(b*48&-1)+16>>3]>+h[l+(d*48&-1)+16>>3];d=o?n:m;l=o?m:n;n=k;m=(l-n|0)/48&-1;o=(d-n|0)/48&-1;p=+h[d+16>>3];q=+h[l>>3];r=+h[d>>3];n=q>r;s=+h[l+8>>3];t=+h[d+8>>3];b=s>t;u=c[225]|0;w=c[e>>2]|0;do{if((w|0)>-1){x=j|0;y=p;z=b?s:t;A=b?t:s;B=n?q:r;C=n?r:q;D=d;E=l;F=o;G=m;H=w;L16789:while(1){I=c[7628]|0;J=I+(H*104&-1)|0;L16791:do{if(+h[I+(H*104&-1)+24>>3]<C){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y}else{if(+h[I+(H*104&-1)+16>>3]>B){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}if(+h[I+(H*104&-1)+40>>3]<A){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}if(+h[I+(H*104&-1)+32>>3]>z){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}T=+h[I+(H*104&-1)+56>>3];if(T<y){if(T>=p){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}c[e>>2]=H;K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}U=c[J>>2]|0;V=c[11608]|0;W=c[V+(a*20&-1)>>2]|0;do{if((U|0)==(W|0)){X=12326}else{Y=c[I+(H*104&-1)+4>>2]|0;if((Y|0)==(W|0)){X=12326;break}Z=c[I+(H*104&-1)+8>>2]|0;if((Z|0)==(W|0)){X=12326}else{_=Y;$=Z}}}while(0);if((X|0)==12326){X=0;W=c[V+(a*20&-1)+4>>2]|0;if((U|0)==(W|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}Z=c[I+(H*104&-1)+4>>2]|0;if((Z|0)==(W|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}Y=c[I+(H*104&-1)+8>>2]|0;if((Y|0)==(W|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}else{_=Z;$=Y}}aa=c[228]|0;Y=aa;Z=E|0;T=+h[Z>>3];W=E+8|0;ab=+h[W>>3];ac=+h[E+16>>3];ad=+h[I+(H*104&-1)+64>>3];ae=+h[I+(H*104&-1)+72>>3];af=+h[I+(H*104&-1)+80>>3];ag=+h[I+(H*104&-1)+88>>3]+(T*ad+ab*ae+ac*af);if(ag==0.0){ah=0.0}else{ah=ag/(ad*(T- +h[D>>3])+ae*(ab- +h[D+8>>3])+af*(ac- +h[D+16>>3]))}ac=+h[Z>>3];af=+h[W>>3];ab=+h[Y+(U*48&-1)>>3];ae=+h[Y+(U*48&-1)+8>>3];T=+h[Y+(_*48&-1)>>3];ad=+h[Y+(_*48&-1)+8>>3];ag=T-ab;ai=ad-ae;aj=(af-ae)*ag-(ac-ab)*ai;if(aj==0.0){ak=0.0}else{ak=aj/(ai*(+h[D>>3]-ac)-ag*(+h[D+8>>3]-af))}af=+h[Z>>3];ag=+h[W>>3];ac=+h[Y+($*48&-1)>>3];ai=+h[Y+($*48&-1)+8>>3];aj=ac-T;al=ai-ad;am=(ag-ad)*aj-(af-T)*al;if(am==0.0){an=0.0}else{an=am/(al*(+h[D>>3]-af)-aj*(+h[D+8>>3]-ag))}ag=+h[Z>>3];aj=+h[W>>3];af=ab-ac;ab=ae-ai;ae=(aj-ai)*af-(ag-ac)*ab;if(ae==0.0){ao=0.0}else{ao=ae/(ab*(+h[D>>3]-ag)-af*(+h[D+8>>3]-aj))}h[x>>3]=0.0;if(ah>0.0&ah<1.0){h[j+8>>3]=ah;ap=2}else{ap=1}if(ak>0.0&ak<1.0){h[j+(ap<<3)>>3]=ak;aq=ap+1|0}else{aq=ap}if(an>0.0&an<1.0){h[j+(aq<<3)>>3]=an;ar=aq+1|0}else{ar=aq}if(ao>0.0&ao<1.0){h[j+(ar<<3)>>3]=ao;as=ar+1|0}else{as=ar}h[j+(as<<3)>>3]=1.0;L16832:do{if((as|0)>1){W=1;while(1){Z=W+1|0;Y=(Z|0)<(as|0);if(!Y){at=0;break L16832}au=j+(W<<3)|0;av=Z;do{aj=+h[au>>3];aw=j+(av<<3)|0;af=+h[aw>>3];if(aj>af){h[au>>3]=af;h[aw>>3]=aj}av=av+1|0;}while((av|0)<(as|0));if(Y){W=Z}else{at=0;break}}}else{at=0}}while(0);while(1){if((at|0)>=(as|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break L16791}ax=+h[j+(at<<3)>>3];ay=gB(E,D,ax,J)|0;if((ay|0)==0){at=at+1|0}else{az=0;aA=at;break}}while(1){if((aA|0)>=(as|0)){break}U=aA+1|0;V=gB(E,D,+h[j+(U<<3)>>3],J)|0;if((V|0)==0){break}else{az=V;aA=U}}if((at|0)==(aA|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}if((ay|0)==2&(az|0)==2){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}U=(aA|0)==(as|0);if((at|0)==0){if(U){break L16789}V=gC(G,F,+h[j+(aA<<3)>>3])|0;W=c[228]|0;av=W;au=av+(V*48&-1)|0;aw=av+(F*48&-1)|0;aB=+h[av+(V*48&-1)+16>>3]>+h[av+(F*48&-1)+16>>3];av=aB?aw:au;V=aB?au:aw;aw=W;aj=+h[V>>3];af=+h[av>>3];W=aj>af;ag=+h[V+8>>3];ab=+h[av+8>>3];au=ag>ab;K=(V-aw|0)/48&-1;L=(av-aw|0)/48&-1;M=V;N=av;O=W?af:aj;P=W?aj:af;Q=au?ab:ag;R=au?ag:ab;S=+h[av+16>>3];break}av=gC(G,F,ax)|0;if(U){U=c[228]|0;au=U;W=au+(G*48&-1)|0;V=au+(av*48&-1)|0;aw=+h[au+(G*48&-1)+16>>3]>+h[au+(av*48&-1)+16>>3];au=aw?V:W;aB=aw?W:V;V=U;ab=+h[aB>>3];ag=+h[au>>3];U=ab>ag;af=+h[aB+8>>3];aj=+h[au+8>>3];W=af>aj;K=(aB-V|0)/48&-1;L=(au-V|0)/48&-1;M=aB;N=au;O=U?ag:ab;P=U?ab:ag;Q=W?aj:af;R=W?af:aj;S=+h[au+16>>3];break}au=gC(G,F,+h[j+(aA<<3)>>3])|0;if((au|0)==(G|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}c[g>>2]=c[(c[7628]|0)+(H*104&-1)+100>>2];gu(a,au,F,g);au=c[228]|0;W=au;U=W+(G*48&-1)|0;aB=W+(av*48&-1)|0;V=+h[W+(G*48&-1)+16>>3]>+h[W+(av*48&-1)+16>>3];av=V?aB:U;W=V?U:aB;aB=au;aj=+h[W>>3];af=+h[av>>3];au=aj>af;ag=+h[W+8>>3];ab=+h[av+8>>3];U=ag>ab;K=(W-aB|0)/48&-1;L=(av-aB|0)/48&-1;M=W;N=av;O=au?af:aj;P=au?aj:af;Q=U?ab:ag;R=U?ag:ab;S=+h[av+16>>3]}}while(0);J=c[I+(H*104&-1)+100>>2]|0;if((J|0)>-1){y=S;z=R;A=Q;B=P;C=O;D=N;E=M;F=L;G=K;H=J}else{X=12367;break}}if((X|0)==12367){aC=L;aD=K;aE=c[228]|0;break}H=c[225]|0;if((H|0)<=(u|0)){i=f;return}G=(aa|0)==0;F=H;while(1){if(G){X=12358;break}if((F|0)==0){if((u|0)<0){F=0;continue}else{X=12385;break}}else{H=F-1|0;c[225]=H;if((H|0)>(u|0)){F=H;continue}else{X=12382;break}}}if((X|0)==12358){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((X|0)==12385){i=f;return}else if((X|0)==12382){i=f;return}}else{aC=o;aD=m;aE=k}}while(0);k=aE;gw((c[11608]|0)+(a*20&-1)|0,k+(aD*48&-1)|0,k+(aC*48&-1)|0);aC=c[225]|0;if((aC|0)<=(u|0)){i=f;return}k=(c[228]|0)==0;aD=aC;while(1){if(k){X=12372;break}if((aD|0)==0){if((u|0)<0){aD=0;continue}else{X=12386;break}}else{aC=aD-1|0;c[225]=aC;if((aC|0)>(u|0)){aD=aC;continue}else{X=12384;break}}}if((X|0)==12384){i=f;return}else if((X|0)==12386){i=f;return}else if((X|0)==12372){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function gv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0.0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0.0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0.0,aW=0,aX=0.0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0;e=i;i=i+128|0;f=e|0;g=e+8|0;j=e+16|0;k=e+56|0;l=e+120|0;do{if((d|0)>0){m=0;n=0;o=0;p=-1;q=0;r=b;L16892:while(1){s=c[r+8>>2]|0;do{if((s|0)==4){t=p;u=o;w=n;x=m}else{y=c[r+260>>2]|0;z=c[y+8>>2]|0;if((a[r+236|0]&1)!=0){t=p;u=o;w=n;x=m;break}A=(z|0)>(p|0)?z:p;do{if((s|0)==2){if((y|0)==0){B=0}else{C=0;D=y;while(1){E=C+1|0;F=c[D>>2]|0;if((F|0)==0){B=E;break}else{C=E;D=F}}}G=B;H=aa(B,z)}else if((s|0)==3){D=c[r+252>>2]|0;if((c[r+244>>2]|0)!=0){G=D;H=aa(D,z);break}if((c[r+12>>2]|0)==225){G=D;H=z;break}if((y|0)==0){G=D;H=0;break}C=c[y>>2]|0;if((C|0)==0){G=D;H=z;break}else{I=z;J=C}while(1){C=I+(c[J+8>>2]|0)|0;F=c[J>>2]|0;if((F|0)==0){G=D;H=C;break}else{I=C;J=F}}}else{K=12401;break L16892}}while(0);y=c[r+12>>2]|0;if((y|0)==153|(y|0)==345|(y|0)==33|(y|0)==225){t=A;u=(H<<1)+o|0;w=H+n|0;x=m;break}else if((y|0)==352|(y|0)==51|(y|0)==177|(y|0)==193|(y|0)==209|(y|0)==1){y=H+o|0;D=(H-G|0)+n|0;if((c[r+244>>2]|0)==0){t=A;u=y;w=D;x=m;break}t=A;u=y;w=(((-(z<<1)|1)-G|0)+(H<<1)|0)+D|0;x=aa((G<<1)-2|0,z-1|0)+m|0;break}else{t=A;u=H+o|0;w=H+n|0;x=m;break}}}while(0);s=q+1|0;if((s|0)<(d|0)){m=x;n=w;o=u;p=t;q=s;r=c[r>>2]|0}else{break}}if((K|0)==12401){uk(164696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)<1){break}r=c[228]|0;if((r|0)==0){uk(203872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((u|0)==0){uu(r);c[228]=0;c[224]=0;c[225]=0}else{c[228]=db(r,aa(c[227]|0,u),150384)|0;c[224]=u}r=c[11608]|0;if((r|0)==0){uk(203872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==0){uu(r);c[11608]=0;c[11604]=0;c[11605]=0}else{c[11608]=db(r,aa(c[11607]|0,w),150384)|0;c[11604]=w}r=c[7628]|0;if((r|0)==0){uk(203872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((x|0)==0){uu(r);c[7628]=0;c[7624]=0;c[7625]=0}else{c[7628]=db(r,aa(c[7627]|0,x),150384)|0;c[7624]=x}r=t<<3;q=ut(r)|0;do{if((q|0)==0){gk();p=ut(r)|0;if((p|0)!=0){L=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155272,v)|0)}else{L=q}}while(0);q=L;p=ut(r)|0;do{if((p|0)==0){gk();o=ut(r)|0;if((o|0)!=0){M=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151696,v)|0)}else{M=p}}while(0);p=M;r=t*12&-1;o=ut(r)|0;do{if((o|0)==0){gk();n=ut(r)|0;if((n|0)!=0){N=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=149768,v)|0)}else{N=o}}while(0);o=N;n=ut(r)|0;do{if((n|0)==0){gk();m=ut(r)|0;if((m|0)!=0){O=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=147944,v)|0)}else{O=n}}while(0);n=j;r=j+4|0;m=j+8|0;s=j+16|0;D=j|0;y=k|0;F=k+8|0;C=k+16|0;E=k+24|0;P=k+32|0;Q=O;R=o;S=p;T=q;U=0;V=b;L16959:while(1){W=a[V+239|0]|0;X=V+24|0;L16961:do{if((c[V+8>>2]|0)==4){Y=T;Z=S;_=R;$=Q}else{ab=V+260|0;ac=c[(c[ab>>2]|0)+8>>2]|0;if((a[V+236|0]&1)!=0){Y=T;Z=S;_=R;$=Q;break}ad=c[V+240>>2]|0;ae=(ad|0)==-9;af=V+12|0;ag=c[af>>2]|0;ah=(ag|0)==352;ai=ah?-3:ae?-8:(c[9742]|0)+ad|0;aj=ah?-3:ae?-8:ad;do{if((ag|0)==225){c[V+32>>2]=-10;ad=V+152|0;if((c[V+144>>2]|0)==0){h[ad>>3]=1.0;h[V+168>>3]=0.0}ae=c[200]|0;h[64776+(ae*688&-1)>>3]=+((c[7939]|0)-(c[7938]|0)|0)/(+h[64672+(ae*688&-1)>>3]- +h[64664+(ae*688&-1)>>3]);c[12912]=c[V+184>>2];c[12910]=0;ak=+h[ad>>3];if(ak<=0.0){break}uE(n|0,0,40);c[r>>2]=2;c[m>>2]=2;h[s>>3]=ak;c[D>>2]=c[V+160>>2];fN(j,f,g,123984);h[6458]=+h[V+168>>3];h[6457]=+h[V+176>>3];c[12910]=~~+h[f>>3]}}while(0);ag=c[ab>>2]|0;if((c[V+244>>2]|0)!=0){if((c[ag+8>>2]|0)>0){A=0;do{z=A*3&-1;c[R+(z+2<<2)>>2]=-3;c[R+(z+1<<2)>>2]=-3;c[R+(z<<2)>>2]=-3;z=A<<1;c[T+((z|1)<<2)>>2]=-3;c[T+(z<<2)>>2]=-3;A=A+1|0;al=c[ab>>2]|0;}while((A|0)<(c[al+8>>2]|0));if((al|0)==0){Y=T;Z=S;_=R;$=Q;break}else{am=al}}else{am=ag}A=(W&1)!=0;ab=V+68|0;z=am;ad=Q;ae=R;ah=S;an=T;ao=0;while(1){ap=c[z+12>>2]|0;aq=z+8|0;if((c[aq>>2]|0)>0){ar=(ao|0)>0;as=0;do{at=ap+(as<<6)|0;au=c[228]|0;if((au|0)==0){K=12531;break L16959}av=c[225]|0;aw=c[224]|0;do{if((av|0)<(aw|0)){ax=au;ay=av}else{az=(c[226]|0)+aw|0;if((az|0)==0){uu(au);c[228]=0;c[224]=0;c[225]=0;ax=0;ay=0;break}else{aA=db(au,aa(c[227]|0,az),150384)|0;c[228]=aA;c[224]=az;ax=aA;ay=c[225]|0;break}}}while(0);au=c[227]|0;c[225]=ay+1;aw=aa(au,ay);au=ax+aw|0;c[ax+(aw+24|0)>>2]=X;av=at|0;if((c[av>>2]|0)<(c[9738]|0)){aA=ap+(as<<6)+24|0;ak=+h[aA>>3];aB=(+h[ap+(as<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aC=(+h[ap+(as<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aD=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aE=+h[404]+aB*+h[392]+aC*+h[396]+aD*+h[400];aF=+h[405]+aB*+h[393]+aC*+h[397]+aD*+h[401];aG=+h[406]+aB*+h[394]+aC*+h[398]+aD*+h[402];aH=aG==0.0?1.0e-5:aG;h[au>>3]=(+h[403]+aB*+h[391]+aC*+h[395]+aD*+h[399])/aH;h[ax+(aw+8|0)>>3]=aE/aH;h[ax+(aw+16|0)>>3]=aF/aH;az=ax+(aw+32|0)|0;h[az>>3]=ak;c[ax+(aw+40|0)>>2]=0;if(A){h[az>>3]=+h[ap+(as<<6)+32>>3];c[ab>>2]=-6}else{h[az>>3]=+h[aA>>3]}c[ax+(aw+44|0)>>2]=at;aI=(au-(c[228]|0)|0)/48&-1}else{h[ax+(aw+16|0)>>3]=-2.0;aI=-1}aw=as*3&-1;au=ad+(aw+2<<2)|0;c[au>>2]=-3;aA=ad+(aw+1<<2)|0;c[aA>>2]=-3;az=ad+(aw<<2)|0;c[az>>2]=-3;aJ=as<<1;aK=ah+((aJ|1)<<2)|0;c[aK>>2]=-3;aL=ah+(aJ<<2)|0;c[aL>>2]=-3;aM=c[af>>2]|0;do{if((aM|0)==352|(aM|0)==51|(aM|0)==177|(aM|0)==193|(aM|0)==209|(aM|0)==1){if((as|0)<=0){if(!(ar&(aI|0)>-1)){break}c[aA>>2]=gy(aI,1,ac,X,aj)|0;break}if((aI|0)<0){if(!(ar&(a[38944]^1))){break}aN=gy((c[225]|0)-1|0,3,ac,X,aj)|0;c[au>>2]=aN;if((aN|0)<=-2){break}aO=gz((c[225]|0)-1|0,3,ac)|0;aP=as-1|0;gA(aN,c[ad+((aP*3&-1)+1<<2)>>2]|0,aO,c[ah+((aP<<1|1)<<2)>>2]|0,aj,ai);gA(aN,c[ae+(aw<<2)>>2]|0,aO,c[an+(aJ<<2)>>2]|0,aj,ai);break}aO=gy(aI,0,ac,X,aj)|0;c[az>>2]=aO;if(!ar){break}aN=gy(aI,1,ac,X,aj)|0;c[aA>>2]=aN;aP=gy(aI,2,ac,X,aj)|0;c[au>>2]=aP;aQ=(aO|0)>-2;if((aP|0)>-2){if(aQ){aR=gz(aI,2,ac)|0;c[aL>>2]=aR;aS=as-1|0;gA(aO,c[ad+((aS*3&-1)+1<<2)>>2]|0,aR,c[ah+((aS<<1|1)<<2)>>2]|0,aj,ai)}if((aN|0)>-2){aS=gz(aI,0,ac)|0;c[aK>>2]=aS;gA(aN,c[ae+(aw<<2)>>2]|0,aS,c[an+(aJ<<2)>>2]|0,aj,ai)}gA(aP,aP,c[aL>>2]|0,c[aK>>2]|0,aj,ai);break}else{if(!aQ){break}if(!((aN|0)>-2&(a[38944]^1))){break}aQ=gy(aI,3,ac,X,aj)|0;c[au>>2]=aQ;if((aQ|0)<=-2){break}aP=gz(aI,1,ac)|0;c[aK>>2]=aP;c[aL>>2]=aP;if((a[(c[7628]|0)+(aP*104&-1)+96|0]&1)!=0){break}c[(c[11608]|0)+(aQ*20&-1)+8>>2]=ai;c[(c[11608]|0)+(aN*20&-1)+8>>2]=ai;c[(c[11608]|0)+(aO*20&-1)+8>>2]=ai;break}}else if((aM|0)==153|(aM|0)==345|(aM|0)==33){if((aI|0)<0){break}aO=ap+(as<<6)+24|0;ak=+h[aO>>3];h[aO>>3]=(aM|0)==33?0.0:+h[8083];aN=c[228]|0;if((aN|0)==0){K=12564;break L16959}aQ=c[225]|0;aP=c[224]|0;do{if((aQ|0)<(aP|0)){aT=aN;aU=aQ}else{aS=(c[226]|0)+aP|0;if((aS|0)==0){uu(aN);c[228]=0;c[224]=0;c[225]=0;aT=0;aU=0;break}else{aR=db(aN,aa(c[227]|0,aS),150384)|0;c[228]=aR;c[224]=aS;aT=aR;aU=c[225]|0;break}}}while(0);aN=c[227]|0;c[225]=aU+1;aP=aa(aN,aU);aN=aT+aP|0;c[aT+(aP+24|0)>>2]=X;if((c[av>>2]|0)>=(c[9738]|0)){h[aT+(aP+16|0)>>3]=-2.0;h[aO>>3]=ak;break}aH=+h[aO>>3];aF=(+h[ap+(as<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aE=(+h[ap+(as<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aD=(aH- +h[5279])*+h[2]+ +h[12]+-1.0;aC=+h[404]+aF*+h[392]+aE*+h[396]+aD*+h[400];aB=+h[405]+aF*+h[393]+aE*+h[397]+aD*+h[401];aG=+h[406]+aF*+h[394]+aE*+h[398]+aD*+h[402];aV=aG==0.0?1.0e-5:aG;h[aN>>3]=(+h[403]+aF*+h[391]+aE*+h[395]+aD*+h[399])/aV;h[aT+(aP+8|0)>>3]=aC/aV;h[aT+(aP+16|0)>>3]=aB/aV;aQ=aT+(aP+32|0)|0;h[aQ>>3]=aH;c[aT+(aP+40|0)>>2]=0;if(A){h[aQ>>3]=+h[ap+(as<<6)+32>>3];c[ab>>2]=-6}else{h[aQ>>3]=+h[aO>>3]}c[aT+(aP+44|0)>>2]=at;aP=aN-(c[228]|0)|0;h[aO>>3]=ak;if((aP|0)<=0){break}gy((aP|0)/48&-1,4,0,X,aj)}else{if((aI|0)<0){break}gy(aI,5,ac,X,aj)}}while(0);as=as+1|0;}while((as|0)<(c[aq>>2]|0))}aq=c[z>>2]|0;if((aq|0)==0){Y=ah;Z=an;_=ad;$=ae;break L16961}else{as=ah;ap=ad;ad=ae;ah=an;z=aq;ao=ao+1|0;an=as;ae=ap}}}if((ag|0)==0){Y=T;Z=S;_=R;$=Q;break}ae=X|0;an=V+224|0;ao=W&1;z=ao<<24>>24==0;ah=ao<<24>>24!=0;ao=V+68|0;ad=ag;while(1){ab=c[ad+12>>2]|0;do{if((c[af>>2]|0)==368){c[ae>>2]=1;c[y>>2]=0;A=c[c[an>>2]>>2]|0;if((A|0)==0){break}else{aW=A}do{h[F>>3]=+h[aW+24>>3];h[C>>3]=+h[aW+32>>3];h[E>>3]=+h[aW+40>>3];if((c[aW+72>>2]|0)==6){aX=+h[aW+80>>3]}else{aX=+(c[aW+76>>2]|0)}h[P>>3]=aX;A=c[228]|0;if((A|0)==0){K=12456;break L16959}ai=c[225]|0;ap=c[224]|0;do{if((ai|0)<(ap|0)){aY=A;aZ=ai}else{as=(c[226]|0)+ap|0;if((as|0)==0){uu(A);c[228]=0;c[224]=0;c[225]=0;aY=0;aZ=0;break}else{aq=db(A,aa(c[227]|0,as),150384)|0;c[228]=aq;c[224]=as;aY=aq;aZ=c[225]|0;break}}}while(0);A=c[227]|0;c[225]=aZ+1;ap=aa(A,aZ);A=aY+ap|0;c[aY+(ap+24|0)>>2]=X;do{if((c[y>>2]|0)<(c[9738]|0)){ak=+h[E>>3];aH=(+h[F>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aV=(+h[C>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aB=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aC=+h[404]+aH*+h[392]+aV*+h[396]+aB*+h[400];aD=+h[405]+aH*+h[393]+aV*+h[397]+aB*+h[401];aE=+h[406]+aH*+h[394]+aV*+h[398]+aB*+h[402];aF=aE==0.0?1.0e-5:aE;h[A>>3]=(+h[403]+aH*+h[391]+aV*+h[395]+aB*+h[399])/aF;h[aY+(ap+8|0)>>3]=aC/aF;h[aY+(ap+16|0)>>3]=aD/aF;ai=aY+(ap+32|0)|0;h[ai>>3]=ak;c[aY+(ap+40|0)>>2]=0;if(z){h[ai>>3]=+h[E>>3]}else{h[ai>>3]=+h[P>>3];c[ao>>2]=-6}c[aY+(ap+44|0)>>2]=k;ai=c[228]|0;aO=A-ai|0;aq=(aO|0)/48&-1;if((aO|0)<0){break}c[ai+(aq*48&-1)+40>>2]=aW;gy(aq,5,ac,X,aj)}else{h[aY+(ap+16|0)>>3]=-2.0}}while(0);aW=c[aW>>2]|0;}while((aW|0)!=0)}else{ap=ad+8|0;if((c[ap>>2]|0)<=0){break}A=ad|0;aq=-1;ai=0;while(1){aO=ab+(ai<<6)|0;as=c[228]|0;if((as|0)==0){K=12470;break L16959}ar=c[225]|0;at=c[224]|0;do{if((ar|0)<(at|0)){a_=as;a$=ar}else{av=(c[226]|0)+at|0;if((av|0)==0){uu(as);c[228]=0;c[224]=0;c[225]=0;a_=0;a$=0;break}else{aM=db(as,aa(c[227]|0,av),150384)|0;c[228]=aM;c[224]=av;a_=aM;a$=c[225]|0;break}}}while(0);as=c[227]|0;c[225]=a$+1;at=aa(as,a$);as=a_+at|0;c[a_+(at+24|0)>>2]=X;ar=aO|0;if((c[ar>>2]|0)<(c[9738]|0)){aM=ab+(ai<<6)+24|0;ak=+h[aM>>3];aF=(+h[ab+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aD=(+h[ab+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aC=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aB=+h[404]+aF*+h[392]+aD*+h[396]+aC*+h[400];aV=+h[405]+aF*+h[393]+aD*+h[397]+aC*+h[401];aH=+h[406]+aF*+h[394]+aD*+h[398]+aC*+h[402];aE=aH==0.0?1.0e-5:aH;h[as>>3]=(+h[403]+aF*+h[391]+aD*+h[395]+aC*+h[399])/aE;h[a_+(at+8|0)>>3]=aB/aE;h[a_+(at+16|0)>>3]=aV/aE;av=a_+(at+32|0)|0;h[av>>3]=ak;c[a_+(at+40|0)>>2]=0;if(ah){h[av>>3]=+h[ab+(ai<<6)+32>>3];c[ao>>2]=-6}else{h[av>>3]=+h[aM>>3]}c[a_+(at+44|0)>>2]=aO;a0=(as-(c[228]|0)|0)/48&-1}else{h[a_+(at+16|0)>>3]=-2.0;a0=-1}do{if((c[af>>2]|0)==225){at=c[(c[A>>2]|0)+12>>2]|0;as=at+(ai<<6)|0;aM=c[228]|0;if((aM|0)==0){K=12483;break L16959}av=c[225]|0;aL=c[224]|0;do{if((av|0)<(aL|0)){a1=aM;a2=av}else{aK=(c[226]|0)+aL|0;if((aK|0)==0){uu(aM);c[228]=0;c[224]=0;c[225]=0;a1=0;a2=0;break}else{au=db(aM,aa(c[227]|0,aK),150384)|0;c[228]=au;c[224]=aK;a1=au;a2=c[225]|0;break}}}while(0);aM=c[227]|0;c[225]=a2+1;aL=aa(aM,a2);c[a1+(aL+24|0)>>2]=0;if((c[as>>2]|0)<(c[9738]|0)){aM=at+(ai<<6)+24|0;ak=+h[aM>>3];aE=(+h[at+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aV=(+h[at+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aB=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aC=+h[404]+aE*+h[392]+aV*+h[396]+aB*+h[400];aD=+h[405]+aE*+h[393]+aV*+h[397]+aB*+h[401];aF=+h[406]+aE*+h[394]+aV*+h[398]+aB*+h[402];aH=aF==0.0?1.0e-5:aF;h[a1+aL>>3]=(+h[403]+aE*+h[391]+aV*+h[395]+aB*+h[399])/aH;h[a1+(aL+8|0)>>3]=aC/aH;h[a1+(aL+16|0)>>3]=aD/aH;av=a1+(aL+32|0)|0;h[av>>3]=ak;c[a1+(aL+40|0)>>2]=0;h[av>>3]=+h[aM>>3];c[a1+(aL+44|0)>>2]=as;break}else{h[a1+(aL+16|0)>>3]=-2.0;break}}}while(0);do{if((a0|0)>=0){aL=c[af>>2]|0;if((aL|0)==225){gy(a0,6,0,X,aj);break}else if((aL|0)==153|(aL|0)==345){aM=ab+(ai<<6)+24|0;ak=+h[aM>>3];h[aM>>3]=+h[8083];av=c[228]|0;if((av|0)==0){K=12497;break L16959}au=c[225]|0;aK=c[224]|0;do{if((au|0)<(aK|0)){a3=av;a4=au}else{aJ=(c[226]|0)+aK|0;if((aJ|0)==0){uu(av);c[228]=0;c[224]=0;c[225]=0;a3=0;a4=0;break}else{aw=db(av,aa(c[227]|0,aJ),150384)|0;c[228]=aw;c[224]=aJ;a3=aw;a4=c[225]|0;break}}}while(0);av=c[227]|0;c[225]=a4+1;aK=aa(av,a4);av=a3+aK|0;c[a3+(aK+24|0)>>2]=X;if((c[ar>>2]|0)>=(c[9738]|0)){h[a3+(aK+16|0)>>3]=-2.0;h[aM>>3]=ak;break}aH=+h[aM>>3];aD=(+h[ab+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aC=(+h[ab+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aB=(aH- +h[5279])*+h[2]+ +h[12]+-1.0;aV=+h[404]+aD*+h[392]+aC*+h[396]+aB*+h[400];aE=+h[405]+aD*+h[393]+aC*+h[397]+aB*+h[401];aF=+h[406]+aD*+h[394]+aC*+h[398]+aB*+h[402];aG=aF==0.0?1.0e-5:aF;h[av>>3]=(+h[403]+aD*+h[391]+aC*+h[395]+aB*+h[399])/aG;h[a3+(aK+8|0)>>3]=aV/aG;h[a3+(aK+16|0)>>3]=aE/aG;au=a3+(aK+32|0)|0;h[au>>3]=aH;c[a3+(aK+40|0)>>2]=0;if(ah){h[au>>3]=+h[ab+(ai<<6)+32>>3];c[ao>>2]=-6}else{h[au>>3]=+h[aM>>3]}c[a3+(aK+44|0)>>2]=aO;aK=av-(c[228]|0)|0;h[aM>>3]=ak;if((aK|0)<=0){break}gy((aK|0)/48&-1,4,0,X,aj);break}else if((aL|0)==33){aK=ab+(ai<<6)+24|0;aH=+h[aK>>3];h[aK>>3]=0.0;av=c[228]|0;if((av|0)==0){K=12510;break L16959}au=c[225]|0;as=c[224]|0;do{if((au|0)<(as|0)){a5=av;a6=au}else{at=(c[226]|0)+as|0;if((at|0)==0){uu(av);c[228]=0;c[224]=0;c[225]=0;a5=0;a6=0;break}else{aw=db(av,aa(c[227]|0,at),150384)|0;c[228]=aw;c[224]=at;a5=aw;a6=c[225]|0;break}}}while(0);av=c[227]|0;c[225]=a6+1;as=aa(av,a6);av=a5+as|0;c[a5+(as+24|0)>>2]=X;if((c[ar>>2]|0)>=(c[9738]|0)){h[a5+(as+16|0)>>3]=-2.0;h[aK>>3]=aH;break}ak=+h[aK>>3];aG=(+h[ab+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aE=(+h[ab+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aV=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aB=+h[404]+aG*+h[392]+aE*+h[396]+aV*+h[400];aC=+h[405]+aG*+h[393]+aE*+h[397]+aV*+h[401];aD=+h[406]+aG*+h[394]+aE*+h[398]+aV*+h[402];aF=aD==0.0?1.0e-5:aD;h[av>>3]=(+h[403]+aG*+h[391]+aE*+h[395]+aV*+h[399])/aF;h[a5+(as+8|0)>>3]=aB/aF;h[a5+(as+16|0)>>3]=aC/aF;au=a5+(as+32|0)|0;h[au>>3]=ak;c[a5+(as+40|0)>>2]=0;if(ah){h[au>>3]=+h[ab+(ai<<6)+32>>3];c[ao>>2]=-6}else{h[au>>3]=+h[aK>>3]}c[a5+(as+44|0)>>2]=aO;as=av-(c[228]|0)|0;h[aK>>3]=aH;if((as|0)<=0){break}gy((as|0)/48&-1,4,0,X,aj);break}else if((aL|0)==352|(aL|0)==51|(aL|0)==177|(aL|0)==193|(aL|0)==209|(aL|0)==1){if((aq|0)<=-1){break}gy(a0,0,0,X,aj);break}else{gy(a0,5,ac,X,aj);break}}}while(0);aO=ai+1|0;if((aO|0)<(c[ap>>2]|0)){aq=a0;ai=aO}else{break}}}}while(0);ab=c[ad>>2]|0;if((ab|0)==0){Y=T;Z=S;_=R;$=Q;break}else{ad=ab}}}}while(0);X=U+1|0;if((X|0)<(d|0)){Q=$;R=_;S=Z;T=Y;U=X;V=c[V>>2]|0}else{K=12581;break}}if((K|0)==12497){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12510){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12581){uu(Z);uu(Y);uu($);uu(_);break}else if((K|0)==12470){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12483){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12456){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12531){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12564){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);K=c[11605]|0;if((K|0)==0){uu(c[7628]|0);c[7628]=0;c[7624]=0;c[7625]=0;uu(c[11608]|0);c[11608]=0;c[11604]=0;c[11605]=0;uu(c[228]|0);c[228]=0;c[224]=0;c[225]=0;uk(176896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}_=(c[7625]|0)==0;$=K<<2;K=ut($)|0;do{if((K|0)==0){gk();Y=ut($)|0;if((Y|0)!=0){a7=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=168848,v)|0)}else{a7=K}}while(0);K=a7;$=c[11605]|0;if(($|0)>0){Y=0;while(1){c[K+(Y<<2)>>2]=Y;Z=Y+1|0;d=c[11605]|0;if((Z|0)<(d|0)){Y=Z}else{a8=d;break}}}else{a8=$}bM(a7|0,a8|0,4,6);a8=(c[11608]|0)+((c[K>>2]|0)*20&-1)|0;if((c[11605]|0)>1){$=1;Y=a8;while(1){d=K+($<<2)|0;c[Y+16>>2]=c[d>>2];Z=(c[11608]|0)+((c[d>>2]|0)*20&-1)|0;d=$+1|0;if((d|0)<(c[11605]|0)){$=d;Y=Z}else{a9=Z;break}}}else{a9=a8}c[a9+16>>2]=-1;c[11566]=c[K>>2];uu(a7);if(_){_=c[11566]|0;if((_|0)<=-1){i=e;return}a7=_;_=c[11608]|0;do{K=_;a9=K+(a7*20&-1)|0;a8=c[228]|0;gw(a9,a8+((c[a9>>2]|0)*48&-1)|0,a8+((c[K+(a7*20&-1)+4>>2]|0)*48&-1)|0);_=c[11608]|0;a7=c[_+((c[11566]|0)*20&-1)+16>>2]|0;c[11566]=a7;}while((a7|0)>-1);i=e;return}a7=c[7625]|0;if((a7|0)!=0){_=a7<<2;a7=ut(_)|0;do{if((a7|0)==0){gk();K=ut(_)|0;if((K|0)!=0){ba=K;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=172600,v)|0)}else{ba=a7}}while(0);a7=ba;_=c[7625]|0;if((_|0)>0){K=0;while(1){c[a7+(K<<2)>>2]=K;a8=K+1|0;a9=c[7625]|0;if((a8|0)<(a9|0)){K=a8}else{bb=a9;break}}}else{bb=_}bM(ba|0,bb|0,4,14);bb=(c[7628]|0)+((c[a7>>2]|0)*104&-1)|0;if((c[7625]|0)>1){_=1;K=bb;while(1){a9=a7+(_<<2)|0;c[K+100>>2]=c[a9>>2];a8=(c[7628]|0)+((c[a9>>2]|0)*104&-1)|0;a9=_+1|0;if((a9|0)<(c[7625]|0)){_=a9;K=a8}else{bc=a8;break}}}else{bc=bb}c[bc+100>>2]=-1;c[8022]=c[a7>>2];uu(ba)}c[l>>2]=c[8022];ba=c[11566]|0;if((ba|0)<=-1){i=e;return}a7=ba;ba=c[11608]|0;while(1){bc=ba;if((c[bc+(a7*20&-1)+8>>2]|0)==-3){bd=a7;be=ba}else{gu(a7,c[bc+(a7*20&-1)>>2]|0,c[bc+(a7*20&-1)+4>>2]|0,l);bd=c[11566]|0;be=c[11608]|0}bc=c[be+(bd*20&-1)+16>>2]|0;c[11566]=bc;if((bc|0)>-1){a7=bc;ba=be}else{break}}i=e;return}function gw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;i=i+72|0;g=f|0;j=f+16|0;k=b+12|0;l=c[k>>2]|0;m=g;n=l+40|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];n=j;o=l;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];c[n+32>>2]=c[o+32>>2];c[n+36>>2]=c[o+36>>2];c[n+40>>2]=c[o+40>>2];c[n+44>>2]=c[o+44>>2];c[n+48>>2]=c[o+48>>2];c[n+52>>2]=c[o+52>>2];p=j+8|0;q=((c[p>>2]|0)+11|0)>>>0<2;if(q){if((c[b+8>>2]|0)==-11){r=e}else{s=12616}}else{s=12616}if((s|0)==12616){r=d}t=~~+h[r+32>>3];do{if((c[g>>2]|0)==3){if((c[g+4>>2]|0)==-6){c[j+44>>2]=t;s=12651;break}if((c[b+8>>2]|0)==-8){s=12651;break}if((l|0)!=56296){s=12623;break}c[j+44>>2]=t}else{s=12623}}while(0);do{if((s|0)==12623){r=j+4|0;if((c[r>>2]|0)==-6){u=j|0;v=c[u>>2]|0;w=c[8798]|0;x=(w|0)>0;y=t;L17222:while(1){z=43264;while(1){A=c[z>>2]|0;if((A|0)==0){break}if((c[A+4>>2]|0)==(y|0)){break L17222}else{z=A|0}}B=y-1|0;if(!((y|0)>(w|0)&x)){s=12634;break}y=((B|0)%(w|0)&-1)+1|0}if((s|0)==12634){c[r>>2]=B;c[j+40>>2]=1;c[j+44>>2]=B;c[p>>2]=B;s=12651;break}w=A+8|0;c[n>>2]=c[w>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];c[n+16>>2]=c[w+16>>2];c[n+20>>2]=c[w+20>>2];c[n+24>>2]=c[w+24>>2];c[n+28>>2]=c[w+28>>2];c[n+32>>2]=c[w+32>>2];c[n+36>>2]=c[w+36>>2];c[n+40>>2]=c[w+40>>2];c[n+44>>2]=c[w+44>>2];c[n+48>>2]=c[w+48>>2];c[n+52>>2]=c[w+52>>2];c[u>>2]=v;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[r>>2]=y;a[j+32|0]=0;s=12651;break}if((a[j+32|0]&1)!=0){s=12651;break}c[j+40>>2]=1;c[j+44>>2]=c[r>>2];s=12651;break}if(q){c[p>>2]=c[b+8>>2];break}if((c[9742]|0)==0){break}if((c[l+40>>2]|0)==6){break}w=j|0;x=c[w>>2]|0;z=c[8798]|0;C=(z|0)>0;D=c[b+8>>2]|0;L17242:while(1){E=D+1|0;F=43264;while(1){G=c[F>>2]|0;if((G|0)==0){break}if((c[G+4>>2]|0)==(E|0)){s=12643;break L17242}else{F=G|0}}if(!((E|0)>(z|0)&C)){s=12649;break}D=(D|0)%(z|0)&-1}do{if((s|0)==12643){z=G+8|0;c[n>>2]=c[z>>2];c[n+4>>2]=c[z+4>>2];c[n+8>>2]=c[z+8>>2];c[n+12>>2]=c[z+12>>2];c[n+16>>2]=c[z+16>>2];c[n+20>>2]=c[z+20>>2];c[n+24>>2]=c[z+24>>2];c[n+28>>2]=c[z+28>>2];c[n+32>>2]=c[z+32>>2];c[n+36>>2]=c[z+36>>2];c[n+40>>2]=c[z+40>>2];c[n+44>>2]=c[z+44>>2];c[n+48>>2]=c[z+48>>2];c[n+52>>2]=c[z+52>>2];c[w>>2]=x;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[r>>2]=E;a[j+32|0]=0;break}if((a[j+32|0]&1)!=0){break}c[j+40>>2]=1;c[j+44>>2]=c[r>>2]}else if((s|0)==12649){c[r>>2]=D;c[j+40>>2]=1;c[j+44>>2]=D;c[p>>2]=D}}while(0);D=j+40|0;c[m>>2]=c[D>>2];c[m+4>>2]=c[D+4>>2];c[m+8>>2]=c[D+8>>2];c[m+12>>2]=c[D+12>>2];s=12651}}while(0);do{if((s|0)==12651){E=j+40|0;c[m>>2]=c[E>>2];c[m+4>>2]=c[E+4>>2];c[m+8>>2]=c[E+8>>2];c[m+12>>2]=c[E+12>>2];c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];c[n+32>>2]=c[o+32>>2];c[n+36>>2]=c[o+36>>2];c[E>>2]=c[m>>2];c[E+4>>2]=c[m+4>>2];c[E+8>>2]=c[m+8>>2];c[E+12>>2]=c[m+12>>2];a[j+32|0]=1;if(!q){break}c[p>>2]=c[b+8>>2]}}while(0);un(d,e,j,g);if((c[c[k>>2]>>2]|0)==0){i=f;return}gx(d);gx(e);i=f;return}function gx(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0;d=i;i=i+120|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=~~(+h[b>>3]*+(c[180]|0))+(c[186]|0)|0;m=~~(+h[b+8>>3]*+(c[40]|0))+(c[46]|0)|0;n=b+24|0;o=c[n>>2]|0;if((o|0)==0){i=d;return}if((c[o+8>>2]|0)<=-2){i=d;return}p=c[13542]|0;do{if((p|0)!=0){q=(c[p>>2]|0)>(l|0)&1;r=(c[p+4>>2]|0)<(l|0)?q|2:q;q=(c[p+8>>2]|0)>(m|0)?r|4:r;if((((c[p+12>>2]|0)<(m|0)?q|8:q)|0)==0){break}i=d;return}}while(0);p=c[b+40>>2]|0;if((p|0)!=0){fp(l,m,p);c[n>>2]=0;i=d;return}p=c[o+40>>2]|0;do{if((p|0)==6){s=+h[b+32>>3];q=c[34]|0;r=(a[66852]&1)==0;do{if((a[64788+(q*688&-1)|0]&1)==0){if(r){t=s;break}if(s>0.0){u=+_(+s);t=u/+h[8358];break}else{t=+h[8341];break}}else{if(r){t=+Z(+(s*+h[64800+(q*688&-1)>>3]));break}if(+h[64792+(q*688&-1)>>3]==+h[8357]){t=s;break}t=s*+h[64800+(q*688&-1)>>3]/+h[8358]}}while(0);s=+h[8341];do{if(s<t){u=+h[8342];if(u<=t){v=+((a[20668]|0)==112&1|0);break}w=(t-s)/(u-s);if((a[20668]|0)==112){v=w;break}v=1.0-w}else{v=+((a[20668]|0)!=112&1|0)}}while(0);q=(c[3524]|0)+144|0;if((c[q>>2]|0)==0){break}c[f>>2]=5;h[f+8>>3]=v;c[f+4>>2]=0;cM[c[q>>2]&511](f)}else if((p|0)==2){if((c[o+44>>2]|0)!=-6){break}q=k;r=o;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[q+16>>2]=c[r+16>>2];c[q+20>>2]=c[r+20>>2];c[q+24>>2]=c[r+24>>2];c[q+28>>2]=c[r+28>>2];c[q+32>>2]=c[r+32>>2];c[q+36>>2]=c[r+36>>2];c[q+40>>2]=c[r+40>>2];c[q+44>>2]=c[r+44>>2];c[q+48>>2]=c[r+48>>2];c[q+52>>2]=c[r+52>>2];r=k|0;x=c[r>>2]|0;y=c[8798]|0;z=(y|0)>0;A=~~+h[b+32>>3];L17305:while(1){B=43264;while(1){C=c[B>>2]|0;if((C|0)==0){break}if((c[C+4>>2]|0)==(A|0)){D=12670;break L17305}else{B=C|0}}E=A-1|0;if(!((A|0)>(y|0)&z)){D=12676;break}A=((E|0)%(y|0)&-1)+1|0}do{if((D|0)==12670){y=C+8|0;c[q>>2]=c[y>>2];c[q+4>>2]=c[y+4>>2];c[q+8>>2]=c[y+8>>2];c[q+12>>2]=c[y+12>>2];c[q+16>>2]=c[y+16>>2];c[q+20>>2]=c[y+20>>2];c[q+24>>2]=c[y+24>>2];c[q+28>>2]=c[y+28>>2];c[q+32>>2]=c[y+32>>2];c[q+36>>2]=c[y+36>>2];c[q+40>>2]=c[y+40>>2];c[q+44>>2]=c[y+44>>2];c[q+48>>2]=c[y+48>>2];c[q+52>>2]=c[y+52>>2];c[r>>2]=x;y=c[3524]|0;if((c[y+96>>2]&1024|0)!=0){c[k+4>>2]=A;a[k+32|0]=0;F=y;break}if((a[k+32|0]&1)!=0){F=y;break}c[k+40>>2]=1;c[k+44>>2]=c[k+4>>2];F=y}else if((D|0)==12676){c[k+4>>2]=E;c[k+40>>2]=1;c[k+44>>2]=E;c[k+8>>2]=E;F=c[3524]|0}}while(0);fn(k+40|0,F)}else if((p|0)==3){if((c[o+44>>2]|0)==-6){A=(c[3524]|0)+144|0;if((c[A>>2]|0)==0){break}x=~~+h[b+32>>3];c[j>>2]=3;c[j+4>>2]=x;h[j+8>>3]=0.0;cM[c[A>>2]&511](j);break}else{A=c[o+44>>2]|0;x=(c[3524]|0)+144|0;if((c[x>>2]|0)==0){break}c[g>>2]=3;c[g+4>>2]=A;h[g+8>>3]=0.0;cM[c[x>>2]&511](g);break}}else if((p|0)==4){s=+h[b+32>>3];w=+h[8341];do{if(w<s){u=+h[8342];if(u<=s){G=+((a[20668]|0)==112&1|0);break}H=(s-w)/(u-w);if((a[20668]|0)==112){G=H;break}G=1.0-H}else{G=+((a[20668]|0)!=112&1|0)}}while(0);x=(c[3524]|0)+144|0;if((c[x>>2]|0)==0){break}c[e>>2]=5;h[e+8>>3]=G;c[e+4>>2]=0;cM[c[x>>2]&511](e)}}while(0);e=c[n>>2]|0;if(+h[e+24>>3]==-3.0){cK[c[(c[3524]|0)+92>>2]&63](+h[3817]*+h[(c[b+44>>2]|0)+48>>3]);I=c[n>>2]|0}else{I=e}cR[c[(c[3524]|0)+80>>2]&127](l,m,c[I+8>>2]|0);c[n>>2]=0;i=d;return}function gy(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;j=c[228]|0;k=j;l=k+(a*48&-1)|0;m=1<<b;if((b|0)==0){n=m;o=k+((a-1|0)*48&-1)|0;p=l}else if((b|0)==6){n=0;o=k+((a+1|0)*48&-1)|0;p=l}else if((b|0)==5){n=0;o=l;p=l}else if((b|0)==3){n=m>>>1;o=k+((a-d|0)*48&-1)|0;p=k+((a-1|0)*48&-1)|0}else if((b|0)==4){n=0;o=k+((a-1|0)*48&-1)|0;p=l}else if((b|0)==2){n=m;o=k+(((a-1|0)-d|0)*48&-1)|0;p=l}else if((b|0)==1){n=m;o=k+((a-d|0)*48&-1)|0;p=l}else{n=m;o=0;p=l}l=(o-j|0)/48&-1;if(+h[p+16>>3]==-2.0){q=-2;i=g;return q|0}if(+h[o+16>>3]==-2.0){q=-2;i=g;return q|0}if((n|0)==0){r=f}else{r=(c[9734]&n|0)==0?-3:f}f=c[11608]|0;if((f|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}n=c[11605]|0;o=c[11604]|0;do{if((n|0)<(o|0)){s=f;t=n}else{p=(c[11606]|0)+o|0;if((p|0)==0){uu(f);c[11608]=0;c[11604]=0;c[11605]=0;s=0;t=0;break}else{j=db(f,aa(c[11607]|0,p),150384)|0;c[11608]=j;c[11604]=p;s=j;t=c[11605]|0;break}}}while(0);f=c[11607]|0;c[11605]=t+1;o=aa(f,t);t=s+o|0;f=c[228]|0;n=s+(o+8|0)|0;c[n>>2]=r;c[s+(o+12|0)>>2]=e;c[s+(o+16|0)>>2]=-1;r=t;do{if(+h[f+(a*48&-1)+16>>3]<+h[f+(l*48&-1)+16>>3]){c[r>>2]=l;c[s+(o+4|0)>>2]=a;if((c[e+8>>2]|0)!=-10){break}c[n>>2]=-11}else{c[r>>2]=a;c[s+(o+4|0)>>2]=l;if((c[e+8>>2]|0)!=-10){break}c[n>>2]=-10}}while(0);q=(t-(c[11608]|0)|0)/20&-1;i=g;return q|0}function gz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0,R=0.0,S=0.0,T=0,U=0.0,V=0.0,W=0,X=0.0,Y=0,Z=0.0,_=0.0,$=0.0,ab=0,ac=0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0,aj=0.0;f=i;if((d|0)==2){j=b-1|0;k=j-e|0;l=j;m=b}else if((d|0)==0){j=b-e|0;k=j;l=j-1|0;m=b}else if((d|0)==3){j=b-1|0;k=b-e|0;l=j-e|0;m=j}else if((d|0)==1){k=b-e|0;l=b-1|0;m=b}else{k=0;l=0;m=0}b=c[228]|0;n=+h[b+(m*48&-1)+16>>3];if(n==-2.0){o=-2;i=f;return o|0}p=+h[b+(l*48&-1)+16>>3];if(p==-2.0){o=-2;i=f;return o|0}q=+h[b+(k*48&-1)+16>>3];if(q==-2.0){o=-2;i=f;return o|0}r=+h[b+(m*48&-1)>>3];s=+h[b+(l*48&-1)>>3];t=+P(+(r-s));u=+h[b+(m*48&-1)+8>>3];w=+h[b+(l*48&-1)+8>>3];x=t+ +P(+(u-w));if(x+ +P(+(n-p))+-1.0e-5<=0.0){o=-2;i=f;return o|0}x=+h[b+(k*48&-1)>>3];t=+P(+(s-x));s=+h[b+(k*48&-1)+8>>3];y=t+ +P(+(w-s));if(y+ +P(+(p-q))+-1.0e-5<=0.0){o=-2;i=f;return o|0}p=+P(+(x-r));r=p+ +P(+(s-u));if(r+ +P(+(q-n))+-1.0e-5<=0.0){o=-2;i=f;return o|0}b=c[7628]|0;if((b|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}e=c[7625]|0;d=c[7624]|0;do{if((e|0)<(d|0)){z=b;A=e}else{j=(c[7626]|0)+d|0;if((j|0)==0){uu(b);c[7628]=0;c[7624]=0;c[7625]=0;z=0;A=0;break}else{B=db(b,aa(c[7627]|0,j),150384)|0;c[7628]=B;c[7624]=j;z=B;A=c[7625]|0;break}}}while(0);b=c[7627]|0;c[7625]=A+1;d=aa(b,A);A=z+d|0;c[A>>2]=m;c[z+(d+4|0)>>2]=l;c[z+(d+8|0)>>2]=k;c[z+(d+100|0)>>2]=-1;n=+h[(c[228]|0)+(m*48&-1)>>3];b=z+(d+16|0)|0;h[b>>3]=n;e=c[228]|0;q=+h[e+(l*48&-1)>>3];if(q<n){h[b>>3]=q;C=c[228]|0;D=q}else{C=e;D=n}n=+h[C+(k*48&-1)>>3];if(n<D){h[b>>3]=n;E=n}else{E=D}b=A;D=+g[3534];n=-0.0-D;if(E<n){a[46904]=1}E=+h[(c[228]|0)+(m*48&-1)+8>>3];C=z+(d+32|0)|0;h[C>>3]=E;e=c[228]|0;q=+h[e+(l*48&-1)+8>>3];if(q<E){h[C>>3]=q;F=c[228]|0;G=q}else{F=e;G=E}E=+h[F+(k*48&-1)+8>>3];if(E<G){h[C>>3]=E;H=E}else{H=G}if(H<n){a[46904]=1}H=+h[(c[228]|0)+(m*48&-1)+16>>3];C=z+(d+48|0)|0;h[C>>3]=H;F=c[228]|0;G=+h[F+(l*48&-1)+16>>3];if(G<H){h[C>>3]=G;I=c[228]|0;J=G}else{I=F;J=H}H=+h[I+(k*48&-1)+16>>3];if(H<J){h[C>>3]=H;K=H}else{K=J}if(K<n){a[46904]=1}n=+h[(c[228]|0)+(m*48&-1)>>3];C=z+(d+24|0)|0;h[C>>3]=n;I=c[228]|0;K=+h[I+(l*48&-1)>>3];if(K>n){h[C>>3]=K;L=c[228]|0;M=K}else{L=I;M=n}n=+h[L+(k*48&-1)>>3];if(n>M){h[C>>3]=n;N=n}else{N=M}M=D;if(N>M){a[46904]=1}N=+h[(c[228]|0)+(m*48&-1)+8>>3];C=z+(d+40|0)|0;h[C>>3]=N;L=c[228]|0;D=+h[L+(l*48&-1)+8>>3];if(D>N){h[C>>3]=D;O=c[228]|0;R=D}else{O=L;R=N}N=+h[O+(k*48&-1)+8>>3];if(N>R){h[C>>3]=N;S=N}else{S=R}if(S>M){a[46904]=1}S=+h[(c[228]|0)+(m*48&-1)+16>>3];C=z+(d+56|0)|0;h[C>>3]=S;O=c[228]|0;R=+h[O+(l*48&-1)+16>>3];if(R>S){h[C>>3]=R;T=c[228]|0;U=R}else{T=O;U=S}S=+h[T+(k*48&-1)+16>>3];if(S>U){h[C>>3]=S;V=S}else{V=U}if(V>M){a[46904]=1}C=z+(d+64|0)|0;T=c[228]|0;O=T+(k*48&-1)+8|0;L=T+(m*48&-1)+8|0;I=T+(k*48&-1)+16|0;F=T+(m*48&-1)+16|0;M=(+h[O>>3]- +h[L>>3])*(+h[I>>3]+ +h[F>>3]);h[C>>3]=M;e=T+(k*48&-1)|0;B=T+(m*48&-1)|0;V=(+h[I>>3]- +h[F>>3])*(+h[e>>3]+ +h[B>>3]);I=z+(d+72|0)|0;h[I>>3]=V;U=(+h[e>>3]- +h[B>>3])*(+h[O>>3]+ +h[L>>3]);O=z+(d+80|0)|0;h[O>>3]=U;e=c[228]|0;T=e+(l*48&-1)|0;j=e+(l*48&-1)+8|0;W=e+(l*48&-1)+16|0;S=M+(+h[L>>3]- +h[j>>3])*(+h[F>>3]+ +h[W>>3]);h[C>>3]=S;l=T|0;M=V+(+h[F>>3]- +h[W>>3])*(+h[B>>3]+ +h[l>>3]);h[I>>3]=M;V=U+(+h[B>>3]- +h[l>>3])*(+h[L>>3]+ +h[j>>3]);h[O>>3]=V;L=c[228]|0;B=L+(k*48&-1)|0;F=L+(k*48&-1)+8|0;e=L+(k*48&-1)+16|0;U=S+(+h[j>>3]- +h[F>>3])*(+h[W>>3]+ +h[e>>3]);h[C>>3]=U;k=B|0;S=M+(+h[W>>3]- +h[e>>3])*(+h[l>>3]+ +h[k>>3]);h[I>>3]=S;M=V+(+h[l>>3]- +h[k>>3])*(+h[j>>3]+ +h[F>>3]);h[O>>3]=M;V=+Q(+(U*U+S*S+M*M));if(V+-1.0e-5>0.0){X=V;Y=T;Z=M;_=U;$=S}else{T=c[228]|0;F=T+(m*48&-1)|0;j=F|0;k=T+(m*48&-1)+8|0;l=T+(m*48&-1)+16|0;m=1;e=B;while(1){if((m|0)>=3){ab=12789;break}B=c[b+(m<<2)>>2]|0;W=T+(B*48&-1)|0;S=+h[j>>3];U=+P(+(S- +h[W>>3]));M=+h[k>>3];V=U+ +P(+(M- +h[T+(B*48&-1)+8>>3]));U=+h[l>>3];if(V+ +P(+(U- +h[T+(B*48&-1)+16>>3]))+-1.0e-5>0.0){ac=W;ad=S;ae=M;af=U;break}else{m=m+1|0;e=W}}if((ab|0)==12789){ac=e;ad=+h[j>>3];ae=+h[k>>3];af=+h[l>>3]}e=ac+8|0;U=+h[e>>3];if(+P(+(ae-U))<1.0e-5){ag=ae+1.0;ah=ad}else{ag=ae;ah=ad+1.0}ab=ac+16|0;ad=+h[ab>>3];M=ag*(af-ad)+((af-af)*U+ae*(ad-af));h[C>>3]=M;m=ac|0;ad=+h[m>>3];ae=+h[j>>3];U=af*(ae-ad)+(+h[l>>3]*(ad-ah)+ +h[ab>>3]*(ah-ae));h[I>>3]=U;ae=+h[e>>3];ad=+h[k>>3];af=ah*(ad-ae)+(+h[j>>3]*(ae-ag)+ +h[m>>3]*(ag-ad));h[O>>3]=af;X=+Q(+(M*M+U*U+af*af));Y=F;Z=af;_=M;$=U}if(Z<0.0){ai=0;aj=X*-1.0}else{ai=1;aj=X}X=_/aj;h[C>>3]=X;_=$/aj;h[I>>3]=_;$=Z/aj;h[O>>3]=$;h[z+(d+88|0)>>3]=+h[Y>>3]*(-0.0-X)-_*+h[Y+8>>3]-$*+h[Y+16>>3];a[z+(d+96|0)|0]=ai;o=(A-(c[7628]|0)|0)/104&-1;i=f;return o|0}function gA(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;if((e|0)<=-2){i=k;return}l=(f|0)<-1?e:f;f=c[7628]|0;m=(a[f+(l*104&-1)+96|0]&1)<<1|a[f+(e*104&-1)+96|0]&1;do{if((m|0)==0){f=c[11608]|0;n=f+(b*20&-1)+8|0;if((c[n>>2]|0)==-3){o=f}else{c[n>>2]=j;o=c[11608]|0}n=o+(d*20&-1)+8|0;if((c[n>>2]|0)==-3){i=k;return}c[n>>2]=j;i=k;return}else if((m|0)==2){n=(c[11608]|0)+(b*20&-1)+8|0;if((c[n>>2]|0)==-3){break}c[n>>2]=j}else if((m|0)!=1){i=k;return}}while(0);m=c[11608]|0;do{if(!((b|0)==(d|0)&(a[38960]^1))){if((c[m+(d*20&-1)+8>>2]|0)!=-3){break}i=k;return}}while(0);b=m;m=c[b+(d*20&-1)>>2]|0;o=c[b+(d*20&-1)+4>>2]|0;n=c[7628]|0;f=c[n+(e*104&-1)>>2]|0;p=c[n+(e*104&-1)+4>>2]|0;do{if((f|0)==(m|0)){q=c[n+(e*104&-1)+8>>2]|0;if((p|0)==(o|0)){r=q;break}r=(q|0)==(o|0)?p:-1}else{if((p|0)==(m|0)){q=c[n+(e*104&-1)+8>>2]|0;if((f|0)==(o|0)){r=q;break}r=(q|0)==(o|0)?f:-1;break}if((c[n+(e*104&-1)+8>>2]|0)!=(m|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=143816,v)|0)}if((f|0)==(o|0)){r=p;break}r=(p|0)==(o|0)?f:-1}}while(0);if((r|0)<=-1){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=143816,v)|0)}f=c[228]|0;if(+h[n+(l*104&-1)+88>>3]+(+h[f+(r*48&-1)>>3]*+h[n+(l*104&-1)+64>>3]+ +h[f+(r*48&-1)+8>>3]*+h[n+(l*104&-1)+72>>3]+ +h[f+(r*48&-1)+16>>3]*+h[n+(l*104&-1)+80>>3])>0.0){c[b+(d*20&-1)+8>>2]=(a[n+(e*104&-1)+96|0]&1)!=0?g:j;i=k;return}else{c[b+(d*20&-1)+8>>2]=(a[n+(l*104&-1)+96|0]&1)!=0?g:j;i=k;return}}function gB(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;f=+h[e+80>>3];if(f==0.0){g=0;return g|0}i=c[228]|0;j=c[e>>2]|0;k=c[e+4>>2]|0;l=c[e+8>>2]|0;m=+h[a>>3];n=m+(+h[b>>3]-m)*d;m=+h[a+8>>3];o=m+(+h[b+8>>3]-m)*d;m=+h[a+16>>3];p=m+(+h[b+16>>3]-m)*d;d=+h[i+(j*48&-1)>>3];m=+h[i+(j*48&-1)+8>>3];q=+h[i+(k*48&-1)>>3];r=+h[i+(k*48&-1)+8>>3];s=(o-m)*(q-d)-(n-d)*(r-m);t=+h[i+(l*48&-1)>>3];u=+h[i+(l*48&-1)+8>>3];v=(o-r)*(t-q)-(n-q)*(u-r);r=(d-t)*(o-u)-(n-t)*(m-u);do{if(s<-1.0e-5|v<-1.0e-5|r<-1.0e-5){if(s+-1.0e-5>0.0){g=0;return g|0}if(v+-1.0e-5>0.0){g=0;return g|0}if(r+-1.0e-5>0.0){g=0}else{break}return g|0}}while(0);r=(-0.0-(+h[e+88>>3]+(n*+h[e+64>>3]+o*+h[e+72>>3])))/f;if(r<p+-1.0e-5){g=0;return g|0}g=p<r+-1.0e-5?1:2;return g|0}function gC(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;e=i;f=c[228]|0;if((f|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}g=c[225]|0;j=c[224]|0;do{if((g|0)<(j|0)){k=f;l=g}else{m=(c[226]|0)+j|0;if((m|0)==0){uu(f);c[228]=0;c[224]=0;c[225]=0;k=0;l=0;break}else{n=db(f,aa(c[227]|0,m),150384)|0;c[228]=n;c[224]=m;k=n;l=c[225]|0;break}}}while(0);f=c[227]|0;c[225]=l+1;j=aa(f,l);l=k+j|0;f=k;o=+h[f+(a*48&-1)>>3];p=o+(+h[f+(b*48&-1)>>3]-o)*d;h[l>>3]=p;f=c[228]|0;o=+h[f+(a*48&-1)+8>>3];q=o+(+h[f+(b*48&-1)+8>>3]-o)*d;h[k+(j+8|0)>>3]=q;f=c[228]|0;o=+h[f+(a*48&-1)+16>>3];r=o+(+h[f+(b*48&-1)+16>>3]-o)*d;h[k+(j+16|0)>>3]=r;f=c[228]|0;o=+h[f+(a*48&-1)+32>>3];h[k+(j+32|0)>>3]=o+(+h[f+(b*48&-1)+32>>3]-o)*d;c[k+(j+24|0)>>2]=0;j=c[228]|0;k=j;d=+P(+(p- +h[k+(a*48&-1)>>3]));o=d+ +P(+(q- +h[k+(a*48&-1)+8>>3]));if(o+ +P(+(r- +h[k+(a*48&-1)+16>>3]))+-1.0e-5<=0.0){if((j|0)==0){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=c[225]|0;if((f|0)==0){s=a;i=e;return s|0}c[225]=f-1;s=a;i=e;return s|0}o=+P(+(p- +h[k+(b*48&-1)>>3]));p=o+ +P(+(q- +h[k+(b*48&-1)+8>>3]));if(p+ +P(+(r- +h[k+(b*48&-1)+16>>3]))+-1.0e-5>0.0){s=(l-j|0)/48&-1;i=e;return s|0}j=c[225]|0;if((j|0)==0){s=b;i=e;return s|0}c[225]=j-1;s=b;i=e;return s|0}function gD(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[b>>2]|0;if((a[e+8|0]&1)!=0){uf(-1,72648,(v=i,i=i+8|0,c[v>>2]=c[e+4>>2],v)|0)}b=e+16|0;f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f+1|0;c[6354]=g;f=14296+(g*24&-1)|0;g=b;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];if((c[b>>2]|0)!=3){i=d;return}b=c[e+24>>2]|0;if((b|0)==0){i=d;return}e=bP(b|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;i=d;return}function gE(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d+1|0;c[6354]=e;d=14296+(e*24&-1)|0;e=a;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[d+16>>2]=c[e+16>>2];c[d+20>>2]=c[e+20>>2];if((c[a>>2]|0)!=3){i=b;return}e=c[a+8>>2]|0;if((e|0)==0){i=b;return}a=bP(e|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=a;i=b;return}function gF(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;a=d+24|0;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;f=a;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];if((c[a>>2]|0)!=3){i=b;return}a=c[d+32>>2]|0;if((a|0)==0){i=b;return}d=bP(a|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=d;i=b;return}function gG(a){a=a|0;var b=0;a=i;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=b-1;if((c[14296+(b*24&-1)>>2]|0)!=3){i=a;return}uu(c[14304+(b*24&-1)>>2]|0);i=a;return}function gH(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;a=d+48|0;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;f=a;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];if((c[a>>2]|0)!=3){i=b;return}a=c[d+56>>2]|0;if((a|0)==0){i=b;return}d=bP(a|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=d;i=b;return}function gI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=c[14304+(d*24&-1)>>2]|0;g=c[a>>2]|0;a=g+24+(f*24&-1)|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d;e=14296+(d*24&-1)|0;d=a;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];c[e+16>>2]=c[d+16>>2];c[e+20>>2]=c[d+20>>2];if((c[a>>2]|0)!=3){i=b;return}a=c[g+24+(f*24&-1)+8>>2]|0;if((a|0)==0){i=b;return}f=bP(a|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=f;i=b;return}function gJ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;i=i+24|0;d=c[a>>2]|0;a=d+8|0;if((c[a>>2]|0)==0){uf(-1,168872,(v=i,i=i+8|0,c[v>>2]=c[d+4>>2],v)|0)}e=d+24|0;f=b|0;g=e;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];h=c[6354]|0;if((h|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=h-1;j=14296+(h*24&-1)|0;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];c[g+16>>2]=c[j+16>>2];c[g+20>>2]=c[j+20>>2];j=c[d+16>>2]|0;if((j|0)!=1){uf(-1,138760,(v=i,i=i+16|0,c[v>>2]=c[d+4>>2],c[v+8>>2]=j,v)|0)}j=c[6932]|0;c[6932]=j+1;if((j|0)>250){uf(-1,137088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[a>>2]|0;a=c[9340]|0;h=c[j>>2]|0;k=0;while(1){if((k|0)>=(h|0)){break}l=c[j+8+(k<<5)>>2]|0;c[9340]=1;cM[c[41164+(l<<3)>>2]&511](j+8+(k<<5)+8|0);m=c[9340]|0;if((l-37|0)>>>0<4|(m|0)==1){k=m+k|0}else{n=12954;break}}if((n|0)==12954){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0)}c[9340]=a;a=e|0;if((c[a>>2]|0)!=3){c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];o=c[6932]|0;p=o-1|0;c[6932]=p;i=b;return}uu(c[d+32>>2]|0);c[a>>2]=1;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];o=c[6932]|0;p=o-1|0;c[6932]=p;i=b;return}function gK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;i=i+288|0;d=b|0;e=c[a>>2]|0;a=e+8|0;if((c[a>>2]|0)==0){uf(-1,168872,(v=i,i=i+8|0,c[v>>2]=c[e+4>>2],v)|0)}f=d;g=e+24|0;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];f=d+24|0;h=e+48|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+48|0;f=e+72|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+72|0;h=e+96|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+96|0;f=e+120|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+120|0;h=e+144|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+144|0;f=e+168|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+168|0;h=e+192|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+192|0;f=e+216|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+216|0;h=e+240|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+240|0;f=e+264|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+264|0;h=e+288|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=c[6354]|0;if((h|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=h-1|0;c[6354]=f;j=c[14304+(h*24&-1)>>2]|0;h=c[e+16>>2]|0;if((j|0)!=(h|0)){uf(-1,123608,(v=i,i=i+24|0,c[v>>2]=c[e+4>>2],c[v+8>>2]=h,c[v+16>>2]=(h|0)==1?0:115,v)|0)}L17671:do{if((j|0)>12){h=j-12|0;if((h|0)>0){k=0;l=f}else{m=11;n=f;o=12972;break}while(1){if((l|0)<0){break}p=l-1|0;c[6354]=p;q=14296+(l*24&-1)|0;c[g>>2]=c[q>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];c[g+16>>2]=c[q+16>>2];c[g+20>>2]=c[q+20>>2];q=k+1|0;if((q|0)<(h|0)){k=q;l=p}else{m=11;n=p;o=12972;break L17671}}uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h=j-1|0;if((h|0)>-1){m=h;n=f;o=12972}}}while(0);L17678:do{if((o|0)==12972){while(1){o=0;if((n|0)<0){break}f=n-1|0;c[6354]=f;j=e+24+(m*24&-1)|0;l=14296+(n*24&-1)|0;c[j>>2]=c[l>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];c[j+16>>2]=c[l+16>>2];c[j+20>>2]=c[l+20>>2];if((m|0)>0){m=m-1|0;n=f;o=12972}else{break L17678}}uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);n=c[6932]|0;c[6932]=n+1;if((n|0)>250){uf(-1,137088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=c[a>>2]|0;a=c[9340]|0;m=c[n>>2]|0;f=0;while(1){if((f|0)>=(m|0)){break}l=c[n+8+(f<<5)>>2]|0;c[9340]=1;cM[c[41164+(l<<3)>>2]&511](n+8+(f<<5)+8|0);j=c[9340]|0;if((l-37|0)>>>0<4|(j|0)==1){f=j+f|0}else{o=12980;break}}if((o|0)==12980){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0)}c[9340]=a;c[6932]=(c[6932]|0)-1;a=0;do{o=e+24+(a*24&-1)|0;f=o|0;if((c[f>>2]|0)==3){uu(c[e+24+(a*24&-1)+8>>2]|0);c[f>>2]=1}f=o;o=d+(a*24&-1)|0;c[f>>2]=c[o>>2];c[f+4>>2]=c[o+4>>2];c[f+8>>2]=c[o+8>>2];c[f+12>>2]=c[o+12>>2];c[f+16>>2]=c[o+16>>2];c[f+20>>2]=c[o+20>>2];a=a+1|0;}while((a|0)<12);i=b;return}function gL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0;d=i;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=c[14296+(e*24&-1)>>2]|0;j=c[14304+(e*24&-1)>>2]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=e-2|0;c[6354]=k;l=c[14304+(f*24&-1)>>2]|0;if((k|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=c[14296+(f*24&-1)>>2]|0;c[6354]=e-3;e=c[14304+(k*24&-1)>>2]|0;if(!((m|0)==1&(g|0)==1)){uf(-1,106264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14296+(k*24&-1)>>2]|0)==3){n=43240}else{uf(-1,98792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){o=c[n>>2]|0;if((o|0)==0){p=12998;break}if((aY(e|0,c[o+4>>2]|0)|0)==0){break}else{n=o|0}}if((p|0)==12998){uf(-1,93136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[o+8|0]=0;n=c[b>>2]|0;if((n|0)==0){uf(-1,85336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L17723:do{if((l|0)>(j|0)){q=0.0;r=0.0;s=0}else{b=o+16|0;k=o+24|0;g=n+8|0;t=0.0;m=l;u=0.0;L17725:while(1){c[b>>2]=1;c[k>>2]=m;f=c[g>>2]|0;w=c[9340]|0;x=c[f>>2]|0;y=0;while(1){if((y|0)>=(x|0)){break}z=c[f+8+(y<<5)>>2]|0;c[9340]=1;cM[c[41164+(z<<3)>>2]&511](f+8+(y<<5)+8|0);A=c[9340]|0;if((z-37|0)>>>0<4|(A|0)==1){y=A+y|0}else{p=13006;break L17725}}c[9340]=w;y=c[6354]|0;if((y|0)<0){p=13008;break}c[6354]=y-1;f=14296+(y*24&-1)|0;x=c[f>>2]|0;A=c[f+4>>2]|0;f=14304+(y*24&-1)|0;B=c[f>>2]|0;if((x|0)==2){C=+h[14312+(y*24&-1)>>3];D=+h[f>>3]}else if((x|0)==3){p=13013;break}else if((x|0)==1){C=0.0;D=+(B|0)}else{p=13011;break}E=u+D;F=t+C;x=m+1|0;if((x|0)>(j|0)){q=F;r=E;s=A;break L17723}else{t=F;m=x;u=E}}if((p|0)==13013){m=B;uz(m,0);uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((p|0)==13011){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((p|0)==13006){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0)}else if((p|0)==13008){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=e+1|0;c[6354]=p;e=14296+(p*24&-1)|0;c[e>>2]=2;c[e+4>>2]=s;h[14304+(p*24&-1)>>3]=r;h[14312+(p*24&-1)>>3]=q;i=d;return}}function gM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=e;g=e|0;e=c[g>>2]|0;h=f+4|0;j=c[h>>2]|0;k=14304+(b*24&-1)|0;l=c[k>>2]|0;m=f+12|0;f=a|0;c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];if((e|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=b;c[g>>2]=1;c[h>>2]=j;c[k>>2]=(l|0)==0&1;c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];i=a;return}}function gN(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=e;g=e|0;e=c[g>>2]|0;h=f+4|0;j=c[h>>2]|0;k=14304+(b*24&-1)|0;l=c[k>>2]|0;m=f+12|0;f=a|0;c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];if((e|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=b;c[g>>2]=1;c[h>>2]=j;c[k>>2]=l^-1;c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];i=a;return}}function gO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((m|0)==0){o=(e|0)!=0&1}else{o=1}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=o;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((m|0)==0){o=0}else{o=(e|0)!=0&1}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=o;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=m|e;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=m^e;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gS(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=m&e;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0,w=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[d>>3]=l;n=+h[14312+(e*24&-1)>>3];e=m;m=e;do{if((j|0)==3){o=+uz(m,b);g=(m|0)==(c[b>>2]|0);uu(m);if(g){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=o;p=0.0;q=o;r=c[6354]|0;s=13099;break}}else{if((j|0)==2){p=n;q=l;r=f;s=13099;break}else if((j|0)==1){c[d>>2]=-e;t=n;u=1;w=f;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((s|0)==13099){h[d>>3]=-0.0-q;t=-0.0-p;u=2;w=r}if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{r=w+1|0;c[6354]=r;w=14296+(r*24&-1)|0;c[w>>2]=u;c[w+4>>2]=k;h[14304+(r*24&-1)>>3]=+h[d>>3];h[14312+(r*24&-1)>>3]=t;i=a;return}}function gU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=14296+(s*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(s*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(s*24&-1)>>3];s=l;l=s;do{if((g|0)==3){o=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=o;w=0.0;x=o;y=13122;break}}else{if((g|0)==2){w=n;x=m;y=13122;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){z=(s|0)==(u|0)&1;A=n;break}else if((q|0)==2){if(+(s|0)!=t){z=0;A=n;break}z=r==0.0&1;A=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==13122){if((q|0)==1){if(+(u|0)!=x){z=0;A=w;break}z=w==0.0&1;A=w;break}else if((q|0)==2){if(x!=t){z=0;A=w;break}z=w==r&1;A=w;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=z;z=c[6354]|0;if((z|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{q=z+1|0;c[6354]=q;z=14296+(q*24&-1)|0;c[z>>2]=1;c[z+4>>2]=j;h[14304+(q*24&-1)>>3]=+h[e>>3];h[14312+(q*24&-1)>>3]=A;i=a;return}}function gV(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=14296+(s*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(s*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(s*24&-1)>>3];s=l;l=s;do{if((g|0)==3){o=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=o;w=0.0;x=o;y=13150;break}}else{if((g|0)==2){w=n;x=m;y=13150;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==2){if(+(s|0)!=t){z=1;A=n;break}z=r!=0.0&1;A=n;break}else if((q|0)==1){z=(s|0)!=(u|0)&1;A=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==13150){if((q|0)==2){if(x!=t){z=1;A=w;break}z=w!=r&1;A=w;break}else if((q|0)==1){if(+(u|0)!=x){z=1;A=w;break}z=w!=0.0&1;A=w;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=z;z=c[6354]|0;if((z|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=z+1|0;c[6354]=u;z=14296+(u*24&-1)|0;c[z>>2]=1;c[z+4>>2]=j;h[14304+(u*24&-1)>>3]=+h[e>>3];h[14312+(u*24&-1)>>3]=A;i=a;return}}function gW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13177;break}}else{if((g|0)==2){u=n;w=m;x=13177;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==2){y=+(q|0)>r;z=n;break}else if((p|0)==1){y=(q|0)>(s|0);z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13177){if((p|0)==1){y=w>+(s|0);z=u;break}else if((p|0)==2){y=w>r;z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=y+1|0;c[6354]=p;y=14296+(p*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(p*24&-1)>>3]=+h[e>>3];h[14312+(p*24&-1)>>3]=z;i=a;return}}function gX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13202;break}}else{if((g|0)==2){u=n;w=m;x=13202;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==1){y=(q|0)<(s|0);z=n;break}else if((p|0)==2){y=+(q|0)<r;z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13202){if((p|0)==2){y=w<r;z=u;break}else if((p|0)==1){y=w<+(s|0);z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{s=y+1|0;c[6354]=s;y=14296+(s*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(s*24&-1)>>3]=+h[e>>3];h[14312+(s*24&-1)>>3]=z;i=a;return}}function gY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13227;break}}else{if((g|0)==2){u=n;w=m;x=13227;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==2){y=+(q|0)>=r;z=n;break}else if((p|0)==1){y=(q|0)>=(s|0);z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13227){if((p|0)==1){y=w>=+(s|0);z=u;break}else if((p|0)==2){y=w>=r;z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=y+1|0;c[6354]=p;y=14296+(p*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(p*24&-1)>>3]=+h[e>>3];h[14312+(p*24&-1)>>3]=z;i=a;return}}function gZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13252;break}}else{if((g|0)==2){u=n;w=m;x=13252;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==1){y=(q|0)<=(s|0);z=n;break}else if((p|0)==2){y=+(q|0)<=r;z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13252){if((p|0)==2){y=w<=r;z=u;break}else if((p|0)==1){y=w<=+(s|0);z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{s=y+1|0;c[6354]=s;y=14296+(s*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(s*24&-1)>>3]=+h[e>>3];h[14312+(s*24&-1)>>3]=z;i=a;return}}function g_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=c[14296+(s*24&-1)>>2]|0;g=14304+(s*24&-1)|0;m=+h[g>>3];j=c[g>>2]|0;g=j;do{if((f|0)==3){n=+uz(g,b);l=(g|0)==(c[b>>2]|0);uu(g);if(!l){w=0.0;x=n;y=13276;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){w=+h[14312+(s*24&-1)>>3];x=m;y=13276;break}else if((f|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){c[e>>2]=u+j;z=1;A=0.0;break}else if((q|0)==2){h[e>>3]=+(j|0)+t;z=2;A=r;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==13276){if((q|0)==2){h[e>>3]=x+t;z=2;A=r+w;break}else if((q|0)==1){h[e>>3]=+(u|0)+x;z=2;A=w;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);u=c[6354]|0;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{q=u+1|0;c[6354]=q;c[14296+(q*24&-1)>>2]=z;h[14304+(q*24&-1)>>3]=+h[e>>3];h[14312+(q*24&-1)>>3]=A;i=a;return}}function g$(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=c[14296+(s*24&-1)>>2]|0;g=14304+(s*24&-1)|0;m=+h[g>>3];j=c[g>>2]|0;g=j;do{if((f|0)==3){n=+uz(g,b);l=(g|0)==(c[b>>2]|0);uu(g);if(!l){w=0.0;x=n;y=17;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){w=+h[14312+(s*24&-1)>>3];x=m;y=17;break}else if((f|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){c[e>>2]=j-u;z=1;A=0.0;break}else if((q|0)==2){h[e>>3]=+(j|0)-t;z=2;A=-0.0-r;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==17){if((q|0)==1){h[e>>3]=x- +(u|0);z=2;A=w;break}else if((q|0)==2){h[e>>3]=x-t;z=2;A=w-r;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=q+1|0;c[6354]=u;c[14296+(u*24&-1)>>2]=z;h[14304+(u*24&-1)>>3]=+h[e>>3];h[14312+(u*24&-1)>>3]=A;i=a;return}}function g0(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=c[14296+(s*24&-1)>>2]|0;g=14304+(s*24&-1)|0;m=+h[g>>3];j=c[g>>2]|0;g=j;do{if((f|0)==3){n=+uz(g,b);l=(g|0)==(c[b>>2]|0);uu(g);if(!l){w=0.0;x=n;y=43;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){w=+h[14312+(s*24&-1)>>3];x=m;y=43;break}else if((f|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){n=+(j|0)*+(u|0);if(+P(+n)<2147483647.0){c[e>>2]=aa(u,j);z=1;A=0.0;break}else{h[e>>3]=n;z=2;A=0.0;break}}else if((q|0)==2){n=+(j|0);h[e>>3]=n*t;z=2;A=r*n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==43){if((q|0)==1){m=+(u|0);h[e>>3]=m*x;z=2;A=w*m;break}else if((q|0)==2){h[e>>3]=x*t-r*w;z=2;A=r*x+w*t;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=q+1|0;c[6354]=u;c[14296+(u*24&-1)>>2]=z;h[14304+(u*24&-1)>>3]=+h[e>>3];h[14312+(u*24&-1)>>3]=A;i=a;return}}function g1(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;l=c[14296+(g*24&-1)>>2]|0;m=14304+(g*24&-1)|0;n=+h[m>>3];o=+h[14312+(g*24&-1)>>3];g=c[m>>2]|0;m=g;do{if((l|0)==3){p=+uz(m,e);q=(m|0)==(c[e>>2]|0);uu(m);if(q){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;r=2;s=0.0;t=c[6354]|0;u=p;w=c[k>>2]|0;break}}else{r=l;s=o;t=j;u=n;w=g}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;g=c[14296+(t*24&-1)>>2]|0;j=14304+(t*24&-1)|0;n=+h[j>>3];l=c[j>>2]|0;j=l;do{if((g|0)==3){o=+uz(j,d);m=(j|0)==(c[d>>2]|0);uu(j);if(!m){x=0.0;y=o;z=71;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){x=+h[14312+(t*24&-1)>>3];y=n;z=71;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){if((w|0)==0){c[f>>2]=0;a[1960]=1;A=1;B=0.0;break}else{c[f>>2]=(l|0)/(w|0)&-1;A=1;B=0.0;break}}else if((r|0)==2){o=s*s+u*u;if(o!=0.0){h[f>>3]=u*+(l|0)/o;A=2;B=s*+(-l|0)/o;break}else{h[f>>3]=0.0;a[1960]=1;A=2;B=0.0;break}}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((z|0)==71){if((r|0)==1){if((w|0)==0){h[f>>3]=0.0;a[1960]=1;A=2;B=0.0;break}else{n=+(w|0);h[f>>3]=y/n;A=2;B=x/n;break}}else if((r|0)==2){n=s*s+u*u;if(n!=0.0){h[f>>3]=(s*x+u*y)/n;A=2;B=(x*u-s*y)/n;break}else{h[f>>3]=0.0;a[1960]=1;A=2;B=0.0;break}}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=r+1|0;c[6354]=w;c[14296+(w*24&-1)>>2]=A;h[14304+(w*24&-1)>>3]=+h[f>>3];h[14312+(w*24&-1)>>3]=B;i=b;return}}function g2(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;l=c[14296+(g*24&-1)>>2]|0;m=c[14304+(g*24&-1)>>2]|0;g=m;do{if((l|0)==3){n=+uz(g,e);o=(g|0)==(c[e>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=c[k>>2]|0;break}}else{p=l;q=j;r=m}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=q-1|0;c[6354]=m;j=14296+(q*24&-1)|0;l=j|0;g=c[l>>2]|0;e=j+4|0;j=c[e>>2]|0;o=14304+(q*24&-1)|0;s=c[o>>2]|0;h[f>>3]=+h[o>>3];t=14312+(q*24&-1)|0;n=+h[t>>3];u=s;s=u;if((g|0)==3){w=+uz(s,d);x=(s|0)==(c[d>>2]|0);uu(s);if(x){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h[f>>3]=w;uf(-1,224848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(!((g|0)==1&(p|0)==1)){uf(-1,224848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=f;if((r|0)==0){c[p>>2]=0;if((m|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q;c[l>>2]=1;c[e>>2]=j;h[o>>3]=+h[f>>3];h[t>>3]=n;a[1960]=1;i=b;return}else{c[p>>2]=(u|0)%(r|0)&-1;if((m|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q;c[l>>2]=1;c[e>>2]=j;h[o>>3]=+h[f>>3];h[t>>3]=n;i=b;return}}function g3(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,U=0.0,V=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;l=c[14296+(g*24&-1)>>2]|0;m=14304+(g*24&-1)|0;n=+h[m>>3];o=+h[14312+(g*24&-1)>>3];g=c[m>>2]|0;m=g;do{if((l|0)==3){p=+uz(m,e);q=(m|0)==(c[e>>2]|0);uu(m);if(q){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;r=2;s=0.0;t=c[6354]|0;u=p;w=c[k>>2]|0;break}}else{r=l;s=o;t=j;u=n;w=g}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;g=c[14296+(t*24&-1)>>2]|0;j=14304+(t*24&-1)|0;n=+h[j>>3];l=c[j>>2]|0;j=l;do{if((g|0)==3){o=+uz(j,d);m=(j|0)==(c[d>>2]|0);uu(j);if(!m){x=0.0;y=o;z=143;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){x=+h[14312+(t*24&-1)>>3];y=n;z=143;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){if((l|0)==0){if((w|0)<0){a[1960]=1}c[f>>2]=(w|0)==0&1;A=1;B=0.0;break}o=+R(+(+(l|0)),+(+(w|0)));if(o>2147483647.0|(w|0)<0){h[f>>3]=o;A=2;B=0.0;break}if((w|0)>0){m=0;e=1;while(1){q=aa(l,e);C=m+1|0;if((C|0)<(w|0)){m=C;e=q}else{D=q;break}}}else{D=1}c[f>>2]=D;A=1;B=0.0;break}else if((r|0)==2){if((l|0)==0){if(s!=0.0|u<0.0){a[1960]=1}h[f>>3]=u==0.0?1.0:0.0;A=2;B=0.0;break}o=+R(+(+(((l|0)>-1?l:-l|0)|0)),+(+P(+u)));do{if(u<0.0){if(o!=0.0){E=1.0/o;break}else{a[1960]=1;E=o;break}}else{E=o}}while(0);o=((l|0)>-1?0.0:3.141592653589793)*(-0.0-s);if(o<-706.893623549172){F=0.0}else{F=+Z(+o)}o=E*F;e=(l|0)>-1;p=u*(e?0.0:3.141592653589793)+s*+_(+(+((e?l:-l|0)|0)));G=o*+S(+p);H=o*+T(+p);h[f>>3]=G;A=2;B=H;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((z|0)==143){if((r|0)==1){if(x==0.0){F=+R(+y,+(+(((w|0)>-1?w:-w|0)|0)));do{if((w|0)<0){if(F!=0.0){I=1.0/F;break}else{a[1960]=1;I=F;break}}else{I=F}}while(0);h[f>>3]=I;A=2;B=0.0;break}F=+P(+y);E=+P(+x);if(F>E){n=E/F;J=F*+Q(+(n*n+1.0))}else{n=F/E;J=E*+Q(+(n*n+1.0))}n=+R(+J,+(+(((w|0)>-1?w:-w|0)|0)));do{if((w|0)<0){if(n!=0.0){K=1.0/n;break}else{a[1960]=1;K=n;break}}else{K=n}}while(0);n=+Y(+x,+y)*+(w|0);E=K*+S(+n);F=K*+T(+n);h[f>>3]=E;A=2;B=F;break}else if((r|0)==2){l=x==0.0;if(y==0.0&l){if(s!=0.0|u<0.0){a[1960]=1}h[f>>3]=u==0.0?1.0:0.0;A=2;B=0.0;break}F=+P(+y);E=+P(+x);do{if(l){L=F}else{if(F>E){n=E/F;L=F*+Q(+(n*n+1.0));break}else{n=F/E;L=E*+Q(+(n*n+1.0));break}}}while(0);n=+R(+L,+(+P(+u)));do{if(u<0.0){if(n!=0.0){M=1.0/n;break}else{a[1960]=1;M=n;break}}else{M=n}}while(0);if(l){N=y<0.0?3.141592653589793:0.0}else{N=+Y(+x,+y)}n=N*(-0.0-s);if(n<-706.893623549172){O=0.0}else{O=+Z(+n)}n=M*O;do{if(l){U=F;V=u*(y<0.0?3.141592653589793:0.0)}else{H=u*+Y(+x,+y);if(F>E){G=E/F;U=F*+Q(+(G*G+1.0));V=H;break}else{G=F/E;U=E*+Q(+(G*G+1.0));V=H;break}}}while(0);E=V+s*+_(+U);F=n*+S(+E);H=n*+T(+E);h[f>>3]=F;A=2;B=H;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=r+1|0;c[6354]=w;c[14296+(w*24&-1)>>2]=A;h[14304+(w*24&-1)>>3]=+h[f>>3];h[14312+(w*24&-1)>>3]=B;i=b;return}}function g4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f|0;j=c[g>>2]|0;k=f+4|0;f=c[k>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=m;if((j|0)==3){uz(n,b);o=(n|0)==(c[b>>2]|0);uu(n);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(-1,217536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}if((j|0)!=1){uf(-1,217536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((m|0)>1){j=m;p=1.0;while(1){q=p*+(j|0);m=j-1|0;if((m|0)>1){j=m;p=q}else{r=q;break}}}else{r=1.0}if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[g>>2]=2;c[k>>2]=f;h[l>>3]=r;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}function g5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=c[14296+(d*24&-1)>>2]|0;g=c[14304+(d*24&-1)>>2]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-2;d=c[14296+(e*24&-1)>>2]|0;h=c[14304+(e*24&-1)>>2]|0;if((f|0)==1){e=ut(32)|0;do{if((e|0)==0){gk();j=ut(32)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=211880,v)|0)}else{k=e}}while(0);e=k;a0(k|0,32,21e4,(v=i,i=i+8|0,c[v>>2]=g,v)|0);l=3;m=e}else{l=f;m=g}if(!((d|0)==3&(l|0)==3)){uf(-1,202496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=m;m=uc(h,l)|0;uu(h);uu(l);l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=l+1|0;c[6354]=h;l=14296+(h*24&-1)|0;d=l;c[l>>2]=3;c[d+4>>2]=n;c[14304+(h*24&-1)>>2]=m;h=d+12|0;d=b|0;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];if((m|0)==0){uu(m);i=a;return}d=bP(m|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=d;uu(m);i=a;return}function g6(a){a=a|0;var b=0,d=0,e=0,f=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[14296+(b*24&-1)>>2]|0;c[6354]=b-2;b=c[14304+(d*24&-1)>>2]|0;if(!((c[14296+(d*24&-1)>>2]|0)==3&(f|0)==3)){uf(-1,202496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=aY(b|0,e|0)|0;uu(b);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{b=e+1|0;c[6354]=b;e=14296+(b*24&-1)|0;c[e>>2]=1;c[14304+(b*24&-1)>>2]=(f|0)==0&1;f=e+12|0;e=a|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];i=a;return}}function g7(a){a=a|0;var b=0,d=0,e=0,f=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[14296+(b*24&-1)>>2]|0;c[6354]=b-2;b=c[14304+(d*24&-1)>>2]|0;if(!((c[14296+(d*24&-1)>>2]|0)==3&(f|0)==3)){uf(-1,202496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=aY(b|0,e|0)|0;uu(b);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{b=e+1|0;c[6354]=b;e=14296+(b*24&-1)|0;c[e>>2]=1;c[14304+(b*24&-1)>>2]=(f|0)!=0&1;f=e+12|0;e=a|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];i=a;return}}function g8(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+16|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=3){uf(-1,197056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((c[11252]|0)==15){e=a[f]|0;if(e<<24>>24==0){g=0;break}else{h=0;j=0;k=e}while(1){e=((k&-64)<<24>>24!=-128&1)+j|0;l=h+1|0;m=a[f+l|0]|0;if(m<<24>>24==0){g=e;break}else{h=l;j=e;k=m}}}else{g=uA(f|0)|0}}while(0);uu(f);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=f+1|0;c[6354]=k;f=14296+(k*24&-1)|0;c[f>>2]=1;c[14304+(k*24&-1)>>2]=g;g=f+12|0;f=d|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];i=b;return}}function g9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[14296+(b*24&-1)>>2]|0;c[6354]=b-2;b=c[14304+(d*24&-1)>>2]|0;if((f|0)!=3){uf(-1,185704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14296+(d*24&-1)>>2]|0)!=3){uf(-1,185704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=aQ(b|0,e|0)|0;if((d|0)==0){g=0}else{g=(1-b|0)+d|0}uu(e);uu(b);b=c[6354]|0;if((b|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{e=b+1|0;c[6354]=e;b=14296+(e*24&-1)|0;c[b>>2]=1;c[14304+(e*24&-1)>>2]=g;g=b+12|0;b=a|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];i=a;return}}function ha(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;b=i;i=i+16|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=c[14296+(e*24&-1)>>2]|0;h=c[14304+(e*24&-1)>>2]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=e-2|0;c[6354]=j;k=c[14304+(f*24&-1)>>2]|0;if((j|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[14296+(f*24&-1)>>2]|0;f=e-3|0;c[6354]=f;m=c[14304+(j*24&-1)>>2]|0;if(!((g|0)==1&(l|0)==1)){uf(-1,180448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14296+(j*24&-1)>>2]|0)!=3){uf(-1,176264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=(c[11252]|0)==15;do{if(j){l=a[m]|0;if(l<<24>>24==0){n=0;break}else{o=0;p=0;q=l}while(1){l=((q&-64)<<24>>24!=-128&1)+p|0;g=o+1|0;r=a[m+g|0]|0;if(r<<24>>24==0){n=l;break}else{o=g;p=l;q=r}}}else{n=uA(m|0)|0}}while(0);do{if(h>>>0>n>>>0){if(!j){s=uA(m|0)|0;break}q=a[m]|0;if(q<<24>>24==0){s=0;break}else{t=0;u=0;w=q}while(1){q=((w&-64)<<24>>24!=-128&1)+u|0;p=t+1|0;o=a[m+p|0]|0;if(o<<24>>24==0){s=q;break}else{t=p;u=q;w=o}}}else{s=h}}while(0);h=(k|0)<1?1:k;if((h|0)>(s|0)){if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-2|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=3;c[14304+(f*24&-1)>>2]=179864;f=e+12|0;e=d|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];e=bP(179864)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;uu(m);i=b;return}e=h-1|0;L406:do{if(j){if((e|0)<1){x=m}else{h=a[m]|0;L411:do{if(h<<24>>24==0){y=m}else{f=0;k=0;w=m;u=h;while(1){if((u&-64)<<24>>24==-128){z=k}else{if((k|0)==(e|0)){y=w;break L411}else{z=k+1|0}}t=f+1|0;n=m+t|0;o=a[n]|0;if(o<<24>>24==0){y=n;break}else{f=t;k=z;w=n;u=o}}}}while(0);if(j){x=y}else{A=y;B=297;break}}if((s|0)<1){C=m;D=x;break}h=a[m]|0;if(h<<24>>24==0){C=m;D=x;break}else{E=0;F=0;G=m;H=h}while(1){if((H&-64)<<24>>24==-128){I=F}else{if((F|0)==(s|0)){C=G;D=x;break L406}else{I=F+1|0}}h=E+1|0;u=m+h|0;w=a[u]|0;if(w<<24>>24==0){C=u;D=x;break}else{E=h;F=I;G=u;H=w}}}else{A=m+e|0;B=297}}while(0);if((B|0)==297){C=m+s|0;D=A}a[C]=0;C=c[6354]|0;if((C|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=C+1|0;c[6354]=A;C=14296+(A*24&-1)|0;s=C;c[C>>2]=3;c[s+4>>2]=J;c[14304+(A*24&-1)>>2]=D;A=s+12|0;s=d|0;c[A>>2]=c[s>>2];c[A+4>>2]=c[s+4>>2];c[A+8>>2]=c[s+8>>2];if((D|0)==0){uu(m);i=b;return}s=bP(D|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=s;uu(m);i=b;return}function hb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;b=i;i=i+16|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=1){uf(-1,168392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-2;e=c[14304+(f*24&-1)>>2]|0;if((c[14296+(f*24&-1)>>2]|0)==3){h=e;j=0;k=179864}else{uf(-1,164176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){f=a[h]|0;if(f<<24>>24==0){l=j;m=k;break}else{n=h;o=f}while(1){f=n+1|0;if((aM(o<<24>>24|0)|0)==0){break}n=f;o=a[f]|0}f=a[n]|0;if(f<<24>>24==0){l=j;m=k;break}p=j+1|0;q=(p|0)==(g|0);if(q){r=n}else{r=k}s=n;t=f;while(1){if(t<<24>>24==0){break}f=s+1|0;if((aM(t<<24>>24|0)|0)!=0){break}s=f;t=a[f]|0}if(q){u=325;break}else{h=s;j=p;k=r}}if((u|0)==325){a[s]=0;l=g;m=r}r=(g|0)<0?l:m;m=g>>31&-2;g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=g+1|0;c[6354]=l;g=14296+(l*24&-1)|0;s=g;c[g>>2]=m+3;c[s+4>>2]=w;c[14304+(l*24&-1)>>2]=r;l=s+12|0;s=d|0;c[l>>2]=c[s>>2];c[l+4>>2]=c[s+4>>2];c[l+8>>2]=c[s+8>>2];if((m|0)!=0|(r|0)==0){uu(e);i=b;return}m=bP(r|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=m;uu(e);i=b;return}function hc(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0;b=i;i=i+256|0;d=b|0;e=b+240|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-1;g=c[14304+(f*24&-1)>>2]|0;if((g|0)>10){f=g*24&-1;j=ut(f)|0;do{if((j|0)==0){gk();k=ut(f)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=154800,v)|0)}else{l=j}}while(0);m=l}else{m=d|0}l=(g|0)>0;L484:do{if(l){j=0;f=c[6354]|0;while(1){if((f|0)<0){break}k=f-1|0;c[6354]=k;n=m+(j*24&-1)|0;o=14296+(f*24&-1)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];o=j+1|0;if((o|0)<(g|0)){j=o;f=k}else{break L484}}uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);f=g-1|0;if((c[m+(f*24&-1)>>2]|0)!=3){uf(-1,151464,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=m+(f*24&-1)+8|0;k=(uA(c[j>>2]|0)|0)+80|0;o=ut(k)|0;do{if((o|0)==0){gk();n=ut(k)|0;if((n|0)!=0){p=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=149624,v)|0)}else{p=o}}while(0);o=c[j>>2]|0;j=bk(o|0,191528)|0;uF(p|0,o|0,j|0);n=o+j|0;o=p+j|0;q=c[8270]|0;do{if((q|0)!=0){if((aY(q|0,139696)|0)==0){break}bA(4,q|0)}}while(0);L502:do{if((f|0)>0){q=o;r=n;s=j;t=k;u=p;w=g-2|0;L504:while(1){x=m+(w*24&-1)|0;y=q;z=t;A=u;while(1){B=y;C=r;D=a[r]|0;L508:while(1){if(D<<24>>24==0){E=B;F=A;break L502}G=C+1|0;H=a[G]|0;if(H<<24>>24==0){I=B;J=C;K=z;L=A;M=D;N=393;break L502}if((a_(C|0,143664,2)|0)==0){O=G;P=B;Q=H}else{break}while(1){H=O+1|0;R=P+1|0;a[P]=Q;S=a[H]|0;if((S<<24>>24|0)==0|(S<<24>>24|0)==37){B=R;C=H;D=S;continue L508}else{O=H;P=R;Q=S}}}T=C+((bk(G|0,191528)|0)+1|0)|0;D=a[T]|0;a[T]=0;if((a[C]|0)!=37){N=363;break L504}S=bk(C|0,20296)|0;R=bk(C|0,20304)|0;H=bk(C|0,20320)|0;U=bk(C|0,20328)|0;if((U|0)<(H|0)&(U|0)<(R|0)&(U|0)<(S|0)){N=365;break L504}do{if((S|0)<(R|0)&(S|0)<(H|0)){if((c[x>>2]|0)!=3){N=372;break L504}b0();U=(z-B|0)+A|0;V=c[m+(w*24&-1)+8>>2]|0;a0(B|0,U|0,C|0,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}else{if((R|0)<(H|0)){W=2}else{if(H>>>0<(uA(C|0)|0)>>>0){W=1}else{N=369;break L504}}V=x|0;if((c[V>>2]|0)==3){N=374;break L504}b0();if((W|0)==2){U=(z-B|0)+A|0;X=c[V>>2]|0;if((X|0)==1){Y=+(c[m+(w*24&-1)+8>>2]|0)}else if((X|0)==2){Y=+h[m+(w*24&-1)+8>>3]}else if((X|0)==3){Y=+uz(c[m+(w*24&-1)+8>>2]|0,0)}else{N=386;break L504}a0(B|0,U|0,C|0,(v=i,i=i+8|0,h[v>>3]=Y,v)|0);break}else if((W|0)==1){U=(z-B|0)+A|0;X=c[V>>2]|0;if((X|0)==1){Z=+(c[m+(w*24&-1)+8>>2]|0)}else if((X|0)==2){Z=+h[m+(w*24&-1)+8>>3]}else if((X|0)==3){Z=+uz(c[m+(w*24&-1)+8>>2]|0,0)}else{N=380;break L504}a0(B|0,U|0,C|0,(v=i,i=i+8|0,c[v>>2]=~~Z,v)|0);break}else{N=388;break L504}}}while(0);a[T]=D;_=uA(A|0)|0;if(_>>>0<(z-2|0)>>>0){break}C=z<<1;B=db(A,C,149624)|0;y=B+s|0;z=C;A=B}y=A+_|0;if((w|0)>0){q=y;r=T;s=_;t=z;u=A;w=w-1|0}else{$=y;aa=T;ab=z;ac=A;N=392;break L502}}if((N|0)==369){uf(-1,106184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==372){uf(-1,142064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==386){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==388){uf(-1,138488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==363){uf(-1,108e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==365){uf(-1,107040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==374){uf(-1,140392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==380){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{$=o;aa=n;ab=k;ac=p;N=392}}while(0);if((N|0)==392){I=$;J=aa;K=ab;L=ac;M=a[aa]|0;N=393}L552:do{if((N|0)==393){if(M<<24>>24==0){E=I;F=L;break}aa=I;ac=J;ab=(K-I|0)+L|0;$=M;while(1){p=ab-1|0;if((p|0)<=0){E=aa;F=L;break L552}if($<<24>>24==37){k=ac+1|0;n=(a[k]|0)==37?k:ac;ad=n;ae=a[n]|0}else{ad=ac;ae=$}n=ad+1|0;k=aa+1|0;a[aa]=ae;o=a[n]|0;if(o<<24>>24==0){E=k;F=L;break}else{aa=k;ac=n;ab=p;$=o}}}}while(0);a[E]=0;E=c[6354]|0;if((E|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L=E+1|0;c[6354]=L;E=14296+(L*24&-1)|0;ae=E;c[E>>2]=3;c[ae+4>>2]=af;c[14304+(L*24&-1)>>2]=F;L=ae+12|0;ae=e|0;c[L>>2]=c[ae>>2];c[L+4>>2]=c[ae+4>>2];c[L+8>>2]=c[ae+8>>2];if((F|0)!=0){ae=bP(F|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=ae}uu(F);if(l){l=0;do{F=m+(l*24&-1)|0;if((c[F>>2]|0)==3){uu(c[m+(l*24&-1)+8>>2]|0);c[F>>2]=1}l=l+1|0;}while((l|0)<(g|0))}if((m|0)!=(d|0)){uu(m)}m=c[8270]|0;if((m|0)==0){i=b;return}if((aY(m|0,139696)|0)==0){i=b;return}bA(4,139696);i=b;return}function hd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0;a=i;i=i+16|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=c[14296+(d*24&-1)>>2]|0;g=14304+(d*24&-1)|0;j=+h[g>>3];k=c[g>>2]|0;g=k;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-2;d=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=3){uf(-1,136912,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=(uA(d|0)|0)+80|0;l=ut(e)|0;do{if((l|0)==0){gk();m=ut(e)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134920,v)|0)}else{n=l}}while(0);if((f|0)==1){o=+(k|0)}else if((f|0)==3){o=+uz(g,0)}else if((f|0)==2){o=j}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}ud(n,e,d,10.0,o);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=3;c[14304+(f*24&-1)>>2]=n;f=e+12|0;e=b|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];if((n|0)==0){uu(d);uu(n);i=a;return}e=bP(n|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;uu(d);uu(n);i=a;return}function he(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0;b=i;i=i+56|0;d=b|0;e=b+48|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=14296+(f*24&-1)|0;k=c[j>>2]|0;l=c[j+4>>2]|0;j=14304+(f*24&-1)|0;m=+h[j>>3];n=c[j>>2]|0;h[e>>3]=m;o=+h[14312+(f*24&-1)>>3];j=n;n=j;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-2;f=c[14304+(g*24&-1)>>2]|0;if((c[14296+(g*24&-1)>>2]|0)!=3){uf(-1,133408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=uA(f|0)|0;p=g+1|0;q=g+2|0;g=ut(q)|0;do{if((g|0)==0){gk();r=ut(q)|0;if((r|0)!=0){s=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=132008,v)|0)}else{s=g}}while(0);uF(s|0,f|0,p|0);ck(s|0,73808,p|0);g=(p<<1)+80|0;p=ut(g)|0;do{if((p|0)==0){gk();q=ut(g)|0;if((q|0)!=0){t=q;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129704,v)|0)}else{t=p}}while(0);if((k|0)==1){u=+(j|0)}else if((k|0)==3){u=+uz(n,0)}else if((k|0)==2){u=m}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(d,u);j=t4(t,g,s,d,u- +O(+u))|0;if(!((j|0)!=0&(j|0)<(g|0))){uf(-1,128368,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=t+(j-1|0)|0;if((a[g]|0)!=32){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=125936,v)|0)}a[g]=0;if((k|0)==3){uu(n)}uu(f);uu(s);c[e>>2]=t;s=c[6354]|0;if((s|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=s+1|0;c[6354]=f;s=14296+(f*24&-1)|0;c[s>>2]=3;c[s+4>>2]=l;l=c[e>>2]|0;h[14304+(f*24&-1)>>3]=+h[e>>3];h[14312+(f*24&-1)>>3]=o;f=l;if((f|0)==0){uu(t);i=b;return}l=bP(f|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;uu(t);i=b;return}function hf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;a=i;i=i+56|0;b=a|0;d=a+48|0;h[d>>3]=0.0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g+4>>2]|0;k=c[14304+(e*24&-1)>>2]|0;l=k;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=c[g>>2]|0;c[6354]=e-2;e=c[14304+(f*24&-1)>>2]|0;if(!((c[14296+(f*24&-1)>>2]|0)==3&(m|0)==3)){uf(-1,124672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((e|0)==0|(k|0)==0){uf(-1,123472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t1(l,e,b,d);n=+t2(b);o=+h[d>>3];uu(l);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=e+1|0;c[6354]=l;e=14296+(l*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;h[14304+(l*24&-1)>>3]=n+o;h[14312+(l*24&-1)>>3]=0.0;i=a;return}}function hg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0,t=0;a=i;i=i+16|0;b=a|0;d=a+8|0;bV(d|0,0);e=d|0;f=~~(+(c[e>>2]|0)+-946684800.0);c[e>>2]=f;g=+(c[d+4>>2]|0)/1.0e6+ +(f|0);f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=f-1|0;c[6354]=d;e=14296+(f*24&-1)|0;j=e|0;k=c[j>>2]|0;l=e+4|0;e=c[l>>2]|0;m=14304+(f*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[b>>3]=n;p=14312+(f*24&-1)|0;q=+h[p>>3];r=o;o=r;if((k|0)==3){if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f;c[j>>2]=3;c[l>>2]=e;h[m>>3]=n;h[p>>3]=q;if((r|0)==0){s=f}else{r=bP(o|0)|0;o=c[6354]|0;c[14304+(o*24&-1)>>2]=r;s=o}if((s|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=s+1|0;c[6354]=o;s=14296+(o*24&-1)|0;c[s>>2]=2;c[s+4>>2]=t;h[14304+(o*24&-1)>>3]=g;h[14312+(o*24&-1)>>3]=0.0;he(0);i=a;return}else if((k|0)==2){h[b>>3]=g;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f;c[j>>2]=2;c[l>>2]=e;h[m>>3]=g;h[p>>3]=0.0;i=a;return}else if((k|0)==1){c[b>>2]=~~g;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f;c[j>>2]=1;c[l>>2]=e;h[m>>3]=+h[b>>3];h[p>>3]=q;i=a;return}else{uf(-1,122096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;b=i;i=i+24|0;d=b|0;e=b+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-1;g=c[14304+(f*24&-1)>>2]|0;if((c[14296+(f*24&-1)>>2]|0)!=3){uf(-1,120384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=eo(g,e)|0;h=e6(119096)|0;if((h|0)!=0){a[h+8|0]=0;c[h+16>>2]=1;c[h+24>>2]=f}f=c[e>>2]|0;e=uA(f|0)|0;do{if((e|0)>0){h=f+(e-1|0)|0;if((a[h]|0)!=10){break}a[h]=0}}while(0);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=e+1|0;c[6354]=h;e=14296+(h*24&-1)|0;c[e>>2]=3;c[14304+(h*24&-1)>>2]=f;h=e+12|0;e=d|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];if((f|0)==0){uu(f);uu(g);i=b;return}e=bP(f|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;uu(f);uu(g);i=b;return}function hi(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+16|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f;h=c[f>>2]|0;f=c[g+4>>2]|0;j=c[14304+(d*24&-1)>>2]|0;k=g+12|0;g=b|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-2;d=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=3){uf(-1,111072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a_(d|0,167320,6)|0)==0){uf(-1,114320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a_(d|0,126208,6)|0)==0){uf(-1,114320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=e6(d)|0;uu(d);d=e+8|0;k=e+16|0;do{if((a[d]&1)==0){if((c[k>>2]|0)!=3){break}uu(c[e+24>>2]|0);c[k>>2]=1}}while(0);c[k>>2]=h;k=e;c[k+20>>2]=f;c[e+24>>2]=j;e=k+28|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];a[d]=0;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d+1|0;c[6354]=e;d=14296+(e*24&-1)|0;k=d;c[d>>2]=h;c[k+4>>2]=f;c[14304+(e*24&-1)>>2]=j;e=k+12|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];if((h|0)!=3|(j|0)==0){i=b;return}h=bP(j|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=h;i=b;return}function hj(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0.0;b=i;i=i+24|0;d=b+16|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[10810]|0;g=e-1|0;c[6354]=g;j=14296+(e*24&-1)|0;k=j;l=j|0;j=c[l>>2]|0;m=k+4|0;n=c[m>>2]|0;o=14304+(e*24&-1)|0;p=c[o>>2]|0;q=k+12|0;k=b|0;c[k>>2]=c[q>>2];c[k+4>>2]=c[q+4>>2];c[k+8>>2]=c[q+8>>2];if((j|0)!=3){if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[l>>2]=j;c[m>>2]=n;c[o>>2]=p;c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];i=b;return}L752:do{if((f|0)==0){r=0.0;s=0;t=548}else{k=f;while(1){if((aY(c[k+4>>2]|0,p|0)|0)==0){break}q=c[k>>2]|0;if((q|0)==0){r=0.0;s=0;t=548;break L752}else{k=q}}q=c[k+16>>2]|0;o=c[k+20>>2]|0;n=k+24|0;m=c[n>>2]|0;h[d>>3]=+h[n>>3];u=+h[k+32>>3];n=m;m=n;if((a[k+8|0]&1)!=0){r=u;s=o;t=548;break}if((q|0)==3){if((n|0)==0){w=0}else{w=bP(m|0)|0}c[d>>2]=w;x=3}else{x=q}uu(p);if((k|0)==0){y=o;z=u;t=550}else{A=x;B=o;C=u}}}while(0);if((t|0)==548){uu(p);y=s;z=r;t=550}if((t|0)==550){h[d>>3]=+uz(133568,0);A=2;B=y;C=z}y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=y+1|0;c[6354]=t;y=14296+(t*24&-1)|0;c[y>>2]=A;c[y+4>>2]=B;B=c[d>>2]|0;h[14304+(t*24&-1)>>3]=+h[d>>3];h[14312+(t*24&-1)>>3]=C;t=B;if((A|0)!=3|(t|0)==0){i=b;return}A=bP(t|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=A;i=b;return}function hk(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0,X=0.0,Y=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0,ag=0.0,ah=0.0,ai=0.0,aj=0.0;d=b+320|0;e=b+300|0;f=c[e>>2]|0;g=0;i=0;while(1){L779:do{if((i|0)<(f|0)){j=c[d>>2]|0;k=i;while(1){if((c[j+(k<<6)>>2]|0)!=2){l=k;break L779}m=k+1|0;if((m|0)<(f|0)){k=m}else{l=m;break}}}else{l=i}}while(0);k=0;while(1){n=k+l|0;if((n|0)>=(f|0)){break}if((c[(c[d>>2]|0)+(n<<6)>>2]|0)==2){break}else{k=k+1|0}}if((k|0)>0){g=g+1|0;i=n}else{break}}n=b+284|0;if((c[n>>2]|0)==9){if((g|0)>0){o=0;p=0;q=0.0}else{return}while(1){L796:do{if((o|0)<(f|0)){i=c[d>>2]|0;l=o;while(1){if((c[i+(l<<6)>>2]|0)!=2){r=l;break L796}j=l+1|0;if((j|0)<(f|0)){l=j}else{r=j;break}}}else{r=o}}while(0);k=0;while(1){s=k+r|0;if((s|0)>=(f|0)){break}if((c[(c[d>>2]|0)+(s<<6)>>2]|0)==2){break}else{k=k+1|0}}if((k|0)>0){l=c[d>>2]|0;i=r;t=q;while(1){if((c[l+(i<<6)>>2]|0)==2){u=t}else{u=t+ +h[l+(i<<6)+16>>3]}j=i+1|0;if((j|0)<(s|0)){i=j;t=u}else{v=u;break}}}else{v=q}i=p+1|0;if((i|0)<(g|0)){o=(r+1|0)+k|0;p=i;q=v}else{w=v;break}}}else{w=0.0}if((g|0)<=0){return}p=b+304|0;r=b+308|0;b=0;o=1;s=f;while(1){L820:do{if((b|0)<(s|0)){f=c[d>>2]|0;i=b;while(1){if((c[f+(i<<6)>>2]|0)!=2){x=i;break L820}l=i+1|0;if((l|0)<(s|0)){i=l}else{x=l;break}}}else{x=b}}while(0);k=0;while(1){y=k+x|0;if((y|0)>=(s|0)){break}if((c[(c[d>>2]|0)+(y<<6)>>2]|0)==2){break}else{k=k+1|0}}i=c[n>>2]|0;do{if((i|0)==7){if((k|0)>0){z=x;A=0.0}else{break}while(1){f=c[d>>2]|0;if((c[f+(z<<6)>>2]|0)==2){B=A}else{l=f+(z<<6)+16|0;v=A+ +h[l>>3];h[l>>3]=v;B=v}l=z+1|0;if((l|0)<(y|0)){z=l;A=B}else{break}}C=c[n>>2]|0;D=598}else{C=i;D=598}}while(0);do{if((D|0)==598){D=0;if((C|0)==9&(k|0)>0){E=x;F=0.0}else{break}while(1){i=c[d>>2]|0;if((c[i+(E<<6)>>2]|0)==2){G=F}else{l=i+(E<<6)+16|0;v=F+ +h[l>>3];h[l>>3]=v/w;G=v}l=E+1|0;if((l|0)<(y|0)){E=l;F=G}else{break}}}}while(0);l=c[p>>2]|0;i=c[r>>2]|0;f=64788+(l*688&-1)|0;j=64664+(l*688&-1)|0;v=+h[j>>3];if((a[f]&1)==0){m=64672+(l*688&-1)|0;H=+h[m>>3];I=v;J=m}else{q=+_(+v);v=+h[64800+(l*688&-1)>>3];m=64672+(l*688&-1)|0;H=+_(+(+h[m>>3]))/v;I=q/v;J=m}m=64788+(i*688&-1)|0;K=64664+(i*688&-1)|0;v=+h[K>>3];if((a[m]&1)==0){L=64672+(i*688&-1)|0;M=+h[L>>3];N=v;O=L}else{q=+_(+v);v=+h[64800+(i*688&-1)>>3];L=64672+(i*688&-1)|0;M=+_(+(+h[L>>3]))/v;N=q/v;O=L}L=c[d>>2]|0;do{if((k|0)>0){P=64648+(l*688&-1)|0;Q=64648+(i*688&-1)|0;v=M;q=N;u=H;t=I;R=0;while(1){S=R+x|0;T=+h[L+(S<<6)+8>>3];U=L+(S<<6)+16|0;V=+h[U>>3];W=L+(S<<6)|0;c[W>>2]=0;if(T<t){if((c[P>>2]&1|0)==0){X=t;D=614}else{Y=T;D=612}}else{Y=t;D=612}L860:do{if((D|0)==612){D=0;if(T>u){if((c[P>>2]&2|0)==0){X=Y;D=614;break}else{$=T}}else{$=u}h[U>>3]=V;do{if(V<q){if((c[Q>>2]&1|0)!=0){aa=V;break}c[W>>2]=1;ab=q;ac=v;ad=$;ae=Y;break L860}else{aa=q}}while(0);if(V<=v){ab=aa;ac=v;ad=$;ae=Y;break}if((c[Q>>2]&2|0)!=0){ab=aa;ac=V;ad=$;ae=Y;break}c[W>>2]=1;ab=aa;ac=v;ad=$;ae=Y}}while(0);if((D|0)==614){D=0;c[W>>2]=1;h[U>>3]=V;ab=q;ac=v;ad=u;ae=X}h[L+(S<<6)+56>>3]=T;h[L+(S<<6)+48>>3]=T;h[L+(S<<6)+40>>3]=V;h[L+(S<<6)+32>>3]=V;h[L+(S<<6)+24>>3]=-1.0;af=R+1|0;if((af|0)<(k|0)){v=ac;q=ab;u=ad;t=ae;R=af}else{break}}if(ad>H){if((a[f]&1)==0){ag=ad}else{ag=+Z(+(ad*+h[64800+(l*688&-1)>>3]))}h[J>>3]=ag}if(ae<I){if((a[f]&1)==0){ah=ae}else{ah=+Z(+(ae*+h[64800+(l*688&-1)>>3]))}h[j>>3]=ah}if(ac>M){if((a[m]&1)==0){ai=ac}else{ai=+Z(+(ac*+h[64800+(i*688&-1)>>3]))}h[O>>3]=ai}if(ab>=N){break}if((a[m]&1)==0){aj=ab}else{aj=+Z(+(ab*+h[64800+(i*688&-1)>>3]))}h[K>>3]=aj}}while(0);if((o|0)>=(g|0)){break}b=(x+1|0)+k|0;o=o+1|0;s=c[e>>2]|0}return}function hl(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,$=0.0,ab=0,ac=0,ad=0.0,ae=0,af=0,ag=0.0,ah=0,ai=0.0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0.0,ar=0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0.0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0.0,aY=0.0,aZ=0.0,a_=0.0,a$=0.0,a0=0.0,a1=0.0,a2=0.0,a3=0.0,a4=0.0,a5=0.0,a6=0.0,a7=0.0,a8=0.0,a9=0.0,ba=0.0,bb=0.0,bc=0.0,bd=0.0,be=0.0,bf=0.0,bg=0.0,bh=0.0,bi=0.0,bj=0.0,bk=0.0,bl=0.0,bm=0.0,bn=0.0,bo=0.0,bp=0.0,bq=0.0,br=0,bs=0,bt=0,bu=0;d=i;e=b+320|0;f=b+300|0;g=c[f>>2]|0;j=0;k=0;while(1){L903:do{if((k|0)<(g|0)){l=c[e>>2]|0;m=k;while(1){if((c[l+(m<<6)>>2]|0)!=2){n=m;break L903}o=m+1|0;if((o|0)<(g|0)){m=o}else{n=o;break}}}else{n=k}}while(0);m=0;while(1){p=m+n|0;if((p|0)>=(g|0)){break}if((c[(c[e>>2]|0)+(p<<6)>>2]|0)==2){break}else{m=m+1|0}}if((m|0)>0){j=j+1|0;k=p}else{break}}p=aa(j<<6,(c[6352]|0)+1|0);k=ut(p)|0;do{if((k|0)==0){gk();g=ut(p)|0;if((g|0)!=0){q=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215872,v)|0)}else{q=k}}while(0);k=q;if((j|0)<=0){r=c[e>>2]|0;s=r;uu(s);c[e>>2]=k;t=c[6352]|0;u=t+1|0;w=aa(u,j);x=b+296|0;c[x>>2]=w;y=w-1|0;c[f>>2]=y;i=d;return}q=b+284|0;p=b+304|0;g=b+308|0;n=0;l=0;L921:while(1){o=c[f>>2]|0;L923:do{if((n|0)<(o|0)){z=c[e>>2]|0;A=n;while(1){if((c[z+(A<<6)>>2]|0)!=2){B=A;break L923}C=A+1|0;if((C|0)<(o|0)){A=C}else{B=C;break}}}else{B=n}}while(0);m=0;while(1){D=m+B|0;if((D|0)>=(o|0)){break}if((c[(c[e>>2]|0)+(D<<6)>>2]|0)==2){break}else{m=m+1|0}}o=c[q>>2]|0;do{if((o|0)==1){c[200]=c[p>>2];c[144]=c[g>>2];A=m<<5;z=ut(A)|0;if((z|0)==0){gk();C=ut(A)|0;if((C|0)==0){E=727;break L921}else{F=C}}else{F=z}z=F;if((m|0)<4){E=729;break L921}C=c[e>>2]|0;A=0;while(1){if((A|0)>=(m|0)){break}if(+h[C+(A+B<<6)+24>>3]>0.0){A=A+1|0}else{E=733;break L921}}A=m-2|0;G=A*40&-1;H=ut(G)|0;if((H|0)==0){gk();I=ut(G)|0;if((I|0)==0){E=736;break L921}else{J=I}}else{J=H}H=J;I=A<<3;K=ut(I)|0;if((K|0)==0){gk();L=ut(I)|0;if((L|0)==0){E=739;break L921}else{M=L}}else{M=K}K=M;L=ut(I)|0;if((L|0)==0){gk();N=ut(I)|0;if((N|0)==0){E=742;break L921}else{O=N}}else{O=L}L=O;N=m-1|0;I=N<<3;P=ut(I)|0;if((P|0)==0){gk();S=ut(I)|0;if((S|0)==0){E=745;break L921}else{T=S}}else{T=P}P=T;S=m<<3;I=ut(S)|0;if((I|0)==0){gk();U=ut(S)|0;if((U|0)==0){E=748;break L921}else{V=U}}else{V=I}I=V;U=ut(S)|0;if((U|0)==0){gk();W=ut(S)|0;if((W|0)==0){E=751;break L921}else{X=W}}else{X=U}U=X;W=c[200]|0;S=64788+(W*688&-1)|0;Y=+h[C+(B<<6)+8>>3];if((a[S]&1)==0){$=Y}else{$=+Z(+(Y*+h[64800+(W*688&-1)>>3]))}h[I>>3]=$;ab=c[144]|0;ac=64788+(ab*688&-1)|0;Y=+h[C+(B<<6)+16>>3];if((a[ac]&1)==0){ad=Y}else{ad=+Z(+(Y*+h[64800+(ab*688&-1)>>3]))}h[U>>3]=ad;if((m|0)>1){ae=64800+(ab*688&-1)|0;ab=64800+(W*688&-1)|0;W=1;do{af=W+B|0;Y=+h[C+(af<<6)+8>>3];if((a[S]&1)==0){ag=Y}else{ag=+Z(+(Y*+h[ab>>3]))}ah=I+(W<<3)|0;h[ah>>3]=ag;Y=+h[C+(af<<6)+16>>3];if((a[ac]&1)==0){ai=Y}else{ai=+Z(+(Y*+h[ae>>3]))}h[U+(W<<3)>>3]=ai;af=W-1|0;h[P+(af<<3)>>3]=+h[ah>>3]- +h[I+(af<<3)>>3];W=W+1|0;}while((W|0)<(m|0))}W=m-3|0;if((W|0)>=0){I=m-4|0;ae=m-5|0;ac=0;while(1){ab=ac+2|0;S=ac+1|0;Y=+h[U+(S<<3)>>3];af=P+(S<<3)|0;ah=P+(ac<<3)|0;h[K+(ac<<3)>>3]=((+h[U+(ab<<3)>>3]-Y)/+h[af>>3]-(Y- +h[U+(ac<<3)>>3])/+h[ah>>3])*3.0;do{if((ac|0)<2){h[H+(ac*40&-1)>>3]=0.0;if((ac|0)<1){h[H+(ac*40&-1)+8>>3]=0.0;aj=C+(ac+B<<6)+24|0;ak=C+(S+B<<6)+24|0;break}else{al=C+(ac+B<<6)+24|0;am=P+(ac-1<<3)|0;E=770;break}}else{an=C+(ac+B<<6)+24|0;ao=P+(ac-1<<3)|0;h[H+(ac*40&-1)>>3]=6.0/+h[an>>3]/+h[ao>>3]/+h[ah>>3];al=an;am=ao;E=770}}while(0);if((E|0)==770){E=0;Y=+h[ah>>3];ap=1.0/Y;ao=C+(S+B<<6)+24|0;h[H+(ac*40&-1)+8>>3]=Y-6.0/+h[al>>3]/Y*(1.0/+h[am>>3]+ap)-6.0/+h[ao>>3]/Y*(ap+1.0/+h[af>>3]);aj=al;ak=ao}ap=+h[ah>>3];Y=+h[af>>3];aq=1.0/ap+1.0/Y;ao=C+(ab+B<<6)+24|0;h[H+(ac*40&-1)+16>>3]=(ap+Y)*2.0+6.0/+h[aj>>3]/ap/ap+aq*6.0/+h[ak>>3]*aq+6.0/+h[ao>>3]/Y/Y;if((ac|0)>(I|0)){h[H+(ac*40&-1)+24>>3]=0.0}else{Y=+h[af>>3];aq=1.0/Y;h[H+(ac*40&-1)+24>>3]=Y-6.0/+h[ak>>3]/Y*(1.0/+h[ah>>3]+aq)-6.0/+h[ao>>3]/Y*(aq+1.0/+h[P+(ab<<3)>>3])}if((ac|0)>(ae|0)){h[H+(ac*40&-1)+32>>3]=0.0}else{h[H+(ac*40&-1)+32>>3]=6.0/+h[ao>>3]/+h[af>>3]/+h[P+(ab<<3)>>3]}if((S|0)>(W|0)){break}else{ac=S}}}ac=G+40|0;ae=ut(ac)|0;if((ae|0)==0){gk();I=ut(ac)|0;if((I|0)==0){E=780;break L921}else{ar=I}}else{ar=ae}ae=ar;aq=+h[J+16>>3];I=ar;h[I>>3]=aq;if(aq==0.0){E=782;break L921}Y=+h[J+24>>3]/aq;h[ar+8>>3]=Y;ap=+h[J+32>>3]/aq;h[ar+16>>3]=ap;as=+h[J+48>>3];h[ar+64>>3]=as;at=+h[J+56>>3]-Y*as;h[ar+40>>3]=at;if(at==0.0){E=784;break L921}au=(+h[J+64>>3]-ap*as)/at;h[ar+48>>3]=au;h[ar+56>>3]=+h[J+72>>3]/at;if((A|0)>2){ac=2;at=Y;Y=ap;ap=au;while(1){ao=H+(ac*40&-1)|0;au=+h[H+(ac*40&-1)+8>>3]-at*+h[ao>>3];h[ae+(ac*40&-1)+24>>3]=au;as=+h[H+(ac*40&-1)+16>>3]-Y*+h[ao>>3]-ap*au;h[ae+(ac*40&-1)>>3]=as;if(as==0.0){E=787;break L921}av=+h[ae+((ac-1|0)*40&-1)+16>>3];aw=(+h[H+(ac*40&-1)+24>>3]-au*av)/as;h[ae+(ac*40&-1)+8>>3]=aw;h[ae+(ac*40&-1)+16>>3]=+h[H+(ac*40&-1)+32>>3]/as;ao=ac+1|0;if((ao|0)<(A|0)){ac=ao;at=ap;Y=av;ap=aw}else{break}}ax=+h[I>>3]}else{ax=aq}h[ar+32>>3]=0.0;ap=+h[K>>3]/ax;h[ar+72>>3]=ap;if((A|0)>1){ac=1;Y=0.0;at=ap;while(1){ap=(+h[K+(ac<<3)>>3]-Y*+h[H+(ac*40&-1)>>3]-at*+h[ae+(ac*40&-1)+24>>3])/+h[ae+(ac*40&-1)>>3];G=ac+1|0;h[ae+(G*40&-1)+32>>3]=ap;if((G|0)<(A|0)){ac=G;Y=at;at=ap}else{break}}}at=+h[ae+(A*40&-1)+32>>3];h[L+(W<<3)>>3]=at;ac=m-4|0;Y=+h[ae+(W*40&-1)+32>>3]-at*+h[ae+(ac*40&-1)+8>>3];h[L+(ac<<3)>>3]=Y;H=m-5|0;L1015:do{if((H|0)>-1){aq=+h[ae+(ac*40&-1)+32>>3]-Y*+h[ae+(H*40&-1)+8>>3]-at*+h[ae+(H*40&-1)+16>>3];h[L+(H<<3)>>3]=aq;if((H|0)<=0){break}K=m-6|0;ap=+h[ae+(H*40&-1)+32>>3]-aq*+h[ae+(K*40&-1)+8>>3]-Y*+h[ae+(K*40&-1)+16>>3];h[L+(K<<3)>>3]=ap;if((K|0)>0){ay=K;az=ap;aA=aq}else{break}while(1){K=ay-1|0;aq=+h[ae+(ay*40&-1)+32>>3]-az*+h[ae+(K*40&-1)+8>>3]-aA*+h[ae+(K*40&-1)+16>>3];h[L+(K<<3)>>3]=aq;if((K|0)<=0){break L1015}ap=+h[L+(ay<<3)>>3];ay=K;az=aq;aA=ap}}}while(0);uu(ar);ae=F+16|0;h[ae>>3]=0.0;H=(A|0)<1;if(!H){ac=1;do{h[z+(ac<<5)+16>>3]=+h[L+(ac-1<<3)>>3];ac=ac+1|0;}while((ac|0)<=(A|0))}h[z+(N<<5)+16>>3]=0.0;Y=+h[ae>>3];at=+h[F+48>>3];ac=F;h[ac>>3]=+h[U>>3]+2.0/+h[C+(B<<6)+24>>3]/+h[P>>3]*(Y-at);if(!H){L=1;ap=Y;aq=at;while(1){at=+h[P+(L-1<<3)>>3];aw=+h[P+(L<<3)>>3];W=L+1|0;av=+h[z+(W<<5)+16>>3];h[z+(L<<5)>>3]=+h[U+(L<<3)>>3]-2.0/+h[C+(L+B<<6)+24>>3]*(av/aw+(ap/at-aq*(1.0/at+1.0/aw)));if((W|0)>(A|0)){break}else{L=W;ap=aq;aq=av}}}h[z+(N<<5)>>3]=+h[U+(N<<3)>>3]-2.0/+h[C+(N+B<<6)+24>>3]/+h[P+(A<<3)>>3]*+h[z+(A<<5)+16>>3];if((A|0)>=0){L=0;aq=+h[ac>>3];ap=Y;while(1){H=L+1|0;av=+h[z+(H<<5)>>3];ae=P+(L<<3)|0;aw=+h[ae>>3];at=+h[z+(H<<5)+16>>3];h[z+(L<<5)+8>>3]=(av-aq)/aw-aw/3.0*(ap*2.0+at);h[z+(L<<5)+24>>3]=(at-ap)/3.0/+h[ae>>3];if((H|0)>(A|0)){break}else{L=H;aq=av;ap=at}}}uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);ho(b,z,B,m,k+(aa((c[6352]|0)+1|0,l)<<6)|0);uu(F)}else if((o|0)==3){c[200]=c[p>>2];c[144]=c[g>>2];if((m|0)<3){E=667;break L921}L=c[e>>2]|0;A=m<<5;P=ut(A)|0;if((P|0)==0){gk();ac=ut(A)|0;if((ac|0)==0){E=670;break L921}else{aB=ac}}else{aB=P}P=aB;ac=m-2|0;A=ac*24&-1;N=ut(A)|0;if((N|0)==0){gk();C=ut(A)|0;if((C|0)==0){E=673;break L921}else{aC=C}}else{aC=N}N=aC;C=ac<<3;A=ut(C)|0;if((A|0)==0){gk();U=ut(C)|0;if((U|0)==0){E=676;break L921}else{aD=U}}else{aD=A}A=aD;U=ut(C)|0;if((U|0)==0){gk();H=ut(C)|0;if((H|0)==0){E=679;break L921}else{aE=H}}else{aE=U}U=aE;H=m-1|0;C=H<<3;ae=ut(C)|0;if((ae|0)==0){gk();W=ut(C)|0;if((W|0)==0){E=682;break L921}else{aF=W}}else{aF=ae}ae=aF;W=m<<3;C=ut(W)|0;if((C|0)==0){gk();S=ut(W)|0;if((S|0)==0){E=685;break L921}else{aG=S}}else{aG=C}C=aG;S=ut(W)|0;if((S|0)==0){gk();ab=ut(W)|0;if((ab|0)==0){E=688;break L921}else{aH=ab}}else{aH=S}S=aH;ab=c[200]|0;W=64788+(ab*688&-1)|0;ap=+h[L+(B<<6)+8>>3];if((a[W]&1)==0){aI=ap}else{aI=+Z(+(ap*+h[64800+(ab*688&-1)>>3]))}h[C>>3]=aI;af=c[144]|0;ah=64788+(af*688&-1)|0;ap=+h[L+(B<<6)+16>>3];if((a[ah]&1)==0){aJ=ap}else{aJ=+Z(+(ap*+h[64800+(af*688&-1)>>3]))}h[S>>3]=aJ;if((m|0)>1){K=64800+(af*688&-1)|0;af=64800+(ab*688&-1)|0;ab=1;do{I=ab+B|0;ap=+h[L+(I<<6)+8>>3];if((a[W]&1)==0){aK=ap}else{aK=+Z(+(ap*+h[af>>3]))}G=C+(ab<<3)|0;h[G>>3]=aK;ap=+h[L+(I<<6)+16>>3];if((a[ah]&1)==0){aL=ap}else{aL=+Z(+(ap*+h[K>>3]))}h[S+(ab<<3)>>3]=aL;I=ab-1|0;h[ae+(I<<3)>>3]=+h[G>>3]- +h[C+(I<<3)>>3];ab=ab+1|0;}while((ab|0)<(m|0))}ab=m-3|0;if((ab|0)>=0){C=m-4|0;K=0;while(1){ah=K+1|0;ap=+h[S+(ah<<3)>>3];L=ae+(ah<<3)|0;af=ae+(K<<3)|0;h[A+(K<<3)>>3]=((+h[S+(K+2<<3)>>3]-ap)/+h[L>>3]-(ap- +h[S+(K<<3)>>3])/+h[af>>3])*3.0;if((K|0)<1){h[N+(K*24&-1)>>3]=0.0}else{h[N+(K*24&-1)>>3]=+h[af>>3]}h[N+(K*24&-1)+8>>3]=(+h[af>>3]+ +h[L>>3])*2.0;if((K|0)>(C|0)){h[N+(K*24&-1)+16>>3]=0.0}else{h[N+(K*24&-1)+16>>3]=+h[L>>3]}if((ah|0)>(ab|0)){break}else{K=ah}}}if((ac|0)>1){K=1;do{C=K-1|0;ap=+h[N+(C*24&-1)+8>>3];if(ap==0.0){E=898;break L921}aq=+h[N+(K*24&-1)>>3]/ap;ah=N+(K*24&-1)+8|0;h[ah>>3]=+h[ah>>3]-aq*+h[N+(C*24&-1)+16>>3];ah=A+(K<<3)|0;h[ah>>3]=+h[ah>>3]-aq*+h[A+(C<<3)>>3];K=K+1|0;}while((K|0)<(ac|0))}aq=+h[N+(ab*24&-1)+8>>3];if(aq==0.0){E=899;break L921}ap=+h[A+(ab<<3)>>3]/aq;h[U+(ab<<3)>>3]=ap;K=m-4|0;if((K|0)>-1){C=K;aq=ap;while(1){ap=+h[N+(C*24&-1)+8>>3];if(ap==0.0){E=900;break L921}Y=(+h[A+(C<<3)>>3]-aq*+h[N+(C*24&-1)+16>>3])/ap;h[U+(C<<3)>>3]=Y;if((C|0)>0){C=C-1|0;aq=Y}else{break}}}C=aB+16|0;h[C>>3]=0.0;if((ac|0)>=1){N=1;do{h[P+(N<<5)+16>>3]=+h[U+(N-1<<3)>>3];N=N+1|0;}while((N|0)<=(ac|0))}h[P+(H<<5)+16>>3]=0.0;if((H|0)>=0){N=0;do{h[P+(N<<5)>>3]=+h[S+(N<<3)>>3];N=N+1|0;}while((N|0)<=(H|0))}if((ac|0)>=0){H=0;aq=+h[aB>>3];Y=+h[C>>3];while(1){N=H+1|0;ap=+h[P+(N<<5)>>3];S=ae+(H<<3)|0;at=+h[S>>3];av=+h[P+(N<<5)+16>>3];h[P+(H<<5)+8>>3]=(ap-aq)/at-at/3.0*(Y*2.0+av);h[P+(H<<5)+24>>3]=(av-Y)/3.0/+h[S>>3];if((N|0)>(ac|0)){break}else{H=N;aq=ap;Y=av}}}uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);ho(b,P,B,m,k+(aa((c[6352]|0)+1|0,l)<<6)|0);uu(aB)}else if((o|0)==2|(o|0)==4){H=m<<3;ac=ut(H)|0;if((ac|0)==0){gk();ae=ut(H)|0;if((ae|0)==0){E=808;break L921}else{aM=ae}}else{aM=ac}ac=aM;ae=m-1|0;H=(ae|0)/2&-1;h[ac>>3]=0.0;if((ae|0)>1){C=0;Y=0.0;while(1){N=C+1|0;aq=Y+ +_(+(+(ae-C|0)/+(N|0)));h[ac+(N<<3)>>3]=aq;if((N|0)<(H|0)){C=N;Y=aq}else{break}}}if((ae|0)>=(H|0)){C=ae;do{h[ac+(C<<3)>>3]=+h[ac+(ae-C<<3)>>3];C=C-1|0;}while((C|0)>=(H|0))}H=c[6352]|0;C=aa(H+1|0,l);P=c[p>>2]|0;c[200]=P;N=c[g>>2]|0;c[144]=N;Y=+h[64664+(P*688&-1)>>3];if((a[64788+(P*688&-1)|0]&1)==0){aN=+h[64672+(P*688&-1)>>3];aO=Y}else{aq=+_(+Y);Y=+h[64800+(P*688&-1)>>3];aN=+_(+(+h[64672+(P*688&-1)>>3]))/Y;aO=aq/Y}Y=+h[64664+(N*688&-1)>>3];if((a[64788+(N*688&-1)|0]&1)==0){aP=+h[64672+(N*688&-1)>>3];aQ=Y}else{aq=+_(+Y);Y=+h[64800+(N*688&-1)>>3];aP=+_(+(+h[64672+(N*688&-1)>>3]))/Y;aQ=aq/Y}do{if((H|0)>0){N=ae+B|0;Y=+(ae>>>0>>>0);aq=aP;av=aQ;ap=aN;at=aO;P=0;S=H;while(1){aw=+(P|0)/+(S-1|0);U=c[e>>2]|0;do{if(aw==0.0){aR=+h[U+(B<<6)+16>>3];aS=+h[U+(B<<6)+8>>3]}else{if(aw==1.0){aR=+h[U+(N<<6)+16>>3];aS=+h[U+(N<<6)+8>>3];break}as=+_(+(1.0-aw));au=Y*as;aT=+_(+aw)-as;as=0.0;aU=0.0;A=0;while(1){aV=+Z(+(aT*+(A>>>0>>>0)+(au+ +h[ac+(A<<3)>>3])));ab=A+B|0;aW=aU+aV*+h[U+(ab<<6)+8>>3];aX=as+aV*+h[U+(ab<<6)+16>>3];ab=A+1|0;if(ab>>>0>ae>>>0){aR=aX;aS=aW;break}else{as=aX;aU=aW;A=ab}}}}while(0);U=P+C|0;A=k+(U<<6)|0;c[A>>2]=0;h[k+(U<<6)+8>>3]=aS;if(aS<at){if((c[64648+((c[200]|0)*688&-1)>>2]&1|0)==0){aY=at;E=831}else{aZ=aS;E=829}}else{aZ=at;E=829}L1147:do{if((E|0)==829){E=0;if(aS>ap){if((c[64648+((c[200]|0)*688&-1)>>2]&2|0)==0){aY=aZ;E=831;break}else{a_=aS}}else{a_=ap}h[k+(U<<6)+16>>3]=aR;do{if(aR<av){if((c[64648+((c[144]|0)*688&-1)>>2]&1|0)!=0){a$=aR;break}c[A>>2]=1;a0=av;a1=aq;a2=a_;a3=aZ;break L1147}else{a$=av}}while(0);if(aR<=aq){a0=a$;a1=aq;a2=a_;a3=aZ;break}if((c[64648+((c[144]|0)*688&-1)>>2]&2|0)!=0){a0=a$;a1=aR;a2=a_;a3=aZ;break}c[A>>2]=1;a0=a$;a1=aq;a2=a_;a3=aZ}}while(0);if((E|0)==831){E=0;c[A>>2]=1;h[k+(U<<6)+16>>3]=aR;a0=av;a1=aq;a2=ap;a3=aY}h[k+(U<<6)+56>>3]=aS;h[k+(U<<6)+48>>3]=aS;h[k+(U<<6)+40>>3]=aR;h[k+(U<<6)+32>>3]=aR;h[k+(U<<6)+24>>3]=-1.0;ab=P+1|0;K=c[6352]|0;if((ab|0)<(K|0)){aq=a1;av=a0;ap=a2;at=a3;P=ab;S=K}else{break}}if(a2>aN){S=c[200]|0;if((a[64788+(S*688&-1)|0]&1)==0){a4=a2}else{a4=+Z(+(a2*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=a4}if(a3<aO){S=c[200]|0;if((a[64788+(S*688&-1)|0]&1)==0){a5=a3}else{a5=+Z(+(a3*+h[64800+(S*688&-1)>>3]))}h[64664+(S*688&-1)>>3]=a5}if(a1>aP){S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){a6=a1}else{a6=+Z(+(a1*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=a6}if(a0>=aQ){break}S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){a7=a0}else{a7=+Z(+(a0*+h[64800+(S*688&-1)>>3]))}h[64664+(S*688&-1)>>3]=a7}}while(0);uu(aM)}else if((o|0)==8){C=c[6352]|0;ae=aa(C+1|0,l);ac=c[p>>2]|0;c[200]=ac;H=c[g>>2]|0;c[144]=H;at=+h[64664+(ac*688&-1)>>3];if((a[64788+(ac*688&-1)|0]&1)==0){a8=+h[64672+(ac*688&-1)>>3];a9=at}else{ap=+_(+at);at=+h[64800+(ac*688&-1)>>3];a8=+_(+(+h[64672+(ac*688&-1)>>3]))/at;a9=ap/at}at=+h[64664+(H*688&-1)>>3];if((a[64788+(H*688&-1)|0]&1)==0){ba=+h[64672+(H*688&-1)>>3];bb=at}else{ap=+_(+at);at=+h[64800+(H*688&-1)>>3];ba=+_(+(+h[64672+(H*688&-1)>>3]))/at;bb=ap/at}if((C|0)<=0){break}H=m-1|0;at=+(m|0);ap=4.0/(at*3.0);av=ba;aq=bb;Y=a8;aw=a9;ac=0;S=C;while(1){C=S-1|0;P=c[e>>2]|0;aU=0.0;as=0.0;au=1.7976931348623157e+308;aT=-1.7976931348623157e+308;N=0;do{aW=+h[P+(N+B<<6)+8>>3];aU=aU+aW;as=as+aW*aW;au=aW<au?aW:au;aT=aW>aT?aW:aT;N=N+1|0;}while(N>>>0<=H>>>0);aW=aU/at;aX=+Q(+(as/at-aW*aW));aW=aX*+R(+ap,.2);aX=au+(aT-au)*(+(ac|0)/+(C|0));aV=0.0;N=0;do{K=N+B|0;bc=+h[P+(K<<6)+24>>3];bd=bc>0.0?bc:aW;bc=(aX- +h[P+(K<<6)+8>>3])/bd;be=+h[P+(K<<6)+16>>3];aV=aV+be*+Z(+(bc*bc*-.5))/bd;N=N+1|0;}while(N>>>0<=H>>>0);aW=aV/2.5066282746310002;N=ac+ae|0;P=k+(N<<6)|0;c[P>>2]=0;h[k+(N<<6)+8>>3]=aX;if(aX<aw){if((c[64648+((c[200]|0)*688&-1)>>2]&1|0)==0){bf=aw;E=872}else{bg=aX;E=870}}else{bg=aw;E=870}L1205:do{if((E|0)==870){E=0;if(aX>Y){if((c[64648+((c[200]|0)*688&-1)>>2]&2|0)==0){bf=bg;E=872;break}else{bh=aX}}else{bh=Y}h[k+(N<<6)+16>>3]=aW;do{if(aW<aq){if((c[64648+((c[144]|0)*688&-1)>>2]&1|0)!=0){bi=aW;break}c[P>>2]=1;bj=aq;bk=av;bl=bh;bm=bg;break L1205}else{bi=aq}}while(0);if(aW<=av){bj=bi;bk=av;bl=bh;bm=bg;break}if((c[64648+((c[144]|0)*688&-1)>>2]&2|0)!=0){bj=bi;bk=aW;bl=bh;bm=bg;break}c[P>>2]=1;bj=bi;bk=av;bl=bh;bm=bg}}while(0);if((E|0)==872){E=0;c[P>>2]=1;h[k+(N<<6)+16>>3]=aW;bj=aq;bk=av;bl=Y;bm=bf}h[k+(N<<6)+56>>3]=aX;h[k+(N<<6)+48>>3]=aX;h[k+(N<<6)+40>>3]=aW;h[k+(N<<6)+32>>3]=aW;h[k+(N<<6)+24>>3]=-1.0;U=ac+1|0;A=c[6352]|0;if((U|0)<(A|0)){av=bk;aq=bj;Y=bl;aw=bm;ac=U;S=A}else{break}}if(bl>a8){S=c[200]|0;if((a[64788+(S*688&-1)|0]&1)==0){bn=bl}else{bn=+Z(+(bl*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=bn}if(bm<a9){S=c[200]|0;if((a[64788+(S*688&-1)|0]&1)==0){bo=bm}else{bo=+Z(+(bm*+h[64800+(S*688&-1)>>3]))}h[64664+(S*688&-1)>>3]=bo}if(bk>ba){S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){bp=bk}else{bp=+Z(+(bk*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=bp}if(bj>=bb){break}S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){bq=bj}else{bq=+Z(+(bj*+h[64800+(S*688&-1)>>3]))}h[64664+(S*688&-1)>>3]=bq}}while(0);m=l+1|0;c[k+(aa((c[6352]|0)+1|0,m)-1<<6)>>2]=2;if((m|0)<(j|0)){n=D;l=m}else{E=905;break}}if((E|0)==727){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163872,v)|0)}else if((E|0)==729){uf(c[b+4>>2]|0,136680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==733){uf(c[b+4>>2]|0,123304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==736){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=106104,v)|0)}else if((E|0)==673){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=106104,v)|0)}else if((E|0)==676){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=98688,v)|0)}else if((E|0)==739){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=98688,v)|0)}else if((E|0)==742){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=93064,v)|0)}else if((E|0)==745){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=85160,v)|0)}else if((E|0)==748){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77016,v)|0)}else if((E|0)==751){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224768,v)|0)}else if((E|0)==688){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224768,v)|0)}else if((E|0)==679){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=93064,v)|0)}else if((E|0)==682){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=85160,v)|0)}else if((E|0)==685){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77016,v)|0)}else if((E|0)==667){uf(c[b+4>>2]|0,202432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==670){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163872,v)|0)}else if((E|0)==780){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=211832,v)|0)}else if((E|0)==782){uu(ar);uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);br=b+4|0;bs=c[br>>2]|0;uf(bs,217416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==784){uu(ar);uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);br=b+4|0;bs=c[br>>2]|0;uf(bs,217416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==787){uu(ar);uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);br=b+4|0;bs=c[br>>2]|0;uf(bs,217416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==808){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217128,v)|0)}else if((E|0)==898){uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);bt=b+4|0;bu=c[bt>>2]|0;uf(bu,196920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==899){uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);bt=b+4|0;bu=c[bt>>2]|0;uf(bu,196920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==900){uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);bt=b+4|0;bu=c[bt>>2]|0;uf(bu,196920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==905){r=c[e>>2]|0;s=r;uu(s);c[e>>2]=k;t=c[6352]|0;u=t+1|0;w=aa(u,j);x=b+296|0;c[x>>2]=w;y=w-1|0;c[f>>2]=y;i=d;return}}function hm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a+8>>3];d=+h[b+8>>3];if(c>d){e=1;return e|0}e=(c<d)<<31>>31;return e|0}function hn(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,_=0,$=0,aa=0.0,ab=0.0,ac=0.0,ad=0,ae=0.0,af=0.0,ag=0.0,ah=0.0;c[200]=c[b+304>>2];c[144]=c[b+308>>2];d=b+320|0;e=b+300|0;f=b+284|0;g=0;i=0.0;j=0.0;k=0.0;l=0.0;m=0.0;n=0.0;o=0.0;p=0;q=0;while(1){r=c[e>>2]|0;L1281:do{if((q|0)<(r|0)){s=c[d>>2]|0;t=q;while(1){if((c[s+(t<<6)>>2]|0)!=2){u=t;break L1281}v=t+1|0;if((v|0)<(r|0)){t=v}else{u=v;break}}}else{u=q}}while(0);t=0;while(1){w=t+u|0;if((w|0)>=(r|0)){break}if((c[(c[d>>2]|0)+(w<<6)>>2]|0)==2){break}else{t=t+1|0}}if((t|0)>0){x=u;y=p;z=0;A=o;B=n;C=m;D=l;E=k;F=j;G=i;H=g}else{break}while(1){r=c[d>>2]|0;s=c[r+(x<<6)>>2]|0;do{if((s|0)==2){I=H;J=G;K=F;L=E;M=D;N=C;O=B;P=A;Q=z;R=y;S=x}else{T=+h[r+(x<<6)+8>>3];if((z|0)==0){I=(s|0)==0;J=+h[r+(x<<6)+24>>3];K=+h[r+(x<<6)+32>>3];L=+h[r+(x<<6)+40>>3];M=+h[r+(x<<6)+48>>3];N=+h[r+(x<<6)+56>>3];O=+h[r+(x<<6)+16>>3];P=T;Q=1;R=y;S=x;break}if(T==A){I=(s|0)==0&H;J=G+ +h[r+(x<<6)+24>>3];K=F+ +h[r+(x<<6)+32>>3];L=E+ +h[r+(x<<6)+40>>3];M=D+ +h[r+(x<<6)+48>>3];N=C+ +h[r+(x<<6)+56>>3];O=B+ +h[r+(x<<6)+16>>3];P=A;Q=z+1|0;R=y;S=x;break}h[r+(y<<6)+8>>3]=A;v=c[f>>2]|0;if((v|0)==6|(v|0)==7|(v|0)==9){U=1}else{U=z}T=+(U|0);V=B/T;h[(c[d>>2]|0)+(y<<6)+16>>3]=V;h[(c[d>>2]|0)+(y<<6)+56>>3]=C/T;h[(c[d>>2]|0)+(y<<6)+48>>3]=D/T;h[(c[d>>2]|0)+(y<<6)+40>>3]=E/T;h[(c[d>>2]|0)+(y<<6)+32>>3]=F/T;h[(c[d>>2]|0)+(y<<6)+24>>3]=G/T;c[(c[d>>2]|0)+(y<<6)>>2]=0;L1304:do{if(H){W=V;X=A}else{v=c[200]|0;do{if((a[64788+(v*688&-1)|0]&1)==0){Y=A}else{if(A>-8.988465674311579e+307){Y=+Z(+(A*+h[64800+(v*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(y<<6)>>2]=1;W=V;X=A;break L1304}}}while(0);if(Y<+h[64664+(v*688&-1)>>3]){if((c[64648+(v*688&-1)>>2]&1|0)!=0){_=934}}else{_=934}do{if((_|0)==934){_=0;if(Y>+h[64672+(v*688&-1)>>3]){if((c[64648+(v*688&-1)>>2]&2|0)==0){break}}$=c[144]|0;do{if((a[64788+($*688&-1)|0]&1)==0){aa=V}else{if(V>-8.988465674311579e+307){aa=+Z(+(V*+h[64800+($*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(y<<6)>>2]=1;W=V;X=Y;break L1304}}}while(0);if(aa<+h[64664+($*688&-1)>>3]){if((c[64648+($*688&-1)>>2]&1|0)!=0){_=943}}else{_=943}if((_|0)==943){_=0;if(aa<=+h[64672+($*688&-1)>>3]){W=aa;X=Y;break L1304}if((c[64648+($*688&-1)>>2]&2|0)!=0){W=aa;X=Y;break L1304}}c[(c[d>>2]|0)+(y<<6)>>2]=1;W=aa;X=Y;break L1304}}while(0);c[(c[d>>2]|0)+(y<<6)>>2]=1;W=V;X=Y}}while(0);I=H;J=G;K=F;L=E;M=D;N=C;O=W;P=X;Q=0;R=y+1|0;S=x-1|0}}while(0);r=S+1|0;if((r|0)<(w|0)){x=r;y=R;z=Q;A=P;B=O;C=N;D=M;E=L;F=K;G=J;H=I}else{break}}if((Q|0)==0){ab=O;ac=P;ad=R}else{h[(c[d>>2]|0)+(R<<6)+8>>3]=P;V=((c[f>>2]|0)-6|0)>>>0<2?1.0:+(Q|0);T=O/V;h[(c[d>>2]|0)+(R<<6)+16>>3]=T;h[(c[d>>2]|0)+(R<<6)+56>>3]=N/V;h[(c[d>>2]|0)+(R<<6)+48>>3]=M/V;h[(c[d>>2]|0)+(R<<6)+40>>3]=L/V;h[(c[d>>2]|0)+(R<<6)+32>>3]=K/V;h[(c[d>>2]|0)+(R<<6)+24>>3]=J/V;c[(c[d>>2]|0)+(R<<6)>>2]=0;L1337:do{if(I){ae=T;af=P}else{t=c[200]|0;do{if((a[64788+(t*688&-1)|0]&1)==0){ag=P}else{if(P>-8.988465674311579e+307){ag=+Z(+(P*+h[64800+(t*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=T;af=P;break L1337}}}while(0);if(ag<+h[64664+(t*688&-1)>>3]){if((c[64648+(t*688&-1)>>2]&1|0)!=0){_=956}}else{_=956}do{if((_|0)==956){_=0;if(ag>+h[64672+(t*688&-1)>>3]){if((c[64648+(t*688&-1)>>2]&2|0)==0){break}}r=c[144]|0;do{if((a[64788+(r*688&-1)|0]&1)==0){ah=T}else{if(T>-8.988465674311579e+307){ah=+Z(+(T*+h[64800+(r*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=T;af=ag;break L1337}}}while(0);if(ah<+h[64664+(r*688&-1)>>3]){if((c[64648+(r*688&-1)>>2]&1|0)!=0){_=965}}else{_=965}if((_|0)==965){_=0;if(ah<=+h[64672+(r*688&-1)>>3]){ae=ah;af=ag;break L1337}if((c[64648+(r*688&-1)>>2]&2|0)!=0){ae=ah;af=ag;break L1337}}c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=ah;af=ag;break L1337}}while(0);c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=T;af=ag}}while(0);ab=ae;ac=af;ad=R+1|0}if((ad|0)>=(c[e>>2]|0)){g=I;i=J;j=K;k=L;l=M;m=N;n=ab;o=ac;p=ad;q=w;continue}c[(c[d>>2]|0)+(ad<<6)>>2]=2;g=I;i=J;j=K;k=L;l=M;m=N;n=ab;o=ac;p=ad+1|0;q=w}c[e>>2]=p;iR(b,p);return}function ho(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0;j=i;k=c[b+304>>2]|0;c[200]=k;l=c[b+308>>2]|0;c[144]=l;m=+h[64664+(k*688&-1)>>3];if((a[64788+(k*688&-1)|0]&1)==0){n=+h[64672+(k*688&-1)>>3];o=m}else{p=+_(+m);m=+h[64800+(k*688&-1)>>3];n=+_(+(+h[64672+(k*688&-1)>>3]))/m;o=p/m}m=+h[64664+(l*688&-1)>>3];if((a[64788+(l*688&-1)|0]&1)==0){q=+h[64672+(l*688&-1)>>3];r=m}else{p=+_(+m);m=+h[64800+(l*688&-1)>>3];q=+_(+(+h[64672+(l*688&-1)>>3]))/m;r=p/m}l=c[b+320>>2]|0;m=+h[l+(e<<6)+8>>3];p=m>o?m:o;m=+h[l+((e-1|0)+f<<6)+8>>3];s=m<n?m:n;if(p>=s){uf(c[b+4>>2]|0,205704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}b=c[6352]|0;m=(s-p)/+(b-1|0);if((b|0)<=0){i=j;return}b=f-2|0;s=r-(q-r);t=n;u=r;w=q;x=o;f=0;k=0;while(1){y=p+m*+(k|0);z=f;while(1){A=z+1|0;if(y>=+h[l+(A+e<<6)+8>>3]&(z|0)<(b|0)){z=A}else{break}}A=c[200]|0;if((a[64788+(A*688&-1)|0]&1)==0){B=+h[l+(z+e<<6)+8>>3];C=y}else{D=+Z(+(y*+h[64800+(A*688&-1)>>3]));B=+Z(+(+h[l+(z+e<<6)+8>>3]*+h[64800+(A*688&-1)>>3]));C=D}D=C-B;E=+h[d+(z<<5)>>3]+D*(+h[d+(z<<5)+8>>3]+D*(+h[d+(z<<5)+24>>3]*D+ +h[d+(z<<5)+16>>3]));A=c[144]|0;do{if((a[64788+(A*688&-1)|0]&1)==0){F=E}else{if(E<=0.0){F=s;break}D=+_(+E);F=D/+h[64800+(A*688&-1)>>3]}}while(0);A=g+(k<<6)|0;c[A>>2]=0;h[g+(k<<6)+8>>3]=y;do{if(y<x){if((c[64648+((c[200]|0)*688&-1)>>2]&1|0)!=0){G=y;H=993;break}I=x;H=996}else{G=x;H=993}}while(0);L1400:do{if((H|0)==993){H=0;do{if(y>t){if((c[64648+((c[200]|0)*688&-1)>>2]&2|0)!=0){J=y;break}I=G;H=996;break L1400}else{J=t}}while(0);h[g+(k<<6)+16>>3]=F;do{if(F<u){if((c[64648+((c[144]|0)*688&-1)>>2]&1|0)!=0){K=F;break}c[A>>2]=1;L=w;M=u;N=J;O=G;break L1400}else{K=u}}while(0);if(F<=w){L=w;M=K;N=J;O=G;break}if((c[64648+((c[144]|0)*688&-1)>>2]&2|0)!=0){L=F;M=K;N=J;O=G;break}c[A>>2]=1;L=w;M=K;N=J;O=G}}while(0);if((H|0)==996){H=0;c[A>>2]=1;h[g+(k<<6)+16>>3]=F;L=w;M=u;N=t;O=I}h[g+(k<<6)+56>>3]=y;h[g+(k<<6)+48>>3]=y;h[g+(k<<6)+40>>3]=F;h[g+(k<<6)+32>>3]=F;h[g+(k<<6)+24>>3]=-1.0;P=k+1|0;if((P|0)<(c[6352]|0)){t=N;u=M;w=L;x=O;f=z;k=P}else{break}}if(N>n){k=c[200]|0;if((a[64788+(k*688&-1)|0]&1)==0){Q=N}else{Q=+Z(+(N*+h[64800+(k*688&-1)>>3]))}h[64672+(k*688&-1)>>3]=Q}if(O<o){k=c[200]|0;if((a[64788+(k*688&-1)|0]&1)==0){R=O}else{R=+Z(+(O*+h[64800+(k*688&-1)>>3]))}h[64664+(k*688&-1)>>3]=R}if(L>q){k=c[144]|0;if((a[64788+(k*688&-1)|0]&1)==0){S=L}else{S=+Z(+(L*+h[64800+(k*688&-1)>>3]))}h[64672+(k*688&-1)>>3]=S}if(M>=r){i=j;return}k=c[144]|0;if((a[64788+(k*688&-1)|0]&1)==0){T=M}else{T=+Z(+(M*+h[64800+(k*688&-1)>>3]))}h[64664+(k*688&-1)>>3]=T;i=j;return}function hp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;if((a|0)<1|(b|0)<1){e=0;i=d;return e|0}f=a<<2;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217072,v)|0);return 0}else{j=g}}while(0);g=j;j=aa(a<<3,b);f=ut(j)|0;do{if((f|0)==0){gk();h=ut(j)|0;if((h|0)!=0){k=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163832,v)|0);return 0}else{k=f}}while(0);f=k;c[g>>2]=f;if((a|0)>1){l=1;m=f}else{e=g;i=d;return e|0}while(1){f=m+(b<<3)|0;c[g+(l<<2)>>2]=f;k=l+1|0;if((k|0)<(a|0)){l=k;m=f}else{e=g;break}}i=d;return e|0}function hq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0;f=(b|0)>0;if(f){g=-1;i=0;j=a}else{return}while(1){k=e+(c[d+(i<<2)>>2]<<3)|0;l=+h[k>>3];m=e+(i<<3)|0;h[k>>3]=+h[m>>3];do{if((g|0)>-1){k=i-1|0;if((g|0)>(k|0)){n=l;o=g;break}p=g;q=l;r=e+(g<<3)|0;s=(c[j>>2]|0)+(g<<3)|0;while(1){t=q- +h[s>>3]*+h[r>>3];u=p+1|0;if((u|0)>(k|0)){n=t;o=g;break}else{p=u;q=t;r=r+8|0;s=s+8|0}}}else{if(l==0.0){n=l;o=g;break}n=l;o=i}}while(0);h[m>>3]=n;s=i+1|0;if((s|0)<(b|0)){g=o;i=s;j=j+4|0}else{break}}if(f){v=a+(b<<2)|0;w=b}else{return}while(1){a=v-4|0;f=w-1|0;j=e+(f<<3)|0;L1476:do{if((w|0)<(b|0)){i=w;o=e+(w<<3)|0;g=(c[a>>2]|0)+(w<<3)|0;n=+h[j>>3];while(1){l=n- +h[g>>3]*+h[o>>3];h[j>>3]=l;d=i+1|0;if((d|0)>=(b|0)){x=l;break L1476}i=d;o=o+8|0;g=g+8|0;n=l}}else{x=+h[j>>3]}}while(0);h[j>>3]=x/+h[(c[a>>2]|0)+(f<<3)>>3];if((f|0)>0){v=a;w=f}else{break}}return}function hr(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0;k=i;l=(g|0)>0;L1485:do{if(l){m=(b|0)==0;n=0;L1487:while(1){o=n+1|0;if((o|0)<(f|0)){p=a+(n<<2)|0;q=(o|0)<(g|0);r=b+(n<<3)|0;s=o;do{t=a+(s<<2)|0;u=+h[(c[t>>2]|0)+(n<<3)>>3];do{if(u!=0.0){w=(c[p>>2]|0)+(n<<3)|0;x=+h[w>>3];y=+P(+x);do{if(y<+P(+u)*2.220446049250313e-16){z=1.0;A=1.0;B=0.0;C=-0.0-u}else{if(x>0.0){D=1.0}else{D=+((x<0.0)<<31>>31|0)}E=D*+Q(+(x*x+u*u));if(E==0.0){break L1487}F=x/E;G=(-0.0-u)/E;if(+P(+G)<F){z=G;A=G;B=F;C=E;break}if(G>0.0){H=1.0}else{H=+((G<0.0)<<31>>31|0)}z=H/F;A=G;B=F;C=E}}while(0);h[w>>3]=C;h[(c[t>>2]|0)+(n<<3)>>3]=z;if(q){I=o;do{y=+h[(c[p>>2]|0)+(I<<3)>>3];J=(c[t>>2]|0)+(I<<3)|0;E=+h[J>>3];h[J>>3]=A*y+B*E;h[(c[p>>2]|0)+(I<<3)>>3]=B*y-A*E;I=I+1|0;}while((I|0)<(g|0))}if(m){break}E=+h[r>>3];I=b+(s<<3)|0;y=+h[I>>3];h[I>>3]=A*E+B*y;h[r>>3]=B*E-A*y}}while(0);s=s+1|0;}while((s|0)<(f|0))}if((o|0)<(g|0)){n=o}else{break L1485}}be(42289,136640,(v=i,i=i+16|0,h[v>>3]=x,h[v+8>>3]=u,v)|0);fb()}}while(0);if((b|0)==0){i=k;return}n=g-1|0;L1519:do{if(l){m=n;while(1){u=+h[b+(m<<3)>>3];h[e+(m<<3)>>3]=0.0;s=m+1|0;r=c[a+(m<<2)>>2]|0;if((s|0)<(g|0)){x=u;p=s;while(1){A=x+ +h[r+(p<<3)>>3]*+h[d+(p<<3)>>3];s=p+1|0;if((s|0)<(g|0)){x=A;p=s}else{K=A;break}}}else{K=u}x=+h[r+(m<<3)>>3];if(x==0.0){break}h[d+(m<<3)>>3]=(-0.0-K)/x;if((m|0)>0){m=m-1|0}else{break L1519}}uD(42289,123272,28);fb()}}while(0);if((g|0)<(f|0)){d=g;do{h[e+(d<<3)>>3]=+h[b+(d<<3)>>3];d=d+1|0;}while((d|0)<(f|0))}if((j|0)==0|l^1){i=k;return}l=(f|0)>0;j=n;while(1){if(l){n=e+(j<<3)|0;d=f;do{d=d-1|0;K=+h[(c[a+(d<<2)>>2]|0)+(j<<3)>>3];do{if(K==1.0){L=1.0;M=0.0}else{x=+P(+K);if(x<1.0){L=K;M=+Q(+(1.0-K*K));break}A=1.0/x;if(K>0.0){N=1.0}else{N=+((K<0.0)<<31>>31|0)}L=N*+Q(+(1.0-A*A));M=A}}while(0);K=+h[n>>3];r=e+(d<<3)|0;u=+h[r>>3];h[r>>3]=K*(-0.0-L)+M*u;h[n>>3]=M*K+L*u;}while((d|0)>0)}if((j|0)>0){j=j-1|0}else{break}}i=k;return}function hs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;e=0;while(1){if((e|0)>=(d|0)){break}f=b+(e<<2)|0;g=c[f>>2]|0;if((e|0)>0){i=0;j=g;while(1){h[j+(i<<3)>>3]=0.0;k=i+1|0;l=c[f>>2]|0;if((k|0)<(e|0)){i=k;j=l}else{m=l;break}}}else{m=g}h[m+(e<<3)>>3]=1.0;if(+h[(c[a+(e<<2)>>2]|0)+(e<<3)>>3]!=0.0){e=e+1|0}else{n=1108;break}}if((n|0)==1108){uD(42289,106064,30);fb()}n=(d|0)>0;if(n){o=0}else{return}do{e=o;do{m=(c[b+(e<<2)>>2]|0)+(o<<3)|0;p=+h[m>>3];if((o|0)<(e|0)){j=o;q=p;while(1){r=q- +h[(c[a+(j<<2)>>2]|0)+(e<<3)>>3]*+h[(c[b+(j<<2)>>2]|0)+(o<<3)>>3];i=j+1|0;if((i|0)<(e|0)){j=i;q=r}else{s=r;break}}}else{s=p}h[m>>3]=s/+h[(c[a+(e<<2)>>2]|0)+(e<<3)>>3];e=e+1|0;}while((e|0)<(d|0));o=o+1|0;}while((o|0)<(d|0));if(!n){return}n=d-1|0;o=0;do{if((n|0)>=(o|0)){e=d;g=n;while(1){j=(c[b+(g<<2)>>2]|0)+(o<<3)|0;s=+h[j>>3];i=c[a+(g<<2)>>2]|0;if((e|0)<(d|0)){f=e;q=s;while(1){r=q- +h[i+(f<<3)>>3]*+h[(c[b+(f<<2)>>2]|0)+(o<<3)>>3];l=f+1|0;if((l|0)<(d|0)){f=l;q=r}else{t=r;break}}}else{t=s}h[j>>3]=t/+h[i+(g<<3)>>3];f=g-1|0;if((f|0)<(o|0)){break}else{e=g;g=f}}}o=o+1|0;}while((o|0)<(d|0));return}function ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0,H=0,I=0;f=i;if((b|0)<1){h[e>>3]=1.0;g=0;j=g;uu(j);i=f;return}k=b<<3;l=ut(k)|0;do{if((l|0)==0){gk();m=ut(k)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{n=l}}while(0);l=n;h[e>>3]=1.0;n=a+(b<<2)|0;k=a;m=l;while(1){o=c[k>>2]|0;p=o+(b<<3)|0;q=o;r=0.0;L1601:while(1){o=q;while(1){if(o>>>0>=p>>>0){break L1601}s=o+8|0;t=+P(+(+h[o>>3]));if(t>r){q=s;r=t;continue L1601}else{o=s}}}if(r==0.0){u=1137;break}h[m>>3]=1.0/r;q=k+4|0;if(q>>>0<n>>>0){k=q;m=m+8|0}else{break}}if((u|0)==1137){uf(-1,98640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=b-1|0;m=a;k=0;n=-1;while(1){q=(k|0)>0;if(q){p=0;do{o=a+(p<<2)|0;s=c[o>>2]|0;w=s+(k<<3)|0;L1616:do{if((p|0)>0){x=0;t=+h[w>>3];y=s;while(1){z=t- +h[y+(x<<3)>>3]*+h[(c[a+(x<<2)>>2]|0)+(k<<3)>>3];h[w>>3]=z;A=x+1|0;if((A|0)>=(p|0)){break L1616}x=A;t=z;y=c[o>>2]|0}}}while(0);p=p+1|0;}while((p|0)<(k|0))}p=l+(k<<3)|0;r=0.0;o=p;w=n;s=k;while(1){y=a+(s<<2)|0;x=c[y>>2]|0;A=x+(k<<3)|0;t=+h[A>>3];L1625:do{if(q){B=0;z=t;C=x;while(1){D=z- +h[C+(B<<3)>>3]*+h[(c[a+(B<<2)>>2]|0)+(k<<3)>>3];h[A>>3]=D;E=B+1|0;if((E|0)>=(k|0)){F=D;break L1625}B=E;z=D;C=c[y>>2]|0}}else{F=t}}while(0);t=+h[o>>3];z=t*+P(+F);y=z<r;G=y?w:s;A=s+1|0;if((A|0)<(b|0)){r=y?r:z;o=o+8|0;w=G;s=A}else{break}}if((k|0)!=(G|0)){s=0;w=c[a+(G<<2)>>2]|0;o=c[m>>2]|0;while(1){r=+h[w>>3];h[w>>3]=+h[o>>3];h[o>>3]=r;q=s+1|0;if((q|0)<(b|0)){s=q;w=w+8|0;o=o+8|0}else{break}}h[e>>3]=-0.0- +h[e>>3];h[l+(G<<3)>>3]=+h[p>>3]}c[d+(k<<2)>>2]=G;o=(c[m>>2]|0)+(k<<3)|0;if(+h[o>>3]==0.0){h[o>>3]=1.0e-30}do{if((k|0)==(u|0)){H=k+1|0}else{r=1.0/+h[(c[m>>2]|0)+(k<<3)>>3];o=k+1|0;if((o|0)<(b|0)){I=o}else{H=o;break}while(1){w=(c[a+(I<<2)>>2]|0)+(k<<3)|0;h[w>>3]=r*+h[w>>3];w=I+1|0;if((w|0)<(b|0)){I=w}else{H=o;break}}}}while(0);if((H|0)<(b|0)){m=m+4|0;k=H;n=G}else{g=l;break}}j=g;uu(j);i=f;return}function hu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=ut(16)|0;do{if((d|0)==0){gk();e=ut(16)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213800,v)|0);return 0}else{f=d}}while(0);d=f;c[f+4>>2]=(a|0)<0?0:a;c[f+8>>2]=0;if((a|0)<=0){c[f+12>>2]=0;g=f;c[g>>2]=0;i=b;return d|0}e=a<<6;a=ut(e)|0;do{if((a|0)==0){gk();h=ut(e)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217008,v)|0);return 0}else{j=a}}while(0);c[f+12>>2]=j;uE(j|0,0,e|0);g=f;c[g>>2]=0;i=b;return d|0}function hv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+4|0;if((c[e>>2]|0)==(b|0)){i=d;return}f=a+12|0;a=c[f>>2]|0;g=(a|0)==0;if((b|0)<=0){if(!g){uu(a)}c[f>>2]=0;c[e>>2]=0;i=d;return}do{if(g){h=b<<6;j=ut(h)|0;if((j|0)!=0){k=j;break}gk();j=ut(h)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217008,v)|0)}else{k=db(a,b<<6,214200)|0}}while(0);a=k;c[f>>2]=a;f=c[e>>2]|0;if((f|0)<(b|0)){uE(a+(f<<6)|0,0,b-f<<6|0)}c[e>>2]=b;i=d;return}function hw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;f=i;hx(b,d,0);a[46896]=e&1;if((b|0)==0){uj(-1,76976,(v=i,i=i+16|0,c[v>>2]=e?224760:217408,c[v+8>>2]=d,v)|0)}if((c[o>>2]|0)==(b|0)){a[37400]=1;do{}while((dI()|0)==0);g=hy()|0;i=f;return}c[13896]=0;if(e){c[13896]=0;d=c[13898]|0;h=c[8272]|0;L1694:do{if((d|0)<(h|0)){j=d;k=h;while(1){l=c[1054]|0;m=(a[l+(j*40&-1)|0]&1)==0;L1697:do{if(!m){n=c[l+(j*40&-1)+36>>2]|0;p=l+(j*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+103664|0]|0)){r=r+1|0}else{break L1697}}if((r|0)==1){s=k;t=j;break L1694}}}while(0);p=c[13896]|0;if((p|0)>=10){s=k;t=j;break L1694}do{if(m){c[13896]=p+1;u=55544+(p<<2)|0;w=l+(j*40&-1)+32|0;x=1212}else{q=l+(j*40&-1)+32|0;n=a[(c[10036]|0)+(c[q>>2]|0)|0]|0;if(n<<24>>24==39){c[13896]=p+1;y=55544+(p<<2)|0}else{c[13896]=p+1;z=55544+(p<<2)|0;if(n<<24>>24==34){y=z}else{u=z;w=q;x=1212;break}}ub(y,j,j)}}while(0);if((x|0)==1212){x=0;p=c[l+(j*40&-1)+36>>2]|0;m=p+(c[w>>2]|0)|0;q=db(c[u>>2]|0,p+1|0,116456)|0;c[u>>2]=q;p=c[(c[1054]|0)+(j*40&-1)+32>>2]|0;L1714:do{if((p|0)<(m|0)){z=p;n=q;while(1){A=a[(c[10036]|0)+z|0]|0;if(A<<24>>24==0){B=n;break L1714}C=n+1|0;a[n]=A;A=z+1|0;if((A|0)<(m|0)){z=A;n=C}else{B=C;break}}}else{B=q}}while(0);a[B]=0}q=(c[13898]|0)+1|0;c[13898]=q;m=c[8272]|0;if((q|0)<(m|0)){j=q;k=m}else{s=m;t=q;break}}}else{s=h;t=d}}while(0);do{if((t|0)<(s|0)){d=c[1054]|0;if((a[d+(t*40&-1)|0]&1)==0){D=t+1|0;c[13898]=D;uf(D,221400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[d+(t*40&-1)+36>>2]|0;B=d+(t*40&-1)+32|0;d=c[10036]|0;u=0;while(1){if((u|0)>=(h|0)){break}if((a[d+((c[B>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{x=1274;break}}if((x|0)==1274){D=t+1|0;c[13898]=D;uf(D,221400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((u|0)==1){break}D=t+1|0;c[13898]=D;uf(D,221400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[(c[8804]|0)+44>>2]=t}c[9354]=0;a[37400]=0;L1735:while(1){t=0;D=c[10034]|0;s=c[10036]|0;L1737:while(1){if((a6(s+t|0,D|0,b|0)|0)==0){x=1228;break}c[9354]=(c[9354]|0)+1;B=c[10036]|0;d=uA(B|0)|0;h=d-1|0;w=B+h|0;B=a[w]|0;do{if(B<<24>>24==10){a[w]=0;y=(h|0)>0?d-2|0:h;k=(c[10036]|0)+y|0;j=a[k]|0;if(j<<24>>24!=13){E=y;F=j;x=1234;break}a[k]=0;k=(((y|0)>0)<<31>>31)+y|0;E=k;F=a[(c[10036]|0)+k|0]|0;x=1234}else{if((d+1|0)<(D|0)){E=h;F=B;x=1234;break}dG();G=((1-d|0)-1|0)+(c[10034]|0)|0;H=d}}while(0);do{if((x|0)==1234){x=0;if(F<<24>>24==92){G=(c[10034]|0)-E|0;H=E;break}if((a[43472]&1)!=0){dK()}d=jl(40144,40136)|0;c[8272]=d;B=(c[10036]|0)+(c[(c[1054]|0)+(d*40&-1)+32>>2]|0)|0;if((a[B]|0)==35){a[B]=0}B=c[12918]|0;if((B|0)<0){x=1242;break L1735}if((B|0)<=0){x=1244;break L1737}if((E+4|0)>>>0>(c[10034]|0)>>>0){dG()}B=c[10036]|0;d=B+(uA(B|0)|0)|0;a[d]=a[125976]|0;a[d+1|0]=a[125977|0]|0;a[d+2|0]=a[125978|0]|0;d=uA(c[10036]|0)|0;G=(c[10034]|0)-d|0;H=d}}while(0);d=c[10036]|0;if(0){I=0;J=d;break}else{t=H;D=G;s=d}}if((x|0)==1244){x=0;I=0;J=c[10036]|0}else if((x|0)==1228){x=0;a[(c[10036]|0)+t|0]=0;I=1;J=c[10036]|0}if((a[J]|0)==0){K=I}else{if(e){s=bP(J|0)|0;a[c[10036]|0]=0;D=0;u=s;while(1){d=a[u]|0;if((d<<24>>24|0)==36){B=u+1|0;L=a[B]|0;do{if((L|0)==35){h=c[13896]|0;if(h>>>0>=10){x=1255;break L1735}be(43480,98608,(v=i,i=i+8|0,c[v>>2]=h,v)|0);M=43480}else if((L|0)==36){M=180784}else{h=L-48|0;if(h>>>0>=10){x=1260;break L1735}if((h|0)>=(c[13896]|0)){M=179864;break}M=c[55544+(h<<2)>>2]|0}}while(0);h=uA(M|0)|0;w=h+1|0;if(((c[10034]|0)-D|0)>>>0<w>>>0){do{dG();}while(((c[10034]|0)-D|0)>>>0<w>>>0)}w=(c[10036]|0)+D|0;uB(w|0,M|0);N=h+D|0;O=B}else if((d<<24>>24|0)==0){break}else{w=D+1|0;if(w>>>0>(c[10034]|0)>>>0){dG();P=a[u]|0}else{P=d}a[(c[10036]|0)+D|0]=P;N=w;O=u}D=N;u=O+1|0}if((D+1|0)>>>0>(c[10034]|0)>>>0){dG()}a[(c[10036]|0)+D|0]=0;uu(s)}a[25280]=0;K=(dJ()|0)==0?I:1}if((K|0)!=0){x=1276;break}}if((x|0)==1255){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=105968,v)|0)}else if((x|0)==1260){uf(-1,85080,(v=i,i=i+8|0,c[v>>2]=L,v)|0)}else if((x|0)==1242){uf(-1,211816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==1276){g=hy()|0;i=f;return}}function hx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=ut(96)|0;do{if((g|0)==0){gk();h=ut(96)|0;if((h|0)!=0){j=h;break}if((b|0)==0){k=c[13898]|0;uf(k,196888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}az(b|0);k=c[13898]|0;uf(k,196888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=g}}while(0);c[j>>2]=b;c[j+4>>2]=d;c[j+8>>2]=e;a[j+12|0]=a[37400]&1;c[j+16>>2]=c[9354];a[j+13|0]=a[46896]&1;c[j+52>>2]=c[13896];c[j+56>>2]=c[13886];c[13886]=0;c[j+60>>2]=c[13887];c[13887]=0;c[j+64>>2]=c[13888];c[13888]=0;c[j+68>>2]=c[13889];c[13889]=0;c[j+72>>2]=c[13890];c[13890]=0;c[j+76>>2]=c[13891];c[13891]=0;c[j+80>>2]=c[13892];c[13892]=0;c[j+84>>2]=c[13893];c[13893]=0;c[j+88>>2]=c[13894];c[13894]=0;c[j+92>>2]=c[13895];c[13895]=0;e=j;d=c[8804]|0;do{if((d|0)==0){c[j+20>>2]=0}else{b=(c[d+20>>2]|0)+1|0;c[j+20>>2]=b;if((b|0)<=250){break}uf(-1,185608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[j+24>>2]=c[9368];a[j+28|0]=a[37464]&1;a[j+29|0]=a[37480]&1;c[j+44>>2]=c[13898];c[j+40>>2]=c[8272];d=((c[8272]|0)*40&-1)+40|0;b=ut(d)|0;do{if((b|0)==0){gk();g=ut(d)|0;if((g|0)!=0){l=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180384,v)|0)}else{l=b}}while(0);c[j+36>>2]=l;uD(l|0,c[1054]|0,((c[8272]|0)*40&-1)+40|0);l=c[10036]|0;if((l|0)==0){m=0;n=j+32|0;o=n;c[o>>2]=m;p=c[8804]|0;q=j+48|0;r=q;c[r>>2]=p;c[8804]=e;i=f;return}m=bP(l|0)|0;n=j+32|0;o=n;c[o>>2]=m;p=c[8804]|0;q=j+48|0;r=q;c[r>>2]=p;c[8804]=e;i=f;return}function hy(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[8804]|0;if((d|0)==0){e=0;i=b;return e|0}f=c[d>>2]|0;L1827:do{if(!((f|0)==0|(f|0)==(c[o>>2]|0))){g=c[d+4>>2]|0;do{if((g|0)!=0){if((a[g]|0)!=60){break}a2(f|0);break L1827}}while(0);az(f|0)}}while(0);f=c[13886]|0;if((f|0)!=0){uu(f)}c[13886]=c[d+56>>2];f=c[13887]|0;if((f|0)!=0){uu(f)}c[13887]=c[d+60>>2];f=c[13888]|0;if((f|0)!=0){uu(f)}c[13888]=c[d+64>>2];f=c[13889]|0;if((f|0)!=0){uu(f)}c[13889]=c[d+68>>2];f=c[13890]|0;if((f|0)!=0){uu(f)}c[13890]=c[d+72>>2];f=c[13891]|0;if((f|0)!=0){uu(f)}c[13891]=c[d+76>>2];f=c[13892]|0;if((f|0)!=0){uu(f)}c[13892]=c[d+80>>2];f=c[13893]|0;if((f|0)!=0){uu(f)}c[13893]=c[d+84>>2];f=c[13894]|0;if((f|0)!=0){uu(f)}c[13894]=c[d+88>>2];f=c[13895]|0;if((f|0)!=0){uu(f)}c[13895]=c[d+92>>2];c[13896]=c[d+52>>2];a[46896]=a[d+13|0]&1;a[37400]=a[d+12|0]&1;c[9354]=c[d+16>>2];c[9368]=c[d+24>>2];a[37480]=a[d+29|0]&1;a[37464]=a[d+28|0]&1;f=d+36|0;do{if((c[f>>2]|0)!=0){g=d+40|0;c[8272]=c[g>>2];c[13898]=c[d+44>>2];h=(c[g>>2]|0)+1|0;if((c[1052]|0)<(h|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=202392,v)|0);return 0}else{uD(c[1054]|0,c[f>>2]|0,h*40&-1);uu(c[f>>2]|0);break}}}while(0);f=d+32|0;h=c[f>>2]|0;if((h|0)!=0){g=c[10036]|0;uB(g|0,h|0);uu(c[f>>2]|0)}uu(c[d+4>>2]|0);uu(c[d+8>>2]|0);c[8804]=c[d+48>>2];uu(d);e=1;i=b;return e|0}function hz(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[3524]|0)==0){if((a|0)==0){i=b;return}d=c[m>>2]|0;aI(154728,34,1,d|0);i=b;return}uu(c[6958]|0);uu(c[6956]|0);d=c[c[3524]>>2]|0;if((d|0)==0){e=0}else{e=bP(d|0)|0}c[6958]=e;e=bP(13048)|0;c[6956]=e;if((a|0)==0){i=b;return}cf(c[m>>2]|0,164104,(v=i,i=i+16|0,c[v>>2]=c[6958],c[v+8>>2]=e,v)|0);i=b;return}function hA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;L1890:do{if((a[b]|0)==60){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=bt(b+1|0,193632)|0;if((f|0)==0){g=0}else{h=f;break}i=e;return g|0}else{f=bF(b|0,d|0)|0;if((f|0)==0){j=0}else{h=f;break}while(1){f=c[8776]|0;if((f|0)==0){break}k=c[8774]|0;do{if((k|0)==0){c[8774]=f;l=c[8778]|0;if((l|0)!=0){m=f;n=l;break}l=c[8780]|0;c[8778]=l;m=f;n=l}else{l=k+((uA(k|0)|0)+1|0)|0;c[8774]=l;m=l;n=c[8778]|0}}while(0);if(m>>>0>=n>>>0){o=1356;break}if((m|0)==0){break}k=uA(m|0)|0;p=db(j,(k+2|0)+(uA(b|0)|0)|0,172208)|0;uB(p|0,m|0);k=uA(p|0)|0;f=(k|0)==0?0:k-1|0;k=a[p+f|0]|0;if(!((k<<24>>24|0)==47|(k<<24>>24|0)==0)){a[p+(f+1|0)|0]=47;a[p+(f+2|0)|0]=0}uC(p|0,b|0);q=bF(p|0,d|0)|0;if((q|0)==0){j=p}else{o=1361;break}}if((o|0)==1356){c[8774]=0;c[8778]=0}else if((o|0)==1361){uu(p);f=c[8776]|0;if((f|0)==0){h=q;break}while(1){k=c[8774]|0;do{if((k|0)==0){c[8774]=f;l=c[8778]|0;if((l|0)!=0){r=f;s=l;break}l=c[8780]|0;c[8778]=l;r=f;s=l}else{l=k+((uA(k|0)|0)+1|0)|0;c[8774]=l;r=l;s=c[8778]|0}}while(0);if(r>>>0>=s>>>0){break}if((r|0)==0|(f|0)==0){h=q;break L1890}}c[8774]=0;c[8778]=0;h=q;break}if((j|0)==0){h=0;break}uu(j);h=0}}while(0);g=h;i=e;return g|0}function hB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((a[b]|0)==60){uj(-1,168312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}L1930:do{if((bF(b|0,193632)|0)==0){e=ur(8,0)|0;if((e|0)==0){f=0;break}else{g=e}while(1){h=bP(g|0)|0;e=h+((uA(h|0)|0)-1|0)|0;if((a[e]|0)==33){a[e]=0;j=1}else{j=0}k=hC(h,b,j)|0;if((k|0)!=0){break}uu(h);e=ur(8,0)|0;if((e|0)==0){f=0;break L1930}else{g=e}}do{}while((ur(8,0)|0)!=0);uu(h);f=k}else{if((b|0)==0){f=0;break}f=bP(b|0)|0}}while(0);i=d;return f|0}function hC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+72|0;g=f|0;h=uA(b|0)|0;j=(h+2|0)+(uA(d|0)|0)|0;h=ut(j)|0;do{if((h|0)==0){gk();k=ut(j)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=223784,v)|0);return 0}else{l=h}}while(0);uB(l|0,b|0);h=uA(l|0)|0;j=(h|0)==0?0:h-1|0;h=a[l+j|0]|0;if(!((h<<24>>24|0)==47|(h<<24>>24|0)==0)){a[l+(j+1|0)|0]=47;a[l+(j+2|0)|0]=0}uC(l|0,d|0);j=bF(l|0,193632)|0;if((j|0)!=0){az(j|0);m=l;i=f;return m|0}uu(l);if(!e){m=0;i=f;return m|0}e=aW(b|0)|0;if((e|0)==0){m=0;i=f;return m|0}l=a3(e|0)|0;L1962:do{if((l|0)==0){n=0}else{j=g+8|0;h=l;while(1){k=uA(b|0)|0;o=h+4|0;p=(k+2|0)+(uA(o|0)|0)|0;k=ut(p)|0;if((k|0)==0){gk();q=ut(p)|0;if((q|0)==0){break}else{r=q}}else{r=k}uB(r|0,b|0);k=uA(r|0)|0;q=(k|0)==0?0:k-1|0;k=a[r+q|0]|0;if(!((k<<24>>24|0)==47|(k<<24>>24|0)==0)){a[r+(q+1|0)|0]=47;a[r+(q+2|0)|0]=0}uC(r|0,o|0);cu(r|0,g|0);do{if((c[j>>2]&61440|0)==16384){if((aY(o|0,202200)|0)==0){break}if((aY(o|0,221856)|0)==0){break}q=hC(r,d,1)|0;if((q|0)!=0){n=q;break L1962}}}while(0);uu(r);o=a3(e|0)|0;if((o|0)==0){n=0;break L1962}else{h=o}}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=223216,v)|0);return 0}}while(0);bR(e|0);m=n;i=f;return m|0}function hD(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[6958]|0;if((d|0)==0){e=c[m>>2]|0;aI(145512,32,1,e|0);i=b;return}e=(uA(d|0)|0)+11|0;d=c[6956]|0;if((d|0)==0){f=e}else{g=d;while(1){d=a[g]|0;if((d<<24>>24|0)==92|(d<<24>>24|0)==10){a[g]=32}else if((d<<24>>24|0)==0){break}g=g+1|0}f=(uA(c[6956]|0)|0)+e|0}e=ut(f)|0;do{if((e|0)==0){gk();g=ut(f)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=216216,v)|0)}else{h=e}}while(0);e=a[37400]&1;a[37400]=0;f=c[6956]|0;be(h|0,149608,(v=i,i=i+16|0,c[v>>2]=c[6958],c[v+8>>2]=(f|0)!=0?f:179864,v)|0);dL(h);a[37400]=e;if(e<<24>>24==0){i=b;return}e=(a[13048]|0)!=0?13048:179864;cf(c[m>>2]|0,147624,(v=i,i=i+16|0,c[v>>2]=c[c[3524]>>2],c[v+8>>2]=e,v)|0);i=b;return}function hE(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0;d=i;i=i+48|0;e=d|0;f=d+24|0;g=c[13898]|0;j=c[1054]|0;k=c[j+(g*40&-1)+36>>2]|0;l=c[j+(g*40&-1)+32>>2]|0;m=(a[j+(g*40&-1)|0]&1)==0;g=(k|0)>0;j=c[10036]|0;n=43320;o=108448;L2002:while(1){L2004:do{if(!m){if(g){p=0;q=0;r=l;while(1){s=a[o+p|0]|0;if(s<<24>>24==(a[j+(p+r|0)|0]|0)){t=r;u=q}else{if(s<<24>>24!=36){break L2004}t=r-1|0;u=1}w=p+1|0;if((w|0)<(u+k|0)){p=w;q=u;r=t}else{break}}if((u|0)==0){x=w}else{y=n;break L2002}}else{x=0}r=a[o+x|0]|0;if((r<<24>>24|0)==36|(r<<24>>24|0)==0){y=n;break L2002}}}while(0);r=n+8|0;q=c[r>>2]|0;if((q|0)==0){y=r;break}else{n=r;o=q}}o=c[y+4>>2]|0;do{if((o|0)==11){c[b+24>>2]=1;y=(c[13898]|0)+1|0;c[13898]=y;n=c[1054]|0;x=c[n+(y*40&-1)+36>>2]|0;w=c[n+(y*40&-1)+32>>2]|0;u=(a[n+(y*40&-1)|0]&1)==0;y=(x|0)>0;n=c[10036]|0;t=43320;k=108448;L2019:while(1){L2021:do{if(!u){if(y){j=0;l=0;g=w;while(1){m=a[k+j|0]|0;if(m<<24>>24==(a[n+(j+g|0)|0]|0)){z=g;A=l}else{if(m<<24>>24!=36){break L2021}z=g-1|0;A=1}B=j+1|0;if((B|0)<(A+x|0)){j=B;l=A;g=z}else{break}}if((A|0)==0){C=B}else{D=t;break L2019}}else{C=0}g=a[k+C|0]|0;if((g<<24>>24|0)==36|(g<<24>>24|0)==0){D=t;break L2019}}}while(0);g=t+8|0;l=c[g>>2]|0;if((l|0)==0){D=g;break}else{t=g;k=l}}E=c[D+4>>2]|0}else{k=b+24|0;if((o|0)!=12){c[k>>2]=0;E=o;break}c[k>>2]=-1;k=(c[13898]|0)+1|0;c[13898]=k;t=c[1054]|0;x=c[t+(k*40&-1)+36>>2]|0;n=c[t+(k*40&-1)+32>>2]|0;w=(a[t+(k*40&-1)|0]&1)==0;k=(x|0)>0;t=c[10036]|0;y=43320;u=108448;L2038:while(1){L2040:do{if(!w){if(k){l=0;g=0;j=n;while(1){m=a[u+l|0]|0;if(m<<24>>24==(a[t+(l+j|0)|0]|0)){F=j;G=g}else{if(m<<24>>24!=36){break L2040}F=j-1|0;G=1}H=l+1|0;if((H|0)<(G+x|0)){l=H;g=G;j=F}else{break}}if((G|0)==0){I=H}else{J=y;break L2038}}else{I=0}j=a[u+I|0]|0;if((j<<24>>24|0)==36|(j<<24>>24|0)==0){J=y;break L2038}}}while(0);j=y+8|0;g=c[j>>2]|0;if((g|0)==0){J=j;break}else{y=j;u=g}}E=c[J+4>>2]|0}}while(0);J=b|0;if((E|0)==-1){c[J>>2]=0;i=d;return}c[J>>2]=1;c[13898]=(c[13898]|0)+1;J=b+4|0;c[J>>2]=E;I=b+8|0;h[I>>3]=0.0;H=c[13898]|0;if((c[8272]|0)<=(H|0)){i=d;return}G=c[1054]|0;if((a[G+(H*40&-1)|0]&1)==0){i=d;return}F=c[G+(H*40&-1)+36>>2]|0;o=G+(H*40&-1)+32|0;G=c[10036]|0;D=0;while(1){if((D|0)>=(F|0)){break}if((a[G+((c[o>>2]|0)+D|0)|0]|0)==(a[D+115e3|0]|0)){D=D+1|0}else{K=1504;break}}if((K|0)==1504){i=d;return}if((D|0)!=1){i=d;return}if((E|0)<9){c[J>>2]=E+4;L=c[13898]|0}else{L=H}c[13898]=L+1;L=is(e)|0;H=c[L>>2]|0;if((H|0)==1){M=+(c[L+8>>2]|0)}else if((H|0)==2){M=+h[L+8>>3]}else if((H|0)==3){M=+uz(c[L+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L=e|0;if((c[L>>2]|0)==3){uu(c[e+8>>2]|0);c[L>>2]=1}h[I>>3]=M;if((E|0)!=9){i=d;return}E=c[13898]|0;if((c[8272]|0)<=(E|0)){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}I=c[1054]|0;if((a[I+(E*40&-1)|0]&1)==0){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L=c[I+(E*40&-1)+36>>2]|0;e=I+(E*40&-1)+32|0;I=c[10036]|0;H=0;while(1){if((H|0)>=(L|0)){break}if((a[I+((c[e>>2]|0)+H|0)|0]|0)==(a[H+148464|0]|0)){H=H+1|0}else{K=1507;break}}if((K|0)==1507){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((H|0)!=1){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=E+1;E=is(f)|0;H=c[E>>2]|0;if((H|0)==1){N=+(c[E+8>>2]|0)}else if((H|0)==2){N=+h[E+8>>3]}else if((H|0)==3){N=+uz(c[E+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}E=f|0;if((c[E>>2]|0)==3){uu(c[f+8>>2]|0);c[E>>2]=1}h[b+16>>3]=N;i=d;return}function hF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0;d=i;if((c[a>>2]|0)==0){i=d;return}e=c[a+24>>2]|0;if((e|0)!=0){f=(e|0)>0?136888:134896;aI(f|0,6,1,b|0)}f=c[a+4>>2]|0;if((f|0)==0){aI(133384,6,1,b|0);i=d;return}if((f|0)<5){e=c[43320+(f<<3)>>2]|0;aK(e|0,b|0);i=d;return}if((f|0)<9){e=c[43320+(f-4<<3)>>2]|0;g=+h[a+8>>3];cf(b|0,131984,(v=i,i=i+16|0,c[v>>2]=e,h[v+8>>3]=g,v)|0);i=d;return}if((f|0)!=9){i=d;return}g=+h[a+16>>3];cf(b|0,130704,(v=i,i=i+16|0,h[v>>3]=+h[a+8>>3],h[v+8>>3]=g,v)|0);i=d;return}function hG(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+56|0;e=d|0;f=e+40|0;g=f;h=b+16|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];h=f|0;g=c[h>>2]|0;if((g|0)==1){b=e+44|0;j=c[b>>2]|0;if((j|0)==-3){k=0;i=d;return k|0}l=c[8798]|0;m=(l|0)>0;n=j;L2142:while(1){o=n+1|0;j=43264;while(1){p=c[j>>2]|0;if((p|0)==0){break}if((c[p+4>>2]|0)==(o|0)){q=1535;break L2142}else{j=p|0}}if(!((o|0)>(l|0)&m)){q=1541;break}n=(n|0)%(l|0)&-1}do{if((q|0)==1535){l=e;m=p+8|0;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];c[l+16>>2]=c[m+16>>2];c[l+20>>2]=c[m+20>>2];c[l+24>>2]=c[m+24>>2];c[l+28>>2]=c[m+28>>2];c[l+32>>2]=c[m+32>>2];c[l+36>>2]=c[m+36>>2];c[l+40>>2]=c[m+40>>2];c[l+44>>2]=c[m+44>>2];c[l+48>>2]=c[m+48>>2];c[l+52>>2]=c[m+52>>2];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[e+4>>2]=o;a[e+32|0]=0;break}if((a[e+32|0]&1)!=0){break}c[e+40>>2]=1;c[b>>2]=c[e+4>>2]}else if((q|0)==1541){c[e+4>>2]=n;c[e+40>>2]=1;c[b>>2]=n;c[e+8>>2]=n}}while(0);r=c[h>>2]|0}else{r=g}if((r|0)==0){k=1;i=d;return k|0}fn(f,c[3524]|0);k=1;i=d;return k|0}
-function hH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0.0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0.0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0.0,bp=0.0,bq=0.0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0.0,bz=0.0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0;f=i;i=i+272|0;g=f|0;j=f+24|0;k=f+48|0;l=f+72|0;m=f+96|0;n=f+120|0;o=f+144|0;p=f+168|0;q=f+192|0;r=f+216|0;s=r;t=b;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[s+16>>2]=c[t+16>>2];c[s+20>>2]=c[t+20>>2];c[s+24>>2]=c[t+24>>2];c[s+28>>2]=c[t+28>>2];c[s+32>>2]=c[t+32>>2];c[s+36>>2]=c[t+36>>2];c[s+40>>2]=c[t+40>>2];c[s+44>>2]=c[t+44>>2];c[s+48>>2]=c[t+48>>2];c[s+52>>2]=c[t+52>>2];L2163:do{if(d){s=c[13898]|0;u=c[1054]|0;w=c[u+(s*40&-1)+36>>2]|0;x=c[u+(s*40&-1)+32>>2]|0;y=(a[u+(s*40&-1)|0]&1)==0;L2165:do{if((w|0)>0&(y^1)){u=c[10036]|0;z=0;A=0;B=x;while(1){if((a[z+73824|0]|0)==(a[u+(z+B|0)|0]|0)){C=B;D=A}else{if((z|0)!=5){E=1558;break L2165}C=B-1|0;D=1}F=z+1|0;if((F|0)<(D+w|0)){z=F;A=D;B=C}else{break}}if((D|0)!=0){break}if(!((z|0)==4|(z|0)==9)){E=1558}}else{E=1558}}while(0);if((E|0)==1558){if((c[8272]|0)<=(s|0)|y){break}B=c[10036]|0;A=0;while(1){if((A|0)>=(w|0)){break}if((a[B+(x+A|0)|0]|0)==(a[A+72816|0]|0)){A=A+1|0}else{break L2163}}if((A|0)!=2){break}}c[13898]=s+1;x=is(p)|0;B=c[x>>2]|0;if((B|0)==3){G=+uz(c[x+8>>2]|0,0)}else if((B|0)==1){G=+(c[x+8>>2]|0)}else if((B|0)==2){G=+h[x+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}x=p|0;if((c[x>>2]|0)==3){uu(c[p+8>>2]|0);c[x>>2]=1}lK(b,~~G)}}while(0);p=c[13898]|0;D=c[8272]|0;L2193:do{if((p|0)<(D|0)){C=n|0;x=n+8|0;B=r+12|0;w=q|0;y=q+8|0;u=m|0;F=m+8|0;H=r+24|0;I=g|0;J=g+8|0;K=r+8|0;L=j|0;M=j+8|0;N=r+16|0;O=r+32|0;P=r+40|0;Q=r+44|0;R=l|0;S=l+8|0;T=r+48|0;U=k|0;V=k+8|0;W=r+4|0;X=r+40|0;Y=o|0;Z=o+8|0;_=b+4|0;$=d^1;aa=b|0;ab=b+40|0;ac=b+44|0;ad=b+8|0;ae=b+32|0;G=0.0;af=0;ag=0;ah=0;ai=0;aj=0;ak=0;al=0;am=p;an=D;L2195:while(1){ao=c[1054]|0;ap=(a[ao+(am*40&-1)|0]&1)==0;aq=c[ao+(am*40&-1)+36>>2]|0;ar=ao+(am*40&-1)+32|0;L2197:do{if(ap){as=c[ar>>2]|0;E=1587}else{at=c[10036]|0;au=0;while(1){if((au|0)>=(aq|0)){E=1578;break}if((a[at+((c[ar>>2]|0)+au|0)|0]|0)==(a[au+103664|0]|0)){au=au+1|0}else{break}}if((E|0)==1578){E=0;if((au|0)==1){av=al;aw=aj;ax=ai;ay=ah;az=ag;aA=af;aB=ak;aC=am;break L2193}}at=c[ar>>2]|0;if(!((aq|0)>0&(ap^1))){as=at;E=1587;break}aD=c[10036]|0;aE=0;aF=0;aG=at;while(1){if((a[aE+139232|0]|0)==(a[aD+(aE+aG|0)|0]|0)){aH=aG;aI=aF}else{if((aE|0)!=5){as=at;E=1587;break L2197}aH=aG-1|0;aI=1}aJ=aE+1|0;if((aJ|0)<(aI+aq|0)){aE=aJ;aF=aI;aG=aH}else{break}}if((aI|0)!=0){E=1592;break}if((aE|0)==4|(aE|0)==8){E=1592}else{as=at;E=1587}}}while(0);L2215:do{if((E|0)==1587){E=0;if((an|0)<=(am|0)|ap){aK=al;aL=ag;aM=af;break}ar=c[10036]|0;z=0;while(1){if((z|0)>=(aq|0)){break}if((a[ar+(as+z|0)|0]|0)==(a[z+225056|0]|0)){z=z+1|0}else{aK=al;aL=ag;aM=af;break L2215}}if((z|0)==2){E=1592}else{aK=al;aL=ag;aM=af}}}while(0);L2222:do{if((E|0)==1592){E=0;aq=af+1|0;if((af|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=ag;aA=aq;aB=ak;aC=am;break L2193}ap=am+1|0;c[13898]=ap;ar=c[ao+(ap*40&-1)+36>>2]|0;at=c[ao+(ap*40&-1)+32>>2]|0;aE=(a[ao+(ap*40&-1)|0]&1)==0;L2225:do{if((ar|0)>0&(aE^1)){aG=c[10036]|0;aF=0;aD=0;au=at;while(1){if((a[aF+123456|0]|0)==(a[aG+(aF+au|0)|0]|0)){aN=au;aO=aD}else{if((aF|0)!=3){break}aN=au-1|0;aO=1}aJ=aF+1|0;if((aJ|0)<(aO+ar|0)){aF=aJ;aD=aO;au=aN}else{E=1599;break}}do{if((E|0)==1599){E=0;if((aO|0)==0){if(!((aF|0)==2|(aF|0)==8)){break}}au=ag+1|0;if((ag|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=au;aA=aq;aB=ak;aC=ap;break L2193}c[13898]=am;hI(X,3);a[O]=1;aK=al;aL=au;aM=aq;break L2222}}while(0);if(!((ar|0)>0&(aE^1))){break}aF=c[10036]|0;au=0;aD=0;aG=at;while(1){if((a[au+205488|0]|0)==(a[aF+(au+aG|0)|0]|0)){aP=aG;aQ=aD}else{if((au|0)!=3){break L2225}aP=aG-1|0;aQ=1}aJ=au+1|0;if((aJ|0)<(aQ+ar|0)){au=aJ;aD=aQ;aG=aP}else{break}}if((aQ|0)==0){if(!((au|0)==2|(au|0)==7)){break}}aG=ag+1|0;if((ag|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=aG;aA=aq;aB=ak;aC=ap;break L2193}c[13898]=am;hI(X,6);a[O]=1;aK=al;aL=aG;aM=aq;break L2222}}while(0);L2253:do{if(!((an|0)<=(ap|0)|aE)){z=c[10036]|0;aG=0;while(1){if((aG|0)>=(ar|0)){break}if((a[z+(at+aG|0)|0]|0)==(a[aG+120376|0]|0)){aG=aG+1|0}else{break L2253}}if((aG|0)!=4){break}c[t>>2]=c[14158];c[t+4>>2]=c[14159];c[t+8>>2]=c[14160];c[t+12>>2]=c[14161];c[t+16>>2]=c[14162];c[t+20>>2]=c[14163];c[t+24>>2]=c[14164];c[t+28>>2]=c[14165];c[t+32>>2]=c[14166];c[t+36>>2]=c[14167];c[t+40>>2]=c[14168];c[t+44>>2]=c[14169];c[t+48>>2]=c[14170];c[t+52>>2]=c[14171];c[13898]=(c[13898]|0)+1;aK=al;aL=ag;aM=aq;break L2222}}while(0);at=is(o)|0;ar=c[at>>2]|0;if((ar|0)==1){aR=+(c[at+8>>2]|0)}else if((ar|0)==2){aR=+h[at+8>>3]}else if((ar|0)==3){aR=+uz(c[at+8>>2]|0,0)}else{E=1623;break L2195}if((c[Y>>2]|0)==3){uu(c[Z>>2]|0);c[Y>>2]=1}at=~~aR;c[_>>2]=at-1;if(!((a[30080]&1)==0|$)){lK(b,at);aK=at;aL=ag;aM=aq;break}ar=c[aa>>2]|0;aE=c[8798]|0;ap=(aE|0)>0;z=at;L2272:while(1){au=43264;while(1){aS=c[au>>2]|0;if((aS|0)==0){break}if((c[aS+4>>2]|0)==(z|0)){break L2272}else{au=aS|0}}aT=z-1|0;if(!((z|0)>(aE|0)&ap)){E=1638;break}z=((aT|0)%(aE|0)&-1)+1|0}if((E|0)==1638){E=0;c[_>>2]=aT;c[ab>>2]=1;c[ac>>2]=aT;c[ad>>2]=aT;aK=at;aL=ag;aM=aq;break}aE=aS+8|0;c[t>>2]=c[aE>>2];c[t+4>>2]=c[aE+4>>2];c[t+8>>2]=c[aE+8>>2];c[t+12>>2]=c[aE+12>>2];c[t+16>>2]=c[aE+16>>2];c[t+20>>2]=c[aE+20>>2];c[t+24>>2]=c[aE+24>>2];c[t+28>>2]=c[aE+28>>2];c[t+32>>2]=c[aE+32>>2];c[t+36>>2]=c[aE+36>>2];c[t+40>>2]=c[aE+40>>2];c[t+44>>2]=c[aE+44>>2];c[t+48>>2]=c[aE+48>>2];c[t+52>>2]=c[aE+52>>2];c[aa>>2]=ar;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[_>>2]=z;a[ae]=0;aK=at;aL=ag;aM=aq;break}if((a[ae]&1)!=0){aK=at;aL=ag;aM=aq;break}c[ab>>2]=1;c[ac>>2]=c[_>>2];aK=at;aL=ag;aM=aq}}while(0);ao=c[13898]|0;aE=c[1054]|0;ap=c[aE+(ao*40&-1)+36>>2]|0;au=c[aE+(ao*40&-1)+32>>2]|0;aG=(a[aE+(ao*40&-1)|0]&1)==0;L2287:do{if((ap|0)>0&(aG^1)){aD=c[10036]|0;aF=0;aJ=0;aU=au;while(1){if((a[aF+205488|0]|0)==(a[aD+(aF+aU|0)|0]|0)){aV=aU;aW=aJ}else{if((aF|0)!=3){E=1650;break L2287}aV=aU-1|0;aW=1}aX=aF+1|0;if((aX|0)<(aW+ap|0)){aF=aX;aJ=aW;aU=aV}else{break}}if((aW|0)==0){if(!((aF|0)==2|(aF|0)==7)){E=1650;break}}aU=aL+1|0;if((aL|0)!=0){av=aK;aw=aj;ax=ai;ay=ah;az=aU;aA=aM;aB=ak;aC=ao;break L2193}c[13898]=ao-1;hI(X,6);a[O]=1;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aU;a1=aM;a2=G}else{E=1650}}while(0);L2300:do{if((E|0)==1650){E=0;aU=c[8272]|0;aJ=(aU|0)>(ao|0);L2302:do{if(aJ){if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}aD=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){break}if((a[aD+(au+aq|0)|0]|0)==(a[aq+119088|0]|0)){aq=aq+1|0}else{E=1656;break L2302}}if((aq|0)!=2){E=1656}}else{E=1656}}while(0);L2309:do{if((E|0)==1656){E=0;L2311:do{if((ap|0)>0&(aG^1)){aF=c[10036]|0;aD=0;at=0;z=au;while(1){if((a[aD+116144|0]|0)==(a[aF+(aD+z|0)|0]|0)){a3=z;a4=at}else{if((aD|0)!=5){break L2311}a3=z-1|0;a4=1}ar=aD+1|0;if((ar|0)<(a4+ap|0)){aD=ar;at=a4;z=a3}else{break}}if((a4|0)!=0){break L2309}if((aD|0)==4|(aD|0)==9){break L2309}}}while(0);L2322:do{if(aJ){if(aG){E=1746;break}aq=c[10036]|0;z=0;while(1){if((z|0)>=(ap|0)){break}if((a[aq+(au+z|0)|0]|0)==(a[z+179168|0]|0)){z=z+1|0}else{E=1670;break L2322}}if((z|0)==2){break L2309}else{E=1670}}else{E=1670}}while(0);L2329:do{if((E|0)==1670){E=0;if(!((ap|0)>0&(aG^1))){E=1746;break}aq=c[10036]|0;aD=0;at=0;aF=au;while(1){if((a[aD+178592|0]|0)==(a[aq+(aD+aF|0)|0]|0)){a5=aF;a6=at}else{if((aD|0)!=5){break}a5=aF-1|0;a6=1}ar=aD+1|0;if((ar|0)<(a6+ap|0)){aD=ar;at=a6;aF=a5}else{E=1676;break}}if((E|0)==1676){E=0;if((a6|0)!=0){break L2309}if((aD|0)==4|(aD|0)==9){break L2309}}if(!((ap|0)>0&(aG^1))){E=1746;break}aF=c[10036]|0;at=0;aq=0;z=au;while(1){if((a[at+128400|0]|0)==(a[aF+(at+z|0)|0]|0)){a7=z;a8=aq}else{if((at|0)!=5){E=1746;break L2329}a7=z-1|0;a8=1}ar=at+1|0;if((ar|0)<(a8+ap|0)){at=ar;aq=a8;z=a7}else{break}}if((a8|0)!=0){break}if(!((at|0)==4|(at|0)==9)){E=1746}}}while(0);L2351:do{if((E|0)==1746){E=0;L2353:do{if(aJ){if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}z=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){E=1751;break}if((a[z+(au+aq|0)|0]|0)==(a[aq+128296|0]|0)){aq=aq+1|0}else{break}}if((E|0)==1751){E=0;if((aq|0)==2){break L2351}}if(!aJ){break}if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}z=c[10036]|0;aF=0;while(1){if((aF|0)>=(ap|0)){break}if((a[z+(au+aF|0)|0]|0)==(a[aF+120376|0]|0)){aF=aF+1|0}else{break L2353}}if((aF|0)!=4){break}z=aM+1|0;if((aM|0)!=0){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=z;aB=ak;aC=ao;break L2193}c[13898]=ao+1;c[t>>2]=c[14158];c[t+4>>2]=c[14159];c[t+8>>2]=c[14160];c[t+12>>2]=c[14161];c[t+16>>2]=c[14162];c[t+20>>2]=c[14163];c[t+24>>2]=c[14164];c[t+28>>2]=c[14165];c[t+32>>2]=c[14166];c[t+36>>2]=c[14167];c[t+40>>2]=c[14168];c[t+44>>2]=c[14169];c[t+48>>2]=c[14170];c[t+52>>2]=c[14171];aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=z;a2=G;break L2300}}while(0);L2371:do{if((ap|0)>0&(aG^1)){at=c[10036]|0;z=0;aq=0;aD=au;while(1){if((a[z+139064|0]|0)==(a[at+(z+aD|0)|0]|0)){a9=aD;ba=aq}else{if((z|0)!=6){E=1778;break L2371}a9=aD-1|0;ba=1}ar=z+1|0;if((ar|0)<(ba+ap|0)){z=ar;aq=ba;aD=a9}else{break}}if((ba|0)!=0){break}if(!((z|0)==5|(z|0)==9)){E=1778}}else{E=1778}}while(0);L2381:do{if((E|0)==1778){E=0;L2383:do{if(aJ){if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}aD=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){break}if((a[aD+(au+aq|0)|0]|0)==(a[aq+205624|0]|0)){aq=aq+1|0}else{break L2383}}if((aq|0)==2){break L2381}}}while(0);L2391:do{if((ap|0)>0&(aG^1)){z=c[10036]|0;aD=0;at=0;aF=au;while(1){if((a[aD+103928|0]|0)==(a[z+(aD+aF|0)|0]|0)){bb=aF;bc=at}else{if((aD|0)!=6){E=1803;break L2391}bb=aF-1|0;bc=1}ar=aD+1|0;if((ar|0)<(bc+ap|0)){aD=ar;at=bc;aF=bb}else{break}}if((bc|0)!=0){break}if(!((aD|0)==5|(aD|0)==9)){E=1803}}else{E=1803}}while(0);L2401:do{if((E|0)==1803){E=0;L2403:do{if(aJ){if(aG){E=1847;break}aF=c[10036]|0;at=0;while(1){if((at|0)>=(ap|0)){break}if((a[aF+(au+at|0)|0]|0)==(a[at+103560|0]|0)){at=at+1|0}else{E=1839;break L2403}}if((at|0)==2){break L2401}else{E=1839}}else{E=1839}}while(0);L2410:do{if((E|0)==1839){E=0;if(!((ap|0)>0&(aG^1))){E=1847;break}aD=c[10036]|0;aF=0;z=0;aq=au;while(1){if((a[aF+100112|0]|0)==(a[aD+(aF+aq|0)|0]|0)){bd=aq;be=z}else{if((aF|0)!=6){E=1847;break L2410}bd=aq-1|0;be=1}ar=aF+1|0;if((ar|0)<(be+ap|0)){aF=ar;z=be;aq=bd}else{break}}if((be|0)!=0){break}if(!((aF|0)==5|(aF|0)==13)){E=1847}}}while(0);if((E|0)==1847){E=0;if(!aJ){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}aq=c[10036]|0;z=0;while(1){if((z|0)>=(ap|0)){break}if((a[aq+(au+z|0)|0]|0)==(a[z+99680|0]|0)){z=z+1|0}else{av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}}if((z|0)!=2){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}}aq=ao+1|0;c[13898]=aq;if(!e){uh(aq,99224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aq=is(q)|0;aD=c[aq>>2]|0;if((aD|0)==3){at=c[aq+8>>2]|0;uz(at,0)}else if(!((aD|0)==1|(aD|0)==2)){E=1864;break L2195}if((c[w>>2]|0)!=3){aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}uu(c[y>>2]|0);c[w>>2]=1;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}aD=is(n)|0;at=c[aD>>2]|0;if((at|0)==2){bf=+h[aD+8>>3]}else if((at|0)==3){bf=+uz(c[aD+8>>2]|0,0)}else if((at|0)==1){bf=+(c[aD+8>>2]|0)}else{E=1858;break L2195}if((c[C>>2]|0)==3){uu(c[x>>2]|0);c[C>>2]=1}c[B>>2]=~~bf;aY=1;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);if(!e){uh(ao,100856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13898]=(c[13898]|0)+2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}aD=aj+1|0;if((aj|0)!=0){av=aK;aw=aD;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}at=ao+1|0;c[13898]=at;aq=c[aE+(at*40&-1)+36>>2]|0;ar=c[aE+(at*40&-1)+32>>2]|0;aX=(a[aE+(at*40&-1)|0]&1)==0;L2450:do{if((aq|0)>0&(aX^1)){at=c[10036]|0;bg=0;bh=0;bi=ar;while(1){if((a[bg+111056|0]|0)==(a[at+(bg+bi|0)|0]|0)){bj=bi;bk=bh}else{if((bg|0)!=3){break}bj=bi-1|0;bk=1}bl=bg+1|0;if((bl|0)<(bk+aq|0)){bg=bl;bh=bk;bi=bj}else{E=1817;break}}do{if((E|0)==1817){E=0;if((bk|0)==0){if(!((bg|0)==2|(bg|0)==8)){break}}h[H>>3]=-3.0;c[13898]=ao+2;aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);if(!((aq|0)>0&(aX^1))){break}bg=c[10036]|0;bi=0;bh=0;at=ar;while(1){if((a[bi+184456|0]|0)==(a[bg+(bi+at|0)|0]|0)){bm=at;bn=bh}else{if((bi|0)!=3){break L2450}bm=at-1|0;bn=1}z=bi+1|0;if((z|0)<(bn+aq|0)){bi=z;bh=bn;at=bm}else{break}}if((bn|0)==0){if(!((bi|0)==2|(bi|0)==7)){break}}h[H>>3]=-2.0;c[13898]=ao+2;aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);aq=is(m)|0;ar=c[aq>>2]|0;if((ar|0)==1){bo=+(c[aq+8>>2]|0)}else if((ar|0)==2){bo=+h[aq+8>>3]}else if((ar|0)==3){bo=+uz(c[aq+8>>2]|0,0)}else{E=1833;break L2195}if((c[u>>2]|0)==3){uu(c[F>>2]|0);c[u>>2]=1}h[H>>3]=bo;if(bo>=0.0){aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}h[H>>3]=0.0;aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);if(!e){uh(ao,104432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13898]=(c[13898]|0)+2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}aq=ai+1|0;if((ai|0)!=0){av=aK;aw=aj;ax=aq;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}c[13898]=ao+1;ar=is(g)|0;aX=c[ar>>2]|0;if((aX|0)==1){bp=+(c[ar+8>>2]|0)}else if((aX|0)==2){bp=+h[ar+8>>3]}else if((aX|0)==3){bp=+uz(c[ar+8>>2]|0,0)}else{E=1790;break L2195}if((c[I>>2]|0)==3){uu(c[J>>2]|0);c[I>>2]=1}c[K>>2]=~~bp-1;aY=ak;aZ=aj;a_=aq;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);aq=ah+1|0;if((ah|0)!=0){av=aK;aw=aj;ax=ai;ay=aq;az=aL;aA=aM;aB=ak;aC=ao;break L2193}c[13898]=ao+1;ar=is(j)|0;aX=c[ar>>2]|0;if((aX|0)==1){bq=+(c[ar+8>>2]|0)}else if((aX|0)==2){bq=+h[ar+8>>3]}else if((aX|0)==3){bq=+uz(c[ar+8>>2]|0,0)}else{E=1757;break L2195}if((c[L>>2]|0)==3){uu(c[M>>2]|0);c[L>>2]=1}h[N>>3]=bq;if(bq>=0.0){aY=ak;aZ=aj;a_=ai;a$=aq;a0=aL;a1=aM;a2=G;break L2300}h[N>>3]=0.0;aY=ak;aZ=aj;a_=ai;a$=aq;a0=aL;a1=aM;a2=G;break L2300}}while(0);a[O]=1;aJ=aL+1|0;if((aL|0)!=0){av=aK;aw=aj;ax=ai;ay=ah;az=aJ;aA=aM;aB=ak;aC=ao;break L2193}aq=ao+1|0;c[13898]=aq;ar=c[aE+(aq*40&-1)+36>>2]|0;aX=c[aE+(aq*40&-1)+32>>2]|0;at=(a[aE+(aq*40&-1)|0]&1)==0;L2511:do{if((ar|0)>0&(at^1)){bh=c[10036]|0;bg=0;z=0;bl=aX;while(1){if((a[bg+123456|0]|0)==(a[bh+(bg+bl|0)|0]|0)){br=bl;bs=z}else{if((bg|0)!=3){break}br=bl-1|0;bs=1}bt=bg+1|0;if((bt|0)<(bs+ar|0)){bg=bt;z=bs;bl=br}else{E=1685;break}}do{if((E|0)==1685){E=0;if((bs|0)==0){if(!((bg|0)==8|(bg|0)==2)){break}}c[13898]=ao;hI(X,3);aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}}while(0);if(!((ar|0)>0&(at^1))){break}bg=c[10036]|0;bl=0;z=0;bh=aX;while(1){if((a[bl+205488|0]|0)==(a[bg+(bl+bh|0)|0]|0)){bu=bh;bv=z}else{if((bl|0)!=3){break L2511}bu=bh-1|0;bv=1}bt=bl+1|0;if((bt|0)<(bv+ar|0)){bl=bt;z=bv;bh=bu}else{break}}if((bv|0)==0){if(!((bl|0)==7|(bl|0)==2)){break}}c[13898]=ao;hI(X,6);aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}}while(0);L2537:do{if((aU|0)>(aq|0)){if(at){break}bh=c[10036]|0;z=0;while(1){if((z|0)>=(ar|0)){break}if((a[bh+(aX+z|0)|0]|0)==(a[z+120376|0]|0)){z=z+1|0}else{E=1704;break L2537}}if((z|0)!=4){E=1704;break}c[P>>2]=1;c[Q>>2]=-4;c[13898]=ao+2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}else{E=1704}}while(0);L2545:do{if((E|0)==1704){E=0;if(!((ar|0)>0&(at^1))){break}aq=c[10036]|0;aU=0;bh=0;bl=aX;while(1){if((a[aU+111056|0]|0)==(a[aq+(aU+bl|0)|0]|0)){bw=bl;bx=bh}else{if((aU|0)!=3){break L2545}bw=bl-1|0;bx=1}bg=aU+1|0;if((bg|0)<(bx+ar|0)){aU=bg;bh=bx;bl=bw}else{break}}if((bx|0)==0){if(!((aU|0)==2|(aU|0)==8)){break}}c[13898]=ao+2;c[W>>2]=-6;c[P>>2]=2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}}while(0);if(!d){c[P>>2]=1;ar=is(k)|0;aX=c[ar>>2]|0;if((aX|0)==1){by=+(c[ar+8>>2]|0)}else if((aX|0)==2){by=+h[ar+8>>3]}else if((aX|0)==3){by=+uz(c[ar+8>>2]|0,0)}else{E=1734;break L2195}if((c[U>>2]|0)==3){uu(c[V>>2]|0);c[U>>2]=1}c[Q>>2]=~~by-1;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break}ar=is(l)|0;aX=c[ar>>2]|0;if((aX|0)==1){bz=+(c[ar+8>>2]|0)}else if((aX|0)==2){bz=+h[ar+8>>3]}else if((aX|0)==3){bz=+uz(c[ar+8>>2]|0,0)}else{E=1718;break L2195}if((c[R>>2]|0)==3){uu(c[S>>2]|0);c[R>>2]=1}ar=c[8798]|0;aX=(ar|0)>0;at=~~bz;L2578:while(1){bl=43264;while(1){bA=c[bl>>2]|0;if((bA|0)==0){break}if((c[bA+4>>2]|0)==(at|0)){E=1725;break L2578}else{bl=bA|0}}bl=at-1|0;if(!((at|0)>(ar|0)&aX)){bB=1;bC=bl;bD=G;break}at=((bl|0)%(ar|0)&-1)+1|0}do{if((E|0)==1725){E=0;ar=c[bA+48>>2]|0;at=c[bA+52>>2]|0;bE=+h[bA+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){bB=ar;bC=at;bD=bE;break}aX=(a[bA+40|0]&1)==0;bB=aX?1:ar;bC=aX?c[bA+12>>2]|0:at;bD=bE}}while(0);c[P>>2]=bB;c[Q>>2]=bC;h[T>>3]=bD;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=bD}}while(0);ao=c[13898]|0;aE=c[8272]|0;if((ao|0)<(aE|0)){G=a2;af=a1;ag=a0;ah=a$;ai=a_;aj=aZ;ak=aY;al=aK;am=ao;an=aE}else{av=aK;aw=aZ;ax=a_;ay=a$;az=a0;aA=a1;aB=aY;aC=ao;break L2193}}if((E|0)==1757){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1623){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1718){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1858){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1864){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1790){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1734){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1833){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}else{av=0;aw=0;ax=0;ay=0;az=0;aA=0;aB=0;aC=p}}while(0);if((aA|0)>1|(az|0)>1|(ay|0)>1|(ax|0)>1|(aw|0)>1){uf(aC,98720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((az|0)==0){bF=av}else{av=b+40|0;az=r+40|0;c[av>>2]=c[az>>2];c[av+4>>2]=c[az+4>>2];c[av+8>>2]=c[az+8>>2];c[av+12>>2]=c[az+12>>2];a[b+32|0]=a[r+32|0]&1;bF=-8}if((ay|0)!=0){h[b+16>>3]=+h[r+16>>3]}if((ax|0)!=0){c[b+8>>2]=c[r+8>>2]}if((aw|0)!=0){h[b+24>>3]=+h[r+24>>3]}if((aB|0)!=0){c[b+12>>2]=c[r+12>>2]}if((c[r+4>>2]|0)!=-6){i=f;return bF|0}c[b+4>>2]=-6;i=f;return bF|0}function hI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0.0,W=0.0,X=0,Y=0;e=i;i=i+96|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;m=l+1|0;c[13898]=m;n=c[8272]|0;if((m|0)>=(n|0)){uf(m,92096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[1054]|0;p=(a[o+(m*40&-1)|0]&1)==0;q=c[o+(m*40&-1)+36>>2]|0;r=o+(m*40&-1)+32|0;L2626:do{if(p){s=c[r>>2]|0}else{t=c[10036]|0;u=0;while(1){if((u|0)>=(q|0)){w=1890;break}if((a[t+((c[r>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break}}do{if((w|0)==1890){if((u|0)!=1){break}uf(m,92096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);u=c[r>>2]|0;if(p){s=u;break}if((q|0)>0){t=c[10036]|0;x=0;y=0;z=u;while(1){if((a[x+184456|0]|0)==(a[t+(x+z|0)|0]|0)){A=z;B=y}else{if((x|0)!=3){break}A=z-1|0;B=1}C=x+1|0;if((C|0)<(B+q|0)){x=C;y=B;z=A}else{w=1899;break}}do{if((w|0)==1899){if((B|0)==0){if(!((x|0)==7|(x|0)==2)){break}}c[13898]=l+2;c[b>>2]=0;i=e;return}}while(0);if(p){s=u;break}}x=c[10036]|0;z=0;while(1){if((z|0)>=(q|0)){w=1906;break}if((a[x+(u+z|0)|0]|0)==(a[z+120376|0]|0)){z=z+1|0}else{break}}do{if((w|0)==1906){if((z|0)!=4){break}c[13898]=l+2;c[b>>2]=1;c[b+4>>2]=-4;i=e;return}}while(0);if(p){s=u;break}z=c[10036]|0;x=0;while(1){if((x|0)>=(q|0)){break}if((a[z+(u+x|0)|0]|0)==(a[x+225056|0]|0)){x=x+1|0}else{s=u;break L2626}}if((x|0)!=2){s=u;break}y=l+2|0;c[13898]=y;if((y|0)>=(n|0)){uf(y,91408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L2669:do{if((a[o+(y*40&-1)|0]&1)!=0){t=c[o+(y*40&-1)+36>>2]|0;C=o+(y*40&-1)+32|0;D=0;while(1){if((D|0)>=(t|0)){break}if((a[z+((c[C>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L2669}}if((D|0)!=1){break}uf(y,91408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);y=b|0;c[y>>2]=1;z=is(j)|0;u=c[z>>2]|0;if((u|0)==1){E=+(c[z+8>>2]|0)}else if((u|0)==2){E=+h[z+8>>3]}else if((u|0)==3){E=+uz(c[z+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=j|0;if((c[z>>2]|0)==3){uu(c[j+8>>2]|0);c[z>>2]=1}z=~~E-1|0;c[b+4>>2]=z;if((z|0)>=-4){i=e;return}c[y>>2]=0;uh(c[13898]|0,90768,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}}while(0);if((d|0)<2){c[b>>2]=0;uf(c[13898]|0,90352,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L2695:do{if(!p){j=c[10036]|0;B=0;while(1){if((B|0)>=(q|0)){w=1935;break}if((a[j+(s+B|0)|0]|0)==(a[B+72816|0]|0)){B=B+1|0}else{w=1936;break}}if((w|0)==1935){if((B|0)!=2){w=1936}}do{if((w|0)==1936){if(!((q|0)>0&(p^1))){break L2695}j=c[10036]|0;A=0;r=0;y=s;while(1){if((a[A+73824|0]|0)==(a[j+(A+y|0)|0]|0)){F=y;G=r}else{if((A|0)!=5){break}F=y-1|0;G=1}z=A+1|0;if((z|0)<(G+q|0)){A=z;r=G;y=F}else{w=1942;break}}if((w|0)==1942){if((G|0)!=0){break}if((A|0)==4|(A|0)==9){break}}if(p){break L2695}L2716:do{if((q|0)>0){y=c[10036]|0;r=0;j=0;D=s;while(1){if((a[r+123456|0]|0)==(a[y+(r+D|0)|0]|0)){H=D;I=j}else{if((r|0)!=3){break L2716}H=D-1|0;I=1}z=r+1|0;if((z|0)<(I+q|0)){r=z;j=I;D=H}else{break}}if((I|0)==0){if(!((r|0)==8|(r|0)==2)){break}}c[13898]=l+2;c[b>>2]=3;D=c[13898]|0;j=c[1054]|0;y=c[j+(D*40&-1)+36>>2]|0;z=c[j+(D*40&-1)+32>>2]|0;L2728:do{if((a[j+(D*40&-1)|0]&1)==0){w=1970}else{if((y|0)<=0){J=b+8|0;break}u=c[10036]|0;x=0;C=0;t=z;while(1){if((a[x+111056|0]|0)==(a[u+(x+t|0)|0]|0)){K=t;L=C}else{if((x|0)!=3){w=1970;break L2728}K=t-1|0;L=1}M=x+1|0;if((M|0)<(L+y|0)){x=M;C=L;t=K}else{break}}if((L|0)!=0|(M|0)==3){N=b+8|0}else{t=b+8|0;if((M|0)==9){N=t}else{J=t;break}}h[N>>3]=-1.0;c[13898]=(c[13898]|0)+1;i=e;return}}while(0);if((w|0)==1970){J=b+8|0}h[J>>3]=0.0;c[b+4>>2]=hK()|0;i=e;return}}while(0);if(!((q|0)>0&(p^1))){break L2695}A=c[10036]|0;y=0;z=0;D=s;while(1){if((a[y+205488|0]|0)==(a[A+(y+D|0)|0]|0)){O=D;P=z}else{if((y|0)!=3){break L2695}O=D-1|0;P=1}j=y+1|0;if((j|0)<(P+q|0)){y=j;z=P;D=O}else{break}}if((P|0)==0){if(!((y|0)==2|(y|0)==7)){break L2695}}D=l+2|0;c[13898]=D;z=(n|0)>(D|0);L2761:do{if(z){if((a[o+(D*40&-1)|0]&1)!=0){A=c[o+(D*40&-1)+36>>2]|0;j=o+(D*40&-1)+32|0;r=c[10036]|0;t=0;while(1){if((t|0)>=(A|0)){w=1988;break}if((a[r+((c[j>>2]|0)+t|0)|0]|0)==(a[t+77416|0]|0)){t=t+1|0}else{break}}do{if((w|0)==1988){if((t|0)!=1){break}j=b|0;if((d|0)<=5){c[j>>2]=0;uf(c[13898]|0,89200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[j>>2]=6;c[13898]=(c[13898]|0)+1;i=e;return}}while(0);if(!z){w=1993;break}}t=a[o+(D*40&-1)|0]|0;if((t&1)==0){Q=t;break}j=c[o+(D*40&-1)+36>>2]|0;r=o+(D*40&-1)+32|0;A=c[10036]|0;C=0;while(1){if((C|0)>=(j|0)){break}if((a[A+((c[r>>2]|0)+C|0)|0]|0)==(a[C+88416|0]|0)){C=C+1|0}else{Q=t;break L2761}}if((C|0)!=2){Q=t;break}c[b>>2]=4;r=(c[13898]|0)+1|0;c[13898]=r;if((r|0)>=(c[8272]|0)){uf(r,87312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=c[1054]|0;L2786:do{if((a[A+(r*40&-1)|0]&1)!=0){j=c[A+(r*40&-1)+36>>2]|0;x=A+(r*40&-1)+32|0;u=c[10036]|0;R=0;while(1){if((R|0)>=(j|0)){break}if((a[u+((c[x>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L2786}}if((R|0)!=1){break}uf(r,87312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);r=is(f)|0;A=c[r>>2]|0;if((A|0)==1){S=+(c[r+8>>2]|0)}else if((A|0)==2){S=+h[r+8>>3]}else if((A|0)==3){S=+uz(c[r+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=f|0;if((c[r>>2]|0)==3){uu(c[f+8>>2]|0);c[r>>2]=1}h[b+8>>3]=S;i=e;return}else{w=1993}}while(0);if((w|0)==1993){Q=a[o+(D*40&-1)|0]|0}z=c[o+(D*40&-1)+36>>2]|0;L2807:do{if((Q&1)!=0&(z|0)>0){y=c[10036]|0;r=0;A=0;t=c[o+(D*40&-1)+32>>2]|0;while(1){if((a[r+204616|0]|0)==(a[y+(r+t|0)|0]|0)){T=t;U=A}else{if((r|0)!=4){break L2807}T=t-1|0;U=1}C=r+1|0;if((C|0)<(U+z|0)){r=C;A=U;t=T}else{break}}if((U|0)==0){if(!((r|0)==3|(r|0)==8)){break}}c[b>>2]=5;t=(c[13898]|0)+1|0;c[13898]=t;if((t|0)>=(c[8272]|0)){uf(t,85200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=c[1054]|0;L2822:do{if((a[A+(t*40&-1)|0]&1)!=0){y=c[A+(t*40&-1)+36>>2]|0;C=A+(t*40&-1)+32|0;x=c[10036]|0;u=0;while(1){if((u|0)>=(y|0)){break}if((a[x+((c[C>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break L2822}}if((u|0)!=1){break}uf(t,85200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);t=is(k)|0;A=c[t>>2]|0;if((A|0)==1){V=+(c[t+8>>2]|0)}else if((A|0)==2){V=+h[t+8>>3]}else if((A|0)==3){V=+uz(c[t+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=k|0;if((c[t>>2]|0)==3){uu(c[k+8>>2]|0);c[t>>2]=1}h[b+8>>3]=V;if(V<0.0|V>1.0){uf(c[13898]|0,84296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{i=e;return}}}while(0);if((d|0)<=5){i=e;return}c[b>>2]=6;i=e;return}}while(0);c[13898]=l+2;c[b>>2]=2;B=is(g)|0;z=c[B>>2]|0;if((z|0)==1){W=+(c[B+8>>2]|0)}else if((z|0)==2){W=+h[B+8>>3]}else if((z|0)==3){W=+uz(c[B+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=g|0;if((c[B>>2]|0)==3){uu(c[g+8>>2]|0);c[B>>2]=1}c[b+4>>2]=~~W;i=e;return}}while(0);if(!((q|0)>0&(((d|0)<7|p)^1))){uf(m,83704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[10036]|0;d=0;g=0;l=s;while(1){if((a[d+111056|0]|0)==(a[p+(d+l|0)|0]|0)){X=l;Y=g}else{if((d|0)!=3){w=2058;break}X=l-1|0;Y=1}s=d+1|0;if((s|0)<(Y+q|0)){d=s;g=Y;l=X}else{break}}if((w|0)==2058){uf(m,83704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((Y|0)==0){if((d|0)==2|(d|0)==8){break}uf(m,83704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[b>>2]=7;c[13898]=(c[13898]|0)+1;i=e;return}function hJ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0.0,as=0,at=0,au=0,av=0.0,aw=0.0;j=i;i=i+72|0;k=g;g=i;i=i+16|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];k=j|0;l=j+24|0;m=j+48|0;n=b|0;c[n>>2]=d;d=b+4|0;c[d>>2]=e;e=b+8|0;c[e>>2]=f;f=b+16|0;o=f;p=g;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];p=c[13898]|0;o=c[8272]|0;if((p|0)>=(o|0)){i=j;return}g=c[1054]|0;q=(a[g+(p*40&-1)|0]&1)==0;if(q){i=j;return}r=c[g+(p*40&-1)+36>>2]|0;s=g+(p*40&-1)+32|0;t=c[10036]|0;u=0;while(1){if((u|0)>=(r|0)){w=2080;break}if((a[t+((c[s>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{w=2081;break}}do{if((w|0)==2080){if(!((u|0)==1|q)){break}i=j;return}else if((w|0)==2081){if(!q){break}i=j;return}}while(0);u=c[g+(p*40&-1)+36>>2]|0;s=g+(p*40&-1)+32|0;t=c[10036]|0;r=0;while(1){if((r|0)>=(u|0)){w=2085;break}if((a[t+((c[s>>2]|0)+r|0)|0]|0)==(a[r+116360|0]|0)){r=r+1|0}else{w=2086;break}}if((w|0)==2085){if((r|0)!=2){w=2086}}do{if((w|0)==2086){r=c[g+(p*40&-1)+36>>2]|0;if(!((r|0)>0&(q^1))){i=j;return}s=c[10036]|0;t=0;u=0;x=c[g+(p*40&-1)+32>>2]|0;while(1){if((a[t+121984|0]|0)==(a[s+(t+x|0)|0]|0)){y=x;z=u}else{if((t|0)!=4){w=2253;break}y=x-1|0;z=1}A=t+1|0;if((A|0)<(z+r|0)){t=A;u=z;x=y}else{break}}if((w|0)==2253){i=j;return}if((z|0)!=0){break}if((t|0)==3|(t|0)==9){break}i=j;return}}while(0);z=p+1|0;c[13898]=z;if((z|0)>=(o|0)){i=j;return}o=l|0;p=l+8|0;y=m|0;q=m+8|0;x=f|0;u=b+20|0;b=k|0;r=k+8|0;s=0;A=0;B=0;C=z;z=g;L2917:while(1){g=a[z+(C*40&-1)|0]|0;D=(g&1)==0;E=c[z+(C*40&-1)+36>>2]|0;F=z+(C*40&-1)+32|0;L2919:do{if(D){G=B;H=C;I=E;J=c[F>>2]|0;K=g}else{L=c[10036]|0;M=0;while(1){if((M|0)>=(E|0)){w=2101;break}if((a[L+((c[F>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break}}if((w|0)==2101){w=0;if((M|0)==1){w=2256;break L2917}}L=c[F>>2]|0;if(!((E|0)>0&(D^1))){G=B;H=C;I=E;J=L;K=g;break}N=c[10036]|0;O=0;P=0;Q=L;while(1){if((a[O+96808|0]|0)==(a[N+(O+Q|0)|0]|0)){R=Q;S=P}else{if((O|0)!=5){G=B;H=C;I=E;J=L;K=g;break L2919}R=Q-1|0;S=1}T=O+1|0;if((T|0)<(S+E|0)){O=T;P=S;Q=R}else{break}}if((S|0)==0){if(!((O|0)==4|(O|0)==11)){G=B;H=C;I=E;J=L;K=g;break}}Q=C+1|0;c[13898]=Q;G=1;H=Q;I=c[z+(Q*40&-1)+36>>2]|0;J=c[z+(Q*40&-1)+32>>2]|0;K=a[z+(Q*40&-1)|0]|0}}while(0);g=(K&1)==0;L2940:do{if((I|0)>0&(g^1)){E=c[10036]|0;D=0;F=0;t=J;while(1){if((a[D+96336|0]|0)==(a[E+(D+t|0)|0]|0)){U=t;V=F}else{if((D|0)!=1){break}U=t-1|0;V=1}Q=D+1|0;if((Q|0)<(V+I|0)){D=Q;F=V;t=U}else{w=2117;break}}do{if((w|0)==2117){w=0;if((V|0)==0){if(!((D|0)==0|(D|0)==5)){break}}c[n>>2]=0;t=(c[13898]|0)+1|0;c[13898]=t;W=s;X=t;break L2940}}while(0);if(g){W=s;X=H;break}L2955:do{if((I|0)>0){D=c[10036]|0;t=0;F=0;E=J;while(1){if((a[t+115496|0]|0)==(a[D+(t+E|0)|0]|0)){Y=E;Z=F}else{if((t|0)!=1){break L2955}Y=E-1|0;Z=1}L=t+1|0;if((L|0)<(Z+I|0)){t=L;F=Z;E=Y}else{break}}if((Z|0)==0){if(!((t|0)==0|(t|0)==5)){break}}c[n>>2]=G?4:1;E=(c[13898]|0)+1|0;c[13898]=E;W=1;X=E;break L2940}}while(0);if(!((I|0)>0&(g^1))){W=s;X=H;break}E=c[10036]|0;F=0;D=0;L=J;while(1){if((a[F+95432|0]|0)==(a[E+(F+L|0)|0]|0)){_=L;$=D}else{if((F|0)!=1){W=s;X=H;break L2940}_=L-1|0;$=1}O=F+1|0;if((O|0)<($+I|0)){F=O;D=$;L=_}else{break}}if(($|0)==0){if(!((F|0)==0|(F|0)==7)){W=s;X=H;break}}c[n>>2]=G?5:2;L=(c[13898]|0)+1|0;c[13898]=L;W=1;X=L}else{W=s;X=H}}while(0);L2980:do{if((X|0)<(c[8272]|0)){g=c[1054]|0;L=(a[g+(X*40&-1)|0]&1)==0;D=c[g+(X*40&-1)+36>>2]|0;E=g+(X*40&-1)+32|0;L2982:do{if(L){aa=c[E>>2]|0}else{g=c[10036]|0;O=0;while(1){if((O|0)>=(D|0)){w=2145;break}if((a[g+((c[E>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break}}if((w|0)==2145){w=0;if((O|0)==1){ab=A;break L2980}}g=c[E>>2]|0;if(!((D|0)>0&(L^1))){aa=g;break}t=c[10036]|0;Q=0;P=0;N=g;while(1){if((a[Q+141136|0]|0)==(a[t+(Q+N|0)|0]|0)){ac=N;ad=P}else{if((Q|0)!=2){break}ac=N-1|0;ad=1}M=Q+1|0;if((M|0)<(ad+D|0)){Q=M;P=ad;N=ac}else{w=2152;break}}do{if((w|0)==2152){w=0;if((ad|0)==0){if(!((Q|0)==1|(Q|0)==6)){break}}c[x>>2]=0;N=c[13898]|0;P=N+1|0;c[13898]=P;t=c[8272]|0;O=(t|0)>(P|0);M=c[1054]|0;T=a[M+(P*40&-1)|0]|0;L3003:do{if(O){if((T&1)==0){w=2160;break}ae=c[M+(P*40&-1)+36>>2]|0;af=M+(P*40&-1)+32|0;ag=c[10036]|0;ah=0;while(1){if((ah|0)>=(ae|0)){break}if((a[ag+((c[af>>2]|0)+ah|0)|0]|0)==(a[ah+202112|0]|0)){ah=ah+1|0}else{w=2160;break L3003}}if((ah|0)!=1){w=2160}}else{w=2160}}while(0);do{if((w|0)==2160){w=0;if((T&1)==0){break}af=c[M+(P*40&-1)+36>>2]|0;ag=M+(P*40&-1)+32|0;L3013:do{if((t|0)>(P|0)){ae=c[10036]|0;ai=0;while(1){if((ai|0)>=(af|0)){break}if((a[ae+((c[ag>>2]|0)+ai|0)|0]|0)==(a[ai+119088|0]|0)){ai=ai+1|0}else{w=2174;break L3013}}if((ai|0)!=2){w=2174}}else{w=2174}}while(0);L3019:do{if((w|0)==2174){w=0;ah=c[ag>>2]|0;L3021:do{if((af|0)>0){ae=c[10036]|0;aj=0;ak=0;al=ah;while(1){if((a[aj+116144|0]|0)==(a[ae+(aj+al|0)|0]|0)){am=al;an=ak}else{if((aj|0)!=5){break L3021}am=al-1|0;an=1}ao=aj+1|0;if((ao|0)<(an+af|0)){aj=ao;ak=an;al=am}else{break}}if((an|0)!=0){break L3019}if((aj|0)==4|(aj|0)==9){break L3019}}}while(0);L3032:do{if(O){ai=c[10036]|0;al=0;while(1){if((al|0)>=(af|0)){w=2187;break}if((a[ai+(ah+al|0)|0]|0)==(a[al+93664|0]|0)){al=al+1|0}else{break}}if((w|0)==2187){w=0;if((al|0)==3){break}}if(!O){w=2193;break}ai=c[10036]|0;aj=0;while(1){if((aj|0)>=(af|0)){break}if((a[ai+(ah+aj|0)|0]|0)==(a[aj+225056|0]|0)){aj=aj+1|0}else{w=2193;break L3032}}if((aj|0)!=2){w=2193}}else{w=2193}}while(0);do{if((w|0)==2193){w=0;if((af|0)<=0){ab=A;break L2980}ai=c[10036]|0;al=0;ak=0;ae=ah;while(1){if((a[al+139232|0]|0)==(a[ai+(al+ae|0)|0]|0)){ap=ae;aq=ak}else{if((al|0)!=5){ab=A;break L2980}ap=ae-1|0;aq=1}ao=al+1|0;if((ao|0)<(aq+af|0)){al=ao;ak=aq;ae=ap}else{break}}if((aq|0)!=0){break}if(!((al|0)==4|(al|0)==8)){ab=A;break L2980}}}while(0);c[13898]=N;hI(f,6);ab=A;break L2980}}while(0);hI(f,6);ab=A;break L2980}}while(0);c[x>>2]=1;N=is(k)|0;O=c[N>>2]|0;if((O|0)==1){ar=+(c[N+8>>2]|0)}else if((O|0)==2){ar=+h[N+8>>3]}else if((O|0)==3){ar=+uz(c[N+8>>2]|0,0)}else{w=2165;break L2917}if((c[b>>2]|0)==3){uu(c[r>>2]|0);c[b>>2]=1}c[u>>2]=~~ar-1;ab=A;break L2980}}while(0);if(!((D|0)>0&(L^1))){aa=g;break}Q=c[10036]|0;N=0;O=0;P=g;while(1){if((a[N+140856|0]|0)==(a[Q+(N+P|0)|0]|0)){as=P;at=O}else{if((N|0)!=4){aa=g;break L2982}as=P-1|0;at=1}t=N+1|0;if((t|0)<(at+D|0)){N=t;O=at;P=as}else{break}}if((at|0)==0){if(!((N|0)==3|(N|0)==8)){aa=g;break}}c[x>>2]=1;c[u>>2]=-3;c[13898]=(c[13898]|0)+1;ab=A;break L2980}}while(0);if(A|W^1){w=2258;break L2917}L3081:do{if(!L){E=c[10810]|0;if((E|0)==0){w=2259;break L2917}F=c[10036]|0;P=E;while(1){O=c[P+4>>2]|0;Q=0;while(1){if((Q|0)>=(D|0)){w=2220;break}if((a[F+(aa+Q|0)|0]|0)==(a[O+Q|0]|0)){Q=Q+1|0}else{break}}if((w|0)==2220){w=0;if((a[O+Q|0]|0)==0){w=2221;break}}t=c[P>>2]|0;if((t|0)==0){au=E;break}else{P=t}}do{if((w|0)==2221){w=0;if((a[P+8|0]&1)!=0){au=E;break}if((c[P+16>>2]|0)==1){break L3081}else{au=E}}}while(0);while(1){E=c[au+4>>2]|0;P=0;while(1){if((P|0)>=(D|0)){w=2227;break}if((a[F+(aa+P|0)|0]|0)==(a[E+P|0]|0)){P=P+1|0}else{break}}if((w|0)==2227){w=0;if((a[E+P|0]|0)==0){break}}Q=c[au>>2]|0;if((Q|0)==0){w=2261;break L2917}else{au=Q}}if((a[au+8|0]&1)!=0){w=2260;break L2917}if((c[au+16>>2]|0)!=2){w=2262;break L2917}}}while(0);D=c[n>>2]|0;if((D|0)==1|(D|0)==4){L=is(l)|0;F=c[L>>2]|0;if((F|0)==1){av=+(c[L+8>>2]|0)}else if((F|0)==2){av=+h[L+8>>3]}else if((F|0)==3){av=+uz(c[L+8>>2]|0,0)}else{w=2236;break L2917}if((c[o>>2]|0)==3){uu(c[p>>2]|0);c[o>>2]=1}L=~~(av*100.0+.5);F=(L|0)<0?0:L;c[d>>2]=(F|0)>100?100:F;ab=1;break}else if((D|0)==2|(D|0)==5){D=is(m)|0;F=c[D>>2]|0;if((F|0)==1){aw=+(c[D+8>>2]|0)}else if((F|0)==2){aw=+h[D+8>>3]}else if((F|0)==3){aw=+uz(c[D+8>>2]|0,0)}else{w=2244;break L2917}if((c[y>>2]|0)==3){uu(c[q>>2]|0);c[y>>2]=1}D=~~aw;c[e>>2]=(D|0)<0?0:D;ab=1;break}else{ab=0;break}}else{ab=A}}while(0);D=c[13898]|0;if((D|0)>=(c[8272]|0)){w=2257;break}s=W;A=ab;B=G;C=D;z=c[1054]|0}if((w|0)==2256){i=j;return}else if((w|0)==2257){i=j;return}else if((w|0)==2258){i=j;return}else if((w|0)==2259){i=j;return}else if((w|0)==2165){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==2236){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==2244){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==2260){i=j;return}else if((w|0)==2261){i=j;return}else if((w|0)==2262){i=j;return}}function hK(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0.0;b=i;i=i+56|0;d=b|0;e=b+24|0;f=b+48|0;c[f>>2]=-2;g=c[13898]|0;j=c[1054]|0;k=c[j+(g*40&-1)+36>>2]|0;L3139:do{if((a[j+(g*40&-1)|0]&1)!=0&(k|0)>0){l=c[10036]|0;m=0;n=0;o=c[j+(g*40&-1)+32>>2]|0;while(1){if((a[m+123456|0]|0)==(a[l+(m+o|0)|0]|0)){p=o;q=n}else{if((m|0)!=3){r=g;break L3139}p=o-1|0;q=1}s=m+1|0;if((s|0)<(q+k|0)){m=s;n=q;o=p}else{break}}if((q|0)==0){if(!((m|0)==2|(m|0)==8)){r=g;break}}o=g-1|0;n=c[j+(o*40&-1)+36>>2]|0;if(!((a[j+(o*40&-1)|0]&1)!=0&(n|0)>0)){r=g;break}l=c[10036]|0;s=0;t=0;u=c[j+(o*40&-1)+32>>2]|0;while(1){if((a[s+170936|0]|0)==(a[l+(s+u|0)|0]|0)){w=u;x=t}else{if((s|0)!=4){r=g;break L3139}w=u-1|0;x=1}o=s+1|0;if((o|0)<(x+n|0)){s=o;t=x;u=w}else{break}}if((x|0)==0){if(!((s|0)==3|(s|0)==10)){r=g;break}}u=g+1|0;c[13898]=u;r=u}else{r=g}}while(0);L3163:do{if((r|0)<(c[8272]|0)){L3165:do{if((a[j+(r*40&-1)|0]&1)!=0){g=c[j+(r*40&-1)+36>>2]|0;x=j+(r*40&-1)+32|0;w=c[10036]|0;q=0;while(1){if((q|0)>=(g|0)){break}if((a[w+((c[x>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L3165}}if((q|0)==1){break L3163}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=r;break}s=c[d+8>>2]|0;if((s|0)==0){break}x=c[7642]|0;w=c[x>>2]|0;do{if((w|0)==0){c[f>>2]=-1;y=2296}else{g=0;p=-1;k=w;while(1){if((aY(s|0,k|0)|0)==0){z=g;break}u=(a_(s|0,k|0,uA(k|0)|0)|0)==0&(p|0)<0?g:p;t=g+1|0;n=c[x+(t<<3)>>2]|0;if((n|0)==0){z=u;break}else{g=t;p=u;k=n}}c[f>>2]=z;if((z|0)<=-1){y=2296;break}c[f>>2]=c[x+(z<<3)+4>>2]}}while(0);if((y|0)==2296){ca(s|0,81360,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}uu(s);x=c[f>>2]|0;if((x|0)==-2){uf(c[13898]|0,79872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{A=x;i=b;return A|0}}}while(0);y=is(e)|0;z=c[y>>2]|0;if((z|0)==1){B=+(c[y+8>>2]|0)}else if((z|0)==2){B=+h[y+8>>3]}else if((z|0)==3){B=+uz(c[y+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}y=e|0;if((c[y>>2]|0)==3){uu(c[e+8>>2]|0);c[y>>2]=1}y=~~B;c[f>>2]=y;A=y;i=b;return A|0}function hL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0;e=i;i=i+64|0;f=e|0;g=e+24|0;j=c[13898]|0;L3201:do{if(d){k=c[1054]|0;l=c[k+(j*40&-1)+36>>2]|0;m=c[k+(j*40&-1)+32>>2]|0;n=(a[k+(j*40&-1)|0]&1)==0;L3204:do{if((l|0)>0&(n^1)){o=c[10036]|0;p=0;q=0;r=m;while(1){if((a[p+78616|0]|0)==(a[o+(p+r|0)|0]|0)){s=r;t=q}else{if((p|0)!=6){u=2320;break L3204}s=r-1|0;t=1}w=p+1|0;if((w|0)<(t+l|0)){p=w;q=t;r=s}else{break}}if((t|0)!=0){break}if(!((p|0)==5|(p|0)==10)){u=2320}}else{u=2320}}while(0);if((u|0)==2320){r=c[8272]|0;if((r|0)<=(j|0)|n){x=r;break}q=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[q+(m+o|0)|0]|0)==(a[o+124464|0]|0)){o=o+1|0}else{x=r;break L3201}}if((o|0)!=2){x=r;break}}m=j+1|0;c[13898]=m;q=c[k+(m*40&-1)+36>>2]|0;L3222:do{if((a[k+(m*40&-1)|0]&1)!=0&(q|0)>0){l=c[10036]|0;n=0;w=0;y=c[k+(m*40&-1)+32>>2]|0;while(1){if((a[n+111056|0]|0)==(a[l+(n+y|0)|0]|0)){z=y;A=w}else{if((n|0)!=3){break L3222}z=y-1|0;A=1}B=n+1|0;if((B|0)<(A+q|0)){n=B;w=A;y=z}else{break}}if((A|0)==0){if(!((n|0)==2|(n|0)==8)){break}}c[b>>2]=-3;c[13898]=(c[13898]|0)+1;i=e;return}}while(0);q=is(f)|0;m=c[q>>2]|0;if((m|0)==3){C=+uz(c[q+8>>2]|0,0)}else if((m|0)==2){C=+h[q+8>>3]}else if((m|0)==1){C=+(c[q+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=f|0;if((c[q>>2]|0)==3){uu(c[f+8>>2]|0);c[q>>2]=1}q=~~C;m=43296;while(1){D=c[m>>2]|0;if((D|0)==0){u=2347;break}if((c[D+4>>2]|0)==(q|0)){u=2346;break}else{m=D|0}}if((u|0)==2346){uD(b|0,D+8|0,112);i=e;return}else if((u|0)==2347){c[b>>2]=-1;c[b+4>>2]=0;m=b+8|0;c[m>>2]=c[12872];c[m+4>>2]=c[12873];c[m+8>>2]=c[12874];c[m+12>>2]=c[12875];c[m+16>>2]=c[12876];c[m+20>>2]=c[12877];c[m+24>>2]=c[12878];c[m+28>>2]=c[12879];c[m+32>>2]=c[12880];c[m+36>>2]=c[12881];c[m+40>>2]=c[12882];c[m+44>>2]=c[12883];c[m+48>>2]=c[12884];c[m+52>>2]=c[12885];c[b+64>>2]=1;h[b+72>>3]=0.0;c[b+80>>2]=0;h[b+88>>3]=15.0;h[b+96>>3]=90.0;c[b+104>>2]=0;uh(-1,79128,(v=i,i=i+8|0,c[v>>2]=q,v)|0);i=e;return}}else{x=c[8272]|0}}while(0);L3254:do{if((j|0)<(x|0)){D=b+64|0;f=g+8|0;A=g+4|0;z=g|0;t=g+16|0;s=b+72|0;d=b+80|0;m=g+24|0;k=b+88|0;r=g+32|0;o=b+96|0;y=b+4|0;w=b+8|0;l=b+104|0;p=0;B=0;E=0;F=0;G=0;H=j;I=x;L3256:while(1){J=c[1054]|0;K=(a[J+(H*40&-1)|0]&1)==0;L3258:do{if(!K){L=c[J+(H*40&-1)+36>>2]|0;M=J+(H*40&-1)+32|0;N=c[10036]|0;O=0;while(1){if((O|0)>=(L|0)){break}if((a[N+((c[M>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L3258}}if((O|0)==1){P=G;Q=F;R=E;S=B;T=p;U=H;break L3254}}}while(0);n=(I|0)>(H|0);L3265:do{if(n){do{if(!K){M=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;V=0;while(1){if((V|0)>=(M|0)){u=2358;break}if((a[L+((c[N>>2]|0)+V|0)|0]|0)==(a[V+150816|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2358){u=0;if((V|0)!=6){break}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=0;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);if(!n){u=2387;break L3265}if(K){break}V=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;M=0;while(1){if((M|0)>=(V|0)){u=2367;break}if((a[L+((c[N>>2]|0)+M|0)|0]|0)==(a[M+148912|0]|0)){M=M+1|0}else{break}}do{if((u|0)==2367){u=0;if((M|0)!=4){break}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=1;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);if(!n){u=2387;break L3265}if(K){break}M=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;V=0;while(1){if((V|0)>=(M|0)){u=2375;break}if((a[L+((c[N>>2]|0)+V|0)|0]|0)==(a[V+146928|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2375){u=0;if((V|0)!=8){break}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=2;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);if(!n){u=2387;break L3265}if(K){break}V=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;M=0;while(1){if((M|0)>=(V|0)){break}if((a[L+((c[N>>2]|0)+M|0)|0]|0)==(a[M+144768|0]|0)){M=M+1|0}else{u=2387;break L3265}}if((M|0)!=5){u=2387;break L3265}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=3;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);$=c[J+(H*40&-1)+36>>2]|0;aa=c[J+(H*40&-1)+32>>2]|0;u=2397}else{u=2387}}while(0);L3306:do{if((u|0)==2387){u=0;O=c[J+(H*40&-1)+36>>2]|0;N=c[J+(H*40&-1)+32>>2]|0;if(!((O|0)>0&(K^1))){ab=O;ac=N;u=2415;break}L=c[10036]|0;V=0;ad=0;ae=N;while(1){if((a[V+75200|0]|0)==(a[L+(V+ae|0)|0]|0)){af=ae;ag=ad}else{if((V|0)!=4){$=O;aa=N;u=2397;break L3306}af=ae-1|0;ag=1}ah=V+1|0;if((ah|0)<(ag+O|0)){V=ah;ad=ag;ae=af}else{break}}if((ag|0)==0){if(!((V|0)==3|(V|0)==6)){$=O;aa=N;u=2397;break}}ae=F+1|0;if((F|0)!=0){P=G;Q=ae;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[l>>2]=2;W=G;X=ae;Y=E;Z=B;_=p}}while(0);L3320:do{if((u|0)==2397){u=0;if(K){ab=$;ac=aa;u=2415;break}L3323:do{if(($|0)>0){ae=c[10036]|0;ad=0;do{if((a[ad+127904|0]|0)!=(a[ae+(ad+aa|0)|0]|0)){break L3323}ad=ad+1|0;}while((ad|0)<($|0));if((ad|0)!=5){break}ae=F+1|0;if((F|0)!=0){P=G;Q=ae;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[l>>2]=1;W=G;X=ae;Y=E;Z=B;_=p;break L3320}}while(0);if(!(($|0)>0&(K^1))){ab=$;ac=aa;u=2415;break}N=c[10036]|0;O=0;V=0;ae=aa;while(1){if((a[O+74368|0]|0)==(a[N+(O+ae|0)|0]|0)){ai=ae;aj=V}else{if((O|0)!=6){ab=$;ac=aa;u=2415;break L3320}ai=ae-1|0;aj=1}M=O+1|0;if((M|0)<(aj+$|0)){O=M;V=aj;ae=ai}else{break}}if((aj|0)==0){if(!((O|0)==5|(O|0)==8)){ab=$;ac=aa;u=2415;break}}ae=F+1|0;if((F|0)!=0){P=G;Q=ae;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[l>>2]=0;W=G;X=ae;Y=E;Z=B;_=p}}while(0);L3344:do{if((u|0)==2415){u=0;L3346:do{if(!(K|n^1)){ae=c[10036]|0;V=0;while(1){if((V|0)>=(ab|0)){u=2419;break}if((a[ae+(ac+V|0)|0]|0)==(a[V+130496|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2419){u=0;if((V|0)!=4){break}ad=E+1|0;if((E|0)!=0){P=G;Q=F;R=ad;S=B;T=p;U=H;break L3254}c[f>>2]=0;c[A>>2]=0;c[z>>2]=0;ak=H+1|0;c[13898]=ak;if((ak|0)>=(I|0)){u=2454;break L3256}L3356:do{if((a[J+(ak*40&-1)|0]&1)!=0){N=c[J+(ak*40&-1)+36>>2]|0;M=J+(ak*40&-1)+32|0;L=0;while(1){if((L|0)>=(N|0)){break}if((a[ae+((c[M>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break L3356}}if((L|0)==1){u=2453;break L3256}}}while(0);dl(g,0);h[s>>3]=+h[t>>3];c[d>>2]=c[z>>2];C=+h[m>>3];h[k>>3]=C;al=+h[r>>3];h[o>>3]=al;if(al>C){W=G;X=F;Y=ad;Z=B;_=p;break L3344}h[o>>3]=90.0;W=G;X=F;Y=ad;Z=B;_=p;break L3344}}while(0);if(K|n^1){break}ae=c[10036]|0;V=0;while(1){if((V|0)>=(ab|0)){u=2434;break}if((a[ae+(ac+V|0)|0]|0)==(a[V+150704|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2434){u=0;if((V|0)!=4){break}ae=G+1|0;if((G|0)!=0){P=ae;Q=F;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[y>>2]=0;W=ae;X=F;Y=E;Z=B;_=p;break L3344}}while(0);if(K|n^1){break}V=c[10036]|0;ae=0;while(1){if((ae|0)>=(ab|0)){break}if((a[V+(ac+ae|0)|0]|0)==(a[ae+150856|0]|0)){ae=ae+1|0}else{break L3346}}if((ae|0)!=5){break}V=G+1|0;if((G|0)!=0){P=V;Q=F;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[y>>2]=1;W=V;X=F;Y=E;Z=B;_=p;break L3344}}while(0);hH(w,1,0);O=c[13898]|0;if((H|0)==(O|0)){P=G;Q=F;R=E;S=B;T=p;U=H;break L3254}V=p+1|0;if((p|0)==0){W=G;X=F;Y=E;Z=B;_=V}else{P=G;Q=F;R=E;S=B;T=V;U=O;break L3254}}}while(0);n=c[13898]|0;K=c[8272]|0;if((n|0)<(K|0)){p=_;B=Z;E=Y;F=X;G=W;H=n;I=K}else{P=W;Q=X;R=Y;S=Z;T=_;U=n;break L3254}}if((u|0)==2453){uf(ak,73632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==2454){uf(ak,73632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{P=0;Q=0;R=0;S=0;T=0;U=j}}while(0);if((P|0)>1|(T|0)>1|(S|0)>1|(R|0)>1|(Q|0)>1){uf(U,98720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{i=e;return}}function hM(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0.0,af=0,ag=0.0,ah=0,ai=0.0,aj=0.0;b=i;i=i+1032|0;d=b|0;e=b+48|0;f=b+96|0;j=b+144|0;k=b+192|0;l=b+448|0;m=b+520|0;n=b+776|0;o=m|0;p=n|0;if((a[14080]&1)==0){i=b;return}L3395:do{if((c[8496]|0)==0){a[o]=0}else{do{if((a[37384]&1)!=0){if(+P(+(+aX(+(+g[3536]),90.0)))<.1){if(+P(+(+aX(+(+g[3538]),180.0)))<.1){break}}a[p]=0;q=n+(uA(p|0)|0)|0;a[q]=a[147088]|0;a[q+1|0]=a[147089|0]|0;a[q+2|0]=a[147090|0]|0;a[q+3|0]=a[147091|0]|0;a[q+4|0]=a[147092|0]|0;a[q+5|0]=a[147093|0]|0;a[q+6|0]=a[147094|0]|0;q=c[8503]|0;uC(p|0,q|0);q=n+(uA(p|0)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;uC(p|0,q|0);uD(n+(uA(p|0)|0)|0,146840,11);q=c[8503]|0;uC(p|0,q|0);q=n+(uA(p|0)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;uC(p|0,q|0);r=+g[3538];s=+g[3536];t=+g[3534];u=+g[3532];be(o|0,p|0,(v=i,i=i+32|0,h[v>>3]=r,h[v+8>>3]=s,h[v+16>>3]=t,h[v+24>>3]=u,v)|0);break L3395}}while(0);do{if((c[17261]&3|0)==0){if((c[17089]&3|0)!=0){break}q=iq(o,+h[3470],+h[3468],c[8506]|0,c[8510]|0)|0;if((a[26192]&1)==0){break L3395}u=+h[3470];t=+h[3468];x=k|0;y=l|0;uD(x|0,236632,255);z=c[8503]|0;uC(x|0,z|0);z=k+(uA(x|0)|0)|0;a[z]=a[86120]|0;a[z+1|0]=a[86121|0]|0;a[z+2|0]=a[86122|0]|0;z=c[8503]|0;uC(x|0,z|0);uD(k+(uA(x|0)|0)|0,145e3,14);z=c[8503]|0;uC(x|0,z|0);z=k+(uA(x|0)|0)|0;a[z]=a[86120]|0;a[z+1|0]=a[86121|0]|0;a[z+2|0]=a[86122|0]|0;z=c[8503]|0;uC(x|0,z|0);s=+h[3275];do{if((a[66164]&1)==0){A=u-s}else{if(s==0.0){A=99999.0;break}A=u/s}}while(0);r=+h[3276];do{if((a[65476]&1)==0){B=t-r}else{if(r==0.0){B=99999.0;break}B=t/r}}while(0);be(q|0,x|0,(v=i,i=i+32|0,h[v>>3]=s,h[v+8>>3]=r,h[v+16>>3]=A,h[v+24>>3]=B,v)|0);if((c[8500]|0)==0){break L3395}z=(a[66164]&1)==0;if(z){C=u}else{D=+_(+u);C=D/+h[8272]}E=(a[65476]&1)==0;if(E){F=t}else{D=+_(+t);F=D/+h[8186]}D=+h[3275];if(z){G=D}else{H=+_(+D);G=H/+h[8272]}H=+h[3276];if(E){I=H}else{D=+_(+H);I=D/+h[8186]}a[x]=0;E=k+(uA(x|0)|0)|0;a[E]=a[126656]|0;a[E+1|0]=a[126657|0]|0;a[E+2|0]=a[126658|0]|0;E=c[8503]|0;uC(x|0,E|0);D=C-G;H=F-I;J=+Q(+(D*D+H*H));if((c[8500]|0)==1){K=+Y(+H,+D)*57.29577951308232;uD(k+(uA(x|0)|0)|0,144496,13);L=K}else{if(D==0.0){M=H>0.0?8.988465674311579e+307:-8.988465674311579e+307}else{M=H/D}E=k+(uA(x|0)|0)|0;z=c[8503]|0;be(E|0,144344,(v=i,i=i+8|0,c[v>>2]=z,v)|0);L=M}be(y|0,x|0,(v=i,i=i+16|0,h[v>>3]=J,h[v+8>>3]=L,v)|0);uC(q|0,y|0);break L3395}}while(0);if((c[16573]&3|0)==0){N=o}else{z=m+2|0;a[o]=a[146632]|0;a[o+1|0]=a[146633|0]|0;a[o+2|0]=a[146634|0]|0;J=+h[3470];if(J<8.988465674311579e+307){if((c[16546]|0)==1){E=c9(2)|0;R=a8(E|0,10)|0;if((R|0)!=0){S=R;do{a[S]=32;S=a8(E|0,10)|0;}while((S|0)!=0)}D=+h[3470];t3(j,D);H=D- +O(+D);t4(z,40,E,j,H)}else{S=c[8503]|0;be(z|0,S|0,(v=i,i=i+8|0,h[v>>3]=J,v)|0)}T=m+((uA(z|0)|0)+2|0)|0}else{T=z}a[T]=32;N=T+1|0}if((c[16401]&3|0)==0){U=N}else{S=N+2|0;a[N]=a[146472]|0;a[N+1|0]=a[146473|0]|0;a[N+2|0]=a[146474|0]|0;H=+h[3468];if(H<8.988465674311579e+307){if((c[16374]|0)==1){R=c9(1)|0;V=a8(R|0,10)|0;if((V|0)!=0){W=V;do{a[W]=32;W=a8(R|0,10)|0;}while((W|0)!=0)}J=+h[3468];t3(f,J);D=J- +O(+J);t4(S,40,R,f,D)}else{W=c[8503]|0;be(S|0,W|0,(v=i,i=i+8|0,h[v>>3]=H,v)|0)}X=N+((uA(S|0)|0)+2|0)|0}else{X=S}a[X]=32;U=X+1|0}if((c[17261]&3|0)==0){Z=U}else{W=U+3|0;z=U;w=4010616;a[z]=w&255;w=w>>8;a[z+1|0]=w&255;w=w>>8;a[z+2|0]=w&255;w=w>>8;a[z+3|0]=w&255;D=+h[3469];if(D<8.988465674311579e+307){if((c[17234]|0)==1){z=c9(6)|0;E=a8(z|0,10)|0;if((E|0)!=0){V=E;do{a[V]=32;V=a8(z|0,10)|0;}while((V|0)!=0)}H=+h[3469];t3(e,H);J=H- +O(+H);t4(W,40,z,e,J)}else{V=c[8503]|0;be(W|0,V|0,(v=i,i=i+8|0,h[v>>3]=D,v)|0)}$=U+((uA(W|0)|0)+3|0)|0}else{$=W}a[$]=32;Z=$+1|0}if((c[17089]&3|0)==0){aa=Z}else{V=Z+3|0;S=Z;w=4010617;a[S]=w&255;w=w>>8;a[S+1|0]=w&255;w=w>>8;a[S+2|0]=w&255;w=w>>8;a[S+3|0]=w&255;J=+h[3467];if(J<8.988465674311579e+307){if((c[17062]|0)==1){S=c9(5)|0;R=a8(S|0,10)|0;if((R|0)!=0){E=R;do{a[E]=32;E=a8(S|0,10)|0;}while((E|0)!=0)}D=+h[3467];t3(d,D);H=D- +O(+D);t4(V,40,S,d,H)}else{E=c[8503]|0;be(V|0,E|0,(v=i,i=i+8|0,h[v>>3]=J,v)|0)}ab=Z+((uA(V|0)|0)+3|0)|0}else{ab=V}a[ab]=32;aa=ab+1|0}do{if((a[26192]&1)==0){ac=aa}else{if((c[16573]&3|0)==0){ad=aa}else{E=aa;w=4028516;a[E]=w&255;w=w>>8;a[E+1|0]=w&255;w=w>>8;a[E+2|0]=w&255;w=w>>8;a[E+3|0]=w&255;E=aa+3|0;W=c[8503]|0;do{if((a[66164]&1)==0){ae=+h[3470]- +h[3275]}else{H=+h[3275];if(H==0.0){ae=99999.0;break}ae=+h[3470]/H}}while(0);be(E|0,W|0,(v=i,i=i+8|0,h[v>>3]=ae,v)|0);ad=aa+(uA(aa|0)|0)|0}if((c[16401]&3|0)==0){af=ad}else{y=ad;w=4028772;a[y]=w&255;w=w>>8;a[y+1|0]=w&255;w=w>>8;a[y+2|0]=w&255;w=w>>8;a[y+3|0]=w&255;y=ad+3|0;q=c[8503]|0;do{if((a[65476]&1)==0){ag=+h[3468]- +h[3276]}else{t=+h[3276];if(t==0.0){ag=99999.0;break}ag=+h[3468]/t}}while(0);be(y|0,q|0,(v=i,i=i+8|0,h[v>>3]=ag,v)|0);af=ad+(uA(ad|0)|0)|0}if((c[17261]&3|0)==0){ah=af}else{a[af]=a[145552]|0;a[af+1|0]=a[145553|0]|0;a[af+2|0]=a[145554|0]|0;a[af+3|0]=a[145555|0]|0;a[af+4|0]=a[145556|0]|0;W=af+4|0;E=c[8503]|0;do{if((a[68916]&1)==0){ai=+h[3469]- +h[3277]}else{t=+h[3277];if(t==0.0){ai=99999.0;break}ai=+h[3469]/t}}while(0);be(W|0,E|0,(v=i,i=i+8|0,h[v>>3]=ai,v)|0);ah=af+(uA(af|0)|0)|0}if((c[17089]&3|0)==0){ac=ah;break}a[ah]=a[145256]|0;a[ah+1|0]=a[145257|0]|0;a[ah+2|0]=a[145258|0]|0;a[ah+3|0]=a[145259|0]|0;a[ah+4|0]=a[145260|0]|0;q=ah+4|0;y=c[8503]|0;do{if((a[68228]&1)==0){aj=+h[3467]- +h[3278]}else{t=+h[3278];if(t==0.0){aj=99999.0;break}aj=+h[3467]/t}}while(0);be(q|0,y|0,(v=i,i=i+8|0,h[v>>3]=aj,v)|0);ac=ah+(uA(ah|0)|0)|0}}while(0);a[ac-1|0]=0}}while(0);ac=c[(c[3524]|0)+120>>2]|0;if((ac|0)==0){i=b;return}cN[ac&255](0,o);i=b;return}function hN(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0;j=(a[37384]&1)==0;do{if(j){if((c[7939]|0)==(c[7938]|0)){h[g>>3]=8.988465674311579e+307;h[e>>3]=8.988465674311579e+307}else{k=+(b|0);h[e>>3]=(k- +(c[16536]|0))/+h[8269]+ +h[8255];h[g>>3]=(k- +(c[17224]|0))/+h[8613]+ +h[8599]}if((c[7941]|0)==(c[7940]|0)){h[i>>3]=8.988465674311579e+307;h[f>>3]=8.988465674311579e+307;break}else{k=+(d|0);h[f>>3]=(k- +(c[16364]|0))/+h[8183]+ +h[8169];h[i>>3]=(k- +(c[17052]|0))/+h[8527]+ +h[8513];break}}else{l=b-(c[18064]|0)|0;m=d-(c[18062]|0)|0;n=c[18060]|0;o=c[18058]|0;do{if((((n|0)>-1?n:-n|0)|0)>(((o|0)>-1?o:-o|0)|0)){k=+h[8255];h[e>>3]=k+ +(l|0)/+(n|0)*(+h[8256]-k)}else{if((o|0)==0){h[e>>3]=8.988465674311579e+307;break}else{k=+h[8255];h[e>>3]=k+ +(m|0)/+(o|0)*(+h[8256]-k);break}}}while(0);o=c[18056]|0;n=c[18054]|0;do{if((((o|0)>-1?o:-o|0)|0)>(((n|0)>-1?n:-n|0)|0)){k=+h[8169];h[f>>3]=k+ +(l|0)/+(o|0)*(+h[8170]-k)}else{if((n|0)==0){h[f>>3]=8.988465674311579e+307;break}else{k=+h[8169];h[f>>3]=k+ +(m|0)/+(n|0)*(+h[8170]-k);break}}}while(0);h[i>>3]=8.988465674311579e+307;h[g>>3]=8.988465674311579e+307}}while(0);k=+h[e>>3];if((a[66164]&1)==0){p=k}else{p=+Z(+(k*+h[8272]))}h[e>>3]=p;p=+h[f>>3];if((a[65476]&1)==0){q=p}else{q=+Z(+(p*+h[8186]))}h[f>>3]=q;if(!j){return}q=+h[g>>3];if((a[68916]&1)==0){r=q}else{r=+Z(+(q*+h[8616]))}h[g>>3]=r;r=+h[i>>3];if((a[68228]&1)==0){s=r}else{s=+Z(+(r*+h[8530]))}h[i>>3]=s;return}function hO(b){b=b|0;var d=0,e=0;c[8512]=0;c[14056]=0;do{if((b|0)!=0){if(!(a[21856]|0)){break}d=c[(c[3524]|0)+128>>2]|0;if((d|0)!=0){cR[d&127](0,0,0)}a[21856]=0;if((c[8501]|0)==0){break}d=c[m>>2]|0;aI(147352,19,1,d|0)}}while(0);d=c[3524]|0;do{if((d|0)!=0){e=c[d+128>>2]|0;if((e|0)==0){break}cR[e&127](0,0,0);if((c[8498]|0)==0){break}e=c[(c[3524]|0)+120>>2]|0;if((e|0)==0){break}cN[e&255](1,179864);cN[c[(c[3524]|0)+120>>2]&255](2,179864)}}while(0);do{if((c[8026]|0)!=0){c[8026]=0;d=c[3524]|0;if((d|0)==0){break}e=c[d>>2]|0;if((a_(222936,e|0,3)|0)!=0){if((a_(163e3,e|0,3)|0)!=0){break}}e=c[o>>2]|0;b6(10,e|0)}}while(0);if((b|0)==1){return}c[b+12>>2]=1062;c[b+16>>2]=0;hQ(b,1);return}function hP(b){b=b|0;var d=0;if((b|0)==0){d=147656;return d|0}if(!(a[21856]|0)){d=0;return d|0}b=c[(c[3524]|0)+128>>2]|0;if((b|0)!=0){cR[b&127](0,0,0)}a[21856]=0;if((c[8501]|0)==0){d=0;return d|0}aI(147352,19,1,c[m>>2]|0);d=0;return d|0}function hQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=c[b+12>>2]|0;g=c[b+16>>2]|0;h=c[b+4>>2]|0;j=c[b+8>>2]|0;if((c[14128]|0)==0){hS()}k=c[8512]|0;do{if((k&1|0)==0){l=f;n=k&255}else{if((f&255|0)!=0){l=f;n=k&255;break}o=bC(f|0)|0;l=o;n=c[8512]&255}}while(0);if(!((l|0)<1|(c[8026]&8|0)==0|d^1)){ir(+(h|0),+(j|0),0,l);i=e;return}f=c[14128]|0;if((f|0)==0){i=e;return}k=(g&1|0)==0;g=b+20|0;o=f;L3631:while(1){do{if((l|0)==(c[o+4>>2]|0)){if(((a[o+8|0]^n)&6)!=0){break}f=e6(147896)|0;if((f|0)!=0){a[f+8|0]=0;p=c[g>>2]|0;c[f+16>>2]=1;c[f+24>>2]=p}if((a[o+20|0]&1)!=0){q=o+12|0;if((c[q>>2]|0)!=0){r=2635;break L3631}}if(!d){r=2655;break L3631}if(k){s=c[o+12>>2]|0;if((s|0)!=0){r=2644;break L3631}}p=c[o+16>>2]|0;if((p|0)==0){f=c[m>>2]|0;cf(f|0,123008,(v=i,i=i+16|0,c[v>>2]=105800,c[v+8>>2]=1370,v)|0);break}else{cO[p&255](b);break}}}while(0);p=c[o+24>>2]|0;if((p|0)==0){r=2652;break}else{o=p}}if((r|0)==2635){if(d){ir(+(h|0),+(j|0),0,l)}else{ir(0.0,0.0,0,l)}l=c[q>>2]|0;if((l|0)==0){t=0}else{t=bP(l|0)|0}dL(t);c[b>>2]=3;i=e;return}else if((r|0)==2655){i=e;return}else if((r|0)==2644){dL(bP(s|0)|0);i=e;return}else if((r|0)==2652){i=e;return}}function hR(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+32|0;g=f|0;if((c[14128]|0)==0){hS()}do{if((d|0)==0){hT(b)}else{hV(b,d,0);if(!e){break}if((hZ(g,b)|0)==0){break}h=c[14128]|0;if((h|0)==0){break}j=c[g+4>>2]|0;k=a[g+8|0]|0;l=h;do{do{if((j|0)==(c[l+4>>2]|0)){if(((a[l+8|0]^k)&6)!=0){break}a[l+20|0]=1}}while(0);l=c[l+24>>2]|0;}while((l|0)!=0)}}while(0);if((b|0)==0){i=f;return}uu(b);i=f;return}function hS(){var a=0,b=0,d=0;a=c[14128]|0;if((a|0)!=0){b=a;while(1){a=b+12|0;d=c[a>>2]|0;if((d|0)!=0){uu(d);c[a>>2]=0}a=c[b+24>>2]|0;uu(b);if((a|0)==0){break}else{b=a}}}c[14128]=0;hV(205056,0,182);hV(204680,0,172);hV(204424,0,14);hV(204128,0,120);hV(203920,0,40);hV(203672,0,86);hV(203432,0,104);hV(164840,0,156);hV(193632,0,122);hV(170288,0,66);hV(170224,0,100);hV(40160,0,32);hV(170216,0,202);hV(170208,0,92);hV(174448,0,44);hV(169624,0,78);hV(198400,0,196);hV(197952,0,206);hV(122560,0,150);hV(164216,0,46);hV(151360,0,134);hV(178184,0,174);hV(147552,0,24);hV(83696,0,74);return}function hT(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+48|0;e=d|0;if((c[14128]|0)==0){hS()}if((b|0)==0){f=d+32|0;uD(f|0,56584,12);g=c[m>>2]|0;aF(10,g|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=79120,c[v+8>>2]=78520,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=78176,c[v+8>>2]=77480,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=179864,c[v+8>>2]=77024,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=76336,c[v+8>>2]=75728,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=75192,c[v+8>>2]=74816,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=74352,c[v+8>>2]=73928,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=73616,c[v+8>>2]=72992,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=225216,c[v+8>>2]=224776,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=223768,c[v+8>>2]=223184,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=222680,c[v+8>>2]=221840,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=221376,c[v+8>>2]=220792,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=219032,c[v+8>>2]=218520,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=217968,c[v+8>>2]=217472,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=216736,c[v+8>>2]=216288,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=215744,c[v+8>>2]=215256,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=214784,c[v+8>>2]=214224,v)|0);f=c[m>>2]|0;aF(10,f|0);f=c[m>>2]|0;cf(f|0,213488,(v=i,i=i+16|0,c[v>>2]=212928,c[v+8>>2]=212352,v)|0);f=c[m>>2]|0;cf(f|0,211856,(v=i,i=i+16|0,c[v>>2]=211392,c[v+8>>2]=210904,v)|0);f=c[m>>2]|0;aF(10,f|0);f=c[14128]|0;if((f|0)!=0){g=f;do{h$(g);g=c[g+24>>2]|0;}while((g|0)!=0)}g=c[m>>2]|0;aF(10,g|0);g=c[m>>2]|0;aI(210240,67,1,g|0);g=c[m>>2]|0;aF(10,g|0);i=d;return}if((hZ(e,b)|0)==0){i=d;return}b=c[14128]|0;if((b|0)==0){i=d;return}g=c[e+4>>2]|0;f=a[e+8|0]|0;e=b;while(1){if((g|0)==(c[e+4>>2]|0)){if(((a[e+8|0]^f)&6)==0){break}}b=c[e+24>>2]|0;if((b|0)==0){h=2693;break}else{e=b}}if((h|0)==2693){i=d;return}h$(e);i=d;return}function hU(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0;f=i;if(!((b|0)!=0&(c[6928]|0)!=0)){dP();i=f;return}g=c[200]|0;do{if((a[64788+(g*688&-1)|0]&1)==0){j=2704}else{k=c[64652+(g*688&-1)>>2]|0;if((k&1|0)==0){if(+h[64680+(g*688&-1)>>3]<=0.0){break}}if((k&2|0)!=0){j=2704;break}if(+h[64688+(g*688&-1)>>3]>0.0){j=2704}}}while(0);L3731:do{if((j|0)==2704){g=c[144]|0;do{if((a[64788+(g*688&-1)|0]&1)!=0){k=c[64652+(g*688&-1)>>2]|0;if((k&1|0)==0){if(+h[64680+(g*688&-1)>>3]<=0.0){break L3731}}if((k&2|0)!=0){break}if(+h[64688+(g*688&-1)>>3]<=0.0){break L3731}}}while(0);g=c[34]|0;do{if((a[64788+(g*688&-1)|0]&1)!=0){k=c[64652+(g*688&-1)>>2]|0;if((k&1|0)==0){if(+h[64680+(g*688&-1)>>3]<=0.0){break L3731}}if((k&2|0)!=0){break}if(+h[64688+(g*688&-1)>>3]<=0.0){break L3731}}}while(0);if((a[66852]&1)!=0){g=c[16679]|0;if(!((g&1|0)!=0|+h[8343]>0.0)){break}if(!((g&2|0)!=0|+h[8344]>0.0)){break}}fv(b,d,e);i=f;return}}while(0);uk(164960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function hV(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=ut(28)|0;do{if((g|0)==0){gk();h=ut(28)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=81336,v)|0)}else{j=g}}while(0);g=j;if((hZ(g,b)|0)==0){uu(j);i=f;return}b=c[14128]|0;do{if((b|0)==0){c[14128]=g;k=g}else{h=c[j+4>>2]|0;l=j+8|0;m=b;while(1){if((h|0)==(c[m+4>>2]|0)){if(((a[m+8|0]^a[l])&6)==0){break}}n=c[m+24>>2]|0;if((n|0)==0){o=2741;break}else{m=n}}if((o|0)==2741){c[(c[b>>2]|0)+24>>2]=g;c[j>>2]=c[c[14128]>>2];k=c[14128]|0;break}do{if((d|0)==0){c[m+16>>2]=e}else{if((a[d]|0)==0){h_(m);break}l=m+12|0;h=c[l>>2]|0;if((h|0)!=0){uu(h);c[l>>2]=0}c[l>>2]=d}}while(0);uu(j);i=f;return}}while(0);c[k>>2]=g;c[j+24>>2]=0;a[j+20|0]=0;if((d|0)==0){c[j+16>>2]=e;i=f;return}if((a[d]|0)==0){h_(g);i=f;return}else{c[j+12>>2]=d;i=f;return}}function hW(){var b=0,d=0,e=0,f=0.0,g=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0,p=0.0;b=i;i=i+8|0;d=b|0;e=c[(c[3524]|0)+124>>2]|0;if((e|0)==0){i=b;return}if((a[26192]&1)==0){i=b;return}cN[e&255](-1,-1);if((a[37384]&1)==0){e=(a[66164]&1)!=0;f=+h[3275];if(e&f<0.0){g=-1}else{if(e){j=+_(+f);k=j/+h[8272]}else{k=f}g=~~(+(c[16536]|0)+(k- +h[8255])*+h[8269]+.5)}c[6558]=g;e=(a[65476]&1)!=0;k=+h[3276];if(e&k<0.0){l=-1}else{if(e){f=+_(+k);m=f/+h[8186]}else{m=k}l=~~(+(c[16364]|0)+(m- +h[8169])*+h[8183]+.5)}c[6559]=l;hN(g,l,d,d,26216,26224);n=c[6558]|0;o=c[6559]|0}else{h[d>>3]=1.0;m=(+h[3275]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;k=(+h[3276]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;f=(1.0- +h[5279])*+h[2]+ +h[12]+-1.0;j=+h[406]+m*+h[394]+k*+h[398]+f*+h[402];p=j==0.0?1.0e-5:j;d=~~((+h[403]+m*+h[391]+k*+h[395]+f*+h[399])/p*+(c[180]|0))+(c[186]|0)|0;l=~~((+h[404]+m*+h[392]+k*+h[396]+f*+h[400])/p*+(c[40]|0))+(c[46]|0)|0;c[6558]=d;c[6559]=l;n=d;o=l}cN[c[(c[3524]|0)+124>>2]&255](n,o);i=b;return}function hX(b){b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0.0;if((b|0)==0){d=76768;return d|0}e=c[3524]|0;f=e+124|0;if((c[f>>2]|0)==0){d=0;return d|0}do{if((a[26192]&1)==0){if((a[37384]&1)!=0){if(+P(+(+aX(+(+g[3536]),90.0)))>=.1){break}if(+P(+(+aX(+(+g[3538]),180.0)))>=.1){break}}a[26192]=1;i=c[b+4>>2]|0;c[6558]=i;j=c[b+8>>2]|0;c[6559]=j;hN(i,j,26200,26208,26216,26224);cN[c[(c[3524]|0)+124>>2]&255](c[6558]|0,c[6559]|0);j=e6(98488)|0;if((j|0)!=0){a[j+8|0]=0;k=+h[3275];c[j+16>>2]=2;h[j+24>>3]=k;h[j+32>>3]=0.0}j=e6(92688)|0;if((j|0)!=0){a[j+8|0]=0;k=+h[3276];c[j+16>>2]=2;h[j+24>>3]=k;h[j+32>>3]=0.0}if((c[8501]|0)==0){break}j=c[m>>2]|0;aI(224616,18,1,j|0)}else{a[26192]=0;do{if((e|0)!=0){j=c[f>>2]|0;if((j|0)==0){break}cN[j&255](-1,-1)}}while(0);j=e6(98488)|0;if((j|0)!=0){a[j+8|0]=1}j=e6(92688)|0;if((j|0)!=0){a[j+8|0]=1}if((c[8501]|0)==0){break}j=c[m>>2]|0;aI(84792,19,1,j|0);if((c[8501]|0)==0){break}j=c[m>>2]|0;aI(84792,19,1,j|0)}}while(0);hM();d=0;return d|0}function hY(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[7772]|0;if((b-1|0)>>>0>=2){e=d;return e|0}do{if((d|0)!=(b|0)){if((a[26192]&1)==0){break}a[26192]=0;f=c[3524]|0;do{if((f|0)!=0){g=c[f+124>>2]|0;if((g|0)==0){break}cN[g&255](-1,-1)}}while(0);f=e6(98488)|0;if((f|0)!=0){a[f+8|0]=1}f=e6(92688)|0;if((f|0)!=0){a[f+8|0]=1}if((c[8501]|0)==0){break}f=c[m>>2]|0;aI(84792,19,1,f|0)}}while(0);c[7772]=b;e=b;return e|0}function hZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0;e=i;f=b+4|0;c[f>>2]=-1;g=b+8|0;a[g]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b>>2]=0;c[b+24>>2]=0;if((d|0)==0){h=0;i=e;return h|0}else{j=d;k=-1;l=0}L3876:while(1){b=a[j]|0;if(b<<24>>24==0){n=k;o=2836;break}L3879:do{if((uJ(j|0,217264,4)|0)==0){p=l|4;a[g]=p;q=j+4|0;r=k;s=p}else{if((uJ(j|0,211672,5)|0)==0){p=l|2;a[g]=p;q=j+5|0;r=k;s=p;break}L3884:do{if((aY(j|0,87296)|0)==0){t=0;o=2824}else{p=(a_(j|0,87296,9)|0)!=0;if((aY(j|0,86224)|0)==0){t=1;o=2824;break}u=(a_(j|0,86224,3)|0)==0&p?1:p<<31>>31;if((aY(j|0,85184)|0)==0){t=2;o=2824;break}p=(a_(j|0,85184,8)|0)==0&(u|0)<0?2:u;if((aY(j|0,84288)|0)==0){t=3;o=2824;break}u=(a_(j|0,84288,6)|0)==0&(p|0)<0?3:p;if((aY(j|0,83696)|0)==0){t=4;o=2824;break}p=(a_(j|0,83696,6)|0)==0&(u|0)<0?4:u;if((aY(j|0,82728)|0)==0){t=5;o=2824;break}u=(a_(j|0,82728,6)|0)==0&(p|0)<0?5:p;if((u|0)>-1){t=u;o=2824;break}else{w=20384}while(1){u=c[w>>2]|0;if((u|0)==0){break L3884}if((aY(j|0,u|0)|0)==0){break}else{w=w+4|0}}x=(w-20384>>2)+1e3|0;y=uA(j|0)|0;o=2832}}while(0);if((o|0)==2824){o=0;u=uA(c[960+(t<<3)>>2]|0)|0;x=c[964+(t<<3)>>2]|0;y=u;o=2832}do{if((o|0)==2832){o=0;if((x|0)==-1){break}c[f>>2]=x;q=j+y|0;r=x;s=l;break L3879}}while(0);u=j+1|0;p=b<<24>>24;c[f>>2]=p;z=a[u]|0;if((z<<24>>24|0)==0|(z<<24>>24|0)==45){q=u;r=p;s=l}else{o=2835;break L3876}}}while(0);if((q|0)==0){n=r;o=2836;break}else{j=q;k=r;l=s}}if((o|0)==2836){h=(n|0)!=-1&1;i=e;return h|0}else if((o|0)==2835){cf(c[m>>2]|0,205504,(v=i,i=i+8|0,c[v>>2]=d,v)|0);h=0;i=e;return h|0}return 0}function h_(a){a=a|0;var b=0,d=0,e=0,f=0;if((a|0)==0){return}if((c[a+16>>2]|0)!=0){b=a+12|0;d=c[b>>2]|0;if((d|0)==0){return}uu(d);c[b>>2]=0;return}b=a|0;d=c[b>>2]|0;e=a+24|0;if((d|0)==0){f=0}else{c[d+24>>2]=c[e>>2];f=c[b>>2]|0}b=c[e>>2]|0;if((b|0)==0){c[c[14128]>>2]=f}else{c[b>>2]=f}f=a+12|0;b=c[f>>2]|0;if((b|0)!=0){uu(b);c[f>>2]=0}do{if((c[14128]|0)==(a|0)){f=c[e>>2]|0;c[14128]=f;if((f|0)==0){break}b=c[f>>2]|0;if((b|0)==0){break}c[b+24>>2]=0}}while(0);uu(a);return}function h$(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0;e=i;i=i+8|0;f=e|0;g=c[m>>2]|0;h=f;a[56520]=0;do{if((d|0)!=0){j=d+8|0;k=a[j]|0;if((k&2)==0){l=k}else{a[56520]=a[206584]|0;a[56521|0]=a[206585|0]|0;a[56522|0]=a[206586|0]|0;a[56523|0]=a[206587|0]|0;a[56524|0]=a[206588|0]|0;a[56525|0]=a[206589|0]|0;l=a[j]|0}if((l&4)!=0){j=56520+(uA(56520)|0)|0;a[j]=a[205752]|0;a[j+1|0]=a[205753|0]|0;a[j+2|0]=a[205754|0]|0;a[j+3|0]=a[205755|0]|0;a[j+4|0]=a[205756|0]|0;a[j+5|0]=a[205757|0]|0;a[j+6|0]=a[205758|0]|0}j=c[d+4>>2]|0;if((j-1001|0)>>>0<63){k=c[20384+(j-1e3<<2)>>2]|0;uC(56520,k|0);break}else{n=0}while(1){if((n|0)==6){o=2872;break}if((c[964+(n<<3)>>2]|0)==(j|0)){o=2871;break}else{n=n+1|0}}if((o|0)==2871){k=c[960+(n<<3)>>2]|0;uC(56520,k|0);break}else if((o|0)==2872){b[f>>1]=0;a[h]=j&255;uC(56520,h|0);break}}}while(0);cf(g|0,209560,(v=i,i=i+8|0,c[v>>2]=56520,v)|0);cf(c[m>>2]|0,209048,(v=i,i=i+8|0,c[v>>2]=(a[d+20|0]&1)!=0?42:32,v)|0);g=c[d+12>>2]|0;if((g|0)!=0){h=c[m>>2]|0;cf(h|0,208640,(v=i,i=i+8|0,c[v>>2]=g,v)|0);i=e;return}g=c[d+16>>2]|0;d=c[m>>2]|0;if((g|0)==0){cf(d|0,207152,(v=i,i=i+16|0,c[v>>2]=105800,c[v+8>>2]=2288,v)|0);i=e;return}else{h=cO[g&255](0)|0;cf(d|0,154696,(v=i,i=i+8|0,c[v>>2]=h,v)|0);i=e;return}}function h0(a){a=a|0;var b=0;if((a|0)==0){b=165760}else{dM(165400);b=0}return b|0}function h1(b){b=b|0;var d=0,e=0,f=0,g=0;if((b|0)==0){d=166224;return d|0}b=c[11692]|0;e=c[260]|0;do{if((b|0)==0){if((e|0)==0){f=0;g=2889;break}c[11692]=e}else{f=e;g=2889}}while(0);do{if((g|0)==2889){if((b|0)==(f|0)&(b|0)!=31){c[11692]=31;break}if((a[37384]&1)!=0&(b|0)==31){c[11692]=4095;break}else{c[11692]=0;break}}}while(0);dM(179864);d=0;return d|0}function h2(a){a=a|0;var b=0;if((a|0)==0){b=166576}else{dM(179864);b=0}return b|0}function h3(b){b=b|0;var c=0,d=0,e=0;if((b|0)==0){c=167768;return c|0}else{d=0}while(1){if(d>>>0>=8){e=2905;break}if((a[65036+(d*688&-1)|0]&1)!=0){e=2906;break}if((a[65037+(d*688&-1)|0]&1)==0){d=d+1|0}else{e=2906;break}}if((e|0)==2906){dM(166984);c=0;return c|0}else if((e|0)==2905){dM(196824);c=0;return c|0}return 0}function h4(b){b=b|0;var d=0;if((b|0)==0){d=168352;return d|0}aF(10,c[m>>2]|0);hT(0);if((a[37400]&1)==0){d=0;return d|0}aI(105808,9,1,c[m>>2]|0);aD(c[m>>2]|0);d=0;return d|0}function h5(b){b=b|0;var d=0,e=0,f=0;d=i;if((b|0)==0){e=169176;i=d;return e|0}if((a[872]&1)!=0){uh(-1,168720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);e=0;i=d;return e|0}b=c[8494]|0;do{if((c[13528]|0)<(b|0)&(b|0)<(c[13529]|0)){f=c[8492]|0;if(!((c[13530]|0)<(f|0)&(f|0)<(c[13531]|0))){break}dM((a[66852]&1)!=0?173736:173264);e=0;i=d;return e|0}}while(0);if((a[37384]&1)==0|(c[5094]|0)!=0){dM((a[65476]&1)!=0?171552:171296);e=0;i=d;return e|0}else{dM((a[64788+((c[34]|0)*688&-1)|0]&1)!=0?172888:172496);e=0;i=d;return e|0}return 0}function h6(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((b|0)==0){d=174336;return d|0}b=c[8494]|0;do{if((c[13528]|0)<(b|0)&(b|0)<(c[13529]|0)){e=c[8492]|0;if(!((c[13530]|0)<(e|0)&(e|0)<(c[13531]|0))){break}dM((a[66852]&1)!=0?173736:173264);d=0;return d|0}}while(0);if(!((a[37384]&1)==0|(c[5094]|0)!=0)){dM((a[64788+((c[34]|0)*688&-1)|0]&1)!=0?172888:172496);d=0;return d|0}e=c[8492]|0;f=c[7940]|0;g=c[7941]|0;h=(g-f|0)/4&-1;i=c[7938]|0;if((e|0)<(h+f|0)){j=c[7939]|0;k=(b|0)>(i|0)&(b|0)<(j|0);l=j}else{k=0;l=c[7939]|0}j=(l-i|0)/4&-1;if((b|0)<(j+i|0)){m=(e|0)>(f|0)&(e|0)<(g|0)}else{m=0}if((e|0)>(g-h|0)){n=(b|0)>(i|0)&(b|0)<(l|0)}else{n=0}if((b|0)>(l-j|0)){o=(e|0)>(f|0)&(e|0)<(g|0)}else{o=0}if(k){dL(bP(((a[66164]&1)!=0?172224:171904)|0)|0)}if(m){dL(bP(((a[65476]&1)!=0?171552:171296)|0)|0)}g=c[5094]|0;if((g|0)!=0|n^1){p=g}else{dL(bP(((a[68916]&1)!=0?170840:170464)|0)|0);p=c[5094]|0}if(!((p|0)!=0|o^1)){dL(bP(((a[68228]&1)!=0?170088:169608)|0)|0)}do{if(!k){if((c[5094]|0)!=0&(m^1)){dM((a[64788+((c[34]|0)*688&-1)|0]&1)!=0?172888:172496)}if(m|n|o){break}else{d=0}return d|0}}while(0);dM(179864);d=0;return d|0}function h7(a){a=a|0;var b=0;if((a|0)==0){b=175488;return b|0}do{if((c[8496]|0)==0){c[8496]=1;if((c[8501]|0)==0){break}a=c[m>>2]|0;aI(174984,18,1,a|0)}else{c[8496]=0;if((c[8501]|0)==0){break}a=c[m>>2]|0;aI(174688,19,1,a|0)}}while(0);hM();b=0;return b|0}function h8(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==0){e=175784;i=d;return e|0}b=c[8506]|0;f=b-1|0;c[8506]=f;g=c[8510]|0;do{if((f|0)!=7|(g|0)!=0){if((f|0)>7){c[8506]=1;break}if((f|0)>=1){break}c[8506]=7;if((g|0)!=0){break}if((a[30528]&1)!=0){break}c[8506]=6}else{if((a[30528]&1)!=0){break}c[8506]=6}}while(0);hM();if((c[8501]|0)==0){e=0;i=d;return e|0}g=c[8506]|0;cf(c[m>>2]|0,176192,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0);e=0;i=d;return e|0}function h9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((b|0)==0){e=176776;i=d;return e|0}b=c[8506]|0;f=b+1|0;c[8506]=f;g=c[8510]|0;do{if((f|0)!=7|(g|0)!=0){if((f|0)>7){h=2998;break}if((b|0)>=0){break}c[8506]=7;if((g|0)!=0){break}if((a[30528]&1)!=0){break}c[8506]=6}else{if((a[30528]&1)!=0){break}c[8506]=8;h=2998}}while(0);if((h|0)==2998){c[8506]=1}hM();if((c[8501]|0)==0){e=0;i=d;return e|0}h=c[8506]|0;cf(c[m>>2]|0,176192,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=h,v)|0);e=0;i=d;return e|0}function ia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){d=177368;i=b;return d|0}a=c[13532]|0;e=a-1|0;c[13532]=e;f=c[13534]|0;do{if((e|0)!=7|(f|0)!=0){if((e|0)>7){c[13532]=0;g=0;break}if((e|0)>=0){g=e;break}c[13532]=7;if((f|0)!=0){g=7;break}c[13532]=6;g=6}else{c[13532]=6;g=6}}while(0);if((c[8501]|0)==0){d=0;i=b;return d|0}cf(c[m>>2]|0,177616,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=g,v)|0);d=0;i=b;return d|0}function ib(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if((a|0)==0){d=177920;i=b;return d|0}a=c[13532]|0;e=a+1|0;c[13532]=e;f=c[13534]|0;do{if((e|0)!=7|(f|0)!=0){if((e|0)>7){g=3027;break}if((e|0)>=0){h=e;break}c[13532]=7;if((f|0)!=0){h=7;break}c[13532]=6;h=6}else{c[13532]=8;g=3027}}while(0);if((g|0)==3027){c[13532]=0;h=0}if((c[8501]|0)==0){d=0;i=b;return d|0}cf(c[m>>2]|0,177616,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=h,v)|0);d=0;i=b;return d|0}function ic(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){d=179216;i=b;return d|0}e=(c[8500]|0)+1|0;f=(e|0)>2?0:e;c[8500]=f;cR[c[(c[3524]|0)+128>>2]&127]((f|0)!=0?-3:-4,c[a+4>>2]|0,c[a+8>>2]|0);hM();if((c[8501]|0)==0){d=0;i=b;return d|0}cf(c[m>>2]|0,178656,(v=i,i=i+8|0,c[v>>2]=(c[8500]|0)!=0?179864:178216,v)|0);d=0;i=b;return d|0}function id(a){a=a|0;var b=0;if((a|0)==0){b=180400;return b|0}do{if((c[8501]|0)==0){c[8501]=1}else{a=c[m>>2]|0;aI(179928,49,1,a|0);a=(c[8501]|0)==0;c[8501]=a&1;if(a){break}else{b=0}return b|0}}while(0);aI(179616,39,1,c[m>>2]|0);b=0;return b|0}function ie(a){a=a|0;var b=0,c=0.0;do{if((a|0)==0){b=183160}else{c=+g[18074];if(c==0.0){dM(182624);b=0;break}if(c==1.0){dM(181152);b=0;break}else{dM(180792);b=0;break}}}while(0);return b|0}function ig(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=183976;return b|0}a=c[6]|0;do{if((a|0)==0){d=3063}else{e=c[a+72>>2]|0;if((e|0)==0){d=3063;break}ip(e)}}while(0);if((d|0)==3063){d=c[m>>2]|0;aF(7,d|0)}if((c[8501]|0)==0){b=0;return b|0}aI(183608,11,1,c[m>>2]|0);b=0;return b|0}function ih(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=184736;return b|0}a=c[6]|0;do{if((a|0)==0){d=3074}else{e=c[a+68>>2]|0;if((e|0)==0){d=3074;break}ip(e)}}while(0);if((d|0)==3074){d=c[m>>2]|0;aF(7,d|0)}if((c[8501]|0)==0){b=0;return b|0}aI(184360,15,1,c[m>>2]|0);b=0;return b|0}function ii(a){a=a|0;var b=0,d=0;if((a|0)==0){b=187240;return b|0}a=c[8]|0;if((a|0)==0|(c[6]|0)==(a|0)){d=c[m>>2]|0;aF(7,d|0)}else{ip(a)}if((c[8501]|0)==0){b=0;return b|0}aI(186768,8,1,c[m>>2]|0);b=0;return b|0}function ij(b){b=b|0;var c=0;do{if((b|0)==0){c=189200}else{if((a[37384]&1)==0){c=0;break}io(0,-1);c=0}}while(0);return c|0}function ik(b){b=b|0;var c=0;do{if((b|0)==0){c=191536}else{if((a[37384]&1)==0){c=0;break}io(1,0);c=0}}while(0);return c|0}function il(b){b=b|0;var c=0;do{if((b|0)==0){c=193488}else{if((a[37384]&1)==0){c=0;break}io(0,1);c=0}}while(0);return c|0}function im(b){b=b|0;var c=0;do{if((b|0)==0){c=196952}else{if((a[37384]&1)==0){c=0;break}io(-1,0);c=0}}while(0);return c|0}function io(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0.0,l=0.0,n=0.0;e=i;if((c[8512]&1|0)==0){f=d;j=b}else{f=d*10&-1;j=b*10&-1}do{if((j|0)!=0){k=+(j|0)+ +g[3538];if(k<0.0){l=k+360.0}else{l=k}g[3538]=l;if(l<=360.0){break}g[3538]=l+-360.0}}while(0);do{if((f|0)!=0){l=+(f|0)+ +g[3536];if(l<0.0){n=l+360.0}else{n=l}g[3536]=n;if(n<=360.0){break}g[3536]=n+-360.0}}while(0);do{if((f|j|0)!=0){n=+g[3538];b=e6(196288)|0;if((b|0)!=0){a[b+8|0]=0;c[b+16>>2]=2;h[b+24>>3]=n;h[b+32>>3]=0.0}n=+g[3536];b=e6(195744)|0;if((b|0)==0){break}a[b+8|0]=0;c[b+16>>2]=2;h[b+24>>3]=n;h[b+32>>3]=0.0}}while(0);if((c[8501]|0)!=0){j=c[m>>2]|0;n=+g[3538];l=+g[3536];cf(j|0,193976,(v=i,i=i+16|0,h[v>>3]=n,h[v+8>>3]=l,v)|0)}hU(c[10828]|0,c[7952]|0,0);do{if((a[37384]&1)!=0){if(+P(+(+aX(+(+g[3536]),90.0)))>=.1){i=e;return}if(+P(+(+aX(+(+g[3538]),180.0)))<.1){break}i=e;return}}while(0);if((c[(c[3524]|0)+120>>2]|0)==0){i=e;return}hN(c[8494]|0,c[8492]|0,27760,27744,27752,27736);hM();i=e;return}function ip(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0.0,o=0.0,p=0.0,q=0.0;d=i;i=i+1024|0;e=d|0;if((a[37384]&1)==0){f=0}else{f=(c[5094]|0)==1}g=c[6]|0;do{if((g|0)==0){j=0}else{h[g>>3]=+h[8257];h[g+16>>3]=+h[8258];h[g+32>>3]=+h[8601];h[g+48>>3]=+h[8602];c[g+64>>2]=f&1;if(f){k=c[6]|0;h[k+8>>3]=+h[8172];h[k+24>>3]=+h[8171];h[k+40>>3]=+h[8516];h[k+56>>3]=+h[8515];j=k;break}else{k=c[6]|0;h[k+8>>3]=+h[8171];h[k+24>>3]=+h[8172];h[k+40>>3]=+h[8515];h[k+56>>3]=+h[8516];j=k;break}}}while(0);g=c[8]|0;if(!((j|0)!=(g|0)|(g|0)==(b|0))){uD(57080,64648,7568);c[16506]=0;c[16334]=0;c[17194]=0;c[17022]=0}c[6]=b;if((b|0)==0){b=c[m>>2]|0;aF(7,b|0);i=d;return}cM[c[(c[3524]|0)+168>>2]&511](11);b=c[6]|0;if(f){l=(c[b+64>>2]|0)!=0}else{l=0}g=e|0;n=+h[b+16>>3];j=b+24|0;k=b+8|0;o=+h[(l?j:k)>>3];p=+h[(l?k:j)>>3];be(g|0,186136,(v=i,i=i+32|0,h[v>>3]=+h[b>>3],h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=p,v)|0);if((a[37384]&1)==0){b=e+(uA(g|0)|0)|0;e=c[6]|0;p=+h[e+32>>3];o=+h[e+48>>3];n=+h[e+40>>3];q=+h[e+56>>3];be(b|0,185640,(v=i,i=i+32|0,h[v>>3]=p,h[v+8>>3]=o,h[v+16>>3]=n,h[v+24>>3]=q,v)|0)}do{if((c[6]|0)==(c[8]|0)){b=0;do{uD(57512+(b*688&-1)|0,65080+(b*688&-1)|0,192);c[57376+(b*688&-1)>>2]=c[64944+(b*688&-1)>>2];c[57356+(b*688&-1)>>2]=c[64924+(b*688&-1)>>2];b=b+1|0;}while((b|0)<11);uD(64648,57080,7568);a[g]=0;if((a[872]&1)==0){break}b=c[6928]|0;if((b|0)==2){dO();i=d;return}if(!(f&(b|0)==3)){break}dO();i=d;return}else{a[37408]=1}}while(0);dM(g);a[37408]=0;i=d;return}function iq(b,d,e,f,g){b=b|0;d=+d;e=+e;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;j=i;i=i+1080|0;k=j|0;l=j+48|0;m=j+312|0;n=j+568|0;o=j+824|0;if((f-4|0)>>>0<3|(f|0)==3){p=m|0;uE(p|0,0,255);a[p]=91;a[m+1|0]=37;a[m+2|0]=115;a[m+3|0]=44;a[m+4|0]=32;q=c[8503]|0;uC(p|0,q|0);q=m+(uA(p|0)|0)|0;w=93;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;q=j+56|0;c[l>>2]=~~(d+946684800.0);m=bm(l|0)|0;if((f|0)==4){l=c[m+12>>2]|0;r=(c[m+16>>2]|0)+1|0;s=c[m+20>>2]|0;t=((s|0)<69?2e3:1900)+s|0;be(q|0,151152,(v=i,i=i+24|0,c[v>>2]=l,c[v+8>>2]=r,c[v+16>>2]=t,v)|0)}else if((f|0)==3){t3(k,d);t4(q,255,66189,k,d- +O(+d))}else if((f|0)==6){k=(c[m+16>>2]|0)+1|0;t=c[m+20>>2]|0;r=c[m+8>>2]|0;l=c[m+4>>2]|0;be(q|0,150792,(v=i,i=i+40|0,c[v>>2]=c[m+12>>2],c[v+8>>2]=k,c[v+16>>2]=((t|0)<69?2e3:1900)+t,c[v+24>>2]=r,c[v+32>>2]=l,v)|0)}else if((f|0)==5){l=c[m+4>>2]|0;be(q|0,150944,(v=i,i=i+16|0,c[v>>2]=c[m+8>>2],c[v+8>>2]=l,v)|0)}else{be(q|0,c[8503]|0,(v=i,i=i+8|0,h[v>>3]=d,v)|0)}be(b|0,p|0,(v=i,i=i+16|0,c[v>>2]=q,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}do{if((f|0)==1){a[632]=0;q=c[8503]|0;ck(632,q|0,30);q=632+(uA(632)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;ck(632,q|0,30);be(b|0,632,(v=i,i=i+16|0,h[v>>3]=d,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}else if((f|0)==2){z=+h[8256]- +h[8255];A=+h[8170]- +h[8169];if(z!=0.0){q=n|0;uE(q|0,0,255);a[q]=47;p=c[8503]|0;uC(q|0,p|0);B=(d- +h[8255])/z;be(b|0,q|0,(v=i,i=i+8|0,h[v>>3]=B,v)|0)}else{uD(b|0,152448,13)}q=b+(uA(b|0)|0)|0;if(A!=0.0){p=o|0;uE(p|0,0,255);a[p]=44;a[o+1|0]=32;l=c[8503]|0;uC(p|0,l|0);l=o+(uA(p|0)|0)|0;w=47;a[l]=w&255;w=w>>8;a[l+1|0]=w&255;B=(e- +h[8169])/A;be(q|0,p|0,(v=i,i=i+8|0,h[v>>3]=B,v)|0);u=q;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}else{uD(q|0,151872,15);u=q;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}}else if((f|0)==7){q=(g|0)!=0;p=a[30528]|0;if(!q){if((p&1)==0){break}}if((p&1)==0){be(b|0,g|0,(v=i,i=i+16|0,h[v>>3]=d,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}B=(c[17366]&1|0)==0?+h[8687]:0.0;A=+Y(+e,+d);p=(a[69604]&1)==0;z=d/+S(+A);if(p){C=B+z}else{D=+_(+B);B=+h[8702];C=+Z(+(B*(z+D/B)))}if(q){B=A/+h[9040];be(b|0,g|0,(v=i,i=i+16|0,h[v>>3]=B,h[v+8>>3]=C,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}else{q=b;p=q|0;w=1634496368;a[p]=w&255;w=w>>8;a[p+1|0]=w&255;w=w>>8;a[p+2|0]=w&255;w=w>>8;a[p+3|0]=w&255;p=q+4|0;w=2112114;a[p]=w&255;w=w>>8;a[p+1|0]=w&255;w=w>>8;a[p+2|0]=w&255;w=w>>8;a[p+3|0]=w&255;p=b+(uA(b|0)|0)|0;a[632]=0;q=c[8503]|0;ck(632,q|0,30);q=632+(uA(632)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;ck(632,q|0,30);B=A/+h[9040];be(p|0,632,(v=i,i=i+16|0,h[v>>3]=B,h[v+8>>3]=C,v)|0);u=p;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}}}while(0);a[632]=0;ck(632,c[8503]|0,30);g=632+(uA(632)|0)|0;a[g]=a[86120]|0;a[g+1|0]=a[86121|0]|0;a[g+2|0]=a[86122|0]|0;ck(632,c[8503]|0,30);be(b|0,632,(v=i,i=i+16|0,h[v>>3]=d,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}function ir(b,d,e,f){b=+b;d=+d;e=e|0;f=f|0;var g=0,j=0,k=0,l=0;g=i;hN(~~b,~~d,27760,27744,27752,27736);j=e6(164136)|0;if((j|0)!=0){a[j+8|0]=e&1^1;c[j+16>>2]=1;c[j+24>>2]=e?f:-1}e=e6(163432)|0;if((e|0)!=0){a[e+8|0]=0;c[e+16>>2]=1;c[e+24>>2]=f}e=e6(162952)|0;if((e|0)!=0){j=ut(2)|0;do{if((j|0)==0){gk();k=ut(2)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=162328,v)|0)}else{l=j}}while(0);a[l]=f&255;a[l+1|0]=0;f=e+8|0;j=e+16|0;do{if((a[f]&1)==0){if((c[j>>2]|0)!=3){break}uu(c[e+24>>2]|0);c[j>>2]=1}}while(0);a[f]=0;c[j>>2]=3;c[e+24>>2]=l}l=e6(159824)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3470];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(159208)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3468];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(158720)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3469];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(158096)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3467];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(156232)|0;if((l|0)!=0){a[l+8|0]=0;e=c[8512]&1;c[l+16>>2]=1;c[l+24>>2]=e}e=e6(155120)|0;if((e|0)!=0){a[e+8|0]=0;l=c[8512]&4;c[e+16>>2]=1;c[e+24>>2]=l}l=e6(154768)|0;if((l|0)==0){i=g;return}a[l+8|0]=0;e=c[8512]&2;c[l+16>>2]=1;c[l+24>>2]=e;i=g;return}function is(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[13898]|0;if((e|0)>=(c[8272]|0)){uf(e,214888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=c[1054]|0;L4406:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;h=f+(e*40&-1)+32|0;j=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[j+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L4406}}if((k|0)!=1){break}uf(e,214888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);c[11670]=0;e4(it()|0,b);if((a[1960]&1)==0){i=d;return b|0}else{uf(e,159392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}return 0}function it(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[18070]|0;if((b|0)!=0){e1(b)}b=ut(4808)|0;do{if((b|0)==0){gk();d=ut(4808)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=122712,v)|0);return 0}else{e=b}}while(0);c[18070]=e;uE(e|0,0,4808);c[18066]=150;c[8230]=0;if((iy()|0)!=0){f=c[18070]|0;i=a;return f|0}c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1;f=c[18070]|0;i=a;return f|0}function iu(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+48|0;e=d|0;f=d+24|0;uu(c[3546]|0);c[3546]=0;g=(b|0)!=0;if(g){c[b>>2]=0}h=c[13898]|0;if((h|0)>=(c[8272]|0)){uf(h,135720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}j=c[1054]|0;k=(a[j+(h*40&-1)|0]&1)==0;do{if(!k){l=c[j+(h*40&-1)+36>>2]|0;m=j+(h*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){p=3259;break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break}}do{if((p|0)==3259){if((o|0)!=1){break}uf(h,135720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);if(k){break}o=c[j+(h*40&-1)+32>>2]|0;m=c[10036]|0;n=a[m+o|0]|0;if(!((n<<24>>24|0)==39|(n<<24>>24|0)==34)){break}n=c[j+(h*40&-1)+36>>2]|0;l=0;while(1){if((l|0)>=(n|0)){p=3266;break}if((a[m+(o+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{p=3267;break}}if((p|0)==3266){if((l|0)==1){q=0}else{p=3267}}do{if((p|0)==3267){a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)==3){q=c[e+8>>2]|0;break}else{c[13898]=h;q=0;break}}}while(0);c[3546]=q;r=q;i=d;return r|0}}while(0);it();q=c[18070]|0;h=c[q>>2]|0;e=0;while(1){if((e|0)>=(h|0)){p=3274;break}j=c[q+8+(e<<5)>>2]|0;if((j-2|0)>>>0<3|(j|0)==8){break}else{e=e+1|0}}do{if((p|0)==3274){e4(q,f);if((a[1960]&1)!=0){break}if((c[f>>2]|0)!=3){break}c[3546]=c[f+8>>2]}}while(0);if(g){c[b>>2]=c[18070]}r=c[3546]|0;i=d;return r|0}function iv(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;d=i;e=c[10812]|0;f=c[8272]|0;L4473:do{if((e|0)==0){g=43248;h=c[1054]|0;j=c[10036]|0}else{k=(f|0)>(b|0);l=c[1054]|0;m=l+(b*40&-1)|0;n=l+(b*40&-1)+36|0;o=l+(b*40&-1)+32|0;p=c[10036]|0;q=e;L4475:while(1){r=c[q+4>>2]|0;L4477:do{if(k){if((a[m]&1)==0){break}s=c[n>>2]|0;t=0;while(1){if((t|0)>=(s|0)){break}if((a[p+((c[o>>2]|0)+t|0)|0]|0)==(a[r+t|0]|0)){t=t+1|0}else{break L4477}}if((a[r+t|0]|0)==0){u=q;break L4475}}}while(0);r=q|0;s=c[r>>2]|0;if((s|0)==0){g=r;h=l;j=p;break L4473}else{q=s}}i=d;return u|0}}while(0);e=(f|0)>(b|0);f=h+(b*40&-1)|0;q=h+(b*40&-1)+36|0;p=h+(b*40&-1)+32|0;h=41;L4488:while(1){l=c[41160+(h<<3)>>2]|0;L4490:do{if(e){if((a[f]&1)==0){break}o=c[q>>2]|0;n=0;while(1){if((n|0)>=(o|0)){break}if((a[j+((c[p>>2]|0)+n|0)|0]|0)==(a[l+n|0]|0)){n=n+1|0}else{break L4490}}if((a[l+n|0]|0)==0){w=3303;break L4488}}}while(0);l=h+1|0;if((l|0)==117){break}else{h=l}}do{if((w|0)==3303){if((h|0)==0){break}uh(b,92536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h=ut(312)|0;do{if((h|0)==0){gk();w=ut(312)|0;if((w|0)!=0){x=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=144328,v)|0);return 0}else{x=h}}while(0);c[g>>2]=x;c[x>>2]=0;c[(c[g>>2]|0)+12>>2]=0;c[(c[g>>2]|0)+8>>2]=0;x=(c[(c[1054]|0)+(b*40&-1)+36>>2]|0)+1|0;h=ut(x)|0;do{if((h|0)==0){gk();w=ut(x)|0;if((w|0)!=0){y=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=76632,v)|0);return 0}else{y=h}}while(0);c[(c[g>>2]|0)+4>>2]=y;y=c[(c[g>>2]|0)+4>>2]|0;h=c[1054]|0;x=c[h+(b*40&-1)+36>>2]|0;w=c[h+(b*40&-1)+32>>2]|0;b=0;while(1){h=b+1|0;a[y+b|0]=a[(c[10036]|0)+w|0]|0;if((h|0)==(x|0)){break}else{w=w+1|0;b=h}}a[y+x|0]=0;x=c[g>>2]|0;c[x+24>>2]=1;c[x+32>>2]=0;x=c[g>>2]|0;c[x+48>>2]=1;c[x+56>>2]=0;x=c[g>>2]|0;c[x+72>>2]=1;c[x+80>>2]=0;x=c[g>>2]|0;c[x+96>>2]=1;c[x+104>>2]=0;x=c[g>>2]|0;c[x+120>>2]=1;c[x+128>>2]=0;x=c[g>>2]|0;c[x+144>>2]=1;c[x+152>>2]=0;x=c[g>>2]|0;c[x+168>>2]=1;c[x+176>>2]=0;x=c[g>>2]|0;c[x+192>>2]=1;c[x+200>>2]=0;x=c[g>>2]|0;c[x+216>>2]=1;c[x+224>>2]=0;x=c[g>>2]|0;c[x+240>>2]=1;c[x+248>>2]=0;x=c[g>>2]|0;c[x+264>>2]=1;c[x+272>>2]=0;x=c[g>>2]|0;c[x+288>>2]=1;c[x+296>>2]=0;u=c[g>>2]|0;i=d;return u|0}function iw(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0.0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0;b=i;i=i+152|0;e=b|0;f=b+24|0;g=b+48|0;j=b+72|0;k=b+96|0;l=c[13898]|0;m=c[8272]|0;if((m|0)<=(l|0)){n=0;i=b;return n|0}o=k|0;p=j|0;q=j+8|0;r=g|0;s=g+8|0;t=f|0;u=f+8|0;w=e|0;x=e+8|0;y=0;z=0;A=l;l=m;L4518:while(1){m=A;B=l;while(1){C=c[1054]|0;if((a[C+(m*40&-1)|0]&1)==0){n=y;D=3435;break L4518}E=c[C+(m*40&-1)+36>>2]|0;F=C+(m*40&-1)+32|0;G=c[10036]|0;H=0;while(1){if((H|0)>=(E|0)){break}if((a[G+((c[F>>2]|0)+H|0)|0]|0)==(a[H+217064|0]|0)){H=H+1|0}else{n=y;D=3438;break L4518}}if((H|0)!=3){n=y;D=3436;break L4518}F=m+1|0;E=m+2|0;c[13898]=E;if((B|0)<=(F|0)){I=E;D=3452;break L4518}if((a[C+(F*40&-1)|0]&1)==0){I=E;D=3455;break L4518}J=c[C+(F*40&-1)+36>>2]|0;K=C+(F*40&-1)+32|0;F=0;while(1){if((F|0)>=(J|0)){break}if((a[G+((c[K>>2]|0)+F|0)|0]|0)==(a[F+78280|0]|0)){F=F+1|0}else{I=E;D=3456;break L4518}}if((F|0)!=1){I=E;D=3454;break L4518}if((a[C+(E*40&-1)|0]&1)==0){I=E;D=3457;break L4518}K=(bO(d[G+(c[C+(E*40&-1)+32>>2]|0)|0]|0|0)|0)==0;J=c[1054]|0;if(K){K=c[10036]|0;if((a[K+(c[J+(E*40&-1)+32>>2]|0)|0]|0)==95){L=K}else{D=3335;break L4518}}else{L=c[10036]|0}K=c[13898]|0;c[13898]=K+1;H=c[J+(K*40&-1)+36>>2]|0;M=(H|0)>49?49:H;H=c[J+(K*40&-1)+32>>2]|0;K=0;while(1){J=K+1|0;a[k+K|0]=a[L+H|0]|0;if((J|0)==(M|0)){break}else{H=H+1|0;K=J}}a[k+M|0]=0;N=e6(o)|0;K=c[13898]|0;H=c[8272]|0;E=(H|0)>(K|0);L4543:do{if(E){C=c[1054]|0;if((a[C+(K*40&-1)|0]&1)==0){D=3344;break}G=c[C+(K*40&-1)+36>>2]|0;F=C+(K*40&-1)+32|0;C=c[10036]|0;J=0;while(1){if((J|0)>=(G|0)){break}if((a[C+((c[F>>2]|0)+J|0)|0]|0)==(a[J+115e3|0]|0)){J=J+1|0}else{D=3344;break L4543}}F=K+1|0;c[13898]=F;if((J|0)!=1){O=F;D=3392;break}F=is(j)|0;C=c[F>>2]|0;if((C|0)==1){P=+(c[F+8>>2]|0)}else if((C|0)==2){P=+h[F+8>>3]}else if((C|0)==3){P=+uz(c[F+8>>2]|0,0)}else{D=3350;break L4518}if((c[p>>2]|0)==3){uu(c[q>>2]|0);c[p>>2]=1}F=~~P;Q=c[13898]|0;c[13898]=Q+1;if((c[8272]|0)<=(Q|0)){D=3447;break L4518}C=c[1054]|0;if((a[C+(Q*40&-1)|0]&1)==0){D=3445;break L4518}G=c[C+(Q*40&-1)+36>>2]|0;R=C+(Q*40&-1)+32|0;C=c[10036]|0;S=0;while(1){if((S|0)>=(G|0)){break}if((a[C+((c[R>>2]|0)+S|0)|0]|0)==(a[S+183584|0]|0)){S=S+1|0}else{D=3444;break L4518}}if((S|0)!=1){D=3446;break L4518}R=is(g)|0;C=c[R>>2]|0;if((C|0)==1){T=+(c[R+8>>2]|0)}else if((C|0)==2){T=+h[R+8>>3]}else if((C|0)==3){T=+uz(c[R+8>>2]|0,0)}else{D=3364;break L4518}if((c[r>>2]|0)==3){uu(c[s>>2]|0);c[r>>2]=1}R=~~T;C=c[13898]|0;G=c[8272]|0;L4574:do{if((G|0)>(C|0)){J=c[1054]|0;if((a[J+(C*40&-1)|0]&1)==0){U=1;V=C;W=G;break}X=c[J+(C*40&-1)+36>>2]|0;Y=J+(C*40&-1)+32|0;J=c[10036]|0;Z=0;while(1){if((Z|0)>=(X|0)){break}if((a[J+((c[Y>>2]|0)+Z|0)|0]|0)==(a[Z+183584|0]|0)){Z=Z+1|0}else{U=1;V=C;W=G;break L4574}}if((Z|0)!=1){U=1;V=C;W=G;break}c[13898]=C+1;Y=is(f)|0;J=c[Y>>2]|0;if((J|0)==1){_=+(c[Y+8>>2]|0)}else if((J|0)==2){_=+h[Y+8>>3]}else if((J|0)==3){_=+uz(c[Y+8>>2]|0,0)}else{D=3377;break L4518}if((c[t>>2]|0)==3){uu(c[u>>2]|0);c[t>>2]=1}U=~~_;V=c[13898]|0;W=c[8272]|0}else{U=1;V=C;W=G}}while(0);c[13898]=V+1;if((W|0)<=(V|0)){D=3458;break L4518}G=c[1054]|0;if((a[G+(V*40&-1)|0]&1)==0){D=3459;break L4518}C=c[G+(V*40&-1)+36>>2]|0;S=G+(V*40&-1)+32|0;G=c[10036]|0;Y=0;while(1){if((Y|0)>=(C|0)){break}if((a[G+((c[S>>2]|0)+Y|0)|0]|0)==(a[Y+78864|0]|0)){Y=Y+1|0}else{D=3460;break L4518}}if((Y|0)!=1){D=3461;break L4518}S=N+8|0;G=N+16|0;do{if((a[S]&1)==0){if((c[G>>2]|0)!=3){break}uu(c[N+24>>2]|0);c[G>>2]=1}}while(0);c[G>>2]=1;c[N+24>>2]=F;a[S]=0;$=U;ab=R;ac=F;ad=0}else{D=3344}}while(0);if((D|0)==3344){D=0;M=K+1|0;c[13898]=M;O=M;D=3392}if((D|0)==3392){D=0;if(!E){D=3441;break L4518}M=c[1054]|0;if((a[M+(K*40&-1)|0]&1)==0){D=3442;break L4518}Y=c[M+(K*40&-1)+36>>2]|0;C=M+(K*40&-1)+32|0;J=c[10036]|0;X=0;while(1){if((X|0)>=(Y|0)){break}if((a[J+((c[C>>2]|0)+X|0)|0]|0)==(a[X+145600|0]|0)){X=X+1|0}else{D=3443;break L4518}}if((X|0)!=2){D=3440;break L4518}if((O|0)>=(H|0)){ae=O;D=3462;break L4518}L4614:do{if((a[M+(O*40&-1)|0]&1)!=0){C=c[M+(O*40&-1)+36>>2]|0;Y=M+(O*40&-1)+32|0;K=0;while(1){if((K|0)>=(C|0)){break}if((a[J+((c[Y>>2]|0)+K|0)|0]|0)==(a[K+103664|0]|0)){K=K+1|0}else{break L4614}}if((K|0)==1){ae=O;D=3463;break L4518}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[w>>2]|0)!=3){D=3405;break L4518}J=c[x>>2]|0;af=c[13898]|0;if((J|0)==0){ae=af;D=3465;break L4518}c[13898]=af+1;if((c[8272]|0)<=(af|0)){D=3450;break L4518}M=c[1054]|0;if((a[M+(af*40&-1)|0]&1)==0){D=3451;break L4518}H=c[M+(af*40&-1)+36>>2]|0;X=M+(af*40&-1)+32|0;M=c[10036]|0;Y=0;while(1){if((Y|0)>=(H|0)){break}if((a[M+((c[X>>2]|0)+Y|0)|0]|0)==(a[Y+78864|0]|0)){Y=Y+1|0}else{D=3448;break L4518}}if((Y|0)!=1){D=3449;break L4518}X=e9(J)|0;M=N+8|0;H=N+16|0;do{if((a[M]&1)==0){if((c[H>>2]|0)!=3){break}uu(c[N+24>>2]|0);c[H>>2]=1}}while(0);Y=fa(J,1)|0;c[H>>2]=3;c[N+24>>2]=Y;a[M]=0;$=1;ab=X;ac=1;ad=J}if((N|0)==0){ag=0}else{ag=aa(ab-ac|0,$)>>>31&255}if(!(($|0)==0|(ac|0)==(ab|0))){Y=ab-ac|0;if((((Y|0)>-1?Y:-Y|0)|0)>=((($|0)>-1?$:-$|0)|0)){break}}Y=c[13898]|0;C=c[8272]|0;if((C|0)>(Y|0)){m=Y;B=C}else{n=y;D=3437;break L4518}}B=ut(40)|0;if((B|0)==0){gk();m=ut(40)|0;if((m|0)==0){D=3427;break}else{ah=m}}else{ah=B}B=ah;c[ah+8>>2]=N;c[ah+12>>2]=ad;c[ah+16>>2]=ac;c[ah+20>>2]=ab;c[ah+24>>2]=$;c[ah+28>>2]=ac;c[ah>>2]=0;m=ah+4|0;c[m>>2]=0;uE(ah+32|0,0,7);if((z|0)==0){ai=B}else{C=y+4|0;c[c[C>>2]>>2]=B;c[m>>2]=c[C>>2];ai=y}c[ai+4>>2]=B;B=ai+38|0;if((a[B]&1)==0){a[B]=ag}B=c[13898]|0;C=c[8272]|0;if((C|0)>(B|0)){y=ai;z=z+1|0;A=B;l=C}else{n=ai;D=3434;break}}if((D|0)==3455){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3456){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3457){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3458){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3459){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3460){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3461){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3462){ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3463){ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3465){ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3427){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180144,v)|0);return 0}else if((D|0)==3434){i=b;return n|0}else if((D|0)==3435){i=b;return n|0}else if((D|0)==3436){i=b;return n|0}else if((D|0)==3437){i=b;return n|0}else if((D|0)==3438){i=b;return n|0}else if((D|0)==3440){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3335){I=c[13898]|0;aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3364){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3350){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3377){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3441){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3442){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3443){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3444){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3445){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3446){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3447){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3448){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3449){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3450){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3451){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3452){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3454){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3405){c[13898]=O;ae=O;ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}return 0}function ix(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((b|0)==0){d=0;return d|0}if((a[b+38|0]&1)!=0){d=0;return d|0}e=c[b+4>>2]|0;if((e|0)==0){d=0;return d|0}f=b+37|0;g=a[f]|0;L4699:do{if((g&1)!=0|(e|0)==(b|0)){h=e;i=g}else{j=e;k=g;while(1){l=j+36|0;if((a[l]&1)==0){h=j;i=k;break L4699}m=c[j+16>>2]|0;n=j+28|0;c[n>>2]=m;a[l]=0;l=j+12|0;o=j+8|0;p=(c[o>>2]|0)+24|0;if((c[l>>2]|0)==0){c[p>>2]=m}else{uu(c[p>>2]|0);p=fa(c[l>>2]|0,c[n>>2]|0)|0;c[(c[o>>2]|0)+24>>2]=p}p=c[j+4>>2]|0;o=a[f]|0;if((o&1)!=0|(p|0)==(b|0)){h=p;i=o;break}else{j=p;k=o}}}}while(0);g=h+8|0;if((c[g>>2]|0)==0){c[h+32>>2]=0;d=0;return d|0}e=b+32|0;c[e>>2]=(c[e>>2]|0)+1;if((i&1)==0){i=h+28|0;c[i>>2]=(c[i>>2]|0)+(c[h+24>>2]|0)}i=h+12|0;if((c[i>>2]|0)==0){c[(c[g>>2]|0)+24>>2]=c[h+28>>2]}else{uu(c[(c[g>>2]|0)+24>>2]|0);e=fa(c[i>>2]|0,c[h+28>>2]|0)|0;c[(c[g>>2]|0)+24>>2]=e}e=c[h+24>>2]|0;a[h+36|0]=aa(((c[h+20>>2]|0)-(c[h+28>>2]|0)|0)-e|0,e)>>>31&255;e=b;b=0;while(1){if(b){q=1}else{q=(a[e+36|0]&1)==0}h=c[e>>2]|0;if((h|0)==0){break}else{e=h;b=q}}if(q){d=1;return d|0}if((a[f]&1)!=0){d=0;return d|0}a[f]=1;d=1;return d|0}function iy(){var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=c[13898]|0;e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)==0){f=0;return f|0}do{if((bO(d[(c[10036]|0)+(c[e+(b*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(b*40&-1)+32>>2]|0)|0]|0)==95){break}else{f=0}return f|0}}while(0);b=(c[13898]|0)+1|0;if((c[8272]|0)<=(b|0)){f=0;return f|0}e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)==0){f=0;return f|0}g=c[e+(b*40&-1)+36>>2]|0;h=e+(b*40&-1)+32|0;b=c[10036]|0;e=0;while(1){if((e|0)>=(g|0)){break}if((a[b+((c[h>>2]|0)+e|0)|0]|0)==(a[e+115e3|0]|0)){e=e+1|0}else{f=0;i=3519;break}}if((i|0)==3519){return f|0}if((e|0)!=1){f=0;return f|0}e=c[18070]|0;i=c[e>>2]|0;h=c[18066]|0;if((i|0)<(h|0)){j=e;k=i}else{i=db(e,(h<<5)+4808|0,168072)|0;h=i;c[18070]=h;c[18066]=(c[18066]|0)+150;j=h;k=c[i>>2]|0}c[j+8+(k<<5)>>2]=1;k=c[18070]|0;j=c[k>>2]|0;c[k>>2]=j+1;k=c[18070]|0;i=c[13898]|0;h=c[1054]|0;e=c[h+(i*40&-1)+36>>2]|0;b=e+(c[h+(i*40&-1)+32>>2]|0)|0;h=db(0,e+1|0,116456)|0;e=c[(c[1054]|0)+(i*40&-1)+32>>2]|0;L4758:do{if((e|0)<(b|0)){i=e;g=h;while(1){l=a[(c[10036]|0)+i|0]|0;if(l<<24>>24==0){m=g;break L4758}n=g+1|0;a[g]=l;l=i+1|0;if((l|0)<(b|0)){i=l;g=n}else{m=n;break}}}else{m=h}}while(0);a[m]=0;c[k+8+(j<<5)+8>>2]=3;c[k+8+(j<<5)+16>>2]=h;c[13898]=(c[13898]|0)+2;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}h=c[18070]|0;j=c[h>>2]|0;k=c[18066]|0;if((j|0)<(k|0)){o=h;p=j}else{j=db(h,(k<<5)+4808|0,168072)|0;k=j;c[18070]=k;c[18066]=(c[18066]|0)+150;o=k;p=c[j>>2]|0}c[o+8+(p<<5)>>2]=36;p=c[18070]|0;c[p>>2]=(c[p>>2]|0)+1;f=1;return f|0}function iz(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;iA();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4773:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3540;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+163800|0]|0)){h=h+1|0}else{e=3539;break L4773}}if((h|0)!=2){e=3538;break}c[13898]=d+1;g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{k=db(g,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[k>>2]|0}c[i+8+(j<<5)>>2]=39;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;iA();k=c[18070]|0;c[k+8+(b<<5)+8>>2]=(c[k>>2]|0)-b;b=c[18070]|0;k=c[b>>2]|0;f=c[18066]|0;if((k|0)<(f|0)){l=b;m=k}else{k=db(b,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;l=f;m=c[k>>2]|0}c[l+8+(m<<5)>>2]=30;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;k=c[13898]|0;if((c[8272]|0)>(k|0)){d=k}else{e=3536;break}}if((e|0)==3539){return}else if((e|0)==3538){return}else if((e|0)==3536){return}else if((e|0)==3540){return}}function iA(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;iB();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4795:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3555;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+154536|0]|0)){h=h+1|0}else{e=3556;break L4795}}if((h|0)!=2){e=3554;break}c[13898]=d+1;g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{k=db(g,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[k>>2]|0}c[i+8+(j<<5)>>2]=38;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;iB();k=c[18070]|0;c[k+8+(b<<5)+8>>2]=(c[k>>2]|0)-b;b=c[18070]|0;k=c[b>>2]|0;f=c[18066]|0;if((k|0)<(f|0)){l=b;m=k}else{k=db(b,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;l=f;m=c[k>>2]|0}c[l+8+(m<<5)>>2]=30;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;k=c[13898]|0;if((c[8272]|0)>(k|0)){d=k}else{e=3553;break}}if((e|0)==3554){return}else if((e|0)==3555){return}else if((e|0)==3553){return}else if((e|0)==3556){return}}function iB(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;iD();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4817:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3572;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+151312|0]|0)){h=h+1|0}else{e=3571;break L4817}}if((h|0)!=1){e=3570;break}c[13898]=d+1;iD();g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{b=db(g,(f<<5)+4808|0,168072)|0;f=b;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[b>>2]|0}c[i+8+(j<<5)>>2]=14;b=c[18070]|0;c[b>>2]=(c[b>>2]|0)+1;b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{e=3568;break}}if((e|0)==3571){return}else if((e|0)==3572){return}else if((e|0)==3568){return}else if((e|0)==3570){return}}function iC(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;d=c[13898]|0;if((c[8272]|0)<=(d|0)){i=b;return}e=c[1054]|0;if((a[e+(d*40&-1)|0]&1)==0){i=b;return}f=c[e+(d*40&-1)+36>>2]|0;g=e+(d*40&-1)+32|0;e=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[e+((c[g>>2]|0)+h|0)|0]|0)==(a[h+216168|0]|0)){h=h+1|0}else{j=3603;break}}if((j|0)==3603){i=b;return}if((h|0)!=1){i=b;return}c[8230]=(c[8230]|0)-1;c[13898]=d+1;d=c[18070]|0;h=c[d>>2]|0;g=c[18066]|0;if((h|0)<(g|0)){k=d;l=h}else{e=db(d,(g<<5)+4808|0,168072)|0;g=e;c[18070]=g;c[18066]=(c[18066]|0)+150;k=g;l=c[e>>2]|0}c[k+8+(l<<5)>>2]=40;l=c[18070]|0;c[l>>2]=(c[l>>2]|0)+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}l=c[13898]|0;if((c[8272]|0)<=(l|0)){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(l*40&-1)|0]&1)==0){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[k+(l*40&-1)+36>>2]|0;g=k+(l*40&-1)+32|0;k=c[10036]|0;d=0;while(1){if((d|0)>=(e|0)){break}if((a[k+((c[g>>2]|0)+d|0)|0]|0)==(a[d+183584|0]|0)){d=d+1|0}else{j=3598;break}}if((j|0)==3598){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)!=1){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=l+1;l=c[18070]|0;d=c[l>>2]|0;j=c[18066]|0;if((d|0)<(j|0)){m=l;n=d}else{g=db(l,(j<<5)+4808|0,168072)|0;j=g;c[18070]=j;c[18066]=(c[18066]|0)+150;m=j;n=c[g>>2]|0}c[m+8+(n<<5)>>2]=37;n=c[18070]|0;c[n>>2]=(c[n>>2]|0)+1;n=c[18070]|0;c[n+8+(h<<5)+8>>2]=(c[n>>2]|0)-h;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}h=c[18070]|0;c[h+8+(d<<5)+8>>2]=(c[h>>2]|0)-d;c[8230]=(c[8230]|0)+1;i=b;return}function iD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;iE();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4880:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3617;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+149504|0]|0)){h=h+1|0}else{e=3618;break L4880}}if((h|0)!=1){e=3616;break}c[13898]=d+1;iE();g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{b=db(g,(f<<5)+4808|0,168072)|0;f=b;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[b>>2]|0}c[i+8+(j<<5)>>2]=15;b=c[18070]|0;c[b>>2]=(c[b>>2]|0)+1;b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{e=3615;break}}if((e|0)==3616){return}else if((e|0)==3615){return}else if((e|0)==3618){return}else if((e|0)==3617){return}}function iE(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;iF();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4899:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3632;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+147520|0]|0)){h=h+1|0}else{e=3630;break L4899}}if((h|0)!=1){e=3633;break}c[13898]=d+1;iF();g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{b=db(g,(f<<5)+4808|0,168072)|0;f=b;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[b>>2]|0}c[i+8+(j<<5)>>2]=16;b=c[18070]|0;c[b>>2]=(c[b>>2]|0)+1;b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{e=3634;break}}if((e|0)==3633){return}else if((e|0)==3632){return}else if((e|0)==3630){return}else if((e|0)==3634){return}}function iF(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;iI();iJ();iH();iG();L4916:while(1){b=c[13898]|0;d=(c[8272]|0)>(b|0);if(!d){e=3675;break}f=c[1054]|0;if((a[f+(b*40&-1)|0]&1)!=0){g=c[f+(b*40&-1)+36>>2]|0;h=f+(b*40&-1)+32|0;f=c[10036]|0;i=0;while(1){if((i|0)>=(g|0)){e=3641;break}if((a[f+((c[h>>2]|0)+i|0)|0]|0)==(a[i+145384|0]|0)){i=i+1|0}else{break}}do{if((e|0)==3641){e=0;if((i|0)!=2){break}c[13898]=b+1;iI();iJ();iH();iG();h=c[18070]|0;f=c[h>>2]|0;g=c[18066]|0;if((f|0)<(g|0)){j=h;k=f}else{f=db(h,(g<<5)+4808|0,168072)|0;g=f;c[18070]=g;c[18066]=(c[18066]|0)+150;j=g;k=c[f>>2]|0}c[j+8+(k<<5)>>2]=17;f=c[18070]|0;c[f>>2]=(c[f>>2]|0)+1;continue L4916}}while(0);if(!d){e=3674;break}}i=c[1054]|0;L4932:do{if((a[i+(b*40&-1)|0]&1)!=0){f=c[i+(b*40&-1)+36>>2]|0;g=i+(b*40&-1)+32|0;h=c[10036]|0;l=0;while(1){if((l|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+l|0)|0]|0)==(a[l+143464|0]|0)){l=l+1|0}else{break L4932}}if((l|0)!=2){break}c[13898]=b+1;iI();iJ();iH();iG();g=c[18070]|0;h=c[g>>2]|0;f=c[18066]|0;if((h|0)<(f|0)){m=g;n=h}else{h=db(g,(f<<5)+4808|0,168072)|0;f=h;c[18070]=f;c[18066]=(c[18066]|0)+150;m=f;n=c[h>>2]|0}c[m+8+(n<<5)>>2]=18;h=c[18070]|0;c[h>>2]=(c[h>>2]|0)+1;continue L4916}}while(0);if(!d){e=3673;break}i=c[1054]|0;if((a[i+(b*40&-1)|0]&1)!=0){h=c[i+(b*40&-1)+36>>2]|0;f=i+(b*40&-1)+32|0;i=c[10036]|0;g=0;while(1){if((g|0)>=(h|0)){e=3659;break}if((a[i+((c[f>>2]|0)+g|0)|0]|0)==(a[g+141992|0]|0)){g=g+1|0}else{break}}do{if((e|0)==3659){e=0;if((g|0)!=2){break}c[13898]=b+1;iI();iJ();iH();iG();f=c[18070]|0;i=c[f>>2]|0;h=c[18066]|0;if((i|0)<(h|0)){o=f;p=i}else{i=db(f,(h<<5)+4808|0,168072)|0;h=i;c[18070]=h;c[18066]=(c[18066]|0)+150;o=h;p=c[i>>2]|0}c[o+8+(p<<5)>>2]=33;i=c[18070]|0;c[i>>2]=(c[i>>2]|0)+1;continue L4916}}while(0);if(!d){e=3676;break}}g=c[1054]|0;if((a[g+(b*40&-1)|0]&1)==0){e=3677;break}i=c[g+(b*40&-1)+36>>2]|0;h=g+(b*40&-1)+32|0;g=c[10036]|0;f=0;while(1){if((f|0)>=(i|0)){break}if((a[g+((c[h>>2]|0)+f|0)|0]|0)==(a[f+140312|0]|0)){f=f+1|0}else{e=3678;break L4916}}if((f|0)!=2){e=3679;break}c[13898]=b+1;iI();iJ();iH();iG();h=c[18070]|0;g=c[h>>2]|0;i=c[18066]|0;if((g|0)<(i|0)){q=h;r=g}else{g=db(h,(i<<5)+4808|0,168072)|0;i=g;c[18070]=i;c[18066]=(c[18066]|0)+150;q=i;r=c[g>>2]|0}c[q+8+(r<<5)>>2]=34;g=c[18070]|0;c[g>>2]=(c[g>>2]|0)+1}if((e|0)==3679){return}else if((e|0)==3673){return}else if((e|0)==3674){return}else if((e|0)==3675){return}else if((e|0)==3676){return}else if((e|0)==3677){return}else if((e|0)==3678){return}}function iG(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;L4975:while(1){b=c[13898]|0;d=c[8272]|0;e=(d|0)>(b|0);if(!e){f=3726;break}g=c[1054]|0;if((a[g+(b*40&-1)|0]&1)!=0){h=c[g+(b*40&-1)+36>>2]|0;i=g+(b*40&-1)+32|0;g=c[10036]|0;j=0;while(1){if((j|0)>=(h|0)){f=3686;break}if((a[g+((c[i>>2]|0)+j|0)|0]|0)==(a[j+138304|0]|0)){j=j+1|0}else{break}}do{if((f|0)==3686){f=0;if((j|0)!=1){break}c[13898]=b+1;iI();iJ();iH();i=c[18070]|0;g=c[i>>2]|0;h=c[18066]|0;if((g|0)<(h|0)){k=i;l=g}else{g=db(i,(h<<5)+4808|0,168072)|0;h=g;c[18070]=h;c[18066]=(c[18066]|0)+150;k=h;l=c[g>>2]|0}c[k+8+(l<<5)>>2]=19;g=c[18070]|0;c[g>>2]=(c[g>>2]|0)+1;continue L4975}}while(0);if(!e){f=3729;break}}j=c[1054]|0;L4991:do{if((a[j+(b*40&-1)|0]&1)!=0){g=c[j+(b*40&-1)+36>>2]|0;h=j+(b*40&-1)+32|0;i=c[10036]|0;m=0;while(1){if((m|0)>=(g|0)){break}if((a[i+((c[h>>2]|0)+m|0)|0]|0)==(a[m+136608|0]|0)){m=m+1|0}else{break L4991}}if((m|0)!=1){break}h=b+1|0;L4998:do{if((a[25288]&1)!=0&(d|0)>(h|0)){if((a[j+(h*40&-1)|0]&1)==0){break}g=c[j+(h*40&-1)+36>>2]|0;n=j+(h*40&-1)+32|0;o=0;while(1){if((o|0)>=(g|0)){break}if((a[i+((c[n>>2]|0)+o|0)|0]|0)==(a[o+134808|0]|0)){o=o+1|0}else{break L4998}}if((o|0)==1){f=3728;break L4975}}}while(0);c[13898]=h;iI();iJ();iH();i=c[18070]|0;m=c[i>>2]|0;n=c[18066]|0;if((m|0)<(n|0)){p=i;q=m}else{m=db(i,(n<<5)+4808|0,168072)|0;n=m;c[18070]=n;c[18066]=(c[18066]|0)+150;p=n;q=c[m>>2]|0}c[p+8+(q<<5)>>2]=20;m=c[18070]|0;c[m>>2]=(c[m>>2]|0)+1;continue L4975}}while(0);if(!e){f=3730;break}j=c[1054]|0;if((a[j+(b*40&-1)|0]&1)!=0){d=c[j+(b*40&-1)+36>>2]|0;m=j+(b*40&-1)+32|0;j=c[10036]|0;n=0;while(1){if((n|0)>=(d|0)){f=3710;break}if((a[j+((c[m>>2]|0)+n|0)|0]|0)==(a[n+133312|0]|0)){n=n+1|0}else{break}}do{if((f|0)==3710){f=0;if((n|0)!=2){break}c[13898]=b+1;iI();iJ();iH();m=c[18070]|0;j=c[m>>2]|0;d=c[18066]|0;if((j|0)<(d|0)){r=m;s=j}else{j=db(m,(d<<5)+4808|0,168072)|0;d=j;c[18070]=d;c[18066]=(c[18066]|0)+150;r=d;s=c[j>>2]|0}c[r+8+(s<<5)>>2]=21;j=c[18070]|0;c[j>>2]=(c[j>>2]|0)+1;continue L4975}}while(0);if(!e){f=3727;break}}n=c[1054]|0;if((a[n+(b*40&-1)|0]&1)==0){f=3731;break}j=c[n+(b*40&-1)+36>>2]|0;d=n+(b*40&-1)+32|0;n=c[10036]|0;m=0;while(1){if((m|0)>=(j|0)){break}if((a[n+((c[d>>2]|0)+m|0)|0]|0)==(a[m+131928|0]|0)){m=m+1|0}else{f=3724;break L4975}}if((m|0)!=2){f=3725;break}c[13898]=b+1;iI();iJ();iH();d=c[18070]|0;n=c[d>>2]|0;j=c[18066]|0;if((n|0)<(j|0)){t=d;u=n}else{n=db(d,(j<<5)+4808|0,168072)|0;j=n;c[18070]=j;c[18066]=(c[18066]|0)+150;t=j;u=c[n>>2]|0}c[t+8+(u<<5)>>2]=22;n=c[18070]|0;c[n>>2]=(c[n>>2]|0)+1}if((f|0)==3726){return}else if((f|0)==3727){return}else if((f|0)==3728){return}else if((f|0)==3724){return}else if((f|0)==3725){return}else if((f|0)==3729){return}else if((f|0)==3730){return}else if((f|0)==3731){return}}function iH(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;L5043:while(1){b=c[13898]|0;d=(c[8272]|0)>(b|0);L5045:do{if(d){e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)==0){break}f=c[e+(b*40&-1)+36>>2]|0;g=e+(b*40&-1)+32|0;e=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[e+((c[g>>2]|0)+h|0)|0]|0)==(a[h+202200|0]|0)){h=h+1|0}else{break L5045}}if((h|0)!=1){break}c[13898]=b+1;iI();iJ();g=c[18070]|0;e=c[g>>2]|0;f=c[18066]|0;if((e|0)<(f|0)){i=g;j=e}else{e=db(g,(f<<5)+4808|0,168072)|0;f=e;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[e>>2]|0}c[i+8+(j<<5)>>2]=32;e=c[18070]|0;c[e>>2]=(c[e>>2]|0)+1;continue L5043}}while(0);if(a[14176]&(c[8230]|0)==1|d^1){k=3763;break}e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)!=0){f=c[e+(b*40&-1)+36>>2]|0;g=e+(b*40&-1)+32|0;e=c[10036]|0;l=0;while(1){if((l|0)>=(f|0)){k=3747;break}if((a[e+((c[g>>2]|0)+l|0)|0]|0)==(a[l+129568|0]|0)){l=l+1|0}else{break}}do{if((k|0)==3747){k=0;if((l|0)!=1){break}c[13898]=b+1;iI();iJ();g=c[18070]|0;e=c[g>>2]|0;f=c[18066]|0;if((e|0)<(f|0)){m=g;n=e}else{e=db(g,(f<<5)+4808|0,168072)|0;f=e;c[18070]=f;c[18066]=(c[18066]|0)+150;m=f;n=c[e>>2]|0}c[m+8+(n<<5)>>2]=23;e=c[18070]|0;c[e>>2]=(c[e>>2]|0)+1;continue L5043}}while(0);if(!d){k=3764;break}}l=c[1054]|0;if((a[l+(b*40&-1)|0]&1)==0){k=3765;break}e=c[l+(b*40&-1)+36>>2]|0;f=l+(b*40&-1)+32|0;l=c[10036]|0;g=0;while(1){if((g|0)>=(e|0)){break}if((a[l+((c[f>>2]|0)+g|0)|0]|0)==(a[g+202112|0]|0)){g=g+1|0}else{k=3761;break L5043}}if((g|0)!=1){k=3762;break}c[13898]=b+1;iI();iJ();f=c[18070]|0;l=c[f>>2]|0;e=c[18066]|0;if((l|0)<(e|0)){o=f;p=l}else{l=db(f,(e<<5)+4808|0,168072)|0;e=l;c[18070]=e;c[18066]=(c[18066]|0)+150;o=e;p=c[l>>2]|0}c[o+8+(p<<5)>>2]=24;l=c[18070]|0;c[l>>2]=(c[l>>2]|0)+1}if((k|0)==3762){return}else if((k|0)==3763){return}else if((k|0)==3761){return}else if((k|0)==3764){return}else if((k|0)==3765){return}}function iI(){var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0;b=i;i=i+104|0;e=b|0;f=b+56|0;g=b+72|0;h=b+88|0;j=c[13898]|0;k=(c[8272]|0)>(j|0);L5087:do{if(k){l=c[1054]|0;if((a[l+(j*40&-1)|0]&1)!=0){m=c[l+(j*40&-1)+36>>2]|0;n=l+(j*40&-1)+32|0;l=c[10036]|0;o=0;while(1){if((o|0)>=(m|0)){p=3771;break}if((a[l+((c[n>>2]|0)+o|0)|0]|0)==(a[o+124624|0]|0)){o=o+1|0}else{break}}do{if((p|0)==3771){if((o|0)!=1){break}c[13898]=j+1;iI();n=c[18070]|0;l=c[n>>2]|0;m=c[18066]|0;if((l|0)<(m|0)){q=n;r=l}else{l=db(n,(m<<5)+4808|0,168072)|0;m=l;c[18070]=m;c[18066]=(c[18066]|0)+150;q=m;r=c[l>>2]|0}c[q+8+(r<<5)>>2]=9;l=c[18070]|0;c[l>>2]=(c[l>>2]|0)+1;i=b;return}}while(0);if(!k){break}}o=c[1054]|0;L5103:do{if((a[o+(j*40&-1)|0]&1)!=0){l=c[o+(j*40&-1)+36>>2]|0;m=o+(j*40&-1)+32|0;n=c[10036]|0;s=0;while(1){if((s|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+s|0)|0]|0)==(a[s+123264|0]|0)){s=s+1|0}else{break L5103}}if((s|0)!=1){break}c[13898]=j+1;iI();m=c[18070]|0;n=c[m>>2]|0;l=c[18066]|0;if((n|0)<(l|0)){t=m;u=n}else{n=db(m,(l<<5)+4808|0,168072)|0;l=n;c[18070]=l;c[18066]=(c[18066]|0)+150;t=l;u=c[n>>2]|0}c[t+8+(u<<5)>>2]=10;n=c[18070]|0;c[n>>2]=(c[n>>2]|0)+1;i=b;return}}while(0);if(!k){break}o=c[1054]|0;if((a[o+(j*40&-1)|0]&1)!=0){n=c[o+(j*40&-1)+36>>2]|0;l=o+(j*40&-1)+32|0;o=c[10036]|0;m=0;while(1){if((m|0)>=(n|0)){p=3789;break}if((a[o+((c[l>>2]|0)+m|0)|0]|0)==(a[m+202112|0]|0)){m=m+1|0}else{break}}do{if((p|0)==3789){if((m|0)!=1){break}c[13898]=j+1;iI();l=c[18070]|0;o=c[l>>2]|0;n=c[18066]|0;if((o|0)<(n|0)){w=l;x=o}else{o=db(l,(n<<5)+4808|0,168072)|0;n=o;c[18070]=n;c[18066]=(c[18066]|0)+150;w=n;x=c[o>>2]|0}c[w+8+(x<<5)>>2]=11;o=c[18070]|0;c[o>>2]=(c[o>>2]|0)+1;i=b;return}}while(0);if(!k){break}}m=c[1054]|0;if((a[m+(j*40&-1)|0]&1)==0){break}o=c[m+(j*40&-1)+36>>2]|0;n=m+(j*40&-1)+32|0;m=c[10036]|0;l=0;while(1){if((l|0)>=(o|0)){break}if((a[m+((c[n>>2]|0)+l|0)|0]|0)==(a[l+129568|0]|0)){l=l+1|0}else{break L5087}}if((l|0)!=1){break}c[13898]=j+1;iI();i=b;return}}while(0);x=f|0;f=g|0;g=h|0;L5138:do{if(k){h=c[1054]|0;if((a[h+(j*40&-1)|0]&1)!=0){w=c[h+(j*40&-1)+36>>2]|0;u=h+(j*40&-1)+32|0;h=c[10036]|0;t=0;while(1){if((t|0)>=(w|0)){p=3805;break}if((a[h+((c[u>>2]|0)+t|0)|0]|0)==(a[t+199040|0]|0)){t=t+1|0}else{break}}do{if((p|0)==3805){if((t|0)!=1){break}c[13898]=j+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}u=c[13898]|0;h=c[8272]|0;L5151:do{if((h|0)>(u|0)){w=u;l=h;while(1){r=c[1054]|0;if((a[r+(w*40&-1)|0]&1)==0){y=w;z=l;break L5151}q=c[r+(w*40&-1)+36>>2]|0;n=r+(w*40&-1)+32|0;r=c[10036]|0;m=0;while(1){if((m|0)>=(q|0)){break}if((a[r+((c[n>>2]|0)+m|0)|0]|0)==(a[m+148464|0]|0)){m=m+1|0}else{y=w;z=l;break L5151}}if((m|0)!=1){y=w;z=l;break L5151}c[13898]=w+1;n=c[18070]|0;r=c[n>>2]|0;q=c[18066]|0;if((r|0)<(q|0)){A=n;B=r}else{r=db(n,(q<<5)+4808|0,168072)|0;q=r;c[18070]=q;c[18066]=(c[18066]|0)+150;A=q;B=c[r>>2]|0}c[A+8+(B<<5)>>2]=5;r=c[18070]|0;c[r>>2]=(c[r>>2]|0)+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}r=c[13898]|0;q=c[8272]|0;if((q|0)>(r|0)){w=r;l=q}else{y=r;z=q;break}}}else{y=u;z=h}}while(0);if((z|0)<=(y|0)){uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[1054]|0;if((a[h+(y*40&-1)|0]&1)==0){uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[h+(y*40&-1)+36>>2]|0;s=h+(y*40&-1)+32|0;h=c[10036]|0;l=0;while(1){if((l|0)>=(u|0)){break}if((a[h+((c[s>>2]|0)+l|0)|0]|0)==(a[l+131272|0]|0)){l=l+1|0}else{p=4123;break}}if((p|0)==4123){uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)==1){c[13898]=y+1;break L5138}else{uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(!k){p=3828;break}}t=c[1054]|0;s=a[t+(j*40&-1)|0]|0;if((s&1)==0){C=t;D=s;p=3843;break}h=c[t+(j*40&-1)+36>>2]|0;u=t+(j*40&-1)+32|0;w=c[10036]|0;q=0;while(1){if((q|0)>=(h|0)){break}if((a[w+((c[u>>2]|0)+q|0)|0]|0)==(a[q+180784|0]|0)){q=q+1|0}else{C=t;D=s;p=3843;break L5138}}if((q|0)!=1){C=t;D=s;p=3843;break}u=j+1|0;c[13898]=u;if((a[t+(u*40&-1)|0]&1)!=0){uf(u,114232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=j+2|0;c[13898]=w;h=t+(u*40&-1)+8|0;r=h;n=c[h>>2]|0;h=c[r+4>>2]|0;o=c[t+(u*40&-1)+16>>2]|0;u=r+12|0;c[x>>2]=c[u>>2];c[x+4>>2]=c[u+4>>2];c[x+8>>2]=c[u+8>>2];if((n|0)!=1|(o|0)<0){uf(w,110760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[18068]|0)<(o|0)){c[18068]=o}w=c[18070]|0;n=c[w>>2]|0;u=c[18066]|0;if((n|0)<(u|0)){E=w;F=n}else{n=db(w,(u<<5)+4808|0,168072)|0;u=n;c[18070]=u;c[18066]=(c[18066]|0)+150;E=u;F=c[n>>2]|0}c[E+8+(F<<5)>>2]=31;n=c[18070]|0;u=c[n>>2]|0;c[n>>2]=u+1;n=c[18070]|0;w=n+8+(u<<5)+8|0;r=w;c[w>>2]=1;c[r+4>>2]=h;c[n+8+(u<<5)+16>>2]=o;o=r+12|0;c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2]}else{p=3828}}while(0);if((p|0)==3828){x=c[1054]|0;C=x;D=a[x+(j*40&-1)|0]|0;p=3843}L5204:do{if((p|0)==3843){if((D&1)==0){x=c[18070]|0;F=c[x>>2]|0;E=c[18066]|0;if((F|0)<(E|0)){G=x;H=F}else{F=db(x,(E<<5)+4808|0,168072)|0;E=F;c[18070]=E;c[18066]=(c[18066]|0)+150;G=E;H=c[F>>2]|0}c[G+8+(H<<5)>>2]=1;F=c[18070]|0;E=c[F>>2]|0;c[F>>2]=E+1;F=(c[18070]|0)+8+(E<<5)+8|0;E=(c[1054]|0)+((c[13898]|0)*40&-1)+8|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[F+16>>2]=c[E+16>>2];c[F+20>>2]=c[E+20>>2];c[13898]=(c[13898]|0)+1;break}do{if((bO(d[(c[10036]|0)+(c[C+(j*40&-1)+32>>2]|0)|0]|0|0)|0)==0){E=c[1054]|0;F=c[10036]|0;x=c[13898]|0;if((a[F+(c[E+(j*40&-1)+32>>2]|0)|0]|0)==95){I=x;break}if((a[E+(x*40&-1)|0]&1)==0){uf(x,104392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=a[F+(c[E+(x*40&-1)+32>>2]|0)|0]|0;if(!((k<<24>>24|0)==39|(k<<24>>24|0)==34)){uf(x,104392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[18070]|0;k=c[x>>2]|0;E=c[18066]|0;if((k|0)<(E|0)){J=x;K=k}else{k=db(x,(E<<5)+4808|0,168072)|0;E=k;c[18070]=E;c[18066]=(c[18066]|0)+150;J=E;K=c[k>>2]|0}c[J+8+(K<<5)>>2]=1;k=c[18070]|0;E=c[k>>2]|0;c[k>>2]=E+1;k=c[18070]|0;c[k+8+(E<<5)+8>>2]=3;x=k+8+(E<<5)+16|0;c[x>>2]=0;E=c[13898]|0;ub(x,E,E);c[13898]=(c[13898]|0)+1;break L5204}else{I=c[13898]|0}}while(0);t=I+1|0;s=c[8272]|0;q=(s|0)>(t|0);L5226:do{if(q){E=c[1054]|0;if((a[E+(t*40&-1)|0]&1)==0){break}x=c[E+(t*40&-1)+36>>2]|0;k=E+(t*40&-1)+32|0;F=c[10036]|0;y=0;while(1){if((y|0)>=(x|0)){break}if((a[F+((c[k>>2]|0)+y|0)|0]|0)==(a[y+199040|0]|0)){y=y+1|0}else{break L5226}}if((y|0)!=1){break}k=(s|0)>(I|0);x=E+(I*40&-1)|0;l=E+(I*40&-1)+36|0;z=E+(I*40&-1)+32|0;B=41;L5234:while(1){A=c[41160+(B<<3)>>2]|0;L5236:do{if(k){if((a[x]&1)==0){break}o=c[l>>2]|0;r=0;while(1){if((r|0)>=(o|0)){break}if((a[F+((c[z>>2]|0)+r|0)|0]|0)==(a[A+r|0]|0)){r=r+1|0}else{break L5236}}if((a[A+r|0]|0)==0){L=B;break L5234}}}while(0);A=B+1|0;if((A|0)==117){L=0;break}else{B=A}}c[13898]=I+2;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}B=c[13898]|0;z=c[8272]|0;F=(z|0)>(B|0);if((L|0)==0){L5250:do{if(F){l=c[1054]|0;x=a[l+(B*40&-1)|0]|0;if((x&1)==0){M=6;N=B;O=z;break}k=c[l+(B*40&-1)+36>>2]|0;E=l+(B*40&-1)+32|0;y=c[10036]|0;A=0;while(1){if((A|0)>=(k|0)){break}if((a[y+((c[E>>2]|0)+A|0)|0]|0)==(a[A+148464|0]|0)){A=A+1|0}else{M=6;N=B;O=z;break L5250}}if((A|0)==1){P=1;Q=B;R=l;S=x}else{M=6;N=B;O=z;break}L5257:while(1){if((S&1)==0){T=P;break}E=c[R+(Q*40&-1)+36>>2]|0;y=R+(Q*40&-1)+32|0;k=c[10036]|0;o=0;while(1){if((o|0)>=(E|0)){break}if((a[k+((c[y>>2]|0)+o|0)|0]|0)==(a[o+148464|0]|0)){o=o+1|0}else{T=P;break L5257}}if((o|0)!=1){T=P;break}y=P+1|0;c[13898]=Q+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}k=c[13898]|0;if((c[8272]|0)<=(k|0)){T=y;break}E=c[1054]|0;P=y;Q=k;R=E;S=a[E+(k*40&-1)|0]|0}x=c[18070]|0;l=c[x>>2]|0;A=c[18066]|0;if((l|0)<(A|0)){U=x;V=l}else{l=db(x,(A<<5)+4808|0,168072)|0;A=l;c[18070]=A;c[18066]=(c[18066]|0)+150;U=A;V=c[l>>2]|0}c[U+8+(V<<5)>>2]=1;l=c[18070]|0;A=c[l>>2]|0;c[l>>2]=A+1;l=c[18070]|0;x=l+8+(A<<5)+8|0;c[x>>2]=1;c[l+8+(A<<5)+16>>2]=T;A=x+12|0;c[A>>2]=c[f>>2];c[A+4>>2]=c[f+4>>2];c[A+8>>2]=c[f+8>>2];M=7;N=c[13898]|0;O=c[8272]|0}else{M=6;N=B;O=z}}while(0);if((O|0)<=(N|0)){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=c[1054]|0;if((a[A+(N*40&-1)|0]&1)==0){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[A+(N*40&-1)+36>>2]|0;l=A+(N*40&-1)+32|0;A=c[10036]|0;k=0;while(1){if((k|0)>=(x|0)){break}if((a[A+((c[l>>2]|0)+k|0)|0]|0)==(a[k+131272|0]|0)){k=k+1|0}else{p=4154;break}}if((p|0)==4154){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((k|0)!=1){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=N+1;l=iv(I)|0;A=c[18070]|0;x=c[A>>2]|0;E=c[18066]|0;if((x|0)<(E|0)){W=A;X=x}else{x=db(A,(E<<5)+4808|0,168072)|0;E=x;c[18070]=E;c[18066]=(c[18066]|0)+150;W=E;X=c[x>>2]|0}c[W+8+(X<<5)>>2]=M;x=c[18070]|0;E=c[x>>2]|0;c[x>>2]=E+1;c[(c[18070]|0)+8+(E<<5)+8>>2]=l;break L5204}L5293:do{if(F){l=1;E=B;x=z;while(1){A=c[1054]|0;if((a[A+(E*40&-1)|0]&1)==0){Y=E;Z=l;_=x;break L5293}y=c[A+(E*40&-1)+36>>2]|0;r=A+(E*40&-1)+32|0;A=c[10036]|0;m=0;while(1){if((m|0)>=(y|0)){break}if((a[A+((c[r>>2]|0)+m|0)|0]|0)==(a[m+148464|0]|0)){m=m+1|0}else{Y=E;Z=l;_=x;break L5293}}if((m|0)!=1){Y=E;Z=l;_=x;break L5293}c[13898]=E+1;r=l+1|0;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}A=c[13898]|0;y=c[8272]|0;if((y|0)>(A|0)){l=r;E=A;x=y}else{Y=A;Z=r;_=y;break}}}else{Y=B;Z=1;_=z}}while(0);if((_|0)<=(Y|0)){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=c[1054]|0;if((a[z+(Y*40&-1)|0]&1)==0){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=c[z+(Y*40&-1)+36>>2]|0;F=z+(Y*40&-1)+32|0;z=c[10036]|0;k=0;while(1){if((k|0)>=(B|0)){break}if((a[z+((c[F>>2]|0)+k|0)|0]|0)==(a[k+131272|0]|0)){k=k+1|0}else{p=4166;break}}if((p|0)==4166){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((k|0)!=1){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=Y+1;F=c[41160+(L<<3)>>2]|0;if((aY(F|0,107968)|0)==0){z=c[18070]|0;B=c[z>>2]|0;x=c[18066]|0;if((B|0)<(x|0)){$=z;aa=B}else{B=db(z,(x<<5)+4808|0,168072)|0;x=B;c[18070]=x;c[18066]=(c[18066]|0)+150;$=x;aa=c[B>>2]|0}c[$+8+(aa<<5)>>2]=1;B=c[18070]|0;x=c[B>>2]|0;c[B>>2]=x+1;B=c[18070]|0;z=B+8+(x<<5)+8|0;c[z>>2]=1;c[B+8+(x<<5)+16>>2]=Z;x=z+12|0;c[x>>2]=c[f>>2];c[x+4>>2]=c[f+4>>2];c[x+8>>2]=c[f+8>>2]}if((aY(F|0,106992)|0)==0){x=c[18070]|0;z=c[x>>2]|0;B=c[18066]|0;if((z|0)<(B|0)){ab=x;ac=z}else{z=db(x,(B<<5)+4808|0,168072)|0;B=z;c[18070]=B;c[18066]=(c[18066]|0)+150;ab=B;ac=c[z>>2]|0}c[ab+8+(ac<<5)>>2]=1;z=c[18070]|0;B=c[z>>2]|0;c[z>>2]=B+1;z=c[18070]|0;x=z+8+(B<<5)+8|0;c[x>>2]=1;c[z+8+(B<<5)+16>>2]=-1;B=x+12|0;c[B>>2]=c[f>>2];c[B+4>>2]=c[f+4>>2];c[B+8>>2]=c[f+8>>2]}B=(aY(F|0,106056)|0)==0;F=c[18070]|0;do{if(B){x=(c[F>>2]|0)-1|0;z=F+8+(x<<5)|0;E=c[z>>2]|0;if((E|0)==1){l=c[F+8+(x<<5)+8>>2]|0;if((l|0)==3){a[32928]=1;break}else if((l|0)!=1){break}l=c[F+8+(x<<5)+16>>2]|0;if((c[18068]|0)>=(l|0)){break}c[18068]=l;ad=c[z>>2]|0}else{ad=E}if((ad|0)!=0){break}E=c[F+8+(x<<5)+8>>2]|0;if((c[E+16>>2]|0)!=1){break}x=c[E+24>>2]|0;if((c[18068]|0)>=(x|0)){break}c[18068]=x}}while(0);B=c[F>>2]|0;k=c[18066]|0;if((B|0)<(k|0)){ae=F;af=B}else{B=db(F,(k<<5)+4808|0,168072)|0;k=B;c[18070]=k;c[18066]=(c[18066]|0)+150;ae=k;af=c[B>>2]|0}c[ae+8+(af<<5)>>2]=L;B=c[18070]|0;c[B>>2]=(c[B>>2]|0)+1;break L5204}}while(0);B=(s|0)>(I|0);L5350:do{if(B){k=c[1054]|0;if((a[k+(I*40&-1)|0]&1)==0){break}x=c[k+(I*40&-1)+36>>2]|0;E=k+(I*40&-1)+32|0;z=c[10036]|0;l=0;while(1){if((l|0)>=(x|0)){break}if((a[z+((c[E>>2]|0)+l|0)|0]|0)==(a[l+104152|0]|0)){l=l+1|0}else{break L5350}}if((l|0)!=3|q^1){break}if((a[k+(t*40&-1)|0]&1)==0){break}E=c[k+(t*40&-1)+36>>2]|0;x=k+(t*40&-1)+32|0;F=0;while(1){if((F|0)>=(E|0)){break}if((a[z+((c[x>>2]|0)+F|0)|0]|0)==(a[F+78280|0]|0)){F=F+1|0}else{break L5350}}if((F|0)!=1){break}x=I+2|0;c[13898]=x;if((a[k+(x*40&-1)|0]&1)==0){ag=x;uf(ag,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((bO(d[z+(c[k+(x*40&-1)+32>>2]|0)|0]|0|0)|0)==0){E=c[1054]|0;l=c[13898]|0;if((a[(c[10036]|0)+(c[E+(x*40&-1)+32>>2]|0)|0]|0)==95){ah=l;ai=E;break}else{ag=l}uf(ag,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{ah=c[13898]|0;ai=c[1054]|0}}while(0);x=c[ai+(ah*40&-1)+36>>2]|0;k=x+(c[ai+(ah*40&-1)+32>>2]|0)|0;z=db(0,x+1|0,116456)|0;x=c[(c[1054]|0)+(ah*40&-1)+32>>2]|0;L5372:do{if((x|0)<(k|0)){F=x;l=z;while(1){E=a[(c[10036]|0)+F|0]|0;if(E<<24>>24==0){aj=l;break L5372}y=l+1|0;a[l]=E;E=F+1|0;if((E|0)<(k|0)){F=E;l=y}else{aj=y;break}}}else{aj=z}}while(0);a[aj]=0;k=c[13898]|0;x=e|0;l=c[1054]|0;F=c[l+(k*40&-1)+36>>2]|0;y=(F|0)>49?49:F;F=c[10036]|0;E=c[l+(k*40&-1)+32>>2]|0;k=0;while(1){l=k+1|0;a[e+k|0]=a[F+E|0]|0;if((l|0)==(y|0)){break}else{E=E+1|0;k=l}}a[e+y|0]=0;e6(x);k=c[18070]|0;E=c[k>>2]|0;F=c[18066]|0;if((E|0)<(F|0)){ak=k;al=E}else{E=db(k,(F<<5)+4808|0,168072)|0;F=E;c[18070]=F;c[18066]=(c[18066]|0)+150;ak=F;al=c[E>>2]|0}c[ak+8+(al<<5)>>2]=1;E=c[18070]|0;F=c[E>>2]|0;c[E>>2]=F+1;E=c[18070]|0;c[E+8+(F<<5)+8>>2]=3;c[E+8+(F<<5)+16>>2]=z;F=c[13898]|0;E=F+1|0;c[13898]=E;if((c[8272]|0)<=(E|0)){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(E*40&-1)|0]&1)==0){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[k+(E*40&-1)+36>>2]|0;r=k+(E*40&-1)+32|0;k=c[10036]|0;A=0;while(1){if((A|0)>=(l|0)){break}if((a[k+((c[r>>2]|0)+A|0)|0]|0)==(a[A+115e3|0]|0)){A=A+1|0}else{p=4127;break}}if((p|0)==4127){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((A|0)!=1){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=F+2;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}r=c[13898]|0;if((c[8272]|0)<=(r|0)){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(r*40&-1)|0]&1)==0){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[k+(r*40&-1)+36>>2]|0;z=k+(r*40&-1)+32|0;k=c[10036]|0;x=0;while(1){if((x|0)>=(l|0)){break}if((a[k+((c[z>>2]|0)+x|0)|0]|0)==(a[x+183584|0]|0)){x=x+1|0}else{p=4133;break}}if((p|0)==4133){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((x|0)!=1){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=r+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}z=c[13898]|0;if((c[8272]|0)<=(z|0)){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(z*40&-1)|0]&1)==0){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[k+(z*40&-1)+36>>2]|0;F=k+(z*40&-1)+32|0;k=c[10036]|0;E=0;while(1){if((E|0)>=(l|0)){break}if((a[k+((c[F>>2]|0)+E|0)|0]|0)==(a[E+78864|0]|0)){E=E+1|0}else{p=4162;break}}if((p|0)==4162){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((E|0)!=1){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=z+1;F=c[18070]|0;k=c[18066]|0;c[18070]=0;l=ut(312)|0;do{if((l|0)==0){gk();r=ut(312)|0;if((r|0)!=0){am=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=104152,v)|0)}else{am=l}}while(0);c[am>>2]=0;c[am+4>>2]=0;it();l=c[18070]|0;c[am+8>>2]=db(l,c[l>>2]<<5|8,105624)|0;c[am+12>>2]=0;c[am+16>>2]=0;c[am+24>>2]=1;c[am+32>>2]=0;c[am+48>>2]=1;c[am+56>>2]=0;c[am+72>>2]=1;c[am+80>>2]=0;c[am+96>>2]=1;c[am+104>>2]=0;c[am+120>>2]=1;c[am+128>>2]=0;c[am+144>>2]=1;c[am+152>>2]=0;c[am+168>>2]=1;c[am+176>>2]=0;c[am+192>>2]=1;c[am+200>>2]=0;c[am+216>>2]=1;c[am+224>>2]=0;c[am+240>>2]=1;c[am+248>>2]=0;c[am+264>>2]=1;c[am+272>>2]=0;c[am+288>>2]=1;c[am+296>>2]=0;c[18070]=F;c[18066]=k;l=c[F>>2]|0;if((l|0)<(k|0)){an=F;ao=l}else{l=db(F,(k<<5)+4808|0,168072)|0;z=l;c[18070]=z;c[18066]=(c[18066]|0)+150;an=z;ao=c[l>>2]|0}c[an+8+(ao<<5)>>2]=8;l=c[18070]|0;z=c[l>>2]|0;c[l>>2]=z+1;c[(c[18070]|0)+8+(z<<5)+8>>2]=am;break L5204}}while(0);q=c[11670]|0;if((q|0)==0){s=e|0;z=c[1054]|0;l=c[z+(I*40&-1)+36>>2]|0;E=(l|0)>49?49:l;l=c[10036]|0;r=c[z+(I*40&-1)+32>>2]|0;z=0;while(1){x=z+1|0;a[e+z|0]=a[l+r|0]|0;if((x|0)==(E|0)){break}else{r=r+1|0;z=x}}a[e+E|0]=0;z=e6(s)|0;r=c[18070]|0;l=c[r>>2]|0;x=c[18066]|0;if((l|0)<(x|0)){ap=r;aq=l}else{l=db(r,(x<<5)+4808|0,168072)|0;x=l;c[18070]=x;c[18066]=(c[18066]|0)+150;ap=x;aq=c[l>>2]|0}c[ap+8+(aq<<5)>>2]=0;l=c[18070]|0;x=c[l>>2]|0;c[l>>2]=x+1;c[(c[18070]|0)+8+(x<<5)+8>>2]=z;c[13898]=(c[13898]|0)+1;break}L5451:do{if(B){z=c[1054]|0;if((a[z+(I*40&-1)|0]&1)!=0){x=c[z+(I*40&-1)+36>>2]|0;l=z+(I*40&-1)+32|0;z=c[10036]|0;r=0;while(1){if((r|0)>=(x|0)){p=3992;break}if((a[z+((c[l>>2]|0)+r|0)|0]|0)==(a[r+55600|0]|0)){r=r+1|0}else{break}}do{if((p|0)==3992){if((a[r+55600|0]|0)!=0){break}c[13898]=t;l=c[18070]|0;z=c[l>>2]|0;x=c[18066]|0;if((z|0)<(x|0)){ar=l;as=z}else{z=db(l,(x<<5)+4808|0,168072)|0;x=z;c[18070]=x;c[18066]=(c[18066]|0)+150;ar=x;as=c[z>>2]|0}c[ar+8+(as<<5)>>2]=2;z=c[18070]|0;x=c[z>>2]|0;c[z>>2]=x+1;c[(c[18070]|0)+8+(x<<5)+8>>2]=q;break L5204}}while(0);if(!B){p=3997;break}}r=c[1054]|0;if((a[r+(I*40&-1)|0]&1)==0){at=r;break}x=c[r+(I*40&-1)+36>>2]|0;z=r+(I*40&-1)+32|0;l=c[10036]|0;k=0;while(1){if((k|0)>=(x|0)){break}if((a[l+((c[z>>2]|0)+k|0)|0]|0)==(a[k+55651|0]|0)){k=k+1|0}else{at=r;break L5451}}if((a[k+55651|0]|0)!=0){at=r;break}c[13898]=t;z=c[18070]|0;l=c[z>>2]|0;x=c[18066]|0;if((l|0)<(x|0)){au=z;av=l}else{l=db(z,(x<<5)+4808|0,168072)|0;x=l;c[18070]=x;c[18066]=(c[18066]|0)+150;au=x;av=c[l>>2]|0}c[au+8+(av<<5)>>2]=3;l=c[18070]|0;x=c[l>>2]|0;c[l>>2]=x+1;c[(c[18070]|0)+8+(x<<5)+8>>2]=q;break L5204}else{p=3997}}while(0);if((p|0)==3997){at=c[1054]|0}q=c[10036]|0;s=2;L5478:while(1){L5480:do{if(B){if((a[at+(I*40&-1)|0]&1)==0){break}E=c[at+(I*40&-1)+36>>2]|0;x=at+(I*40&-1)+32|0;l=0;while(1){if((l|0)>=(E|0)){break}if((a[q+((c[x>>2]|0)+l|0)|0]|0)==(a[55600+(s*51&-1)+l|0]|0)){l=l+1|0}else{break L5480}}if((a[55600+(s*51&-1)+l|0]|0)==0){p=4013;break L5478}}}while(0);r=s+1|0;if((r|0)<12){s=r}else{p=4019;break}}if((p|0)==4019){B=e|0;r=c[at+(I*40&-1)+36>>2]|0;k=(r|0)>49?49:r;r=c[at+(I*40&-1)+32>>2]|0;x=0;while(1){E=x+1|0;a[e+x|0]=a[q+r|0]|0;if((E|0)==(k|0)){break}else{r=r+1|0;x=E}}a[e+k|0]=0;x=e6(B)|0;r=c[18070]|0;q=c[r>>2]|0;E=c[18066]|0;if((q|0)<(E|0)){aw=r;ax=q}else{q=db(r,(E<<5)+4808|0,168072)|0;E=q;c[18070]=E;c[18066]=(c[18066]|0)+150;aw=E;ax=c[q>>2]|0}c[aw+8+(ax<<5)>>2]=0;q=c[18070]|0;E=c[q>>2]|0;c[q>>2]=E+1;c[(c[18070]|0)+8+(E<<5)+8>>2]=x;c[13898]=(c[13898]|0)+1;break}else if((p|0)==4013){c[13898]=t;x=c[18070]|0;E=c[x>>2]|0;q=c[18066]|0;if((E|0)<(q|0)){ay=x;az=E}else{E=db(x,(q<<5)+4808|0,168072)|0;q=E;c[18070]=q;c[18066]=(c[18066]|0)+150;ay=q;az=c[E>>2]|0}c[ay+8+(az<<5)>>2]=1;E=c[18070]|0;q=c[E>>2]|0;c[E>>2]=q+1;E=c[18070]|0;x=E+8+(q<<5)+8|0;c[x>>2]=1;c[E+8+(q<<5)+16>>2]=s;q=x+12|0;c[q>>2]=c[g>>2];c[q+4>>2]=c[g+4>>2];c[q+8>>2]=c[g+8>>2];q=c[11670]|0;x=c[18070]|0;E=c[x>>2]|0;r=c[18066]|0;if((E|0)<(r|0)){aA=x;aB=E}else{E=db(x,(r<<5)+4808|0,168072)|0;r=E;c[18070]=r;c[18066]=(c[18066]|0)+150;aA=r;aB=c[E>>2]|0}c[aA+8+(aB<<5)>>2]=4;E=c[18070]|0;r=c[E>>2]|0;c[E>>2]=r+1;c[(c[18070]|0)+8+(r<<5)+8>>2]=q;break}}}while(0);aB=c[13898]|0;aA=c[8272]|0;L5504:do{if((aA|0)>(aB|0)){g=aB;az=aA;while(1){ay=c[1054]|0;if((a[ay+(g*40&-1)|0]&1)==0){aC=g;aD=az;break L5504}ax=c[ay+(g*40&-1)+36>>2]|0;aw=ay+(g*40&-1)+32|0;ay=c[10036]|0;e=0;while(1){if((e|0)>=(ax|0)){break}if((a[ay+((c[aw>>2]|0)+e|0)|0]|0)==(a[e+124624|0]|0)){e=e+1|0}else{aC=g;aD=az;break L5504}}if((e|0)!=1){aC=g;aD=az;break L5504}c[13898]=g+1;aw=c[18070]|0;ay=c[aw>>2]|0;ax=c[18066]|0;if((ay|0)<(ax|0)){aE=aw;aF=ay}else{ay=db(aw,(ax<<5)+4808|0,168072)|0;ax=ay;c[18070]=ax;c[18066]=(c[18066]|0)+150;aE=ax;aF=c[ay>>2]|0}c[aE+8+(aF<<5)>>2]=29;ay=c[18070]|0;c[ay>>2]=(c[ay>>2]|0)+1;ay=c[13898]|0;ax=c[8272]|0;if((ax|0)>(ay|0)){g=ay;az=ax}else{aC=ay;aD=ax;break}}}else{aC=aB;aD=aA}}while(0);L5517:do{if((aD|0)>(aC|0)){aA=c[1054]|0;if((a[aA+(aC*40&-1)|0]&1)==0){aG=aC;aH=aD;break}aB=c[aA+(aC*40&-1)+36>>2]|0;aF=aA+(aC*40&-1)+32|0;aA=c[10036]|0;aE=0;while(1){if((aE|0)>=(aB|0)){break}if((a[aA+((c[aF>>2]|0)+aE|0)|0]|0)==(a[aE+103912|0]|0)){aE=aE+1|0}else{aG=aC;aH=aD;break L5517}}if((aE|0)!=2){aG=aC;aH=aD;break}c[13898]=aC+1;iI();aF=c[18070]|0;aA=c[aF>>2]|0;aB=c[18066]|0;if((aA|0)<(aB|0)){aI=aF;aJ=aA}else{aA=db(aF,(aB<<5)+4808|0,168072)|0;aB=aA;c[18070]=aB;c[18066]=(c[18066]|0)+150;aI=aB;aJ=c[aA>>2]|0}c[aI+8+(aJ<<5)>>2]=28;aA=c[18070]|0;c[aA>>2]=(c[aA>>2]|0)+1;aG=c[13898]|0;aH=c[8272]|0}else{aG=aC;aH=aD}}while(0);if((aH|0)<=(aG|0)){i=b;return}aD=c[1054]|0;if((a[aD+(aG*40&-1)|0]&1)==0){i=b;return}aC=c[aD+(aG*40&-1)+36>>2]|0;aJ=aD+(aG*40&-1)+32|0;aI=c[10036]|0;aA=0;while(1){if((aA|0)>=(aC|0)){break}if((a[aI+((c[aJ>>2]|0)+aA|0)|0]|0)==(a[aA+78280|0]|0)){aA=aA+1|0}else{p=4147;break}}if((p|0)==4147){i=b;return}if((aA|0)!=1){i=b;return}aA=aG+1|0;c[13898]=aA;aG=(aH|0)>(aA|0);L5544:do{if(aG){do{if((a[aD+(aA*40&-1)|0]&1)==0){p=4066}else{aH=c[aD+(aA*40&-1)+36>>2]|0;aJ=aD+(aA*40&-1)+32|0;aC=0;while(1){if((aC|0)>=(aH|0)){p=4064;break}if((a[aI+((c[aJ>>2]|0)+aC|0)|0]|0)==(a[aC+134808|0]|0)){aC=aC+1|0}else{break}}if((p|0)==4064){if((aC|0)==1){break}}if(aG){p=4066}else{p=4080;break L5544}}}while(0);if((p|0)==4066){if((a[aD+(aA*40&-1)|0]&1)==0){p=4080;break}aE=c[aD+(aA*40&-1)+36>>2]|0;aJ=aD+(aA*40&-1)+32|0;aH=0;while(1){if((aH|0)>=(aE|0)){break}if((a[aI+((c[aJ>>2]|0)+aH|0)|0]|0)==(a[aH+183584|0]|0)){aH=aH+1|0}else{p=4080;break L5544}}if((aH|0)!=1){p=4080;break}}aJ=c[18070]|0;aE=c[aJ>>2]|0;e=c[18066]|0;if((aE|0)<(e|0)){aK=aJ;aL=aE}else{aE=db(aJ,(e<<5)+4808|0,168072)|0;e=aE;c[18070]=e;c[18066]=(c[18066]|0)+150;aK=e;aL=c[aE>>2]|0}c[aK+8+(aL<<5)>>2]=1;aE=c[18070]|0;e=c[aE>>2]|0;c[aE>>2]=e+1;aE=c[18070]|0;c[aE+8+(e<<5)+8>>2]=1;c[aE+8+(e<<5)+16>>2]=1;e=c[13898]|0;if((c[8272]|0)<=(e|0)){break}aE=c[1054]|0;if((a[aE+(e*40&-1)|0]&1)==0){break}aJ=c[aE+(e*40&-1)+36>>2]|0;aB=aE+(e*40&-1)+32|0;aE=c[10036]|0;aF=0;while(1){if((aF|0)>=(aJ|0)){break}if((a[aE+((c[aB>>2]|0)+aF|0)|0]|0)==(a[aF+134808|0]|0)){aF=aF+1|0}else{break L5544}}if((aF|0)!=1){break}c[13898]=e+1}else{p=4080}}while(0);do{if((p|0)==4080){if((iy()|0)!=0){break}c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}}while(0);aL=c[13898]|0;aK=c[8272]|0;if((aK|0)<=(aL|0)){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aI=c[1054]|0;if((a[aI+(aL*40&-1)|0]&1)==0){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aA=c[aI+(aL*40&-1)+36>>2]|0;aD=aI+(aL*40&-1)+32|0;aG=c[10036]|0;aB=0;while(1){if((aB|0)>=(aA|0)){break}if((a[aG+((c[aD>>2]|0)+aB|0)|0]|0)==(a[aB+183584|0]|0)){aB=aB+1|0}else{p=4137;break}}if((p|0)==4137){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aB|0)!=1){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aB=aL+1|0;c[13898]=aB;aL=(aK|0)>(aB|0);L5591:do{if(aL){do{if((a[aI+(aB*40&-1)|0]&1)==0){p=4096}else{aK=c[aI+(aB*40&-1)+36>>2]|0;aD=aI+(aB*40&-1)+32|0;aA=0;while(1){if((aA|0)>=(aK|0)){p=4094;break}if((a[aG+((c[aD>>2]|0)+aA|0)|0]|0)==(a[aA+134808|0]|0)){aA=aA+1|0}else{break}}if((p|0)==4094){if((aA|0)==1){break}}if(aL){p=4096}else{p=4110;break L5591}}}while(0);if((p|0)==4096){if((a[aI+(aB*40&-1)|0]&1)==0){p=4110;break}e=c[aI+(aB*40&-1)+36>>2]|0;aF=aI+(aB*40&-1)+32|0;aD=0;while(1){if((aD|0)>=(e|0)){break}if((a[aG+((c[aF>>2]|0)+aD|0)|0]|0)==(a[aD+78864|0]|0)){aD=aD+1|0}else{p=4110;break L5591}}if((aD|0)!=1){p=4110;break}}aF=c[18070]|0;e=c[aF>>2]|0;aK=c[18066]|0;if((e|0)<(aK|0)){aM=aF;aN=e}else{e=db(aF,(aK<<5)+4808|0,168072)|0;aK=e;c[18070]=aK;c[18066]=(c[18066]|0)+150;aM=aK;aN=c[e>>2]|0}c[aM+8+(aN<<5)>>2]=1;e=c[18070]|0;aK=c[e>>2]|0;c[e>>2]=aK+1;e=c[18070]|0;c[e+8+(aK<<5)+8>>2]=1;c[e+8+(aK<<5)+16>>2]=65535;aK=c[13898]|0;if((c[8272]|0)<=(aK|0)){break}e=c[1054]|0;if((a[e+(aK*40&-1)|0]&1)==0){break}aF=c[e+(aK*40&-1)+36>>2]|0;aC=e+(aK*40&-1)+32|0;e=c[10036]|0;aE=0;while(1){if((aE|0)>=(aF|0)){break}if((a[e+((c[aC>>2]|0)+aE|0)|0]|0)==(a[aE+134808|0]|0)){aE=aE+1|0}else{break L5591}}if((aE|0)!=1){break}c[13898]=aK+1}else{p=4110}}while(0);do{if((p|0)==4110){if((iy()|0)!=0){break}c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}}while(0);aN=c[13898]|0;if((c[8272]|0)<=(aN|0)){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aM=c[1054]|0;if((a[aM+(aN*40&-1)|0]&1)==0){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aG=c[aM+(aN*40&-1)+36>>2]|0;aB=aM+(aN*40&-1)+32|0;aM=c[10036]|0;aI=0;while(1){if((aI|0)>=(aG|0)){break}if((a[aM+((c[aB>>2]|0)+aI|0)|0]|0)==(a[aI+78864|0]|0)){aI=aI+1|0}else{p=4141;break}}if((p|0)==4141){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aI|0)!=1){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=aN+1;aN=c[18070]|0;aI=c[aN>>2]|0;p=c[18066]|0;if((aI|0)<(p|0)){aO=aN;aP=aI}else{aI=db(aN,(p<<5)+4808|0,168072)|0;p=aI;c[18070]=p;c[18066]=(c[18066]|0)+150;aO=p;aP=c[aI>>2]|0}c[aO+8+(aP<<5)>>2]=35;aP=c[18070]|0;c[aP>>2]=(c[aP>>2]|0)+1;i=b;return}function iJ(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;L5643:while(1){b=c[13898]|0;d=(c[8272]|0)>(b|0);if(!d){e=4202;break}f=c[1054]|0;if((a[f+(b*40&-1)|0]&1)!=0){g=c[f+(b*40&-1)+36>>2]|0;h=f+(b*40&-1)+32|0;f=c[10036]|0;i=0;while(1){if((i|0)>=(g|0)){e=4174;break}if((a[f+((c[h>>2]|0)+i|0)|0]|0)==(a[i+134808|0]|0)){i=i+1|0}else{break}}do{if((e|0)==4174){e=0;if((i|0)!=1){break}c[13898]=b+1;iI();h=c[18070]|0;f=c[h>>2]|0;g=c[18066]|0;if((f|0)<(g|0)){j=h;k=f}else{f=db(h,(g<<5)+4808|0,168072)|0;g=f;c[18070]=g;c[18066]=(c[18066]|0)+150;j=g;k=c[f>>2]|0}c[j+8+(k<<5)>>2]=25;f=c[18070]|0;c[f>>2]=(c[f>>2]|0)+1;continue L5643}}while(0);if(!d){e=4198;break}}i=c[1054]|0;L5659:do{if((a[i+(b*40&-1)|0]&1)!=0){f=c[i+(b*40&-1)+36>>2]|0;g=i+(b*40&-1)+32|0;h=c[10036]|0;l=0;while(1){if((l|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+l|0)|0]|0)==(a[l+126944|0]|0)){l=l+1|0}else{break L5659}}if((l|0)!=1){break}c[13898]=b+1;iI();g=c[18070]|0;h=c[g>>2]|0;f=c[18066]|0;if((h|0)<(f|0)){m=g;n=h}else{h=db(g,(f<<5)+4808|0,168072)|0;f=h;c[18070]=f;c[18066]=(c[18066]|0)+150;m=f;n=c[h>>2]|0}c[m+8+(n<<5)>>2]=26;h=c[18070]|0;c[h>>2]=(c[h>>2]|0)+1;continue L5643}}while(0);if(!d){e=4199;break}i=c[1054]|0;if((a[i+(b*40&-1)|0]&1)==0){e=4200;break}h=c[i+(b*40&-1)+36>>2]|0;f=i+(b*40&-1)+32|0;i=c[10036]|0;g=0;while(1){if((g|0)>=(h|0)){break}if((a[i+((c[f>>2]|0)+g|0)|0]|0)==(a[g+191528|0]|0)){g=g+1|0}else{e=4201;break L5643}}if((g|0)!=1){e=4197;break}c[13898]=b+1;iI();f=c[18070]|0;i=c[f>>2]|0;h=c[18066]|0;if((i|0)<(h|0)){o=f;p=i}else{i=db(f,(h<<5)+4808|0,168072)|0;h=i;c[18070]=h;c[18066]=(c[18066]|0)+150;o=h;p=c[i>>2]|0}c[o+8+(p<<5)>>2]=27;i=c[18070]|0;c[i>>2]=(c[i>>2]|0)+1}if((e|0)==4201){return}else if((e|0)==4202){return}else if((e|0)==4198){return}else if((e|0)==4197){return}else if((e|0)==4199){return}else if((e|0)==4200){return}}function iK(){var b=0,d=0;b=i;do{if((c[258]|0)==0){d=bU(172032)|0;if((d|0)!=0){c[258]=bP(d|0)|0;break}if((a[37400]&1)==0){break}uh(-1,168056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((c[256]|0)!=0){i=b;return}d=bU(163792)|0;c[256]=bP(((d|0)==0?154528:d)|0)|0;i=b;return}function iL(){cv(53560|0,1)}function iM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,p=0,q=0,t=0,u=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+160|0;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:k=e|0;if((b|0)>1){l=1;f=2;break}else{f=16;break};case 2:p=c[d+(l<<2)>>2]|0;if((p|0)==0){f=15;break}else{f=3;break};case 3:q=aw(8,p|0,183208)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=5;break}else{f=4;break};case 4:q=aw(8,p|0,214328)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=5;break}else{f=6;break};case 5:aw(26,158880,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;t=0;f=81;break;case 6:q=aw(8,p|0,135600)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=8;break}else{f=7;break};case 7:q=aw(8,p|0,122640)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=8;break}else{f=9;break};case 8:aw(26,105384,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;t=0;f=81;break;case 9:q=aq(2,p|0,98264,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=11;break}else{f=10;break};case 10:q=aw(8,p|0,92432)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=11;break}else{f=12;break};case 11:a[32096]=1;f=15;break;case 12:q=aq(2,p|0,84592,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=14;break}else{f=13;break};case 13:q=aw(8,p|0,76592)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=14;break}else{f=15;break};case 14:a[21672]=1;f=15;break;case 15:q=l+1|0;if((q|0)<(b|0)){l=q;f=2;break}else{f=16;break};case 16:an(88,c[m>>2]|0,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=au(2,c[n>>2]|0,0,1,1024)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=18;break}else{f=17;break};case 17:au(4,224136,28,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=18;break;case 18:au(2,c[o>>2]|0,0,2,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[10030]=c[n>>2];c[500]=2;h[251]=3.141592653589793;h[252]=0.0;q=ao(4,133568)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[506]=q;u=+av(4,133568,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[q+16>>2]=2;h[q+24>>3]=u;h[q+32>>3]=0.0;a[(c[506]|0)+8|0]=0;as(384);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;as(44);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=ao(56,1)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=19;break}else{w=q;f=21;break};case 19:as(424);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=ao(56,1)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=20;break}else{w=q;f=21;break};case 20:ar(6,-1|0,225296,(v=i,i=i+8|0,c[v>>2]=116456,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;return 0;case 21:c[6924]=w;a[w]=0;a[37400]=0;as(108);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((c[3524]|0)==0){f=25;break}else{f=22;break};case 22:am(98,c[6958]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;am(98,c[6956]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;x=c[c[3524]>>2]|0;if((x|0)==0){y=0;f=24;break}else{f=23;break};case 23:q=ao(162,x|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;y=q;f=24;break;case 24:c[6958]=y;q=ao(162,13048)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[6956]=q;f=25;break;case 25:ao(102,92);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=ao(58,c[o>>2]|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;z=ao(18,q|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;a[37400]=(z|0)!=0&1;A=1;f=26;break;case 26:if((A|0)<(b|0)){f=27;break}else{f=30;break};case 27:B=c[d+(A<<2)>>2]|0;if((a[B]|0)==45){f=28;break}else{f=29;break};case 28:if((a[B+1|0]|0)==101){f=29;break}else{A=A+1|0;f=26;break};case 29:a[37400]=0;f=30;break;case 30:z=ao(108,k|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)>-1){f=31;break}else{f=32;break};case 31:aw(28,33040,k|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(28,33008,k+128|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=32;break;case 32:if((a[37400]&1)==0){f=34;break}else{f=33;break};case 33:am(272,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=35;break;case 34:am(272,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=35;break;case 35:am(200,3);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;C=uL(53560,f,j)|0;f=82;break;case 82:if((C|0)==0){f=36;break}else{f=42;break};case 36:av(2,2,4);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;av(2,13,1);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;as(418);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(24,1,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;am(98,c[12908]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(10,5,179864);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(10,2,179864);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;D=aw(10,5,0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((D|0)==0){E=0;f=38;break}else{f=37;break};case 37:z=ao(162,D|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;E=z;f=38;break;case 38:c[12908]=E;as(138);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[5162]=37;c[5164]=7;c[5165]=5;c[5166]=15;a[20668]=112;c[5172]=0;c[5173]=0;uE(20672,0,13);c[5174]=114;c[5334]=0;c[5256]=0;c[5178]=0;h[2705]=1.5;uD(54016,50688,112);am(92,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((a[21672]&1)==0){f=39;break}else{f=40;break};case 39:am(98,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=40;break;case 40:c[10062]=0;a[14168]=1;am(92,2);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;F=c[3524]|0;if((a[37400]&1)!=0&(F|0)!=0){f=41;break}else{G=0;f=48;break};case 41:aq(4,c[m>>2]|0,211496,(v=i,i=i+8|0,c[v>>2]=c[F>>2],v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;G=0;f=48;break;case 42:if(a[14168]|0){f=44;break}else{f=43;break};case 43:a[14168]=1;au(4,205272,38,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=44;break;case 44:H=a[37400]&1^1;f=45;break;case 45:z=al(2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if(z){f=45;break}else{f=46;break};case 46:I=H&255;if((a[37400]&1)==0){f=47;break}else{G=I;f=48;break};case 47:if((a[33232]&1)==0){f=49;break}else{G=I;f=48;break};case 48:z=b-1|0;if((z|0)>0){J=b;K=d;L=z;f=59;break}else{f=79;break};case 49:c[8026]=0;if((a[14080]&1)==0){f=58;break}else{f=50;break};case 50:if(a[13032]|0){f=51;break}else{f=54;break};case 51:M=c[(c[3524]|0)+104>>2]|0;if((M|0)==0){f=53;break}else{f=52;break};case 52:as(M|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=53;break;case 53:a[13032]=0;f=54;break;case 54:if(a[14088]|0){f=55;break}else{f=56;break};case 55:as(c[(c[3524]|0)+44>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;a[14088]=0;f=56;break;case 56:if((a[14080]&1)==0){f=58;break}else{f=57;break};case 57:as(c[(c[3524]|0)+40>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;a[14080]=0;c[10028]=0;f=58;break;case 58:am(356,1);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;return 0;case 59:N=K+4|0;c[13898]=0;O=c[N>>2]|0;z=aq(2,O|0,98264,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=60;break};case 60:z=aw(8,O|0,92432)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=61;break};case 61:z=aw(8,O|0,202112)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=62;break}else{f=66;break};case 62:a[37400]=1;f=63;break;case 63:z=al(6)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=63;break}else{f=64;break};case 64:a[37400]=0;P=N;Q=L;f=65;break;case 65:z=Q-1|0;if((z|0)>0){J=Q;K=P;L=z;f=59;break}else{f=79;break};case 66:z=aw(8,O|0,196560)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=67;break}else{f=72;break};case 67:R=J-2|0;S=K+8|0;if((R|0)<1){f=68;break}else{f=69;break};case 68:au(4,185336,31,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;t=0;f=81;break;case 69:a[37400]=0;a[33232]=0;T=c[S>>2]|0;if((T|0)==0){U=0;f=71;break}else{f=70;break};case 70:z=ao(162,T|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;U=z;f=71;break;case 71:am(150,U|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;P=S;Q=R;f=65;break;case 72:z=aq(2,O|0,84592,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=73;break};case 73:z=aw(8,O|0,76592)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=74;break};case 74:if((a[O]|0)==45){f=75;break}else{f=76;break};case 75:aq(4,c[m>>2]|0,180120,(v=i,i=i+8|0,c[v>>2]=O,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;P=N;Q=L;f=65;break;case 76:a[37400]=0;a[33232]=0;V=aw(20,O|0,193632)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;W=c[N>>2]|0;if((W|0)==0){X=0;f=78;break}else{f=77;break};case 77:z=ao(162,W|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;X=z;f=78;break;case 78:ar(76,V|0,X|0,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;P=N;Q=L;f=65;break;case 79:if((a[33232]&1)==0){t=G;f=81;break}else{f=80;break};case 80:z=al(6)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=80;break}else{t=G;f=81;break};case 81:i=e;return t|0;case-1:if((g|0)==35){C=s;f=82}r=s=0;break}return 0}function iN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;if((a[21672]&1)!=0){i=d;return}do{if((b|0)==1){e=0}else if((b|0)==0){f=ut(39)|0;do{if((f|0)==0){gk();g=ut(39)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=141984,v)|0)}else{h=f}}while(0);uD(h|0,74944,29);f=uA(h|0)|0;g=(f|0)==0?0:f-1|0;f=a[h+g|0]|0;if(!((f<<24>>24|0)==47|(f<<24>>24|0)==0)){a[h+(g+1|0)|0]=47;a[h+(g+2|0)|0]=0}uD(h+(uA(h|0)|0)|0,138288,10);j=bF(h|0,193632)|0;k=h;l=4229}else{g=c[258]|0;if(!((b|0)==2&(g|0)!=0)){e=0;break}f=(uA(g|0)|0)+10|0;g=ut(f)|0;do{if((g|0)==0){gk();m=ut(f)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=141984,v)|0)}else{n=g}}while(0);uB(n|0,c[258]|0);g=uA(n|0)|0;f=(g|0)==0?0:g-1|0;g=a[n+f|0]|0;if(!((g<<24>>24|0)==47|(g<<24>>24|0)==0)){a[n+(f+1|0)|0]=47;a[n+(f+2|0)|0]=0}uD(n+(uA(n|0)|0)|0,136592,9);j=bF(n|0,193632)|0;k=n;l=4229}}while(0);do{if((l|0)==4229){if((j|0)==0){e=k;break}n=(k|0)!=0?k:136592;if((n|0)==0){o=0}else{o=bP(n|0)|0}hw(j,o,0);if((c[3524]|0)==0){e=k;break}uu(c[6958]|0);uu(c[6956]|0);n=c[c[3524]>>2]|0;if((n|0)==0){p=0}else{p=bP(n|0)|0}c[6958]=p;c[6956]=bP(13048)|0;e=k}}while(0);uu(e);i=d;return}function iO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((a|0)==0){return}else{b=a}while(1){a=c[b>>2]|0;d=b+16|0;uu(c[d>>2]|0);c[d>>2]=0;d=b+320|0;uu(c[d>>2]|0);c[d>>2]=0;d=b+316|0;uu(c[d>>2]|0);c[d>>2]=0;d=b+224|0;e=c[d>>2]|0;if((e|0)!=0){f=c[e+64>>2]|0;if((f|0)==0){g=e}else{uu(f);g=e}while(1){e=c[g+60>>2]|0;if((e|0)!=0){uu(e)}e=c[g+64>>2]|0;if(!((e|0)==0|(e|0)==(f|0))){uu(e)}e=c[g>>2]|0;uu(g);if((e|0)==0){break}else{g=e}}}c[d>>2]=0;f=b+292|0;uu(c[f>>2]|0);c[f>>2]=0;uu(b);if((a|0)==0){break}else{b=a}}return}function iP(b){b=b|0;aV(2,4);aV(8,0);c[8026]=0;do{if((a[14080]&1)!=0){if(a[13032]|0){b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){break}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);aF(10,c[m>>2]|0);iL()}function iQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[b>>2]|0;if((e|0)==0){uf(-1,151280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[e]|0)!=126){i=d;return}if((a[e+1|0]|0)!=47){i=d;return}f=c[258]|0;if((f|0)==0){uh(-1,147480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}else{g=uA(e|0)|0;h=db(e,(uA(f|0)|0)+g|0,149488)|0;c[b>>2]=h;uH(h+((uA(c[258]|0)|0)-1|0)|0,h|0,g+1|0);g=c[b>>2]|0;b=c[258]|0;uD(g|0,b|0,uA(b|0)|0);i=d;return}}function iR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=a+296|0;if((c[e>>2]|0)==(b|0)){i=d;return}f=a+320|0;g=c[f>>2]|0;if((b|0)<=0){uu(g);c[f>>2]=0;c[e>>2]=0;h=a+316|0;uu(c[h>>2]|0);c[h>>2]=0;i=d;return}do{if((g|0)==0){h=b<<6;j=ut(h)|0;do{if((j|0)==0){gk();k=ut(h)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180104,v)|0)}else{l=j}}while(0);c[f>>2]=l}else{c[f>>2]=db(g,b<<6,214200)|0;j=a+316|0;h=c[j>>2]|0;if((h|0)==0){break}c[j>>2]=db(h,b<<3,158688)|0}}while(0);c[e>>2]=b;i=d;return}function iS(){var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,w=0;d=i;i=i+24|0;e=d|0;if((c[3524]|0)==0){uf(c[13898]|0,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[37384]=0;if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}do{if((a[32936]&1)!=0){if((aY(24544,122560)|0)!=0){break}b[12272]=116}}while(0);c[16506]=c[16507];h[8255]=+h[8257];h[8256]=+h[8258];h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;f=c[16335]|0;c[16334]=f;h[8169]=(f&1|0)==0?+h[8171]:8.988465674311579e+307;h[8170]=(f&2|0)==0?+h[8172]:-8.988465674311579e+307;h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;c[17194]=c[17195];h[8599]=+h[8601];h[8600]=+h[8602];h[8605]=8.988465674311579e+307;h[8606]=-8.988465674311579e+307;f=c[17023]|0;c[17022]=f;h[8513]=(f&1|0)==0?+h[8515]:8.988465674311579e+307;h[8514]=(f&2|0)==0?+h[8516]:-8.988465674311579e+307;h[8519]=8.988465674311579e+307;h[8520]=-8.988465674311579e+307;c[17538]=c[17539];h[8771]=+h[8773];h[8772]=+h[8774];h[8777]=8.988465674311579e+307;h[8778]=-8.988465674311579e+307;f=c[17367]|0;c[17366]=f;h[8685]=(f&1|0)==0?+h[8687]:8.988465674311579e+307;h[8686]=(f&2|0)==0?+h[8688]:-8.988465674311579e+307;h[8691]=8.988465674311579e+307;h[8692]=-8.988465674311579e+307;f=c[16679]|0;c[16678]=f;h[8341]=(f&1|0)==0?+h[8343]:8.988465674311579e+307;h[8342]=(f&2|0)==0?+h[8344]:-8.988465674311579e+307;h[8347]=8.988465674311579e+307;h[8348]=-8.988465674311579e+307;L5811:do{if((a[37408]&1)!=0){f=c[13898]|0;if((c[8272]|0)>(f|0)){j=f}else{break}do{f=c[1054]|0;if((a[f+(j*40&-1)|0]&1)==0){break L5811}k=c[f+(j*40&-1)+36>>2]|0;l=f+(j*40&-1)+32|0;f=c[10036]|0;m=0;while(1){if((m|0)>=(k|0)){break}if((a[f+((c[l>>2]|0)+m|0)|0]|0)==(a[m+78280|0]|0)){m=m+1|0}else{break L5811}}if((m|0)!=1){break L5811}dn();j=c[13898]|0;}while((c[8272]|0)>(j|0))}}while(0);if((a[32936]&1)==0){n=(a[30528]&1)!=0?8:2}else{n=8}j=dr(n,-1)|0;if((a[32936]&1)==0){if((a[30528]&1)!=0){o=4309}}else{o=4309}if((o|0)==4309){dq(2)}do{if((c[16506]&3|0)==0){p=+h[8256];q=+h[8255];if(p>=q){o=4313;break}h[8255]=p;h[8256]=q;r=1}else{o=4313}}while(0);if((o|0)==4313){r=(c[16508]|0)>>>1&1}a[66036]=r;dq(1);do{if((c[16334]&3|0)==0){q=+h[8170];p=+h[8169];if(q>=p){o=4317;break}h[8169]=q;h[8170]=p;s=1}else{o=4317}}while(0);if((o|0)==4317){s=(c[16336]|0)>>>1&1}a[65348]=s;dq(6);do{if((c[17194]&3|0)==0){p=+h[8600];q=+h[8599];if(p>=q){o=4321;break}h[8599]=p;h[8600]=q;t=1}else{o=4321}}while(0);if((o|0)==4321){t=(c[17196]|0)>>>1&1}a[68788]=t;dq(5);do{if((c[17022]&3|0)==0){q=+h[8514];p=+h[8513];if(q>=p){o=4325;break}h[8513]=q;h[8514]=p;u=1}else{o=4325}}while(0);if((o|0)==4325){u=(c[17024]|0)>>>1&1}a[68100]=u;u=e;t=e+16|0;s=0;do{r=64944+(s*688&-1)|0;n=c[r>>2]|0;if((n|0)==0){o=4334}else{c[u>>2]=c[7254];c[u+4>>2]=c[7255];c[u+8>>2]=c[7256];c[u+12>>2]=c[7257];c[u+16>>2]=c[7258];c[u+20>>2]=c[7259];l=e;f=n;L5858:while(1){n=f;while(1){if((c[n+12>>2]|0)>=0){break}uu(c[n+8>>2]|0);k=c[n+16>>2]|0;uu(n);if((k|0)==0){w=l;break L5858}else{n=k}}c[l+16>>2]=n;m=c[n+16>>2]|0;if((m|0)==0){w=n;break}else{l=n;f=m}}c[w+16>>2]=0;f=c[t>>2]|0;c[r>>2]=f;if((f|0)==0){o=4334}}do{if((o|0)==4334){o=0;f=64920+(s*688&-1)|0;if((c[f>>2]|0)!=3){break}c[f>>2]=1}}while(0);s=s+1|0;}while((s|0)<11);if((j|0)<=-1){uB(55600,24544);iT();i=d;return}s=c[1054]|0;o=c[s+(j*40&-1)+36>>2]|0;t=(o|0)>49?49:o;o=c[10036]|0;w=c[s+(j*40&-1)+32>>2]|0;j=0;while(1){s=j+1|0;a[j+55600|0]=a[o+w|0]|0;if((s|0)==(t|0)){break}else{w=w+1|0;j=s}}a[t+55600|0]=0;iT();i=d;return}function iT(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0.0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cS=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0.0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0,dk=0,dl=0,dm=0,dn=0,dq=0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0,dC=0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0,dR=0,dS=0,dU=0,dV=0,dW=0,dX=0,dY=0,dZ=0,d_=0,d$=0,d0=0,d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0,ea=0,eb=0,ec=0,ed=0.0,ee=0.0,ef=0.0,eg=0.0,eh=0.0,ei=0.0,ej=0.0,ek=0,el=0.0,em=0.0,en=0.0,eo=0.0,ep=0.0,eq=0.0,er=0.0,es=0.0,et=0,eu=0,ev=0,ew=0,ex=0.0,eA=0,eB=0.0,eE=0.0,eF=0.0,eG=0.0,eH=0,eI=0,eJ=0,eK=0,eN=0.0,eO=0.0,eP=0,eQ=0,eR=0,eS=0.0,eT=0.0,eU=0,eV=0,eW=0,eX=0,eY=0,eZ=0,e_=0,e$=0,e0=0,e1=0,e2=0,e3=0,e5=0,e8=0.0,e9=0,fa=0,fb=0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0,fi=0,fj=0,fk=0,fl=0.0,fm=0,fn=0,fo=0,fp=0,fq=0,fr=0,fs=0,ft=0,fu=0,fv=0.0,fw=0,fx=0.0,fy=0.0,fz=0,fA=0,fB=0,fC=0,fD=0,fE=0.0,fF=0,fG=0,fH=0,fI=0,fJ=0,fK=0,fL=0,fM=0,fN=0,fO=0,fP=0,fQ=0,fR=0,fT=0.0,fU=0,fV=0,fW=0,fX=0,fY=0,fZ=0,f_=0,f$=0,f0=0,f1=0,f2=0,f4=0,f5=0,f6=0,f7=0,f9=0,ga=0,gb=0.0,gc=0.0,gd=0,ge=0,gf=0,gg=0,gh=0,gi=0,gj=0.0,gl=0.0,gm=0.0,gn=0.0,go=0,gp=0.0,gq=0.0,gr=0.0,gs=0.0,gt=0.0,gu=0.0,gv=0,gw=0.0,gx=0.0,gy=0.0,gz=0.0,gA=0,gB=0,gC=0.0,gD=0,gE=0,gF=0.0,gG=0,gH=0,gI=0.0,gJ=0,gK=0.0,gL=0,gM=0,gN=0,gO=0,gP=0,gQ=0,gR=0,gS=0,gT=0,gU=0,gV=0,gW=0,gX=0,gY=0,gZ=0,g_=0,g$=0,g0=0,g1=0,g2=0.0,g3=0,g4=0,g5=0,g6=0,g7=0,g8=0,g9=0,ha=0,hb=0,hc=0,hd=0,he=0.0,hf=0.0,hg=0,hh=0.0,hi=0.0,hj=0,hm=0,ho=0.0;b=i;i=i+512|0;d=b|0;e=b+8|0;f=b+96|0;g=b+120|0;j=b+144|0;k=b+216|0;l=b+240|0;n=b+264|0;o=b+288|0;p=b+336|0;q=b+368|0;r=b+424|0;s=b+480|0;t=b+488|0;u=c[13898]|0;h[4834]=0.0;f8(38680);w=c[3568]|0;if((w|0)!=0){uu(w)}c[3568]=0;w=o+20|0;c[w>>2]=0;x=o+24|0;c[x>>2]=0;y=o+4|0;c[y>>2]=0;z=o+8|0;c[z>>2]=0;A=c[10814]|0;if((A|0)!=0){iO(A)}c[10814]=0;A=c[12374]|0;a[872]=0;c[7774]=iw()|0;B=c[13898]|0;if((B|0)>=(c[8272]|0)){C=B;uf(C,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=b+168|0;E=b+64|0;F=e|0;G=e+8|0;H=e+16|0;I=e+24|0;J=e+32|0;K=e+40|0;L=f|0;M=f+8|0;N=r+40|0;O=q;Q=q+4|0;U=q+16|0;V=q+24|0;W=q+8|0;X=q|0;Y=q+40|0;$=q+44|0;aa=q+32|0;ab=g|0;ac=j|0;ad=j+8|0;ae=b+192|0;af=p+8|0;ag=n|0;ah=n+8|0;ai=l|0;aj=l+8|0;ak=k|0;al=k+8|0;am=0;an=-5;ao=1;ap=-1;aq=0.0;ar=0;as=0;at=A;A=0;au=0;av=0;aw=0;ax=0;ay=43256;az=B;L5888:while(1){B=ar;aA=A;aB=az;L5890:while(1){aC=c[1054]|0;aD=(a[aC+(aB*40&-1)|0]&1)==0;L5892:do{if(!aD){aE=c[aC+(aB*40&-1)+36>>2]|0;aF=aC+(aB*40&-1)+32|0;aG=c[10036]|0;aH=0;while(1){if((aH|0)>=(aE|0)){break}if((a[aG+((c[aF>>2]|0)+aH|0)|0]|0)==(a[aH+103664|0]|0)){aH=aH+1|0}else{break L5892}}if((aH|0)==1){aJ=B;aK=aA;aL=am;aM=au;aN=ax;aO=aB;aP=4357;break L5888}}}while(0);if(au){aQ=B}else{aQ=aA?B:aB}aF=c[aC+(aB*40&-1)+36>>2]|0;L5902:do{if((aF|0)>0&(aD^1)){aG=c[10036]|0;aE=0;aR=0;aS=c[aC+(aB*40&-1)+32>>2]|0;while(1){if((a[aE+205224|0]|0)==(a[aG+(aE+aS|0)|0]|0)){aT=aS;aU=aR}else{if((aE|0)!=7){break L5902}aT=aS-1|0;aU=1}aV=aE+1|0;if((aV|0)<(aU+aF|0)){aE=aV;aR=aU;aS=aT}else{break}}if((aU|0)!=0){aP=4369;break L5890}if((aE|0)==12|(aE|0)==6){aP=4369;break L5890}}}while(0);if((t9(aB)|0)==0){aP=4446;break}dT();aF=c[13898]|0;aC=c[8272]|0;aD=(aC|0)>(aF|0);if(!aD){aJ=aQ;aK=1;aL=am;aM=au;aN=ax;aO=aF;aP=4357;break L5888}aS=c[1054]|0;if((a[aS+(aF*40&-1)|0]&1)==0){B=aQ;aA=1;aB=aF;continue}aR=c[aS+(aF*40&-1)+36>>2]|0;aG=aS+(aF*40&-1)+32|0;aS=c[10036]|0;aH=0;while(1){if((aH|0)>=(aR|0)){aP=4445;break}if((a[aS+((c[aG>>2]|0)+aH|0)|0]|0)==(a[aH+148464|0]|0)){aH=aH+1|0}else{break}}if((aP|0)==4445){aP=0;if((aH|0)==1){aW=aq;aX=ap;aZ=ao;a$=an;a0=aF;a1=aC;aP=5304;break}}if(aD){B=aQ;aA=1;aB=aF}else{aJ=aQ;aK=1;aL=am;aM=au;aN=ax;aO=aF;aP=4357;break L5888}}do{if((aP|0)==4446){aP=0;B=am+1|0;c[11670]=31424;aG=iu(0)|0;c[11670]=0;aS=(a[32936]&1)==0;aR=au^1;if((aG|0)==0){aV=aS?au:aR;a2=c[ay>>2]|0;a3=(c[6352]|0)+1|0;if((a2|0)==0){uE(D|0,0,24);a4=ut(328)|0;if((a4|0)==0){gk();a5=ut(328)|0;if((a5|0)==0){aP=4462;break L5888}else{a6=a5}}else{a6=a4}a4=a6;uE(a6|0,0,328);c[a6+296>>2]=(a3|0)<0?0:a3;if((a3|0)>0){a5=a3<<6;a7=ut(a5)|0;if((a7|0)==0){gk();a8=ut(a5)|0;if((a8|0)==0){aP=4466;break L5888}else{a9=a8}}else{a9=a7}c[a6+320>>2]=a9}c[a6+24>>2]=0;c[a6+28>>2]=-2;a7=a6+32|0;c[a7>>2]=0;c[a7+4>>2]=0;h[a6+40>>3]=1.0;h[a6+48>>3]=-2.0;a7=a6+56|0;c[a7>>2]=c[D>>2];c[a7+4>>2]=c[D+4>>2];c[a7+8>>2]=c[D+8>>2];c[a7+12>>2]=c[D+12>>2];c[a7+16>>2]=c[D+16>>2];c[a7+20>>2]=c[D+20>>2];c[a6+80>>2]=-1;c[a6+84>>2]=0;a7=a6+88|0;c[a7>>2]=c[12872];c[a7+4>>2]=c[12873];c[a7+8>>2]=c[12874];c[a7+12>>2]=c[12875];c[a7+16>>2]=c[12876];c[a7+20>>2]=c[12877];c[a7+24>>2]=c[12878];c[a7+28>>2]=c[12879];c[a7+32>>2]=c[12880];c[a7+36>>2]=c[12881];c[a7+40>>2]=c[12882];c[a7+44>>2]=c[12883];c[a7+48>>2]=c[12884];c[a7+52>>2]=c[12885];c[a6+144>>2]=1;h[a6+152>>3]=0.0;c[a6+160>>2]=0;h[a6+168>>3]=15.0;h[a6+176>>3]=90.0;c[a6+184>>2]=0;a7=a6+192|0;c[a7>>2]=c[12372];c[a7+4>>2]=c[12373];c[a7+8>>2]=c[12374];c[a7+12>>2]=c[12375];c[a7+16>>2]=c[12376];c[a7+20>>2]=c[12377];c[a7+24>>2]=c[12378];c[a7+28>>2]=c[12379];c[ay>>2]=a4;ba=a4}else{iR(a2,a3);ba=a2}c[ba+8>>2]=0;c[ba+12>>2]=c[10058];c[ba+240>>2]=0;a[ba+56|0]=0;a2=c[13898]|0;bb=ba;bc=1;bd=aV;be=a2-1|0;bf=0;bg=a2}else{if(!(aS|aR)){aP=4448;break L5888}aR=c[ay>>2]|0;if((aR|0)==0){uE(ae|0,0,24);aS=ut(328)|0;if((aS|0)==0){gk();a2=ut(328)|0;if((a2|0)==0){aP=4452;break L5888}else{bh=a2}}else{bh=aS}aS=bh;uE(bh|0,0,328);c[bh+296>>2]=100;a2=ut(6400)|0;if((a2|0)==0){gk();aV=ut(6400)|0;if((aV|0)==0){aP=4455;break L5888}else{bi=aV}}else{bi=a2}c[bh+320>>2]=bi;c[bh+24>>2]=0;c[bh+28>>2]=-2;a2=bh+32|0;c[a2>>2]=0;c[a2+4>>2]=0;h[bh+40>>3]=1.0;h[bh+48>>3]=-2.0;a2=bh+56|0;c[a2>>2]=c[ae>>2];c[a2+4>>2]=c[ae+4>>2];c[a2+8>>2]=c[ae+8>>2];c[a2+12>>2]=c[ae+12>>2];c[a2+16>>2]=c[ae+16>>2];c[a2+20>>2]=c[ae+20>>2];c[bh+80>>2]=-1;c[bh+84>>2]=0;a2=bh+88|0;c[a2>>2]=c[12872];c[a2+4>>2]=c[12873];c[a2+8>>2]=c[12874];c[a2+12>>2]=c[12875];c[a2+16>>2]=c[12876];c[a2+20>>2]=c[12877];c[a2+24>>2]=c[12878];c[a2+28>>2]=c[12879];c[a2+32>>2]=c[12880];c[a2+36>>2]=c[12881];c[a2+40>>2]=c[12882];c[a2+44>>2]=c[12883];c[a2+48>>2]=c[12884];c[a2+52>>2]=c[12885];c[bh+144>>2]=1;h[bh+152>>3]=0.0;c[bh+160>>2]=0;h[bh+168>>3]=15.0;h[bh+176>>3]=90.0;c[bh+184>>2]=0;a2=bh+192|0;c[a2>>2]=c[12372];c[a2+4>>2]=c[12373];c[a2+8>>2]=c[12374];c[a2+12>>2]=c[12375];c[a2+16>>2]=c[12376];c[a2+20>>2]=c[12377];c[a2+24>>2]=c[12378];c[a2+28>>2]=c[12379];c[ay>>2]=aS;bj=aS}else{bj=aR}c[bj+8>>2]=1;c[bj+12>>2]=c[12890];c[bj+284>>2]=0;c[bj+240>>2]=0;a[bj+56|0]=0;c[11856]=1;aR=ey(aG,7,bj)|0;aG=(c[13898]|0)-1|0;c[bj+4>>2]=aG;bb=bj;bc=ax;bd=au;be=aG;bf=aR;bg=c[13898]|0}c[200]=2;c[144]=1;aR=c[8272]|0;if((bg|0)<(aR|0)){aG=bb+12|0;aS=bb+144|0;a2=bb+152|0;aV=bb+80|0;a3=bb+80|0;a4=bb+84|0;a7=bb+88|0;a8=a7;a5=bb+160|0;bk=bb+168|0;bl=bb+176|0;bm=bb+184|0;bn=aw+1|0;bo=a7|0;bp=bb+92|0;bq=bb+128|0;br=bb+132|0;bs=bb+96|0;bt=bb+120|0;bu=bb+272|0;bv=bb+224|0;bw=bb+64|0;bx=bb+56|0;by=bb+192|0;bz=by|0;bB=bb+24|0;bC=bd^1;bD=bb+240|0;bE=bb+8|0;bF=bb+232|0;bG=bb+22|0;bH=(as|0)==0;bI=bb+20|0;bJ=bb+16|0;bK=bb+284|0;bL=0;bN=0;bO=0;bQ=0;bR=0;bS=0;bT=0;bU=0;bV=bg;bW=aR;L5954:while(1){aR=c[1054]|0;bX=(a[aR+(bV*40&-1)|0]&1)==0;bY=c[aR+(bV*40&-1)+36>>2]|0;bZ=aR+(bV*40&-1)+32|0;L5956:do{if(bX){b_=c[bZ>>2]|0;aP=4648}else{b$=c[10036]|0;b0=0;while(1){if((b0|0)>=(bY|0)){aP=4478;break}if((a[b$+((c[bZ>>2]|0)+b0|0)|0]|0)==(a[b0+103664|0]|0)){b0=b0+1|0}else{break}}if((aP|0)==4478){aP=0;if((b0|0)==1){b1=bS;b2=bR;b3=bO;break L5954}}b$=c[bZ>>2]|0;if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break}b4=c[10036]|0;b5=0;b6=0;b7=b$;while(1){if((a[b5+168032|0]|0)==(a[b4+(b5+b7|0)|0]|0)){b8=b7;b9=b6}else{if((b5|0)!=1){break}b8=b7-1|0;b9=1}ca=b5+1|0;if((ca|0)<(b9+bY|0)){b5=ca;b6=b9;b7=b8}else{aP=4485;break}}do{if((aP|0)==4485){aP=0;if((b9|0)==0){if(!((b5|0)==0|(b5|0)==6)){break}}if(bL){cb=bV;aP=6078;break L5888}cc=bV+1|0;c[13898]=cc;b7=c[aR+(cc*40&-1)+36>>2]|0;b6=c[aR+(cc*40&-1)+32>>2]|0;b4=(a[aR+(cc*40&-1)|0]&1)==0;b0=(b7|0)>0;ca=c[10036]|0;cd=30960;ce=115840;L5978:while(1){L5980:do{if(!b4){if(b0){cf=0;cg=0;ch=b6;while(1){ci=a[ce+cf|0]|0;if(ci<<24>>24==(a[ca+(cf+ch|0)|0]|0)){cj=ch;ck=cg}else{if(ci<<24>>24!=36){break L5980}cj=ch-1|0;ck=1}cl=cf+1|0;if((cl|0)<(ck+b7|0)){cf=cl;cg=ck;ch=cj}else{break}}if((ck|0)==0){cm=cl}else{cn=cd;break L5978}}else{cm=0}ch=a[ce+cm|0]|0;if((ch<<24>>24|0)==36|(ch<<24>>24|0)==0){cn=cd;break L5978}}}while(0);ch=cd+8|0;cg=c[ch>>2]|0;if((cg|0)==0){cn=ch;break}else{cd=ch;ce=cg}}ce=c[cn+4>>2]|0;if((ce-1|0)>>>0>=9){aP=4501;break L5888}c[bK>>2]=ce;c[aG>>2]=1;c[13898]=(c[13898]|0)+1;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=bN;cv=1;break L5956}}while(0);if(bX){b_=b$;aP=4648;break}L5996:do{if((bY|0)>0){b5=c[10036]|0;ce=0;cd=0;b7=b$;while(1){if((a[ce+154504|0]|0)==(a[b5+(ce+b7|0)|0]|0)){cw=b7;cx=cd}else{if((ce|0)!=2){aP=4511;break L5996}cw=b7-1|0;cx=1}ca=ce+1|0;if((ca|0)<(cx+bY|0)){ce=ca;cd=cx;b7=cw}else{break}}if((cx|0)!=0){break}if(!((ce|0)==1|(ce|0)==4)){aP=4511}}else{aP=4511}}while(0);do{if((aP|0)==4511){aP=0;if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break L5956}b7=c[10036]|0;cd=0;b5=0;ca=b$;while(1){if((a[cd+116896|0]|0)==(a[b7+(cd+ca|0)|0]|0)){cy=ca;cz=b5}else{if((cd|0)!=2){break}cy=ca-1|0;cz=1}b6=cd+1|0;if((b6|0)<(cz+bY|0)){cd=b6;b5=cz;ca=cy}else{aP=4517;break}}if((aP|0)==4517){aP=0;if((cz|0)!=0){break}if((cd|0)==1|(cd|0)==4){break}}if(bX){b_=b$;aP=4648;break L5956}L6020:do{if((bY|0)>0){ca=c[10036]|0;b5=0;b7=0;ce=b$;while(1){if((a[b5+224032|0]|0)==(a[ca+(b5+ce|0)|0]|0)){cA=ce;cB=b7}else{if((b5|0)!=1){break L6020}cA=ce-1|0;cB=1}b6=b5+1|0;if((b6|0)<(cB+bY|0)){b5=b6;b7=cB;ce=cA}else{break}}if((cB|0)==0){if(!((b5|0)==0|(b5|0)==5)){break}}if(bO){cb=bV;aP=6075;break L5888}a[bI]=a[36231]&1^1;do{if((a[32936]&1)!=0){if(bd){aP=4546;break L5888}if(bH){break}a[as]=0}}while(0);b5=c[13898]|0;cC=b5+1|0;c[13898]=cC;ce=c[1054]|0;b7=c[ce+(cC*40&-1)+36>>2]|0;ca=c[ce+(cC*40&-1)+32>>2]|0;b6=ce+(cC*40&-1)|0;L6038:do{if((a[b6]&1)!=0&(b7|0)>0){b0=c[10036]|0;b4=0;cg=0;ch=ca;while(1){if((a[b4+137208|0]|0)==(a[b0+(b4+ch|0)|0]|0)){cD=ch;cE=cg}else{if((b4|0)!=3){break L6038}cD=ch-1|0;cE=1}cf=b4+1|0;if((cf|0)<(cE+b7|0)){b4=cf;cg=cE;ch=cD}else{break}}if((cE|0)==0){if(!((b4|0)==2|(b4|0)==12)){break}}ch=c[8272]|0;L6050:do{if((ch|0)>(cC|0)){cg=c[10036]|0;b0=0;while(1){if((b0|0)>=(b7|0)){break}if((a[cg+(ca+b0|0)|0]|0)==(a[b0+141968|0]|0)){b0=b0+1|0}else{break L6050}}if((b0|0)!=10){break}cf=b5+2|0;if((ch|0)<=(cf|0)){break}if((a[ce+(cf*40&-1)|0]&1)==0){break}ci=c[ce+(cf*40&-1)+36>>2]|0;cF=ce+(cf*40&-1)+32|0;cf=0;while(1){if((cf|0)>=(ci|0)){break}if((a[cg+((c[cF>>2]|0)+cf|0)|0]|0)==(a[cf+199040|0]|0)){cf=cf+1|0}else{break L6050}}if((cf|0)==1){break L6038}}}while(0);eM(bb);co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}}while(0);a[43504]=1;if((cC|0)>=(c[8272]|0)){aP=4577;break L5888}L6066:do{if((a[b6]&1)!=0){ce=c[10036]|0;b5=0;while(1){if((b5|0)>=(b7|0)){break}if((a[ce+(ca+b5|0)|0]|0)==(a[b5+103664|0]|0)){b5=b5+1|0}else{break L6066}}if((b5|0)==1){aP=4577;break L5888}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[ac>>2]|0)!=3){aP=4576;break L5888}ca=c[ad>>2]|0;c[bJ>>2]=ca;if((ca|0)==0){aP=6068;break L5888}a[43504]=0;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}}while(0);if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break L5956}cd=c[10036]|0;ca=0;b7=0;b6=b$;while(1){if((a[ca+202e3|0]|0)==(a[cd+(ca+b6|0)|0]|0)){cG=b6;cH=b7}else{if((ca|0)!=3){break}cG=b6-1|0;cH=1}ce=ca+1|0;if((ce|0)<(cH+bY|0)){ca=ce;b7=cH;b6=cG}else{aP=4587;break}}do{if((aP|0)==4587){aP=0;if((cH|0)==0){if(!((ca|0)==2|(ca|0)==7)){break}}if(bO){cb=bV;aP=6077;break L5888}b6=bV+1|0;c[13898]=b6;b7=(a[aR+(b6*40&-1)|0]&1)==0;if(b7){aP=4592}else{cd=c[10036]|0;ce=a[cd+(c[aR+(b6*40&-1)+32>>2]|0)|0]|0;if((ce<<24>>24|0)==39|(ce<<24>>24|0)==34){cI=cd;aP=4602}else{aP=4592}}L6091:do{if((aP|0)==4592){aP=0;cd=c[10810]|0;if((cd|0)==0){break}ce=aR+(b6*40&-1)+36|0;ch=aR+(b6*40&-1)+32|0;b4=c[10036]|0;cF=cd;L6094:while(1){cd=c[cF+4>>2]|0;L6096:do{if(!((bW|0)<=(b6|0)|b7)){cg=c[ce>>2]|0;ci=0;while(1){if((ci|0)>=(cg|0)){break}if((a[b4+((c[ch>>2]|0)+ci|0)|0]|0)==(a[cd+ci|0]|0)){ci=ci+1|0}else{break L6096}}if((a[cd+ci|0]|0)==0){break L6094}}}while(0);cd=c[cF>>2]|0;if((cd|0)==0){break L6091}else{cF=cd}}if((a[cF+8|0]&1)!=0){break}if((c[cF+16>>2]|0)==3){cI=b4;aP=4602}}}while(0);L6105:do{if((aP|0)==4602){aP=0;if((b6|0)>=(bW|0)){break}L6108:do{if(!b7){ch=c[aR+(b6*40&-1)+36>>2]|0;ce=aR+(b6*40&-1)+32|0;b5=0;while(1){if((b5|0)>=(ch|0)){break}if((a[cI+((c[ce>>2]|0)+b5|0)|0]|0)==(a[b5+103664|0]|0)){b5=b5+1|0}else{break L6108}}if((b5|0)==1){break L6105}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[ab>>2]|0)==3){break}c[13898]=b6}}while(0);a[bG]=1;if(bH){co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}a[as]=0;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}}while(0);if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break L5956}ca=c[10036]|0;b6=0;b7=0;b4=b$;while(1){if((a[b6+196448|0]|0)==(a[ca+(b6+b4|0)|0]|0)){cJ=b4;cK=b7}else{if((b6|0)!=1){b_=b$;aP=4648;break L5956}cJ=b4-1|0;cK=1}cF=b6+1|0;if((cF|0)<(cK+bY|0)){b6=cF;b7=cK;b4=cJ}else{break}}if((cK|0)==0){if(!((b6|0)==0|(b6|0)==4)){b_=b$;aP=4648;break L5956}}if(bQ){cb=bV;aP=6082;break L5888}if(!((a[32936]&1)==0|bC)){aP=4622;break L5888}b4=bV+1|0;c[13898]=b4;b7=c[aR+(b4*40&-1)+36>>2]|0;ca=c[aR+(b4*40&-1)+32>>2]|0;cF=(a[aR+(b4*40&-1)|0]&1)==0;b4=(b7|0)>0;ce=c[10036]|0;ch=30672;cd=116448;L6132:while(1){L6134:do{if(!cF){if(b4){cf=0;cg=0;b0=ca;while(1){cL=a[cd+cf|0]|0;if(cL<<24>>24==(a[ce+(cf+b0|0)|0]|0)){cM=b0;cN=cg}else{if(cL<<24>>24!=36){break L6134}cM=b0-1|0;cN=1}cO=cf+1|0;if((cO|0)<(cN+b7|0)){cf=cO;cg=cN;b0=cM}else{break}}if((cN|0)==0){cP=cO}else{cQ=ch;break L6132}}else{cP=0}b0=a[cd+cP|0]|0;if((b0<<24>>24|0)==36|(b0<<24>>24|0)==0){cQ=ch;break L6132}}}while(0);b0=ch+8|0;cg=c[b0>>2]|0;if((cg|0)==0){cQ=b0;break}else{ch=b0;cd=cg}}cd=c[cQ+4>>2]|0;cR=bV+2|0;c[13898]=cR;if((cd|0)==-1){aP=4634;break L5888}c[aG>>2]=cd;if((cd|0)==345){hE(bD);cS=c[aG>>2]|0}else{cS=cd}L6151:do{if((cS|0)==400|(cS|0)==416|(cS|0)==432){cd=c[13898]|0;if((c[8272]|0)<=(cd|0)){break}ch=c[1054]|0;if((a[ch+(cd*40&-1)|0]&1)==0){break}b7=c[ch+(cd*40&-1)+36>>2]|0;ce=ch+(cd*40&-1)+32|0;ch=c[10036]|0;ca=0;while(1){if((ca|0)>=(b7|0)){break}if((a[ch+((c[ce>>2]|0)+ca|0)|0]|0)==(a[ca+224816|0]|0)){ca=ca+1|0}else{break L6151}}if((ca|0)!=8){break}c[13898]=cd+1;a[bF]=1}}while(0);if((c[bE>>2]|0)!=0){co=bU;cp=bT;cq=bS;cr=bR;cs=1;ct=bO;cu=bN;cv=bL;break L5956}ce=c[aG>>2]|0;if(!((ce&4|0)!=0|(ce|0)==368)){co=bU;cp=bT;cq=bS;cr=bR;cs=1;ct=bO;cu=bN;cv=bL;break L5956}uh(c[13898]|0,131840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[aG>>2]=18;co=bU;cp=bT;cq=bS;cr=bR;cs=1;ct=bO;cu=bN;cv=bL;break L5956}}while(0);if(bN){cb=bV;aP=6081;break L5888}if(!((a[32936]&1)==0|bC)){aP=4521;break L5888}cT=bV+1|0;c[13898]=cT;b$=c[aR+(cT*40&-1)+36>>2]|0;ce=c[aR+(cT*40&-1)+32>>2]|0;ch=(a[aR+(cT*40&-1)|0]&1)==0;b7=(b$|0)>0;b4=c[10036]|0;L6166:do{if(ch){aP=6064}else{L6168:do{if(b7){cF=0;while(1){if((a[cF+122952|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){break L6168}b6=cF+1|0;if((b6|0)<(b$|0)){cF=b6}else{cU=b6;aP=4526;break}}}else{cU=0;aP=4526}}while(0);if((aP|0)==4526){aP=0;cF=a[cU+122952|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31768;break}}if(ch){aP=6064;break}L6176:do{if(b7){cF=0;while(1){if((a[cF+121816|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){break L6176}cd=cF+1|0;if((cd|0)<(b$|0)){cF=cd}else{cW=cd;aP=6053;break}}}else{cW=0;aP=6053}}while(0);if((aP|0)==6053){aP=0;cF=a[cW+121816|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31776;break}}if(ch){aP=6064;break}L6184:do{if(b7){cF=0;while(1){if((a[cF+119872|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){break L6184}cd=cF+1|0;if((cd|0)<(b$|0)){cF=cd}else{cX=cd;aP=6058;break}}}else{cX=0;aP=6058}}while(0);if((aP|0)==6058){aP=0;cF=a[cX+119872|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31784;break}}if(ch){aP=6064;break}if(b7){cF=0;while(1){if((a[cF+116712|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){aP=6064;break L6166}cd=cF+1|0;if((cd|0)<(b$|0)){cF=cd}else{cY=cd;break}}}else{cY=0}cF=a[cY+116712|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31792}else{aP=6064}}}while(0);if((aP|0)==6064){aP=0;cV=31800}b$=c[cV+4>>2]|0;if((b$|0)==0){c[200]=2;c[144]=1;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else if((b$|0)==1){c[200]=6;c[144]=5;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else if((b$|0)==2){c[200]=2;c[144]=5;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else if((b$|0)==3){c[200]=6;c[144]=1;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else{aP=4533;break L5888}}}while(0);L6205:do{if((aP|0)==4648){aP=0;aR=c[aG>>2]|0;if((aR|0)==252){L6209:do{if((bY|0)>0&(bX^1)){bZ=c[10036]|0;aE=0;b$=0;ce=b_;while(1){if((a[aE+130576|0]|0)==(a[bZ+(aE+ce|0)|0]|0)){cZ=ce;c_=b$}else{if((aE|0)!=7){break L6209}cZ=ce-1|0;c_=1}b4=aE+1|0;if((b4|0)<(c_+bY|0)){aE=b4;b$=c_;ce=cZ}else{break}}if((c_|0)==0){if(!((aE|0)==6|(aE|0)==11)){break}}c[aS>>2]=3;ce=(c[13898]|0)+1|0;c[13898]=ce;b$=c[1054]|0;L6221:do{if((a[b$+(ce*40&-1)|0]&1)!=0){bZ=c[10810]|0;if((bZ|0)==0){break L6209}b4=(c[8272]|0)>(ce|0);b7=b$+(ce*40&-1)+36|0;ch=b$+(ce*40&-1)+32|0;cF=c[10036]|0;cd=bZ;L6224:while(1){ca=c[cd+4>>2]|0;L6226:do{if(b4){b6=c[b7>>2]|0;cg=0;while(1){if((cg|0)>=(b6|0)){break}if((a[cF+((c[ch>>2]|0)+cg|0)|0]|0)==(a[ca+cg|0]|0)){cg=cg+1|0}else{break L6226}}if((a[ca+cg|0]|0)==0){aP=4665;break L6224}}}while(0);ca=c[cd>>2]|0;if((ca|0)==0){c$=bZ;break}else{cd=ca}}do{if((aP|0)==4665){aP=0;if((a[cd+8|0]&1)!=0){c$=bZ;break}if((c[cd+16>>2]|0)==1){break L6221}else{c$=bZ}}}while(0);L6236:while(1){bZ=c[c$+4>>2]|0;L6238:do{if(b4){cd=c[b7>>2]|0;ca=0;while(1){if((ca|0)>=(cd|0)){break}if((a[cF+((c[ch>>2]|0)+ca|0)|0]|0)==(a[bZ+ca|0]|0)){ca=ca+1|0}else{break L6238}}if((a[bZ+ca|0]|0)==0){break L6236}}}while(0);bZ=c[c$>>2]|0;if((bZ|0)==0){break L6209}else{c$=bZ}}if((a[c$+8|0]&1)!=0){break L6209}if((c[c$+16>>2]|0)!=2){break L6209}}}while(0);ce=is(f)|0;b$=c[ce>>2]|0;if((b$|0)==1){c0=+(c[ce+8>>2]|0)}else if((b$|0)==2){c0=+h[ce+8>>3]}else if((b$|0)==3){c0=+uz(c[ce+8>>2]|0,0)}else{aP=4680;break L5888}if((c[L>>2]|0)==3){uu(c[M>>2]|0);c[L>>2]=1}h[a2>>3]=c0}}while(0);c1=c[aG>>2]|0}else{c1=aR}do{if((c1|0)==225){ce=c[13898]|0;do{if(!bR){c[a3>>2]=-1;c[a4>>2]=0;c[a8>>2]=c[12872];c[a8+4>>2]=c[12873];c[a8+8>>2]=c[12874];c[a8+12>>2]=c[12875];c[a8+16>>2]=c[12876];c[a8+20>>2]=c[12877];c[a8+24>>2]=c[12878];c[a8+28>>2]=c[12879];c[a8+32>>2]=c[12880];c[a8+36>>2]=c[12881];c[a8+40>>2]=c[12882];c[a8+44>>2]=c[12883];c[a8+48>>2]=c[12884];c[a8+52>>2]=c[12885];c[aS>>2]=1;h[a2>>3]=0.0;c[a5>>2]=0;h[bk>>3]=15.0;h[bl>>3]=90.0;c[bm>>2]=0;if((a[30080]&1)!=0){lK(a7,bn);break}b$=c[8798]|0;aE=(b$|0)>0;ch=bn;L6265:while(1){cF=43264;while(1){c2=c[cF>>2]|0;if((c2|0)==0){break}if((c[c2+4>>2]|0)==(ch|0)){break L6265}else{cF=c2|0}}c3=ch-1|0;if(!((ch|0)>(b$|0)&aE)){aP=4699;break}ch=((c3|0)%(b$|0)&-1)+1|0}if((aP|0)==4699){aP=0;c[bp>>2]=c3;c[bq>>2]=1;c[br>>2]=c3;c[bs>>2]=c3;break}b$=c2+8|0;c[a8>>2]=c[b$>>2];c[a8+4>>2]=c[b$+4>>2];c[a8+8>>2]=c[b$+8>>2];c[a8+12>>2]=c[b$+12>>2];c[a8+16>>2]=c[b$+16>>2];c[a8+20>>2]=c[b$+20>>2];c[a8+24>>2]=c[b$+24>>2];c[a8+28>>2]=c[b$+28>>2];c[a8+32>>2]=c[b$+32>>2];c[a8+36>>2]=c[b$+36>>2];c[a8+40>>2]=c[b$+40>>2];c[a8+44>>2]=c[b$+44>>2];c[a8+48>>2]=c[b$+48>>2];c[a8+52>>2]=c[b$+52>>2];c[bo>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bp>>2]=ch;a[bt]=0;break}if((a[bt]&1)!=0){break}c[bq>>2]=1;c[br>>2]=c[bp>>2]}}while(0);hL(aV,1);b$=c[13898]|0;if((ce|0)==(b$|0)){c4=c[aG>>2]|0;break}else{if(bR){cb=b$;aP=6076;break L5888}else{co=bU;cp=bT;cq=bS;cr=1;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}}else{c4=c1}}while(0);aR=c[13898]|0;do{if((c4|0)==489){if(bU){c5=aR}else{c[bu>>2]=c[12406];c5=c[13898]|0}b$=c[1054]|0;aE=c[b$+(c5*40&-1)+36>>2]|0;L6289:do{if((a[b$+(c5*40&-1)|0]&1)!=0&(aE|0)>0){cF=c[10036]|0;b7=0;b4=0;bZ=c[b$+(c5*40&-1)+32>>2]|0;while(1){if((a[b7+211736|0]|0)==(a[cF+(b7+bZ|0)|0]|0)){c6=bZ;c7=b4}else{if((b7|0)!=4){c8=c5;break L6289}c6=bZ-1|0;c7=1}cd=b7+1|0;if((cd|0)<(c7+aE|0)){b7=cd;b4=c7;bZ=c6}else{break}}if((c7|0)==0){if(!((b7|0)==3|(b7|0)==5)){c8=c5;break}}c9=c5+1|0;c[13898]=c9;bZ=(c[8272]|0)>(c9|0);if(!bZ){aP=6074;break L5888}L6302:do{if((a[b$+(c9*40&-1)|0]&1)==0){aP=4722}else{b4=c[b$+(c9*40&-1)+36>>2]|0;cF=b$+(c9*40&-1)+32|0;ch=c[10036]|0;cd=0;while(1){if((cd|0)>=(b4|0)){aP=4719;break}if((a[ch+((c[cF>>2]|0)+cd|0)|0]|0)==(a[cd+150688|0]|0)){cd=cd+1|0}else{break}}do{if((aP|0)==4719){aP=0;if((cd|0)!=2){break}c[bu>>2]=0;break L6302}}while(0);if(bZ){aP=4722}else{aP=6071;break L5888}}}while(0);L6311:do{if((aP|0)==4722){aP=0;L6313:do{if((a[b$+(c9*40&-1)|0]&1)!=0){b7=c[b$+(c9*40&-1)+36>>2]|0;cd=b$+(c9*40&-1)+32|0;cF=c[10036]|0;ch=0;while(1){if((ch|0)>=(b7|0)){break}if((a[cF+((c[cd>>2]|0)+ch|0)|0]|0)==(a[ch+211336|0]|0)){ch=ch+1|0}else{break L6313}}if((ch|0)!=2){break}c[bu>>2]=1;break L6311}}while(0);if(!bZ){aP=6072;break L5888}if((a[b$+(c9*40&-1)|0]&1)==0){aP=6073;break L5888}cd=c[b$+(c9*40&-1)+36>>2]|0;cF=b$+(c9*40&-1)+32|0;b7=c[10036]|0;ca=0;while(1){if((ca|0)>=(cd|0)){break}if((a[b7+((c[cF>>2]|0)+ca|0)|0]|0)==(a[ca+210848|0]|0)){ca=ca+1|0}else{aP=6069;break L5888}}if((ca|0)!=2){aP=6070;break L5888}c[bu>>2]=2}}while(0);bZ=(c[13898]|0)+1|0;c[13898]=bZ;c8=bZ}else{c8=c5}}while(0);if((aR|0)==(c8|0)){da=c[aG>>2]|0;break}else{if(bU){cb=c8;aP=6079;break L5888}else{co=1;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}}else{da=c4}}while(0);do{if((da|0)==368){b$=c[bv>>2]|0;if((b$|0)==0){uE(E|0,0,28);aE=ut(192)|0;if((aE|0)==0){gk();ce=ut(192)|0;if((ce|0)==0){aP=4744;break L5888}else{dd=ce}}else{dd=aE}c[dd>>2]=0;c[dd+4>>2]=-1;c[dd+72>>2]=0;c[dd+88>>2]=0;uE(dd+8|0,0,60);c[dd+96>>2]=1;c[dd+144>>2]=4;c[dd+148>>2]=4;c[dd+152>>2]=4;aE=dd+156|0;c[aE>>2]=c[E>>2];c[aE+4>>2]=c[E+4>>2];c[aE+8>>2]=c[E+8>>2];c[aE+12>>2]=c[E+12>>2];c[aE+16>>2]=c[E+16>>2];c[aE+20>>2]=c[E+20>>2];c[aE+24>>2]=c[E+24>>2];a[dd+184|0]=0;c[bv>>2]=dd;c[dd+48>>2]=1;c[(c[bv>>2]|0)+56>>2]=99;de=c[bv>>2]|0}else{de=b$}jw(de);b$=c[13898]|0;if((aR|0)==(b$|0)){break}if(bT){cb=b$;aP=6080;break L5888}else{co=bU;cp=1;cq=bS;cr=bR;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}else{uE(O|0,0,56);h[U>>3]=1.0;h[V>>3]=-2.0;c[Q>>2]=aw;c[W>>2]=av;do{if((a[30080]&1)==0){b$=c[8798]|0;aE=(b$|0)>0;ce=bn;L6346:while(1){bZ=43264;while(1){df=c[bZ>>2]|0;if((df|0)==0){break}if((c[df+4>>2]|0)==(ce|0)){break L6346}else{bZ=df|0}}dg=ce-1|0;if(!((ce|0)>(b$|0)&aE)){aP=4774;break}ce=((dg|0)%(b$|0)&-1)+1|0}if((aP|0)==4774){aP=0;c[Q>>2]=dg;c[Y>>2]=1;c[$>>2]=dg;c[W>>2]=dg;break}b$=df+8|0;c[O>>2]=c[b$>>2];c[O+4>>2]=c[b$+4>>2];c[O+8>>2]=c[b$+8>>2];c[O+12>>2]=c[b$+12>>2];c[O+16>>2]=c[b$+16>>2];c[O+20>>2]=c[b$+20>>2];c[O+24>>2]=c[b$+24>>2];c[O+28>>2]=c[b$+28>>2];c[O+32>>2]=c[b$+32>>2];c[O+36>>2]=c[b$+36>>2];c[O+40>>2]=c[b$+40>>2];c[O+44>>2]=c[b$+44>>2];c[O+48>>2]=c[b$+48>>2];c[O+52>>2]=c[b$+52>>2];c[X>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[Q>>2]=ce;a[aa]=0;break}if((a[aa]&1)!=0){break}c[Y>>2]=1;c[$>>2]=c[Q>>2]}else{b$=43280;while(1){dh=c[b$>>2]|0;if((dh|0)==0){break}if((c[dh+4>>2]|0)==(bn|0)){aP=4751;break}else{b$=dh|0}}if((aP|0)==4751){aP=0;b$=dh+8|0;c[O>>2]=c[b$>>2];c[O+4>>2]=c[b$+4>>2];c[O+8>>2]=c[b$+8>>2];c[O+12>>2]=c[b$+12>>2];c[O+16>>2]=c[b$+16>>2];c[O+20>>2]=c[b$+20>>2];c[O+24>>2]=c[b$+24>>2];c[O+28>>2]=c[b$+28>>2];c[O+32>>2]=c[b$+32>>2];c[O+36>>2]=c[b$+36>>2];c[O+40>>2]=c[b$+40>>2];c[O+44>>2]=c[b$+44>>2];c[O+48>>2]=c[b$+48>>2];c[O+52>>2]=c[b$+52>>2];c[X>>2]=0;if((a[aa]&1)!=0){break}c[Y>>2]=1;c[$>>2]=c[Q>>2];break}b$=c[8798]|0;ce=(b$|0)>0;aE=bn;L6367:while(1){bZ=43264;while(1){di=c[bZ>>2]|0;if((di|0)==0){break}if((c[di+4>>2]|0)==(aE|0)){break L6367}else{bZ=di|0}}dj=aE-1|0;if(!((aE|0)>(b$|0)&ce)){aP=4763;break}aE=((dj|0)%(b$|0)&-1)+1|0}if((aP|0)==4763){aP=0;c[Q>>2]=dj;c[Y>>2]=1;c[$>>2]=dj;c[W>>2]=dj;break}b$=di+8|0;c[O>>2]=c[b$>>2];c[O+4>>2]=c[b$+4>>2];c[O+8>>2]=c[b$+8>>2];c[O+12>>2]=c[b$+12>>2];c[O+16>>2]=c[b$+16>>2];c[O+20>>2]=c[b$+20>>2];c[O+24>>2]=c[b$+24>>2];c[O+28>>2]=c[b$+28>>2];c[O+32>>2]=c[b$+32>>2];c[O+36>>2]=c[b$+36>>2];c[O+40>>2]=c[b$+40>>2];c[O+44>>2]=c[b$+44>>2];c[O+48>>2]=c[b$+48>>2];c[O+52>>2]=c[b$+52>>2];c[X>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[Q>>2]=aE;a[aa]=0;break}if((a[aa]&1)!=0){break}c[Y>>2]=1;c[$>>2]=c[Q>>2]}}while(0);b$=c[aG>>2]|0;if((b$|0)==474){c[W>>2]=c[14067];dk=c[aG>>2]|0}else{dk=b$}b$=(dk&2|0)!=0;hH(q,1,b$);b$=c[13898]|0;if((aR|0)==(b$|0)){break}if(bR){cb=b$;aP=6083;break L5888}c[bB>>2]=c[O>>2];c[bB+4>>2]=c[O+4>>2];c[bB+8>>2]=c[O+8>>2];c[bB+12>>2]=c[O+12>>2];c[bB+16>>2]=c[O+16>>2];c[bB+20>>2]=c[O+20>>2];c[bB+24>>2]=c[O+24>>2];c[bB+28>>2]=c[O+28>>2];c[bB+32>>2]=c[O+32>>2];c[bB+36>>2]=c[O+36>>2];c[bB+40>>2]=c[O+40>>2];c[bB+44>>2]=c[O+44>>2];c[bB+48>>2]=c[O+48>>2];c[bB+52>>2]=c[O+52>>2];co=bU;cp=bT;cq=bS;cr=1;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}while(0);if((c[aG>>2]&8|0)==0){b1=bS;b2=bR;b3=bO;break L5954}b$=c[1054]|0;ce=a[b$+(aR*40&-1)|0]|0;L6389:do{if((c[8272]|0)>(aR|0)){if((ce&1)==0){aP=4787;break}bZ=c[b$+(aR*40&-1)+36>>2]|0;ca=b$+(aR*40&-1)+32|0;cF=c[10036]|0;b7=0;while(1){if((b7|0)>=(bZ|0)){break}if((a[cF+((c[ca>>2]|0)+b7|0)|0]|0)==(a[b7+116360|0]|0)){b7=b7+1|0}else{aP=4787;break L6389}}if((b7|0)==2){aP=4795}else{aP=4787}}else{aP=4787}}while(0);L6396:do{if((aP|0)==4787){aP=0;ca=c[b$+(aR*40&-1)+36>>2]|0;if(!((ce&1)!=0&(ca|0)>0)){dl=bS;break}cF=c[10036]|0;bZ=0;cd=0;b4=c[b$+(aR*40&-1)+32>>2]|0;while(1){if((a[bZ+121984|0]|0)==(a[cF+(bZ+b4|0)|0]|0)){dm=b4;dn=cd}else{if((bZ|0)!=4){dl=bS;break L6396}dm=b4-1|0;dn=1}cg=bZ+1|0;if((cg|0)<(dn+ca|0)){bZ=cg;cd=dn;b4=dm}else{break}}if((dn|0)!=0){aP=4795;break}if((bZ|0)==3|(bZ|0)==9){aP=4795}else{dl=bS}}}while(0);do{if((aP|0)==4795){aP=0;hJ(by,c[12372]|0,c[12373]|0,at,49504);if((c[aG>>2]|0)!=345){dl=1;break}if((c[bz>>2]|0)!=0){dl=1;break}c[bz>>2]=1;dl=1}}while(0);b$=c[13898]|0;ce=c[1054]|0;b4=a[ce+(b$*40&-1)|0]|0;L6412:do{if((c[8272]|0)>(b$|0)){if((b4&1)==0){aP=4804;break}cd=c[ce+(b$*40&-1)+36>>2]|0;ca=ce+(b$*40&-1)+32|0;cF=c[10036]|0;b7=0;while(1){if((b7|0)>=(cd|0)){break}if((a[cF+((c[ca>>2]|0)+b7|0)|0]|0)==(a[b7+179168|0]|0)){b7=b7+1|0}else{aP=4804;break L6412}}if((b7|0)==2){aP=4812}else{aP=4804}}else{aP=4804}}while(0);L6419:do{if((aP|0)==4804){aP=0;ca=c[ce+(b$*40&-1)+36>>2]|0;if(!((b4&1)!=0&(ca|0)>0)){dq=bR;dr=b$;break}cF=c[10036]|0;cd=0;bZ=0;cg=c[ce+(b$*40&-1)+32>>2]|0;while(1){if((a[cd+178592|0]|0)==(a[cF+(cd+cg|0)|0]|0)){ds=cg;dt=bZ}else{if((cd|0)!=5){dq=bR;dr=b$;break L6419}ds=cg-1|0;dt=1}b6=cd+1|0;if((b6|0)<(dt+ca|0)){cd=b6;bZ=dt;cg=ds}else{break}}if((dt|0)!=0){aP=4812;break}if((cd|0)==4|(cd|0)==9){aP=4812}else{dq=bR;dr=b$}}}while(0);if((aP|0)==4812){aP=0;hH(r,0,0);c[bw>>2]=c[N>>2];c[bw+4>>2]=c[N+4>>2];c[bw+8>>2]=c[N+8>>2];c[bw+12>>2]=c[N+12>>2];a[bx]=1;dq=1;dr=c[13898]|0}if((aR|0)==(dr|0)){b1=dl;b2=dq;b3=bO;break L5954}else{co=bU;cp=bT;cq=dl;cr=dq;cs=bQ;ct=bO;cu=bN;cv=bL}}}while(0);bY=c[13898]|0;bX=c[8272]|0;if((bY|0)<(bX|0)){bL=cv;bN=cu;bO=ct;bQ=cs;bR=cr;bS=cq;bT=cp;bU=co;bV=bY;bW=bX}else{b1=cq;b2=cr;b3=ct;break}}bW=bb+21|0;a[bW]=0;if(b3){du=as;dv=b2;dw=b1}else{dx=b2;dy=b1;dz=bW;aP=4816}}else{bW=bb+21|0;a[bW]=0;dx=0;dy=0;dz=bW;aP=4816}do{if((aP|0)==4816){aP=0;a[bb+20|0]=1;if((c[9056]|0)!=1){if((as|0)==0){du=0;dv=dx;dw=dy;break}a[as]=0;du=as;dv=dx;dw=dy;break}bW=bb+16|0;bU=c[1054]|0;bT=(c[bU+(be*40&-1)+36>>2]|0)+(c[bU+(be*40&-1)+32>>2]|0)|0;bS=db(c[bW>>2]|0,(bT+1|0)-(c[bU+(aQ*40&-1)+32>>2]|0)|0,116456)|0;c[bW>>2]=bS;bU=c[(c[1054]|0)+(aQ*40&-1)+32>>2]|0;L6441:do{if((bU|0)<(bT|0)){bR=bU;bQ=bS;while(1){bO=a[(c[10036]|0)+bR|0]|0;if(bO<<24>>24==0){dA=bQ;break L6441}bN=bQ+1|0;a[bQ]=bO;bO=bR+1|0;if((bO|0)<(bT|0)){bR=bO;bQ=bN}else{dA=bN;break}}}else{dA=bS}}while(0);a[dA]=0;if(bd){dB=c[bW>>2]|0}else{dB=as}a[dz]=1;du=dB;dv=dx;dw=dy}}while(0);bS=bb+12|0;bT=c[bS>>2]|0;do{if((bT|0)==225){if(dv){dC=bb+88|0}else{bU=bb+80|0;bQ=bb+88|0;bR=aw+1|0;do{if((a[30080]&1)==0){aR=bQ|0;bN=c[aR>>2]|0;bO=c[8798]|0;bL=(bO|0)>0;bx=bR;L6458:while(1){bw=43264;while(1){dD=c[bw>>2]|0;if((dD|0)==0){break}if((c[dD+4>>2]|0)==(bx|0)){break L6458}else{bw=dD|0}}dE=bx-1|0;if(!((bx|0)>(bO|0)&bL)){aP=4840;break}bx=((dE|0)%(bO|0)&-1)+1|0}if((aP|0)==4840){aP=0;c[bb+92>>2]=dE;c[bb+128>>2]=1;c[bb+132>>2]=dE;c[bb+96>>2]=dE;break}bO=bQ;bL=dD+8|0;c[bO>>2]=c[bL>>2];c[bO+4>>2]=c[bL+4>>2];c[bO+8>>2]=c[bL+8>>2];c[bO+12>>2]=c[bL+12>>2];c[bO+16>>2]=c[bL+16>>2];c[bO+20>>2]=c[bL+20>>2];c[bO+24>>2]=c[bL+24>>2];c[bO+28>>2]=c[bL+28>>2];c[bO+32>>2]=c[bL+32>>2];c[bO+36>>2]=c[bL+36>>2];c[bO+40>>2]=c[bL+40>>2];c[bO+44>>2]=c[bL+44>>2];c[bO+48>>2]=c[bL+48>>2];c[bO+52>>2]=c[bL+52>>2];c[aR>>2]=bN;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bb+92>>2]=bx;a[bb+120|0]=0;break}if((a[bb+120|0]&1)!=0){break}c[bb+128>>2]=1;c[bb+132>>2]=c[bb+92>>2]}else{lK(bQ,bR)}}while(0);hL(bU,1);dC=bQ}bR=bb+24|0;bW=dC;c[bR>>2]=c[bW>>2];c[bR+4>>2]=c[bW+4>>2];c[bR+8>>2]=c[bW+8>>2];c[bR+12>>2]=c[bW+12>>2];c[bR+16>>2]=c[bW+16>>2];c[bR+20>>2]=c[bW+20>>2];c[bR+24>>2]=c[bW+24>>2];c[bR+28>>2]=c[bW+28>>2];c[bR+32>>2]=c[bW+32>>2];c[bR+36>>2]=c[bW+36>>2];c[bR+40>>2]=c[bW+40>>2];c[bR+44>>2]=c[bW+44>>2];c[bR+48>>2]=c[bW+48>>2];c[bR+52>>2]=c[bW+52>>2];dF=1}else{if(dv){dF=1;break}bW=bb+24|0;bR=bb+28|0;c[bR>>2]=aw;h[bb+40>>3]=1.0;bL=bb+32|0;c[bL>>2]=av;h[bb+48>>3]=+h[3817];bO=bb+56|0;a[bO]=0;bw=aw+1|0;do{if((a[30080]&1)==0){cd=bW|0;bz=c[cd>>2]|0;aG=c[8798]|0;by=(aG|0)>0;bB=bw;L6479:while(1){bn=43264;while(1){dG=c[bn>>2]|0;if((dG|0)==0){break}if((c[dG+4>>2]|0)==(bB|0)){break L6479}else{bn=dG|0}}dH=bB-1|0;if(!((bB|0)>(aG|0)&by)){aP=4856;break}bB=((dH|0)%(aG|0)&-1)+1|0}if((aP|0)==4856){aP=0;c[bR>>2]=dH;c[bb+64>>2]=1;c[bb+68>>2]=dH;c[bL>>2]=dH;dI=bT;break}aG=bW;by=dG+8|0;c[aG>>2]=c[by>>2];c[aG+4>>2]=c[by+4>>2];c[aG+8>>2]=c[by+8>>2];c[aG+12>>2]=c[by+12>>2];c[aG+16>>2]=c[by+16>>2];c[aG+20>>2]=c[by+20>>2];c[aG+24>>2]=c[by+24>>2];c[aG+28>>2]=c[by+28>>2];c[aG+32>>2]=c[by+32>>2];c[aG+36>>2]=c[by+36>>2];c[aG+40>>2]=c[by+40>>2];c[aG+44>>2]=c[by+44>>2];c[aG+48>>2]=c[by+48>>2];c[aG+52>>2]=c[by+52>>2];c[cd>>2]=bz;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bR>>2]=bB;a[bO]=0;dI=bT;break}if((a[bO]&1)!=0){dI=bT;break}c[bb+64>>2]=1;c[bb+68>>2]=c[bR>>2];dI=bT}else{lK(bW,bw);dI=c[bS>>2]|0}}while(0);if((dI|0)==474){c[bL>>2]=c[14067]}bw=(dI&2|0)!=0;hH(bW,1,bw);dF=0}}while(0);bT=c[bS>>2]|0;bw=(bT&2|0)==0;if(!bw){c[bb+24>>2]=1}bR=bb+8|0;do{if(!((c[bR>>2]|0)!=0|bw)){bO=bb+48|0;if(+h[bO>>3]!=-3.0){break}h[bO>>3]=1.0}}while(0);if((a[30528]&1)!=0){if(!((bT|0)==1|(bT|0)==18|(bT|0)==33|(bT|0)==51|(bT|0)==64|(bT|0)==225|(bT|0)==345|(bT|0)==368|(bT|0)==457|(bT|0)==102|(bT|0)==295)){aP=4867;break L5888}}do{if((bT&8|0)==0){dJ=at;dK=bT}else{if(!dw){hJ(bb+192|0,c[12372]|0,c[12373]|0,at,49504)}bw=bb+192|0;bO=c[bw>>2]|0;if((bO|0)==2|(bO|0)==5){dL=(c[bb+200>>2]|0)+1|0}else{dL=at}bQ=c[bS>>2]|0;if((bQ|0)!=345){dJ=dL;dK=bQ;break}if((bO|0)!=0){dJ=dL;dK=345;break}c[bw>>2]=1;dJ=dL;dK=345}}while(0);bT=bb+304|0;c[bT>>2]=c[200];bw=bb+308|0;c[bw>>2]=c[144];if((dK|0)==368){bO=bb+224|0;bQ=c[bO>>2]|0;if((bQ|0)==0){uE(E|0,0,28);bU=ut(192)|0;if((bU|0)==0){gk();by=ut(192)|0;if((by|0)==0){aP=4880;break L5888}else{dM=by}}else{dM=bU}c[dM>>2]=0;c[dM+4>>2]=-1;c[dM+72>>2]=0;c[dM+88>>2]=0;uE(dM+8|0,0,60);c[dM+96>>2]=1;c[dM+144>>2]=4;c[dM+148>>2]=4;c[dM+152>>2]=4;bU=dM+156|0;c[bU>>2]=c[E>>2];c[bU+4>>2]=c[E+4>>2];c[bU+8>>2]=c[E+8>>2];c[bU+12>>2]=c[E+12>>2];c[bU+16>>2]=c[E+16>>2];c[bU+20>>2]=c[E+20>>2];c[bU+24>>2]=c[E+24>>2];a[dM+184|0]=0;c[bO>>2]=dM;c[dM+48>>2]=1;c[(c[bO>>2]|0)+56>>2]=99;dN=c[bO>>2]|0}else{dN=bQ}c[dN+8>>2]=(c[200]|0)==6&1;c[(c[bO>>2]|0)+12>>2]=(c[144]|0)==5&1;bQ=bb+64|0;bU=c[bO>>2]|0;bO=bQ;by=bU+72|0;c[bO>>2]=c[by>>2];c[bO+4>>2]=c[by+4>>2];c[bO+8>>2]=c[by+8>>2];c[bO+12>>2]=c[by+12>>2];by=bU+72|0;if((c[by>>2]|0)==7){c[bb+28>>2]=-6}do{if((c[bU+88>>2]|0)>0){aG=c[by>>2]|0;if((aG|0)==3){if(+h[bU+80>>3]<0.0){break}}else if((aG|0)==6|(aG|0)==7){break}aG=bU+128|0;bx=c[aG>>2]|0;do{if((bx|0)==3){if(+h[bU+136>>3]>=0.0){break}bN=aG;c[bO>>2]=c[bN>>2];c[bO+4>>2]=c[bN+4>>2];c[bO+8>>2]=c[bN+8>>2];c[bO+12>>2]=c[bN+12>>2];dO=c[bU+128>>2]|0;aP=4890}else{dO=bx;aP=4890}}while(0);do{if((aP|0)==4890){aP=0;if((dO|0)!=6){break}c[bQ>>2]=6}}while(0);if((c[bU+92>>2]|0)!=-6){break}c[bb+28>>2]=-6}}while(0);dP=c[bS>>2]|0}else{dP=dK}do{if((dP|0)==474){bU=bb+224|0;if((c[bU>>2]|0)!=0){dQ=474;dR=ap;break}uE(E|0,0,28);bQ=ut(192)|0;if((bQ|0)==0){gk();bO=ut(192)|0;if((bO|0)==0){aP=4899;break L5888}else{dS=bO}}else{dS=bQ}c[dS>>2]=0;c[dS+4>>2]=-1;c[dS+72>>2]=0;c[dS+88>>2]=0;uE(dS+8|0,0,60);c[dS+96>>2]=1;c[dS+144>>2]=4;c[dS+148>>2]=4;c[dS+152>>2]=4;bQ=dS+156|0;c[bQ>>2]=c[E>>2];c[bQ+4>>2]=c[E+4>>2];c[bQ+8>>2]=c[E+8>>2];c[bQ+12>>2]=c[E+12>>2];c[bQ+16>>2]=c[E+16>>2];c[bQ+20>>2]=c[E+20>>2];c[bQ+24>>2]=c[E+24>>2];a[dS+184|0]=0;c[bU>>2]=dS;dU=c[bS>>2]|0;aP=4901}else{dU=dP;aP=4901}}while(0);do{if((aP|0)==4901){aP=0;if((dU|0)==392){if((a[64788+((c[200]|0)*688&-1)|0]&1)!=0){aP=4903;break L5888}if(((c[9670]|0)-1|0)>>>0<2){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){aP=4906;break L5888}}bU=ap+1|0;bQ=bb+280|0;c[bQ>>2]=bU;if((bU|0)==0){bO=ut(248)|0;if((bO|0)==0){gk();by=ut(248)|0;if((by|0)==0){aP=4910;break L5888}else{dV=by}}else{dV=bO}bO=dV;by=bb+276|0;c[by>>2]=bO;bx=c[9666]|0;aG=c[3568]|0;if((aG|0)!=0){uu(aG)}c[3568]=0;c[dV>>2]=c[9670];c[dV+4>>2]=c[9671];c[dV+8>>2]=c[9672];c[dV+12>>2]=c[9673];c[dV+16>>2]=c[9674];c[dV+20>>2]=c[9675];c[dV+24>>2]=c[9676];c[dV+28>>2]=c[9677];c[dV+32>>2]=c[9678];c[dV+36>>2]=c[9679];c[dV+40>>2]=c[9680];c[dV+44>>2]=c[9681];c[dV+48>>2]=c[9682];c[dV+52>>2]=c[9683];uE(dV+56|0,0,192);c[9682]=bO;c[dV+116>>2]=bx;c[9666]=0;h[(c[by>>2]|0)+16>>3]=aq;c[(c[by>>2]|0)+32>>2]=ao;c[(c[by>>2]|0)+36>>2]=an}else{by=c[9682]|0;c[bb+276>>2]=by;bx=by+8|0;c[bx>>2]=(c[bx>>2]|0)+1}bx=c[bb+276>>2]|0;do{if(!dF){by=c[bx+32>>2]|0;if((by|0)==-5){break}bO=bb+24|0;aG=bO|0;bW=c[aG>>2]|0;bL=c[8798]|0;bN=(bL|0)>0;aR=(c[bQ>>2]|0)+by|0;L6573:while(1){by=43264;while(1){dW=c[by>>2]|0;if((dW|0)==0){break}if((c[dW+4>>2]|0)==(aR|0)){break L6573}else{by=dW|0}}dX=aR-1|0;if(!((aR|0)>(bL|0)&bN)){aP=4928;break}aR=((dX|0)%(bL|0)&-1)+1|0}if((aP|0)==4928){aP=0;c[bb+28>>2]=dX;c[bb+64>>2]=1;c[bb+68>>2]=dX;c[bb+32>>2]=dX;break}bL=bO;bN=dW+8|0;c[bL>>2]=c[bN>>2];c[bL+4>>2]=c[bN+4>>2];c[bL+8>>2]=c[bN+8>>2];c[bL+12>>2]=c[bN+12>>2];c[bL+16>>2]=c[bN+16>>2];c[bL+20>>2]=c[bN+20>>2];c[bL+24>>2]=c[bN+24>>2];c[bL+28>>2]=c[bN+28>>2];c[bL+32>>2]=c[bN+32>>2];c[bL+36>>2]=c[bN+36>>2];c[bL+40>>2]=c[bN+40>>2];c[bL+44>>2]=c[bN+44>>2];c[bL+48>>2]=c[bN+48>>2];c[bL+52>>2]=c[bN+52>>2];c[aG>>2]=bW;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bb+28>>2]=aR;a[bb+56|0]=0;break}if((a[bb+56|0]&1)!=0){break}c[bb+64>>2]=1;c[bb+68>>2]=c[bb+28>>2]}}while(0);bN=c[bx+36>>2]|0;if((bN|0)!=-5){c[bb+200>>2]=(c[bQ>>2]|0)+bN}dY=bU;dZ=c[bS>>2]|0}else{dY=ap;dZ=dU}if((dZ|0)!=400){dQ=dZ;dR=dY;break}a[bb+56|0]=1;dQ=400;dR=dY}}while(0);do{if((c[bR>>2]|0)==1){if((bf|0)<0){c[bR>>2]=4;d_=aw+1|0;d$=(dQ>>>1&1)+av|0;break}bN=c[200]|0;bL=o+(bN<<2)|0;bB=c[bL>>2]|0;do{if((bB&1|0)==0){bz=c[64648+(bN*688&-1)>>2]|0;if((bz|0)==0){break}if((bz&1|0)!=0){h[64664+(bN*688&-1)>>3]=8.988465674311579e+307}if((bz&2|0)==0){break}h[64672+(bN*688&-1)>>3]=-8.988465674311579e+307}}while(0);if((c[64808+(bN*688&-1)>>2]|0)==1&(bf|0)<2){aP=4944;break L5888}bU=c[144]|0;if((c[64808+(bU*688&-1)>>2]|0)==1&(bf|0)<1){aP=4946;break L5888}c[12210]=bN;c[12211]=bU;c[bL>>2]=bB|1;bQ=o+(bU<<2)|0;c[bQ>>2]=c[bQ>>2]|1;aP=4950}else{if(!((a[32936]&1)==0|bd^1)){aP=4950;break}bQ=o+(c[200]<<2)|0;c[bQ>>2]=c[bQ>>2]|2;bQ=o+(c[144]<<2)|0;c[bQ>>2]=c[bQ>>2]|2;aP=4950}}while(0);do{if((aP|0)==4950){aP=0;do{if(bd){d0=aw;d1=av}else{bQ=c[bS>>2]|0;if((bQ|0)==400|(bQ|0)==416|(bQ|0)==432){d0=aw;d1=av;break}d0=aw+1|0;d1=(bQ>>>1&1)+av|0}}while(0);if((c[bR>>2]|0)!=1){d_=d0;d$=d1;break}d2=bb+4|0;bB=c[d2>>2]|0;bL=bb+316|0;do{if((c[bL>>2]|0)==0){bN=c[bb+64>>2]|0;do{if((bN|0)==3){if(+h[bb+72>>3]>=0.0){d3=0;break}d3=1}else{d3=0}}while(0);if(!((c[bb+284>>2]|0)==0&((c[bb+28>>2]|0)==-6|((bN|0)==6|d3)))){break}aR=c[bb+296>>2]<<3;bW=ut(aR)|0;if((bW|0)==0){gk();aG=ut(aR)|0;if((aG|0)==0){aP=4961;break L5888}else{d4=aG}}else{d4=bW}c[bL>>2]=d4}}while(0);bW=bb+312|0;c[bW>>2]=99;aG=c[11870]|0;if((aG|0)==1){c[12210]=c[12211]}aR=c[bS>>2]|0;do{if((aR|0)==311|(aR|0)==118|(aR|0)==137){if((aG|0)<=5){d5=4;d6=7;break}bO=c[12210]|0;c[12213]=bO;c[12212]=bO;bO=c[12211]|0;c[12215]=bO;c[12214]=bO;d5=4;d6=7}else if((aR|0)==257){c[bW>>2]=c[bw>>2];bO=c[12211]|0;c[12214]=bO;c[12213]=bO;c[12212]=bO;d5=5;d6=6}else if((aR|0)==474){c[272]=1;bO=c[273]|0;if((bO|0)==0){d5=2;d6=4;break}if((c[bO>>2]|0)!=2){d5=2;d6=4;break}bQ=bO+40|0;if((c[bQ>>2]|0)!=42){d5=2;d6=4;break}c[bQ>>2]=43;d5=2;d6=4}else if((aR|0)==252){c[bW>>2]=c[bw>>2];bQ=c[12211]|0;c[12214]=bQ;c[12213]=bQ;c[12212]=bQ;d5=5;d6=7}else if((aR|0)==169){if(!((aG|0)==4&+h[7030]==-2.0|(aG|0)>4)){d5=3;d6=6;break}bQ=c[12211]|0;c[12213]=bQ;c[12212]=bQ;d5=3;d6=6}else if((aR|0)==279|(aR|0)==86){if((aG|0)<=3){d5=3;d6=5;break}bQ=c[12210]|0;c[12213]=bQ;c[12212]=bQ;d5=3;d6=5}else if((aR|0)==295|(aR|0)==102){if((aG|0)<=3){d5=2;d6=5;break}bQ=c[12211]|0;c[12213]=bQ;c[12212]=bQ;d5=2;d6=5}else if((aR|0)==392){d5=1;d6=3}else if((aR|0)==153){d5=1;d6=4}else if((aR|0)==345){c[12212]=c[12211];d5=1;d6=3}else if((aR|0)==33|(aR|0)==1|(aR|0)==64){d5=1;d6=3}else if((aR|0)==368){c[269]=1;bQ=c[270]|0;if((bQ|0)==0){d5=3;d6=4;break}if((c[bQ>>2]|0)!=2){d5=3;d6=4;break}bO=bQ+40|0;if((c[bO>>2]|0)!=42){d5=3;d6=4;break}c[bO>>2]=43;d5=3;d6=4}else if((aR|0)==400){d5=3;d6=3}else if((aR|0)==416){d5=5;d6=6}else if((aR|0)==432){d5=6;d6=6}else if((aR|0)==457){d5=2;d6=6}else if((aR|0)==489){d5=2;d6=6}else if((aR|0)==18|(aR|0)==51){d5=1;d6=4}else if((aR|0)==225){d5=4;d6=5}else{d5=1;d6=2}}while(0);aR=bb+284|0;if((c[aR>>2]|0)==1){c[bW>>2]=0;c[12212]=0;d7=3}else{d7=d6}aG=c[11870]|0;if((aG|0)>(d7|0)){aP=4998;break L5888}if((aG|0)>0&(aG|0)<(d5|0)){aP=5e3;break L5888}aG=c[8270]|0;do{if((aG|0)!=0){if((aY(aG|0,139696)|0)==0){break}bA(4,aG|0)}}while(0);a[47040]=1;aG=eC(F,d7)|0;do{if((aG|0)==-1){d8=0;d9=0}else{bW=bb+296|0;bO=bb+320|0;bQ=bb+280|0;bU=bb+276|0;bx=bb+244|0;bz=bb+224|0;cd=bb+23|0;by=bb+288|0;bn=0;bv=0;bu=aG;while(1){if((bv|0)>=(c[bW>>2]|0)){iR(bb,(bv<<1)+1e3|0)}do{if((bu|0)>0){aV=bn+1|0;bp=c[bL>>2]|0;if((bp|0)==0){ea=bu;eb=aV;break}br=c[bS>>2]|0;if((br|0)==252|(br|0)==257){if((bu|0)<6){aP=5012;break L5888}}else if((br|0)==311|(br|0)==118|(br|0)==137){if(!((bu|0)==7|(bu|0)==5)){aP=5014;break L5888}}else if((br|0)==225){if((bu|0)<5){aP=5016;break L5888}}else if((br|0)==368|(br|0)==169|(br|0)==279|(br|0)==86|(br|0)==295|(br|0)==102){if((bu|0)<4){aP=5018;break L5888}}else if((br|0)==457){if((bu|0)==5|(bu|0)<3){aP=5020;break L5888}}else if((br|0)==489|(br|0)==153|(br|0)==18|(br|0)==51|(br|0)==33|(br|0)==1|(br|0)==64){if((bu|0)<3){aP=5022;break L5888}}br=bu-1|0;h[bp+(bv<<3)>>3]=+h[e+(br<<3)>>3];ea=br;eb=aV}else{ea=bu;eb=bn}}while(0);do{if((ea|0)==(-5|0)){if((c[bS>>2]|0)!=392){ec=bv;break}c[(c[bO>>2]|0)+(bv<<6)>>2]=2;ec=bv+1|0}else if((ea|0)==(-4|0)|(ea|0)==(-9|0)){ec=bv}else if((ea|0)==(-2|0)){c[(c[bO>>2]|0)+(bv<<6)>>2]=2;ec=bv+1|0}else if((ea|0)==(-3|0)){aV=c[bS>>2]|0;if((aV|0)==400|(aV|0)==416|(aV|0)==432){ec=bv;break}uD((c[bO>>2]|0)+(bv<<6)|0,56440,64);ec=bv+1|0}else if((ea|0)==(-6|0)){eL(bb);ec=bv}else if((ea|0)==(-7|0)){aI(115120,50,1,c[m>>2]|0);ec=bv}else if((ea|0)==0){aP=5034;break L5888}else if((ea|0)==1){h[G>>3]=+h[F>>3];h[F>>3]=+(c[11942]|0);aP=5036}else if((ea|0)==2){aP=5036}else if((ea|0)==3){if((c[aR>>2]|0)==1){ed=+h[F>>3];ee=+h[G>>3];iX(bb,bv,ed,ee,ed,ed,ee,ee,+h[H>>3]);ec=bv+1|0;break}aV=c[bS>>2]|0;if((aV|0)==392){if((c[9670]|0)==4){aP=5036;break}else{aP=5068}}else if((aV|0)==295|(aV|0)==102|(aV|0)==169){ee=+h[F>>3];ed=+h[G>>3];ef=+h[H>>3];iX(bb,bv,ee,ed,ee,ee,ed-ef,ed+ef,-1.0);ec=bv+1|0;break}else if((aV|0)==279|(aV|0)==86){ef=+h[F>>3];ed=+h[G>>3];ee=+h[H>>3];iX(bb,bv,ef,ed,ef-ee,ef+ee,ed,ed,0.0);ec=bv+1|0;break}else if((aV|0)==153){ed=+h[F>>3];ee=+h[G>>3];ef=+h[H>>3]*.5;iX(bb,bv,ed,ee,ed-ef,ed+ef,ee,ee,0.0);ec=bv+1|0;break}else if((aV|0)==368){ee=+h[F>>3];ef=+h[G>>3];iX(bb,bv,ee,ef,ee,ee,ef,ef,-1.0);br=(c[bO>>2]|0)+(bv<<6)|0;if((c[br>>2]|0)!=2){bp=c[bL>>2]|0;if((bp|0)==0){eg=0.0}else{eg=+h[bp+(bv<<3)>>3]}iW(c[bz>>2]|0,br,bv,c[11766]|0,eg)}ec=bv+1|0;break}else if((aV|0)==400){ef=+h[F>>3];ee=+h[G>>3];iX(bb,bv,ef,ee,ef,ef,ee,ee,+h[H>>3]);br=c[bO>>2]|0;bp=c[br+(bv<<6)>>2]|0;ee=+h[H>>3];L6717:do{if(ee>-8.988465674311579e+307&ee<8.988465674311579e+307){do{if((a[66852]&1)==0){h[br+(bv<<6)+32>>3]=ee}else{if(ee<0.0){h[br+(bv<<6)+32>>3]=ee;break L6717}if(ee==0.0){h[br+(bv<<6)+32>>3]=-8.988465674311579e+307;break L6717}else{ef=+_(+ee);h[br+(bv<<6)+32>>3]=ef/+h[8358];break}}}while(0);if(!((a[cd]&1)==0&(bp|0)==0)){break}ef=+h[H>>3];if(ef<+h[8347]){h[8347]=ef}do{if(ef<+h[8341]){if((c[16678]&1|0)==0){break L6717}if((c[16698]&1|0)==0){h[8341]=ef;break}ed=+h[8350];if(ed>ef){h[8341]=ed;break L6717}else{h[8341]=ef;break}}}while(0);if(ef>+h[8348]){h[8348]=ef}if(ef<=+h[8342]){break}if((c[16678]&2|0)==0){break}if((c[16699]&2|0)==0){h[8342]=ef;break}ed=+h[8353];if(ed<ef){h[8342]=ed;break}else{h[8342]=ef;break}}else{h[br+(bv<<6)+32>>3]=ee}}while(0);ec=bv+1|0;break}else if((aV|0)==18|(aV|0)==51|(aV|0)==33|(aV|0)==1|(aV|0)==64){ee=+h[F>>3];ed=+h[G>>3];iX(bb,bv,ee,ed,ee,ee,ed,ed,+h[H>>3]);ec=bv+1|0;break}else if((aV|0)==474){ed=+h[F>>3];ee=+h[G>>3];eh=+h[H>>3];ei=eh*.5;iX(bb,bv,ed,ee,ed-ei,ed+ei,ee,ee,eh);ec=bv+1|0;break}else if((aV|0)==457){eh=+h[F>>3];ee=+h[H>>3];iX(bb,bv,eh,+h[G>>3],eh-ee,eh+ee,0.0,360.0,ee>=0.0?0.0:-1.0);ec=bv+1|0;break}else if((aV|0)==489){ee=+h[F>>3];eh=+h[G>>3];ei=+h[H>>3];ed=+P(+ei);iX(bb,bv,ee,eh,ed,ed,0.0,ei,ei>=0.0?0.0:-1.0);ec=bv+1|0;break}else if((aV|0)!=345){aP=5068}if((aP|0)==5068){aP=0;uh(bB,79800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=102}c[bx>>2]=13;ei=+h[F>>3];ed=+h[G>>3];iX(bb,bv,ei,ed,ei,ei,ed,+h[H>>3],-1.0);ec=bv+1|0}else if((ea|0)==4){br=c[bS>>2]|0;if((br|0)==137|(br|0)==311|(br|0)==118){ed=+h[F>>3];ei=+h[G>>3];eh=+h[H>>3];ee=+h[I>>3];iX(bb,bv,ed,ei,ed-eh,ed+eh,ei-ee,ei+ee,0.0);ec=bv+1|0;break}else if((br|0)==153){ee=+h[G>>3];iX(bb,bv,+h[F>>3],ee,+h[H>>3],+h[I>>3],ee,ee,0.0);ec=bv+1|0;break}else if((br|0)==279|(br|0)==86){ee=+h[G>>3];iX(bb,bv,+h[F>>3],ee,+h[H>>3],+h[I>>3],ee,ee,0.0);ec=bv+1|0;break}else if((br|0)==169){bp=bv+1|0;ee=+h[F>>3];ei=+h[G>>3];if(+h[7030]==-2.0){iX(bb,bv,ee,ei,ee,ee,+h[H>>3],+h[I>>3],-1.0);ec=bp;break}else{eh=+h[I>>3]*.5;ed=+h[H>>3];iX(bb,bv,ee,ei,ee-eh,ee+eh,ei-ed,ei+ed,0.0);ec=bp;break}}else if((br|0)==474){bp=bv+1|0;ed=+h[F>>3];ei=+h[G>>3];eh=+h[H>>3]*.5;ee=ed-eh;ej=ed+eh;aE=c[11767]|0;bq=c[by>>2]|0;L6774:do{if((aE|0)==0){ek=0}else{bt=c[bz>>2]|0;bo=eD(aE)|0;a8=uA(bo|0)|0;L6776:do{if((bt|0)!=0){bs=bt;while(1){a7=c[bs+60>>2]|0;if((a7|0)!=0){if((a_(bo|0,a7|0,a8|0)|0)==0){break}}a7=c[bs>>2]|0;if((a7|0)==0){break L6776}else{bs=a7}}uu(bo);ek=c[bs+4>>2]|0;break L6774}}while(0);c[by>>2]=bq+1;iW(c[bz>>2]|0,c[bO>>2]|0,bq,bo,0.0);uu(bo);ek=bq}}while(0);iX(bb,bv,ed,ei,ee,ej,+(ek|0),+h[G>>3],+h[H>>3]);ec=bp;break}else if((br|0)==225){ef=+h[F>>3];eh=+h[G>>3];iX(bb,bv,ef,eh,ef,ef+ +h[H>>3],eh,eh+ +h[I>>3],0.0);ec=bv+1|0;break}else if((br|0)==18|(br|0)==51|(br|0)==368){eh=+h[F>>3];ef=+h[G>>3];iX(bb,bv,eh,ef,eh,eh,ef,ef,+h[H>>3]);ec=bv+1|0;break}else if((br|0)==489){ef=+h[F>>3];eh=+h[G>>3];el=+h[H>>3];em=+P(+el);en=+h[I>>3];eo=+P(+en);if(el<0.0){ep=-1.0}else{ep=en>=0.0?0.0:-1.0}iX(bb,bv,ef,eh,em,eo,0.0,el,ep);ec=bv+1|0;break}else if(!((br|0)==295|(br|0)==102)){uh(bB,79024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=102}el=+h[F>>3];iX(bb,bv,el,+h[G>>3],el,el,+h[H>>3],+h[I>>3],-1.0);ec=bv+1|0}else if((ea|0)==5){bq=c[bS>>2]|0;if((bq|0)==257|(bq|0)==252){el=+h[F>>3];iX(bb,bv,el,+h[G>>3],el,el,+h[H>>3],+h[I>>3],+h[J>>3]);ec=bv+1|0;break}else if((bq|0)==225){el=+h[F>>3];eo=+h[G>>3];iX(bb,bv,el,eo,el,el+ +h[H>>3],eo,eo+ +h[I>>3],+h[J>>3]);ec=bv+1|0;break}else if((bq|0)==457){eo=+h[F>>3];el=+h[H>>3];iX(bb,bv,eo,+h[G>>3],eo-el,eo+el,+h[I>>3],+h[J>>3],el>=0.0?0.0:-1.0);ec=bv+1|0;break}else if((bq|0)==489){el=+h[F>>3];eo=+h[G>>3];em=+h[H>>3];eh=+P(+em);ef=+h[I>>3];en=+P(+ef);if(em<0.0){eq=-1.0}else{eq=ef>=0.0?0.0:-1.0}iX(bb,bv,el,eo,eh,en,+h[J>>3],em,eq);ec=bv+1|0;break}else if((bq|0)==416){aP=5148;break}else if((bq|0)!=169){uh(bB,78440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=169}em=+h[F>>3];en=+h[J>>3]*.5;iX(bb,bv,em,+h[G>>3],em-en,em+en,+h[H>>3],+h[I>>3],0.0);ec=bv+1|0}else if((ea|0)==7|(ea|0)==6){bq=c[bS>>2]|0;if((bq|0)==252){en=+h[F>>3];em=+h[K>>3];if(em>0.0){er=en-em*.5}else{er=en}iX(bb,bv,en,+h[G>>3],er,en,+h[H>>3],+h[I>>3],+h[J>>3]);ec=bv+1|0;break}else if((bq|0)==432|(bq|0)==416){aP=5148;break}else if(!((bq|0)==311|(bq|0)==118|(bq|0)==137)){uh(bB,78104,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=118}iX(bb,bv,+h[F>>3],+h[G>>3],+h[H>>3],+h[I>>3],+h[J>>3],+h[K>>3],0.0);ec=bv+1|0}else{aP=5025;break L5888}}while(0);L6811:do{if((aP|0)==5036){aP=0;bq=c[bS>>2]|0;if((bq|0)!=392){en=+h[7030];do{if((bq|0)==153&en>0.0){if((a[56232]&1)==0){break}aE=c[bT>>2]|0;if((a[64788+(aE*688&-1)|0]&1)==0){em=+h[F>>3];eh=+h[G>>3];eo=en*.5;iX(bb,bv,em,eh,em-eo,eo+em,eh,eh,0.0);ec=bv+1|0;break L6811}else{eh=+h[64792+(aE*688&-1)>>3];em=+h[F>>3];eo=+h[G>>3];el=em*+R(+eh,+(en*-.5));iX(bb,bv,em,eo,el,em*+R(+eh,+(en*.5)),eo,eo,0.0);ec=bv+1|0;break L6811}}}while(0);if((bq|0)==457){en=+h[F>>3];iX(bb,bv,en,+h[G>>3],en,en,0.0,360.0,-1.0);ec=bv+1|0;break}else if((bq|0)==489){iX(bb,bv,+h[F>>3],+h[G>>3],0.0,0.0,0.0,0.0,-2.0);ec=bv+1|0;break}else if((bq|0)==102){en=+h[G>>3];h[H>>3]=en;ej=+h[F>>3];h[G>>3]=ej;ee=+(c[11942]|0);h[F>>3]=ee;iX(bb,bv,ee,ej,ee,ee,ej-en,en+ej,-1.0);ec=bv+1|0;break}else if((bq|0)==252|(bq|0)==257){uh(bB,81264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=18}ej=+h[F>>3];en=+h[G>>3];iX(bb,bv,ej,en,ej,ej,en,en,-1.0);ec=bv+1|0;break}br=c[9670]|0;if((br|0)==4){if((ea|0)==1){aP=5039;break L5888}else if((ea|0)==2){en=+h[F>>3];ej=+h[G>>3];h[I>>3]=en+ej;h[H>>3]=en-ej;es=en}else{h[I>>3]=+h[H>>3];h[H>>3]=+h[G>>3];es=+h[F>>3]}h[G>>3]=es;h[F>>3]=+(c[11942]|0)}else{if((ea|0)>1){aP=5044;break L5888}en=+h[G>>3];h[I>>3]=en;h[H>>3]=en}do{if((br|0)==2){en=+(c[bQ>>2]|0)+ +h[(c[bU>>2]|0)+16>>3];h[4834]=en;h[(c[bU>>2]|0)+24>>3]=en}else{en=+h[F>>3]+ +h[(c[bU>>2]|0)+16>>3];if(en<=+h[4834]){break}h[4834]=en;h[(c[bU>>2]|0)+24>>3]=en}}while(0);en=+h[7030];br=bv+1|0;ej=+h[F>>3];ee=+h[G>>3];if(en>0.0){ei=en*.5;iX(bb,bv,ej,ee,ej-ei,ej+ei,+h[H>>3],+h[I>>3],0.0);ec=br;break}else{iX(bb,bv,ej,ee,ej+-.5,ej+.5,+h[H>>3],+h[I>>3],0.0);ec=br;break}}else if((aP|0)==5148){aP=0;ej=+h[F>>3];ee=+h[G>>3];iX(bb,bv,ej,ee,ej,ej,ee,ee,+h[H>>3]);br=c[bO>>2]|0;h[br+(bv<<6)+40>>3]=+h[H>>3];h[br+(bv<<6)+48>>3]=+h[I>>3];h[br+(bv<<6)+56>>3]=+h[J>>3];h[br+(bv<<6)+32>>3]=+h[K>>3];ec=bv+1|0}}while(0);br=eC(F,d7)|0;if((br|0)==-1){break}else{bn=eb;bv=ec;bu=br}}if((ec|0)<=0){d8=ec;d9=eb;break}bu=ec-1|0;d8=(c[(c[bO>>2]|0)+(bu<<6)>>2]|0)==2?bu:ec;d9=eb}}while(0);bB=bb+300|0;c[bB>>2]=d8;iR(bb,d8);eL(bb);ez();bL=c[8270]|0;do{if((bL|0)!=0){if((aY(bL|0,139696)|0)==0){break}bA(4,139696)}}while(0);if((d9|0)==0){uh(-1,104952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bR>>2]=4;d_=d0;d$=d1;break}bL=c[bS>>2]|0;if((bL|0)==392){aG=c[9670]|0;L6860:do{if((aG|0)==1){if((c[64648+((c[bw>>2]|0)*688&-1)>>2]&2|0)==0){aP=5181;break}do{if((c[bb+280>>2]|0)==0){bu=c[3566]|0;if((bu|0)!=0){uu(bu)}bu=c[bB>>2]<<6;bv=ut(bu)|0;if((bv|0)==0){gk();bn=ut(bu)|0;if((bn|0)==0){aP=5164;break L5888}else{et=bn}}else{et=bv}bv=et;c[3566]=bv;c[3570]=0;if((c[bB>>2]|0)>0){eu=0}else{aP=5181;break L6860}while(1){bn=eu+1|0;uE(bv+(eu<<6)+32|0,0,16);c[3570]=bn;if((bn|0)<(c[bB>>2]|0)){eu=bn}else{ev=bn;break}}}else{bv=c[bB>>2]|0;bn=c[3570]|0;if((bv|0)<=(bn|0)){ev=bn;break}bn=db(c[3566]|0,bv<<6,91376)|0;c[3566]=bn;bv=c[3570]|0;if((bv|0)<(c[bB>>2]|0)){ew=bv}else{ev=bv;break}while(1){bv=ew+1|0;uE(bn+(ew<<6)+32|0,0,16);c[3570]=bv;if((bv|0)<(c[bB>>2]|0)){ew=bv}else{ev=bv;break}}}}while(0);if((ev|0)<=0){aP=5181;break}bO=bb+320|0;bn=0;while(1){bv=c[bO>>2]|0;do{if((c[bv+(bn<<6)>>2]|0)!=2){ee=+h[bv+(bn<<6)+16>>3];bu=c[3566]|0;if(ee<0.0){bU=bu+(bn<<6)+32|0;h[bU>>3]=ee+ +h[bU>>3];ex=+h[bu+(bn<<6)+40>>3]}else{bU=bu+(bn<<6)+40|0;ej=ee+ +h[bU>>3];h[bU>>3]=ej;ex=ej}bU=c[bw>>2]|0;bQ=64672+(bU*688&-1)|0;if(+h[bQ>>3]<ex){h[bQ>>3]=ex;eA=c[bw>>2]|0}else{eA=bU}bU=64664+(eA*688&-1)|0;ej=+h[bu+(bn<<6)+32>>3];if(+h[bU>>3]<=ej){break}h[bU>>3]=ej}}while(0);bv=bn+1|0;if((bv|0)<(ev|0)){bn=bv}else{aP=5181;break}}}else if((aG|0)==3|(aG|0)==4){aP=5181}else if((aG|0)==2){do{if((c[16507]|0)!=0){ej=+(c[bb+280>>2]|0)+(+h[(c[bb+276>>2]|0)+16>>3]+1.0);if(+h[8255]>-1.0){h[8255]=-1.0}if(+h[8256]==ej){break}h[8256]=ej}}while(0);bn=c[16335]|0;if((bn|0)==0){break}bO=c[bB>>2]|0;if((bO|0)>0){bv=c[bb+320>>2]|0;bU=0;ej=0.0;ee=0.0;while(1){do{if((c[bv+(bU<<6)>>2]|0)==2){eB=ee;eE=ej}else{ei=+h[bv+(bU<<6)+16>>3];if(ei<0.0){eB=ee;eE=ej+ei;break}else{eB=ee+ei;eE=ej;break}}}while(0);bu=bU+1|0;if((bu|0)<(bO|0)){bU=bu;ej=eE;ee=eB}else{eF=eE;eG=eB;break}}}else{eF=0.0;eG=0.0}do{if((bn&2|0)!=0){bU=64672+((c[bw>>2]|0)*688&-1)|0;if(+h[bU>>3]>=eG){break}h[bU>>3]=eG}}while(0);if((bn&1|0)==0){break}bU=64664+((c[bw>>2]|0)*688&-1)|0;if(+h[bU>>3]<=eF){break}h[bU>>3]=eF}}while(0);do{if((aP|0)==5181){aP=0;aG=c[16506]|0;if((aG|0)==0){break}do{if((aG&1|0)!=0){ee=+h[(c[bb+276>>2]|0)+16>>3]+-1.0;if(+h[8255]<=ee){break}h[8255]=ee}}while(0);if((aG&2|0)==0){break}bn=c[bb+320>>2]|0;bU=c[bB>>2]|0;while(1){eH=bU-1|0;if((c[bn+(eH<<6)>>2]|0)!=2){break}c[bB>>2]=eH;if((eH|0)==0){aP=5189;break L5888}else{bU=eH}}ee=+h[bn+(eH<<6)+8>>3]+(+h[(c[bb+276>>2]|0)+16>>3]+1.0);if(+h[8256]>=ee){break}h[8256]=ee}}while(0);eI=c[bS>>2]|0}else{eI=bL}do{if((eI|0)==153){bU=c[bB>>2]|0;aG=bU-1|0;if((aG|0)==0){break}bO=c[bT>>2]|0;bv=c[64648+(bO*688&-1)>>2]|0;do{if((bv&1|0)==0){eJ=bO;eK=bv}else{bu=c[bb+320>>2]|0;if((c[bu>>2]|0)==2){eJ=bO;eK=bv;break}if((c[bu+64>>2]|0)==2){eJ=bO;eK=bv;break}ee=+h[bu+8>>3];ej=ee-(+h[bu+72>>3]-ee)*.5;if((a[64788+(bO*688&-1)|0]&1)==0){eN=ej}else{eN=+Z(+(ej*+h[64800+(bO*688&-1)>>3]))}bu=64664+(bO*688&-1)|0;if(+h[bu>>3]<=eN){eJ=bO;eK=bv;break}h[bu>>3]=eN;bu=c[bT>>2]|0;eJ=bu;eK=c[64648+(bu*688&-1)>>2]|0}}while(0);if((eK&2|0)==0){break}bv=c[bb+320>>2]|0;if((c[bv+(aG<<6)>>2]|0)==2){break}bO=bU-2|0;if((c[bv+(bO<<6)>>2]|0)==2){break}ej=+h[bv+(aG<<6)+8>>3];ee=ej+(ej- +h[bv+(bO<<6)+8>>3])*.5;if((a[64788+(eJ*688&-1)|0]&1)==0){eO=ee}else{eO=+Z(+(ee*+h[64800+(eJ*688&-1)>>3]))}bO=64672+(eJ*688&-1)|0;if(+h[bO>>3]>=eO){break}h[bO>>3]=eO}}while(0);bL=c[bS>>2]|0;if((bL|0)==474){bO=c[bB>>2]|0;bv=bb+320|0;bn=c[bv>>2]|0;if((bO|0)>0){bu=0;bQ=bn;while(1){if((c[bQ+(bu<<6)>>2]|0)==2){h[bQ+(bu<<6)+16>>3]=8.988465674311579e+307;eP=c[bv>>2]|0}else{eP=bQ}bz=bu+1|0;if((bz|0)<(bO|0)){bu=bz;bQ=eP}else{eQ=eP;break}}}else{eQ=bn}bM(eQ|0,bO|0,64,12);bQ=c[bv>>2]|0;bu=bO;while(1){eR=bu-1|0;if((c[bQ+(eR<<6)>>2]|0)==2){bu=eR}else{break}}c[bB>>2]=bu;if((c[bQ>>2]|0)==2){aP=5236;break L5888}ee=+h[bQ+56>>3]- +h[bQ+48>>3];do{if(ee==0.0){ej=+h[7030];if(ej<=0.0){eS=.5;break}eT=(a[56232]&1)!=0?ej:.5;aP=5240}else{eT=ee;aP=5240}}while(0);do{if((aP|0)==5240){aP=0;if(eT>=0.0){eS=eT;break}eS=-0.0-eT}}while(0);bu=c[bT>>2]|0;do{if((c[64648+(bu*688&-1)>>2]&1|0)!=0){bO=64664+(bu*688&-1)|0;ee=+h[bO>>3];ej=+h[bQ+8>>3];if(ee>=ej){h[bO>>3]=ee-eS*1.5;break}if(ee<ej-eS){break}h[bO>>3]=ee-eS}}while(0);bQ=c[bT>>2]|0;do{if((c[64648+(bQ*688&-1)>>2]&2|0)!=0){bu=64672+(bQ*688&-1)|0;ee=+h[bu>>3];ej=+h[(c[bv>>2]|0)+(eR<<6)+8>>3];do{if(ee>ej){if(ee>eS+ej){break}h[bu>>3]=eS+ee}else{h[bu>>3]=eS*1.5+ee}}while(0);bu=c[bb+288>>2]|0;if((bu|0)<=1){break}aG=64672+((c[bT>>2]|0)*688&-1)|0;h[aG>>3]=+(bu-1|0)*+h[7035]+ +h[aG>>3]}}while(0);eU=c[bS>>2]|0}else{eU=bL}do{if((eU|0)==416|(eU|0)==432){bv=c[16678]|0;if((bv&1|0)!=0){h[8341]=0.0}if((bv&2|0)==0){break}h[8342]=255.0}}while(0);L6997:do{if((c[bS>>2]|0)==474){bL=bb+288|0;bv=c[bL>>2]|0;if((bv|0)<=0){break}do{if(!((a[56292]&1)==0|(bv|0)<2)){bQ=bb+224|0;aG=c[bQ>>2]|0;if((aG|0)==0){break}if((c[aG>>2]|0)==0){break}aG=bv<<2;bu=ut(aG)|0;if((bu|0)==0){gk();bU=ut(aG)|0;if((bU|0)==0){aP=5267;break L5888}else{eV=bU}}else{eV=bu}bu=eV;bU=c[bL>>2]<<2;aG=ut(bU)|0;if((aG|0)==0){gk();bO=ut(bU)|0;if((bO|0)==0){aP=5270;break L5888}else{eW=bO}}else{eW=aG}aG=eW;bO=c[bL>>2]|0;if((bO|0)>0){bU=0;bn=c[bQ>>2]|0;while(1){bz=c[bn>>2]|0;c[bu+(bU<<2)>>2]=bz;by=bU+1|0;bx=c[bL>>2]|0;if((by|0)<(bx|0)){bU=by;bn=bz}else{eX=bx;break}}}else{eX=bO}bM(eV|0,eX|0,4,22);if((c[bL>>2]|0)>0){bn=0;do{c[aG+(bn<<2)>>2]=c[(c[bu+(bn<<2)>>2]|0)+4>>2];bn=bn+1|0;}while((bn|0)<(c[bL>>2]|0))}bn=c[bu>>2]|0;c[c[bQ>>2]>>2]=bn;if(((c[bL>>2]|0)-1|0)>0){bO=bn;bU=0;while(1){bx=bU+1|0;bz=c[bu+(bx<<2)>>2]|0;c[bO>>2]=bz;if((bx|0)<((c[bL>>2]|0)-1|0)){bO=bz;bU=bx}else{eY=bz;break}}}else{eY=bn}c[eY>>2]=0;uu(eV);c[bb+292>>2]=aG}}while(0);bL=c[14072]|0;if((bL|0)==2){eZ=2}else if((bL|0)==0){break}else{eZ=(bL|0)==3?6:c[200]|0}bL=c[c[bb+224>>2]>>2]|0;if((bL|0)==0){break}bv=bb+320|0;bU=0;bO=bL;while(1){dp(eZ,c[bO+60>>2]|0,+h[(c[bv>>2]|0)+8>>3]+ +(bU|0)*+h[7035],-1);bL=c[bO>>2]|0;if((bL|0)==0){break L6997}bU=bU+1|0;bO=bL}}}while(0);bO=c[aR>>2]|0;if((bO|0)==5|(bO|0)==6|(bO|0)==7|(bO|0)==9|(bO|0)==3|(bO|0)==1|(bO|0)==4){bU=bb+320|0;bv=0;while(1){bL=c[bB>>2]|0;L7036:do{if((bv|0)<(bL|0)){bu=c[bU>>2]|0;bQ=bv;while(1){if((c[bu+(bQ<<6)>>2]|0)!=2){e_=bQ;break L7036}bz=bQ+1|0;if((bz|0)<(bL|0)){bQ=bz}else{e_=bz;break}}}else{e_=bv}}while(0);bQ=0;while(1){e$=bQ+e_|0;if((e$|0)>=(bL|0)){break}if((c[(c[bU>>2]|0)+(e$<<6)>>2]|0)==2){break}else{bQ=bQ+1|0}}if((bQ|0)<=0){break}bM((c[bU>>2]|0)+(e_<<6)|0,bQ|0,64,18);bv=e$}hn(bb);e0=c[aR>>2]|0}else{e0=bO}if((e0|0)==6|(e0|0)==7|(e0|0)==9){hk(bb)}else if((e0|0)==3|(e0|0)==1|(e0|0)==2|(e0|0)==4|(e0|0)==8){hl(bb)}bv=c[bS>>2]|0;if(!((bv|0)==400|(bv|0)==416|(bv|0)==432)){d_=d0;d$=d1;break}c[bb+228>>2]=0;f3(bb,1);d_=d0;d$=d1}}while(0);c[bb+4>>2]=c[13898];bS=bb|0;if(!bd){e1=B;e2=an;e3=ao;e5=dR;e8=aq;e9=du;fa=dJ;fb=0;fc=d$;fd=d_;fe=bc;ff=bS;fg=bb;aP=5313;break}fh=B;fi=an;fj=ao;fk=dR;fl=aq;fm=du;fn=dJ;fo=0;fp=d$;fq=d_;fr=bc;fs=bS;ft=c[13898]|0;fu=c[8272]|0;aP=5305}else if((aP|0)==4369){aP=0;c[13898]=aB+1;uu(c[9666]|0);c[9666]=0;ee=+h[4834];if(ee>0.0){fv=ee+2.0}else{fv=aq}c[af>>2]=-5;ee=fv;bS=aw+1|0;fw=c[13898]|0;while(1){L7062:do{if((c[8272]|0)>(fw|0)){bT=c[1054]|0;if((a[bT+(fw*40&-1)|0]&1)==0){fx=ee;break}bw=c[bT+(fw*40&-1)+36>>2]|0;bR=bT+(fw*40&-1)+32|0;bT=c[10036]|0;bv=0;while(1){if((bv|0)>=(bw|0)){break}if((a[bT+((c[bR>>2]|0)+bv|0)|0]|0)==(a[bv+95280|0]|0)){bv=bv+1|0}else{fx=ee;break L7062}}if((bv|0)!=2){fx=ee;break}c[13898]=fw+1;bR=is(n)|0;bT=c[bR>>2]|0;if((bT|0)==1){fy=+(c[bR+8>>2]|0)}else if((bT|0)==3){fy=+uz(c[bR+8>>2]|0,0)}else if((bT|0)==2){fy=+h[bR+8>>3]}else{aP=4382;break L5888}if((c[ag>>2]|0)!=3){fx=fy;break}uu(c[ah>>2]|0);c[ag>>2]=1;fx=fy}else{fx=ee}}while(0);L7077:do{if((c[9666]|0)==0){bO=c[13898]|0;aR=c[1054]|0;bR=(a[aR+(bO*40&-1)|0]&1)==0;if(bR){aP=4388}else{bT=c[10036]|0;bw=a[bT+(c[aR+(bO*40&-1)+32>>2]|0)|0]|0;if((bw<<24>>24|0)==39|(bw<<24>>24|0)==34){fz=bT}else{aP=4388}}if((aP|0)==4388){aP=0;bT=c[10810]|0;if((bT|0)==0){break}bw=c[8272]|0;bQ=aR+(bO*40&-1)+36|0;bU=aR+(bO*40&-1)+32|0;bB=c[10036]|0;bL=bT;L7084:while(1){bT=c[bL+4>>2]|0;L7086:do{if(!((bw|0)<=(bO|0)|bR)){bu=c[bQ>>2]|0;aG=0;while(1){if((aG|0)>=(bu|0)){break}if((a[bB+((c[bU>>2]|0)+aG|0)|0]|0)==(a[bT+aG|0]|0)){aG=aG+1|0}else{break L7086}}if((a[bT+aG|0]|0)==0){break L7084}}}while(0);bT=c[bL>>2]|0;if((bT|0)==0){break L7077}else{bL=bT}}if((a[bL+8|0]&1)!=0){break}if((c[bL+16>>2]|0)==3){fz=bB}else{break}}L7096:do{if((bO|0)<(c[8272]|0)){L7098:do{if(!bR){bU=c[aR+(bO*40&-1)+36>>2]|0;bQ=aR+(bO*40&-1)+32|0;bw=0;while(1){if((bw|0)>=(bU|0)){break}if((a[fz+((c[bQ>>2]|0)+bw|0)|0]|0)==(a[bw+103664|0]|0)){bw=bw+1|0}else{break L7098}}if((bw|0)==1){fA=0;break L7096}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[ai>>2]|0)==3){fA=c[aj>>2]|0;break}else{c[13898]=bO;fA=0;break}}else{fA=0}}while(0);c[9666]=fA}}while(0);bO=c[13898]|0;aR=c[1054]|0;bR=a[aR+(bO*40&-1)|0]|0;L7110:do{if((c[8272]|0)>(bO|0)){if((bR&1)==0){aP=4414;break}bB=c[aR+(bO*40&-1)+36>>2]|0;bL=aR+(bO*40&-1)+32|0;bQ=c[10036]|0;bU=0;while(1){if((bU|0)>=(bB|0)){break}if((a[bQ+((c[bL>>2]|0)+bU|0)|0]|0)==(a[bU+225056|0]|0)){bU=bU+1|0}else{aP=4414;break L7110}}if((bU|0)==2){aP=4422}else{aP=4414}}else{aP=4414}}while(0);L7117:do{if((aP|0)==4414){aP=0;bL=c[aR+(bO*40&-1)+36>>2]|0;if(!((bR&1)!=0&(bL|0)>0)){fB=bS;break}bQ=c[10036]|0;bB=0;aG=0;bv=c[aR+(bO*40&-1)+32>>2]|0;while(1){if((a[bB+139232|0]|0)==(a[bQ+(bB+bv|0)|0]|0)){fC=bv;fD=aG}else{if((bB|0)!=5){fB=bS;break L7117}fC=bv-1|0;fD=1}bT=bB+1|0;if((bT|0)<(fD+bL|0)){bB=bT;aG=fD;bv=fC}else{break}}if((fD|0)!=0){aP=4422;break}if((bB|0)==4|(bB|0)==8){aP=4422}else{fB=bS}}}while(0);if((aP|0)==4422){aP=0;c[13898]=bO+1;aR=is(k)|0;bR=c[aR>>2]|0;if((bR|0)==1){fE=+(c[aR+8>>2]|0)}else if((bR|0)==2){fE=+h[aR+8>>3]}else if((bR|0)==3){fE=+uz(c[aR+8>>2]|0,0)}else{aP=4426;break L5888}if((c[ak>>2]|0)==3){uu(c[al>>2]|0);c[ak>>2]=1}fB=~~fE}hJ(p,1,100,c[af>>2]|0,49504);aR=c[13898]|0;if((aR|0)==(fw|0)){break}else{ee=fx;bS=fB;fw=aR}}bS=c[af>>2]|0;B=c[8272]|0;if((B|0)<=(fw|0)){aP=6084;break L5888}aR=c[1054]|0;if((a[aR+(fw*40&-1)|0]&1)==0){aP=6085;break L5888}bR=c[aR+(fw*40&-1)+36>>2]|0;bv=aR+(fw*40&-1)+32|0;aR=c[10036]|0;aG=0;while(1){if((aG|0)>=(bR|0)){break}if((a[aR+((c[bv>>2]|0)+aG|0)|0]|0)==(a[aG+148464|0]|0)){aG=aG+1|0}else{aP=6086;break L5888}}if((aG|0)==1){aW=fx;aX=-1;aZ=fB;a$=bS;a0=fw;a1=B;aP=5304}else{aP=6087;break L5888}}}while(0);if((aP|0)==5304){aP=0;if(au){fh=am;fi=a$;fj=aZ;fk=aX;fl=aW;fm=as;fn=at;fo=aA;fp=av;fq=aw;fr=ax;fs=ay;ft=a0;fu=a1;aP=5305}else{e1=am;e2=a$;e3=aZ;e5=aX;e8=aW;e9=as;fa=at;fb=aA;fc=av;fd=aw;fe=ax;ff=ay;fg=0;aP=5313}}L7148:do{if((aP|0)==5305){aP=0;if((fu|0)<=(ft|0)){fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}aB=c[1054]|0;if((a[aB+(ft*40&-1)|0]&1)==0){fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}bv=c[aB+(ft*40&-1)+36>>2]|0;aR=aB+(ft*40&-1)+32|0;aB=c[10036]|0;bR=0;while(1){if((bR|0)>=(bv|0)){break}if((a[aB+((c[aR>>2]|0)+bR|0)|0]|0)==(a[bR+148464|0]|0)){bR=bR+1|0}else{fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}}if((bR|0)!=1){fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}aR=ft+1|0;c[13898]=aR;fK=fs;fL=fr;fM=fq;fN=fp;fO=1;fP=fo;fQ=fn;fR=fm;fT=fl;fU=fk;fV=fj;fW=fi;fX=fh;fY=aR}else if((aP|0)==5313){aP=0;aR=c[7774]|0;do{if((aR|0)==0){aP=5316}else{if((a[aR+38|0]&1)==0|(fg|0)==0){aP=5316;break}c[fg+8>>2]=4}}while(0);do{if((aP|0)==5316){aP=0;if(!(ix(aR)|0)){break}c[13898]=aQ;fK=ff;fL=fe;fM=fd;fN=fc;fO=0;fP=fb;fQ=fa;fR=e9;fT=e8;fU=e5;fV=e3;fW=e2;fX=e1;fY=aQ;break L7148}}while(0);aR=c[7774]|0;if((aR|0)!=0){bR=aR;while(1){aR=c[bR>>2]|0;uu(c[bR+12>>2]|0);uu(bR);if((aR|0)==0){break}else{bR=aR}}}c[7774]=0;bR=c[13898]|0;if((c[8272]|0)<=(bR|0)){aP=5327;break L5888}aR=c[1054]|0;if((a[aR+(bR*40&-1)|0]&1)==0){aP=5327;break L5888}aB=c[aR+(bR*40&-1)+36>>2]|0;bv=aR+(bR*40&-1)+32|0;aR=c[10036]|0;B=0;while(1){if((B|0)>=(aB|0)){break}if((a[aR+((c[bv>>2]|0)+B|0)|0]|0)==(a[B+148464|0]|0)){B=B+1|0}else{aP=5327;break L5888}}if((B|0)!=1){aP=5327;break L5888}c[13898]=bR+1;c[7774]=iw()|0;fK=ff;fL=fe;fM=fd;fN=fc;fO=0;fP=fb;fQ=fa;fR=e9;fT=e8;fU=e5;fV=e3;fW=e2;fX=e1;fY=c[13898]|0}}while(0);if((fY|0)<(c[8272]|0)){am=fX;an=fW;ao=fV;ap=fU;aq=fT;ar=aQ;as=fR;at=fQ;A=fP;au=fO;av=fN;aw=fM;ax=fL;ay=fK;az=fY}else{aJ=aQ;aK=fP;aL=fX;aM=fO;aN=fL;aO=fY;aP=4357;break}}do{if((aP|0)==4501){uf(cc,163648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4426){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4357){if((aL|0)==0){C=aO}else{fF=aN;fG=aM;fH=aK;fI=aJ;fJ=aL;aP=5328;break}uf(C,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4680){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4906){uf(c[13898]|0,110696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4910){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=107952,v)|0)}else if((aP|0)==4944){uf(c[13898]|0,84448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4946){uf(c[13898]|0,106024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4744){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((aP|0)==4867){uf(-1,115176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4880){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((aP|0)==4899){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((aP|0)==4903){uf(c[13898]|0,114152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4576){c[13898]=cC;aP=4577}else if((aP|0)==4634){uf(cR,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4466){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180104,v)|0)}else if((aP|0)==4546){uf(c[13898]|0,216936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4455){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180104,v)|0)}else if((aP|0)==4533){uf(cT,149448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4382){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4521){uf(bV,92272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4622){uf(bV,133232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4462){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77008,v)|0)}else if((aP|0)==4452){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77008,v)|0)}else if((aP|0)==4448){uf(c[13898]|0,92272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4961){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=90328,v)|0)}else if((aP|0)==4998){uf(-1,89648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5e3){uf(-1,89152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5012){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5014){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5016){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5018){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5020){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5022){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5025){ez();fY=c[11900]|0;uf(c[13898]|0,86160,(v=i,i=i+16|0,c[v>>2]=ea,c[v+8>>2]=fY,v)|0)}else if((aP|0)==5034){ez();fY=c[11932]|0;uf(c[d2>>2]|0,116952,(v=i,i=i+16|0,c[v>>2]=c[11900],c[v+8>>2]=(fY|0)!=0?fY:179864,v)|0)}else if((aP|0)==5039){uf(c[13898]|0,83648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5044){uf(c[13898]|0,82688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5164){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=91376,v)|0)}else if((aP|0)==5189){uf(-1,90720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5236){uf(-1,92048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5267){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=93632,v)|0)}else if((aP|0)==5270){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=92920,v)|0)}else if((aP|0)==5327){if((a[32936]&1)==0){fZ=fe;f_=0;f$=fb;f0=aQ;f1=e1;aP=5331}else{f2=fe;f4=0;f5=fb;f6=aQ;f7=e1}}else if((aP|0)==6068){f9=c[13898]|0;uf(f9,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6069){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6070){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6071){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6072){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6073){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6074){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6075){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6076){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6077){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6078){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6079){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6080){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6081){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6082){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6083){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6084){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6085){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6086){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6087){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((aP|0)==4577){c[bJ>>2]=0;f9=c[13898]|0;uf(f9,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((aP|0)==5328){f9=(a[32936]&1)==0;if(f9|fG^1){if(f9){fZ=fF;f_=fG;f$=fH;f0=fI;f1=fJ;aP=5331;break}else{f2=fF;f4=fG;f5=fH;f6=fI;f7=fJ;break}}else{uf(-1,147440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((aP|0)==5331){if((a[30528]&1)!=0){f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}do{if((fZ|0)!=0){if((c[z>>2]|0)==0){break}if(!(+h[8256]==-8.988465674311579e+307|+h[8255]==8.988465674311579e+307)){break}h[8255]=-10.0;h[8256]=10.0}}while(0);dc(2,145296);if((c[x>>2]&1|0)!=0){dc(6,103512);f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}fJ=c[17194]|0;if((fJ|0)==0){f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}if((fJ&1|0)!=0){h[8599]=+h[8255]}if((fJ&2|0)==0){f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}h[8600]=+h[8256];f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1}}while(0);do{if((f2|0)==0){ga=f7}else{f1=(a[32936]&1)==0;if(f1){if((a[30528]&1)==0){aP=5357}else{aP=5346}}else{aP=5346}if((aP|0)==5346){do{if((c[z>>2]&1|0)==0){f0=c[16506]|0;if((f0&1|0)!=0){h[8255]=8.988465674311579e+307}if((f0&2|0)==0){break}h[8256]=-8.988465674311579e+307}}while(0);do{if((c[x>>2]&1|0)==0){f0=c[17194]|0;if((f0&1|0)!=0){h[8599]=8.988465674311579e+307}if((f0&2|0)==0){break}h[8600]=-8.988465674311579e+307}}while(0);if(f1){aP=5357}else{aP=5358}}if((aP|0)==5357){if((a[30528]&1)==0){gb=0.0;gc=0.0}else{aP=5358}}if((aP|0)==5358){fT=+h[8771];gb=(+h[8772]-fT)/+((c[6352]|0)-1|0);gc=fT}f0=c[10814]|0;c[13898]=u;c[7774]=iw()|0;f$=t|0;f_=t+8|0;fZ=f_;fJ=t+8|0;fI=f_;f_=t+16|0;fH=f0;fT=gb;f0=f4;fG=f5;fF=f6;aq=gc;f9=0;L7293:while(1){bJ=fG;fw=fF;L7295:while(1){cb=c[13898]|0;if(f0){gd=fw}else{gd=bJ?fw:cb}if((t9(cb)|0)==0){aP=5370;break}dT();cb=c[13898]|0;if((c[8272]|0)<=(cb|0)){bJ=1;fw=gd;continue}c9=c[1054]|0;if((a[c9+(cb*40&-1)|0]&1)==0){bJ=1;fw=gd;continue}e1=c[c9+(cb*40&-1)+36>>2]|0;aQ=c9+(cb*40&-1)+32|0;cb=c[10036]|0;c9=0;while(1){if((c9|0)>=(e1|0)){break}if((a[cb+((c[aQ>>2]|0)+c9|0)|0]|0)==(a[c9+148464|0]|0)){c9=c9+1|0}else{bJ=1;fw=gd;continue L7295}}if((c9|0)==1){aP=5664;break}else{bJ=1;fw=gd}}L7307:do{if((aP|0)==5370){aP=0;ge=c[13898]|0;if((ge|0)>=(c[8272]|0)){aP=5377;break L7293}fw=c[1054]|0;bR=fw+(ge*40&-1)|0;L7310:do{if((a[bR]&1)==0){gf=0}else{B=c[fw+(ge*40&-1)+36>>2]|0;aQ=fw+(ge*40&-1)+32|0;cb=c[10036]|0;e1=0;while(1){if((e1|0)>=(B|0)){break}if((a[cb+((c[aQ>>2]|0)+e1|0)|0]|0)==(a[e1+103664|0]|0)){e1=e1+1|0}else{gf=0;break L7310}}gf=(e1|0)==1}}while(0);if(gf|(fH|0)==0){aP=5377;break L7293}c9=fH+304|0;c[200]=c[c9>>2];c[144]=c[fH+308>>2];aQ=f9+1|0;c[11670]=31424;cb=c[fw+(ge*40&-1)+36>>2]|0;L7318:do{if((a[bR]&1)!=0&(cb|0)>0){B=c[10036]|0;bB=0;bO=0;fb=c[fw+(ge*40&-1)+32>>2]|0;while(1){if((a[bB+205224|0]|0)==(a[B+(bB+fb|0)|0]|0)){gg=fb;gh=bO}else{if((bB|0)!=7){aP=5386;break L7318}gg=fb-1|0;gh=1}fe=bB+1|0;if((fe|0)<(gh+cb|0)){bB=fe;bO=gh;fb=gg}else{break}}if((gh|0)!=0){break}if(!((bB|0)==6|(bB|0)==12)){aP=5386}}else{aP=5386}}while(0);do{if((aP|0)==5386){aP=0;if((iu(s)|0)!=0){break}cb=a[32936]&1;fw=f0^cb<<24>>24!=0;c[7858]=c[s>>2];do{if(cb<<24>>24==0){if((a[30528]&1)!=0){aP=5394;break}gi=c[200]|0;e8=+h[64664+(gi*688&-1)>>3];fl=+h[64672+(gi*688&-1)>>3];if((a[64788+(gi*688&-1)|0]&1)==0){gj=fl;gl=e8}else{if(!(e8>0.0&fl>0.0)){aP=5391;break L7293}aW=+_(+e8);e8=+h[64800+(gi*688&-1)>>3];gj=+_(+fl)/e8;gl=aW/e8}bR=c[6352]|0;gm=(gj-gl)/+(bR-1|0);gn=gl;go=bR}else{aP=5394}}while(0);if((aP|0)==5394){aP=0;gm=fT;gn=aq;go=c[6352]|0}if((go|0)>0){cb=fH+320|0;bB=fH+12|0;bR=fH+23|0;fb=fw^1;bO=fH+244|0;B=fH+248|0;e1=0;while(1){e8=gn+gm*+(e1|0);do{if(+P(+e8)<1.0e-9){if(+P(+gm)<=1.0e-6){gp=e8;break}gp=0.0}else{gp=e8}}while(0);do{if((a[32936]&1)==0){if((a[30528]&1)!=0){gq=gp;break}fe=c[200]|0;if((a[64788+(fe*688&-1)|0]&1)==0){gq=gp;break}gq=+Z(+(gp*+h[64800+(fe*688&-1)>>3]))}else{gq=gp}}while(0);c[7862]=2;h[3932]=gq;h[3933]=0.0;e4(c[7858]|0,t);L7354:do{if((a[1960]&1)==0){fe=c[f$>>2]|0;if((fe|0)==2){gr=+h[f_>>3]}else if((fe|0)==3){aP=5407;break L7293}else if((fe|0)==1){gr=0.0}else{aP=5408;break L7293}e8=+P(+gr);if(e8>+h[11]){aP=5410;break}uE((c[cb>>2]|0)+(e1<<6)|0,0,64);if((fe|0)==1){gs=+(c[fZ>>2]|0)}else if((fe|0)==2){gs=+h[fJ>>3]}else if((fe|0)==3){gs=+uz(c[fI>>2]|0,0)}else{aP=5415;break L7293}h[(c[cb>>2]|0)+(e1<<6)+24>>3]=-1.0;c[(c[cb>>2]|0)+(e1<<6)>>2]=0;if((a[32936]&1)!=0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=gp;h[(c[cb>>2]|0)+(e1<<6)+16>>3]=gs;if(+h[7030]<0.0){break}if((a[56232]&1)==0){break}h[(c[cb>>2]|0)+(e1<<6)+24>>3]=0.0;break}if((a[30528]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=gp;fe=c[bB>>2]|0;if((fe|0)==153&+h[7030]>=0.0){L7374:do{if((a[56232]&1)!=0){h[(c[cb>>2]|0)+(e1<<6)+24>>3]=0.0;d2=c[c9>>2]|0;if((a[64788+(d2*688&-1)|0]&1)==0){e8=+h[7030]*.5;gt=gq+e8;gu=gq-e8}else{e8=+h[64792+(d2*688&-1)>>3];aW=+h[7030];fl=gq*+R(+e8,+(aW*-.5));gt=gq*+R(+e8,+(aW*.5));gu=fl}d2=c[200]|0;if((d2|0)==99){break}L7381:do{if(gu>-8.988465674311579e+307&gu<8.988465674311579e+307){do{if((a[64788+(d2*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+48>>3]=gu}else{if(gu<0.0){break L7381}if(gu==0.0){h[(c[cb>>2]|0)+(e1<<6)+48>>3]=-8.988465674311579e+307;break L7381}else{fl=+_(+gu);h[(c[cb>>2]|0)+(e1<<6)+48>>3]=fl/+h[64800+(d2*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0|(d2|0)<0){break}bs=64712+(d2*688&-1)|0;if(gu<+h[bs>>3]){h[bs>>3]=gu}bs=64664+(d2*688&-1)|0;do{if(gu<+h[bs>>3]){if((c[64648+(d2*688&-1)>>2]&1|0)==0){break L7381}if((c[64728+(d2*688&-1)>>2]&1|0)==0){h[bs>>3]=gu;break}fl=+h[64736+(d2*688&-1)>>3];if(fl>gu){h[bs>>3]=fl;break L7381}else{h[bs>>3]=gu;break}}}while(0);bs=64720+(d2*688&-1)|0;if(gu>+h[bs>>3]){h[bs>>3]=gu}bs=64672+(d2*688&-1)|0;if(gu<=+h[bs>>3]){break}if((c[64648+(d2*688&-1)>>2]&2|0)==0){break}if((c[64732+(d2*688&-1)>>2]&2|0)==0){h[bs>>3]=gu;break}fl=+h[64760+(d2*688&-1)>>3];if(fl<gu){h[bs>>3]=fl;break}else{h[bs>>3]=gu;break}}}while(0);if(!(gt>-8.988465674311579e+307&gt<8.988465674311579e+307)){break}do{if((a[64788+(d2*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=gt}else{if(gt<0.0){break L7374}if(gt==0.0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=-8.988465674311579e+307;break L7374}else{fl=+_(+gt);h[(c[cb>>2]|0)+(e1<<6)+56>>3]=fl/+h[64800+(d2*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0|(d2|0)<0){break}bo=64712+(d2*688&-1)|0;if(gt<+h[bo>>3]){h[bo>>3]=gt}bo=64664+(d2*688&-1)|0;do{if(gt<+h[bo>>3]){if((c[64648+(d2*688&-1)>>2]&1|0)==0){break L7374}if((c[64728+(d2*688&-1)>>2]&1|0)==0){h[bo>>3]=gt;break}fl=+h[64736+(d2*688&-1)>>3];if(fl>gt){h[bo>>3]=fl;break L7374}else{h[bo>>3]=gt;break}}}while(0);bo=64720+(d2*688&-1)|0;if(gt>+h[bo>>3]){h[bo>>3]=gt}bo=64672+(d2*688&-1)|0;if(gt<=+h[bo>>3]){break}if((c[64648+(d2*688&-1)>>2]&2|0)==0){break}if((c[64732+(d2*688&-1)>>2]&2|0)==0){h[bo>>3]=gt;break}fl=+h[64760+(d2*688&-1)>>3];if(fl<gt){h[bo>>3]=fl;break}else{h[bo>>3]=gt;break}}}while(0);gv=c[bB>>2]|0}else{gv=fe}if((gv|0)==457){h[(c[cb>>2]|0)+(e1<<6)+24>>3]=-1.0;h[(c[cb>>2]|0)+(e1<<6)+32>>3]=0.0;h[(c[cb>>2]|0)+(e1<<6)+56>>3]=360.0}else if((gv|0)==489){h[(c[cb>>2]|0)+(e1<<6)+24>>3]=-1.0;h[(c[cb>>2]|0)+(e1<<6)+32>>3]=+h[6214]}if(fw){if((c[200]|0)!=0){break}}else{if((c[144]|0)==99){break}}if(!(gs>-8.988465674311579e+307&gs<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break}bw=c[200]|0;bo=fw?bw:c[144]|0;do{if((a[64788+(bo*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=gs}else{if(gs<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(gs==0.0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{fl=+_(+gs);h[(c[cb>>2]|0)+(e1<<6)+16>>3]=fl/+h[64800+(bo*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0){break}if(!((bw|0)==0|fb)){break}fe=64712+(bo*688&-1)|0;if(gs<+h[fe>>3]){h[fe>>3]=gs}fe=64664+(bo*688&-1)|0;do{if(gs<+h[fe>>3]){if((c[64648+(bo*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}if((c[64728+(bo*688&-1)>>2]&1|0)==0){h[fe>>3]=gs;break}fl=+h[64736+(bo*688&-1)>>3];if(fl>gs){h[fe>>3]=fl;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{h[fe>>3]=gs;break}}}while(0);fe=64720+(bo*688&-1)|0;if(gs>+h[fe>>3]){h[fe>>3]=gs}fe=64672+(bo*688&-1)|0;if(gs<=+h[fe>>3]){break}if((c[64648+(bo*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(bo*688&-1)>>2]&2|0)==0){h[fe>>3]=gs;break}fl=+h[64760+(bo*688&-1)>>3];if(fl<gs){h[fe>>3]=fl;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[fe>>3]=gs;break}}do{if(gs>+h[8686]){if((c[17366]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[8686]=gs;break}}}while(0);fl=+h[8685];do{if(gs<fl){if((c[17366]&1|0)==0){gw=fl;break}h[8685]=0.0;gw=0.0}else{gw=fl}}while(0);bo=(a[69604]&1)==0;do{if(bo){if((c[17366]&1|0)!=0){gx=gs;break}gx=gs-gw}else{fl=+_(+gs);aW=+h[8702];gx=fl/aW- +_(+gw)/aW}}while(0);aW=gq*+h[9040];fl=+T(+aW);e8=gx*fl;fx=+S(+aW);aW=gx*fx;L7521:do{if((c[bB>>2]|0)==345){if((c[bO>>2]|0)!=10){break}fE=+h[B>>3];if(bo){gy=gw;gz=fE}else{fy=+_(+fE);fE=+h[8702];gy=+_(+gw)/fE;gz=fy/fE}fE=gz-gy;fy=fE*fl;fv=fE*fx;fe=c[200]|0;L7527:do{if((fe|0)!=99){if(!(fv>-8.988465674311579e+307&fv<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}do{if((a[64788+(fe*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=fv}else{if(fv<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(fv==0.0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7527}else{fE=+_(+fv);h[(c[cb>>2]|0)+(e1<<6)+56>>3]=fE/+h[64800+(fe*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(fe|0)<0){break}bw=64712+(fe*688&-1)|0;if(fv<+h[bw>>3]){h[bw>>3]=fv}bw=64664+(fe*688&-1)|0;do{if(fv<+h[bw>>3]){if((c[64648+(fe*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7527}if((c[64728+(fe*688&-1)>>2]&1|0)==0){h[bw>>3]=fv;break}fE=+h[64736+(fe*688&-1)>>3];if(fE>fv){h[bw>>3]=fE;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7527}else{h[bw>>3]=fv;break}}}while(0);bw=64720+(fe*688&-1)|0;if(fv>+h[bw>>3]){h[bw>>3]=fv}bw=64672+(fe*688&-1)|0;if(fv<=+h[bw>>3]){break}if((c[64648+(fe*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(fe*688&-1)>>2]&2|0)==0){h[bw>>3]=fv;break}fE=+h[64760+(fe*688&-1)>>3];if(fE<fv){h[bw>>3]=fE;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[bw>>3]=fv;break}}}while(0);fe=c[144]|0;if((fe|0)==99){break}if(!(fy>-8.988465674311579e+307&fy<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}do{if((a[64788+(fe*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+40>>3]=fy}else{if(fy<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(fy==0.0){h[(c[cb>>2]|0)+(e1<<6)+40>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7521}else{fv=+_(+fy);h[(c[cb>>2]|0)+(e1<<6)+40>>3]=fv/+h[64800+(fe*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(fe|0)<0){break}d2=64712+(fe*688&-1)|0;if(fy<+h[d2>>3]){h[d2>>3]=fy}d2=64664+(fe*688&-1)|0;do{if(fy<+h[d2>>3]){if((c[64648+(fe*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7521}if((c[64728+(fe*688&-1)>>2]&1|0)==0){h[d2>>3]=fy;break}fv=+h[64736+(fe*688&-1)>>3];if(fv>fy){h[d2>>3]=fv;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7521}else{h[d2>>3]=fy;break}}}while(0);d2=64720+(fe*688&-1)|0;if(fy>+h[d2>>3]){h[d2>>3]=fy}d2=64672+(fe*688&-1)|0;if(fy<=+h[d2>>3]){break}if((c[64648+(fe*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(fe*688&-1)>>2]&2|0)==0){h[d2>>3]=fy;break}fv=+h[64760+(fe*688&-1)>>3];if(fv<fy){h[d2>>3]=fv;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[d2>>3]=fy;break}}}while(0);bo=c[200]|0;L7618:do{if((bo|0)!=99){if(!(aW>-8.988465674311579e+307&aW<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}do{if((a[64788+(bo*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=aW}else{if(aW<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(aW==0.0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7618}else{fx=+_(+aW);h[(c[cb>>2]|0)+(e1<<6)+8>>3]=fx/+h[64800+(bo*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(bo|0)<0){break}fe=64712+(bo*688&-1)|0;if(aW<+h[fe>>3]){h[fe>>3]=aW}fe=64664+(bo*688&-1)|0;do{if(aW<+h[fe>>3]){if((c[64648+(bo*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7618}if((c[64728+(bo*688&-1)>>2]&1|0)==0){h[fe>>3]=aW;break}fy=+h[64736+(bo*688&-1)>>3];if(fy>aW){h[fe>>3]=fy;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7618}else{h[fe>>3]=aW;break}}}while(0);fe=64720+(bo*688&-1)|0;if(aW>+h[fe>>3]){h[fe>>3]=aW}fe=64672+(bo*688&-1)|0;if(aW<=+h[fe>>3]){break}if((c[64648+(bo*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(bo*688&-1)>>2]&2|0)==0){h[fe>>3]=aW;break}fy=+h[64760+(bo*688&-1)>>3];if(fy<aW){h[fe>>3]=fy;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[fe>>3]=aW;break}}}while(0);bo=c[144]|0;if((bo|0)==99){break}if(!(e8>-8.988465674311579e+307&e8<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break}do{if((a[64788+(bo*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=e8}else{if(e8<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(e8==0.0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{aW=+_(+e8);h[(c[cb>>2]|0)+(e1<<6)+16>>3]=aW/+h[64800+(bo*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(bo|0)<0){break}fe=64712+(bo*688&-1)|0;if(e8<+h[fe>>3]){h[fe>>3]=e8}fe=64664+(bo*688&-1)|0;do{if(e8<+h[fe>>3]){if((c[64648+(bo*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}if((c[64728+(bo*688&-1)>>2]&1|0)==0){h[fe>>3]=e8;break}aW=+h[64736+(bo*688&-1)>>3];if(aW>e8){h[fe>>3]=aW;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{h[fe>>3]=e8;break}}}while(0);fe=64720+(bo*688&-1)|0;if(e8>+h[fe>>3]){h[fe>>3]=e8}fe=64672+(bo*688&-1)|0;if(e8<=+h[fe>>3]){break}if((c[64648+(bo*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(bo*688&-1)>>2]&2|0)==0){h[fe>>3]=e8;break}aW=+h[64760+(bo*688&-1)>>3];if(aW<e8){h[fe>>3]=aW;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[fe>>3]=e8;break}}else{aP=5410}}while(0);if((aP|0)==5410){aP=0;c[(c[cb>>2]|0)+(e1<<6)>>2]=2}fe=e1+1|0;if((fe|0)<(c[6352]|0)){e1=fe}else{gA=fe;break}}}else{gA=0}c[fH+300>>2]=gA;c[13898]=c[fH+4>>2];e1=c[fH>>2]|0;if(fw){gB=aQ;gC=gn;gD=0;gE=1;gF=gm;gG=e1;break L7307}else{gH=aQ;gI=gn;gJ=0;gK=gm;gL=e1;aP=5665;break L7307}}}while(0);c[13898]=c[fH+4>>2];c9=c[fH>>2]|0;if(f0){gB=aQ;gC=aq;gD=0;gE=1;gF=fT;gG=c9}else{gH=aQ;gI=aq;gJ=0;gK=fT;gL=c9;aP=5665}}else if((aP|0)==5664){aP=0;if(f0){gB=f9;gC=aq;gD=bJ;gE=1;gF=fT;gG=fH}else{gH=f9;gI=aq;gJ=bJ;gK=fT;gL=fH;aP=5665}}}while(0);do{if((aP|0)==5665){aP=0;if(!(ix(c[7774]|0)|0)){gB=gH;gC=gI;gD=gJ;gE=0;gF=gK;gG=gL;break}c[13898]=gd;fH=gL;fT=gK;f0=0;fG=gJ;fF=gd;aq=gI;f9=gH;continue L7293}}while(0);bJ=c[7774]|0;if((bJ|0)!=0){c9=bJ;while(1){bJ=c[c9>>2]|0;uu(c[c9+12>>2]|0);uu(c9);if((bJ|0)==0){break}else{c9=bJ}}}c[7774]=0;c9=c[13898]|0;if((c[8272]|0)<=(c9|0)){gM=gB;break}bJ=c[1054]|0;if((a[bJ+(c9*40&-1)|0]&1)==0){gM=gB;break}e1=c[bJ+(c9*40&-1)+36>>2]|0;cb=bJ+(c9*40&-1)+32|0;bJ=c[10036]|0;bR=0;while(1){if((bR|0)>=(e1|0)){break}if((a[bJ+((c[cb>>2]|0)+bR|0)|0]|0)==(a[bR+148464|0]|0)){bR=bR+1|0}else{gM=gB;break L7293}}if((bR|0)!=1){gM=gB;break}c[13898]=c9+1;if(gE){fH=gG;fT=gF;f0=1;fG=gD;fF=gd;aq=gC;f9=gB;continue}c[7774]=iw()|0;fH=gG;fT=gF;f0=0;fG=gD;fF=gd;aq=gC;f9=gB}if((aP|0)==5377){uh(ge,136552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);gM=f9}else if((aP|0)==5391){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832+(gi*24&-1),v)|0)}else if((aP|0)==5407){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5408){uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5415){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[32936]&1)==0){ga=gM;break}fF=c[10814]|0;c[d>>2]=fF;L7738:do{if((gM|0)<1){gN=d;gO=0;gP=gM}else{fG=d;f0=0;fH=fF;fI=1;fJ=gM;while(1){fZ=fG;f_=fH;f$=fI;while(1){gQ=f_|0;gR=c[gQ>>2]|0;if((c[f_+8>>2]|0)==0){break}f1=f$+1|0;if((f1|0)>(fJ|0)){gN=gQ;gO=f0;gP=fJ;break L7738}else{fZ=gQ;f_=gR;f$=f1}}aQ=fJ-1|0;f1=c[f_+300>>2]|0;cb=gR+300|0;if((f1|0)!=(c[cb>>2]|0)){break}if((f1|0)>0){f1=f_+320|0;bJ=gR+320|0;e1=gR+304|0;B=gR+308|0;bO=f_+23|0;bB=f_+304|0;fb=f_+308|0;fe=(a[30528]&1)==0;d2=0;do{L7750:do{if(fe){aq=+h[(c[f1>>2]|0)+(d2<<6)+16>>3];bw=c[bJ>>2]|0;fT=+h[bw+(d2<<6)+16>>3];aW=+h[7030];L7933:do{if(aW<0.0){aP=5874}else{if((a[56232]&1)==0){aP=5874;break}bs=c[e1>>2]|0;if((bs|0)==99){break}fy=aq-aW*.5;L7937:do{if(fy>-8.988465674311579e+307&fy<8.988465674311579e+307){do{if((a[64788+(bs*688&-1)|0]&1)==0){h[bw+(d2<<6)+48>>3]=fy}else{if(fy<0.0){aP=5845;break L7937}if(fy==0.0){h[bw+(d2<<6)+48>>3]=-8.988465674311579e+307;aP=5845;break L7937}else{fx=+_(+fy);h[bw+(d2<<6)+48>>3]=fx/+h[64800+(bs*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5845;break}ea=c[e1>>2]|0;if((ea|0)<0){gS=ea;break}fx=aq- +h[7030]*.5;bV=64712+(ea*688&-1)|0;if(fx<+h[bV>>3]){h[bV>>3]=fx;gT=c[e1>>2]|0}else{gT=ea}ea=64664+(gT*688&-1)|0;do{if(fx<+h[ea>>3]){if((c[64648+(gT*688&-1)>>2]&1|0)==0){aP=5845;break L7937}if((c[64728+(gT*688&-1)>>2]&1|0)==0){h[ea>>3]=fx;break}fl=+h[64736+(gT*688&-1)>>3];if(fl>fx){h[ea>>3]=fl;aP=5845;break L7937}else{h[ea>>3]=fx;break}}}while(0);ea=c[e1>>2]|0;bV=64720+(ea*688&-1)|0;if(fx>+h[bV>>3]){h[bV>>3]=fx;gU=c[e1>>2]|0}else{gU=ea}ea=64672+(gU*688&-1)|0;if(fx<=+h[ea>>3]){gV=gU;aP=5846;break}if((c[64648+(gU*688&-1)>>2]&2|0)==0){aP=5845;break}if((c[64732+(gU*688&-1)>>2]&2|0)==0){h[ea>>3]=fx;aP=5845;break}fl=+h[64760+(gU*688&-1)>>3];if(fl<fx){h[ea>>3]=fl;aP=5845;break}else{h[ea>>3]=fx;aP=5845;break}}else{aP=5845}}while(0);if((aP|0)==5845){aP=0;gV=c[e1>>2]|0;aP=5846}if((aP|0)==5846){aP=0;if((gV|0)==99){aP=5874;break}else{gS=gV}}fy=aq+ +h[7030]*.5;if(!(fy>-8.988465674311579e+307&fy<8.988465674311579e+307)){aP=5874;break}do{if((a[64788+(gS*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=fy}else{if(fy<0.0){aP=5874;break L7933}if(fy==0.0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=-8.988465674311579e+307;aP=5874;break L7933}else{e8=+_(+fy);h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=e8/+h[64800+(gS*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5874;break}bs=c[e1>>2]|0;if((bs|0)<0){gW=bs;aP=5875;break}fy=aq+ +h[7030]*.5;bo=64712+(bs*688&-1)|0;if(fy<+h[bo>>3]){h[bo>>3]=fy;gX=c[e1>>2]|0}else{gX=bs}bs=64664+(gX*688&-1)|0;do{if(fy<+h[bs>>3]){if((c[64648+(gX*688&-1)>>2]&1|0)==0){aP=5874;break L7933}if((c[64728+(gX*688&-1)>>2]&1|0)==0){h[bs>>3]=fy;break}e8=+h[64736+(gX*688&-1)>>3];if(e8>fy){h[bs>>3]=e8;aP=5874;break L7933}else{h[bs>>3]=fy;break}}}while(0);bs=c[e1>>2]|0;bo=64720+(bs*688&-1)|0;if(fy>+h[bo>>3]){h[bo>>3]=fy;gY=c[e1>>2]|0}else{gY=bs}bs=64672+(gY*688&-1)|0;if(fy<=+h[bs>>3]){aP=5874;break}if((c[64648+(gY*688&-1)>>2]&2|0)==0){aP=5874;break}if((c[64732+(gY*688&-1)>>2]&2|0)==0){h[bs>>3]=fy;aP=5874;break}e8=+h[64760+(gY*688&-1)>>3];if(e8<fy){h[bs>>3]=e8;aP=5874;break}else{h[bs>>3]=fy;aP=5874;break}}}while(0);if((aP|0)==5874){aP=0;bw=c[e1>>2]|0;if((bw|0)!=99){gW=bw;aP=5875}}L8015:do{if((aP|0)==5875){aP=0;if(!(aq>-8.988465674311579e+307&aq<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(gW*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=aq}else{if(aq<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L8015}if(aq==0.0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L8015}else{aW=+_(+aq);h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=aW/+h[64800+(gW*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bw=c[e1>>2]|0;if((bw|0)<0){break}bs=64712+(bw*688&-1)|0;if(aq<+h[bs>>3]){h[bs>>3]=aq;gZ=c[e1>>2]|0}else{gZ=bw}bw=64664+(gZ*688&-1)|0;do{if(aq<+h[bw>>3]){if((c[64648+(gZ*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L8015}if((c[64728+(gZ*688&-1)>>2]&1|0)==0){h[bw>>3]=aq;break}fy=+h[64736+(gZ*688&-1)>>3];if(fy>aq){h[bw>>3]=fy;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L8015}else{h[bw>>3]=aq;break}}}while(0);bw=c[e1>>2]|0;bs=64720+(bw*688&-1)|0;if(aq>+h[bs>>3]){h[bs>>3]=aq;g_=c[e1>>2]|0}else{g_=bw}bw=64672+(g_*688&-1)|0;if(aq<=+h[bw>>3]){break}if((c[64648+(g_*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(g_*688&-1)>>2]&2|0)==0){h[bw>>3]=aq;break}fy=+h[64760+(g_*688&-1)>>3];if(fy<aq){h[bw>>3]=fy;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bw>>3]=aq;break}}}while(0);bw=c[B>>2]|0;if((bw|0)==99){break}if(!(fT>-8.988465674311579e+307&fT<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(bw*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=fT}else{if(fT<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L7750}if(fT==0.0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{aq=+_(+fT);h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=aq/+h[64800+(bw*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bw=c[B>>2]|0;if((bw|0)<0){break}bs=64712+(bw*688&-1)|0;if(fT<+h[bs>>3]){h[bs>>3]=fT;g$=c[B>>2]|0}else{g$=bw}bw=64664+(g$*688&-1)|0;do{if(fT<+h[bw>>3]){if((c[64648+(g$*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}if((c[64728+(g$*688&-1)>>2]&1|0)==0){h[bw>>3]=fT;break}aq=+h[64736+(g$*688&-1)>>3];if(aq>fT){h[bw>>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{h[bw>>3]=fT;break}}}while(0);bw=c[B>>2]|0;bs=64720+(bw*688&-1)|0;if(fT>+h[bs>>3]){h[bs>>3]=fT;g0=c[B>>2]|0}else{g0=bw}bw=64672+(g0*688&-1)|0;if(fT<=+h[bw>>3]){break}if((c[64648+(g0*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(g0*688&-1)>>2]&2|0)==0){h[bw>>3]=fT;break}aq=+h[64760+(g0*688&-1)>>3];if(aq<fT){h[bw>>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bw>>3]=fT;break}}else{bw=c[bJ>>2]|0;aq=+h[bw+(d2<<6)+16>>3];fy=+h[(c[f1>>2]|0)+(d2<<6)+16>>3]*+h[9040];bs=c[17366]|0;if((bs&2|0)==0&aq>+h[8686]){c[bw+(d2<<6)>>2]=1;g1=c[17366]|0}else{g1=bs}if((g1&1|0)==0){g2=aq- +h[8685]}else{g2=aq}aq=g2*+S(+fy);aW=g2*+T(+fy);fy=+h[7030];L7758:do{if(fy<0.0){aP=5749}else{if((a[56232]&1)==0){aP=5749;break}bs=c[bB>>2]|0;if((bs|0)==99){break}e8=aq-fy*.5;L7762:do{if(e8>-8.988465674311579e+307&e8<8.988465674311579e+307){do{if((a[64788+(bs*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+48>>3]=e8}else{if(e8<0.0){aP=5720;break L7762}if(e8==0.0){h[(c[bJ>>2]|0)+(d2<<6)+48>>3]=-8.988465674311579e+307;aP=5720;break L7762}else{fl=+_(+e8);h[(c[bJ>>2]|0)+(d2<<6)+48>>3]=fl/+h[64800+(bs*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5720;break}bw=c[bB>>2]|0;if((bw|0)<0){g3=bw;break}fx=aq- +h[7030]*.5;bo=64712+(bw*688&-1)|0;if(fx<+h[bo>>3]){h[bo>>3]=fx;g4=c[bB>>2]|0}else{g4=bw}bw=64664+(g4*688&-1)|0;do{if(fx<+h[bw>>3]){if((c[64648+(g4*688&-1)>>2]&1|0)==0){aP=5720;break L7762}if((c[64728+(g4*688&-1)>>2]&1|0)==0){h[bw>>3]=fx;break}fl=+h[64736+(g4*688&-1)>>3];if(fl>fx){h[bw>>3]=fl;aP=5720;break L7762}else{h[bw>>3]=fx;break}}}while(0);bw=c[bB>>2]|0;bo=64720+(bw*688&-1)|0;if(fx>+h[bo>>3]){h[bo>>3]=fx;g5=c[bB>>2]|0}else{g5=bw}bw=64672+(g5*688&-1)|0;if(fx<=+h[bw>>3]){g6=g5;aP=5721;break}if((c[64648+(g5*688&-1)>>2]&2|0)==0){aP=5720;break}if((c[64732+(g5*688&-1)>>2]&2|0)==0){h[bw>>3]=fx;aP=5720;break}fl=+h[64760+(g5*688&-1)>>3];if(fl<fx){h[bw>>3]=fl;aP=5720;break}else{h[bw>>3]=fx;aP=5720;break}}else{aP=5720}}while(0);if((aP|0)==5720){aP=0;g6=c[bB>>2]|0;aP=5721}if((aP|0)==5721){aP=0;if((g6|0)==99){aP=5749;break}else{g3=g6}}e8=aq+ +h[7030]*.5;if(!(e8>-8.988465674311579e+307&e8<8.988465674311579e+307)){aP=5749;break}do{if((a[64788+(g3*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=e8}else{if(e8<0.0){aP=5749;break L7758}if(e8==0.0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=-8.988465674311579e+307;aP=5749;break L7758}else{fl=+_(+e8);h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=fl/+h[64800+(g3*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5749;break}bs=c[bB>>2]|0;if((bs|0)<0){g7=bs;aP=5750;break}e8=aq+ +h[7030]*.5;bw=64712+(bs*688&-1)|0;if(e8<+h[bw>>3]){h[bw>>3]=e8;g8=c[bB>>2]|0}else{g8=bs}bs=64664+(g8*688&-1)|0;do{if(e8<+h[bs>>3]){if((c[64648+(g8*688&-1)>>2]&1|0)==0){aP=5749;break L7758}if((c[64728+(g8*688&-1)>>2]&1|0)==0){h[bs>>3]=e8;break}fl=+h[64736+(g8*688&-1)>>3];if(fl>e8){h[bs>>3]=fl;aP=5749;break L7758}else{h[bs>>3]=e8;break}}}while(0);bs=c[bB>>2]|0;bw=64720+(bs*688&-1)|0;if(e8>+h[bw>>3]){h[bw>>3]=e8;g9=c[bB>>2]|0}else{g9=bs}bs=64672+(g9*688&-1)|0;if(e8<=+h[bs>>3]){aP=5749;break}if((c[64648+(g9*688&-1)>>2]&2|0)==0){aP=5749;break}if((c[64732+(g9*688&-1)>>2]&2|0)==0){h[bs>>3]=e8;aP=5749;break}fl=+h[64760+(g9*688&-1)>>3];if(fl<e8){h[bs>>3]=fl;aP=5749;break}else{h[bs>>3]=e8;aP=5749;break}}}while(0);if((aP|0)==5749){aP=0;bs=c[bB>>2]|0;if((bs|0)!=99){g7=bs;aP=5750}}L7840:do{if((aP|0)==5750){aP=0;if(!(aq>-8.988465674311579e+307&aq<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(g7*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=aq}else{if(aq<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L7840}if(aq==0.0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7840}else{fy=+_(+aq);h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=fy/+h[64800+(g7*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bs=c[bB>>2]|0;if((bs|0)<0){break}bw=64712+(bs*688&-1)|0;if(aq<+h[bw>>3]){h[bw>>3]=aq;ha=c[bB>>2]|0}else{ha=bs}bs=64664+(ha*688&-1)|0;do{if(aq<+h[bs>>3]){if((c[64648+(ha*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7840}if((c[64728+(ha*688&-1)>>2]&1|0)==0){h[bs>>3]=aq;break}e8=+h[64736+(ha*688&-1)>>3];if(e8>aq){h[bs>>3]=e8;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7840}else{h[bs>>3]=aq;break}}}while(0);bs=c[bB>>2]|0;bw=64720+(bs*688&-1)|0;if(aq>+h[bw>>3]){h[bw>>3]=aq;hb=c[bB>>2]|0}else{hb=bs}bs=64672+(hb*688&-1)|0;if(aq<=+h[bs>>3]){break}if((c[64648+(hb*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(hb*688&-1)>>2]&2|0)==0){h[bs>>3]=aq;break}e8=+h[64760+(hb*688&-1)>>3];if(e8<aq){h[bs>>3]=e8;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bs>>3]=aq;break}}}while(0);bs=c[fb>>2]|0;if((bs|0)==99){break}if(!(aW>-8.988465674311579e+307&aW<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(bs*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=aW}else{if(aW<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L7750}if(aW==0.0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{aq=+_(+aW);h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=aq/+h[64800+(bs*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bs=c[fb>>2]|0;if((bs|0)<0){break}bw=64712+(bs*688&-1)|0;if(aW<+h[bw>>3]){h[bw>>3]=aW;hc=c[fb>>2]|0}else{hc=bs}bs=64664+(hc*688&-1)|0;do{if(aW<+h[bs>>3]){if((c[64648+(hc*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}if((c[64728+(hc*688&-1)>>2]&1|0)==0){h[bs>>3]=aW;break}aq=+h[64736+(hc*688&-1)>>3];if(aq>aW){h[bs>>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{h[bs>>3]=aW;break}}}while(0);bs=c[fb>>2]|0;bw=64720+(bs*688&-1)|0;if(aW>+h[bw>>3]){h[bw>>3]=aW;hd=c[fb>>2]|0}else{hd=bs}bs=64672+(hd*688&-1)|0;if(aW<=+h[bs>>3]){break}if((c[64648+(hd*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(hd*688&-1)>>2]&2|0)==0){h[bs>>3]=aW;break}aq=+h[64760+(hd*688&-1)>>3];if(aq<aW){h[bs>>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bs>>3]=aW;break}}}while(0);d2=d2+1|0;}while((d2|0)<(c[cb>>2]|0))}c[gQ>>2]=f0;c[fZ>>2]=gR;cb=gR|0;d2=f$+1|0;if((d2|0)>(aQ|0)){gN=cb;gO=f_;gP=aQ;break L7738}else{fG=cb;f0=f_;fH=c[cb>>2]|0;fI=d2;fJ=aQ}}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=94952,v)|0)}}while(0);c[10814]=c[d>>2];c[gN>>2]=gO;dc(2,0);if((c[x>>2]|0)==0){ga=gP;break}dc(6,0);ga=gP}}while(0);gP=c[10814]|0;if((ga|0)==0|(gP|0)==0){uf(c[13898]|0,134776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}gO=(c[z>>2]|0)==0;do{if(gO){if((c[x>>2]|0)!=0){aP=5960;break}if((c[gP+8>>2]|0)!=4){aP=5959;break}uf(-1,100088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{g2=+h[8256];gC=+h[8255];if(g2==-8.988465674311579e+307|gC==8.988465674311579e+307){uf(-1,99648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[66036]&1)==0){he=gC;hf=g2}else{h[8255]=g2;h[8256]=gC;he=g2;hf=gC}if((a[66164]&1)==0){aP=5959;break}if(he>0.0&hf>0.0){gC=+_(+he);g2=+h[8272];h[8255]=gC/g2;h[8256]=+_(+hf)/g2;aP=5959;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}}}while(0);do{if((aP|0)==5959){gP=(c[x>>2]|0)==0;if(!gP){aP=5960;break}if(gO){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=98616,v)|0)}z=c[17194]|0;if((z&1|0)!=0){h[8599]=+h[8255]}if((z&2|0)!=0){h[8600]=+h[8256]}if((z|0)!=0){hg=gP;break}if((a[68788]&1)!=0){hf=+h[8599];h[8599]=+h[8600];h[8600]=hf}if((a[68916]&1)==0){hg=gP;break}hf=+h[8599];if(hf<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}he=+h[8600];if(he>0.0){g2=+_(+hf);hf=+h[8616];h[8599]=g2/hf;h[8600]=+_(+he)/hf;hg=gP;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}}}while(0);do{if((aP|0)==5960){hf=+h[8600];he=+h[8599];if(hf==-8.988465674311579e+307|he==8.988465674311579e+307){uf(-1,99648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[68788]&1)==0){hh=he;hi=hf}else{h[8599]=hf;h[8600]=he;hh=hf;hi=he}if((a[68916]&1)==0){hg=0;break}if(hh>0.0&hi>0.0){he=+_(+hh);hf=+h[8616];h[8599]=he/hf;h[8600]=+_(+hi)/hf;hg=0;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}}}while(0);do{if(gO){if(hg){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=98024,v)|0)}aP=c[16506]|0;if((aP&1|0)!=0){h[8255]=+h[8599]}if((aP&2|0)==0){break}h[8256]=+h[8600]}}while(0);hg=(c[y>>2]|0)==0;do{if(!hg){dc(1,97344);if((a[65348]&1)!=0){hi=+h[8169];h[8169]=+h[8170];h[8170]=hi}if((a[65476]&1)==0){break}hi=+h[8169];if(hi<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}hh=+h[8170];if(hh>0.0){hf=+_(+hi);hi=+h[8186];h[8169]=hf/hi;h[8170]=+_(+hh)/hi;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}}}while(0);y=(c[w>>2]|0)==0;do{if(y){if(hg){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=96304,v)|0)}w=c[17022]|0;if((w&1|0)!=0){h[8513]=+h[8169]}if((w&2|0)!=0){h[8514]=+h[8170]}if((w|0)!=0){break}if((a[68100]&1)!=0){hi=+h[8513];h[8513]=+h[8514];h[8514]=hi}if((a[68228]&1)==0){break}hi=+h[8513];if(hi<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}hh=+h[8514];if(hh>0.0){hf=+_(+hi);hi=+h[8530];h[8513]=hf/hi;h[8514]=+_(+hh)/hi;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}}else{dc(5,96768);if((a[68100]&1)!=0){hi=+h[8513];h[8513]=+h[8514];h[8514]=hi}if((a[68228]&1)==0){break}hi=+h[8513];if(hi<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}hh=+h[8514];if(hh>0.0){hf=+_(+hi);hi=+h[8530];h[8513]=hf/hi;h[8514]=+_(+hh)/hi;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}}}while(0);do{if(hg){if(y){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=95912,v)|0)}w=c[16334]|0;if((w&1|0)!=0){h[8169]=+h[8513]}if((w&2|0)==0){break}h[8170]=+h[8514]}}while(0);y=c[7738]|0;L8234:do{if((y|0)!=-1){hg=(c[13898]|0)-1|0;w=c[1054]|0;gO=(c[w+(hg*40&-1)+36>>2]|0)+(c[w+(hg*40&-1)+32>>2]|0)|0;hg=db(c[6924]|0,(gO+1|0)-(c[w+(y*40&-1)+32>>2]|0)|0,116456)|0;c[6924]=hg;w=c[(c[1054]|0)+(y*40&-1)+32>>2]|0;L8236:do{if((w|0)<(gO|0)){aP=w;x=hg;while(1){gP=a[(c[10036]|0)+aP|0]|0;if(gP<<24>>24==0){hj=x;break L8236}z=x+1|0;a[x]=gP;gP=aP+1|0;if((gP|0)<(gO|0)){aP=gP;x=z}else{hj=z;break}}}else{hj=hg}}while(0);a[hj]=0;c[7738]=-1;hg=c[6924]|0;gO=e6(126928)|0;if((gO|0)==0){break}w=gO+8|0;do{if((a[w]&1)==0){x=c[gO+24>>2]|0;if((aY(x|0,hg|0)|0)==0){break L8234}aP=gO+16|0;if((c[aP>>2]|0)!=3){break}uu(x);c[aP>>2]=1}else{a[w]=0}}while(0);if((hg|0)==0){hm=0}else{hm=bP(hg|0)|0}c[gO+16>>2]=3;c[gO+24>>2]=hm}}while(0);hm=c[10814]|0;if((a[14112]&1)!=0){lf(hm,ga);e7(1);i=b;return}fS(hm,ga);hm=0;do{if((c[64656+(hm*688&-1)>>2]&1|0)!=0){hi=+h[64664+(hm*688&-1)>>3];if((a[64788+(hm*688&-1)|0]&1)==0){h[64696+(hm*688&-1)>>3]=hi;ho=+h[64672+(hm*688&-1)>>3]}else{hh=+h[64800+(hm*688&-1)>>3];h[64696+(hm*688&-1)>>3]=+Z(+(hi*hh));ho=+Z(+(+h[64672+(hm*688&-1)>>3]*hh))}h[64704+(hm*688&-1)>>3]=ho}hm=hm+1|0;}while(hm>>>0<11);c[6930]=ga;c[6928]=2;e7(1);i=b;return}function iU(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0;e=(d|0)>0;if(e){f=0;g=b}else{return}while(1){i=c[g+304>>2]|0;j=c[g+308>>2]|0;k=c[g+12>>2]|0;do{if((k|0)==400|(k|0)==416){if((c[64652+(i*688&-1)>>2]|0)==0){if((c[64652+(j*688&-1)>>2]|0)==0){break}}f3(g,1)}else{l=g+300|0;if((c[l>>2]|0)<=0){break}m=g+320|0;n=g+23|0;o=64652+(i*688&-1)|0;p=64672+(i*688&-1)|0;q=64664+(i*688&-1)|0;r=64652+(j*688&-1)|0;s=64672+(j*688&-1)|0;t=64664+(j*688&-1)|0;u=0;do{v=c[m>>2]|0;w=v+(u<<6)|0;do{if((c[w>>2]|0)!=2){c[w>>2]=0;do{if((a[n]&1)==0){x=c[o>>2]|0;do{if((x&1|0)!=0){y=+h[v+(u<<6)+8>>3];if(y>=+h[q>>3]){break}h[q>>3]=y}}while(0);if((x&2|0)==0){break}y=+h[v+(u<<6)+8>>3];if(y<=+h[p>>3]){break}h[p>>3]=y}}while(0);y=+h[q>>3];z=+h[p>>3];A=+h[v+(u<<6)+8>>3];if(y<z){if(A<y|A>z){B=6117}}else{if(A<z|A>y){B=6117}}if((B|0)==6117){B=0;c[w>>2]=1;break}do{if((a[n]&1)==0){C=c[r>>2]|0;do{if((C&1|0)!=0){y=+h[v+(u<<6)+16>>3];if(y>=+h[t>>3]){break}h[t>>3]=y}}while(0);if((C&2|0)==0){break}y=+h[v+(u<<6)+16>>3];if(y<=+h[s>>3]){break}h[s>>3]=y}}while(0);y=+h[t>>3];A=+h[s>>3];z=+h[v+(u<<6)+16>>3];if(y<A){if(!(z<y|z>A)){break}}else{if(!(z<A|z>y)){break}}c[w>>2]=1}}while(0);u=u+1|0;}while((u|0)<(c[l>>2]|0))}}while(0);j=f+1|0;if((j|0)<(d|0)){f=j;g=c[g>>2]|0}else{break}}if(e){D=0;E=b}else{return}while(1){dc(c[E+304>>2]|0,0);dc(c[E+308>>2]|0,0);b=D+1|0;if((b|0)<(d|0)){D=b;E=c[E>>2]|0}else{break}}return}function iV(a,b){a=a|0;b=b|0;return a_(c[(c[a>>2]|0)+60>>2]|0,c[(c[b>>2]|0)+60>>2]|0,64)|0}function iW(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;j=i;if((b|0)==0){uf(-1,92360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=b}while(1){l=k|0;m=c[l>>2]|0;if((m|0)==0){break}else{k=m}}m=ut(192)|0;do{if((m|0)==0){gk();n=ut(192)|0;if((n|0)!=0){o=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84552,v)|0)}else{o=m}}while(0);c[l>>2]=o;uD(o|0,k|0,192);k=c[l>>2]|0;c[k>>2]=0;c[k+4>>2]=e;h[k+24>>3]=+h[d+8>>3];h[k+32>>3]=+h[d+16>>3];h[k+40>>3]=+h[d+24>>3];d=k+72|0;do{if((c[d>>2]|0)==6){h[k+80>>3]=g}else{e=c[b+72>>2]|0;if((e|0)==3){if(+h[b+80>>3]>=0.0){break}c[k+76>>2]=~~g;break}else if((e|0)!=7){break}e=c[8798]|0;l=(e|0)>0;o=~~g;L8336:while(1){m=43264;while(1){p=c[m>>2]|0;if((p|0)==0){break}if((c[p+4>>2]|0)==(o|0)){q=6152;break L8336}else{m=p|0}}m=o-1|0;if(!((o|0)>(e|0)&l)){r=1;s=m;t=0.0;break}o=((m|0)%(e|0)&-1)+1|0}do{if((q|0)==6152){e=c[p+48>>2]|0;o=c[p+52>>2]|0;u=+h[p+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){r=e;s=o;t=u;break}l=(a[p+40|0]&1)==0;r=l?1:e;s=l?c[p+12>>2]|0:o;t=u}}while(0);c[d>>2]=r;c[k+76>>2]=s;h[k+80>>3]=t}}while(0);L8349:do{if((c[b+88>>2]|0)>0){s=k+128|0;if((c[s>>2]|0)==6){h[k+136>>3]=g;break}do{if((c[b+128>>2]|0)==3){if(+h[b+136>>3]>=0.0){break}c[k+132>>2]=~~g;break L8349}}while(0);if((c[b+92>>2]|0)!=-6){break}r=c[8798]|0;d=(r|0)>0;p=~~g;L8359:while(1){o=43264;while(1){w=c[o>>2]|0;if((w|0)==0){break}if((c[w+4>>2]|0)==(p|0)){q=6168;break L8359}else{o=w|0}}o=p-1|0;if(!((p|0)>(r|0)&d)){x=1;y=o;z=0.0;break}p=((o|0)%(r|0)&-1)+1|0}do{if((q|0)==6168){r=c[w+48>>2]|0;p=c[w+52>>2]|0;t=+h[w+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){x=r;y=p;z=t;break}d=(a[w+40|0]&1)==0;x=d?1:r;y=d?c[w+12>>2]|0:p;z=t}}while(0);c[s>>2]=x;c[k+132>>2]=y;h[k+136>>3]=z}}while(0);y=(f|0)==0?179864:f;f=a[47120]|0;L8371:do{if(f<<24>>24==0){L8382:do{if((a[y]|0)==34){x=1;while(1){w=a[y+x|0]|0;if((w<<24>>24|0)==0|(w<<24>>24|0)==34){A=x;break L8382}x=x+1|0}}else{A=0}}while(0);while(1){s=a[y+A|0]|0;if(s<<24>>24==0){B=A;break L8371}if((aM(s<<24>>24|0)|0)==0){A=A+1|0}else{B=A;break}}}else{s=0;x=0;while(1){w=a[y+x|0]|0;if((w<<24>>24|0)==34){C=s^1}else if((w<<24>>24|0)==0){D=x;break}else{if(w<<24>>24!=f<<24>>24|s){C=s}else{D=x;break}}s=C;x=x+1|0}while(1){if((D|0)<=0){B=D;break L8371}x=D-1|0;if((aM(a[y+x|0]|0|0)|0)==0){B=D;break}else{D=x}}}}while(0);do{if((a[y]|0)==34){if((a[y+(B-1|0)|0]|0)!=34){E=B;F=y;break}E=B-2|0;F=y+1|0}else{E=B;F=y}}while(0);y=E+1|0;B=ut(y)|0;if((B|0)!=0){G=B;H=k+60|0;c[H>>2]=G;I=uF(G|0,F|0,E|0)|0;J=c[H>>2]|0;K=J+E|0;a[K]=0;L=c[H>>2]|0;ua(L);i=j;return}gk();B=ut(y)|0;if((B|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224080,v)|0)}else{G=B;H=k+60|0;c[H>>2]=G;I=uF(G|0,F|0,E|0)|0;J=c[H>>2]|0;K=J+E|0;a[K]=0;L=c[H>>2]|0;ua(L);i=j;return}}function iX(b,d,e,f,g,j,k,l,m){b=b|0;d=d|0;e=+e;f=+f;g=+g;j=+j;k=+k;l=+l;m=+m;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0,N=0,O=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0.0,bm=0.0,bn=0.0;n=i;i=i+24|0;o=n|0;p=c[b+320>>2]|0;q=c[60]|0;do{if((q|0)==0){r=f;s=l;t=k}else{c[64]=2;h[33]=f;h[34]=0.0;c[76]=c[64];c[308>>2]=c[260>>2];c[312>>2]=c[264>>2];c[316>>2]=c[268>>2];c[320>>2]=c[272>>2];c[324>>2]=c[276>>2];e4(q,o);do{if((a[1960]&1)==0){u=c[o>>2]|0;if((u|0)==2){w=+h[o+8>>3];break}else if((u|0)==1){w=+(c[o+8>>2]|0);break}else if((u|0)==3){w=+uz(c[o+8>>2]|0,0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{w=0.0}}while(0);c[64]=2;h[33]=k;h[34]=0.0;c[76]=c[64];c[308>>2]=c[260>>2];c[312>>2]=c[264>>2];c[316>>2]=c[268>>2];c[320>>2]=c[272>>2];c[324>>2]=c[276>>2];e4(c[60]|0,o);do{if((a[1960]&1)==0){u=c[o>>2]|0;if((u|0)==3){x=+uz(c[o+8>>2]|0,0);break}else if((u|0)==1){x=+(c[o+8>>2]|0);break}else if((u|0)==2){x=+h[o+8>>3];break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{x=0.0}}while(0);c[64]=2;h[33]=l;h[34]=0.0;c[76]=c[64];c[308>>2]=c[260>>2];c[312>>2]=c[264>>2];c[316>>2]=c[268>>2];c[320>>2]=c[272>>2];c[324>>2]=c[276>>2];e4(c[60]|0,o);if((a[1960]&1)!=0){r=w;s=0.0;t=x;break}u=c[o>>2]|0;if((u|0)==3){r=w;s=+uz(c[o+8>>2]|0,0);t=x;break}else if((u|0)==2){r=w;s=+h[o+8>>3];t=x;break}else if((u|0)==1){r=w;s=+(c[o+8>>2]|0);t=x;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);o=p+(d<<6)|0;c[o>>2]=0;do{if((a[30528]&1)==0){y=e;z=r;A=g;B=s;C=t;D=j}else{if(r<+h[8691]){h[8691]=r}do{if(r<+h[8685]){if((c[17366]&1|0)==0){break}h[8685]=r>0.0?0.0:r}}while(0);if(r>+h[8692]){h[8692]=r}do{if(r>+h[8686]){if((c[17366]&2|0)==0){c[o>>2]=1;break}if((c[17387]&2|0)==0){h[8686]=r;break}x=+h[8697];if(x<r){h[8686]=x;break}else{h[8686]=r;break}}}while(0);q=a[69604]|0;do{if((q&1)==0){u=c[17366]|0;if((u&1|0)!=0){E=r;F=u;break}E=r- +h[8685];F=u}else{x=+h[8685];if(x<=0.0){uf(-1,77440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[17366]|0;if((u&1|0)==0){w=+_(+r);l=+h[8702];E=w/l- +_(+x)/l;F=u;break}else{uf(-1,77440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);l=+h[9040]*e;x=E*+S(+l);w=E*+T(+l);if((c[b+12>>2]|0)==457){l=(j-g)*.5;y=x;z=w;A=x-l;B=s;C=t;D=l+x;break}if((F&2|0)==0&s>+h[8686]){c[o>>2]=1;G=a[69604]|0}else{G=q}do{if((G&1)==0){u=c[17366]|0;if((u&1|0)!=0){H=s;I=u;break}H=s- +h[8685];I=u}else{l=+_(+s);k=+h[8702];f=l/k- +_(+(+h[8685]))/k;H=f;I=c[17366]|0}}while(0);f=+h[9040]*j;k=H*+S(+f);l=H*+T(+f);if((I&2|0)==0&t>+h[8686]){c[o>>2]=1;J=a[69604]|0}else{J=G}do{if((J&1)==0){if((c[17366]&1|0)!=0){K=t;break}K=t- +h[8685]}else{f=+_(+t);L=+h[8702];K=f/L- +_(+(+h[8685]))/L}}while(0);L=+h[9040]*g;f=K*+S(+L);y=x;z=w;A=f;B=l;C=K*+T(+L);D=k}}while(0);J=b+304|0;G=c[J>>2]|0;L8481:do{if((G|0)!=99){if(!(y>-8.988465674311579e+307&y<8.988465674311579e+307)){c[o>>2]=2;i=n;return}do{if((a[64788+(G*688&-1)|0]&1)==0){h[p+(d<<6)+8>>3]=y}else{if(y<0.0){c[o>>2]=2;i=n;return}if(y==0.0){h[p+(d<<6)+8>>3]=-8.988465674311579e+307;c[o>>2]=1;break L8481}else{K=+_(+y);h[p+(d<<6)+8>>3]=K/+h[64800+(G*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){break}if((c[o>>2]|0)!=0){break}I=c[J>>2]|0;if((I|0)<0){break}F=64712+(I*688&-1)|0;if(y<+h[F>>3]){h[F>>3]=y;M=c[J>>2]|0}else{M=I}I=64664+(M*688&-1)|0;do{if(y<+h[I>>3]){if((c[64648+(M*688&-1)>>2]&1|0)==0){c[o>>2]=1;break L8481}if((c[64728+(M*688&-1)>>2]&1|0)==0){h[I>>3]=y;break}k=+h[64736+(M*688&-1)>>3];if(k>y){h[I>>3]=k;c[o>>2]=1;break L8481}else{h[I>>3]=y;break}}}while(0);I=c[J>>2]|0;F=64720+(I*688&-1)|0;if(y>+h[F>>3]){h[F>>3]=y;N=c[J>>2]|0}else{N=I}I=64672+(N*688&-1)|0;if(y<=+h[I>>3]){break}if((c[64648+(N*688&-1)>>2]&2|0)==0){c[o>>2]=1;break}if((c[64732+(N*688&-1)>>2]&2|0)==0){h[I>>3]=y;break}k=+h[64760+(N*688&-1)>>3];if(k<y){h[I>>3]=k;c[o>>2]=1;break}else{h[I>>3]=y;break}}}while(0);N=b+308|0;M=c[N>>2]|0;L8530:do{if((M|0)!=99){if(!(z>-8.988465674311579e+307&z<8.988465674311579e+307)){c[o>>2]=2;i=n;return}do{if((a[64788+(M*688&-1)|0]&1)==0){h[p+(d<<6)+16>>3]=z}else{if(z<0.0){c[o>>2]=2;i=n;return}if(z==0.0){h[p+(d<<6)+16>>3]=-8.988465674311579e+307;c[o>>2]=1;break L8530}else{k=+_(+z);h[p+(d<<6)+16>>3]=k/+h[64800+(M*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){break}if((c[o>>2]|0)!=0){break}G=c[N>>2]|0;if((G|0)<0){break}I=64712+(G*688&-1)|0;if(z<+h[I>>3]){h[I>>3]=z;O=c[N>>2]|0}else{O=G}G=64664+(O*688&-1)|0;do{if(z<+h[G>>3]){if((c[64648+(O*688&-1)>>2]&1|0)==0){c[o>>2]=1;break L8530}if((c[64728+(O*688&-1)>>2]&1|0)==0){h[G>>3]=z;break}k=+h[64736+(O*688&-1)>>3];if(k>z){h[G>>3]=k;c[o>>2]=1;break L8530}else{h[G>>3]=z;break}}}while(0);G=c[N>>2]|0;I=64720+(G*688&-1)|0;if(z>+h[I>>3]){h[I>>3]=z;Q=c[N>>2]|0}else{Q=G}G=64672+(Q*688&-1)|0;if(z<=+h[G>>3]){break}if((c[64648+(Q*688&-1)>>2]&2|0)==0){c[o>>2]=1;break}if((c[64732+(Q*688&-1)>>2]&2|0)==0){h[G>>3]=z;break}k=+h[64760+(Q*688&-1)>>3];if(k<z){h[G>>3]=k;c[o>>2]=1;break}else{h[G>>3]=z;break}}}while(0);Q=c[b+12>>2]|0;L8579:do{if((Q|0)==474){h[p+(d<<6)+32>>3]=C;O=c[N>>2]|0;L8581:do{if((O|0)==99){R=0}else{if(!(B>-8.988465674311579e+307&B<8.988465674311579e+307)){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;R=2;break}do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+40>>3]=B}else{if(B<0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;R=2;break L8581}if(B==0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;R=1;break L8581}else{k=+_(+B);h[p+(d<<6)+40>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){R=0;break}M=c[N>>2]|0;if((M|0)<0){R=0;break}G=64712+(M*688&-1)|0;if(B<+h[G>>3]){h[G>>3]=B;U=c[N>>2]|0}else{U=M}M=64664+(U*688&-1)|0;do{if(B<+h[M>>3]){if((c[64648+(U*688&-1)>>2]&1|0)==0){R=1;break L8581}if((c[64728+(U*688&-1)>>2]&1|0)==0){h[M>>3]=B;break}k=+h[64736+(U*688&-1)>>3];if(k>B){h[M>>3]=k;R=1;break L8581}else{h[M>>3]=B;break}}}while(0);M=c[N>>2]|0;G=64720+(M*688&-1)|0;if(B>+h[G>>3]){h[G>>3]=B;V=c[N>>2]|0}else{V=M}M=64672+(V*688&-1)|0;if(B<=+h[M>>3]){R=0;break}if((c[64648+(V*688&-1)>>2]&2|0)==0){R=1;break}if((c[64732+(V*688&-1)>>2]&2|0)==0){h[M>>3]=B;R=0;break}k=+h[64760+(V*688&-1)>>3];if(k<B){h[M>>3]=k;R=1;break}else{h[M>>3]=B;R=0;break}}}while(0);O=c[J>>2]|0;if((O|0)==99){W=R;break}L8624:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;X=2;Y=6440;break L8624}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;X=1;Y=6440;break L8624}else{k=+_(+A);h[p+(d<<6)+48>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(R|0)==0)){X=R;Y=6440;break}M=c[J>>2]|0;if((M|0)<0){Z=M;$=0;break}G=64712+(M*688&-1)|0;if(A<+h[G>>3]){h[G>>3]=A;aa=c[J>>2]|0}else{aa=M}M=64664+(aa*688&-1)|0;do{if(A<+h[M>>3]){if((c[64648+(aa*688&-1)>>2]&1|0)==0){X=1;Y=6440;break L8624}if((c[64728+(aa*688&-1)>>2]&1|0)==0){h[M>>3]=A;break}k=+h[64736+(aa*688&-1)>>3];if(k>A){h[M>>3]=k;X=1;Y=6440;break L8624}else{h[M>>3]=A;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(A>+h[G>>3]){h[G>>3]=A;ab=c[J>>2]|0}else{ab=M}M=64672+(ab*688&-1)|0;if(A<=+h[M>>3]){ac=0;ad=ab;Y=6441;break}if((c[64648+(ab*688&-1)>>2]&2|0)==0){X=1;Y=6440;break}if((c[64732+(ab*688&-1)>>2]&2|0)==0){h[M>>3]=A;X=0;Y=6440;break}k=+h[64760+(ab*688&-1)>>3];if(k<A){h[M>>3]=k;X=1;Y=6440;break}else{h[M>>3]=A;X=0;Y=6440;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;X=2;Y=6440}}while(0);if((Y|0)==6440){ac=X;ad=c[J>>2]|0;Y=6441}if((Y|0)==6441){if((ad|0)==99){W=ac;break}else{Z=ad;$=ac}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break}do{if((a[64788+(Z*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break L8579}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=1;break L8579}else{k=+_(+D);h[p+(d<<6)+56>>3]=k/+h[64800+(Z*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&($|0)==0)){W=$;break}O=c[J>>2]|0;if((O|0)<0){W=0;break}M=64712+(O*688&-1)|0;if(D<+h[M>>3]){h[M>>3]=D;ae=c[J>>2]|0}else{ae=O}O=64664+(ae*688&-1)|0;do{if(D<+h[O>>3]){if((c[64648+(ae*688&-1)>>2]&1|0)==0){W=1;break L8579}if((c[64728+(ae*688&-1)>>2]&1|0)==0){h[O>>3]=D;break}k=+h[64736+(ae*688&-1)>>3];if(k>D){h[O>>3]=k;W=1;break L8579}else{h[O>>3]=D;break}}}while(0);O=c[J>>2]|0;M=64720+(O*688&-1)|0;if(D>+h[M>>3]){h[M>>3]=D;af=c[J>>2]|0}else{af=O}O=64672+(af*688&-1)|0;if(D<=+h[O>>3]){W=0;break}if((c[64648+(af*688&-1)>>2]&2|0)==0){W=1;break}if((c[64732+(af*688&-1)>>2]&2|0)==0){h[O>>3]=D;W=0;break}k=+h[64760+(af*688&-1)>>3];if(k<D){h[O>>3]=k;W=1;break}else{h[O>>3]=D;W=0;break}}else if((Q|0)==18|(Q|0)==1|(Q|0)==51|(Q|0)==368|(Q|0)==64|(Q|0)==33|(Q|0)==177|(Q|0)==193|(Q|0)==209){h[p+(d<<6)+48>>3]=A;h[p+(d<<6)+56>>3]=D;h[p+(d<<6)+32>>3]=C;h[p+(d<<6)+40>>3]=B;W=0}else if((Q|0)==153){h[p+(d<<6)+32>>3]=C;h[p+(d<<6)+40>>3]=B;O=c[J>>2]|0;if((O|0)==99){W=0;break}L8710:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;ag=2;Y=6349;break L8710}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;ag=1;Y=6349;break L8710}else{k=+_(+A);h[p+(d<<6)+48>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){ag=0;Y=6349;break}M=c[J>>2]|0;if((M|0)<0){ah=M;ai=0;break}G=64712+(M*688&-1)|0;if(A<+h[G>>3]){h[G>>3]=A;aj=c[J>>2]|0}else{aj=M}M=64664+(aj*688&-1)|0;do{if(A<+h[M>>3]){if((c[64648+(aj*688&-1)>>2]&1|0)==0){ag=1;Y=6349;break L8710}if((c[64728+(aj*688&-1)>>2]&1|0)==0){h[M>>3]=A;break}k=+h[64736+(aj*688&-1)>>3];if(k>A){h[M>>3]=k;ag=1;Y=6349;break L8710}else{h[M>>3]=A;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(A>+h[G>>3]){h[G>>3]=A;ak=c[J>>2]|0}else{ak=M}M=64672+(ak*688&-1)|0;if(A<=+h[M>>3]){al=0;am=ak;Y=6350;break}if((c[64648+(ak*688&-1)>>2]&2|0)==0){ag=1;Y=6349;break}if((c[64732+(ak*688&-1)>>2]&2|0)==0){h[M>>3]=A;ag=0;Y=6349;break}k=+h[64760+(ak*688&-1)>>3];if(k<A){h[M>>3]=k;ag=1;Y=6349;break}else{h[M>>3]=A;ag=0;Y=6349;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;ag=2;Y=6349}}while(0);if((Y|0)==6349){al=ag;am=c[J>>2]|0;Y=6350}if((Y|0)==6350){if((am|0)==99){W=al;break}else{ah=am;ai=al}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break}do{if((a[64788+(ah*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break L8579}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=1;break L8579}else{k=+_(+D);h[p+(d<<6)+56>>3]=k/+h[64800+(ah*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(ai|0)==0)){W=ai;break}O=c[J>>2]|0;if((O|0)<0){W=0;break}M=64712+(O*688&-1)|0;if(D<+h[M>>3]){h[M>>3]=D;an=c[J>>2]|0}else{an=O}O=64664+(an*688&-1)|0;do{if(D<+h[O>>3]){if((c[64648+(an*688&-1)>>2]&1|0)==0){W=1;break L8579}if((c[64728+(an*688&-1)>>2]&1|0)==0){h[O>>3]=D;break}k=+h[64736+(an*688&-1)>>3];if(k>D){h[O>>3]=k;W=1;break L8579}else{h[O>>3]=D;break}}}while(0);O=c[J>>2]|0;M=64720+(O*688&-1)|0;if(D>+h[M>>3]){h[M>>3]=D;ao=c[J>>2]|0}else{ao=O}O=64672+(ao*688&-1)|0;if(D<=+h[O>>3]){W=0;break}if((c[64648+(ao*688&-1)>>2]&2|0)==0){W=1;break}if((c[64732+(ao*688&-1)>>2]&2|0)==0){h[O>>3]=D;W=0;break}k=+h[64760+(ao*688&-1)>>3];if(k<D){h[O>>3]=k;W=1;break}else{h[O>>3]=D;W=0;break}}else if((Q|0)==457){h[p+(d<<6)+40>>3]=B;O=c[J>>2]|0;L8794:do{if((O|0)==99){ap=0}else{L8796:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aq=2;Y=6501;break L8796}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aq=1;Y=6501;break L8796}else{k=+_(+A);h[p+(d<<6)+48>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){aq=0;Y=6501;break}M=c[J>>2]|0;if((M|0)<0){ar=M;as=0;break}G=64712+(M*688&-1)|0;if(A<+h[G>>3]){h[G>>3]=A;at=c[J>>2]|0}else{at=M}M=64664+(at*688&-1)|0;do{if(A<+h[M>>3]){if((c[64648+(at*688&-1)>>2]&1|0)==0){aq=1;Y=6501;break L8796}if((c[64728+(at*688&-1)>>2]&1|0)==0){h[M>>3]=A;break}k=+h[64736+(at*688&-1)>>3];if(k>A){h[M>>3]=k;aq=1;Y=6501;break L8796}else{h[M>>3]=A;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(A>+h[G>>3]){h[G>>3]=A;au=c[J>>2]|0}else{au=M}M=64672+(au*688&-1)|0;if(A<=+h[M>>3]){av=0;aw=au;Y=6502;break}if((c[64648+(au*688&-1)>>2]&2|0)==0){aq=1;Y=6501;break}if((c[64732+(au*688&-1)>>2]&2|0)==0){h[M>>3]=A;aq=0;Y=6501;break}k=+h[64760+(au*688&-1)>>3];if(k<A){h[M>>3]=k;aq=1;Y=6501;break}else{h[M>>3]=A;aq=0;Y=6501;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aq=2;Y=6501}}while(0);if((Y|0)==6501){av=aq;aw=c[J>>2]|0;Y=6502}if((Y|0)==6502){if((aw|0)==99){ap=av;break}else{ar=aw;as=av}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;ap=2;break}do{if((a[64788+(ar*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;ap=2;break L8794}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;ap=1;break L8794}else{k=+_(+D);h[p+(d<<6)+56>>3]=k/+h[64800+(ar*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(as|0)==0)){ap=as;break}M=c[J>>2]|0;if((M|0)<0){ap=0;break}G=64712+(M*688&-1)|0;if(D<+h[G>>3]){h[G>>3]=D;ax=c[J>>2]|0}else{ax=M}M=64664+(ax*688&-1)|0;do{if(D<+h[M>>3]){if((c[64648+(ax*688&-1)>>2]&1|0)==0){ap=1;break L8794}if((c[64728+(ax*688&-1)>>2]&1|0)==0){h[M>>3]=D;break}k=+h[64736+(ax*688&-1)>>3];if(k>D){h[M>>3]=k;ap=1;break L8794}else{h[M>>3]=D;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(D>+h[G>>3]){h[G>>3]=D;ay=c[J>>2]|0}else{ay=M}M=64672+(ay*688&-1)|0;if(D<=+h[M>>3]){ap=0;break}if((c[64648+(ay*688&-1)>>2]&2|0)==0){ap=1;break}if((c[64732+(ay*688&-1)>>2]&2|0)==0){h[M>>3]=D;ap=0;break}k=+h[64760+(ay*688&-1)>>3];if(k<D){h[M>>3]=k;ap=1;break}else{h[M>>3]=D;ap=0;break}}}while(0);h[p+(d<<6)+32>>3]=C;h[p+(d<<6)+56>>3]=B;if(+P(+C)<=1.0e3){if(+P(+B)<=1.0e3){W=ap;break}}c[o>>2]=2;W=ap}else if((Q|0)==489){O=c[J>>2]|0;L9055:do{if((O|0)==99){az=0}else{k=(A>D?A:D)*.5;M=b+272|0;l=y-k*((c[M>>2]|0)==1?1.1:1.0);L9057:do{if(l>-8.988465674311579e+307&l<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=l}else{if(l<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aA=2;Y=6565;break L9057}if(l==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aA=1;Y=6565;break L9057}else{w=+_(+l);h[p+(d<<6)+48>>3]=w/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){aA=0;Y=6565;break}G=c[J>>2]|0;if((G|0)<0){aB=G;aC=0;break}I=c[M>>2]|0;w=y-k*((I|0)==1?1.1:1.0);F=64712+(G*688&-1)|0;if(w<+h[F>>3]){h[F>>3]=w;aD=c[M>>2]|0;aE=c[J>>2]|0}else{aD=I;aE=G}w=y-k*((aD|0)==1?1.1:1.0);G=64664+(aE*688&-1)|0;do{if(w<+h[G>>3]){if((c[64648+(aE*688&-1)>>2]&1|0)==0){aA=1;Y=6565;break L9057}if((c[64728+(aE*688&-1)>>2]&1|0)==0){h[G>>3]=w;break}x=+h[64736+(aE*688&-1)>>3];if(x>w){h[G>>3]=x;aA=1;Y=6565;break L9057}else{h[G>>3]=w;break}}}while(0);G=c[M>>2]|0;w=y-k*((G|0)==1?1.1:1.0);I=c[J>>2]|0;F=64720+(I*688&-1)|0;if(w>+h[F>>3]){h[F>>3]=w;aF=c[M>>2]|0;aG=c[J>>2]|0}else{aF=G;aG=I}w=y-k*((aF|0)==1?1.1:1.0);I=64672+(aG*688&-1)|0;if(w<=+h[I>>3]){aH=0;aI=aG;Y=6566;break}if((c[64648+(aG*688&-1)>>2]&2|0)==0){aA=1;Y=6565;break}if((c[64732+(aG*688&-1)>>2]&2|0)==0){h[I>>3]=w;aA=0;Y=6565;break}x=+h[64760+(aG*688&-1)>>3];if(x<w){h[I>>3]=x;aA=1;Y=6565;break}else{h[I>>3]=w;aA=0;Y=6565;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aA=2;Y=6565}}while(0);if((Y|0)==6565){aH=aA;aI=c[J>>2]|0;Y=6566}if((Y|0)==6566){if((aI|0)==99){az=aH;break}else{aB=aI;aC=aH}}l=y+k*((c[M>>2]|0)==1?1.1:1.0);if(!(l>-8.988465674311579e+307&l<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;az=2;break}do{if((a[64788+(aB*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=l}else{if(l<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;az=2;break L9055}if(l==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;az=1;break L9055}else{w=+_(+l);h[p+(d<<6)+56>>3]=w/+h[64800+(aB*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(aC|0)==0)){az=aC;break}I=c[J>>2]|0;if((I|0)<0){az=0;break}G=c[M>>2]|0;l=y+k*((G|0)==1?1.1:1.0);F=64712+(I*688&-1)|0;if(l<+h[F>>3]){h[F>>3]=l;aJ=c[M>>2]|0;aK=c[J>>2]|0}else{aJ=G;aK=I}l=y+k*((aJ|0)==1?1.1:1.0);I=64664+(aK*688&-1)|0;do{if(l<+h[I>>3]){if((c[64648+(aK*688&-1)>>2]&1|0)==0){az=1;break L9055}if((c[64728+(aK*688&-1)>>2]&1|0)==0){h[I>>3]=l;break}w=+h[64736+(aK*688&-1)>>3];if(w>l){h[I>>3]=w;az=1;break L9055}else{h[I>>3]=l;break}}}while(0);I=c[M>>2]|0;l=y+k*((I|0)==1?1.1:1.0);G=c[J>>2]|0;F=64720+(G*688&-1)|0;if(l>+h[F>>3]){h[F>>3]=l;aL=c[M>>2]|0;aM=c[J>>2]|0}else{aL=I;aM=G}l=y+k*((aL|0)==1?1.1:1.0);G=64672+(aM*688&-1)|0;if(l<=+h[G>>3]){az=0;break}if((c[64648+(aM*688&-1)>>2]&2|0)==0){az=1;break}if((c[64732+(aM*688&-1)>>2]&2|0)==0){h[G>>3]=l;az=0;break}w=+h[64760+(aM*688&-1)>>3];if(w<l){h[G>>3]=w;az=1;break}else{h[G>>3]=l;az=0;break}}}while(0);O=c[N>>2]|0;L9141:do{if((O|0)==99){aN=az}else{l=(A>D?A:D)*.5;G=b+272|0;w=z-l*((c[G>>2]|0)==2?1.0:1.4);L9143:do{if(w>-8.988465674311579e+307&w<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+32>>3]=w}else{if(w<0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;aO=2;Y=6626;break L9143}if(w==0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;aO=1;Y=6626;break L9143}else{x=+_(+w);h[p+(d<<6)+32>>3]=x/+h[64800+(O*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(az|0)==0)){aO=az;Y=6626;break}I=c[N>>2]|0;if((I|0)<0){aP=I;aQ=0;break}F=c[G>>2]|0;x=z-l*((F|0)==2?1.0:1.4);q=64712+(I*688&-1)|0;if(x<+h[q>>3]){h[q>>3]=x;aR=c[G>>2]|0;aS=c[N>>2]|0}else{aR=F;aS=I}x=z-l*((aR|0)==2?1.0:1.4);I=64664+(aS*688&-1)|0;do{if(x<+h[I>>3]){if((c[64648+(aS*688&-1)>>2]&1|0)==0){aO=1;Y=6626;break L9143}if((c[64728+(aS*688&-1)>>2]&1|0)==0){h[I>>3]=x;break}K=+h[64736+(aS*688&-1)>>3];if(K>x){h[I>>3]=K;aO=1;Y=6626;break L9143}else{h[I>>3]=x;break}}}while(0);I=c[G>>2]|0;x=z-l*((I|0)==2?1.0:1.4);F=c[N>>2]|0;q=64720+(F*688&-1)|0;if(x>+h[q>>3]){h[q>>3]=x;aT=c[G>>2]|0;aU=c[N>>2]|0}else{aT=I;aU=F}x=z-l*((aT|0)==2?1.0:1.4);F=64672+(aU*688&-1)|0;if(x<=+h[F>>3]){aV=0;aW=aU;Y=6627;break}if((c[64648+(aU*688&-1)>>2]&2|0)==0){aO=1;Y=6626;break}if((c[64732+(aU*688&-1)>>2]&2|0)==0){h[F>>3]=x;aO=0;Y=6626;break}K=+h[64760+(aU*688&-1)>>3];if(K<x){h[F>>3]=K;aO=1;Y=6626;break}else{h[F>>3]=x;aO=0;Y=6626;break}}else{h[p+(d<<6)+32>>3]=-8.988465674311579e+307;aO=2;Y=6626}}while(0);if((Y|0)==6626){aV=aO;aW=c[N>>2]|0;Y=6627}if((Y|0)==6627){if((aW|0)==99){aN=aV;break}else{aP=aW;aQ=aV}}w=z+l*((c[G>>2]|0)==2?1.0:1.4);if(!(w>-8.988465674311579e+307&w<8.988465674311579e+307)){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;aN=2;break}do{if((a[64788+(aP*688&-1)|0]&1)==0){h[p+(d<<6)+40>>3]=w}else{if(w<0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;aN=2;break L9141}if(w==0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;aN=1;break L9141}else{k=+_(+w);h[p+(d<<6)+40>>3]=k/+h[64800+(aP*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(aQ|0)==0)){aN=aQ;break}M=c[N>>2]|0;if((M|0)<0){aN=0;break}F=c[G>>2]|0;w=z+l*((F|0)==2?1.0:1.4);I=64712+(M*688&-1)|0;if(w<+h[I>>3]){h[I>>3]=w;aX=c[G>>2]|0;aY=c[N>>2]|0}else{aX=F;aY=M}w=z+l*((aX|0)==2?1.0:1.4);M=64664+(aY*688&-1)|0;do{if(w<+h[M>>3]){if((c[64648+(aY*688&-1)>>2]&1|0)==0){aN=1;break L9141}if((c[64728+(aY*688&-1)>>2]&1|0)==0){h[M>>3]=w;break}k=+h[64736+(aY*688&-1)>>3];if(k>w){h[M>>3]=k;aN=1;break L9141}else{h[M>>3]=w;break}}}while(0);M=c[G>>2]|0;w=z+l*((M|0)==2?1.0:1.4);F=c[N>>2]|0;I=64720+(F*688&-1)|0;if(w>+h[I>>3]){h[I>>3]=w;aZ=c[G>>2]|0;a_=c[N>>2]|0}else{aZ=M;a_=F}w=z+l*((aZ|0)==2?1.0:1.4);F=64672+(a_*688&-1)|0;if(w<=+h[F>>3]){aN=0;break}if((c[64648+(a_*688&-1)>>2]&2|0)==0){aN=1;break}if((c[64732+(a_*688&-1)>>2]&2|0)==0){h[F>>3]=w;aN=0;break}k=+h[64760+(a_*688&-1)>>3];if(k<w){h[F>>3]=k;aN=1;break}else{h[F>>3]=w;aN=0;break}}}while(0);h[p+(d<<6)+48>>3]=A;h[p+(d<<6)+56>>3]=D;h[p+(d<<6)+32>>3]=C;W=aN}else{O=c[J>>2]|0;L8884:do{if((O|0)==99){a$=0}else{L8886:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;a0=2;Y=6688;break L8886}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;a0=1;Y=6688;break L8886}else{w=+_(+A);h[p+(d<<6)+48>>3]=w/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){a0=0;Y=6688;break}F=c[J>>2]|0;if((F|0)<0){a1=F;a2=0;break}M=64712+(F*688&-1)|0;if(A<+h[M>>3]){h[M>>3]=A;a3=c[J>>2]|0}else{a3=F}F=64664+(a3*688&-1)|0;do{if(A<+h[F>>3]){if((c[64648+(a3*688&-1)>>2]&1|0)==0){a0=1;Y=6688;break L8886}if((c[64728+(a3*688&-1)>>2]&1|0)==0){h[F>>3]=A;break}w=+h[64736+(a3*688&-1)>>3];if(w>A){h[F>>3]=w;a0=1;Y=6688;break L8886}else{h[F>>3]=A;break}}}while(0);F=c[J>>2]|0;M=64720+(F*688&-1)|0;if(A>+h[M>>3]){h[M>>3]=A;a4=c[J>>2]|0}else{a4=F}F=64672+(a4*688&-1)|0;if(A<=+h[F>>3]){a5=0;a6=a4;Y=6689;break}if((c[64648+(a4*688&-1)>>2]&2|0)==0){a0=1;Y=6688;break}if((c[64732+(a4*688&-1)>>2]&2|0)==0){h[F>>3]=A;a0=0;Y=6688;break}w=+h[64760+(a4*688&-1)>>3];if(w<A){h[F>>3]=w;a0=1;Y=6688;break}else{h[F>>3]=A;a0=0;Y=6688;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;a0=2;Y=6688}}while(0);if((Y|0)==6688){a5=a0;a6=c[J>>2]|0;Y=6689}if((Y|0)==6689){if((a6|0)==99){a$=a5;break}else{a1=a6;a2=a5}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;a$=2;break}do{if((a[64788+(a1*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;a$=2;break L8884}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;a$=1;break L8884}else{l=+_(+D);h[p+(d<<6)+56>>3]=l/+h[64800+(a1*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(a2|0)==0)){a$=a2;break}G=c[J>>2]|0;if((G|0)<0){a$=0;break}F=64712+(G*688&-1)|0;if(D<+h[F>>3]){h[F>>3]=D;a7=c[J>>2]|0}else{a7=G}G=64664+(a7*688&-1)|0;do{if(D<+h[G>>3]){if((c[64648+(a7*688&-1)>>2]&1|0)==0){a$=1;break L8884}if((c[64728+(a7*688&-1)>>2]&1|0)==0){h[G>>3]=D;break}l=+h[64736+(a7*688&-1)>>3];if(l>D){h[G>>3]=l;a$=1;break L8884}else{h[G>>3]=D;break}}}while(0);G=c[J>>2]|0;F=64720+(G*688&-1)|0;if(D>+h[F>>3]){h[F>>3]=D;a8=c[J>>2]|0}else{a8=G}G=64672+(a8*688&-1)|0;if(D<=+h[G>>3]){a$=0;break}if((c[64648+(a8*688&-1)>>2]&2|0)==0){a$=1;break}if((c[64732+(a8*688&-1)>>2]&2|0)==0){h[G>>3]=D;a$=0;break}l=+h[64760+(a8*688&-1)>>3];if(l<D){h[G>>3]=l;a$=1;break}else{h[G>>3]=D;a$=0;break}}}while(0);O=c[N>>2]|0;if((O|0)==99){W=a$;break}L8971:do{if(C>-8.988465674311579e+307&C<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+32>>3]=C}else{if(C<0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;a9=2;Y=6749;break L8971}if(C==0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;a9=1;Y=6749;break L8971}else{l=+_(+C);h[p+(d<<6)+32>>3]=l/+h[64800+(O*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(a$|0)==0)){a9=a$;Y=6749;break}G=c[N>>2]|0;if((G|0)<0){ba=G;bb=0;break}F=64712+(G*688&-1)|0;if(C<+h[F>>3]){h[F>>3]=C;bc=c[N>>2]|0}else{bc=G}G=64664+(bc*688&-1)|0;do{if(C<+h[G>>3]){if((c[64648+(bc*688&-1)>>2]&1|0)==0){a9=1;Y=6749;break L8971}if((c[64728+(bc*688&-1)>>2]&1|0)==0){h[G>>3]=C;break}l=+h[64736+(bc*688&-1)>>3];if(l>C){h[G>>3]=l;a9=1;Y=6749;break L8971}else{h[G>>3]=C;break}}}while(0);G=c[N>>2]|0;F=64720+(G*688&-1)|0;if(C>+h[F>>3]){h[F>>3]=C;bd=c[N>>2]|0}else{bd=G}G=64672+(bd*688&-1)|0;if(C<=+h[G>>3]){be=0;bf=bd;Y=6750;break}if((c[64648+(bd*688&-1)>>2]&2|0)==0){a9=1;Y=6749;break}if((c[64732+(bd*688&-1)>>2]&2|0)==0){h[G>>3]=C;a9=0;Y=6749;break}l=+h[64760+(bd*688&-1)>>3];if(l<C){h[G>>3]=l;a9=1;Y=6749;break}else{h[G>>3]=C;a9=0;Y=6749;break}}else{h[p+(d<<6)+32>>3]=-8.988465674311579e+307;a9=2;Y=6749}}while(0);if((Y|0)==6749){be=a9;bf=c[N>>2]|0;Y=6750}if((Y|0)==6750){if((bf|0)==99){W=be;break}else{ba=bf;bb=be}}if(!(B>-8.988465674311579e+307&B<8.988465674311579e+307)){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;W=2;break}do{if((a[64788+(ba*688&-1)|0]&1)==0){h[p+(d<<6)+40>>3]=B}else{if(B<0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;W=2;break L8579}if(B==0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;W=1;break L8579}else{l=+_(+B);h[p+(d<<6)+40>>3]=l/+h[64800+(ba*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(bb|0)==0)){W=bb;break}O=c[N>>2]|0;if((O|0)<0){W=0;break}G=64712+(O*688&-1)|0;if(B<+h[G>>3]){h[G>>3]=B;bg=c[N>>2]|0}else{bg=O}O=64664+(bg*688&-1)|0;do{if(B<+h[O>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){W=1;break L8579}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[O>>3]=B;break}l=+h[64736+(bg*688&-1)>>3];if(l>B){h[O>>3]=l;W=1;break L8579}else{h[O>>3]=B;break}}}while(0);O=c[N>>2]|0;G=64720+(O*688&-1)|0;if(B>+h[G>>3]){h[G>>3]=B;bh=c[N>>2]|0}else{bh=O}O=64672+(bh*688&-1)|0;if(B<=+h[O>>3]){W=0;break}if((c[64648+(bh*688&-1)>>2]&2|0)==0){W=1;break}if((c[64732+(bh*688&-1)>>2]&2|0)==0){h[O>>3]=B;W=0;break}l=+h[64760+(bh*688&-1)>>3];if(l<B){h[O>>3]=l;W=1;break}else{h[O>>3]=B;W=0;break}}}while(0);bh=b+312|0;N=c[bh>>2]|0;L9228:do{if((N|0)==99){h[p+(d<<6)+24>>3]=m;bi=W}else{if(!(m>-8.988465674311579e+307&m<8.988465674311579e+307)){h[p+(d<<6)+24>>3]=-8.988465674311579e+307;bi=2;break}do{if((a[64788+(N*688&-1)|0]&1)==0){h[p+(d<<6)+24>>3]=m}else{if(m<0.0){h[p+(d<<6)+24>>3]=-8.988465674311579e+307;bi=2;break L9228}if(m==0.0){h[p+(d<<6)+24>>3]=-8.988465674311579e+307;bi=1;break L9228}else{B=+_(+m);h[p+(d<<6)+24>>3]=B/+h[64800+(N*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(W|0)==0)){bi=W;break}bg=c[bh>>2]|0;if((bg|0)<0){bi=0;break}bb=64712+(bg*688&-1)|0;if(+h[bb>>3]>m){h[bb>>3]=m;bj=c[bh>>2]|0}else{bj=bg}bg=64664+(bj*688&-1)|0;do{if(+h[bg>>3]>m){if((c[64648+(bj*688&-1)>>2]&1|0)==0){bi=1;break L9228}if((c[64728+(bj*688&-1)>>2]&1|0)==0){h[bg>>3]=m;break}B=+h[64736+(bj*688&-1)>>3];if(B>m){h[bg>>3]=B;bi=1;break L9228}else{h[bg>>3]=m;break}}}while(0);bg=c[bh>>2]|0;bb=64720+(bg*688&-1)|0;if(+h[bb>>3]<m){h[bb>>3]=m;bk=c[bh>>2]|0}else{bk=bg}bg=64672+(bk*688&-1)|0;if(+h[bg>>3]>=m){bi=0;break}if((c[64648+(bk*688&-1)>>2]&2|0)==0){bi=1;break}if((c[64732+(bk*688&-1)>>2]&2|0)==0){h[bg>>3]=m;bi=0;break}B=+h[64760+(bk*688&-1)>>3];if(B<m){h[bg>>3]=B;bi=1;break}else{h[bg>>3]=m;bi=0;break}}}while(0);if((c[b+64>>2]|0)!=6){i=n;return}bk=b+316|0;bh=c[bk>>2]|0;if((bh|0)==0){i=n;return}bj=bh+(d<<3)|0;m=+h[bj>>3];if(!(m>-8.988465674311579e+307&m<8.988465674311579e+307)){i=n;return}do{if((a[66852]&1)==0){bl=m}else{if(m<0.0){i=n;return}if(m!=0.0){B=+_(+m);bl=B/+h[8358];break}h[bj>>3]=-8.988465674311579e+307;i=n;return}}while(0);h[bj>>3]=bl;if(!((a[b+23|0]&1)==0&(bi|0)==0)){i=n;return}bl=+h[(c[bk>>2]|0)+(d<<3)>>3];if(bl<+h[8347]){h[8347]=bl;bm=+h[(c[bk>>2]|0)+(d<<3)>>3]}else{bm=bl}do{if(bm<+h[8341]){if((c[16678]&1|0)==0){i=n;return}if((c[16698]&1|0)==0){h[8341]=bm;break}bl=+h[8350];if(bl<=bm){h[8341]=bm;break}h[8341]=bl;i=n;return}}while(0);bm=+h[(c[bk>>2]|0)+(d<<3)>>3];if(bm>+h[8348]){h[8348]=bm;bn=+h[(c[bk>>2]|0)+(d<<3)>>3]}else{bn=bm}if(bn<=+h[8342]){i=n;return}if((c[16678]&2|0)==0){i=n;return}if((c[16699]&2|0)==0){h[8342]=bn;i=n;return}bm=+h[8353];if(bm<bn){h[8342]=bm;i=n;return}else{h[8342]=bn;i=n;return}}function iY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if((a|0)==0){return}else{b=a}while(1){a=c[b>>2]|0;d=c[b+16>>2]|0;if((d|0)!=0){uu(d)}d=b+256|0;e=c[d>>2]|0;if((e|0)!=0){f=e;while(1){e=c[f>>2]|0;uu(c[f+4>>2]|0);uu(c[d>>2]|0);c[d>>2]=e;if((e|0)==0){break}else{f=e}}}f=b+260|0;d=c[f>>2]|0;if((d|0)!=0){e=d;while(1){d=c[e>>2]|0;g=c[e+12>>2]|0;if((g|0)!=0){uu(g)}uu(e);c[f>>2]=d;if((d|0)==0){break}else{e=d}}}e=b+224|0;f=c[e>>2]|0;if((f|0)!=0){d=c[f+64>>2]|0;if((d|0)==0){h=f}else{uu(d);h=f}while(1){f=c[h+60>>2]|0;if((f|0)!=0){uu(f)}f=c[h+64>>2]|0;if(!((f|0)==0|(f|0)==(d|0))){uu(f)}f=c[h>>2]|0;uu(h);if((f|0)==0){break}else{h=f}}c[e>>2]=0}uu(b);if((a|0)==0){break}else{b=a}}return}function iZ(){var d=0,e=0,f=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0;d=i;i=i+24|0;e=d|0;a[37384]=1;do{if((c[5094]|0)==1){if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);f=a[32936]&1;do{if(f<<24>>24!=0){if((aY(24544,175824)|0)!=0){break}b[12272]=117;w=118;a[24595]=w&255;w=w>>8;a[24596|0]=w&255}}while(0);j=c[16507]|0;c[16506]=j;if((j&3|0)==0){k=+h[8258];l=+h[8257];if(k<l){m=66056;n=k}else{o=l;p=6889}}else{o=+h[8257];p=6889}if((p|0)==6889){m=66064;n=o}h[8255]=n;h[8256]=+h[m>>3];if((a[66164]&1)==0){q=0.0}else{q=+_(+(+h[8271]))}h[8272]=q;h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;m=c[16335]|0;c[16334]=m;if((m&3|0)==0){q=+h[8172];n=+h[8171];if(q<n){r=65368;s=q}else{t=n;p=6895}}else{t=+h[8171];p=6895}if((p|0)==6895){r=65376;s=t}h[8169]=s;h[8170]=+h[r>>3];if((a[65476]&1)==0){u=0.0}else{u=+_(+(+h[8185]))}h[8186]=u;h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;r=c[16163]|0;c[16162]=r;do{if((r&3|0)==0){u=+h[8086];s=+h[8085];if(u>=s){x=s;y=u;p=6902;break}h[8083]=u;z=s}else{x=+h[8085];y=+h[8086];p=6902}}while(0);if((p|0)==6902){h[8083]=(r&1|0)==0?x:8.988465674311579e+307;z=(r&2|0)==0?y:-8.988465674311579e+307}h[8084]=z;if((a[64788]&1)==0){A=0.0}else{A=+_(+(+h[8099]))}h[8100]=A;h[8089]=8.988465674311579e+307;h[8090]=-8.988465674311579e+307;r=c[17711]|0;c[17710]=r;if((r&3|0)==0){A=+h[8860];z=+h[8859];if(A<z){B=70872;C=A}else{D=z;p=6908}}else{D=+h[8859];p=6908}if((p|0)==6908){B=70880;C=D}h[8857]=C;h[8858]=+h[B>>3];a[70980]=0;h[8873]=1.0;h[8874]=0.0;h[8863]=8.988465674311579e+307;h[8864]=-8.988465674311579e+307;B=c[17883]|0;c[17882]=B;if((B&3|0)==0){C=+h[8946];D=+h[8945];if(C<D){E=71560;F=C}else{G=D;p=6912}}else{G=+h[8945];p=6912}if((p|0)==6912){E=71568;F=G}h[8943]=F;h[8944]=+h[E>>3];a[71668]=0;h[8959]=1.0;h[8960]=0.0;h[8949]=8.988465674311579e+307;h[8950]=-8.988465674311579e+307;E=c[16679]|0;c[16678]=E;do{if((E&3|0)==0){F=+h[8344];G=+h[8343];if(F>=G){H=G;I=F;p=6917;break}h[8341]=F;J=G}else{H=+h[8343];I=+h[8344];p=6917}}while(0);if((p|0)==6917){h[8341]=(E&1|0)==0?H:8.988465674311579e+307;J=(E&2|0)==0?I:-8.988465674311579e+307}h[8342]=J;if((a[66852]&1)==0){K=0.0}else{K=+_(+(+h[8357]))}h[8358]=K;h[8347]=8.988465674311579e+307;h[8348]=-8.988465674311579e+307;if((c[3524]|0)==0){uf(c[13898]|0,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}E=f<<24>>24!=0;f=E?10:1;B=dr(E?9:2,-1)|0;do{if((c[5094]|0)==1){if((a[32936]&1)!=0){break}if(!(a[20368]|0)){break}a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);E=dr(f,-1)|0;f=a[32936]|0;do{if((c[5094]|0)==1){if((f&1)!=0){break}if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);do{if((f&1)!=0){dq(2);do{if((c[5094]|0)==1){if(!(a[20368]|0)){break}a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);dq(1);if((c[5094]|0)!=1){break}if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);dq(0);do{if((c[16506]&3|0)==0){K=+h[8256];J=+h[8255];if(K>=J){p=6940;break}h[8255]=K;h[8256]=J;L=1}else{p=6940}}while(0);if((p|0)==6940){L=(c[16508]|0)>>>1&1}a[66036]=L;do{if((c[16334]&3|0)==0){J=+h[8170];K=+h[8169];if(J>=K){p=6944;break}h[8169]=J;h[8170]=K;M=1}else{p=6944}}while(0);if((p|0)==6944){M=(c[16336]|0)>>>1&1}a[65348]=M;do{if((c[16162]&3|0)==0){K=+h[8084];J=+h[8083];if(K>=J){p=6948;break}h[8083]=K;h[8084]=J;N=1}else{p=6948}}while(0);if((p|0)==6948){N=(c[16164]|0)>>>1&1}a[64660]=N;N=e;M=e+16|0;L=0;do{f=64944+(L*688&-1)|0;r=c[f>>2]|0;if((r|0)==0){p=6957}else{c[N>>2]=c[7254];c[N+4>>2]=c[7255];c[N+8>>2]=c[7256];c[N+12>>2]=c[7257];c[N+16>>2]=c[7258];c[N+20>>2]=c[7259];m=e;j=r;L9464:while(1){r=j;while(1){if((c[r+12>>2]|0)>=0){break}uu(c[r+8>>2]|0);O=c[r+16>>2]|0;uu(r);if((O|0)==0){P=m;break L9464}else{r=O}}c[m+16>>2]=r;O=c[r+16>>2]|0;if((O|0)==0){P=r;break}else{m=r;j=O}}c[P+16>>2]=0;j=c[M>>2]|0;c[f>>2]=j;if((j|0)==0){p=6957}}do{if((p|0)==6957){p=0;j=64920+(L*688&-1)|0;if((c[j>>2]|0)!=3){break}c[j>>2]=1}}while(0);L=L+1|0;}while(L>>>0<11);if((B|0)>-1){L=c[1054]|0;p=c[L+(B*40&-1)+36>>2]|0;M=(p|0)>49?49:p;p=c[10036]|0;P=c[L+(B*40&-1)+32>>2]|0;B=0;while(1){L=B+1|0;a[B+55600|0]=a[p+P|0]|0;if((L|0)==(M|0)){break}else{P=P+1|0;B=L}}a[M+55600|0]=0}else{uB(55600,24544)}if((E|0)<=-1){uB(55651,24595);i_();i=d;return}M=c[1054]|0;B=c[M+(E*40&-1)+36>>2]|0;P=(B|0)>49?49:B;B=c[10036]|0;p=c[M+(E*40&-1)+32>>2]|0;E=0;while(1){M=E+1|0;a[E+55651|0]=a[B+p|0]|0;if((M|0)==(P|0)){break}else{p=p+1|0;E=M}}a[P+55651|0]=0;i_();i=d;return}function i_(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,U=0,V=0,W=0,X=0,Y=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0.0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0.0,cP=0,cQ=0,cR=0.0,cS=0.0,cT=0.0,cU=0.0,cV=0,cW=0.0,cX=0.0,cY=0.0,cZ=0.0,c_=0.0,c$=0.0,c0=0,c1=0.0,c2=0,c3=0.0,c4=0,c5=0.0,c6=0,c7=0.0,c8=0.0,c9=0.0,da=0.0,de=0,df=0.0,dg=0.0,dh=0,di=0,dj=0.0,dl=0.0,dm=0.0,dn=0.0,dp=0.0,dq=0.0,dr=0.0,ds=0.0,dt=0.0,du=0.0,dv=0.0,dw=0.0,dx=0.0,dy=0.0,dz=0.0,dA=0.0,dB=0.0,dC=0.0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0.0,dO=0,dP=0,dQ=0,dR=0,dS=0,dU=0,dV=0,dW=0,dX=0,dY=0,dZ=0,d_=0.0,d$=0.0,d0=0.0,d1=0.0,d2=0,d3=0.0,d4=0.0,d5=0.0,d6=0.0,d7=0.0,d8=0.0,d9=0.0,ea=0.0,eb=0.0,ec=0.0,ed=0.0,ee=0.0,ef=0,eg=0.0,eh=0,ei=0,ej=0,ek=0,el=0,em=0,en=0,eo=0,eq=0,er=0,es=0,et=0,eu=0,ev=0,ew=0,ex=0,eA=0,eB=0,eD=0,eE=0,eF=0,eG=0,eH=0,eI=0,eJ=0,eK=0,eN=0,eO=0,eP=0,eQ=0,eR=0,eS=0,eT=0,eU=0,eV=0,eW=0.0,eX=0.0,eY=0.0,eZ=0.0,e_=0,e$=0,e0=0,e1=0,e2=0,e3=0,e4=0,e5=0,e8=0,e9=0,fa=0,fb=0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0,fi=0,fj=0,fk=0.0,fl=0,fm=0,fn=0.0;b=i;i=i+272|0;d=b|0;e=b+32|0;f=b+40|0;g=b+128|0;j=b+152|0;k=b+200|0;l=b+256|0;n=b+264|0;o=c[10828]|0;if((o|0)!=0&(c[7952]|0)>0){iY(o)}c[7952]=0;c[10828]=0;c[200]=2;c[144]=1;c[34]=0;a[872]=0;o=c[13898]|0;c[7774]=iw()|0;p=c[13898]|0;if((p|0)>=(c[8272]|0)){q=p;uf(q,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=b+96|0;s=k;t=k+4|0;u=k+16|0;w=k+24|0;x=k+8|0;y=k|0;z=k+40|0;A=k+44|0;B=k+32|0;C=g|0;D=j|0;E=j+8|0;F=f|0;G=f+8|0;H=f+16|0;I=f+24|0;J=f+32|0;K=f+40|0;L=f+48|0;f=b+8|0;M=b+176|0;N=0;O=0;U=0;V=0;W=0;X=0;Y=0;$=0;ab=0;ac=0;ad=43312;ae=p;L9498:while(1){p=(V|0)==0;af=Y;ag=ac;ah=ae;while(1){ai=c[1054]|0;L9502:do{if((a[ai+(ah*40&-1)|0]&1)!=0){aj=c[ai+(ah*40&-1)+36>>2]|0;ak=ai+(ah*40&-1)+32|0;al=c[10036]|0;am=0;while(1){if((am|0)>=(aj|0)){break}if((a[al+((c[ak>>2]|0)+am|0)|0]|0)==(a[am+103664|0]|0)){am=am+1|0}else{break L9502}}if((am|0)==1){an=af;ao=ag;ap=N;aq=V;ar=$;as=ab;at=ah;au=6983;break L9498}}}while(0);if(p){av=af?ag:ah}else{av=ag}if((t9(ah)|0)==0){au=6995;break}dT();ai=c[13898]|0;ak=(c[8272]|0)>(ai|0);if(!ak){an=1;ao=av;ap=N;aq=V;ar=$;as=ab;at=ai;au=6983;break L9498}al=c[1054]|0;if((a[al+(ai*40&-1)|0]&1)==0){af=1;ag=av;ah=ai;continue}aj=c[al+(ai*40&-1)+36>>2]|0;aw=al+(ai*40&-1)+32|0;al=c[10036]|0;ax=0;while(1){if((ax|0)>=(aj|0)){au=6994;break}if((a[al+((c[aw>>2]|0)+ax|0)|0]|0)==(a[ax+148464|0]|0)){ax=ax+1|0}else{break}}if((au|0)==6994){au=0;if((ax|0)==1){ay=ad;az=av;aA=ab;aB=$;aC=af;aD=X;aE=W;aF=V;aG=U;aH=O;aJ=N;break}}if(ak){af=1;ag=av;ah=ai}else{an=1;ao=av;ap=N;aq=V;ar=$;as=ab;at=ai;au=6983;break L9498}}do{if((au|0)==6995){au=0;if(af){aK=av}else{aK=(a[32936]&1)==0|p?c[13898]|0:av}c[11670]=31112;ah=iu(0)|0;c[11670]=0;if((ah|0)==0){ag=N+1|0;if((a[32936]&1)==0){aL=V}else{aL=(V+2|0)%3&-1}aw=c[ad>>2]|0;al=(a[38984]&1)==0;L9562:do{if((aw|0)==0){if(al){aM=i0(c[6352]|0,c[9344]|0,c[6350]|0,c[9342]|0)|0}else{aM=i0(c[9344]|0,0,0,c[9342]|0)|0}c[ad>>2]=aM;aN=aM}else{if(!al){aj=c[9344]|0;aO=c[9342]|0;aP=aw+260|0;aQ=c[aP>>2]|0;if((aQ|0)!=0){aR=aQ;while(1){aQ=c[aR>>2]|0;if((aR|0)!=0){aS=c[aR+12>>2]|0;if((aS|0)!=0){uu(aS)}uu(aR)}if((aQ|0)==0){break}else{aR=aQ}}}c[aP>>2]=0;if((aO|0)>0&(aj|0)>0){aR=0;while(1){am=hu(aj)|0;c[am>>2]=c[aP>>2];c[aP>>2]=am;am=aR+1|0;if((am|0)<(aO|0)){aR=am}else{aN=aw;break L9562}}}else{c[aP>>2]=0;aN=aw;break}}aR=c[6352]|0;aO=c[9344]|0;aj=c[6350]|0;am=c[9342]|0;aQ=aw+260|0;aS=c[aQ>>2]|0;if((aS|0)!=0){aT=aS;while(1){aS=c[aT>>2]|0;if((aT|0)!=0){aU=c[aT+12>>2]|0;if((aU|0)!=0){uu(aU)}uu(aT)}if((aS|0)==0){break}else{aT=aS}}}c[aQ>>2]=0;if(!((am|0)>0&(aR|0)>0)){c[aQ>>2]=0;aN=aw;break}if((aO|0)>0){aT=0;while(1){aP=hu(aj)|0;c[aP>>2]=c[aQ>>2];c[aQ>>2]=aP;aP=aT+1|0;if((aP|0)<(aO|0)){aT=aP}else{aV=0;break}}}else{aV=0}while(1){aT=hu(aR)|0;c[aT>>2]=c[aQ>>2];c[aQ>>2]=aT;aT=aV+1|0;if((aT|0)<(am|0)){aV=aT}else{aN=aw;break}}}}while(0);c[aN+8>>2]=2;c[aN+244>>2]=1;c[aN+12>>2]=c[10058];c[aN+252>>2]=c[9342];aW=(c[13898]|0)-1|0;aX=ab;aZ=1;a_=aL;a$=aN;a0=ag}else{if(!((a[32936]&1)==0|p)){au=6999;break L9498}do{if(!ab){aw=c[16506]|0;if((aw&1|0)!=0){h[8255]=8.988465674311579e+307}if((aw&2|0)!=0){h[8256]=-8.988465674311579e+307}aw=c[16334]|0;if((aw&1|0)!=0){h[8169]=8.988465674311579e+307}if((aw&2|0)==0){break}h[8170]=-8.988465674311579e+307}}while(0);ag=c[ad>>2]|0;if((ag|0)==0){uE(M|0,0,24);aw=ut(272)|0;if((aw|0)==0){gk();al=ut(272)|0;if((al|0)==0){au=7012;break L9498}else{a1=al}}else{a1=aw}aw=a1;uE(a1|0,0,272);c[a1+28>>2]=-2;al=a1+32|0;c[al>>2]=0;c[al+4>>2]=0;h[a1+40>>3]=1.0;h[a1+48>>3]=-2.0;al=a1+56|0;c[al>>2]=c[M>>2];c[al+4>>2]=c[M+4>>2];c[al+8>>2]=c[M+8>>2];c[al+12>>2]=c[M+12>>2];c[al+16>>2]=c[M+16>>2];c[al+20>>2]=c[M+20>>2];c[a1+80>>2]=-1;c[a1+84>>2]=0;al=a1+88|0;c[al>>2]=c[12872];c[al+4>>2]=c[12873];c[al+8>>2]=c[12874];c[al+12>>2]=c[12875];c[al+16>>2]=c[12876];c[al+20>>2]=c[12877];c[al+24>>2]=c[12878];c[al+28>>2]=c[12879];c[al+32>>2]=c[12880];c[al+36>>2]=c[12881];c[al+40>>2]=c[12882];c[al+44>>2]=c[12883];c[al+48>>2]=c[12884];c[al+52>>2]=c[12885];c[a1+144>>2]=1;h[a1+152>>3]=0.0;c[a1+160>>2]=0;h[a1+168>>3]=15.0;h[a1+176>>3]=90.0;c[a1+184>>2]=0;c[ad>>2]=aw;a2=aw}else{a2=ag}c[a2+8>>2]=3;c[a2+12>>2]=c[12890];c[11856]=2;ag=ey(ah,7,a2)|0;if((a[47584]&1)!=0){c[a2+244>>2]=1}aw=(c[13898]|0)-1|0;c[a2+4>>2]=aw;al=c[7774]|0;if((al|0)==0){a3=0}else{a3=c[al+32>>2]|0}c[a2+248>>2]=a3;if((ag|0)<3){if((c[16546]|0)==1){au=7020;break L9498}if((c[16374]|0)==1){au=7022;break L9498}}c[12210]=2;c[12211]=1;c[12212]=0;aW=aw;aX=1;aZ=$;a_=V;a$=a2;a0=N}a4=a$+16|0;aw=c[a4>>2]|0;if((aw|0)!=0){uu(aw);c[a4>>2]=0}aw=a$+24|0;ag=a$+56|0;a[ag]=0;al=a$+28|0;c[al>>2]=X;ai=a$+32|0;c[ai>>2]=W;ak=a$+240|0;c[ak>>2]=X;ax=X+1|0;do{if((a[30080]&1)==0){am=aw|0;aQ=c[am>>2]|0;aR=c[8798]|0;aT=(aR|0)>0;aO=ax;L9612:while(1){aj=43264;while(1){a5=c[aj>>2]|0;if((a5|0)==0){break}if((c[a5+4>>2]|0)==(aO|0)){break L9612}else{aj=a5|0}}a6=aO-1|0;if(!((aO|0)>(aR|0)&aT)){au=7067;break}aO=((a6|0)%(aR|0)&-1)+1|0}if((au|0)==7067){au=0;c[al>>2]=a6;c[a$+64>>2]=1;c[a$+68>>2]=a6;c[ai>>2]=a6;break}aR=aw;aT=a5+8|0;c[aR>>2]=c[aT>>2];c[aR+4>>2]=c[aT+4>>2];c[aR+8>>2]=c[aT+8>>2];c[aR+12>>2]=c[aT+12>>2];c[aR+16>>2]=c[aT+16>>2];c[aR+20>>2]=c[aT+20>>2];c[aR+24>>2]=c[aT+24>>2];c[aR+28>>2]=c[aT+28>>2];c[aR+32>>2]=c[aT+32>>2];c[aR+36>>2]=c[aT+36>>2];c[aR+40>>2]=c[aT+40>>2];c[aR+44>>2]=c[aT+44>>2];c[aR+48>>2]=c[aT+48>>2];c[aR+52>>2]=c[aT+52>>2];c[am>>2]=aQ;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[al>>2]=aO;a[ag]=0;break}if((a[ag]&1)!=0){break}c[a$+64>>2]=1;c[a$+68>>2]=c[al>>2]}else{lK(aw,ax)}}while(0);ah=a$+12|0;aT=a$+224|0;aR=a$+80|0;aj=a$+88|0;aP=aw;aS=aj;aU=a$+80|0;a7=a$+84|0;a8=a$+144|0;a9=a$+152|0;ba=a$+160|0;bb=a$+168|0;bc=a$+176|0;bd=a$+184|0;be=aj|0;aj=a$+92|0;bf=a$+128|0;bg=a$+132|0;bh=a$+96|0;bi=a$+120|0;bj=a$+238|0;bk=a$+237|0;bl=a$+236|0;bm=a$+8|0;bn=a$+232|0;bo=a$+264|0;bp=a$+22|0;bq=(U|0)==0;br=(O|0)==0;bs=a$+20|0;bt=a$;bu=(a_|0)==0;bv=0;bw=0;bx=0;by=0;bz=0;L9627:while(1){bB=c[13898]|0;bC=c[8272]|0;L9629:do{if((bB|0)<(bC|0)){bD=c[1054]|0;bE=a[bD+(bB*40&-1)|0]|0;if((bE&1)==0){bF=bD;bG=bE;break}bH=c[bD+(bB*40&-1)+36>>2]|0;bI=bD+(bB*40&-1)+32|0;bJ=c[10036]|0;bK=0;while(1){if((bK|0)>=(bH|0)){break}if((a[bJ+((c[bI>>2]|0)+bK|0)|0]|0)==(a[bK+103664|0]|0)){bK=bK+1|0}else{bF=bD;bG=bE;break L9629}}if((bK|0)!=1|bw^1){bF=bD;bG=bE}else{break L9627}}else{if(bw){break L9627}bI=c[1054]|0;bF=bI;bG=a[bI+(bB*40&-1)|0]|0}}while(0);aO=c[bF+(bB*40&-1)+36>>2]|0;aQ=c[bF+(bB*40&-1)+32>>2]|0;am=(bG&1)==0;L9639:do{if((aO|0)>0&(am^1)){bI=c[10036]|0;bJ=0;bH=0;bL=aQ;while(1){if((a[bJ+224032|0]|0)==(a[bI+(bJ+bL|0)|0]|0)){bM=bL;bN=bH}else{if((bJ|0)!=1){break}bM=bL-1|0;bN=1}bO=bJ+1|0;if((bO|0)<(bN+aO|0)){bJ=bO;bH=bN;bL=bM}else{au=7083;break}}do{if((au|0)==7083){au=0;if((bN|0)==0){if(!((bJ|0)==0|(bJ|0)==5)){break}}if(bz){bQ=bB;au=8109;break L9498}a[bs]=a[36231]&1^1;do{if((a[32936]&1)!=0){if(!bu){au=7088;break L9498}if(!bq){a[U]=0}if(br){break}a[O]=0}}while(0);bR=(c[13898]|0)+1|0;c[13898]=bR;bL=c[1054]|0;bH=c[bL+(bR*40&-1)+36>>2]|0;bI=c[bL+(bR*40&-1)+32>>2]|0;bE=(a[bL+(bR*40&-1)|0]&1)==0;L9661:do{if((bH|0)>0&(bE^1)){bL=c[10036]|0;bD=0;bK=0;bO=bI;while(1){if((a[bD+137208|0]|0)==(a[bL+(bD+bO|0)|0]|0)){bS=bO;bT=bK}else{if((bD|0)!=3){break L9661}bS=bO-1|0;bT=1}bU=bD+1|0;if((bU|0)<(bT+bH|0)){bD=bU;bK=bT;bO=bS}else{break}}if((bT|0)==0){if(!((bD|0)==2|(bD|0)==12)){break}}eM(bt);bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}}while(0);if((bR|0)>=(c[8272]|0)){au=7110;break L9498}L9675:do{if(!bE){bO=c[10036]|0;bK=0;while(1){if((bK|0)>=(bH|0)){break}if((a[bO+(bI+bK|0)|0]|0)==(a[bK+103664|0]|0)){bK=bK+1|0}else{break L9675}}if((bK|0)==1){au=7110;break L9498}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[D>>2]|0)!=3){au=7109;break L9498}bI=c[E>>2]|0;c[a4>>2]=bI;if((bI|0)==0){au=8108;break L9498}else{bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}}}while(0);if(am){break}L9685:do{if((aO|0)>0){bJ=c[10036]|0;bI=0;bH=0;bE=aQ;while(1){if((a[bI+202e3|0]|0)==(a[bJ+(bI+bE|0)|0]|0)){bV=bE;bW=bH}else{if((bI|0)!=3){break L9685}bV=bE-1|0;bW=1}bO=bI+1|0;if((bO|0)<(bW+aO|0)){bI=bO;bH=bW;bE=bV}else{break}}if((bW|0)==0){if(!((bI|0)==2|(bI|0)==7)){break}}if(bz){bQ=bB;au=8110;break L9498}bE=bB+1|0;c[13898]=bE;bH=(a[bF+(bE*40&-1)|0]&1)==0;if(bH){au=7125}else{bJ=c[10036]|0;bO=a[bJ+(c[bF+(bE*40&-1)+32>>2]|0)|0]|0;if((bO<<24>>24|0)==39|(bO<<24>>24|0)==34){bX=bJ;au=7135}else{au=7125}}L9700:do{if((au|0)==7125){au=0;bJ=c[10810]|0;if((bJ|0)==0){break}bO=bF+(bE*40&-1)+36|0;bD=bF+(bE*40&-1)+32|0;bL=c[10036]|0;bU=bJ;L9703:while(1){bJ=c[bU+4>>2]|0;L9705:do{if(!((bC|0)<=(bE|0)|bH)){bY=c[bO>>2]|0;bZ=0;while(1){if((bZ|0)>=(bY|0)){break}if((a[bL+((c[bD>>2]|0)+bZ|0)|0]|0)==(a[bJ+bZ|0]|0)){bZ=bZ+1|0}else{break L9705}}if((a[bJ+bZ|0]|0)==0){break L9703}}}while(0);bJ=c[bU>>2]|0;if((bJ|0)==0){break L9700}else{bU=bJ}}if((a[bU+8|0]&1)!=0){break}if((c[bU+16>>2]|0)==3){bX=bL;au=7135}}}while(0);L9714:do{if((au|0)==7135){au=0;if((bE|0)>=(bC|0)){break}L9717:do{if(!bH){bI=c[bF+(bE*40&-1)+36>>2]|0;bD=bF+(bE*40&-1)+32|0;bO=0;while(1){if((bO|0)>=(bI|0)){break}if((a[bX+((c[bD>>2]|0)+bO|0)|0]|0)==(a[bO+103664|0]|0)){bO=bO+1|0}else{break L9717}}if((bO|0)==1){break L9714}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[C>>2]|0)==3){break}c[13898]=bE}}while(0);a[bp]=1;if(!bq){a[U]=0}if(br){bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}a[O]=0;bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}}while(0);if(!((aO|0)>0&(am^1))){break}bE=c[10036]|0;bH=0;bL=0;bU=aQ;while(1){if((a[bH+196448|0]|0)==(a[bE+(bH+bU|0)|0]|0)){b_=bU;b$=bL}else{if((bH|0)!=1){break}b_=bU-1|0;b$=1}bD=bH+1|0;if((bD|0)<(b$+aO|0)){bH=bD;bL=b$;bU=b_}else{au=7153;break}}do{if((au|0)==7153){au=0;if((b$|0)==0){if(!((bH|0)==0|(bH|0)==4)){break}}if(by){bQ=bB;au=8111;break L9498}bU=bB+1|0;c[13898]=bU;bL=c[bF+(bU*40&-1)+36>>2]|0;bE=c[bF+(bU*40&-1)+32>>2]|0;bD=(a[bF+(bU*40&-1)|0]&1)==0;bU=(bL|0)>0;bI=c[10036]|0;bK=30672;bJ=116448;L9744:while(1){L9746:do{if(!bD){if(bU){bY=0;b0=0;b1=bE;while(1){b2=a[bJ+bY|0]|0;if(b2<<24>>24==(a[bI+(bY+b1|0)|0]|0)){b3=b1;b4=b0}else{if(b2<<24>>24!=36){break L9746}b3=b1-1|0;b4=1}b5=bY+1|0;if((b5|0)<(b4+bL|0)){bY=b5;b0=b4;b1=b3}else{break}}if((b4|0)==0){b6=b5}else{b7=bK;break L9744}}else{b6=0}b1=a[bJ+b6|0]|0;if((b1<<24>>24|0)==36|(b1<<24>>24|0)==0){b7=bK;break L9744}}}while(0);b1=bK+8|0;b0=c[b1>>2]|0;if((b0|0)==0){b7=b1;break}else{bK=b1;bJ=b0}}bJ=c[b7+4>>2]|0;b8=bB+2|0;c[13898]=b8;if((bJ|0)==-1){au=7167;break L9498}c[ah>>2]=bJ;do{if((c[bm>>2]|0)==2){if(!((bJ&4|0)!=0|(bJ|0)==368)){b9=bJ;break}uh(c[13898]|0,185192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[ah>>2]=18;b9=18}else{b9=bJ}}while(0);L9764:do{if(((c[12890]|b9)&352|0)==0){ca=b9}else{bJ=c[13898]|0;if((c[8272]|0)<=(bJ|0)){ca=b9;break}bK=c[1054]|0;if((a[bK+(bJ*40&-1)|0]&1)==0){ca=b9;break}bL=c[bK+(bJ*40&-1)+36>>2]|0;bI=bK+(bJ*40&-1)+32|0;bK=c[10036]|0;bE=0;while(1){if((bE|0)>=(bL|0)){break}if((a[bK+((c[bI>>2]|0)+bE|0)|0]|0)==(a[bE+95280|0]|0)){bE=bE+1|0}else{ca=b9;break L9764}}if((bE|0)!=2){ca=b9;break}c[13898]=bJ+1;if((i9(bo)|0)!=0){au=8116;break L9498}ca=c[ah>>2]|0}}while(0);if(!((ca|0)==400|(ca|0)==432|(ca|0)==416)){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}bI=c[13898]|0;if((c[8272]|0)<=(bI|0)){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}bK=c[1054]|0;if((a[bK+(bI*40&-1)|0]&1)==0){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}bL=c[bK+(bI*40&-1)+36>>2]|0;bU=bK+(bI*40&-1)+32|0;bK=c[10036]|0;bD=0;while(1){if((bD|0)>=(bL|0)){break}if((a[bK+((c[bU>>2]|0)+bD|0)|0]|0)==(a[bD+224816|0]|0)){bD=bD+1|0}else{bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}}if((bD|0)!=8){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}c[13898]=bI+1;a[bn]=1;bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}}while(0);if(am){break}L9785:do{if((aO|0)>0){bH=c[10036]|0;bU=0;bK=0;bL=aQ;while(1){if((a[bU+175968|0]|0)==(a[bH+(bU+bL|0)|0]|0)){cb=bL;cc=bK}else{if((bU|0)!=8){break L9785}cb=bL-1|0;cc=1}b0=bU+1|0;if((b0|0)<(cc+aO|0)){bU=b0;bK=cc;bL=cb}else{break}}if((cc|0)==0){if(!((bU|0)==10|(bU|0)==7)){break}}c[13898]=bB+1;a[bl]=1;bv=bv;bw=bw;bx=bx;by=by;bz=bz;continue L9627}}while(0);if(!((aO|0)>0&(am^1))){break}bL=c[10036]|0;bK=0;bH=0;bI=aQ;while(1){if((a[bK+171984|0]|0)==(a[bL+(bK+bI|0)|0]|0)){cd=bI;ce=bH}else{if((bK|0)!=5){break}cd=bI-1|0;ce=1}bD=bK+1|0;if((bD|0)<(ce+aO|0)){bK=bD;bH=ce;bI=cd}else{au=7204;break}}do{if((au|0)==7204){au=0;if((ce|0)==0){if(!((bK|0)==10|(bK|0)==4)){break}}c[13898]=bB+1;a[bk]=1;bv=bv;bw=bw;bx=bx;by=by;bz=bz;continue L9627}}while(0);if(!((aO|0)>0&(am^1))){break}bK=c[10036]|0;bI=0;bH=0;bL=aQ;while(1){if((a[bI+168e3|0]|0)==(a[bK+(bI+bL|0)|0]|0)){cf=bL;cg=bH}else{if((bI|0)!=5){break L9639}cf=bL-1|0;cg=1}bD=bI+1|0;if((bD|0)<(cg+aO|0)){bI=bD;bH=cg;bL=cf}else{break}}if((cg|0)==0){if(!((bI|0)==4|(bI|0)==9)){break}}c[13898]=bB+1;a[bj]=1;bv=bv;bw=bw;bx=bx;by=by;bz=bz;continue L9627}}while(0);aO=c[ah>>2]|0;do{if((aO|0)==368){aQ=c[aT>>2]|0;if((aQ|0)==0){uE(r|0,0,28);am=ut(192)|0;if((am|0)==0){gk();bC=ut(192)|0;if((bC|0)==0){au=7220;break L9498}else{ch=bC}}else{ch=am}c[ch>>2]=0;c[ch+4>>2]=-1;c[ch+72>>2]=0;c[ch+88>>2]=0;uE(ch+8|0,0,60);c[ch+96>>2]=1;c[ch+144>>2]=4;c[ch+148>>2]=4;c[ch+152>>2]=4;am=ch+156|0;c[am>>2]=c[r>>2];c[am+4>>2]=c[r+4>>2];c[am+8>>2]=c[r+8>>2];c[am+12>>2]=c[r+12>>2];c[am+16>>2]=c[r+16>>2];c[am+20>>2]=c[r+20>>2];c[am+24>>2]=c[r+24>>2];a[ch+184|0]=0;c[aT>>2]=ch;c[ch+48>>2]=1;c[(c[aT>>2]|0)+56>>2]=99;ci=c[aT>>2]|0}else{ci=aQ}jw(ci);aQ=c[13898]|0;if((bB|0)==(aQ|0)){cj=1;ck=c[ah>>2]|0;break}else{if(bv){bQ=aQ;au=8112;break L9498}else{bv=1;bw=1;bx=bx;by=by;bz=bz;continue L9627}}}else{cj=bw;ck=aO}}while(0);if((ck|0)==225){do{if(!cj){c[aU>>2]=-1;c[a7>>2]=0;c[aS>>2]=c[12872];c[aS+4>>2]=c[12873];c[aS+8>>2]=c[12874];c[aS+12>>2]=c[12875];c[aS+16>>2]=c[12876];c[aS+20>>2]=c[12877];c[aS+24>>2]=c[12878];c[aS+28>>2]=c[12879];c[aS+32>>2]=c[12880];c[aS+36>>2]=c[12881];c[aS+40>>2]=c[12882];c[aS+44>>2]=c[12883];c[aS+48>>2]=c[12884];c[aS+52>>2]=c[12885];c[a8>>2]=1;h[a9>>3]=0.0;c[ba>>2]=0;h[bb>>3]=15.0;h[bc>>3]=90.0;c[bd>>2]=0;aO=c[8798]|0;aQ=(aO|0)>0;am=ax;L9839:while(1){bC=43264;while(1){cl=c[bC>>2]|0;if((cl|0)==0){break}if((c[cl+4>>2]|0)==(am|0)){break L9839}else{bC=cl|0}}cm=am-1|0;if(!((am|0)>(aO|0)&aQ)){au=7237;break}am=((cm|0)%(aO|0)&-1)+1|0}if((au|0)==7237){au=0;c[aj>>2]=cm;c[bf>>2]=1;c[bg>>2]=cm;c[bh>>2]=cm;break}aO=cl+8|0;c[aS>>2]=c[aO>>2];c[aS+4>>2]=c[aO+4>>2];c[aS+8>>2]=c[aO+8>>2];c[aS+12>>2]=c[aO+12>>2];c[aS+16>>2]=c[aO+16>>2];c[aS+20>>2]=c[aO+20>>2];c[aS+24>>2]=c[aO+24>>2];c[aS+28>>2]=c[aO+28>>2];c[aS+32>>2]=c[aO+32>>2];c[aS+36>>2]=c[aO+36>>2];c[aS+40>>2]=c[aO+40>>2];c[aS+44>>2]=c[aO+44>>2];c[aS+48>>2]=c[aO+48>>2];c[aS+52>>2]=c[aO+52>>2];c[be>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[aj>>2]=am;a[bi]=0;break}if((a[bi]&1)!=0){break}c[bf>>2]=1;c[bg>>2]=c[aj>>2]}}while(0);hL(aR,1);aO=c[13898]|0;if((bB|0)==(aO|0)){break}if(bx){bQ=aO;au=8113;break L9498}c[aP>>2]=c[aS>>2];c[aP+4>>2]=c[aS+4>>2];c[aP+8>>2]=c[aS+8>>2];c[aP+12>>2]=c[aS+12>>2];c[aP+16>>2]=c[aS+16>>2];c[aP+20>>2]=c[aS+20>>2];c[aP+24>>2]=c[aS+24>>2];c[aP+28>>2]=c[aS+28>>2];c[aP+32>>2]=c[aS+32>>2];c[aP+36>>2]=c[aS+36>>2];c[aP+40>>2]=c[aS+40>>2];c[aP+44>>2]=c[aS+44>>2];c[aP+48>>2]=c[aS+48>>2];c[aP+52>>2]=c[aS+52>>2];bv=bv;bw=1;bx=1;by=by;bz=bz;continue}uE(s|0,0,56);h[u>>3]=1.0;h[w>>3]=-2.0;c[t>>2]=X;c[x>>2]=W;do{if((a[30080]&1)==0){aO=c[8798]|0;aQ=(aO|0)>0;bI=ax;L9880:while(1){bC=43264;while(1){cn=c[bC>>2]|0;if((cn|0)==0){break}if((c[cn+4>>2]|0)==(bI|0)){break L9880}else{bC=cn|0}}co=bI-1|0;if(!((bI|0)>(aO|0)&aQ)){au=7267;break}bI=((co|0)%(aO|0)&-1)+1|0}if((au|0)==7267){au=0;c[t>>2]=co;c[z>>2]=1;c[A>>2]=co;c[x>>2]=co;break}aO=cn+8|0;c[s>>2]=c[aO>>2];c[s+4>>2]=c[aO+4>>2];c[s+8>>2]=c[aO+8>>2];c[s+12>>2]=c[aO+12>>2];c[s+16>>2]=c[aO+16>>2];c[s+20>>2]=c[aO+20>>2];c[s+24>>2]=c[aO+24>>2];c[s+28>>2]=c[aO+28>>2];c[s+32>>2]=c[aO+32>>2];c[s+36>>2]=c[aO+36>>2];c[s+40>>2]=c[aO+40>>2];c[s+44>>2]=c[aO+44>>2];c[s+48>>2]=c[aO+48>>2];c[s+52>>2]=c[aO+52>>2];c[y>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[t>>2]=bI;a[B]=0;break}if((a[B]&1)!=0){break}c[z>>2]=1;c[A>>2]=c[t>>2]}else{aO=43280;while(1){cp=c[aO>>2]|0;if((cp|0)==0){break}if((c[cp+4>>2]|0)==(ax|0)){au=7244;break}else{aO=cp|0}}if((au|0)==7244){au=0;aO=cp+8|0;c[s>>2]=c[aO>>2];c[s+4>>2]=c[aO+4>>2];c[s+8>>2]=c[aO+8>>2];c[s+12>>2]=c[aO+12>>2];c[s+16>>2]=c[aO+16>>2];c[s+20>>2]=c[aO+20>>2];c[s+24>>2]=c[aO+24>>2];c[s+28>>2]=c[aO+28>>2];c[s+32>>2]=c[aO+32>>2];c[s+36>>2]=c[aO+36>>2];c[s+40>>2]=c[aO+40>>2];c[s+44>>2]=c[aO+44>>2];c[s+48>>2]=c[aO+48>>2];c[s+52>>2]=c[aO+52>>2];c[y>>2]=0;if((a[B]&1)!=0){break}c[z>>2]=1;c[A>>2]=c[t>>2];break}aO=c[8798]|0;bI=(aO|0)>0;aQ=ax;L9865:while(1){am=43264;while(1){cq=c[am>>2]|0;if((cq|0)==0){break}if((c[cq+4>>2]|0)==(aQ|0)){break L9865}else{am=cq|0}}cr=aQ-1|0;if(!((aQ|0)>(aO|0)&bI)){au=7256;break}aQ=((cr|0)%(aO|0)&-1)+1|0}if((au|0)==7256){au=0;c[t>>2]=cr;c[z>>2]=1;c[A>>2]=cr;c[x>>2]=cr;break}aO=cq+8|0;c[s>>2]=c[aO>>2];c[s+4>>2]=c[aO+4>>2];c[s+8>>2]=c[aO+8>>2];c[s+12>>2]=c[aO+12>>2];c[s+16>>2]=c[aO+16>>2];c[s+20>>2]=c[aO+20>>2];c[s+24>>2]=c[aO+24>>2];c[s+28>>2]=c[aO+28>>2];c[s+32>>2]=c[aO+32>>2];c[s+36>>2]=c[aO+36>>2];c[s+40>>2]=c[aO+40>>2];c[s+44>>2]=c[aO+44>>2];c[s+48>>2]=c[aO+48>>2];c[s+52>>2]=c[aO+52>>2];c[y>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[t>>2]=aQ;a[B]=0;break}if((a[B]&1)!=0){break}c[z>>2]=1;c[A>>2]=c[t>>2]}}while(0);aO=hH(k,1,(c[ah>>2]&2|0)!=0)|0;bI=c[13898]|0;if((bB|0)==(bI|0)){break}if(bx){bQ=bI;au=8114;break L9498}c[aP>>2]=c[s>>2];c[aP+4>>2]=c[s+4>>2];c[aP+8>>2]=c[s+8>>2];c[aP+12>>2]=c[s+12>>2];c[aP+16>>2]=c[s+16>>2];c[aP+20>>2]=c[s+20>>2];c[aP+24>>2]=c[s+24>>2];c[aP+28>>2]=c[s+28>>2];c[aP+32>>2]=c[s+32>>2];c[aP+36>>2]=c[s+36>>2];c[aP+40>>2]=c[s+40>>2];c[aP+44>>2]=c[s+44>>2];c[aP+48>>2]=c[s+48>>2];c[aP+52>>2]=c[s+52>>2];if((aO|0)==0){bv=bv;bw=1;bx=1;by=by;bz=bz;continue}c[ak>>2]=aO-1;bv=bv;bw=1;bx=1;by=by;bz=bz}by=a$+21|0;a[by]=0;do{if(bz){cs=U;ct=O}else{a[bs]=1;if((c[9056]|0)!=1){if(!bq){a[U]=0}if(br){cs=U;ct=0;break}a[O]=0;cs=U;ct=O;break}bw=c[1054]|0;bv=(c[bw+(aW*40&-1)+36>>2]|0)+(c[bw+(aW*40&-1)+32>>2]|0)|0;bg=db(c[a4>>2]|0,(bv+1|0)-(c[bw+(aK*40&-1)+32>>2]|0)|0,116456)|0;c[a4>>2]=bg;bw=c[(c[1054]|0)+(aK*40&-1)+32>>2]|0;L9908:do{if((bw|0)<(bv|0)){bf=bw;bi=bg;while(1){be=a[(c[10036]|0)+bf|0]|0;if(be<<24>>24==0){cu=bi;break L9908}bh=bi+1|0;a[bi]=be;be=bf+1|0;if((be|0)<(bv|0)){bf=be;bi=bh}else{cu=bh;break}}}else{cu=bg}}while(0);a[cu]=0;if((a_|0)==2){cv=c[a4>>2]|0;cw=O}else if((a_|0)==1){cv=U;cw=c[a4>>2]|0}else{cv=U;cw=O}a[by]=1;cs=cv;ct=cw}}while(0);do{if(!bx){by=c[ah>>2]|0;if((by|0)==225){c[aj>>2]=X;hL(aR,1);c[aP>>2]=c[aS>>2];c[aP+4>>2]=c[aS+4>>2];c[aP+8>>2]=c[aS+8>>2];c[aP+12>>2]=c[aS+12>>2];c[aP+16>>2]=c[aS+16>>2];c[aP+20>>2]=c[aS+20>>2];c[aP+24>>2]=c[aS+24>>2];c[aP+28>>2]=c[aS+28>>2];c[aP+32>>2]=c[aS+32>>2];c[aP+36>>2]=c[aS+36>>2];c[aP+40>>2]=c[aS+40>>2];c[aP+44>>2]=c[aS+44>>2];c[aP+48>>2]=c[aS+48>>2];c[aP+52>>2]=c[aS+52>>2];break}c[al>>2]=X;h[a$+40>>3]=1.0;c[ai>>2]=W;h[a$+48>>3]=+h[3817];a[ag]=0;do{if((a[30080]&1)==0){br=aw|0;bq=c[br>>2]|0;bs=c[8798]|0;bz=(bs|0)>0;bg=ax;L9926:while(1){bv=43264;while(1){cx=c[bv>>2]|0;if((cx|0)==0){break}if((c[cx+4>>2]|0)==(bg|0)){break L9926}else{bv=cx|0}}cy=bg-1|0;if(!((bg|0)>(bs|0)&bz)){au=7301;break}bg=((cy|0)%(bs|0)&-1)+1|0}if((au|0)==7301){au=0;c[al>>2]=cy;c[a$+64>>2]=1;c[a$+68>>2]=cy;c[ai>>2]=cy;cz=by;break}bs=cx+8|0;c[aP>>2]=c[bs>>2];c[aP+4>>2]=c[bs+4>>2];c[aP+8>>2]=c[bs+8>>2];c[aP+12>>2]=c[bs+12>>2];c[aP+16>>2]=c[bs+16>>2];c[aP+20>>2]=c[bs+20>>2];c[aP+24>>2]=c[bs+24>>2];c[aP+28>>2]=c[bs+28>>2];c[aP+32>>2]=c[bs+32>>2];c[aP+36>>2]=c[bs+36>>2];c[aP+40>>2]=c[bs+40>>2];c[aP+44>>2]=c[bs+44>>2];c[aP+48>>2]=c[bs+48>>2];c[aP+52>>2]=c[bs+52>>2];c[br>>2]=bq;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[al>>2]=bg;a[ag]=0;cz=by;break}if((a[ag]&1)!=0){cz=by;break}c[a$+64>>2]=1;c[a$+68>>2]=c[al>>2];cz=by}else{lK(aw,ax);cz=c[ah>>2]|0}}while(0);by=hH(aw,1,(cz&2|0)!=0)|0;if((by|0)==0){c[ak>>2]=X;break}else{c[ak>>2]=by-1;break}}}while(0);ak=c[ah>>2]|0;ax=(ak&2|0)==0;if(!ax){c[aw>>2]=1}do{if(!((c[bm>>2]|0)!=2|ax)){al=a$+48|0;if(+h[al>>3]!=-3.0){break}h[al>>3]=1.0}}while(0);if((ak|0)==1){a[bl]=0}do{if(bu){if((ak|0)==352|(ak|0)==400|(ak|0)==416|(ak|0)==432){cA=X;cB=W;break}aw=c[11690]|0;if(ax){cC=W;cD=a[38984]|0}else{al=a[38984]|0;cC=(((aw|0)!=0?2:1)+W|0)+(al&1)|0;cD=al}cA=(((aw|0)!=0?2:1)+X|0)+(cD&1)|0;cB=cC}else{cA=X;cB=W}}while(0);do{if((ak|0)==400){a[ag]=1}else if((ak|0)==416|(ak|0)==432){ax=c[16678]|0;if((ax&1|0)!=0){h[8341]=0.0}if((ax&2|0)==0){break}h[8342]=255.0}}while(0);if((a$|0)!=(c[ad>>2]|0)){au=7325;break L9498}if((c[bm>>2]|0)==3){cE=c[a$+4>>2]|0;ak=a0;ag=a$;while(1){if((ag|0)==0){au=7329;break L9498}cF=ag+4|0;c[cF>>2]=cE;ax=c[11870]|0;do{if((c[8732]|0)==0){if((ax|0)==2){au=7332;break L9498}else if((ax|0)!=1){break}c[12210]=0}else{if((ax|0)==1){au=7335;break L9498}}}while(0);ax=ag+252|0;c[ax>>2]=0;bu=ag+244|0;c[bu>>2]=1;bl=ag+239|0;a[bl]=0;aw=ag+260|0;al=c[aw>>2]|0;if((al|0)!=0){ai=al;while(1){al=c[ai>>2]|0;aS=c[ai+12>>2]|0;if((aS|0)!=0){uu(aS)}uu(ai);if((al|0)==0){break}else{ai=al}}c[aw>>2]=0}if((a[47584]&1)!=0){c[bu>>2]=1}ai=hu(c[6352]|0)|0;al=ag+12|0;aS=c[al>>2]|0;if((aS|0)==368){c[272]=1;aR=c[273]|0;do{if((aR|0)!=0){if((c[aR>>2]|0)!=2){break}aj=aR+40|0;if((c[aj>>2]|0)!=42){break}c[aj>>2]=43}}while(0);cG=c[al>>2]|0}else{cG=aS}if((cG|0)==225){aR=hu(c[6352]|0)|0;c[ai>>2]=aR;c[aR+8>>2]=0}aR=c[8270]|0;do{if((aR|0)!=0){if((aY(aR|0,139696)|0)==0){break}bA(4,aR|0)}}while(0);a[47040]=1;aR=ag+64|0;aS=ag+48|0;aj=ag+23|0;bx=ag+28|0;by=ag+56|0;bs=ag+224|0;bz=ag;bv=0;bw=0;bB=0;cH=8.988465674311579e+307;bi=0;bf=0;aQ=ai;L10008:while(1){cI=eC(F,7)|0;if((cI|0)==(-9|0)){bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}else if((cI|0)==0){bh=c[11932]|0;uh(-1,116952,(v=i,i=i+16|0,c[v>>2]=c[11900],c[v+8>>2]=(bh|0)!=0?bh:179864,v)|0)}else if((cI|0)==(-3|0)){bh=c[al>>2]|0;if((bh|0)==400|(bh|0)==416|(bh|0)==432|(bh|0)==225){bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}if((bf|0)==0){if((bv|0)==0){bv=0;bw=bw;bB=bB;cH=cH;bi=bi;bf=0;aQ=aQ;continue}else{cJ=bv}}else{cJ=bf}if((bv|0)<=0){bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=cJ;aQ=aQ;continue}c[aQ+8>>2]=bv;c[aQ>>2]=c[aw>>2];c[aw>>2]=aQ;c[ax>>2]=(c[ax>>2]|0)+1;if((bv|0)!=(cJ|0)){c[bu>>2]=0}bv=0;bw=bw+1|0;bB=bB;cH=cH;bi=bi;bf=cJ;aQ=hu(cJ)|0;continue}else if((cI|0)==(-6|0)){eL(bz);bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}else if((cI|0)==(-7|0)){aI(115120,50,1,c[m>>2]|0);bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}else if((cI|0)==(-1|0)|(cI|0)==(-4|0)){break}do{if((bv|0)<(c[aQ+4>>2]|0)){au=7370}else{bh=(bv<<1)+1e3|0;hv(aQ,bh);if((c[al>>2]|0)==225){be=aQ|0;hv(c[be>>2]|0,bh);c[(c[be>>2]|0)+8>>2]=0;au=7370;break}else{be=c[aQ+12>>2]|0;cK=bi;cL=be;cM=be+(bv<<6)|0;break}}}while(0);do{if((au|0)==7370){au=0;bg=c[aQ+12>>2]|0;bq=bg+(bv<<6)|0;if((c[al>>2]|0)!=225){cK=bi;cL=bg;cM=bq;break}if((cI|0)<6){c[bq>>2]=2;bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue L10008}else{cK=(c[(c[aQ>>2]|0)+12>>2]|0)+(bv<<6)|0;cL=bg;cM=bq;break}}}while(0);bq=cM|0;L10036:do{if((cI|0)==(-2|0)|(cI|0)==(-5|0)){c[bq>>2]=2;cN=bB;cO=cH}else{c[bq>>2]=0;bg=c[8732]|0;do{if((bg|0)==0){if((cI|0)==1){cP=3;cQ=bB;cR=cH;cS=+h[F>>3];cT=+(bw|0);cU=+(bv|0);break}else if((cI|0)==2){if((c[al>>2]|0)!=352){au=7380;break L9498}cP=3;cQ=1;cR=+h[G>>3];cS=+h[F>>3];cT=+(bw|0);cU=+(bv|0);break}else{if((cI|0)<=2){cP=cI;cQ=bB;cR=cH;cS=0.0;cT=0.0;cU=0.0;break}cP=cI;cQ=bB;cR=cH;cS=+h[H>>3];cT=+h[G>>3];cU=+h[F>>3];break}}else if((bg|0)==1){if((cI|0)<2){au=7385;break L9498}if((cI|0)<3){h[H>>3]=1.0;cV=3;cW=1.0}else{cV=cI;cW=+h[H>>3]}cX=+h[9040];cY=cX*+h[F>>3];h[F>>3]=cY;cZ=cX*+h[G>>3];h[G>>3]=cZ;cX=cW*+S(+cY);c_=+S(+cZ);c$=c_*cW*+T(+cY);cP=cV;cQ=bB;cR=cH;cS=cW*+T(+cZ);cT=c$;cU=cX*c_}else if((bg|0)==2){if((cI|0)<2){au=7391;break L9498}if((cI|0)<3){h[H>>3]=1.0;c0=3;c1=1.0}else{c0=cI;c1=+h[H>>3]}c_=+h[9040]*+h[F>>3];h[F>>3]=c_;cX=c1*+S(+c_);c$=c1*+T(+c_);cP=c0;cQ=bB;cR=cH;cS=+h[G>>3];cT=c$;cU=cX}else{au=7396;break L9498}}while(0);if((cP|0)<(c[11870]|0)){au=7398;break L9498}bg=c[al>>2]|0;if((bg|0)==33){br=(c[aR>>2]|0)==6;c2=br?1:cQ;c3=br?cS:cR}else{c2=cQ;c3=cR}do{if((cP|0)>3){do{if((bg|0)==18|(bg|0)==51){if(+h[aS>>3]==-3.0){h[cL+(bv<<6)+48>>3]=+h[I>>3];c4=0;c5=cS;break}else{if((bg|0)==368){c4=0;c5=cS;break}else{au=7406;break}}}else if((bg|0)==368){c4=0;c5=cS}else{au=7406}}while(0);if((au|0)==7406){au=0;c4=1;c5=+h[I>>3]}if((cP|0)<=4){c6=c4;c7=c5;c8=0.0;c9=0.0;da=0.0;break}bJ=c[al>>2]|0;if((bJ|0)==18|(bJ|0)==51){if(+h[aS>>3]!=-3.0){c6=c4;c7=c5;c8=0.0;c9=0.0;da=0.0;break}cX=+h[J>>3];de=1;df=cX;dg=cX}else{de=c4;df=c5;dg=+h[J>>3]}bE=(bJ|0)==368;if(!((cP|0)>5&(bJ|0)==225)){c6=bE?1:de;c7=bE?dg:df;c8=0.0;c9=0.0;da=0.0;break}bE=(cP|0)>6;c6=bE&1;c7=bE?+h[L>>3]:cS;c8=cS+ +h[K>>3];c9=cT+dg;da=cU+ +h[I>>3]}else{c6=c2;c7=c3;c8=0.0;c9=0.0;da=0.0}}while(0);c[bq>>2]=0;bg=c[200]|0;L10082:do{if((bg|0)!=99){if(!(cU>-8.988465674311579e+307&cU<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cL+(bv<<6)+8>>3]=cU}else{if(cU<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(cU==0.0){h[cL+(bv<<6)+8>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10082}else{cX=+_(+cU);h[cL+(bv<<6)+8>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(cU<+h[bE>>3]){h[bE>>3]=cU}bE=64664+(bg*688&-1)|0;do{if(cU<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10082}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=cU;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>cU){h[bE>>3]=cX;c[bq>>2]=1;break L10082}else{h[bE>>3]=cU;break}}}while(0);bE=64720+(bg*688&-1)|0;if(cU>+h[bE>>3]){h[bE>>3]=cU}bE=64672+(bg*688&-1)|0;if(cU<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=cU;break}cX=+h[64760+(bg*688&-1)>>3];if(cX<cU){h[bE>>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=cU;break}}}while(0);bg=c[144]|0;L10128:do{if((bg|0)!=99){if(!(cT>-8.988465674311579e+307&cT<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cL+(bv<<6)+16>>3]=cT}else{if(cT<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(cT==0.0){h[cL+(bv<<6)+16>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10128}else{cX=+_(+cT);h[cL+(bv<<6)+16>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(cT<+h[bE>>3]){h[bE>>3]=cT}bE=64664+(bg*688&-1)|0;do{if(cT<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10128}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=cT;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>cT){h[bE>>3]=cX;c[bq>>2]=1;break L10128}else{h[bE>>3]=cT;break}}}while(0);bE=64720+(bg*688&-1)|0;if(cT>+h[bE>>3]){h[bE>>3]=cT}bE=64672+(bg*688&-1)|0;if(cT<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=cT;break}cX=+h[64760+(bg*688&-1)>>3];if(cX<cT){h[bE>>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=cT;break}}}while(0);L10174:do{if((c[al>>2]|0)==225){c[cK>>2]=0;bg=c[200]|0;L10176:do{if((bg|0)!=99){if(!(da>-8.988465674311579e+307&da<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cK+8>>3]=da}else{if(da<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(da==0.0){h[cK+8>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10176}else{cX=+_(+da);h[cK+8>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(da<+h[bE>>3]){h[bE>>3]=da}bE=64664+(bg*688&-1)|0;do{if(da<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10176}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=da;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>da){h[bE>>3]=cX;c[bq>>2]=1;break L10176}else{h[bE>>3]=da;break}}}while(0);bE=64720+(bg*688&-1)|0;if(da>+h[bE>>3]){h[bE>>3]=da}bE=64672+(bg*688&-1)|0;if(da<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=da;break}cX=+h[64760+(bg*688&-1)>>3];if(cX<da){h[bE>>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=da;break}}}while(0);bg=c[144]|0;if((bg|0)==99){break}if(!(c9>-8.988465674311579e+307&c9<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cK+16>>3]=c9}else{if(c9<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(c9==0.0){h[cK+16>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10174}else{cX=+_(+c9);h[cK+16>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(c9<+h[bE>>3]){h[bE>>3]=c9}bE=64664+(bg*688&-1)|0;do{if(c9<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10174}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=c9;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>c9){h[bE>>3]=cX;c[bq>>2]=1;break L10174}else{h[bE>>3]=c9;break}}}while(0);bE=64720+(bg*688&-1)|0;if(c9>+h[bE>>3]){h[bE>>3]=c9}bE=64672+(bg*688&-1)|0;if(c9<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=c9;break}cX=+h[64760+(bg*688&-1)>>3];if(cX<c9){h[bE>>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=c9;break}}}while(0);L10267:do{if((a[47032]&1)==0){if((c[al>>2]|0)==400){h[cL+(bv<<6)+32>>3]=cS}bE=c[34]|0;L10274:do{if((bE|0)!=99){if(!(cS>-8.988465674311579e+307&cS<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bE*688&-1)|0]&1)==0){h[cL+(bv<<6)+24>>3]=cS}else{if(cS<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(cS==0.0){h[cL+(bv<<6)+24>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10274}else{cX=+_(+cS);h[cL+(bv<<6)+24>>3]=cX/+h[64800+(bE*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bE|0)<0){break}bJ=64712+(bE*688&-1)|0;if(cS<+h[bJ>>3]){h[bJ>>3]=cS}bJ=64664+(bE*688&-1)|0;do{if(cS<+h[bJ>>3]){if((c[64648+(bE*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10274}if((c[64728+(bE*688&-1)>>2]&1|0)==0){h[bJ>>3]=cS;break}cX=+h[64736+(bE*688&-1)>>3];if(cX>cS){h[bJ>>3]=cX;c[bq>>2]=1;break L10274}else{h[bJ>>3]=cS;break}}}while(0);bJ=64720+(bE*688&-1)|0;if(cS>+h[bJ>>3]){h[bJ>>3]=cS}bJ=64672+(bE*688&-1)|0;if(cS<=+h[bJ>>3]){break}if((c[64648+(bE*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bE*688&-1)>>2]&2|0)==0){h[bJ>>3]=cS;break}cX=+h[64760+(bE*688&-1)>>3];if(cX<cS){h[bJ>>3]=cX;c[bq>>2]=1;break}else{h[bJ>>3]=cS;break}}}while(0);bE=c[34]|0;L10320:do{if(!((c[al>>2]|0)!=225|(bE|0)==99)){if(!(c8>-8.988465674311579e+307&c8<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bE*688&-1)|0]&1)==0){h[cK+24>>3]=c8}else{if(c8<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(c8==0.0){h[cK+24>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10320}else{cX=+_(+c8);h[cK+24>>3]=cX/+h[64800+(bE*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bE|0)<0){break}bg=64712+(bE*688&-1)|0;if(c8<+h[bg>>3]){h[bg>>3]=c8}bg=64664+(bE*688&-1)|0;do{if(c8<+h[bg>>3]){if((c[64648+(bE*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10320}if((c[64728+(bE*688&-1)>>2]&1|0)==0){h[bg>>3]=c8;break}cX=+h[64736+(bE*688&-1)>>3];if(cX>c8){h[bg>>3]=cX;c[bq>>2]=1;break L10320}else{h[bg>>3]=c8;break}}}while(0);bg=64720+(bE*688&-1)|0;if(c8>+h[bg>>3]){h[bg>>3]=c8}bg=64672+(bE*688&-1)|0;if(c8<=+h[bg>>3]){break}if((c[64648+(bE*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bE*688&-1)>>2]&2|0)==0){h[bg>>3]=c8;break}cX=+h[64760+(bE*688&-1)>>3];if(cX<c8){h[bg>>3]=cX;c[bq>>2]=1;break}else{h[bg>>3]=c8;break}}}while(0);if((c[bx>>2]|0)==-6){h[cL+(bv<<6)+32>>3]=c7}if(!((c[al>>2]|0)==352|(c[7662]|0)==1)){if((a[by]&1)==0){au=7669;break}}bE=c[bq>>2]|0;if((c6|0)==0){if(!(cS>-8.988465674311579e+307&cS<8.988465674311579e+307)){cN=0;cO=c7;break L10036}do{if((a[66852]&1)==0){h[cL+(bv<<6)+32>>3]=cS}else{if(cS<0.0){cN=0;cO=c7;break L10036}if(cS==0.0){h[cL+(bv<<6)+32>>3]=-8.988465674311579e+307;au=7669;break L10267}else{cX=+_(+cS);h[cL+(bv<<6)+32>>3]=cX/+h[8358];break}}}while(0);if(!((a[aj]&1)==0&(bE|0)==0)){au=7669;break}if(cS<+h[8347]){h[8347]=cS}do{if(cS<+h[8341]){if((c[16678]&1|0)==0){au=7669;break L10267}if((c[16698]&1|0)==0){h[8341]=cS;break}cX=+h[8350];if(cX>cS){h[8341]=cX;au=7669;break L10267}else{h[8341]=cS;break}}}while(0);if(cS>+h[8348]){h[8348]=cS}if(cS<=+h[8342]){au=7669;break}if((c[16678]&2|0)==0){au=7669;break}if((c[16699]&2|0)==0){h[8342]=cS;au=7669;break}cX=+h[8353];if(cX<cS){h[8342]=cX;au=7669;break}else{h[8342]=cS;au=7669;break}}else{if(!(c7>-8.988465674311579e+307&c7<8.988465674311579e+307)){cN=c6;cO=c7;break L10036}do{if((a[66852]&1)==0){h[cL+(bv<<6)+32>>3]=c7}else{if(c7<0.0){cN=c6;cO=c7;break L10036}if(c7==0.0){h[cL+(bv<<6)+32>>3]=-8.988465674311579e+307;au=7669;break L10267}else{cX=+_(+c7);h[cL+(bv<<6)+32>>3]=cX/+h[8358];break}}}while(0);if(!((a[aj]&1)==0&(bE|0)==0)){au=7669;break}if(c7<+h[8347]){h[8347]=c7}do{if(c7<+h[8341]){if((c[16678]&1|0)==0){au=7669;break L10267}if((c[16698]&1|0)==0){h[8341]=c7;break}cX=+h[8350];if(cX>c7){h[8341]=cX;au=7669;break L10267}else{h[8341]=c7;break}}}while(0);if(c7>+h[8348]){h[8348]=c7}if(c7<=+h[8342]){au=7669;break}if((c[16678]&2|0)==0){au=7669;break}if((c[16699]&2|0)==0){h[8342]=c7;au=7669;break}cX=+h[8353];if(cX<c7){h[8342]=cX;au=7669;break}else{h[8342]=c7;au=7669;break}}}else{h[cL+(bv<<6)+24>>3]=cS;bE=c[al>>2]|0;if((bE|0)!=225){dh=bE;break}h[cK+24>>3]=c8;au=7669}}while(0);if((au|0)==7669){au=0;dh=c[al>>2]|0}if((dh|0)==368){iW(c[bs>>2]|0,cM,bv,c[11767]|0,c7);di=c[al>>2]|0}else{di=dh}if(!((di|0)==416|(di|0)==432)){cN=c6;cO=c7;break}h[cL+(bv<<6)+40>>3]=+h[I>>3];h[cL+(bv<<6)+48>>3]=+h[J>>3];h[cL+(bv<<6)+56>>3]=+h[K>>3];h[cL+(bv<<6)+32>>3]=+h[L>>3];cN=c6;cO=c7}}while(0);bv=bv+1|0;bw=bw;bB=cN;cH=cO;bi=cK;bf=bf;aQ=aQ}bi=c[8270]|0;do{if((bi|0)!=0){if((aY(bi|0,139696)|0)==0){break}bA(4,139696)}}while(0);if((bB|0)!=0){a[bl]=1}do{if((bv|0)>0){c[ax>>2]=(c[ax>>2]|0)+1;c[aQ+8>>2]=bv;if((c[al>>2]|0)!=225){c[aQ>>2]=c[aw>>2]}c[aw>>2]=aQ;if((bv|0)==(bf|0)){break}c[bu>>2]=0}else{do{if((c[al>>2]|0)==225){bi=c[aQ>>2]|0;if((bi|0)==0){break}bw=c[bi+12>>2]|0;if((bw|0)!=0){uu(bw)}uu(bi)}}while(0);if((aQ|0)==0){break}bi=c[aQ+12>>2]|0;if((bi|0)!=0){uu(bi)}uu(aQ)}}while(0);do{if((a[47032]&1)!=0){if((c[ax>>2]|0)<=0){break}aQ=c[aw>>2]|0;al=c[aQ+12>>2]|0;cH=+h[al+8>>3];cX=+h[al+16>>3];al=(aQ|0)==0;if(al){dj=cH;dl=cH;dm=cX;dn=cX}else{c$=cH;c_=cH;cH=cX;cZ=cX;bf=aQ;while(1){bv=c[bf+8>>2]|0;if((bv|0)>0){cX=c$;cY=c_;dp=cH;dq=cZ;bB=c[bf+12>>2]|0;bi=0;while(1){do{if((c[bB>>2]|0)==2){dr=dq;ds=dp;dt=cY;du=cX}else{dv=+h[bB+8>>3];dw=cX>dv?dv:cX;dx=cY<dv?dv:cY;dv=+h[bB+16>>3];dy=dp>dv?dv:dp;if(dq>=dv){dr=dq;ds=dy;dt=dx;du=dw;break}dr=dv;ds=dy;dt=dx;du=dw}}while(0);bw=bi+1|0;if((bw|0)<(bv|0)){cX=du;cY=dt;dp=ds;dq=dr;bB=bB+64|0;bi=bw}else{dz=du;dA=dt;dB=ds;dC=dr;break}}}else{dz=c$;dA=c_;dB=cH;dC=cZ}bi=c[bf>>2]|0;if((bi|0)==0){dj=dz;dl=dA;dm=dB;dn=dC;break}else{c$=dz;c_=dA;cH=dB;cZ=dC;bf=bi}}}cZ=(dl-dj)/+((c[11756]|0)-1|0);cH=(dn-dm)/+((c[11732]|0)-1|0);c[aw>>2]=0;c[ax>>2]=c[11756];c[bu>>2]=1;if((c[11752]|0)==2){if(al){dD=0}else{bf=0;bi=aQ;while(1){bB=(c[bi+8>>2]|0)+bf|0;bv=c[bi>>2]|0;if((bv|0)==0){dD=bB;break}else{bf=bB;bi=bv}}}bi=dD+3|0;bf=aa(bi<<3,dD+8|0);bv=ut(bf)|0;if((bv|0)==0){gk();bB=ut(bf)|0;if((bB|0)==0){au=7709;break L9498}else{dE=bB}}else{dE=bv}bv=dE;bB=bi<<2;bi=ut(bB)|0;if((bi|0)==0){gk();bf=ut(bB)|0;if((bf|0)==0){au=7712;break L9498}else{dF=bf}}else{dF=bi}bi=dF;bf=dD<<1;bB=bf+dD|0;bw=bv+(bB<<3)|0;if(al){dG=0;dH=3;au=7715}else{bs=0;by=aQ;while(1){bx=by+8|0;aS=c[bx>>2]|0;if((aS|0)>0){aR=bs;bz=0;ai=c[by+12>>2]|0;bq=aS;while(1){if((c[ai>>2]|0)==2){dI=aR;dJ=bq}else{h[bv+(aR<<3)>>3]=+h[ai+8>>3];h[bv+(aR+dD<<3)>>3]=+h[ai+16>>3];h[bv+(aR+bf<<3)>>3]=+h[ai+24>>3];dI=aR+1|0;dJ=c[bx>>2]|0}aS=bz+1|0;if((aS|0)<(dJ|0)){aR=dI;bz=aS;ai=ai+64|0;bq=dJ}else{dK=dI;break}}}else{dK=bs}bq=c[by>>2]|0;if((bq|0)==0){break}else{bs=dK;by=bq}}by=dK+3|0;if((by|0)>0){dG=dK;dH=by;au=7715}else{dL=dK;dM=by}}if((au|0)==7715){au=0;by=0;while(1){bs=by+1|0;c[bi+(by<<2)>>2]=bv+(aa(bs,dH)+bB<<3);if((bs|0)<(dH|0)){by=bs}else{dL=dG;dM=dH;break}}}if((dL|0)>0){by=0;while(1){bs=by+1|0;bq=(bs|0)<(dL|0);if(bq){ai=bv+(by<<3)|0;bz=bv+(by+dD<<3)|0;aR=bi+(by<<2)|0;bx=bs;while(1){c_=+h[ai>>3]- +h[bv+(bx<<3)>>3];c$=+h[bz>>3]- +h[bv+(bx+dD<<3)>>3];dq=+Q(+(c_*c_+c$*c$));if(dq>0.0){dN=dq*dq*+_(+dq)}else{dN=0.0}dq=-0.0-dN;h[(c[bi+(bx<<2)>>2]|0)+(by<<3)>>3]=dq;h[(c[aR>>2]|0)+(bx<<3)>>3]=dq;aS=bx+1|0;if((aS|0)<(dL|0)){bx=aS}else{dO=aR;break}}}else{dO=bi+(by<<2)|0}h[(c[dO>>2]|0)+(by<<3)>>3]=0.0;h[bv+(by+bB<<3)>>3]=+h[bv+(by+bf<<3)>>3];if(bq){by=bs}else{break}}by=bi+(dL<<2)|0;bf=dL+1|0;aR=bi+(bf<<2)|0;bx=dL+2|0;bz=bi+(bx<<2)|0;ai=0;while(1){h[(c[by>>2]|0)+(ai<<3)>>3]=1.0;aS=bi+(ai<<2)|0;h[(c[aS>>2]|0)+(dL<<3)>>3]=1.0;dq=+h[bv+(ai<<3)>>3];h[(c[aR>>2]|0)+(ai<<3)>>3]=dq;h[(c[aS>>2]|0)+(bf<<3)>>3]=dq;dq=+h[bv+(ai+dD<<3)>>3];h[(c[bz>>2]|0)+(ai<<3)>>3]=dq;h[(c[aS>>2]|0)+(bx<<3)>>3]=dq;aS=ai+1|0;if((aS|0)<(dL|0)){ai=aS}else{dP=bf;dQ=bx;dR=by;dS=aR;dU=bz;break}}}else{bz=dL+1|0;aR=dL+2|0;dP=bz;dQ=aR;dR=bi+(dL<<2)|0;dS=bi+(bz<<2)|0;dU=bi+(aR<<2)|0}h[bv+(dL+bB<<3)>>3]=0.0;h[bv+(dP+bB<<3)>>3]=0.0;h[bv+(dQ+bB<<3)>>3]=0.0;h[(c[dR>>2]|0)+(dL<<3)>>3]=0.0;h[(c[dR>>2]|0)+(dP<<3)>>3]=0.0;h[(c[dR>>2]|0)+(dQ<<3)>>3]=0.0;h[(c[dS>>2]|0)+(dL<<3)>>3]=0.0;h[(c[dS>>2]|0)+(dP<<3)>>3]=0.0;h[(c[dS>>2]|0)+(dQ<<3)>>3]=0.0;h[(c[dU>>2]|0)+(dL<<3)>>3]=0.0;h[(c[dU>>2]|0)+(dP<<3)>>3]=0.0;h[(c[dU>>2]|0)+(dQ<<3)>>3]=0.0;aR=dM<<2;bz=ut(aR)|0;if((bz|0)==0){gk();by=ut(aR)|0;if((by|0)==0){au=7736;break L9498}else{dV=by}}else{dV=bz}bz=dV;ht(bi,dM,bz,e);hq(bi,dM,bz,bw);uu(dF);uu(dV);dW=bv+((dL*3&-1)<<3)|0;dX=bv+(dL<<3)|0;dY=dL;dZ=bv}else{dW=0;dX=0;dY=0;dZ=0}if((c[11756]|0)>0){bz=dW+(dY<<3)|0;by=(dY|0)>0;aR=dW+(dY+1<<3)|0;bx=dW+(dY+2<<3)|0;dq=dj;bf=0;ai=c[11732]|0;while(1){aS=hu(ai+1|0)|0;c[aS+8>>2]=c[11732];c[aS>>2]=c[aw>>2];c[aw>>2]=aS;bE=c[11732]|0;if((bE|0)>0){c$=dm;bg=c[aS+12>>2]|0;aS=0;while(1){bJ=bg|0;c[bJ>>2]=0;br=c[11752]|0;L10552:do{if((br|0)==2){c_=+h[bz>>3];if(by){dp=c_;be=0;while(1){cY=+h[dZ+(be<<3)>>3]-dq;cX=+h[dX+(be<<3)>>3]-c$;dw=+h[dW+(be<<3)>>3];dx=+Q(+(cY*cY+cX*cX));if(dx>0.0){d_=dx*dx*+_(+dx)}else{d_=0.0}dx=dp-dw*d_;bh=be+1|0;if((bh|0)<(dY|0)){dp=dx;be=bh}else{d$=dx;break}}}else{d$=c_}d0=d$+dq*+h[aR>>3]+c$*+h[bx>>3];d1=0.0}else{if(al){d0=0.0;d1=0.0;break}be=(br|0)==1;bh=c[11734]|0;dp=+(bh|0);dx=+h[5865];dw=+h[5864];cX=0.0;cY=0.0;bd=aQ;L10555:while(1){bc=c[bd+8>>2]|0;if((bc|0)>0){dy=cX;dv=cY;bb=0;d2=c[bd+12>>2]|0;while(1){d3=+h[d2+8>>3]-dq;if(be){d4=+P(+d3);d5=+P(+(+h[d2+16>>3]-c$));if((bh|0)==1){d6=d4+d5}else if((bh|0)==2){d6=d4*d4+d5*d5}else if((bh|0)==4){d7=d4*d4+d5*d5;d6=d7*d7}else if((bh|0)==8){d7=d4*d4+d5*d5;d8=d7*d7;d6=d8*d8}else if((bh|0)==16){d8=d4*d4+d5*d5;d7=d8*d8;d8=d7*d7;d6=d8*d8}else{d8=+R(+d4,+dp);d6=d8+ +R(+d5,+dp)}if(d6==0.0){break L10555}d9=+h[d2+24>>3]/d6;ea=1.0/d6}else{d5=(+h[d2+16>>3]-c$)/dw;d8=+P(+(d3/dx));d3=+P(+d5);do{if(d8>d3){eb=d8*+Q(+(d3*d3/(d8*d8)+1.0))}else{if(d5==0.0){eb=0.0;break}eb=d3*+Q(+(d8*d8/(d3*d3)+1.0))}}while(0);do{if((br|0)==3){ec=+Z(+(eb*(-0.0-eb)))}else if((br|0)==5){ec=1.0/(eb*eb+1.0)}else if((br|0)==4){ec=+Z(+(-0.0-eb))}else if((br|0)==6){ec=eb<1.0?1.0:0.0}else if((br|0)==7){if(eb>=1.0){ec=0.0;break}ec=(1.0- +S(+(eb*6.283185307179586)))*.5}else{ec=0.0}}while(0);d9=ec*+h[d2+24>>3];ea=ec}d3=dv+d9;d8=dy+ea;ba=bb+1|0;if((ba|0)<(bc|0)){dy=d8;dv=d3;bb=ba;d2=d2+64|0}else{ed=d8;ee=d3;break}}}else{ed=cX;ee=cY}bb=c[bd>>2]|0;if((bb|0)==0){d0=ee;d1=ed;break L10552}else{cX=ed;cY=ee;bd=bb}}c[bJ>>2]=2;d0=+h[d2+24>>3];d1=1.0}}while(0);c[bJ>>2]=0;h[bg+8>>3]=dq;h[bg+16>>3]=c$;br=c[200]|0;if(dq<+h[64664+(br*688&-1)>>3]){if((c[64648+(br*688&-1)>>2]&1|0)==0){au=7785}else{au=7779}}else{au=7779}do{if((au|0)==7779){au=0;if(dq>+h[64672+(br*688&-1)>>3]){if((c[64648+(br*688&-1)>>2]&2|0)==0){au=7785;break}}bd=c[144]|0;if(c$<+h[64664+(bd*688&-1)>>3]){if((c[64648+(bd*688&-1)>>2]&1|0)==0){au=7785;break}}if(c$<=+h[64672+(bd*688&-1)>>3]){ef=0;break}if((c[64648+(bd*688&-1)>>2]&2|0)==0){au=7785}else{ef=0}}}while(0);if((au|0)==7785){au=0;c[bJ>>2]=1;ef=1}do{if((c[11752]|0)==2){eg=d0}else{if((a[47016]&1)!=0){eg=d0;break}eg=d0/d1}}while(0);br=c[34]|0;L10616:do{if((br|0)!=99){if(!(eg>-8.988465674311579e+307&eg<8.988465674311579e+307)){c[bJ>>2]=2;break}do{if((a[64788+(br*688&-1)|0]&1)==0){h[bg+24>>3]=eg}else{if(eg<0.0){c[bJ>>2]=2;break L10616}if(eg==0.0){h[bg+24>>3]=-8.988465674311579e+307;c[bJ>>2]=1;break L10616}else{cY=+_(+eg);h[bg+24>>3]=cY/+h[64800+(br*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((ef|0)!=0|(br|0)<0){break}bd=64712+(br*688&-1)|0;if(eg<+h[bd>>3]){h[bd>>3]=eg}bd=64664+(br*688&-1)|0;do{if(eg<+h[bd>>3]){if((c[64648+(br*688&-1)>>2]&1|0)==0){c[bJ>>2]=1;break L10616}if((c[64728+(br*688&-1)>>2]&1|0)==0){h[bd>>3]=eg;break}cY=+h[64736+(br*688&-1)>>3];if(cY>eg){h[bd>>3]=cY;c[bJ>>2]=1;break L10616}else{h[bd>>3]=eg;break}}}while(0);bd=64720+(br*688&-1)|0;if(eg>+h[bd>>3]){h[bd>>3]=eg}bd=64672+(br*688&-1)|0;if(eg<=+h[bd>>3]){break}if((c[64648+(br*688&-1)>>2]&2|0)==0){c[bJ>>2]=1;break}if((c[64732+(br*688&-1)>>2]&2|0)==0){h[bd>>3]=eg;break}cY=+h[64760+(br*688&-1)>>3];if(cY<eg){h[bd>>3]=cY;c[bJ>>2]=1;break}else{h[bd>>3]=eg;break}}}while(0);if((a[bl]&1)!=0){au=7822;break L9498}br=c[bJ>>2]|0;L10663:do{if(eg>-8.988465674311579e+307&eg<8.988465674311579e+307){do{if((a[66852]&1)==0){h[bg+32>>3]=eg}else{if(eg<0.0){break L10663}if(eg==0.0){h[bg+32>>3]=-8.988465674311579e+307;break L10663}else{cY=+_(+eg);h[bg+32>>3]=cY/+h[8358];break}}}while(0);if(!((a[aj]&1)==0&(br|0)==0)){break}if(eg<+h[8347]){h[8347]=eg}do{if(eg<+h[8341]){if((c[16678]&1|0)==0){break L10663}if((c[16698]&1|0)==0){h[8341]=eg;break}cY=+h[8350];if(cY>eg){h[8341]=cY;break L10663}else{h[8341]=eg;break}}}while(0);if(eg>+h[8348]){h[8348]=eg}if(eg<=+h[8342]){break}if((c[16678]&2|0)==0){break}if((c[16699]&2|0)==0){h[8342]=eg;break}cY=+h[8353];if(cY<eg){h[8342]=cY;break}else{h[8342]=eg;break}}}while(0);br=aS+1|0;bJ=c[11732]|0;if((br|0)<(bJ|0)){c$=cH+c$;bg=bg+64|0;aS=br}else{eh=bJ;break}}}else{eh=bE}aS=bf+1|0;if((aS|0)<(c[11756]|0)){dq=cZ+dq;bf=aS;ai=eh}else{break}}}uu(dZ);if(al){break}else{ei=aQ}while(1){ai=c[ei>>2]|0;bf=c[ei+12>>2]|0;if((bf|0)!=0){uu(bf)}uu(ei);if((ai|0)==0){break}else{ei=ai}}}}while(0);aj=c[200]|0;do{if(+h[64664+(aj*688&-1)>>3]==8.988465674311579e+307){au=7861}else{if(+h[64672+(aj*688&-1)>>3]==-8.988465674311579e+307){au=7861;break}bl=c[144]|0;if(+h[64664+(bl*688&-1)>>3]==8.988465674311579e+307){au=7861;break}if(+h[64672+(bl*688&-1)>>3]==-8.988465674311579e+307){au=7861;break}bl=c[34]|0;if(+h[64664+(bl*688&-1)>>3]==8.988465674311579e+307){au=7861;break}if(+h[64672+(bl*688&-1)>>3]==-8.988465674311579e+307){au=7861}}}while(0);if((au|0)==7861){au=0;uh(-1,105912,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aj=c[ax>>2]|0;do{if((aj|0)<2){c[bu>>2]=0}else{if((c[bu>>2]|0)==0){break}if((a[38984]&1)!=0){break}bl=c[aw>>2]|0;aQ=c[bl+8>>2]|0;if((aQ|0)>0){al=0;ai=0;while(1){ej=hu(aj)|0;c[ej+8>>2]=aj;bf=c[aw>>2]|0;if((bf|0)!=0){bx=ej+12|0;aR=0;by=bf;while(1){uD((c[bx>>2]|0)+(aR<<6)|0,(c[by+12>>2]|0)+(ai<<6)|0,64);bf=c[by>>2]|0;if((bf|0)==0){break}else{aR=aR+1|0;by=bf}}}c[ej>>2]=al;by=ai+1|0;if((by|0)<(aQ|0)){al=ej;ai=by}else{break}}ek=ej;el=c[aw>>2]|0}else{ek=0;el=bl}ai=el;do{em=ai|0;ai=c[em>>2]|0;}while((ai|0)!=0);c[em>>2]=ek}}while(0);c[cF>>2]=c[13898];aw=c[7774]|0;if((aw|0)==0){en=0}else{en=c[aw+32>>2]|0}c[ag+248>>2]=en;if((c[ax>>2]|0)==0){c[ag+8>>2]=4}if((ag|0)!=(a$|0)){aw=ag+264|0;uB(aw|0,bo|0)}eo=ak+1|0;eq=ag|0;if((cI|0)==-1){break}aw=c[eq>>2]|0;do{if((aw|0)==0){uE(f|0,0,24);aj=ut(272)|0;if((aj|0)==0){gk();bu=ut(272)|0;if((bu|0)==0){au=7887;break L9498}else{er=bu}}else{er=aj}aj=er;uE(er|0,0,272);c[er+28>>2]=-2;bu=er+32|0;c[bu>>2]=0;c[bu+4>>2]=0;h[er+40>>3]=1.0;h[er+48>>3]=-2.0;bu=er+56|0;c[bu>>2]=c[f>>2];c[bu+4>>2]=c[f+4>>2];c[bu+8>>2]=c[f+8>>2];c[bu+12>>2]=c[f+12>>2];c[bu+16>>2]=c[f+16>>2];c[bu+20>>2]=c[f+20>>2];c[er+80>>2]=-1;c[er+84>>2]=0;bu=er+88|0;c[bu>>2]=c[12872];c[bu+4>>2]=c[12873];c[bu+8>>2]=c[12874];c[bu+12>>2]=c[12875];c[bu+16>>2]=c[12876];c[bu+20>>2]=c[12877];c[bu+24>>2]=c[12878];c[bu+28>>2]=c[12879];c[bu+32>>2]=c[12880];c[bu+36>>2]=c[12881];c[bu+40>>2]=c[12882];c[bu+44>>2]=c[12883];c[bu+48>>2]=c[12884];c[bu+52>>2]=c[12885];c[er+144>>2]=1;h[er+152>>3]=0.0;c[er+160>>2]=0;h[er+168>>3]=15.0;h[er+176>>3]=90.0;c[er+184>>2]=0;c[eq>>2]=aj;es=aj}else{aj=aw+16|0;bu=c[aj>>2]|0;if((bu|0)==0){es=aw;break}uu(bu);c[aj>>2]=0;es=aw}}while(0);c[es+8>>2]=3;aw=c[7774]|0;if((aw|0)==0){et=0}else{et=c[aw+32>>2]|0}c[es+248>>2]=et;aw=c[ah>>2]|0;c[es+12>>2]=aw;ax=es+24|0;c[ax>>2]=c[aP>>2];c[ax+4>>2]=c[aP+4>>2];c[ax+8>>2]=c[aP+8>>2];c[ax+12>>2]=c[aP+12>>2];c[ax+16>>2]=c[aP+16>>2];c[ax+20>>2]=c[aP+20>>2];c[ax+24>>2]=c[aP+24>>2];c[ax+28>>2]=c[aP+28>>2];c[ax+32>>2]=c[aP+32>>2];c[ax+36>>2]=c[aP+36>>2];c[ax+40>>2]=c[aP+40>>2];c[ax+44>>2]=c[aP+44>>2];c[ax+48>>2]=c[aP+48>>2];c[ax+52>>2]=c[aP+52>>2];if((aw|0)==368){uE(r|0,0,28);aw=ut(192)|0;if((aw|0)==0){gk();ax=ut(192)|0;if((ax|0)==0){au=7894;break L9498}else{eu=ax}}else{eu=aw}c[eu>>2]=0;c[eu+4>>2]=-1;c[eu+72>>2]=0;c[eu+88>>2]=0;uE(eu+8|0,0,60);c[eu+96>>2]=1;c[eu+144>>2]=4;c[eu+148>>2]=4;c[eu+152>>2]=4;aw=eu+156|0;c[aw>>2]=c[r>>2];c[aw+4>>2]=c[r+4>>2];c[aw+8>>2]=c[r+8>>2];c[aw+12>>2]=c[r+12>>2];c[aw+16>>2]=c[r+16>>2];c[aw+20>>2]=c[r+20>>2];c[aw+24>>2]=c[r+24>>2];a[eu+184|0]=0;aw=es+224|0;c[aw>>2]=eu;uD(eu|0,c[aT>>2]|0,192);c[c[aw>>2]>>2]=0}ak=eo;ag=c[eq>>2]|0}ez();ev=eq;ew=ag;ex=eo}else{c[a$+4>>2]=c[13898];ak=c[7774]|0;if((ak|0)==0){eA=0}else{eA=c[ak+32>>2]|0}c[a$+248>>2]=eA;ev=a$|0;ew=a$;ex=a0}ak=c[7774]|0;if((ak|0)==0){ay=ev;az=aK;aA=aX;aB=aZ;aC=0;aD=cA;aE=cB;aF=a_;aG=cs;aH=ct;aJ=ex;break}if((a[ak+38|0]&1)==0){ay=ev;az=aK;aA=aX;aB=aZ;aC=0;aD=cA;aE=cB;aF=a_;aG=cs;aH=ct;aJ=ex;break}c[ew+8>>2]=4;ay=ev;az=aK;aA=aX;aB=aZ;aC=0;aD=cA;aE=cB;aF=a_;aG=cs;aH=ct;aJ=ex}}while(0);do{if((aF|0)==0){if(ix(c[7774]|0)|0){c[13898]=az;eB=0;eD=az;break}p=c[7774]|0;if((p|0)!=0){af=p;while(1){p=c[af>>2]|0;uu(c[af+12>>2]|0);uu(af);if((p|0)==0){break}else{af=p}}}c[7774]=0;af=c[13898]|0;if((c[8272]|0)<=(af|0)){au=7924;break L9498}ag=c[1054]|0;if((a[ag+(af*40&-1)|0]&1)==0){au=7924;break L9498}p=c[ag+(af*40&-1)+36>>2]|0;ak=ag+(af*40&-1)+32|0;ag=c[10036]|0;aT=0;while(1){if((aT|0)>=(p|0)){break}if((a[ag+((c[ak>>2]|0)+aT|0)|0]|0)==(a[aT+148464|0]|0)){aT=aT+1|0}else{au=7924;break L9498}}if((aT|0)!=1){au=7924;break L9498}c[13898]=af+1;c[7774]=iw()|0;eB=0;eD=c[13898]|0}else{ak=c[13898]|0;if((c[8272]|0)<=(ak|0)){eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}ag=c[1054]|0;if((a[ag+(ak*40&-1)|0]&1)==0){eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}p=c[ag+(ak*40&-1)+36>>2]|0;aP=ag+(ak*40&-1)+32|0;ag=c[10036]|0;ah=0;while(1){if((ah|0)>=(p|0)){break}if((a[ag+((c[aP>>2]|0)+ah|0)|0]|0)==(a[ah+148464|0]|0)){ah=ah+1|0}else{eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}}if((ah|0)!=1){eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}aP=ak+1|0;c[13898]=aP;eB=aF;eD=aP}}while(0);if((eD|0)<(c[8272]|0)){N=aJ;O=aH;U=aG;V=eB;W=aE;X=aD;Y=aC;$=aB;ab=aA;ac=az;ad=ay;ae=eD}else{an=aC;ao=az;ap=aJ;aq=eB;ar=aB;as=aA;at=eD;au=6983;break}}do{if((au|0)==6983){if((ap|0)==0){q=at}else{eE=ao;eF=as;eG=ar;eH=an;eI=aq;eJ=ap;au=7925;break}uf(q,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8108){eK=c[13898]|0;uf(eK,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8109){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8110){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8111){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8112){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8113){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8114){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8116){i=b;return}else if((au|0)==6999){uf(c[13898]|0,92272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7012){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=101304,v)|0)}else if((au|0)==7020){uf(c[13898]|0,84448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7022){uf(c[13898]|0,76512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7088){uf(c[13898]|0,216936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7109){c[13898]=bR;au=7110}else if((au|0)==7167){uf(b8,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7220){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((au|0)==7325){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=151256,v)|0)}else if((au|0)==7329){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=149424,v)|0)}else if((au|0)==7332){uf(cE,123192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7335){uf(cE,121944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7380){uf(c[cF>>2]|0,114088,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0)}else if((au|0)==7385){uf(c[cF>>2]|0,110664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7391){uf(c[cF>>2]|0,110664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7396){uf(-1,107856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7398){uf(c[cF>>2]|0,106920,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0)}else if((au|0)==7709){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=104328,v)|0)}else if((au|0)==7712){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=103864,v)|0)}else if((au|0)==7736){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=103496,v)|0)}else if((au|0)==7822){uf(-1,104872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7887){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=101304,v)|0)}else if((au|0)==7894){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((au|0)==7924){eD=a[32936]|0;if(aB){eN=eD&1;eO=eD;eP=az;eQ=aA;eR=aC;eS=0;eT=aJ;au=7928}else{eU=aJ}}}while(0);if((au|0)==7110){c[a4>>2]=0;eK=c[13898]|0;uf(eK,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((au|0)==7925){eK=a[32936]|0;a4=eK&1;if(a4<<24>>24==0|(eI|0)==0){if(eG){eN=a4;eO=eK;eP=eE;eQ=eF;eR=eH;eS=eI;eT=eJ;au=7928;break}else{eU=eJ;break}}else{uf(-1,147440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((au|0)==7928){eJ=eN<<24>>24!=0;eI=eJ?9:2;eH=eJ?10:1;if(eJ){eV=eO}else{dc(2,145296);dc(1,143440);eV=a[32936]|0}do{if(!((eV&1)==0|eQ)){eJ=c[16506]|0;if((eJ&1|0)!=0){h[8255]=8.988465674311579e+307}if((eJ&2|0)!=0){h[8256]=-8.988465674311579e+307}eJ=c[16334]|0;if((eJ&1|0)!=0){h[8169]=8.988465674311579e+307}if((eJ&2|0)==0){break}h[8170]=-8.988465674311579e+307}}while(0);eg=+h[64664+(eI*688&-1)>>3];eJ=(a[64788+(eI*688&-1)|0]&1)==0;do{if(eJ){eW=+h[64672+(eI*688&-1)>>3];eX=eg}else{if(eg<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56832+(eI*24&-1),h[v+16>>3]=eg,v)|0)}d1=+_(+eg);d0=d1/+h[64800+(eI*688&-1)>>3];d1=+h[64672+(eI*688&-1)>>3];if(eJ){eW=d1;eX=d0;break}if(d1>0.0){ee=+_(+d1);eW=ee/+h[64800+(eI*688&-1)>>3];eX=d0;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56832+(eI*24&-1),h[v+16>>3]=d1,v)|0)}}}while(0);eg=+h[64664+(eH*688&-1)>>3];eJ=(a[64788+(eH*688&-1)|0]&1)==0;do{if(eJ){eY=+h[64672+(eH*688&-1)>>3];eZ=eg}else{if(eg<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56832+(eH*24&-1),h[v+16>>3]=eg,v)|0)}d1=+_(+eg);d0=d1/+h[64800+(eH*688&-1)>>3];d1=+h[64672+(eH*688&-1)>>3];if(eJ){eY=d1;eZ=d0;break}if(d1>0.0){ee=+_(+d1);eY=ee/+h[64800+(eH*688&-1)>>3];eZ=d0;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56832+(eH*24&-1),h[v+16>>3]=d1,v)|0)}}}while(0);if((c[6352]|0)<2|(c[6350]|0)<2|(c[9344]|0)<2|(c[9342]|0)<2){uf(-1,138240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}eJ=c[10828]|0;c[13898]=o;c[7774]=iw()|0;eF=(a[38984]&1)==0;eg=eW-eX;d1=eY-eZ;eE=c[9342]|0;d0=d1/+((eF?c[6350]|0:eE)-1|0);eG=c[9344]|0;ee=eg/+((eF?c[6352]|0:eG)-1|0);ed=eg/+(eG-1|0);eg=d1/+(eE-1|0);eE=eP;eG=eJ;eJ=eR;eF=eS;L10882:while(1){eK=(eF|0)==0;a4=eE;aJ=eJ;L10884:while(1){aC=c[13898]|0;if(eK){e_=aJ?a4:aC}else{e_=a4}if((t9(aC)|0)==0){au=7968;break}dT();aC=c[13898]|0;if((c[8272]|0)<=(aC|0)){a4=e_;aJ=1;continue}aA=c[1054]|0;if((a[aA+(aC*40&-1)|0]&1)==0){a4=e_;aJ=1;continue}az=c[aA+(aC*40&-1)+36>>2]|0;aB=aA+(aC*40&-1)+32|0;aA=c[10036]|0;cF=0;while(1){if((cF|0)>=(az|0)){break}if((a[aA+((c[aB>>2]|0)+cF|0)|0]|0)==(a[cF+148464|0]|0)){cF=cF+1|0}else{a4=e_;aJ=1;continue L10884}}if((cF|0)==1){e$=eG;e0=aJ;e1=eF;e2=aC;break}else{a4=e_;aJ=1}}L10896:do{if((au|0)==7968){au=0;e3=c[13898]|0;if((e3|0)>=(c[8272]|0)){au=7975;break L10882}aJ=c[1054]|0;L10899:do{if((a[aJ+(e3*40&-1)|0]&1)==0){e4=0}else{a4=c[aJ+(e3*40&-1)+36>>2]|0;eK=aJ+(e3*40&-1)+32|0;ak=c[10036]|0;ah=0;while(1){if((ah|0)>=(a4|0)){break}if((a[ak+((c[eK>>2]|0)+ah|0)|0]|0)==(a[ah+103664|0]|0)){ah=ah+1|0}else{e4=0;break L10899}}e4=(ah|0)==1}}while(0);if(e4|(eG|0)==0){au=7975;break L10882}c[11670]=31112;do{if((iu(l)|0)==0){c[n>>2]=c[eG+260>>2];if((a[32936]&1)==0){e5=eF}else{e5=(eF+2|0)%3&-1}c[7780]=c[l>>2];aJ=eG+12|0;if((c[aJ>>2]|0)==352|(c[7662]|0)==1){e8=1}else{e8=(a[eG+56|0]&1)!=0}i1(e5,0,n,eH,eZ,eg,c[9342]|0,eI,eX,ee,(a[38984]&1)!=0?c[9344]|0:c[6352]|0,e8);if((a[38984]&1)!=0){e9=e5;break}if((c[aJ>>2]|0)==352|(c[7662]|0)==1){fa=1}else{fa=(a[eG+56|0]&1)!=0}i1(e5,1,n,eI,eX,ed,c[9344]|0,eH,eZ,d0,c[6350]|0,fa);e9=e5}else{e9=eF}}while(0);aJ=c[eG+4>>2]|0;c[13898]=aJ;aC=c[eG+248>>2]|0;cF=eG;while(1){eK=c[cF>>2]|0;if((eK|0)==0){e$=0;e0=0;e1=e9;e2=aJ;break L10896}if((c[eK+4>>2]|0)!=(aJ|0)){e$=eK;e0=0;e1=e9;e2=aJ;break L10896}if((c[eK+248>>2]|0)==(aC|0)){cF=eK}else{e$=eK;e0=0;e1=e9;e2=aJ;break}}}}while(0);aJ=(e1|0)==0;if(aJ){if(ix(c[7774]|0)|0){c[13898]=e_;eE=e_;eG=e$;eJ=e0;eF=0;continue}cF=c[7774]|0;if((cF|0)!=0){aC=cF;while(1){cF=c[aC>>2]|0;uu(c[aC+12>>2]|0);uu(aC);if((cF|0)==0){break}else{aC=cF}}}c[7774]=0;fb=c[13898]|0}else{fb=e2}if((c[8272]|0)<=(fb|0)){break}aC=c[1054]|0;if((a[aC+(fb*40&-1)|0]&1)==0){break}cF=c[aC+(fb*40&-1)+36>>2]|0;eK=aC+(fb*40&-1)+32|0;aC=c[10036]|0;ak=0;while(1){if((ak|0)>=(cF|0)){break}if((a[aC+((c[eK>>2]|0)+ak|0)|0]|0)==(a[ak+148464|0]|0)){ak=ak+1|0}else{break L10882}}if((ak|0)!=1){break}c[13898]=fb+1;if(!aJ){eE=e_;eG=e$;eJ=e0;eF=e1;continue}c[7774]=iw()|0;eE=e_;eG=e$;eJ=e0;eF=0}if((au|0)==7975){uh(e3,136552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[32936]&1)==0){eU=eT;break}eF=c[10828]|0;c[d>>2]=eF;L10947:do{if((eT|0)>0){eJ=0;eG=d;eE=0;eH=eF;eI=eT;eK=eT;while(1){if((c[eH+8>>2]|0)==2){aC=eH|0;cF=c[aC>>2]|0;a4=cF|0;aB=c[a4>>2]|0;aA=c[aB+260>>2]|0;az=eI-2|0;if((aA|0)!=0){cE=eH+260|0;b8=cF+260|0;bR=aA;while(1){aA=c[cE>>2]|0;bQ=c[b8>>2]|0;q=c[aA+12>>2]|0;ap=c[bQ+12>>2]|0;aq=c[bR+12>>2]|0;an=bR+8|0;if((c[an>>2]|0)>0){ar=0;do{h[aq+(ar<<6)+8>>3]=+h[q+(ar<<6)+24>>3];h[aq+(ar<<6)+16>>3]=+h[ap+(ar<<6)+24>>3];as=aq+(ar<<6)|0;ao=c[as>>2]|0;at=c[q+(ar<<6)>>2]|0;if(ao>>>0<at>>>0){c[as>>2]=at;fc=at}else{fc=ao}ao=c[ap+(ar<<6)>>2]|0;if(fc>>>0<ao>>>0){c[as>>2]=ao}ar=ar+1|0;}while((ar|0)<(c[an>>2]|0))}an=c[bR>>2]|0;if((an|0)==0){break}else{cE=aA|0;b8=bQ|0;bR=an}}if((c[aC>>2]|0)!=(cF|0)){break}}c[a4>>2]=eE;c[eG>>2]=aB;fd=eH;fe=aB;ff=az;fg=az}else{fd=eE;fe=eH;ff=eI;fg=eK}bR=fe|0;b8=eJ+1|0;if((b8|0)<(ff|0)){eJ=b8;eG=bR;eE=fd;eH=c[bR>>2]|0;eI=ff;eK=fg}else{fh=bR;fi=fd;fj=fg;break L10947}}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=125824,v)|0)}else{fh=d;fi=0;fj=eT}}while(0);c[fh>>2]=fi;c[10828]=c[d>>2];eU=fj}}while(0);if((eU|0)==0|(c[10828]|0)==0){uf(c[13898]|0,134776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}dc(2,133200);if((a[66036]&1)!=0){eZ=+h[8255];h[8255]=+h[8256];h[8256]=eZ}do{if((a[66164]&1)!=0){eZ=+h[8255];if(eZ<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}eX=+h[8256];if(eX>0.0){eY=+_(+eZ);eZ=+h[8272];h[8255]=eY/eZ;h[8256]=+_(+eX)/eZ;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}}}while(0);dc(1,131808);if((a[65348]&1)!=0){eZ=+h[8169];h[8169]=+h[8170];h[8170]=eZ}do{if((a[65476]&1)!=0){eZ=+h[8169];if(eZ<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}eX=+h[8170];if(eX>0.0){eY=+_(+eZ);eZ=+h[8186];h[8169]=eY/eZ;h[8170]=+_(+eX)/eZ;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}}}while(0);do{if((c[5094]|0)==0){dc(0,130544)}else{eZ=+h[8083];eX=+h[8084];if(eX-eZ!=0.0){break}fj=c[16162]|0;if((fj|0)==0){uf(-1,197584,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if(eX==0.0){fk=1.0}else{fk=+P(+eX)*.01}if((fj&1|0)!=0){h[8083]=eZ-fk}if((fj&2|0)==0){break}h[8084]=fk+eX}}while(0);if((a[64660]&1)!=0){fk=+h[8083];h[8083]=+h[8084];h[8084]=fk}do{if((a[64788]&1)!=0){fk=+h[8083];if(fk<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}eX=+h[8084];if(eX>0.0){eZ=+_(+fk);fk=+h[8100];h[8083]=eZ/fk;h[8084]=+_(+eX)/fk;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}}}while(0);dd(2,20);dd(1,20);dd(0,20);i6(eU,2);if(a[31104]|0){dk();dc(3,129504);dd(3,20)}do{if((c[16508]&1|0)!=0){fj=c[16506]|0;if((fj&1|0)!=0){h[8257]=+h[8255]}if((fj&2|0)==0){break}h[8258]=+h[8256]}}while(0);fj=c[10828]|0;if((fj|0)==0){uf(c[13898]|0,134776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[11690]|0)!=0&(eU|0)>0){d=fj;fj=0;while(1){fi=d+256|0;fh=c[fi>>2]|0;if((fh|0)!=0){eT=fh;while(1){fh=c[eT>>2]|0;uu(c[eT+4>>2]|0);uu(eT);if((fh|0)==0){break}else{eT=fh}}c[fi>>2]=0}eT=c[d+12>>2]|0;do{if(!((eT|0)==368|(eT|0)==225|(eT|0)==400|(eT|0)==416|(eT|0)==432)){if((a[d+237|0]&1)!=0){break}if((c[d+244>>2]|0)==0){uh(-1,128216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}if((c[d+8>>2]|0)==3){c[fi>>2]=ep(c[d+252>>2]|0,c[d+260>>2]|0)|0;break}else{c[fi>>2]=ep(c[9342]|0,c[d+260>>2]|0)|0;break}}}while(0);fi=fj+1|0;if((fi|0)<(eU|0)){d=c[d>>2]|0;fj=fi}else{break}}}fj=c[7738]|0;L11058:do{if((fj|0)!=-1){d=(c[13898]|0)-1|0;fi=c[1054]|0;eT=(c[fi+(d*40&-1)+36>>2]|0)+(c[fi+(d*40&-1)+32>>2]|0)|0;d=db(c[6924]|0,(eT+1|0)-(c[fi+(fj*40&-1)+32>>2]|0)|0,116456)|0;c[6924]=d;fi=c[(c[1054]|0)+(fj*40&-1)+32>>2]|0;L11060:do{if((fi|0)<(eT|0)){fh=fi;fg=d;while(1){fd=a[(c[10036]|0)+fh|0]|0;if(fd<<24>>24==0){fl=fg;break L11060}ff=fg+1|0;a[fg]=fd;fd=fh+1|0;if((fd|0)<(eT|0)){fh=fd;fg=ff}else{fl=ff;break}}}else{fl=d}}while(0);a[fl]=0;c[7738]=-1;d=c[6924]|0;eT=e6(126928)|0;if((eT|0)==0){break}fi=eT+8|0;do{if((a[fi]&1)==0){fg=c[eT+24>>2]|0;if((aY(fg|0,d|0)|0)==0){break L11058}fh=eT+16|0;if((c[fh>>2]|0)!=3){break}uu(fg);c[fh>>2]=1}else{a[fi]=0}}while(0);if((d|0)==0){fm=0}else{fm=bP(d|0)|0}c[eT+16>>2]=3;c[eT+24>>2]=fm}}while(0);c[7952]=eU;if((a[14112]&1)!=0){li(eU);i=b;return}fv(c[10828]|0,eU,0);fm=0;do{if((c[64656+(fm*688&-1)>>2]&1|0)!=0){fk=+h[64664+(fm*688&-1)>>3];if((a[64788+(fm*688&-1)|0]&1)==0){h[64696+(fm*688&-1)>>3]=fk;fn=+h[64672+(fm*688&-1)>>3]}else{eX=+h[64800+(fm*688&-1)>>3];h[64696+(fm*688&-1)>>3]=+Z(+(fk*eX));fn=+Z(+(+h[64672+(fm*688&-1)>>3]*eX))}h[64704+(fm*688&-1)>>3]=fn}fm=fm+1|0;}while(fm>>>0<11);e7(1);c[6930]=eU;c[6928]=3;i=b;return}function i$(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,w=0,x=0.0;e=i;if((d|0)>0){f=0;g=b;while(1){b=c[g+12>>2]|0;do{if((b|0)==400|(b|0)==416|(b|0)==432){if((c[16507]|0)==0){break}f3(g,1)}else{j=c[g+260>>2]|0;if((j|0)==0){break}k=g+23|0;l=j;do{j=l+8|0;if((c[j>>2]|0)>0){m=l+12|0;n=0;do{o=c[m>>2]|0;p=o+(n<<6)|0;do{if((c[p>>2]|0)!=2){c[p>>2]=0;do{if((a[k]&1)==0){q=c[16507]|0;do{if((q&1|0)!=0){r=+h[o+(n<<6)+8>>3];if(r>=+h[8255]){break}h[8255]=r}}while(0);if((q&2|0)==0){break}r=+h[o+(n<<6)+8>>3];if(r<=+h[8256]){break}h[8256]=r}}while(0);r=+h[8255];s=+h[8256];t=+h[o+(n<<6)+8>>3];if(r<s){if(t<r|t>s){u=8137}}else{if(t<s|t>r){u=8137}}if((u|0)==8137){u=0;c[p>>2]=1;break}do{if((a[k]&1)==0){w=c[16335]|0;do{if((w&1|0)!=0){r=+h[o+(n<<6)+16>>3];if(r>=+h[8169]){break}h[8169]=r}}while(0);if((w&2|0)==0){break}r=+h[o+(n<<6)+16>>3];if(r<=+h[8170]){break}h[8170]=r}}while(0);r=+h[8169];t=+h[8170];s=+h[o+(n<<6)+16>>3];if(r<t){if(s<r|s>t){u=8148}}else{if(s<t|s>r){u=8148}}if((u|0)==8148){u=0;c[p>>2]=1;break}do{if((a[k]&1)==0){q=c[16163]|0;do{if((q&1|0)!=0){r=+h[o+(n<<6)+24>>3];if(r>=+h[8083]){break}h[8083]=r}}while(0);if((q&2|0)==0){break}r=+h[o+(n<<6)+24>>3];if(r<=+h[8084]){break}h[8084]=r}}while(0);r=+h[8083];s=+h[8084];t=+h[o+(n<<6)+24>>3];if(r<s){if(!(t<r|t>s)){break}}else{if(!(t<s|t>r)){break}}c[p>>2]=1}}while(0);n=n+1|0;}while((n|0)<(c[j>>2]|0))}l=c[l>>2]|0;}while((l|0)!=0)}}while(0);b=f+1|0;if((b|0)<(d|0)){f=b;g=c[g>>2]|0}else{break}}}dc(2,0);dc(1,0);r=+h[8083];t=+h[8084];if(t-r!=0.0){i=e;return}g=c[16162]|0;if((g|0)==0){uf(-1,197584,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if(t==0.0){x=1.0}else{x=+P(+t)*.01}if((g&1|0)!=0){h[8083]=r-x}if((g&2|0)==0){i=e;return}h[8084]=x+t;i=e;return}function i0(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0;f=i;i=i+24|0;g=f|0;uE(g|0,0,24);j=ut(272)|0;do{if((j|0)==0){gk();k=ut(272)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=101304,v)|0);return 0}else{l=j}}while(0);j=l;uE(l|0,0,272);c[l+28>>2]=-2;k=l+32|0;c[k>>2]=0;c[k+4>>2]=0;h[l+40>>3]=1.0;h[l+48>>3]=-2.0;k=l+56|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];c[k+16>>2]=c[g+16>>2];c[k+20>>2]=c[g+20>>2];c[l+80>>2]=-1;c[l+84>>2]=0;g=l+88|0;c[g>>2]=c[12872];c[g+4>>2]=c[12873];c[g+8>>2]=c[12874];c[g+12>>2]=c[12875];c[g+16>>2]=c[12876];c[g+20>>2]=c[12877];c[g+24>>2]=c[12878];c[g+28>>2]=c[12879];c[g+32>>2]=c[12880];c[g+36>>2]=c[12881];c[g+40>>2]=c[12882];c[g+44>>2]=c[12883];c[g+48>>2]=c[12884];c[g+52>>2]=c[12885];c[l+144>>2]=1;h[l+152>>3]=0.0;c[l+160>>2]=0;h[l+168>>3]=15.0;h[l+176>>3]=90.0;c[l+184>>2]=0;if(!((e|0)>0&(a|0)>0)){i=f;return j|0}if((b|0)>0){g=l+260|0;k=0;do{m=hu(d)|0;c[m>>2]=c[g>>2];c[g>>2]=m;k=k+1|0;}while((k|0)<(b|0))}b=l+260|0;l=0;do{k=hu(a)|0;c[k>>2]=c[b>>2];c[b>>2]=k;l=l+1|0;}while((l|0)<(e|0));i=f;return j|0}function i1(b,d,e,f,g,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;j=+j;k=k|0;l=l|0;m=+m;n=+n;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,$=0.0,aa=0.0,ab=0,ac=0.0,ad=0,ae=0.0,af=0,ag=0;q=i;i=i+24|0;r=q|0;if(p){s=(b|0)==0|(a[32936]&1)==0}else{s=0}if((k|0)<=0){i=q;return}p=d&1;t=p^1;u=64788+(f*688&-1)|0;w=31136+(t*24&-1)|0;x=31144+(t*24&-1)|0;y=31152+(t*24&-1)|0;t=(o|0)>0;z=64788+(l*688&-1)|0;A=31136+(p*24&-1)|0;B=31144+(p*24&-1)|0;C=31152+(p*24&-1)|0;p=r|0;D=r+8|0;E=D;F=(b|0)==99;G=64788+(b*688&-1)|0;H=(b|0)<0;I=64712+(b*688&-1)|0;J=64664+(b*688&-1)|0;K=64648+(b*688&-1)|0;L=64728+(b*688&-1)|0;M=64736+(b*688&-1)|0;N=64720+(b*688&-1)|0;O=64672+(b*688&-1)|0;Q=64732+(b*688&-1)|0;R=64760+(b*688&-1)|0;S=64800+(b*688&-1)|0;b=r+8|0;T=D;D=r+16|0;U=64800+(l*688&-1)|0;l=64800+(f*688&-1)|0;f=c[(c[e>>2]|0)+12>>2]|0;V=0;L11194:while(1){W=+(V|0)*j+g;if((a[u]&1)==0){X=W}else{X=+Z(+(W*+h[l>>3]))}c[w>>2]=2;h[x>>3]=X;h[y>>3]=0.0;if(t){Y=0;do{$=+(Y|0)*n+m;if((a[z]&1)==0){aa=$}else{aa=+Z(+($*+h[U>>3]))}c[A>>2]=2;h[B>>3]=aa;h[C>>3]=0.0;ab=f+(Y<<6)+8|0;if(d){h[ab>>3]=W;h[f+(Y<<6)+16>>3]=$}else{h[ab>>3]=$;h[f+(Y<<6)+16>>3]=W}e4(c[7780]|0,r);L11209:do{if((a[1960]&1)==0){ab=c[p>>2]|0;if((ab|0)==2){ac=+h[D>>3]}else if((ab|0)==3){ad=8203;break L11194}else if((ab|0)==1){ac=0.0}else{ad=8204;break L11194}$=+P(+ac);if($>+h[11]){ad=8206;break}if((ab|0)==1){ae=+(c[E>>2]|0)}else if((ab|0)==2){ae=+h[b>>3]}else if((ab|0)==3){ae=+uz(c[T>>2]|0,0)}else{ad=8211;break L11194}ab=f+(Y<<6)|0;c[ab>>2]=0;L11220:do{if(!F){if(!(ae>-8.988465674311579e+307&ae<8.988465674311579e+307)){c[ab>>2]=2;break}do{if((a[G]&1)==0){h[f+(Y<<6)+24>>3]=ae}else{if(ae<0.0){c[ab>>2]=2;break L11220}if(ae==0.0){h[f+(Y<<6)+24>>3]=-8.988465674311579e+307;c[ab>>2]=1;break L11220}else{$=+_(+ae);h[f+(Y<<6)+24>>3]=$/+h[S>>3];break}}}while(0);if(H){break}if(ae<+h[I>>3]){h[I>>3]=ae}do{if(ae<+h[J>>3]){if((c[K>>2]&1|0)==0){c[ab>>2]=1;break L11220}if((c[L>>2]&1|0)==0){h[J>>3]=ae;break}$=+h[M>>3];if($>ae){h[J>>3]=$;c[ab>>2]=1;break L11220}else{h[J>>3]=ae;break}}}while(0);if(ae>+h[N>>3]){h[N>>3]=ae}if(ae<=+h[O>>3]){break}if((c[K>>2]&2|0)==0){c[ab>>2]=1;break}if((c[Q>>2]&2|0)==0){h[O>>3]=ae;break}$=+h[R>>3];if($<ae){h[O>>3]=$;c[ab>>2]=1;break}else{h[O>>3]=ae;break}}}while(0);if(!s){break}af=c[ab>>2]|0;if(!(ae>-8.988465674311579e+307&ae<8.988465674311579e+307)){break}do{if((a[66852]&1)==0){h[f+(Y<<6)+32>>3]=ae}else{if(ae<0.0){break L11209}if(ae==0.0){h[f+(Y<<6)+32>>3]=-8.988465674311579e+307;break L11209}else{$=+_(+ae);h[f+(Y<<6)+32>>3]=$/+h[8358];break}}}while(0);if((af|0)!=0){break}if(ae<+h[8347]){h[8347]=ae}do{if(ae<+h[8341]){if((c[16678]&1|0)==0){break L11209}if((c[16698]&1|0)==0){h[8341]=ae;break}$=+h[8350];if($>ae){h[8341]=$;break L11209}else{h[8341]=ae;break}}}while(0);if(ae>+h[8348]){h[8348]=ae}if(ae<=+h[8342]){break}if((c[16678]&2|0)==0){break}if((c[16699]&2|0)==0){h[8342]=ae;break}$=+h[8353];if($<ae){h[8342]=$;break}else{h[8342]=ae;break}}else{ad=8206}}while(0);if((ad|0)==8206){ad=0;c[f+(Y<<6)>>2]=2}Y=Y+1|0;}while((Y|0)<(o|0))}c[(c[e>>2]|0)+8>>2]=o;Y=c[c[e>>2]>>2]|0;c[e>>2]=Y;if((Y|0)==0){ag=0}else{ag=c[Y+12>>2]|0}Y=V+1|0;if((Y|0)<(k|0)){f=ag;V=Y}else{ad=8276;break}}if((ad|0)==8211){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ad|0)==8204){uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ad|0)==8203){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ad|0)==8276){i=q;return}}function i2(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a+8>>3];d=+h[b+8>>3];if(c>d){e=1;return e|0}e=(c<d)<<31>>31;return e|0}function i3(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0;b=i;i=i+32|0;d=b|0;e=b+16|0;if((a[30641]|0)!=100){i=b;return}f=c[12904]|0;g=c[6952]|0;do{if((f|0)>0&(g|0)!=0){j=g+(f*152&-1)|0;if((f|0)!=0){k=64664+((c[200]|0)*688&-1)|0;l=64664+((c[144]|0)*688&-1)|0;m=g;do{n=+h[k>>3];o=+h[91];p=+h[96];q=+h[l>>3];r=+h[21];s=+h[68];t=+h[5279];u=+h[2];v=+h[12];w=+h[405];x=+h[393];y=+h[397];z=+h[401];A=+h[406];B=+h[394];C=+h[398];D=+h[402];E=(+h[m+16>>3]-n)*o+p+-1.0;F=(+h[m+24>>3]-q)*r+s+-1.0;G=(+h[m+32>>3]-t)*u+v+-1.0;H=A+E*B+F*C+G*D;I=(w+E*x+F*y+G*z)/(H==0.0?1.0e-5:H);H=(+h[m+48>>3]-n)*o+p+-1.0;G=(+h[m+56>>3]-q)*r+s+-1.0;F=(+h[m+64>>3]-t)*u+v+-1.0;E=A+H*B+G*C+F*D;J=(w+H*x+G*y+F*z)/(E==0.0?1.0e-5:E);E=J>I?J:I;I=(+h[m+80>>3]-n)*o+p+-1.0;J=(+h[m+88>>3]-q)*r+s+-1.0;F=(+h[m+96>>3]-t)*u+v+-1.0;G=A+I*B+J*C+F*D;H=(w+I*x+J*y+F*z)/(G==0.0?1.0e-5:G);G=H>E?H:E;E=(+h[m+112>>3]-n)*o+p+-1.0;p=(+h[m+120>>3]-q)*r+s+-1.0;s=(+h[m+128>>3]-t)*u+v+-1.0;v=A+E*B+p*C+s*D;D=(w+E*x+p*y+s*z)/(v==0.0?1.0e-5:v);h[m+8>>3]=D>G?D:G;m=m+152|0;}while((m|0)!=(j|0))}bM(g|0,f|0,152,16);j=c[6952]|0;m=c[12904]|0;l=j+(m*152&-1)|0;if((m|0)!=0){m=d|0;k=d+8|0;K=d+4|0;L=e|0;M=e+4|0;N=e+8|0;O=j;do{G=+h[O>>3];do{if((a[54008]&1)==0){j=(c[3524]|0)+144|0;if((c[j>>2]|0)==0){break}c[m>>2]=5;h[k>>3]=G;c[K>>2]=0;cM[c[j>>2]&511](d)}else{j=(c[3524]|0)+144|0;if((c[j>>2]|0)==0){break}c[L>>2]=3;c[M>>2]=~~G;h[N>>3]=0.0;cM[c[j>>2]&511](e)}}while(0);if((c[7661]|0)<0){j=c[O+144>>2]|0;c[7654]=c[j>>2];c[30620>>2]=c[j+4>>2];c[30624>>2]=c[j+8>>2];c[30628>>2]=c[j+12>>2]}dy(O+16|0);O=O+152|0;}while((O|0)!=(l|0))}if((a[30641]|0)==100){P=c[6952]|0;break}else{i=b;return}}else{P=g}}while(0);if((P|0)!=0){uu(P)}c[6952]=0;c[18084]=0;c[12904]=0;i=b;return}function i4(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0,U=0,V=0,W=0,X=0;g=i;j=d<<2;k=ut(j)|0;do{if((k|0)==0){gk();l=ut(j)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224016,v)|0)}else{m=k}}while(0);k=m;c[e>>2]=k;L11355:do{if((a[30641]|0)!=97|(b|0)==0){n=0}else{o=0.0;p=0.0;e=b;m=d;L11356:while(1){j=(c[e+8>>2]|0)-1|0;do{if((j|0)<1){q=m;r=p;s=o}else{l=e+12|0;t=0;while(1){if((t|0)>(j|0)){u=o;break}w=c[l>>2]|0;if((c[w+(t<<6)>>2]|0)==2){t=t+1|0}else{x=8314;break}}if((x|0)==8314){x=0;y=(+h[w+(t<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;z=(+h[w+(t<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;A=(0.0- +h[5279])*+h[2]+ +h[12]+-1.0;B=+h[406]+y*+h[394]+z*+h[398]+A*+h[402];u=(+h[405]+y*+h[393]+z*+h[397]+A*+h[401])/(B==0.0?1.0e-5:B)}C=j;while(1){if((C|0)<=(t|0)){D=p;break}E=c[l>>2]|0;if((c[E+(C<<6)>>2]|0)==2){C=C-1|0}else{x=8318;break}}if((x|0)==8318){x=0;B=(+h[E+(C<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;A=(+h[E+(C<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;z=(0.0- +h[5279])*+h[2]+ +h[12]+-1.0;y=+h[406]+B*+h[394]+A*+h[398]+z*+h[402];D=(+h[405]+B*+h[393]+A*+h[397]+z*+h[401])/(y==0.0?1.0e-5:y)}if(+(C-t|0)<=+(j|0)*.1){q=m;r=D;s=u;break}c[f>>2]=D<=u&1;if((m|0)<3){q=m;r=D;s=u;break}F=64664+((c[200]|0)*688&-1)|0;G=+h[91];H=+h[96];I=64664+((c[144]|0)*688&-1)|0;J=+h[21];K=+h[68];y=(0.0- +h[5279])*+h[2]+ +h[12]+-1.0;L=+h[405];M=+h[393];N=+h[397];O=y*+h[401];P=+h[406];Q=+h[394];R=+h[398];S=y*+h[402];l=m;while(1){T=l-2|0;U=e;while(1){V=c[U>>2]|0;if((V|0)!=0&(T|0)!=0){T=T-1|0;U=V}else{break}}L11379:do{if((V|0)!=0){U=c[V+8>>2]|0;if((U|0)==0){break}T=V+12|0;W=t;while(1){if((W|0)>=(U|0)){break L11379}X=c[T>>2]|0;if((c[X+(W<<6)>>2]|0)==2){W=W+1|0}else{break L11356}}}}while(0);T=l-1|0;if((T|0)<3){q=T;r=D;s=u;break}else{l=T}}}}while(0);j=c[e>>2]|0;if((j|0)==0){n=0;break L11355}else{o=s;p=r;e=j;m=q-1|0}}p=(+h[X+(W<<6)+8>>3]- +h[F>>3])*G+H+-1.0;o=(+h[X+(W<<6)+16>>3]- +h[I>>3])*J+K+-1.0;y=P+p*Q+o*R+S;n=(L+p*M+o*N+O)/(y==0.0?1.0e-5:y)<=u&1}}while(0);if((d|0)<=0){i=g;return}I=(n|0)==1;n=0;W=b;b=d;while(1){d=b-1|0;X=a[30641]|0;do{if((X<<24>>24|0)==97){if(I){c[k+(d<<2)>>2]=W;break}else{c[k+(n<<2)>>2]=W;break}}else if((X<<24>>24|0)==102){c[k+(d<<2)>>2]=W}else{c[k+(n<<2)>>2]=W}}while(0);if((d|0)<=0){break}n=n+1|0;W=c[W>>2]|0;b=d}i=g;return}function i5(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0,aT=0,aU=0.0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0.0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0.0,bn=0,bo=0,bp=0,bq=0.0,br=0.0,bs=0.0,bt=0.0,bu=0.0,bv=0.0,bw=0.0,bx=0.0,by=0.0,bz=0.0,bA=0.0,bB=0.0,bC=0.0,bD=0.0,bE=0.0,bF=0.0,bG=0.0,bH=0.0,bI=0.0,bJ=0.0,bK=0.0,bL=0.0,bM=0,bN=0.0,bO=0,bP=0.0,bQ=0.0,bR=0,bS=0,bT=0,bU=0.0,bV=0.0,bW=0.0,bX=0.0,bY=0.0,bZ=0.0,b_=0.0,b$=0.0,b0=0.0,b1=0.0,b2=0.0,b3=0.0,b4=0.0,b5=0,b6=0,b7=0,b8=0,b9=0.0,ca=0.0,cb=0.0,cc=0.0,cd=0.0,ce=0.0,cf=0.0,cg=0.0,ch=0.0,ci=0.0,cj=0.0,ck=0.0,cl=0.0,cm=0.0,cn=0.0,co=0.0,cp=0.0,cq=0.0,cr=0.0,cs=0.0,ct=0.0,cu=0.0,cv=0.0,cw=0.0,cx=0.0,cy=0.0,cz=0.0,cA=0,cB=0.0,cC=0,cD=0;d=i;i=i+224|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=d+80|0;m=d+88|0;n=d+96|0;o=b+264|0;p=(a[o]|0)==0?30632:o;o=a[p]|0;if(o<<24>>24==0){i=d;return}if((a[30641]|0)==100){q=o;r=8348}else{cM[c[(c[3524]|0)+168>>2]&511](12);o=a[p]|0;if(o<<24>>24!=0){q=o;r=8348}}L11410:do{if((r|0)==8348){o=n;s=b+239|0;t=b+64|0;u=t|0;w=b+72|0;x=b+24|0;y=k;z=k|0;A=k+4|0;B=b+260|0;C=b+252|0;D=g|0;E=g+8|0;F=g+4|0;G=j|0;H=j+4|0;I=j+8|0;J=n|0;K=n|0;L=n+8|0;M=n+32|0;N=n+40|0;R=n+64|0;S=n+72|0;T=n+96|0;U=n+104|0;V=n+16|0;W=n+48|0;X=n+80|0;Y=n+112|0;$=n+24|0;ab=n+56|0;ac=n+88|0;ad=n+120|0;ae=e|0;af=e+8|0;ag=e+4|0;ah=f|0;ai=f+4|0;aj=f+8|0;ak=0;al=q;L11412:while(1){am=al<<24>>24;c[l>>2]=0;an=a[s]|0;if((c[u>>2]|0)==3){ao=+h[w>>3]==-1.0&1}else{ao=0}a[54008]=ao;c[7644]=c[x>>2];c[7645]=c[x+4>>2];c[7646]=c[x+8>>2];c[7647]=c[x+12>>2];c[7648]=c[x+16>>2];c[7649]=c[x+20>>2];c[7650]=c[x+24>>2];c[7651]=c[x+28>>2];c[7652]=c[x+32>>2];c[7653]=c[x+36>>2];c[7654]=c[x+40>>2];c[7655]=c[x+44>>2];c[7656]=c[x+48>>2];c[7657]=c[x+52>>2];ap=c[7661]|0;if((ap|0)>0){lK(30576,ap)}c[y>>2]=c[7654];c[y+4>>2]=c[30620>>2];c[y+8>>2]=c[30624>>2];c[y+12>>2]=c[30628>>2];ap=c[7645]|0;do{if((c[7644]|0)!=0){aq=+h[3825];ar=c[(c[3524]|0)+92>>2]|0;if(aq<0.0){cK[ar&63](+h[3817]);break}else{cK[ar&63](aq);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[3824]);ar=c[(c[3524]|0)+64>>2]|0;if((ap|0)<-5){cM[ar&511](-2)}else{cM[ar&511](ap)}ar=c[3524]|0;do{if((a[30608]&1)==0){if((c[ar+96>>2]&1024|0)!=0){break}c[z>>2]=1;c[A>>2]=ap;r=8363}else{r=8363}}while(0);if((r|0)==8363){r=0;fn(k,ar)}do{if((am|0)==116|(am|0)==115|(am|0)==98){if((c[(c[3524]|0)+148>>2]|0)==0){break}if((am|0)==98){aq=+h[7076];h[Y>>3]=aq;h[X>>3]=aq;h[W>>3]=aq;h[V>>3]=aq}else if((am|0)==116){aq=+h[6915];h[Y>>3]=aq;h[X>>3]=aq;h[W>>3]=aq;h[V>>3]=aq}i4(c[B>>2]|0,c[C>>2]|0,m,l);ap=c[7664]|0;as=c[7665]|0;at=(ap|0)<1;au=(as|0)<1;do{if(at|au){av=(c[C>>2]|0)-1|0;if((av|0)>0){aw=c[m>>2]|0;ax=0;ay=0;az=0;while(1){aA=c[aw+(az<<2)>>2]|0;aB=c[aA+12>>2]|0;aC=c[aA+8>>2]|0;do{if((aC|0)>0){aA=0;aD=0;do{aA=((c[aB+(aD<<6)>>2]|0)==0&1)+aA|0;aD=aD+1|0;}while((aD|0)<(aC|0));if((aA|0)<=0){aE=ay;aF=ax;break}aE=ay+1|0;aF=(ax|0)>(aA|0)?ax:aA}else{aE=ay;aF=ax}}while(0);aC=az+1|0;if((aC|0)<(av|0)){ax=aF;ay=aE;az=aC}else{aG=aF;aH=aE;break}}}else{aG=0;aH=0}if(at){aI=~~(+O(+(+((((ap|0)==0?200:-ap|0)|0)/(aG|0)&-1|0)))+1.0)}else{aI=ap}if(!au){aJ=as;aK=aI;break}aJ=~~(+O(+(+((((as|0)==0?200:-as|0)|0)/(aH|0)&-1|0)))+1.0);aK=aI}else{aJ=as;aK=ap}}while(0);if((a[30641]|0)==100){if(((c[C>>2]|0)-1|0)>0){ap=c[m>>2]|0;as=(a[30640]|0)==0;au=0;while(1){at=au+1|0;az=c[(c[ap+(au<<2)>>2]|0)+8>>2]|0;ay=c[(c[ap+(at<<2)>>2]|0)+8>>2]|0;do{if(as){aL=ay;r=8387}else{if((az|0)==(ay|0)){aL=az;r=8387;break}aM=(((az|0)>(ay|0)?az:ay)-1|0)+(c[18084]|0)|0}}while(0);if((r|0)==8387){r=0;aM=((c[18084]|0)-1|0)+((az|0)<(aL|0)?az:aL)|0}c[18084]=aM;if((at|0)<((c[C>>2]|0)-1|0)){au=at}else{aN=aM;break}}}else{aN=c[18084]|0}au=aa(aa((aJ|0)>1?aJ:1,(aK|0)>1?aK:1),aN);c[18084]=au;c[6952]=db(c[6952]|0,au*152&-1,98184)|0}au=(aJ|0)>1;as=(aK|0)>1|au;do{if(as){ap=(aK<<2)+4|0;ay=ut(ap)|0;if((ay|0)==0){gk();ax=ut(ap)|0;if((ax|0)==0){r=8394;break L11412}else{aO=ax}}else{aO=ay}ay=aO;if((aK|0)<0){aP=ay;break}ax=(aJ<<5)+32|0;ap=0;while(1){av=ut(ax)|0;if((av|0)==0){gk();aw=ut(ax)|0;if((aw|0)==0){r=8399;break L11412}else{aQ=aw}}else{aQ=av}c[ay+(ap<<2)>>2]=aQ;av=ap+1|0;if((av|0)>(aK|0)){aP=ay;break}else{ap=av}}}else{aP=0}}while(0);ap=c[C>>2]|0;if((ap-1|0)>0){ay=c[m>>2]|0;ax=(aK|0)<2&(aJ|0)<2;at=an&1;az=at<<24>>24==0;av=as|al<<24>>24==115;aw=(aK|0)<0;aC=(aK|0)>0;aB=(aJ|0)>0;aq=+(aK|0);aD=at<<24>>24!=0;aR=+(aJ|0);at=(c[l>>2]|0)==0;aS=-999;aT=-999;aU=0.0;aV=0;aW=ap;while(1){ap=c[ay+(aV<<2)>>2]|0;aX=aV+1|0;aY=c[ay+(aX<<2)>>2]|0;aZ=c[ap+12>>2]|0;a_=c[aY+12>>2]|0;a$=a[30639]|0;if((a$<<24>>24|0)==114){a0=c[ap+8>>2]|0;a1=c[aY+8>>2]|0;a2=a0-a1|0;a3=(a2|0)>-1?a2:-a2|0;a4=a0;a5=a1}else if((a$<<24>>24|0)==99){a$=c[ap+8>>2]|0;a1=c[aY+8>>2]|0;a0=a$-a1|0;a3=(((a0|0)>-1?a0:-a0|0)|0)/2&-1;a4=a$;a5=a1}else{a3=0;a4=c[ap+8>>2]|0;a5=c[aY+8>>2]|0}a1=ap+8|0;ap=aY+8|0;aY=(a4|0)<(a5|0)?a4:a5;a$=aY-2|0;if((a[30640]|0)!=0&(a4|0)!=(a5|0)){a6=(a4|0)>(a5|0)?a4:a5;a7=a$+a3|0;a9=a3;ba=1}else{a6=aY;a7=aT;a9=aS;ba=0}aY=a6-1|0;if((aY|0)>0){a0=(1-a3|0)+a7|0;a2=ba?a3:0;bb=aU;bc=0;while(1){do{if(ba){if(!((bc|0)<(a9|0)|(bc|0)>(a7|0))){r=8416;break}bd=(bc|0)>(a9|0)?a0:0;be=bd;bf=bd;bg=bc}else{r=8416}}while(0);if((r|0)==8416){r=0;bd=bc-a2|0;if((a[30641]|0)==97){bh=at?bd:a$-bd|0}else{bh=bd}be=bh;bf=bh+1|0;bg=bh+a3|0}bd=bg+1|0;bi=(c[a1>>2]|0)>(c[ap>>2]|0);bj=bi?bf:bd;bk=bi?be:bg;bl=bi?bd:bf;bd=bi?bg:be;bi=c[aZ+(bd<<6)>>2]|0;do{if((a[30642]|0)==52){if((bi|0)!=0){bm=bb;break}if((c[aZ+(bl<<6)>>2]|0)!=0){bm=bb;break}if((c[a_+(bk<<6)>>2]|0)!=0){bm=bb;break}if((c[a_+(bj<<6)>>2]|0)==0){r=8429}else{bm=bb}}else{if((bi|0)==2){bm=bb;break}bn=c[aZ+(bl<<6)>>2]|0;if((bn|0)==2){bm=bb;break}bo=c[a_+(bk<<6)>>2]|0;if((bo|0)==2){bm=bb;break}bp=c[a_+(bj<<6)>>2]|0;if((bp|0)==2){bm=bb;break}if((bi|0)==1&(bn|0)==1&(bo|0)==1&(bp|0)==1){bm=bb}else{r=8429}}}while(0);do{if((r|0)==8429){r=0;bi=(a[30641]|0)==100;do{if(ax|bi){do{if(az){bq=+h[aZ+(bd<<6)+24>>3];bp=c[34]|0;bo=(a[64788+(bp*688&-1)|0]&1)==0;bn=(a[66852]&1)==0;L11530:do{if(bo){do{if(bn){br=bq}else{if(bq>0.0){bs=+_(+bq);br=bs/+h[8358];break}else{bt=+h[8341];r=8443;break L11530}}}while(0);bu=br;bv=+h[aZ+(bl<<6)+24>>3];r=8444}else{if(bn){bt=+Z(+(bq*+h[64800+(bp*688&-1)>>3]));r=8443;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bw=bq}else{bw=bq*+h[64800+(bp*688&-1)>>3]/+h[8358]}bx=bw;by=+h[aZ+(bl<<6)+24>>3];r=8445}}while(0);if((r|0)==8443){r=0;bq=+h[aZ+(bl<<6)+24>>3];if(bo){bu=bt;bv=bq;r=8444}else{bx=bt;by=bq;r=8445}}do{if((r|0)==8444){r=0;if(bn){bz=bv;bA=bu;break}if(bv>0.0){bq=+_(+bv);bz=bq/+h[8358];bA=bu;break}else{bz=+h[8341];bA=bu;break}}else if((r|0)==8445){r=0;if(bn){bz=+Z(+(by*+h[64800+(bp*688&-1)>>3]));bA=bx;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bz=by;bA=bx;break}bz=by*+h[64800+(bp*688&-1)>>3]/+h[8358];bA=bx}}while(0);bq=+h[a_+(bk<<6)+24>>3];L11559:do{if(bo){do{if(bn){bB=bq}else{if(bq>0.0){bs=+_(+bq);bB=bs/+h[8358];break}else{bC=+h[8341];r=8463;break L11559}}}while(0);bD=bB;bE=+h[a_+(bj<<6)+24>>3];r=8464}else{if(bn){bC=+Z(+(bq*+h[64800+(bp*688&-1)>>3]));r=8463;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bF=bq}else{bF=bq*+h[64800+(bp*688&-1)>>3]/+h[8358]}bG=bF;bH=+h[a_+(bj<<6)+24>>3];r=8465}}while(0);if((r|0)==8463){r=0;bq=+h[a_+(bj<<6)+24>>3];if(bo){bD=bC;bE=bq;r=8464}else{bG=bC;bH=bq;r=8465}}if((r|0)==8464){r=0;if(bn){bI=bE;bJ=bD;bK=bz;bL=bA;break}if(bE>0.0){bq=+_(+bE);bI=bq/+h[8358];bJ=bD;bK=bz;bL=bA;break}else{bI=+h[8341];bJ=bD;bK=bz;bL=bA;break}}else if((r|0)==8465){r=0;if(bn){bI=+Z(+(bH*+h[64800+(bp*688&-1)>>3]));bJ=bG;bK=bz;bL=bA;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bI=bH;bJ=bG;bK=bz;bL=bA;break}bI=bH*+h[64800+(bp*688&-1)>>3]/+h[8358];bJ=bG;bK=bz;bL=bA;break}}else{bI=+h[a_+(bj<<6)+32>>3];bJ=+h[a_+(bk<<6)+32>>3];bK=+h[aZ+(bl<<6)+32>>3];bL=+h[aZ+(bd<<6)+32>>3]}}while(0);bM=c[7663]|0;do{if((bM|0)==5){bq=bL*bK*bJ*bI;if(bq==0.0){bN=0.0;break}bs=+Q(+(+Q(+(+P(+bq)))));if(((((bK<0.0&1)+(bL<0.0&1)|0)+(bJ<0.0&1)|0)+(bI<0.0&1)|0)<3){bN=bs;break}bN=-0.0-bs}else if((bM|0)==6){bO=bL>bK;bs=bO?bK:bL;bq=bO?bL:bK;bO=bJ>bI;bP=bO?bI:bJ;bQ=bO?bJ:bI;bN=((bs<bP?bP:bs)+(bq<bQ?bq:bQ))*.5}else if((bM|0)==7){bQ=bL<bK?bL:bK;bq=bJ<bI?bJ:bI;bN=bQ<bq?bQ:bq}else if((bM|0)==8){bq=bL>bK?bL:bK;bQ=bJ>bI?bJ:bI;bN=bq>bQ?bq:bQ}else if((bM|0)==1){bN=bK}else if((bM|0)==2){bN=bJ}else if((bM|0)==3){bN=bI}else if((bM|0)==0){bN=bL}else{if((a[54008]&1)==0){bN=(bL+bK+bJ+bI)*.25;break}else{bO=~~bL;bR=~~bK;bS=~~bJ;bT=~~bI;bN=+(((((bR&16711680)+(bO&16711680)|0)+(bS&16711680)|0)+(bT&16711680)|0)>>>2&16711680|((((bR&65280)+(bO&65280)|0)+(bS&65280)|0)+(bT&65280)|0)>>>2&65280|((((bR&255)+(bO&255)|0)+(bS&255)|0)+(bT&255)|0)>>>2&255|0);break}}}while(0);bM=(a[54008]&1)==0;do{if(bM){bQ=+h[8341];if(bQ>=bN){bU=+((a[20668]|0)!=112&1|0);break}bq=+h[8342];if(bq<=bN){bU=+((a[20668]|0)==112&1|0);break}bs=(bN-bQ)/(bq-bQ);if((a[20668]|0)==112){bU=bs;break}bU=1.0-bs}else{bU=bN}}while(0);if(bi){bV=bU;break}if(bM){bT=(c[3524]|0)+144|0;if((c[bT>>2]|0)==0){bV=bU;break}c[D>>2]=5;h[E>>3]=bU;c[F>>2]=0;cM[c[bT>>2]&511](g);bV=bU;break}else{bT=(c[3524]|0)+144|0;if((c[bT>>2]|0)==0){bV=bU;break}c[G>>2]=3;c[H>>2]=~~bU;h[I>>3]=0.0;cM[c[bT>>2]&511](j);bV=bU;break}}else{bV=bb}}while(0);bs=+h[aZ+(bd<<6)+8>>3];h[K>>3]=bs;bQ=+h[aZ+(bd<<6)+16>>3];h[L>>3]=bQ;bq=+h[a_+(bk<<6)+8>>3];h[M>>3]=bq;bP=+h[a_+(bk<<6)+16>>3];h[N>>3]=bP;bW=+h[a_+(bj<<6)+8>>3];h[R>>3]=bW;bX=+h[a_+(bj<<6)+16>>3];h[S>>3]=bX;bY=+h[aZ+(bl<<6)+8>>3];h[T>>3]=bY;bZ=+h[aZ+(bl<<6)+16>>3];h[U>>3]=bZ;do{if(av){h[V>>3]=+h[aZ+(bd<<6)+24>>3];h[W>>3]=+h[a_+(bk<<6)+24>>3];h[X>>3]=+h[a_+(bj<<6)+24>>3];h[Y>>3]=+h[aZ+(bl<<6)+24>>3];if(az){break}h[$>>3]=+h[aZ+(bd<<6)+32>>3];h[ab>>3]=+h[a_+(bk<<6)+32>>3];h[ac>>3]=+h[a_+(bj<<6)+32>>3];h[ad>>3]=+h[aZ+(bl<<6)+32>>3]}}while(0);if(!as){if((a[30641]|0)==100){bi=c[6952]|0;aA=c[12904]|0;uD(bi+(aA*152&-1)+16|0,o|0,128);h[bi+(aA*152&-1)>>3]=bV;c[bi+(aA*152&-1)+144>>2]=t;c[12904]=(c[12904]|0)+1;bm=bV;break}else{dy(J);bm=bV;break}}if(!aw){b_=+h[Y>>3];b$=+h[V>>3];b0=+h[X>>3];b1=+h[W>>3];aA=0;do{b2=+(aA|0);bi=aP+(aA<<2)|0;h[c[bi>>2]>>3]=bs+b2*((bY-bs)/aq);h[(c[bi>>2]|0)+(aJ<<5)>>3]=bq+b2*((bW-bq)/aq);h[(c[bi>>2]|0)+8>>3]=bQ+b2*((bZ-bQ)/aq);h[(c[bi>>2]|0)+(aJ<<5)+8>>3]=bP+b2*((bX-bP)/aq);h[(c[bi>>2]|0)+16>>3]=b$+b2*((b_-b$)/aq);h[(c[bi>>2]|0)+(aJ<<5)+16>>3]=b1+b2*((b0-b1)/aq);if(aD){b3=+h[$>>3];h[(c[bi>>2]|0)+24>>3]=b3+b2*((+h[ad>>3]-b3)/aq);b3=+h[ab>>3];h[(c[bi>>2]|0)+(aJ<<5)+24>>3]=b3+b2*((+h[ac>>3]-b3)/aq)}if(au){bT=1;do{bS=c[bi>>2]|0;b3=+h[bS>>3];b2=+(bT|0);h[bS+(bT<<5)>>3]=b3+b2*((+h[bS+(aJ<<5)>>3]-b3)/aR);bS=c[bi>>2]|0;b3=+h[bS+8>>3];h[bS+(bT<<5)+8>>3]=b3+b2*((+h[bS+(aJ<<5)+8>>3]-b3)/aR);bS=c[bi>>2]|0;b3=+h[bS+16>>3];h[bS+(bT<<5)+16>>3]=b3+b2*((+h[bS+(aJ<<5)+16>>3]-b3)/aR);if(aD){bS=c[bi>>2]|0;b3=+h[bS+24>>3];h[bS+(bT<<5)+24>>3]=b3+b2*((+h[bS+(aJ<<5)+24>>3]-b3)/aR)}bT=bT+1|0;}while((bT|0)<(aJ|0))}aA=aA+1|0;}while((aA|0)<=(aK|0))}if(aC){b4=bV;b5=0}else{bm=bV;break}while(1){if(aB){aA=aP+(b5<<2)|0;bT=b5+1|0;bi=aP+(bT<<2)|0;bM=0;while(1){bS=c[aA>>2]|0;h[K>>3]=+h[bS+(bM<<5)>>3];h[L>>3]=+h[bS+(bM<<5)+8>>3];b1=+h[bS+(bM<<5)+16>>3];h[V>>3]=b1;bO=c[bi>>2]|0;h[M>>3]=+h[bO+(bM<<5)>>3];h[N>>3]=+h[bO+(bM<<5)+8>>3];b0=+h[bO+(bM<<5)+16>>3];h[W>>3]=b0;bR=bM+1|0;h[R>>3]=+h[bO+(bR<<5)>>3];h[S>>3]=+h[bO+(bR<<5)+8>>3];b$=+h[bO+(bR<<5)+16>>3];h[X>>3]=b$;h[T>>3]=+h[bS+(bR<<5)>>3];h[U>>3]=+h[bS+(bR<<5)+8>>3];b_=+h[bS+(bR<<5)+16>>3];h[Y>>3]=b_;L11652:do{if(az){b6=c[34]|0;b7=(a[64788+(b6*688&-1)|0]&1)==0;b8=(a[66852]&1)==0;do{if(b7){if(b8){b9=b_;ca=b$;cb=b0;cc=b1;break L11652}if(b1>0.0){bP=+_(+b1);cd=bP/+h[8358];r=8531;break}else{ce=+h[8341];r=8526;break}}else{if(b8){ce=+Z(+(b1*+h[64800+(b6*688&-1)>>3]));r=8526;break}bP=+h[64792+(b6*688&-1)>>3];bX=+h[8357];if(bP==bX){cf=b1;cg=bP;ch=bX;r=8534;break}cf=b1*+h[64800+(b6*688&-1)>>3]/+h[8358];cg=bP;ch=bX;r=8534}}while(0);do{if((r|0)==8526){r=0;if(b7){if(b8){b9=b_;ca=b$;cb=b0;cc=ce;break L11652}else{cd=ce;r=8531;break}}if(b8){ci=+Z(+(b0*+h[64800+(b6*688&-1)>>3]));cj=ce;r=8539;break}else{cf=ce;cg=+h[64792+(b6*688&-1)>>3];ch=+h[8357];r=8534;break}}}while(0);do{if((r|0)==8531){r=0;if(b0>0.0){bX=+_(+b0);ck=bX/+h[8358];cl=cd;r=8536;break}else{ck=+h[8341];cl=cd;r=8536;break}}else if((r|0)==8534){r=0;if(cg==ch){ck=b0;cl=cf;r=8536;break}ck=b0*+h[64800+(b6*688&-1)>>3]/+h[8358];cl=cf;r=8536}}while(0);do{if((r|0)==8536){r=0;if(!b7){if(b8){ci=ck;cj=cl;r=8539;break}bX=+h[64792+(b6*688&-1)>>3];bP=+h[8357];if(bX==bP){cm=b$;cn=cl;co=ck;cp=bX;cq=bP;r=8553;break}cm=b$*+h[64800+(b6*688&-1)>>3]/+h[8358];cn=cl;co=ck;cp=bX;cq=bP;r=8553;break}if(b8){b9=b_;ca=b$;cb=ck;cc=cl;break L11652}if(b$>0.0){bP=+_(+b$);cr=ck;cs=cl;ct=bP/+h[8358];break}else{cu=+h[8341];cv=cl;cw=ck;r=8545;break}}}while(0);if((r|0)==8539){r=0;cu=+Z(+(b$*+h[64800+(b6*688&-1)>>3]));cv=cj;cw=ci;r=8545}do{if((r|0)==8545){r=0;if(b7){if(b8){b9=b_;ca=cu;cb=cw;cc=cv;break L11652}else{cr=cw;cs=cv;ct=cu;break}}if(b8){b9=+Z(+(b_*+h[64800+(b6*688&-1)>>3]));ca=cu;cb=cw;cc=cv;break L11652}else{cm=cu;cn=cv;co=cw;cp=+h[64792+(b6*688&-1)>>3];cq=+h[8357];r=8553;break}}}while(0);if((r|0)==8553){r=0;if(cp==cq){b9=b_;ca=cm;cb=co;cc=cn;break}b9=b_*+h[64800+(b6*688&-1)>>3]/+h[8358];ca=cm;cb=co;cc=cn;break}if(b_>0.0){bP=+_(+b_);b9=bP/+h[8358];ca=ct;cb=cr;cc=cs;break}else{b9=+h[8341];ca=ct;cb=cr;cc=cs;break}}else{bP=+h[bS+(bM<<5)+24>>3];h[$>>3]=bP;bX=+h[bO+(bM<<5)+24>>3];h[ab>>3]=bX;bQ=+h[bO+(bR<<5)+24>>3];h[ac>>3]=bQ;bZ=+h[bS+(bR<<5)+24>>3];h[ad>>3]=bZ;b9=bZ;ca=bQ;cb=bX;cc=bP}}while(0);bS=c[7663]|0;do{if((bS|0)==4){cx=(cc+cb+ca+b9)*.25}else if((bS|0)==5){b_=cc*cb*ca*b9;if(b_==0.0){cx=0.0;break}b$=+Q(+(+Q(+(+P(+b_)))));if(((((cb<0.0&1)+(cc<0.0&1)|0)+(ca<0.0&1)|0)+(b9<0.0&1)|0)<3){cx=b$;break}cx=-0.0-b$}else if((bS|0)==6){bO=cc>cb;b$=bO?cb:cc;b_=bO?cc:cb;bO=ca>b9;b0=bO?b9:ca;b1=bO?ca:b9;cx=((b$<b0?b0:b$)+(b_<b1?b_:b1))*.5}else if((bS|0)==7){b1=cc<cb?cc:cb;b_=ca<b9?ca:b9;cx=b1<b_?b1:b_}else if((bS|0)==8){b_=cc>cb?cc:cb;b1=ca>b9?ca:b9;cx=b_>b1?b_:b1}else if((bS|0)==1){cx=cb}else if((bS|0)==2){cx=ca}else if((bS|0)==3){cx=b9}else if((bS|0)==0){cx=cc}else{r=8566;break L11412}}while(0);bS=(a[54008]&1)==0;do{if(bS){b1=+h[8341];if(b1>=cx){cy=+((a[20668]|0)!=112&1|0);break}b_=+h[8342];if(b_<=cx){cy=+((a[20668]|0)==112&1|0);break}b$=(cx-b1)/(b_-b1);if((a[20668]|0)==112){cy=b$;break}cy=1.0-b$}else{cy=cx}}while(0);if((a[30641]|0)==100){bO=c[6952]|0;bp=c[12904]|0;uD(bO+(bp*152&-1)+16|0,o|0,128);h[bO+(bp*152&-1)>>3]=cy;c[bO+(bp*152&-1)+144>>2]=t;c[12904]=(c[12904]|0)+1}else{do{if(bS){bp=(c[3524]|0)+144|0;if((c[bp>>2]|0)==0){break}c[ae>>2]=5;h[af>>3]=cy;c[ag>>2]=0;cM[c[bp>>2]&511](e)}else{bp=(c[3524]|0)+144|0;if((c[bp>>2]|0)==0){break}c[ah>>2]=3;c[ai>>2]=~~cy;h[aj>>3]=0.0;cM[c[bp>>2]&511](f)}}while(0);dy(J)}if((bR|0)<(aJ|0)){bM=bR}else{cz=cy;cA=bT;break}}}else{cz=b4;cA=b5+1|0}if((cA|0)<(aK|0)){b4=cz;b5=cA}else{bm=cz;break}}}}while(0);bl=bc+1|0;if((bl|0)<(aY|0)){bb=bm;bc=bl}else{break}}cB=bm;cC=c[C>>2]|0}else{cB=aU;cC=aW}if((aX|0)<(cC-1|0)){aS=a9;aT=a7;aU=cB;aV=aX;aW=cC}else{break}}}if((aP|0)!=0){if((aK|0)>=0){aW=0;do{uu(c[aP+(aW<<2)>>2]|0);aW=aW+1|0;}while((aW|0)<=(aK|0))}uu(aP)}uu(c[m>>2]|0)}}while(0);ak=ak+1|0;al=a[p+ak|0]|0;if(al<<24>>24==0){break L11410}}if((r|0)==8394){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=92248,v)|0)}else if((r|0)==8399){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84424,v)|0)}else if((r|0)==8566){uf(-1,76496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((a8(p|0,67)|0)!=0){r=c[11690]|0;if((r&2|0)==0){cD=r}else{i7(b,2);cD=c[11690]|0}if((cD&1|0)==0){break}i7(b,1)}}while(0);if((a[30641]|0)==100){i=d;return}cM[c[(c[3524]|0)+168>>2]&511](13);i=d;return}function i6(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=c[10828]|0;f=c[10814]|0;g=c[10822]|0;a[31104]=1;if((c[7662]|0)==1){return}L11775:do{if((d|0)==1){if((f|0)==0){h=0;break}else{i=f}while(1){if((c[i+12>>2]|0)==400){j=8642;break}if((a[i+56|0]&1)!=0){if((c[i+64>>2]|0)>3){j=8637;break}}k=c[i+224>>2]|0;if((k|0)!=0){if(((c[k+72>>2]|0)-4|0)>>>0<3){j=8640;break}}k=c[i>>2]|0;if((k|0)==0){j=8614;break L11775}else{i=k}}if((j|0)==8637){return}else if((j|0)==8640){return}else if((j|0)==8642){return}}else{j=8614}}while(0);L11790:do{if((j|0)==8614){i=(d|0)==2;if(!i){h=0;break}if((b|0)>0){l=e;m=1}else{h=1;break}while(1){f=c[l+12>>2]|0;if((f|0)==352|(f|0)==400){j=8638;break}if((a[l+56|0]&1)!=0){if(((c[l+64>>2]|0)-1|0)>>>0>=3){j=8644;break}}f=c[l+224>>2]|0;if((f|0)!=0){if((c[f+72>>2]|0)>3){j=8645;break}}if((m|0)<(b|0)){l=c[l>>2]|0;m=m+1|0}else{h=i;break L11790}}if((j|0)==8638){return}else if((j|0)==8644){return}else if((j|0)==8645){return}}}while(0);L11807:do{if((g|0)!=0){j=g;while(1){if(((c[j+72>>2]|0)-4|0)>>>0<3){break}j=c[j>>2]|0;if((j|0)==0){break L11807}}return}}while(0);if(((c[1122]|0)-4|0)>>>0<3){return}if(((c[16632]|0)-4|0)>>>0<3){return}if(((c[16460]|0)-4|0)>>>0<3){return}if(((c[17320]|0)-4|0)>>>0<3){return}if(((c[17148]|0)-4|0)>>>0<3){return}do{if(h){if(((c[16288]|0)-4|0)>>>0>=3){break}return}}while(0);if(((c[16804]|0)-4|0)>>>0<3){return}a[31104]=0;return}function i7(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0;e=i;i=i+16|0;f=e|0;g=(a[b+239|0]&1)==0;if((b|0)==0){i=e;return}j=c[b+256>>2]|0;if((j|0)==0){i=e;return}if((d-1|0)>>>0>1){i=e;return}if((c[(c[3524]|0)+148>>2]|0)==0){i=e;return}b=(d|0)==2;d=f|0;k=f+8|0;l=f+4|0;m=j;do{j=m+44|0;n=m+4|0;o=+h[(c[n>>2]|0)+24>>3];p=m+9|0;bD(135272,(v=i,i=i+24|0,c[v>>2]=c[j>>2],h[v+8>>3]=o,c[v+16>>2]=(p|0)==0?122416:p,v)|0);do{if((a[m+8|0]|0)!=0){bJ(14200);p=c[n>>2]|0;do{if(g){o=+h[p+24>>3];q=c[34]|0;r=(a[66852]&1)==0;do{if((a[64788+(q*688&-1)|0]&1)==0){if(r){s=o;break}if(o>0.0){t=+_(+o);s=t/+h[8358];break}else{s=+h[8341];break}}else{if(r){s=+Z(+(o*+h[64800+(q*688&-1)>>3]));break}if(+h[64792+(q*688&-1)>>3]==+h[8357]){s=o;break}s=o*+h[64800+(q*688&-1)>>3]/+h[8358]}}while(0);o=+h[8341];if(o>=s){u=+((a[20668]|0)!=112&1|0);break}t=+h[8342];if(t<=s){u=+((a[20668]|0)==112&1|0);break}w=(s-o)/(t-o);if((a[20668]|0)==112){u=w;break}u=1.0-w}else{w=+h[p+32>>3];o=+h[8341];if(o>=w){u=+((a[20668]|0)!=112&1|0);break}t=+h[8342];if(t<=w){u=+((a[20668]|0)==112&1|0);break}x=(w-o)/(t-o);if((a[20668]|0)==112){u=x;break}u=1.0-x}}while(0);p=(c[3524]|0)+144|0;if((c[p>>2]|0)==0){break}c[d>>2]=5;h[k>>3]=u;c[l>>2]=0;cM[c[p>>2]&511](f)}}while(0);p=c[j>>2]|0;q=c[n>>2]|0;if(b){dA(p,q)}else{dB(p,q,+h[7076])}m=c[m>>2]|0;}while((m|0)!=0);i=e;return}function i8(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[c[10810]>>2]|0;if((e|0)==0){i=d;return}else{f=e}do{do{if((a[f+8|0]&1)==0){e=c[f+4>>2]|0;if((a_(e|0,167320,6)|0)==0){break}if((a_(e|0,126208,6)|0)==0){break}if((a_(e|0,133568,4)|0)==0){break}cf(b|0,126032,(v=i,i=i+8|0,c[v>>2]=e,v)|0);j5(b,f+16|0,1);aF(10,b|0)}}while(0);f=c[f>>2]|0;}while((f|0)!=0);i=d;return}function i9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[13898]|0;if((d|0)>=(c[8272]|0)){ja();return 0}e=c[1054]|0;f=c[e+(d*40&-1)+36>>2]|0;L11906:do{if((a[e+(d*40&-1)|0]&1)!=0){g=e+(d*40&-1)+32|0;h=c[10036]|0;i=0;while(1){if((i|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+i|0)|0]|0)==(a[i+103664|0]|0)){i=i+1|0}else{break L11906}}if((i|0)!=1){break}ja();return 0}}while(0);if(f>>>0>6){ja();return 0}uD(b|0,(c[10036]|0)+(c[e+(d*40&-1)+32>>2]|0)|0,f);a[b+(c[(c[1054]|0)+((c[13898]|0)*40&-1)+36>>2]|0)|0]=0;f=b;while(1){b=a[f]|0;if((b<<24>>24|0)==0){j=8713;break}else if(!((b<<24>>24|0)==67|(b<<24>>24|0)==98|(b<<24>>24|0)==116|(b<<24>>24|0)==115)){j=8711;break}f=f+1|0}if((j|0)==8713){c[13898]=(c[13898]|0)+1;return 0}else if((j|0)==8711){ja();return 0}return 0}function ja(){uf(c[13898]|0,156480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function jb(b){b=b|0;var d=0,e=0,f=0,j=0.0,k=0,l=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0.0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0,aJ=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0;d=i;e=c[3524]|0;if((e|0)==0){aI(214736,23,1,b|0)}else{f=c[e>>2]|0;cf(b|0,215208,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=13048,v)|0)}f=c[8244]|0;if((f|0)==0){aI(98152,13,1,b|0)}else{cf(b|0,105136,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}f=(a[54160]&1)!=0?179864:213448;e=(a[54152]&1)!=0?179864:213448;j=+h[7077];k=(c[14156]|0)==0?150704:150856;cf(b|0,214064,(v=i,i=i+40|0,c[v>>2]=(a[54144]&1)!=0?179864:213448,c[v+8>>2]=f,c[v+16>>2]=e,h[v+24>>3]=j,c[v+32>>2]=k,v)|0);k=c[11692]|0;if((k|0)==0){aI(212312,13,1,b|0);l=0}else{e=(c[14088]|0)==0?150704:150856;cf(b|0,212872,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=e,v)|0);ji(b,56296,0);aF(10,b|0);l=0}L11936:while(1){do{if((l|0)!=4){e=64813+(l*688&-1)|0;if((a[e]|0)!=0){k=56832+(l*24&-1)|0;f=j3(e)|0;cf(b|0,211776,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=f,v)|0)}if((l|0)==3){break}f=56832+(l*24&-1)|0;k=(c[64808+(l*688&-1)>>2]|0)==1?141856:179864;cf(b|0,211344,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=k,v)|0);k=l+1|0;if((k|0)<7){l=k;continue L11936}else{break L11936}}}while(0);l=l+1|0}j=+h[7030];if(j<0.0){aI(210168,13,1,b|0)}else{l=(a[56232]&1)!=0?106640:106608;cf(b|0,209528,(v=i,i=i+16|0,h[v>>3]=j,c[v+8>>2]=l,v)|0)}aI(207904,15,1,b|0);jf(b,49488);l=c[12292]|0;if((l|0)>0){n=150856}else{n=(l|0)<0?121920:150704}cf(b|0,207056,(v=i,i=i+8|0,c[v>>2]=n,v)|0);if((a[49240]&1)==0){n=(c[12303]|0)+1|0;cf(b|0,121528,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}else{jg(b,49248)}aI(220776,11,1,b|0);jf(b,49176);aI(206464,24,1,b|0);n=c[12738]|0;if((n|0)==0){o=179864}else{o=c[53424+(n<<2)>>2]|0}j=+h[6371];l=c[12739]|0;if((l|0)==(n|0)){p=179864}else{p=c[53424+(l<<2)>>2]|0}q=+h[6372];n=c[12740]|0;if((n|0)==(l|0)){r=179864}else{r=c[53424+(n<<2)>>2]|0}s=+h[6373];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=o,h[v+8>>3]=j,c[v+16>>2]=p,h[v+24>>3]=q,c[v+32>>2]=r,h[v+40>>3]=s,v)|0);aI(205664,2,1,b|0);aI(205016,23,1,b|0);r=c[12418]|0;if((r|0)==0){t=179864}else{t=c[53424+(r<<2)>>2]|0}s=+h[6211];p=c[12419]|0;if((p|0)==(r|0)){u=179864}else{u=c[53424+(p<<2)>>2]|0}q=+h[6212];r=c[12420]|0;if((r|0)==(p|0)){w=179864}else{w=c[53424+(r<<2)>>2]|0}j=+h[6213];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=t,h[v+8>>3]=s,c[v+16>>2]=u,h[v+24>>3]=q,c[v+32>>2]=w,h[v+40>>3]=j,v)|0);cf(b|0,204656,(v=i,i=i+8|0,h[v>>3]=+h[6214],v)|0);aI(204408,6,1,b|0);w=c[12406]|0;if((w|0)==0){aI(204112,3,1,b|0)}else if((w|0)==1){aI(203864,3,1,b|0)}else if((w|0)==2){aI(203656,3,1,b|0)}do{if((a[47032]&1)!=0){w=c[11752]|0;if((w|0)==1){u=c[11732]|0;t=c[11756]|0;r=c[11734]|0;cf(b|0,203400,(v=i,i=i+24|0,c[v>>2]=u,c[v+8>>2]=t,c[v+16>>2]=r,v)|0);break}r=c[11732]|0;t=c[11756]|0;if((w|0)==2){cf(b|0,203056,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=t,v)|0);break}else{x=-1}while(1){u=x+1|0;if((u|0)==7){y=0;break}if((c[46948+(u<<3)>>2]|0)==(w|0)){y=c[46944+(u<<3)>>2]|0;break}else{x=u}}w=(a[47016]&1)!=0?202360:179864;j=+h[5865];q=+h[5864];cf(b|0,202800,(v=i,i=i+48|0,c[v>>2]=r,c[v+8>>2]=t,c[v+16>>2]=y,c[v+24>>2]=w,h[v+32>>3]=j,h[v+40>>3]=q,v)|0)}}while(0);cf(b|0,201728,(v=i,i=i+16|0,c[v>>2]=24544,c[v+8>>2]=24595,v)|0);y=j3(66240)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=y,v)|0);y=j3(65552)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=y,v)|0);y=j3(68992)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=y,v)|0);y=j3(68304)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=y,v)|0);y=j3(64864)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=y,v)|0);y=j3(66928)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=y,v)|0);y=j3(69680)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=57e3,c[v+8>>2]=y,v)|0);cf(b|0,200232,(v=i,i=i+8|0,c[v>>2]=+h[9040]==1.0?124080:123976,v)|0);y=c[10026]|0;if((y|0)>-1){x=(y|0)==0?150704:150856;cf(b|0,198776,(v=i,i=i+8|0,c[v>>2]=x,v)|0);z=0}else{z=0}while(1){if(z>>>0>=8){A=8770;break}if((a[65036+(z*688&-1)|0]&1)!=0){A=8771;break}if((a[65037+(z*688&-1)|0]&1)==0){z=z+1|0}else{A=8771;break}}if((A|0)==8770){aI(198368,11,1,b|0)}else if((A|0)==8771){q=+h[3815];if(q!=0.0){j=q/+h[9040];cf(b|0,197920,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}else{aI(197464,17,1,b|0)}aI(196824,8,1,b|0);z=(a[66413]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[66412]&1)!=0?179864:136208,c[v+8>>2]=56880,c[v+16>>2]=z,c[v+24>>2]=56880,v)|0);z=(a[65725]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[65724]&1)!=0?179864:136208,c[v+8>>2]=56856,c[v+16>>2]=z,c[v+24>>2]=56856,v)|0);z=(a[65037]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[65036]&1)!=0?179864:136208,c[v+8>>2]=56832,c[v+16>>2]=z,c[v+24>>2]=56832,v)|0);aI(195696,3,1,b|0);z=(a[69165]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[69164]&1)!=0?179864:136208,c[v+8>>2]=56976,c[v+16>>2]=z,c[v+24>>2]=56976,v)|0);z=(a[68477]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[68476]&1)!=0?179864:136208,c[v+8>>2]=56952,c[v+16>>2]=z,c[v+24>>2]=56952,v)|0);z=(a[67101]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[67100]&1)!=0?179864:136208,c[v+8>>2]=56904,c[v+16>>2]=z,c[v+24>>2]=56904,v)|0);aF(10,b|0);z=c[10026]|0;if((z|0)==-1){B=193464}else{B=(z|0)==0?150704:150856}cf(b|0,193936,(v=i,i=i+8|0,c[v>>2]=B,v)|0);ji(b,40048,0);aI(86120,2,1,b|0);ji(b,34776,0);aF(10,b|0)}cf(b|0,188584,(v=i,i=i+8|0,c[v>>2]=(a[27776]&1)!=0?179864:213448,v)|0);B=j3(36288)|0;cf(b|0,187184,(v=i,i=i+8|0,c[v>>2]=B,v)|0);B=c[9329]|0;if((B|0)!=0){cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=B,v)|0)}B=c[9330]|0;if(!((B|0)==1&(c[9331]|0)==-2|(B|0)==0)){aI(145280,10,1,b|0);jg(b,37320)}aF(10,b|0);aI(186104,8,1,b|0);B=c[9031]|0;do{if((B|0)==0){aI(185592,6,1,b|0);A=8796}else if((B|0)==1){aI(185072,7,1,b|0);A=8796}else if((B|0)==2){z=c[9032]|0;if((z|0)==0){aI(184712,7,1,b|0);A=8796;break}else if((z|0)==1){aI(184336,7,1,b|0);A=8796;break}else if((z|0)==2){aI(183952,7,1,b|0);A=8796;break}else if((z|0)==3){aI(183592,7,1,b|0);A=8796;break}else{A=8796;break}}else if((B|0)==3){aI(183128,3,1,b|0);z=c[9034]|0;if((z|0)==0){C=179864}else{C=c[53424+(z<<2)>>2]|0}j=+h[4519];x=c[9035]|0;if((x|0)==(z|0)){D=179864}else{D=c[53424+(x<<2)>>2]|0}q=+h[4520];z=c[9036]|0;if((z|0)==(x|0)){E=179864}else{E=c[53424+(z<<2)>>2]|0}s=+h[4521];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=C,h[v+8>>3]=j,c[v+16>>2]=D,h[v+24>>3]=q,c[v+32>>2]=E,h[v+40>>3]=s,v)|0);A=8796}else{A=8798}}while(0);do{if((A|0)==8796){if((c[9031]|0)!=2){A=8798;break}if(((c[9032]|0)-2|0)>>>0>=2){A=8798}}}while(0);do{if((A|0)==8798){E=c[9045]|0;if((E|0)==2){aI(131280,6,1,b|0);break}else if((E|0)==0){aI(131440,5,1,b|0);break}else if((E|0)==1){aI(131216,7,1,b|0);break}else{break}}}while(0);do{if(!((c[9031]|0)==2&(c[9032]|0)>>>0<2)){E=c[9044]|0;if((E|0)==0){aI(180360,4,1,b|0);break}else if((E|0)==2){aI(179904,7,1,b|0);break}else if((E|0)==1){aI(131216,7,1,b|0);break}else{break}}}while(0);E=(c[9046]|0)==0?178184:164216;D=(a[36229]&1)!=0?179864:136208;C=(a[36231]&1)!=0?179864:136208;B=c[9056]|0;if((B|0)==2){F=177584}else{F=(B|0)==1?177096:176744}cf(b|0,179568,(v=i,i=i+40|0,c[v>>2]=(c[9047]|0)==0?179176:178608,c[v+8>>2]=E,c[v+16>>2]=D,c[v+24>>2]=C,c[v+32>>2]=F,v)|0);if((c[9059]|0)>-3){aI(99520,3,1,b|0);ji(b,36232,0)}else{aI(175760,5,1,b|0)}s=+h[4524];q=+h[4525];j=+h[4526];G=+h[4527];cf(b|0,175416,(v=i,i=i+40|0,c[v>>2]=(a[36230]&1)!=0?179864:136208,h[v+8>>3]=s,h[v+16>>3]=q,h[v+24>>3]=j,h[v+32>>3]=G,v)|0);F=c[9339]|0;cf(b|0,174936,(v=i,i=i+16|0,c[v>>2]=c[9338],c[v+8>>2]=F,v)|0);aF(10,b|0);cf(b|0,174656,(v=i,i=i+8|0,c[v>>2]=(a[36228]&1)!=0?179864:136208,v)|0);if((a[36120]&1)==0){aI(174304,10,1,b|0)}aI(173712,12,1,b|0);F=c[10822]|0;if((F|0)!=0){C=F;do{F=c[C+4>>2]|0;D=j3(c[C+60>>2]|0)|0;cf(b|0,173208,(v=i,i=i+16|0,c[v>>2]=F,c[v+8>>2]=D,v)|0);D=c[C+8>>2]|0;if((D|0)==0){H=179864}else{H=c[53424+(D<<2)>>2]|0}G=+h[C+24>>3];F=c[C+12>>2]|0;if((F|0)==(D|0)){I=179864}else{I=c[53424+(F<<2)>>2]|0}j=+h[C+32>>3];D=c[C+16>>2]|0;if((D|0)==(F|0)){J=179864}else{J=c[53424+(D<<2)>>2]|0}q=+h[C+40>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=H,h[v+8>>3]=G,c[v+16>>2]=I,h[v+24>>3]=j,c[v+32>>2]=J,h[v+40>>3]=q,v)|0);D=c[C+48>>2]|0;if((D|0)==0){aI(131440,5,1,b|0)}else if((D|0)==1){aI(126448,7,1,b|0)}else if((D|0)==2){aI(131280,6,1,b|0)}D=c[C+52>>2]|0;if((D|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=D,v)|0)}D=c[C+64>>2]|0;if((D|0)!=0){cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=D,v)|0)}cf(b|0,124744,(v=i,i=i+8|0,c[v>>2]=(c[C+56>>2]|0)==0?150704:150856,v)|0);if((a[C+184|0]&1)!=0){aI(199048,11,1,b|0)}D=C+72|0;if((c[D>>2]|0)!=0){aI(145280,10,1,b|0);jg(b,D)}D=C+88|0;if((c[D>>2]|0)==0){aI(126e3,8,1,b|0)}else{aI(170816,6,1,b|0);ji(b,D,1)}aI(216256,8,1,b|0);D=c[C+144>>2]|0;if((D|0)==0){K=179864}else{K=c[53424+(D<<2)>>2]|0}q=+h[C+160>>3];F=c[C+148>>2]|0;if((F|0)==(D|0)){L=179864}else{L=c[53424+(F<<2)>>2]|0}j=+h[C+168>>3];D=c[C+152>>2]|0;if((D|0)==(F|0)){M=179864}else{M=c[53424+(D<<2)>>2]|0}G=+h[C+176>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=K,h[v+8>>3]=q,c[v+16>>2]=L,h[v+24>>3]=j,c[v+32>>2]=M,h[v+40>>3]=G,v)|0);aF(10,b|0);C=c[C>>2]|0;}while((C|0)!=0)}aI(170408,12,1,b|0);C=c[10826]|0;if((C|0)!=0){M=C;do{cf(b|0,170056,(v=i,i=i+8|0,c[v>>2]=c[M+4>>2],v)|0);C=c[M+8>>2]|0;if((C|0)==0){N=179864}else{N=c[53424+(C<<2)>>2]|0}G=+h[M+24>>3];L=c[M+12>>2]|0;if((L|0)==(C|0)){O=179864}else{O=c[53424+(L<<2)>>2]|0}j=+h[M+32>>3];C=c[M+16>>2]|0;if((C|0)==(L|0)){P=179864}else{P=c[53424+(C<<2)>>2]|0}q=+h[M+40>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=N,h[v+8>>3]=G,c[v+16>>2]=O,h[v+24>>3]=j,c[v+32>>2]=P,h[v+40>>3]=q,v)|0);aK(((a[M+88|0]&1)!=0?127520:127448)|0,b|0);C=c[M+48>>2]|0;if((C|0)==0){Q=179864}else{Q=c[53424+(C<<2)>>2]|0}q=+h[M+64>>3];L=c[M+52>>2]|0;if((L|0)==(C|0)){R=179864}else{R=c[53424+(L<<2)>>2]|0}j=+h[M+72>>3];C=c[M+56>>2]|0;if((C|0)==(L|0)){S=179864}else{S=c[53424+(C<<2)>>2]|0}G=+h[M+80>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=Q,h[v+8>>3]=q,c[v+16>>2]=R,h[v+24>>3]=j,c[v+32>>2]=S,h[v+40>>3]=G,v)|0);C=(c[M+100>>2]|0)==0?150704:150856;L=c[M+200>>2]|0;if((L|0)==2){T=128e3}else{T=(L|0)==1?127904:127768}cf(b|0,169144,(v=i,i=i+24|0,c[v>>2]=c[72304+(c[M+160>>2]<<2)>>2],c[v+8>>2]=C,c[v+16>>2]=T,v)|0);ji(b,M+104|0,0);G=+h[M+168>>3];if(G>0.0){C=c[25376+(c[M+176>>2]<<2)>>2]|0;j=+h[M+184>>3];q=+h[M+192>>3];cf(b|0,165352,(v=i,i=i+32|0,c[v>>2]=C,h[v+8>>3]=G,h[v+16>>3]=j,h[v+24>>3]=q,v)|0)}aF(10,b|0);M=c[M>>2]|0;}while((M|0)!=0)}cf(b|0,164920,(v=i,i=i+8|0,c[v>>2]=(a[30080]&1)!=0?164520:126024,v)|0);aI(164048,17,1,b|0);M=c[10820]|0;if((M|0)!=0){T=M;do{cf(b|0,163384,(v=i,i=i+8|0,c[v>>2]=c[T+4>>2],v)|0);ji(b,T+8|0,1);aF(10,b|0);T=c[T>>2]|0;}while((T|0)!=0)}aI(162896,18,1,b|0);T=c[10824]|0;if((T|0)!=0){M=T;do{cf(b|0,162248,(v=i,i=i+8|0,c[v>>2]=c[M+4>>2],v)|0);T=(c[M+12>>2]|0)==0?150704:150856;S=c[M+112>>2]|0;if((S|0)==2){U=128e3}else{U=(S|0)==1?127904:127768}cf(b|0,169144,(v=i,i=i+24|0,c[v>>2]=c[72304+(c[M+72>>2]<<2)>>2],c[v+8>>2]=T,c[v+16>>2]=U,v)|0);ji(b,M+16|0,0);q=+h[M+80>>3];if(q>0.0){T=c[25376+(c[M+88>>2]<<2)>>2]|0;j=+h[M+96>>3];G=+h[M+104>>3];cf(b|0,165352,(v=i,i=i+32|0,c[v>>2]=T,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=G,v)|0)}aF(10,b|0);M=c[M>>2]|0;}while((M|0)!=0)}aI(159152,20,1,b|0);M=c[9670]|0;if((M|0)==4){U=c[9671]|0;G=+h[4840];cf(b|0,158040,(v=i,i=i+16|0,c[v>>2]=U,h[v+8>>3]=G,v)|0)}else if((M|0)==1){aI(156128,11,1,b|0)}else if((M|0)==2){aI(155064,14,1,b|0)}else{cf(b|0,158640,(v=i,i=i+8|0,c[v>>2]=c[9671],v)|0)}aI(154704,6,1,b|0);aI(216256,8,1,b|0);M=c[9720]|0;if((M|0)==0){V=179864}else{V=c[53424+(M<<2)>>2]|0}G=+h[4862];U=c[9721]|0;if((U|0)==(M|0)){W=179864}else{W=c[53424+(U<<2)>>2]|0}j=+h[4863];M=c[9722]|0;if((M|0)==(U|0)){X=179864}else{X=c[53424+(M<<2)>>2]|0}q=+h[4864];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=V,h[v+8>>3]=G,c[v+16>>2]=W,h[v+24>>3]=j,c[v+32>>2]=X,h[v+40>>3]=q,v)|0);aF(10,b|0);jj(b,0);aI(154408,15,1,b|0);if((a[66164]&1)!=0){q=+h[8271];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56880,h[v+8>>3]=q,v)|0)}if((a[65476]&1)!=0){q=+h[8185];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56856,h[v+8>>3]=q,v)|0)}if((a[68916]&1)!=0){q=+h[8615];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56976,h[v+8>>3]=q,v)|0)}if((a[68228]&1)!=0){q=+h[8529];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56952,h[v+8>>3]=q,v)|0)}if((a[64788]&1)!=0){q=+h[8099];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56832,h[v+8>>3]=q,v)|0)}if((a[66852]&1)!=0){q=+h[8357];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56904,h[v+8>>3]=q,v)|0)}if((a[69604]&1)!=0){q=+h[8701];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=57e3,h[v+8>>3]=q,v)|0)}X=(c[8764]|0)==2?88392:179864;q=+h[4384];W=(c[6588]|0)==2?88392:179864;j=+h[3296];V=(c[1057]|0)==2?88392:179864;G=+h[531];M=(c[14091]|0)==2?88392:179864;s=+h[7048];cf(b|0,89120,(v=i,i=i+72|0,c[v>>2]=153688,c[v+8>>2]=X,h[v+16>>3]=q,c[v+24>>2]=W,h[v+32>>3]=j,c[v+40>>2]=V,h[v+48>>3]=G,c[v+56>>2]=M,h[v+64>>3]=s,v)|0);s=+h[3818];M=c[44936+(c[11252]<<2)>>2]|0;V=(a[30528]&1)!=0?179864:213448;W=(a[32936]&1)!=0?179864:213448;cf(b|0,153216,(v=i,i=i+40|0,h[v>>3]=+h[3817],h[v+8>>3]=s,c[v+16>>2]=M,c[v+24>>2]=V,c[v+32>>2]=W,v)|0);W=c[8270]|0;if((W|0)!=0){cf(b|0,152808,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}W=c[12886]|0;if((W|0)==0){Y=0}else{cf(b|0,152408,(v=i,i=i+8|0,c[v>>2]=W,v)|0);Y=(c[12886]|0)!=0}if(!((c[8270]|0)!=0|Y)){aI(152040,18,1,b|0)}aI(151856,9,1,b|0);if((c[5094]|0)==1){aI(134552,3,1,b|0)}else{s=+g[3538];G=+g[3536];j=+g[3534];q=+g[3532];cf(b|0,151408,(v=i,i=i+32|0,h[v>>3]=s,h[v+8>>3]=G,h[v+16>>3]=j,h[v+24>>3]=q,v)|0)}Y=c[18072]|0;if((Y|0)==2){Z=150928;A=8906}else if((Y|0)!=0){Z=(Y|0)==3?150776:179864;A=8906}if((A|0)==8906){cf(b|0,151136,(v=i,i=i+8|0,c[v>>2]=Z,v)|0)}Z=c[6350]|0;A=c[9344]|0;Y=c[9342]|0;W=(a[46752]&1)!=0?179864:213448;V=(c[11690]|0)!=0?179864:213448;cf(b|0,150608,(v=i,i=i+48|0,c[v>>2]=c[6352],c[v+8>>2]=Z,c[v+16>>2]=A,c[v+24>>2]=Y,c[v+32>>2]=W,c[v+40>>2]=V,v)|0);V=c[11690]|0;if((V|0)==0){aF(10,b|0)}else if((V|0)==1){aI(150432,6,1,b|0)}else if((V|0)==2){aI(150288,9,1,b|0)}else if((V|0)==3){aI(150104,6,1,b|0)}if((a[35888]&1)==0){aI(149752,13,1,b|0)}else{cf(b|0,149912,(v=i,i=i+8|0,c[v>>2]=53520,v)|0)}if((a[43472]&1)!=0){aI(149592,11,1,b|0)}aI(149400,12,1,b|0);V=c[8732]|0;if((V|0)==1){aI(113784,10,1,b|0)}else if((V|0)==2){aI(113712,12,1,b|0)}else{aI(113904,10,1,b|0)}V=c[8528]|0;if((V|0)!=0){cf(b|0,148496,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}V=a[47120]|0;if(V<<24>>24==0){aI(148224,34,1,b|0)}else{W=V<<24>>24;cf(b|0,148416,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}W=c[11948]|0;if((aY(W|0,199184)|0)!=0){cf(b|0,147856,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}if((a[47712]&1)!=0){aI(147600,21,1,b|0)}if((a[47472]&1)!=0){aI(147320,24,1,b|0)}if((a[38984]&1)==0){aI(197656,15,1,b|0)}else{W=(c[9744]|0)==0?150704:150856;V=c[9742]|0;Y=c[9734]|0;A=c[9738]|0;Z=a[38944]|0?136208:179864;M=a[38960]|0?136208:179864;cf(b|0,186344,(v=i,i=i+48|0,c[v>>2]=W,c[v+8>>2]=V,c[v+16>>2]=Y,c[v+24>>2]=A,c[v+32>>2]=Z,c[v+40>>2]=M,v)|0)}cf(b|0,147064,(v=i,i=i+8|0,c[v>>2]=c[13368],v)|0);aI(146824,14,1,b|0);M=c[13378]|0;if((M|0)==0){aI(146624,7,1,b|0)}else if((M|0)==1){aI(146456,12,1,b|0)}else if((M|0)==2){aI(146264,8,1,b|0)}aI(146096,21,1,b|0);M=c[13372]|0;if((M|0)==0){Z=c[13374]|0;cf(b|0,145944,(v=i,i=i+8|0,c[v>>2]=Z,v)|0)}else if((M|0)==1){Z=c[11662]|0;q=+h[Z>>3];j=+h[Z+8>>3];G=q+j*+(c[13374]|0);cf(b|0,145704,(v=i,i=i+24|0,h[v>>3]=q,h[v+8>>3]=j,h[v+16>>3]=G,v)|0)}else if((M|0)==2){cf(b|0,145496,(v=i,i=i+8|0,h[v>>3]=+h[c[11662]>>3],v)|0);if((c[13374]|0)>1){M=1;do{cf(b|0,107648,(v=i,i=i+8|0,h[v>>3]=+h[(c[11662]|0)+(M<<3)>>3],v)|0);M=M+1|0;}while((M|0)<(c[13374]|0))}aF(10,b|0)}G=+g[18074];j=+g[178];q=+g[38];s=+g[184];_=+g[44];cf(b|0,144928,(v=i,i=i+48|0,c[v>>2]=c[13366],h[v+8>>3]=G,h[v+16>>3]=j,h[v+24>>3]=q,h[v+32>>3]=s,h[v+40>>3]=_,v)|0);aI(144752,15,1,b|0);jh(b,107848,c[12890]|0);aI(144472,19,1,b|0);jh(b,144328,c[10058]|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);ji(b,66656,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);ji(b,65968,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);ji(b,65280,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);ji(b,69408,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);ji(b,68720,0);aF(10,b|0);_=+h[77];if((a[624]&1)==0){cf(b|0,143976,(v=i,i=i+8|0,h[v>>3]=_,v)|0)}else{cf(b|0,144112,(v=i,i=i+8|0,h[v>>3]=_,v)|0)}M=c[16604]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}else if((M|0)==2){_=+h[8303];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56880,h[v+8>>3]=_,v)|0)}M=c[16432]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}else if((M|0)==2){_=+h[8217];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56856,h[v+8>>3]=_,v)|0)}M=c[16260]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}else if((M|0)==2){_=+h[8131];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56832,h[v+8>>3]=_,v)|0)}M=c[17292]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}else if((M|0)==2){_=+h[8647];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56976,h[v+8>>3]=_,v)|0)}M=c[17120]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}else if((M|0)==2){_=+h[8561];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56952,h[v+8>>3]=_,v)|0)}M=c[16776]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}else if((M|0)==2){_=+h[8389];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56904,h[v+8>>3]=_,v)|0)}jk(b,2);jk(b,1);jk(b,0);jk(b,6);jk(b,5);jk(b,3);jk(b,7);M=c[1119]|0;if((M|0)==0){$=179864}else{$=j3(M)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=179864,c[v+8>>2]=154440,c[v+16>>2]=$,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=179864,c[v+8>>2]=154440,v)|0);aI(216256,8,1,b|0);$=c[1140]|0;if(($|0)==0){aa=179864}else{aa=c[53424+($<<2)>>2]|0}_=+h[572];M=c[1141]|0;if((M|0)==($|0)){ab=179864}else{ab=c[53424+(M<<2)>>2]|0}s=+h[573];$=c[1142]|0;if(($|0)==(M|0)){ac=179864}else{ac=c[53424+($<<2)>>2]|0}q=+h[574];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aa,h[v+8>>3]=_,c[v+16>>2]=ab,h[v+24>>3]=s,c[v+32>>2]=ac,h[v+40>>3]=q,v)|0);ac=c[1120]|0;if((ac|0)==0){ad=179864}else{ad=j3(ac)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=ad,v)|0);if((c[1122]|0)!=0){aI(145280,10,1,b|0);jg(b,4488)}if((c[1105]|0)==-3){aI(142704,16,1,b|0)}ad=c[1117]|0;if((ad|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=ad,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[4600]&1)!=0?199048:179864,v)|0);cf(b|0,142592,(v=i,i=i+8|0,c[v>>2]=(c[1166]|0)!=0?196800:196168,v)|0);ad=c[1183]|0;if((ad|0)==0){ae=179864}else{ae=j3(ad)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=179864,c[v+8>>2]=133504,c[v+16>>2]=ae,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=179864,c[v+8>>2]=133504,v)|0);aI(216256,8,1,b|0);ae=c[1204]|0;if((ae|0)==0){af=179864}else{af=c[53424+(ae<<2)>>2]|0}q=+h[604];ad=c[1205]|0;if((ad|0)==(ae|0)){ag=179864}else{ag=c[53424+(ad<<2)>>2]|0}s=+h[605];ae=c[1206]|0;if((ae|0)==(ad|0)){ah=179864}else{ah=c[53424+(ae<<2)>>2]|0}_=+h[606];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=af,h[v+8>>3]=q,c[v+16>>2]=ag,h[v+24>>3]=s,c[v+32>>2]=ah,h[v+40>>3]=_,v)|0);ah=c[1184]|0;if((ah|0)==0){ai=179864}else{ai=j3(ah)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=ai,v)|0);if((c[1186]|0)!=0){aI(145280,10,1,b|0);jg(b,4744)}if((c[1169]|0)==-3){aI(142704,16,1,b|0)}ai=c[1181]|0;if((ai|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=ai,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[4856]&1)!=0?199048:179864,v)|0);je(b,7);je(b,8);je(b,9);je(b,10);ai=c[16629]|0;if((ai|0)==0){aj=179864}else{aj=j3(ai)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56880,c[v+8>>2]=202256,c[v+16>>2]=aj,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);aj=c[16650]|0;if((aj|0)==0){ak=179864}else{ak=c[53424+(aj<<2)>>2]|0}_=+h[8327];ai=c[16651]|0;if((ai|0)==(aj|0)){al=179864}else{al=c[53424+(ai<<2)>>2]|0}s=+h[8328];aj=c[16652]|0;if((aj|0)==(ai|0)){am=179864}else{am=c[53424+(aj<<2)>>2]|0}q=+h[8329];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=ak,h[v+8>>3]=_,c[v+16>>2]=al,h[v+24>>3]=s,c[v+32>>2]=am,h[v+40>>3]=q,v)|0);am=c[16630]|0;if((am|0)==0){an=179864}else{an=j3(am)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=an,v)|0);if((c[16632]|0)!=0){aI(145280,10,1,b|0);jg(b,66528)}if((c[16615]|0)==-3){aI(142704,16,1,b|0)}an=c[16627]|0;if((an|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=an,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[66640]&1)!=0?199048:179864,v)|0);an=c[17317]|0;if((an|0)==0){ao=179864}else{ao=j3(an)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56976,c[v+8>>2]=202256,c[v+16>>2]=ao,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);ao=c[17338]|0;if((ao|0)==0){ap=179864}else{ap=c[53424+(ao<<2)>>2]|0}q=+h[8671];an=c[17339]|0;if((an|0)==(ao|0)){aq=179864}else{aq=c[53424+(an<<2)>>2]|0}s=+h[8672];ao=c[17340]|0;if((ao|0)==(an|0)){ar=179864}else{ar=c[53424+(ao<<2)>>2]|0}_=+h[8673];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=ap,h[v+8>>3]=q,c[v+16>>2]=aq,h[v+24>>3]=s,c[v+32>>2]=ar,h[v+40>>3]=_,v)|0);ar=c[17318]|0;if((ar|0)==0){as=179864}else{as=j3(ar)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=as,v)|0);if((c[17320]|0)!=0){aI(145280,10,1,b|0);jg(b,69280)}if((c[17303]|0)==-3){aI(142704,16,1,b|0)}as=c[17315]|0;if((as|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=as,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[69392]&1)!=0?199048:179864,v)|0);je(b,2);je(b,6);as=c[16457]|0;if((as|0)==0){at=179864}else{at=j3(as)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56856,c[v+8>>2]=202256,c[v+16>>2]=at,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);at=c[16478]|0;if((at|0)==0){au=179864}else{au=c[53424+(at<<2)>>2]|0}_=+h[8241];as=c[16479]|0;if((as|0)==(at|0)){av=179864}else{av=c[53424+(as<<2)>>2]|0}s=+h[8242];at=c[16480]|0;if((at|0)==(as|0)){aw=179864}else{aw=c[53424+(at<<2)>>2]|0}q=+h[8243];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=au,h[v+8>>3]=_,c[v+16>>2]=av,h[v+24>>3]=s,c[v+32>>2]=aw,h[v+40>>3]=q,v)|0);aw=c[16458]|0;if((aw|0)==0){ax=179864}else{ax=j3(aw)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=ax,v)|0);if((c[16460]|0)!=0){aI(145280,10,1,b|0);jg(b,65840)}if((c[16443]|0)==-3){aI(142704,16,1,b|0)}ax=c[16455]|0;if((ax|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=ax,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[65952]&1)!=0?199048:179864,v)|0);ax=c[17145]|0;if((ax|0)==0){ay=179864}else{ay=j3(ax)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56952,c[v+8>>2]=202256,c[v+16>>2]=ay,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);ay=c[17166]|0;if((ay|0)==0){az=179864}else{az=c[53424+(ay<<2)>>2]|0}q=+h[8585];ax=c[17167]|0;if((ax|0)==(ay|0)){aA=179864}else{aA=c[53424+(ax<<2)>>2]|0}s=+h[8586];ay=c[17168]|0;if((ay|0)==(ax|0)){aB=179864}else{aB=c[53424+(ay<<2)>>2]|0}_=+h[8587];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=az,h[v+8>>3]=q,c[v+16>>2]=aA,h[v+24>>3]=s,c[v+32>>2]=aB,h[v+40>>3]=_,v)|0);aB=c[17146]|0;if((aB|0)==0){aC=179864}else{aC=j3(aB)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=aC,v)|0);if((c[17148]|0)!=0){aI(145280,10,1,b|0);jg(b,68592)}if((c[17131]|0)==-3){aI(142704,16,1,b|0)}aC=c[17143]|0;if((aC|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=aC,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[68704]&1)!=0?199048:179864,v)|0);do{if((c[5094]|0)==0){je(b,1);je(b,5)}else{if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}je(b,1);je(b,5);if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);aC=c[16285]|0;if((aC|0)==0){aD=179864}else{aD=j3(aC)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56832,c[v+8>>2]=202256,c[v+16>>2]=aD,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);aD=c[16306]|0;if((aD|0)==0){aE=179864}else{aE=c[53424+(aD<<2)>>2]|0}_=+h[8155];aC=c[16307]|0;if((aC|0)==(aD|0)){aG=179864}else{aG=c[53424+(aC<<2)>>2]|0}s=+h[8156];aD=c[16308]|0;if((aD|0)==(aC|0)){aH=179864}else{aH=c[53424+(aD<<2)>>2]|0}q=+h[8157];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aE,h[v+8>>3]=_,c[v+16>>2]=aG,h[v+24>>3]=s,c[v+32>>2]=aH,h[v+40>>3]=q,v)|0);aH=c[16286]|0;if((aH|0)==0){aJ=179864}else{aJ=j3(aH)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=aJ,v)|0);if((c[16288]|0)!=0){aI(145280,10,1,b|0);jg(b,65152)}if((c[16271]|0)==-3){aI(142704,16,1,b|0)}aJ=c[16283]|0;if((aJ|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=aJ,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[65264]&1)!=0?199048:179864,v)|0);je(b,0);aJ=c[16801]|0;if((aJ|0)==0){aL=179864}else{aL=j3(aJ)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56904,c[v+8>>2]=202256,c[v+16>>2]=aL,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);aL=c[16822]|0;if((aL|0)==0){aM=179864}else{aM=c[53424+(aL<<2)>>2]|0}q=+h[8413];aJ=c[16823]|0;if((aJ|0)==(aL|0)){aN=179864}else{aN=c[53424+(aJ<<2)>>2]|0}s=+h[8414];aL=c[16824]|0;if((aL|0)==(aJ|0)){aO=179864}else{aO=c[53424+(aL<<2)>>2]|0}_=+h[8415];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aM,h[v+8>>3]=q,c[v+16>>2]=aN,h[v+24>>3]=s,c[v+32>>2]=aO,h[v+40>>3]=_,v)|0);aO=c[16802]|0;if((aO|0)==0){aP=179864}else{aP=j3(aO)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=aP,v)|0);if((c[16804]|0)!=0){aI(145280,10,1,b|0);jg(b,67216)}if((c[16787]|0)==-3){aI(142704,16,1,b|0)}aP=c[16799]|0;if((aP|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=aP,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[67328]&1)!=0?199048:179864,v)|0);je(b,3);cf(b|0,141912,(v=i,i=i+8|0,h[v>>3]=+h[11],v)|0);_=+h[4395];cf(b|0,141776,(v=i,i=i+16|0,c[v>>2]=(c[8786]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);_=+h[7052];cf(b|0,141392,(v=i,i=i+16|0,c[v>>2]=(c[14100]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);_=+h[3301];cf(b|0,141272,(v=i,i=i+16|0,c[v>>2]=(c[6598]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);_=+h[535];cf(b|0,141072,(v=i,i=i+16|0,c[v>>2]=(c[1066]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);cf(b|0,140928,(v=i,i=i+8|0,c[v>>2]=c[12908],v)|0);aI(140768,9,1,b|0);aI(((c[7662]|0)==1?140568:140376)|0,8,1,b|0);cf(b|0,140264,(v=i,i=i+8|0,c[v>>2]=30632,v)|0);aI(140768,9,1,b|0);aP=a[30641]|0;if((aP|0)==97){aI(140104,15,1,b|0)}else if((aP|0)==102){aI(139848,13,1,b|0)}else if((aP|0)==98){aI(139608,14,1,b|0)}else if((aP|0)==100){aI(139464,11,1,b|0)}aP=c[7665]|0;cf(b|0,139248,(v=i,i=i+16|0,c[v>>2]=c[7664],c[v+8>>2]=aP,v)|0);aI(139080,7,1,b|0);aP=a[30639]|0;if((aP|0)==99){aI(89896,6,1,b|0)}else if((aP|0)==98){aI(138664,5,1,b|0)}else if((aP|0)==114){aI(74552,3,1,b|0)}aK(((a[30640]|0)!=0?73808:138016)|0,b|0);aI(137864,10,1,b|0);aP=c[7661]|0;if((aP|0)>0){cf(b|0,137704,(v=i,i=i+8|0,c[v>>2]=aP,v)|0)}else{aO=(aP|0)!=0?137592:137416;aK(aO|0,b|0)}aI(137296,15,1,b|0);aO=c[7663]|0;if((aO|0)==4){aI(105792,4,1,b|0)}else if((aO|0)==5){aI(167728,7,1,b|0)}else if((aO|0)==6){aI(100616,6,1,b|0)}else if((aO|0)==7){aI(103256,3,1,b|0)}else if((aO|0)==8){aI(99528,3,1,b|0)}else{cf(b|0,136120,(v=i,i=i+8|0,c[v>>2]=aO+1,v)|0)}aF(10,b|0);aO=(a[20684]|0)!=0?137784:137920;aP=c[5168]|0;cf(b|0,135880,(v=i,i=i+24|0,c[v>>2]=(a[20668]|0)==112?135696:135584,c[v+8>>2]=aO,c[v+16>>2]=aP,v)|0);cf(b|0,135120,(v=i,i=i+8|0,h[v>>3]=+h[2705],v)|0);do{if((c[5163]|0)==103){aI(134936,5,1,b|0)}else{aI(134744,12,1,b|0);aP=c[5174]|0;if((aP|0)==114){aI(134624,4,1,b|0)}else if((aP|0)==104){aI(134504,4,1,b|0)}else if((aP|0)==99){aI(134336,4,1,b|0)}else if((aP|0)==121){aI(134152,4,1,b|0)}else if((aP|0)==120){aI(133992,4,1,b|0)}else{cf(c[m>>2]|0,133856,(v=i,i=i+24|0,c[v>>2]=133776,c[v+8>>2]=871,c[v+16>>2]=aP<<24>>24,v)|0)}aI(133576,13,1,b|0);aP=c[5163]|0;if((aP|0)==114){aO=c[5164]|0;aN=c[5165]|0;aM=c[5166]|0;cf(b|0,133464,(v=i,i=i+24|0,c[v>>2]=aO,c[v+8>>2]=aN,c[v+16>>2]=aM,v)|0);break}else if((aP|0)==100){aI(133112,9,1,b|0);if((c[5172]|0)>0){aM=0;do{aN=c[5173]|0;_=+h[aN+(aM<<5)+8>>3];s=+h[aN+(aM<<5)+16>>3];q=+h[aN+(aM<<5)+24>>3];cf(b|0,132952,(v=i,i=i+32|0,h[v>>3]=+h[aN+(aM<<5)>>3],h[v+8>>3]=_,h[v+16>>3]=s,h[v+24>>3]=q,v)|0);do{if((aM|0)<((c[5172]|0)-1|0)){aF(44,b|0);if(!((aM|0)==2|((aM|0)%4&-1|0)==2)){break}aI(132648,6,1,b|0)}}while(0);aM=aM+1|0;}while((aM|0)<(c[5172]|0))}aI(132568,3,1,b|0);break}else if((aP|0)==102){aM=c[5257]|0;t=c[5335]|0;cf(b|0,132440,(v=i,i=i+24|0,c[v>>2]=c[5179],c[v+8>>2]=aM,c[v+16>>2]=t,v)|0);break}else if((aP|0)==99){q=+h[2707];s=+h[2708];cf(b|0,132312,(v=i,i=i+24|0,h[v>>3]=+h[2706],h[v+8>>3]=q,h[v+16>>3]=s,v)|0);break}else{cf(c[m>>2]|0,142392,(v=i,i=i+24|0,c[v>>2]=133776,c[v+8>>2]=905,c[v+16>>2]=aP<<24>>24,v)|0);break}}}while(0);t=a[54016]|0;if(t<<24>>24!=110){aM=t<<24>>24==100?126024:132024;cf(b|0,132088,(v=i,i=i+8|0,c[v>>2]=aM,v)|0)}cf(b|0,131760,(v=i,i=i+8|0,c[v>>2]=(a[54017]|0)==118?131648:131544,v)|0);aM=c[13508]|0;if((aM|0)==0){aQ=179864}else{aQ=c[53424+(aM<<2)>>2]|0}s=+h[6756];t=c[13509]|0;if((t|0)==(aM|0)){aR=179864}else{aR=c[53424+(t<<2)>>2]|0}q=+h[6757];aM=c[13510]|0;if((aM|0)==(t|0)){aS=179864}else{aS=c[53424+(aM<<2)>>2]|0}_=+h[6758];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aQ,h[v+8>>3]=s,c[v+16>>2]=aR,h[v+24>>3]=q,c[v+32>>2]=aS,h[v+40>>3]=_,v)|0);aI(83624,6,1,b|0);aS=c[13518]|0;if((aS|0)==0){aT=179864}else{aT=c[53424+(aS<<2)>>2]|0}_=+h[6761];aR=c[13519]|0;if((aR|0)==(aS|0)){aU=179864}else{aU=c[53424+(aR<<2)>>2]|0}q=+h[6762];aS=c[13520]|0;if((aS|0)==(aR|0)){aV=179864}else{aV=c[53424+(aS<<2)>>2]|0}s=+h[6763];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aT,h[v+8>>3]=_,c[v+16>>2]=aU,h[v+24>>3]=q,c[v+32>>2]=aV,h[v+40>>3]=s,v)|0);cf(b|0,126160,(v=i,i=i+8|0,c[v>>2]=(c[13506]|0)==1?150856:150704,v)|0);do{if((a[54018]|0)==0){aI(131352,8,1,b|0)}else{aV=c[13505]|0;if((aV|0)<0){aI(131224,8,1,b|0);break}else{cf(b|0,131128,(v=i,i=i+8|0,c[v>>2]=aV,v)|0);break}}}while(0);if((a[54016]|0)==110){aI(131e3,16,1,b|0)}else{aF(10,b|0)}aV=(c[14068]|0)==257?130728:130528;aU=(c[14062]|0)==1?130472:205008;s=+h[7032];aT=(a[56264]&1)!=0?179864:136208;aS=(c[14067]|0)+1|0;q=+h[7035];aR=c[14072]|0;do{if((aR|0)==2){aW=202352}else{if((aR|0)==3){aW=108208;break}aW=(aR|0)==1?201e3:150208}}while(0);aR=(a[56292]&1)!=0?179864:213448;cf(b|0,130824,(v=i,i=i+64|0,c[v>>2]=aV,c[v+8>>2]=aU,h[v+16>>3]=s,c[v+24>>2]=aT,c[v+32>>2]=aS,h[v+40>>3]=q,c[v+48>>2]=aW,c[v+56>>2]=aR,v)|0);aI(129976,13,1,b|0);aR=c[8782]|0;c[8778]=aR;aW=c[8776]|0;L12586:do{if((aW|0)!=0){aS=aW;aT=aR;while(1){aU=c[8774]|0;do{if((aU|0)==0){c[8774]=aS;if((aT|0)!=0){aX=aS;aZ=aT;break}aV=c[8780]|0;c[8778]=aV;aX=aS;aZ=aV}else{aV=aU+((uA(aU|0)|0)+1|0)|0;c[8774]=aV;aX=aV;aZ=aT}}while(0);if(aX>>>0>=aZ>>>0){break}if((aX|0)==0){break L12586}cf(b|0,103640,(v=i,i=i+8|0,c[v>>2]=aX,v)|0);aT=c[8782]|0;c[8778]=aT;aS=c[8776]|0;if((aS|0)==0){break L12586}}c[8774]=0;c[8778]=0}}while(0);aF(10,b|0);aI(129680,13,1,b|0);aX=ur(16,0)|0;if((aX|0)!=0){aZ=aX;do{cf(b|0,103640,(v=i,i=i+8|0,c[v>>2]=aZ,v)|0);aZ=ur(16,0)|0;}while((aZ|0)!=0)}aF(10,b|0);aZ=c[57238]|0;if((aZ|0)==0){aI(129352,10,1,b|0)}else{cf(b|0,129480,(v=i,i=i+8|0,c[v>>2]=aZ,v)|0)}cf(b|0,129048,(v=i,i=i+8|0,c[v>>2]=(a[42568]&1)!=0?179864:136208,v)|0);aZ=c[10568]|0;if((aZ|0)==0){a_=aF(10,b|0)|0;i=d;return}cf(b|0,128984,(v=i,i=i+8|0,c[v>>2]=aZ,v)|0);a_=aF(10,b|0)|0;i=d;return}function jc(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;jI(b);jb(b);e=c[10812]|0;if((e|0)!=0){f=e;do{e=c[f+12>>2]|0;if((e|0)!=0){cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}f=c[f>>2]|0;}while((f|0)!=0)}i8(b);cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=c[6924],v)|0);if((a[35352]|0)==0){g=aI(172e3,9,1,b|0)|0;i=d;return}aI(156144,3,1,b|0);if((b|0)!=0){aK(35352,b|0)}aF(10,b|0);g=aI(172e3,9,1,b|0)|0;i=d;return}function jd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;jI(a);d=c[3524]|0;if((d|0)==0){aI(122336,21,1,a|0)}else{e=c[d>>2]|0;cf(a|0,135232,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=13048,v)|0)}e=c[8244]|0;if((e|0)==0){aI(98152,13,1,a|0);f=aI(172e3,9,1,a|0)|0;i=b;return}else{cf(a|0,105136,(v=i,i=i+8|0,c[v>>2]=e,v)|0);f=aI(172e3,9,1,a|0)|0;i=b;return}}function je(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0;d=i;i=i+1024|0;e=d|0;f=d+48|0;g=d+96|0;j=d+144|0;k=d+192|0;l=d+240|0;n=d+288|0;o=d+336|0;p=d+384|0;q=d+464|0;r=d+544|0;s=d+624|0;t=d+704|0;u=d+784|0;w=d+864|0;x=d+944|0;y=56832+(b*24&-1)|0;cf(a|0,92200,(v=i,i=i+8|0,c[v>>2]=y,v)|0);z=64652+(b*688&-1)|0;do{if((c[z>>2]&1|0)==0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);A=r|0;B=64813+(b*688&-1)|0;C=+h[64680+(b*688&-1)>>3];t3(l,C);D=C- +O(+C);t4(A,80,B,l,D);B=j3(A)|0;aK(B|0,a|0);aF(34,a|0);break}else{D=+h[64680+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0);break}}else{B=64728+(b*688&-1)|0;if((c[B>>2]&1|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);A=p|0;E=64813+(b*688&-1)|0;D=+h[64736+(b*688&-1)>>3];t3(o,D);C=D- +O(+D);t4(A,80,E,o,C);E=j3(A)|0;aK(E|0,a|0);aF(34,a|0)}else{C=+h[64736+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0)}aI(76472,3,1,a|0)}aF(42,a|0);if((c[B>>2]&2|0)==0){break}aI(76472,3,1,a|0);if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);B=q|0;E=64813+(b*688&-1)|0;C=+h[64744+(b*688&-1)>>3];t3(n,C);D=C- +O(+C);t4(B,80,E,n,D);E=j3(B)|0;aK(E|0,a|0);aF(34,a|0);break}else{D=+h[64744+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0);break}}}while(0);aI(223968,3,1,a|0);do{if((c[z>>2]&2|0)==0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);n=u|0;q=64813+(b*688&-1)|0;D=+h[64688+(b*688&-1)>>3];t3(g,D);C=D- +O(+D);t4(n,80,q,g,C);q=j3(n)|0;aK(q|0,a|0);aF(34,a|0);break}else{C=+h[64688+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0);break}}else{q=64732+(b*688&-1)|0;if((c[q>>2]&1|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);n=s|0;o=64813+(b*688&-1)|0;C=+h[64752+(b*688&-1)>>3];t3(k,C);D=C- +O(+C);t4(n,80,o,k,D);o=j3(n)|0;aK(o|0,a|0);aF(34,a|0)}else{D=+h[64752+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0)}aI(76472,3,1,a|0)}aF(42,a|0);if((c[q>>2]&2|0)==0){break}aI(76472,3,1,a|0);if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);q=t|0;o=64813+(b*688&-1)|0;D=+h[64760+(b*688&-1)>>3];t3(j,D);C=D- +O(+D);t4(q,80,o,j,C);o=j3(q)|0;aK(o|0,a|0);aF(34,a|0);break}else{C=+h[64760+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0);break}}}while(0);j=c[64656+(b*688&-1)>>2]|0;cf(a|0,216880,(v=i,i=i+16|0,c[v>>2]=(j&2|0)!=0?179864:136208,c[v+8>>2]=(j&1|0)!=0?179864:136208,v)|0);if(!((c[z>>2]|0)!=0&(c[m>>2]|0)==(a|0))){aF(10,a|0);i=d;return}aI(201952,16,1,a|0);do{if((c[z>>2]&1|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);j=w|0;t=64813+(b*688&-1)|0;C=+h[64664+(b*688&-1)>>3];t3(f,C);D=C- +O(+C);t4(j,80,t,f,D);t=j3(j)|0;aK(t|0,a|0);aF(34,a|0);break}else{D=+h[64664+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0);break}}}while(0);aF(58,a|0);do{if((c[z>>2]&2|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);f=x|0;w=64813+(b*688&-1)|0;D=+h[64672+(b*688&-1)>>3];t3(e,D);C=D- +O(+D);t4(f,80,w,e,C);w=j3(f)|0;aK(w|0,a|0);aF(34,a|0);break}else{C=+h[64672+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0);break}}}while(0);aI(196384,4,1,a|0);b=c[z>>2]|0;if((b&4|0)==0){F=b}else{cf(a|0,185160,(v=i,i=i+8|0,c[v>>2]=y,v)|0);F=c[z>>2]|0}if((F&8|0)==0){i=d;return}cf(a|0,180048,(v=i,i=i+8|0,c[v>>2]=y,v)|0);i=d;return}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0;d=i;e=c[b>>2]|0;if((e|0)==3){aI(163528,9,1,a|0);i=d;return}else if((e|0)==2|(e|0)==5){f=c[b+8>>2]|0;cf(a|0,167968,(v=i,i=i+16|0,c[v>>2]=(e|0)==2?179864:114984,c[v+8>>2]=f,v)|0)}else if((e|0)==1|(e|0)==4){g=+(c[b+4>>2]|0)/100.0;cf(a|0,175936,(v=i,i=i+16|0,c[v>>2]=(e|0)==1?179864:114984,h[v+8>>3]=g,v)|0)}else{aI(154480,7,1,a|0)}e=b+16|0;do{if((c[e>>2]|0)==1){if((c[b+20>>2]|0)!=-3){break}aI(151240,9,1,a|0);i=d;return}}while(0);aI(149416,6,1,a|0);jg(a,e);aF(10,a|0);i=d;return}function jg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[b>>2]|0;if((e|0)==5){f=+h[b+8>>3];cf(a|0,136528,(v=i,i=i+8|0,h[v>>3]=f,v)|0);i=d;return}else if((e|0)==4){cf(a|0,138224,(v=i,i=i+8|0,h[v>>3]=+h[b+8>>3],v)|0);i=d;return}else if((e|0)==6){aI(140288,10,1,a|0);i=d;return}else if((e|0)==2){cf(a|0,141944,(v=i,i=i+8|0,c[v>>2]=c[b+4>>2],v)|0);i=d;return}else if((e|0)==3){g=c[7642]|0;j=c[b+4>>2]|0;k=-1;while(1){l=k+1|0;m=c[g+(l<<3)>>2]|0;if((m|0)==0){n=0;break}if((c[g+(l<<3)+4>>2]|0)==(j|0)){n=m;break}else{k=l}}if(+h[b+8>>3]<0.0){aI(134760,14,1,a|0);i=d;return}if((n|0)==0){cf(a|0,131792,(v=i,i=i+8|0,c[v>>2]=j,v)|0);i=d;return}else{cf(a|0,133184,(v=i,i=i+8|0,c[v>>2]=n,v)|0);i=d;return}}else if((e|0)==1){cf(a|0,143432,(v=i,i=i+8|0,c[v>>2]=(c[b+4>>2]|0)+1,v)|0);i=d;return}else{i=d;return}}function jh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((c|0)==311){aI(121928,13,1,a|0);return}else if((c|0)==18){aI(129496,7,1,a|0);return}else if((c|0)==209){aI(103480,8,1,a|0);return}else if((c|0)==102){aI(120312,11,1,a|0);return}else if((c|0)==33){aI(128200,9,1,a|0);return}else if((c|0)==392){aI(114072,11,1,a|0);return}else if((c|0)==137){aI(104856,15,1,a|0);return}else if((c|0)==177){aI(104320,6,1,a|0);return}else if((c|0)==368){aI(98592,7,1,a|0);return}else if((c|0)==51){aI(126912,12,1,a|0);return}else if((c|0)==400){aI(98008,6,1,a|0);return}else if((c|0)==295){aI(124576,12,1,a|0);return}else if((c|0)==86){aI(116936,11,1,a|0);return}else if((c|0)==118){aI(116016,12,1,a|0);return}else if((c|0)==252){aI(100064,13,1,a|0);return}else if((c|0)==345){aI(110648,13,1,a|0);do{if((aY(b|0,107848)|0)==0){d=9320}else{if((aY(b|0,122960)|0)==0){d=9320;break}hF(43400,a)}}while(0);if((d|0)==9320){hF(43432,a)}aF(10,a|0);return}else if((c|0)==279){aI(123176,12,1,a|0);return}else if((c|0)==257){aI(100768,12,1,a|0);return}else if((c|0)==64){aI(125816,5,1,a|0);return}else if((c|0)==153){aI(115112,6,1,a|0);return}else if((c|0)==1){aI(130536,6,1,a|0);return}else if((c|0)==193){aI(103856,7,1,a|0);return}else if((c|0)==489){aI(96288,9,1,a|0);return}else if((c|0)==416){aI(97328,9,1,a|0);return}else if((c|0)==225){aI(101296,7,1,a|0);return}else if((c|0)==169){aI(105896,13,1,a|0);return}else if((c|0)==457){aI(96752,8,1,a|0);return}else if((c|0)==474){aI(99624,8,1,a|0);return}else if((c|0)==352){aI(99200,5,1,a|0);return}else{aI(95896,13,1,a|0);return}}function ji(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0;f=i;g=d+4|0;cf(b|0,95408,(v=i,i=i+8|0,c[v>>2]=(c[g>>2]|0)+1,v)|0);L12805:do{if((a[d+32|0]&1)!=0){aI(94936,10,1,b|0);j=d+40|0;k=c[j>>2]|0;if((k|0)==2){l=9373}else if((k|0)==1){cf(b|0,95144,(v=i,i=i+8|0,c[v>>2]=(c[d+44>>2]|0)+1,v)|0);break}do{if((l|0)==9373){if((c[g>>2]|0)!=-6){break}aI(93616,9,1,b|0);break L12805}}while(0);jg(b,j)}}while(0);cf(b|0,92904,(v=i,i=i+8|0,h[v>>3]=+h[d+16>>3],v)|0);if(!e){i=f;return}cf(b|0,92032,(v=i,i=i+8|0,c[v>>2]=(c[d+8>>2]|0)+1,v)|0);m=+h[d+24>>3];do{if(m==-3.0){aI(91352,19,1,b|0)}else{if(m==-2.0){aI(90696,18,1,b|0);break}else{cf(b|0,90312,(v=i,i=i+8|0,h[v>>3]=m,v)|0);break}}}while(0);cf(b|0,89624,(v=i,i=i+8|0,c[v>>2]=c[d+12>>2],v)|0);i=f;return}function jj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0;e=i;f=c[10818]|0;if((f|0)==0){g=0}else{j=(d|0)==0;k=0;l=f;while(1){f=c[l+12>>2]|0;L12830:do{if((f|0)==1){n=c[l+4>>2]|0;do{if(j){o=n}else{if((n|0)==(d|0)){o=d;break}if((f|0)==4){p=9449;break L12830}else if((f|0)==3){p=9431;break L12830}else if((f|0)==2){p=9419;break L12830}else{p=9448;break L12830}}}while(0);n=(c[m>>2]|0)==(b|0)?86152:85072;q=l+4|0;cf(b|0,87232,(v=i,i=i+16|0,c[v>>2]=n,c[v+8>>2]=o,v)|0);if((c[l+104>>2]|0)==1){aI(84272,7,1,b|0);n=c[l+112>>2]|0;if((n|0)==0){r=179864}else{r=c[53424+(n<<2)>>2]|0}s=+h[l+128>>3];t=c[l+116>>2]|0;if((t|0)==(n|0)){u=179864}else{u=c[53424+(t<<2)>>2]|0}w=+h[l+136>>3];n=c[l+120>>2]|0;if((n|0)==(t|0)){x=179864}else{x=c[53424+(n<<2)>>2]|0}y=+h[l+144>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=r,h[v+8>>3]=s,c[v+16>>2]=u,h[v+24>>3]=w,c[v+32>>2]=x,h[v+40>>3]=y,v)|0);aI(83624,6,1,b|0);n=c[l+152>>2]|0;if((n|0)==0){z=179864}else{z=c[53424+(n<<2)>>2]|0}y=+h[l+168>>3];t=c[l+156>>2]|0;if((t|0)==(n|0)){A=179864}else{A=c[53424+(t<<2)>>2]|0}w=+h[l+176>>3];n=c[l+160>>2]|0;if((n|0)==(t|0)){B=179864}else{B=c[53424+(n<<2)>>2]|0}s=+h[l+184>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=z,h[v+8>>3]=y,c[v+16>>2]=A,h[v+24>>3]=w,c[v+32>>2]=B,h[v+40>>3]=s,v)|0);C=1;D=q;break}else{aI(82592,5,1,b|0);n=c[l+192>>2]|0;if((n|0)==0){E=179864}else{E=c[53424+(n<<2)>>2]|0}s=+h[l+208>>3];t=c[l+196>>2]|0;if((t|0)==(n|0)){F=179864}else{F=c[53424+(t<<2)>>2]|0}w=+h[l+216>>3];n=c[l+200>>2]|0;if((n|0)==(t|0)){G=179864}else{G=c[53424+(n<<2)>>2]|0}y=+h[l+224>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=E,h[v+8>>3]=s,c[v+16>>2]=F,h[v+24>>3]=w,c[v+32>>2]=G,h[v+40>>3]=y,v)|0);aI(127448,4,1,b|0);n=c[l+232>>2]|0;if((n|0)==0){H=179864}else{H=c[53424+(n<<2)>>2]|0}y=+h[l+248>>3];t=c[l+236>>2]|0;if((t|0)==(n|0)){I=179864}else{I=c[53424+(t<<2)>>2]|0}w=+h[l+256>>3];n=c[l+240>>2]|0;if((n|0)==(t|0)){J=179864}else{J=c[53424+(n<<2)>>2]|0}s=+h[l+264>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=H,h[v+8>>3]=y,c[v+16>>2]=I,h[v+24>>3]=w,c[v+32>>2]=J,h[v+40>>3]=s,v)|0);C=1;D=q;break}}else if((f|0)==4){p=9449}else if((f|0)==3){p=9431}else if((f|0)==2){p=9419}else{p=9448}}while(0);L12875:do{if((p|0)==9419){p=0;q=c[l+4>>2]|0;do{if(j){K=q}else{if((q|0)==(d|0)){K=d;break}if((f|0)==4){p=9449;break L12875}else if((f|0)==3){p=9431;break L12875}else{p=9448;break L12875}}}while(0);q=(c[m>>2]|0)==(b|0)?86152:85072;n=l+4|0;cf(b|0,79696,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=K,v)|0);aI(84272,7,1,b|0);q=c[l+112>>2]|0;if((q|0)==0){L=179864}else{L=c[53424+(q<<2)>>2]|0}s=+h[l+128>>3];t=c[l+116>>2]|0;if((t|0)==(q|0)){M=179864}else{M=c[53424+(t<<2)>>2]|0}w=+h[l+136>>3];q=c[l+120>>2]|0;if((q|0)==(t|0)){N=179864}else{N=c[53424+(q<<2)>>2]|0}y=+h[l+144>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=L,h[v+8>>3]=s,c[v+16>>2]=M,h[v+24>>3]=w,c[v+32>>2]=N,h[v+40>>3]=y,v)|0);aI(83624,6,1,b|0);q=c[l+152>>2]|0;if((q|0)==0){O=179864}else{O=c[53424+(q<<2)>>2]|0}y=+h[l+168>>3];cf(b|0,78968,(v=i,i=i+16|0,c[v>>2]=O,h[v+8>>3]=y,v)|0);y=+h[l+192>>3];w=+h[l+200>>3];cf(b|0,78400,(v=i,i=i+16|0,h[v>>3]=y,h[v+8>>3]=w,v)|0);C=1;D=n}}while(0);L12893:do{if((p|0)==9431){p=0;n=c[l+4>>2]|0;do{if(j){P=n}else{if((n|0)==(d|0)){P=d;break}if((f|0)==4){p=9449;break L12893}else{p=9448;break L12893}}}while(0);n=(c[m>>2]|0)==(b|0)?86152:85072;q=l+4|0;cf(b|0,78048,(v=i,i=i+16|0,c[v>>2]=n,c[v+8>>2]=P,v)|0);aI(84272,7,1,b|0);n=c[l+112>>2]|0;if((n|0)==0){Q=179864}else{Q=c[53424+(n<<2)>>2]|0}w=+h[l+128>>3];t=c[l+116>>2]|0;if((t|0)==(n|0)){R=179864}else{R=c[53424+(t<<2)>>2]|0}y=+h[l+136>>3];n=c[l+120>>2]|0;if((n|0)==(t|0)){S=179864}else{S=c[53424+(n<<2)>>2]|0}s=+h[l+144>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=Q,h[v+8>>3]=w,c[v+16>>2]=R,h[v+24>>3]=y,c[v+32>>2]=S,h[v+40>>3]=s,v)|0);aI(83624,6,1,b|0);n=l+152|0;t=c[n>>2]|0;if((t|0)==0){T=179864}else{T=c[53424+(t<<2)>>2]|0}s=+h[l+168>>3];cf(b|0,78968,(v=i,i=i+16|0,c[v>>2]=T,h[v+8>>3]=s,v)|0);t=c[l+156>>2]|0;if((t|0)==(c[n>>2]|0)){U=179864}else{U=c[53424+(t<<2)>>2]|0}s=+h[l+176>>3];cf(b|0,77424,(v=i,i=i+16|0,c[v>>2]=U,h[v+8>>3]=s,v)|0);s=+h[l+192>>3];cf(b|0,76888,(v=i,i=i+8|0,h[v>>3]=s,v)|0);aI(76320,7,1,b|0);t=c[l+104>>2]|0;if((t|0)==2){aI(210848,2,1,b|0);C=1;D=q;break}else if((t|0)==0){aI(150688,2,1,b|0);C=1;D=q;break}else if((t|0)==1){aI(211336,2,1,b|0);C=1;D=q;break}else{C=1;D=q;break}}}while(0);do{if((p|0)==9448){p=0;C=k;D=l+4|0}else if((p|0)==9449){p=0;f=l+4|0;q=c[f>>2]|0;if(j){V=q}else{if((q|0)==(d|0)){V=d}else{C=k;D=f;break}}f=l+104|0;q=(c[m>>2]|0)==(b|0)?86152:85072;t=l+4|0;cf(b|0,74328,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=V,v)|0);q=f+4|0;if((c[q>>2]|0)!=0){aI(82592,5,1,b|0);n=c[q>>2]|0;W=c[n>>2]|0;if((W|0)==0){X=179864}else{X=c[53424+(W<<2)>>2]|0}s=+h[n+16>>3];Y=c[n+4>>2]|0;if((Y|0)==(W|0)){Z=179864}else{Z=c[53424+(Y<<2)>>2]|0}y=+h[n+24>>3];W=c[n+8>>2]|0;if((W|0)==(Y|0)){_=179864}else{_=c[53424+(W<<2)>>2]|0}w=+h[n+32>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=X,h[v+8>>3]=s,c[v+16>>2]=Z,h[v+24>>3]=y,c[v+32>>2]=_,h[v+40>>3]=w,v)|0)}n=f|0;if((c[n>>2]|0)>1){$=1}else{C=1;D=t;break}while(1){cf(b|0,((c[m>>2]|0)==(b|0)?73888:127448)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);f=c[q>>2]|0;W=c[f+($*40&-1)>>2]|0;if((W|0)==0){aa=179864}else{aa=c[53424+(W<<2)>>2]|0}w=+h[f+($*40&-1)+16>>3];Y=c[f+($*40&-1)+4>>2]|0;if((Y|0)==(W|0)){ab=179864}else{ab=c[53424+(Y<<2)>>2]|0}y=+h[f+($*40&-1)+24>>3];W=c[f+($*40&-1)+8>>2]|0;if((W|0)==(Y|0)){ac=179864}else{ac=c[53424+(W<<2)>>2]|0}s=+h[f+($*40&-1)+32>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aa,h[v+8>>3]=w,c[v+16>>2]=ab,h[v+24>>3]=y,c[v+32>>2]=ac,h[v+40>>3]=s,v)|0);f=$+1|0;if((f|0)<(c[n>>2]|0)){$=f}else{C=1;D=t;break}}}}while(0);t=(c[m>>2]|0)==(b|0)?86152:85072;n=c[D>>2]|0;cf(b|0,73592,(v=i,i=i+16|0,c[v>>2]=t,c[v+8>>2]=n,v)|0);n=c[l+8>>2]|0;if((n|0)>0){ad=150856}else{ad=(n|0)<0?121920:150704}cf(b|0,73368,(v=i,i=i+8|0,c[v>>2]=ad,v)|0);s=+h[l+64>>3];if(s!=0.0){cf(b|0,223096,(v=i,i=i+8|0,h[v>>3]=s,v)|0)}aI(222648,3,1,b|0);n=c[l+52>>2]|0;do{if((n|0)==-7){aI(126024,7,1,b|0)}else{if((a[l+80|0]&1)==0){t=n+1|0;cf(b|0,121528,(v=i,i=i+8|0,c[v>>2]=t,v)|0);break}else{jg(b,l+88|0);break}}}while(0);aI(220776,11,1,b|0);jf(b,l+16|0);n=c[l>>2]|0;if((n|0)==0){g=C;break}else{k=C;l=n}}}if((d|0)<1|g){i=e;return}else{uf(c[13898]|0,218968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0;e=i;i=i+384|0;f=e|0;g=e+48|0;j=e+96|0;k=e+144|0;l=e+224|0;m=e+304|0;n=c[64916+(d*688&-1)>>2]|0;o=n&3;p=56832+(d*24&-1)|0;if((o|0)==0){cf(b|0,128832,(v=i,i=i+8|0,c[v>>2]=p,v)|0);i=e;return}q=(a[65072+(d*688&-1)|0]&1)!=0?145600:128472;r=+h[65056+(d*688&-1)>>3];s=+h[65064+(d*688&-1)>>3];t=65032+(d*688&-1)|0;u=(c[t>>2]|0)!=0?185408:185368;cf(b|0,128728,(v=i,i=i+56|0,c[v>>2]=p,c[v+8>>2]=(o|0)==2?128640:149416,c[v+16>>2]=q,h[v+24>>3]=r,h[v+32>>3]=s,c[v+40>>2]=(n&4|0)!=0?179864:136208,c[v+48>>2]=u,v)|0);u=c[t>>2]|0;if((u|0)!=0){cf(b|0,128080,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}aI(216256,8,1,b|0);u=c[64984+(d*688&-1)>>2]|0;if((u|0)==0){w=179864}else{w=c[53424+(u<<2)>>2]|0}s=+h[65e3+(d*688&-1)>>3];t=c[64988+(d*688&-1)>>2]|0;if((t|0)==(u|0)){x=179864}else{x=c[53424+(t<<2)>>2]|0}r=+h[65008+(d*688&-1)>>3];u=c[64992+(d*688&-1)>>2]|0;if((u|0)==(t|0)){y=179864}else{y=c[53424+(u<<2)>>2]|0}z=+h[65016+(d*688&-1)>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=w,h[v+8>>3]=s,c[v+16>>2]=x,h[v+24>>3]=r,c[v+32>>2]=y,h[v+40>>3]=z,v)|0);do{if((a[65272+(d*688&-1)|0]&1)==0){aI(127936,12,1,b|0)}else{y=c[65128+(d*688&-1)>>2]|0;if((y|0)==2){aI(131280,6,1,b|0);break}else if((y|0)==0){aI(131440,5,1,b|0);break}else if((y|0)==1){aI(131216,7,1,b|0);break}else{break}}}while(0);cf(b|0,127832,(v=i,i=i+8|0,c[v>>2]=p,v)|0);y=64920+(d*688&-1)|0;x=c[y>>2]|0;do{if((x|0)==2){w=64952+(d*688&-1)|0;z=+h[w>>3];if(z!=-8.988465674311579e+307){if((c[64808+(d*688&-1)>>2]|0)==1){aF(34,b|0);u=k|0;t=64813+(d*688&-1)|0;r=+h[w>>3];t3(j,r);s=r- +O(+r);t4(u,80,t,j,s);t=j3(u)|0;aK(t|0,b|0);aF(34,b|0)}else{cf(b|0,92736,(v=i,i=i+8|0,h[v>>3]=z,v)|0)}aF(44,b|0)}z=+h[64960+(d*688&-1)>>3];cf(b|0,170912,(v=i,i=i+8|0,h[v>>3]=z,v)|0);t=64968+(d*688&-1)|0;if(+h[t>>3]==8.988465674311579e+307){break}aF(44,b|0);if((c[64808+(d*688&-1)>>2]|0)==1){aF(34,b|0);u=l|0;w=64813+(d*688&-1)|0;z=+h[t>>3];t3(g,z);s=z- +O(+z);t4(u,80,w,g,s);w=j3(u)|0;aK(w|0,b|0);aF(34,b|0);break}else{s=+h[t>>3];cf(b|0,92736,(v=i,i=i+8|0,h[v>>3]=s,v)|0);break}}else if((x|0)==1){aI(127656,9,1,b|0)}else if((x|0)==4){cf(b|0,127576,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}else if((x|0)==5){cf(b|0,127464,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}}while(0);cf(b|0,((a[65024+(d*688&-1)|0]&1)!=0?127160:127080)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);x=c[64924+(d*688&-1)>>2]|0;do{if((x|0)!=0){if((a[x]|0)==0){break}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=x,v)|0)}}while(0);x=64928+(d*688&-1)|0;if((c[x>>2]|0)!=0){aI(145280,10,1,b|0);jg(b,x)}aF(10,b|0);x=64944+(d*688&-1)|0;if((c[x>>2]|0)==0){i=e;return}g=(c[y>>2]|0)==3?179864:186440;cf(b|0,126896,(v=i,i=i+16|0,c[v>>2]=p,c[v+8>>2]=g,v)|0);aI(126656,2,1,b|0);g=c[x>>2]|0;if((g|0)!=0){x=64808+(d*688&-1)|0;p=m|0;m=64813+(d*688&-1)|0;d=g;do{g=d+12|0;do{if((c[g>>2]|0)<0){A=d+16|0}else{y=c[d+8>>2]|0;if((y|0)!=0){l=j3(y)|0;cf(b|0,103640,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}if((c[x>>2]|0)==1){aF(34,b|0);s=+h[d>>3];t3(f,s);z=s- +O(+s);t4(p,80,m,f,z);l=j3(p)|0;aK(l|0,b|0);aF(34,b|0)}else{z=+h[d>>3];cf(b|0,92736,(v=i,i=i+8|0,h[v>>3]=z,v)|0)}l=c[g>>2]|0;if((l|0)!=0){cf(b|0,95144,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}l=d+16|0;if((c[l>>2]|0)==0){A=l;break}aI(86120,2,1,b|0);A=l}}while(0);d=c[A>>2]|0;}while((d|0)!=0)}aI(84944,2,1,b|0);i=e;return}function jl(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;f=i;i=i+8|0;g=f|0;h=c[b>>2]|0;c[12918]=0;c[3530]=0;j=a[h]|0;if(j<<24>>24==0){k=0;l=c[3530]|0;m=c[1054]|0;n=m+(l*40&-1)+32|0;c[n>>2]=k;o=c[3530]|0;p=c[1054]|0;q=p+(o*40&-1)+36|0;c[q>>2]=0;r=c[3530]|0;s=c[1054]|0;t=s+(r*40&-1)|0;a[t]=1;u=c[3530]|0;i=f;return u|0}else{w=h;x=0;y=h;z=j;A=1}L13041:while(1){if((A|0)<(c[1052]|0)){B=z}else{dH();B=a[y]|0}L13046:do{if((aM(B&255|0)|0)==0){c[(c[1054]|0)+((c[3530]|0)*40&-1)+32>>2]=x;c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]=1;a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=1;j=a[y]|0;if(j<<24>>24==96){jm(b,e,x);C=x-1|0;D=c[b>>2]|0;break}L13051:do{if((bO(j&255|0)|0)==0){h=a[y]|0;if(h<<24>>24==95){E=x;F=9542;break}if(((h&255)-48|0)>>>0<10){a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;G=jn(y)|0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]=G;H=(x-1|0)+(c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]|0)|0;I=w;break}J=h<<24>>24;if((h<<24>>24|0)==46){if(((a[w+(x+1|0)|0]|0)-48|0)>>>0>=10){H=x;I=w;break}a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;G=jn(y)|0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]=G;H=(x-1|0)+(c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]|0)|0;I=w;break}else if((h<<24>>24|0)==39|(h<<24>>24|0)==34){G=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[G>>2]=(c[G>>2]|0)+1;G=a[y]|0;K=x+1|0;L=w+K|0;M=a[L]|0;if(M<<24>>24==G<<24>>24){H=K;I=w;break}N=G<<24>>24==34;O=G<<24>>24==39;P=w;Q=x;R=K;K=L;L=M;L13062:while(1){S=Q;T=R;U=K;M=L;L13064:while(1){if(M<<24>>24==0){break L13062}do{if(N&M<<24>>24==92){V=S+2|0;if((a[P+V|0]|0)==0){F=9567;break}W=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[W>>2]=(c[W>>2]|0)+2;X=V}else{F=9567}}while(0);L13070:do{if((F|0)==9567){F=0;do{if(N){if(M<<24>>24==96){break L13064}}else{if(!O){break}if((a[P+(S+2|0)|0]|0)!=39){break}V=S+3|0;if((a[P+V|0]|0)!=39){break}W=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[W>>2]=(c[W>>2]|0)+3;X=V;break L13070}}while(0);V=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[V>>2]=(c[V>>2]|0)+1;X=T}}while(0);V=X+1|0;W=P+V|0;Y=a[W]|0;if(Y<<24>>24==G<<24>>24){H=V;I=P;break L13051}else{S=X;T=V;U=W;M=Y}}jm(b,e,T);M=c[b>>2]|0;Y=S+1|0;W=M+Y|0;V=a[W]|0;if(V<<24>>24==34){H=Y;I=M;break L13051}else{P=M;Q=S;R=Y;K=W;L=V}}a[U]=G;a[P+(S+2|0)|0]=0;H=T;I=P;break}else if((h<<24>>24|0)==123){a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;L=x+1|0;K=c[3530]|0;R=c[1054]|0;Q=ca(w+L|0,153808,(v=i,i=i+24|0,c[v>>2]=R+(K*40&-1)+16,c[v+8>>2]=R+(K*40&-1)+24,c[v+16>>2]=g,v)|0)|0;if((Q|0)<1){c[12918]=(c[12918]|0)+1;K=c[3530]|0;c[3530]=K+1;a[(c[1054]|0)+(K*40&-1)|0]=1;C=x;D=w;break L13046}Z=c[3530]|0;if(!((Q|0)==3&(a[g]|0)==125)){F=9553;break L13041}Q=(c[1054]|0)+(Z*40&-1)+36|0;c[Q>>2]=(c[Q>>2]|0)+2;Q=L;while(1){L=Q+1|0;K=w+L|0;if((a[K]|0)==125){H=L;I=w;break L13051}R=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[R>>2]=(c[R>>2]|0)+1;if((a[K]|0)==0){F=9557;break L13041}else{Q=L}}}else{if((J|0)==35){k=x;F=9588;break L13041}else if((J|0)==125){c[12918]=(c[12918]|0)-1;H=x;I=w;break}else if((J|0)==94|(J|0)==43|(J|0)==45|(J|0)==47|(J|0)==37|(J|0)==126|(J|0)==40|(J|0)==41|(J|0)==91|(J|0)==93|(J|0)==59|(J|0)==58|(J|0)==63|(J|0)==44|(J|0)==36){H=x;I=w;break}else if((J|0)==33|(J|0)==60|(J|0)==62){Q=x+1|0;if((a[w+Q|0]|0)!=61){H=x;I=w;break}P=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[P>>2]=(c[P>>2]|0)+1;H=Q;I=w;break}else if((J|0)==38|(J|0)==124|(J|0)==61|(J|0)==42){Q=x+1|0;if(h<<24>>24!=(a[w+Q|0]|0)){H=x;I=w;break}P=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[P>>2]=(c[P>>2]|0)+1;H=Q;I=w;break}else{F=9581;break L13041}}}else{E=x;F=9542}}while(0);L13097:do{if((F|0)==9542){while(1){F=0;j=E+1|0;Q=w+j|0;if((bs(d[Q]|0|0)|0)==0){if((a[Q]|0)!=95){H=E;I=w;break L13097}}Q=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[Q>>2]=(c[Q>>2]|0)+1;E=j;F=9542}}}while(0);c[3530]=(c[3530]|0)+1;C=H;D=I}else{C=x;D=w}}while(0);h=C+1|0;j=D+h|0;Q=a[j]|0;if(Q<<24>>24==0){k=h;F=9587;break}w=D;x=h;y=j;z=Q;A=(c[3530]|0)+1|0}if((F|0)==9553){uf(Z,211216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((F|0)==9581){uf(c[3530]|0,134656,(v=i,i=i+8|0,c[v>>2]=J,v)|0);return 0}else if((F|0)==9588){l=c[3530]|0;m=c[1054]|0;n=m+(l*40&-1)+32|0;c[n>>2]=k;o=c[3530]|0;p=c[1054]|0;q=p+(o*40&-1)+36|0;c[q>>2]=0;r=c[3530]|0;s=c[1054]|0;t=s+(r*40&-1)|0;a[t]=1;u=c[3530]|0;i=f;return u|0}else if((F|0)==9557){uf(c[3530]|0,154312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((F|0)==9587){l=c[3530]|0;m=c[1054]|0;n=m+(l*40&-1)+32|0;c[n>>2]=k;o=c[3530]|0;p=c[1054]|0;q=p+(o*40&-1)+36|0;c[q>>2]=0;r=c[3530]|0;s=c[1054]|0;t=s+(r*40&-1)|0;a[t]=1;u=c[3530]|0;i=f;return u|0}return 0}function jm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+8|0;g=f|0;h=c[b>>2]|0;j=h+e|0;k=j;while(1){l=k+1|0;m=a[l]|0;if((m<<24>>24|0)==0|(m<<24>>24|0)==96){break}else{k=l}}m=l-j|0;n=ut(m)|0;do{if((n|0)==0){gk();o=ut(m)|0;if((o|0)!=0){p=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=121896,v)|0)}else{p=n}}while(0);n=h+(e+1|0)|0;uF(p|0,n|0,m|0);if((uA(n|0)|0)>>>0>=m>>>0){a[p+((l|0)==(j|0)?0:m-1|0)|0]=0}do{if((a[l]|0)==0){q=0;r=0}else{m=k+2|0;j=(uA(m|0)|0)+1|0;if(j>>>0<=1){q=j;r=0;break}n=ut(j)|0;do{if((n|0)==0){gk();h=ut(j)|0;if((h|0)!=0){s=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=104824,v)|0)}else{s=n}}while(0);uB(s|0,m|0);q=j;r=s}}while(0);eo(p,g);uu(p);p=c[g>>2]|0;g=0;s=e;while(1){e=g+1|0;k=a[p+g|0]|0;if((k<<24>>24|0)==0){break}else if((k<<24>>24|0)==10|(k<<24>>24|0)==13){t=s}else{a[(c[b>>2]|0)+s|0]=k;t=s+1|0}if((t|0)!=(c[d>>2]|0)){g=e;s=t;continue}dG();g=e;s=t}a[(c[b>>2]|0)+s|0]=0;uu(p);if((r|0)==0){a[25280]=0;i=f;return}p=s+q|0;if(p>>>0>(c[d>>2]|0)>>>0){do{dG();}while(p>>>0>(c[d>>2]|0)>>>0)}uB((c[b>>2]|0)+s|0,r|0);uu(r);a[25280]=0;i=f;return}function jn(b){b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0;e=i;i=i+8|0;f=e|0;a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=1;g=0;while(1){j=a[b+g|0]|0;if(((j&255)-48|0)>>>0<10){g=g+1|0}else{break}}if(j<<24>>24==46){c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;k=g;while(1){l=k+1|0;m=a[b+l|0]|0;if(((m&255)-48|0)>>>0<10){k=l}else{n=l;o=m;break}}}else{n=g;o=j}if((o<<24>>24|0)==101|(o<<24>>24|0)==69){c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;o=n+1|0;j=a[b+o|0]|0;if((j<<24>>24|0)==45|(j<<24>>24|0)==43){g=n+2|0;p=g;q=a[b+g|0]|0}else{p=o;q=j}if(((q&255)-48|0)>>>0<10){q=p;while(1){j=q+1|0;if(((d[b+j|0]|0)-48|0)>>>0<10){q=j}else{r=j;break}}}else{q=(c[1054]|0)+((c[3530]|0)*40&-1)+32|0;c[q>>2]=(c[q>>2]|0)+p;uf(c[3530]|0,97936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}else{r=n}n=c[3530]|0;p=c[1054]|0;do{if((c[p+(n*40&-1)+8>>2]|0)==1){c[b0()>>2]=0;q=aE(b|0,f|0,0)|0;j=(c[b0()>>2]|0)==0;o=c[3530]|0;if(!j){uh(o,91904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;s=c[3530]|0;t=c[1054]|0;break}c[(c[1054]|0)+(o*40&-1)+16>>2]=q;u=(c[f>>2]|0)-b|0;i=e;return u|0}else{s=n;t=p}}while(0);h[t+(s*40&-1)+24>>3]=0.0;w=+uz(b,0);h[(c[1054]|0)+((c[3530]|0)*40&-1)+16>>3]=w;u=r;i=e;return u|0}function jo(){var d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,bf=0,bg=0,bh=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0,bD=0,bE=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,cb=0,cc=0,cd=0,ce=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cy=0,cA=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0,dk=0,dm=0,dn=0,dp=0,dq=0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0,dC=0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0,dR=0,dS=0,dT=0,dU=0,dV=0,dW=0,dX=0,dY=0,dZ=0,d_=0,d$=0,d0=0,d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0,eb=0,ec=0,ed=0,ee=0,ef=0,eg=0,eh=0,ei=0,ej=0,ek=0,el=0,em=0,en=0,eo=0,ep=0,eq=0,er=0,es=0,et=0,eu=0,ev=0,ew=0,ex=0,eA=0,eB=0,eD=0,eE=0,eF=0,eG=0,eH=0,eI=0,eJ=0,eK=0,eL=0,eM=0,eN=0,eO=0,eQ=0,eR=0,eS=0,eT=0,eU=0,eV=0,eW=0,eX=0,eY=0,eZ=0,e_=0,e$=0,e0=0,e2=0,e3=0,e4=0,e5=0,e6=0,e8=0,e9=0,fa=0,fb=0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0,fi=0,fj=0,fk=0,fl=0,fm=0,fn=0,fo=0,fp=0,fq=0,fr=0,fs=0,ft=0,fu=0,fv=0,fw=0,fx=0,fy=0,fz=0,fA=0,fB=0,fC=0,fD=0,fE=0,fF=0,fG=0,fH=0,fI=0,fJ=0,fK=0,fL=0,fM=0,fN=0,fO=0,fP=0,fQ=0,fS=0,fT=0,fU=0,fV=0,fW=0,fX=0,fY=0,fZ=0,f_=0,f$=0,f0=0,f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0,f8=0,f9=0,ga=0,gb=0,gc=0,gd=0,ge=0,gf=0,gg=0,gh=0,gi=0,gj=0,gl=0,gm=0,gn=0,go=0,gp=0,gq=0,gs=0,gt=0,gu=0,gv=0,gw=0,gx=0,gy=0,gz=0,gA=0,gB=0,gC=0,gD=0,gE=0,gF=0,gG=0,gH=0,gI=0,gJ=0,gK=0,gL=0,gM=0,gN=0,gO=0,gP=0,gQ=0,gR=0,gS=0,gT=0,gU=0,gV=0,gW=0,gX=0.0,gY=0,gZ=0,g_=0,g$=0,g0=0,g1=0,g2=0,g3=0,g4=0,g5=0,g6=0,g7=0,g8=0,g9=0,ha=0,hb=0,hc=0.0,hd=0,he=0,hf=0,hg=0,hh=0,hi=0,hj=0,hk=0,hl=0,hm=0,hn=0,ho=0,hp=0,hq=0,hr=0,hs=0,ht=0,hu=0,hv=0,hw=0,hx=0,hy=0,hA=0,hB=0,hC=0,hF=0,hG=0,hK=0,hN=0,hP=0,hQ=0,hR=0,hS=0,hT=0,hU=0,hV=0,hW=0,hY=0,hZ=0,h_=0,h$=0,h0=0,h1=0,h2=0,h3=0,h4=0,h5=0,h6=0,h7=0,h8=0,h9=0,ia=0,ib=0,ic=0,id=0,ie=0,ig=0,ih=0,ii=0,ij=0,ik=0,il=0,im=0,io=0,ip=0,iq=0,ir=0,iu=0,iv=0,iy=0,iz=0,iA=0,iB=0,iC=0,iD=0,iE=0,iF=0,iG=0,iH=0,iI=0,iJ=0,iK=0,iL=0,iM=0,iN=0,iP=0,iR=0,iS=0,iT=0,iU=0,iV=0,iW=0,iX=0,iZ=0,i_=0,i$=0,i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,ja=0,jb=0,jc=0,jd=0,je=0,jf=0,jg=0,jh=0,ji=0,jj=0,jk=0,jl=0,jm=0,jn=0,jo=0,jy=0,jz=0,jA=0,jB=0,jC=0,jD=0,jE=0,jF=0,jG=0,jH=0,jI=0,jJ=0,jK=0,jL=0,jM=0,jN=0,jO=0,jP=0,jQ=0,jR=0,jS=0,jT=0,jU=0,jV=0,jW=0,jX=0,jY=0,jZ=0,j_=0,j$=0,j0=0,j1=0,j2=0,j3=0,j4=0,j5=0,j6=0,j7=0,j8=0,j9=0,ka=0,kb=0,kc=0,kd=0,ke=0,kf=0,kg=0,kh=0,ki=0,kj=0,kk=0,kl=0,km=0,kn=0,ko=0,kp=0,kq=0,kr=0,ks=0,kt=0,ku=0,kv=0,kw=0,kx=0,ky=0,kz=0,kA=0,kB=0,kC=0,kD=0,kE=0,kF=0,kG=0,kH=0,kI=0,kJ=0,kK=0,kL=0,kM=0,kN=0,kO=0,kP=0,kQ=0,kR=0,kS=0,kT=0,kU=0,kV=0,kW=0,kX=0,kY=0,kZ=0,k_=0,k$=0,k0=0,k1=0,k2=0,k3=0.0,k4=0,k5=0,k6=0,k7=0,k8=0,k9=0,la=0.0,lb=0.0,lc=0,ld=0,le=0,lf=0,lg=0,lh=0,li=0,lk=0,lm=0,ln=0,lo=0,lp=0,lq=0,lr=0,lt=0,lu=0,lv=0,lw=0,lx=0,ly=0,lA=0,lB=0,lC=0,lD=0,lE=0,lF=0,lG=0,lH=0,lI=0,lJ=0,lK=0,lL=0,lM=0,lN=0,lO=0,lP=0,lQ=0,lR=0,lS=0,lT=0,lU=0,lV=0.0,lW=0,lX=0,lY=0,lZ=0,l_=0,l$=0,l0=0,l1=0,l2=0,l3=0,l4=0,l5=0,l6=0,l7=0,l8=0,l9=0,ma=0,mb=0,mc=0,md=0,me=0,mf=0,mg=0,mh=0,mi=0,mj=0,mk=0.0,ml=0,mm=0,mn=0,mo=0,mp=0.0,mq=0,mr=0,ms=0,mt=0,mu=0,mv=0,mw=0,mx=0,my=0,mz=0,mA=0.0,mB=0,mC=0.0,mD=0,mE=0,mF=0.0,mG=0,mH=0,mI=0.0,mJ=0.0,mK=0,mL=0,mM=0.0,mN=0,mO=0,mP=0,mQ=0,mR=0,mS=0,mT=0,mU=0,mV=0,mW=0,mX=0,mY=0,mZ=0,m_=0,m$=0,m0=0,m1=0,m2=0.0,m3=0.0,m4=0.0,m5=0.0,m6=0,m7=0,m8=0,m9=0,na=0,nb=0.0,nc=0.0,nd=0,ne=0,nf=0,ng=0,nh=0,ni=0,nj=0,nk=0,nl=0,nm=0,nn=0,no=0,np=0,nq=0.0,nr=0.0,ns=0,nt=0,nu=0,nv=0.0,nw=0,nx=0,ny=0,nz=0.0,nA=0.0,nB=0.0,nC=0.0,nD=0.0,nE=0,nF=0,nG=0,nH=0,nI=0,nJ=0,nK=0,nL=0,nM=0,nN=0,nO=0,nP=0,nQ=0,nR=0,nS=0,nT=0,nU=0,nV=0,nW=0,nX=0,nY=0,nZ=0,n_=0,n$=0,n0=0,n1=0,n2=0,n3=0,n4=0,n5=0,n6=0,n7=0,n8=0,n9=0,oa=0,ob=0,oc=0,od=0,oe=0,of=0,og=0,oh=0,oi=0,oj=0,ok=0,ol=0,om=0,on=0,oo=0,op=0,oq=0,or=0,os=0,ot=0,ou=0,ov=0,ow=0,ox=0,oy=0,oz=0,oA=0,oB=0,oC=0,oD=0,oE=0,oF=0,oG=0,oH=0,oI=0,oJ=0,oK=0,oL=0,oM=0,oN=0,oO=0,oP=0,oQ=0,oR=0,oS=0,oT=0,oU=0,oV=0,oW=0,oX=0,oY=0,oZ=0,o_=0,o$=0,o0=0,o1=0,o2=0,o3=0,o4=0,o5=0,o6=0,o7=0,o8=0,o9=0,pa=0,pb=0,pc=0,pd=0,pe=0,pf=0,pg=0,ph=0,pi=0,pj=0,pk=0,pl=0,pm=0,pn=0,po=0,pp=0,pq=0,pr=0,ps=0,pt=0,pu=0,pv=0,pw=0,px=0,py=0,pz=0,pA=0,pB=0,pC=0,pD=0,pE=0,pF=0,pG=0,pH=0,pI=0,pJ=0,pK=0,pL=0,pM=0,pN=0,pO=0,pP=0,pQ=0,pR=0,pS=0,pT=0,pU=0,pV=0,pW=0,pX=0,pY=0,pZ=0,p_=0,p$=0,p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0,p8=0,p9=0,qa=0,qb=0,qc=0,qd=0,qe=0,qf=0,qg=0,qh=0,qi=0,qj=0,qk=0,ql=0,qm=0,qn=0,qo=0,qp=0,qq=0,qr=0,qs=0,qt=0,qu=0,qv=0,qw=0,qx=0,qy=0,qz=0,qA=0,qB=0,qC=0,qD=0,qE=0,qF=0,qG=0.0,qH=0,qI=0,qJ=0,qK=0,qL=0,qM=0,qN=0,qO=0.0,qP=0,qQ=0,qR=0,qS=0.0,qT=0,qU=0,qV=0,qW=0,qX=0,qY=0,qZ=0,q_=0,q$=0,q0=0,q1=0,q2=0,q3=0,q4=0,q5=0,q6=0.0,q7=0.0,q8=0.0,q9=0.0,ra=0.0,rb=0,rc=0,rd=0,re=0,rf=0,rg=0,rh=0,ri=0,rj=0,rk=0.0,rl=0,rm=0,rn=0,ro=0,rp=0.0,rq=0,rr=0.0,rs=0,rt=0,ru=0,rv=0,rw=0,rx=0,ry=0,rz=0,rA=0,rB=0,rC=0,rD=0,rE=0,rF=0,rG=0,rH=0,rI=0,rJ=0,rK=0,rL=0,rM=0,rN=0,rO=0,rP=0,rQ=0,rR=0.0,rS=0,rT=0,rU=0,rV=0,rW=0,rX=0,rY=0,rZ=0,r_=0,r$=0,r0=0,r1=0,r2=0,r3=0,r4=0.0,r5=0,r6=0,r7=0,r8=0,r9=0,sa=0,sb=0,sc=0,sd=0,se=0,sf=0,sg=0,sh=0,si=0,sj=0,sk=0,sl=0,sm=0,sn=0,so=0,sp=0,sq=0,sr=0,ss=0,st=0,su=0,sv=0,sw=0,sx=0,sy=0.0,sz=0.0,sA=0,sB=0,sC=0,sD=0,sE=0,sF=0,sG=0,sH=0,sI=0,sJ=0,sK=0,sL=0,sM=0,sN=0,sO=0,sP=0,sQ=0,sR=0,sS=0,sT=0,sU=0,sV=0,sW=0,sX=0,sY=0,sZ=0,s_=0,s$=0,s0=0,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,s7=0,s8=0,s9=0,ta=0,tb=0,tc=0,td=0,te=0,tf=0,tg=0,th=0,ti=0,tj=0,tk=0,tl=0,tm=0,tn=0,to=0,tp=0,tq=0,tr=0,ts=0,tt=0,tu=0,tv=0,tw=0,tx=0,ty=0,tz=0,tA=0,tB=0,tC=0,tD=0,tE=0,tF=0,tG=0.0,tH=0,tI=0,tJ=0,tK=0,tL=0,tM=0,tN=0,tO=0,tP=0,tQ=0,tR=0,tS=0,tT=0,tU=0,tV=0,tW=0,tX=0,tY=0,tZ=0,t_=0,t$=0,t0=0,t1=0,t2=0,t3=0,t4=0,t6=0,t7=0,t8=0,t9=0,ub=0,uc=0,ue=0,ug=0,ui=0,ul=0,um=0,un=0,uo=0,up=0,uv=0,uw=0,ux=0,uy=0,uC=0,uG=0,uH=0,uI=0,uJ=0,uK=0,uL=0,uM=0,uN=0,uO=0,uP=0,uQ=0,uR=0,uS=0,uT=0,uU=0,uV=0,uW=0,uX=0,uY=0,uZ=0,u_=0,u$=0,u0=0,u1=0,u2=0,u3=0,u4=0,u5=0,u6=0,u7=0.0,u8=0,u9=0,va=0,vb=0,vc=0,vd=0,ve=0.0,vf=0,vg=0,vh=0,vi=0,vj=0,vk=0,vl=0,vm=0,vn=0,vo=0,vp=0,vq=0,vr=0,vs=0,vt=0.0,vu=0,vv=0,vw=0.0,vx=0,vy=0,vz=0.0,vA=0,vB=0,vC=0.0,vD=0.0,vE=0,vF=0.0,vG=0.0,vH=0,vI=0,vJ=0,vK=0,vL=0,vM=0,vN=0,vO=0,vP=0,vQ=0,vR=0,vS=0,vT=0,vU=0.0,vV=0,vW=0.0,vX=0,vY=0,vZ=0,v_=0,v$=0,v0=0,v1=0,v2=0,v3=0,v4=0,v5=0,v6=0,v7=0,v8=0,v9=0,wa=0,wb=0.0,wc=0,wd=0,we=0,wf=0,wg=0,wh=0,wi=0,wj=0,wk=0,wl=0,wm=0,wn=0,wo=0,wp=0,wq=0,wr=0,ws=0,wt=0,wu=0,wv=0.0,ww=0.0,wx=0.0,wy=0.0,wz=0,wA=0,wB=0,wC=0,wD=0.0,wE=0,wF=0,wG=0,wH=0,wI=0,wJ=0.0,wK=0,wL=0,wM=0.0,wN=0,wO=0,wP=0,wQ=0,wR=0,wS=0,wT=0,wU=0,wV=0,wW=0,wX=0,wY=0,wZ=0,w_=0,w$=0,w0=0.0,w1=0,w2=0,w3=0,w4=0,w5=0,w6=0.0,w7=0.0,w8=0.0,w9=0.0,xa=0.0,xb=0.0,xc=0,xd=0,xe=0,xf=0,xg=0,xh=0,xi=0,xj=0,xk=0,xl=0,xm=0,xn=0,xo=0,xp=0.0,xq=0.0,xr=0.0,xs=0.0,xt=0.0,xu=0.0,xv=0,xw=0,xx=0,xy=0,xz=0,xA=0,xB=0,xC=0,xD=0,xE=0,xF=0,xG=0,xH=0,xI=0,xJ=0,xK=0,xL=0,xM=0,xN=0.0,xO=0,xP=0,xQ=0,xR=0,xS=0,xT=0,xU=0,xV=0,xW=0,xX=0,xY=0,xZ=0,x_=0.0,x$=0,x0=0,x1=0.0,x2=0.0,x3=0.0,x4=0.0,x5=0,x6=0,x7=0,x8=0,x9=0,ya=0,yb=0,yc=0,yd=0,ye=0,yf=0,yg=0,yh=0,yi=0,yj=0,yk=0,yl=0,ym=0,yn=0,yo=0,yp=0,yq=0,yr=0,ys=0,yt=0,yu=0,yv=0,yw=0,yx=0,yy=0.0,yz=0,yA=0,yB=0,yC=0,yD=0,yE=0,yF=0,yG=0,yH=0,yI=0,yJ=0,yK=0,yL=0,yM=0,yN=0,yO=0,yP=0,yQ=0,yR=0,yS=0,yT=0.0,yU=0,yV=0,yW=0,yX=0.0,yY=0,yZ=0,y_=0,y$=0,y0=0,y1=0,y2=0,y3=0,y4=0,y5=0,y6=0,y7=0,y8=0,y9=0,za=0,zb=0,zc=0.0,zd=0,ze=0,zf=0,zg=0,zh=0,zi=0,zj=0,zk=0.0,zl=0.0,zm=0,zn=0,zo=0,zp=0,zq=0,zr=0,zs=0,zt=0,zu=0,zv=0,zw=0,zx=0,zy=0,zz=0,zA=0,zB=0,zC=0.0,zD=0,zE=0,zF=0,zG=0,zH=0,zI=0,zJ=0,zK=0,zL=0,zM=0,zN=0,zO=0,zP=0,zQ=0,zR=0,zS=0,zT=0,zU=0.0,zV=0,zW=0,zX=0,zY=0,zZ=0,z_=0,z$=0,z0=0,z1=0,z2=0,z3=0,z4=0,z5=0,z6=0,z7=0,z8=0,z9=0,Aa=0,Ab=0,Ac=0,Ad=0,Ae=0,Af=0,Ag=0,Ah=0,Ai=0,Aj=0,Ak=0,Al=0,Am=0,An=0,Ao=0,Ap=0,Aq=0,Ar=0,As=0,At=0,Au=0,Av=0,Aw=0,Ax=0,Ay=0,Az=0,AA=0,AB=0,AC=0,AD=0.0,AE=0,AF=0,AG=0,AH=0,AI=0,AJ=0,AK=0,AL=0.0,AM=0,AN=0,AO=0,AP=0,AQ=0,AR=0,AS=0,AT=0,AU=0,AV=0,AW=0,AX=0,AY=0,AZ=0,A_=0,A$=0,A0=0,A1=0,A2=0,A3=0,A4=0,A5=0,A6=0,A7=0,A8=0,A9=0,Ba=0,Bb=0,Bc=0,Bd=0,Be=0,Bf=0,Bg=0.0,Bh=0,Bi=0,Bj=0,Bk=0,Bl=0,Bm=0.0,Bn=0,Bo=0,Bp=0,Bq=0,Br=0,Bs=0,Bt=0,Bu=0,Bv=0,Bw=0,Bx=0,By=0,Bz=0,BA=0,BB=0,BC=0.0,BD=0,BE=0,BF=0,BG=0,BH=0,BI=0,BJ=0,BK=0,BL=0,BM=0,BN=0,BO=0,BP=0,BQ=0,BR=0,BS=0.0,BT=0,BU=0,BV=0,BW=0,BX=0,BY=0,BZ=0,B_=0,B$=0,B0=0,B1=0,B2=0,B3=0,B4=0,B5=0,B6=0,B7=0,B8=0,B9=0,Ca=0,Cb=0,Cc=0,Cd=0,Ce=0,Cf=0,Cg=0,Ch=0,Ci=0,Cj=0,Ck=0,Cl=0,Cm=0,Cn=0,Co=0,Cp=0,Cq=0,Cr=0,Cs=0,Ct=0,Cu=0,Cv=0,Cw=0,Cx=0,Cy=0,Cz=0,CA=0,CB=0,CC=0,CD=0,CE=0,CF=0,CG=0,CH=0,CI=0,CJ=0,CK=0,CL=0,CM=0,CN=0,CO=0,CP=0,CQ=0,CR=0,CS=0,CT=0,CU=0,CV=0,CW=0,CX=0,CY=0,CZ=0,C_=0,C$=0,C0=0,C1=0,C2=0,C3=0.0,C4=0.0,C5=0.0,C6=0,C7=0,C8=0,C9=0,Da=0,Db=0.0,Dc=0,Dd=0,De=0,Df=0,Dg=0,Dh=0,Di=0,Dj=0,Dk=0,Dl=0,Dm=0,Dn=0,Do=0,Dp=0,Dq=0,Dr=0,Ds=0,Dt=0,Du=0,Dv=0,Dw=0,Dx=0,Dy=0,Dz=0,DA=0,DB=0,DC=0,DD=0,DE=0,DF=0,DG=0,DH=0,DI=0,DJ=0,DK=0,DL=0,DM=0,DN=0,DO=0,DP=0,DQ=0,DR=0,DS=0,DT=0,DU=0,DV=0,DW=0,DX=0,DY=0,DZ=0,D_=0,D$=0.0,D0=0.0,D1=0.0,D2=0,D3=0.0,D4=0,D5=0,D6=0,D7=0,D8=0,D9=0,Ea=0,Eb=0,Ec=0,Ed=0,Ee=0,Ef=0,Eg=0,Eh=0,Ei=0,Ej=0,Ek=0,El=0,Em=0,En=0,Eo=0,Ep=0,Eq=0,Er=0,Es=0,Et=0,Eu=0,Ev=0,Ew=0,Ex=0,Ey=0,Ez=0,EA=0,EB=0,EC=0,ED=0,EE=0,EF=0,EG=0,EH=0,EI=0,EJ=0,EK=0,EL=0,EM=0,EN=0,EO=0,EP=0,EQ=0,ER=0,ES=0,ET=0,EU=0,EV=0.0,EW=0.0,EX=0,EY=0,EZ=0,E_=0,E$=0,E0=0,E1=0,E2=0,E3=0,E4=0,E5=0,E6=0,E7=0,E8=0.0,E9=0.0,Fa=0.0,Fb=0.0,Fc=0.0,Fd=0.0,Fe=0,Ff=0,Fg=0,Fh=0.0,Fi=0,Fj=0.0,Fk=0,Fl=0,Fm=0,Fn=0.0,Fo=0.0,Fp=0,Fq=0,Fr=0,Fs=0,Ft=0,Fu=0,Fv=0,Fw=0,Fx=0,Fy=0,Fz=0;d=i;i=i+3552|0;e=d|0;f=d+24|0;j=d+48|0;k=d+72|0;l=d+96|0;n=d+120|0;o=d+144|0;p=d+168|0;q=d+192|0;r=d+216|0;s=d+240|0;t=d+264|0;u=d+288|0;x=d+312|0;y=d+336|0;z=d+360|0;A=d+384|0;B=d+408|0;C=d+432|0;D=d+456|0;E=d+480|0;F=d+504|0;G=d+544|0;H=d+560|0;I=d+584|0;J=d+608|0;K=d+632|0;L=d+656|0;M=d+680|0;N=d+704|0;O=d+728|0;R=d+752|0;S=d+776|0;T=d+968|0;U=d+992|0;V=d+1016|0;W=d+1040|0;X=d+1064|0;Y=d+1088|0;Z=d+1112|0;$=d+1136|0;ab=d+1160|0;ac=d+1184|0;ad=d+1208|0;ae=d+1216|0;af=d+1240|0;ag=d+1264|0;ah=d+1288|0;ai=d+1312|0;aj=d+1368|0;ak=d+1392|0;al=d+1424|0;am=d+1448|0;an=d+1472|0;ao=d+1496|0;ap=d+1520|0;aq=d+1544|0;ar=d+1552|0;as=d+1560|0;at=d+1568|0;au=d+1592|0;av=d+1616|0;aw=d+1640|0;ax=d+1664|0;ay=d+1688|0;aA=d+1712|0;aB=d+1736|0;aC=d+1760|0;aD=d+1784|0;aE=d+1808|0;aF=d+1832|0;aH=d+1840|0;aJ=d+1864|0;aK=d+1888|0;aL=d+1912|0;aM=d+1936|0;aN=d+1960|0;aO=d+1984|0;aP=d+2008|0;aR=d+2032|0;aS=d+2056|0;aT=d+2080|0;aU=d+2104|0;aV=d+2128|0;aW=d+2152|0;aX=d+2176|0;aZ=d+2184|0;a$=d+2192|0;a0=d+2216|0;a1=d+2240|0;a2=d+2280|0;a3=d+2304|0;a4=d+2328|0;a5=d+2352|0;a6=d+2368|0;a7=d+2392|0;a8=d+2416|0;a9=d+2424|0;ba=d+2448|0;bb=d+2472|0;bc=d+2496|0;bd=d+2528|0;bf=d+2552|0;bg=d+2576|0;bh=d+2600|0;bj=d+2624|0;bk=d+2648|0;bl=d+2672|0;bm=d+2696|0;bn=d+2720|0;bo=d+2744|0;bp=d+2768|0;bq=d+2792|0;br=d+2808|0;bs=d+2832|0;bt=d+2856|0;bu=d+2880|0;bv=d+2904|0;bw=d+2912|0;bx=d+2936|0;by=d+2944|0;bz=d+2952|0;bB=d+2960|0;bC=d+2968|0;bD=d+2976|0;bE=d+3e3|0;bG=d+3024|0;bH=d+3048|0;bI=d+3072|0;bJ=d+3096|0;bK=d+3120|0;bL=d+3144|0;bM=d+3168|0;bN=d+3192|0;bO=d+3216|0;bQ=d+3240|0;bR=d+3264|0;bS=d+3288|0;bT=d+3312|0;bV=d+3336|0;bW=d+3360|0;bX=d+3384|0;bY=d+3408|0;bZ=d+3432|0;b_=d+3456|0;b0=d+3480|0;b1=d+3504|0;b2=d+3528|0;b3=(c[13898]|0)+1|0;c[13898]=b3;b4=c[1054]|0;b5=c[b4+(b3*40&-1)+32>>2]|0;b6=c[10036]|0;do{if((a[b6+b5|0]|0)==110){if((a[b6+(b5+1|0)|0]|0)!=111){b7=6;break}if((a[37400]&1)==0){b8=b3;b9=b4;cb=b5}else{uh(b3,153488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cc=c[13898]|0;cd=c[1054]|0;b8=cc;b9=cd;cb=c[cd+(cc*40&-1)+32>>2]|0}c[b9+(b8*40&-1)+32>>2]=cb+2;cc=(c[1054]|0)+((c[13898]|0)*40&-1)+36|0;c[cc>>2]=(c[cc>>2]|0)-2;c[13898]=(c[13898]|0)-1;t5()}else{b7=6}}while(0);L7:do{if((b7|0)==6){cb=iw()|0;c[6074]=cb;do{if((cb|0)!=0){if((a[cb+38|0]&1)==0){break}b8=c[13898]|0;b9=c[8272]|0;L12:do{if((b8|0)<(b9|0)){b3=c[1054]|0;b5=b8;while(1){L16:do{if((a[b3+(b5*40&-1)|0]&1)!=0){b4=c[b3+(b5*40&-1)+36>>2]|0;b6=b3+(b5*40&-1)+32|0;cc=c[10036]|0;cd=0;while(1){if((cd|0)>=(b4|0)){break}if((a[cc+((c[b6>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{break L16}}if((cd|0)==1){ce=cb;break L12}}}while(0);b6=b5+1|0;c[13898]=b6;if((b6|0)<(b9|0)){b5=b6}else{ce=cb;break}}}else{ce=cb}}while(0);while(1){b9=c[ce>>2]|0;uu(c[ce+12>>2]|0);uu(ce);if((b9|0)==0){break}else{ce=b9}}i=d;return}}while(0);cb=c[13898]|0;b9=b2|0;b8=b2+8|0;b5=b0|0;b3=b1|0;b6=b_|0;cc=b_+8|0;b4=bZ|0;cg=bZ+8|0;ch=bY|0;ci=bY+8|0;cj=bX|0;ck=bX+8|0;cl=bW|0;cm=bW+8|0;cn=bT|0;co=bT+8|0;cp=bS|0;cq=bS+8|0;cr=bR|0;cs=bR+8|0;ct=bQ|0;cu=bQ+8|0;cv=bO|0;cw=bO+8|0;cx=bN|0;cy=bN+8|0;cA=bM|0;cC=bM+8|0;cD=bV|0;cE=bV+8|0;cF=bI|0;cG=bI+8|0;cH=bH|0;cI=bH+8|0;cJ=bG|0;cK=bG+8|0;cL=bL|0;cM=bL+8|0;cN=bK|0;cO=bK+8|0;cP=bJ|0;cQ=bJ+8|0;cR=bE|0;cT=bE+8|0;cU=bD|0;cV=bD+8|0;cW=bx|0;cX=bw|0;cY=bw+8|0;cZ=bu|0;c_=bu+8|0;c$=bt|0;c0=bt+8|0;c1=bs|0;c2=bs+8|0;c3=br|0;c4=br+8|0;c5=bq;c6=bp|0;c7=bp+8|0;c8=bo|0;c9=bo+8|0;da=bn|0;dc=bn+8|0;dd=bm|0;de=bm+8|0;df=bl|0;dg=bl+8|0;dh=bk|0;di=bk+8|0;dj=bj|0;dk=bj+8|0;dm=bq|0;dn=bq+8|0;dp=bh|0;dq=bh+8|0;dr=bg|0;ds=bg+8|0;dt=bf|0;du=bf+8|0;dv=bd|0;dw=bd+8|0;dx=bc|0;dy=bb|0;dz=bb+8|0;dA=dz;dB=dz;dz=bb+8|0;dC=a9|0;dD=a9+8|0;dE=ba|0;dF=ba+8|0;dG=a7|0;dH=a7+8|0;dI=a6|0;dJ=a6+8|0;dK=a5|0;dL=a4|0;dM=a4+8|0;dN=a2|0;dO=a2+8|0;dP=a3|0;dQ=a3+8|0;dR=a0+4|0;dS=a0+8|0;dT=aW+4|0;dU=aW+8|0;dV=aT|0;dW=aT+8|0;dX=aS|0;dY=aS+8|0;dZ=aP|0;d_=aP+8|0;d$=aO|0;d0=aO+8|0;d1=aR|0;d2=aR+8|0;d3=aV|0;d4=aV+8|0;d5=a$|0;d6=a$+8|0;d7=aM|0;d8=aM+8|0;d9=aL|0;eb=aL+8|0;ec=aK|0;ed=aK+8|0;ee=aN|0;ef=aN+8|0;eg=aH|0;eh=aH+8|0;ei=aJ|0;ej=aJ+8|0;ek=aE|0;el=aE+8|0;em=aC|0;en=aC+8|0;eo=aB|0;ep=aB+8|0;eq=aD|0;er=aD+8|0;es=aA|0;et=aA+8|0;eu=ay|0;ev=ay+8|0;ew=ax|0;ex=ax+8|0;eA=aw|0;eB=aw+8|0;eD=av|0;eE=av+8|0;eF=at|0;eG=at+8|0;eH=au|0;eI=au+8|0;eJ=ap|0;eK=ap+8|0;eL=ao|0;eM=ao+8|0;eN=an|0;eO=an+8|0;eQ=am|0;eR=am+8|0;eS=al|0;eT=al+8|0;eU=aj|0;eV=aj+8|0;eW=ak|0;eX=ak+8|0;eY=ak+16|0;eZ=ak+24|0;e_=ai|0;e$=ah|0;e0=ah+8|0;e2=ag|0;e3=ag+8|0;e4=af|0;e5=af+8|0;e6=ae|0;e8=ae+8|0;e9=ac|0;fa=ac+8|0;fb=ab|0;fc=ab+8|0;fd=$|0;fe=$+8|0;ff=Z|0;fg=Z+8|0;fh=Y|0;fi=Y+8|0;fj=V|0;fk=V+8|0;fl=X|0;fm=X+8|0;fn=W|0;fo=W+8|0;fp=U|0;fq=U+8|0;fr=T|0;fs=T+8|0;ft=S;fu=O|0;fv=O+8|0;fw=R|0;fx=R+8|0;fy=S+144|0;fz=S+72|0;fA=L|0;fB=L+8|0;fC=N|0;fD=N+8|0;fE=K|0;fF=K+8|0;fG=M|0;fH=M+8|0;fI=J|0;fJ=J+8|0;fK=I|0;fL=I+8|0;fM=H|0;fN=H+8|0;fO=F;fP=G;fQ=E|0;fS=E+8|0;fT=D|0;fU=D+8|0;fV=C|0;fW=C+8|0;fX=B|0;fY=B+8|0;fZ=z|0;f_=z+8|0;f$=A|0;f0=A+8|0;f1=y|0;f2=y+8|0;f3=x|0;f4=x+8|0;f5=t|0;f6=t+8|0;f7=u|0;f8=u+8|0;f9=s|0;ga=s+8|0;gb=q|0;gc=q+8|0;gd=p|0;ge=p+8|0;gf=o|0;gg=o+8|0;gh=n|0;gi=n+8|0;gj=l|0;gl=l+8|0;gm=k|0;gn=k+8|0;go=f|0;gp=f+8|0;gq=j|0;gs=j+8|0;gt=e|0;gu=e+8|0;gv=c[13898]|0;L27:while(1){gw=c[1054]|0;gx=c[gw+(gv*40&-1)+36>>2]|0;gy=c[gw+(gv*40&-1)+32>>2]|0;gz=(a[gw+(gv*40&-1)|0]&1)==0;gA=(gx|0)>0;gB=c[10036]|0;gC=21960;gD=96232;L29:while(1){L31:do{if(!gz){if(gA){gE=0;gF=0;gG=gy;while(1){gH=a[gD+gE|0]|0;if(gH<<24>>24==(a[gB+(gE+gG|0)|0]|0)){gI=gG;gJ=gF}else{if(gH<<24>>24!=36){break L31}gI=gG-1|0;gJ=1}gK=gE+1|0;if((gK|0)<(gJ+gx|0)){gE=gK;gF=gJ;gG=gI}else{break}}if((gJ|0)==0){gL=gK}else{gM=gC;break L29}}else{gL=0}gG=a[gD+gL|0]|0;if((gG<<24>>24|0)==36|(gG<<24>>24|0)==0){gM=gC;break L29}}}while(0);gG=gC+8|0;gF=c[gG>>2]|0;if((gF|0)==0){gM=gG;break}else{gC=gG;gD=gF}}gD=c[gM+4>>2]|0;L44:do{if((gD|0)==3){gN=gv+1|0;c[13898]=gN;L46:do{if((gN|0)<(c[8272]|0)){if((a[gw+(gN*40&-1)|0]&1)==0){b7=5107;break L27}gC=c[gw+(gN*40&-1)+36>>2]|0;gx=gw+(gN*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gC|0)){b7=34;break}gA=c[gx>>2]|0;if((a[gB+(gA+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{gO=gA;break}}if((b7|0)==34){b7=0;if((gy|0)==1){b7=36;break}gO=c[gx>>2]|0}if((gC|0)>0){gP=0;gQ=0;gR=gO}else{b7=5108;break L27}while(1){if((a[gP+123160|0]|0)==(a[gB+(gP+gR|0)|0]|0)){gS=gR;gT=gQ}else{if((gP|0)!=1){gU=0;gV=0;gW=gO;break}gS=gR-1|0;gT=1}gA=gP+1|0;if((gA|0)<(gT+gC|0)){gP=gA;gQ=gT;gR=gS}else{b7=42;break}}do{if((b7|0)==42){b7=0;if((gT|0)==0){if(!((gP|0)==7|(gP|0)==0)){gU=0;gV=0;gW=gO;break}}c[13898]=gv+2;h[9040]=1.0;gX=1.0;break L46}}while(0);while(1){if((a[gU+123032|0]|0)==(a[gB+(gU+gW|0)|0]|0)){gY=gW;gZ=gV}else{if((gU|0)!=1){b7=5109;break L27}gY=gW-1|0;gZ=1}gx=gU+1|0;if((gx|0)<(gZ+gC|0)){gU=gx;gV=gZ;gW=gY}else{break}}if((gZ|0)==0){if(!((gU|0)==7|(gU|0)==0)){b7=5110;break L27}}c[13898]=gv+2;h[9040]=.017453292519943295;gX=.017453292519943295}else{b7=36}}while(0);if((b7|0)==36){b7=0;h[9040]=1.0;gX=1.0}if((a[30528]&1)==0|(c[17539]|0)==0){break}h[8773]=0.0;h[8774]=6.283185307179586/gX}else if((gD|0)==4){gC=gv+1|0;c[13898]=gC;gx=c[gw+(gC*40&-1)+36>>2]|0;gy=c[gw+(gC*40&-1)+32>>2]|0;gA=(a[gw+(gC*40&-1)|0]&1)==0;gz=(gx|0)>0&(gA^1);L82:do{if(gz){gF=0;gG=0;gE=gy;while(1){if((a[gF+124752|0]|0)==(a[gB+(gF+gE|0)|0]|0)){g_=gE;g$=gG}else{if((gF|0)!=4){b7=62;break L82}g_=gE-1|0;g$=1}gH=gF+1|0;if((gH|0)<(g$+gx|0)){gF=gH;gG=g$;gE=g_}else{break}}if((g$|0)!=0){b7=102;break}if((gF|0)==3|(gF|0)==8){b7=102}else{b7=62}}else{b7=62}}while(0);L91:do{if((b7|0)==62){b7=0;gE=(c[8272]|0)>(gC|0);L93:do{if(gE){if(gA){break}else{g0=0}while(1){if((g0|0)>=(gx|0)){b7=66;break}if((a[gB+(g0+gy|0)|0]|0)==(a[g0+150856|0]|0)){g0=g0+1|0}else{g1=0;break}}if((b7|0)==66){b7=0;if((g0|0)==5){b7=102;break L91}else{g1=0}}while(1){if((g1|0)>=(gx|0)){b7=69;break}if((a[gB+(g1+gy|0)|0]|0)==(a[g1+188576|0]|0)){g1=g1+1|0}else{g2=0;break}}if((b7|0)==69){b7=0;if((g1|0)==4){b7=102;break L91}else{g2=0}}while(1){if((g2|0)>=(gx|0)){b7=72;break}if((a[gB+(g2+gy|0)|0]|0)==(a[g2+130496|0]|0)){g2=g2+1|0}else{g3=0;break}}if((b7|0)==72){b7=0;if((g2|0)==4){b7=102;break L91}else{g3=0}}while(1){if((g3|0)>=(gx|0)){b7=75;break}if((a[gB+(g3+gy|0)|0]|0)==(a[g3+187176|0]|0)){g3=g3+1|0}else{g4=0;break}}if((b7|0)==75){b7=0;if((g3|0)==2){b7=102;break L91}else{g4=0}}while(1){if((g4|0)>=(gx|0)){b7=78;break}if((a[gB+(g4+gy|0)|0]|0)==(a[g4+186688|0]|0)){g4=g4+1|0}else{g5=0;break}}if((b7|0)==78){b7=0;if((g4|0)==3){b7=102;break L91}else{g5=0}}while(1){if((g5|0)>=(gx|0)){b7=81;break}if((a[gB+(g5+gy|0)|0]|0)==(a[g5+128e3|0]|0)){g5=g5+1|0}else{g6=0;break}}if((b7|0)==81){b7=0;if((g5|0)==6){b7=102;break L91}else{g6=0}}while(1){if((g6|0)>=(gx|0)){b7=84;break}if((a[gB+(g6+gy|0)|0]|0)==(a[g6+127904|0]|0)){g6=g6+1|0}else{g7=0;break}}if((b7|0)==84){b7=0;if((g6|0)==5){b7=102;break L91}else{g7=0}}while(1){if((g7|0)>=(gx|0)){b7=87;break}if((a[gB+(g7+gy|0)|0]|0)==(a[g7+124464|0]|0)){g7=g7+1|0}else{g8=0;break}}if((b7|0)==87){b7=0;if((g7|0)==2){b7=102;break L91}else{g8=0}}while(1){if((g8|0)>=(gx|0)){break}if((a[gB+(g8+gy|0)|0]|0)==(a[g8+176728|0]|0)){g8=g8+1|0}else{b7=91;break L93}}if((g8|0)==10){b7=102;break L91}else{b7=91}}else{b7=91}}while(0);L139:do{if((b7|0)==91){b7=0;L141:do{if(gz){gF=0;cd=0;gG=gy;while(1){if((a[gF+124344|0]|0)==(a[gB+(gF+gG|0)|0]|0)){g9=gG;ha=cd}else{if((gF|0)!=4){break L141}g9=gG-1|0;ha=1}gH=gF+1|0;if((gH|0)<(ha+gx|0)){gF=gH;cd=ha;gG=g9}else{break}}if((ha|0)!=0){b7=102;break L91}if((gF|0)==3|(gF|0)==5){b7=102;break L91}}}while(0);if(gA|gE^1){break}else{hb=0}while(1){if((hb|0)>=(gx|0)){break}if((a[gB+(hb+gy|0)|0]|0)==(a[hb+150816|0]|0)){hb=hb+1|0}else{break L139}}if((hb|0)==6){b7=102;break L91}}}while(0);gE=is(b2)|0;gG=c[gE>>2]|0;if((gG|0)==1){hc=+(c[gE+8>>2]|0)}else if((gG|0)==2){hc=+h[gE+8>>3]}else if((gG|0)==3){hc=+uz(c[gE+8>>2]|0,0)}else{b7=109;break L27}if((c[b9>>2]|0)==3){uu(c[b8>>2]|0);c[b9>>2]=1}hd=~~hc;b7=113}}while(0);L164:do{if((b7|0)==102){b7=0;gy=c[10826]|0;if((gy|0)==0){he=1;hf=0;hg=0;b7=119;break}else{hh=1;hi=gy}while(1){if((c[hi+4>>2]|0)!=(hh|0)){hd=hh;b7=113;break L164}gy=hh+1|0;gx=c[hi>>2]|0;if((gx|0)==0){hd=gy;b7=113;break}else{hh=gy;hi=gx}}}}while(0);L169:do{if((b7|0)==113){b7=0;if((hd|0)<1){b7=114;break L27}gx=c[10826]|0;if((gx|0)==0){he=hd;hf=0;hg=0;b7=119;break}else{hj=0;hk=gx}while(1){hl=c[hk+4>>2]|0;if((hd|0)<=(hl|0)){break}gx=c[hk>>2]|0;if((gx|0)==0){he=hd;hf=hk;hg=0;b7=119;break L169}else{hj=hk;hk=gx}}if((hd|0)==(hl|0)){hm=hk}else{he=hd;hf=hj;hg=hk;b7=119}}}while(0);if((b7|0)==119){b7=0;gx=ut(208)|0;if((gx|0)==0){gk();gy=ut(208)|0;if((gy|0)==0){b7=121;break L27}else{hn=gy}}else{hn=gx}gx=hn;if((hf|0)==0){c[10826]=gx}else{c[hf>>2]=gx}c[hn+4>>2]=he;c[hn>>2]=hg;uE(hn+8|0,0,80);c[hn+96>>2]=-1;c[hn+100>>2]=0;gy=hn+104|0;c[gy>>2]=c[12872];c[gy+4>>2]=c[12873];c[gy+8>>2]=c[12874];c[gy+12>>2]=c[12875];c[gy+16>>2]=c[12876];c[gy+20>>2]=c[12877];c[gy+24>>2]=c[12878];c[gy+28>>2]=c[12879];c[gy+32>>2]=c[12880];c[gy+36>>2]=c[12881];c[gy+40>>2]=c[12882];c[gy+44>>2]=c[12883];c[gy+48>>2]=c[12884];c[gy+52>>2]=c[12885];c[hn+160>>2]=1;h[hn+168>>3]=0.0;c[hn+176>>2]=0;h[hn+184>>3]=15.0;h[hn+192>>3]=90.0;c[hn+200>>2]=0;hm=gx}gx=c[13898]|0;gy=c[8272]|0;if((gx|0)>=(gy|0)){break}gA=hm+96|0;gz=hm+88|0;gC=hm+48|0;gE=hm+8|0;gG=0;cd=0;gH=gx;gx=gy;while(1){gy=cd;ho=gH;hp=gx;L189:while(1){hq=ho;hr=hp;L191:while(1){hs=c[1054]|0;L193:do{if((a[hs+(hq*40&-1)|0]&1)!=0){ht=c[hs+(hq*40&-1)+36>>2]|0;hu=hs+(hq*40&-1)+32|0;hv=c[10036]|0;hw=0;while(1){if((hw|0)>=(ht|0)){b7=134;break}if((a[hv+((c[hu>>2]|0)+hw|0)|0]|0)==(a[hw+103664|0]|0)){hw=hw+1|0}else{break}}if((b7|0)==134){b7=0;if((hw|0)==1){break L44}}if((hr|0)>(hq|0)){hx=0}else{break}while(1){if((hx|0)>=(ht|0)){b7=138;break}if((a[hv+((c[hu>>2]|0)+hx|0)|0]|0)==(a[hx+188576|0]|0)){hx=hx+1|0}else{hy=0;break}}if((b7|0)==138){b7=0;if((hx|0)==4){break L189}else{hy=0}}while(1){if((hy|0)>=(ht|0)){b7=150;break}if((a[hv+((c[hu>>2]|0)+hy|0)|0]|0)==(a[hy+187176|0]|0)){hy=hy+1|0}else{hA=0;break}}if((b7|0)==150){b7=0;if((hy|0)==2){break L191}else{hA=0}}while(1){if((hA|0)>=(ht|0)){break}if((a[hv+((c[hu>>2]|0)+hA|0)|0]|0)==(a[hA+186688|0]|0)){hA=hA+1|0}else{break L193}}if((hA|0)==3){break L191}}}while(0);hL(gA,1);gF=c[13898]|0;hw=c[8272]|0;hB=(gF|0)<(hw|0);if((hq|0)==(gF|0)&hB){hC=c[1054]|0;if((a[hC+(hq*40&-1)|0]&1)==0){b7=5115;break L27}hF=c[hC+(hq*40&-1)+36>>2]|0;hG=hC+(hq*40&-1)+32|0;hC=c[10036]|0;hK=0;while(1){if((hK|0)>=(hF|0)){break}if((a[hC+((c[hG>>2]|0)+hK|0)|0]|0)==(a[hK+103664|0]|0)){hK=hK+1|0}else{b7=5116;break L27}}if((hK|0)!=1){b7=5117;break L27}}if(hB){hq=gF;hr=hw}else{break L44}}if(gy){b7=5119;break L27}else{hN=0}while(1){if((hN|0)>=(ht|0)){b7=157;break}if((a[hv+((c[hu>>2]|0)+hN|0)|0]|0)==(a[hN+186688|0]|0)){hN=hN+1|0}else{hP=0;break}}if((b7|0)==157){b7=0;hP=(hN|0)==3&1}a[gz]=hP;hQ=(c[13898]|0)+1|0;c[13898]=hQ;if((hQ|0)>=(c[8272]|0)){b7=5113;break L27}hG=c[1054]|0;L232:do{if((a[hG+(hQ*40&-1)|0]&1)!=0){hC=c[hG+(hQ*40&-1)+36>>2]|0;hF=hG+(hQ*40&-1)+32|0;hR=c[10036]|0;hS=0;while(1){if((hS|0)>=(hC|0)){break}if((a[hR+((c[hF>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break L232}}if((hS|0)==1){b7=5114;break L27}}}while(0);dl(gC,0);hG=c[13898]|0;hF=c[8272]|0;if((hG|0)<(hF|0)){gy=1;ho=hG;hp=hF}else{break L44}}if(gG){b7=5118;break L27}hT=hq+1|0;c[13898]=hT;if((hT|0)>=(hr|0)){b7=5111;break L27}L242:do{if((a[hs+(hT*40&-1)|0]&1)!=0){hp=c[hs+(hT*40&-1)+36>>2]|0;ho=hs+(hT*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[hv+((c[ho>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L242}}if((hF|0)==1){b7=5112;break L27}}}while(0);dl(gE,0);ho=c[13898]|0;hp=c[8272]|0;if((ho|0)<(hp|0)){gG=1;cd=gy;gH=ho;gx=hp}else{break}}}else if((gD|0)==5){gx=gv+1|0;c[13898]=gx;L250:do{if((gx|0)<(c[8272]|0)){gH=(a[gw+(gx*40&-1)|0]&1)==0;L252:do{if(!gH){cd=c[gw+(gx*40&-1)+36>>2]|0;gG=gw+(gx*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(cd|0)){b7=180;break}if((a[gB+((c[gG>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{hU=0;break}}if((b7|0)==180){b7=0;if((gE|0)==1){break L250}else{hU=0}}while(1){if((hU|0)>=(cd|0)){b7=184;break}if((a[gB+((c[gG>>2]|0)+hU|0)|0]|0)==(a[hU+150688|0]|0)){hU=hU+1|0}else{b7=185;break}}if((b7|0)==184){b7=0;if((hU|0)!=2){b7=185}}do{if((b7|0)==185){b7=0;if(gH){break L252}gG=c[gw+(gx*40&-1)+36>>2]|0;cd=gw+(gx*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){b7=189;break}if((a[gB+((c[cd>>2]|0)+gE|0)|0]|0)==(a[gE+148800|0]|0)){gE=gE+1|0}else{break}}if((b7|0)==189){b7=0;if((gE|0)==2){break}}if(gH){break L252}cd=c[gw+(gx*40&-1)+36>>2]|0;gG=gw+(gx*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(cd|0)){b7=195;break}if((a[gB+((c[gG>>2]|0)+hS|0)|0]|0)==(a[hS+125808|0]|0)){hS=hS+1|0}else{break}}do{if((b7|0)==195){b7=0;if((hS|0)!=3){break}c[16163]=c[16163]|12;c[16335]=c[16335]|12;c[16507]=c[16507]|12;c[16679]=c[16679]|12;c[16851]=c[16851]|12;c[17023]=c[17023]|12;c[17195]=c[17195]|12;c[17367]=c[17367]|12;c[17539]=c[17539]|12;c[17711]=c[17711]|12;c[17883]=c[17883]|12;c[13898]=gv+2;break L44}}while(0);hS=c[gw+(gx*40&-1)+36>>2]|0;gG=c[gw+(gx*40&-1)+32>>2]|0;if(gH){break L252}if((hS|0)>0){cd=0;gE=0;hF=gG;while(1){if((a[cd+125680|0]|0)==(a[gB+(cd+hF|0)|0]|0)){hV=hF;hW=gE}else{if((cd|0)!=2){break}hV=hF-1|0;hW=1}gC=cd+1|0;if((gC|0)<(hW+hS|0)){cd=gC;gE=hW;hF=hV}else{b7=203;break}}do{if((b7|0)==203){b7=0;if((hW|0)==0){if(!((cd|0)==1|(cd|0)==7)){break}}c[16163]=c[16163]|3;c[16335]=c[16335]|3;c[16507]=c[16507]|3;c[16679]=c[16679]|3;c[16851]=c[16851]|3;c[17023]=c[17023]|3;c[17195]=c[17195]|3;c[17367]=c[17367]|3;c[17539]=c[17539]|3;c[17711]=c[17711]|3;c[17883]=c[17883]|3;c[13898]=gv+2;break L44}}while(0);if(gH){break L252}else{hY=0}}else{hY=0}while(1){if((hY|0)>=(hS|0)){break}if((a[gB+(gG+hY|0)|0]|0)==(a[hY+57e3|0]|0)){hY=hY+1|0}else{break L252}}if((a[hY+57e3|0]|0)!=0){break L252}c[17367]=3;c[17386]=0;c[17387]=0;c[13898]=gv+2;break L44}}while(0);c[16335]=3;c[16507]=3;c[16355]=0;c[16354]=0;c[16527]=0;c[16526]=0;c[13898]=gv+2;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;hS=c[gy+(gH*40&-1)+32>>2]|0;L302:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){cd=c[10036]|0;hF=0;gE=0;gC=hS;while(1){gz=a[b0+hF|0]|0;if(gz<<24>>24==(a[cd+(hF+gC|0)|0]|0)){hZ=gC;h_=gE}else{if(gz<<24>>24!=36){break L302}hZ=gC-1|0;h_=1}h$=hF+1|0;if((h$|0)<(h_+gG|0)){hF=h$;gE=h_;gC=hZ}else{break}}if((h_|0)==0){h0=h$;b7=219}}else{h0=0;b7=219}if((b7|0)==219){b7=0;gC=a[b0+h0|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17367]=c[17367]|1;c[17386]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;gG=c[1054]|0;hS=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L317:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((hS|0)>0){gC=c[10036]|0;gE=0;hF=0;cd=gy;while(1){gz=a[b1+gE|0]|0;if(gz<<24>>24==(a[gC+(gE+cd|0)|0]|0)){h1=cd;h2=hF}else{if(gz<<24>>24!=36){break L317}h1=cd-1|0;h2=1}h3=gE+1|0;if((h3|0)<(h2+hS|0)){gE=h3;hF=h2;cd=h1}else{break}}if((h2|0)==0){h4=h3;b7=229}}else{h4=0;b7=229}if((b7|0)==229){b7=0;cd=a[b1+h4|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17367]=c[17367]|2;c[17387]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;L332:do{if((c[8272]|0)>(gH|0)){hS=c[1054]|0;if((a[hS+(gH*40&-1)|0]&1)==0){break}gy=c[hS+(gH*40&-1)+36>>2]|0;gG=hS+(gH*40&-1)+32|0;hS=c[10036]|0;cd=0;while(1){if((cd|0)>=(gy|0)){break}if((a[hS+((c[gG>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L332}}if((a[b0+cd|0]|0)!=0){break}c[17367]=c[17367]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;gG=c[1054]|0;hS=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L341:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((hS|0)>0){hF=c[10036]|0;gE=0;gC=0;gz=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[hF+(gE+gz|0)|0]|0)){h5=gz;h6=gC}else{if(gA<<24>>24!=36){break L341}h5=gz-1|0;h6=1}h7=gE+1|0;if((h7|0)<(h6+hS|0)){gE=h7;gC=h6;gz=h5}else{break}}if((h6|0)==0){h8=h7;b7=246}}else{h8=0;b7=246}if((b7|0)==246){b7=0;gz=a[b0+h8|0]|0;if(!((gz<<24>>24|0)==36|(gz<<24>>24|0)==0)){break}}c[17367]=c[17367]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;hS=c[1054]|0;gy=c[hS+(gH*40&-1)+36>>2]|0;gG=c[hS+(gH*40&-1)+32>>2]|0;gz=(a[hS+(gH*40&-1)|0]&1)==0;L356:do{if(!gz){if((gy|0)>0){hS=c[10036]|0;gC=0;gE=0;hF=gG;while(1){cd=a[b1+gC|0]|0;if(cd<<24>>24==(a[hS+(gC+hF|0)|0]|0)){h9=hF;ia=gE}else{if(cd<<24>>24!=36){break L356}h9=hF-1|0;ia=1}ib=gC+1|0;if((ib|0)<(ia+gy|0)){gC=ib;gE=ia;hF=h9}else{break}}if((ia|0)==0){ic=ib;b7=256}}else{ic=0;b7=256}if((b7|0)==256){b7=0;hF=a[b1+ic|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17367]=c[17367]|8;c[13898]=gH+1;break L44}}while(0);L371:do{if(!((c[8272]|0)<=(gH|0)|gz)){hF=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[hF+(gG+gE|0)|0]|0)==(a[gE+57024|0]|0)){gE=gE+1|0}else{break L371}}if((a[gE+57024|0]|0)!=0){break}c[17539]=3;c[17558]=0;c[17559]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L379:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){hF=c[10036]|0;gC=0;hS=0;cd=gz;while(1){gA=a[b0+gC|0]|0;if(gA<<24>>24==(a[hF+(gC+cd|0)|0]|0)){id=cd;ie=hS}else{if(gA<<24>>24!=36){break L379}id=cd-1|0;ie=1}ig=gC+1|0;if((ig|0)<(ie+gy|0)){gC=ig;hS=ie;cd=id}else{break}}if((ie|0)==0){ih=ig;b7=272}}else{ih=0;b7=272}if((b7|0)==272){b7=0;cd=a[b0+ih|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17539]=c[17539]|1;c[17558]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L394:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;hS=0;gC=0;hF=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[cd+(hS+hF|0)|0]|0)){ii=hF;ij=gC}else{if(gE<<24>>24!=36){break L394}ii=hF-1|0;ij=1}ik=hS+1|0;if((ik|0)<(ij+gz|0)){hS=ik;gC=ij;hF=ii}else{break}}if((ij|0)==0){il=ik;b7=282}}else{il=0;b7=282}if((b7|0)==282){b7=0;hF=a[b1+il|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17539]=c[17539]|2;c[17559]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;L409:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+hF|0)|0]|0)==(a[b0+hF|0]|0)){hF=hF+1|0}else{break L409}}if((a[b0+hF|0]|0)!=0){break}c[17539]=c[17539]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L418:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;cd=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[gC+(hS+gE|0)|0]|0)){im=gE;io=cd}else{if(gA<<24>>24!=36){break L418}im=gE-1|0;io=1}ip=hS+1|0;if((ip|0)<(io+gz|0)){hS=ip;cd=io;gE=im}else{break}}if((io|0)==0){iq=ip;b7=299}}else{iq=0;b7=299}if((b7|0)==299){b7=0;gE=a[b0+iq|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[17539]=c[17539]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L433:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L435:do{if((gG|0)>0){gE=c[10036]|0;cd=0;hS=0;gC=gy;while(1){hF=a[b1+cd|0]|0;if(hF<<24>>24==(a[gE+(cd+gC|0)|0]|0)){ir=gC;iu=hS}else{if(hF<<24>>24!=36){break L435}ir=gC-1|0;iu=1}iv=cd+1|0;if((iv|0)<(iu+gG|0)){cd=iv;hS=iu;gC=ir}else{break}}if((iu|0)==0){iy=iv;b7=309}else{b7=310}}else{iy=0;b7=309}}while(0);if((b7|0)==309){b7=0;gC=a[b1+iy|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){b7=310}}if((b7|0)==310){b7=0;c[17539]=c[17539]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}gC=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[gC+(hS+gy|0)|0]|0)==(a[hS+57048|0]|0)){hS=hS+1|0}else{break L433}}if((a[hS+57048|0]|0)!=0){break}c[17711]=3;c[17730]=0;c[17731]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L456:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){gC=c[10036]|0;cd=0;gE=0;hF=gz;while(1){gA=a[b0+cd|0]|0;if(gA<<24>>24==(a[gC+(cd+hF|0)|0]|0)){iz=hF;iA=gE}else{if(gA<<24>>24!=36){break L456}iz=hF-1|0;iA=1}iB=cd+1|0;if((iB|0)<(iA+gG|0)){cd=iB;gE=iA;hF=iz}else{break}}if((iA|0)==0){iC=iB;b7=325}}else{iC=0;b7=325}if((b7|0)==325){b7=0;hF=a[b0+iC|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17711]=c[17711]|1;c[17730]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L471:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;gE=0;cd=0;gC=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[hF+(gE+gC|0)|0]|0)){iD=gC;iE=cd}else{if(hS<<24>>24!=36){break L471}iD=gC-1|0;iE=1}iF=gE+1|0;if((iF|0)<(iE+gz|0)){gE=iF;cd=iE;gC=iD}else{break}}if((iE|0)==0){iG=iF;b7=335}}else{iG=0;b7=335}if((b7|0)==335){b7=0;gC=a[b1+iG|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17711]=c[17711]|2;c[17731]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;L486:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+gC|0)|0]|0)==(a[b0+gC|0]|0)){gC=gC+1|0}else{break L486}}if((a[b0+gC|0]|0)!=0){break}c[17711]=c[17711]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L495:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;gE=0;hF=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[cd+(gE+hS|0)|0]|0)){iH=hS;iI=hF}else{if(gA<<24>>24!=36){break L495}iH=hS-1|0;iI=1}iJ=gE+1|0;if((iJ|0)<(iI+gz|0)){gE=iJ;hF=iI;hS=iH}else{break}}if((iI|0)==0){iK=iJ;b7=352}}else{iK=0;b7=352}if((b7|0)==352){b7=0;hS=a[b0+iK|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[17711]=c[17711]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L510:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L512:do{if((gy|0)>0){hS=c[10036]|0;hF=0;gE=0;cd=gG;while(1){gC=a[b1+hF|0]|0;if(gC<<24>>24==(a[hS+(hF+cd|0)|0]|0)){iL=cd;iM=gE}else{if(gC<<24>>24!=36){break L512}iL=cd-1|0;iM=1}iN=hF+1|0;if((iN|0)<(iM+gy|0)){hF=iN;gE=iM;cd=iL}else{break}}if((iM|0)==0){iP=iN;b7=362}else{b7=363}}else{iP=0;b7=362}}while(0);if((b7|0)==362){b7=0;cd=a[b1+iP|0]|0;if((cd<<24>>24|0)==36|(cd<<24>>24|0)==0){b7=363}}if((b7|0)==363){b7=0;c[17711]=c[17711]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}cd=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[cd+(gE+gG|0)|0]|0)==(a[gE+57072|0]|0)){gE=gE+1|0}else{break L510}}if((a[gE+57072|0]|0)!=0){break}c[17883]=3;c[17902]=0;c[17903]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L533:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){cd=c[10036]|0;hF=0;hS=0;gC=gz;while(1){gA=a[b0+hF|0]|0;if(gA<<24>>24==(a[cd+(hF+gC|0)|0]|0)){iR=gC;iS=hS}else{if(gA<<24>>24!=36){break L533}iR=gC-1|0;iS=1}iT=hF+1|0;if((iT|0)<(iS+gy|0)){hF=iT;hS=iS;gC=iR}else{break}}if((iS|0)==0){iU=iT;b7=378}}else{iU=0;b7=378}if((b7|0)==378){b7=0;gC=a[b0+iU|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17883]=c[17883]|1;c[17902]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L548:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;hF=0;cd=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[gC+(hS+cd|0)|0]|0)){iV=cd;iW=hF}else{if(gE<<24>>24!=36){break L548}iV=cd-1|0;iW=1}iX=hS+1|0;if((iX|0)<(iW+gz|0)){hS=iX;hF=iW;cd=iV}else{break}}if((iW|0)==0){iZ=iX;b7=388}}else{iZ=0;b7=388}if((b7|0)==388){b7=0;cd=a[b1+iZ|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17883]=c[17883]|2;c[17903]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;L563:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;cd=0;while(1){if((cd|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L563}}if((a[b0+cd|0]|0)!=0){break}c[17883]=c[17883]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L572:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;hS=0;gC=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[hF+(hS+gE|0)|0]|0)){i_=gE;i$=gC}else{if(gA<<24>>24!=36){break L572}i_=gE-1|0;i$=1}i0=hS+1|0;if((i0|0)<(i$+gz|0)){hS=i0;gC=i$;gE=i_}else{break}}if((i$|0)==0){i1=i0;b7=405}}else{i1=0;b7=405}if((b7|0)==405){b7=0;gE=a[b0+i1|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[17883]=c[17883]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L587:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L589:do{if((gG|0)>0){gE=c[10036]|0;gC=0;hS=0;hF=gy;while(1){cd=a[b1+gC|0]|0;if(cd<<24>>24==(a[gE+(gC+hF|0)|0]|0)){i2=hF;i3=hS}else{if(cd<<24>>24!=36){break L589}i2=hF-1|0;i3=1}i4=gC+1|0;if((i4|0)<(i3+gG|0)){gC=i4;hS=i3;hF=i2}else{break}}if((i3|0)==0){i5=i4;b7=415}else{b7=416}}else{i5=0;b7=415}}while(0);if((b7|0)==415){b7=0;hF=a[b1+i5|0]|0;if((hF<<24>>24|0)==36|(hF<<24>>24|0)==0){b7=416}}if((b7|0)==416){b7=0;c[17883]=c[17883]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}hF=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[hF+(hS+gy|0)|0]|0)==(a[hS+56880|0]|0)){hS=hS+1|0}else{break L587}}if((a[hS+56880|0]|0)!=0){break}c[16507]=3;c[16526]=0;c[16527]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L610:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){hF=c[10036]|0;gC=0;gE=0;cd=gz;while(1){gA=a[b0+gC|0]|0;if(gA<<24>>24==(a[hF+(gC+cd|0)|0]|0)){i6=cd;i7=gE}else{if(gA<<24>>24!=36){break L610}i6=cd-1|0;i7=1}i8=gC+1|0;if((i8|0)<(i7+gG|0)){gC=i8;gE=i7;cd=i6}else{break}}if((i7|0)==0){ja=i8;b7=431}}else{ja=0;b7=431}if((b7|0)==431){b7=0;cd=a[b0+ja|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[16507]=c[16507]|1;c[16526]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L625:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;gE=0;gC=0;hF=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[cd+(gE+hF|0)|0]|0)){jb=hF;jc=gC}else{if(hS<<24>>24!=36){break L625}jb=hF-1|0;jc=1}jd=gE+1|0;if((jd|0)<(jc+gz|0)){gE=jd;gC=jc;hF=jb}else{break}}if((jc|0)==0){je=jd;b7=441}}else{je=0;b7=441}if((b7|0)==441){b7=0;hF=a[b1+je|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[16507]=c[16507]|2;c[16527]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;L640:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+hF|0)|0]|0)==(a[b0+hF|0]|0)){hF=hF+1|0}else{break L640}}if((a[b0+hF|0]|0)!=0){break}c[16507]=c[16507]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L649:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;gE=0;cd=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[gC+(gE+hS|0)|0]|0)){jf=hS;jg=cd}else{if(gA<<24>>24!=36){break L649}jf=hS-1|0;jg=1}jh=gE+1|0;if((jh|0)<(jg+gz|0)){gE=jh;cd=jg;hS=jf}else{break}}if((jg|0)==0){ji=jh;b7=458}}else{ji=0;b7=458}if((b7|0)==458){b7=0;hS=a[b0+ji|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[16507]=c[16507]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L664:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L666:do{if((gy|0)>0){hS=c[10036]|0;cd=0;gE=0;gC=gG;while(1){hF=a[b1+cd|0]|0;if(hF<<24>>24==(a[hS+(cd+gC|0)|0]|0)){jj=gC;jk=gE}else{if(hF<<24>>24!=36){break L666}jj=gC-1|0;jk=1}jl=cd+1|0;if((jl|0)<(jk+gy|0)){cd=jl;gE=jk;gC=jj}else{break}}if((jk|0)==0){jm=jl;b7=468}else{b7=469}}else{jm=0;b7=468}}while(0);if((b7|0)==468){b7=0;gC=a[b1+jm|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){b7=469}}if((b7|0)==469){b7=0;c[16507]=c[16507]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}gC=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[gC+(gE+gG|0)|0]|0)==(a[gE+56856|0]|0)){gE=gE+1|0}else{break L664}}if((a[gE+56856|0]|0)!=0){break}c[16335]=3;c[16354]=0;c[16355]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L687:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){gC=c[10036]|0;cd=0;hS=0;hF=gz;while(1){gA=a[b0+cd|0]|0;if(gA<<24>>24==(a[gC+(cd+hF|0)|0]|0)){jn=hF;jo=hS}else{if(gA<<24>>24!=36){break L687}jn=hF-1|0;jo=1}jy=cd+1|0;if((jy|0)<(jo+gy|0)){cd=jy;hS=jo;hF=jn}else{break}}if((jo|0)==0){jz=jy;b7=484}}else{jz=0;b7=484}if((b7|0)==484){b7=0;hF=a[b0+jz|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[16335]=c[16335]|1;c[16354]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L702:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;hS=0;cd=0;gC=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[hF+(hS+gC|0)|0]|0)){jA=gC;jB=cd}else{if(gE<<24>>24!=36){break L702}jA=gC-1|0;jB=1}jC=hS+1|0;if((jC|0)<(jB+gz|0)){hS=jC;cd=jB;gC=jA}else{break}}if((jB|0)==0){jD=jC;b7=494}}else{jD=0;b7=494}if((b7|0)==494){b7=0;gC=a[b1+jD|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[16335]=c[16335]|2;c[16355]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;L717:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;gC=0;while(1){if((gC|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+gC|0)|0]|0)==(a[b0+gC|0]|0)){gC=gC+1|0}else{break L717}}if((a[b0+gC|0]|0)!=0){break}c[16335]=c[16335]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L726:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;hS=0;hF=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[cd+(hS+gE|0)|0]|0)){jE=gE;jF=hF}else{if(gA<<24>>24!=36){break L726}jE=gE-1|0;jF=1}jG=hS+1|0;if((jG|0)<(jF+gz|0)){hS=jG;hF=jF;gE=jE}else{break}}if((jF|0)==0){jH=jG;b7=511}}else{jH=0;b7=511}if((b7|0)==511){b7=0;gE=a[b0+jH|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[16335]=c[16335]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L741:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L743:do{if((gG|0)>0){gE=c[10036]|0;hF=0;hS=0;cd=gy;while(1){gC=a[b1+hF|0]|0;if(gC<<24>>24==(a[gE+(hF+cd|0)|0]|0)){jI=cd;jJ=hS}else{if(gC<<24>>24!=36){break L743}jI=cd-1|0;jJ=1}jK=hF+1|0;if((jK|0)<(jJ+gG|0)){hF=jK;hS=jJ;cd=jI}else{break}}if((jJ|0)==0){jL=jK;b7=521}else{b7=522}}else{jL=0;b7=521}}while(0);if((b7|0)==521){b7=0;cd=a[b1+jL|0]|0;if((cd<<24>>24|0)==36|(cd<<24>>24|0)==0){b7=522}}if((b7|0)==522){b7=0;c[16335]=c[16335]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}cd=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[cd+(hS+gy|0)|0]|0)==(a[hS+56832|0]|0)){hS=hS+1|0}else{break L741}}if((a[hS+56832|0]|0)!=0){break}c[16163]=3;c[16182]=0;c[16183]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L764:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){cd=c[10036]|0;hF=0;gE=0;gC=gz;while(1){gA=a[b0+hF|0]|0;if(gA<<24>>24==(a[cd+(hF+gC|0)|0]|0)){jM=gC;jN=gE}else{if(gA<<24>>24!=36){break L764}jM=gC-1|0;jN=1}jO=hF+1|0;if((jO|0)<(jN+gG|0)){hF=jO;gE=jN;gC=jM}else{break}}if((jN|0)==0){jP=jO;b7=537}}else{jP=0;b7=537}if((b7|0)==537){b7=0;gC=a[b0+jP|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[16163]=c[16163]|1;c[16182]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L779:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;gE=0;hF=0;cd=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[gC+(gE+cd|0)|0]|0)){jQ=cd;jR=hF}else{if(hS<<24>>24!=36){break L779}jQ=cd-1|0;jR=1}jS=gE+1|0;if((jS|0)<(jR+gz|0)){gE=jS;hF=jR;cd=jQ}else{break}}if((jR|0)==0){jT=jS;b7=547}}else{jT=0;b7=547}if((b7|0)==547){b7=0;cd=a[b1+jT|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[16163]=c[16163]|2;c[16183]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;L794:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;cd=0;while(1){if((cd|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L794}}if((a[b0+cd|0]|0)!=0){break}c[16163]=c[16163]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L803:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;gE=0;gC=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[hF+(gE+hS|0)|0]|0)){jU=hS;jV=gC}else{if(gA<<24>>24!=36){break L803}jU=hS-1|0;jV=1}jW=gE+1|0;if((jW|0)<(jV+gz|0)){gE=jW;gC=jV;hS=jU}else{break}}if((jV|0)==0){jX=jW;b7=564}}else{jX=0;b7=564}if((b7|0)==564){b7=0;hS=a[b0+jX|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[16163]=c[16163]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L818:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L820:do{if((gy|0)>0){hS=c[10036]|0;gC=0;gE=0;hF=gG;while(1){cd=a[b1+gC|0]|0;if(cd<<24>>24==(a[hS+(gC+hF|0)|0]|0)){jY=hF;jZ=gE}else{if(cd<<24>>24!=36){break L820}jY=hF-1|0;jZ=1}j_=gC+1|0;if((j_|0)<(jZ+gy|0)){gC=j_;gE=jZ;hF=jY}else{break}}if((jZ|0)==0){j$=j_;b7=574}else{b7=575}}else{j$=0;b7=574}}while(0);if((b7|0)==574){b7=0;hF=a[b1+j$|0]|0;if((hF<<24>>24|0)==36|(hF<<24>>24|0)==0){b7=575}}if((b7|0)==575){b7=0;c[16163]=c[16163]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}hF=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[hF+(gE+gG|0)|0]|0)==(a[gE+56976|0]|0)){gE=gE+1|0}else{break L818}}if((a[gE+56976|0]|0)!=0){break}c[17195]=3;c[17214]=0;c[17215]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L841:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){hF=c[10036]|0;gC=0;hS=0;cd=gz;while(1){gA=a[b0+gC|0]|0;if(gA<<24>>24==(a[hF+(gC+cd|0)|0]|0)){j0=cd;j1=hS}else{if(gA<<24>>24!=36){break L841}j0=cd-1|0;j1=1}j2=gC+1|0;if((j2|0)<(j1+gy|0)){gC=j2;hS=j1;cd=j0}else{break}}if((j1|0)==0){j3=j2;b7=590}}else{j3=0;b7=590}if((b7|0)==590){b7=0;cd=a[b0+j3|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17195]=c[17195]|1;c[17214]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L856:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;hS=0;gC=0;hF=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[cd+(hS+hF|0)|0]|0)){j4=hF;j5=gC}else{if(gE<<24>>24!=36){break L856}j4=hF-1|0;j5=1}j6=hS+1|0;if((j6|0)<(j5+gz|0)){hS=j6;gC=j5;hF=j4}else{break}}if((j5|0)==0){j7=j6;b7=600}}else{j7=0;b7=600}if((b7|0)==600){b7=0;hF=a[b1+j7|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17195]=c[17195]|2;c[17215]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;L871:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+hF|0)|0]|0)==(a[b0+hF|0]|0)){hF=hF+1|0}else{break L871}}if((a[b0+hF|0]|0)!=0){break}c[17195]=c[17195]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L880:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;cd=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[gC+(hS+gE|0)|0]|0)){j8=gE;j9=cd}else{if(gA<<24>>24!=36){break L880}j8=gE-1|0;j9=1}ka=hS+1|0;if((ka|0)<(j9+gz|0)){hS=ka;cd=j9;gE=j8}else{break}}if((j9|0)==0){kb=ka;b7=617}}else{kb=0;b7=617}if((b7|0)==617){b7=0;gE=a[b0+kb|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[17195]=c[17195]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L895:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L897:do{if((gG|0)>0){gE=c[10036]|0;cd=0;hS=0;gC=gy;while(1){hF=a[b1+cd|0]|0;if(hF<<24>>24==(a[gE+(cd+gC|0)|0]|0)){kc=gC;kd=hS}else{if(hF<<24>>24!=36){break L897}kc=gC-1|0;kd=1}ke=cd+1|0;if((ke|0)<(kd+gG|0)){cd=ke;hS=kd;gC=kc}else{break}}if((kd|0)==0){kf=ke;b7=627}else{b7=628}}else{kf=0;b7=627}}while(0);if((b7|0)==627){b7=0;gC=a[b1+kf|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){b7=628}}if((b7|0)==628){b7=0;c[17195]=c[17195]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}gC=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[gC+(hS+gy|0)|0]|0)==(a[hS+56952|0]|0)){hS=hS+1|0}else{break L895}}if((a[hS+56952|0]|0)!=0){break}c[17023]=3;c[17042]=0;c[17043]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L918:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){gC=c[10036]|0;cd=0;gE=0;hF=gz;while(1){gA=a[b0+cd|0]|0;if(gA<<24>>24==(a[gC+(cd+hF|0)|0]|0)){kg=hF;kh=gE}else{if(gA<<24>>24!=36){break L918}kg=hF-1|0;kh=1}ki=cd+1|0;if((ki|0)<(kh+gG|0)){cd=ki;gE=kh;hF=kg}else{break}}if((kh|0)==0){kj=ki;b7=643}}else{kj=0;b7=643}if((b7|0)==643){b7=0;hF=a[b0+kj|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17023]=c[17023]|1;c[17042]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L933:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;gE=0;cd=0;gC=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[hF+(gE+gC|0)|0]|0)){kk=gC;kl=cd}else{if(hS<<24>>24!=36){break L933}kk=gC-1|0;kl=1}km=gE+1|0;if((km|0)<(kl+gz|0)){gE=km;cd=kl;gC=kk}else{break}}if((kl|0)==0){kn=km;b7=653}}else{kn=0;b7=653}if((b7|0)==653){b7=0;gC=a[b1+kn|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17023]=c[17023]|2;c[17043]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;L948:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+gC|0)|0]|0)==(a[b0+gC|0]|0)){gC=gC+1|0}else{break L948}}if((a[b0+gC|0]|0)!=0){break}c[17023]=c[17023]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L957:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;gE=0;hF=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[cd+(gE+hS|0)|0]|0)){ko=hS;kp=hF}else{if(gA<<24>>24!=36){break L957}ko=hS-1|0;kp=1}kq=gE+1|0;if((kq|0)<(kp+gz|0)){gE=kq;hF=kp;hS=ko}else{break}}if((kp|0)==0){kr=kq;b7=670}}else{kr=0;b7=670}if((b7|0)==670){b7=0;hS=a[b0+kr|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[17023]=c[17023]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L972:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L974:do{if((gy|0)>0){hS=c[10036]|0;hF=0;gE=0;cd=gG;while(1){gC=a[b1+hF|0]|0;if(gC<<24>>24==(a[hS+(hF+cd|0)|0]|0)){ks=cd;kt=gE}else{if(gC<<24>>24!=36){break L974}ks=cd-1|0;kt=1}ku=hF+1|0;if((ku|0)<(kt+gy|0)){hF=ku;gE=kt;cd=ks}else{break}}if((kt|0)==0){kv=ku;b7=680}else{b7=681}}else{kv=0;b7=680}}while(0);if((b7|0)==680){b7=0;cd=a[b1+kv|0]|0;if((cd<<24>>24|0)==36|(cd<<24>>24|0)==0){b7=681}}if((b7|0)==681){b7=0;c[17023]=c[17023]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}cd=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[cd+(gE+gG|0)|0]|0)==(a[gE+56904|0]|0)){gE=gE+1|0}else{break L972}}if((a[gE+56904|0]|0)!=0){break}c[16679]=3;c[16698]=0;c[16699]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L995:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){cd=c[10036]|0;hF=0;hS=0;gC=gz;while(1){gA=a[b0+hF|0]|0;if(gA<<24>>24==(a[cd+(hF+gC|0)|0]|0)){kw=gC;kx=hS}else{if(gA<<24>>24!=36){break L995}kw=gC-1|0;kx=1}ky=hF+1|0;if((ky|0)<(kx+gy|0)){hF=ky;hS=kx;gC=kw}else{break}}if((kx|0)==0){kz=ky;b7=696}}else{kz=0;b7=696}if((b7|0)==696){b7=0;gC=a[b0+kz|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[16679]=c[16679]|1;c[16698]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L1010:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;hF=0;cd=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[gC+(hS+cd|0)|0]|0)){kA=cd;kB=hF}else{if(gE<<24>>24!=36){break L1010}kA=cd-1|0;kB=1}kC=hS+1|0;if((kC|0)<(kB+gz|0)){hS=kC;hF=kB;cd=kA}else{break}}if((kB|0)==0){kD=kC;b7=706}}else{kD=0;b7=706}if((b7|0)==706){b7=0;cd=a[b1+kD|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[16679]=c[16679]|2;c[16699]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;L1025:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;cd=0;while(1){if((cd|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L1025}}if((a[b0+cd|0]|0)!=0){break}c[16679]=c[16679]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L1034:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;hS=0;gC=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[hF+(hS+gE|0)|0]|0)){kE=gE;kF=gC}else{if(gA<<24>>24!=36){break L1034}kE=gE-1|0;kF=1}kG=hS+1|0;if((kG|0)<(kF+gz|0)){hS=kG;gC=kF;gE=kE}else{break}}if((kF|0)==0){kH=kG;b7=723}}else{kH=0;b7=723}if((b7|0)==723){b7=0;gE=a[b0+kH|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[16679]=c[16679]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);kI=c[13898]|0;gH=c[1054]|0;gz=c[gH+(kI*40&-1)+36>>2]|0;if((a[gH+(kI*40&-1)|0]&1)==0){b7=5120;break L27}if((gz|0)>0){gG=c[10036]|0;gy=0;gE=0;gC=c[gH+(kI*40&-1)+32>>2]|0;while(1){gH=a[b1+gy|0]|0;if(gH<<24>>24==(a[gG+(gy+gC|0)|0]|0)){kJ=gC;kK=gE}else{if(gH<<24>>24!=36){b7=5121;break L27}kJ=gC-1|0;kK=1}kL=gy+1|0;if((kL|0)<(kK+gz|0)){gy=kL;gE=kK;gC=kJ}else{break}}if((kK|0)==0){kM=kL;b7=733}}else{kM=0;b7=733}if((b7|0)==733){b7=0;gC=a[b1+kM|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){b7=5122;break L27}}c[16679]=c[16679]|8;c[13898]=kI+1;break L44}}while(0);c[16163]=3;c[16335]=3;c[16507]=3;c[16679]=3;c[16851]=3;c[17023]=3;c[17195]=3;c[17367]=3;c[17539]=3;c[17711]=3;c[17883]=3}else if((gD|0)==6){gx=gv+1|0;c[13898]=gx;gC=c[8272]|0;L1064:do{if((gx|0)<(gC|0)){gE=gx;gy=gC;gz=gw;while(1){gG=c[gz+(gE*40&-1)+36>>2]|0;gH=gz+(gE*40&-1)+32|0;L1067:do{if((a[gz+(gE*40&-1)|0]&1)==0){b7=776}else{hS=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){b7=741;break}cd=c[gH>>2]|0;if((a[hS+(cd+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{kN=cd;break}}if((b7|0)==741){b7=0;if((hF|0)==1){kO=gE;break L1064}kN=c[gH>>2]|0}L1076:do{if((gG|0)>0){cd=0;gA=0;hp=kN;while(1){if((a[cd+95520|0]|0)==(a[hS+(cd+hp|0)|0]|0)){kP=hp;kQ=gA}else{if((cd|0)!=1){kR=0;kS=0;kT=kN;break}kP=hp-1|0;kQ=1}ho=cd+1|0;if((ho|0)<(kQ+gG|0)){cd=ho;gA=kQ;hp=kP}else{b7=748;break}}do{if((b7|0)==748){b7=0;if((kQ|0)==0){if(!((cd|0)==0|(cd|0)==5)){kR=0;kS=0;kT=kN;break}}h[7077]=0.0;hp=gE+1|0;c[13898]=hp;kU=hp;kV=gy;break L1067}}while(0);while(1){if((a[kR+126016|0]|0)==(a[hS+(kR+kT|0)|0]|0)){kW=kT;kX=kS}else{if((kR|0)!=1){kY=0;kZ=0;k_=kN;break}kW=kT-1|0;kX=1}cd=kR+1|0;if((cd|0)<(kX+gG|0)){kR=cd;kS=kX;kT=kW}else{b7=755;break}}do{if((b7|0)==755){b7=0;if((kX|0)==0){if(!((kR|0)==0|(kR|0)==5)){kY=0;kZ=0;k_=kN;break}}h[7077]=1.0;cd=gE+1|0;c[13898]=cd;kU=cd;kV=gy;break L1067}}while(0);while(1){if((a[kY+125960|0]|0)==(a[hS+(kY+k_|0)|0]|0)){k$=k_;k0=kZ}else{if((kY|0)!=4){break L1076}k$=k_-1|0;k0=1}cd=kY+1|0;if((cd|0)<(k0+gG|0)){kY=cd;kZ=k0;k_=k$}else{break}}if((k0|0)==0){if(!((kY|0)==3|(kY|0)==9)){break}}h[7077]=-1.0;cd=gE+1|0;c[13898]=cd;kU=cd;kV=gy;break L1067}}while(0);if((gy|0)>(gE|0)){k1=0}else{b7=776;break}while(1){if((k1|0)>=(gG|0)){b7=770;break}if((a[hS+(k1+kN|0)|0]|0)==(a[k1+150856|0]|0)){k1=k1+1|0}else{k2=0;break}}do{if((b7|0)==770){b7=0;if((k1|0)!=5){k2=0;break}c[14156]=1;hF=gE+1|0;c[13898]=hF;kU=hF;kV=gy;break L1067}}while(0);while(1){if((k2|0)>=(gG|0)){break}if((a[hS+(k2+kN|0)|0]|0)==(a[k2+150704|0]|0)){k2=k2+1|0}else{b7=776;break L1067}}if((k2|0)!=4){b7=776;break}c[14156]=0;hS=gE+1|0;c[13898]=hS;kU=hS;kV=gy}}while(0);if((b7|0)==776){b7=0;gG=is(b_)|0;gH=c[gG>>2]|0;if((gH|0)==1){k3=+(c[gG+8>>2]|0)}else if((gH|0)==2){k3=+h[gG+8>>3]}else if((gH|0)==3){k3=+uz(c[gG+8>>2]|0,0)}else{b7=780;break L27}if((c[b6>>2]|0)==3){uu(c[cc>>2]|0);c[b6>>2]=1}h[7077]=k3;kU=c[13898]|0;kV=c[8272]|0}if((kU|0)>=(kV|0)){kO=kU;break L1064}gE=kU;gy=kV;gz=c[1054]|0}}else{kO=gx}}while(0);if((gx|0)!=(kO|0)){break}h[7077]=1.0}else if((gD|0)==8){gC=gv+1|0;c[13898]=gC;gz=c[8272]|0;gy=(gC|0)<(gz|0);L1136:do{if(gy){if((a[gw+(gC*40&-1)|0]&1)==0){k4=gC;k5=gz;k6=gw;b7=794;break}gE=c[gw+(gC*40&-1)+36>>2]|0;gG=gw+(gC*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(gE|0)){break}if((a[gB+((c[gG>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{b7=793;break L1136}}if((gH|0)==1){b7=792}else{b7=793}}else{b7=792}}while(0);if((b7|0)==792){b7=0;c[11692]=31;c[14088]=1;c[14074]=c[12768];c[14075]=c[12769];c[14076]=c[12770];c[14077]=c[12771];c[14078]=c[12772];c[14079]=c[12773];c[14080]=c[12774];c[14081]=c[12775];c[14082]=c[12776];c[14083]=c[12777];c[14084]=c[12778];c[14085]=c[12779];c[14086]=c[12780];c[14087]=c[12781];b7=793}if((b7|0)==793){b7=0;if(gy){k4=gC;k5=gz;k6=gw;b7=794}}L1147:do{if((b7|0)==794){while(1){b7=0;L1150:do{if((a[k6+(k4*40&-1)|0]&1)==0){b7=810}else{gx=c[k6+(k4*40&-1)+36>>2]|0;gG=k6+(k4*40&-1)+32|0;gE=c[10036]|0;hS=0;while(1){if((hS|0)>=(gx|0)){b7=798;break}if((a[gE+((c[gG>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==798){b7=0;if((hS|0)==1){break L1147}}if((k5|0)>(k4|0)){k7=0}else{b7=810;break}while(1){if((k7|0)>=(gx|0)){b7=802;break}if((a[gE+((c[gG>>2]|0)+k7|0)|0]|0)==(a[k7+150856|0]|0)){k7=k7+1|0}else{k8=0;break}}do{if((b7|0)==802){b7=0;if((k7|0)!=5){k8=0;break}c[14088]=1;hS=k4+1|0;c[13898]=hS;k9=hS;break L1150}}while(0);while(1){if((k8|0)>=(gx|0)){break}if((a[gE+((c[gG>>2]|0)+k8|0)|0]|0)==(a[k8+150704|0]|0)){k8=k8+1|0}else{b7=810;break L1150}}if((k8|0)!=4){b7=810;break}c[14088]=0;gG=k4+1|0;c[13898]=gG;k9=gG}}while(0);do{if((b7|0)==810){b7=0;hH(56296,1,0);gG=c[13898]|0;if((k4|0)!=(gG|0)){k9=gG;break}gG=is(bZ)|0;gE=c[gG>>2]|0;if((gE|0)==1){la=+(c[gG+8>>2]|0)}else if((gE|0)==2){la=+h[gG+8>>3]}else if((gE|0)==3){la=+uz(c[gG+8>>2]|0,0)}else{b7=815;break L27}if((c[b4>>2]|0)==3){uu(c[cg>>2]|0);c[b4>>2]=1}c[11692]=~~la;k9=c[13898]|0}}while(0);gG=c[8272]|0;if((k9|0)>=(gG|0)){break L1147}k4=k9;k5=gG;k6=c[1054]|0;b7=794}}}while(0);c[260]=c[11692]}else if((gD|0)==9){gz=gv+1|0;c[13898]=gz;gC=c[8272]|0;L1184:do{if((gz|0)<(gC|0)){L1186:do{if((a[gw+(gz*40&-1)|0]&1)!=0){gy=c[gw+(gz*40&-1)+36>>2]|0;gH=gw+(gz*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(gy|0)){break}if((a[gB+((c[gH>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{break L1186}}if((gG|0)==1){b7=826;break L1184}}}while(0);gH=is(bY)|0;gy=c[gH>>2]|0;if((gy|0)==1){lb=+(c[gH+8>>2]|0)}else if((gy|0)==2){lb=+h[gH+8>>3]}else if((gy|0)==3){lb=+uz(c[gH+8>>2]|0,0)}else{b7=831;break L27}if((c[ch>>2]|0)==3){uu(c[ci>>2]|0);c[ch>>2]=1}h[7030]=lb;lc=c[13898]|0;ld=c[8272]|0}else{b7=826}}while(0);if((b7|0)==826){b7=0;h[7030]=-1.0;a[56232]=1;lc=gz;ld=gC}if((lc|0)>=(ld|0)){break}gH=c[1054]|0;if((a[gH+(lc*40&-1)|0]&1)==0){b7=5123;break L27}gy=c[gH+(lc*40&-1)+36>>2]|0;gE=gH+(lc*40&-1)+32|0;gH=c[10036]|0;gx=0;while(1){if((gx|0)>=(gy|0)){b7=840;break}hS=c[gE>>2]|0;if((a[gH+(hS+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{le=hS;break}}if((b7|0)==840){b7=0;if((gx|0)==1){break}le=c[gE>>2]|0}if((gy|0)>0){lf=0;lg=0;lh=le}else{b7=5124;break L27}while(1){if((a[lf+126368|0]|0)==(a[gH+(lf+lh|0)|0]|0)){li=lh;lk=lg}else{if((lf|0)!=1){lm=0;ln=0;lo=le;b7=849;break}li=lh-1|0;lk=1}gC=lf+1|0;if((gC|0)<(lk+gy|0)){lf=gC;lg=lk;lh=li}else{b7=847;break}}do{if((b7|0)==847){b7=0;if((lk|0)!=0){lp=1;break}if((lf|0)==0|(lf|0)==8){lp=1}else{lm=0;ln=0;lo=le;b7=849}}}while(0);do{if((b7|0)==849){while(1){b7=0;if((a[lm+126280|0]|0)==(a[gH+(lm+lo|0)|0]|0)){lq=lo;lr=ln}else{if((lm|0)!=1){b7=5125;break L27}lq=lo-1|0;lr=1}gE=lm+1|0;if((gE|0)<(lr+gy|0)){lm=gE;ln=lr;lo=lq;b7=849}else{break}}if((lr|0)!=0){lp=0;break}if((lm|0)==0|(lm|0)==8){lp=0}else{b7=5126;break L27}}}while(0);a[56232]=lp;c[13898]=lc+1}else if((gD|0)==10){gy=gv+1|0;c[13898]=gy;a[35888]=1;if((gy|0)>=(c[8272]|0)){break}L1234:do{if((a[gw+(gy*40&-1)|0]&1)!=0){gH=c[gw+(gy*40&-1)+36>>2]|0;gE=gw+(gy*40&-1)+32|0;gx=0;while(1){if((gx|0)>=(gH|0)){break}if((a[gB+((c[gE>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{break L1234}}if((gx|0)==1){break L44}}}while(0);a[14176]=1;is(bX);a[14176]=0;if((c[cj>>2]|0)!=3){c[13898]=gy;break}gE=c[ck>>2]|0;if((gE|0)==0){break}uF(53520,gE|0,32);uu(gE)}else if((gD|0)==11){lt=gv+1|0;c[13898]=lt;L1246:do{if((lt|0)<(c[8272]|0)){if((a[gw+(lt*40&-1)|0]&1)==0){b7=5127;break L27}gE=c[gw+(lt*40&-1)+36>>2]|0;gH=gw+(lt*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(gE|0)){b7=872;break}gz=c[gH>>2]|0;if((a[gB+(gz+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{lu=gz;break}}if((b7|0)==872){b7=0;if((gC|0)==1){b7=874;break}lu=c[gH>>2]|0}if((gE|0)>0){lv=0;lw=0;lx=lu}else{b7=5128;break L27}while(1){if((a[lv+144616|0]|0)==(a[gB+(lv+lx|0)|0]|0)){ly=lx;lA=lw}else{if((lv|0)!=1){lB=0;lC=0;lD=lu;break}ly=lx-1|0;lA=1}gx=lv+1|0;if((gx|0)<(lA+gE|0)){lv=gx;lw=lA;lx=ly}else{b7=880;break}}do{if((b7|0)==880){b7=0;if((lA|0)==0){if(!((lv|0)==0|(lv|0)==6)){lB=0;lC=0;lD=lu;break}}a[54144]=1;break L1246}}while(0);while(1){if((a[lB+143008|0]|0)==(a[gB+(lB+lD|0)|0]|0)){lE=lD;lF=lC}else{if((lB|0)!=1){lG=0;lH=0;lI=lu;break}lE=lD-1|0;lF=1}gH=lB+1|0;if((gH|0)<(lF+gE|0)){lB=gH;lC=lF;lD=lE}else{b7=887;break}}do{if((b7|0)==887){b7=0;if((lF|0)==0){if(!((lB|0)==0|(lB|0)==3)){lG=0;lH=0;lI=lu;break}}a[54160]=1;break L1246}}while(0);while(1){if((a[lG+141464|0]|0)==(a[gB+(lG+lI|0)|0]|0)){lJ=lI;lK=lH}else{if((lG|0)!=1){b7=5129;break L27}lJ=lI-1|0;lK=1}gH=lG+1|0;if((gH|0)<(lK+gE|0)){lG=gH;lH=lK;lI=lJ}else{break}}if((lK|0)==0){if(!((lG|0)==0|(lG|0)==3)){b7=5130;break L27}}a[54152]=1}else{b7=874}}while(0);if((b7|0)==874){b7=0;a[54144]=1}c[13898]=gv+2}else if((gD|0)==12){lL=gv+1|0;c[13898]=lL;do{if((lL|0)<(c[8272]|0)){if((a[gw+(lL*40&-1)|0]&1)==0){b7=5144;break L27}gy=c[gw+(lL*40&-1)+36>>2]|0;gE=gw+(lL*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(gy|0)){b7=904;break}gC=c[gE>>2]|0;if((a[gB+(gC+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{lM=gC;break}}if((b7|0)==904){b7=0;if((gH|0)==1){break}lM=c[gE>>2]|0}if((gy|0)>0){lN=0;lO=0;lP=lM}else{b7=5145;break L27}while(1){if((a[lN+144616|0]|0)==(a[gB+(lN+lP|0)|0]|0)){lQ=lP;lR=lO}else{if((lN|0)!=1){lS=0;lT=0;lU=lM;break}lQ=lP-1|0;lR=1}gC=lN+1|0;if((gC|0)<(lR+gy|0)){lN=gC;lO=lR;lP=lQ}else{b7=912;break}}do{if((b7|0)==912){b7=0;if((lR|0)==0){if(!((lN|0)==6|(lN|0)==0)){lS=0;lT=0;lU=lM;break}}c[13898]=gv+2;gE=is(bW)|0;gH=c[gE>>2]|0;if((gH|0)==1){lV=+(c[gE+8>>2]|0)}else if((gH|0)==2){lV=+h[gE+8>>3]}else if((gH|0)==3){lV=+uz(c[gE+8>>2]|0,0)}else{b7=918;break L27}if((c[cl>>2]|0)==3){uu(c[cm>>2]|0);c[cl>>2]=1}c[13366]=~~lV;break L44}}while(0);while(1){if((a[lS+128720|0]|0)==(a[gB+(lS+lU|0)|0]|0)){lW=lU;lX=lT}else{if((lS|0)!=2){lY=0;lZ=0;l_=lM;break}lW=lU-1|0;lX=1}gE=lS+1|0;if((gE|0)<(lX+gy|0)){lS=gE;lT=lX;lU=lW}else{b7=926;break}}do{if((b7|0)==926){b7=0;if((lX|0)==0){if(!((lS|0)==6|(lS|0)==1)){lY=0;lZ=0;l_=lM;break}}c[13898]=gv+2;c[13378]=0;break L44}}while(0);while(1){if((a[lY+128624|0]|0)==(a[gB+(lY+l_|0)|0]|0)){l$=l_;l0=lZ}else{if((lY|0)!=1){l1=0;l2=0;l3=lM;break}l$=l_-1|0;l0=1}gE=lY+1|0;if((gE|0)<(l0+gy|0)){lY=gE;lZ=l0;l_=l$}else{b7=933;break}}do{if((b7|0)==933){b7=0;if((l0|0)==0){if(!((lY|0)==11|(lY|0)==0)){l1=0;l2=0;l3=lM;break}}c[13898]=gv+2;c[13378]=1;break L44}}while(0);while(1){if((a[l1+128536|0]|0)==(a[gB+(l1+l3|0)|0]|0)){l4=l3;l5=l2}else{if((l1|0)!=1){l6=0;l7=0;l8=lM;break}l4=l3-1|0;l5=1}gE=l1+1|0;if((gE|0)<(l5+gy|0)){l1=gE;l2=l5;l3=l4}else{b7=940;break}}do{if((b7|0)==940){b7=0;if((l5|0)==0){if(!((l1|0)==7|(l1|0)==0)){l6=0;l7=0;l8=lM;break}}c[13898]=gv+2;c[13378]=2;break L44}}while(0);while(1){if((a[l6+128464|0]|0)==(a[gB+(l6+l8|0)|0]|0)){l9=l8;ma=l7}else{if((l6|0)!=2){mb=0;mc=0;md=lM;break}l9=l8-1|0;ma=1}gE=l6+1|0;if((gE|0)<(ma+gy|0)){l6=gE;l7=ma;l8=l9}else{b7=947;break}}do{if((b7|0)==947){b7=0;if((ma|0)==0){if(!((l6|0)==6|(l6|0)==1)){mb=0;mc=0;md=lM;break}}gE=gv+2|0;c[13898]=gE;gH=c[6074]|0;if((gH|0)==0){b7=951}else{if((c[gH+32>>2]|0)==0){b7=951}else{me=gE;mf=gw}}if((b7|0)==951){b7=0;uu(c[11662]|0);c[11658]=0;c[11659]=0;c[11662]=0;gE=ut(40)|0;if((gE|0)==0){gk();gH=ut(40)|0;if((gH|0)==0){b7=953;break L27}else{mg=gH}}else{mg=gE}c[11662]=mg;c[11658]=5;c[11659]=0;c[11660]=10;c[11661]=8;me=c[13898]|0;mf=c[1054]|0}gE=c[mf+(me*40&-1)+36>>2]|0;gH=c[mf+(me*40&-1)+32>>2]|0;gC=(a[mf+(me*40&-1)|0]&1)==0;L1373:do{if((gE|0)>0&(gC^1)){gx=c[10036]|0;gz=0;hS=0;hF=gH;while(1){if((a[gz+128352|0]|0)==(a[gx+(gz+hF|0)|0]|0)){mh=hF;mi=hS}else{if((gz|0)!=2){break}mh=hF-1|0;mi=1}cd=gz+1|0;if((cd|0)<(mi+gE|0)){gz=cd;hS=mi;hF=mh}else{b7=961;break}}do{if((b7|0)==961){b7=0;if((mi|0)==0){if(!((gz|0)==1|(gz|0)==8)){break}}c[13372]=2;mj=me+1|0;c[13898]=mj;if((mj|0)>=(c[8272]|0)){b7=5131;break L27}L1387:do{if((a[mf+(mj*40&-1)|0]&1)!=0){hF=c[mf+(mj*40&-1)+36>>2]|0;hS=mf+(mj*40&-1)+32|0;cd=0;while(1){if((cd|0)>=(hF|0)){break}if((a[gx+((c[hS>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{break L1387}}if((cd|0)==1){b7=5132;break L27}}}while(0);hS=is(bT)|0;hF=c[hS>>2]|0;if((hF|0)==1){mk=+(c[hS+8>>2]|0)}else if((hF|0)==2){mk=+h[hS+8>>3]}else if((hF|0)==3){mk=+uz(c[hS+8>>2]|0,0)}else{b7=974;break L27}if((c[cn>>2]|0)==3){uu(c[co>>2]|0);c[cn>>2]=1}hS=c[11662]|0;if((hS|0)==0){b7=978;break L27}hF=c[11659]|0;hp=c[11658]|0;do{if((hF|0)<(hp|0)){ml=hS;mm=hF}else{gA=(c[11660]|0)+hp|0;if((gA|0)==0){uu(hS);c[11662]=0;c[11658]=0;c[11659]=0;ml=0;mm=0;break}else{ho=db(hS,aa(c[11661]|0,gA),150384)|0;c[11662]=ho;c[11658]=gA;ml=ho;mm=c[11659]|0;break}}}while(0);hS=c[11661]|0;c[11659]=mm+1;h[ml+aa(hS,mm)>>3]=mk;hS=c[13898]|0;hp=c[8272]|0;L1409:do{if((hS|0)<(hp|0)){mn=hS;hF=hp;while(1){ho=c[1054]|0;if((a[ho+(mn*40&-1)|0]&1)==0){b7=5133;break L27}gA=c[ho+(mn*40&-1)+36>>2]|0;hG=ho+(mn*40&-1)+32|0;ho=c[10036]|0;hR=0;while(1){if((hR|0)>=(gA|0)){b7=988;break}if((a[ho+((c[hG>>2]|0)+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{break}}if((b7|0)==988){b7=0;if((hR|0)==1){break L1409}}if((hF|0)>(mn|0)){mo=0}else{b7=5134;break L27}while(1){if((mo|0)>=(gA|0)){break}if((a[ho+((c[hG>>2]|0)+mo|0)|0]|0)==(a[mo+148464|0]|0)){mo=mo+1|0}else{b7=5135;break L27}}if((mo|0)!=1){b7=5136;break L27}c[13898]=mn+1;hG=is(bS)|0;ho=c[hG>>2]|0;if((ho|0)==1){mp=+(c[hG+8>>2]|0)}else if((ho|0)==2){mp=+h[hG+8>>3]}else if((ho|0)==3){mp=+uz(c[hG+8>>2]|0,0)}else{b7=998;break L27}if((c[cp>>2]|0)==3){uu(c[cq>>2]|0);c[cp>>2]=1}hG=c[11662]|0;if((hG|0)==0){b7=1002;break L27}ho=c[11659]|0;gA=c[11658]|0;do{if((ho|0)<(gA|0)){mq=hG;mr=ho}else{hR=(c[11660]|0)+gA|0;if((hR|0)==0){uu(hG);c[11662]=0;c[11658]=0;c[11659]=0;mq=0;mr=0;break}else{hC=db(hG,aa(c[11661]|0,hR),150384)|0;c[11662]=hC;c[11658]=hR;mq=hC;mr=c[11659]|0;break}}}while(0);hG=c[11661]|0;c[11659]=mr+1;h[mq+aa(hG,mr)>>3]=mp;hG=c[13898]|0;gA=c[8272]|0;if((hG|0)<(gA|0)){mn=hG;hF=gA}else{break}}}}while(0);c[13374]=c[11659];break L44}}while(0);if(gC){break}else{ms=0;mt=0;mu=gH}while(1){if((a[ms+127912|0]|0)==(a[gx+(ms+mu|0)|0]|0)){mv=mu;mw=mt}else{if((ms|0)!=2){mx=0;my=0;mz=gH;break}mv=mu-1|0;mw=1}gz=ms+1|0;if((gz|0)<(mw+gE|0)){ms=gz;mt=mw;mu=mv}else{b7=1014;break}}do{if((b7|0)==1014){b7=0;if((mw|0)==0){if(!((ms|0)==1|(ms|0)==11)){mx=0;my=0;mz=gH;break}}c[13372]=1;c[13898]=me+1;gz=is(bR)|0;hp=c[gz>>2]|0;if((hp|0)==1){mA=+(c[gz+8>>2]|0)}else if((hp|0)==2){mA=+h[gz+8>>3]}else if((hp|0)==3){mA=+uz(c[gz+8>>2]|0,0)}else{b7=1020;break L27}if((c[cr>>2]|0)==3){uu(c[cs>>2]|0);c[cr>>2]=1}h[c[11662]>>3]=mA;mB=c[13898]|0;if((c[8272]|0)<=(mB|0)){b7=5137;break L27}gz=c[1054]|0;if((a[gz+(mB*40&-1)|0]&1)==0){b7=5138;break L27}hp=c[gz+(mB*40&-1)+36>>2]|0;hS=gz+(mB*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[gz+((c[hS>>2]|0)+hF|0)|0]|0)==(a[hF+148464|0]|0)){hF=hF+1|0}else{b7=5139;break L27}}if((hF|0)!=1){b7=5140;break L27}c[13898]=mB+1;hS=is(bQ)|0;gz=c[hS>>2]|0;if((gz|0)==1){mC=+(c[hS+8>>2]|0)}else if((gz|0)==2){mC=+h[hS+8>>3]}else if((gz|0)==3){mC=+uz(c[hS+8>>2]|0,0)}else{b7=1034;break L27}if((c[ct>>2]|0)==3){uu(c[cu>>2]|0);c[ct>>2]=1}h[(c[11662]|0)+8>>3]=mC;mD=c[13898]|0;if(mC==0.0){b7=1038;break L27}if((mD|0)>=(c[8272]|0)){break L44}hS=c[1054]|0;if((a[hS+(mD*40&-1)|0]&1)==0){b7=5141;break L27}gz=c[hS+(mD*40&-1)+36>>2]|0;hp=hS+(mD*40&-1)+32|0;hS=c[10036]|0;cd=0;while(1){if((cd|0)>=(gz|0)){b7=1044;break}if((a[hS+((c[hp>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{mE=0;break}}if((b7|0)==1044){b7=0;if((cd|0)==1){break L44}else{mE=0}}while(1){if((mE|0)>=(gz|0)){break}if((a[hS+((c[hp>>2]|0)+mE|0)|0]|0)==(a[mE+148464|0]|0)){mE=mE+1|0}else{b7=5142;break L27}}if((mE|0)!=1){b7=5143;break L27}c[13898]=mD+1;c[11659]=2;hp=is(bO)|0;hS=c[hp>>2]|0;if((hS|0)==1){mF=+(c[hp+8>>2]|0)}else if((hS|0)==2){mF=+h[hp+8>>3]}else if((hS|0)==3){mF=+uz(c[hp+8>>2]|0,0)}else{b7=1053;break L27}if((c[cv>>2]|0)==3){uu(c[cw>>2]|0);c[cv>>2]=1}hp=c[11662]|0;c[13374]=~~((mF- +h[hp>>3])/+h[hp+8>>3]+1.0);break L44}}while(0);while(1){if((a[mx+127456|0]|0)==(a[gx+(mx+mz|0)|0]|0)){mG=mz;mH=my}else{if((mx|0)!=2){break L1373}mG=mz-1|0;mH=1}hp=mx+1|0;if((hp|0)<(mH+gE|0)){mx=hp;my=mH;mz=mG}else{break}}if((mH|0)==0){if(!((mx|0)==1|(mx|0)==4)){break}}c[13372]=0;hp=me+1|0;c[13898]=hp;if((hp|0)>=(c[8272]|0)){break L44}L1507:do{if((a[mf+(hp*40&-1)|0]&1)!=0){hS=c[mf+(hp*40&-1)+36>>2]|0;gz=mf+(hp*40&-1)+32|0;cd=0;while(1){if((cd|0)>=(hS|0)){break}if((a[gx+((c[gz>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{break L1507}}if((cd|0)==1){break L44}}}while(0);gx=is(bN)|0;hp=c[gx>>2]|0;if((hp|0)==1){mI=+(c[gx+8>>2]|0)}else if((hp|0)==2){mI=+h[gx+8>>3]}else if((hp|0)==3){mI=+uz(c[gx+8>>2]|0,0)}else{b7=1073;break L27}if((c[cx>>2]|0)==3){uu(c[cy>>2]|0);c[cx>>2]=1}c[13374]=~~mI;break L44}}while(0);if((c[13372]|0)==2){b7=1078;break L27}gE=is(bM)|0;gH=c[gE>>2]|0;if((gH|0)==1){mJ=+(c[gE+8>>2]|0)}else if((gH|0)==2){mJ=+h[gE+8>>3]}else if((gH|0)==3){mJ=+uz(c[gE+8>>2]|0,0)}else{b7=1083;break L27}if((c[cA>>2]|0)==3){uu(c[cC>>2]|0);c[cA>>2]=1}c[13374]=~~mJ;break L44}}while(0);while(1){if((a[mb+127152|0]|0)==(a[gB+(mb+md|0)|0]|0)){mK=md;mL=mc}else{if((mb|0)!=1){b7=5146;break L27}mK=md-1|0;mL=1}gE=mb+1|0;if((gE|0)<(mL+gy|0)){mb=gE;mc=mL;md=mK}else{break}}if((mL|0)==0){if(!((mb|0)==5|(mb|0)==0)){b7=5147;break L27}}c[13898]=gv+2;gy=is(bV)|0;gE=c[gy>>2]|0;if((gE|0)==1){mM=+(c[gy+8>>2]|0)}else if((gE|0)==2){mM=+h[gy+8>>3]}else if((gE|0)==3){mM=+uz(c[gy+8>>2]|0,0)}else{b7=1097;break L27}if((c[cD>>2]|0)==3){uu(c[cE>>2]|0);c[cD>>2]=1}gy=~~mM;if((gy-2|0)>>>0>8){b7=1101;break L27}c[13368]=gy;break L44}}while(0);c[13366]=5;c[13378]=0;c[13368]=4;c[13374]=5;c[13372]=0}else if((gD|0)==13){mN=gv+1|0;c[13898]=mN;do{if((mN|0)<(c[8272]|0)){if((a[gw+(mN*40&-1)|0]&1)==0){b7=5148;break L27}gy=c[gw+(mN*40&-1)+36>>2]|0;gE=gw+(mN*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(gy|0)){b7=1109;break}gC=c[gE>>2]|0;if((a[gB+(gC+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{mO=gC;break}}if((b7|0)==1109){b7=0;if((gH|0)==1){break}mO=c[gE>>2]|0}if((gy|0)>0){mP=0;mQ=0;mR=mO}else{b7=5149;break L27}while(1){if((a[mP+129472|0]|0)==(a[gB+(mP+mR|0)|0]|0)){mS=mR;mT=mQ}else{if((mP|0)!=2){mU=0;mV=0;mW=mO;b7=1120;break}mS=mR-1|0;mT=1}gC=mP+1|0;if((gC|0)<(mT+gy|0)){mP=gC;mQ=mT;mR=mS}else{b7=1117;break}}do{if((b7|0)==1117){b7=0;if((mT|0)==0){if(!((mP|0)==1|(mP|0)==4)){mU=0;mV=0;mW=mO;b7=1120;break}}c[11690]=1}}while(0);L1574:do{if((b7|0)==1120){while(1){b7=0;if((a[mU+129312|0]|0)==(a[gB+(mU+mW|0)|0]|0)){mX=mW;mY=mV}else{if((mU|0)!=1){mZ=0;m_=0;m$=mO;break}mX=mW-1|0;mY=1}gE=mU+1|0;if((gE|0)<(mY+gy|0)){mU=gE;mV=mY;mW=mX;b7=1120}else{b7=1124;break}}do{if((b7|0)==1124){b7=0;if((mY|0)==0){if(!((mU|0)==0|(mU|0)==7)){mZ=0;m_=0;m$=mO;break}}c[11690]=2;break L1574}}while(0);while(1){if((a[mZ+129032|0]|0)==(a[gB+(mZ+m$|0)|0]|0)){m0=m$;m1=m_}else{if((mZ|0)!=2){b7=5150;break L27}m0=m$-1|0;m1=1}gE=mZ+1|0;if((gE|0)<(m1+gy|0)){mZ=gE;m_=m1;m$=m0}else{break}}if((m1|0)==0){if(!((mZ|0)==1|(mZ|0)==4)){b7=5151;break L27}}c[11690]=3}}while(0);c[13898]=gv+2;break L44}}while(0);c[11690]=1}else if((gD|0)==17){gy=c[11732]|0;gE=c[11756]|0;gH=c[11734]|0;m2=+h[5865];m3=+h[5864];c[11752]=0;a[47016]=0;gC=gv+1|0;c[13898]=gC;gG=c[8272]|0;L1599:do{if((gC|0)<(gG|0)){gx=gy;hp=gE;gz=gH;m4=m2;m5=m3;hS=0;hF=gC;gA=gG;hG=gw;while(1){ho=(a[hG+(hF*40&-1)|0]&1)==0;hC=c[hG+(hF*40&-1)+36>>2]|0;L1602:do{if(ho){m6=c[10036]|0;m7=hG+(hF*40&-1)+32|0}else{hR=hG+(hF*40&-1)+32|0;hw=c[10036]|0;gF=0;while(1){if((gF|0)>=(hC|0)){break}if((a[hw+((c[hR>>2]|0)+gF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{m6=hw;m7=hR;break L1602}}if((gF|0)==1){m8=gx;m9=hp;na=gz;nb=m4;nc=m5;break L1599}else{m6=hw;m7=hR}}}while(0);hB=c[m7>>2]|0;hK=(hC|0)>0;nd=46944;ne=103784;L1610:while(1){L1612:do{if(!ho){if(hK){nf=0;ng=0;nh=hB;while(1){ni=a[ne+nf|0]|0;if(ni<<24>>24==(a[m6+(nf+nh|0)|0]|0)){nj=nh;nk=ng}else{if(ni<<24>>24!=36){break L1612}nj=nh-1|0;nk=1}nl=nf+1|0;if((nl|0)<(nk+hC|0)){nf=nl;ng=nk;nh=nj}else{break}}if((nk|0)==0){nm=nl}else{nn=nd;break L1610}}else{nm=0}nh=a[ne+nm|0]|0;if((nh<<24>>24|0)==36|(nh<<24>>24|0)==0){nn=nd;break L1610}}}while(0);hR=nd+8|0;hw=c[hR>>2]|0;if((hw|0)==0){nn=hR;break}else{nd=hR;ne=hw}}ne=c[nn+4>>2]|0;L1625:do{if((ne|0)==8){no=hF;b7=1210}else{c[11752]=ne;nd=hF+1|0;c[13898]=nd;if((ne|0)==1){if((nd|0)>=(gA|0)){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break}L1630:do{if((a[hG+(nd*40&-1)|0]&1)!=0){hC=c[hG+(nd*40&-1)+36>>2]|0;hB=hG+(nd*40&-1)+32|0;hK=0;while(1){if((hK|0)>=(hC|0)){break}if((a[m6+((c[hB>>2]|0)+hK|0)|0]|0)==(a[hK+103664|0]|0)){hK=hK+1|0}else{break L1630}}if((hK|0)==1){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break L1625}}}while(0);hB=is(bL)|0;hC=c[hB>>2]|0;if((hC|0)==1){nv=+(c[hB+8>>2]|0)}else if((hC|0)==2){nv=+h[hB+8>>3]}else if((hC|0)==3){nv=+uz(c[hB+8>>2]|0,0)}else{b7=1165;break L27}if((c[cL>>2]|0)==3){uu(c[cM>>2]|0);c[cL>>2]=1}np=hS;nq=m5;nr=m4;ns=~~nv;nt=hp;nu=gx;break}else if((ne|0)==2){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break}else if(!((ne|0)==3|(ne|0)==5|(ne|0)==4|(ne|0)==6|(ne|0)==7)){no=nd;b7=1210;break}L1646:do{if((nd|0)<(gA|0)){if((a[hG+(nd*40&-1)|0]&1)==0){nw=nd;break}hB=c[hG+(nd*40&-1)+36>>2]|0;hC=hG+(nd*40&-1)+32|0;ho=0;while(1){if((ho|0)>=(hB|0)){b7=1174;break}if((a[m6+((c[hC>>2]|0)+ho|0)|0]|0)==(a[ho+103664|0]|0)){ho=ho+1|0}else{b7=1175;break}}if((b7|0)==1174){b7=0;if(!((ho|0)!=1&(hB|0)>0)){nw=nd;break}}else if((b7|0)==1175){b7=0;if((hB|0)<=0){nw=nd;break}}hK=0;hw=0;hR=c[hC>>2]|0;while(1){if((a[hK+130016|0]|0)==(a[m6+(hK+hR|0)|0]|0)){nx=hR;ny=hw}else{if((hK|0)!=5){nw=nd;break L1646}nx=hR-1|0;ny=1}gF=hK+1|0;if((gF|0)<(ny+hB|0)){hK=gF;hw=ny;hR=nx}else{break}}if((ny|0)==0){if(!((hK|0)==4|(hK|0)==10)){nw=nd;break}}a[47016]=1;hR=hF+2|0;c[13898]=hR;nw=hR}else{nw=nd}}while(0);if((nw|0)>=(gA|0)){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break}L1668:do{if((a[hG+(nw*40&-1)|0]&1)!=0){nd=c[hG+(nw*40&-1)+36>>2]|0;hR=hG+(nw*40&-1)+32|0;hw=0;while(1){if((hw|0)>=(nd|0)){break}if((a[m6+((c[hR>>2]|0)+hw|0)|0]|0)==(a[hw+103664|0]|0)){hw=hw+1|0}else{break L1668}}if((hw|0)==1){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break L1625}}}while(0);hR=is(bK)|0;nd=c[hR>>2]|0;if((nd|0)==1){nz=+(c[hR+8>>2]|0)}else if((nd|0)==2){nz=+h[hR+8>>3]}else if((nd|0)==3){nz=+uz(c[hR+8>>2]|0,0)}else{b7=1194;break L27}if((c[cN>>2]|0)==3){uu(c[cO>>2]|0);c[cN>>2]=1}hR=c[13898]|0;if((c[8272]|0)<=(hR|0)){np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break}nd=c[1054]|0;if((a[nd+(hR*40&-1)|0]&1)==0){np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break}hK=c[nd+(hR*40&-1)+36>>2]|0;hB=nd+(hR*40&-1)+32|0;nd=c[10036]|0;hC=0;while(1){if((hC|0)>=(hK|0)){break}if((a[nd+((c[hB>>2]|0)+hC|0)|0]|0)==(a[hC+148464|0]|0)){hC=hC+1|0}else{np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break L1625}}if((hC|0)!=1){np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break}c[13898]=hR+1;hB=is(bJ)|0;nd=c[hB>>2]|0;if((nd|0)==1){nA=+(c[hB+8>>2]|0)}else if((nd|0)==2){nA=+h[hB+8>>3]}else if((nd|0)==3){nA=+uz(c[hB+8>>2]|0,0)}else{b7=1207;break L27}if((c[cP>>2]|0)!=3){np=hS;nq=nA;nr=nz;ns=gz;nt=hp;nu=gx;break}uu(c[cQ>>2]|0);c[cP>>2]=1;np=hS;nq=nA;nr=nz;ns=gz;nt=hp;nu=gx}}while(0);L1696:do{if((b7|0)==1210){b7=0;L1698:do{if((gA|0)>(no|0)){if((a[hG+(no*40&-1)|0]&1)==0){break}ne=c[hG+(no*40&-1)+36>>2]|0;hB=hG+(no*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(ne|0)){break}if((a[m6+((c[hB>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L1698}}if((nd|0)!=1){break}c[13898]=no+1;np=hS+1|0;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break L1696}}while(0);if((hS|0)==0){hR=is(bI)|0;hC=c[hR>>2]|0;if((hC|0)==1){nB=+(c[hR+8>>2]|0)}else if((hC|0)==2){nB=+h[hR+8>>3]}else if((hC|0)==3){nB=+uz(c[hR+8>>2]|0,0)}else{b7=1224;break L27}if((c[cF>>2]|0)==3){uu(c[cG>>2]|0);c[cF>>2]=1}hR=~~nB;np=0;nq=m5;nr=m4;ns=gz;nt=hR;nu=hR;break}else if((hS|0)==1){hR=is(bH)|0;hC=c[hR>>2]|0;if((hC|0)==1){nC=+(c[hR+8>>2]|0)}else if((hC|0)==2){nC=+h[hR+8>>3]}else if((hC|0)==3){nC=+uz(c[hR+8>>2]|0,0)}else{b7=1232;break L27}if((c[cH>>2]|0)==3){uu(c[cI>>2]|0);c[cH>>2]=1}np=1;nq=m5;nr=m4;ns=gz;nt=~~nC;nu=gx;break}else if((hS|0)==2){hR=is(bG)|0;hC=c[hR>>2]|0;if((hC|0)==1){nD=+(c[hR+8>>2]|0)}else if((hC|0)==2){nD=+h[hR+8>>3]}else if((hC|0)==3){nD=+uz(c[hR+8>>2]|0,0)}else{b7=1240;break L27}if((c[cJ>>2]|0)==3){uu(c[cK>>2]|0);c[cJ>>2]=1}np=2;nq=m5;nr=m4;ns=~~nD;nt=hp;nu=gx;break}else{b7=1244;break L27}}}while(0);hR=c[13898]|0;hC=c[8272]|0;if((hR|0)>=(hC|0)){m8=nu;m9=nt;na=ns;nb=nr;nc=nq;break L1599}gx=nu;hp=nt;gz=ns;m4=nr;m5=nq;hS=np;hF=hR;gA=hC;hG=c[1054]|0}}else{m8=gy;m9=gE;na=gH;nb=m2;nc=m3}}while(0);if((m8-2|0)>>>0>998){b7=5152;break L27}if((m9-2|0)>>>0>998){b7=5153;break L27}if((c[11752]|0)==0){c[11752]=1}if(nb<0.0|nc<0.0){b7=1251;break L27}c[11732]=m8;c[11756]=m9;c[11734]=na;h[5865]=nb;h[5864]=nc;a[47032]=1}else if((gD|0)==20){c[13898]=gv+1;uu(c[12886]|0);c[12886]=0;nE=c[13898]|0;gH=c[8272]|0;L1745:do{if((nE|0)<(gH|0)){gE=c[1054]|0;L1747:do{if((a[gE+(nE*40&-1)|0]&1)!=0){gy=c[gE+(nE*40&-1)+36>>2]|0;gG=gE+(nE*40&-1)+32|0;gC=c[10036]|0;hG=0;while(1){if((hG|0)>=(gy|0)){b7=1258;break}if((a[gC+((c[gG>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{nF=0;break}}if((b7|0)==1258){b7=0;if((hG|0)==1){break L1745}else{nF=0}}while(1){if((nF|0)>=(gy|0)){b7=1265;break}if((a[gC+((c[gG>>2]|0)+nF|0)|0]|0)==(a[nF+132080|0]|0)){nF=nF+1|0}else{nG=0;break}}do{if((b7|0)==1265){b7=0;if((nF|0)!=6){nG=0;break}hG=nE+1|0;c[13898]=hG;L1760:do{if((hG|0)<(gH|0)){L1762:do{if((a[gE+(hG*40&-1)|0]&1)!=0){gA=c[gE+(hG*40&-1)+36>>2]|0;hF=gE+(hG*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(gA|0)){break}if((a[gC+((c[hF>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break L1762}}if((hS|0)==1){b7=1275;break L1760}}}while(0);a[14176]=1;is(bD);a[14176]=0;if((c[cU>>2]|0)==3){nd=c[cV>>2]|0;if((nd|0)==0){b7=1275;break}else{nH=nd;break}}else{c[13898]=hG;b7=1275;break}}else{b7=1275}}while(0);do{if((b7|0)==1275){b7=0;hG=bA(4,179864)|0;if((hG|0)!=0){nd=bP(hG|0)|0;if((nd|0)!=0){nH=nd;break}}nd=bU(130448)|0;if((nd|0)!=0){hG=bP(nd|0)|0;if((hG|0)!=0){nH=hG;break}}hG=bU(130352)|0;if((hG|0)!=0){nd=bP(hG|0)|0;if((nd|0)!=0){nH=nd;break}}nd=bU(130304)|0;if((nd|0)==0){nH=0;break}nH=bP(nd|0)|0}}while(0);if((bA(4,((nH|0)!=0?nH:179864)|0)|0)==0){b7=1284;break L27}nd=c[b$()>>2]|0;if((nd|0)==0){nI=0}else{nI=bP(nd|0)|0}c[12886]=nI;nd=c[m>>2]|0;cf(nd|0,130136,(v=i,i=i+8|0,c[v>>2]=nI,v)|0);uu(c[8270]|0);c[8270]=nH;bA(4,139696);break L44}}while(0);while(1){if((nG|0)>=(gy|0)){break}if((a[gC+((c[gG>>2]|0)+nG|0)|0]|0)==(a[nG+103664|0]|0)){nG=nG+1|0}else{break L1747}}if((nG|0)==1){b7=1293;break L27}}}while(0);a[14176]=1;is(bE);a[14176]=0;if((c[cR>>2]|0)!=3){b7=1292;break L27}gE=c[cT>>2]|0;c[12886]=gE;if((gE|0)==0){b7=1295;break L27}else{break L44}}}while(0);gH=c[8270]|0;do{if((gH|0)==0){nJ=0}else{if((aY(gH|0,139696)|0)==0){nJ=gH;break}bA(4,139696);nJ=c[8270]|0}}while(0);uu(nJ);c[8270]=0}else if((gD|0)==18){nK=gv+1|0;c[13898]=nK;gH=c[8272]|0;if((nK|0)>=(gH|0)){b7=5156;break L27}L1802:do{if((a[gw+(nK*40&-1)|0]&1)==0){nL=gw+(nK*40&-1)+32|0;nM=gw+(nK*40&-1)+36|0;b7=1308}else{gE=gw+(nK*40&-1)+36|0;gG=c[gE>>2]|0;gC=gw+(nK*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gG|0)){b7=1303;break}if((a[gB+((c[gC>>2]|0)+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{nN=0;break}}if((b7|0)==1303){b7=0;if((gy|0)==1){b7=5157;break L27}else{nN=0}}while(1){if((nN|0)>=(gG|0)){break}if((a[gB+((c[gC>>2]|0)+nN|0)|0]|0)==(a[nN+148464|0]|0)){nN=nN+1|0}else{nL=gC;nM=gE;b7=1308;break L1802}}if((nN|0)==1){nO=nK}else{nL=gC;nM=gE;b7=1308}}}while(0);if((b7|0)==1308){b7=0;gG=gv+2|0;c[13898]=gG;gy=c[nM>>2]|0;nd=(gy|0)>49?49:gy;gy=c[nL>>2]|0;hG=0;while(1){hF=hG+1|0;a[hG+24544|0]=a[gB+gy|0]|0;if((hF|0)==(nd|0)){break}else{gy=gy+1|0;hG=hF}}a[nd+24544|0]=0;nO=gG}if((nO|0)>=(gH|0)){break}if((a[gw+(nO*40&-1)|0]&1)==0){break}hG=c[gw+(nO*40&-1)+36>>2]|0;gy=gw+(nO*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hG|0)){b7=1316;break}if((a[gB+((c[gy>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{nP=0;break}}if((b7|0)==1316){b7=0;if((hF|0)==1){break}else{nP=0}}while(1){if((nP|0)>=(hG|0)){break}if((a[gB+((c[gy>>2]|0)+nP|0)|0]|0)==(a[nP+148464|0]|0)){nP=nP+1|0}else{break L44}}if((nP|0)!=1){break}nQ=nO+1|0;c[13898]=nQ;if((nQ|0)>=(gH|0)){b7=5158;break L27}L1833:do{if((a[gw+(nQ*40&-1)|0]&1)==0){nR=gw+(nQ*40&-1)+32|0;nS=gw+(nQ*40&-1)+36|0}else{gy=gw+(nQ*40&-1)+36|0;hG=c[gy>>2]|0;hF=gw+(nQ*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(hG|0)){break}if((a[gB+((c[hF>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{nR=hF;nS=gy;break L1833}}if((gG|0)==1){b7=5159;break L27}else{nR=hF;nS=gy}}}while(0);c[13898]=nO+2;gH=c[nS>>2]|0;hG=(gH|0)>49?49:gH;gH=c[nR>>2]|0;gE=0;while(1){gC=gE+1|0;a[gE+24595|0]=a[gB+gH|0]|0;if((gC|0)==(hG|0)){break}else{gH=gH+1|0;gE=gC}}a[hG+24595|0]=0}else if((gD|0)==19){nT=gv+1|0;c[13898]=nT;L1845:do{if((nT|0)<(c[8272]|0)){gE=(a[gw+(nT*40&-1)|0]&1)==0;gH=c[gw+(nT*40&-1)+36>>2]|0;gC=gw+(nT*40&-1)+32|0;L1847:do{if(!gE){nd=0;while(1){if((nd|0)>=(gH|0)){b7=1335;break}if((a[gB+((c[gC>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{nU=0;break}}if((b7|0)==1335){b7=0;if((nd|0)==1){b7=1336;break L1845}else{nU=0}}while(1){if((nU|0)>=(gH|0)){break}if((a[gB+((c[gC>>2]|0)+nU|0)|0]|0)==(a[nU+132080|0]|0)){nU=nU+1|0}else{break L1847}}if((nU|0)!=6){break}nd=bA(2,179864)|0;gA=(nd|0)==0;L1858:do{if(!gA){if((aQ(nd|0,131976)|0)==0){if((aQ(nd|0,131752)|0)!=0){b7=1343}}else{b7=1343}if((b7|0)==1343){b7=0;c[11252]=15}do{if((aQ(nd|0,200432)|0)==0){if((aQ(nd|0,131528)|0)!=0){break}if((aQ(nd|0,131448)|0)==0){break L1858}}}while(0);c[11252]=14}}while(0);c[13898]=(c[13898]|0)+1;a[cW]=a[25160]|0;a[cW+1|0]=a[25161|0]|0;a[cW+2|0]=a[25162|0]|0;c[by>>2]=3;c[bz>>2]=8;c[bB>>2]=cW;c[bC>>2]=48904;if(gA){break L1845}nd=cB(0)|0;if((nd|0)==0){break L44}if((aY(nd|0,171384)|0)==0){uB(48904,cW|0);break L44}gz=bi(nd|0,171384)|0;if((gz|0)==-1){uh(-1,131096,(v=i,i=i+8|0,c[v>>2]=nd,v)|0);break L44}if((aG(gz|0,bB|0,by|0,bC|0,bz|0)|0)==-1){uh(-1,130952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}cz(gz|0);break L44}}while(0);gy=c[gC>>2]|0;hF=(gH|0)>0;gG=24408;gz=184456;L1882:while(1){L1884:do{if(!gE){if(hF){nd=0;hp=0;gx=gy;while(1){hC=a[gz+nd|0]|0;if(hC<<24>>24==(a[gB+(nd+gx|0)|0]|0)){nV=gx;nW=hp}else{if(hC<<24>>24!=36){break L1884}nV=gx-1|0;nW=1}nX=nd+1|0;if((nX|0)<(nW+gH|0)){nd=nX;hp=nW;gx=nV}else{break}}if((nW|0)==0){nY=nX}else{nZ=gG;break L1882}}else{nY=0}gx=a[gz+nY|0]|0;if((gx<<24>>24|0)==36|(gx<<24>>24|0)==0){nZ=gG;break L1882}}}while(0);gA=gG+8|0;gx=c[gA>>2]|0;if((gx|0)==0){nZ=gA;break}else{gG=gA;gz=gx}}gz=c[nZ+4>>2]|0;if((gz|0)==16){b7=1360;break L27}c[11252]=gz;c[13898]=gv+2;a[cW]=a[25160]|0;a[cW+1|0]=a[25161|0]|0;a[cW+2|0]=a[25162|0]|0;c[by>>2]=3;c[bz>>2]=8;c[bB>>2]=cW;c[bC>>2]=48904}else{b7=1336}}while(0);if((b7|0)==1336){b7=0;c[11252]=0;a[cW]=a[25160]|0;a[cW+1|0]=a[25161|0]|0;a[cW+2|0]=a[25162|0]|0;c[by>>2]=3;c[bz>>2]=8;c[bB>>2]=cW;c[bC>>2]=48904}hG=48904;c[hG>>2]=0;c[hG+4>>2]=0;hG=c[11252]|0;if((hG|0)==15){a[48904]=-62;a[48905]=-80;break}else if((hG|0)==12|(hG|0)==13){a[48904]=-100;break}else if((hG|0)==5|(hG|0)==6|(hG|0)==7){a[48904]=-8;break}else if((hG|0)==14|(hG|0)==8){break}else{a[48904]=-80;break}}else if((gD|0)==21){hG=gv+1|0;c[13898]=hG;gz=c[8272]|0;if((hG|0)<(gz|0)){n_=hG;n$=gz;n0=gw}else{break}while(1){gz=c[n0+(n_*40&-1)+36>>2]|0;hG=n0+(n_*40&-1)+32|0;if((a[n0+(n_*40&-1)|0]&1)==0){b7=5162;break L27}gG=c[10036]|0;gH=0;while(1){if((gH|0)>=(gz|0)){b7=1380;break}gy=c[hG>>2]|0;if((a[gG+(gy+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{n1=gy;break}}if((b7|0)==1380){b7=0;if((gH|0)==1){break L44}n1=c[hG>>2]|0}L1917:do{if((gz|0)>0){gy=0;hF=0;gE=n1;while(1){if((a[gy+132904|0]|0)==(a[gG+(gy+gE|0)|0]|0)){n2=gE;n3=hF}else{if((gy|0)!=3){n4=0;n5=0;n6=n1;break}n2=gE-1|0;n3=1}gC=gy+1|0;if((gC|0)<(n3+gz|0)){gy=gC;hF=n3;gE=n2}else{b7=1387;break}}do{if((b7|0)==1387){b7=0;if((n3|0)==0){if(!((gy|0)==7|(gy|0)==2)){n4=0;n5=0;n6=n1;break}}n7=n_+1|0;c[13898]=n7;L1929:do{if((n7|0)<(n$|0)){L1931:do{if((a[n0+(n7*40&-1)|0]&1)!=0){gE=c[n0+(n7*40&-1)+36>>2]|0;hF=n0+(n7*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(gE|0)){b7=1394;break}if((a[gG+((c[hF>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{n8=0;break}}if((b7|0)==1394){b7=0;if((gC|0)==1){break L1929}else{n8=0}}while(1){if((n8|0)>=(gE|0)){break}if((a[gG+((c[hF>>2]|0)+n8|0)|0]|0)==(a[n8+103664|0]|0)){n8=n8+1|0}else{break L1931}}if((n8|0)==1){b7=1403;break L27}}}while(0);a[14176]=1;is(bw);a[14176]=0;if((c[cX>>2]|0)!=3){b7=1402;break L27}hF=c[cY>>2]|0;c[10568]=hF;if((hF|0)==0){b7=1405;break L27}else{break L1917}}}while(0);hF=c[10568]|0;if((hF|0)!=0){uu(hF)}c[10568]=0;break L1917}}while(0);while(1){if((a[n4+132632|0]|0)==(a[gG+(n4+n6|0)|0]|0)){n9=n6;oa=n5}else{if((n4|0)!=3){ob=0;oc=0;od=n1;break}n9=n6-1|0;oa=1}gy=n4+1|0;if((gy|0)<(oa+gz|0)){n4=gy;n5=oa;n6=n9}else{b7=1411;break}}do{if((b7|0)==1411){b7=0;if((oa|0)==0){if(!((n4|0)==2|(n4|0)==14)){ob=0;oc=0;od=n1;break}}a[42568]=1;c[13898]=n_+1;break L1917}}while(0);while(1){if((a[ob+132544|0]|0)==(a[gG+(ob+od|0)|0]|0)){oe=od;of=oc}else{if((ob|0)!=5){b7=1423;break L1917}oe=od-1|0;of=1}gy=ob+1|0;if((gy|0)<(of+gz|0)){ob=gy;oc=of;od=oe}else{break}}if((of|0)==0){if(!((ob|0)==4|(ob|0)==16)){b7=1423;break}}a[42568]=0;c[13898]=n_+1}else{b7=1423}}while(0);L1969:do{if((b7|0)==1423){b7=0;if((n$|0)>(n_|0)){og=0}else{b7=5163;break L27}while(1){if((og|0)>=(gz|0)){b7=1426;break}if((a[gG+(og+n1|0)|0]|0)==(a[og+132432|0]|0)){og=og+1|0}else{oh=0;break}}do{if((b7|0)==1426){b7=0;if((og|0)!=5){oh=0;break}a[42560]=1;c[13898]=n_+1;break L1969}}while(0);while(1){if((oh|0)>=(gz|0)){break}if((a[gG+(oh+n1|0)|0]|0)==(a[oh+132304|0]|0)){oh=oh+1|0}else{b7=5164;break L27}}if((oh|0)!=7){b7=5165;break L27}a[42560]=0;c[13898]=n_+1}}while(0);gG=c[13898]|0;gz=c[8272]|0;if((gG|0)>=(gz|0)){break L44}n_=gG;n$=gz;n0=c[1054]|0}}else if((gD|0)==22){gz=gv+1|0;c[13898]=gz;gG=c[8272]|0;L1985:do{if((gz|0)<(gG|0)){hG=a[gw+(gz*40&-1)|0]|0;L1987:do{if((hG&1)==0){oi=0;oj=gz;ok=gG;ol=gw;om=hG}else{gH=c[gw+(gz*40&-1)+36>>2]|0;gy=gw+(gz*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gH|0)){break}if((a[gB+((c[gy>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{oi=0;oj=gz;ok=gG;ol=gw;om=hG;break L1987}}if((hF|0)==1){break L1985}else{oi=0;oj=gz;ok=gG;ol=gw;om=hG}}}while(0);L1993:while(1){hG=(om&1)==0;L1995:do{if(!hG){gy=c[ol+(oj*40&-1)+36>>2]|0;gH=ol+(oj*40&-1)+32|0;gE=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){break}if((a[gE+((c[gH>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L1995}}if((gC|0)==1){on=oi;break L1993}}}while(0);if((oj|0)>=(ok|0)){b7=1453;break L27}L2003:do{if(!hG){hF=c[ol+(oj*40&-1)+36>>2]|0;gH=ol+(oj*40&-1)+32|0;gE=c[10036]|0;gy=0;while(1){if((gy|0)>=(hF|0)){break}if((a[gE+((c[gH>>2]|0)+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{break L2003}}if((gy|0)==1){b7=1453;break L27}}}while(0);a[14176]=1;is(bu);a[14176]=0;if((c[cZ>>2]|0)!=3){b7=1452;break L27}hG=c[c_>>2]|0;c[bv>>2]=hG;if((hG|0)==0){b7=1462;break L27}if((oi|0)==0){oo=0}else{oo=uA(oi|0)|0}iQ(bv);hG=c[bv>>2]|0;gH=db(oi,(oo+2|0)+(uA(hG|0)|0)|0,140552)|0;if((oo|0)==0){uB(gH|0,hG|0)}else{gE=gH+oo|0;hF=gH+(oo+1|0)|0;uB(hF|0,hG|0);a[gE]=58}uu(hG);hG=c[13898]|0;gE=c[8272]|0;if((hG|0)>=(gE|0)){on=gH;break}hF=c[1054]|0;oi=gH;oj=hG;ok=gE;ol=hF;om=a[hF+(hG*40&-1)|0]|0}if((on|0)==0){break L44}ur(4,on);uu(on);break L44}}while(0);ur(32,0)}else if((gD|0)==23){jp()}else if((gD|0)==24){gG=gv+1|0;c[13898]=gG;gz=c[8272]|0;if((gG|0)<(gz|0)){hG=0;hF=gG;gG=gz;gz=gw;L2026:while(1){gE=(a[gz+(hF*40&-1)|0]&1)==0;gH=c[gz+(hF*40&-1)+36>>2]|0;gC=gz+(hF*40&-1)+32|0;L2028:do{if(gE){op=c[gC>>2]|0;b7=1704}else{hS=c[10036]|0;gx=0;while(1){if((gx|0)>=(gH|0)){b7=1473;break}gA=c[gC>>2]|0;if((a[hS+(gA+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{oq=gA;break}}if((b7|0)==1473){b7=0;if((gx|0)==1){or=hG;break L2026}oq=c[gC>>2]|0}if((gH|0)>0){os=0;ot=0;ou=oq}else{op=oq;b7=1704;break}while(1){gA=os+2|0;if((a[gA+136104|0]|0)==(a[hS+(os+ou|0)|0]|0)){ov=ou;ow=ot}else{if((gA|0)!=3){ox=0;oy=0;oz=oq;break}ov=ou-1|0;ow=1}gA=os+1|0;if((gA|0)<(ow+gH|0)){os=gA;ot=ow;ou=ov}else{b7=1480;break}}do{if((b7|0)==1480){b7=0;if((ow|0)==0){if(!((os|0)==0|(os|0)==5)){ox=0;oy=0;oz=oq;break}}a[66412]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[ox+136104|0]|0)==(a[hS+(ox+oz|0)|0]|0)){oC=oz;oD=oy}else{if((ox|0)!=3){oE=0;oF=0;oG=oq;break}oC=oz-1|0;oD=1}gx=ox+1|0;if((gx|0)<(oD+gH|0)){ox=gx;oy=oD;oz=oC}else{b7=1487;break}}do{if((b7|0)==1487){b7=0;if((oD|0)==0){if(!((ox|0)==2|(ox|0)==7)){oE=0;oF=0;oG=oq;break}}a[66412]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=oE+2|0;if((a[gx+135864|0]|0)==(a[hS+(oE+oG|0)|0]|0)){oH=oG;oI=oF}else{if((gx|0)!=3){oJ=0;oK=0;oL=oq;break}oH=oG-1|0;oI=1}gx=oE+1|0;if((gx|0)<(oI+gH|0)){oE=gx;oF=oI;oG=oH}else{b7=1496;break}}do{if((b7|0)==1496){b7=0;if((oI|0)==0){if(!((oE|0)==0|(oE|0)==5)){oJ=0;oK=0;oL=oq;break}}a[65724]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[oJ+135864|0]|0)==(a[hS+(oJ+oL|0)|0]|0)){oM=oL;oN=oK}else{if((oJ|0)!=3){oO=0;oP=0;oQ=oq;break}oM=oL-1|0;oN=1}gx=oJ+1|0;if((gx|0)<(oN+gH|0)){oJ=gx;oK=oN;oL=oM}else{b7=1503;break}}do{if((b7|0)==1503){b7=0;if((oN|0)==0){if(!((oJ|0)==2|(oJ|0)==7)){oO=0;oP=0;oQ=oq;break}}a[65724]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=oO+2|0;if((a[gx+135680|0]|0)==(a[hS+(oO+oQ|0)|0]|0)){oR=oQ;oS=oP}else{if((gx|0)!=3){oT=0;oU=0;oV=oq;break}oR=oQ-1|0;oS=1}gx=oO+1|0;if((gx|0)<(oS+gH|0)){oO=gx;oP=oS;oQ=oR}else{b7=1510;break}}do{if((b7|0)==1510){b7=0;if((oS|0)==0){if(!((oO|0)==0|(oO|0)==5)){oT=0;oU=0;oV=oq;break}}a[65036]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[oT+135680|0]|0)==(a[hS+(oT+oV|0)|0]|0)){oW=oV;oX=oU}else{if((oT|0)!=3){oY=0;oZ=0;o_=oq;break}oW=oV-1|0;oX=1}gx=oT+1|0;if((gx|0)<(oX+gH|0)){oT=gx;oU=oX;oV=oW}else{b7=1517;break}}do{if((b7|0)==1517){b7=0;if((oX|0)==0){if(!((oT|0)==2|(oT|0)==7)){oY=0;oZ=0;o_=oq;break}}a[65036]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=oY+2|0;if((a[gx+135568|0]|0)==(a[hS+(oY+o_|0)|0]|0)){o$=o_;o0=oZ}else{if((gx|0)!=4){o1=0;o2=0;o3=oq;break}o$=o_-1|0;o0=1}gx=oY+1|0;if((gx|0)<(o0+gH|0)){oY=gx;oZ=o0;o_=o$}else{b7=1524;break}}do{if((b7|0)==1524){b7=0;if((o0|0)==0){if(!((oY|0)==1|(oY|0)==6)){o1=0;o2=0;o3=oq;break}}a[69164]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[o1+135568|0]|0)==(a[hS+(o1+o3|0)|0]|0)){o4=o3;o5=o2}else{if((o1|0)!=4){o6=0;o7=0;o8=oq;break}o4=o3-1|0;o5=1}gx=o1+1|0;if((gx|0)<(o5+gH|0)){o1=gx;o2=o5;o3=o4}else{b7=1531;break}}do{if((b7|0)==1531){b7=0;if((o5|0)==0){if(!((o1|0)==3|(o1|0)==8)){o6=0;o7=0;o8=oq;break}}a[69164]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=o6+2|0;if((a[gx+135376|0]|0)==(a[hS+(o6+o8|0)|0]|0)){o9=o8;pa=o7}else{if((gx|0)!=4){pb=0;pc=0;pd=oq;break}o9=o8-1|0;pa=1}gx=o6+1|0;if((gx|0)<(pa+gH|0)){o6=gx;o7=pa;o8=o9}else{b7=1538;break}}do{if((b7|0)==1538){b7=0;if((pa|0)==0){if(!((o6|0)==1|(o6|0)==6)){pb=0;pc=0;pd=oq;break}}a[68476]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pb+135376|0]|0)==(a[hS+(pb+pd|0)|0]|0)){pe=pd;pf=pc}else{if((pb|0)!=4){pg=0;ph=0;pi=oq;break}pe=pd-1|0;pf=1}gx=pb+1|0;if((gx|0)<(pf+gH|0)){pb=gx;pc=pf;pd=pe}else{b7=1545;break}}do{if((b7|0)==1545){b7=0;if((pf|0)==0){if(!((pb|0)==3|(pb|0)==8)){pg=0;ph=0;pi=oq;break}}a[68476]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pg+2|0;if((a[gx+135216|0]|0)==(a[hS+(pg+pi|0)|0]|0)){pj=pi;pk=ph}else{if((gx|0)!=4){pl=0;pm=0;pn=oq;break}pj=pi-1|0;pk=1}gx=pg+1|0;if((gx|0)<(pk+gH|0)){pg=gx;ph=pk;pi=pj}else{b7=1552;break}}do{if((b7|0)==1552){b7=0;if((pk|0)==0){if(!((pg|0)==1|(pg|0)==6)){pl=0;pm=0;pn=oq;break}}a[66413]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pl+135216|0]|0)==(a[hS+(pl+pn|0)|0]|0)){po=pn;pp=pm}else{if((pl|0)!=4){pq=0;pr=0;ps=oq;break}po=pn-1|0;pp=1}gx=pl+1|0;if((gx|0)<(pp+gH|0)){pl=gx;pm=pp;pn=po}else{b7=1559;break}}do{if((b7|0)==1559){b7=0;if((pp|0)==0){if(!((pl|0)==3|(pl|0)==8)){pq=0;pr=0;ps=oq;break}}a[66413]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pq+2|0;if((a[gx+135104|0]|0)==(a[hS+(pq+ps|0)|0]|0)){pt=ps;pu=pr}else{if((gx|0)!=4){pv=0;pw=0;px=oq;break}pt=ps-1|0;pu=1}gx=pq+1|0;if((gx|0)<(pu+gH|0)){pq=gx;pr=pu;ps=pt}else{b7=1566;break}}do{if((b7|0)==1566){b7=0;if((pu|0)==0){if(!((pq|0)==1|(pq|0)==6)){pv=0;pw=0;px=oq;break}}a[65725]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pv+135104|0]|0)==(a[hS+(pv+px|0)|0]|0)){py=px;pz=pw}else{if((pv|0)!=4){pA=0;pB=0;pC=oq;break}py=px-1|0;pz=1}gx=pv+1|0;if((gx|0)<(pz+gH|0)){pv=gx;pw=pz;px=py}else{b7=1573;break}}do{if((b7|0)==1573){b7=0;if((pz|0)==0){if(!((pv|0)==3|(pv|0)==8)){pA=0;pB=0;pC=oq;break}}a[65725]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pA+2|0;if((a[gx+134880|0]|0)==(a[hS+(pA+pC|0)|0]|0)){pD=pC;pE=pB}else{if((gx|0)!=4){pF=0;pG=0;pH=oq;break}pD=pC-1|0;pE=1}gx=pA+1|0;if((gx|0)<(pE+gH|0)){pA=gx;pB=pE;pC=pD}else{b7=1580;break}}do{if((b7|0)==1580){b7=0;if((pE|0)==0){if(!((pA|0)==1|(pA|0)==6)){pF=0;pG=0;pH=oq;break}}a[65037]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pF+134880|0]|0)==(a[hS+(pF+pH|0)|0]|0)){pI=pH;pJ=pG}else{if((pF|0)!=4){pK=0;pL=0;pM=oq;break}pI=pH-1|0;pJ=1}gx=pF+1|0;if((gx|0)<(pJ+gH|0)){pF=gx;pG=pJ;pH=pI}else{b7=1587;break}}do{if((b7|0)==1587){b7=0;if((pJ|0)==0){if(!((pF|0)==3|(pF|0)==8)){pK=0;pL=0;pM=oq;break}}a[65037]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pK+2|0;if((a[gx+134728|0]|0)==(a[hS+(pK+pM|0)|0]|0)){pN=pM;pO=pL}else{if((gx|0)!=5){pP=0;pQ=0;pR=oq;break}pN=pM-1|0;pO=1}gx=pK+1|0;if((gx|0)<(pO+gH|0)){pK=gx;pL=pO;pM=pN}else{b7=1594;break}}do{if((b7|0)==1594){b7=0;if((pO|0)==0){if(!((pK|0)==2|(pK|0)==7)){pP=0;pQ=0;pR=oq;break}}a[69165]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pP+134728|0]|0)==(a[hS+(pP+pR|0)|0]|0)){pS=pR;pT=pQ}else{if((pP|0)!=5){pU=0;pV=0;pW=oq;break}pS=pR-1|0;pT=1}gx=pP+1|0;if((gx|0)<(pT+gH|0)){pP=gx;pQ=pT;pR=pS}else{b7=1601;break}}do{if((b7|0)==1601){b7=0;if((pT|0)==0){if(!((pP|0)==4|(pP|0)==9)){pU=0;pV=0;pW=oq;break}}a[69165]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pU+2|0;if((a[gx+134600|0]|0)==(a[hS+(pU+pW|0)|0]|0)){pX=pW;pY=pV}else{if((gx|0)!=5){pZ=0;p_=0;p$=oq;break}pX=pW-1|0;pY=1}gx=pU+1|0;if((gx|0)<(pY+gH|0)){pU=gx;pV=pY;pW=pX}else{b7=1608;break}}do{if((b7|0)==1608){b7=0;if((pY|0)==0){if(!((pU|0)==2|(pU|0)==7)){pZ=0;p_=0;p$=oq;break}}a[68477]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pZ+134600|0]|0)==(a[hS+(pZ+p$|0)|0]|0)){p0=p$;p1=p_}else{if((pZ|0)!=5){p2=0;p3=0;p4=oq;break}p0=p$-1|0;p1=1}gx=pZ+1|0;if((gx|0)<(p1+gH|0)){pZ=gx;p_=p1;p$=p0}else{b7=1615;break}}do{if((b7|0)==1615){b7=0;if((p1|0)==0){if(!((pZ|0)==4|(pZ|0)==9)){p2=0;p3=0;p4=oq;break}}a[68477]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=p2+2|0;if((a[gx+134488|0]|0)==(a[hS+(p2+p4|0)|0]|0)){p5=p4;p6=p3}else{if((gx|0)!=4){p7=0;p8=0;p9=oq;break}p5=p4-1|0;p6=1}gx=p2+1|0;if((gx|0)<(p6+gH|0)){p2=gx;p3=p6;p4=p5}else{b7=1622;break}}do{if((b7|0)==1622){b7=0;if((p6|0)==0){if(!((p2|0)==1|(p2|0)==6)){p7=0;p8=0;p9=oq;break}}a[67100]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[p7+134488|0]|0)==(a[hS+(p7+p9|0)|0]|0)){qa=p9;qb=p8}else{if((p7|0)!=4){qc=0;qd=0;qe=oq;break}qa=p9-1|0;qb=1}gx=p7+1|0;if((gx|0)<(qb+gH|0)){p7=gx;p8=qb;p9=qa}else{b7=1629;break}}do{if((b7|0)==1629){b7=0;if((qb|0)==0){if(!((p7|0)==3|(p7|0)==8)){qc=0;qd=0;qe=oq;break}}a[67100]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=qc+2|0;if((a[gx+134320|0]|0)==(a[hS+(qc+qe|0)|0]|0)){qf=qe;qg=qd}else{if((gx|0)!=5){qh=0;qi=0;qj=oq;break}qf=qe-1|0;qg=1}gx=qc+1|0;if((gx|0)<(qg+gH|0)){qc=gx;qd=qg;qe=qf}else{b7=1636;break}}do{if((b7|0)==1636){b7=0;if((qg|0)==0){if(!((qc|0)==2|(qc|0)==7)){qh=0;qi=0;qj=oq;break}}a[67101]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[qh+134320|0]|0)==(a[hS+(qh+qj|0)|0]|0)){qk=qj;ql=qi}else{if((qh|0)!=5){qm=0;qn=0;qo=oq;break}qk=qj-1|0;ql=1}gx=qh+1|0;if((gx|0)<(ql+gH|0)){qh=gx;qi=ql;qj=qk}else{b7=1643;break}}do{if((b7|0)==1643){b7=0;if((ql|0)==0){if(!((qh|0)==4|(qh|0)==9)){qm=0;qn=0;qo=oq;break}}a[67101]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=qm+2|0;if((a[gx+134136|0]|0)==(a[hS+(qm+qo|0)|0]|0)){qp=qo;qq=qn}else{if((gx|0)!=3){qr=0;qs=0;qt=oq;break}qp=qo-1|0;qq=1}gx=qm+1|0;if((gx|0)<(qq+gH|0)){qm=gx;qn=qq;qo=qp}else{b7=1650;break}}do{if((b7|0)==1650){b7=0;if((qq|0)==0){if(!((qm|0)==0|(qm|0)==5)){qr=0;qs=0;qt=oq;break}}a[69852]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[qr+134136|0]|0)==(a[hS+(qr+qt|0)|0]|0)){qu=qt;qv=qs}else{if((qr|0)!=3){qw=0;qx=0;qy=oq;break}qu=qt-1|0;qv=1}gx=qr+1|0;if((gx|0)<(qv+gH|0)){qr=gx;qs=qv;qt=qu}else{b7=1657;break}}do{if((b7|0)==1657){b7=0;if((qv|0)==0){if(!((qr|0)==2|(qr|0)==7)){qw=0;qx=0;qy=oq;break}}a[69852]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[qw+133984|0]|0)==(a[hS+(qw+qy|0)|0]|0)){qz=qy;qA=qx}else{if((qw|0)!=2){qB=0;qC=0;qD=oq;break}qz=qy-1|0;qA=1}gx=qw+1|0;if((gx|0)<(qA+gH|0)){qw=gx;qx=qA;qy=qz}else{b7=1664;break}}do{if((b7|0)==1664){b7=0;if((qA|0)==0){if((qw|0)==1|(qw|0)==5){qE=0}else{qB=0;qC=0;qD=oq;break}}else{qE=0}while(1){if(qE>>>0>=8){b7=1669;break}if((a[65036+(qE*688&-1)|0]&1)!=0){break}if((a[65037+(qE*688&-1)|0]&1)==0){qE=qE+1|0}else{break}}if((b7|0)==1669){b7=0;a[69852]=1}h[3815]=.5235987755982988;gy=hF+1|0;c[13898]=gy;L2341:do{if((a[gz+(gy*40&-1)|0]&1)!=0){gx=c[10810]|0;if((gx|0)==0){oA=hG;oB=gy;break L2028}gA=(gG|0)>(gy|0);hp=gz+(gy*40&-1)+36|0;nd=gz+(gy*40&-1)+32|0;hC=gx;L2344:while(1){hR=c[hC+4>>2]|0;L2346:do{if(gA){hB=c[hp>>2]|0;ne=0;while(1){if((ne|0)>=(hB|0)){break}if((a[hS+((c[nd>>2]|0)+ne|0)|0]|0)==(a[hR+ne|0]|0)){ne=ne+1|0}else{break L2346}}if((a[hR+ne|0]|0)==0){b7=1678;break L2344}}}while(0);hR=c[hC>>2]|0;if((hR|0)==0){qF=gx;break}else{hC=hR}}do{if((b7|0)==1678){b7=0;if((a[hC+8|0]&1)!=0){qF=gx;break}if((c[hC+16>>2]|0)==1){break L2341}else{qF=gx}}}while(0);L2356:while(1){gx=c[qF+4>>2]|0;L2358:do{if(gA){hC=c[hp>>2]|0;hR=0;while(1){if((hR|0)>=(hC|0)){break}if((a[hS+((c[nd>>2]|0)+hR|0)|0]|0)==(a[gx+hR|0]|0)){hR=hR+1|0}else{break L2358}}if((a[gx+hR|0]|0)==0){break L2356}}}while(0);gx=c[qF>>2]|0;if((gx|0)==0){oA=hG;oB=gy;break L2028}else{qF=gx}}if((a[qF+8|0]&1)!=0){oA=hG;oB=gy;break L2028}if((c[qF+16>>2]|0)!=2){oA=hG;oB=gy;break L2028}}}while(0);m3=+h[9040];gy=is(bt)|0;nd=c[gy>>2]|0;if((nd|0)==1){qG=+(c[gy+8>>2]|0)}else if((nd|0)==2){qG=+h[gy+8>>3]}else if((nd|0)==3){qG=+uz(c[gy+8>>2]|0,0)}else{b7=1693;break L27}if((c[c$>>2]|0)==3){uu(c[c0>>2]|0);c[c$>>2]=1}h[3815]=m3*qG;oA=hG;oB=c[13898]|0;break L2028}}while(0);while(1){if((a[qB+133840|0]|0)==(a[hS+(qB+qD|0)|0]|0)){qH=qD;qI=qC}else{if((qB|0)!=4){op=oq;b7=1704;break L2028}qH=qD-1|0;qI=1}gy=qB+1|0;if((gy|0)<(qI+gH|0)){qB=gy;qC=qI;qD=qH}else{break}}if((qI|0)==0){if(!((qB|0)==3|(qB|0)==7)){op=oq;b7=1704;break}}h[3815]=0.0;hS=hF+1|0;c[13898]=hS;oA=hG;oB=hS}}while(0);L2386:do{if((b7|0)==1704){b7=0;L2388:do{if((gG|0)>(hF|0)){if(gE){break}gC=c[10036]|0;hS=0;while(1){if((hS|0)>=(gH|0)){b7=1709;break}if((a[gC+(hS+op|0)|0]|0)==(a[hS+150704|0]|0)){hS=hS+1|0}else{qJ=0;break}}do{if((b7|0)==1709){b7=0;if((hS|0)!=4){qJ=0;break}c[10026]=0;gy=hF+1|0;c[13898]=gy;oA=hG;oB=gy;break L2386}}while(0);while(1){if((qJ|0)>=(gH|0)){break}if((a[gC+(qJ+op|0)|0]|0)==(a[qJ+150856|0]|0)){qJ=qJ+1|0}else{b7=1715;break L2388}}if((qJ|0)!=5){b7=1715;break}c[10026]=1;gC=hF+1|0;c[13898]=gC;oA=hG;oB=gC;break L2386}else{b7=1715}}while(0);L2402:do{if((b7|0)==1715){b7=0;if(!((gH|0)>0&(gE^1))){break}gC=c[10036]|0;hS=0;gy=0;nd=op;while(1){if((a[hS+133704|0]|0)==(a[gC+(hS+nd|0)|0]|0)){qK=nd;qL=gy}else{if((hS|0)!=6){break L2402}qK=nd-1|0;qL=1}hp=hS+1|0;if((hp|0)<(qL+gH|0)){hS=hp;gy=qL;nd=qK}else{break}}if((qL|0)==0){if(!((hS|0)==5|(hS|0)==12)){break}}c[10026]=-1;nd=hF+1|0;c[13898]=nd;oA=hG;oB=nd;break L2386}}while(0);hH(40048,1,0);nd=c[13898]|0;L2416:do{if((c[8272]|0)>(nd|0)){gy=c[1054]|0;if((a[gy+(nd*40&-1)|0]&1)==0){b7=1731;break}gC=c[gy+(nd*40&-1)+36>>2]|0;hp=gy+(nd*40&-1)+32|0;gy=c[10036]|0;gA=0;while(1){if((gA|0)>=(gC|0)){break}if((a[gy+((c[hp>>2]|0)+gA|0)|0]|0)==(a[gA+148464|0]|0)){gA=gA+1|0}else{b7=1731;break L2416}}if((gA|0)!=1){b7=1731;break}c[13898]=nd+1;hH(34776,1,0);qM=c[13898]|0}else{b7=1731}}while(0);do{if((b7|0)==1731){b7=0;if((hF|0)==(nd|0)){qM=hF;break}c[8694]=c[10012];c[8695]=c[10013];c[8696]=c[10014];c[8697]=c[10015];c[8698]=c[10016];c[8699]=c[10017];c[8700]=c[10018];c[8701]=c[10019];c[8702]=c[10020];c[8703]=c[10021];c[8704]=c[10022];c[8705]=c[10023];c[8706]=c[10024];c[8707]=c[10025];qM=nd}}while(0);if((hF|0)==(qM|0)){or=hG;break L2026}else{oA=hG;oB=qM}}}while(0);gH=c[8272]|0;if((oB|0)>=(gH|0)){or=oA;break}hG=oA;hF=oB;gG=gH;gz=c[1054]|0}if(or){break}else{qN=0}}else{qN=0}while(1){if(qN>>>0>=8){break}if((a[65036+(qN*688&-1)|0]&1)!=0){break L44}if((a[65037+(qN*688&-1)|0]&1)==0){qN=qN+1|0}else{break L44}}if((a[30528]&1)==0){a[66412]=1;a[65724]=1;break}else{a[69852]=1;break}}else if((gD|0)==25){c[13898]=gv+1;gr();a[38984]=1}else if((gD|0)==26){b7=1742;break L27}else if((gD|0)==27){c[13898]=gv+1;gz=is(bs)|0;gG=c[gz>>2]|0;if((gG|0)==1){qO=+(c[gz+8>>2]|0)}else if((gG|0)==2){qO=+h[gz+8>>3]}else if((gG|0)==3){qO=+uz(c[gz+8>>2]|0,0)}else{b7=1747;break L27}if((c[c1>>2]|0)==3){uu(c[c2>>2]|0);c[c1>>2]=1}gz=~~qO;gG=(gz|0)>-1?gz:-gz|0;qP=c[13898]|0;do{if((qP|0)<(c[8272]|0)){gz=c[1054]|0;if((a[gz+(qP*40&-1)|0]&1)==0){b7=5168;break L27}hF=c[gz+(qP*40&-1)+36>>2]|0;hG=gz+(qP*40&-1)+32|0;gz=c[10036]|0;gH=0;while(1){if((gH|0)>=(hF|0)){b7=1755;break}if((a[gz+((c[hG>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{qQ=0;break}}if((b7|0)==1755){b7=0;if((gH|0)==1){qR=gG;break}else{qQ=0}}while(1){if((qQ|0)>=(hF|0)){break}if((a[gz+((c[hG>>2]|0)+qQ|0)|0]|0)==(a[qQ+148464|0]|0)){qQ=qQ+1|0}else{b7=5169;break L27}}if((qQ|0)!=1){b7=5170;break L27}c[13898]=qP+1;hG=is(br)|0;gz=c[hG>>2]|0;if((gz|0)==1){qS=+(c[hG+8>>2]|0)}else if((gz|0)==2){qS=+h[hG+8>>3]}else if((gz|0)==3){qS=+uz(c[hG+8>>2]|0,0)}else{b7=1764;break L27}if((c[c3>>2]|0)==3){uu(c[c4>>2]|0);c[c3>>2]=1}hG=~~qS;qR=(hG|0)>-1?hG:-hG|0}else{qR=gG}}while(0);if((gG|0)<2|(qR|0)<2){b7=1769;break L27}hG=c[10814]|0;gz=c[10828]|0;c[10814]=0;c[10828]=0;iO(hG);iY(gz);c[9344]=gG;c[9342]=qR}else if((gD|0)==28){gz=gv+1|0;c[13898]=gz;a[36120]=1;hG=c[8272]|0;L2473:do{if((gz|0)<(hG|0)){hF=0;gH=0;gE=0;nd=0;qT=gz;hp=hG;gy=gw;while(1){gC=(a[gy+(qT*40&-1)|0]&1)==0;hS=c[gy+(qT*40&-1)+36>>2]|0;L2476:do{if(gC){qU=c[10036]|0;qV=gy+(qT*40&-1)+32|0}else{gx=gy+(qT*40&-1)+32|0;hC=c[10036]|0;ne=0;while(1){if((ne|0)>=(hS|0)){break}if((a[hC+((c[gx>>2]|0)+ne|0)|0]|0)==(a[ne+103664|0]|0)){ne=ne+1|0}else{qU=hC;qV=gx;break L2476}}if((ne|0)==1){qW=gE;qX=nd;break L2473}else{qU=hC;qV=gx}}}while(0);gA=c[qV>>2]|0;hB=(hS|0)>0;hw=23912;hK=184456;L2484:while(1){L2486:do{if(!gC){if(hB){ho=0;gF=0;nh=gA;while(1){ng=a[hK+ho|0]|0;if(ng<<24>>24==(a[qU+(ho+nh|0)|0]|0)){qY=nh;qZ=gF}else{if(ng<<24>>24!=36){break L2486}qY=nh-1|0;qZ=1}q_=ho+1|0;if((q_|0)<(qZ+hS|0)){ho=q_;gF=qZ;nh=qY}else{break}}if((qZ|0)==0){q$=q_}else{q0=hw;break L2484}}else{q$=0}nh=a[hK+q$|0]|0;if((nh<<24>>24|0)==36|(nh<<24>>24|0)==0){q0=hw;break L2484}}}while(0);gx=hw+8|0;hC=c[gx>>2]|0;if((hC|0)==0){q0=gx;break}else{hw=gx;hK=hC}}hK=c[q0+4>>2]|0;L2499:do{if((hK|0)==40){a[36120]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==41){a[36120]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==39){uu(c[9329]|0);uD(36120,26456,1240);q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==1){if(nd){uh(qT,137664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9044]=0;q1=1;q2=gE;q3=gH;q4=hF}else if((hK|0)==2){if(nd){uh(qT,137664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9044]=2;q1=1;q2=gE;q3=gH;q4=hF}else if((hK|0)==3){if(gE){uh(qT,137552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9045]=0;q1=nd;q2=1;q3=gH;q4=hF}else if((hK|0)==4){if(gE){uh(qT,137552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9045]=2;q1=nd;q2=1;q3=gH;q4=hF}else if((hK|0)==5){if(!nd){c[9044]=1}if(!gE){c[9045]=1}hw=nd|gE;q1=hw;q2=hw;q3=gH;q4=hF}else if((hK|0)==6){if(hF){uh(qT,137256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9047]=0;q1=nd;q2=gE;q3=gH;q4=1}else if((hK|0)==7){if(hF){uh(qT,137256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9047]=1;q1=nd;q2=gE;q3=gH;q4=1}else if((hK|0)==8){if(!gH){b7=1817;break}uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);b7=1817}else if((hK|0)==13){b7=1817}else if((hK|0)==9){if(!gH){b7=1824;break}uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);b7=1824}else if((hK|0)==14){b7=1824}else if((hK|0)==11){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=0;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==12){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=1;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==15){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=0;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==16){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=1;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==17){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=2;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==18){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=3;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==19){c[9046]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==20){c[9046]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==21){a[36229]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==22){a[36229]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==23){a[36230]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==24){a[36230]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==25){a[36231]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==26){a[36231]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==27){hw=qT+1|0;c[13898]=hw;c[9059]=-2;L2571:do{if((hw|0)<(hp|0)){L2573:do{if((a[gy+(hw*40&-1)|0]&1)!=0){hS=c[gy+(hw*40&-1)+36>>2]|0;gA=gy+(hw*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(hS|0)){break}if((a[qU+((c[gA>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{break L2573}}if((hB|0)==1){q5=hw;break L2571}}}while(0);hH(36232,1,0);gA=c[13898]|0;if((hw|0)!=(gA|0)){q5=gA;break}if((a[(c[1054]|0)+(hw*40&-1)|0]&1)!=0){q5=hw;break}gA=is(bp)|0;hS=c[gA>>2]|0;if((hS|0)==1){q6=+(c[gA+8>>2]|0)}else if((hS|0)==2){q6=+h[gA+8>>3]}else if((hS|0)==3){q6=+uz(c[gA+8>>2]|0,0)}else{b7=1867;break L27}if((c[c6>>2]|0)==3){uu(c[c7>>2]|0);c[c6>>2]=1}c[9059]=~~q6-1;gA=(c[13898]|0)+1|0;c[13898]=gA;q5=gA}else{q5=hw}}while(0);c[13898]=q5-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==28){c[9059]=-3;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==29){c[13898]=qT+1;hw=is(bo)|0;gA=c[hw>>2]|0;if((gA|0)==1){q7=+(c[hw+8>>2]|0)}else if((gA|0)==2){q7=+h[hw+8>>3]}else if((gA|0)==3){q7=+uz(c[hw+8>>2]|0,0)}else{b7=1877;break L27}if((c[c8>>2]|0)==3){uu(c[c9>>2]|0);c[c8>>2]=1}h[4524]=q7;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==30){c[13898]=qT+1;hw=is(bn)|0;gA=c[hw>>2]|0;if((gA|0)==1){q8=+(c[hw+8>>2]|0)}else if((gA|0)==2){q8=+h[hw+8>>3]}else if((gA|0)==3){q8=+uz(c[hw+8>>2]|0,0)}else{b7=1885;break L27}if((c[da>>2]|0)==3){uu(c[dc>>2]|0);c[da>>2]=1}h[4525]=q8<0.0?0.0:q8;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==31){c[13898]=qT+1;hw=is(bm)|0;gA=c[hw>>2]|0;if((gA|0)==1){q9=+(c[hw+8>>2]|0)}else if((gA|0)==2){q9=+h[hw+8>>3]}else if((gA|0)==3){q9=+uz(c[hw+8>>2]|0,0)}else{b7=1893;break L27}if((c[dd>>2]|0)==3){uu(c[de>>2]|0);c[dd>>2]=1}h[4526]=q9;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==32){c[13898]=qT+1;hw=is(bl)|0;gA=c[hw>>2]|0;if((gA|0)==1){ra=+(c[hw+8>>2]|0)}else if((gA|0)==2){ra=+h[hw+8>>3]}else if((gA|0)==3){ra=+uz(c[hw+8>>2]|0,0)}else{b7=1901;break L27}if((c[df>>2]|0)==3){uu(c[dg>>2]|0);c[df>>2]=1}h[4527]=ra;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==37){hw=qT+1|0;c[13898]=hw;gA=c[gy+(hw*40&-1)+36>>2]|0;L2629:do{if((a[gy+(hw*40&-1)|0]&1)!=0&(gA|0)>0){hS=0;gC=0;hC=c[gy+(hw*40&-1)+32>>2]|0;while(1){if((a[hS+137208|0]|0)==(a[qU+(hS+hC|0)|0]|0)){rb=hC;rc=gC}else{if((hS|0)!=3){break L2629}rb=hC-1|0;rc=1}gx=hS+1|0;if((gx|0)<(rc+gA|0)){hS=gx;gC=rc;hC=rb}else{break}}if((rc|0)==0){if(!((hS|0)==2|(hS|0)==12)){break}}c[9056]=2;q1=nd;q2=gE;q3=gH;q4=hF;break L2499}}while(0);c[9056]=1;c[13898]=qT;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==38){c[9056]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==33){gA=qT+1|0;c[13898]=gA;L2644:do{if((gA|0)<(hp|0)){L2646:do{if((a[gy+(gA*40&-1)|0]&1)!=0){hw=c[gy+(gA*40&-1)+36>>2]|0;hC=gy+(gA*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(hw|0)){break}if((a[qU+((c[hC>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L2646}}if((gC|0)==1){b7=1926;break L2644}}}while(0);a[14176]=1;is(bk);a[14176]=0;if((c[dh>>2]|0)!=3){c[13898]=gA;b7=1926;break}hS=c[di>>2]|0;if((hS|0)==0){b7=1926;break}uF(36288,hS|0,1025);uu(hS)}else{b7=1926}}while(0);if((b7|0)==1926){b7=0;a[36288]=0}c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==34){a[36288]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==35){rd=qT+1|0;c[13898]=rd;gA=(a[gy+(rd*40&-1)|0]&1)==0;if(gA){b7=1931}else{hS=a[qU+(c[gy+(rd*40&-1)+32>>2]|0)|0]|0;if(!((hS<<24>>24|0)==39|(hS<<24>>24|0)==34)){b7=1931}}if((b7|0)==1931){b7=0;hS=c[10810]|0;if((hS|0)==0){b7=5171;break L27}hC=gy+(rd*40&-1)+36|0;hw=gy+(rd*40&-1)+32|0;hB=(hp|0)<=(rd|0)|gA;gA=hS;L2667:while(1){hS=c[gA+4>>2]|0;L2669:do{if(!hB){gx=c[hC>>2]|0;ne=0;while(1){if((ne|0)>=(gx|0)){break}if((a[qU+((c[hw>>2]|0)+ne|0)|0]|0)==(a[hS+ne|0]|0)){ne=ne+1|0}else{break L2669}}if((a[hS+ne|0]|0)==0){break L2667}}}while(0);hS=c[gA>>2]|0;if((hS|0)==0){b7=5173;break L27}else{gA=hS}}if((a[gA+8|0]&1)!=0){b7=5172;break L27}if((c[gA+16>>2]|0)!=3){b7=5174;break L27}}uu(c[9329]|0);hw=c[13898]|0;L2679:do{if((hw|0)<(c[8272]|0)){hC=c[1054]|0;L2681:do{if((a[hC+(hw*40&-1)|0]&1)!=0){hB=c[hC+(hw*40&-1)+36>>2]|0;hS=hC+(hw*40&-1)+32|0;gx=c[10036]|0;gC=0;while(1){if((gC|0)>=(hB|0)){break}if((a[gx+((c[hS>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L2681}}if((gC|0)==1){re=0;rf=hw;break L2679}}}while(0);a[14176]=1;is(bj);a[14176]=0;if((c[dj>>2]|0)==3){re=c[dk>>2]|0;rf=c[13898]|0;break}else{c[13898]=hw;re=0;rf=hw;break}}else{re=0;rf=hw}}while(0);c[9329]=re;c[13898]=rf-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==36){uE(c5|0,0,16);hI(bq,7);do{if((c[dm>>2]|0)==3){if(+h[dn>>3]!=-1.0){break}c[dm>>2]=7}}while(0);c[9330]=c[c5>>2];c[37324>>2]=c[c5+4>>2];c[37328>>2]=c[c5+8>>2];c[37332>>2]=c[c5+12>>2];c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==42){hw=qT+1|0;c[13898]=hw;L2698:do{if((hw|0)<(hp|0)){L2700:do{if((a[gy+(hw*40&-1)|0]&1)!=0){gA=c[gy+(hw*40&-1)+36>>2]|0;hC=gy+(hw*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(gA|0)){b7=1961;break}if((a[qU+((c[hC>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==1961){b7=0;if((hS|0)==1){rg=0;rh=hw;break L2698}}if((gA|0)<=0){break}gC=0;gx=0;hB=c[hC>>2]|0;while(1){if((a[gC+137072|0]|0)==(a[qU+(gC+hB|0)|0]|0)){ri=hB;rj=gx}else{if((gC|0)!=1){break L2700}ri=hB-1|0;rj=1}ne=gC+1|0;if((ne|0)<(rj+gA|0)){gC=ne;gx=rj;hB=ri}else{break}}if((rj|0)!=0){rg=0;rh=hw;break L2698}if((gC|0)==0|(gC|0)==9){rg=0;rh=hw;break L2698}}}while(0);hB=is(bh)|0;gx=c[hB>>2]|0;if((gx|0)==1){rk=+(c[hB+8>>2]|0)}else if((gx|0)==2){rk=+h[hB+8>>3]}else if((gx|0)==3){rk=+uz(c[hB+8>>2]|0,0)}else{b7=1974;break L27}if((c[dp>>2]|0)==3){uu(c[dq>>2]|0);c[dp>>2]=1}rg=~~rk;rh=c[13898]|0}else{rg=0;rh=hw}}while(0);c[9338]=(rg|0)<0?0:rg;c[13898]=rh-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==43){hw=qT+1|0;c[13898]=hw;L2728:do{if((hw|0)<(hp|0)){L2730:do{if((a[gy+(hw*40&-1)|0]&1)!=0){hB=c[gy+(hw*40&-1)+36>>2]|0;gx=gy+(hw*40&-1)+32|0;gA=0;while(1){if((gA|0)>=(hB|0)){b7=1984;break}if((a[qU+((c[gx>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{break}}if((b7|0)==1984){b7=0;if((gA|0)==1){rl=0;rm=hw;break L2728}}if((hB|0)<=0){break}gC=0;hC=0;hS=c[gx>>2]|0;while(1){if((a[gC+137072|0]|0)==(a[qU+(gC+hS|0)|0]|0)){rn=hS;ro=hC}else{if((gC|0)!=1){break L2730}rn=hS-1|0;ro=1}ne=gC+1|0;if((ne|0)<(ro+hB|0)){gC=ne;hC=ro;hS=rn}else{break}}if((ro|0)!=0){rl=0;rm=hw;break L2728}if((gC|0)==0|(gC|0)==9){rl=0;rm=hw;break L2728}}}while(0);hS=is(bg)|0;hC=c[hS>>2]|0;if((hC|0)==1){rp=+(c[hS+8>>2]|0)}else if((hC|0)==2){rp=+h[hS+8>>3]}else if((hC|0)==3){rp=+uz(c[hS+8>>2]|0,0)}else{b7=1997;break L27}if((c[dr>>2]|0)==3){uu(c[ds>>2]|0);c[dr>>2]=1}rl=~~rp;rm=c[13898]|0}else{rl=0;rm=hw}}while(0);c[9339]=(rl|0)<0?0:rl;c[13898]=rm-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==44){a[36228]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==45){a[36228]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==10){hw=qT+1|0;c[13898]=hw;if(gH){uh(hw,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}dl(36136,0);c[9031]=3;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=1;q4=hF}else{b7=2007;break L27}}while(0);if((b7|0)==1817){b7=0;if(!gE){c[9045]=1}if(!hF){c[9047]=1}c[9031]=2;c[9032]=0;q1=nd;q2=gE;q3=1;q4=hF}else if((b7|0)==1824){b7=0;if(!gE){c[9045]=1}if(!hF){c[9047]=1}c[9031]=2;c[9032]=1;q1=nd;q2=gE;q3=1;q4=hF}hK=(c[13898]|0)+1|0;c[13898]=hK;hw=c[8272]|0;if((hK|0)>=(hw|0)){qW=q2;qX=q1;break L2473}hF=q4;gH=q3;gE=q2;nd=q1;qT=hK;hp=hw;gy=c[1054]|0}}else{qW=0;qX=0}}while(0);hG=c[9031]|0;if((hG|0)==2){gz=c[9032]|0;if(qX&gz>>>0<2){uh(-1,136464,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}if(!qW){break}if((gz-2|0)>>>0>=2){break}uh(-1,136272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}else if((hG|0)!=1){break}if((c[9047]|0)==0){hG=c[9045]|0;if((hG|0)==0){c[9032]=2;break}else if((hG|0)==1){if((c[9044]|0)==0){c[9032]=0;break}else{c[9032]=1;break}}else if((hG|0)==2){c[9032]=3;break}else{break}}else{hG=c[9044]|0;if((hG|0)==0){c[9032]=0;break}else if((hG|0)==1){if((c[9045]|0)==0){c[9032]=2;break}else{c[9032]=3;break}}else if((hG|0)==2){c[9032]=1;break}else{break}}}else if((gD|0)==29){hG=gv+1|0;c[13898]=hG;L2807:do{if((hG|0)<(c[8272]|0)){L2809:do{if((a[gw+(hG*40&-1)|0]&1)!=0){gz=c[gw+(hG*40&-1)+36>>2]|0;gG=gw+(hG*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gz|0)){b7=2034;break}if((a[gB+((c[gG>>2]|0)+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{rq=0;break}}if((b7|0)==2034){b7=0;if((gy|0)==1){break L2807}else{rq=0}}while(1){if((rq|0)>=(gz|0)){break}if((a[gB+((c[gG>>2]|0)+rq|0)|0]|0)==(a[rq+103664|0]|0)){rq=rq+1|0}else{break L2809}}if((rq|0)==1){break L44}}}while(0);a[14176]=1;is(bf);a[14176]=0;if((c[dt>>2]|0)!=3){c[13898]=hG;break L44}gG=c[du>>2]|0;if((gG|0)==0){break L44}uF(36288,gG|0,1025);uu(gG);break L44}}while(0);a[36288]=0}else if((gD|0)==31){jr(43280)}else if((gD|0)==32){hG=gv+1|0;L2828:do{if((c[8272]|0)>(hG|0)){if((a[gw+(hG*40&-1)|0]&1)==0){break}gG=c[gw+(hG*40&-1)+36>>2]|0;gz=gw+(hG*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gG|0)){break}if((a[gB+((c[gz>>2]|0)+gy|0)|0]|0)==(a[gy+166752|0]|0)){gy=gy+1|0}else{break L2828}}if((gy|0)!=5){break}c[13898]=gv+2;gz=is(bd)|0;gG=c[gz>>2]|0;if((gG|0)==1){rr=+(c[gz+8>>2]|0)}else if((gG|0)==2){rr=+h[gz+8>>3]}else if((gG|0)==3){rr=+uz(c[gz+8>>2]|0,0)}else{b7=2054;break L27}if((c[dv>>2]|0)==3){uu(c[dw>>2]|0);c[dv>>2]=1}c[8798]=~~rr;break L44}}while(0);jr(43264)}else if((gD|0)==30){hG=gv+1|0;c[13898]=hG;L2846:do{if((hG|0)<(c[8272]|0)){gz=(a[gw+(hG*40&-1)|0]&1)==0;if(!gz){gG=c[gw+(hG*40&-1)+36>>2]|0;hp=gw+(hG*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(gG|0)){b7=2064;break}if((a[gB+((c[hp>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break}}if((b7|0)==2064){b7=0;if((nd|0)==1){b7=2154;break}}gG=a[gB+(c[hp>>2]|0)|0]|0;if((gG<<24>>24|0)==39|(gG<<24>>24|0)==34){b7=2154;break}}gG=c[10810]|0;L2857:do{if((gG|0)!=0){gy=gw+(hG*40&-1)+36|0;gE=gw+(hG*40&-1)+32|0;gH=gG;L2859:while(1){hF=c[gH+4>>2]|0;L2861:do{if(!gz){hw=c[gy>>2]|0;hK=0;while(1){if((hK|0)>=(hw|0)){break}if((a[gB+((c[gE>>2]|0)+hK|0)|0]|0)==(a[hF+hK|0]|0)){hK=hK+1|0}else{break L2861}}if((a[hF+hK|0]|0)==0){break L2859}}}while(0);hF=c[gH>>2]|0;if((hF|0)==0){break L2857}else{gH=hF}}if((a[gH+8|0]&1)!=0){break}if((c[gH+16>>2]|0)==3){b7=2154;break L2846}}}while(0);L2871:do{if(!gz){gG=c[gw+(hG*40&-1)+36>>2]|0;hp=gw+(hG*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(gG|0)){b7=2080;break}if((a[gB+((c[hp>>2]|0)+nd|0)|0]|0)==(a[nd+95280|0]|0)){nd=nd+1|0}else{rs=0;break}}if((b7|0)==2080){b7=0;if((nd|0)==2){b7=2154;break L2846}else{rs=0}}while(1){if((rs|0)>=(gG|0)){b7=2083;break}if((a[gB+((c[hp>>2]|0)+rs|0)|0]|0)==(a[rs+130008|0]|0)){rs=rs+1|0}else{rt=0;break}}if((b7|0)==2083){b7=0;if((rs|0)==4){b7=2154;break L2846}else{rt=0}}while(1){if((rt|0)>=(gG|0)){b7=2086;break}if((a[gB+((c[hp>>2]|0)+rt|0)|0]|0)==(a[rt+89896|0]|0)){rt=rt+1|0}else{ru=0;break}}if((b7|0)==2086){b7=0;if((rt|0)==6){b7=2154;break L2846}else{ru=0}}while(1){if((ru|0)>=(gG|0)){b7=2089;break}if((a[gB+((c[hp>>2]|0)+ru|0)|0]|0)==(a[ru+139840|0]|0)){ru=ru+1|0}else{rv=0;break}}if((b7|0)==2089){b7=0;if((ru|0)==6){b7=2154;break L2846}else{rv=0}}while(1){if((rv|0)>=(gG|0)){b7=2092;break}if((a[gB+((c[hp>>2]|0)+rv|0)|0]|0)==(a[rv+129888|0]|0)){rv=rv+1|0}else{rw=0;break}}if((b7|0)==2092){b7=0;if((rv|0)==5){b7=2154;break L2846}else{rw=0}}while(1){if((rw|0)>=(gG|0)){b7=2095;break}if((a[gB+((c[hp>>2]|0)+rw|0)|0]|0)==(a[rw+150856|0]|0)){rw=rw+1|0}else{rx=0;break}}if((b7|0)==2095){b7=0;if((rw|0)==5){b7=2154;break L2846}else{rx=0}}while(1){if((rx|0)>=(gG|0)){b7=2098;break}if((a[gB+((c[hp>>2]|0)+rx|0)|0]|0)==(a[rx+150704|0]|0)){rx=rx+1|0}else{break}}if((b7|0)==2098){b7=0;if((rx|0)==4){b7=2154;break L2846}}nd=c[hp>>2]|0;gH=(gG|0)>0;L2909:do{if(gH){gE=0;gy=0;hF=nd;while(1){if((a[gE+90456|0]|0)==(a[gB+(gE+hF|0)|0]|0)){ry=hF;rz=gy}else{if((gE|0)!=3){rA=0;rB=0;rC=nd;break}ry=hF-1|0;rz=1}hw=gE+1|0;if((hw|0)<(rz+gG|0)){gE=hw;gy=rz;hF=ry}else{b7=2104;break}}if((b7|0)==2104){b7=0;if((rz|0)!=0){b7=2154;break L2846}if((gE|0)==2|(gE|0)==6){b7=2154;break L2846}else{rA=0;rB=0;rC=nd}}while(1){if((a[rA+149328|0]|0)==(a[gB+(rA+rC|0)|0]|0)){rD=rC;rE=rB}else{if((rA|0)!=5){rF=0;break L2909}rD=rC-1|0;rE=1}hF=rA+1|0;if((hF|0)<(rE+gG|0)){rA=hF;rB=rE;rC=rD}else{break}}if((rE|0)!=0){b7=2154;break L2846}if((rA|0)==4|(rA|0)==8){b7=2154;break L2846}else{rF=0}}else{rF=0}}while(0);while(1){if((rF|0)>=(gG|0)){b7=2114;break}if((a[gB+(rF+nd|0)|0]|0)==(a[rF+225056|0]|0)){rF=rF+1|0}else{break}}if((b7|0)==2114){b7=0;if((rF|0)==2){b7=2154;break L2846}}L2933:do{if(gH){hp=0;gE=0;hF=nd;while(1){if((a[hp+139232|0]|0)==(a[gB+(hp+hF|0)|0]|0)){rG=hF;rH=gE}else{if((hp|0)!=5){rI=0;break L2933}rG=hF-1|0;rH=1}gy=hp+1|0;if((gy|0)<(rH+gG|0)){hp=gy;gE=rH;hF=rG}else{break}}if((rH|0)!=0){b7=2154;break L2846}if((hp|0)==4|(hp|0)==8){b7=2154;break L2846}else{rI=0}}else{rI=0}}while(0);while(1){if((rI|0)>=(gG|0)){b7=2124;break}if((a[gB+(rI+nd|0)|0]|0)==(a[rI+205624|0]|0)){rI=rI+1|0}else{break}}if((b7|0)==2124){b7=0;if((rI|0)==2){b7=2154;break L2846}}L2948:do{if(gH){hF=0;gE=0;gy=nd;while(1){if((a[hF+139064|0]|0)==(a[gB+(hF+gy|0)|0]|0)){rJ=gy;rK=gE}else{if((hF|0)!=6){rL=0;break L2948}rJ=gy-1|0;rK=1}hw=hF+1|0;if((hw|0)<(rK+gG|0)){hF=hw;gE=rK;gy=rJ}else{break}}if((rK|0)!=0){b7=2154;break L2846}if((hF|0)==5|(hF|0)==9){b7=2154;break L2846}else{rL=0}}else{rL=0}}while(0);while(1){if((rL|0)>=(gG|0)){b7=2134;break}if((a[gB+(rL+nd|0)|0]|0)==(a[rL+143040|0]|0)){rL=rL+1|0}else{break}}if((b7|0)==2134){b7=0;if((rL|0)==2){b7=2154;break L2846}}L2963:do{if(gH){gy=0;gE=0;hp=nd;while(1){if((a[gy+142856|0]|0)==(a[gB+(gy+hp|0)|0]|0)){rM=hp;rN=gE}else{if((gy|0)!=4){rO=0;break L2963}rM=hp-1|0;rN=1}hw=gy+1|0;if((hw|0)<(rN+gG|0)){gy=hw;gE=rN;hp=rM}else{break}}if((rN|0)!=0){b7=2154;break L2846}if((gy|0)==3|(gy|0)==9){b7=2154;break L2846}else{rO=0}}else{rO=0}}while(0);while(1){if((rO|0)>=(gG|0)){break}if((a[gB+(rO+nd|0)|0]|0)==(a[rO+124352|0]|0)){rO=rO+1|0}else{break L2871}}if((rO|0)==4){b7=2154;break L2846}}}while(0);is(bb);gz=c[dy>>2]|0;if((gz|0)==3){c[13898]=hG;nd=c[10822]|0;L2979:do{if((nd|0)==0){rP=1}else{gG=1;gH=nd;while(1){if((c[gH+4>>2]|0)!=(gG|0)){rP=gG;break L2979}hp=gG+1|0;gE=c[gH>>2]|0;if((gE|0)==0){rP=hp;break}else{gG=hp;gH=gE}}}}while(0);uu(c[dA>>2]|0);c[dy>>2]=1;rQ=rP;b7=2157;break}else if((gz|0)==1){rR=+(c[dB>>2]|0)}else if((gz|0)==2){rR=+h[dz>>3]}else{b7=2152;break L27}rQ=~~rR;b7=2157}else{b7=2154}}while(0);L2987:do{if((b7|0)==2154){b7=0;hG=c[10822]|0;if((hG|0)==0){rS=1;rT=0;rU=0;b7=2163;break}else{rV=1;rW=hG}while(1){if((c[rW+4>>2]|0)!=(rV|0)){rQ=rV;b7=2157;break L2987}hG=rV+1|0;nd=c[rW>>2]|0;if((nd|0)==0){rQ=hG;b7=2157;break}else{rV=hG;rW=nd}}}}while(0);L2992:do{if((b7|0)==2157){b7=0;if((rQ|0)<1){b7=2158;break L27}gz=c[10822]|0;if((gz|0)==0){rS=rQ;rT=0;rU=0;b7=2163;break}else{rX=0;rY=gz}while(1){rZ=c[rY+4>>2]|0;if((rQ|0)<=(rZ|0)){break}gz=c[rY>>2]|0;if((gz|0)==0){rS=rQ;rT=rY;rU=0;b7=2163;break L2992}else{rX=rY;rY=gz}}if((rQ|0)==(rZ|0)){r_=rY}else{rS=rQ;rT=rX;rU=rY;b7=2163}}}while(0);if((b7|0)==2163){b7=0;uE(dx|0,0,28);gz=ut(192)|0;if((gz|0)==0){gk();nd=ut(192)|0;if((nd|0)==0){b7=2165;break L27}else{r$=nd}}else{r$=gz}gz=r$;nd=r$;c[nd>>2]=0;c[r$+4>>2]=rS;c[r$+72>>2]=0;c[r$+88>>2]=0;uE(r$+8|0,0,60);c[r$+96>>2]=1;hG=r$+156|0;a[r$+184|0]=0;c[r$+144>>2]=4;c[r$+148>>2]=4;c[r$+152>>2]=4;c[hG>>2]=c[dx>>2];c[hG+4>>2]=c[dx+4>>2];c[hG+8>>2]=c[dx+8>>2];c[hG+12>>2]=c[dx+12>>2];c[hG+16>>2]=c[dx+16>>2];c[hG+20>>2]=c[dx+20>>2];c[hG+24>>2]=c[dx+24>>2];if((rT|0)==0){c[10822]=gz}else{c[rT>>2]=gz}c[nd>>2]=rU;r_=gz}gz=c[13898]|0;L3009:do{if((gz|0)<(c[8272]|0)){nd=c[1054]|0;L3011:do{if((a[nd+(gz*40&-1)|0]&1)!=0){hG=c[nd+(gz*40&-1)+36>>2]|0;gH=nd+(gz*40&-1)+32|0;gG=c[10036]|0;gE=0;while(1){if((gE|0)>=(hG|0)){break}if((a[gG+((c[gH>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{break L3011}}if((gE|0)==1){break L3009}}}while(0);jw(r_);nd=c[13898]|0;L3018:do{if((nd|0)<(c[8272]|0)){gH=c[1054]|0;L3020:do{if((a[gH+(nd*40&-1)|0]&1)!=0){gG=c[gH+(nd*40&-1)+36>>2]|0;hG=gH+(nd*40&-1)+32|0;hp=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){break}if((a[hp+((c[hG>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L3020}}if((hF|0)==1){break L3018}}}while(0);a[14176]=1;is(a9);a[14176]=0;if((c[dC>>2]|0)!=3){c[13898]=nd;break}gH=c[dD>>2]|0;if((gH|0)==0){break}gE=r_+60|0;uu(c[gE>>2]|0);c[gE>>2]=gH}}while(0);nd=c[13898]|0;if((nd|0)>=(c[8272]|0)){break}gH=c[1054]|0;if((a[gH+(nd*40&-1)|0]&1)==0){break}gE=c[gH+(nd*40&-1)+36>>2]|0;hG=gH+(nd*40&-1)+32|0;nd=c[10036]|0;gH=0;while(1){if((gH|0)>=(gE|0)){b7=2191;break}if((a[nd+((c[hG>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{r0=0;break}}if((b7|0)==2191){b7=0;if((gH|0)==1){break}else{r0=0}}while(1){if((r0|0)>=(gE|0)){break}if((a[nd+((c[hG>>2]|0)+r0|0)|0]|0)==(a[r0+148464|0]|0)){r0=r0+1|0}else{break L3009}}if((r0|0)!=1){break}hG=r_+60|0;nd=c[hG>>2]|0;gE=(uA(nd|0)|0)+1|0;gH=ut(gE)|0;if((gH|0)==0){gk();hp=ut(gE)|0;if((hp|0)==0){b7=2198;break L27}else{r1=hp}}else{r1=gH}r2=nd;nd=0;r3=r1;gH=gE;hp=gE;gE=c[13898]|0;gG=c[1054]|0;L3047:while(1){gy=gE+1|0;c[13898]=gy;if((a[gG+(gy*40&-1)|0]&1)!=0){hw=a[(c[10036]|0)+(c[gG+(gy*40&-1)+32>>2]|0)|0]|0;if((hw<<24>>24|0)==39|(hw<<24>>24|0)==34){b7=2201;break L27}}hw=is(ba)|0;gy=c[hw>>2]|0;if((gy|0)==1){r4=+(c[hw+8>>2]|0)}else if((gy|0)==2){r4=+h[hw+8>>3]}else if((gy|0)==3){r4=+uz(c[hw+8>>2]|0,0)}else{b7=2206;break L27}if((c[dE>>2]|0)==3){uu(c[dF>>2]|0);c[dE>>2]=1}r5=(hp+30|0)+gH|0;r6=db(r3,r5,138416)|0;hw=r6+nd|0;ud(hw,r5-nd|0,r2,1.0,r4);r7=(uA(hw|0)|0)+nd|0;hw=c[13898]|0;gy=c[8272]|0;if((hw|0)>=(gy|0)){b7=2218;break}hS=c[1054]|0;if((a[hS+(hw*40&-1)|0]&1)==0){b7=2218;break}hC=c[hS+(hw*40&-1)+36>>2]|0;hB=hS+(hw*40&-1)+32|0;gx=c[10036]|0;gA=0;while(1){if((gA|0)>=(hC|0)){b7=2214;break}if((a[gx+((c[hB>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{r8=0;break}}if((b7|0)==2214){b7=0;if((gA|0)==1){b7=2218;break}else{r8=0}}while(1){if((r8|0)>=(hC|0)){break}if((a[gx+((c[hB>>2]|0)+r8|0)|0]|0)==(a[r8+148464|0]|0)){r8=r8+1|0}else{b7=2218;break L3047}}if((r8|0)!=1){b7=2218;break}hB=hw+1|0;c[13898]=hB;if((hB|0)>=(gy|0)){b7=5175;break L27}if((a[hS+(hB*40&-1)|0]&1)==0){b7=5176;break L27}hC=c[hS+(hB*40&-1)+36>>2]|0;gA=hS+(hB*40&-1)+32|0;ne=0;while(1){if((ne|0)>=(hC|0)){b7=2224;break}nh=c[gA>>2]|0;if((a[gx+(nh+ne|0)|0]|0)==(a[ne+103664|0]|0)){ne=ne+1|0}else{r9=nh;break}}if((b7|0)==2224){b7=0;if((ne|0)==1){b7=5177;break L27}r9=c[gA>>2]|0}gy=a[gx+r9|0]|0;if(!((gy<<24>>24|0)==39|(gy<<24>>24|0)==34)){b7=5178;break L27}if(hC>>>0<hp>>>0){sa=r2;sb=hp;sc=hB;sd=hS;se=hC}else{gy=db(r2,hC,138128)|0;hw=c[13898]|0;nh=c[1054]|0;sa=gy;sb=hC;sc=hw;sd=nh;se=c[nh+(hw*40&-1)+36>>2]|0}hw=se-2|0;nh=(hw|0)<(hC|0)?hw:hC-1|0;if((nh|0)>0){hw=c[sd+(sc*40&-1)+32>>2]|0;gy=0;while(1){gF=hw+1|0;ho=gy+1|0;a[sa+gy|0]=a[(c[10036]|0)+gF|0]|0;if((ho|0)==(nh|0)){sf=nh;break}else{hw=gF;gy=ho}}}else{sf=0}a[sa+sf|0]=0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(sc*40&-1)+32>>2]|0)|0]|0)==34){ua(sa)}else{gy=sa;hw=sa;while(1){nh=a[hw]|0;if((nh<<24>>24|0)==39){hC=hw+1|0;hS=(a[hC]|0)==39?hC:hw;sg=hS;sh=a[hS]|0}else if((nh<<24>>24|0)==0){break}else{sg=hw;sh=nh}a[gy]=sh;gy=gy+1|0;hw=sg+1|0}a[gy]=0}hw=(c[13898]|0)+1|0;c[13898]=hw;if((hw|0)>=(c[8272]|0)){b7=2248;break}nh=c[1054]|0;if((a[nh+(hw*40&-1)|0]&1)==0){b7=2248;break}hS=c[nh+(hw*40&-1)+36>>2]|0;hC=nh+(hw*40&-1)+32|0;hB=c[10036]|0;gx=0;while(1){if((gx|0)>=(hS|0)){b7=2244;break}if((a[hB+((c[hC>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{si=0;break}}if((b7|0)==2244){b7=0;if((gx|0)==1){b7=2248;break}else{si=0}}while(1){if((si|0)>=(hS|0)){break}if((a[hB+((c[hC>>2]|0)+si|0)|0]|0)==(a[si+148464|0]|0)){si=si+1|0}else{b7=2248;break L3047}}if((si|0)==1){r2=sa;nd=r7;r3=r6;gH=r5;hp=sb;gE=hw;gG=nh}else{b7=2248;break}}if((b7|0)==2218){b7=0;uu(r2);sj=r6}else if((b7|0)==2248){b7=0;gG=db(r6,sb+r5|0,137840)|0;uB(gG+r7|0,sa|0);uu(sa);sj=gG}c[hG>>2]=sj}}while(0);jw(r_);}else if((gD|0)==33){gz=gv+1|0;c[13898]=gz;gG=c[8272]|0;L3116:do{if((gz|0)<(gG|0)){gE=a[gw+(gz*40&-1)|0]|0;L3118:do{if((gE&1)==0){sk=0;sl=gz;sm=gG;sn=gw;so=gE}else{hp=c[gw+(gz*40&-1)+36>>2]|0;gH=gw+(gz*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(hp|0)){break}if((a[gB+((c[gH>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{sk=0;sl=gz;sm=gG;sn=gw;so=gE;break L3118}}if((nd|0)==1){break L3116}else{sk=0;sl=gz;sm=gG;sn=gw;so=gE}}}while(0);L3124:while(1){gE=(so&1)==0;L3126:do{if(!gE){hG=c[sn+(sl*40&-1)+36>>2]|0;gH=sn+(sl*40&-1)+32|0;hp=c[10036]|0;nh=0;while(1){if((nh|0)>=(hG|0)){break}if((a[hp+((c[gH>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{break L3126}}if((nh|0)==1){sp=sk;break L3124}}}while(0);if((sl|0)>=(sm|0)){b7=2271;break L27}L3134:do{if(!gE){nd=c[sn+(sl*40&-1)+36>>2]|0;gH=sn+(sl*40&-1)+32|0;hp=c[10036]|0;hG=0;while(1){if((hG|0)>=(nd|0)){break}if((a[hp+((c[gH>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L3134}}if((hG|0)==1){b7=2271;break L27}}}while(0);a[14176]=1;is(a7);a[14176]=0;if((c[dG>>2]|0)!=3){b7=2270;break L27}gE=c[dH>>2]|0;c[a8>>2]=gE;if((gE|0)==0){b7=2280;break L27}if((sk|0)==0){sq=0}else{sq=uA(sk|0)|0}iQ(a8);gE=c[a8>>2]|0;gH=db(sk,(sq+2|0)+(uA(gE|0)|0)|0,140360)|0;if((sq|0)==0){uB(gH|0,gE|0)}else{hp=gH+sq|0;nd=gH+(sq+1|0)|0;uB(nd|0,gE|0);a[hp]=58}uu(gE);gE=c[13898]|0;hp=c[8272]|0;if((gE|0)>=(hp|0)){sp=gH;break}nd=c[1054]|0;sk=gH;sl=gE;sm=hp;sn=nd;so=a[nd+(gE*40&-1)|0]|0}if((sp|0)==0){break L44}uq(4,sp);uu(sp);break L44}}while(0);uq(32,0)}else if((gD|0)==34){sr=gv+1|0;c[13898]=sr;L3155:do{if((sr|0)<(c[8272]|0)){L3157:do{if((a[gw+(sr*40&-1)|0]&1)!=0){gG=c[gw+(sr*40&-1)+36>>2]|0;gz=gw+(sr*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){b7=2289;break}if((a[gB+((c[gz>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{ss=0;break}}if((b7|0)==2289){b7=0;if((gE|0)==1){break L3155}else{ss=0}}while(1){if((ss|0)>=(gG|0)){break}if((a[gB+((c[gz>>2]|0)+ss|0)|0]|0)==(a[ss+103664|0]|0)){ss=ss+1|0}else{break L3157}}if((ss|0)==1){st=sr;b7=5181;break L27}}}while(0);a[14176]=1;is(a6);a[14176]=0;if((c[dI>>2]|0)!=3){b7=2297;break L27}gz=c[dJ>>2]|0;if((gz|0)==0){b7=2299;break L27}us(4,gz);uu(gz);break L44}}while(0);uu(c[12908]|0);bA(5,179864);bA(2,179864);gz=bA(5,0)|0;if((gz|0)==0){su=0}else{su=bP(gz|0)|0}c[12908]=su}else if((gD|0)==35){uE(dK|0,0,11);gz=gv+1|0;c[13898]=gz;gG=c[8272]|0;L3176:do{if((gz|0)<(gG|0)){gE=c[gw+(gz*40&-1)+36>>2]|0;L3178:do{if((a[gw+(gz*40&-1)|0]&1)!=0){nd=gw+(gz*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(gE|0)){break}if((a[gB+((c[nd>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L3178}}if((hp|0)==1){b7=2308;break L3176}}}while(0);if((gE|0)>0){sv=gw+(gz*40&-1)+32|0;nd=c[sv>>2]|0;gH=0;do{sw=gH+nd|0;nh=gB+sw|0;hF=a[nh]|0;do{if(hF<<24>>24==114){sx=7}else{if((a_(nh|0,108208,2)|0)==0){sx=6;break}if((a_(nh|0,108120,2)|0)==0){sx=5;break}if((a_(nh|0,124768,2)|0)==0){sx=4;break}if((a_(nh|0,88416,2)|0)==0){sx=3;break}if(hF<<24>>24==120){sx=2;break}if(hF<<24>>24==121){sx=1;break}if(hF<<24>>24==122){sx=0}else{b7=2312;break L27}}}while(0);a[a5+(c[56724+(sx<<3)>>2]|0)|0]=1;gH=(uA(c[56720+(sx<<3)>>2]|0)|0)+gH|0;}while((gH|0)<(gE|0))}gE=gv+2|0;c[13898]=gE;if((gE|0)>=(gG|0)){sy=10.0;break}L3200:do{if((a[gw+(gE*40&-1)|0]&1)!=0){gH=c[gw+(gE*40&-1)+36>>2]|0;nd=gw+(gE*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gH|0)){break}if((a[gB+((c[nd>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L3200}}if((hF|0)==1){sy=10.0;break L3176}}}while(0);gE=is(a4)|0;nd=c[gE>>2]|0;if((nd|0)==1){sz=+(c[gE+8>>2]|0)}else if((nd|0)==2){sz=+h[gE+8>>3]}else if((nd|0)==3){sz=+uz(c[gE+8>>2]|0,0)}else{b7=2324;break L27}if((c[dL>>2]|0)==3){uu(c[dM>>2]|0);c[dL>>2]=1}m3=+P(+sz);if(m3>1.0){sy=m3}else{b7=2328;break L27}}else{b7=2308}}while(0);if((b7|0)==2308){b7=0;uE(dK|0,1,7);sy=10.0}gG=0;L3218:do{do{if((a[a5+gG|0]&1)!=0){a[64788+(gG*688&-1)|0]=1;h[64792+(gG*688&-1)>>3]=sy;h[64800+(gG*688&-1)>>3]=+_(+sy);if((gG|0)!=7){break}if((a[30528]&1)==0){break L3218}ju()}}while(0);gG=gG+1|0;}while((gG|0)<8);c[6928]=0}else if((gD|0)==36){c[13898]=gv+1;a[43472]=1}else if((gD|0)==37){sA=gv+1|0;c[13898]=sA;L3228:do{if((sA|0)<(c[8272]|0)){if((a[gw+(sA*40&-1)|0]&1)==0){b7=5184;break L27}gG=c[gw+(sA*40&-1)+36>>2]|0;gz=gw+(sA*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){b7=2349;break}nd=c[gz>>2]|0;if((a[gB+(nd+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{sB=nd;break}}if((b7|0)==2349){b7=0;if((gE|0)==1){b7=2351;break}sB=c[gz>>2]|0}if((gG|0)>0){sC=0;sD=0;sE=sB}else{b7=5185;break L27}while(1){if((a[sC+141752|0]|0)==(a[gB+(sC+sE|0)|0]|0)){sF=sE;sG=sD}else{if((sC|0)!=2){sH=0;sI=0;sJ=sB;break}sF=sE-1|0;sG=1}nd=sC+1|0;if((nd|0)<(sG+gG|0)){sC=nd;sD=sG;sE=sF}else{b7=2357;break}}do{if((b7|0)==2357){b7=0;if((sG|0)==0){if(!((sC|0)==1|(sC|0)==9)){sH=0;sI=0;sJ=sB;break}}c[8732]=0;break L3228}}while(0);while(1){if((a[sH+141560|0]|0)==(a[gB+(sH+sJ|0)|0]|0)){sK=sJ;sL=sI}else{if((sH|0)!=1){sM=0;sN=0;sO=sB;break}sK=sJ-1|0;sL=1}gz=sH+1|0;if((gz|0)<(sL+gG|0)){sH=gz;sI=sL;sJ=sK}else{b7=2364;break}}do{if((b7|0)==2364){b7=0;if((sL|0)==0){if(!((sH|0)==0|(sH|0)==9)){sM=0;sN=0;sO=sB;break}}c[8732]=1;break L3228}}while(0);while(1){if((a[sM+141376|0]|0)==(a[gB+(sM+sO|0)|0]|0)){sP=sO;sQ=sN}else{if((sM|0)!=2){b7=5186;break L27}sP=sO-1|0;sQ=1}gz=sM+1|0;if((gz|0)<(sQ+gG|0)){sM=gz;sN=sQ;sO=sP}else{break}}if((sQ|0)==0){if(!((sM|0)==1|(sM|0)==11)){b7=5187;break L27}}c[8732]=2}else{b7=2351}}while(0);if((b7|0)==2351){b7=0;c[8732]=0}c[13898]=gv+2}else if((gD|0)==42){js(56400)}else if((gD|0)==39){js(35144)}else if((gD|0)==40){js(26392)}else if((gD|0)==41){js(4264)}else if((gD|0)==15){sR=gv+1|0;c[13898]=sR;gG=c[gw+(sR*40&-1)+36>>2]|0;gz=c[gw+(sR*40&-1)+32>>2]|0;gE=(a[gw+(sR*40&-1)|0]&1)==0;if((gG|0)>0&(gE^1)){sS=0;sT=0;sU=gz}else{b7=5195;break L27}while(1){if((a[sS+210832|0]|0)==(a[gB+(sS+sU|0)|0]|0)){sV=sU;sW=sT}else{if((sS|0)!=4){break}sV=sU-1|0;sW=1}nd=sS+1|0;if((nd|0)<(sW+gG|0)){sS=nd;sT=sW;sU=sV}else{b7=2385;break}}do{if((b7|0)==2385){b7=0;if((sW|0)==0){if(!((sS|0)==3|(sS|0)==7)){break}}sX=gv+2|0;c[13898]=sX;L3289:do{if((sX|0)<(c[8272]|0)){L3291:do{if((a[gw+(sX*40&-1)|0]&1)!=0){nd=c[gw+(sX*40&-1)+36>>2]|0;gH=gw+(sX*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(nd|0)){b7=2392;break}if((a[gB+((c[gH>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{sY=0;break}}if((b7|0)==2392){b7=0;if((nh|0)==1){break L3289}else{sY=0}}while(1){if((sY|0)>=(nd|0)){break}if((a[gB+((c[gH>>2]|0)+sY|0)|0]|0)==(a[sY+103664|0]|0)){sY=sY+1|0}else{break L3291}}if((sY|0)==1){b7=2399;break L27}}}while(0);a[14176]=1;is(a3);a[14176]=0;if((c[dP>>2]|0)!=3){b7=2398;break L27}hF=c[dQ>>2]|0;c[8528]=hF;if((hF|0)==0){b7=2401;break L27}else{break L44}}}while(0);uu(c[8528]|0);c[8528]=0;break L44}}while(0);if(gE){b7=5196;break L27}L3307:do{if((gG|0)>0){hF=0;gH=0;nd=gz;while(1){if((a[hF+209008|0]|0)==(a[gB+(hF+nd|0)|0]|0)){sZ=nd;s_=gH}else{if((hF|0)!=3){break L3307}sZ=nd-1|0;s_=1}nh=hF+1|0;if((nh|0)<(s_+gG|0)){hF=nh;gH=s_;nd=sZ}else{break}}if((s_|0)==0){if(!((hF|0)==2|(hF|0)==9)){break}}s$=gv+2|0;c[13898]=s$;do{if((s$|0)<(c[8272]|0)){if((a[gw+(s$*40&-1)|0]&1)==0){b7=5190;break L27}nd=c[gw+(s$*40&-1)+36>>2]|0;gH=gw+(s$*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(nd|0)){b7=2416;break}hG=c[gH>>2]|0;if((a[gB+(hG+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{s0=hG;break}}if((b7|0)==2416){b7=0;if((nh|0)==1){break}s0=c[gH>>2]|0}L3328:do{if((nd|0)>0){hG=0;hp=0;hw=s0;while(1){if((a[hG+142688|0]|0)==(a[gB+(hG+hw|0)|0]|0)){s1=hw;s2=hp}else{if((hG|0)!=5){b7=2427;break L3328}s1=hw-1|0;s2=1}hC=hG+1|0;if((hC|0)<(s2+nd|0)){hG=hC;hp=s2;hw=s1}else{break}}if((s2|0)==0){if(!((hG|0)==4|(hG|0)==10)){b7=2427;break}}a[47120]=0}else{b7=2427}}while(0);L3339:do{if((b7|0)==2427){b7=0;gH=a[gB+s0|0]|0;if((gH<<24>>24|0)==39|(gH<<24>>24|0)==34){s3=0}else{b7=5191;break L27}while(1){if((s3|0)>=(nd|0)){b7=2431;break}if((a[gB+(s3+s0|0)|0]|0)==(a[s3+142432|0]|0)){s3=s3+1|0}else{s4=0;b7=2432;break}}if((b7|0)==2431){b7=0;if((s3|0)!=4){s4=0;b7=2432}}do{if((b7|0)==2432){while(1){b7=0;if((s4|0)>=(nd|0)){b7=2434;break}if((a[gB+(s4+s0|0)|0]|0)==(a[s4+142280|0]|0)){s4=s4+1|0;b7=2432}else{break}}if((b7|0)==2434){b7=0;if((s4|0)==4){break}}if(gH<<24>>24!=(a[gB+(s0+2|0)|0]|0)){b7=2437;break L27}a[47120]=a[gB+(s0+1|0)|0]|0;break L3339}}while(0);a[47120]=9}}while(0);c[13898]=gv+3;break L44}}while(0);a[47120]=0;break L44}}while(0);if((gG|0)>0&(gE^1)){s5=0;s6=0;s7=gz}else{b7=5197;break L27}while(1){if((a[s5+97920|0]|0)==(a[gB+(s5+s7|0)|0]|0)){s8=s7;s9=s6}else{if((s5|0)!=3){break}s8=s7-1|0;s9=1}hF=s5+1|0;if((hF|0)<(s9+gG|0)){s5=hF;s6=s9;s7=s8}else{b7=2445;break}}do{if((b7|0)==2445){b7=0;if((s9|0)==0){if(!((s5|0)==2|(s5|0)==13)){break}}ta=gv+2|0;c[13898]=ta;L3369:do{if((ta|0)<(c[8272]|0)){L3371:do{if((a[gw+(ta*40&-1)|0]&1)!=0){hF=c[gw+(ta*40&-1)+36>>2]|0;nd=gw+(ta*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(hF|0)){b7=2452;break}if((a[gB+((c[nd>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{tb=0;break}}if((b7|0)==2452){b7=0;if((gH|0)==1){b7=2453;break L3369}else{tb=0}}while(1){if((tb|0)>=(hF|0)){break}if((a[gB+((c[nd>>2]|0)+tb|0)|0]|0)==(a[tb+103664|0]|0)){tb=tb+1|0}else{break L3371}}if((tb|0)==1){tc=ta;b7=5192;break L27}}}while(0);a[14176]=1;is(a2);a[14176]=0;if((c[dN>>2]|0)!=3){b7=2458;break L27}nd=c[dO>>2]|0;if((nd|0)==0){b7=2460;break L27}uu(c[11948]|0);td=nd}else{b7=2453}}while(0);if((b7|0)==2453){b7=0;uu(c[11948]|0);td=bP(199184)|0}c[11948]=td;break L44}}while(0);if(gE){b7=5198;break L27}L3390:do{if((gG|0)>0){nd=0;hF=0;gH=gz;while(1){if((a[nd+204608|0]|0)==(a[gB+(nd+gH|0)|0]|0)){te=gH;tf=hF}else{if((nd|0)!=3){break L3390}te=gH-1|0;tf=1}hK=nd+1|0;if((hK|0)<(tf+gG|0)){nd=hK;hF=tf;gH=te}else{break}}if((tf|0)==0){if(!((nd|0)==2|(nd|0)==6)){break}}eP();break L44}}while(0);if((gG|0)>0&(gE^1)){tg=0;th=0;ti=gz}else{b7=5199;break L27}while(1){if((a[tg+115448|0]|0)==(a[gB+(tg+ti|0)|0]|0)){tj=ti;tk=th}else{if((tg|0)!=4){break}tj=ti-1|0;tk=1}gH=tg+1|0;if((gH|0)<(tk+gG|0)){tg=gH;th=tk;ti=tj}else{b7=2478;break}}do{if((b7|0)==2478){b7=0;if((tk|0)==0){if(!((tg|0)==3|(tg|0)==7)){break}}a[47712]=1;c[13898]=gv+2;break L44}}while(0);if(gE){b7=5200;break L27}L3415:do{if((gG|0)>0){gH=0;hF=0;hK=gz;while(1){if((a[gH+76296|0]|0)==(a[gB+(gH+hK|0)|0]|0)){tl=hK;tm=hF}else{if((gH|0)!=6){break L3415}tl=hK-1|0;tm=1}hG=gH+1|0;if((hG|0)<(tm+gG|0)){gH=hG;hF=tm;hK=tl}else{break}}if((tm|0)==0){if(!((gH|0)==5|(gH|0)==9)){break}}a[47712]=0;c[13898]=gv+2;break L44}}while(0);if((gG|0)>0&(gE^1)){tn=0}else{b7=5201;break L27}while(1){if((a[tn+223696|0]|0)!=(a[gB+(tn+gz|0)|0]|0)){break}to=tn+1|0;if((to|0)<(gG|0)){tn=to}else{b7=2493;break}}do{if((b7|0)==2493){b7=0;if((to|0)!=8){break}a[47472]=0;c[13898]=gv+2;break L44}}while(0);if((gG|0)>0&(gE^1)){tp=0}else{b7=5202;break L27}do{if((a[tp+216640|0]|0)!=(a[gB+(tp+gz|0)|0]|0)){b7=5203;break L27}tp=tp+1|0;}while((tp|0)<(gG|0));if((tp|0)!=10){b7=5204;break L27}a[47472]=1;c[13898]=gv+2}else if((gD|0)==44){gG=gv+1|0;c[13898]=gG;c[8496]=1;gz=c[8272]|0;if((gG|0)<(gz|0)){tq=gG;tr=gz;ts=gw}else{break}L3440:while(1){tt=c[ts+(tq*40&-1)+36>>2]|0;tu=ts+(tq*40&-1)+32|0;if((a[ts+(tq*40&-1)|0]&1)==0){b7=2503;break}gz=c[10036]|0;gG=0;while(1){if((gG|0)>=(tt|0)){b7=2507;break}gE=c[tu>>2]|0;if((a[gz+(gE+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{tv=gE;break}}if((b7|0)==2507){b7=0;if((gG|0)==1){break L44}tv=c[tu>>2]|0}if((tt|0)>0){tw=0;tx=0;ty=tv}else{tz=tv;tA=0;break}while(1){if((a[tw+148208|0]|0)==(a[gz+(tw+ty|0)|0]|0)){tB=ty;tC=tx}else{if((tw|0)!=2){tD=0;tE=0;tF=tv;b7=2525;break}tB=ty-1|0;tC=1}gH=tw+1|0;if((gH|0)<(tC+tt|0)){tw=gH;tx=tC;ty=tB}else{b7=2514;break}}do{if((b7|0)==2514){b7=0;if((tC|0)==0){if(!((tw|0)==11|(tw|0)==1)){tD=0;tE=0;tF=tv;b7=2525;break}}c[13898]=tq+1;gG=is(a$)|0;gH=c[gG>>2]|0;if((gH|0)==1){tG=+(c[gG+8>>2]|0)}else if((gH|0)==2){tG=+h[gG+8>>3]}else if((gH|0)==3){tG=+uz(c[gG+8>>2]|0,0)}else{b7=2520;break L27}if((c[d5>>2]|0)==3){uu(c[d6>>2]|0);c[d5>>2]=1}gG=~~tG;c[8497]=gG;if((gG|0)>=0){break}c[8497]=0}}while(0);L3470:do{if((b7|0)==2525){while(1){b7=0;if((a[tD+148024|0]|0)==(a[gz+(tD+tF|0)|0]|0)){tH=tF;tI=tE}else{if((tD|0)!=4){tJ=0;tK=0;tL=tv;break}tH=tF-1|0;tI=1}gG=tD+1|0;if((gG|0)<(tI+tt|0)){tD=gG;tE=tI;tF=tH;b7=2525}else{b7=2529;break}}do{if((b7|0)==2529){b7=0;if((tI|0)==0){if(!((tD|0)==3|(tD|0)==13)){tJ=0;tK=0;tL=tv;break}}c[8497]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[tJ+147832|0]|0)==(a[gz+(tJ+tL|0)|0]|0)){tM=tL;tN=tK}else{if((tJ|0)!=6){tO=0;tP=0;tQ=tv;break}tM=tL-1|0;tN=1}gG=tJ+1|0;if((gG|0)<(tN+tt|0)){tJ=gG;tK=tN;tL=tM}else{b7=2538;break}}do{if((b7|0)==2538){b7=0;if((tN|0)==0){if(!((tJ|0)==5|(tJ|0)==15)){tO=0;tP=0;tQ=tv;break}}c[8498]=1;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[tO+147576|0]|0)==(a[gz+(tO+tQ|0)|0]|0)){tR=tQ;tS=tP}else{if((tO|0)!=8){tT=0;tU=0;tV=tv;break}tR=tQ-1|0;tS=1}gG=tO+1|0;if((gG|0)<(tS+tt|0)){tO=gG;tP=tS;tQ=tR}else{b7=2545;break}}do{if((b7|0)==2545){b7=0;if((tS|0)==0){if(!((tO|0)==7|(tO|0)==17)){tT=0;tU=0;tV=tv;break}}c[8498]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[tT+147296|0]|0)==(a[gz+(tT+tV|0)|0]|0)){tW=tV;tX=tU}else{if((tT|0)!=2){tY=0;tZ=0;t_=tv;break}tW=tV-1|0;tX=1}gG=tT+1|0;if((gG|0)<(tX+tt|0)){tT=gG;tU=tX;tV=tW}else{b7=2552;break}}do{if((b7|0)==2552){b7=0;if((tX|0)==0){if(!((tT|0)==1|(tT|0)==16)){tY=0;tZ=0;t_=tv;break}}c[8500]=1;hM();c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[tY+147040|0]|0)==(a[gz+(tY+t_|0)|0]|0)){t$=t_;t0=tZ}else{if((tY|0)!=14){t1=0;t2=0;t3=tv;break}t$=t_-1|0;t0=1}gG=tY+1|0;if((gG|0)<(t0+tt|0)){tY=gG;tZ=t0;t_=t$}else{b7=2559;break}}do{if((b7|0)==2559){b7=0;if((t0|0)==0){if(!((tY|0)==13|(tY|0)==16)){t1=0;t2=0;t3=tv;break}}c[8500]=2;hM();c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[t1+146800|0]|0)==(a[gz+(t1+t3|0)|0]|0)){t4=t3;t6=t2}else{if((t1|0)!=4){t7=0;t8=0;t9=tv;break}t4=t3-1|0;t6=1}gG=t1+1|0;if((gG|0)<(t6+tt|0)){t1=gG;t2=t6;t3=t4}else{b7=2566;break}}do{if((b7|0)==2566){b7=0;if((t6|0)==0){if(!((t1|0)==3|(t1|0)==15)){t7=0;t8=0;t9=tv;break}}c[8500]=0;hM();c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[t7+146616|0]|0)==(a[gz+(t7+t9|0)|0]|0)){ub=t9;uc=t8}else{if((t7|0)!=5){ue=0;ug=0;ui=tv;break}ub=t9-1|0;uc=1}gG=t7+1|0;if((gG|0)<(uc+tt|0)){t7=gG;t8=uc;t9=ub}else{b7=2573;break}}do{if((b7|0)==2573){b7=0;if((uc|0)==0){if(!((t7|0)==4|(t7|0)==6)){ue=0;ug=0;ui=tv;break}}c[8499]=1;gG=tq+1|0;c[13898]=gG;gH=(a[ts+(gG*40&-1)|0]&1)==0;if(gH){b7=2577}else{gE=a[gz+(c[ts+(gG*40&-1)+32>>2]|0)|0]|0;if(!((gE<<24>>24|0)==39|(gE<<24>>24|0)==34)){b7=2577}}if((b7|0)==2577){b7=0;gE=c[10810]|0;if((gE|0)==0){break L3470}hK=ts+(gG*40&-1)+36|0;hF=ts+(gG*40&-1)+32|0;nd=(tr|0)<=(gG|0)|gH;gH=gE;L3553:while(1){gE=c[gH+4>>2]|0;L3555:do{if(!nd){gG=c[hK>>2]|0;hG=0;while(1){if((hG|0)>=(gG|0)){break}if((a[gz+((c[hF>>2]|0)+hG|0)|0]|0)==(a[gE+hG|0]|0)){hG=hG+1|0}else{break L3555}}if((a[gE+hG|0]|0)==0){break L3553}}}while(0);gE=c[gH>>2]|0;if((gE|0)==0){break L3470}else{gH=gE}}if((a[gH+8|0]&1)!=0){break L3470}if((c[gH+16>>2]|0)!=3){break L3470}}uu(c[8504]|0);hF=c[13898]|0;L3565:do{if((hF|0)<(c[8272]|0)){hK=c[1054]|0;L3567:do{if((a[hK+(hF*40&-1)|0]&1)!=0){nd=c[hK+(hF*40&-1)+36>>2]|0;gE=hK+(hF*40&-1)+32|0;gG=c[10036]|0;gC=0;while(1){if((gC|0)>=(nd|0)){break}if((a[gG+((c[gE>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L3567}}if((gC|0)==1){ul=0;break L3565}}}while(0);a[14176]=1;is(aV);a[14176]=0;if((c[d3>>2]|0)==3){ul=c[d4>>2]|0;break}else{c[13898]=hF;ul=0;break}}else{ul=0}}while(0);c[8504]=ul;break L3470}}while(0);while(1){if((a[ue+146440|0]|0)==(a[gz+(ue+ui|0)|0]|0)){um=ui;un=ug}else{if((ue|0)!=4){uo=0;up=0;uv=tv;break}um=ui-1|0;un=1}hF=ue+1|0;if((hF|0)<(un+tt|0)){ue=hF;ug=un;ui=um}else{b7=2601;break}}do{if((b7|0)==2601){b7=0;if((un|0)==0){if(!((ue|0)==3|(ue|0)==8)){uo=0;up=0;uv=tv;break}}c[8499]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uo+146248|0]|0)==(a[gz+(uo+uv|0)|0]|0)){uw=uv;ux=up}else{if((uo|0)!=2){uy=0;uC=0;uG=tv;break}uw=uv-1|0;ux=1}hF=uo+1|0;if((hF|0)<(ux+tt|0)){uo=hF;up=ux;uv=uw}else{b7=2608;break}}do{if((b7|0)==2608){b7=0;if((ux|0)==0){if(!((uo|0)==1|(uo|0)==7)){uy=0;uC=0;uG=tv;break}}c[8501]=1;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uy+146080|0]|0)==(a[gz+(uy+uG|0)|0]|0)){uH=uG;uI=uC}else{if((uy|0)!=4){uJ=0;uK=0;uL=tv;break}uH=uG-1|0;uI=1}hF=uy+1|0;if((hF|0)<(uI+tt|0)){uy=hF;uC=uI;uG=uH}else{b7=2615;break}}do{if((b7|0)==2615){b7=0;if((uI|0)==0){if(!((uy|0)==3|(uy|0)==9)){uJ=0;uK=0;uL=tv;break}}c[8501]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uJ+145928|0]|0)==(a[gz+(uJ+uL|0)|0]|0)){uM=uL;uN=uK}else{if((uJ|0)!=6){uO=0;uP=0;uQ=tv;break}uM=uL-1|0;uN=1}hF=uJ+1|0;if((hF|0)<(uN+tt|0)){uJ=hF;uK=uN;uL=uM}else{b7=2622;break}}do{if((b7|0)==2622){b7=0;if((uN|0)==0){if(!((uJ|0)==5|(uJ|0)==8)){uO=0;uP=0;uQ=tv;break}}c[8502]=1;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uO+145688|0]|0)==(a[gz+(uO+uQ|0)|0]|0)){uR=uQ;uS=uP}else{if((uO|0)!=8){uT=0;uU=0;uV=tv;break}uR=uQ-1|0;uS=1}hF=uO+1|0;if((hF|0)<(uS+tt|0)){uO=hF;uP=uS;uQ=uR}else{b7=2629;break}}do{if((b7|0)==2629){b7=0;if((uS|0)==0){if(!((uO|0)==7|(uO|0)==10)){uT=0;uU=0;uV=tv;break}}c[8502]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uT+78872|0]|0)==(a[gz+(uT+uV|0)|0]|0)){uW=uV;uX=uU}else{if((uT|0)!=2){uY=0;uZ=0;u_=tv;break}uW=uV-1|0;uX=1}hF=uT+1|0;if((hF|0)<(uX+tt|0)){uT=hF;uU=uX;uV=uW}else{b7=2636;break}}do{if((b7|0)==2636){b7=0;if((uX|0)==0){if(!((uT|0)==6|(uT|0)==1)){uY=0;uZ=0;u_=tv;break}}hF=tq+1|0;c[13898]=hF;gH=(a[ts+(hF*40&-1)|0]&1)==0;if(gH){b7=2640}else{hK=a[gz+(c[ts+(hF*40&-1)+32>>2]|0)|0]|0;if(!((hK<<24>>24|0)==39|(hK<<24>>24|0)==34)){b7=2640}}L3646:do{if((b7|0)==2640){b7=0;hK=c[10810]|0;L3648:do{if((hK|0)!=0){gE=ts+(hF*40&-1)+36|0;gG=ts+(hF*40&-1)+32|0;nd=(tr|0)<=(hF|0)|gH;hG=hK;L3650:while(1){nh=c[hG+4>>2]|0;L3652:do{if(!nd){hw=c[gE>>2]|0;hp=0;while(1){if((hp|0)>=(hw|0)){break}if((a[gz+((c[gG>>2]|0)+hp|0)|0]|0)==(a[nh+hp|0]|0)){hp=hp+1|0}else{break L3652}}if((a[nh+hp|0]|0)==0){break L3650}}}while(0);nh=c[hG>>2]|0;if((nh|0)==0){break L3648}else{hG=nh}}if((a[hG+8|0]&1)!=0){break}if((c[hG+16>>2]|0)==3){break L3646}}}while(0);c[8503]=34032;break L3470}}while(0);gH=c[8503]|0;if((gH|0)==34032){u$=hF;u0=tr}else{uu(gH);u$=c[13898]|0;u0=c[8272]|0}L3666:do{if((u$|0)<(u0|0)){gH=c[1054]|0;L3668:do{if((a[gH+(u$*40&-1)|0]&1)!=0){hK=c[gH+(u$*40&-1)+36>>2]|0;gG=gH+(u$*40&-1)+32|0;gE=c[10036]|0;nd=0;while(1){if((nd|0)>=(hK|0)){break}if((a[gE+((c[gG>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L3668}}if((nd|0)==1){u1=0;break L3666}}}while(0);a[14176]=1;is(aR);a[14176]=0;if((c[d1>>2]|0)==3){u1=c[d2>>2]|0;break}else{c[13898]=u$;u1=0;break}}else{u1=0}}while(0);c[8503]=u1;break L3470}}while(0);while(1){if((a[uY+145232|0]|0)==(a[gz+(uY+u_|0)|0]|0)){u2=u_;u3=uZ}else{if((uY|0)!=2){u4=0;u5=0;u6=tv;break}u2=u_-1|0;u3=1}hF=uY+1|0;if((hF|0)<(u3+tt|0)){uY=hF;uZ=u3;u_=u2}else{b7=2667;break}}do{if((b7|0)==2667){b7=0;if((u3|0)==0){if(!((uY|0)==15|(uY|0)==1)){u4=0;u5=0;u6=tv;break}}hF=tq+1|0;c[13898]=hF;gH=(a[ts+(hF*40&-1)|0]&1)==0;if(gH){b7=2671}else{gG=a[gz+(c[ts+(hF*40&-1)+32>>2]|0)|0]|0;if(!((gG<<24>>24|0)==39|(gG<<24>>24|0)==34)){b7=2671}}L3692:do{if((b7|0)==2671){b7=0;gG=c[10810]|0;L3694:do{if((gG|0)!=0){gE=ts+(hF*40&-1)+36|0;hK=ts+(hF*40&-1)+32|0;hG=(tr|0)<=(hF|0)|gH;gC=gG;L3696:while(1){nh=c[gC+4>>2]|0;L3698:do{if(!hG){hR=c[gE>>2]|0;hw=0;while(1){if((hw|0)>=(hR|0)){break}if((a[gz+((c[hK>>2]|0)+hw|0)|0]|0)==(a[nh+hw|0]|0)){hw=hw+1|0}else{break L3698}}if((a[nh+hw|0]|0)==0){break L3696}}}while(0);nh=c[gC>>2]|0;if((nh|0)==0){break L3694}else{gC=nh}}if((a[gC+8|0]&1)!=0){break}if((c[gC+16>>2]|0)==3){break L3692}}}while(0);gG=is(aP)|0;hK=c[gG>>2]|0;if((hK|0)==1){u7=+(c[gG+8>>2]|0)}else if((hK|0)==2){u7=+h[gG+8>>3]}else if((hK|0)==3){u7=+uz(c[gG+8>>2]|0,0)}else{b7=2698;break L27}if((c[dZ>>2]|0)==3){uu(c[d_>>2]|0);c[dZ>>2]=1}gG=~~u7;if(gG>>>0<7){c[13532]=gG;break L3470}else{gG=c[m>>2]|0;cf(gG|0,144712,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=6,v)|0);break L3470}}}while(0);uu(c[13534]|0);gH=c[13898]|0;L3720:do{if((gH|0)<(c[8272]|0)){hF=c[1054]|0;L3722:do{if((a[hF+(gH*40&-1)|0]&1)!=0){gG=c[hF+(gH*40&-1)+36>>2]|0;hK=hF+(gH*40&-1)+32|0;gE=c[10036]|0;hG=0;while(1){if((hG|0)>=(gG|0)){break}if((a[gE+((c[hK>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L3722}}if((hG|0)==1){u8=0;break L3720}}}while(0);a[14176]=1;is(aO);a[14176]=0;if((c[d$>>2]|0)==3){u8=c[d0>>2]|0;break}else{c[13898]=gH;u8=0;break}}else{u8=0}}while(0);c[13534]=u8;if((a[u8]|0)!=0){c[13532]=7;break L3470}uu(u8);c[13534]=0;if((c[8506]|0)!=7){break L3470}c[8506]=0;break L3470}}while(0);while(1){if((a[u4+144456|0]|0)==(a[gz+(u4+u6|0)|0]|0)){u9=u6;va=u5}else{if((u4|0)!=2){vb=0;vc=0;vd=tv;break}u9=u6-1|0;va=1}gH=u4+1|0;if((gH|0)<(va+tt|0)){u4=gH;u5=va;u6=u9}else{b7=2708;break}}do{if((b7|0)==2708){b7=0;if((va|0)==0){if(!((u4|0)==11|(u4|0)==1)){vb=0;vc=0;vd=tv;break}}gH=tq+1|0;c[13898]=gH;hF=(a[ts+(gH*40&-1)|0]&1)==0;if(hF){b7=2712}else{hK=a[gz+(c[ts+(gH*40&-1)+32>>2]|0)|0]|0;if(!((hK<<24>>24|0)==39|(hK<<24>>24|0)==34)){b7=2712}}L3750:do{if((b7|0)==2712){b7=0;hK=c[10810]|0;L3752:do{if((hK|0)!=0){gE=ts+(gH*40&-1)+36|0;gG=ts+(gH*40&-1)+32|0;gC=(tr|0)<=(gH|0)|hF;nd=hK;L3754:while(1){nh=c[nd+4>>2]|0;L3756:do{if(!gC){hR=c[gE>>2]|0;hp=0;while(1){if((hp|0)>=(hR|0)){break}if((a[gz+((c[gG>>2]|0)+hp|0)|0]|0)==(a[nh+hp|0]|0)){hp=hp+1|0}else{break L3756}}if((a[nh+hp|0]|0)==0){break L3754}}}while(0);nh=c[nd>>2]|0;if((nh|0)==0){break L3752}else{nd=nh}}if((a[nd+8|0]&1)!=0){break}if((c[nd+16>>2]|0)==3){break L3750}}}while(0);hK=is(aT)|0;gG=c[hK>>2]|0;if((gG|0)==1){ve=+(c[hK+8>>2]|0)}else if((gG|0)==2){ve=+h[hK+8>>3]}else if((gG|0)==3){ve=+uz(c[hK+8>>2]|0,0)}else{b7=2740;break L27}if((c[dV>>2]|0)==3){uu(c[dW>>2]|0);c[dV>>2]=1}hK=~~ve;if(hK>>>0>=8){gG=c[m>>2]|0;cf(gG|0,144072,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=7,v)|0);break L3470}if((hK|0)!=7|(c[8510]|0)!=0){c[8506]=hK;break L3470}else{hK=c[m>>2]|0;aI(144280,44,1,hK|0);break L3470}}}while(0);uu(c[8510]|0);hF=c[13898]|0;L3781:do{if((hF|0)<(c[8272]|0)){gH=c[1054]|0;L3783:do{if((a[gH+(hF*40&-1)|0]&1)!=0){hK=c[gH+(hF*40&-1)+36>>2]|0;gG=gH+(hF*40&-1)+32|0;gE=c[10036]|0;gC=0;while(1){if((gC|0)>=(hK|0)){break}if((a[gE+((c[gG>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L3783}}if((gC|0)==1){vf=0;break L3781}}}while(0);a[14176]=1;is(aS);a[14176]=0;if((c[dX>>2]|0)==3){vf=c[dY>>2]|0;break}else{c[13898]=hF;vf=0;break}}else{vf=0}}while(0);c[8510]=vf;do{if((a[vf]|0)==0){uu(vf);c[8510]=0;if((c[8506]|0)!=7){break}c[8506]=0}else{c[8506]=7}}while(0);c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[vb+143960|0]|0)==(a[gz+(vb+vd|0)|0]|0)){vg=vd;vh=vc}else{if((vb|0)!=4){vi=0;vj=0;vk=tv;break}vg=vd-1|0;vh=1}hF=vb+1|0;if((hF|0)<(vh+tt|0)){vb=hF;vc=vh;vd=vg}else{b7=2752;break}}do{if((b7|0)==2752){b7=0;if((vh|0)==0){if(!((vb|0)==7|(vb|0)==3)){vi=0;vj=0;vk=tv;break}}c[13898]=tq+1;if((a[26192]&1)==0){break L3470}hX(aU);break L3470}}while(0);while(1){if((a[vi+143888|0]|0)==(a[gz+(vi+vk|0)|0]|0)){vl=vk;vm=vj}else{if((vi|0)!=2){tz=tv;tA=0;break L3440}vl=vk-1|0;vm=1}hF=vi+1|0;if((hF|0)<(vm+tt|0)){vi=hF;vj=vm;vk=vl}else{break}}if((vm|0)==0){if(!((vi|0)==5|(vi|0)==1)){tz=tv;tA=0;break L3440}}hF=tq+1|0;c[13898]=hF;L3821:do{if((hF|0)<(tr|0)){if((a[ts+(hF*40&-1)|0]&1)==0){break}gH=c[ts+(hF*40&-1)+36>>2]|0;gG=ts+(hF*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gH|0)){b7=2767;break}if((a[gz+((c[gG>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{vn=0;break}}if((b7|0)==2767){b7=0;if((gE|0)==1){break}else{vn=0}}while(1){if((vn|0)>=(gH|0)){break}if((a[gz+((c[gG>>2]|0)+vn|0)|0]|0)==(a[vn+95280|0]|0)){vn=vn+1|0}else{break L3821}}if((vn|0)!=2){break}vo=tq+2|0;c[13898]=vo;if((vo|0)>=(tr|0)){b7=5205;break L27}L3835:do{if((a[ts+(vo*40&-1)|0]&1)!=0){gG=c[ts+(vo*40&-1)+36>>2]|0;gH=ts+(vo*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){break}if((a[gz+((c[gH>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{break L3835}}if((gE|0)==1){b7=5206;break L27}}}while(0);dl(a1,0);fR(a1,aX,aZ,143600);gH=~~+h[aX>>3];gG=~~+h[aZ>>3];hK=gG|gH;if((a[26192]&1)!=0){if((hK|0)<0){break L3470}hX(a0)}if((hK|0)>-1){c[dR>>2]=gH;vp=gG}else{c[dR>>2]=c[6558];vp=c[6559]|0}c[dS>>2]=vp;hX(a0);break L3470}}while(0);if((a[26192]&1)!=0){break}c[dT>>2]=c[6558];c[dU>>2]=c[6559];hX(aW)}}while(0);gz=c[13898]|0;hF=c[8272]|0;if((gz|0)>=(hF|0)){break L44}tq=gz;tr=hF;ts=c[1054]|0}if((b7|0)==2503){b7=0;tz=c[tu>>2]|0;tA=1}if((tq|0)>=(tr|0)){break}if(tA){b7=5207;break L27}hF=c[10036]|0;gz=0;while(1){if((gz|0)>=(tt|0)){break}if((a[hF+(gz+tz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{b7=5208;break L27}}if((gz|0)!=1){b7=5209;break L27}}else if((gD|0)==45){ll()}else if((gD|0)==56){hF=gv+1|0;c[13898]=hF;L3865:do{if((hF|0)<(c[8272]|0)){gG=gw+(hF*40&-1)|0;gH=gw+(hF*40&-1)+36|0;L3867:do{if((a[gG]&1)==0){vq=gw+(hF*40&-1)+32|0}else{hK=c[gH>>2]|0;nd=gw+(hF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(hK|0)){break}if((a[gB+((c[nd>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{vq=nd;break L3867}}if((hG|0)==1){break L3865}else{vq=nd}}}while(0);c[8764]=0;hK=c[gH>>2]|0;L3875:do{if((a[gG]&1)!=0&(hK|0)>0){nh=0;hR=0;hw=c[vq>>2]|0;while(1){if((a[nh+148408|0]|0)==(a[gB+(nh+hw|0)|0]|0)){vr=hw;vs=hR}else{if((nh|0)!=2){break L3875}vr=hw-1|0;vs=1}hC=nh+1|0;if((hC|0)<(vs+hK|0)){nh=hC;hR=vs;hw=vr}else{break}}if((vs|0)==0){if(!((nh|0)==1|(nh|0)==5)){break}}c[8764]=2;c[13898]=gv+2}}while(0);hK=is(aM)|0;gG=c[hK>>2]|0;if((gG|0)==1){vt=+(c[hK+8>>2]|0)}else if((gG|0)==2){vt=+h[hK+8>>3]}else if((gG|0)==3){vt=+uz(c[hK+8>>2]|0,0)}else{b7=2816;break L27}if((c[d7>>2]|0)==3){uu(c[d8>>2]|0);c[d7>>2]=1}h[4384]=vt;hK=c[13898]|0;if((c[8272]|0)<=(hK|0)){break L44}gG=c[1054]|0;if((a[gG+(hK*40&-1)|0]&1)==0){break L44}gH=c[gG+(hK*40&-1)+36>>2]|0;hw=gG+(hK*40&-1)+32|0;hR=c[10036]|0;nd=0;while(1){if((nd|0)>=(gH|0)){break}if((a[hR+((c[hw>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L44}}if((nd|0)!=1){break L44}c[6588]=0;hw=hK+1|0;c[13898]=hw;gH=c[gG+(hw*40&-1)+36>>2]|0;L3903:do{if((a[gG+(hw*40&-1)|0]&1)!=0&(gH|0)>0){hG=0;hC=0;hB=c[gG+(hw*40&-1)+32>>2]|0;while(1){if((a[hG+148408|0]|0)==(a[hR+(hG+hB|0)|0]|0)){vu=hB;vv=hC}else{if((hG|0)!=2){break L3903}vu=hB-1|0;vv=1}hS=hG+1|0;if((hS|0)<(vv+gH|0)){hG=hS;hC=vv;hB=vu}else{break}}if((vv|0)==0){if(!((hG|0)==1|(hG|0)==5)){break}}c[6588]=2;c[13898]=hK+2}}while(0);hK=is(aL)|0;gH=c[hK>>2]|0;if((gH|0)==1){vw=+(c[hK+8>>2]|0)}else if((gH|0)==2){vw=+h[hK+8>>3]}else if((gH|0)==3){vw=+uz(c[hK+8>>2]|0,0)}else{b7=2838;break L27}if((c[d9>>2]|0)==3){uu(c[eb>>2]|0);c[d9>>2]=1}h[3296]=vw;hK=c[13898]|0;if((c[8272]|0)<=(hK|0)){break L44}gH=c[1054]|0;if((a[gH+(hK*40&-1)|0]&1)==0){break L44}hR=c[gH+(hK*40&-1)+36>>2]|0;hw=gH+(hK*40&-1)+32|0;gG=c[10036]|0;nd=0;while(1){if((nd|0)>=(hR|0)){break}if((a[gG+((c[hw>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L44}}if((nd|0)!=1){break L44}c[1057]=0;hw=hK+1|0;c[13898]=hw;hR=c[gH+(hw*40&-1)+36>>2]|0;L3931:do{if((a[gH+(hw*40&-1)|0]&1)!=0&(hR|0)>0){hB=0;hC=0;nh=c[gH+(hw*40&-1)+32>>2]|0;while(1){if((a[hB+148408|0]|0)==(a[gG+(hB+nh|0)|0]|0)){vx=nh;vy=hC}else{if((hB|0)!=2){break L3931}vx=nh-1|0;vy=1}hS=hB+1|0;if((hS|0)<(vy+hR|0)){hB=hS;hC=vy;nh=vx}else{break}}if((vy|0)==0){if(!((hB|0)==1|(hB|0)==5)){break}}c[1057]=2;c[13898]=hK+2}}while(0);hK=is(aK)|0;hR=c[hK>>2]|0;if((hR|0)==1){vz=+(c[hK+8>>2]|0)}else if((hR|0)==2){vz=+h[hK+8>>3]}else if((hR|0)==3){vz=+uz(c[hK+8>>2]|0,0)}else{b7=2860;break L27}if((c[ec>>2]|0)==3){uu(c[ed>>2]|0);c[ec>>2]=1}h[531]=vz;hK=c[13898]|0;if((c[8272]|0)<=(hK|0)){break L44}hR=c[1054]|0;if((a[hR+(hK*40&-1)|0]&1)==0){break L44}gG=c[hR+(hK*40&-1)+36>>2]|0;hw=hR+(hK*40&-1)+32|0;gH=c[10036]|0;nd=0;while(1){if((nd|0)>=(gG|0)){break}if((a[gH+((c[hw>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L44}}if((nd|0)!=1){break L44}c[14091]=0;hw=hK+1|0;c[13898]=hw;gG=c[hR+(hw*40&-1)+36>>2]|0;L3959:do{if((a[hR+(hw*40&-1)|0]&1)!=0&(gG|0)>0){nh=0;hC=0;hG=c[hR+(hw*40&-1)+32>>2]|0;while(1){if((a[nh+148408|0]|0)==(a[gH+(nh+hG|0)|0]|0)){vA=hG;vB=hC}else{if((nh|0)!=2){break L3959}vA=hG-1|0;vB=1}hS=nh+1|0;if((hS|0)<(vB+gG|0)){nh=hS;hC=vB;hG=vA}else{break}}if((vB|0)==0){if(!((nh|0)==1|(nh|0)==5)){break}}c[14091]=2;c[13898]=hK+2}}while(0);hK=is(aN)|0;gG=c[hK>>2]|0;if((gG|0)==1){vC=+(c[hK+8>>2]|0)}else if((gG|0)==2){vC=+h[hK+8>>3]}else if((gG|0)==3){vC=+uz(c[hK+8>>2]|0,0)}else{b7=2882;break L27}if((c[ee>>2]|0)==3){uu(c[ef>>2]|0);c[ee>>2]=1}h[7048]=vC;break L44}}while(0);h[7048]=0.0;h[531]=0.0;h[3296]=0.0;h[4384]=0.0}else if((gD|0)==57){hF=gv+1|0;c[13898]=hF;L3982:do{if((hF|0)<(c[8272]|0)){L3984:do{if((a[gw+(hF*40&-1)|0]&1)!=0){gz=c[gw+(hF*40&-1)+36>>2]|0;hK=gw+(hF*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(gz|0)){break}if((a[gB+((c[hK>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{break L3984}}if((gG|0)==1){b7=2892;break L3982}}}while(0);hK=is(aH)|0;gz=c[hK>>2]|0;if((gz|0)==1){vD=+(c[hK+8>>2]|0)}else if((gz|0)==2){vD=+h[hK+8>>3]}else if((gz|0)==3){vD=+uz(c[hK+8>>2]|0,0)}else{b7=2897;break L27}if((c[eg>>2]|0)==3){uu(c[eh>>2]|0);c[eg>>2]=1}g[184]=vD;vE=c[13898]|0;if((c[8272]|0)<=(vE|0)){b7=5210;break L27}hK=c[1054]|0;if((a[hK+(vE*40&-1)|0]&1)==0){b7=5211;break L27}gz=c[hK+(vE*40&-1)+36>>2]|0;nh=hK+(vE*40&-1)+32|0;hK=c[10036]|0;gH=0;while(1){if((gH|0)>=(gz|0)){break}if((a[hK+((c[nh>>2]|0)+gH|0)|0]|0)==(a[gH+148464|0]|0)){gH=gH+1|0}else{b7=5212;break L27}}if((gH|0)!=1){b7=5213;break L27}c[13898]=vE+1;nh=is(aJ)|0;hK=c[nh>>2]|0;if((hK|0)==1){vF=+(c[nh+8>>2]|0)}else if((hK|0)==2){vF=+h[nh+8>>3]}else if((hK|0)==3){vF=+uz(c[nh+8>>2]|0,0)}else{b7=2911;break L27}if((c[ei>>2]|0)==3){uu(c[ej>>2]|0);c[ei>>2]=1}vG=vF}else{b7=2892}}while(0);if((b7|0)==2892){b7=0;g[184]=0.0;vG=0.0}g[44]=vG}else if((gD|0)==58){vH=gv+1|0;c[13898]=vH;if((a[33512]&1)!=0){b7=2917;break L27}L4019:do{if((vH|0)<(c[8272]|0)){L4021:do{if((a[gw+(vH*40&-1)|0]&1)!=0){hF=c[gw+(vH*40&-1)+36>>2]|0;nh=gw+(vH*40&-1)+32|0;hK=0;while(1){if((hK|0)>=(hF|0)){b7=2923;break}if((a[gB+((c[nh>>2]|0)+hK|0)|0]|0)==(a[hK+103664|0]|0)){hK=hK+1|0}else{vI=0;break}}if((b7|0)==2923){b7=0;if((hK|0)==1){b7=2924;break L4019}else{vI=0}}while(1){if((vI|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+vI|0)|0]|0)==(a[vI+103664|0]|0)){vI=vI+1|0}else{break L4021}}if((vI|0)==1){b7=2931;break L27}}}while(0);a[14176]=1;is(aE);a[14176]=0;if((c[ek>>2]|0)!=3){b7=2930;break L27}gH=c[el>>2]|0;c[aF>>2]=gH;if((gH|0)==0){b7=2933;break L27}iQ(aF);gH=c[aF>>2]|0;lj(gH);nh=c[8244]|0;if((gH|0)==(nh|0)){break}if((gH|0)==0){vJ=nh}else{uu(gH);vJ=c[8244]|0}c[aF>>2]=vJ}else{b7=2924}}while(0);do{if((b7|0)==2924){b7=0;lj(0);gH=c[8244]|0;if((gH|0)==0){break}uu(gH);c[8244]=0}}while(0);c[7271]=-1}else if((gD|0)==59){c[13898]=gv+1;if((a[32936]&1)!=0){break}a[32936]=1;if((a[30528]&1)!=0){break}b[12272]=116;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;if((a[37400]&1)==0){break}aI(149344,51,1,c[m>>2]|0)}else if((gD|0)==61){gH=gv+1|0;c[13898]=gH;nh=c[8272]|0;L4048:do{if((gH|0)<(nh|0)){hF=a[gw+(gH*40&-1)|0]|0;L4050:do{if((hF&1)!=0){hK=c[gw+(gH*40&-1)+36>>2]|0;gG=gw+(gH*40&-1)+32|0;gz=0;while(1){if((gz|0)>=(hK|0)){break}if((a[gB+((c[gG>>2]|0)+gz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{break L4050}}if((gz|0)==1){break L4048}}}while(0);gG=gv+2|0;vK=gH;hK=nh;hw=gw;hR=hF;L4057:while(1){nd=(hR&1)==0;hG=c[hw+(vK*40&-1)+36>>2]|0;L4059:do{if(nd){vL=c[10036]|0;vM=hw+(vK*40&-1)+32|0}else{hC=hw+(vK*40&-1)+32|0;hB=c[10036]|0;hS=0;while(1){if((hS|0)>=(hG|0)){break}if((a[hB+((c[hC>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{vL=hB;vM=hC;break L4059}}if((hS|0)==1){break L4057}else{vL=hB;vM=hC}}}while(0);gz=c[vM>>2]|0;gx=(hG|0)>0;gy=23264;gA=95280;L4067:while(1){L4069:do{if(!nd){if(gx){ne=0;ho=0;gF=gz;while(1){ng=a[gA+ne|0]|0;if(ng<<24>>24==(a[vL+(ne+gF|0)|0]|0)){vN=gF;vO=ho}else{if(ng<<24>>24!=36){break L4069}vN=gF-1|0;vO=1}vP=ne+1|0;if((vP|0)<(vO+hG|0)){ne=vP;ho=vO;gF=vN}else{break}}if((vO|0)==0){vQ=vP}else{vR=gy;break L4067}}else{vQ=0}gF=a[gA+vQ|0]|0;if((gF<<24>>24|0)==36|(gF<<24>>24|0)==0){vR=gy;break L4067}}}while(0);hC=gy+8|0;hB=c[hC>>2]|0;if((hB|0)==0){vR=hC;break}else{gy=hC;gA=hB}}gA=c[vR+4>>2]|0;L4082:do{if((gA|0)==1){c[13898]=vK+1;if((i9(30632)|0)!=0){break L44}gy=(c[13898]|0)-1|0;c[13898]=gy;if((gy|0)!=(gG|0)){vS=gy;break}c[7662]=1;vS=gG}else if((gA|0)==2){vT=vK+1|0;c[13898]=vT;if((vT|0)>=(hK|0)){b7=5216;break L27}L4088:do{if((a[hw+(vT*40&-1)|0]&1)!=0){gy=c[hw+(vT*40&-1)+36>>2]|0;hG=hw+(vT*40&-1)+32|0;gz=0;while(1){if((gz|0)>=(gy|0)){break}if((a[vL+((c[hG>>2]|0)+gz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{break L4088}}if((gz|0)==1){b7=5217;break L27}}}while(0);hG=is(aC)|0;gy=c[hG>>2]|0;if((gy|0)==1){vU=+(c[hG+8>>2]|0)}else if((gy|0)==2){vU=+h[hG+8>>3]}else if((gy|0)==3){vU=+uz(c[hG+8>>2]|0,0)}else{b7=2983;break L27}if((c[em>>2]|0)==3){uu(c[en>>2]|0);c[em>>2]=1}c[7664]=~~vU;vV=c[13898]|0;if((c[8272]|0)<=(vV|0)){b7=5218;break L27}hG=c[1054]|0;if((a[hG+(vV*40&-1)|0]&1)==0){b7=5219;break L27}gy=c[hG+(vV*40&-1)+36>>2]|0;gx=hG+(vV*40&-1)+32|0;hG=c[10036]|0;nd=0;while(1){if((nd|0)>=(gy|0)){break}if((a[hG+((c[gx>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{b7=5220;break L27}}if((nd|0)!=1){b7=5221;break L27}c[13898]=vV+1;gx=is(aB)|0;hG=c[gx>>2]|0;if((hG|0)==1){vW=+(c[gx+8>>2]|0)}else if((hG|0)==2){vW=+h[gx+8>>3]}else if((hG|0)==3){vW=+uz(c[gx+8>>2]|0,0)}else{b7=2997;break L27}if((c[eo>>2]|0)==3){uu(c[ep>>2]|0);c[eo>>2]=1}c[7665]=~~vW;gx=(c[13898]|0)-1|0;c[13898]=gx;vS=gx}else if((gA|0)==3){a[30641]=102;vS=vK}else if((gA|0)==4){a[30641]=98;vS=vK}else if((gA|0)==5){a[30641]=97;vS=vK}else if((gA|0)==6){a[30641]=100;vS=vK}else if((gA|0)==7){vX=vK+1|0;c[13898]=vX;gx=c[hw+(vX*40&-1)+36>>2]|0;hG=c[hw+(vX*40&-1)+32>>2]|0;gy=(a[hw+(vX*40&-1)|0]&1)==0;if((gx|0)>0&(gy^1)){vY=0;vZ=0;v_=hG}else{b7=5222;break L27}while(1){if((a[vY+170048|0]|0)==(a[vL+(vY+v_|0)|0]|0)){v$=v_;v0=vZ}else{if((vY|0)!=1){break}v$=v_-1|0;v0=1}hB=vY+1|0;if((hB|0)<(v0+gx|0)){vY=hB;vZ=v0;v_=v$}else{b7=3010;break}}do{if((b7|0)==3010){b7=0;if((v0|0)==0){if(!((vY|0)==0|(vY|0)==5)){break}}a[30639]=98;vS=vX;break L4082}}while(0);if(gy){b7=5223;break L27}else{v1=0;v2=0;v3=hG}while(1){if((a[v1+149304|0]|0)==(a[vL+(v1+v3|0)|0]|0)){v4=v3;v5=v2}else{if((v1|0)!=1){v6=0;v7=0;v8=hG;break}v4=v3-1|0;v5=1}nd=v1+1|0;if((nd|0)<(v5+gx|0)){v1=nd;v2=v5;v3=v4}else{b7=3018;break}}do{if((b7|0)==3018){b7=0;if((v5|0)==0){if(!((v1|0)==0|(v1|0)==6)){v6=0;v7=0;v8=hG;break}}a[30639]=99;vS=vX;break L4082}}while(0);while(1){if((a[v6+169576|0]|0)==(a[vL+(v6+v8|0)|0]|0)){v9=v8;wa=v7}else{if((v6|0)!=1){b7=5224;break L27}v9=v8-1|0;wa=1}hG=v6+1|0;if((hG|0)<(wa+gx|0)){v6=hG;v7=wa;v8=v9}else{break}}if((wa|0)==0){if(!((v6|0)==0|(v6|0)==3)){b7=5225;break L27}}a[30639]=114;vS=vX}else if((gA|0)==10){a[30642]=49;vS=vK}else if((gA|0)==11){a[30642]=52;vS=vK}else if((gA|0)==12){a[30632]=98;a[30633]=0;c[12890]=352;c[10058]=352;c[5094]=1;vS=vK}else if((gA|0)==8){a[30640]=1;vS=vK}else if((gA|0)==9){a[30640]=0;vS=vK}else if((gA|0)==13){gx=vK+1|0;c[13898]=gx;c[7661]=-1;L4162:do{if((a[hw+(gx*40&-1)|0]&1)==0){b7=3045}else{hG=c[10810]|0;if((hG|0)==0){break}gy=(hK|0)>(gx|0);nd=hw+(gx*40&-1)+36|0;hB=hw+(gx*40&-1)+32|0;hC=hG;L4165:while(1){hG=c[hC+4>>2]|0;L4167:do{if(gy){hS=c[nd>>2]|0;gF=0;while(1){if((gF|0)>=(hS|0)){break}if((a[vL+((c[hB>>2]|0)+gF|0)|0]|0)==(a[hG+gF|0]|0)){gF=gF+1|0}else{break L4167}}if((a[hG+gF|0]|0)==0){break L4165}}}while(0);hG=c[hC>>2]|0;if((hG|0)==0){break L4162}else{hC=hG}}if((a[hC+8|0]&1)!=0){break}if((c[hC+16>>2]|0)==1){b7=3045}}}while(0);do{if((b7|0)==3045){b7=0;gx=is(aD)|0;hB=c[gx>>2]|0;if((hB|0)==1){wb=+(c[gx+8>>2]|0)}else if((hB|0)==2){wb=+h[gx+8>>3]}else if((hB|0)==3){wb=+uz(c[gx+8>>2]|0,0)}else{b7=3049;break L27}if((c[eq>>2]|0)==3){uu(c[er>>2]|0);c[eq>>2]=1}gx=~~wb;c[7661]=gx;if((gx|0)>=-1){break}c[7661]=-1}}while(0);gx=(c[13898]|0)-1|0;c[13898]=gx;vS=gx}else if((gA|0)==14){c[7661]=0;vS=vK}else if((gA|0)==15|(gA|0)==16|(gA|0)==17|(gA|0)==18){if((a[37400]&1)==0){wc=vK;b7=3058;break}uh(vK,168664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);wc=c[13898]|0;b7=3058}else if((gA|0)==19|(gA|0)==20){wc=vK;b7=3058}else if((gA|0)==21|(gA|0)==22){c[7662]=0;vS=vK}else if((gA|0)==23){wd=vK+1|0;c[13898]=wd;if((hK|0)<=(wd|0)){b7=5226;break L27}gx=(a[hw+(wd*40&-1)|0]&1)==0;if(gx){b7=5227;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3065;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+105792|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3065){b7=0;if((gy|0)!=4){break}c[7663]=4;vS=wd;break L4082}}while(0);if(gx){b7=5228;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3071;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+167728|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3071){b7=0;if((hB|0)!=7){break}c[7663]=5;vS=wd;break L4082}}while(0);if(gx){b7=5229;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3077;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+100616|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3077){b7=0;if((gy|0)!=6){break}c[7663]=6;vS=wd;break L4082}}while(0);if(gx){b7=5230;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3083;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+103256|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3083){b7=0;if((hB|0)!=3){break}c[7663]=7;vS=wd;break L4082}}while(0);if(gx){b7=5231;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3089;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+99528|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3089){b7=0;if((gy|0)!=3){break}c[7663]=8;vS=wd;break L4082}}while(0);if(gx){b7=5232;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3095;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+166192|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3095){b7=0;if((hB|0)!=2){break}c[7663]=0;vS=wd;break L4082}}while(0);if(gx){b7=5233;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3101;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+165720|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3101){b7=0;if((gy|0)!=2){break}c[7663]=1;vS=wd;break L4082}}while(0);if(gx){b7=5234;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3107;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+165344|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3107){b7=0;if((hB|0)!=2){break}c[7663]=2;vS=wd;break L4082}}while(0);if(gx){b7=5235;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+164912|0]|0)){gy=gy+1|0}else{b7=5236;break L27}}if((gy|0)!=2){b7=5237;break L27}c[7663]=3;vS=wd}else{b7=3116;break L27}}while(0);if((b7|0)==3058){b7=0;c[7662]=1;vS=wc}gA=vS+1|0;c[13898]=gA;nd=c[8272]|0;if((gA|0)>=(nd|0)){break}hB=c[1054]|0;vK=gA;hK=nd;hw=hB;hR=a[hB+(gA*40&-1)|0]|0}if((a[30641]|0)!=97|(a[30639]|0)==98){break L44}a[30641]=102;break L44}}while(0);b[15316]=115;a[30639]=98;a[30640]=0;a[30641]=97;a[30642]=52;c[7661]=0;c[7663]=4;c[7664]=1;c[7665]=1;c[7662]=1}else if((gD|0)==60){nh=gv+1|0;c[13898]=nh;gH=c[8272]|0;L4272:do{if((nh|0)<(gH|0)){hR=a[gw+(nh*40&-1)|0]|0;L4274:do{if((hR&1)==0){we=0;wf=0;wg=nh;wh=gH;wi=gw;wj=hR}else{hw=c[gw+(nh*40&-1)+36>>2]|0;hK=gw+(nh*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(hw|0)){break}if((a[gB+((c[hK>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{we=0;wf=0;wg=nh;wh=gH;wi=gw;wj=hR;break L4274}}if((gG|0)==1){b7=3127;break L4272}else{we=0;wf=0;wg=nh;wh=gH;wi=gw;wj=hR}}}while(0);L4280:while(1){hR=(wj&1)==0;hK=c[wi+(wg*40&-1)+36>>2]|0;L4282:do{if(hR){wk=c[10036]|0;wl=wi+(wg*40&-1)+32|0}else{hw=wi+(wg*40&-1)+32|0;hF=c[10036]|0;gA=0;while(1){if((gA|0)>=(hK|0)){break}if((a[hF+((c[hw>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{wk=hF;wl=hw;break L4282}}if((gA|0)==1){wm=we;break L4280}else{wk=hF;wl=hw}}}while(0);gG=c[wl>>2]|0;gy=(hK|0)>0;hB=23456;nd=140016;L4290:while(1){L4292:do{if(!hR){if(gy){gx=0;gz=0;hG=gG;while(1){gC=a[nd+gx|0]|0;if(gC<<24>>24==(a[wk+(gx+hG|0)|0]|0)){wn=hG;wo=gz}else{if(gC<<24>>24!=36){break L4292}wn=hG-1|0;wo=1}wp=gx+1|0;if((wp|0)<(wo+hK|0)){gx=wp;gz=wo;hG=wn}else{break}}if((wo|0)==0){wq=wp}else{wr=hB;break L4290}}else{wq=0}hG=a[nd+wq|0]|0;if((hG<<24>>24|0)==36|(hG<<24>>24|0)==0){wr=hB;break L4290}}}while(0);hw=hB+8|0;hF=c[hw>>2]|0;if((hF|0)==0){wr=hw;break}else{hB=hw;nd=hF}}nd=c[wr+4>>2]|0;L4305:do{if((nd|0)==1){a[20668]=112;ws=wf;wt=we;wu=wg}else if((nd|0)==2){a[20668]=110;ws=wf;wt=we;wu=wg}else if((nd|0)==3){c[5163]=103;ws=wf;wt=we;wu=wg}else if((nd|0)==13){c[13898]=wg+1;hB=is(aA)|0;hK=c[hB>>2]|0;if((hK|0)==1){wv=+(c[hB+8>>2]|0)}else if((hK|0)==2){wv=+h[hB+8>>3]}else if((hK|0)==3){wv=+uz(c[hB+8>>2]|0,0)}else{b7=3153;break L27}if((c[es>>2]|0)==3){uu(c[et>>2]|0);c[es>>2]=1}h[2705]=wv;hB=(c[13898]|0)-1|0;c[13898]=hB;ws=wf;wt=we;wu=hB}else if((nd|0)==4){hB=c[7640]|0;if((hB|0)==48){c[5163]=114;ws=wf;wt=we;wu=wg;break}else{c[5163]=hB;ws=wf;wt=we;wu=wg;break}}else if((nd|0)==5){if((wf|0)!=0){b7=3161;break L27}c[13898]=wg+1;hB=is(ay)|0;hK=c[hB>>2]|0;if((hK|0)==1){ww=+(c[hB+8>>2]|0)}else if((hK|0)==2){ww=+h[hB+8>>3]}else if((hK|0)==3){ww=+uz(c[hB+8>>2]|0,0)}else{b7=3166;break L27}if((c[eu>>2]|0)==3){uu(c[ev>>2]|0);c[eu>>2]=1}hB=~~ww;if((((hB|0)>-1?hB:-hB|0)|0)>=(c[5162]|0)){b7=3170;break L27}c[5164]=hB;hB=c[13898]|0;L4333:do{if((c[8272]|0)>(hB|0)){hK=c[1054]|0;if((a[hK+(hB*40&-1)|0]&1)==0){break}gG=c[hK+(hB*40&-1)+36>>2]|0;gy=hK+(hB*40&-1)+32|0;hK=c[10036]|0;hR=0;while(1){if((hR|0)>=(gG|0)){break}if((a[hK+((c[gy>>2]|0)+hR|0)|0]|0)==(a[hR+148464|0]|0)){hR=hR+1|0}else{break L4333}}if((hR|0)!=1){break}c[13898]=hB+1;gy=is(ax)|0;hK=c[gy>>2]|0;if((hK|0)==1){wx=+(c[gy+8>>2]|0)}else if((hK|0)==2){wx=+h[gy+8>>3]}else if((hK|0)==3){wx=+uz(c[gy+8>>2]|0,0)}else{b7=3182;break L27}if((c[ew>>2]|0)==3){uu(c[ex>>2]|0);c[ew>>2]=1}gy=~~wx;if((((gy|0)>-1?gy:-gy|0)|0)>=(c[5162]|0)){b7=3186;break L27}c[5165]=gy;gy=c[13898]|0;L4350:do{if((c[8272]|0)>(gy|0)){hK=c[1054]|0;if((a[hK+(gy*40&-1)|0]&1)==0){break}gG=c[hK+(gy*40&-1)+36>>2]|0;hF=hK+(gy*40&-1)+32|0;hK=c[10036]|0;hw=0;while(1){if((hw|0)>=(gG|0)){break}if((a[hK+((c[hF>>2]|0)+hw|0)|0]|0)==(a[hw+148464|0]|0)){hw=hw+1|0}else{break L4350}}if((hw|0)!=1){break}c[13898]=gy+1;hF=is(aw)|0;hK=c[hF>>2]|0;if((hK|0)==1){wy=+(c[hF+8>>2]|0)}else if((hK|0)==2){wy=+h[hF+8>>3]}else if((hK|0)==3){wy=+uz(c[hF+8>>2]|0,0)}else{b7=3198;break L27}if((c[eA>>2]|0)==3){uu(c[eB>>2]|0);c[eA>>2]=1}hF=~~wy;if((((hF|0)>-1?hF:-hF|0)|0)>=(c[5162]|0)){b7=3202;break L27}c[5166]=hF;hF=(c[13898]|0)-1|0;c[13898]=hF;c[5163]=114;c[7640]=114;ws=1;wt=we;wu=hF;break L4305}}while(0);hR=gy-1|0;c[13898]=hR;ws=1;wt=we;wu=hR;break L4305}}while(0);hR=hB-1|0;c[13898]=hR;ws=1;wt=we;wu=hR}else if((nd|0)==14){if((wf|0)!=0){b7=3205;break L27}c[5163]=99;h[2706]=.5;h[2707]=-1.5;h[2708]=1.0;hR=wg+1|0;c[13898]=hR;hF=hR;hR=wh;hK=wi;L4371:while(1){gG=a[hK+(hF*40&-1)|0]&1;L4373:do{if((hR|0)>(hF|0)){if(gG<<24>>24==0){wz=0;b7=3212;break}gA=c[hK+(hF*40&-1)+36>>2]|0;hG=hK+(hF*40&-1)+32|0;gz=c[10036]|0;gx=0;while(1){if((gx|0)>=(gA|0)){break}if((a[gz+((c[hG>>2]|0)+gx|0)|0]|0)==(a[gx+74592|0]|0)){gx=gx+1|0}else{wz=gG;b7=3212;break L4373}}if((gx|0)!=5){wA=gA;wB=hG;wC=gG;b7=3222;break}c[13898]=hF+1;gz=is(av)|0;hw=c[gz>>2]|0;if((hw|0)==1){wD=+(c[gz+8>>2]|0)}else if((hw|0)==2){wD=+h[gz+8>>3]}else if((hw|0)==3){wD=+uz(c[gz+8>>2]|0,0)}else{b7=3218;break L27}if((c[eD>>2]|0)==3){uu(c[eE>>2]|0);c[eD>>2]=1}h[2706]=wD}else{wz=gG;b7=3212}}while(0);if((b7|0)==3212){b7=0;wA=c[hK+(hF*40&-1)+36>>2]|0;wB=hK+(hF*40&-1)+32|0;wC=wz;b7=3222}L4391:do{if((b7|0)==3222){b7=0;gG=c[wB>>2]|0;if(!((wA|0)>0&wC<<24>>24!=0)){break L4371}gy=c[10036]|0;gz=0;hw=0;hC=gG;while(1){if((a[gz+158032|0]|0)==(a[gy+(gz+hC|0)|0]|0)){wE=hC;wF=hw}else{if((gz|0)!=3){wG=0;wH=0;wI=gG;break}wE=hC-1|0;wF=1}gC=gz+1|0;if((gC|0)<(wF+wA|0)){gz=gC;hw=wF;hC=wE}else{b7=3228;break}}do{if((b7|0)==3228){b7=0;if((wF|0)==0){if(!((gz|0)==6|(gz|0)==2)){wG=0;wH=0;wI=gG;break}}c[13898]=hF+1;hC=is(au)|0;hw=c[hC>>2]|0;if((hw|0)==1){wJ=+(c[hC+8>>2]|0)}else if((hw|0)==2){wJ=+h[hC+8>>3]}else if((hw|0)==3){wJ=+uz(c[hC+8>>2]|0,0)}else{b7=3234;break L27}if((c[eH>>2]|0)==3){uu(c[eI>>2]|0);c[eH>>2]=1}h[2707]=wJ;break L4391}}while(0);while(1){if((a[wG+156112|0]|0)==(a[gy+(wG+wI|0)|0]|0)){wK=wI;wL=wH}else{if((wG|0)!=3){break L4371}wK=wI-1|0;wL=1}gG=wG+1|0;if((gG|0)<(wL+wA|0)){wG=gG;wH=wL;wI=wK}else{break}}if((wL|0)==0){if(!((wG|0)==2|(wG|0)==10)){break L4371}}c[13898]=hF+1;gy=is(at)|0;gG=c[gy>>2]|0;if((gG|0)==1){wM=+(c[gy+8>>2]|0)}else if((gG|0)==2){wM=+h[gy+8>>3]}else if((gG|0)==3){wM=+uz(c[gy+8>>2]|0,0)}else{b7=3249;break L27}if((c[eF>>2]|0)==3){uu(c[eG>>2]|0);c[eF>>2]=1}h[2708]=wM}}while(0);hF=c[13898]|0;hR=c[8272]|0;hK=c[1054]|0}hK=hF-1|0;c[13898]=hK;ws=1;wt=we;wu=hK}else if((nd|0)==9){if((wf|0)!=0){b7=3255;break L27}c[13898]=wg+1;c[7271]=-1;uu(c[5173]|0);hK=ut(256)|0;if((hK|0)==0){gk();hR=ut(256)|0;if((hR|0)==0){b7=3258;break L27}else{wN=hR}}else{wN=hK}hK=wN;c[5173]=hK;wO=c[13898]|0;hR=c[8272]|0;do{if((wO|0)<(hR|0)){hB=c[1054]|0;if((a[hB+(wO*40&-1)|0]&1)==0){b7=5238;break L27}gy=c[hB+(wO*40&-1)+36>>2]|0;gG=hB+(wO*40&-1)+32|0;gz=c[10036]|0;hC=0;while(1){if((hC|0)>=(gy|0)){b7=3264;break}if((a[gz+((c[gG>>2]|0)+hC|0)|0]|0)==(a[hC+103664|0]|0)){hC=hC+1|0}else{wP=0;break}}if((b7|0)==3264){b7=0;if((hC|0)==1){wQ=0;wR=hK;b7=3265;break}else{wP=0}}while(1){if((wP|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+wP|0)|0]|0)==(a[wP+199040|0]|0)){wP=wP+1|0}else{b7=5239;break L27}}if((wP|0)==1){wS=8;wT=0;wU=-1;wV=wO;wW=hR;wX=hB;wY=gz}else{b7=5240;break L27}L4450:while(1){gG=wV+1|0;c[13898]=gG;if((gG|0)>=(wW|0)){wZ=wT;w_=wU;w$=gG;break}L4453:do{if((a[wX+(gG*40&-1)|0]&1)!=0){gy=c[wX+(gG*40&-1)+36>>2]|0;hC=wX+(gG*40&-1)+32|0;hw=0;while(1){if((hw|0)>=(gy|0)){break}if((a[wY+((c[hC>>2]|0)+hw|0)|0]|0)==(a[hw+103664|0]|0)){hw=hw+1|0}else{break L4453}}if((hw|0)==1){wZ=wT;w_=wU;w$=gG;break L4450}}}while(0);gG=is(ap)|0;hC=c[gG>>2]|0;if((hC|0)==1){w0=+(c[gG+8>>2]|0)}else if((hC|0)==2){w0=+h[gG+8>>3]}else if((hC|0)==3){w0=+uz(c[gG+8>>2]|0,0)}else{b7=3282;break L27}if((c[eJ>>2]|0)==3){uu(c[eK>>2]|0);c[eJ>>2]=1}gG=c[13898]|0;L4468:do{if((gG|0)<(c[8272]|0)){hC=c[1054]|0;L4470:do{if((a[hC+(gG*40&-1)|0]&1)!=0){gy=c[hC+(gG*40&-1)+36>>2]|0;gF=hC+(gG*40&-1)+32|0;hG=c[10036]|0;gA=0;while(1){if((gA|0)>=(gy|0)){break}if((a[hG+((c[gF>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{break L4470}}if((gA|0)==1){b7=3304;break L4468}}}while(0);a[14176]=1;is(ao);a[14176]=0;if((c[eL>>2]|0)!=3){c[13898]=gG;b7=3304;break}hC=c[eM>>2]|0;if((hC|0)==0){b7=3304;break}if((a[hC]|0)==35){if((ca(hC|0,150416,(v=i,i=i+24|0,c[v>>2]=aq,c[v+8>>2]=ar,c[v+16>>2]=as,v)|0)|0)!=3){b7=3296;break L27}w1=wT;w2=c[as>>2]|0;w3=c[ar>>2]|0;w4=c[aq>>2]|0}else{hw=c[7642]|0;while(1){gF=c[hw>>2]|0;if((gF|0)==0){b7=3302;break L27}if((aY(hC|0,gF|0)|0)==0){break}else{hw=hw+8|0}}gF=c[hw+4>>2]|0;w1=1;w2=gF&255;w3=gF>>>8&255;w4=gF>>>16&255}uu(hC);w5=w1;w6=+(w2|0)/255.0;w7=+(w3|0)/255.0;w8=+(w4|0)/255.0}else{b7=3304}}while(0);if((b7|0)==3304){b7=0;gG=is(an)|0;gF=c[gG>>2]|0;if((gF|0)==1){w9=+(c[gG+8>>2]|0)}else if((gF|0)==2){w9=+h[gG+8>>3]}else if((gF|0)==3){w9=+uz(c[gG+8>>2]|0,0)}else{b7=3308;break L27}if((c[eN>>2]|0)==3){uu(c[eO>>2]|0);c[eN>>2]=1}if(w9<0.0|w9>1.0){b7=3312;break L27}gG=is(am)|0;gF=c[gG>>2]|0;if((gF|0)==1){xa=+(c[gG+8>>2]|0)}else if((gF|0)==2){xa=+h[gG+8>>3]}else if((gF|0)==3){xa=+uz(c[gG+8>>2]|0,0)}else{b7=3317;break L27}if((c[eQ>>2]|0)==3){uu(c[eR>>2]|0);c[eQ>>2]=1}if(xa<0.0|xa>1.0){b7=3321;break L27}gG=is(al)|0;gF=c[gG>>2]|0;if((gF|0)==1){xb=+(c[gG+8>>2]|0)}else if((gF|0)==2){xb=+h[gG+8>>3]}else if((gF|0)==3){xb=+uz(c[gG+8>>2]|0,0)}else{b7=3326;break L27}if((c[eS>>2]|0)==3){uu(c[eT>>2]|0);c[eS>>2]=1}if(xb<0.0|xb>1.0){b7=3330;break L27}else{w5=wT;w6=xb;w7=xa;w8=w9}}gG=wU+1|0;if((gG|0)<(wS|0)){xc=wS;xd=c[5173]|0}else{gF=wS+10|0;hG=db(c[5173]|0,gF<<5,151392)|0;c[5173]=hG;xc=gF;xd=hG}h[xd+(gG<<5)>>3]=w0;h[(c[5173]|0)+(gG<<5)+8>>3]=w8;h[(c[5173]|0)+(gG<<5)+16>>3]=w7;h[(c[5173]|0)+(gG<<5)+24>>3]=w6;xe=c[13898]|0;hG=c[8272]|0;if((hG|0)<=(xe|0)){b7=5241;break L27}gF=c[1054]|0;if((a[gF+(xe*40&-1)|0]&1)==0){b7=5242;break L27}gy=c[gF+(xe*40&-1)+36>>2]|0;hp=gF+(xe*40&-1)+32|0;gx=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){b7=3339;break}if((a[gx+((c[hp>>2]|0)+gC|0)|0]|0)==(a[gC+131272|0]|0)){gC=gC+1|0}else{xf=0;break}}if((b7|0)==3339){b7=0;if((gC|0)==1){wZ=w5;w_=gG;w$=xe;break}else{xf=0}}while(1){if((xf|0)>=(gy|0)){break}if((a[gx+((c[hp>>2]|0)+xf|0)|0]|0)==(a[xf+148464|0]|0)){xf=xf+1|0}else{b7=5243;break L27}}if((xf|0)==1){wS=xc;wT=w5;wU=gG;wV=xe;wW=hG;wX=gF;wY=gx}else{b7=5244;break L27}}c[5172]=w_+1;gz=c[5173]|0;hB=0;while(1){if((hB|0)>=(w_|0)){break}hp=hB+1|0;if(+h[gz+(hB<<5)>>3]>+h[gz+(hp<<5)>>3]){b7=3347;break L27}else{hB=hp}}m3=+h[gz>>3];m2=1.0/(+h[gz+(w_<<5)>>3]-m3);if((w_|0)>1){hB=1;hp=gz;while(1){gy=hp+(hB<<5)|0;h[gy>>3]=m2*(+h[gy>>3]-m3);gy=hB+1|0;gC=c[5173]|0;if((gy|0)<((c[5172]|0)-1|0)){hB=gy;hp=gC}else{xg=gC;break}}}else{xg=gz}h[xg>>3]=0.0;h[(c[5173]|0)+((c[5172]|0)-1<<5)>>3]=1.0;xh=wZ}else{wQ=0;wR=hK;b7=3265}}while(0);if((b7|0)==3265){while(1){b7=0;h[wR+(wQ<<5)>>3]=+h[23584+(wQ<<5)>>3];h[(c[5173]|0)+(wQ<<5)+8>>3]=+h[23592+(wQ<<5)>>3];h[(c[5173]|0)+(wQ<<5)+16>>3]=+h[23600+(wQ<<5)>>3];h[(c[5173]|0)+(wQ<<5)+24>>3]=+h[23608+(wQ<<5)>>3];hK=wQ+1|0;if((hK|0)>=8){break}wQ=hK;wR=c[5173]|0;b7=3265}c[5172]=8;c[5174]=114;xh=0}c[5163]=100;c[7640]=100;ws=1;wt=xh;wu=c[13898]|0}else if((nd|0)==10){if((wf|0)!=0){b7=3353;break L27}xi=wg+1|0;c[13898]=xi;if((xi|0)>=(wh|0)){xj=xi;b7=5245;break L27}L4552:do{if((a[wi+(xi*40&-1)|0]&1)!=0){hK=c[wi+(xi*40&-1)+36>>2]|0;hR=wi+(xi*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hK|0)){break}if((a[wk+((c[hR>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L4552}}if((hF|0)==1){xj=xi;b7=5246;break L27}}}while(0);a[14176]=1;is(aj);a[14176]=0;if((c[eU>>2]|0)!=3){b7=3361;break L27}hR=c[eV>>2]|0;if((hR|0)==0){b7=3363;break L27}c[11856]=0;hK=ey(hR,4,0)|0;uu(hR);if((hK-1|0)>>>0<2){b7=3366;break L27}hK=c[5173]|0;if((hK|0)!=0){uu(hK);c[5173]=0}hK=ut(320)|0;if((hK|0)==0){gk();hR=ut(320)|0;if((hR|0)==0){b7=3371;break L27}else{xk=hR}}else{xk=hK}c[5173]=xk;hK=eC(eW,4)|0;if((hK|0)==-1){b7=3373;break L27}else{xl=10;xm=0;xn=hK}while(1){if((xm|0)<(xl|0)){xo=xl}else{hK=xl+10|0;c[5173]=db(c[5173]|0,hK<<5,151392)|0;xo=hK}if((xn|0)==3){m3=+h[eW>>3];do{if(m3<0.0){xp=0.0}else{if(m3>1.0){xp=1.0;break}xp=m3}}while(0);h[(c[5173]|0)+(xm<<5)+8>>3]=xp;m3=+h[eX>>3];do{if(m3<0.0){xq=0.0}else{if(m3>1.0){xq=1.0;break}xq=m3}}while(0);h[(c[5173]|0)+(xm<<5)+16>>3]=xq;m3=+h[eY>>3];do{if(m3<0.0){xr=0.0}else{if(m3>1.0){xr=1.0;break}xr=m3}}while(0);h[(c[5173]|0)+(xm<<5)+24>>3]=xr;h[(c[5173]|0)+(xm<<5)>>3]=+(xm|0)}else if((xn|0)==4){m3=+h[eX>>3];do{if(m3<0.0){xs=0.0}else{if(m3>1.0){xs=1.0;break}xs=m3}}while(0);h[(c[5173]|0)+(xm<<5)+8>>3]=xs;m3=+h[eY>>3];do{if(m3<0.0){xt=0.0}else{if(m3>1.0){xt=1.0;break}xt=m3}}while(0);h[(c[5173]|0)+(xm<<5)+16>>3]=xt;m3=+h[eZ>>3];do{if(m3<0.0){xu=0.0}else{if(m3>1.0){xu=1.0;break}xu=m3}}while(0);h[(c[5173]|0)+(xm<<5)+24>>3]=xu;h[(c[5173]|0)+(xm<<5)>>3]=+h[eW>>3]}else{b7=3397;break L27}xv=xm+1|0;hF=eC(eW,4)|0;if((hF|0)==-1){break}else{xl=xo;xm=xv;xn=hF}}ez();if((xv|0)==0){b7=5250;break L27}c[5172]=xv;hF=c[5173]|0;hK=0;while(1){if((hK|0)>=(xm|0)){break}hR=hK+1|0;if(+h[hF+(hK<<5)>>3]>+h[hF+(hR<<5)>>3]){b7=3404;break L27}else{hK=hR}}m3=+h[hF>>3];m2=1.0/(+h[hF+(xm<<5)>>3]-m3);if((xm|0)>1){hK=1;hR=hF;while(1){gz=hR+(hK<<5)|0;h[gz>>3]=m2*(+h[gz>>3]-m3);gz=hK+1|0;hp=c[5173]|0;if((gz|0)<((c[5172]|0)-1|0)){hK=gz;hR=hp}else{xw=hp;break}}}else{xw=hF}h[xw>>3]=0.0;h[(c[5173]|0)+((c[5172]|0)-1<<5)>>3]=1.0;c[5163]=100;c[7640]=100;hR=(c[13898]|0)-1|0;c[13898]=hR;ws=1;wt=we;wu=hR}else if((nd|0)==11){if((wf|0)!=0){b7=3409;break L27}c[13898]=wg+1;uF(e_|0,55600,50);uF(55600,89352,50);xx=c[13898]|0;hR=c[5178]|0;if((hR|0)!=0){e1(hR);c[5178]=0}c[11670]=20704;it();hR=c[18070]|0;hK=db(hR,c[hR>>2]<<5|8,105624)|0;c[18070]=0;c[5178]=hK;if((hK|0)==0){b7=3413;break L27}hK=(c[13898]|0)-1|0;hR=c[1054]|0;hp=(c[hR+(hK*40&-1)+36>>2]|0)+(c[hR+(hK*40&-1)+32>>2]|0)|0;hK=db(c[5179]|0,(hp+1|0)-(c[hR+(xx*40&-1)+32>>2]|0)|0,116456)|0;c[5179]=hK;hR=c[(c[1054]|0)+(xx*40&-1)+32>>2]|0;L4617:do{if((hR|0)<(hp|0)){gz=hR;hB=hK;while(1){gC=a[(c[10036]|0)+gz|0]|0;if(gC<<24>>24==0){xy=hB;break L4617}gy=hB+1|0;a[hB]=gC;gC=gz+1|0;if((gC|0)<(hp|0)){gz=gC;hB=gy}else{xy=gy;break}}}else{xy=hK}}while(0);a[xy]=0;c[11670]=0;xz=c[13898]|0;if((c[8272]|0)<=(xz|0)){b7=5251;break L27}hK=c[1054]|0;if((a[hK+(xz*40&-1)|0]&1)==0){b7=5252;break L27}hp=c[hK+(xz*40&-1)+36>>2]|0;hR=hK+(xz*40&-1)+32|0;hK=c[10036]|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[hK+((c[hR>>2]|0)+hF|0)|0]|0)==(a[hF+148464|0]|0)){hF=hF+1|0}else{b7=5253;break L27}}if((hF|0)!=1){b7=5254;break L27}xA=xz+1|0;c[13898]=xA;hR=c[5256]|0;if((hR|0)!=0){e1(hR);c[5256]=0}c[11670]=21016;it();hR=c[18070]|0;hK=db(hR,c[hR>>2]<<5|8,105624)|0;c[18070]=0;c[5256]=hK;if((hK|0)==0){b7=3427;break L27}hK=(c[13898]|0)-1|0;hR=c[1054]|0;hp=(c[hR+(hK*40&-1)+36>>2]|0)+(c[hR+(hK*40&-1)+32>>2]|0)|0;hK=db(c[5257]|0,(hp+1|0)-(c[hR+(xA*40&-1)+32>>2]|0)|0,116456)|0;c[5257]=hK;hR=c[(c[1054]|0)+(xA*40&-1)+32>>2]|0;L4633:do{if((hR|0)<(hp|0)){hB=hR;gz=hK;while(1){gy=a[(c[10036]|0)+hB|0]|0;if(gy<<24>>24==0){xB=gz;break L4633}gC=gz+1|0;a[gz]=gy;gy=hB+1|0;if((gy|0)<(hp|0)){hB=gy;gz=gC}else{xB=gC;break}}}else{xB=hK}}while(0);a[xB]=0;c[11670]=0;xC=c[13898]|0;if((c[8272]|0)<=(xC|0)){b7=5255;break L27}hK=c[1054]|0;if((a[hK+(xC*40&-1)|0]&1)==0){b7=5256;break L27}hp=c[hK+(xC*40&-1)+36>>2]|0;hR=hK+(xC*40&-1)+32|0;hK=c[10036]|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[hK+((c[hR>>2]|0)+hF|0)|0]|0)==(a[hF+148464|0]|0)){hF=hF+1|0}else{b7=5257;break L27}}if((hF|0)!=1){b7=5258;break L27}xD=xC+1|0;c[13898]=xD;hR=c[5334]|0;if((hR|0)!=0){e1(hR);c[5334]=0}c[11670]=21328;it();hR=c[18070]|0;hK=db(hR,c[hR>>2]<<5|8,105624)|0;c[18070]=0;c[5334]=hK;if((hK|0)==0){b7=3441;break L27}hK=(c[13898]|0)-1|0;hR=c[1054]|0;hp=(c[hR+(hK*40&-1)+36>>2]|0)+(c[hR+(hK*40&-1)+32>>2]|0)|0;hK=db(c[5335]|0,(hp+1|0)-(c[hR+(xD*40&-1)+32>>2]|0)|0,116456)|0;c[5335]=hK;hR=c[(c[1054]|0)+(xD*40&-1)+32>>2]|0;L4649:do{if((hR|0)<(hp|0)){gz=hR;hB=hK;while(1){gC=a[(c[10036]|0)+gz|0]|0;if(gC<<24>>24==0){xE=hB;break L4649}gy=hB+1|0;a[hB]=gC;gC=gz+1|0;if((gC|0)<(hp|0)){gz=gC;hB=gy}else{xE=gy;break}}}else{xE=hK}}while(0);a[xE]=0;c[11670]=0;uF(55600,e_|0,50);c[5163]=102;c[7640]=102;hK=(c[13898]|0)-1|0;c[13898]=hK;ws=1;wt=we;wu=hK}else if((nd|0)==12){xF=wg+1|0;c[13898]=xF;if((xF|0)>=(wh|0)){b7=5259;break L27}L4656:do{if((a[wi+(xF*40&-1)|0]&1)==0){b7=3495}else{hK=c[wi+(xF*40&-1)+36>>2]|0;hp=wi+(xF*40&-1)+32|0;hR=0;while(1){if((hR|0)>=(hK|0)){b7=3451;break}hF=c[hp>>2]|0;if((a[wk+(hF+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{xG=hF;break}}if((b7|0)==3451){b7=0;if((hR|0)==1){b7=5260;break L27}xG=c[hp>>2]|0}hF=(hK|0)>0;L4665:do{if(hF){hB=0;while(1){if((a[hB+137240|0]|0)!=(a[wk+(hB+xG|0)|0]|0)){break L4665}gz=hB+1|0;if((gz|0)<(hK|0)){hB=gz}else{xH=gz;b7=3457;break}}}else{xH=0;b7=3457}}while(0);if((b7|0)==3457){b7=0;hp=a[xH+137240|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53960;break}}L4672:do{if(hF){hp=0;while(1){if((a[hp+137176|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){break L4672}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xJ=hR;b7=3482;break}}}else{xJ=0;b7=3482}}while(0);if((b7|0)==3482){b7=0;hp=a[xJ+137176|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53968;break}}L4679:do{if(hF){hp=0;while(1){if((a[hp+137048|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){break L4679}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xK=hR;b7=3486;break}}}else{xK=0;b7=3486}}while(0);if((b7|0)==3486){b7=0;hp=a[xK+137048|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53976;break}}L4686:do{if(hF){hp=0;while(1){if((a[hp+136776|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){break L4686}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xL=hR;b7=3490;break}}}else{xL=0;b7=3490}}while(0);if((b7|0)==3490){b7=0;hp=a[xL+136776|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53984;break}}if(hF){hp=0;while(1){if((a[hp+136432|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){b7=3495;break L4656}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xM=hR;break}}}else{xM=0}hp=a[xM+136432|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53992}else{b7=3495}}}while(0);if((b7|0)==3495){b7=0;xI=54e3}hp=c[xI+4>>2]|0;if((hp|0)==-1){b7=3459;break L27}c[5174]=hp;ws=wf;wt=we;wu=xF}else if((nd|0)==6){a[20684]=0;ws=wf;wt=we;wu=wg}else if((nd|0)==7){a[20684]=1;ws=wf;wt=we;wu=wg}else if((nd|0)==8){c[13898]=wg+1;hp=is(ah)|0;hK=c[hp>>2]|0;if((hK|0)==1){xN=+(c[hp+8>>2]|0)}else if((hK|0)==2){xN=+h[hp+8>>3]}else if((hK|0)==3){xN=+uz(c[hp+8>>2]|0,0)}else{b7=3467;break L27}if((c[e$>>2]|0)==3){uu(c[e0>>2]|0);c[e$>>2]=1}hp=~~xN;if((hp|0)<0){b7=3471;break L27}c[5168]=hp;hp=(c[13898]|0)-1|0;c[13898]=hp;ws=wf;wt=we;wu=hp}else{b7=3473;break L27}}while(0);nd=wu+1|0;c[13898]=nd;hp=c[8272]|0;if((nd|0)>=(hp|0)){wm=wt;break}hK=c[1054]|0;we=wt;wf=ws;wg=nd;wh=hp;wi=hK;wj=a[hK+(nd*40&-1)|0]|0}if(!((wm|0)!=0&(c[5174]|0)!=114)){break}if((a[37400]&1)==0){break}uh(-1,153616,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{b7=3127}}while(0);do{if((b7|0)==3127){b7=0;if((c[11254]|0)==0){break}c[5163]=114;c[5164]=7;c[5165]=5;c[5166]=15;a[20668]=112;a[20684]=0;c[5168]=0;c[5172]=0;uu(c[5173]|0);c[5173]=0;uu(c[5170]|0);c[5170]=0;c[5174]=114;h[2705]=1.5;c[7640]=48}}while(0);c[7271]=-1}else if((gD|0)==62){gH=gv+1|0;c[13898]=gH;nh=c[8272]|0;L4724:do{if((gH|0)<(nh|0)){nd=a[gw+(gH*40&-1)|0]|0;L4726:do{if((nd&1)==0){xO=gH;xP=nh;xQ=gw;xR=nd}else{hK=c[gw+(gH*40&-1)+36>>2]|0;hp=gw+(gH*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hK|0)){break}if((a[gB+((c[hp>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{xO=gH;xP=nh;xQ=gw;xR=nd;break L4726}}if((hF|0)==1){break L4724}else{xO=gH;xP=nh;xQ=gw;xR=nd}}}while(0);L4732:while(1){nd=(xR&1)==0;hp=c[xQ+(xO*40&-1)+36>>2]|0;L4734:do{if(nd){xS=c[10036]|0;xT=xQ+(xO*40&-1)+32|0}else{hK=xQ+(xO*40&-1)+32|0;hR=c[10036]|0;hB=0;while(1){if((hB|0)>=(hp|0)){break}if((a[hR+((c[hK>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{xS=hR;xT=hK;break L4734}}if((hB|0)==1){break L4732}else{xS=hR;xT=hK}}}while(0);hF=c[xT>>2]|0;gx=(hp|0)>0;gF=25168;hG=141728;L4742:while(1){L4744:do{if(!nd){if(gx){gG=0;gz=0;gy=hF;while(1){gC=a[hG+gG|0]|0;if(gC<<24>>24==(a[xS+(gG+gy|0)|0]|0)){xU=gy;xV=gz}else{if(gC<<24>>24!=36){break L4744}xU=gy-1|0;xV=1}xW=gG+1|0;if((xW|0)<(xV+hp|0)){gG=xW;gz=xV;gy=xU}else{break}}if((xV|0)==0){xX=xW}else{xY=gF;break L4742}}else{xX=0}gy=a[hG+xX|0]|0;if((gy<<24>>24|0)==36|(gy<<24>>24|0)==0){xY=gF;break L4742}}}while(0);hK=gF+8|0;hR=c[hK>>2]|0;if((hR|0)==0){xY=hK;break}else{gF=hK;hG=hR}}hG=c[xY+4>>2]|0;L4757:do{if((hG|0)==1){a[54017]=118;xZ=xO}else if((hG|0)==2){a[54017]=104;xZ=xO}else if((hG|0)==3){a[54016]=100;xZ=xO}else if((hG|0)==4){a[54016]=117;xZ=xO}else if((hG|0)==10){c[13506]=1;xZ=xO}else if((hG|0)==11){c[13506]=0;xZ=xO}else if((hG|0)==5){a[54018]=1;gF=xO+1|0;c[13898]=gF;if((gF|0)>=(xP|0)){xZ=gF;break}L4766:do{if((a[xQ+(gF*40&-1)|0]&1)!=0){hp=c[xQ+(gF*40&-1)+36>>2]|0;hF=xQ+(gF*40&-1)+32|0;gx=0;while(1){if((gx|0)>=(hp|0)){break}if((a[xS+((c[hF>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{break L4766}}if((gx|0)==1){xZ=gF;break L4757}}}while(0);gF=is(ag)|0;hF=c[gF>>2]|0;if((hF|0)==1){x_=+(c[gF+8>>2]|0)}else if((hF|0)==2){x_=+h[gF+8>>3]}else if((hF|0)==3){x_=+uz(c[gF+8>>2]|0,0)}else{b7=3537;break L27}if((c[e2>>2]|0)==3){uu(c[e3>>2]|0);c[e2>>2]=1}gF=~~x_;c[13505]=gF;if((gF|0)<1){b7=3541;break L27}gF=(c[13898]|0)-1|0;c[13898]=gF;xZ=gF}else if((hG|0)==6){c[13505]=-1;xZ=xO}else if((hG|0)==7){a[54018]=0;xZ=xO}else if((hG|0)==8){x$=xO+1|0;c[13898]=x$;if((x$|0)>=(xP|0)){b7=5261;break L27}L4786:do{if((a[xQ+(x$*40&-1)|0]&1)!=0){gF=c[xQ+(x$*40&-1)+36>>2]|0;hF=xQ+(x$*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(gF|0)){break}if((a[xS+((c[hF>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L4786}}if((hp|0)==1){b7=5262;break L27}}}while(0);dl(54032,3);hF=(c[13898]|0)-1|0;c[13898]=hF;xZ=hF}else if((hG|0)==9){x0=xO+1|0;c[13898]=x0;if((x0|0)>=(xP|0)){b7=5263;break L27}L4795:do{if((a[xQ+(x0*40&-1)|0]&1)!=0){hF=c[xQ+(x0*40&-1)+36>>2]|0;gF=xQ+(x0*40&-1)+32|0;gx=0;while(1){if((gx|0)>=(hF|0)){break}if((a[xS+((c[gF>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{break L4795}}if((gx|0)==1){b7=5264;break L27}}}while(0);dl(54072,3);gF=(c[13898]|0)-1|0;c[13898]=gF;xZ=gF}else{b7=3561;break L27}}while(0);hG=xZ+1|0;c[13898]=hG;gF=c[8272]|0;if((hG|0)>=(gF|0)){break}hF=c[1054]|0;xO=hG;xP=gF;xQ=hF;xR=a[hF+(hG*40&-1)|0]|0}if((a[54016]|0)!=110){break L44}a[54016]=100;break L44}}while(0);a[54016]=100}else if((gD|0)==77){nh=gv+1|0;c[13898]=nh;L4808:do{if((nh|0)<(c[8272]|0)){L4810:do{if((a[gw+(nh*40&-1)|0]&1)!=0){gH=c[gw+(nh*40&-1)+36>>2]|0;hG=gw+(nh*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gH|0)){break}if((a[gB+((c[hG>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L4810}}if((hF|0)==1){x1=1.0;break L4808}}}while(0);hG=is(af)|0;gH=c[hG>>2]|0;if((gH|0)==1){x2=+(c[hG+8>>2]|0)}else if((gH|0)==2){x2=+h[hG+8>>3]}else if((gH|0)==3){x2=+uz(c[hG+8>>2]|0,0)}else{b7=3576;break L27}if((c[e4>>2]|0)!=3){x1=x2;break}uu(c[e5>>2]|0);c[e4>>2]=1;x1=x2}else{x1=1.0}}while(0);h[3818]=x1>0.0?x1:1.0}else if((gD|0)==78){nh=gv+1|0;c[13898]=nh;L4825:do{if((nh|0)<(c[8272]|0)){L4827:do{if((a[gw+(nh*40&-1)|0]&1)!=0){hG=c[gw+(nh*40&-1)+36>>2]|0;gH=gw+(nh*40&-1)+32|0;gF=0;while(1){if((gF|0)>=(hG|0)){break}if((a[gB+((c[gH>>2]|0)+gF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{break L4827}}if((gF|0)==1){x3=1.0;break L4825}}}while(0);gH=is(ae)|0;hG=c[gH>>2]|0;if((hG|0)==1){x4=+(c[gH+8>>2]|0)}else if((hG|0)==2){x4=+h[gH+8>>3]}else if((hG|0)==3){x4=+uz(c[gH+8>>2]|0,0)}else{b7=3590;break L27}if((c[e6>>2]|0)!=3){x3=x4;break}uu(c[e8>>2]|0);c[e6>>2]=1;x3=x4}else{x3=1.0}}while(0);h[3817]=x3>0.0?x3:1.0}else if((gD|0)==79){c[13898]=gv+1;if((a[30528]&1)!=0){break}a[30528]=1;if((a[32936]&1)==0){if((a[37400]&1)!=0){nh=c[m>>2]|0;aI(171240,33,1,nh|0)}b[12272]=116}if((c[17539]|0)!=0){h[8773]=0.0;h[8774]=6.283185307179586/+h[9040]}if((c[17367]|0)==3){break}ju()}else if((gD|0)==80){c[ad>>2]=0;x5=gv+1|0;c[13898]=x5;L4854:do{if((x5|0)<(c[8272]|0)){L4856:do{if((a[gw+(x5*40&-1)|0]&1)!=0){nh=c[gw+(x5*40&-1)+36>>2]|0;gH=gw+(x5*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(nh|0)){b7=3608;break}if((a[gB+((c[gH>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{x6=0;break}}if((b7|0)==3608){b7=0;if((hG|0)==1){break L4854}else{x6=0}}while(1){if((x6|0)>=(nh|0)){break}if((a[gB+((c[gH>>2]|0)+x6|0)|0]|0)==(a[x6+103664|0]|0)){x6=x6+1|0}else{break L4856}}if((x6|0)==1){b7=3615;break L27}}}while(0);a[14176]=1;is(ac);a[14176]=0;if((c[e9>>2]|0)!=3){b7=3614;break L27}gH=c[fa>>2]|0;c[ad>>2]=gH;if((gH|0)==0){b7=3617;break L27}iQ(ad);x7=c[13898]|0;do{if((x7|0)<(c[8272]|0)){gH=c[1054]|0;if((a[gH+(x7*40&-1)|0]&1)==0){b7=5265;break L27}nh=c[gH+(x7*40&-1)+36>>2]|0;hG=gH+(x7*40&-1)+32|0;gH=c[10036]|0;gF=0;while(1){if((gF|0)>=(nh|0)){b7=3623;break}if((a[gH+((c[hG>>2]|0)+gF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{x8=0;break}}if((b7|0)==3623){b7=0;if((gF|0)==1){x9=0;break}else{x8=0}}while(1){if((x8|0)>=(nh|0)){break}if((a[gH+((c[hG>>2]|0)+x8|0)|0]|0)==(a[x8+148880|0]|0)){x8=x8+1|0}else{b7=5266;break L27}}if((x8|0)!=6){b7=5267;break L27}c[13898]=x7+1;x9=1}else{x9=0}}while(0);ea(c[ad>>2]|0,x9);break L44}}while(0);ea(0,0)}else if((gD|0)==81){ya=gv+1|0;c[13898]=ya;L4886:do{if((ya|0)<(c[8272]|0)){L4888:do{if((a[gw+(ya*40&-1)|0]&1)!=0){hG=c[gw+(ya*40&-1)+36>>2]|0;gH=gw+(ya*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(hG|0)){b7=3636;break}if((a[gB+((c[gH>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{yb=0;break}}if((b7|0)==3636){b7=0;if((nh|0)==1){break L4886}else{yb=0}}while(1){if((yb|0)>=(hG|0)){break}if((a[gB+((c[gH>>2]|0)+yb|0)|0]|0)==(a[yb+103664|0]|0)){yb=yb+1|0}else{break L4888}}if((yb|0)==1){b7=3643;break L27}}}while(0);a[14176]=1;is(ab);a[14176]=0;if((c[fb>>2]|0)!=3){b7=3642;break L27}gH=c[fc>>2]|0;c[57238]=gH;if((gH|0)==0){b7=3645;break L27}iQ(228952);break L44}}while(0);uu(c[57238]|0);c[57238]=0}else if((gD|0)==75){gH=gv+1|0;c[13898]=gH;hG=c[gw+(gH*40&-1)+36>>2]|0;nh=c[gw+(gH*40&-1)+32>>2]|0;gF=a[gw+(gH*40&-1)|0]|0;hF=(gF&1)==0;L4904:do{if((hG|0)>0&(hF^1)){hp=0;nd=0;hR=nh;while(1){if((a[hp+115824|0]|0)==(a[gB+(hp+hR|0)|0]|0)){yc=hR;yd=nd}else{if((hp|0)!=4){break}yc=hR-1|0;yd=1}hK=hp+1|0;if((hK|0)<(yd+hG|0)){hp=hK;nd=yd;hR=yc}else{b7=3653;break}}if((b7|0)==3653){b7=0;if((yd|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((hp|0)==3|(hp|0)==9){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}}if(hF){b7=3674;break}else{yj=0;yk=0;yl=nh}while(1){if((a[yj+115976|0]|0)==(a[gB+(yj+yl|0)|0]|0)){ym=yl;yn=yk}else{if((yj|0)!=3){yo=0;yp=0;yq=nh;break}ym=yl-1|0;yn=1}hR=yj+1|0;if((hR|0)<(yn+hG|0)){yj=hR;yk=yn;yl=ym}else{b7=3660;break}}if((b7|0)==3660){b7=0;if((yn|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((yj|0)==2|(yj|0)==7){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}else{yo=0;yp=0;yq=nh}}while(1){if((a[yo+116120|0]|0)==(a[gB+(yo+yq|0)|0]|0)){yr=yq;ys=yp}else{if((yo|0)!=4){yt=0;yu=0;yv=nh;break}yr=yq-1|0;ys=1}hp=yo+1|0;if((hp|0)<(ys+hG|0)){yo=hp;yp=ys;yq=yr}else{b7=3666;break}}if((b7|0)==3666){b7=0;if((ys|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((yo|0)==3|(yo|0)==6){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}else{yt=0;yu=0;yv=nh}}while(1){if((a[yt+172184|0]|0)==(a[gB+(yt+yv|0)|0]|0)){yw=yv;yx=yu}else{if((yt|0)!=4){b7=3674;break L4904}yw=yv-1|0;yx=1}hp=yt+1|0;if((hp|0)<(yx+hG|0)){yt=hp;yu=yx;yv=yw}else{break}}if((yx|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((yt|0)==3|(yt|0)==7){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF}else{b7=3674}}else{b7=3674}}while(0);if((b7|0)==3674){b7=0;gF=is($)|0;nh=c[gF>>2]|0;if((nh|0)==1){yy=+(c[gF+8>>2]|0)}else if((nh|0)==2){yy=+h[gF+8>>3]}else if((nh|0)==3){yy=+uz(c[gF+8>>2]|0,0)}else{b7=3678;break L27}if((c[fd>>2]|0)==3){uu(c[fe>>2]|0);c[fd>>2]=1}gF=~~yy;yz=c[13898]|0;if((gF|0)<1){b7=3683;break L27}nh=c[1054]|0;ye=gF;yf=yz;yg=c[nh+(yz*40&-1)+36>>2]|0;yh=c[nh+(yz*40&-1)+32>>2]|0;yi=a[nh+(yz*40&-1)|0]|0}nh=(yi&1)==0;L4953:do{if((yg|0)>0&(nh^1)){gF=c[10036]|0;hG=0;gH=0;hF=yh;while(1){if((a[hG+115824|0]|0)==(a[gF+(hG+hF|0)|0]|0)){yA=hF;yB=gH}else{if((hG|0)!=4){break}yA=hF-1|0;yB=1}hp=hG+1|0;if((hp|0)<(yB+yg|0)){hG=hp;gH=yB;hF=yA}else{b7=3690;break}}do{if((b7|0)==3690){b7=0;if((yB|0)==0){if(!((hG|0)==3|(hG|0)==9)){break}}jx(ye,1);break L44}}while(0);if(nh){break}else{yC=0;yD=0;yE=yh}while(1){if((a[yC+115976|0]|0)==(a[gF+(yC+yE|0)|0]|0)){yF=yE;yG=yD}else{if((yC|0)!=3){yH=0;yI=0;yJ=yh;break}yF=yE-1|0;yG=1}hG=yC+1|0;if((hG|0)<(yG+yg|0)){yC=hG;yD=yG;yE=yF}else{b7=3698;break}}do{if((b7|0)==3698){b7=0;if((yG|0)==0){if(!((yC|0)==2|(yC|0)==7)){yH=0;yI=0;yJ=yh;break}}jx(ye,3);break L44}}while(0);while(1){if((a[yH+116120|0]|0)==(a[gF+(yH+yJ|0)|0]|0)){yK=yJ;yL=yI}else{if((yH|0)!=4){yM=0;yN=0;yO=yh;break}yK=yJ-1|0;yL=1}hG=yH+1|0;if((hG|0)<(yL+yg|0)){yH=hG;yI=yL;yJ=yK}else{b7=3705;break}}do{if((b7|0)==3705){b7=0;if((yL|0)==0){if(!((yH|0)==3|(yH|0)==6)){yM=0;yN=0;yO=yh;break}}jx(ye,2);break L44}}while(0);while(1){if((a[yM+172184|0]|0)==(a[gF+(yM+yO|0)|0]|0)){yP=yO;yQ=yN}else{if((yM|0)!=4){break L4953}yP=yO-1|0;yQ=1}hG=yM+1|0;if((hG|0)<(yQ+yg|0)){yM=hG;yN=yQ;yO=yP}else{break}}if((yQ|0)==0){if(!((yM|0)==3|(yM|0)==7)){break}}jx(ye,4);break L44}}while(0);if((ye|0)>0){yR=43272}else{b7=3720;break L27}while(1){yS=c[yR>>2]|0;if((yS|0)==0){b7=3719;break L27}if((ye|0)==(c[yS+4>>2]|0)){break}else{yR=yS|0}}c[13898]=yf-1;jx(ye,c[yS+12>>2]|0)}else if((gD|0)==82){c[13898]=gv+1;nh=is(Z)|0;gF=c[nh>>2]|0;if((gF|0)==1){yT=+(c[nh+8>>2]|0)}else if((gF|0)==2){yT=+h[nh+8>>3]}else if((gF|0)==3){yT=+uz(c[nh+8>>2]|0,0)}else{b7=3725;break L27}if((c[ff>>2]|0)==3){uu(c[fg>>2]|0);c[ff>>2]=1}nh=~~yT;gF=(nh|0)>-1?nh:-nh|0;yU=c[13898]|0;do{if((yU|0)<(c[8272]|0)){nh=c[1054]|0;if((a[nh+(yU*40&-1)|0]&1)==0){b7=5272;break L27}hG=c[nh+(yU*40&-1)+36>>2]|0;hF=nh+(yU*40&-1)+32|0;nh=c[10036]|0;gH=0;while(1){if((gH|0)>=(hG|0)){b7=3733;break}if((a[nh+((c[hF>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{yV=0;break}}if((b7|0)==3733){b7=0;if((gH|0)==1){yW=gF;break}else{yV=0}}while(1){if((yV|0)>=(hG|0)){break}if((a[nh+((c[hF>>2]|0)+yV|0)|0]|0)==(a[yV+148464|0]|0)){yV=yV+1|0}else{b7=5273;break L27}}if((yV|0)!=1){b7=5274;break L27}c[13898]=yU+1;hF=is(Y)|0;nh=c[hF>>2]|0;if((nh|0)==1){yX=+(c[hF+8>>2]|0)}else if((nh|0)==2){yX=+h[hF+8>>3]}else if((nh|0)==3){yX=+uz(c[hF+8>>2]|0,0)}else{b7=3742;break L27}if((c[fh>>2]|0)==3){uu(c[fi>>2]|0);c[fh>>2]=1}hF=~~yX;yW=(hF|0)>-1?hF:-hF|0}else{yW=gF}}while(0);if((gF|0)<2|(yW|0)<2){b7=3747;break L27}hF=c[10828]|0;c[10828]=0;iY(hF);c[6352]=gF;c[6350]=yW}else if((gD|0)==83){hF=gv+1|0;c[13898]=hF;nh=c[8272]|0;L5037:do{if((hF|0)<(nh|0)){L5039:do{if((a[gw+(hF*40&-1)|0]&1)==0){yY=hF;yZ=nh}else{hG=c[gw+(hF*40&-1)+36>>2]|0;gH=gw+(hF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hG|0)){b7=3754;break}hR=c[gH>>2]|0;if((a[gB+(hR+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{y_=hR;break}}if((b7|0)==3754){b7=0;if((hp|0)==1){b7=3756;break L5037}y_=c[gH>>2]|0}if((hG|0)>0){y$=0;y0=0;y1=y_}else{yY=hF;yZ=nh;break}while(1){if((a[y$+175752|0]|0)==(a[gB+(y$+y1|0)|0]|0)){y2=y1;y3=y0}else{if((y$|0)!=2){y4=0;y5=0;y6=y_;break}y2=y1-1|0;y3=1}hR=y$+1|0;if((hR|0)<(y3+hG|0)){y$=hR;y0=y3;y1=y2}else{b7=3762;break}}do{if((b7|0)==3762){b7=0;if((y3|0)==0){if(!((y$|0)==1|(y$|0)==6)){y4=0;y5=0;y6=y_;break}}g[18074]=1.0;gH=gv+2|0;c[13898]=gH;yY=gH;yZ=nh;break L5039}}while(0);while(1){if((a[y4+175400|0]|0)==(a[gB+(y4+y6|0)|0]|0)){y7=y6;y8=y5}else{if((y4|0)!=2){y9=0;za=0;zb=y_;break}y7=y6-1|0;y8=1}gH=y4+1|0;if((gH|0)<(y8+hG|0)){y4=gH;y5=y8;y6=y7}else{b7=3769;break}}do{if((b7|0)==3769){b7=0;if((y8|0)==0){if(!((y4|0)==5|(y4|0)==1)){y9=0;za=0;zb=y_;break}}c[13898]=gv+2;gH=is(W)|0;hp=c[gH>>2]|0;if((hp|0)==1){zc=+(c[gH+8>>2]|0)}else if((hp|0)==2){zc=+h[gH+8>>3]}else if((hp|0)==3){zc=+uz(c[gH+8>>2]|0,0)}else{b7=3775;break L27}if((c[fn>>2]|0)==3){uu(c[fo>>2]|0);c[fn>>2]=1}g[18074]=zc;yY=c[13898]|0;yZ=c[8272]|0;break L5039}}while(0);while(1){if((a[y9+174920|0]|0)==(a[gB+(y9+zb|0)|0]|0)){zd=zb;ze=za}else{if((y9|0)!=4){zf=0;zg=0;zh=y_;b7=3785;break}zd=zb-1|0;ze=1}gH=y9+1|0;if((gH|0)<(ze+hG|0)){y9=gH;za=ze;zb=zd}else{b7=3783;break}}do{if((b7|0)==3783){b7=0;if((ze|0)!=0){break}if(!((y9|0)==3|(y9|0)==7)){zf=0;zg=0;zh=y_;b7=3785}}}while(0);do{if((b7|0)==3785){while(1){b7=0;if((a[zf+174640|0]|0)==(a[gB+(zf+zh|0)|0]|0)){zi=zh;zj=zg}else{if((zf|0)!=4){yY=hF;yZ=nh;break L5039}zi=zh-1|0;zj=1}gH=zf+1|0;if((gH|0)<(zj+hG|0)){zf=gH;zg=zj;zh=zi;b7=3785}else{break}}if((zj|0)!=0){break}if(!((zf|0)==3|(zf|0)==8)){yY=hF;yZ=nh;break L5039}}}while(0);g[18074]=0.0;hG=gv+2|0;c[13898]=hG;yY=hG;yZ=nh}}while(0);if((yY|0)>=(yZ|0)){break}hG=c[1054]|0;L5099:do{if((a[hG+(yY*40&-1)|0]&1)!=0){gH=c[hG+(yY*40&-1)+36>>2]|0;hp=hG+(yY*40&-1)+32|0;hR=c[10036]|0;nd=0;while(1){if((nd|0)>=(gH|0)){break}if((a[hR+((c[hp>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L5099}}if((nd|0)==1){break L5037}}}while(0);hG=is(V)|0;hp=c[hG>>2]|0;if((hp|0)==1){zk=+(c[hG+8>>2]|0)}else if((hp|0)==2){zk=+h[hG+8>>3]}else if((hp|0)==3){zk=+uz(c[hG+8>>2]|0,0)}else{b7=3802;break L27}if((c[fj>>2]|0)==3){uu(c[fk>>2]|0);c[fj>>2]=1}m3=zk;g[178]=m3;hG=c[13898]|0;L5114:do{if((c[8272]|0)>(hG|0)){hp=c[1054]|0;if((a[hp+(hG*40&-1)|0]&1)==0){break}hR=c[hp+(hG*40&-1)+36>>2]|0;gH=hp+(hG*40&-1)+32|0;hp=c[10036]|0;hK=0;while(1){if((hK|0)>=(hR|0)){break}if((a[hp+((c[gH>>2]|0)+hK|0)|0]|0)==(a[hK+148464|0]|0)){hK=hK+1|0}else{break L5114}}if((hK|0)!=1){break}c[13898]=hG+1;gH=is(X)|0;hp=c[gH>>2]|0;if((hp|0)==1){zl=+(c[gH+8>>2]|0)}else if((hp|0)==2){zl=+h[gH+8>>3]}else if((hp|0)==3){zl=+uz(c[gH+8>>2]|0,0)}else{b7=3815;break L27}if((c[fl>>2]|0)==3){uu(c[fm>>2]|0);c[fl>>2]=1}g[38]=zl;break L5037}}while(0);g[38]=m3}else{b7=3756}}while(0);if((b7|0)==3756){b7=0;g[178]=1.0;g[38]=1.0}if(+g[178]<=0.0|+g[38]<=0.0){b7=3821;break L27}}else if((gD|0)==85){zm=gv+1|0;c[13898]=zm;nh=gw+(zm*40&-1)+36|0;hF=c[nh>>2]|0;gF=gw+(zm*40&-1)+32|0;hG=c[gF>>2]|0;gH=gw+(zm*40&-1)|0;hp=(a[gH]&1)==0;hR=(hF|0)>0;nd=21680;hB=116616;L5135:while(1){L5137:do{if(!hp){if(hR){gy=0;gz=0;gG=hG;while(1){gC=a[hB+gy|0]|0;if(gC<<24>>24==(a[gB+(gy+gG|0)|0]|0)){zn=gG;zo=gz}else{if(gC<<24>>24!=36){break L5137}zn=gG-1|0;zo=1}zp=gy+1|0;if((zp|0)<(zo+hF|0)){gy=zp;gz=zo;gG=zn}else{break}}if((zo|0)==0){zq=zp}else{zr=nd;break L5135}}else{zq=0}gG=a[hB+zq|0]|0;if((gG<<24>>24|0)==36|(gG<<24>>24|0)==0){zr=nd;break L5135}}}while(0);gG=nd+8|0;gz=c[gG>>2]|0;if((gz|0)==0){zr=gG;break}else{nd=gG;hB=gz}}hB=c[zr+4>>2]|0;if((hB|0)==7){nd=gv+2|0;c[13898]=nd;hF=c[8272]|0;if((nd|0)<(hF|0)){zs=nd;zt=hF;zu=gw}else{break}while(1){hF=(a[zu+(zs*40&-1)|0]&1)==0;if(hF){b7=5284;break L27}nd=c[zu+(zs*40&-1)+36>>2]|0;hG=zu+(zs*40&-1)+32|0;hR=c[10036]|0;hp=0;while(1){if((hp|0)>=(nd|0)){b7=3937;break}if((a[hR+((c[hG>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break}}if((b7|0)==3937){b7=0;if((hp|0)==1){break L44}}L5161:do{if((zt|0)>(zs|0)){gz=0;while(1){if((gz|0)>=(nd|0)){break}if((a[hR+((c[hG>>2]|0)+gz|0)|0]|0)==(a[gz+130496|0]|0)){gz=gz+1|0}else{b7=3943;break L5161}}if((gz|0)!=4){b7=3943;break}c[13898]=zs+1;dl(49672,0);gG=(c[13898]|0)-1|0;c[13898]=gG;zv=gG}else{b7=3943}}while(0);L5167:do{if((b7|0)==3943){b7=0;hR=c[hG>>2]|0;if(!((nd|0)>0&(hF^1))){b7=5285;break L27}hp=c[10036]|0;gG=0;gy=0;hK=hR;while(1){if((a[gG+212296|0]|0)==(a[hp+(gG+hK|0)|0]|0)){zw=hK;zx=gy}else{if((gG|0)!=3){zy=0;zz=0;zA=hR;break}zw=hK-1|0;zx=1}gC=gG+1|0;if((gC|0)<(zx+nd|0)){gG=gC;gy=zx;hK=zw}else{b7=3949;break}}do{if((b7|0)==3949){b7=0;if((zx|0)==0){if(!((gG|0)==5|(gG|0)==2)){zy=0;zz=0;zA=hR;break}}hK=zs+1|0;c[13898]=hK;L5181:do{if((a[zu+(hK*40&-1)|0]&1)!=0){gy=c[10810]|0;if((gy|0)==0){zv=hK;break L5167}gz=(zt|0)>(hK|0);gC=zu+(hK*40&-1)+36|0;hS=zu+(hK*40&-1)+32|0;ho=gy;L5184:while(1){ne=c[ho+4>>2]|0;L5186:do{if(gz){gE=c[gC>>2]|0;ng=0;while(1){if((ng|0)>=(gE|0)){break}if((a[hp+((c[hS>>2]|0)+ng|0)|0]|0)==(a[ne+ng|0]|0)){ng=ng+1|0}else{break L5186}}if((a[ne+ng|0]|0)==0){b7=3959;break L5184}}}while(0);ne=c[ho>>2]|0;if((ne|0)==0){zB=gy;break}else{ho=ne}}do{if((b7|0)==3959){b7=0;if((a[ho+8|0]&1)!=0){zB=gy;break}if((c[ho+16>>2]|0)==1){break L5181}else{zB=gy}}}while(0);L5196:while(1){gy=c[zB+4>>2]|0;L5198:do{if(gz){ho=c[gC>>2]|0;gx=0;while(1){if((gx|0)>=(ho|0)){break}if((a[hp+((c[hS>>2]|0)+gx|0)|0]|0)==(a[gy+gx|0]|0)){gx=gx+1|0}else{break L5198}}if((a[gy+gx|0]|0)==0){break L5196}}}while(0);gy=c[zB>>2]|0;if((gy|0)==0){zv=hK;break L5167}else{zB=gy}}if((a[zB+8|0]&1)!=0){zv=hK;break L5167}if((c[zB+16>>2]|0)!=2){zv=hK;break L5167}}}while(0);hK=is(T)|0;hS=c[hK>>2]|0;if((hS|0)==1){zC=+(c[hK+8>>2]|0)}else if((hS|0)==2){zC=+h[hK+8>>3]}else if((hS|0)==3){zC=+uz(c[hK+8>>2]|0,0)}else{b7=3974;break L27}if((c[fr>>2]|0)==3){uu(c[fs>>2]|0);c[fr>>2]=1}h[6214]=zC;hK=(c[13898]|0)-1|0;c[13898]=hK;zv=hK;break L5167}}while(0);while(1){if((a[zy+211736|0]|0)==(a[hp+(zy+zA|0)|0]|0)){zD=zA;zE=zz}else{if((zy|0)!=4){b7=5286;break L27}zD=zA-1|0;zE=1}hR=zy+1|0;if((hR|0)<(zE+nd|0)){zy=hR;zz=zE;zA=zD}else{break}}if((zE|0)==0){if(!((zy|0)==5|(zy|0)==3)){b7=5287;break L27}}zF=zs+1|0;c[13898]=zF;do{if((zt|0)>(zF|0)){hR=(a[zu+(zF*40&-1)|0]&1)==0;if(hR){b7=5280;break L27}gG=c[zu+(zF*40&-1)+36>>2]|0;hK=zu+(zF*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(gG|0)){b7=3991;break}if((a[hp+((c[hK>>2]|0)+hS|0)|0]|0)==(a[hS+150688|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==3991){b7=0;if((hS|0)==2){break}}if(hR){b7=5281;break L27}hK=c[zu+(zF*40&-1)+36>>2]|0;gG=zu+(zF*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(hK|0)){b7=3996;break}if((a[hp+((c[gG>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{zG=0;break}}if((b7|0)==3996){b7=0;if((gC|0)==1){break}else{zG=0}}while(1){if((zG|0)>=(hK|0)){b7=4e3;break}if((a[hp+((c[gG>>2]|0)+zG|0)|0]|0)==(a[zG+211336|0]|0)){zG=zG+1|0}else{zH=0;break}}do{if((b7|0)==4e3){b7=0;if((zG|0)!=2){zH=0;break}c[12406]=1;zv=zF;break L5167}}while(0);while(1){if((zH|0)>=(hK|0)){break}if((a[hp+((c[gG>>2]|0)+zH|0)|0]|0)==(a[zH+210848|0]|0)){zH=zH+1|0}else{b7=5282;break L27}}if((zH|0)!=2){b7=5283;break L27}c[12406]=2;zv=zF;break L5167}}while(0);c[12406]=0;zv=zF}}while(0);nd=zv+1|0;c[13898]=nd;hF=c[8272]|0;if((nd|0)>=(hF|0)){break L44}zs=nd;zt=hF;zu=c[1054]|0}}else if((hB|0)==1){hF=gv+2|0;c[13898]=hF;nd=c[gw+(hF*40&-1)+36>>2]|0;hG=c[gw+(hF*40&-1)+32>>2]|0;hp=(a[gw+(hF*40&-1)|0]&1)==0;hF=(nd|0)>0;gG=30672;hK=116448;L5256:while(1){L5258:do{if(!hp){if(hF){gC=0;hR=0;hS=hG;while(1){gz=a[hK+gC|0]|0;if(gz<<24>>24==(a[gB+(gC+hS|0)|0]|0)){zI=hS;zJ=hR}else{if(gz<<24>>24!=36){break L5258}zI=hS-1|0;zJ=1}zK=gC+1|0;if((zK|0)<(zJ+nd|0)){gC=zK;hR=zJ;hS=zI}else{break}}if((zJ|0)==0){zL=zK}else{zM=gG;break L5256}}else{zL=0}hS=a[hK+zL|0]|0;if((hS<<24>>24|0)==36|(hS<<24>>24|0)==0){zM=gG;break L5256}}}while(0);hS=gG+8|0;hR=c[hS>>2]|0;if((hR|0)==0){zM=hS;break}else{gG=hS;hK=hR}}hK=c[zM+4>>2]|0;zN=gv+3|0;c[13898]=zN;if((hK|0)==-1){b7=3845;break L27}c[12890]=hK;if((hK|0)!=345){break}hE(43432);if((c[10858]|0)!=0){break}c[10859]=0;break}else if((hB|0)==2){hK=gv+2|0;c[13898]=hK;gG=c[gw+(hK*40&-1)+36>>2]|0;nd=c[gw+(hK*40&-1)+32>>2]|0;hG=(a[gw+(hK*40&-1)|0]&1)==0;hK=(gG|0)>0;hF=30672;hp=116448;L5275:while(1){L5277:do{if(!hG){if(hK){hR=0;hS=0;gC=nd;while(1){gz=a[hp+hR|0]|0;if(gz<<24>>24==(a[gB+(hR+gC|0)|0]|0)){zO=gC;zP=hS}else{if(gz<<24>>24!=36){break L5277}zO=gC-1|0;zP=1}zQ=hR+1|0;if((zQ|0)<(zP+gG|0)){hR=zQ;hS=zP;gC=zO}else{break}}if((zP|0)==0){zR=zQ}else{zS=hF;break L5275}}else{zR=0}gC=a[hp+zR|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){zS=hF;break L5275}}}while(0);gC=hF+8|0;hS=c[gC>>2]|0;if((hS|0)==0){zS=gC;break}else{hF=gC;hp=hS}}hp=c[zS+4>>2]|0;zT=gv+3|0;c[13898]=zT;if((hp|0)==-1){b7=3860;break L27}if((hp&4|0)!=0){b7=5275;break L27}if((hp|0)==392|(hp|0)==368){b7=5276;break L27}c[10058]=hp;if((hp|0)!=345){break}hE(43400);if((c[10850]|0)!=0){break}c[10851]=0;break}else if((hB|0)==3){jr(43280);break}else if((hB|0)==4){hJ(49488,c[12372]|0,c[12373]|0,c[12374]|0,49504);break}else if((hB|0)==5){hp=gv+2|0;c[13898]=hp;L5298:do{if((hp|0)<(c[8272]|0)){L5300:do{if((a[gw+(hp*40&-1)|0]&1)!=0){hF=c[gw+(hp*40&-1)+36>>2]|0;gG=gw+(hp*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(hF|0)){break}if((a[gB+((c[gG>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L5300}}if((nd|0)==1){b7=3885;break L5298}}}while(0);gG=is(U)|0;hF=c[gG>>2]|0;if((hF|0)==1){zU=+(c[gG+8>>2]|0)}else if((hF|0)==2){zU=+h[gG+8>>3]}else if((hF|0)==3){zU=+uz(c[gG+8>>2]|0,0)}else{b7=3879;break L27}if((c[fp>>2]|0)==3){uu(c[fq>>2]|0);c[fp>>2]=1}gG=~~zU;if((gG|0)<1){b7=3884;break L27}zV=gG;zW=c[10824]|0;b7=3888}else{b7=3885}}while(0);L5316:do{if((b7|0)==3885){b7=0;hp=c[10824]|0;if((hp|0)==0){zX=1;zY=0;zZ=0;b7=3892;break}else{z_=1;z$=hp}while(1){if((c[z$+4>>2]|0)!=(z_|0)){zV=z_;zW=hp;b7=3888;break L5316}gG=z_+1|0;hF=c[z$>>2]|0;if((hF|0)==0){zV=gG;zW=hp;b7=3888;break}else{z_=gG;z$=hF}}}}while(0);L5321:do{if((b7|0)==3888){b7=0;if((zW|0)==0){zX=zV;zY=0;zZ=0;b7=3892;break}else{z0=zW;z1=0}while(1){z2=c[z0+4>>2]|0;if((zV|0)<=(z2|0)){break}hp=c[z0>>2]|0;if((hp|0)==0){zX=zV;zY=0;zZ=z0;b7=3892;break L5321}else{z1=z0;z0=hp}}if((zV|0)==(z2|0)){z3=z0}else{zX=zV;zY=z0;zZ=z1;b7=3892}}}while(0);if((b7|0)==3892){b7=0;hp=ut(120)|0;if((hp|0)==0){gk();hF=ut(120)|0;if((hF|0)==0){b7=3894;break L27}else{z4=hF}}else{z4=hp}hp=z4;hF=z4+8|0;c[hF>>2]=-1;c[z4+12>>2]=0;gG=z4+16|0;c[gG>>2]=c[12872];c[gG+4>>2]=c[12873];c[gG+8>>2]=c[12874];c[gG+12>>2]=c[12875];c[gG+16>>2]=c[12876];c[gG+20>>2]=c[12877];c[gG+24>>2]=c[12878];c[gG+28>>2]=c[12879];c[gG+32>>2]=c[12880];c[gG+36>>2]=c[12881];c[gG+40>>2]=c[12882];c[gG+44>>2]=c[12883];c[gG+48>>2]=c[12884];c[gG+52>>2]=c[12885];c[z4+72>>2]=1;h[z4+80>>3]=0.0;c[z4+88>>2]=0;h[z4+96>>3]=15.0;h[z4+104>>3]=90.0;c[z4+112>>2]=0;if((zZ|0)==0){c[10824]=hp}else{c[zZ>>2]=hp}c[hF>>2]=zX;c[z4+4>>2]=zX;c[z4>>2]=zY;z3=hp}hp=c[13898]|0;L5337:do{if((hp|0)<(c[8272]|0)){hF=c[1054]|0;L5339:do{if((a[hF+(hp*40&-1)|0]&1)!=0){gG=c[hF+(hp*40&-1)+36>>2]|0;hK=hF+(hp*40&-1)+32|0;hG=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){b7=3904;break}if((a[hG+((c[hK>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==3904){b7=0;if((hS|0)==1){b7=3905;break L5337}}if((gG|0)<=0){break}nd=0;gC=0;hR=c[hK>>2]|0;while(1){if((a[nd+184456|0]|0)==(a[hG+(nd+hR|0)|0]|0)){z5=hR;z6=gC}else{if((nd|0)!=3){break L5339}z5=hR-1|0;z6=1}gz=nd+1|0;if((gz|0)<(z6+gG|0)){nd=gz;gC=z6;hR=z5}else{break}}if((z6|0)==0){if(!((nd|0)==2|(nd|0)==7)){break}}c[z3+8>>2]=-1;c[z3+12>>2]=0;hR=z3+16|0;c[hR>>2]=c[12872];c[hR+4>>2]=c[12873];c[hR+8>>2]=c[12874];c[hR+12>>2]=c[12875];c[hR+16>>2]=c[12876];c[hR+20>>2]=c[12877];c[hR+24>>2]=c[12878];c[hR+28>>2]=c[12879];c[hR+32>>2]=c[12880];c[hR+36>>2]=c[12881];c[hR+40>>2]=c[12882];c[hR+44>>2]=c[12883];c[hR+48>>2]=c[12884];c[hR+52>>2]=c[12885];c[z3+72>>2]=1;h[z3+80>>3]=0.0;c[z3+88>>2]=0;h[z3+96>>3]=15.0;h[z3+104>>3]=90.0;c[z3+112>>2]=0;c[13898]=(c[13898]|0)+1;break L5337}}while(0);hL(z3+8|0,0)}else{b7=3905}}while(0);if((b7|0)==3905){b7=0;c[z3+8>>2]=-1;c[z3+12>>2]=0;hp=z3+16|0;c[hp>>2]=c[12872];c[hp+4>>2]=c[12873];c[hp+8>>2]=c[12874];c[hp+12>>2]=c[12875];c[hp+16>>2]=c[12876];c[hp+20>>2]=c[12877];c[hp+24>>2]=c[12878];c[hp+28>>2]=c[12879];c[hp+32>>2]=c[12880];c[hp+36>>2]=c[12881];c[hp+40>>2]=c[12882];c[hp+44>>2]=c[12883];c[hp+48>>2]=c[12884];c[hp+52>>2]=c[12885];c[z3+72>>2]=1;h[z3+80>>3]=0.0;c[z3+88>>2]=0;h[z3+96>>3]=15.0;h[z3+104>>3]=90.0;c[z3+112>>2]=0}z7=c[13898]|0;if((z7|0)>=(c[8272]|0)){break}hp=c[1054]|0;if((a[hp+(z7*40&-1)|0]&1)==0){b7=5277;break L27}hF=c[hp+(z7*40&-1)+36>>2]|0;hR=hp+(z7*40&-1)+32|0;hp=c[10036]|0;gC=0;while(1){if((gC|0)>=(hF|0)){break}if((a[hp+((c[hR>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{b7=5278;break L27}}if((gC|0)==1){break}else{b7=5279;break L27}}else if((hB|0)==8){c[13898]=gv+2;jx(-2,1);break}else if((hB|0)==6){hR=gv+2|0;c[13898]=gv+3;hp=c[gw+(hR*40&-1)+36>>2]|0;if(!((a[gw+(hR*40&-1)|0]&1)!=0&(hp|0)>0)){break}hF=0;gG=0;hG=c[gw+(hR*40&-1)+32>>2]|0;while(1){if((a[hF+213440|0]|0)==(a[gB+(hF+hG|0)|0]|0)){z8=hG;z9=gG}else{if((hF|0)!=1){break L44}z8=hG-1|0;z9=1}hR=hF+1|0;if((hR|0)<(z9+hp|0)){hF=hR;gG=z9;hG=z8}else{break}}if((z9|0)==0){if(!((hF|0)==0|(hF|0)==6)){break}}dl(50952,0);break}else if((hB|0)==10){uD(ft|0,51296,192);c[9670]=3;hG=c[8272]|0;if((zm|0)>=(hG|0)){break}if((a[gH]&1)==0){break}gG=c[nh>>2]|0;hp=0;while(1){if((hp|0)>=(gG|0)){b7=4013;break}if((a[gB+((c[gF>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{Aa=0;break}}if((b7|0)==4013){b7=0;if((hp|0)==1){break}else{Aa=0}}while(1){if((Aa|0)>=(gG|0)){b7=4016;break}if((a[gB+((c[gF>>2]|0)+Aa|0)|0]|0)==(a[Aa+198768|0]|0)){Aa=Aa+1|0}else{b7=4017;break}}if((b7|0)==4016){b7=0;if((Aa|0)!=2){b7=4017}}do{if((b7|0)==4017){b7=0;if((gG|0)<=0){break L44}hp=0;nh=0;gH=c[gF>>2]|0;while(1){if((a[hp+116200|0]|0)==(a[gB+(hp+gH|0)|0]|0)){Ab=gH;Ac=nh}else{if((hp|0)!=4){break L44}Ab=gH-1|0;Ac=1}hF=hp+1|0;if((hF|0)<(Ac+gG|0)){hp=hF;nh=Ac;gH=Ab}else{break}}if((Ac|0)!=0){break}if(!((hp|0)==3|(hp|0)==9)){break L44}}}while(0);gG=gv+2|0;c[13898]=gG;if((gG|0)<(hG|0)){Ad=gG;Ae=hG;Af=gw}else{break}while(1){gG=(a[Af+(Ad*40&-1)|0]&1)==0;gF=c[Af+(Ad*40&-1)+36>>2]|0;gH=Af+(Ad*40&-1)+32|0;L5408:do{if(gG){Ag=c[gH>>2]|0;b7=4064}else{nh=c[10036]|0;hF=0;while(1){if((hF|0)>=(gF|0)){b7=4031;break}gC=c[gH>>2]|0;if((a[nh+(gC+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{Ah=gC;break}}if((b7|0)==4031){b7=0;if((hF|0)==1){break L44}Ah=c[gH>>2]|0}if((gF|0)>0){Ai=0;Aj=0;Ak=Ah}else{Ag=Ah;b7=4064;break}while(1){if((a[Ai+197904|0]|0)==(a[nh+(Ai+Ak|0)|0]|0)){Al=Ak;Am=Aj}else{if((Ai|0)!=5){An=0;Ao=0;Ap=Ah;break}Al=Ak-1|0;Am=1}nd=Ai+1|0;if((nd|0)<(Am+gF|0)){Ai=nd;Aj=Am;Ak=Al}else{b7=4038;break}}do{if((b7|0)==4038){b7=0;if((Am|0)==0){if(!((Ai|0)==4|(Ai|0)==9)){An=0;Ao=0;Ap=Ah;break}}c[9670]=3;c[13898]=Ad+1;break L5408}}while(0);while(1){if((a[An+197448|0]|0)==(a[nh+(An+Ap|0)|0]|0)){Aq=Ap;Ar=Ao}else{if((An|0)!=5){As=0;At=0;Au=Ah;break}Aq=Ap-1|0;Ar=1}hF=An+1|0;if((hF|0)<(Ar+gF|0)){An=hF;Ao=Ar;Ap=Aq}else{b7=4045;break}}do{if((b7|0)==4045){b7=0;if((Ar|0)==0){if(!((An|0)==4|(An|0)==9)){As=0;At=0;Au=Ah;break}}c[9670]=4;c[13898]=Ad+1;break L5408}}while(0);while(1){if((a[As+196808|0]|0)==(a[nh+(As+Au|0)|0]|0)){Av=Au;Aw=At}else{if((As|0)!=4){Ax=0;Ay=0;Az=Ah;break}Av=Au-1|0;Aw=1}hF=As+1|0;if((hF|0)<(Aw+gF|0)){As=hF;At=Aw;Au=Av}else{b7=4054;break}}do{if((b7|0)==4054){b7=0;if((Aw|0)==0){if(!((As|0)==3|(As|0)==10)){Ax=0;Ay=0;Az=Ah;break}}c[9670]=1;c[13898]=Ad+1;break L5408}}while(0);while(1){if((a[Ax+196176|0]|0)==(a[nh+(Ax+Az|0)|0]|0)){AA=Az;AB=Ay}else{if((Ax|0)!=7){Ag=Ah;b7=4064;break L5408}AA=Az-1|0;AB=1}hF=Ax+1|0;if((hF|0)<(AB+gF|0)){Ax=hF;Ay=AB;Az=AA}else{break}}if((AB|0)==0){if(!((Ax|0)==6|(Ax|0)==13)){Ag=Ah;b7=4064;break}}c[9670]=2;c[13898]=Ad+1}}while(0);L5461:do{if((b7|0)==4064){b7=0;gH=(Ae|0)>(Ad|0);L5463:do{if(gH){if(gG){break L44}hp=c[10036]|0;nh=0;while(1){if((nh|0)>=(gF|0)){break}if((a[hp+(nh+Ag|0)|0]|0)==(a[nh+195688|0]|0)){nh=nh+1|0}else{break L5463}}if((nh|0)!=3){break}AC=Ad+1|0;c[13898]=AC;if((a[Af+(AC*40&-1)|0]&1)!=0){b7=4079;break L27}hp=is(O)|0;hF=c[hp>>2]|0;if((hF|0)==1){AD=+(c[hp+8>>2]|0)}else if((hF|0)==2){AD=+h[hp+8>>3]}else if((hF|0)==3){AD=+uz(c[hp+8>>2]|0,0)}else{b7=4075;break L27}if((c[fu>>2]|0)==3){uu(c[fv>>2]|0);c[fu>>2]=1}c[9671]=~~AD;break L5461}}while(0);hp=(gF|0)>0;L5481:do{if(hp&(gG^1)){hF=c[10036]|0;nd=0;gC=0;hR=Ag;while(1){if((a[nd+125568|0]|0)==(a[hF+(nd+hR|0)|0]|0)){AE=hR;AF=gC}else{if((nd|0)!=2){break L5481}AE=hR-1|0;AF=1}hK=nd+1|0;if((hK|0)<(AF+gF|0)){nd=hK;gC=AF;hR=AE}else{break}}if((AF|0)==0){if(!((nd|0)==1|(nd|0)==5)){break}}c[fy>>2]=c[9720];c[fy+4>>2]=c[38884>>2];c[fy+8>>2]=c[38888>>2];c[fy+12>>2]=c[38892>>2];c[fy+16>>2]=c[38896>>2];c[fy+20>>2]=c[38900>>2];c[fy+24>>2]=c[38904>>2];c[fy+28>>2]=c[38908>>2];c[fy+32>>2]=c[38912>>2];c[fy+36>>2]=c[38916>>2];jq(S);c[9702]=c[fz>>2];c[38812>>2]=c[fz+4>>2];c[38816>>2]=c[fz+8>>2];c[38820>>2]=c[fz+12>>2];c[9720]=c[fy>>2];c[38884>>2]=c[fy+4>>2];c[38888>>2]=c[fy+8>>2];c[38892>>2]=c[fy+12>>2];c[38896>>2]=c[fy+16>>2];c[38900>>2]=c[fy+20>>2];c[38904>>2]=c[fy+24>>2];c[38908>>2]=c[fy+28>>2];c[38912>>2]=c[fy+32>>2];c[38916>>2]=c[fy+36>>2];c[9700]=c[16630];break L5461}}while(0);L5494:do{if(gH){if(gG){break L44}hR=c[10036]|0;gC=0;while(1){if((gC|0)>=(gF|0)){break}if((a[hR+(gC+Ag|0)|0]|0)==(a[gC+128296|0]|0)){gC=gC+1|0}else{b7=4095;break L5494}}if((gC|0)!=2){b7=4095;break}if((c[9670]|0)!=4){break L44}}else{b7=4095}}while(0);if((b7|0)==4095){b7=0;if(gG){break L44}if(hp){gH=c[10036]|0;hR=0;nd=0;hF=Ag;while(1){if((a[hR+128400|0]|0)==(a[gH+(hR+hF|0)|0]|0)){AG=hF;AH=nd}else{if((hR|0)!=5){break L44}AG=hF-1|0;AH=1}AI=hR+1|0;if((AI|0)<(AH+gF|0)){hR=AI;nd=AH;hF=AG}else{break}}if((AH|0)==0){AJ=AI;b7=4103}else{AK=1}}else{AJ=0;b7=4103}if((b7|0)==4103){b7=0;AK=(AJ|0)==5|(AJ|0)==10}if(!(AK&(c[9670]|0)==4)){break L44}}c[13898]=Ad+1;hF=is(R)|0;nd=c[hF>>2]|0;if((nd|0)==1){AL=+(c[hF+8>>2]|0)}else if((nd|0)==2){AL=+h[hF+8>>3]}else if((nd|0)==3){AL=+uz(c[hF+8>>2]|0,0)}else{b7=4110;break L27}if((c[fw>>2]|0)==3){uu(c[fx>>2]|0);c[fw>>2]=1}h[4840]=AL;if(AL>0.0){break}h[4840]=1.0}}while(0);gF=c[13898]|0;gG=c[8272]|0;if((gF|0)>=(gG|0)){break L44}Ad=gF;Ae=gG;Af=c[1054]|0}}else if((hB|0)==9){hG=gv+2|0;c[13898]=hG;L5530:do{if((hG|0)<(c[8272]|0)){if((a[gw+(hG*40&-1)|0]&1)==0){break}gG=c[gw+(hG*40&-1)+36>>2]|0;gF=gw+(hG*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gG|0)){b7=4120;break}nd=c[gF>>2]|0;if((a[gB+(nd+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{AM=nd;break}}if((b7|0)==4120){b7=0;if((hF|0)==1){b7=4129;break}AM=c[gF>>2]|0}if((gG|0)>0){AN=0;AO=0;AP=AM}else{break}while(1){if((a[AN+184456|0]|0)==(a[gB+(AN+AP|0)|0]|0)){AQ=AP;AR=AO}else{if((AN|0)!=3){AS=0;AT=0;AU=AM;break}AQ=AP-1|0;AR=1}nd=AN+1|0;if((nd|0)<(AR+gG|0)){AN=nd;AO=AR;AP=AQ}else{b7=4127;break}}if((b7|0)==4127){b7=0;if((AR|0)!=0){b7=4129;break}if((AN|0)==2|(AN|0)==7){b7=4129;break}else{AS=0;AT=0;AU=AM}}while(1){if((a[AS+209024|0]|0)==(a[gB+(AS+AU|0)|0]|0)){AV=AU;AW=AT}else{if((AS|0)!=1){break L5530}AV=AU-1|0;AW=1}gF=AS+1|0;if((gF|0)<(AW+gG|0)){AS=gF;AT=AW;AU=AV}else{break}}if((AW|0)==0){if(!((AS|0)==0|(AS|0)==10)){break}}a[30080]=1}else{b7=4129}}while(0);if((b7|0)==4129){b7=0;a[30080]=0}c[13898]=gv+3;break}else if((hB|0)==11){hG=gv+2|0;c[13898]=hG;gG=c[8272]|0;gF=(hG|0)<(gG|0);L5563:do{if(gF){if((a[gw+(hG*40&-1)|0]&1)==0){AX=hG;AY=gG;AZ=gw;break}hF=c[gw+(hG*40&-1)+36>>2]|0;nd=gw+(hG*40&-1)+32|0;hR=0;while(1){if((hR|0)>=(hF|0)){break}if((a[gB+((c[nd>>2]|0)+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{b7=4145;break L5563}}if((hR|0)==1){b7=4144}else{b7=4145}}else{b7=4144}}while(0);if((b7|0)==4144){b7=0;uE(cW|0,0,3);hB=56248;c[hB>>2]=0;c[hB+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[cW]|0;a[56266|0]=a[cW+1|0]|0;a[56267|0]=a[cW+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;b7=4145}if((b7|0)==4145){b7=0;if(gF){AX=hG;AY=gG;AZ=gw}else{break}}while(1){hB=(a[AZ+(AX*40&-1)|0]&1)==0;nd=c[AZ+(AX*40&-1)+36>>2]|0;hF=AZ+(AX*40&-1)+32|0;L5576:do{if(hB){A_=c[hF>>2]|0;b7=4176}else{gH=c[10036]|0;hp=0;while(1){if((hp|0)>=(nd|0)){b7=4151;break}nh=c[hF>>2]|0;if((a[gH+(nh+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{A$=nh;break}}if((b7|0)==4151){b7=0;if((hp|0)==1){break L44}A$=c[hF>>2]|0}if((nd|0)>0){A0=0;A1=0;A2=A$}else{A_=A$;b7=4176;break}while(1){if((a[A0+207888|0]|0)==(a[gH+(A0+A2|0)|0]|0)){A3=A2;A4=A1}else{if((A0|0)!=5){A5=0;A6=0;A7=A$;break}A3=A2-1|0;A4=1}nh=A0+1|0;if((nh|0)<(A4+nd|0)){A0=nh;A1=A4;A2=A3}else{b7=4158;break}}do{if((b7|0)==4158){b7=0;if((A4|0)==0){if(!((A0|0)==4|(A0|0)==10)){A5=0;A6=0;A7=A$;break}}a[56264]=0;c[13898]=AX+1;break L5576}}while(0);while(1){if((a[A5+207040|0]|0)==(a[gH+(A5+A7|0)|0]|0)){A8=A7;A9=A6}else{if((A5|0)!=3){Ba=0;Bb=0;Bc=A$;break}A8=A7-1|0;A9=1}hp=A5+1|0;if((hp|0)<(A9+nd|0)){A5=hp;A6=A9;A7=A8}else{b7=4165;break}}do{if((b7|0)==4165){b7=0;if((A9|0)==0){if(!((A5|0)==2|(A5|0)==8)){Ba=0;Bb=0;Bc=A$;break}}a[56264]=1;c[13898]=AX+1;break L5576}}while(0);while(1){if((a[Ba+206448|0]|0)==(a[gH+(Ba+Bc|0)|0]|0)){Bd=Bc;Be=Bb}else{if((Ba|0)!=5){A_=A$;b7=4176;break L5576}Bd=Bc-1|0;Be=1}hp=Ba+1|0;if((hp|0)<(Be+nd|0)){Ba=hp;Bb=Be;Bc=Bd}else{break}}if((Be|0)!=0){b7=4182;break}if((Ba|0)==4|(Ba|0)==9){b7=4182}else{A_=A$;b7=4176}}}while(0);L5616:do{if((b7|0)==4176){b7=0;L5618:do{if((AY|0)>(AX|0)){if(hB){b7=5292;break L27}hF=c[10036]|0;hR=0;while(1){if((hR|0)>=(nd|0)){b7=4181;break}if((a[hF+(hR+A_|0)|0]|0)==(a[hR+205624|0]|0)){hR=hR+1|0}else{Bf=0;break}}if((b7|0)==4181){b7=0;if((hR|0)==2){b7=4182;break L5616}else{Bf=0}}while(1){if((Bf|0)>=(nd|0)){break}if((a[hF+(Bf+A_|0)|0]|0)==(a[Bf+205008|0]|0)){Bf=Bf+1|0}else{break L5618}}if((Bf|0)!=5){break}c[13898]=AX+1;c[14062]=0;hF=is(L)|0;hR=c[hF>>2]|0;if((hR|0)==1){Bg=+(c[hF+8>>2]|0)}else if((hR|0)==2){Bg=+h[hF+8>>3]}else if((hR|0)==3){Bg=+uz(c[hF+8>>2]|0,0)}else{b7=4197;break L27}if((c[fA>>2]|0)==3){uu(c[fB>>2]|0);c[fA>>2]=1}h[7032]=Bg;break L5616}}while(0);if(!((nd|0)>0&(hB^1))){b7=5293;break L27}hF=c[10036]|0;hR=0;gC=0;gH=A_;while(1){if((a[hR+204616|0]|0)==(a[hF+(hR+gH|0)|0]|0)){Bh=gH;Bi=gC}else{if((hR|0)!=4){Bj=0;Bk=0;Bl=A_;break}Bh=gH-1|0;Bi=1}hp=hR+1|0;if((hp|0)<(Bi+nd|0)){hR=hp;gC=Bi;gH=Bh}else{b7=4207;break}}do{if((b7|0)==4207){b7=0;if((Bi|0)==0){if(!((hR|0)==8|(hR|0)==3)){Bj=0;Bk=0;Bl=A_;break}}c[13898]=AX+1;gH=is(K)|0;gC=c[gH>>2]|0;if((gC|0)==1){Bm=+(c[gH+8>>2]|0)}else if((gC|0)==2){Bm=+h[gH+8>>3]}else if((gC|0)==3){Bm=+uz(c[gH+8>>2]|0,0)}else{b7=4213;break L27}if((c[fE>>2]|0)==3){uu(c[fF>>2]|0);c[fE>>2]=1}h[7032]=Bm;if(Bm<0.0|Bm>1.0){b7=4217;break L27}c[14062]=1;break L5616}}while(0);while(1){if((a[Bj+204096|0]|0)==(a[hF+(Bj+Bl|0)|0]|0)){Bn=Bl;Bo=Bk}else{if((Bj|0)!=6){Bp=0;Bq=0;Br=A_;break}Bn=Bl-1|0;Bo=1}hR=Bj+1|0;if((hR|0)<(Bo+nd|0)){Bj=hR;Bk=Bo;Bl=Bn}else{b7=4223;break}}do{if((b7|0)==4223){b7=0;if((Bo|0)==0){if(!((Bj|0)==12|(Bj|0)==5)){Bp=0;Bq=0;Br=A_;break}}c[13898]=AX+1;c[14068]=252;break L5616}}while(0);while(1){if((a[Bp+203848|0]|0)==(a[hF+(Bp+Br|0)|0]|0)){Bs=Br;Bt=Bq}else{if((Bp|0)!=7){Bu=0;Bv=0;Bw=A_;break}Bs=Br-1|0;Bt=1}hR=Bp+1|0;if((hR|0)<(Bt+nd|0)){Bp=hR;Bq=Bt;Br=Bs}else{b7=4230;break}}do{if((b7|0)==4230){b7=0;if((Bt|0)==0){if(!((Bp|0)==11|(Bp|0)==6)){Bu=0;Bv=0;Bw=A_;break}}c[13898]=AX+1;c[14068]=257;break L5616}}while(0);while(1){if((a[Bu+203640|0]|0)==(a[hF+(Bu+Bw|0)|0]|0)){Bx=Bw;By=Bv}else{if((Bu|0)!=3){Bz=0;BA=0;BB=A_;break}Bx=Bw-1|0;By=1}hR=Bu+1|0;if((hR|0)<(By+nd|0)){Bu=hR;Bv=By;Bw=Bx}else{b7=4237;break}}do{if((b7|0)==4237){b7=0;if((By|0)==0){if(!((Bu|0)==10|(Bu|0)==2)){Bz=0;BA=0;BB=A_;break}}c[13898]=AX+1;hR=is(N)|0;gH=c[hR>>2]|0;if((gH|0)==1){BC=+(c[hR+8>>2]|0)}else if((gH|0)==2){BC=+h[hR+8>>3]}else if((gH|0)==3){BC=+uz(c[hR+8>>2]|0,0)}else{b7=4243;break L27}if((c[fC>>2]|0)==3){uu(c[fD>>2]|0);c[fC>>2]=1}h[7035]=BC;if(BC<0.0){b7=4247;break L27}else{break L5616}}}while(0);while(1){if((a[Bz+203048|0]|0)==(a[hF+(Bz+BB|0)|0]|0)){BD=BB;BE=BA}else{if((Bz|0)!=3){BF=0;BG=0;BH=A_;break}BD=BB-1|0;BE=1}hR=Bz+1|0;if((hR|0)<(BE+nd|0)){Bz=hR;BA=BE;BB=BD}else{b7=4252;break}}do{if((b7|0)==4252){b7=0;if((BE|0)==0){if(!((Bz|0)==6|(Bz|0)==2)){BF=0;BG=0;BH=A_;break}}hR=AX+1|0;c[13898]=hR;if((AY|0)<=(hR|0)){b7=5288;break L27}if((a[AZ+(hR*40&-1)|0]&1)==0){b7=5289;break L27}gH=c[AZ+(hR*40&-1)+36>>2]|0;gC=AZ+(hR*40&-1)+32|0;hR=0;while(1){if((hR|0)>=(gH|0)){b7=4259;break}if((a[hF+((c[gC>>2]|0)+hR|0)|0]|0)==(a[hR+150208|0]|0)){hR=hR+1|0}else{BI=0;b7=4261;break}}do{if((b7|0)==4259){b7=0;if((hR|0)!=3){BI=0;b7=4261;break}c[14072]=0}}while(0);L5721:do{if((b7|0)==4261){while(1){b7=0;if((BI|0)>=(gH|0)){b7=4263;break}if((a[hF+((c[gC>>2]|0)+BI|0)|0]|0)==(a[BI+202352|0]|0)){BI=BI+1|0;b7=4261}else{BJ=0;break}}do{if((b7|0)==4263){b7=0;if((BI|0)!=1){BJ=0;break}c[14072]=2;break L5721}}while(0);while(1){if((BJ|0)>=(gH|0)){b7=4267;break}if((a[hF+((c[gC>>2]|0)+BJ|0)|0]|0)==(a[BJ+108208|0]|0)){BJ=BJ+1|0}else{BK=0;break}}do{if((b7|0)==4267){b7=0;if((BJ|0)!=2){BK=0;break}c[14072]=3;break L5721}}while(0);while(1){if((BK|0)>=(gH|0)){break}if((a[hF+((c[gC>>2]|0)+BK|0)|0]|0)==(a[BK+201e3|0]|0)){BK=BK+1|0}else{b7=5290;break L27}}if((BK|0)!=4){b7=5291;break L27}c[14072]=1}}while(0);c[13898]=AX+2;break L5616}}while(0);while(1){if((a[BF+199432|0]|0)==(a[hF+(BF+BH|0)|0]|0)){BL=BH;BM=BG}else{if((BF|0)!=2){BN=0;BO=0;BP=A_;break}BL=BH-1|0;BM=1}gC=BF+1|0;if((gC|0)<(BM+nd|0)){BF=gC;BG=BM;BH=BL}else{b7=4279;break}}do{if((b7|0)==4279){b7=0;if((BM|0)==0){if(!((BF|0)==1|(BF|0)==6)){BN=0;BO=0;BP=A_;break}}a[56292]=1;c[13898]=AX+1;break L5616}}while(0);while(1){if((a[BN+199064|0]|0)==(a[hF+(BN+BP|0)|0]|0)){BQ=BP;BR=BO}else{if((BN|0)!=2){b7=5294;break L27}BQ=BP-1|0;BR=1}gC=BN+1|0;if((gC|0)<(BR+nd|0)){BN=gC;BO=BR;BP=BQ}else{break}}if((BR|0)==0){if(!((BN|0)==1|(BN|0)==8)){b7=5295;break L27}}a[56292]=0;c[13898]=AX+1}}while(0);if((b7|0)==4182){b7=0;c[13898]=AX+1;nd=is(M)|0;hB=c[nd>>2]|0;if((hB|0)==1){BS=+(c[nd+8>>2]|0)}else if((hB|0)==2){BS=+h[nd+8>>3]}else if((hB|0)==3){BS=+uz(c[nd+8>>2]|0,0)}else{b7=4186;break L27}if((c[fG>>2]|0)==3){uu(c[fH>>2]|0);c[fG>>2]=1}c[14067]=~~BS-1}nd=c[13898]|0;hB=c[8272]|0;if((nd|0)>=(hB|0)){break L44}AX=nd;AY=hB;AZ=c[1054]|0}}else{b7=4290;break L27}}else if((gD|0)==84){c[13898]=gv+1;a[46752]=1}else if((gD|0)==86){gG=gv+1|0;c[13898]=gG;hG=c[3526]|0;if((hG|0)==0){BT=gG}else{az(hG|0);c[3526]=0;BT=c[13898]|0}L5778:do{if((BT|0)<(c[8272]|0)){hG=c[1054]|0;L5780:do{if((a[hG+(BT*40&-1)|0]&1)!=0){gG=c[hG+(BT*40&-1)+36>>2]|0;gF=hG+(BT*40&-1)+32|0;hB=c[10036]|0;nd=0;while(1){if((nd|0)>=(gG|0)){break}if((a[hB+((c[gF>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L5780}}if((nd|0)==1){break L5778}}}while(0);a[14176]=1;is(J);a[14176]=0;if((c[fI>>2]|0)!=3){c[13898]=BT;break}hG=c[fJ>>2]|0;if((hG|0)==0){break}gF=bF(hG|0,137896)|0;c[3526]=gF;if((gF|0)==0){b7=4304;break L27}uu(hG)}}while(0);a[14112]=1}else if((gD|0)==87){BU=gv+1|0;c[13898]=BU;if((a[33512]&1)!=0){b7=4308;break L27}L5795:do{if((BU|0)<(c[8272]|0)){L5797:do{if((a[gw+(BU*40&-1)|0]&1)!=0){hG=c[gw+(BU*40&-1)+36>>2]|0;gF=gw+(BU*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(hG|0)){b7=4314;break}if((a[gB+((c[gF>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{BV=0;break}}if((b7|0)==4314){b7=0;if((hB|0)==1){break L5795}else{BV=0}}while(1){if((BV|0)>=(hG|0)){break}if((a[gB+((c[gF>>2]|0)+BV|0)|0]|0)==(a[BV+216664|0]|0)){BV=BV+1|0}else{break L5797}}if((BV|0)!=4){break}hz(a[37400]&1);c[13898]=(c[13898]|0)+1;break L44}}while(0);hO(1);c[8026]=0;do{if((a[14080]&1)!=0){if(a[13032]|0){gF=c[(c[3524]|0)+104>>2]|0;if((gF|0)!=0){cS[gF&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){break}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);gF=c[13898]|0;L5823:do{if((c[8272]|0)>(gF|0)){hG=c[1054]|0;if((a[hG+(gF*40&-1)|0]&1)==0){break}hB=c[hG+(gF*40&-1)+36>>2]|0;nd=hG+(gF*40&-1)+32|0;hG=c[10036]|0;gG=0;while(1){if((gG|0)>=(hB|0)){break}if((a[hG+((c[nd>>2]|0)+gG|0)|0]|0)==(a[gG+216216|0]|0)){gG=gG+1|0}else{break L5823}}if((gG|0)!=3){break}hD();c[13898]=(c[13898]|0)+1;break L44}}while(0);c[3524]=0;gF=lz()|0;c[3524]=gF;a[13048]=0;if((gF|0)==0){break L44}cS[c[gF+32>>2]&511]();if((a[37400]&1)==0|(a[13048]|0)==0){break L44}gF=c[m>>2]|0;cf(gF|0,215680,(v=i,i=i+8|0,c[v>>2]=13048,v)|0);break L44}}while(0);ls();a[25280]=0}else if((gD|0)==88){gF=c[8272]|0;BW=gv+1|0;c[13898]=BW;if((BW|0)>=(gF|0)){break}nd=(a[gw+(BW*40&-1)|0]&1)==0;L5837:do{if(nd){BX=1}else{hG=c[gw+(BW*40&-1)+36>>2]|0;hB=gw+(BW*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hG|0)){break}if((a[gB+((c[hB>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{BX=1;break L5837}}BX=(hF|0)!=1}}while(0);hB=c[3524]|0;if(!(BX&(hB|0)!=0)){break}hG=c[gw+(BW*40&-1)+36>>2]|0;gC=c[gw+(BW*40&-1)+32>>2]|0;L5845:do{if(nd){b7=4406}else{gH=(hG|0)>0;L5847:do{if(gH){hR=0;hp=0;nh=gC;while(1){if((a[hR+122880|0]|0)==(a[gB+(hR+nh|0)|0]|0)){BY=nh;BZ=hp}else{if((hR|0)!=3){B_=0;B$=0;B0=gC;b7=4354;break}BY=nh-1|0;BZ=1}hK=hR+1|0;if((hK|0)<(BZ+hG|0)){hR=hK;hp=BZ;nh=BY}else{b7=4352;break}}do{if((b7|0)==4352){b7=0;if((BZ|0)!=0){break}if(!((hR|0)==2|(hR|0)==8)){B_=0;B$=0;B0=gC;b7=4354}}}while(0);do{if((b7|0)==4354){while(1){b7=0;if((a[B_+121536|0]|0)==(a[gB+(B_+B0|0)|0]|0)){B1=B0;B2=B$}else{if((B_|0)!=5){B3=0;break L5847}B1=B0-1|0;B2=1}hR=B_+1|0;if((hR|0)<(B2+hG|0)){B_=hR;B$=B2;B0=B1;b7=4354}else{break}}if((B2|0)!=0){break}if(!((B_|0)==4|(B_|0)==10)){B3=0;break L5847}}}while(0);hR=gv+2|0;c[8272]=(gF|0)<(hR|0)?gF:hR;if((c[hB+156>>2]|0)!=0){b7=4411;break L5845}c[13898]=hR;break L5845}else{B3=0}}while(0);while(1){if((B3|0)>=(hG|0)){b7=4364;break}if((a[gB+(B3+gC|0)|0]|0)==(a[B3+124352|0]|0)){B3=B3+1|0}else{B4=0;b7=4365;break}}if((b7|0)==4364){b7=0;if((B3|0)!=4){B4=0;b7=4365}}do{if((b7|0)==4365){while(1){b7=0;if((B4|0)>=(hG|0)){b7=4367;break}if((a[gB+(B4+gC|0)|0]|0)==(a[B4+223712|0]|0)){B4=B4+1|0;b7=4365}else{B5=0;break}}if((b7|0)==4367){b7=0;if((B4|0)==5){break}else{B5=0}}while(1){if((B5|0)>=(hG|0)){b7=4372;break}if((a[gB+(B5+gC|0)|0]|0)==(a[B5+128096|0]|0)){B5=B5+1|0}else{B6=0;break}}do{if((b7|0)==4372){b7=0;if((B5|0)!=9){B6=0;break}if((c[hB+96>>2]&4096|0)!=0){b7=4411;break L5845}c[13898]=gv+2;hF=is(H)|0;hR=c[hF>>2]|0;if((hR|0)==3){nh=c[hF+8>>2]|0;uz(nh,0)}else if(!((hR|0)==1|(hR|0)==2)){b7=4376;break L27}if((c[fM>>2]|0)!=3){break L5845}uu(c[fN>>2]|0);c[fM>>2]=1;break L5845}}while(0);while(1){if((B6|0)>=(hG|0)){b7=4381;break}if((a[gB+(B6+gC|0)|0]|0)==(a[B6+128296|0]|0)){B6=B6+1|0}else{b7=4382;break}}if((b7|0)==4381){b7=0;if((B6|0)!=2){b7=4382}}L5895:do{if((b7|0)==4382){b7=0;L5897:do{if(gH){hR=0;nh=0;hF=gC;while(1){if((a[hR+128400|0]|0)==(a[gB+(hR+hF|0)|0]|0)){B7=hF;B8=nh}else{if((hR|0)!=5){B9=0;Ca=0;Cb=gC;break}B7=hF-1|0;B8=1}hp=hR+1|0;if((hp|0)<(B8+hG|0)){hR=hp;nh=B8;hF=B7}else{b7=4387;break}}if((b7|0)==4387){b7=0;if((B8|0)!=0){break L5895}if((hR|0)==4|(hR|0)==9){break L5895}else{B9=0;Ca=0;Cb=gC}}while(1){if((a[B9+217752|0]|0)==(a[gB+(B9+Cb|0)|0]|0)){Cc=Cb;Cd=Ca}else{if((B9|0)!=4){Ce=0;b7=4401;break L5897}Cc=Cb-1|0;Cd=1}hF=B9+1|0;if((hF|0)<(Cd+hG|0)){B9=hF;Ca=Cd;Cb=Cc}else{break}}if((Cd|0)!=0){break}if(!((B9|0)==3|(B9|0)==6)){Ce=0;b7=4401}}else{Ce=0;b7=4401}}while(0);if((b7|0)==4401){while(1){b7=0;if((Ce|0)>=(hG|0)){break}if((a[gB+(Ce+gC|0)|0]|0)==(a[Ce+131504|0]|0)){Ce=Ce+1|0;b7=4401}else{b7=4406;break L5845}}if((Ce|0)!=5){b7=4406;break L5845}}if((c[hB+96>>2]&256|0)!=0){b7=4411;break L5845}c[13898]=gv+2;break L5845}}while(0);if((c[hB+96>>2]&2048|0)!=0){b7=4411;break L5845}c[13898]=gv+2;hR=is(I)|0;hF=c[hR>>2]|0;if((hF|0)==3){nh=c[hR+8>>2]|0;uz(nh,0)}else if(!((hF|0)==1|(hF|0)==2)){b7=4392;break L27}if((c[fK>>2]|0)!=3){break L5845}uu(c[fL>>2]|0);c[fK>>2]=1;break L5845}}while(0);gH=gv+3|0;c[8272]=(gF|0)<(gH|0)?gF:gH;if((c[hB+88>>2]|0)!=0){b7=4411;break}c[13898]=gH}}while(0);if((b7|0)==4406){b7=0;if((aY(c[hB>>2]|0,218960)|0)!=0|nd){b7=5296;break L27}else{Cf=0}while(1){if((Cf|0)>=(hG|0)){break}if((a[gB+(Cf+gC|0)|0]|0)==(a[Cf+218488|0]|0)){Cf=Cf+1|0}else{b7=5297;break L27}}if((Cf|0)==5&(gF|0)==4){b7=4411}else{b7=5298;break L27}}if((b7|0)==4411){b7=0;a[13048]=0;cS[c[hB+32>>2]&511]()}c[8272]=gF}else if((gD|0)==89){gC=gv+1|0;c[13898]=gC;hG=c[8272]|0;nd=(gC|0)<(hG|0);L5940:do{if(nd){if((a[gw+(gC*40&-1)|0]&1)==0){Cg=0;Ch=0;Ci=gC;Cj=hG;Ck=gw;b7=4421;break}gH=c[gw+(gC*40&-1)+36>>2]|0;hF=gw+(gC*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(gH|0)){break}if((a[gB+((c[hF>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{b7=4420;break L5940}}if((nh|0)==1){b7=4419}else{b7=4420}}else{b7=4419}}while(0);if((b7|0)==4419){b7=0;a[65072]=1;a[65760]=1;a[66448]=1;a[67136]=1;a[67824]=1;a[68512]=1;a[69200]=1;a[69888]=1;a[70576]=1;a[71264]=1;a[71952]=1;b7=4420}if((b7|0)==4420){b7=0;if(nd){Cg=0;Ch=0;Ci=gC;Cj=hG;Ck=gw;b7=4421}else{Cl=0;Cm=0}}L5951:do{if((b7|0)==4421){while(1){b7=0;gF=(a[Ck+(Ci*40&-1)|0]&1)==0;hB=c[Ck+(Ci*40&-1)+36>>2]|0;hF=Ck+(Ci*40&-1)+32|0;L5954:do{if(gF){Cn=c[hF>>2]|0;b7=4620}else{gH=c[10036]|0;hR=0;while(1){if((hR|0)>=(hB|0)){b7=4426;break}hp=c[hF>>2]|0;if((a[gH+(hp+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{Co=hp;break}}if((b7|0)==4426){b7=0;if((hR|0)==1){Cl=Cg;Cm=Ch;break L5951}Co=c[hF>>2]|0}if((hB|0)>0){Cp=0;Cq=0;Cr=Co}else{Cn=Co;b7=4620;break}while(1){if((a[Cp+116896|0]|0)==(a[gH+(Cp+Cr|0)|0]|0)){Cs=Cr;Ct=Cq}else{if((Cp|0)!=2){Cu=0;Cv=0;Cw=Co;break}Cs=Cr-1|0;Ct=1}hp=Cp+1|0;if((hp|0)<(Ct+hB|0)){Cp=hp;Cq=Ct;Cr=Cs}else{b7=4434;break}}do{if((b7|0)==4434){b7=0;if((Ct|0)==0){if(!((Cp|0)==1|(Cp|0)==4)){Cu=0;Cv=0;Cw=Co;break}}c[16229]=c[16229]&-4|2;c[16401]=c[16401]&-4|2;c[16573]=c[16573]&-4|2;c[16745]=c[16745]&-4|2;c[16917]=c[16917]&-4|2;c[17089]=c[17089]&-4|2;c[17261]=c[17261]&-4|2;c[17433]=c[17433]&-4|2;c[17605]=c[17605]&-4|2;c[17777]=c[17777]&-4|2;c[17949]=c[17949]&-4|2;c[13898]=Ci+1;Cx=1;Cy=Cg;break L5954}}while(0);while(1){if((a[Cu+141136|0]|0)==(a[gH+(Cu+Cw|0)|0]|0)){Cz=Cw;CA=Cv}else{if((Cu|0)!=2){CB=0;CC=0;CD=Co;break}Cz=Cw-1|0;CA=1}hR=Cu+1|0;if((hR|0)<(CA+hB|0)){Cu=hR;Cv=CA;Cw=Cz}else{b7=4441;break}}do{if((b7|0)==4441){b7=0;if((CA|0)==0){if(!((Cu|0)==1|(Cu|0)==6)){CB=0;CC=0;CD=Co;break}}c[16229]=c[16229]&-4|1;c[16401]=c[16401]&-4|1;c[16573]=c[16573]&-4|1;c[16745]=c[16745]&-4|1;c[16917]=c[16917]&-4|1;c[17089]=c[17089]&-4|1;c[17261]=c[17261]&-4|1;c[17433]=c[17433]&-4|1;c[17605]=c[17605]&-4|1;c[17777]=c[17777]&-4|1;c[17949]=c[17949]&-4|1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[CB+115048|0]|0)==(a[gH+(CB+CD|0)|0]|0)){CE=CD;CF=CC}else{if((CB|0)!=2){CG=0;CH=0;CI=Co;break}CE=CD-1|0;CF=1}hR=CB+1|0;if((hR|0)<(CF+hB|0)){CB=hR;CC=CF;CD=CE}else{b7=4450;break}}do{if((b7|0)==4450){b7=0;if((CF|0)==0){if(!((CB|0)==1|(CB|0)==6)){CG=0;CH=0;CI=Co;break}}c[16229]=c[16229]|4;c[16401]=c[16401]|4;c[16573]=c[16573]|4;c[16745]=c[16745]|4;c[16917]=c[16917]|4;c[17089]=c[17089]|4;c[17261]=c[17261]|4;c[17433]=c[17433]|4;c[17605]=c[17605]|4;c[17777]=c[17777]|4;c[17949]=c[17949]|4;c[13898]=Ci+1;Cx=Ch;Cy=1;break L5954}}while(0);while(1){if((a[CG+114024|0]|0)==(a[gH+(CG+CI|0)|0]|0)){CJ=CI;CK=CH}else{if((CG|0)!=4){CL=0;CM=0;CN=Co;break}CJ=CI-1|0;CK=1}hR=CG+1|0;if((hR|0)<(CK+hB|0)){CG=hR;CH=CK;CI=CJ}else{b7=4457;break}}do{if((b7|0)==4457){b7=0;if((CK|0)==0){if(!((CG|0)==3|(CG|0)==8)){CL=0;CM=0;CN=Co;break}}c[16229]=c[16229]&-5;c[16401]=c[16401]&-5;c[16573]=c[16573]&-5;c[16745]=c[16745]&-5;c[16917]=c[16917]&-5;c[17089]=c[17089]&-5;c[17261]=c[17261]&-5;c[17433]=c[17433]&-5;c[17605]=c[17605]&-5;c[17777]=c[17777]&-5;c[17949]=c[17949]&-5;c[13898]=Ci+1;Cx=Ch;Cy=1;break L5954}}while(0);while(1){if((a[CL+110600|0]|0)==(a[gH+(CL+CN|0)|0]|0)){CO=CN;CP=CM}else{if((CL|0)!=2){CQ=0;CR=0;CS=Co;break}CO=CN-1|0;CP=1}hR=CL+1|0;if((hR|0)<(CP+hB|0)){CL=hR;CM=CP;CN=CO}else{b7=4464;break}}do{if((b7|0)==4464){b7=0;if((CP|0)==0){if(!((CL|0)==1|(CL|0)==7)){CQ=0;CR=0;CS=Co;break}}a[65072]=1;a[65760]=1;a[66448]=1;a[67136]=1;a[67824]=1;a[68512]=1;a[69200]=1;a[69888]=1;a[70576]=1;a[71264]=1;a[71952]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[CQ+107800|0]|0)==(a[gH+(CQ+CS|0)|0]|0)){CT=CS;CU=CR}else{if((CQ|0)!=3){CV=0;CW=0;CX=Co;break}CT=CS-1|0;CU=1}hR=CQ+1|0;if((hR|0)<(CU+hB|0)){CQ=hR;CR=CU;CS=CT}else{b7=4471;break}}do{if((b7|0)==4471){b7=0;if((CU|0)==0){if(!((CQ|0)==2|(CQ|0)==8)){CV=0;CW=0;CX=Co;break}}a[65072]=0;a[65760]=0;a[66448]=0;a[67136]=0;a[67824]=0;a[68512]=0;a[69200]=0;a[69888]=0;a[70576]=0;a[71264]=0;a[71952]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[CV+106864|0]|0)==(a[gH+(CV+CX|0)|0]|0)){CY=CX;CZ=CW}else{if((CV|0)!=2){C_=0;C$=0;C0=Co;break}CY=CX-1|0;CZ=1}hR=CV+1|0;if((hR|0)<(CZ+hB|0)){CV=hR;CW=CZ;CX=CY}else{b7=4478;break}}do{if((b7|0)==4478){b7=0;if((CZ|0)==0){if(!((CV|0)==5|(CV|0)==1)){C_=0;C$=0;C0=Co;break}}hR=Ci+1|0;c[13898]=hR;hp=c[Ck+(hR*40&-1)+36>>2]|0;L6041:do{if((a[Ck+(hR*40&-1)|0]&1)!=0&(hp|0)>0){gG=0;hK=0;hS=c[Ck+(hR*40&-1)+32>>2]|0;while(1){if((a[gG+184456|0]|0)==(a[gH+(gG+hS|0)|0]|0)){C1=hS;C2=hK}else{if((gG|0)!=3){break L6041}C1=hS-1|0;C2=1}gz=gG+1|0;if((gz|0)<(C2+hp|0)){gG=gz;hK=C2;hS=C1}else{break}}if((C2|0)==0){if(!((gG|0)==2|(gG|0)==7)){break}}h[8132]=1.0;h[8133]=.5;h[8218]=1.0;h[8219]=.5;h[8304]=1.0;h[8305]=.5;h[8390]=1.0;h[8391]=.5;h[8476]=1.0;h[8477]=.5;h[8562]=1.0;h[8563]=.5;h[8648]=1.0;h[8649]=.5;h[8734]=1.0;h[8735]=.5;h[8820]=1.0;h[8821]=.5;h[8906]=1.0;h[8907]=.5;h[8992]=1.0;h[8993]=.5;c[13898]=Ci+2;Cx=Ch;Cy=Cg;break L5954}}while(0);hp=is(C)|0;hR=c[hp>>2]|0;if((hR|0)==1){C3=+(c[hp+8>>2]|0)}else if((hR|0)==2){C3=+h[hp+8>>3]}else if((hR|0)==3){C3=+uz(c[hp+8>>2]|0,0)}else{b7=4493;break L27}if((c[fV>>2]|0)==3){uu(c[fW>>2]|0);c[fV>>2]=1}hp=c[13898]|0;L6062:do{if((c[8272]|0)>(hp|0)){hR=c[1054]|0;if((a[hR+(hp*40&-1)|0]&1)==0){b7=4509;break}hS=c[hR+(hp*40&-1)+36>>2]|0;hK=hR+(hp*40&-1)+32|0;hR=c[10036]|0;gz=0;while(1){if((gz|0)>=(hS|0)){break}if((a[hR+((c[hK>>2]|0)+gz|0)|0]|0)==(a[gz+148464|0]|0)){gz=gz+1|0}else{b7=4509;break L6062}}if((gz|0)!=1){b7=4509;break}c[13898]=hp+1;hK=is(B)|0;hR=c[hK>>2]|0;if((hR|0)==1){C4=+(c[hK+8>>2]|0)}else if((hR|0)==2){C4=+h[hK+8>>3]}else if((hR|0)==3){C4=+uz(c[hK+8>>2]|0,0)}else{b7=4506;break L27}if((c[fX>>2]|0)!=3){C5=C4;break}uu(c[fY>>2]|0);c[fX>>2]=1;C5=C4}else{b7=4509}}while(0);if((b7|0)==4509){b7=0;C5=C3*.5}h[8132]=C3;h[8133]=C5;h[8218]=C3;h[8219]=C5;h[8304]=C3;h[8305]=C5;h[8390]=C3;h[8391]=C5;h[8476]=C3;h[8477]=C5;h[8562]=C3;h[8563]=C5;h[8648]=C3;h[8649]=C5;h[8734]=C3;h[8735]=C5;h[8820]=C3;h[8821]=C5;h[8906]=C3;h[8907]=C5;h[8992]=C3;h[8993]=C5;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[C_+104840|0]|0)==(a[gH+(C_+C0|0)|0]|0)){C6=C0;C7=C$}else{if((C_|0)!=2){C8=0;C9=0;Da=Co;break}C6=C0-1|0;C7=1}hp=C_+1|0;if((hp|0)<(C7+hB|0)){C_=hp;C$=C7;C0=C6}else{b7=4515;break}}do{if((b7|0)==4515){b7=0;if((C7|0)==0){if(!((C_|0)==1|(C_|0)==6)){C8=0;C9=0;Da=Co;break}}c[16258]=-270;c[16430]=-270;c[16602]=-270;c[16774]=-270;c[16946]=-270;c[17118]=-270;c[17290]=-270;c[17462]=-270;c[17634]=-270;c[17806]=-270;c[17978]=-270;hp=Ci+1|0;c[13898]=hp;if((Cj|0)<=(hp|0)){Cx=Ch;Cy=Cg;break L5954}if((a[Ck+(hp*40&-1)|0]&1)==0){Cx=Ch;Cy=Cg;break L5954}hK=c[Ck+(hp*40&-1)+36>>2]|0;hR=Ck+(hp*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hK|0)){break}if((a[gH+((c[hR>>2]|0)+hp|0)|0]|0)==(a[hp+163312|0]|0)){hp=hp+1|0}else{Cx=Ch;Cy=Cg;break L5954}}if((hp|0)!=2){Cx=Ch;Cy=Cg;break L5954}c[13898]=Ci+2;hR=is(D)|0;hK=c[hR>>2]|0;if((hK|0)==1){Db=+(c[hR+8>>2]|0)}else if((hK|0)==2){Db=+h[hR+8>>3]}else if((hK|0)==3){Db=+uz(c[hR+8>>2]|0,0)}else{b7=4527;break L27}if((c[fT>>2]|0)==3){uu(c[fU>>2]|0);c[fT>>2]=1}hR=~~Db;c[16258]=hR;c[16430]=hR;c[16602]=hR;c[16774]=hR;c[16946]=hR;c[17118]=hR;c[17290]=hR;c[17462]=hR;c[17634]=hR;c[17806]=hR;c[17978]=hR;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[C8+104240|0]|0)==(a[gH+(C8+Da|0)|0]|0)){Dc=Da;Dd=C9}else{if((C8|0)!=4){De=0;Df=0;Dg=Co;break}Dc=Da-1|0;Dd=1}hR=C8+1|0;if((hR|0)<(Dd+hB|0)){C8=hR;C9=Dd;Da=Dc}else{b7=4535;break}}do{if((b7|0)==4535){b7=0;if((Dd|0)==0){if(!((C8|0)==3|(C8|0)==8)){De=0;Df=0;Dg=Co;break}}c[16258]=0;c[16430]=0;c[16602]=0;c[16774]=0;c[16946]=0;c[17118]=0;c[17290]=0;c[17462]=0;c[17634]=0;c[17806]=0;c[17978]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[De+149696|0]|0)==(a[gH+(De+Dg|0)|0]|0)){Dh=Dg;Di=Df}else{if((De|0)!=1){Dj=0;Dk=0;Dl=Co;break}Dh=Dg-1|0;Di=1}hR=De+1|0;if((hR|0)<(Di+hB|0)){De=hR;Df=Di;Dg=Dh}else{b7=4542;break}}do{if((b7|0)==4542){b7=0;if((Di|0)==0){if(!((De|0)==0|(De|0)==4)){Dj=0;Dk=0;Dl=Co;break}}c[16282]=0;a[65272]=1;c[16454]=0;a[65960]=1;c[16626]=0;a[66648]=1;c[16798]=0;a[67336]=1;c[16970]=0;a[68024]=1;c[17142]=0;a[68712]=1;c[17314]=0;a[69400]=1;c[17486]=0;a[70088]=1;c[17658]=0;a[70776]=1;c[17830]=0;a[71464]=1;c[18002]=0;a[72152]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[Dj+179896|0]|0)==(a[gH+(Dj+Dl|0)|0]|0)){Dm=Dl;Dn=Dk}else{if((Dj|0)!=1){Do=0;Dp=0;Dq=Co;b7=4551;break}Dm=Dl-1|0;Dn=1}hR=Dj+1|0;if((hR|0)<(Dn+hB|0)){Dj=hR;Dk=Dn;Dl=Dm}else{b7=4549;break}}do{if((b7|0)==4549){b7=0;if((Dn|0)!=0){break}if(!((Dj|0)==0|(Dj|0)==6)){Do=0;Dp=0;Dq=Co;b7=4551}}}while(0);do{if((b7|0)==4551){while(1){b7=0;if((a[Do+149304|0]|0)==(a[gH+(Do+Dq|0)|0]|0)){Dr=Dq;Ds=Dp}else{if((Do|0)!=1){Dt=0;Du=0;Dv=Co;break}Dr=Dq-1|0;Ds=1}hR=Do+1|0;if((hR|0)<(Ds+hB|0)){Do=hR;Dp=Ds;Dq=Dr;b7=4551}else{b7=4555;break}}if((b7|0)==4555){b7=0;if((Ds|0)!=0){break}if((Do|0)==0|(Do|0)==6){break}else{Dt=0;Du=0;Dv=Co}}while(1){if((a[Dt+101272|0]|0)==(a[gH+(Dt+Dv|0)|0]|0)){Dw=Dv;Dx=Du}else{if((Dt|0)!=2){Dy=0;Dz=0;DA=Co;break}Dw=Dv-1|0;Dx=1}hp=Dt+1|0;if((hp|0)<(Dx+hB|0)){Dt=hp;Du=Dx;Dv=Dw}else{b7=4562;break}}do{if((b7|0)==4562){b7=0;if((Dx|0)==0){if(!((Dt|0)==1|(Dt|0)==5)){Dy=0;Dz=0;DA=Co;break}}c[16282]=2;a[65272]=1;c[16454]=2;a[65960]=1;c[16626]=2;a[66648]=1;c[16798]=2;a[67336]=1;c[16970]=2;a[68024]=1;c[17142]=2;a[68712]=1;c[17314]=2;a[69400]=1;c[17486]=2;a[70088]=1;c[17658]=2;a[70776]=1;c[17830]=2;a[71464]=1;c[18002]=2;a[72152]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[Dy+100712|0]|0)==(a[gH+(Dy+DA|0)|0]|0)){DB=DA;DC=Dz}else{if((Dy|0)!=5){DD=0;DE=0;DF=Co;break}DB=DA-1|0;DC=1}hp=Dy+1|0;if((hp|0)<(DC+hB|0)){Dy=hp;Dz=DC;DA=DB}else{b7=4569;break}}do{if((b7|0)==4569){b7=0;if((DC|0)==0){if(!((Dy|0)==4|(Dy|0)==11)){DD=0;DE=0;DF=Co;break}}a[65272]=0;a[65960]=0;a[66648]=0;a[67336]=0;a[68024]=0;a[68712]=0;a[69400]=0;a[70088]=0;a[70776]=0;a[71464]=0;a[72152]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DD+152064|0]|0)==(a[gH+(DD+DF|0)|0]|0)){DG=DF;DH=DE}else{if((DD|0)!=3){DI=0;DJ=0;DK=Co;break}DG=DF-1|0;DH=1}hp=DD+1|0;if((hp|0)<(DH+hB|0)){DD=hp;DE=DH;DF=DG}else{b7=4576;break}}do{if((b7|0)==4576){b7=0;if((DH|0)==0){if(!((DD|0)==6|(DD|0)==2)){DI=0;DJ=0;DK=Co;break}}c[13898]=Ci+1;dl(F,4);c[16246]=c[fO>>2];c[64988>>2]=c[fO+4>>2];c[64992>>2]=c[fO+8>>2];c[64996>>2]=c[fO+12>>2];c[65e3>>2]=c[fO+16>>2];c[65004>>2]=c[fO+20>>2];c[65008>>2]=c[fO+24>>2];c[65012>>2]=c[fO+28>>2];c[65016>>2]=c[fO+32>>2];c[65020>>2]=c[fO+36>>2];c[16418]=c[fO>>2];c[65676>>2]=c[fO+4>>2];c[65680>>2]=c[fO+8>>2];c[65684>>2]=c[fO+12>>2];c[65688>>2]=c[fO+16>>2];c[65692>>2]=c[fO+20>>2];c[65696>>2]=c[fO+24>>2];c[65700>>2]=c[fO+28>>2];c[65704>>2]=c[fO+32>>2];c[65708>>2]=c[fO+36>>2];c[16590]=c[fO>>2];c[66364>>2]=c[fO+4>>2];c[66368>>2]=c[fO+8>>2];c[66372>>2]=c[fO+12>>2];c[66376>>2]=c[fO+16>>2];c[66380>>2]=c[fO+20>>2];c[66384>>2]=c[fO+24>>2];c[66388>>2]=c[fO+28>>2];c[66392>>2]=c[fO+32>>2];c[66396>>2]=c[fO+36>>2];c[16762]=c[fO>>2];c[67052>>2]=c[fO+4>>2];c[67056>>2]=c[fO+8>>2];c[67060>>2]=c[fO+12>>2];c[67064>>2]=c[fO+16>>2];c[67068>>2]=c[fO+20>>2];c[67072>>2]=c[fO+24>>2];c[67076>>2]=c[fO+28>>2];c[67080>>2]=c[fO+32>>2];c[67084>>2]=c[fO+36>>2];c[16934]=c[fO>>2];c[67740>>2]=c[fO+4>>2];c[67744>>2]=c[fO+8>>2];c[67748>>2]=c[fO+12>>2];c[67752>>2]=c[fO+16>>2];c[67756>>2]=c[fO+20>>2];c[67760>>2]=c[fO+24>>2];c[67764>>2]=c[fO+28>>2];c[67768>>2]=c[fO+32>>2];c[67772>>2]=c[fO+36>>2];c[17106]=c[fO>>2];c[68428>>2]=c[fO+4>>2];c[68432>>2]=c[fO+8>>2];c[68436>>2]=c[fO+12>>2];c[68440>>2]=c[fO+16>>2];c[68444>>2]=c[fO+20>>2];c[68448>>2]=c[fO+24>>2];c[68452>>2]=c[fO+28>>2];c[68456>>2]=c[fO+32>>2];c[68460>>2]=c[fO+36>>2];c[17278]=c[fO>>2];c[69116>>2]=c[fO+4>>2];c[69120>>2]=c[fO+8>>2];c[69124>>2]=c[fO+12>>2];c[69128>>2]=c[fO+16>>2];c[69132>>2]=c[fO+20>>2];c[69136>>2]=c[fO+24>>2];c[69140>>2]=c[fO+28>>2];c[69144>>2]=c[fO+32>>2];c[69148>>2]=c[fO+36>>2];c[17450]=c[fO>>2];c[69804>>2]=c[fO+4>>2];c[69808>>2]=c[fO+8>>2];c[69812>>2]=c[fO+12>>2];c[69816>>2]=c[fO+16>>2];c[69820>>2]=c[fO+20>>2];c[69824>>2]=c[fO+24>>2];c[69828>>2]=c[fO+28>>2];c[69832>>2]=c[fO+32>>2];c[69836>>2]=c[fO+36>>2];c[17622]=c[fO>>2];c[70492>>2]=c[fO+4>>2];c[70496>>2]=c[fO+8>>2];c[70500>>2]=c[fO+12>>2];c[70504>>2]=c[fO+16>>2];c[70508>>2]=c[fO+20>>2];c[70512>>2]=c[fO+24>>2];c[70516>>2]=c[fO+28>>2];c[70520>>2]=c[fO+32>>2];c[70524>>2]=c[fO+36>>2];c[17794]=c[fO>>2];c[71180>>2]=c[fO+4>>2];c[71184>>2]=c[fO+8>>2];c[71188>>2]=c[fO+12>>2];c[71192>>2]=c[fO+16>>2];c[71196>>2]=c[fO+20>>2];c[71200>>2]=c[fO+24>>2];c[71204>>2]=c[fO+28>>2];c[71208>>2]=c[fO+32>>2];c[71212>>2]=c[fO+36>>2];c[17966]=c[fO>>2];c[71868>>2]=c[fO+4>>2];c[71872>>2]=c[fO+8>>2];c[71876>>2]=c[fO+12>>2];c[71880>>2]=c[fO+16>>2];c[71884>>2]=c[fO+20>>2];c[71888>>2]=c[fO+24>>2];c[71892>>2]=c[fO+28>>2];c[71896>>2]=c[fO+32>>2];c[71900>>2]=c[fO+36>>2];Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DI+153128|0]|0)==(a[gH+(DI+DK|0)|0]|0)){DL=DK;DM=DJ}else{if((DI|0)!=5){DN=0;break}DL=DK-1|0;DM=1}hp=DI+1|0;if((hp|0)<(DM+hB|0)){DI=hp;DJ=DM;DK=DL}else{b7=4583;break}}do{if((b7|0)==4583){b7=0;if((DM|0)==0){if(!((DI|0)==4|(DI|0)==8)){DN=0;break}}uE(dx|0,0,28);c[13898]=Ci+1;c[16246]=4;c[16247]=4;c[16248]=4;c[16249]=c[dx>>2];c[65e3>>2]=c[dx+4>>2];c[65004>>2]=c[dx+8>>2];c[65008>>2]=c[dx+12>>2];c[65012>>2]=c[dx+16>>2];c[65016>>2]=c[dx+20>>2];c[65020>>2]=c[dx+24>>2];c[16418]=4;c[16419]=4;c[16420]=4;c[65684>>2]=c[dx>>2];c[(65684|0)+4>>2]=c[dx+4>>2];c[(65684|0)+8>>2]=c[dx+8>>2];c[(65684|0)+12>>2]=c[dx+12>>2];c[(65684|0)+16>>2]=c[dx+16>>2];c[(65684|0)+20>>2]=c[dx+20>>2];c[(65684|0)+24>>2]=c[dx+24>>2];c[16590]=4;c[16591]=4;c[16592]=4;c[66372>>2]=c[dx>>2];c[(66372|0)+4>>2]=c[dx+4>>2];c[(66372|0)+8>>2]=c[dx+8>>2];c[(66372|0)+12>>2]=c[dx+12>>2];c[(66372|0)+16>>2]=c[dx+16>>2];c[(66372|0)+20>>2]=c[dx+20>>2];c[(66372|0)+24>>2]=c[dx+24>>2];c[16762]=4;c[16763]=4;c[16764]=4;c[67060>>2]=c[dx>>2];c[(67060|0)+4>>2]=c[dx+4>>2];c[(67060|0)+8>>2]=c[dx+8>>2];c[(67060|0)+12>>2]=c[dx+12>>2];c[(67060|0)+16>>2]=c[dx+16>>2];c[(67060|0)+20>>2]=c[dx+20>>2];c[(67060|0)+24>>2]=c[dx+24>>2];c[16934]=4;c[16935]=4;c[16936]=4;c[67748>>2]=c[dx>>2];c[(67748|0)+4>>2]=c[dx+4>>2];c[(67748|0)+8>>2]=c[dx+8>>2];c[(67748|0)+12>>2]=c[dx+12>>2];c[(67748|0)+16>>2]=c[dx+16>>2];c[(67748|0)+20>>2]=c[dx+20>>2];c[(67748|0)+24>>2]=c[dx+24>>2];c[17106]=4;c[17107]=4;c[17108]=4;c[68436>>2]=c[dx>>2];c[(68436|0)+4>>2]=c[dx+4>>2];c[(68436|0)+8>>2]=c[dx+8>>2];c[(68436|0)+12>>2]=c[dx+12>>2];c[(68436|0)+16>>2]=c[dx+16>>2];c[(68436|0)+20>>2]=c[dx+20>>2];c[(68436|0)+24>>2]=c[dx+24>>2];c[17278]=4;c[17279]=4;c[17280]=4;c[69124>>2]=c[dx>>2];c[(69124|0)+4>>2]=c[dx+4>>2];c[(69124|0)+8>>2]=c[dx+8>>2];c[(69124|0)+12>>2]=c[dx+12>>2];c[(69124|0)+16>>2]=c[dx+16>>2];c[(69124|0)+20>>2]=c[dx+20>>2];c[(69124|0)+24>>2]=c[dx+24>>2];c[17450]=4;c[17451]=4;c[17452]=4;c[69812>>2]=c[dx>>2];c[(69812|0)+4>>2]=c[dx+4>>2];c[(69812|0)+8>>2]=c[dx+8>>2];c[(69812|0)+12>>2]=c[dx+12>>2];c[(69812|0)+16>>2]=c[dx+16>>2];c[(69812|0)+20>>2]=c[dx+20>>2];c[(69812|0)+24>>2]=c[dx+24>>2];c[17622]=4;c[17623]=4;c[17624]=4;c[70500>>2]=c[dx>>2];c[(70500|0)+4>>2]=c[dx+4>>2];c[(70500|0)+8>>2]=c[dx+8>>2];c[(70500|0)+12>>2]=c[dx+12>>2];c[(70500|0)+16>>2]=c[dx+16>>2];c[(70500|0)+20>>2]=c[dx+20>>2];c[(70500|0)+24>>2]=c[dx+24>>2];c[17794]=4;c[17795]=4;c[17796]=4;c[71188>>2]=c[dx>>2];c[(71188|0)+4>>2]=c[dx+4>>2];c[(71188|0)+8>>2]=c[dx+8>>2];c[(71188|0)+12>>2]=c[dx+12>>2];c[(71188|0)+16>>2]=c[dx+16>>2];c[(71188|0)+20>>2]=c[dx+20>>2];c[(71188|0)+24>>2]=c[dx+24>>2];c[17966]=4;c[17967]=4;c[17968]=4;c[71876>>2]=c[dx>>2];c[(71876|0)+4>>2]=c[dx+4>>2];c[(71876|0)+8>>2]=c[dx+8>>2];c[(71876|0)+12>>2]=c[dx+12>>2];c[(71876|0)+16>>2]=c[dx+16>>2];c[(71876|0)+20>>2]=c[dx+20>>2];c[(71876|0)+24>>2]=c[dx+24>>2];Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DN+97960|0]|0)!=(a[gH+(DN+Co|0)|0]|0)){DO=0;DP=0;DQ=Co;break}DR=DN+1|0;if((DR|0)<(hB|0)){DN=DR}else{b7=4588;break}}do{if((b7|0)==4588){b7=0;if((DR|0)!=6){DO=0;DP=0;DQ=Co;break}jp();Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DO+175984|0]|0)==(a[gH+(DO+DQ|0)|0]|0)){DS=DQ;DT=DP}else{if((DO|0)!=1){Cn=Co;b7=4620;break L5954}DS=DQ-1|0;DT=1}hp=DO+1|0;if((hp|0)<(DT+hB|0)){DO=hp;DP=DT;DQ=DS}else{break}}if((DT|0)==0){if(!((DO|0)==4|(DO|0)==0)){Cn=Co;b7=4620;break L5954}}DU=Ci+1|0;c[13898]=DU;hp=(a[Ck+(DU*40&-1)|0]&1)==0;if(hp){b7=4598}else{hR=a[gH+(c[Ck+(DU*40&-1)+32>>2]|0)|0]|0;if(!((hR<<24>>24|0)==39|(hR<<24>>24|0)==34)){b7=4598}}if((b7|0)==4598){b7=0;hR=c[10810]|0;if((hR|0)==0){b7=5299;break L27}hK=Ck+(DU*40&-1)+36|0;hS=Ck+(DU*40&-1)+32|0;gG=(Cj|0)<=(DU|0)|hp;gy=hR;L6211:while(1){hR=c[gy+4>>2]|0;L6213:do{if(!gG){ho=c[hK>>2]|0;ng=0;while(1){if((ng|0)>=(ho|0)){break}if((a[gH+((c[hS>>2]|0)+ng|0)|0]|0)==(a[hR+ng|0]|0)){ng=ng+1|0}else{break L6213}}if((a[hR+ng|0]|0)==0){break L6211}}}while(0);hR=c[gy>>2]|0;if((hR|0)==0){b7=5301;break L27}else{gy=hR}}if((a[gy+8|0]&1)!=0){b7=5300;break L27}if((c[gy+16>>2]|0)!=3){b7=5302;break L27}}L6223:do{if((DU|0)<(Cj|0)){L6225:do{if(!hp){hS=c[Ck+(DU*40&-1)+36>>2]|0;hK=Ck+(DU*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(hS|0)){break}if((a[gH+((c[hK>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{break L6225}}if((gG|0)==1){DV=0;break L6223}}}while(0);a[14176]=1;is(E);a[14176]=0;if((c[fQ>>2]|0)==3){DV=c[fS>>2]|0;break}else{c[13898]=DU;DV=0;break}}else{DV=0}}while(0);uu(c[16231]|0);if((DV|0)==0){c[16231]=0;uu(c[16403]|0);c[16403]=0;uu(c[16575]|0);c[16575]=0;uu(c[16747]|0);c[16747]=0;uu(c[16919]|0);c[16919]=0;uu(c[17091]|0);c[17091]=0;uu(c[17263]|0);c[17263]=0;uu(c[17435]|0);c[17435]=0;uu(c[17607]|0);c[17607]=0;uu(c[17779]|0);c[17779]=0;uu(c[17951]|0);DW=0}else{c[16231]=bP(DV|0)|0;uu(c[16403]|0);c[16403]=bP(DV|0)|0;uu(c[16575]|0);c[16575]=bP(DV|0)|0;uu(c[16747]|0);c[16747]=bP(DV|0)|0;uu(c[16919]|0);c[16919]=bP(DV|0)|0;uu(c[17091]|0);c[17091]=bP(DV|0)|0;uu(c[17263]|0);c[17263]=bP(DV|0)|0;uu(c[17435]|0);c[17435]=bP(DV|0)|0;uu(c[17607]|0);c[17607]=bP(DV|0)|0;uu(c[17779]|0);c[17779]=bP(DV|0)|0;uu(c[17951]|0);DW=bP(DV|0)|0}c[17951]=DW;uu(DV);Cx=Ch;Cy=Cg;break L5954}}while(0);c[16282]=1;a[65272]=1;c[16454]=1;a[65960]=1;c[16626]=1;a[66648]=1;c[16798]=1;a[67336]=1;c[16970]=1;a[68024]=1;c[17142]=1;a[68712]=1;c[17314]=1;a[69400]=1;c[17486]=1;a[70088]=1;c[17658]=1;a[70776]=1;c[17830]=1;a[71464]=1;c[18002]=1;a[72152]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg}}while(0);L6241:do{if((b7|0)==4620){b7=0;hF=(Cj|0)>(Ci|0);L6243:do{if(hF){if(gF){b7=5303;break L27}gH=c[10036]|0;hp=0;while(1){if((hp|0)>=(hB|0)){break}if((a[gH+(hp+Cn|0)|0]|0)==(a[hp+143040|0]|0)){hp=hp+1|0}else{b7=4626;break L6243}}if((hp|0)!=2){b7=4626}}else{b7=4626}}while(0);L6250:do{if((b7|0)==4626){b7=0;L6252:do{if((hB|0)>0&(gF^1)){gH=c[10036]|0;gy=0;hK=0;hS=Cn;while(1){if((a[gy+142856|0]|0)==(a[gH+(gy+hS|0)|0]|0)){DX=hS;DY=hK}else{if((gy|0)!=4){break L6252}DX=hS-1|0;DY=1}ng=gy+1|0;if((ng|0)<(DY+hB|0)){gy=ng;hK=DY;hS=DX}else{break}}if((DY|0)!=0){break L6250}if((gy|0)==3|(gy|0)==9){break L6250}}}while(0);if(!hF){Cx=Ch;Cy=Cg;break L6241}if(gF){b7=5304;break L27}hp=c[10036]|0;hS=0;while(1){if((hS|0)>=(hB|0)){b7=4640;break}if((a[hp+(hS+Cn|0)|0]|0)==(a[hS+150856|0]|0)){hS=hS+1|0}else{DZ=0;break}}do{if((b7|0)==4640){b7=0;if((hS|0)!=5){DZ=0;break}c[10026]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L6241}}while(0);while(1){if((DZ|0)>=(hB|0)){b7=4644;break}if((a[hp+(DZ+Cn|0)|0]|0)==(a[DZ+150704|0]|0)){DZ=DZ+1|0}else{D_=0;break}}do{if((b7|0)==4644){b7=0;if((DZ|0)!=4){D_=0;break}c[10026]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L6241}}while(0);while(1){if((D_|0)>=(hB|0)){break}if((a[hp+(D_+Cn|0)|0]|0)==(a[D_+103664|0]|0)){D_=D_+1|0}else{b7=5305;break L27}}if((D_|0)==1){Cx=Ch;Cy=Cg;break L6241}else{b7=5306;break L27}}}while(0);hI(G,5);c[16232]=c[fP>>2];c[64932>>2]=c[fP+4>>2];c[64936>>2]=c[fP+8>>2];c[64940>>2]=c[fP+12>>2];c[16404]=c[fP>>2];c[65620>>2]=c[fP+4>>2];c[65624>>2]=c[fP+8>>2];c[65628>>2]=c[fP+12>>2];c[16576]=c[fP>>2];c[66308>>2]=c[fP+4>>2];c[66312>>2]=c[fP+8>>2];c[66316>>2]=c[fP+12>>2];c[16748]=c[fP>>2];c[66996>>2]=c[fP+4>>2];c[67e3>>2]=c[fP+8>>2];c[67004>>2]=c[fP+12>>2];c[16920]=c[fP>>2];c[67684>>2]=c[fP+4>>2];c[67688>>2]=c[fP+8>>2];c[67692>>2]=c[fP+12>>2];c[17092]=c[fP>>2];c[68372>>2]=c[fP+4>>2];c[68376>>2]=c[fP+8>>2];c[68380>>2]=c[fP+12>>2];c[17264]=c[fP>>2];c[69060>>2]=c[fP+4>>2];c[69064>>2]=c[fP+8>>2];c[69068>>2]=c[fP+12>>2];c[17436]=c[fP>>2];c[69748>>2]=c[fP+4>>2];c[69752>>2]=c[fP+8>>2];c[69756>>2]=c[fP+12>>2];c[17608]=c[fP>>2];c[70436>>2]=c[fP+4>>2];c[70440>>2]=c[fP+8>>2];c[70444>>2]=c[fP+12>>2];c[17780]=c[fP>>2];c[71124>>2]=c[fP+4>>2];c[71128>>2]=c[fP+8>>2];c[71132>>2]=c[fP+12>>2];c[17952]=c[fP>>2];c[71812>>2]=c[fP+4>>2];c[71816>>2]=c[fP+8>>2];c[71820>>2]=c[fP+12>>2];Cx=Ch;Cy=Cg}}while(0);hB=c[13898]|0;gF=c[8272]|0;if((hB|0)>=(gF|0)){Cl=Cy;Cm=Cx;break L5951}Cg=Cy;Ch=Cx;Ci=hB;Cj=gF;Ck=c[1054]|0;b7=4421}}}while(0);hG=0;do{gC=64916+(hG*688&-1)|0;do{if(!((c[gC>>2]&3|0)!=0|Cm)){if((hG-5|0)>>>0<2){break}c[gC>>2]=1;if(Cl){break}if((hG-1|0)>>>0>=3){break}c[gC>>2]=5}}while(0);hG=hG+1|0;}while(hG>>>0<11)}else if((gD|0)==90){uh(gv,225144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);hG=(c[13898]|0)+1|0;c[13898]=hG;L6294:do{if((hG|0)<(c[8272]|0)){gC=c[1054]|0;L6296:do{if((a[gC+(hG*40&-1)|0]&1)!=0){nd=c[gC+(hG*40&-1)+36>>2]|0;nh=gC+(hG*40&-1)+32|0;gF=c[10036]|0;hB=0;while(1){if((hB|0)>=(nd|0)){break}if((a[gF+((c[nh>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{break L6296}}if((hB|0)==1){D$=.5;D0=1.0;break L6294}}}while(0);gC=is(z)|0;nh=c[gC>>2]|0;if((nh|0)==1){D1=+(c[gC+8>>2]|0)}else if((nh|0)==2){D1=+h[gC+8>>3]}else if((nh|0)==3){D1=+uz(c[gC+8>>2]|0,0)}else{b7=4668;break L27}if((c[fZ>>2]|0)==3){uu(c[f_>>2]|0);c[fZ>>2]=1}gC=c[13898]|0;L6311:do{if((gC|0)<(c[8272]|0)){nh=c[1054]|0;L6313:do{if((a[nh+(gC*40&-1)|0]&1)!=0){gF=c[nh+(gC*40&-1)+36>>2]|0;nd=nh+(gC*40&-1)+32|0;hF=c[10036]|0;hp=0;while(1){if((hp|0)>=(gF|0)){b7=4676;break}if((a[hF+((c[nd>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{D2=0;break}}if((b7|0)==4676){b7=0;if((hp|0)==1){break L6311}else{D2=0}}while(1){if((D2|0)>=(gF|0)){break}if((a[hF+((c[nd>>2]|0)+D2|0)|0]|0)==(a[D2+148464|0]|0)){D2=D2+1|0}else{break L6313}}if((D2|0)!=1){break}c[13898]=gC+1}}while(0);nh=is(A)|0;hB=c[nh>>2]|0;if((hB|0)==1){D3=+(c[nh+8>>2]|0)}else if((hB|0)==2){D3=+h[nh+8>>3]}else if((hB|0)==3){D3=+uz(c[nh+8>>2]|0,0)}else{b7=4686;break L27}if((c[f$>>2]|0)!=3){D$=D3;D0=D1;break L6294}uu(c[f0>>2]|0);c[f$>>2]=1;D$=D3;D0=D1;break L6294}}while(0);D$=D1*.5;D0=D1}else{D$=.5;D0=1.0}}while(0);h[8132]=D0;h[8133]=D$;h[8218]=D0;h[8219]=D$;h[8304]=D0;h[8305]=D$;h[8390]=D0;h[8391]=D$;h[8476]=D0;h[8477]=D$;h[8562]=D0;h[8563]=D$;h[8648]=D0;h[8649]=D$;h[8734]=D0;h[8735]=D$;h[8820]=D0;h[8821]=D$;h[8906]=D0;h[8907]=D$;h[8992]=D0;h[8993]=D$}else if((gD|0)==92){D4=gv+1|0;c[13898]=D4;hG=c[8272]|0;L6335:do{if((D4|0)<(hG|0)){gC=(a[gw+(D4*40&-1)|0]&1)==0;nh=c[gw+(D4*40&-1)+36>>2]|0;hB=gw+(D4*40&-1)+32|0;L6337:do{if(!gC){nd=0;while(1){if((nd|0)>=(nh|0)){break}if((a[gB+((c[hB>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L6337}}if((nd|0)==1){break L6335}}}while(0);hF=c[hB>>2]|0;gF=(nh|0)>0;hp=56720;hS=77416;L6343:while(1){L6345:do{if(!gC){if(gF){hK=0;gH=0;ng=hF;while(1){hR=a[hS+hK|0]|0;if(hR<<24>>24==(a[gB+(hK+ng|0)|0]|0)){D5=ng;D6=gH}else{if(hR<<24>>24!=36){break L6345}D5=ng-1|0;D6=1}D7=hK+1|0;if((D7|0)<(D6+nh|0)){hK=D7;gH=D6;ng=D5}else{break}}if((D6|0)==0){D8=D7}else{D9=hp;break L6343}}else{D8=0}ng=a[hS+D8|0]|0;if((ng<<24>>24|0)==36|(ng<<24>>24|0)==0){D9=hp;break L6343}}}while(0);nd=hp+8|0;ng=c[nd>>2]|0;if((ng|0)==0){D9=nd;break}else{hp=nd;hS=ng}}hS=c[D9+4>>2]|0;if((hS|0)>-1){Ea=gv+2|0;c[13898]=Ea;if((Ea|0)>=(hG|0)){b7=4725;break L27}L6361:do{if((a[gw+(Ea*40&-1)|0]&1)!=0){hp=c[gw+(Ea*40&-1)+36>>2]|0;gF=gw+(Ea*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(hp|0)){break}if((a[gB+((c[gF>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{break L6361}}if((hB|0)==1){b7=4725;break L27}}}while(0);a[14176]=1;is(y);a[14176]=0;if((c[f1>>2]|0)!=3){b7=4714;break L27}gF=c[f2>>2]|0;if((gF|0)==0){b7=4725;break L27}hp=64813+(hS*688&-1)|0;uF(hp|0,gF|0,50);Eb=gF}else{L6371:do{if(!gC){gF=0;while(1){if((gF|0)>=(nh|0)){break}if((a[gB+(gF+hF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{break L6371}}if((gF|0)==1){b7=4725;break L27}}}while(0);a[14176]=1;is(x);a[14176]=0;if((c[f3>>2]|0)!=3){b7=4722;break L27}hF=c[f4>>2]|0;if((hF|0)==0){b7=4725;break L27}uF(64813,hF|0,50);uF(65501,hF|0,50);uF(66189,hF|0,50);uF(66877,hF|0,50);uF(67565,hF|0,50);uF(68253,hF|0,50);uF(68941,hF|0,50);uF(69629,hF|0,50);uF(70317,hF|0,50);uF(71005,hF|0,50);uF(71693,hF|0,50);Eb=hF}uu(Eb);break L44}}while(0);uD(64813,82192,15);uD(65501,82192,15);uD(66189,82192,15);uD(66877,82192,15);uD(67565,82192,15);uD(68253,82192,15);uD(68941,82192,15);uD(69629,82192,15);uD(70317,82192,15);uD(71005,82192,15);uD(71693,82192,15)}else if((gD|0)==93){hG=gv+1|0;c[13898]=hG;hF=c[8272]|0;L6382:do{if((hG|0)<(hF|0)){nh=0;gC=hG;hS=hF;while(1){Ec=gC;hB=hS;L6385:while(1){hp=c[1054]|0;Ed=c[hp+(Ec*40&-1)+36>>2]|0;Ee=hp+(Ec*40&-1)+32|0;if((a[hp+(Ec*40&-1)|0]&1)==0){b7=4773;break}ng=c[10036]|0;nd=0;while(1){if((nd|0)>=(Ed|0)){b7=4734;break}gH=c[Ee>>2]|0;if((a[ng+(gH+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{Ef=gH;break}}if((b7|0)==4734){b7=0;if((nd|0)==1){break L6382}Ef=c[Ee>>2]|0}L6395:do{if((Ed|0)>0){gH=0;hK=0;hR=Ef;while(1){if((a[gH+150048|0]|0)==(a[ng+(gH+hR|0)|0]|0)){Eg=hR;Eh=hK}else{if((gH|0)!=1){Ei=0;Ej=0;Ek=Ef;break}Eg=hR-1|0;Eh=1}gz=gH+1|0;if((gz|0)<(Eh+Ed|0)){gH=gz;hK=Eh;hR=Eg}else{b7=4741;break}}do{if((b7|0)==4741){b7=0;if((Eh|0)==0){if(!((gH|0)==0|(gH|0)==3)){Ei=0;Ej=0;Ek=Ef;break}}c[1166]=0;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[Ei+149848|0]|0)==(a[ng+(Ei+Ek|0)|0]|0)){El=Ek;Em=Ej}else{if((Ei|0)!=1){En=0;Eo=0;Ep=Ef;break}El=Ek-1|0;Em=1}gH=Ei+1|0;if((gH|0)<(Em+Ed|0)){Ei=gH;Ej=Em;Ek=El}else{b7=4749;break}}do{if((b7|0)==4749){b7=0;if((Em|0)==0){if(!((Ei|0)==0|(Ei|0)==6)){En=0;Eo=0;Ep=Ef;break}}c[1166]=1;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[En+95544|0]|0)==(a[ng+(En+Ep|0)|0]|0)){Eq=Ep;Er=Eo}else{if((En|0)!=1){Es=0;Et=0;Eu=Ef;break}Eq=Ep-1|0;Er=1}gH=En+1|0;if((gH|0)<(Er+Ed|0)){En=gH;Eo=Er;Ep=Eq}else{b7=4756;break}}do{if((b7|0)==4756){b7=0;if((Er|0)==0){if(!((En|0)==0|(En|0)==6)){Es=0;Et=0;Eu=Ef;break}}c[1164]=1;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[Es+184048|0]|0)==(a[ng+(Es+Eu|0)|0]|0)){Ev=Eu;Ew=Et}else{if((Es|0)!=1){Ex=0;Ey=0;Ez=Ef;break}Ev=Eu-1|0;Ew=1}gH=Es+1|0;if((gH|0)<(Ew+Ed|0)){Es=gH;Et=Ew;Eu=Ev}else{b7=4763;break}}do{if((b7|0)==4763){b7=0;if((Ew|0)==0){if(!((Es|0)==0|(Es|0)==8)){Ex=0;Ey=0;Ez=Ef;break}}c[1164]=0;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[Ex+152064|0]|0)==(a[ng+(Ex+Ez|0)|0]|0)){EA=Ez;EB=Ey}else{if((Ex|0)!=3){b7=4774;break L6395}EA=Ez-1|0;EB=1}gH=Ex+1|0;if((gH|0)<(EB+Ed|0)){Ex=gH;Ey=EB;Ez=EA}else{break}}if((EB|0)==0){if(!((Ex|0)==6|(Ex|0)==2)){b7=4774;break}}c[13898]=Ec+1;dl(4816,4)}else{b7=4774}}while(0);if((b7|0)==4774){b7=0;nd=(hB|0)>(Ec|0);if(nd){EC=0}else{ED=Ef;EE=0;EF=0;break}while(1){if((EC|0)>=(Ed|0)){break}if((a[ng+(EC+Ef|0)|0]|0)==(a[EC+124352|0]|0)){EC=EC+1|0}else{ED=Ef;EE=nd;EF=0;break L6385}}if((EC|0)!=4){ED=Ef;EE=nd;EF=0;break}gH=Ec+1|0;c[13898]=gH;L6457:do{if((gH|0)<(hB|0)){L6459:do{if((a[hp+(gH*40&-1)|0]&1)!=0){hR=c[hp+(gH*40&-1)+36>>2]|0;hK=hp+(gH*40&-1)+32|0;gz=0;while(1){if((gz|0)>=(hR|0)){break}if((a[ng+((c[hK>>2]|0)+gz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{break L6459}}if((gz|0)==1){EG=0;break L6457}}}while(0);a[14176]=1;is(t);a[14176]=0;if((c[f5>>2]|0)==3){EG=c[f6>>2]|0;break}else{c[13898]=gH;EG=0;break}}else{EG=0}}while(0);uu(c[1184]|0);c[1184]=EG}gH=c[13898]|0;ng=c[8272]|0;if((gH|0)<(ng|0)){Ec=gH;hB=ng}else{break L6382}}if((b7|0)==4773){b7=0;ED=c[Ee>>2]|0;EE=(hB|0)>(Ec|0);EF=1}if(nh){EH=Ec;b7=5310;break L27}if(!EE){EH=Ec;b7=5311;break L27}L6476:do{if(!EF){gF=c[10036]|0;ng=0;while(1){if((ng|0)>=(Ed|0)){break}if((a[gF+(ng+ED|0)|0]|0)==(a[ng+103664|0]|0)){ng=ng+1|0}else{break L6476}}if((ng|0)==1){EH=Ec;b7=5312;break L27}}}while(0);a[14176]=1;is(u);a[14176]=0;if((c[f7>>2]|0)!=3){b7=4796;break L27}hB=c[f8>>2]|0;if((hB|0)==0){b7=4798;break L27}uu(c[1183]|0);c[1183]=hB;hB=c[13898]|0;gF=c[8272]|0;if((hB|0)<(gF|0)){nh=1;gC=hB;hS=gF}else{break L44}}}}while(0);if((c[1183]|0)!=0){break}c[1183]=bP(74304)|0}else if((gD|0)==94){jq(4416)}else if((gD|0)==99){hF=gv+1|0;c[13898]=hF;hG=c[8272]|0;hS=(hG|0)>(hF|0);L6489:do{if(hS){if((a[gw+(hF*40&-1)|0]&1)==0){break}gC=c[gw+(hF*40&-1)+36>>2]|0;nh=gw+(hF*40&-1)+32|0;gF=0;while(1){if((gF|0)>=(gC|0)){break}if((a[gB+((c[nh>>2]|0)+gF|0)|0]|0)==(a[gF+134552|0]|0)){gF=gF+1|0}else{break L6489}}if((gF|0)!=3){break}c[5094]=1;c[13898]=gv+2;break L44}}while(0);if((c[5094]|0)==1){if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}c[5094]=0}nh=c[gw+(hF*40&-1)+36>>2]|0;gC=c[gw+(hF*40&-1)+32>>2]|0;L6504:do{if((nh|0)>0&(a[gw+(hF*40&-1)|0]&1)!=0){hB=0;gH=0;hp=gC;while(1){if((a[hB+82576|0]|0)==(a[gB+(hB+hp|0)|0]|0)){EI=hp;EJ=gH}else{if((hB|0)!=5){EK=0;EL=0;EM=gC;break}EI=hp-1|0;EJ=1}nd=hB+1|0;if((nd|0)<(EJ+nh|0)){hB=nd;gH=EJ;hp=EI}else{b7=4820;break}}do{if((b7|0)==4820){b7=0;if((EJ|0)==0){if(!((hB|0)==10|(hB|0)==4)){EK=0;EL=0;EM=gC;break}}hp=gv+2|0;c[13898]=hp;do{if((hp|0)<(hG|0)){if((a[gw+(hp*40&-1)|0]&1)==0){break L44}gH=c[gw+(hp*40&-1)+36>>2]|0;gF=gw+(hp*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(gH|0)){b7=4827;break}if((a[gB+((c[gF>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{EN=0;break}}if((b7|0)==4827){b7=0;if((nd|0)==1){break}else{EN=0}}while(1){if((EN|0)>=(gH|0)){b7=4830;break}if((a[gB+((c[gF>>2]|0)+EN|0)|0]|0)==(a[EN+150688|0]|0)){EN=EN+1|0}else{EO=0;break}}if((b7|0)==4830){b7=0;if((EN|0)==2){break}else{EO=0}}while(1){if((EO|0)>=(gH|0)){break}if((a[gB+((c[gF>>2]|0)+EO|0)|0]|0)==(a[EO+79688|0]|0)){EO=EO+1|0}else{break L44}}if((EO|0)!=3){break L44}c[18072]=3;c[13898]=gv+3;break L44}}while(0);c[18072]=2;c[13898]=gv+3;break L44}}while(0);while(1){if((a[EK+78952|0]|0)==(a[gB+(EK+EM|0)|0]|0)){EP=EM;EQ=EL}else{if((EK|0)!=7){break L6504}EP=EM-1|0;EQ=1}hB=EK+1|0;if((hB|0)<(EQ+nh|0)){EK=hB;EL=EQ;EM=EP}else{break}}if((EQ|0)==0){if(!((EK|0)==6|(EK|0)==12)){break}}c[18072]=0;c[13898]=gv+2;break L44}}while(0);h[eW>>3]=+g[3538];h[eX>>3]=+g[3536];h[eY>>3]=+g[3534];h[eZ>>3]=+g[3532];L6546:do{if(hS){ER=hF;nh=1;hG=0;gC=gw;while(1){L6549:do{if((a[gC+(ER*40&-1)|0]&1)==0){b7=4853}else{hB=c[gC+(ER*40&-1)+36>>2]|0;hp=gC+(ER*40&-1)+32|0;gF=c[10036]|0;gH=0;while(1){if((gH|0)>=(hB|0)){b7=4848;break}if((a[gF+((c[hp>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{ES=0;break}}if((b7|0)==4848){b7=0;if((gH|0)==1){break L6546}else{ES=0}}while(1){if((ES|0)>=(hB|0)){break}if((a[gF+((c[hp>>2]|0)+ES|0)|0]|0)==(a[ES+148464|0]|0)){ES=ES+1|0}else{b7=4853;break L6549}}if((ES|0)!=1){b7=4853;break}c[13898]=ER+1;ET=1;EU=(nh&1)+hG|0}}while(0);if((b7|0)==4853){b7=0;if(!nh){b7=4854;break L27}hp=is(s)|0;gF=c[hp>>2]|0;if((gF|0)==1){EV=+(c[hp+8>>2]|0)}else if((gF|0)==2){EV=+h[hp+8>>3]}else if((gF|0)==3){EV=+uz(c[hp+8>>2]|0,0)}else{b7=4859;break L27}if((c[f9>>2]|0)==3){uu(c[ga>>2]|0);c[f9>>2]=1}h[ak+(hG<<3)>>3]=EV;ET=0;EU=hG+1|0}if((EU|0)>=4){break L6546}hp=c[13898]|0;if((hp|0)>=(c[8272]|0)){break L6546}ER=hp;nh=ET;hG=EU;gC=c[1054]|0}}}while(0);m3=+h[eW>>3];if(m3<0.0|m3>360.0){b7=4867;break L27}m2=+h[eX>>3];if(m2<0.0|m2>360.0){b7=4869;break L27}m5=+h[eY>>3];if(m5<1.0e-6){b7=4871;break L27}m4=+h[eZ>>3];if(m4<1.0e-6){b7=4873;break L27}g[3538]=m3;g[3536]=m2;m2=m5;g[3534]=m2;g[3532]=m4;g[3540]=+_(+m2)}else if((gD|0)==151){c[13898]=gv+1;hF=is(r)|0;hS=c[hF>>2]|0;do{if((hS|0)==1){gC=c[hF+8>>2]|0;EW=+(((gC|0)>-1?gC:-gC|0)|0)}else if((hS|0)==2){m2=+P(+(+h[hF+8>>3]));m4=+h[hF+16>>3];m5=+P(+m4);if(m4==0.0){EW=m2;break}if(m2>m5){m4=m5/m2;EW=m2*+Q(+(m4*m4+1.0));break}else{m4=m2/m5;EW=m5*+Q(+(m4*m4+1.0));break}}else{b7=4881;break L27}}while(0);h[11]=EW}else if((gD|0)==48|(gD|0)==49|(gD|0)==117|(gD|0)==118|(gD|0)==111|(gD|0)==112|(gD|0)==114|(gD|0)==115){jt(2)}else if((gD|0)==52|(gD|0)==53|(gD|0)==136|(gD|0)==137|(gD|0)==130|(gD|0)==131|(gD|0)==133|(gD|0)==134){jt(1)}else if((gD|0)==46|(gD|0)==47|(gD|0)==108|(gD|0)==109|(gD|0)==102|(gD|0)==103|(gD|0)==105|(gD|0)==106){jt(6)}else if((gD|0)==50|(gD|0)==51|(gD|0)==127|(gD|0)==128|(gD|0)==121|(gD|0)==122|(gD|0)==124|(gD|0)==125){jt(5)}else if((gD|0)==54|(gD|0)==55|(gD|0)==145|(gD|0)==146|(gD|0)==139|(gD|0)==140|(gD|0)==142|(gD|0)==143){jt(0)}else if((gD|0)==68|(gD|0)==69|(gD|0)==66|(gD|0)==67|(gD|0)==71|(gD|0)==72|(gD|0)==73|(gD|0)==74){jt(3)}else if((gD|0)==147|(gD|0)==148){jt(7)}else if((gD|0)==110){hF=gv+1|0;c[13898]=hF;c[16546]=0;hS=c[gw+(hF*40&-1)+36>>2]|0;L6597:do{if((a[gw+(hF*40&-1)|0]&1)!=0&(hS|0)>0){gC=0;hG=0;nh=c[gw+(hF*40&-1)+32>>2]|0;while(1){if((a[gC+84264|0]|0)==(a[gB+(gC+nh|0)|0]|0)){EX=nh;EY=hG}else{if((gC|0)!=1){EZ=0;break L6597}EX=nh-1|0;EY=1}hp=gC+1|0;if((hp|0)<(EY+hS|0)){gC=hp;hG=EY;nh=EX}else{break}}if((EY|0)==0){if(!((gC|0)==0|(gC|0)==4)){EZ=0;break}}c[16546]=1;c[13898]=gv+2;EZ=1}else{EZ=0}}while(0);c[17750]=EZ;c[17578]=EZ}else if((gD|0)==129){hS=gv+1|0;c[13898]=hS;c[16374]=0;hF=c[gw+(hS*40&-1)+36>>2]|0;L6611:do{if((a[gw+(hS*40&-1)|0]&1)!=0&(hF|0)>0){nh=0;hG=0;hp=c[gw+(hS*40&-1)+32>>2]|0;while(1){if((a[nh+84264|0]|0)==(a[gB+(nh+hp|0)|0]|0)){E_=hp;E$=hG}else{if((nh|0)!=1){break L6611}E_=hp-1|0;E$=1}gF=nh+1|0;if((gF|0)<(E$+hF|0)){nh=gF;hG=E$;hp=E_}else{break}}if((E$|0)==0){if(!((nh|0)==0|(nh|0)==4)){break}}c[16374]=1;c[13898]=gv+2}}while(0);c[17922]=c[16546]}else if((gD|0)==138){hF=gv+1|0;c[13898]=hF;c[16202]=0;hS=c[gw+(hF*40&-1)+36>>2]|0;if(!((a[gw+(hF*40&-1)|0]&1)!=0&(hS|0)>0)){break}hp=0;hG=0;gC=c[gw+(hF*40&-1)+32>>2]|0;while(1){if((a[hp+84264|0]|0)==(a[gB+(hp+gC|0)|0]|0)){E0=gC;E1=hG}else{if((hp|0)!=1){break L44}E0=gC-1|0;E1=1}hF=hp+1|0;if((hF|0)<(E1+hS|0)){hp=hF;hG=E1;gC=E0}else{break}}if((E1|0)==0){if(!((hp|0)==0|(hp|0)==4)){break}}c[16202]=1;c[13898]=gv+2}else if((gD|0)==70){gC=gv+1|0;c[13898]=gC;c[16718]=0;hG=c[gw+(gC*40&-1)+36>>2]|0;if(!((a[gw+(gC*40&-1)|0]&1)!=0&(hG|0)>0)){break}hS=0;hF=0;gF=c[gw+(gC*40&-1)+32>>2]|0;while(1){if((a[hS+84264|0]|0)==(a[gB+(hS+gF|0)|0]|0)){E2=gF;E3=hF}else{if((hS|0)!=1){break L44}E2=gF-1|0;E3=1}gC=hS+1|0;if((gC|0)<(E3+hG|0)){hS=gC;hF=E3;gF=E2}else{break}}if((E3|0)==0){if(!((hS|0)==0|(hS|0)==4)){break}}c[16718]=1;c[13898]=gv+2}else if((gD|0)==101){gF=gv+1|0;c[13898]=gF;c[17234]=0;hF=c[gw+(gF*40&-1)+36>>2]|0;if(!((a[gw+(gF*40&-1)|0]&1)!=0&(hF|0)>0)){break}hG=0;hp=0;gC=c[gw+(gF*40&-1)+32>>2]|0;while(1){if((a[hG+84264|0]|0)==(a[gB+(hG+gC|0)|0]|0)){E4=gC;E5=hp}else{if((hG|0)!=1){break L44}E4=gC-1|0;E5=1}gF=hG+1|0;if((gF|0)<(E5+hF|0)){hG=gF;hp=E5;gC=E4}else{break}}if((E5|0)==0){if(!((hG|0)==0|(hG|0)==4)){break}}c[17234]=1;c[13898]=gv+2}else if((gD|0)==120){gC=gv+1|0;c[13898]=gC;c[17062]=0;hp=c[gw+(gC*40&-1)+36>>2]|0;if(!((a[gw+(gC*40&-1)|0]&1)!=0&(hp|0)>0)){break}hF=0;hS=0;gF=c[gw+(gC*40&-1)+32>>2]|0;while(1){if((a[hF+84264|0]|0)==(a[gB+(hF+gF|0)|0]|0)){E6=gF;E7=hS}else{if((hF|0)!=1){break L44}E6=gF-1|0;E7=1}gC=hF+1|0;if((gC|0)<(E7+hp|0)){hF=gC;hS=E7;gF=E6}else{break}}if((E7|0)==0){if(!((hF|0)==0|(hF|0)==4)){break}}c[17062]=1;c[13898]=gv+2}else if((gD|0)==113){jq(66456)}else if((gD|0)==132){jq(65768)}else if((gD|0)==141){jq(65080)}else if((gD|0)==64){jq(67144)}else if((gD|0)==104){jq(69208)}else if((gD|0)==123){jq(68520)}else if((gD|0)==116){jv(2)}else if((gD|0)==107){jv(6)}else if((gD|0)==135){jv(1)}else if((gD|0)==126){jv(5)}else if((gD|0)==144){jv(0)}else if((gD|0)==65){jv(3)}else if((gD|0)==149){jv(7);if((a[30528]&1)==0){break}ju()}else if((gD|0)==95){jv(8)}else if((gD|0)==96){jv(9)}else if((gD|0)==100){jv(10)}else if((gD|0)==150){a[27776]=1;c[13898]=gv+1}else if((gD|0)==153){gF=gv+1|0;c[13898]=gF;L6691:do{if((gF|0)<(c[8272]|0)){L6693:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hS=c[gw+(gF*40&-1)+36>>2]|0;hp=gw+(gF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(hS|0)){break}if((a[gB+((c[hp>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L6693}}if((hG|0)==1){break L6691}}}while(0);c[16665]=-1;hH(66656,1,0);if((gF|0)!=(c[13898]|0)){break L44}nh=is(q)|0;hp=c[nh>>2]|0;if((hp|0)==1){E8=+(c[nh+8>>2]|0)}else if((hp|0)==2){E8=+h[nh+8>>3]}else if((hp|0)==3){E8=+uz(c[nh+8>>2]|0,0)}else{b7=4976;break L27}if((c[gb>>2]|0)==3){uu(c[gc>>2]|0);c[gb>>2]=1}c[16665]=~~E8-1;break L44}}while(0);c[16665]=-1}else if((gD|0)==155){gF=gv+1|0;c[13898]=gF;L6711:do{if((gF|0)<(c[8272]|0)){L6713:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hF=c[gw+(gF*40&-1)+36>>2]|0;nh=gw+(gF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L6713}}if((hp|0)==1){break L6711}}}while(0);c[16493]=-1;hH(65968,1,0);if((gF|0)!=(c[13898]|0)){break L44}nh=is(p)|0;hF=c[nh>>2]|0;if((hF|0)==1){E9=+(c[nh+8>>2]|0)}else if((hF|0)==2){E9=+h[nh+8>>3]}else if((hF|0)==3){E9=+uz(c[nh+8>>2]|0,0)}else{b7=4992;break L27}if((c[gd>>2]|0)==3){uu(c[ge>>2]|0);c[gd>>2]=1}c[16493]=~~E9-1;break L44}}while(0);c[16493]=-1}else if((gD|0)==157){gF=gv+1|0;c[13898]=gF;L6731:do{if((gF|0)<(c[8272]|0)){L6733:do{if((a[gw+(gF*40&-1)|0]&1)!=0){nh=c[gw+(gF*40&-1)+36>>2]|0;hF=gw+(gF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(nh|0)){break}if((a[gB+((c[hF>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L6733}}if((hG|0)==1){break L6731}}}while(0);c[16321]=-1;hH(65280,1,0);if((gF|0)!=(c[13898]|0)){break L44}hF=is(o)|0;nh=c[hF>>2]|0;if((nh|0)==1){Fa=+(c[hF+8>>2]|0)}else if((nh|0)==2){Fa=+h[hF+8>>3]}else if((nh|0)==3){Fa=+uz(c[hF+8>>2]|0,0)}else{b7=5008;break L27}if((c[gf>>2]|0)==3){uu(c[gg>>2]|0);c[gf>>2]=1}c[16321]=~~Fa-1;break L44}}while(0);c[16321]=-1}else if((gD|0)==154){gF=gv+1|0;c[13898]=gF;L6751:do{if((gF|0)<(c[8272]|0)){L6753:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hF=c[gw+(gF*40&-1)+36>>2]|0;nh=gw+(gF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L6753}}if((hp|0)==1){break L6751}}}while(0);c[17353]=-1;hH(69408,1,0);if((gF|0)!=(c[13898]|0)){break L44}nh=is(n)|0;hF=c[nh>>2]|0;if((hF|0)==1){Fb=+(c[nh+8>>2]|0)}else if((hF|0)==2){Fb=+h[nh+8>>3]}else if((hF|0)==3){Fb=+uz(c[nh+8>>2]|0,0)}else{b7=5024;break L27}if((c[gh>>2]|0)==3){uu(c[gi>>2]|0);c[gh>>2]=1}c[17353]=~~Fb-1;break L44}}while(0);c[17353]=-1}else if((gD|0)==156){gF=gv+1|0;c[13898]=gF;L6771:do{if((gF|0)<(c[8272]|0)){L6773:do{if((a[gw+(gF*40&-1)|0]&1)!=0){nh=c[gw+(gF*40&-1)+36>>2]|0;hF=gw+(gF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(nh|0)){break}if((a[gB+((c[hF>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L6773}}if((hG|0)==1){break L6771}}}while(0);c[17181]=-1;hH(68720,1,0);if((gF|0)!=(c[13898]|0)){break L44}hF=is(l)|0;nh=c[hF>>2]|0;if((nh|0)==1){Fc=+(c[hF+8>>2]|0)}else if((nh|0)==2){Fc=+h[hF+8>>3]}else if((nh|0)==3){Fc=+uz(c[hF+8>>2]|0,0)}else{b7=5040;break L27}if((c[gj>>2]|0)==3){uu(c[gl>>2]|0);c[gj>>2]=1}c[17181]=~~Fc-1;break L44}}while(0);c[17181]=-1}else if((gD|0)==152){gF=gv+1|0;c[13898]=gF;L6791:do{if((gF|0)<(c[8272]|0)){L6793:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hF=c[gw+(gF*40&-1)+36>>2]|0;nh=gw+(gF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L6793}}if((hp|0)==1){b7=5050;break L6791}}}while(0);c[16665]=-1;hH(66656,1,0);if((gF|0)!=(c[13898]|0)){break}nh=is(k)|0;hF=c[nh>>2]|0;if((hF|0)==1){Fd=+(c[nh+8>>2]|0)}else if((hF|0)==2){Fd=+h[nh+8>>3]}else if((hF|0)==3){Fd=+uz(c[nh+8>>2]|0,0)}else{b7=5056;break L27}if((c[gm>>2]|0)==3){uu(c[gn>>2]|0);c[gm>>2]=1}c[16665]=~~Fd-1}else{b7=5050}}while(0);if((b7|0)==5050){b7=0;c[16665]=-1}c[16492]=c[16664];c[65972>>2]=c[66660>>2];c[65976>>2]=c[66664>>2];c[65980>>2]=c[66668>>2];c[65984>>2]=c[66672>>2];c[65988>>2]=c[66676>>2];c[65992>>2]=c[66680>>2];c[65996>>2]=c[66684>>2];c[66e3>>2]=c[66688>>2];c[66004>>2]=c[66692>>2];c[66008>>2]=c[66696>>2];c[66012>>2]=c[66700>>2];c[66016>>2]=c[66704>>2];c[66020>>2]=c[66708>>2];c[16320]=c[16664];c[65284>>2]=c[66660>>2];c[65288>>2]=c[66664>>2];c[65292>>2]=c[66668>>2];c[65296>>2]=c[66672>>2];c[65300>>2]=c[66676>>2];c[65304>>2]=c[66680>>2];c[65308>>2]=c[66684>>2];c[65312>>2]=c[66688>>2];c[65316>>2]=c[66692>>2];c[65320>>2]=c[66696>>2];c[65324>>2]=c[66700>>2];c[65328>>2]=c[66704>>2];c[65332>>2]=c[66708>>2]}else if((gD|0)==119){gF=gv+1|0;c[13898]=gF;nh=a[gw+(gF*40&-1)|0]&1;L6813:do{if((c[8272]|0)>(gF|0)){if(nh<<24>>24==0){Fe=0;b7=5066;break}hF=c[gw+(gF*40&-1)+36>>2]|0;hG=gw+(gF*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(hF|0)){break}if((a[gB+((c[hG>>2]|0)+hS|0)|0]|0)==(a[hS+95280|0]|0)){hS=hS+1|0}else{Fe=nh;b7=5066;break L6813}}if((hS|0)!=2){Ff=hF;Fg=nh;b7=5075;break}c[13898]=gv+2;hG=is(f)|0;gC=c[hG>>2]|0;if((gC|0)==1){Fh=+(c[hG+8>>2]|0)}else if((gC|0)==2){Fh=+h[hG+8>>3]}else if((gC|0)==3){Fh=+uz(c[hG+8>>2]|0,0)}else{b7=5072;break L27}if((c[go>>2]|0)!=3){Fi=1;Fj=Fh;break}uu(c[gp>>2]|0);c[go>>2]=1;Fi=1;Fj=Fh}else{Fe=nh;b7=5066}}while(0);if((b7|0)==5066){b7=0;Ff=c[gw+(gF*40&-1)+36>>2]|0;Fg=Fe;b7=5075}do{if((b7|0)==5075){b7=0;L6831:do{if(Fg<<24>>24!=0&(Ff|0)>0){nh=0;hG=0;gC=c[gw+(gF*40&-1)+32>>2]|0;while(1){if((a[nh+72944|0]|0)==(a[gB+(nh+gC|0)|0]|0)){Fk=gC;Fl=hG}else{if((nh|0)!=3){b7=5083;break L6831}Fk=gC-1|0;Fl=1}hB=nh+1|0;if((hB|0)<(Fl+Ff|0)){nh=hB;hG=Fl;gC=Fk}else{break}}if((Fl|0)!=0){Fm=gF;break}if((nh|0)==2|(nh|0)==8){Fm=gF}else{b7=5083}}else{b7=5083}}while(0);if((b7|0)==5083){b7=0;c[13898]=gv;Fm=gv}c[13898]=Fm+1;hF=is(j)|0;hS=c[hF>>2]|0;if((hS|0)==1){Fn=+(c[hF+8>>2]|0)}else if((hS|0)==2){Fn=+h[hF+8>>3]}else if((hS|0)==3){Fn=+uz(c[hF+8>>2]|0,0)}else{b7=5088;break L27}if((c[gq>>2]|0)!=3){Fi=0;Fj=Fn;break}uu(c[gs>>2]|0);c[gq>>2]=1;Fi=0;Fj=Fn}}while(0);h[77]=Fj;a[624]=Fi}else if((gD|0)==91){c[13898]=gv+1;gF=is(e)|0;hF=c[gF>>2]|0;if((hF|0)==1){Fo=+(c[gF+8>>2]|0)}else if((hF|0)==2){Fo=+h[gF+8>>3]}else if((hF|0)==3){Fo=+uz(c[gF+8>>2]|0,0)}else{b7=5096;break L27}if((c[gt>>2]|0)==3){uu(c[gu>>2]|0);c[gt>>2]=1}h[77]=Fo;a[624]=0}else{b7=5100;break L27}}while(0);if(!(ix(c[6074]|0)|0)){break L7}c[13898]=cb;gv=cb}if((b7|0)==109){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==114){uf(c[13898]|0,124136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==121){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=123984,v)|0)}else if((b7|0)==780){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==815){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==831){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==918){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==953){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else if((b7|0)==974){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==978){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==998){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1002){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1020){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1034){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1038){uf(mD,127632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1053){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1073){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1078){uf(me,127264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1083){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1097){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1101){uf(c[13898]|0,127040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1165){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1194){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1207){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1224){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1232){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1240){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1244){uf(no,129896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1251){uf(-1,129624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1284){uf((c[13898]|0)-1|0,130240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1292){c[13898]=nE;b7=1293}else if((b7|0)==1295){Fp=c[13898]|0;uf(Fp,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1360){uf(nT,131288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1402){c[13898]=n7;b7=1403}else if((b7|0)==1405){Fq=c[13898]|0;uf(Fq,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1452){c[13898]=oj;b7=1453}else if((b7|0)==1462){Fr=c[13898]|0;uf(Fr,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1693){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1742){uf(gv,154168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1747){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1764){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1769){uf(c[13898]|0,173664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1867){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1877){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1885){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1893){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1901){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1974){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1997){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2007){uf(qT,136864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2054){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2152){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2158){uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2165){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((b7|0)==2198){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=138936,v)|0)}else if((b7|0)==2201){uu(r3);uu(r2);uf(c[13898]|0,138632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2206){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2270){c[13898]=sl;b7=2271}else if((b7|0)==2280){Fs=c[13898]|0;uf(Fs,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2297){c[13898]=sr;st=sr;uf(st,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2299){st=c[13898]|0;uf(st,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2312){c[sv>>2]=sw;uf(c[13898]|0,174808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2324){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2328){uf(c[13898]|0,140880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2398){c[13898]=sX;b7=2399}else if((b7|0)==2401){Ft=c[13898]|0;uf(Ft,143264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2437){uf(s$,142184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2458){c[13898]=ta;tc=ta;uf(tc,142920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2460){tc=c[13898]|0;uf(tc,142920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2520){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2698){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2740){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2816){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2838){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2860){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2882){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2897){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2911){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2917){uf(vH,179040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2930){c[13898]=vH;b7=2931}else if((b7|0)==2933){Fu=c[13898]|0;uf(Fu,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2983){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2997){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3049){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3116){uf(vK,164e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3153){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3161){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3166){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3170){uf(c[13898]|0,159064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3182){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3186){uf(c[13898]|0,159064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3198){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3202){uf(c[13898]|0,159064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3205){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3218){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3234){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3249){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3255){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3258){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151392,v)|0)}else if((b7|0)==3282){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3296){uf((c[13898]|0)-1|0,150248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3302){uf((c[13898]|0)-1|0,150080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3308){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3312){uf((c[13898]|0)-1|0,149880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3317){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3321){uf((c[13898]|0)-1|0,149880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3326){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3330){uf((c[13898]|0)-1|0,149880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3347){uf(w$,150736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3353){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3361){c[13898]=xi;xj=xi;uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3363){xj=c[13898]|0;uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3366){uf(c[13898]|0,151816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3371){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151632,v)|0)}else if((b7|0)==3373){ez();Fv=c[13898]|0;uf(Fv,150896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3397){ez();uf(c[13898]|0,151112,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0)}else if((b7|0)==3404){uf(c[13898]|0,150736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3409){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3413){uf(xx,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3427){uf(xA,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3441){uf(xD,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3459){uf(xF,154672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3467){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3471){uf(c[13898]|0,154376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3473){uf(wg,154e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3537){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3541){c[13505]=0;uf(c[13898]|0,163320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3561){uf(xO,162224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3576){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3590){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3614){c[13898]=x5;b7=3615}else if((b7|0)==3617){Fw=c[13898]|0;uf(Fw,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3642){c[13898]=ya;b7=3643}else if((b7|0)==3645){Fx=c[13898]|0;uf(Fx,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3678){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3683){uf(yz,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3719){uf(yf,171872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3720){uf(yf,171504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3725){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3742){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3747){uf(c[13898]|0,173664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3775){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3802){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3815){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3821){g[38]=1.0;g[178]=1.0;uf(-1,174280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3845){uf(zN,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3860){uf(zT,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3879){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3884){uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3894){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=176728,v)|0)}else if((b7|0)==3974){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4075){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4079){uf(AC,193912,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4110){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4186){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4197){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4213){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4217){uf((c[13898]|0)-1|0,204376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4243){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4247){uf((c[13898]|0)-1|0,203376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4290){uf(zm,208496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4304){uj(c[13898]|0,214704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4308){uf(BU,217328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4376){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4392){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4493){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4506){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4527){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4668){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4686){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4714){c[13898]=Ea;Fy=Ea;uf(Fy,73560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4722){c[13898]=D4;Fy=D4;uf(Fy,73560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4725){Fy=c[13898]|0;uf(Fy,73560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4796){c[13898]=Ec;EH=Ec;uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4798){EH=c[13898]|0;uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4854){uf(ER,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4859){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4867){uf(c[13898]|0,21904,(v=i,i=i+16|0,c[v>>2]=120,c[v+8>>2]=360,v)|0)}else if((b7|0)==4869){uf(c[13898]|0,21904,(v=i,i=i+16|0,c[v>>2]=122,c[v+8>>2]=360,v)|0)}else if((b7|0)==4871){uf(c[13898]|0,21864,(v=i,i=i+8|0,c[v>>2]=179864,v)|0)}else if((b7|0)==4873){uf(c[13898]|0,21864,(v=i,i=i+8|0,c[v>>2]=77416,v)|0)}else if((b7|0)==4881){uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4976){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4992){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5008){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5024){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5040){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5056){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5072){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5088){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5096){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5100){uf(gv,204968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5107){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5108){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5109){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5110){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5111){uf(hT,123864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5112){uf(hT,123864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5113){uf(hQ,123776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5114){uf(hQ,123776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5115){uf(hq,123648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5116){uf(hq,123648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5117){uf(hq,123648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5118){uf(hq,123512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5119){uf(hq,123512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5120){uf(kI,124880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5121){uf(kI,124880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5122){uf(kI,124880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5123){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5124){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5125){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5126){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5127){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5128){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5129){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5130){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5131){uf(mj,128168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5132){uf(mj,128168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5133){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5134){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5135){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5136){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5137){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5138){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5139){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5140){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5141){uf(mD,127528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5142){uf(mD,127528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5143){uf(mD,127528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5144){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5145){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5146){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5147){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5148){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5149){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5150){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5151){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5152){uf(-1,129776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5153){uf(-1,129776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5156){uf(nK,130792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5157){uf(nK,130792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5158){uf(nQ,130664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5159){uf(nQ,130664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5162){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5163){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5164){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5165){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5168){uf(qP,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5169){uf(qP,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5170){uf(qP,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5171){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5172){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5173){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5174){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5175){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5176){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5177){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5178){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5181){uf(st,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5184){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5185){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5186){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5187){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5190){uf(s$,142560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5191){uf(s$,142560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5192){uf(tc,142920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5195){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5196){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5197){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5198){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5199){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5200){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5201){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5202){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5203){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5204){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5205){uf(vo,143744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5206){uf(vo,143744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5207){uf(tq,143392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5208){uf(tq,143392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5209){uf(tq,143392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5210){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5211){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5212){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5213){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5216){uf(vT,170376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5217){uf(vT,170376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5218){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5219){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5220){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5221){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5222){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5223){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5224){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5225){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5226){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5227){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5228){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5229){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5230){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5231){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5232){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5233){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5234){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5235){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5236){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5237){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5238){uf(wO,150560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5239){uf(wO,150560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5240){uf(wO,150560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5241){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5242){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5243){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5244){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5245){uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5246){uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5250){Fv=c[13898]|0;uf(Fv,150896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5251){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5252){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5253){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5254){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5255){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5256){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5257){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5258){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5259){uf(xF,155040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5260){uf(xF,155040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5261){uf(x$,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5262){uf(x$,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5263){uf(x0,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5264){uf(x0,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5265){uf(x7,148728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5266){uf(x7,148728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5267){uf(x7,148728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5272){uf(yU,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5273){uf(yU,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5274){uf(yU,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5275){uf(zT,214008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5276){uf(zT,214008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5277){uf(z7,176128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5278){uf(z7,176128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5279){uf(z7,176128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5280){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5281){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5282){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5283){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5284){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5285){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5286){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5287){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5288){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5289){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5290){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5291){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5292){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5293){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5294){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5295){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5296){uf(BW,217888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5297){uf(BW,217888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5298){uf(BW,217888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5299){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5300){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5301){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5302){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5303){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5304){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5305){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5306){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5310){uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5311){uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5312){uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((b7|0)==1293){c[12886]=0;Fp=nE;uf(Fp,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1403){c[10568]=0;Fq=n7;uf(Fq,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1453){c[bv>>2]=0;Fr=oj;uf(Fr,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2271){c[a8>>2]=0;Fs=sl;uf(Fs,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2399){c[8528]=0;Ft=sX;uf(Ft,143264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2931){c[aF>>2]=0;Fu=vH;uf(Fu,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3615){c[ad>>2]=0;Fw=x5;uf(Fw,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3643){c[57238]=0;Fx=ya;uf(Fx,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);e7(0);Fx=c[6074]|0;if((Fx|0)!=0){ya=Fx;while(1){Fx=c[ya>>2]|0;uu(c[ya+12>>2]|0);uu(ya);if((Fx|0)==0){break}else{ya=Fx}}}c[6074]=0;i=d;return}function jp(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;b=i;i=i+40|0;d=b|0;e=b+24|0;f=e|0;g=e|0;uE(g|0,0,11);h=c[13898]|0;j=h+1|0;c[13898]=j;k=c[1054]|0;l=c[k+(j*40&-1)+36>>2]|0;m=c[k+(j*40&-1)+32>>2]|0;n=(a[k+(j*40&-1)|0]&1)==0;o=(l|0)>0;p=c[10036]|0;q=56720;r=77416;L7279:while(1){L7281:do{if(!n){if(o){s=0;t=0;u=m;while(1){w=a[r+s|0]|0;if(w<<24>>24==(a[p+(s+u|0)|0]|0)){x=u;y=t}else{if(w<<24>>24!=36){break L7281}x=u-1|0;y=1}z=s+1|0;if((z|0)<(y+l|0)){s=z;t=y;u=x}else{break}}if((y|0)==0){A=z}else{B=q;break L7279}}else{A=0}u=a[r+A|0]|0;if((u<<24>>24|0)==36|(u<<24>>24|0)==0){B=q;break L7279}}}while(0);u=q+8|0;t=c[u>>2]|0;if((t|0)==0){B=u;break}else{q=u;r=t}}r=c[B+4>>2]|0;L7294:do{if((r|0)>-1){a[e+r|0]=1;B=h+2|0;c[13898]=B;C=B;D=c[8272]|0}else{B=c[8272]|0;q=(B|0)>(j|0);L7296:do{if(!(n|q^1)){A=0;while(1){if((A|0)>=(l|0)){E=5332;break}if((a[p+(m+A|0)|0]|0)==(a[A+150688|0]|0)){A=A+1|0}else{E=5333;break}}if((E|0)==5332){if((A|0)!=2){E=5333}}if((E|0)==5333){if(n|q^1){break}else{F=0}while(1){if((F|0)>=(l|0)){break}if((a[p+(m+F|0)|0]|0)==(a[F+148800|0]|0)){F=F+1|0}else{break L7296}}if((F|0)!=2){break}}a[e+1|0]=1;a[e+2|0]=1;A=h+2|0;c[13898]=A;C=A;D=B;break L7294}}while(0);uE(f|0,1,11);C=j;D=B}}while(0);L7312:do{if((C|0)<(D|0)){j=(a[k+(C*40&-1)|0]&1)==0;L7314:do{if(j){G=d}else{f=c[k+(C*40&-1)+36>>2]|0;h=k+(C*40&-1)+32|0;F=0;while(1){if((F|0)>=(f|0)){E=5345;break}if((a[p+((c[h>>2]|0)+F|0)|0]|0)==(a[F+103664|0]|0)){F=F+1|0}else{break}}if((E|0)==5345){if((F|0)==1){break L7312}}h=d;if(j){G=h;break}f=c[k+(C*40&-1)+36>>2]|0;m=k+(C*40&-1)+32|0;l=0;while(1){if((l|0)>=(f|0)){break}if((a[p+((c[m>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{G=h;break L7314}}if((l|0)==1){H=C}else{G=h;break}uf(H,133088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=C;H=C;uf(H,133088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[d+8>>2]|0;if((j|0)==0){H=c[13898]|0;uf(H,133088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[e+2|0]&1)!=0){uF(66240,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){I=0}else{m=B+1|0;L7342:do{if((m|0)==0){J=0}else{f=m;while(1){F=a[f]|0;if(!((F<<24>>24|0)==32|(F<<24>>24|0)==45|(F<<24>>24|0)==43|(F<<24>>24|0)==35)){J=f;break L7342}F=f+1|0;if((F|0)==0){J=0;break}else{f=F}}}}while(0);while(1){K=a[J]|0;if(!(((K&255)-48|0)>>>0<10|K<<24>>24==46)){break}J=J+1|0}if((K-102&255)<2){I=1;break}I=K<<24>>24==101&1}}while(0);a[66188]=I}if((a[e+1|0]&1)!=0){uF(65552,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){L=0}else{m=B+1|0;L7357:do{if((m|0)==0){M=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){M=h;break L7357}l=h+1|0;if((l|0)==0){M=0;break}else{h=l}}}}while(0);while(1){N=a[M]|0;if(!(((N&255)-48|0)>>>0<10|N<<24>>24==46)){break}M=M+1|0}if((N-102&255)<2){L=1;break}L=N<<24>>24==101&1}}while(0);a[65500]=L}if((a[g]&1)!=0){uF(64864,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){O=0}else{m=B+1|0;L7372:do{if((m|0)==0){P=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){P=h;break L7372}l=h+1|0;if((l|0)==0){P=0;break}else{h=l}}}}while(0);while(1){Q=a[P]|0;if(!(((Q&255)-48|0)>>>0<10|Q<<24>>24==46)){break}P=P+1|0}if((Q-102&255)<2){O=1;break}O=Q<<24>>24==101&1}}while(0);a[64812]=O}if((a[e+6|0]&1)!=0){uF(68992,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){R=0}else{m=B+1|0;L7387:do{if((m|0)==0){S=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){S=h;break L7387}l=h+1|0;if((l|0)==0){S=0;break}else{h=l}}}}while(0);while(1){T=a[S]|0;if(!(((T&255)-48|0)>>>0<10|T<<24>>24==46)){break}S=S+1|0}if((T-102&255)<2){R=1;break}R=T<<24>>24==101&1}}while(0);a[68940]=R}if((a[e+5|0]&1)!=0){uF(68304,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){U=0}else{m=B+1|0;L7402:do{if((m|0)==0){V=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){V=h;break L7402}l=h+1|0;if((l|0)==0){V=0;break}else{h=l}}}}while(0);while(1){W=a[V]|0;if(!(((W&255)-48|0)>>>0<10|W<<24>>24==46)){break}V=V+1|0}if((W-102&255)<2){U=1;break}U=W<<24>>24==101&1}}while(0);a[68252]=U}if((a[e+3|0]&1)!=0){uF(66928,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){X=0}else{m=B+1|0;L7417:do{if((m|0)==0){Y=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){Y=h;break L7417}l=h+1|0;if((l|0)==0){Y=0;break}else{h=l}}}}while(0);while(1){Z=a[Y]|0;if(!(((Z&255)-48|0)>>>0<10|Z<<24>>24==46)){break}Y=Y+1|0}if((Z-102&255)<2){X=1;break}X=Z<<24>>24==101&1}}while(0);a[66876]=X}if((a[e+7|0]&1)!=0){uF(69680,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){_=0}else{m=B+1|0;L7432:do{if((m|0)==0){$=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){$=h;break L7432}l=h+1|0;if((l|0)==0){$=0;break}else{h=l}}}}while(0);while(1){aa=a[$]|0;if(!(((aa&255)-48|0)>>>0<10|aa<<24>>24==46)){break}$=$+1|0}if((aa-102&255)<2){_=1;break}_=aa<<24>>24==101&1}}while(0);a[69628]=_}uu(j);i=b;return}}while(0);if((a[e+2|0]&1)!=0){c[16560]=6758437;a[66188]=1}if((a[e+1|0]&1)!=0){c[16388]=6758437;a[65500]=1}if((a[g]&1)!=0){c[16216]=6758437;a[64812]=1}if((a[e+6|0]&1)!=0){c[17248]=6758437;a[68940]=1}if((a[e+5|0]&1)!=0){c[17076]=6758437;a[68252]=1}if((a[e+3|0]&1)!=0){c[16732]=6758437;a[66876]=1}if((a[e+7|0]&1)==0){i=b;return}c[17420]=6758437;a[69628]=1;i=b;return}function jq(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+24|0;e=d|0;f=(c[13898]|0)+1|0;c[13898]=f;L7468:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L7470:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L7470}}if((l|0)==1){break L7468}}}while(0);jw(b);g=c[13898]|0;L7477:do{if((g|0)<(c[8272]|0)){j=c[1054]|0;k=(a[j+(g*40&-1)|0]&1)==0;L7479:do{if(k){m=e}else{h=c[j+(g*40&-1)+36>>2]|0;n=j+(g*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(h|0)){q=5461;break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((q|0)==5461){if((p|0)==1){break L7477}}n=e;if(k){m=n;break}o=c[j+(g*40&-1)+36>>2]|0;h=j+(g*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(o|0)){break}if((a[r+((c[h>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{m=n;break L7479}}if((s|0)==1){break L7477}else{m=n}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)!=3){c[13898]=g;break}j=c[e+8>>2]|0;if((j|0)==0){break}k=b+60|0;uu(c[k>>2]|0);c[k>>2]=j}}while(0);jw(b);i=d;return}}while(0);e=b+60|0;uu(c[e>>2]|0);c[e>>2]=0;i=d;return}function jr(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=i;i=i+48|0;e=d|0;f=d+24|0;g=(c[13898]|0)+1|0;c[13898]=g;if((g|0)>=(c[8272]|0)){j=g;uf(j,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;L7506:do{if((a[k+(g*40&-1)|0]&1)!=0){l=c[k+(g*40&-1)+36>>2]|0;m=k+(g*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break L7506}}if((o|0)==1){j=g}else{break}uf(j,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);g=is(e)|0;k=c[g>>2]|0;if((k|0)==3){p=+uz(c[g+8>>2]|0,0)}else if((k|0)==2){p=+h[g+8>>3]}else if((k|0)==1){p=+(c[g+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e|0;if((c[g>>2]|0)==3){uu(c[e+8>>2]|0);c[g>>2]=1}g=~~p;if((g|0)<1){j=c[13898]|0;uf(j,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{q=b;r=0}while(1){s=c[q>>2]|0;if((s|0)==0){t=0;u=5494;break}w=c[s+4>>2]|0;if((g|0)>(w|0)){q=s|0;r=s}else{u=5493;break}}if((u|0)==5493){if((g|0)==(w|0)){x=s}else{t=s;u=5494}}if((u|0)==5494){s=f|0;uE(s|0,0,24);f=g-1|0;w=ut(64)|0;do{if((w|0)==0){gk();q=ut(64)|0;if((q|0)!=0){y=q;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=128152,v)|0)}else{y=w}}while(0);w=y;if((r|0)==0){c[b>>2]=w}else{c[r>>2]=w}c[y+4>>2]=g;c[y>>2]=t;c[y+8>>2]=0;c[y+12>>2]=f;c[y+16>>2]=f;c[y+20>>2]=0;h[y+24>>3]=1.0;h[y+32>>3]=-2.0;f=y+40|0;c[f>>2]=c[s>>2];c[f+4>>2]=c[s+4>>2];c[f+8>>2]=c[s+8>>2];c[f+12>>2]=c[s+12>>2];c[f+16>>2]=c[s+16>>2];c[f+20>>2]=c[s+20>>2];x=w}w=c[13898]|0;s=c[1054]|0;f=c[s+(w*40&-1)+36>>2]|0;L7542:do{if((a[s+(w*40&-1)|0]&1)!=0&(f|0)>0){y=c[10036]|0;t=0;g=0;q=c[s+(w*40&-1)+32>>2]|0;while(1){if((a[t+184456|0]|0)==(a[y+(t+q|0)|0]|0)){z=q;A=g}else{if((t|0)!=3){u=5515;break L7542}z=q-1|0;A=1}j=t+1|0;if((j|0)<(A+f|0)){t=j;g=A;q=z}else{break}}if((A|0)==0){if(!((t|0)==2|(t|0)==7)){u=5515;break}}if((x|0)==0){B=w}else{q=c[x>>2]|0;if((c[b>>2]|0)==(x|0)){c[b>>2]=q}else{c[r>>2]=q}uu(x);B=c[13898]|0}q=B+1|0;c[13898]=q;C=q}else{u=5515}}while(0);if((u|0)==5515){B=x+8|0;hH(B,0,1);C=c[13898]|0}if((C|0)>=(c[8272]|0)){i=d;return}B=c[1054]|0;if((a[B+(C*40&-1)|0]&1)==0){D=(b|0)==43264;E=D?124560:123144;uf(C,125776,(v=i,i=i+8|0,c[v>>2]=E,v)|0)}x=c[B+(C*40&-1)+36>>2]|0;r=B+(C*40&-1)+32|0;B=c[10036]|0;w=0;while(1){if((w|0)>=(x|0)){break}if((a[B+((c[r>>2]|0)+w|0)|0]|0)==(a[w+103664|0]|0)){w=w+1|0}else{u=5530;break}}if((u|0)==5530){D=(b|0)==43264;E=D?124560:123144;uf(C,125776,(v=i,i=i+8|0,c[v>>2]=E,v)|0)}if((w|0)==1){i=d;return}else{D=(b|0)==43264;E=D?124560:123144;uf(C,125776,(v=i,i=i+8|0,c[v>>2]=E,v)|0)}}function js(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0;d=i;i=i+24|0;e=d|0;f=b|0;c[f>>2]=4;g=b+16|0;h[g>>3]=-1.0;b=c[13898]|0;j=b+1|0;c[13898]=j;if((j|0)>=(c[8272]|0)){i=d;return}k=c[1054]|0;l=a[k+(j*40&-1)|0]|0;m=(l&1)==0;L7583:do{if(m){n=j;o=l}else{p=c[k+(j*40&-1)+36>>2]|0;q=k+(j*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){t=5537;break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break}}do{if((t|0)==5537){if((s|0)!=1){break}i=d;return}}while(0);if(m){n=j;o=l;break}s=c[k+(j*40&-1)+36>>2]|0;q=k+(j*40&-1)+32|0;r=c[10036]|0;p=0;while(1){if((p|0)>=(s|0)){break}if((a[r+((c[q>>2]|0)+p|0)|0]|0)==(a[p+95280|0]|0)){p=p+1|0}else{n=j;o=l;break L7583}}if((p|0)!=2){n=j;o=l;break}q=b+2|0;c[13898]=q;s=c[k+(q*40&-1)+36>>2]|0;u=a[k+(q*40&-1)|0]|0;if((u&1)!=0&(s|0)>0){w=0;x=0;y=c[k+(q*40&-1)+32>>2]|0}else{uf(q,141880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){if((a[w+142056|0]|0)==(a[r+(w+y|0)|0]|0)){z=y;A=x}else{if((w|0)!=2){t=5575;break}z=y-1|0;A=1}B=w+1|0;if((B|0)<(A+s|0)){w=B;x=A;y=z}else{break}}if((t|0)==5575){uf(q,141880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((A|0)!=0){n=q;o=u;break}if((w|0)==1|(w|0)==6){n=q;o=u;break}uf(q,141880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=c[k+(n*40&-1)+36>>2]|0;L7612:do{if((o&1)!=0&(w|0)>0){A=c[10036]|0;t=0;z=0;y=c[k+(n*40&-1)+32>>2]|0;while(1){if((a[t+142056|0]|0)==(a[A+(t+y|0)|0]|0)){C=y;D=z}else{if((t|0)!=2){break L7612}C=y-1|0;D=1}x=t+1|0;if((x|0)<(D+w|0)){t=x;z=D;y=C}else{break}}if((D|0)==0){if(!((t|0)==1|(t|0)==6)){break}}c[f>>2]=3;c[13898]=(c[13898]|0)+1}}while(0);D=is(e)|0;C=c[D>>2]|0;if((C|0)==1){E=+(c[D+8>>2]|0)}else if((C|0)==2){E=+h[D+8>>3]}else if((C|0)==3){E=+uz(c[D+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=e|0;if((c[D>>2]|0)==3){uu(c[e+8>>2]|0);c[D>>2]=1}D=E<0.0;F=D?-1.0:E;h[g>>3]=F;if((c[f>>2]|0)!=3){i=d;return}if(D){h[g>>3]=0.0;i=d;return}if(F<=1.0){i=d;return}h[g>>3]=1.0;i=d;return}function jt(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0.0,by=0.0,bz=0,bA=0,bB=0.0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0.0,cs=0.0,ct=0.0,cu=0,cv=0.0,cw=0,cx=0,cy=0,cz=0.0,cA=0,cB=0,cC=0,cD=0,cE=0.0,cF=0.0,cG=0.0,cH=0.0,cI=0.0,cJ=0.0,cK=0,cL=0,cM=0.0,cN=0.0,cO=0.0,cP=0.0,cQ=0,cR=0.0,cS=0.0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,db=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0,dk=0,dm=0,dn=0,dq=0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0,dC=0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0.0,dJ=0,dK=0,dL=0,dM=0;d=i;i=i+656|0;e=d|0;f=d+24|0;g=d+48|0;j=d+72|0;k=d+96|0;l=d+120|0;m=d+144|0;n=d+168|0;o=d+192|0;p=d+216|0;q=d+264|0;r=d+272|0;s=d+296|0;t=d+320|0;u=d+344|0;w=d+368|0;x=d+392|0;y=d+416|0;z=d+464|0;A=d+472|0;B=d+520|0;C=d+528|0;D=d+576|0;E=d+584|0;F=d+608|0;G=d+624|0;H=F|0;a[H]=a[136208]|0;a[H+1|0]=a[136209|0]|0;a[H+2|0]=a[136210|0]|0;I=F+2|0;J=56832+(b*24&-1)|0;uB(I|0,J|0);K=F+(uA(H|0)|0)|0;a[K]=a[120232]|0;a[K+1|0]=a[120233|0]|0;a[K+2|0]=a[120234|0]|0;a[K+3|0]=a[120235|0]|0;a[K+4|0]=a[120236|0]|0;a[K+5|0]=a[120237|0]|0;H=c[13898]|0;L=c[1054]|0;M=c[L+(H*40&-1)+36>>2]|0;N=c[L+(H*40&-1)+32>>2]|0;L7646:do{if((a[L+(H*40&-1)|0]&1)==0){P=H}else{if((M|0)>0){Q=c[10036]|0;R=0;S=0;T=N;while(1){U=a[F+(R+2|0)|0]|0;if(U<<24>>24==(a[Q+(R+T|0)|0]|0)){V=T;W=S}else{if(U<<24>>24!=36){P=H;break L7646}V=T-1|0;W=1}X=R+1|0;if((X|0)<(W+M|0)){R=X;S=W;T=V}else{break}}if((W|0)==0){Y=X;Z=5590}}else{Y=0;Z=5590}if((Z|0)==5590){T=a[F+(Y+2|0)|0]|0;if(!((T<<24>>24|0)==36|(T<<24>>24|0)==0)){P=H;break}}T=64976+(b*688&-1)|0;a[T]=0;S=H+1|0;c[13898]=S;R=e|0;Q=e+8|0;U=64864+(b*688&-1)|0;_=64812+(b*688&-1)|0;$=64944+(b*688&-1)|0;aa=o|0;ab=o+8|0;ac=64808+(b*688&-1)|0;ad=n|0;ae=n+8|0;af=64813+(b*688&-1)|0;ag=m|0;ah=m+8|0;ai=l|0;aj=l+8|0;ak=x|0;al=x+8|0;am=w|0;an=w+8|0;ao=u|0;ap=u+8|0;aq=t|0;ar=t+8|0;as=s|0;at=s+8|0;au=r|0;av=r+8|0;aw=64944+(b*688&-1)|0;ax=64920+(b*688&-1)|0;ay=64952+(b*688&-1)|0;az=64960+(b*688&-1)|0;aA=64968+(b*688&-1)|0;aB=64928+(b*688&-1)|0;aC=(b|0)==0?6:5;aD=64924+(b*688&-1)|0;aE=f|0;aF=f+8|0;aG=65024+(b*688&-1)|0;aH=65272+(b*688&-1)|0;aI=65128+(b*688&-1)|0;aJ=G|0;aK=64984+(b*688&-1)|0;aL=64988+(b*688&-1)|0;aM=64992+(b*688&-1)|0;aN=(64648+(b*688&-1)|0)+348|0;aO=64984+(b*688&-1)|0;aP=65032+(b*688&-1)|0;aQ=g|0;aR=g+8|0;aS=k|0;aT=k+8|0;aU=65056+(b*688&-1)|0;aV=j|0;aW=j+8|0;aX=65064+(b*688&-1)|0;aY=65072+(b*688&-1)|0;aZ=64916+(b*688&-1)|0;a_=0;a$=0;a0=S;a1=L;a2=a[L+(S*40&-1)|0]|0;L7660:while(1){S=c[a1+(a0*40&-1)+36>>2]|0;a3=c[a1+(a0*40&-1)+32>>2]|0;a4=(a2&1)==0;L7662:do{if((S|0)>0&(a4^1)){a5=c[10036]|0;a6=0;a7=0;a9=a3;while(1){if((a[a6+116896|0]|0)==(a[a5+(a6+a9|0)|0]|0)){ba=a9;bb=a7}else{if((a6|0)!=2){break}ba=a9-1|0;bb=1}bc=a6+1|0;if((bc|0)<(bb+S|0)){a6=bc;a7=bb;a9=ba}else{Z=5598;break}}do{if((Z|0)==5598){Z=0;if((bb|0)==0){if(!((a6|0)==1|(a6|0)==4)){break}}c[aZ>>2]=c[aZ>>2]&-4|2;c[13898]=a0+1;bd=1;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7677:do{if((S|0)>0){a6=c[10036]|0;a9=0;a7=0;a5=a3;while(1){if((a[a9+141136|0]|0)==(a[a6+(a9+a5|0)|0]|0)){bf=a5;bg=a7}else{if((a9|0)!=2){break L7677}bf=a5-1|0;bg=1}bc=a9+1|0;if((bc|0)<(bg+S|0)){a9=bc;a7=bg;a5=bf}else{break}}if((bg|0)==0){if(!((a9|0)==1|(a9|0)==6)){break}}c[aZ>>2]=c[aZ>>2]&-4|1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a5=c[10036]|0;a7=0;a6=0;bc=a3;while(1){if((a[a7+115048|0]|0)==(a[a5+(a7+bc|0)|0]|0)){bh=bc;bi=a6}else{if((a7|0)!=2){break}bh=bc-1|0;bi=1}bj=a7+1|0;if((bj|0)<(bi+S|0)){a7=bj;a6=bi;bc=bh}else{Z=5617;break}}do{if((Z|0)==5617){Z=0;if((bi|0)==0){if(!((a7|0)==1|(a7|0)==6)){break}}c[aZ>>2]=c[aZ>>2]|4;c[13898]=a0+1;bd=a_;be=1;break L7662}}while(0);if(a4){Z=5835;break}L7704:do{if((S|0)>0){a7=c[10036]|0;bc=0;a6=0;a5=a3;while(1){if((a[bc+114024|0]|0)==(a[a7+(bc+a5|0)|0]|0)){bk=a5;bl=a6}else{if((bc|0)!=4){break L7704}bk=a5-1|0;bl=1}bj=bc+1|0;if((bj|0)<(bl+S|0)){bc=bj;a6=bl;a5=bk}else{break}}if((bl|0)==0){if(!((bc|0)==3|(bc|0)==8)){break}}c[aZ>>2]=c[aZ>>2]&-5;c[13898]=a0+1;bd=a_;be=1;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a5=c[10036]|0;a6=0;a7=0;a9=a3;while(1){if((a[a6+110600|0]|0)==(a[a5+(a6+a9|0)|0]|0)){bm=a9;bn=a7}else{if((a6|0)!=2){break}bm=a9-1|0;bn=1}bj=a6+1|0;if((bj|0)<(bn+S|0)){a6=bj;a7=bn;a9=bm}else{Z=5636;break}}do{if((Z|0)==5636){Z=0;if((bn|0)==0){if(!((a6|0)==1|(a6|0)==7)){break}}a[aY]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7731:do{if((S|0)>0){a6=c[10036]|0;a9=0;a7=0;a5=a3;while(1){if((a[a9+107800|0]|0)==(a[a6+(a9+a5|0)|0]|0)){bo=a5;bp=a7}else{if((a9|0)!=3){break L7731}bo=a5-1|0;bp=1}bj=a9+1|0;if((bj|0)<(bp+S|0)){a9=bj;a7=bp;a5=bo}else{break}}if((bp|0)==0){if(!((a9|0)==2|(a9|0)==8)){break}}a[aY]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a5=c[10036]|0;a7=0;a6=0;bc=a3;while(1){if((a[a7+106864|0]|0)==(a[a5+(a7+bc|0)|0]|0)){bq=bc;br=a6}else{if((a7|0)!=2){break}bq=bc-1|0;br=1}bj=a7+1|0;if((bj|0)<(br+S|0)){a7=bj;a6=br;bc=bq}else{Z=5655;break}}do{if((Z|0)==5655){Z=0;if((br|0)==0){if(!((a7|0)==5|(a7|0)==1)){break}}bc=a0+1|0;c[13898]=bc;a6=c[a1+(bc*40&-1)+36>>2]|0;L7756:do{if((a[a1+(bc*40&-1)|0]&1)!=0&(a6|0)>0){a5=c[10036]|0;bj=0;bs=0;bt=c[a1+(bc*40&-1)+32>>2]|0;while(1){if((a[bj+184456|0]|0)==(a[a5+(bj+bt|0)|0]|0)){bu=bt;bv=bs}else{if((bj|0)!=3){break L7756}bu=bt-1|0;bv=1}bw=bj+1|0;if((bw|0)<(bv+a6|0)){bj=bw;bs=bv;bt=bu}else{break}}if((bv|0)==0){if(!((bj|0)==2|(bj|0)==7)){break}}h[aU>>3]=1.0;h[aX>>3]=.5;c[13898]=a0+2;bd=a_;be=a$;break L7662}}while(0);a6=is(k)|0;bc=c[a6>>2]|0;if((bc|0)==1){bx=+(c[a6+8>>2]|0)}else if((bc|0)==2){bx=+h[a6+8>>3]}else if((bc|0)==3){bx=+uz(c[a6+8>>2]|0,0)}else{Z=5670;break L7660}if((c[aS>>2]|0)==3){uu(c[aT>>2]|0);c[aS>>2]=1}h[aU>>3]=bx;a6=c[13898]|0;L7777:do{if((c[8272]|0)>(a6|0)){bc=c[1054]|0;if((a[bc+(a6*40&-1)|0]&1)==0){break}a9=c[bc+(a6*40&-1)+36>>2]|0;bt=bc+(a6*40&-1)+32|0;bc=c[10036]|0;bs=0;while(1){if((bs|0)>=(a9|0)){break}if((a[bc+((c[bt>>2]|0)+bs|0)|0]|0)==(a[bs+148464|0]|0)){bs=bs+1|0}else{break L7777}}if((bs|0)!=1){break}c[13898]=a6+1;bt=is(j)|0;bc=c[bt>>2]|0;if((bc|0)==1){by=+(c[bt+8>>2]|0)}else if((bc|0)==2){by=+h[bt+8>>3]}else if((bc|0)==3){by=+uz(c[bt+8>>2]|0,0)}else{Z=5683;break L7660}if((c[aV>>2]|0)==3){uu(c[aW>>2]|0);c[aV>>2]=1}h[aX>>3]=by;bd=a_;be=a$;break L7662}}while(0);h[aX>>3]=bx*.5;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a7=c[10036]|0;a6=0;bt=0;bc=a3;while(1){if((a[a6+104840|0]|0)==(a[a7+(a6+bc|0)|0]|0)){bz=bc;bA=bt}else{if((a6|0)!=2){break}bz=bc-1|0;bA=1}a9=a6+1|0;if((a9|0)<(bA+S|0)){a6=a9;bt=bA;bc=bz}else{Z=5694;break}}do{if((Z|0)==5694){Z=0;if((bA|0)==0){if(!((a6|0)==1|(a6|0)==6)){break}}c[aP>>2]=-270;bc=a0+1|0;c[13898]=bc;if((c[8272]|0)<=(bc|0)){bd=a_;be=a$;break L7662}if((a[a1+(bc*40&-1)|0]&1)==0){bd=a_;be=a$;break L7662}bt=c[a1+(bc*40&-1)+36>>2]|0;a7=a1+(bc*40&-1)+32|0;bc=c[10036]|0;a9=0;while(1){if((a9|0)>=(bt|0)){break}if((a[bc+((c[a7>>2]|0)+a9|0)|0]|0)==(a[a9+163312|0]|0)){a9=a9+1|0}else{bd=a_;be=a$;break L7662}}if((a9|0)!=2){bd=a_;be=a$;break L7662}c[13898]=a0+2;a7=is(g)|0;bc=c[a7>>2]|0;if((bc|0)==2){bB=+h[a7+8>>3]}else if((bc|0)==3){bB=+uz(c[a7+8>>2]|0,0)}else if((bc|0)==1){bB=+(c[a7+8>>2]|0)}else{Z=5706;break L7660}if((c[aQ>>2]|0)==3){uu(c[aR>>2]|0);c[aQ>>2]=1}c[aP>>2]=~~bB;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7824:do{if((S|0)>0){a6=c[10036]|0;a7=0;bc=0;bt=a3;while(1){if((a[a7+104240|0]|0)==(a[a6+(a7+bt|0)|0]|0)){bC=bt;bD=bc}else{if((a7|0)!=4){break L7824}bC=bt-1|0;bD=1}bj=a7+1|0;if((bj|0)<(bD+S|0)){a7=bj;bc=bD;bt=bC}else{break}}if((bD|0)==0){if(!((a7|0)==3|(a7|0)==8)){break}}c[aP>>2]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}bt=c[10036]|0;bc=0;a6=0;a9=a3;while(1){if((a[bc+152064|0]|0)==(a[bt+(bc+a9|0)|0]|0)){bE=a9;bF=a6}else{if((bc|0)!=3){break}bE=a9-1|0;bF=1}bj=bc+1|0;if((bj|0)<(bF+S|0)){bc=bj;a6=bF;a9=bE}else{Z=5726;break}}do{if((Z|0)==5726){Z=0;if((bF|0)==0){if(!((bc|0)==6|(bc|0)==2)){break}}c[13898]=a0+1;dl(aO,4);bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}bc=c[10036]|0;a9=0;a6=0;bt=a3;while(1){if((a[a9+153128|0]|0)==(a[bc+(a9+bt|0)|0]|0)){bG=bt;bH=a6}else{if((a9|0)!=5){break}bG=bt-1|0;bH=1}bj=a9+1|0;if((bj|0)<(bH+S|0)){a9=bj;a6=bH;bt=bG}else{Z=5735;break}}do{if((Z|0)==5735){Z=0;if((bH|0)==0){if(!((a9|0)==4|(a9|0)==8)){break}}uE(aJ|0,0,28);c[13898]=a0+1;c[aK>>2]=4;c[aL>>2]=4;c[aM>>2]=4;c[aN>>2]=c[aJ>>2];c[aN+4>>2]=c[aJ+4>>2];c[aN+8>>2]=c[aJ+8>>2];c[aN+12>>2]=c[aJ+12>>2];c[aN+16>>2]=c[aJ+16>>2];c[aN+20>>2]=c[aJ+20>>2];c[aN+24>>2]=c[aJ+24>>2];bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7864:do{if((S|0)>0){a9=c[10036]|0;bt=0;a6=0;bc=a3;while(1){if((a[bt+149696|0]|0)==(a[a9+(bt+bc|0)|0]|0)){bI=bc;bJ=a6}else{if((bt|0)!=1){break L7864}bI=bc-1|0;bJ=1}bj=bt+1|0;if((bj|0)<(bJ+S|0)){bt=bj;a6=bJ;bc=bI}else{break}}if((bJ|0)==0){if(!((bt|0)==0|(bt|0)==4)){break}}c[aI>>2]=0;a[aH]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}bc=c[10036]|0;a6=0;a9=0;a7=a3;while(1){if((a[a6+179896|0]|0)==(a[bc+(a6+a7|0)|0]|0)){bK=a7;bL=a9}else{if((a6|0)!=1){Z=5756;break}bK=a7-1|0;bL=1}bj=a6+1|0;if((bj|0)<(bL+S|0)){a6=bj;a9=bL;a7=bK}else{Z=5754;break}}do{if((Z|0)==5754){Z=0;if((bL|0)!=0){break}if(!((a6|0)==0|(a6|0)==6)){Z=5756}}}while(0);L7887:do{if((Z|0)==5756){Z=0;if(a4){Z=5835;break L7662}L7890:do{if((S|0)>0){a6=c[10036]|0;a7=0;a9=0;bc=a3;while(1){if((a[a7+149304|0]|0)==(a[a6+(a7+bc|0)|0]|0)){bM=bc;bN=a9}else{if((a7|0)!=1){break L7890}bM=bc-1|0;bN=1}bj=a7+1|0;if((bj|0)<(bN+S|0)){a7=bj;a9=bN;bc=bM}else{break}}if((bN|0)!=0){break L7887}if((a7|0)==0|(a7|0)==6){break L7887}}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break L7662}bt=c[10036]|0;bc=0;a9=0;a6=a3;while(1){if((a[bc+101272|0]|0)==(a[bt+(bc+a6|0)|0]|0)){bO=a6;bP=a9}else{if((bc|0)!=2){break}bO=a6-1|0;bP=1}bs=bc+1|0;if((bs|0)<(bP+S|0)){bc=bs;a9=bP;a6=bO}else{Z=5772;break}}do{if((Z|0)==5772){Z=0;if((bP|0)==0){if(!((bc|0)==1|(bc|0)==5)){break}}c[aI>>2]=2;a[aH]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break L7662}L7915:do{if((S|0)>0){bc=c[10036]|0;a6=0;a9=0;bt=a3;while(1){if((a[a6+100712|0]|0)==(a[bc+(a6+bt|0)|0]|0)){bQ=bt;bR=a9}else{if((a6|0)!=5){break L7915}bQ=bt-1|0;bR=1}bs=a6+1|0;if((bs|0)<(bR+S|0)){a6=bs;a9=bR;bt=bQ}else{break}}if((bR|0)==0){if(!((a6|0)==4|(a6|0)==11)){break}}a[aH]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break L7662}bt=c[10036]|0;a9=0;bc=0;a7=a3;while(1){if((a[a9+100040|0]|0)==(a[bt+(a9+a7|0)|0]|0)){bS=a7;bT=bc}else{if((a9|0)!=5){break}bS=a7-1|0;bT=1}bs=a9+1|0;if((bs|0)<(bT+S|0)){a9=bs;bc=bT;a7=bS}else{Z=5791;break}}do{if((Z|0)==5791){Z=0;if((bT|0)==0){if(!((a9|0)==4|(a9|0)==12)){break}}a[aG]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break L7662}L7942:do{if((S|0)>0){a9=c[10036]|0;a7=0;bc=0;bt=a3;while(1){if((a[a7+99600|0]|0)==(a[a9+(a7+bt|0)|0]|0)){bU=bt;bV=bc}else{if((a7|0)!=7){break L7942}bU=bt-1|0;bV=1}bs=a7+1|0;if((bs|0)<(bV+S|0)){a7=bs;bc=bV;bt=bU}else{break}}if((bV|0)==0){if(!((a7|0)==6|(a7|0)==14)){break}}a[aG]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break L7662}bt=c[10036]|0;bc=0;a9=0;a6=a3;while(1){if((a[bc+175984|0]|0)==(a[bt+(bc+a6|0)|0]|0)){bW=a6;bX=a9}else{if((bc|0)!=1){Z=5835;break L7662}bW=a6-1|0;bX=1}bs=bc+1|0;if((bs|0)<(bX+S|0)){bc=bs;a9=bX;a6=bW}else{break}}if((bX|0)==0){if(!((bc|0)==4|(bc|0)==0)){Z=5835;break L7662}}bY=a0+1|0;c[13898]=bY;a6=(a[a1+(bY*40&-1)|0]&1)==0;if(a6){Z=5814}else{a9=a[(c[10036]|0)+(c[a1+(bY*40&-1)+32>>2]|0)|0]|0;if(!((a9<<24>>24|0)==39|(a9<<24>>24|0)==34)){Z=5814}}if((Z|0)==5814){Z=0;a9=c[10810]|0;if((a9|0)==0){Z=6274;break L7660}bt=c[8272]|0;bs=a1+(bY*40&-1)+36|0;bj=a1+(bY*40&-1)+32|0;a5=c[10036]|0;bw=a9;L7971:while(1){a9=c[bw+4>>2]|0;L7973:do{if(!((bt|0)<=(bY|0)|a6)){bZ=c[bs>>2]|0;b_=0;while(1){if((b_|0)>=(bZ|0)){break}if((a[a5+((c[bj>>2]|0)+b_|0)|0]|0)==(a[a9+b_|0]|0)){b_=b_+1|0}else{break L7973}}if((a[a9+b_|0]|0)==0){break L7971}}}while(0);a9=c[bw>>2]|0;if((a9|0)==0){Z=6272;break L7660}else{bw=a9}}if((a[bw+8|0]&1)!=0){Z=6271;break L7660}if((c[bw+16>>2]|0)!=3){Z=6273;break L7660}}uu(c[aD>>2]|0);c[aD>>2]=0;bj=c[13898]|0;L7983:do{if((bj|0)<(c[8272]|0)){a5=c[1054]|0;L7985:do{if((a[a5+(bj*40&-1)|0]&1)!=0){bs=c[a5+(bj*40&-1)+36>>2]|0;a6=a5+(bj*40&-1)+32|0;bt=c[10036]|0;bc=0;while(1){if((bc|0)>=(bs|0)){break}if((a[bt+((c[a6>>2]|0)+bc|0)|0]|0)==(a[bc+103664|0]|0)){bc=bc+1|0}else{break L7985}}if((bc|0)==1){b$=0;break L7983}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[aE>>2]|0)==3){b$=c[aF>>2]|0;break}else{c[13898]=bj;b$=0;break}}else{b$=0}}while(0);c[aD>>2]=b$;bd=a_;be=a$;break L7662}}while(0);c[aI>>2]=1;a[aH]=1;c[13898]=a0+1;bd=a_;be=a$}else{Z=5835}}while(0);L7997:do{if((Z|0)==5835){Z=0;bj=c[8272]|0;bw=(bj|0)>(a0|0);L7999:do{if(bw){if(a4){break}a5=c[10036]|0;a6=0;while(1){if((a6|0)>=(S|0)){Z=5840;break}if((a[a5+(a3+a6|0)|0]|0)==(a[a6+97960|0]|0)){a6=a6+1|0}else{break}}do{if((Z|0)==5840){Z=0;if((a6|0)!=6){break}b0=a0+1|0;c[13898]=b0;if((b0|0)>=(bj|0)){b1=b0;Z=6280;break L7660}L8009:do{if((a[a1+(b0*40&-1)|0]&1)!=0){bt=c[a1+(b0*40&-1)+36>>2]|0;bs=a1+(b0*40&-1)+32|0;b_=0;while(1){if((b_|0)>=(bt|0)){break}if((a[a5+((c[bs>>2]|0)+b_|0)|0]|0)==(a[b_+103664|0]|0)){b_=b_+1|0}else{break L8009}}if((b_|0)==1){b1=b0;Z=6277;break L7660}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[R>>2]|0)!=3){Z=5848;break L7660}bs=c[Q>>2]|0;if((bs|0)==0){Z=5850;break L7660}uF(U|0,bs|0,51);uu(bs);bs=a8(U|0,37)|0;do{if((bs|0)==0){b2=0}else{bt=bs+1|0;L8020:do{if((bt|0)==0){b3=0}else{bc=bt;while(1){a9=a[bc]|0;if(!((a9<<24>>24|0)==32|(a9<<24>>24|0)==45|(a9<<24>>24|0)==43|(a9<<24>>24|0)==35)){b3=bc;break L8020}a9=bc+1|0;if((a9|0)==0){b3=0;break}else{bc=a9}}}}while(0);while(1){b4=a[b3]|0;if(!(((b4&255)-48|0)>>>0<10|b4<<24>>24==46)){break}b3=b3+1|0}if((b4-102&255)<2){b2=1;break}b2=b4<<24>>24==101&1}}while(0);a[_]=b2;bd=a_;be=a$;break L7997}}while(0);if(!bw){Z=5867;break}if(a4){break}a5=c[10036]|0;a6=0;while(1){if((a6|0)>=(S|0)){break}if((a[a5+(a3+a6|0)|0]|0)==(a[a6+143040|0]|0)){a6=a6+1|0}else{Z=5867;break L7999}}if((a6|0)==2){Z=5875}else{Z=5867}}else{Z=5867}}while(0);L8037:do{if((Z|0)==5867){Z=0;L8039:do{if((S|0)>0&(a4^1)){a5=c[10036]|0;bs=0;bt=0;b_=a3;while(1){if((a[bs+142856|0]|0)==(a[a5+(bs+b_|0)|0]|0)){b5=b_;b6=bt}else{if((bs|0)!=4){break}b5=b_-1|0;b6=1}bc=bs+1|0;if((bc|0)<(b6+S|0)){bs=bc;bt=b6;b_=b5}else{Z=5873;break}}if((Z|0)==5873){Z=0;if((b6|0)!=0){Z=5875;break L8037}if((bs|0)==3|(bs|0)==9){Z=5875;break L8037}}if(!((S|0)>0&(a4^1))){break}b_=c[10036]|0;bt=0;a5=0;bc=a3;while(1){if((a[bt+96704|0]|0)==(a[b_+(bt+bc|0)|0]|0)){b7=bc;b8=a5}else{if((bt|0)!=2){break L8039}b7=bc-1|0;b8=1}a9=bt+1|0;if((a9|0)<(b8+S|0)){bt=a9;a5=b8;bc=b7}else{break}}if((b8|0)==0){if(!((bt|0)==8|(bt|0)==1)){break}}c[13898]=a0+1;if((a[T]&1)==0){bc=c[aw>>2]|0;if((bc|0)!=0){a5=bc;while(1){bc=c[a5+16>>2]|0;b_=c[a5+8>>2]|0;if((b_|0)!=0){uu(b_)}uu(a5);if((bc|0)==0){break}else{a5=bc}}}c[aw>>2]=0}c[ax>>2]=1;bd=a_;be=a$;break L7997}}while(0);if(!bw){bd=a_;be=a$;break L7997}if(a4){break}a6=c[10036]|0;a5=0;while(1){if((a5|0)>=(S|0)){Z=5896;break}if((a[a6+(a3+a5|0)|0]|0)==(a[a5+186440|0]|0)){a5=a5+1|0}else{break}}do{if((Z|0)==5896){Z=0;if((a5|0)!=3){break}c[13898]=a0+1;a[T]=1;bd=a_;be=a$;break L7997}}while(0);if(!bw){bd=a_;be=a$;break L7997}if(a4){break}a5=c[10036]|0;a6=0;while(1){if((a6|0)>=(S|0)){Z=5903;break}if((a[a5+(a3+a6|0)|0]|0)==(a[a6+103664|0]|0)){a6=a6+1|0}else{break}}if((Z|0)==5903){Z=0;if((a6|0)==1){bd=a_;be=a$;break L7997}}if(a4){break}a5=c[10036]|0;bt=0;while(1){if((bt|0)>=(S|0)){break}if((a[a5+(a3+bt|0)|0]|0)==(a[bt+199040|0]|0)){bt=bt+1|0}else{break L8037}}if((bt|0)!=1){break}a6=a0+1|0;c[13898]=a6;L8096:do{if((bj|0)>(a6|0)){if((a[a1+(a6*40&-1)|0]&1)==0){break}bc=c[a1+(a6*40&-1)+36>>2]|0;b_=a1+(a6*40&-1)+32|0;bs=0;while(1){if((bs|0)>=(bc|0)){break}if((a[a5+((c[b_>>2]|0)+bs|0)|0]|0)==(a[bs+131272|0]|0)){bs=bs+1|0}else{break L8096}}if((bs|0)!=1){break}c[13898]=a0+2;bd=a_;be=a$;break L7997}}while(0);do{if((a[T]&1)==0){a5=c[6074]|0;if((a5|0)!=0){if((c[a5+32>>2]|0)!=0){b9=a6;ca=bj;break}}a5=c[$>>2]|0;if((a5|0)==0){cb=a6;cc=bj}else{bt=a5;while(1){a5=c[bt+16>>2]|0;b_=c[bt+8>>2]|0;if((b_|0)!=0){uu(b_)}uu(bt);if((a5|0)==0){break}else{bt=a5}}cb=c[13898]|0;cc=c[8272]|0}c[$>>2]=0;b9=cb;ca=cc}else{b9=a6;ca=bj}}while(0);L8119:do{if((b9|0)<(ca|0)){a6=b9;bt=ca;bs=c[1054]|0;while(1){a5=(a[bs+(a6*40&-1)|0]&1)==0;L8123:do{if(!a5){b_=c[bs+(a6*40&-1)+36>>2]|0;bc=bs+(a6*40&-1)+32|0;a9=c[10036]|0;a7=0;while(1){if((a7|0)>=(b_|0)){break}if((a[a9+((c[bc>>2]|0)+a7|0)|0]|0)==(a[a7+103664|0]|0)){a7=a7+1|0}else{break L8123}}if((a7|0)==1){cd=a6;ce=bt;break L8119}}}while(0);L8130:do{if((a6|0)<(bt|0)){L8132:do{if(!a5){bc=c[bs+(a6*40&-1)+36>>2]|0;a9=bs+(a6*40&-1)+32|0;b_=c[10036]|0;bZ=0;while(1){if((bZ|0)>=(bc|0)){break}if((a[b_+((c[a9>>2]|0)+bZ|0)|0]|0)==(a[bZ+103664|0]|0)){bZ=bZ+1|0}else{break L8132}}if((bZ|0)==1){cf=0;Z=5952;break L8130}}}while(0);a[14176]=1;is(o);a[14176]=0;if((c[aa>>2]|0)!=3){c[13898]=a6;cf=0;Z=5952;break}a7=c[ab>>2]|0;if((a7|0)==0){cf=0;Z=5952;break}if((c[ac>>2]|0)!=1){cg=a7;Z=5977;break}a9=c[13898]|0;if((c[8272]|0)<=(a9|0)){cf=a7;Z=5952;break}b_=c[1054]|0;if((a[b_+(a9*40&-1)|0]&1)==0){cf=a7;Z=5952;break}bc=c[b_+(a9*40&-1)+36>>2]|0;ch=b_+(a9*40&-1)+32|0;a9=c[10036]|0;b_=0;while(1){if((b_|0)>=(bc|0)){Z=5947;break}if((a[a9+((c[ch>>2]|0)+b_|0)|0]|0)==(a[b_+148464|0]|0)){b_=b_+1|0}else{ci=0;Z=5948;break}}if((Z|0)==5947){Z=0;if((b_|0)!=1){ci=0;Z=5948}}if((Z|0)==5948){while(1){Z=0;if((ci|0)>=(bc|0)){break}if((a[a9+((c[ch>>2]|0)+ci|0)|0]|0)==(a[ci+131272|0]|0)){ci=ci+1|0;Z=5948}else{cf=a7;Z=5952;break L8130}}if((ci|0)!=1){cf=a7;Z=5952;break}}c[13898]=a6;uu(a7);cf=0;Z=5952}else{cf=0;Z=5952}}while(0);L8157:do{if((Z|0)==5952){Z=0;if((c[ac>>2]|0)!=1){cg=cf;Z=5977;break}a5=c[13898]|0;ch=c[1054]|0;a9=(a[ch+(a5*40&-1)|0]&1)==0;if(a9){Z=5955}else{bc=c[10036]|0;b_=a[bc+(c[ch+(a5*40&-1)+32>>2]|0)|0]|0;if((b_<<24>>24|0)==39|(b_<<24>>24|0)==34){cj=bc}else{Z=5955}}if((Z|0)==5955){Z=0;bc=c[10810]|0;if((bc|0)==0){cg=cf;Z=5977;break}b_=ch+(a5*40&-1)+36|0;ck=ch+(a5*40&-1)+32|0;cl=c[10036]|0;cm=(c[8272]|0)<=(a5|0)|a9;cn=bc;L8165:while(1){bc=c[cn+4>>2]|0;L8167:do{if(!cm){co=c[b_>>2]|0;cp=0;while(1){if((cp|0)>=(co|0)){break}if((a[cl+((c[ck>>2]|0)+cp|0)|0]|0)==(a[bc+cp|0]|0)){cp=cp+1|0}else{break L8167}}if((a[bc+cp|0]|0)==0){break L8165}}}while(0);bc=c[cn>>2]|0;if((bc|0)==0){cg=cf;Z=5977;break L8157}else{cn=bc}}if((a[cn+8|0]&1)!=0){cg=cf;Z=5977;break}if((c[cn+16>>2]|0)==3){cj=cl}else{cg=cf;Z=5977;break}}L8177:do{if((a5|0)<(c[8272]|0)){L8179:do{if(!a9){ck=c[ch+(a5*40&-1)+36>>2]|0;b_=ch+(a5*40&-1)+32|0;cm=0;while(1){if((cm|0)>=(ck|0)){break}if((a[cj+((c[b_>>2]|0)+cm|0)|0]|0)==(a[cm+103664|0]|0)){cm=cm+1|0}else{break L8179}}if((cm|0)==1){cq=0;break L8177}}}while(0);a[14176]=1;is(n);a[14176]=0;if((c[ad>>2]|0)==3){cq=c[ae>>2]|0;break}else{c[13898]=a5;cq=0;break}}else{cq=0}}while(0);if((t1(cq,af,p,q)|0)==0){cr=0.0}else{cs=+t2(p);cr=cs+ +h[q>>3]}uu(cq);ct=cr;cu=cf}}while(0);do{if((Z|0)==5977){Z=0;a5=is(m)|0;ch=c[a5>>2]|0;if((ch|0)==1){cv=+(c[a5+8>>2]|0)}else if((ch|0)==2){cv=+h[a5+8>>3]}else if((ch|0)==3){cv=+uz(c[a5+8>>2]|0,0)}else{Z=5981;break L7660}if((c[ag>>2]|0)!=3){ct=cv;cu=cg;break}uu(c[ah>>2]|0);c[ag>>2]=1;ct=cv;cu=cg}}while(0);a5=c[13898]|0;L8202:do{if((a5|0)<(c[8272]|0)){ch=c[1054]|0;L8204:do{if((a[ch+(a5*40&-1)|0]&1)!=0){a9=c[ch+(a5*40&-1)+36>>2]|0;cl=ch+(a5*40&-1)+32|0;cn=c[10036]|0;b_=0;while(1){if((b_|0)>=(a9|0)){Z=5989;break}if((a[cn+((c[cl>>2]|0)+b_|0)|0]|0)==(a[b_+103664|0]|0)){b_=b_+1|0}else{cw=0;break}}if((Z|0)==5989){Z=0;if((b_|0)==1){cx=0;break L8202}else{cw=0}}while(1){if((cw|0)>=(a9|0)){Z=5992;break}if((a[cn+((c[cl>>2]|0)+cw|0)|0]|0)==(a[cw+148464|0]|0)){cw=cw+1|0}else{cy=0;break}}if((Z|0)==5992){Z=0;if((cw|0)==1){cx=0;break L8202}else{cy=0}}while(1){if((cy|0)>=(a9|0)){break}if((a[cn+((c[cl>>2]|0)+cy|0)|0]|0)==(a[cy+131272|0]|0)){cy=cy+1|0}else{break L8204}}if((cy|0)==1){cx=0;break L8202}}}while(0);ch=is(l)|0;cl=c[ch>>2]|0;if((cl|0)==1){cz=+(c[ch+8>>2]|0)}else if((cl|0)==2){cz=+h[ch+8>>3]}else if((cl|0)==3){cz=+uz(c[ch+8>>2]|0,0)}else{Z=6e3;break L7660}if((c[ai>>2]|0)==3){uu(c[aj>>2]|0);c[ai>>2]=1}cx=~~cz}else{cx=0}}while(0);dp(b,cu,ct,cx);uu(cu);a5=c[13898]|0;ch=c[8272]|0;if((a5|0)>=(ch|0)){cd=a5;ce=ch;break L8119}cl=c[1054]|0;if((a[cl+(a5*40&-1)|0]&1)==0){cd=a5;ce=ch;break L8119}cn=c[cl+(a5*40&-1)+36>>2]|0;a9=cl+(a5*40&-1)+32|0;b_=c[10036]|0;ck=0;while(1){if((ck|0)>=(cn|0)){Z=6009;break}if((a[b_+((c[a9>>2]|0)+ck|0)|0]|0)==(a[ck+103664|0]|0)){ck=ck+1|0}else{cA=0;break}}if((Z|0)==6009){Z=0;if((ck|0)==1){cd=a5;ce=ch;break L8119}else{cA=0}}while(1){if((cA|0)>=(cn|0)){break}if((a[b_+((c[a9>>2]|0)+cA|0)|0]|0)==(a[cA+148464|0]|0)){cA=cA+1|0}else{cd=a5;ce=ch;break L8119}}if((cA|0)!=1){cd=a5;ce=ch;break L8119}a9=a5+1|0;c[13898]=a9;if((a9|0)<(ch|0)){a6=a9;bt=ch;bs=cl}else{cd=a9;ce=ch;break}}}else{cd=b9;ce=ca}}while(0);if((cd|0)>=(ce|0)){Z=6023;break L7660}bs=c[1054]|0;if((a[bs+(cd*40&-1)|0]&1)==0){Z=6023;break L7660}bt=c[bs+(cd*40&-1)+36>>2]|0;a6=bs+(cd*40&-1)+32|0;bs=c[10036]|0;a9=0;while(1){if((a9|0)>=(bt|0)){Z=6019;break}if((a[bs+((c[a6>>2]|0)+a9|0)|0]|0)==(a[a9+103664|0]|0)){a9=a9+1|0}else{cB=0;break}}if((Z|0)==6019){Z=0;if((a9|0)==1){Z=6023;break L7660}else{cB=0}}while(1){if((cB|0)>=(bt|0)){break}if((a[bs+((c[a6>>2]|0)+cB|0)|0]|0)==(a[cB+131272|0]|0)){cB=cB+1|0}else{Z=6023;break L7660}}if((cB|0)!=1){Z=6023;break L7660}c[13898]=cd+1;bd=a_;be=a$;break L7997}}while(0);if((Z|0)==5875){Z=0;hI(aB,aC);bd=a_;be=a$;break}L8258:do{if((c[ac>>2]|0)==1){if(a4){Z=6033}else{bj=c[10036]|0;bw=a[bj+a3|0]|0;if((bw<<24>>24|0)==39|(bw<<24>>24|0)==34){cC=bj;Z=6043}else{Z=6033}}if((Z|0)==6033){Z=0;bj=c[10810]|0;if((bj|0)==0){Z=6053;break}bw=c[10036]|0;a6=bj;L8265:while(1){bj=c[a6+4>>2]|0;L8267:do{if(!a4){bs=0;while(1){if((bs|0)>=(S|0)){break}if((a[bw+(a3+bs|0)|0]|0)==(a[bj+bs|0]|0)){bs=bs+1|0}else{break L8267}}if((a[bj+bs|0]|0)==0){break L8265}}}while(0);bj=c[a6>>2]|0;if((bj|0)==0){Z=6053;break L8258}else{a6=bj}}if((a[a6+8|0]&1)!=0){Z=6053;break}if((c[a6+16>>2]|0)!=3){Z=6053;break}if(a4){Z=6047}else{cC=bw;Z=6043}}L8276:do{if((Z|0)==6043){Z=0;bj=0;while(1){if((bj|0)>=(S|0)){break}if((a[cC+(a3+bj|0)|0]|0)==(a[bj+103664|0]|0)){bj=bj+1|0}else{Z=6047;break L8276}}if((bj|0)==1){cD=0}else{Z=6047}}}while(0);do{if((Z|0)==6047){Z=0;a[14176]=1;is(x);a[14176]=0;if((c[ak>>2]|0)==3){cD=c[al>>2]|0;break}else{c[13898]=a0;cD=0;break}}}while(0);if((t1(cD,af,y,z)|0)==0){cE=0.0}else{cs=+t2(y);cE=cs+ +h[z>>3]}uu(cD);cF=cE}else{Z=6053}}while(0);do{if((Z|0)==6053){Z=0;bw=is(w)|0;a6=c[bw>>2]|0;if((a6|0)==1){cG=+(c[bw+8>>2]|0)}else if((a6|0)==2){cG=+h[bw+8>>3]}else if((a6|0)==3){cG=+uz(c[bw+8>>2]|0,0)}else{Z=6057;break L7660}if((c[am>>2]|0)!=3){cF=cG;break}uu(c[an>>2]|0);c[am>>2]=1;cF=cG}}while(0);bw=c[13898]|0;a6=c[8272]|0;L8300:do{if((a6|0)>(bw|0)){ch=c[1054]|0;if((a[ch+(bw*40&-1)|0]&1)==0){cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307;break}cl=c[ch+(bw*40&-1)+36>>2]|0;a5=ch+(bw*40&-1)+32|0;bt=c[10036]|0;a9=0;while(1){if((a9|0)>=(cl|0)){break}if((a[bt+((c[a5>>2]|0)+a9|0)|0]|0)==(a[a9+148464|0]|0)){a9=a9+1|0}else{cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307;break L8300}}if((a9|0)!=1){cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307;break}cK=bw+1|0;c[13898]=cK;L8308:do{if((c[ac>>2]|0)==1){a5=(a[ch+(cK*40&-1)|0]&1)==0;if(a5){Z=6069}else{cl=a[bt+(c[ch+(cK*40&-1)+32>>2]|0)|0]|0;if(!((cl<<24>>24|0)==39|(cl<<24>>24|0)==34)){Z=6069}}if((Z|0)==6069){Z=0;cl=c[10810]|0;if((cl|0)==0){Z=6091;break}b_=ch+(cK*40&-1)+36|0;cn=ch+(cK*40&-1)+32|0;ck=(a6|0)<=(cK|0)|a5;cp=cl;L8315:while(1){cl=c[cp+4>>2]|0;L8317:do{if(!ck){a7=c[b_>>2]|0;bc=0;while(1){if((bc|0)>=(a7|0)){break}if((a[bt+((c[cn>>2]|0)+bc|0)|0]|0)==(a[cl+bc|0]|0)){bc=bc+1|0}else{break L8317}}if((a[cl+bc|0]|0)==0){break L8315}}}while(0);cl=c[cp>>2]|0;if((cl|0)==0){Z=6091;break L8308}else{cp=cl}}if((a[cp+8|0]&1)!=0){Z=6091;break}if((c[cp+16>>2]|0)!=3){Z=6091;break}}L8327:do{if((cK|0)<(a6|0)){L8329:do{if(!a5){cn=c[ch+(cK*40&-1)+36>>2]|0;b_=ch+(cK*40&-1)+32|0;ck=0;while(1){if((ck|0)>=(cn|0)){break}if((a[bt+((c[b_>>2]|0)+ck|0)|0]|0)==(a[ck+103664|0]|0)){ck=ck+1|0}else{break L8329}}if((ck|0)==1){cL=0;break L8327}}}while(0);a[14176]=1;is(u);a[14176]=0;if((c[ao>>2]|0)==3){cL=c[ap>>2]|0;break}else{c[13898]=cK;cL=0;break}}else{cL=0}}while(0);if((t1(cL,af,A,B)|0)==0){cM=0.0}else{cs=+t2(A);cM=cs+ +h[B>>3]}uu(cL);cN=cM}else{Z=6091}}while(0);do{if((Z|0)==6091){Z=0;bt=is(t)|0;ch=c[bt>>2]|0;if((ch|0)==1){cO=+(c[bt+8>>2]|0)}else if((ch|0)==2){cO=+h[bt+8>>3]}else if((ch|0)==3){cO=+uz(c[bt+8>>2]|0,0)}else{Z=6095;break L7660}if((c[aq>>2]|0)!=3){cN=cO;break}uu(c[ar>>2]|0);c[aq>>2]=1;cN=cO}}while(0);bt=c[13898]|0;ch=c[8272]|0;L8352:do{if((ch|0)>(bt|0)){a9=c[1054]|0;if((a[a9+(bt*40&-1)|0]&1)==0){cP=8.988465674311579e+307;break}a5=c[a9+(bt*40&-1)+36>>2]|0;cp=a9+(bt*40&-1)+32|0;b_=c[10036]|0;cn=0;while(1){if((cn|0)>=(a5|0)){break}if((a[b_+((c[cp>>2]|0)+cn|0)|0]|0)==(a[cn+148464|0]|0)){cn=cn+1|0}else{cP=8.988465674311579e+307;break L8352}}if((cn|0)!=1){cP=8.988465674311579e+307;break}cp=bt+1|0;c[13898]=cp;L8360:do{if((c[ac>>2]|0)==1){a5=(a[a9+(cp*40&-1)|0]&1)==0;if(a5){Z=6107}else{bc=a[b_+(c[a9+(cp*40&-1)+32>>2]|0)|0]|0;if(!((bc<<24>>24|0)==39|(bc<<24>>24|0)==34)){Z=6107}}if((Z|0)==6107){Z=0;bc=c[10810]|0;if((bc|0)==0){break}bj=a9+(cp*40&-1)+36|0;cl=a9+(cp*40&-1)+32|0;bs=(ch|0)<=(cp|0)|a5;a7=bc;L8367:while(1){bc=c[a7+4>>2]|0;L8369:do{if(!bs){bZ=c[bj>>2]|0;co=0;while(1){if((co|0)>=(bZ|0)){break}if((a[b_+((c[cl>>2]|0)+co|0)|0]|0)==(a[bc+co|0]|0)){co=co+1|0}else{break L8369}}if((a[bc+co|0]|0)==0){break L8367}}}while(0);bc=c[a7>>2]|0;if((bc|0)==0){break L8360}else{a7=bc}}if((a[a7+8|0]&1)!=0){break}if((c[a7+16>>2]|0)!=3){break}}L8379:do{if((cp|0)<(ch|0)){L8381:do{if(!a5){cl=c[a9+(cp*40&-1)+36>>2]|0;bj=a9+(cp*40&-1)+32|0;bs=0;while(1){if((bs|0)>=(cl|0)){break}if((a[b_+((c[bj>>2]|0)+bs|0)|0]|0)==(a[bs+103664|0]|0)){bs=bs+1|0}else{break L8381}}if((bs|0)==1){cQ=0;break L8379}}}while(0);a[14176]=1;is(s);a[14176]=0;if((c[as>>2]|0)==3){cQ=c[at>>2]|0;break}else{c[13898]=cp;cQ=0;break}}else{cQ=0}}while(0);if((t1(cQ,af,C,D)|0)==0){cR=0.0}else{cs=+t2(C);cR=cs+ +h[D>>3]}uu(cQ);cP=cR;break L8352}}while(0);cp=is(r)|0;b_=c[cp>>2]|0;if((b_|0)==1){cS=+(c[cp+8>>2]|0)}else if((b_|0)==2){cS=+h[cp+8>>3]}else if((b_|0)==3){cS=+uz(c[cp+8>>2]|0,0)}else{Z=6133;break L7660}if((c[au>>2]|0)!=3){cP=cS;break}uu(c[av>>2]|0);c[au>>2]=1;cP=cS}else{cP=8.988465674311579e+307}}while(0);if(!(cF>=cP|cN>0.0)){Z=6137;break L7660}ch=cF>cP;if(!(cN<0.0|ch^1)){Z=6139;break L7660}if(!ch){cH=cF;cI=cN;cJ=cP;break}cH=cF+cN*+O(+((cP*1.01-cF)/cN));cI=-0.0-cN;cJ=cF}else{cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307}}while(0);if((a[T]&1)==0){a6=c[aw>>2]|0;if((a6|0)!=0){bw=a6;while(1){a6=c[bw+16>>2]|0;ch=c[bw+8>>2]|0;if((ch|0)!=0){uu(ch)}uu(bw);if((a6|0)==0){break}else{bw=a6}}}c[aw>>2]=0}c[ax>>2]=2;h[ay>>3]=cH;h[az>>3]=cI;h[aA>>3]=cJ;bd=a_;be=a$}}while(0);cT=c[13898]|0;if((cT|0)>=(c[8272]|0)){Z=6155;break}a3=c[1054]|0;S=a[a3+(cT*40&-1)|0]|0;if((S&1)==0){a_=bd;a$=be;a0=cT;a1=a3;a2=S;continue}a4=c[a3+(cT*40&-1)+36>>2]|0;bw=a3+(cT*40&-1)+32|0;a6=c[10036]|0;ch=0;while(1){if((ch|0)>=(a4|0)){break}if((a[a6+((c[bw>>2]|0)+ch|0)|0]|0)==(a[ch+103664|0]|0)){ch=ch+1|0}else{a_=bd;a$=be;a0=cT;a1=a3;a2=S;continue L7660}}if((ch|0)==1){Z=6155;break}else{a_=bd;a$=be;a0=cT;a1=a3;a2=S}}if((Z|0)==5670){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5706){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6271){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6272){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6273){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6274){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6277){uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6280){uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6e3){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6155){a2=c[aZ>>2]|0;if((a2&3|0)!=0|bd){P=cT;break}c[aZ>>2]=a2|1;if(be){P=cT;break}if((b-1|0)>>>0>=3){P=cT;break}c[aZ>>2]=a2|5;P=cT;break}else if((Z|0)==6023){a2=c[$>>2]|0;if((a2|0)==0){cU=cd;c[$>>2]=0;uf(cU,91952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{cV=a2}while(1){a2=c[cV+16>>2]|0;a1=c[cV+8>>2]|0;if((a1|0)!=0){uu(a1)}uu(cV);if((a2|0)==0){break}else{cV=a2}}cU=c[13898]|0;c[$>>2]=0;uf(cU,91952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5848){c[13898]=b0;b1=b0;uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5850){b1=c[13898]|0;uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5981){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5683){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6095){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6057){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6133){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6137){uf(cK,93560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6139){uf(cK,92744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);cK=c[1054]|0;b1=c[cK+(P*40&-1)+36>>2]|0;b0=c[cK+(P*40&-1)+32>>2]|0;L8460:do{if((a[cK+(P*40&-1)|0]&1)==0){cW=P}else{if((b1|0)>0){cU=c[10036]|0;cV=0;cd=0;cT=b0;while(1){be=a[F+cV|0]|0;if(be<<24>>24==(a[cU+(cV+cT|0)|0]|0)){cX=cT;cY=cd}else{if(be<<24>>24!=36){cW=P;break L8460}cX=cT-1|0;cY=1}cZ=cV+1|0;if((cZ|0)<(cY+b1|0)){cV=cZ;cd=cY;cT=cX}else{break}}if((cY|0)==0){c_=cZ;Z=6167}}else{c_=0;Z=6167}if((Z|0)==6167){cT=a[F+c_|0]|0;if(!((cT<<24>>24|0)==36|(cT<<24>>24|0)==0)){cW=P;break}}cT=64916+(b*688&-1)|0;c[cT>>2]=c[cT>>2]&-4;cT=P+1|0;c[13898]=cT;cW=cT}}while(0);a[K]=a[95856]|0;a[K+1|0]=a[95857|0]|0;a[K+2|0]=a[95858|0]|0;a[K+3|0]=a[95859|0]|0;a[K+4|0]=a[95860|0]|0;a[K+5|0]=a[95861|0]|0;a[K+6|0]=a[95862|0]|0;P=c[cK+(cW*40&-1)+36>>2]|0;c_=c[cK+(cW*40&-1)+32>>2]|0;cZ=a[cK+(cW*40&-1)|0]|0;L8475:do{if((cZ&1)==0){c$=cW;c0=cK;c1=P;c2=c_;c3=cZ}else{if((P|0)>0){cY=c[10036]|0;cX=0;b1=0;b0=c_;while(1){cT=a[F+(cX+2|0)|0]|0;if(cT<<24>>24==(a[cY+(cX+b0|0)|0]|0)){c4=b0;c5=b1}else{if(cT<<24>>24!=36){c$=cW;c0=cK;c1=P;c2=c_;c3=cZ;break L8475}c4=b0-1|0;c5=1}c6=cX+1|0;if((c6|0)<(c5+P|0)){cX=c6;b1=c5;b0=c4}else{break}}if((c5|0)==0){c7=c6;Z=6177}}else{c7=0;Z=6177}if((Z|0)==6177){b0=a[F+(c7+2|0)|0]|0;if(!((b0<<24>>24|0)==36|(b0<<24>>24|0)==0)){c$=cW;c0=cK;c1=P;c2=c_;c3=cZ;break}}if((a[64976+(b*688&-1)|0]&1)==0){b0=64944+(b*688&-1)|0;b1=c[b0>>2]|0;if((b1|0)==0){c8=cW;c9=cK}else{cX=b1;while(1){b1=c[cX+16>>2]|0;cY=c[cX+8>>2]|0;if((cY|0)!=0){uu(cY)}uu(cX);if((b1|0)==0){break}else{cX=b1}}c8=c[13898]|0;c9=c[1054]|0}c[b0>>2]=0;da=c8;db=c9}else{da=cW;db=cK}c[64920+(b*688&-1)>>2]=4;cX=da+1|0;c[13898]=cX;c$=cX;c0=db;c1=c[db+(cX*40&-1)+36>>2]|0;c2=c[db+(cX*40&-1)+32>>2]|0;c3=a[db+(cX*40&-1)|0]|0}}while(0);L8501:do{if((c3&1)==0){dc=c$}else{if((c1|0)>0){db=c[10036]|0;da=0;cK=0;cW=c2;while(1){c9=a[F+da|0]|0;if(c9<<24>>24==(a[db+(da+cW|0)|0]|0)){dd=cW;de=cK}else{if(c9<<24>>24!=36){dc=c$;break L8501}dd=cW-1|0;de=1}df=da+1|0;if((df|0)<(de+c1|0)){da=df;cK=de;cW=dd}else{break}}if((de|0)==0){dg=df;Z=6194}}else{dg=0;Z=6194}if((Z|0)==6194){cW=a[F+dg|0]|0;if(!((cW<<24>>24|0)==36|(cW<<24>>24|0)==0)){dc=c$;break}}c[64920+(b*688&-1)>>2]=1;cW=c$+1|0;c[13898]=cW;dc=cW}}while(0);a[K]=a[95384]|0;a[K+1|0]=a[95385|0]|0;a[K+2|0]=a[95386|0]|0;a[K+3|0]=a[95387|0]|0;a[K+4|0]=a[95388|0]|0;a[K+5|0]=a[95389|0]|0;a[K+6|0]=a[95390|0]|0;K=c[c0+(dc*40&-1)+36>>2]|0;c$=c[c0+(dc*40&-1)+32>>2]|0;dg=a[c0+(dc*40&-1)|0]|0;L8516:do{if((dg&1)==0){dh=dc;di=K;dj=c$;dk=dg}else{if((K|0)>0){df=c[10036]|0;de=0;dd=0;c1=c$;while(1){c2=a[F+(de+2|0)|0]|0;if(c2<<24>>24==(a[df+(de+c1|0)|0]|0)){dm=c1;dn=dd}else{if(c2<<24>>24!=36){dh=dc;di=K;dj=c$;dk=dg;break L8516}dm=c1-1|0;dn=1}dq=de+1|0;if((dq|0)<(dn+K|0)){de=dq;dd=dn;c1=dm}else{break}}if((dn|0)==0){dr=dq;Z=6204}}else{dr=0;Z=6204}if((Z|0)==6204){c1=a[F+(dr+2|0)|0]|0;if(!((c1<<24>>24|0)==36|(c1<<24>>24|0)==0)){dh=dc;di=K;dj=c$;dk=dg;break}}if((a[64976+(b*688&-1)|0]&1)==0){c1=64944+(b*688&-1)|0;dd=c[c1>>2]|0;if((dd|0)==0){ds=dc;dt=c0}else{de=dd;while(1){dd=c[de+16>>2]|0;df=c[de+8>>2]|0;if((df|0)!=0){uu(df)}uu(de);if((dd|0)==0){break}else{de=dd}}ds=c[13898]|0;dt=c[1054]|0}c[c1>>2]=0;du=ds;dv=dt}else{du=dc;dv=c0}c[64920+(b*688&-1)>>2]=5;de=du+1|0;c[13898]=de;dh=de;di=c[dv+(de*40&-1)+36>>2]|0;dj=c[dv+(de*40&-1)+32>>2]|0;dk=a[dv+(de*40&-1)|0]|0}}while(0);L8542:do{if((dk&1)!=0){if((di|0)>0){dv=c[10036]|0;du=0;c0=0;dc=dj;while(1){dt=a[F+du|0]|0;if(dt<<24>>24==(a[dv+(du+dc|0)|0]|0)){dw=dc;dx=c0}else{if(dt<<24>>24!=36){break L8542}dw=dc-1|0;dx=1}dy=du+1|0;if((dy|0)<(dx+di|0)){du=dy;c0=dx;dc=dw}else{break}}if((dx|0)==0){dz=dy;Z=6221}}else{dz=0;Z=6221}if((Z|0)==6221){dc=a[F+dz|0]|0;if(!((dc<<24>>24|0)==36|(dc<<24>>24|0)==0)){break}}c[64920+(b*688&-1)>>2]=1;c[13898]=dh+1}}while(0);a[I]=109;uB(F+3|0,J|0);J=F+((uA(I|0)|0)+2|0)|0;a[J]=a[120232]|0;a[J+1|0]=a[120233|0]|0;a[J+2|0]=a[120234|0]|0;a[J+3|0]=a[120235|0]|0;a[J+4|0]=a[120236|0]|0;a[J+5|0]=a[120237|0]|0;J=c[13898]|0;I=c[1054]|0;dh=c[I+(J*40&-1)+36>>2]|0;dz=c[I+(J*40&-1)+32>>2]|0;L8557:do{if((a[I+(J*40&-1)|0]&1)==0){dA=J;dB=I}else{if((dh|0)>0){dy=c[10036]|0;dx=0;dw=0;di=dz;while(1){dj=a[F+(dx+2|0)|0]|0;if(dj<<24>>24==(a[dy+(dx+di|0)|0]|0)){dC=di;dD=dw}else{if(dj<<24>>24!=36){dA=J;dB=I;break L8557}dC=di-1|0;dD=1}dE=dx+1|0;if((dE|0)<(dD+dh|0)){dx=dE;dw=dD;di=dC}else{break}}if((dD|0)==0){dF=dE;Z=6231}}else{dF=0;Z=6231}if((Z|0)==6231){di=a[F+(dF+2|0)|0]|0;if(!((di<<24>>24|0)==36|(di<<24>>24|0)==0)){dA=J;dB=I;break}}di=J+1|0;c[13898]=di;L8571:do{if((di|0)<(c[8272]|0)){dw=(a[I+(di*40&-1)|0]&1)==0;L8573:do{if(!dw){dx=c[I+(di*40&-1)+36>>2]|0;dy=I+(di*40&-1)+32|0;dj=c[10036]|0;dk=0;while(1){if((dk|0)>=(dx|0)){Z=6237;break}if((a[dj+((c[dy>>2]|0)+dk|0)|0]|0)==(a[dk+103664|0]|0)){dk=dk+1|0}else{break}}if((Z|0)==6237){if((dk|0)==1){break L8571}}if(!((dx|0)>0&(dw^1))){break}dj=c[10036]|0;dc=0;c0=0;du=c[dy>>2]|0;while(1){if((a[dc+184456|0]|0)==(a[dj+(dc+du|0)|0]|0)){dG=du;dH=c0}else{if((dc|0)!=3){break L8573}dG=du-1|0;dH=1}dv=dc+1|0;if((dv|0)<(dH+dx|0)){dc=dv;c0=dH;du=dG}else{break}}if((dH|0)==0){if(!((dc|0)==2|(dc|0)==7)){break}}c[65040+(b*688&-1)>>2]=1;du=J+2|0;c[13898]=du;dA=du;dB=I;break L8557}}while(0);dw=is(E)|0;S=c[dw>>2]|0;if((S|0)==1){dI=+(c[dw+8>>2]|0)}else if((S|0)==2){dI=+h[dw+8>>3]}else if((S|0)==3){dI=+uz(c[dw+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}dw=E|0;if((c[dw>>2]|0)==3){uu(c[E+8>>2]|0);c[dw>>2]=1}h[65048+(b*688&-1)>>3]=+O(+dI);c[65040+(b*688&-1)>>2]=2;dA=c[13898]|0;dB=c[1054]|0;break L8557}}while(0);c[65040+(b*688&-1)>>2]=3;dA=di;dB=I}}while(0);I=c[dB+(dA*40&-1)+36>>2]|0;if((a[dB+(dA*40&-1)|0]&1)==0){i=d;return}do{if((I|0)>0){E=c[10036]|0;J=0;dH=0;dG=c[dB+(dA*40&-1)+32>>2]|0;while(1){dF=a[F+J|0]|0;if(dF<<24>>24==(a[E+(J+dG|0)|0]|0)){dJ=dG;dK=dH}else{if(dF<<24>>24!=36){Z=6267;break}dJ=dG-1|0;dK=1}dL=J+1|0;if((dL|0)<(dK+I|0)){J=dL;dH=dK;dG=dJ}else{Z=6263;break}}if((Z|0)==6267){i=d;return}else if((Z|0)==6263){if((dK|0)==0){dM=dL;Z=6264;break}else{break}}}else{dM=0;Z=6264}}while(0);do{if((Z|0)==6264){dL=a[F+dM|0]|0;if((dL<<24>>24|0)==36|(dL<<24>>24|0)==0){break}i=d;return}}while(0);c[65040+(b*688&-1)>>2]=0;c[13898]=dA+1;i=d;return}function ju(){var b=0,d=0.0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;b=c[17367]|0;d=(b&1|0)==0?+h[8687]:0.0;e=c[200]|0;f=64652+(e*688&-1)|0;if((b&2|0)!=0){c[f>>2]=3;c[64652+((c[144]|0)*688&-1)>>2]=3;return}c[f>>2]=0;f=c[144]|0;c[64652+(f*688&-1)>>2]=0;g=+h[8688];if((a[69604]&1)==0){i=g-d;h[64688+(e*688&-1)>>3]=i;j=i}else{i=+_(+g);g=+h[8702];k=i/g- +_(+d)/g;h[64688+(e*688&-1)>>3]=k;j=k}h[64688+(f*688&-1)>>3]=j;j=-0.0- +h[64688+(e*688&-1)>>3];h[64680+(e*688&-1)>>3]=j;h[64680+(f*688&-1)>>3]=j;return}function jv(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;d=i;e=c[13898]|0;f=e+1|0;c[13898]=f;do{if((c[5094]|0)!=0){if(!(a[20368]|0)){break}a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);j=c[1054]|0;k=c[j+(f*40&-1)+36>>2]|0;l=c[j+(f*40&-1)+32>>2]|0;m=(a[j+(f*40&-1)|0]&1)==0;L8638:do{if((k|0)>0&(m^1)){j=c[10036]|0;n=0;o=0;p=l;while(1){if((a[n+91248|0]|0)==(a[j+(n+p|0)|0]|0)){q=p;r=o}else{if((n|0)!=2){s=6302;break L8638}q=p-1|0;r=1}t=n+1|0;if((t|0)<(r+k|0)){n=t;o=r;p=q}else{break}}if((r|0)==0){if(!((n|0)==7|(n|0)==1)){s=6302;break}}c[13898]=e+2;h[64680+(b*688&-1)>>3]=+h[64696+(b*688&-1)>>3];h[64688+(b*688&-1)>>3]=+h[64704+(b*688&-1)>>3];c[64652+(b*688&-1)>>2]=0}else{s=6302}}while(0);L8650:do{if((s|0)==6302){if((c[8272]|0)<=(f|0)|m){uf(f,90200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=c[10036]|0;q=0;while(1){if((q|0)>=(k|0)){break}if((a[r+(l+q|0)|0]|0)==(a[q+78280|0]|0)){q=q+1|0}else{s=6352;break}}if((s|0)==6352){uf(f,90200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)!=1){uf(f,90200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=e+2;r=64652+(b*688&-1)|0;c[r>>2]=dj(b,64680+(b*688&-1)|0,64688+(b*688&-1)|0,c[r>>2]|0)|0;r=c[13898]|0;if((c[8272]|0)<=(r|0)){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=c[1054]|0;if((a[n+(r*40&-1)|0]&1)==0){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[n+(r*40&-1)+36>>2]|0;o=n+(r*40&-1)+32|0;j=c[10036]|0;t=0;while(1){if((t|0)>=(p|0)){break}if((a[j+((c[o>>2]|0)+t|0)|0]|0)==(a[t+78864|0]|0)){t=t+1|0}else{s=6356;break}}if((s|0)==6356){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)!=1){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=r+1|0;c[13898]=o;p=c[n+(o*40&-1)+36>>2]|0;q=c[n+(o*40&-1)+32>>2]|0;u=(a[n+(o*40&-1)|0]&1)==0;L8679:do{if((p|0)>0&(u^1)){w=0;x=0;y=q;while(1){if((a[w+146208|0]|0)==(a[j+(w+y|0)|0]|0)){z=y;A=x}else{if((w|0)!=3){break}z=y-1|0;A=1}B=w+1|0;if((B|0)<(A+p|0)){w=B;x=A;y=z}else{s=6320;break}}do{if((s|0)==6320){if((A|0)==0){if(!((w|0)==7|(w|0)==2)){break}}y=r+2|0;c[13898]=y;x=64656+(b*688&-1)|0;c[x>>2]=c[x>>2]|2;C=y;break L8679}}while(0);if((p|0)>0&(u^1)){D=0;E=0;F=q}else{C=o;break}while(1){if((a[D+146040|0]|0)==(a[j+(D+F|0)|0]|0)){G=F;H=E}else{if((D|0)!=5){C=o;break L8679}G=F-1|0;H=1}w=D+1|0;if((w|0)<(H+p|0)){D=w;E=H;F=G}else{break}}if((H|0)==0){if(!((D|0)==4|(D|0)==9)){C=o;break}}w=r+2|0;c[13898]=w;y=64656+(b*688&-1)|0;c[y>>2]=c[y>>2]&-3;C=w}else{C=o}}while(0);o=c[n+(C*40&-1)+36>>2]|0;r=c[n+(C*40&-1)+32>>2]|0;p=(a[n+(C*40&-1)|0]&1)==0;if((o|0)>0&(p^1)){I=0;J=0;K=r}else{break}while(1){if((a[I+86128|0]|0)==(a[j+(I+K|0)|0]|0)){L=K;M=J}else{if((I|0)!=2){break}L=K-1|0;M=1}q=I+1|0;if((q|0)<(M+o|0)){I=q;J=M;K=L}else{s=6336;break}}do{if((s|0)==6336){if((M|0)==0){if(!((I|0)==9|(I|0)==1)){break}}c[13898]=C+1;n=64656+(b*688&-1)|0;c[n>>2]=c[n>>2]|1;break L8650}}while(0);if((o|0)>0&(p^1)){N=0;O=0;P=r}else{break}while(1){if((a[N+84952|0]|0)==(a[j+(N+P|0)|0]|0)){Q=P;R=O}else{if((N|0)!=5){break L8650}Q=P-1|0;R=1}n=N+1|0;if((n|0)<(R+o|0)){N=n;O=R;P=Q}else{break}}if((R|0)==0){if(!((N|0)==4|(N|0)==11)){break}}c[13898]=C+1;o=64656+(b*688&-1)|0;c[o>>2]=c[o>>2]&-2}}while(0);if((c[5094]|0)==0){i=d;return}if(a[20368]|0){i=d;return}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2;i=d;return}function jw(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0.0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0.0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0.0,bf=0.0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0.0,bx=0.0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0.0,bN=0.0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0.0,b8=0.0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0.0,cm=0.0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0.0,cu=0.0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0.0,cH=0.0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cS=0,cT=0,cU=0,cV=0.0,cW=0.0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0.0,c4=0.0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,db=0.0,dc=0.0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0.0,dk=0.0,dm=0,dn=0,dp=0,dq=0,dr=0,ds=0,dt=0,du=0.0,dv=0.0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0.0,dC=0.0,dD=0,dE=0;d=i;i=i+224|0;e=d|0;f=d+24|0;g=d+48|0;j=d+88|0;k=d+128|0;l=d+168|0;m=b+4|0;n=(c[m>>2]|0)==-2;o=j;uE(o|0,0,40);c[j>>2]=4;c[j+4>>2]=4;c[j+8>>2]=4;p=k;uE(p|0,0,16);q=d+144|0;uE(q|0,0,24);r=c[13898]|0;s=c[8272]|0;do{if((r|0)<(s|0)){t=b+184|0;u=l|0;w=l+4|0;x=l+8|0;y=l+16|0;z=l+24|0;A=l+32|0;B=f|0;C=f+8|0;D=b+52|0;E=e|0;F=e+8|0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-2.0;T=1.0;U=-2;V=-2;W=0;X=r;Y=s;L8736:while(1){Z=c[1054]|0;_=(a[Z+(X*40&-1)|0]&1)==0;L8738:do{if(!_){$=c[Z+(X*40&-1)+36>>2]|0;aa=Z+(X*40&-1)+32|0;ab=c[10036]|0;ac=0;while(1){if((ac|0)>=($|0)){break}if((a[ab+((c[aa>>2]|0)+ac|0)|0]|0)==(a[ac+103664|0]|0)){ac=ac+1|0}else{break L8738}}if((ac|0)==1){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}}}while(0);L8745:do{if(J|(Y|0)<=(X|0)|_){au=6376}else{aa=c[Z+(X*40&-1)+36>>2]|0;ab=Z+(X*40&-1)+32|0;$=c[10036]|0;av=0;while(1){if((av|0)>=(aa|0)){break}if((a[$+((c[ab>>2]|0)+av|0)|0]|0)==(a[av+95280|0]|0)){av=av+1|0}else{au=6376;break L8745}}if(n|(av|0)!=2){au=6376;break}c[13898]=X+1;dl(g,0);aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=1;aK=I;aL=G;aM=H}}while(0);L8752:do{if((au|0)==6376){au=0;ab=c[Z+(X*40&-1)+36>>2]|0;$=c[Z+(X*40&-1)+32>>2]|0;L8754:do{if(K){au=6413}else{if(!((ab|0)>0&(_^1))){break}aa=c[10036]|0;ac=0;aN=0;aO=$;while(1){if((a[ac+149696|0]|0)==(a[aa+(ac+aO|0)|0]|0)){aP=aO;aQ=aN}else{if((ac|0)!=1){break}aP=aO-1|0;aQ=1}aR=ac+1|0;if((aR|0)<(aQ+ab|0)){ac=aR;aN=aQ;aO=aP}else{au=6383;break}}do{if((au|0)==6383){au=0;if((aQ|0)==0){if(!((ac|0)==4|(ac|0)==0)){break}}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=0;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=1;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);if(!((ab|0)>0&(_^1))){break}ac=c[10036]|0;aO=0;aN=0;aa=$;while(1){if((a[aO+179896|0]|0)==(a[ac+(aO+aa|0)|0]|0)){aS=aa;aT=aN}else{if((aO|0)!=1){au=6394;break}aS=aa-1|0;aT=1}aR=aO+1|0;if((aR|0)<(aT+ab|0)){aO=aR;aN=aT;aa=aS}else{au=6392;break}}do{if((au|0)==6392){au=0;if((aT|0)!=0){break}if(!((aO|0)==0|(aO|0)==6)){au=6394}}}while(0);L8779:do{if((au|0)==6394){au=0;if(_){break L8754}L8782:do{if((ab|0)>0){aO=c[10036]|0;aa=0;aN=0;ac=$;while(1){if((a[aa+149304|0]|0)==(a[aO+(aa+ac|0)|0]|0)){aU=ac;aV=aN}else{if((aa|0)!=1){break L8782}aU=ac-1|0;aV=1}aR=aa+1|0;if((aR|0)<(aV+ab|0)){aa=aR;aN=aV;ac=aU}else{break}}if((aV|0)!=0){break L8779}if((aa|0)==0|(aa|0)==6){break L8779}}}while(0);if(!((ab|0)>0&(_^1))){break L8754}ac=c[10036]|0;aN=0;aO=0;aR=$;while(1){if((a[aN+149568|0]|0)==(a[ac+(aN+aR|0)|0]|0)){aW=aR;aX=aO}else{if((aN|0)!=1){au=6413;break L8754}aW=aR-1|0;aX=1}aY=aN+1|0;if((aY|0)<(aX+ab|0)){aN=aY;aO=aX;aR=aW}else{break}}if((aX|0)==0){if(!((aN|0)==0|(aN|0)==5)){au=6413;break L8754}}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=2;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=1;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=1;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=1;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8805:do{if((au|0)==6413){au=0;if(_){break}L8808:do{if((ab|0)>0){av=c[10036]|0;aR=0;aO=0;ac=$;while(1){if((a[aR+90456|0]|0)==(a[av+(aR+ac|0)|0]|0)){aZ=ac;a_=aO}else{if((aR|0)!=3){break L8808}aZ=ac-1|0;a_=1}aY=aR+1|0;if((aY|0)<(a_+ab|0)){aR=aY;aO=a_;ac=aZ}else{break}}if((a_|0)==0){if(!((aR|0)==6|(aR|0)==2)){break}}a$=X+1|0;c[13898]=a$;ac=c[D>>2]|0;aO=a[Z+(a$*40&-1)|0]|0;L8820:do{if((Y|0)>(a$|0)){if((aO&1)==0){au=6427;break}av=c[Z+(a$*40&-1)+36>>2]|0;aN=Z+(a$*40&-1)+32|0;aY=c[10036]|0;a0=0;while(1){if((a0|0)>=(av|0)){break}if((a[aY+((c[aN>>2]|0)+a0|0)|0]|0)==(a[a0+163312|0]|0)){a0=a0+1|0}else{au=6427;break L8820}}if((a0|0)!=2){a1=av;a2=aN;break}c[13898]=X+2;aY=is(e)|0;aa=c[aY>>2]|0;if((aa|0)==1){a3=+(c[aY+8>>2]|0)}else if((aa|0)==2){a3=+h[aY+8>>3]}else if((aa|0)==3){a3=+uz(c[aY+8>>2]|0,0)}else{au=6433;break L8736}if((c[E>>2]|0)==3){uu(c[F>>2]|0);c[E>>2]=1}aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=~~a3;aL=G;aM=H;break L8752}else{au=6427}}while(0);if((au|0)==6427){au=0;a1=c[Z+(a$*40&-1)+36>>2]|0;a2=Z+(a$*40&-1)+32|0}if(!((aO&1)!=0&(a1|0)>0)){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=-270;aL=G;aM=H;break L8752}aR=c[10036]|0;aY=0;aa=0;a4=c[a2>>2]|0;while(1){if((a[aY+154360|0]|0)==(a[aR+(aY+a4|0)|0]|0)){a5=a4;a6=aa}else{if((aY|0)!=4){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=-270;aL=G;aM=H;break L8752}a5=a4-1|0;a6=1}a7=aY+1|0;if((a7|0)<(a6+a1|0)){aY=a7;aa=a6;a4=a5}else{break}}if((a6|0)==0){if(!((aY|0)==3|(aY|0)==8)){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=-270;aL=G;aM=H;break L8752}}if((c[m>>2]|0)>-1){au=6446;break L8736}c[13898]=X+2;c[m>>2]=-3;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=ac;aL=G;aM=H;break L8752}}while(0);if(!((ab|0)>0&(_^1))){break}a4=c[10036]|0;aa=0;aR=0;aO=$;while(1){if((a[aa+149328|0]|0)==(a[a4+(aa+aO|0)|0]|0)){a8=aO;a9=aR}else{if((aa|0)!=5){break L8805}a8=aO-1|0;a9=1}a7=aa+1|0;if((a7|0)<(a9+ab|0)){aa=a7;aR=a9;aO=a8}else{break}}if((a9|0)==0){if(!((aa|0)==4|(aa|0)==8)){break}}c[13898]=X+1;if((c[m>>2]|0)!=-3){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=0;aL=G;aM=H;break L8752}c[m>>2]=-2;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=0;aL=G;aM=H;break L8752}}while(0);L8865:do{if(!(M|(Y|0)<=(X|0)|_)){aO=c[10036]|0;aR=0;while(1){if((aR|0)>=(ab|0)){break}if((a[aO+($+aR|0)|0]|0)==(a[aR+124352|0]|0)){aR=aR+1|0}else{break L8865}}if((aR|0)!=4){break}ba=X+1|0;c[13898]=ba;if((ba|0)>=(Y|0)){bb=ba;au=6577;break L8736}L8873:do{if((a[Z+(ba*40&-1)|0]&1)!=0){aa=c[Z+(ba*40&-1)+36>>2]|0;a4=Z+(ba*40&-1)+32|0;a7=0;while(1){if((a7|0)>=(aa|0)){break}if((a[aO+((c[a4>>2]|0)+a7|0)|0]|0)==(a[a7+103664|0]|0)){a7=a7+1|0}else{break L8873}}if((a7|0)==1){bb=ba;au=6578;break L8736}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[B>>2]|0)!=3){au=6470;break L8736}aO=c[C>>2]|0;if((aO|0)==0){au=6472;break L8736}else{aw=aO;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=1;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}}while(0);L8882:do{if(!(O|n)){aO=(Y|0)>(X|0);if(_|aO^1){break}aR=c[10036]|0;a4=0;while(1){if((a4|0)>=(ab|0)){au=6479;break}if((a[aR+($+a4|0)|0]|0)==(a[a4+150704|0]|0)){a4=a4+1|0}else{break}}do{if((au|0)==6479){au=0;if((a4|0)!=4){break}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=0;aD=P;aE=1;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);if(_|aO^1){break}a4=c[10036]|0;aR=0;while(1){if((aR|0)>=(ab|0)){break}if((a[a4+($+aR|0)|0]|0)==(a[aR+150856|0]|0)){aR=aR+1|0}else{break L8882}}if((aR|0)!=5){break}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=1;aD=P;aE=1;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8899:do{if((ab|0)>0&(((V|0)!=-2|n|_)^1)){a4=c[10036]|0;aO=0;aa=0;ac=$;while(1){if((a[aO+140256|0]|0)==(a[a4+(aO+ac|0)|0]|0)){bc=ac;bd=aa}else{if((aO|0)!=2){break}bc=ac-1|0;bd=1}aY=aO+1|0;if((aY|0)<(bd+ab|0)){aO=aY;aa=bd;ac=bc}else{au=6493;break}}do{if((au|0)==6493){au=0;if((bd|0)==0){if(!((aO|0)==5|(aO|0)==1)){break}}ac=X+1|0;c[13898]=ac;c[u>>2]=1;c[w>>2]=U;c[x>>2]=H;c[x+4>>2]=G;h[y>>3]=T;h[z>>3]=S;c[A>>2]=c[q>>2];c[A+4>>2]=c[q+4>>2];c[A+8>>2]=c[q+8>>2];c[A+12>>2]=c[q+12>>2];c[A+16>>2]=c[q+16>>2];c[A+20>>2]=c[q+20>>2];hH(l,1,1);if((ac|0)==(c[13898]|0)){aw=W;ax=1;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}ac=c[u>>2]|0;aa=c[w>>2]|0;a4=c[x>>2]|0;aR=c[x+4>>2]|0;be=+h[y>>3];bf=+h[z>>3];c[q>>2]=c[A>>2];c[q+4>>2]=c[A+4>>2];c[q+8>>2]=c[A+8>>2];c[q+12>>2]=c[A+12>>2];c[q+16>>2]=c[A+16>>2];c[q+20>>2]=c[A+20>>2];aw=W;ax=ac;ay=aa;az=be;aA=bf;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=aR;aM=a4;break L8752}}while(0);if(!((ab|0)>0&(_^1))){break}aO=c[10036]|0;a4=0;aR=0;aa=$;while(1){if((a[a4+138112|0]|0)==(a[aO+(a4+aa|0)|0]|0)){bg=aa;bh=aR}else{if((a4|0)!=4){break L8899}bg=aa-1|0;bh=1}ac=a4+1|0;if((ac|0)<(bh+ab|0)){a4=ac;aR=bh;aa=bg}else{break}}if((bh|0)==0){if(!((a4|0)==3|(a4|0)==7)){break}}c[13898]=X+1;aw=W;ax=0;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8926:do{if((ab|0)>0&((N|_)^1)){aa=c[10036]|0;aR=0;aO=0;ac=$;while(1){if((a[aR+136456|0]|0)==(a[aa+(aR+ac|0)|0]|0)){bi=ac;bj=aO}else{if((aR|0)!=2){break L8926}bi=ac-1|0;bj=1}aY=aR+1|0;if((aY|0)<(bj+ab|0)){aR=aY;aO=bj;ac=bi}else{break}}if((bj|0)==0){if(!((aR|0)==1|(aR|0)==6)){break}}c[13898]=X+1;dl(j,4);aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=1;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8939:do{if((Y|0)>(X|0)){if(_){au=6544;break L8736}ac=c[10036]|0;aO=0;while(1){if((aO|0)>=(ab|0)){break}if((a[ac+($+aO|0)|0]|0)==(a[aO+143040|0]|0)){aO=aO+1|0}else{au=6521;break L8939}}if((aO|0)!=2){au=6521;break}if(!P){au=6532}}else{au=6521}}while(0);L8947:do{if((au|0)==6521){au=0;if(_){au=6544;break L8736}if((ab|0)>0){ac=c[10036]|0;aR=0;aa=0;a4=$;while(1){if((a[aR+142856|0]|0)==(a[ac+(aR+a4|0)|0]|0)){bk=a4;bl=aa}else{if((aR|0)!=4){break L8947}bk=a4-1|0;bl=1}bm=aR+1|0;if((bm|0)<(bl+ab|0)){aR=bm;aa=bl;a4=bk}else{break}}if((bl|0)==0){bn=bm;au=6529}else{bo=0}}else{bn=0;au=6529}if((au|0)==6529){au=0;bo=(bn|0)!=10&(bn|0)!=4}if(!(bo|P)){au=6532}}}while(0);if((au|0)==6532){au=0;hI(k,7);aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=1;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break}if(_){au=6534;break L8736}if((ab|0)<=0){au=6547;break L8736}a4=c[10036]|0;aa=0;aR=0;ac=$;while(1){if((a[aa+121536|0]|0)==(a[a4+(aa+ac|0)|0]|0)){bp=ac;bq=aR}else{if((aa|0)!=5){break}bp=ac-1|0;bq=1}aO=aa+1|0;if((aO|0)<(bq+ab|0)){aa=aO;aR=bq;ac=bp}else{au=6541;break}}do{if((au|0)==6541){au=0;if((bq|0)==0){if(!((aa|0)==4|(aa|0)==10)){break}}a[t]=1;c[13898]=(c[13898]|0)+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);if(_){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}if((ab|0)<=0){au=6547;break L8736}aa=c[10036]|0;ac=0;aR=0;a4=$;while(1){if((a[ac+122880|0]|0)==(a[aa+(ac+a4|0)|0]|0)){br=a4;bs=aR}else{if((ac|0)!=3){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}br=a4-1|0;bs=1}aO=ac+1|0;if((aO|0)<(bs+ab|0)){ac=aO;aR=bs;a4=br}else{break}}if((bs|0)==0){if(!((ac|0)==2|(ac|0)==8)){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}}a[t]=0;c[13898]=(c[13898]|0)+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H}}while(0);_=c[13898]|0;Z=c[8272]|0;if((_|0)<(Z|0)){G=aL;H=aM;I=aK;J=aJ;K=aI;L=aH;M=aG;N=aF;O=aE;P=aD;Q=aC;R=aB;S=aA;T=az;U=ay;V=ax;W=aw;X=_;Y=Z}else{ad=aL;ae=aM;af=aK;ag=aJ;ah=aI;ai=aH;aj=aG;ak=aF;al=aE;am=aD;an=aC;ao=aB;ap=aA;aq=az;ar=ay;as=ax;at=aw;au=6556;break}}if((au|0)==6577){uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6578){uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6534){if(J){bt=W;bu=V;bv=U;bw=T;bx=S;by=R;bz=Q;bA=P;bB=O;bC=N;bD=M;bE=L;bF=K;bG=I;bH=G;bI=H;au=6558}else{bJ=W;bK=V;bL=U;bM=T;bN=S;bO=R;bP=Q;bQ=P;bR=O;bS=N;bT=M;bU=L;bV=K;bW=I;bX=G;bY=H;au=6557}}else if((au|0)==6544){if(J){bt=W;bu=V;bv=U;bw=T;bx=S;by=R;bz=Q;bA=P;bB=O;bC=N;bD=M;bE=L;bF=K;bG=I;bH=G;bI=H;au=6558}else{bJ=W;bK=V;bL=U;bM=T;bN=S;bO=R;bP=Q;bQ=P;bR=O;bS=N;bT=M;bU=L;bV=K;bW=I;bX=G;bY=H;au=6557}}else if((au|0)==6547){if(J){bt=W;bu=V;bv=U;bw=T;bx=S;by=R;bz=Q;bA=P;bB=O;bC=N;bD=M;bE=L;bF=K;bG=I;bH=G;bI=H;au=6558}else{bJ=W;bK=V;bL=U;bM=T;bN=S;bO=R;bP=Q;bQ=P;bR=O;bS=N;bT=M;bU=L;bV=K;bW=I;bX=G;bY=H;au=6557}}else if((au|0)==6556){if(ag){bt=at;bu=as;bv=ar;bw=aq;bx=ap;by=ao;bz=an;bA=am;bB=al;bC=ak;bD=aj;bE=ai;bF=ah;bG=af;bH=ad;bI=ae;au=6558}else{bJ=at;bK=as;bL=ar;bM=aq;bN=ap;bO=ao;bP=an;bQ=am;bR=al;bS=ak;bT=aj;bU=ai;bV=ah;bW=af;bX=ad;bY=ae;au=6557}}else if((au|0)==6470){c[13898]=ba;bb=ba;uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6472){bb=c[13898]|0;uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6446){uf(a$,151096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6433){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((au|0)==6558){Y=b+8|0;X=g;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];c[Y+16>>2]=c[X+16>>2];c[Y+20>>2]=c[X+20>>2];c[Y+24>>2]=c[X+24>>2];c[Y+28>>2]=c[X+28>>2];c[Y+32>>2]=c[X+32>>2];c[Y+36>>2]=c[X+36>>2];if(bF){bZ=bH;b_=bI;b$=bG;b0=bE;b1=bD;b2=bC;b3=bB;b4=bA;b5=bz;b6=by;b7=bx;b8=bw;b9=bv;ca=bu;cb=bt;au=6559}else{cc=bH;cd=bI;ce=bG;cf=bE;cg=bD;ch=bC;ci=bB;cj=bA;ck=bz;cl=bx;cm=bw;cn=bv;co=bu;cp=bt;au=6560}}else if((au|0)==6557){uE(g|0,0,40);if(bV){bZ=bX;b_=bY;b$=bW;b0=bU;b1=bT;b2=bS;b3=bR;b4=bQ;b5=bP;b6=bO;b7=bN;b8=bM;b9=bL;ca=bK;cb=bJ;au=6559}else{cc=bX;cd=bY;ce=bW;cf=bU;cg=bT;ch=bS;ci=bR;cj=bQ;ck=bP;cl=bN;cm=bM;cn=bL;co=bK;cp=bJ;au=6560}}if((au|0)==6559){c[b+48>>2]=b6;if(b0){cq=cb;cr=ca;cs=b9;ct=b8;cu=b7;cv=b5;cw=b4;cx=b3;cy=b2;cz=b1;cA=b$;cB=bZ;cC=b_;au=6561}else{cD=cb;cE=ca;cF=b9;cG=b8;cH=b7;cI=b5;cJ=b4;cK=b3;cL=b2;cM=b1;cN=bZ;cO=b_;au=6562}}else if((au|0)==6560){if(cf){cq=cp;cr=co;cs=cn;ct=cm;cu=cl;cv=ck;cw=cj;cx=ci;cy=ch;cz=cg;cA=ce;cB=cc;cC=cd;au=6561}else{cD=cp;cE=co;cF=cn;cG=cm;cH=cl;cI=ck;cJ=cj;cK=ci;cL=ch;cM=cg;cN=cc;cO=cd;au=6562}}if((au|0)==6561){c[b+52>>2]=cA;if(cx){cP=cB;cQ=cC;cR=cz;cS=cy;cT=cw;cU=cv;cV=cu;cW=ct;cX=cs;cY=cr;cZ=cq;au=6563}else{c_=cB;c$=cC;c0=cz;c1=cy;c2=cw;c3=cu;c4=ct;c5=cs;c6=cr;c7=cq;au=6564}}else if((au|0)==6562){if(cK){cP=cN;cQ=cO;cR=cM;cS=cL;cT=cJ;cU=cI;cV=cH;cW=cG;cX=cF;cY=cE;cZ=cD;au=6563}else{c_=cN;c$=cO;c0=cM;c1=cL;c2=cJ;c3=cH;c4=cG;c5=cF;c6=cE;c7=cD;au=6564}}if((au|0)==6563){c[b+56>>2]=cU;if(cR){c8=cZ;c9=cY;da=cX;db=cW;dc=cV;dd=cT;de=cS;df=cP;dg=cQ;au=6565}else{dh=cY;di=cX;dj=cW;dk=cV;dm=cT;dn=cS;dp=cP;dq=cQ;au=6566}}else if((au|0)==6564){if(c0){c8=c7;c9=c6;da=c5;db=c4;dc=c3;dd=c2;de=c1;df=c_;dg=c$;au=6565}else{dh=c6;di=c5;dj=c4;dk=c3;dm=c2;dn=c1;dp=c_;dq=c$;au=6566}}if((au|0)==6565){c[b+64>>2]=c8;if(dd){dr=df;ds=dg;dt=de;du=dc;dv=db;dw=da;dx=c9;au=6567}else{dy=df;dz=dg;dA=de;dB=dc;dC=db;dD=da;dE=c9}}else if((au|0)==6566){if(dm){dr=dp;ds=dq;dt=dn;du=dk;dv=dj;dw=di;dx=dh;au=6567}else{dy=dp;dz=dq;dA=dn;dB=dk;dC=dj;dD=di;dE=dh}}if((au|0)==6567){X=b+72|0;c[X>>2]=c[p>>2];c[X+4>>2]=c[p+4>>2];c[X+8>>2]=c[p+8>>2];c[X+12>>2]=c[p+12>>2];dy=dr;dz=ds;dA=dt;dB=du;dC=dv;dD=dw;dE=dx}if((dE|0)>-1){c[b+88>>2]=dE;c[b+92>>2]=dD;X=b+96|0;c[X>>2]=dz;c[X+4>>2]=dy;h[b+104>>3]=dC;h[b+112>>3]=dB;X=b+120|0;c[X>>2]=c[q>>2];c[X+4>>2]=c[q+4>>2];c[X+8>>2]=c[q+8>>2];c[X+12>>2]=c[q+12>>2];c[X+16>>2]=c[q+16>>2];c[X+20>>2]=c[q+20>>2];if(!dA){break}}else{if(!dA){break}}X=b+144|0;c[X>>2]=c[o>>2];c[X+4>>2]=c[o+4>>2];c[X+8>>2]=c[o+8>>2];c[X+12>>2]=c[o+12>>2];c[X+16>>2]=c[o+16>>2];c[X+20>>2]=c[o+20>>2];c[X+24>>2]=c[o+24>>2];c[X+28>>2]=c[o+28>>2];c[X+32>>2]=c[o+32>>2];c[X+36>>2]=c[o+36>>2]}else{uE(g|0,0,40)}}while(0);if((c[b+72>>2]|0)!=6){i=d;return}h[b+80>>3]=+h[b+40>>3];i=d;return}
-function jx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0.0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0.0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0.0,a7=0.0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0.0,bu=0,bv=0,bw=0.0,bx=0,by=0,bz=0;e=i;i=i+96|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;c[13898]=l+1;do{if((b|0)<-1){c[13898]=l;if((d|0)==1){n=b;o=49264;p=0;q=0;r=49160;s=0;t=0;u=l;break}uf(l,191504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=c[10818]|0;L9036:do{if((w|0)==0){x=0;y=0;z=6591}else{A=(b|0)>0;B=0;C=w;while(1){if(A){D=c[C+4>>2]|0;if((D|0)>=(b|0)){break}}E=c[C>>2]|0;if((E|0)==0){x=C;y=0;z=6591;break L9036}else{B=C;C=E}}if((C|0)==0){F=b;G=B;H=0;z=6594;break}if((D|0)!=(b|0)){x=B;y=C;z=6591;break}A=c[C+12>>2]|0;if((A|0)==(d|0)){I=b;J=0;K=C;break}E=C|0;L=c[E>>2]|0;if((A|0)==4){uu(c[(C+104|0)+4>>2]|0)}if((d|0)==4){uD(C|0,33240,272)}else if((d|0)==1){uD(C|0,1144,272);c[C+52>>2]=-7;c[C+16>>2]=3}else if((d|0)==3){uD(C|0,1416,272)}else if((d|0)==2){uD(C|0,1688,272)}else{uf(-1,177064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[C+4>>2]=b;c[C+12>>2]=d;c[E>>2]=L;I=b;J=C;K=C}}while(0);do{if((z|0)==6591){if((b|0)!=-1){F=b;G=x;H=y;z=6594;break}if((x|0)==0){F=1;G=0;H=y;z=6594;break}F=(c[x+4>>2]|0)+1|0;G=x;H=y;z=6594}}while(0);if((z|0)==6594){w=ut(272)|0;do{if((w|0)==0){gk();L=ut(272)|0;if((L|0)!=0){M=L;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=177576,v)|0)}else{M=w}}while(0);w=M;if((d|0)==1){uD(M|0,1144,272);c[M+52>>2]=-7;c[M+16>>2]=3}else if((d|0)==3){uD(M|0,1416,272)}else if((d|0)==2){uD(M|0,1688,272)}else if((d|0)==4){uD(M|0,33240,272)}else{uf(-1,177064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[M+4>>2]=F;c[M+12>>2]=d;if((G|0)==0){c[10818]=w}else{c[G>>2]=w}c[M>>2]=H;I=F;J=w;K=w}w=K+104|0;n=I;o=w|0;p=w;q=J;r=K;s=w;t=w;u=c[13898]|0}}while(0);K=c[8272]|0;if((u|0)>=(K|0)){i=e;return}J=o+88|0;I=o+128|0;F=J|0;H=I|0;M=o+92|0;G=o+132|0;y=o+104|0;x=o+144|0;b=o+112|0;D=o+152|0;l=o|0;w=o+48|0;L=o+8|0;o=r+8|0;E=k|0;A=k+8|0;N=r+80|0;O=r+52|0;Q=r+88|0;R=Q|0;S=r+12|0;T=(q|0)==0;q=r+16|0;U=q|0;V=r+20|0;W=r+24|0;X=r+32|0;Y=(n|0)<0;n=r+16|0;Z=j|0;_=j+8|0;$=t+88|0;aa=g|0;ab=g+8|0;ac=t+96|0;ad=t+48|0;ae=t+8|0;t=p+48|0;af=p|0;ag=f|0;ah=f+8|0;ai=p+88|0;aj=p+8|0;p=s+4|0;ak=s|0;s=0;al=0;am=0;an=0;ao=0;ap=0;aq=1.0;ar=u;u=K;L9085:while(1){K=c[1054]|0;as=(a[K+(ar*40&-1)|0]&1)==0;L9087:do{if(!as){at=c[K+(ar*40&-1)+36>>2]|0;au=K+(ar*40&-1)+32|0;av=c[10036]|0;aw=0;while(1){if((aw|0)>=(at|0)){break}if((a[av+((c[au>>2]|0)+aw|0)|0]|0)==(a[aw+103664|0]|0)){aw=aw+1|0}else{break L9087}}if((aw|0)==1){ax=am;ay=an;az=ao;aA=aq;z=6939;break L9085}}}while(0);L9094:do{if((d|0)==3){au=(u|0)>(ar|0);L9096:do{if(au){av=c[K+(ar*40&-1)+36>>2]|0;at=K+(ar*40&-1)+32|0;if(as){aB=c[at>>2]|0;aC=av;z=6764;break}C=c[10036]|0;B=0;while(1){if((B|0)>=(av|0)){break}if((a[C+((c[at>>2]|0)+B|0)|0]|0)==(a[B+95280|0]|0)){B=B+1|0}else{z=6754;break L9096}}if((B|0)==2){z=6762}else{z=6754}}else{z=6754}}while(0);L9105:do{if((z|0)==6754){z=0;aw=c[K+(ar*40&-1)+36>>2]|0;at=c[K+(ar*40&-1)+32>>2]|0;L9107:do{if((aw|0)>0&(as^1)){C=c[10036]|0;av=0;aD=0;aE=at;while(1){if((a[av+185064|0]|0)==(a[C+(av+aE|0)|0]|0)){aF=aE;aG=aD}else{if((av|0)!=3){break L9107}aF=aE-1|0;aG=1}aH=av+1|0;if((aH|0)<(aG+aw|0)){av=aH;aD=aG;aE=aF}else{break}}if((aG|0)!=0){z=6762;break L9105}if((av|0)==2|(av|0)==6){z=6762;break L9105}}}while(0);if(au){aB=at;aC=aw;z=6764}else{aJ=aw;aK=at}}}while(0);if((z|0)==6762){z=0;c[13898]=ar+1;dl(aj,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break}L9120:do{if((z|0)==6764){z=0;if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}au=c[10036]|0;B=0;while(1){if((B|0)>=(aC|0)){break}if((a[au+(aB+B|0)|0]|0)==(a[B+130496|0]|0)){B=B+1|0}else{aJ=aC;aK=aB;break L9120}}if((B|0)!=4){aJ=aC;aK=aB;break}c[13898]=ar+1;dl(t,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break L9094}}while(0);if(!((aJ|0)>0&(as^1))){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}au=c[10036]|0;at=0;aw=0;aE=aK;while(1){if((a[at+212296|0]|0)==(a[au+(at+aE|0)|0]|0)){aW=aE;aX=aw}else{if((at|0)!=3){break}aW=aE-1|0;aX=1}aD=at+1|0;if((aD|0)<(aX+aJ|0)){at=aD;aw=aX;aE=aW}else{z=6776;break}}do{if((z|0)==6776){z=0;if((aX|0)==0){if(!((at|0)==5|(at|0)==2)){break}}c[13898]=ar+1;aE=is(f)|0;aw=c[aE>>2]|0;if((aw|0)==1){aY=+(c[aE+8>>2]|0)}else if((aw|0)==2){aY=+h[aE+8>>3]}else if((aw|0)==3){aY=+uz(c[aE+8>>2]|0,0)}else{z=6782;break L9085}if((c[ag>>2]|0)==3){uu(c[ah>>2]|0);c[ag>>2]=1}h[ai>>3]=aY;aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break L9094}}while(0);if(!((aJ|0)>0&(as^1))){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}at=c[10036]|0;aE=0;aw=0;au=aK;while(1){if((a[aE+211736|0]|0)==(a[at+(aE+au|0)|0]|0)){aZ=au;a_=aw}else{if((aE|0)!=4){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aZ=au-1|0;a_=1}aD=aE+1|0;if((aD|0)<(a_+aJ|0)){aE=aD;aw=a_;au=aZ}else{break}}if((a_|0)==0){if(!((aE|0)==3|(aE|0)==5)){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}}a$=ar+1|0;c[13898]=a$;au=(u|0)>(a$|0);L9161:do{if(au){do{if((a[K+(a$*40&-1)|0]&1)!=0){aw=c[K+(a$*40&-1)+36>>2]|0;at=K+(a$*40&-1)+32|0;aD=c[10036]|0;C=0;while(1){if((C|0)>=(aw|0)){z=6799;break}if((a[aD+((c[at>>2]|0)+C|0)|0]|0)==(a[C+150688|0]|0)){C=C+1|0}else{z=6800;break}}if((z|0)==6799){z=0;if((C|0)==2|au^1){z=6806;break L9161}else{break}}else if((z|0)==6800){z=0;if(au){break}else{z=6806;break L9161}}}}while(0);B=(a[K+(a$*40&-1)|0]&1)==0;if(B){z=6963;break L9085}at=c[K+(a$*40&-1)+36>>2]|0;aD=K+(a$*40&-1)+32|0;aw=c[10036]|0;av=0;while(1){if((av|0)>=(at|0)){z=6805;break}if((a[aw+((c[aD>>2]|0)+av|0)|0]|0)==(a[av+103664|0]|0)){av=av+1|0}else{break}}if((z|0)==6805){z=0;if((av|0)==1){z=6806;break}}if(B){z=6962;break L9085}aD=c[K+(a$*40&-1)+36>>2]|0;aw=K+(a$*40&-1)+32|0;at=c[10036]|0;aH=0;while(1){if((aH|0)>=(aD|0)){z=6811;break}if((a[at+((c[aw>>2]|0)+aH|0)|0]|0)==(a[aH+211336|0]|0)){aH=aH+1|0}else{break}}do{if((z|0)==6811){z=0;if((aH|0)!=2){break}c[af>>2]=1;break L9161}}while(0);if(B){z=6964;break L9085}aH=c[K+(a$*40&-1)+36>>2]|0;aw=K+(a$*40&-1)+32|0;at=c[10036]|0;aD=0;while(1){if((aD|0)>=(aH|0)){break}if((a[at+((c[aw>>2]|0)+aD|0)|0]|0)==(a[aD+210848|0]|0)){aD=aD+1|0}else{z=6965;break L9085}}if((aD|0)!=2){z=6966;break L9085}c[af>>2]=2}else{z=6806}}while(0);if((z|0)==6806){z=0;c[af>>2]=0}c[13898]=(c[13898]|0)+1;aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s}else if((d|0)==2){au=(u|0)>(ar|0);L9197:do{if(au){aE=c[K+(ar*40&-1)+36>>2]|0;aw=K+(ar*40&-1)+32|0;if(as){a0=c[aw>>2]|0;a1=aE;break}at=c[10036]|0;aH=0;while(1){if((aH|0)>=(aE|0)){break}if((a[at+((c[aw>>2]|0)+aH|0)|0]|0)==(a[aH+95280|0]|0)){aH=aH+1|0}else{z=6682;break L9197}}if((aH|0)==2){z=6690}else{z=6682}}else{z=6682}}while(0);L9206:do{if((z|0)==6682){z=0;aw=c[K+(ar*40&-1)+36>>2]|0;at=c[K+(ar*40&-1)+32>>2]|0;L9208:do{if((aw|0)>0&(as^1)){aE=c[10036]|0;aD=0;B=0;av=at;while(1){if((a[aD+185064|0]|0)==(a[aE+(aD+av|0)|0]|0)){a2=av;a3=B}else{if((aD|0)!=3){break L9208}a2=av-1|0;a3=1}a4=aD+1|0;if((a4|0)<(a3+aw|0)){aD=a4;B=a3;av=a2}else{break}}if((a3|0)!=0){z=6690;break L9206}if((aD|0)==2|(aD|0)==6){z=6690;break L9206}}}while(0);if(au){a0=at;a1=aw}else{aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}}}while(0);if((z|0)==6690){z=0;c[13898]=ar+1;dl(ae,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break}L9222:do{if(as){z=6697}else{aH=c[10036]|0;av=0;while(1){if((av|0)>=(a1|0)){break}if((a[aH+(a0+av|0)|0]|0)==(a[av+130496|0]|0)){av=av+1|0}else{z=6697;break L9222}}if((av|0)!=4){z=6697}}}while(0);do{if((z|0)==6697){z=0;if(!au){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aH=c[10036]|0;aw=0;while(1){if((aw|0)>=(a1|0)){z=6702;break}if((a[aH+(a0+aw|0)|0]|0)==(a[aw+184696|0]|0)){aw=aw+1|0}else{break}}if((z|0)==6702){z=0;if((aw|0)==6){break}}if(!au){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aH=c[10036]|0;av=0;while(1){if((av|0)>=(a1|0)){break}if((a[aH+(a0+av|0)|0]|0)==(a[av+184328|0]|0)){av=av+1|0}else{aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}}if((av|0)!=3){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aw=ar+1|0;c[13898]=aw;if((u|0)<=(aw|0)){a5=aw;z=6948;break L9085}if((a[K+(aw*40&-1)|0]&1)==0){a5=aw;z=6946;break L9085}at=c[K+(aw*40&-1)+36>>2]|0;B=K+(aw*40&-1)+32|0;aE=0;while(1){if((aE|0)>=(at|0)){break}if((a[aH+((c[B>>2]|0)+aE|0)|0]|0)==(a[aE+78280|0]|0)){aE=aE+1|0}else{a5=aw;z=6952;break L9085}}if((aE|0)!=1){a5=aw;z=6953;break L9085}c[13898]=ar+2;B=is(j)|0;aH=c[B>>2]|0;if((aH|0)==1){a6=+(c[B+8>>2]|0)}else if((aH|0)==2){a6=+h[B+8>>3]}else if((aH|0)==3){a6=+uz(c[B+8>>2]|0,0)}else{z=6720;break L9085}if((c[Z>>2]|0)==3){uu(c[_>>2]|0);c[Z>>2]=1}if(+P(+a6)>1.0e3){z=6724;break L9085}h[$>>3]=a6;B=c[13898]|0;aH=B+1|0;c[13898]=aH;if((c[8272]|0)<=(B|0)){a5=aH;z=6956;break L9085}at=c[1054]|0;if((a[at+(B*40&-1)|0]&1)==0){a5=aH;z=6957;break L9085}av=c[at+(B*40&-1)+36>>2]|0;C=at+(B*40&-1)+32|0;B=c[10036]|0;at=0;while(1){if((at|0)>=(av|0)){break}if((a[B+((c[C>>2]|0)+at|0)|0]|0)==(a[at+183584|0]|0)){at=at+1|0}else{a5=aH;z=6954;break L9085}}if((at|0)!=1){a5=aH;z=6955;break L9085}C=is(g)|0;B=c[C>>2]|0;if((B|0)==1){a7=+(c[C+8>>2]|0)}else if((B|0)==2){a7=+h[C+8>>3]}else if((B|0)==3){a7=+uz(c[C+8>>2]|0,0)}else{z=6735;break L9085}if((c[aa>>2]|0)==3){uu(c[ab>>2]|0);c[aa>>2]=1}if(+P(+a7)>1.0e3){z=6739;break L9085}h[ac>>3]=a7;C=c[13898]|0;B=C+1|0;c[13898]=B;if((c[8272]|0)<=(C|0)){a5=B;z=6947;break L9085}av=c[1054]|0;if((a[av+(C*40&-1)|0]&1)==0){a5=B;z=6951;break L9085}aw=c[av+(C*40&-1)+36>>2]|0;aE=av+(C*40&-1)+32|0;C=c[10036]|0;av=0;while(1){if((av|0)>=(aw|0)){break}if((a[C+((c[aE>>2]|0)+av|0)|0]|0)==(a[av+78864|0]|0)){av=av+1|0}else{a5=B;z=6949;break L9085}}if((av|0)==1){aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break L9094}else{a5=B;z=6950;break L9085}}}while(0);c[13898]=ar+1;dl(ad,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s}else if((d|0)==1){au=(u|0)>(ar|0);L9285:do{if(au){do{if(!as){aE=c[K+(ar*40&-1)+36>>2]|0;C=K+(ar*40&-1)+32|0;aw=c[10036]|0;aH=0;while(1){if((aH|0)>=(aE|0)){z=6631;break}if((a[aw+((c[C>>2]|0)+aH|0)|0]|0)==(a[aH+188576|0]|0)){aH=aH+1|0}else{break}}do{if((z|0)==6631){z=0;if((aH|0)!=4){break}c[13898]=ar+1;dl(J,0);a8=c[13898]|0;C=(c[8272]|0)>(a8|0);if(!C){z=6967;break L9085}aw=c[1054]|0;L9296:do{if((a[aw+(a8*40&-1)|0]&1)==0){z=6640}else{aE=c[aw+(a8*40&-1)+36>>2]|0;aD=aw+(a8*40&-1)+32|0;at=c[10036]|0;a4=0;while(1){if((a4|0)>=(aE|0)){z=6637;break}if((a[at+((c[aD>>2]|0)+a4|0)|0]|0)==(a[a4+187176|0]|0)){a4=a4+1|0}else{break}}do{if((z|0)==6637){z=0;if((a4|0)!=2){break}c[13898]=a8+1;dl(I,0);break L9296}}while(0);if(C){z=6640}else{z=6970;break L9085}}}while(0);if((z|0)==6640){z=0;C=c[1054]|0;if((a[C+(a8*40&-1)|0]&1)==0){z=6971;break L9085}aw=c[C+(a8*40&-1)+36>>2]|0;a4=C+(a8*40&-1)+32|0;C=c[10036]|0;aD=0;while(1){if((aD|0)>=(aw|0)){break}if((a[C+((c[a4>>2]|0)+aD|0)|0]|0)==(a[aD+186688|0]|0)){aD=aD+1|0}else{z=6968;break L9085}}if((aD|0)!=3){z=6969;break L9085}c[13898]=a8+1;dl(I,c[F>>2]|0);if((c[F>>2]|0)!=(c[H>>2]|0)){z=6958;break L9085}if((c[M>>2]|0)!=(c[G>>2]|0)){z=6959;break L9085}h[x>>3]=+h[y>>3]+ +h[x>>3];h[D>>3]=+h[b>>3]+ +h[D>>3]}c[l>>2]=0;aL=aq;aM=ap;aN=ao;aO=1;aP=am;aQ=al;aR=s;break L9094}}while(0);if(!au){z=6659;break L9285}if(as){break}aH=c[K+(ar*40&-1)+36>>2]|0;a4=K+(ar*40&-1)+32|0;C=c[10036]|0;aw=0;while(1){if((aw|0)>=(aH|0)){break}if((a[C+((c[a4>>2]|0)+aw|0)|0]|0)==(a[aw+95280|0]|0)){aw=aw+1|0}else{z=6659;break L9285}}if((aw|0)==2){z=6667;break L9285}else{z=6659;break L9285}}}while(0);a9=c[K+(ar*40&-1)+36>>2]|0;ba=c[K+(ar*40&-1)+32>>2]|0}else{z=6659}}while(0);L9324:do{if((z|0)==6659){z=0;B=c[K+(ar*40&-1)+36>>2]|0;av=c[K+(ar*40&-1)+32>>2]|0;if(!((B|0)>0&(as^1))){a9=B;ba=av;break}a4=c[10036]|0;C=0;aH=0;at=av;while(1){if((a[C+185064|0]|0)==(a[a4+(C+at|0)|0]|0)){bb=at;bc=aH}else{if((C|0)!=3){a9=B;ba=av;break L9324}bb=at-1|0;bc=1}aE=C+1|0;if((aE|0)<(bc+B|0)){C=aE;aH=bc;at=bb}else{break}}if((bc|0)!=0){z=6667;break}if((C|0)==2|(C|0)==6){z=6667}else{a9=B;ba=av}}}while(0);if((z|0)==6667){z=0;c[13898]=ar+1;dl(L,0);c[l>>2]=1;aL=aq;aM=ap;aN=1;aO=an;aP=am;aQ=al;aR=s;break}if(!au){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}at=c[10036]|0;aH=0;while(1){if((aH|0)>=(a9|0)){break}if((a[at+(ba+aH|0)|0]|0)==(a[aH+130496|0]|0)){aH=aH+1|0}else{aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}}if((aH|0)!=4){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}c[13898]=ar+1;dl(w,0);c[l>>2]=1;aL=aq;aM=ap;aN=1;aO=an;aP=am;aQ=al;aR=s}else if((d|0)==4){L9346:do{if((u|0)<=(ar|0)|as){bd=ap}else{at=c[K+(ar*40&-1)+36>>2]|0;au=K+(ar*40&-1)+32|0;a4=c[10036]|0;aE=0;while(1){if((aE|0)>=(at|0)){break}if((a[a4+((c[au>>2]|0)+aE|0)|0]|0)==(a[aE+188576|0]|0)){aE=aE+1|0}else{bd=ap;break L9346}}if((aE|0)!=4){bd=ap;break}c[13898]=ar+1;au=db(c[p>>2]|0,40,182592)|0;c[p>>2]=au;dl(au,0);c[ak>>2]=1;bd=1}}while(0);aH=an;L9354:while(1){be=c[13898]|0;bf=c[8272]|0;au=(bf|0)>(be|0);if(!au){break}a4=c[1054]|0;do{if((a[a4+(be*40&-1)|0]&1)==0){z=6835}else{at=c[a4+(be*40&-1)+36>>2]|0;av=a4+(be*40&-1)+32|0;B=c[10036]|0;C=0;while(1){if((C|0)>=(at|0)){z=6833;break}if((a[B+((c[av>>2]|0)+C|0)|0]|0)==(a[C+187176|0]|0)){C=C+1|0}else{break}}if((z|0)==6833){z=0;if((C|0)==2){break}}if(au){z=6835}else{break L9354}}}while(0);if((z|0)==6835){z=0;au=c[1054]|0;if((a[au+(be*40&-1)|0]&1)==0){break}a4=c[au+(be*40&-1)+36>>2]|0;aE=au+(be*40&-1)+32|0;au=c[10036]|0;av=0;while(1){if((av|0)>=(a4|0)){break}if((a[au+((c[aE>>2]|0)+av|0)|0]|0)==(a[av+186688|0]|0)){av=av+1|0}else{break L9354}}if((av|0)!=3){break}}bg=c[p>>2]|0;if(!bd){z=6857;break L9085}c[p>>2]=db(bg,((c[ak>>2]|0)*40&-1)+40|0,182592)|0;aE=c[13898]|0;c[13898]=aE+1;L9374:do{if((c[8272]|0)>(aE|0)){au=c[1054]|0;if((a[au+(aE*40&-1)|0]&1)==0){z=6846;break}a4=c[au+(aE*40&-1)+36>>2]|0;B=au+(aE*40&-1)+32|0;au=c[10036]|0;at=0;while(1){if((at|0)>=(a4|0)){break}if((a[au+((c[B>>2]|0)+at|0)|0]|0)==(a[at+187176|0]|0)){at=at+1|0}else{z=6846;break L9374}}B=c[ak>>2]|0;au=c[p>>2]|0;a4=au+(B*40&-1)|0;if((at|0)!=2){bh=B;bi=au;bj=a4;z=6849;break}dl(a4,0)}else{z=6846}}while(0);if((z|0)==6846){z=0;aE=c[ak>>2]|0;av=c[p>>2]|0;bh=aE;bi=av;bj=av+(aE*40&-1)|0;z=6849}if((z|0)==6849){z=0;dl(bj,c[bi>>2]|0);aE=c[p>>2]|0;av=bh-1|0;if((c[aE+(bh*40&-1)>>2]|0)!=(c[aE+(av*40&-1)>>2]|0)){z=6972;break L9085}if((c[aE+(bh*40&-1)+4>>2]|0)!=(c[aE+(av*40&-1)+4>>2]|0)){z=6973;break L9085}a4=aE+(bh*40&-1)+16|0;h[a4>>3]=+h[aE+(av*40&-1)+16>>3]+ +h[a4>>3];a4=c[p>>2]|0;aE=a4+(bh*40&-1)+24|0;h[aE>>3]=+h[a4+(av*40&-1)+24>>3]+ +h[aE>>3]}c[ak>>2]=(c[ak>>2]|0)+1;aH=1}if(!aH){aS=bd;aT=0;aU=be;aV=bf;z=6859;break}aE=c[p>>2]|0;if((uG(aE+(((c[ak>>2]|0)-1|0)*40&-1)|0,aE|0,40)|0)==0){aS=bd;aT=1;aU=be;aV=bf;z=6859;break}aI(181096,44,1,c[m>>2]|0);aE=db(c[p>>2]|0,((c[ak>>2]|0)*40&-1)+40|0,182592)|0;av=aE;c[p>>2]=av;a4=av+((c[ak>>2]|0)*40&-1)|0;c[a4>>2]=c[aE>>2];c[a4+4>>2]=c[aE+4>>2];c[a4+8>>2]=c[aE+8>>2];c[a4+12>>2]=c[aE+12>>2];c[a4+16>>2]=c[aE+16>>2];c[a4+20>>2]=c[aE+20>>2];c[a4+24>>2]=c[aE+24>>2];c[a4+28>>2]=c[aE+28>>2];c[a4+32>>2]=c[aE+32>>2];c[a4+36>>2]=c[aE+36>>2];c[ak>>2]=(c[ak>>2]|0)+1;aS=bd;aT=1;aU=c[13898]|0;aV=c[8272]|0;z=6859}else{z=6858;break L9085}}while(0);L9392:do{if((z|0)==6859){z=0;K=(aV|0)>(aU|0);L9394:do{if(K){as=c[1054]|0;if((a[as+(aU*40&-1)|0]&1)!=0){aE=c[as+(aU*40&-1)+36>>2]|0;a4=as+(aU*40&-1)+32|0;as=c[10036]|0;av=0;while(1){if((av|0)>=(aE|0)){z=6864;break}if((a[as+((c[a4>>2]|0)+av|0)|0]|0)==(a[av+150856|0]|0)){av=av+1|0}else{break}}do{if((z|0)==6864){z=0;if((av|0)!=5){break}c[o>>2]=1;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=s;break L9392}}while(0);if(!K){z=6874;break}}av=c[1054]|0;L9406:do{if((a[av+(aU*40&-1)|0]&1)!=0){a4=c[av+(aU*40&-1)+36>>2]|0;as=av+(aU*40&-1)+32|0;aE=c[10036]|0;au=0;while(1){if((au|0)>=(a4|0)){break}if((a[aE+((c[as>>2]|0)+au|0)|0]|0)==(a[au+150704|0]|0)){au=au+1|0}else{break L9406}}if((au|0)!=4){break}c[o>>2]=0;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=s;break L9392}}while(0);if(!K){z=6874;break}av=c[1054]|0;as=a[av+(aU*40&-1)|0]|0;if((as&1)==0){bk=av;bl=as;break}aE=c[av+(aU*40&-1)+36>>2]|0;a4=av+(aU*40&-1)+32|0;at=c[10036]|0;B=0;while(1){if((B|0)>=(aE|0)){break}if((a[at+((c[a4>>2]|0)+B|0)|0]|0)==(a[B+121920|0]|0)){B=B+1|0}else{bk=av;bl=as;break L9394}}if((B|0)!=6){bk=av;bl=as;break}c[o>>2]=-1;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=s;break L9392}else{z=6874}}while(0);if((z|0)==6874){z=0;K=c[1054]|0;bk=K;bl=a[K+(aU*40&-1)|0]|0}K=c[bk+(aU*40&-1)+36>>2]|0;L9424:do{if((bl&1)!=0&(K|0)>0){aH=c[10036]|0;a4=0;at=0;aE=c[bk+(aU*40&-1)+32>>2]|0;while(1){if((a[a4+184456|0]|0)==(a[aH+(a4+aE|0)|0]|0)){bm=aE;bn=at}else{if((a4|0)!=3){break L9424}bm=aE-1|0;bn=1}C=a4+1|0;if((C|0)<(bn+K|0)){a4=C;at=bn;aE=bm}else{break}}if((bn|0)==0){if(!((a4|0)==2|(a4|0)==7)){break}}if(Y){z=6890;break L9085}c[O>>2]=-7;c[n>>2]=3;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=1;aR=1;break L9392}}while(0);if(s){bo=aU}else{K=(c[S>>2]|0)==1?49176:49488;if(T){hJ(q,c[U>>2]|0,c[V>>2]|0,c[W>>2]|0,X)}else{hJ(q,c[K>>2]|0,c[K+4>>2]|0,c[K+8>>2]|0,K+16|0)}if((c[13898]|0)==(ar|0)){bo=ar}else{aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=1;break}}if(al){bp=bo}else{K=c[1054]|0;aE=a[K+(bo*40&-1)|0]|0;L9447:do{if((c[8272]|0)>(bo|0)){if((aE&1)==0){z=6904;break}at=c[K+(bo*40&-1)+36>>2]|0;aH=K+(bo*40&-1)+32|0;as=c[10036]|0;av=0;while(1){if((av|0)>=(at|0)){break}if((a[as+((c[aH>>2]|0)+av|0)|0]|0)==(a[av+179168|0]|0)){av=av+1|0}else{z=6904;break L9447}}if((av|0)==2){z=6912}else{z=6904}}else{z=6904}}while(0);L9454:do{if((z|0)==6904){z=0;aH=c[K+(bo*40&-1)+36>>2]|0;if(!((aE&1)!=0&(aH|0)>0)){break}as=c[10036]|0;at=0;a4=0;B=c[K+(bo*40&-1)+32>>2]|0;while(1){if((a[at+178592|0]|0)==(a[as+(at+B|0)|0]|0)){bq=B;br=a4}else{if((at|0)!=5){break L9454}bq=B-1|0;br=1}C=at+1|0;if((C|0)<(br+aH|0)){at=C;a4=br;B=bq}else{break}}if((br|0)!=0){z=6912;break}if((at|0)==4|(at|0)==9){z=6912}}}while(0);do{if((z|0)==6912){z=0;a[N]=1;c[O>>2]=-2;hI(Q,5);if((c[R>>2]|0)!=0){break}c[O>>2]=-7}}while(0);if((c[13898]|0)==(ar|0)){bp=ar}else{aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=1;aR=s;break}}if(am){bs=bp;z=6960;break L9085}K=c[1054]|0;aE=a[K+(bp*40&-1)|0]|0;L9471:do{if((c[8272]|0)>(bp|0)){if((aE&1)==0){z=6922;break}B=c[K+(bp*40&-1)+36>>2]|0;a4=K+(bp*40&-1)+32|0;aH=c[10036]|0;as=0;while(1){if((as|0)>=(B|0)){break}if((a[aH+((c[a4>>2]|0)+as|0)|0]|0)==(a[as+128296|0]|0)){as=as+1|0}else{z=6922;break L9471}}if((as|0)==2){z=6930}else{z=6922}}else{z=6922}}while(0);L9478:do{if((z|0)==6922){z=0;a4=c[K+(bp*40&-1)+36>>2]|0;if(!((aE&1)!=0&(a4|0)>0)){bt=aq;break}aH=c[10036]|0;B=0;at=0;av=c[K+(bp*40&-1)+32>>2]|0;while(1){if((a[B+128400|0]|0)==(a[aH+(B+av|0)|0]|0)){bu=av;bv=at}else{if((B|0)!=5){bt=aq;break L9478}bu=av-1|0;bv=1}C=B+1|0;if((C|0)<(bv+a4|0)){B=C;at=bv;av=bu}else{break}}if((bv|0)!=0){z=6930;break}if((B|0)==4|(B|0)==9){z=6930}else{bt=aq}}}while(0);do{if((z|0)==6930){z=0;c[13898]=bp+1;K=is(k)|0;aE=c[K>>2]|0;if((aE|0)==2){bw=+h[K+8>>3]}else if((aE|0)==3){bw=+uz(c[K+8>>2]|0,0)}else if((aE|0)==1){bw=+(c[K+8>>2]|0)}else{z=6934;break L9085}if((c[E>>2]|0)!=3){bt=bw;break}uu(c[A>>2]|0);c[E>>2]=1;bt=bw}}while(0);if((c[13898]|0)==(ar|0)){bs=ar;z=6961;break L9085}else{aL=bt;aM=aS;aN=ao;aO=aT;aP=1;aQ=al;aR=s}}}while(0);K=c[13898]|0;aE=c[8272]|0;if((K|0)<(aE|0)){s=aR;al=aQ;am=aP;an=aO;ao=aN;ap=aM;aq=aL;ar=K;u=aE}else{ax=aP;ay=aO;az=aN;aA=aL;z=6939;break}}if((z|0)==6739){uf((c[13898]|0)-1|0,183928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6962){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6963){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6964){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6965){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6966){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6967){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6968){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6969){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6970){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6971){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6972){bx=c[13898]|0;uf(bx,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6973){bx=c[13898]|0;uf(bx,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6857){uu(bg);c[p>>2]=0;c[ak>>2]=0;uf(c[13898]|0,180752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6858){uf(ar,180328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6952){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6953){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6954){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6955){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6956){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6957){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6958){bz=c[13898]|0;uf(bz,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6959){bz=c[13898]|0;uf(bz,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6960){uf(bs,178144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6961){uf(bs,178144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6934){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6939){if(ax){h[r+64>>3]=aA}if(az&ay){uf(-1,177888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{i=e;return}}else if((z|0)==6720){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6946){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6947){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6948){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6949){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6950){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6951){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6782){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6724){uf((c[13898]|0)-1|0,183928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6735){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6890){uf(aU,179496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jy(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0.0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0.0,aa=0,ab=0.0,ac=0.0,ad=0.0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0.0;b=i;i=i+120|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=c[13898]|0;o=l+1|0;c[13898]=o;p=c[1054]|0;q=c[p+(o*40&-1)+36>>2]|0;r=c[p+(o*40&-1)+32>>2]|0;s=(a[p+(o*40&-1)|0]&1)==0;t=(q|0)>0;u=c[10036]|0;w=21960;x=96232;L9545:while(1){L9547:do{if(!s){if(t){y=0;z=0;A=r;while(1){B=a[x+y|0]|0;if(B<<24>>24==(a[u+(y+A|0)|0]|0)){C=A;D=z}else{if(B<<24>>24!=36){break L9547}C=A-1|0;D=1}E=y+1|0;if((E|0)<(D+q|0)){y=E;z=D;A=C}else{break}}if((D|0)==0){F=E}else{G=w;break L9545}}else{F=0}A=a[x+F|0]|0;if((A<<24>>24|0)==36|(A<<24>>24|0)==0){G=w;break L9545}}}while(0);A=w+8|0;z=c[A>>2]|0;if((z|0)==0){G=A;break}else{w=A;x=z}}x=c[G+4>>2]|0;if((x|0)==0){H=75960;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}G=l+2|0;c[13898]=G;do{if((x|0)==95){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[17578]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=57024,v)|0)}w=c[m>>2]|0;aF(9,w|0);je(c[m>>2]|0,8)}else if((x|0)==30){L9572:do{if((G|0)<(c[8272]|0)){L9574:do{if((a[p+(G*40&-1)|0]&1)!=0){w=c[p+(G*40&-1)+36>>2]|0;F=p+(G*40&-1)+32|0;E=0;while(1){if((E|0)>=(w|0)){break}if((a[u+((c[F>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L9574}}if((E|0)==1){J=0;break L9572}}}while(0);F=is(k)|0;w=c[F>>2]|0;if((w|0)==2){K=+h[F+8>>3]}else if((w|0)==3){K=+uz(c[F+8>>2]|0,0)}else if((w|0)==1){K=+(c[F+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=k|0;if((c[F>>2]|0)==3){uu(c[k+8>>2]|0);c[F>>2]=1}F=~~K;if((F|0)<1){H=208936}else{J=F;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{J=0}}while(0);aF(10,c[m>>2]|0);jM(J)}else if((x|0)==65){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[16718]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,3)}else if((x|0)==18){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,114368,(v=i,i=i+16|0,c[v>>2]=24544,c[v+8>>2]=24595,v)|0)}else if((x|0)==32){L9604:do{if((G|0)<(c[8272]|0)){L9606:do{if((a[p+(G*40&-1)|0]&1)!=0){F=c[p+(G*40&-1)+36>>2]|0;w=p+(G*40&-1)+32|0;D=0;while(1){if((D|0)>=(F|0)){break}if((a[u+((c[w>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L9606}}if((D|0)==1){L=7233;break L9604}}}while(0);w=is(e)|0;F=c[w>>2]|0;if((F|0)==2){M=+h[w+8>>3]}else if((F|0)==3){M=+uz(c[w+8>>2]|0,0)}else if((F|0)==1){M=+(c[w+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=e|0;if((c[w>>2]|0)==3){uu(c[e+8>>2]|0);c[w>>2]=1}w=~~M;if((w|0)<1){H=208936;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{F=c[m>>2]|0;aF(10,F|0);N=w;O=0;break}}else{L=7233}}while(0);if((L|0)==7233){w=c[m>>2]|0;aF(10,w|0);w=c[m>>2]|0;F=c[8798]|0;cf(w|0,76832,(v=i,i=i+8|0,c[v>>2]=F,v)|0);N=0;O=1}F=c[10816]|0;if((F|0)==0){P=0}else{w=0;E=F;while(1){F=c[E+4>>2]|0;if(O){Q=F;L=7237}else{if((F|0)==(N|0)){Q=N;L=7237}else{R=w}}if((L|0)==7237){L=0;F=c[m>>2]|0;cf(F|0,76280,(v=i,i=i+8|0,c[v>>2]=Q,v)|0);ji(c[m>>2]|0,E+8|0,1);F=c[m>>2]|0;aF(10,F|0);R=1}F=c[E>>2]|0;if((F|0)==0){P=R;break}else{w=R;E=F}}}if((N|0)<1|P){break}uf(c[13898]|0,75640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==39|(x|0)==40|(x|0)==41|(x|0)==42|(x|0)==38){jO()}else if((x|0)==58){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=c[8244]|0;w=c[m>>2]|0;if((E|0)==0){aI(134568,26,1,w|0);break}else{cf(w|0,134696,(v=i,i=i+8|0,c[v>>2]=E,v)|0);break}}else if((x|0)==60){jQ()}else if((x|0)==62){jW()}else if((x|0)==79){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,172840,(v=i,i=i+8|0,c[v>>2]=(a[30528]&1)!=0?172456:172176,v)|0)}else if((x|0)==63){c[13898]=o;jR()}else if((x|0)==77){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,167288,(v=i,i=i+8|0,h[v>>3]=+h[3818],v)|0)}else if((x|0)==59){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,136080,(v=i,i=i+8|0,c[v>>2]=(a[32936]&1)!=0?172456:172176,v)|0)}else if((x|0)==61){jP()}else if((x|0)==110){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=(c[16546]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=E,v)|0)}else if((x|0)==129){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=(c[16374]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=E,v)|0)}else if((x|0)==101){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=(c[17234]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=E,v)|0)}else if((x|0)==149){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}if((c[17406]|0)==1){E=c[m>>2]|0;cf(E|0,198344,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,7)}else if((x|0)==19){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,168248,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);E=c[m>>2]|0;w=bA(2,0)|0;cf(E|0,167680,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}else if((x|0)==21){jT()}else if((x|0)==22){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}ur(2,0)}else if((x|0)==144){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16202]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,0)}else if((x|0)==57){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}S=+g[44];cf(c[m>>2]|0,183064,(v=i,i=i+16|0,h[v>>3]=+g[184],h[v+8>>3]=S,v)|0)}else if((x|0)==87){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[3524]|0;E=c[m>>2]|0;if((w|0)==0){aI(183552,26,1,E|0);break}else{F=c[w>>2]|0;cf(E|0,183896,(v=i,i=i+16|0,c[v>>2]=F,c[v+8>>2]=13048,v)|0);break}}else if((x|0)==29){jJ()}else if((x|0)==153){jH(2)}else if((x|0)==14){H=134e3;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==107){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[17234]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,6)}else if((x|0)==3){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}aI(174264,15,1,c[m>>2]|0);F=c[m>>2]|0;if(+h[9040]==1.0){aI(173624,8,1,F|0);break}else{aI(173192,8,1,F|0);break}}else if((x|0)==78){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,166928,(v=i,i=i+8|0,h[v>>3]=+h[3817],v)|0)}else if((x|0)==20){jS()}else if((x|0)==126){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[17062]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,5)}else if((x|0)==89|(x|0)==91|(x|0)==90|(x|0)==119){jZ(1,1,1,1,1,1)}else if((x|0)==48){j$(2)}else if((x|0)==52){j$(1)}else if((x|0)==54){j$(0)}else if((x|0)==68){j$(3)}else if((x|0)==46){j$(6)}else if((x|0)==50){j$(5)}else if((x|0)==93){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}j6(179864,141856,4672);cf(c[m>>2]|0,197424,(v=i,i=i+8|0,c[v>>2]=(c[1166]|0)!=0?196800:196168,v)|0);F=c[m>>2]|0;if((c[1164]|0)==0){aI(193896,14,1,F|0);break}else{aI(195648,36,1,F|0);break}}else if((x|0)==88){cf(c[m>>2]|0,91616,(v=i,i=i+8|0,c[v>>2]=(a[13048]|0)!=0?13048:84080,v)|0)}else if((x|0)==96){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[17750]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=57048,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,9)}else if((x|0)==15){j0()}else if((x|0)==70){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=(c[16718]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=F,v)|0)}else if((x|0)==92){j_()}else if((x|0)==116){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[16546]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,2)}else if((x|0)==44){j1()}else if((x|0)==76){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,222616,(v=i,i=i+8|0,c[v>>2]=c[6924],v)|0)}else if((x|0)==97){j2()}else if((x|0)==117|(x|0)==111|(x|0)==114){jZ(1,0,0,1,0,0)}else if((x|0)==136|(x|0)==130|(x|0)==133){jZ(0,1,0,0,1,0)}else if((x|0)==145|(x|0)==139|(x|0)==142){jZ(0,0,1,0,0,0)}else if((x|0)==66|(x|0)==71|(x|0)==73){jZ(0,0,0,0,0,1)}else if((x|0)==147){j4(7)}else if((x|0)==108|(x|0)==102|(x|0)==105){jZ(0,0,0,1,0,0)}else if((x|0)==127|(x|0)==121|(x|0)==124){jZ(0,0,0,0,1,0)}else if((x|0)==45){cf(c[m>>2]|0,121216,(v=i,i=i+8|0,c[v>>2]=(a[33512]&1)!=0?150376:150208,v)|0)}else if((x|0)==23){jF()}else if((x|0)==16){F=c[10812]|0;aI(123576,26,1,c[m>>2]|0);if((F|0)==0){break}else{T=F}do{F=c[T+12>>2]|0;E=c[m>>2]|0;if((F|0)==0){w=c[T+4>>2]|0;cf(E|0,123120,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}else{cf(E|0,123448,(v=i,i=i+8|0,c[v>>2]=F,v)|0)}T=c[T>>2]|0;}while((T|0)!=0)}else if((x|0)==82){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[6350]|0;cf(c[m>>2]|0,174608,(v=i,i=i+16|0,c[v>>2]=c[6352],c[v+8>>2]=F,v)|0)}else if((x|0)==27){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[9342]|0;cf(c[m>>2]|0,174888,(v=i,i=i+16|0,c[v>>2]=c[9344],c[v+8>>2]=F,v)|0)}else if((x|0)==135){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[16374]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,1)}else if((x|0)==34){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[m>>2]|0;E=bA(2,0)|0;cf(F|0,146672,(v=i,i=i+8|0,c[v>>2]=E,v)|0);cf(c[m>>2]|0,144576,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);E=c[m>>2]|0;F=bA(5,0)|0;cf(E|0,142976,(v=i,i=i+8|0,c[v>>2]=F,v)|0);F=c[8270]|0;cf(c[m>>2]|0,141432,(v=i,i=i+8|0,c[v>>2]=(F|0)!=0?F:139696,v)|0)}else if((x|0)==33){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}uq(2,0)}else if((x|0)==151){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,203824,(v=i,i=i+8|0,h[v>>3]=+h[11],v)|0)}else if((x|0)==31){L9824:do{if((G|0)<(c[8272]|0)){L9826:do{if((a[p+(G*40&-1)|0]&1)!=0){F=c[p+(G*40&-1)+36>>2]|0;E=p+(G*40&-1)+32|0;w=0;while(1){if((w|0)>=(F|0)){break}if((a[u+((c[E>>2]|0)+w|0)|0]|0)==(a[w+103664|0]|0)){w=w+1|0}else{break L9826}}if((w|0)==1){U=0;break L9824}}}while(0);E=is(f)|0;F=c[E>>2]|0;if((F|0)==1){V=+(c[E+8>>2]|0)}else if((F|0)==3){V=+uz(c[E+8>>2]|0,0)}else if((F|0)==2){V=+h[E+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}E=f|0;if((c[E>>2]|0)==3){uu(c[f+8>>2]|0);c[E>>2]=1}E=~~V;if((E|0)<1){H=208936}else{U=E;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{U=0}}while(0);aF(10,c[m>>2]|0);E=c[10820]|0;if((E|0)==0){W=0}else{F=(U|0)==0;D=0;C=E;while(1){E=c[C+4>>2]|0;if(F){X=E;L=7214}else{if((E|0)==(U|0)){X=U;L=7214}else{Y=D}}if((L|0)==7214){L=0;E=c[m>>2]|0;cf(E|0,75168,(v=i,i=i+8|0,c[v>>2]=X,v)|0);ji(c[m>>2]|0,C+8|0,1);E=c[m>>2]|0;aF(10,E|0);Y=1}E=c[C>>2]|0;if((E|0)==0){W=Y;break}else{D=Y;C=E}}}if((U|0)<1|W){break}uf(c[13898]|0,74736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==94){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(179864,154440,4416)}else if((x|0)==113){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56880,202256,66456)}else if((x|0)==132){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56856,202256,65768)}else if((x|0)==80){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}C=c[m>>2]|0;D=c[7262]|0;do{if((D|0)==(c[n>>2]|0)){Z=89880}else{if((D|0)==0){Z=89256;break}F=c[7260]|0;Z=(D|0)!=(C|0)&(F|0)!=0?F:89256}}while(0);cf(C|0,134848,(v=i,i=i+8|0,c[v>>2]=Z,v)|0)}else if((x|0)==11){jB()}else if((x|0)==10|(x|0)==13|(x|0)==12){jC()}else if((x|0)==17){jD()}else if((x|0)==36){if(!(a[928]|0)){D=c[m>>2]|0;aF(10,D|0)}cf(c[m>>2]|0,113600,(v=i,i=i+8|0,c[v>>2]=(a[43472]&1)!=0?179864:211688,v)|0)}else if((x|0)==37){jE()}else if((x|0)==4){L9884:do{if((G|0)<(c[8272]|0)){L9886:do{if((a[p+(G*40&-1)|0]&1)!=0){D=c[p+(G*40&-1)+36>>2]|0;F=p+(G*40&-1)+32|0;E=0;while(1){if((E|0)>=(D|0)){break}if((a[u+((c[F>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L9886}}if((E|0)==1){_=0;break L9884}}}while(0);F=is(j)|0;D=c[F>>2]|0;if((D|0)==2){$=+h[F+8>>3]}else if((D|0)==3){$=+uz(c[F+8>>2]|0,0)}else if((D|0)==1){$=+(c[F+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=j|0;if((c[F>>2]|0)==3){uu(c[j+8>>2]|0);c[F>>2]=1}F=~~$;if((F|0)<1){H=208936}else{_=F;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{_=0}}while(0);aF(10,c[m>>2]|0);jN(_)}else if((x|0)==5){jz()}else if((x|0)==6){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}S=+h[7077];C=c[m>>2]|0;if(S>0.0){F=(c[14156]|0)==0?150704:150856;cf(C|0,106368,(v=i,i=i+16|0,c[v>>2]=F,h[v+8>>3]=S,v)|0);break}else{aI(106320,33,1,C|0);break}}else if((x|0)==8){jA()}else if((x|0)==9){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}S=+h[7030];C=c[m>>2]|0;if(S<0.0){aI(106792,18,1,C|0);break}else{F=(a[56232]&1)!=0?106640:106608;cf(C|0,106688,(v=i,i=i+16|0,h[v>>3]=S,c[v+8>>2]=F,v)|0);break}}else if((x|0)==98){jI(c[m>>2]|0)}else if((x|0)==7){F=c[8272]|0;L9922:do{if((G|0)<(F|0)){C=G;while(1){L9925:do{if((a[p+(C*40&-1)|0]&1)!=0){D=c[p+(C*40&-1)+36>>2]|0;w=p+(C*40&-1)+32|0;q=0;while(1){if((q|0)>=(D|0)){break}if((a[u+((c[w>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L9925}}if((q|0)==1){aa=C;break L9922}}}while(0);E=C+1|0;c[13898]=E;if((E|0)<(F|0)){C=E}else{aa=E;break}}}else{aa=G}}while(0);c[13898]=aa-1;dV()}else if((x|0)==1){aF(10,c[m>>2]|0);kc(it()|0,0);c[13898]=(c[13898]|0)+1}else if((x|0)==2){a[928]=1;jI(c[m>>2]|0);jz();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}S=+h[7077];F=c[m>>2]|0;if(S>0.0){C=(c[14156]|0)==0?150704:150856;cf(F|0,106368,(v=i,i=i+16|0,c[v>>2]=C,h[v+8>>3]=S,v)|0)}else{aI(106320,33,1,F|0)}jA();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}S=+h[7030];F=c[m>>2]|0;if(S<0.0){aI(106792,18,1,F|0)}else{C=(a[56232]&1)!=0?106640:106608;cf(F|0,106688,(v=i,i=i+16|0,h[v>>3]=S,c[v+8>>2]=C,v)|0)}jB();C=c[m>>2]|0;if((a[35888]&1)==0){aI(107400,37,1,C|0)}else{cf(C|0,107464,(v=i,i=i+8|0,c[v>>2]=53520,v)|0)}jC();jD();if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,113600,(v=i,i=i+8|0,c[v>>2]=(a[43472]&1)!=0?179864:211688,v)|0);jE();if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,114368,(v=i,i=i+16|0,c[v>>2]=24544,c[v+8>>2]=24595,v)|0);jF();jX();jG();cf(c[m>>2]|0,125408,(v=i,i=i+8|0,c[v>>2]=(a[27776]&1)!=0?179864:211688,v)|0);jH(2);jH(1);jH(0);jM(0);jN(0);jK();jL();if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}C=(c[8764]|0)==2?88392:179864;S=+h[4384];F=(c[6588]|0)==2?88392:179864;ab=+h[3296];E=(c[1057]|0)==2?88392:179864;ac=+h[531];w=(c[14091]|0)==2?88392:179864;ad=+h[7048];cf(c[m>>2]|0,89120,(v=i,i=i+72|0,c[v>>2]=132528,c[v+8>>2]=C,h[v+16>>3]=S,c[v+24>>2]=F,h[v+32>>3]=ab,c[v+40>>2]=E,h[v+48>>3]=ac,c[v+56>>2]=w,h[v+64>>3]=ad,v)|0);jO();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[8244]|0;E=c[m>>2]|0;if((w|0)==0){aI(134568,26,1,E|0)}else{cf(E|0,134696,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[m>>2]|0;E=c[7262]|0;do{if((E|0)==(c[n>>2]|0)){ae=89880}else{if((E|0)==0){ae=89256;break}F=c[7260]|0;ae=(E|0)!=(w|0)&(F|0)!=0?F:89256}}while(0);cf(w|0,134848,(v=i,i=i+8|0,c[v>>2]=ae,v)|0);if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,136080,(v=i,i=i+8|0,c[v>>2]=(a[32936]&1)!=0?172456:172176,v)|0);jQ();jW();jP();if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,166928,(v=i,i=i+8|0,h[v>>3]=+h[3817],v)|0);if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,167288,(v=i,i=i+8|0,h[v>>3]=+h[3818],v)|0);if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,168248,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);E=c[m>>2]|0;F=bA(2,0)|0;cf(E|0,167680,(v=i,i=i+8|0,c[v>>2]=F,v)|0);jS();jT();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,172840,(v=i,i=i+8|0,c[v>>2]=(a[30528]&1)!=0?172456:172176,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}aI(174264,15,1,c[m>>2]|0);F=c[m>>2]|0;if(+h[9040]==1.0){aI(173624,8,1,F|0)}else{aI(173192,8,1,F|0)}jj(c[m>>2]|0,0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[6350]|0;cf(c[m>>2]|0,174608,(v=i,i=i+16|0,c[v>>2]=c[6352],c[v+8>>2]=F,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[9342]|0;cf(c[m>>2]|0,174888,(v=i,i=i+16|0,c[v>>2]=c[9344],c[v+8>>2]=F,v)|0);jV();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,178568,(v=i,i=i+8|0,c[v>>2]=(a[46752]&1)!=0?179864:211688,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,179872,(v=i,i=i+8|0,c[v>>2]=(a[38984]&1)!=0?179488:179160,v)|0);gp();jY();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}ad=+g[44];cf(c[m>>2]|0,183064,(v=i,i=i+16|0,h[v>>3]=+g[184],h[v+8>>3]=ad,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[3524]|0;E=c[m>>2]|0;if((F|0)==0){aI(183552,26,1,E|0)}else{C=c[F>>2]|0;cf(E|0,183896,(v=i,i=i+16|0,c[v>>2]=C,c[v+8>>2]=13048,v)|0)}jZ(1,1,1,1,1,1);j$(2);j$(1);j$(0);j$(6);j$(5);j6(179864,141856,4672);if((a[32936]&1)==0){if((a[30528]&1)!=0){L=7049}}else{L=7049}do{if((L|0)==7049){C=a[928]|0;if((a[37384]&1)==0){if(!C){E=c[m>>2]|0;aF(10,E|0)}if((c[17578]|0)==1){E=c[m>>2]|0;cf(E|0,198344,(v=i,i=i+8|0,c[v>>2]=57024,v)|0)}E=c[m>>2]|0;aF(9,E|0);je(c[m>>2]|0,8);break}if(!C){C=c[m>>2]|0;aF(10,C|0)}if((c[17750]|0)==1){C=c[m>>2]|0;cf(C|0,198344,(v=i,i=i+8|0,c[v>>2]=57048,v)|0)}C=c[m>>2]|0;aF(9,C|0);je(c[m>>2]|0,9);if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}if((c[17922]|0)==1){C=c[m>>2]|0;cf(C|0,198344,(v=i,i=i+8|0,c[v>>2]=57072,v)|0)}C=c[m>>2]|0;aF(9,C|0);je(c[m>>2]|0,10)}}while(0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16546]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,2);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16374]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,1);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[17234]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,6);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[17062]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,5);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16202]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(179864,154440,4416);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56880,202256,66456);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56856,202256,65768);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56832,202256,65080);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56976,202256,69208);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56952,202256,68520);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16546]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16374]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[17234]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[17062]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16202]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=w,v)|0);j_();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}uq(2,0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}ur(2,0);jU();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[m>>2]|0;C=bA(2,0)|0;cf(w|0,146672,(v=i,i=i+8|0,c[v>>2]=C,v)|0);cf(c[m>>2]|0,144576,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);C=c[m>>2]|0;w=bA(5,0)|0;cf(C|0,142976,(v=i,i=i+8|0,c[v>>2]=w,v)|0);w=c[8270]|0;cf(c[m>>2]|0,141432,(v=i,i=i+8|0,c[v>>2]=(w|0)!=0?w:139696,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}cf(c[m>>2]|0,203824,(v=i,i=i+8|0,h[v>>3]=+h[11],v)|0);j0();j1();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}cf(c[m>>2]|0,222616,(v=i,i=i+8|0,c[v>>2]=c[6924],v)|0);j2();w=c[10812]|0;aI(123576,26,1,c[m>>2]|0);if((w|0)!=0){C=w;do{w=c[C+12>>2]|0;E=c[m>>2]|0;if((w|0)==0){F=c[C+4>>2]|0;cf(E|0,123120,(v=i,i=i+8|0,c[v>>2]=F,v)|0)}else{cf(E|0,123448,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}C=c[C>>2]|0;}while((C|0)!=0)}a[928]=0}else if((x|0)==99){jV()}else if((x|0)==85){jX()}else if((x|0)==84){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,178568,(v=i,i=i+8|0,c[v>>2]=(a[46752]&1)!=0?179864:211688,v)|0)}else if((x|0)==25){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,179872,(v=i,i=i+8|0,c[v>>2]=(a[38984]&1)!=0?179488:179160,v)|0);gp()}else if((x|0)==83){jY()}else if((x|0)==141){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56832,202256,65080)}else if((x|0)==64){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56904,202256,67144)}else if((x|0)==104){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56976,202256,69208)}else if((x|0)==123){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56952,202256,68520)}else if((x|0)==81){jU()}else if((x|0)==75){C=c[p+(G*40&-1)+36>>2]|0;L10161:do{if((a[p+(G*40&-1)|0]&1)!=0&(C|0)>0){w=0;E=0;F=c[p+(G*40&-1)+32>>2]|0;while(1){if((a[w+115824|0]|0)==(a[u+(w+F|0)|0]|0)){af=F;ag=E}else{if((w|0)!=4){ah=G;break L10161}af=F-1|0;ag=1}D=w+1|0;if((D|0)<(ag+C|0)){w=D;E=ag;F=af}else{break}}if((ag|0)==0){if(!((w|0)==3|(w|0)==9)){ah=G;break}}F=l+3|0;c[13898]=F;ah=F}else{ah=G}}while(0);L10173:do{if((ah|0)<(c[8272]|0)){L10175:do{if((a[p+(ah*40&-1)|0]&1)!=0){C=c[p+(ah*40&-1)+36>>2]|0;F=p+(ah*40&-1)+32|0;E=0;while(1){if((E|0)>=(C|0)){break}if((a[u+((c[F>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L10175}}if((E|0)==1){ai=0;break L10173}}}while(0);w=is(d)|0;F=c[w>>2]|0;if((F|0)==1){aj=+(c[w+8>>2]|0)}else if((F|0)==2){aj=+h[w+8>>3]}else if((F|0)==3){aj=+uz(c[w+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=d|0;if((c[w>>2]|0)==3){uu(c[d+8>>2]|0);c[w>>2]=1}w=~~aj;if((w|0)<1){H=208936}else{ai=w;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{ai=0}}while(0);aF(10,c[m>>2]|0);jj(c[m>>2]|0,ai)}else if((x|0)==120){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[17062]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=w,v)|0)}else if((x|0)==138){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16202]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=w,v)|0)}else if((x|0)==24){jG()}else if((x|0)==150){cf(c[m>>2]|0,125408,(v=i,i=i+8|0,c[v>>2]=(a[27776]&1)!=0?179864:211688,v)|0)}else if((x|0)==152){jH(2);jH(1);jH(0)}else if((x|0)==155){jH(1)}else if((x|0)==154){jH(6)}else if((x|0)==156){jH(5)}else if((x|0)==157){jH(0)}else if((x|0)==28){jK()}else if((x|0)==35){jL()}else if((x|0)==56){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[8764]|0)==2?88392:179864;ad=+h[4384];F=(c[6588]|0)==2?88392:179864;ac=+h[3296];C=(c[1057]|0)==2?88392:179864;ab=+h[531];D=(c[14091]|0)==2?88392:179864;S=+h[7048];cf(c[m>>2]|0,89120,(v=i,i=i+72|0,c[v>>2]=132528,c[v+8>>2]=w,h[v+16>>3]=ad,c[v+24>>2]=F,h[v+32>>3]=ac,c[v+40>>2]=C,h[v+48>>3]=ab,c[v+56>>2]=D,h[v+64>>3]=S,v)|0)}else if((x|0)==100){if(!(a[928]|0)){D=c[m>>2]|0;aF(10,D|0)}if((c[17922]|0)==1){D=c[m>>2]|0;cf(D|0,198344,(v=i,i=i+8|0,c[v>>2]=57072,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,10)}else{H=223488;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[25280]=0;aF(10,c[m>>2]|0);i=b;return}function jz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(106224,16,1,c[m>>2]|0);do{if((a[32936]&1)!=0){if((a[37384]&1)==0){d=c[17711]|0;e=c[m>>2]|0;f=d&3;g=(f|0)!=0?172456:172176;h=(f|0)==1?105824:179864;j=(f|0)==2?105728:179864;f=(d&4|0)!=0?105664:179864;k=(d&8|0)!=0?105608:179864;cf(e|0,105872,(v=i,i=i+48|0,c[v>>2]=57048,c[v+8>>2]=g,c[v+16>>2]=h,c[v+24>>2]=j,c[v+32>>2]=f,c[v+40>>2]=k,v)|0);k=c[17883]|0;f=c[m>>2]|0;j=k&3;h=(j|0)!=0?172456:172176;g=(j|0)==1?105824:179864;e=(j|0)==2?105728:179864;j=(k&4|0)!=0?105664:179864;d=(k&8|0)!=0?105608:179864;cf(f|0,105872,(v=i,i=i+48|0,c[v>>2]=57072,c[v+8>>2]=h,c[v+16>>2]=g,c[v+24>>2]=e,c[v+32>>2]=j,c[v+40>>2]=d,v)|0);break}else{d=c[17539]|0;j=c[m>>2]|0;e=d&3;g=(e|0)!=0?172456:172176;h=(e|0)==1?105824:179864;f=(e|0)==2?105728:179864;e=(d&4|0)!=0?105664:179864;k=(d&8|0)!=0?105608:179864;cf(j|0,105872,(v=i,i=i+48|0,c[v>>2]=57024,c[v+8>>2]=g,c[v+16>>2]=h,c[v+24>>2]=f,c[v+32>>2]=e,c[v+40>>2]=k,v)|0);break}}}while(0);if((a[30528]&1)!=0){k=c[17367]|0;e=c[m>>2]|0;f=k&3;h=(f|0)!=0?172456:172176;g=(f|0)==1?105824:179864;j=(f|0)==2?105728:179864;f=(k&4|0)!=0?105664:179864;d=(k&8|0)!=0?105608:179864;cf(e|0,105872,(v=i,i=i+48|0,c[v>>2]=57e3,c[v+8>>2]=h,c[v+16>>2]=g,c[v+24>>2]=j,c[v+32>>2]=f,c[v+40>>2]=d,v)|0)}d=c[16507]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56880,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);d=c[16335]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56856,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);aI(105360,17,1,c[m>>2]|0);d=c[17195]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56976,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);d=c[17023]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56952,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);aI(105360,17,1,c[m>>2]|0);d=c[16163]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56832,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);d=c[16679]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56904,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);i=b;return}function jA(){var b=0,d=0,e=0,f=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[11692]|0;e=c[m>>2]|0;if((d|0)==0){aI(106520,21,1,e|0);i=b;return}else{f=(c[14088]|0)==0?150704:150856;cf(e|0,106440,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=f,v)|0);ji(c[m>>2]|0,56296,0);f=c[m>>2]|0;aF(10,f|0);i=b;return}}function jB(){var b=0,d=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}cf(c[m>>2]|0,107344,(v=i,i=i+8|0,c[v>>2]=(a[54144]&1)!=0?172456:172176,v)|0);d=c[m>>2]|0;if((a[54160]&1)==0){aI(107184,55,1,d|0)}else{aI(107256,64,1,d|0)}d=c[m>>2]|0;if((a[54152]&1)==0){aI(106872,47,1,d|0);i=b;return}else{aI(107096,56,1,d|0);i=b;return}}function jC(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0.0,o=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}cf(c[m>>2]|0,110616,(v=i,i=i+8|0,c[v>>2]=(c[11690]|0)!=0?179160:109736,v)|0);if((c[11690]|0)==0){i=b;return}cf(c[m>>2]|0,109312,(v=i,i=i+8|0,c[v>>2]=c[13374],v)|0);d=c[11690]|0;if((d|0)==1){e=c[m>>2]|0;aI(108736,10,1,e|0)}else if((d|0)==2){aI(108488,8,1,c[m>>2]|0)}else if((d|0)==3){aI(108392,22,1,c[m>>2]|0)}d=c[13378]|0;if((d|0)==0){e=c[m>>2]|0;aI(108304,21,1,e|0)}else if((d|0)==1){cf(c[m>>2]|0,108216,(v=i,i=i+8|0,c[v>>2]=c[13366],v)|0)}else if((d|0)==2){d=c[13366]|0;cf(c[m>>2]|0,108128,(v=i,i=i+16|0,c[v>>2]=c[13368],c[v+8>>2]=d,v)|0)}d=c[13372]|0;if((d|0)==0){e=c[m>>2]|0;f=c[13374]|0;cf(e|0,108056,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}else if((d|0)==2){cf(c[m>>2]|0,107816,(v=i,i=i+8|0,c[v>>2]=c[13374],v)|0);cf(c[m>>2]|0,170912,(v=i,i=i+8|0,h[v>>3]=+h[c[11662]>>3],v)|0);f=c[m>>2]|0;if((c[13374]|0)>1){e=1;g=f;while(1){cf(g|0,107648,(v=i,i=i+8|0,h[v>>3]=+h[(c[11662]|0)+(e<<3)>>3],v)|0);j=e+1|0;k=c[m>>2]|0;if((j|0)<(c[13374]|0)){e=j;g=k}else{l=k;break}}}else{l=f}aF(10,l|0)}else if((d|0)==1){d=c[13374]|0;l=c[11662]|0;n=+h[l>>3];o=+h[l+8>>3];cf(c[m>>2]|0,107544,(v=i,i=i+32|0,c[v>>2]=d,h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=n+ +(d-1|0)*o,v)|0)}d=c[m>>2]|0;if((a[35888]&1)==0){aI(107400,37,1,d|0);i=b;return}else{cf(d|0,107464,(v=i,i=i+8|0,c[v>>2]=53520,v)|0);i=b;return}}function jD(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0.0,o=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}if((a[47032]&1)==0){d=c[m>>2]|0;aI(111136,25,1,d|0);i=b;return}d=c[11752]|0;if((d|0)==1){e=c[m>>2]|0;f=c[11732]|0;g=c[11756]|0;j=c[11734]|0;cf(e|0,113384,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,v)|0);i=b;return}j=c[m>>2]|0;g=c[11732]|0;f=c[11756]|0;if((d|0)==2){cf(j|0,113272,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=f,v)|0);i=b;return}else{k=-1}while(1){e=k+1|0;if((e|0)==7){l=0;break}if((c[46948+(e<<3)>>2]|0)==(d|0)){l=c[46944+(e<<3)>>2]|0;break}else{k=e}}n=+h[5865];o=+h[5864];k=(a[47016]&1)!=0?112728:179864;cf(j|0,113e3,(v=i,i=i+48|0,c[v>>2]=g,c[v+8>>2]=f,c[v+16>>2]=l,h[v+24>>3]=n,h[v+32>>3]=o,c[v+40>>2]=k,v)|0);i=b;return}function jE(){var b=0,d=0;if(!(a[928]|0)){b=c[m>>2]|0;aF(10,b|0)}aI(114040,25,1,c[m>>2]|0);b=c[8732]|0;if((b|0)==1){d=c[m>>2]|0;aI(113784,10,1,d|0);return}else if((b|0)==0){aI(113904,10,1,c[m>>2]|0);return}else if((b|0)==2){aI(113712,12,1,c[m>>2]|0);return}else{return}}function jF(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(114560,16,1,c[m>>2]|0);d=c[m>>2]|0;e=j3(66240)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=e,v)|0);e=c[m>>2]|0;d=j3(65552)|0;cf(e|0,114480,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=d,v)|0);d=c[m>>2]|0;e=j3(68992)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=e,v)|0);e=c[m>>2]|0;d=j3(68304)|0;cf(e|0,114480,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=d,v)|0);d=c[m>>2]|0;e=j3(64864)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=e,v)|0);e=c[m>>2]|0;d=j3(66928)|0;cf(e|0,114480,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=d,v)|0);d=c[m>>2]|0;e=j3(69680)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=57e3,c[v+8>>2]=e,v)|0);i=b;return}function jG(){var b=0,d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0;b=i;if(a[928]|0){d=0}else{e=c[m>>2]|0;aF(10,e|0);d=0}while(1){if(d>>>0>=8){f=7559;break}if((a[65036+(d*688&-1)|0]&1)!=0){break}if((a[65037+(d*688&-1)|0]&1)==0){d=d+1|0}else{break}}if((f|0)==7559){f=c[m>>2]|0;aI(125328,13,1,f|0);i=b;return}cf(c[m>>2]|0,125104,(v=i,i=i+8|0,c[v>>2]=+h[3815]!=0.0?124928:124832,v)|0);if((a[66412]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}if((a[66413]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}if((a[65724]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}if((a[65725]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}if((a[69164]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}if((a[69165]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}if((a[68476]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}if((a[68477]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}if((a[65036]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if((a[65037]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if((a[67100]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}if((a[67101]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}if((a[69852]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0)}if((a[69853]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0)}aI(124552,6,1,c[m>>2]|0);aI(124400,22,1,c[m>>2]|0);ji(c[m>>2]|0,40048,0);aI(124312,23,1,c[m>>2]|0);ji(c[m>>2]|0,34776,0);aF(10,c[m>>2]|0);g=+h[3815];if(g!=0.0){f=c[m>>2]|0;j=+h[9040];k=g/j;d=j==1.0?124080:123976;cf(f|0,124200,(v=i,i=i+16|0,h[v>>3]=k,c[v+8>>2]=d,v)|0)}d=c[10026]|0;if((d|0)==-1){l=123760}else{l=(d|0)==0?150704:150856}cf(c[m>>2]|0,123840,(v=i,i=i+8|0,c[v>>2]=l,v)|0);i=b;return}function jH(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b;while(1){if(!(a[928]|0)){b=c[m>>2]|0;aF(10,b|0)}b=c[m>>2]|0;f=56832+(e*24&-1)|0;if((c[65284+(e*688&-1)>>2]|0)>-3){g=65280+(e*688&-1)|0;cf(b|0,125624,(v=i,i=i+8|0,c[v>>2]=f,v)|0);ji(c[m>>2]|0,g,0);g=c[m>>2]|0;aF(10,g|0)}else{cf(b|0,125528,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}if(e>>>0<4){e=e+4|0}else{break}}i=d;return}function jI(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;d=i;i=i+2056|0;e=d|0;f=d+8|0;g=e|0;a[g]=35;h=e+5|0;j=e+1|0;w=538976288;a[j]=w&255;w=w>>8;a[j+1|0]=w&255;w=w>>8;a[j+2|0]=w&255;w=w>>8;a[j+3|0]=w&255;a[h]=0;if((c[13388]|0)==0){j=ut(1024)|0;do{if((j|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){k=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=216448,v)|0)}else{k=j}}while(0);c[13388]=k;be(k|0,163128,(v=i,i=i+88|0,c[v>>2]=211088,c[v+8>>2]=204752,c[v+16>>2]=184880,c[v+24>>2]=179760,c[v+32>>2]=201520,c[v+40>>2]=179864,c[v+48>>2]=175632,c[v+56>>2]=179864,c[v+64>>2]=171680,c[v+72>>2]=179864,c[v+80>>2]=167488,v)|0);k=c[13388]|0;c[13388]=db(k,(uA(k|0)|0)+1|0,216448)|0}if((b|0)==0){i=d;return}if((c[m>>2]|0)==(b|0)){l=h}else{cf(b|0,154128,(v=i,i=i+8|0,c[v>>2]=151008,v)|0);l=g}g=f|0;uD(g|0,149072,187);uD(f+(uA(g|0)|0)|0,147160,95);cf(b|0,g|0,(v=i,i=i+144|0,c[v>>2]=l,c[v+8>>2]=l,c[v+16>>2]=145064,c[v+24>>2]=l,c[v+32>>2]=40152,c[v+40>>2]=40160,c[v+48>>2]=40168,c[v+56>>2]=l,c[v+64>>2]=33040,c[v+72>>2]=33008,c[v+80>>2]=l,c[v+88>>2]=l,c[v+96>>2]=40184,c[v+104>>2]=l,c[v+112>>2]=l,c[v+120>>2]=l,c[v+128>>2]=l,c[v+136>>2]=l,v)|0);l=c[13898]|0;g=c[1054]|0;b=c[g+(l*40&-1)+36>>2]|0;if(!((a[g+(l*40&-1)|0]&1)!=0&(b|0)>0)){i=d;return}f=c[10036]|0;h=0;k=0;j=c[g+(l*40&-1)+32>>2]|0;while(1){if((a[h+143320|0]|0)==(a[f+(h+j|0)|0]|0)){n=j;o=k}else{if((h|0)!=1){p=7623;break}n=j-1|0;o=1}g=h+1|0;if((g|0)<(o+b|0)){h=g;k=o;j=n}else{break}}if((p|0)==7623){i=d;return}do{if((o|0)==0){if((h|0)==0|(h|0)==4){break}i=d;return}}while(0);c[13898]=l+1;cf(c[m>>2]|0,141816,(v=i,i=i+8|0,c[v>>2]=c[13388],v)|0);l=bU(140128)|0;cf(c[m>>2]|0,136384,(v=i,i=i+8|0,c[v>>2]=195896,v)|0);cf(c[m>>2]|0,132976,(v=i,i=i+8|0,c[v>>2]=(l|0)==0?138024:l,v)|0);i=d;return}function jJ(){var b=0,d=0,e=0,f=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[m>>2]|0;e=j3(36288)|0;cf(d|0,128328,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[9329]|0;do{if((e|0)!=0){if((a[e]|0)==0){break}d=c[m>>2]|0;cf(d|0,82560,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}}while(0);if((c[9330]|0)==1&(c[9331]|0)==-2){i=b;return}aI(84256,2,1,c[m>>2]|0);e=c[m>>2]|0;if((c[9330]|0)==0){f=e}else{aI(145280,10,1,e|0);jg(e,37320);f=c[m>>2]|0}aF(10,f|0);i=b;return}function jK(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,n=0.0,o=0,p=0.0,q=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}if((a[36120]&1)==0){d=c[m>>2]|0;aI(131736,12,1,d|0);i=b;return}d=c[9031]|0;if((d|0)==0|(d|0)==1|(d|0)==2){e=c[m>>2]|0;aI(131624,22,1,e|0);if((c[9031]|0)==2&(c[9032]|0)>>>0<2){f=7651}else{e=c[9044]|0;do{if((e|0)==0){g=c[m>>2]|0;aI(196168,3,1,g|0)}else{g=c[m>>2]|0;if((e|0)==2){aI(196800,6,1,g|0);break}else{aI(89896,6,1,g|0);break}}}while(0);if((c[9031]|0)==2){f=7651}else{f=7652}}if((f|0)==7651){if(((c[9032]|0)-2|0)>>>0>=2){f=7652}}do{if((f|0)==7652){e=c[9045]|0;if((e|0)==0){g=c[m>>2]|0;aI(131440,5,1,g|0);break}else if((e|0)==2){aI(131280,6,1,c[m>>2]|0);break}else{if((c[9044]|0)==1){break}aI(131216,7,1,c[m>>2]|0);break}}}while(0);f=c[m>>2]|0;if((c[9047]|0)==0){aI(131080,9,1,f|0)}else{aI(130936,11,1,f|0)}f=c[9031]|0;do{if((f|0)==0){e=c[m>>2]|0;aI(130784,7,1,e|0)}else if((f|0)==1){aI(130648,8,1,c[m>>2]|0)}else{e=c[9032]|0;if((e|0)==1){g=c[m>>2]|0;aI(130432,8,1,g|0);break}else if((e|0)==2){aI(130336,8,1,c[m>>2]|0);break}else if((e|0)==0){aI(130512,8,1,c[m>>2]|0);break}else if((e|0)==3){aI(130288,8,1,c[m>>2]|0);break}else{break}}}while(0);f=c[m>>2]|0;aF(10,f|0)}else if((d|0)==3){aI(130224,11,1,c[m>>2]|0);d=c[9034]|0;if((d|0)==0){j=179864}else{j=c[21784+(d<<2)>>2]|0}k=+h[4519];f=c[9035]|0;if((f|0)==(d|0)){l=179864}else{l=c[21784+(f<<2)>>2]|0}n=+h[4520];d=c[9036]|0;if((d|0)==(f|0)){o=179864}else{o=c[21784+(d<<2)>>2]|0}p=+h[4521];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=j,h[v+8>>3]=k,c[v+16>>2]=l,h[v+24>>3]=n,c[v+32>>2]=o,h[v+40>>3]=p,v)|0);aF(10,c[m>>2]|0)}o=(a[36229]&1)!=0?179864:211688;l=(a[36230]&1)!=0?179864:211688;j=(a[36231]&1)!=0?179864:211688;cf(c[m>>2]|0,130072,(v=i,i=i+32|0,c[v>>2]=(c[9046]|0)==0?130008:129888,c[v+8>>2]=o,c[v+16>>2]=l,c[v+24>>2]=j,v)|0);j=c[m>>2]|0;if((c[9059]|0)>-3){aI(129760,12,1,j|0);ji(c[m>>2]|0,36232,0);l=c[m>>2]|0;aF(10,l|0)}else{aI(129608,10,1,j|0)}if((a[36228]&1)!=0){j=c[m>>2]|0;aI(129416,51,1,j|0)}p=+h[4525];n=+h[4526];k=+h[4527];j=c[9056]|0;if((j|0)==1){q=129016}else{q=(j|0)==2?128920:179864}cf(c[m>>2]|0,129128,(v=i,i=i+48|0,h[v>>3]=+h[4524],h[v+8>>3]=p,h[v+16>>3]=n,h[v+24>>3]=k,c[v+32>>2]=(j|0)!=0?179864:171496,c[v+40>>2]=q,v)|0);aI(128800,30,1,c[m>>2]|0);q=c[9338]|0;j=c[m>>2]|0;if((q|0)>0){cf(j|0,128688,(v=i,i=i+8|0,c[v>>2]=q,v)|0)}else{aI(128592,25,1,j|0)}aI(128504,27,1,c[m>>2]|0);j=c[9339]|0;q=c[m>>2]|0;if((j|0)>0){cf(q|0,128432,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}else{aI(128592,25,1,q|0)}jJ();i=b;return}function jL(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}if((a[66164]&1)==0){e=0}else{d=c[m>>2]|0;f=+h[8271];cf(d|0,132416,(v=i,i=i+24|0,c[v>>2]=132288,c[v+8>>2]=56880,h[v+16>>3]=f,v)|0);e=1}if((a[65476]&1)==0){g=e}else{d=c[m>>2]|0;j=e+1|0;k=(e|0)==0?132288:132144;f=+h[8185];cf(d|0,132416,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=56856,h[v+16>>3]=f,v)|0);g=j}if((a[64788]&1)==0){l=g}else{j=c[m>>2]|0;k=g+1|0;d=(g|0)==0?132288:132144;f=+h[8099];cf(j|0,132416,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56832,h[v+16>>3]=f,v)|0);l=k}if((a[68916]&1)==0){n=l}else{k=c[m>>2]|0;d=l+1|0;j=(l|0)==0?132288:132144;f=+h[8615];cf(k|0,132416,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=56976,h[v+16>>3]=f,v)|0);n=d}if((a[68228]&1)==0){o=n}else{d=c[m>>2]|0;j=n+1|0;k=(n|0)==0?132288:132144;f=+h[8529];cf(d|0,132416,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=56952,h[v+16>>3]=f,v)|0);o=j}if((a[66852]&1)==0){p=o}else{j=c[m>>2]|0;k=o+1|0;d=(o|0)==0?132288:132144;f=+h[8357];cf(j|0,132416,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56904,h[v+16>>3]=f,v)|0);p=k}if((a[69604]&1)==0){q=p}else{k=c[m>>2]|0;d=p+1|0;j=(p|0)==0?132288:132144;f=+h[8701];cf(k|0,132416,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=57e3,h[v+16>>3]=f,v)|0);q=d}if((q|0)==0){d=c[m>>2]|0;aI(132064,15,1,d|0);i=b;return}d=c[m>>2]|0;if((q|0)==1){aI(131968,6,1,d|0);i=b;return}else{aF(10,d|0);i=b;return}}function jM(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0;d=i;e=c[10822]|0;if((e|0)==0){f=0}else{g=(b|0)==0;j=0;k=e;while(1){e=c[k+4>>2]|0;if(g){l=e;n=7722}else{if((e|0)==(b|0)){l=b;n=7722}else{o=j}}if((n|0)==7722){n=0;e=c[m>>2]|0;p=c[k+60>>2]|0;if((p|0)==0){q=179864}else{q=j3(p)|0}cf(e|0,126584,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=q,v)|0);e=c[m>>2]|0;p=c[k+8>>2]|0;if((p|0)==0){r=179864}else{r=c[21784+(p<<2)>>2]|0}s=+h[k+24>>3];t=c[k+12>>2]|0;if((t|0)==(p|0)){u=179864}else{u=c[21784+(t<<2)>>2]|0}w=+h[k+32>>3];p=c[k+16>>2]|0;if((p|0)==(t|0)){x=179864}else{x=c[21784+(p<<2)>>2]|0}y=+h[k+40>>3];cf(e|0,77392,(v=i,i=i+48|0,c[v>>2]=r,h[v+8>>3]=s,c[v+16>>2]=u,h[v+24>>3]=w,c[v+32>>2]=x,h[v+40>>3]=y,v)|0);e=c[k+48>>2]|0;if((e|0)==1){p=c[m>>2]|0;aI(126448,7,1,p|0)}else if((e|0)==2){aI(131280,6,1,c[m>>2]|0)}else if((e|0)==0){aI(131440,5,1,c[m>>2]|0)}e=c[k+52>>2]|0;p=c[m>>2]|0;if((e|0)==0){aI(126264,12,1,p|0)}else{cf(p|0,126328,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}e=c[m>>2]|0;p=(c[k+56>>2]|0)!=0?150856:150704;cf(e|0,126160,(v=i,i=i+8|0,c[v>>2]=p,v)|0);p=c[k+64>>2]|0;if((p|0)!=0){e=c[m>>2]|0;cf(e|0,126104,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}p=k+72|0;if((c[p>>2]|0)!=0){e=c[m>>2]|0;aI(145280,10,1,e|0);jg(e,p)}if((a[k+184|0]&1)!=0){p=c[m>>2]|0;aI(199048,11,1,p|0)}p=k+88|0;e=c[m>>2]|0;if((c[p>>2]|0)==0){aI(126e3,8,1,e|0)}else{aI(125912,20,1,e|0);ji(c[m>>2]|0,p,1);p=c[m>>2]|0;e=c[k+144>>2]|0;if((e|0)==0){z=179864}else{z=c[21784+(e<<2)>>2]|0}y=+h[k+160>>3];t=c[k+148>>2]|0;if((t|0)==(e|0)){A=179864}else{A=c[21784+(t<<2)>>2]|0}w=+h[k+168>>3];e=c[k+152>>2]|0;if((e|0)==(t|0)){B=179864}else{B=c[21784+(e<<2)>>2]|0}s=+h[k+176>>3];cf(p|0,77392,(v=i,i=i+48|0,c[v>>2]=z,h[v+8>>3]=y,c[v+16>>2]=A,h[v+24>>3]=w,c[v+32>>2]=B,h[v+40>>3]=s,v)|0)}p=c[m>>2]|0;aF(10,p|0);o=1}p=c[k>>2]|0;if((p|0)==0){f=o;break}else{j=o;k=p}}}if((b|0)<1|f){i=d;return}else{uf(c[13898]|0,125760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jN(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,w=0,x=0.0,y=0,z=0.0,A=0,B=0,C=0,D=0;d=i;e=c[10826]|0;if((e|0)==0){f=0}else{g=(b|0)==0;j=0;k=e;while(1){e=c[k+4>>2]|0;if(g){l=e;n=7761}else{if((e|0)==(b|0)){l=b;n=7761}else{o=j}}if((n|0)==7761){n=0;e=c[m>>2]|0;p=c[72304+(c[k+160>>2]<<2)>>2]|0;q=k+200|0;r=c[q>>2]|0;if((r|0)==2){s=128e3}else{s=(r|0)==1?127904:127768}r=(c[k+100>>2]|0)!=0?150856:150704;cf(e|0,128128,(v=i,i=i+32|0,c[v>>2]=l,c[v+8>>2]=p,c[v+16>>2]=s,c[v+24>>2]=r,v)|0);ji(c[m>>2]|0,k+104|0,0);r=c[m>>2]|0;aI(127616,9,1,r|0);r=c[m>>2]|0;p=c[k+8>>2]|0;if((p|0)==0){t=179864}else{t=c[21784+(p<<2)>>2]|0}u=+h[k+24>>3];e=c[k+12>>2]|0;if((e|0)==(p|0)){w=179864}else{w=c[21784+(e<<2)>>2]|0}x=+h[k+32>>3];p=c[k+16>>2]|0;if((p|0)==(e|0)){y=179864}else{y=c[21784+(p<<2)>>2]|0}z=+h[k+40>>3];cf(r|0,77392,(v=i,i=i+48|0,c[v>>2]=t,h[v+8>>3]=u,c[v+16>>2]=w,h[v+24>>3]=x,c[v+32>>2]=y,h[v+40>>3]=z,v)|0);r=(a[k+88|0]&1)!=0?127520:127448;p=c[m>>2]|0;aK(r|0,p|0);p=c[m>>2]|0;r=c[k+48>>2]|0;if((r|0)==0){A=179864}else{A=c[21784+(r<<2)>>2]|0}z=+h[k+64>>3];e=c[k+52>>2]|0;if((e|0)==(r|0)){B=179864}else{B=c[21784+(e<<2)>>2]|0}x=+h[k+72>>3];r=c[k+56>>2]|0;if((r|0)==(e|0)){C=179864}else{C=c[21784+(r<<2)>>2]|0}u=+h[k+80>>3];cf(p|0,77392,(v=i,i=i+48|0,c[v>>2]=A,h[v+8>>3]=z,c[v+16>>2]=B,h[v+24>>3]=x,c[v+32>>2]=C,h[v+40>>3]=u,v)|0);u=+h[k+168>>3];do{if(u>0.0){p=c[m>>2]|0;r=c[k+176>>2]|0;if((r|0)==0){D=179864}else{D=c[21832+(r<<2)>>2]|0}x=+h[k+184>>3];cf(p|0,126992,(v=i,i=i+24|0,c[v>>2]=D,h[v+8>>3]=u,h[v+16>>3]=x,v)|0);if((c[q>>2]|0)==0){break}p=c[m>>2]|0;x=+h[k+192>>3];cf(p|0,126792,(v=i,i=i+8|0,h[v>>3]=x,v)|0)}}while(0);q=c[m>>2]|0;aF(10,q|0);o=1}q=c[k>>2]|0;if((q|0)==0){f=o;break}else{j=o;k=q}}}if((b|0)<1|f){i=d;return}else{uf(c[13898]|0,134376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jO(){var b=0,d=0,e=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}do{if((c[8786]|0)==3){d=c[m>>2]|0;e=+h[4395];cf(d|0,134456,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{e=+h[4395];d=c[m>>2]|0;if(e<0.0){aI(134096,35,1,d|0);break}else{cf(d|0,134296,(v=i,i=i+8|0,h[v>>3]=e,v)|0);break}}}while(0);do{if((c[14100]|0)==3){d=c[m>>2]|0;e=+h[7052];cf(d|0,133952,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{e=+h[7052];d=c[m>>2]|0;if(e<0.0){aI(133664,35,1,d|0);break}else{cf(d|0,133816,(v=i,i=i+8|0,h[v>>3]=e,v)|0);break}}}while(0);do{if((c[6598]|0)==3){d=c[m>>2]|0;e=+h[3301];cf(d|0,133536,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{e=+h[3301];d=c[m>>2]|0;if(e<0.0){aI(133048,35,1,d|0);break}else{cf(d|0,133360,(v=i,i=i+8|0,h[v>>3]=e,v)|0);break}}}while(0);if((c[1066]|0)==3){d=c[m>>2]|0;e=+h[535];cf(d|0,132872,(v=i,i=i+8|0,h[v>>3]=e,v)|0);i=b;return}e=+h[535];d=c[m>>2]|0;if(e<0.0){aI(132592,35,1,d|0);i=b;return}else{cf(d|0,132720,(v=i,i=i+8|0,h[v>>3]=e,v)|0);i=b;return}}function jP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;c[13898]=(c[13898]|0)+1;cf(c[m>>2]|0,166536,(v=i,i=i+8|0,c[v>>2]=(c[7662]|0)==1?166152:165672,v)|0);aI(165320,17,1,c[m>>2]|0);d=a[30632]|0;if(d<<24>>24!=0){e=0;f=30632;g=d;do{if((e|0)>0){d=c[m>>2]|0;aI(164904,7,1,d|0);h=a[f]|0}else{h=g}d=h<<24>>24;if((d|0)==98){j=c[m>>2]|0;aI(164432,6,1,j|0)}else if((d|0)==115){aI(163992,7,1,c[m>>2]|0)}else if((d|0)==116){aI(163304,3,1,c[m>>2]|0)}e=e+1|0;f=e+30632|0;g=a[f]|0;}while(g<<24>>24!=0)}aF(10,c[m>>2]|0);g=a[30641]|0;do{if(g<<24>>24==100){f=c[m>>2]|0;aI(162824,21,1,f|0)}else{f=c[m>>2]|0;if(g<<24>>24==97){aI(158600,38,1,f|0);break}else{e=g<<24>>24==102?159744:159048;cf(f|0,162192,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}}}while(0);aI(157984,47,1,c[m>>2]|0);g=a[30639]|0;e=c[m>>2]|0;if(g<<24>>24==99){aI(156096,9,1,e|0)}else{f=g<<24>>24==98?154664:154352;cf(e|0,155016,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}cf(c[m>>2]|0,153960,(v=i,i=i+8|0,c[v>>2]=(a[30640]|0)!=0?179864:211688,v)|0);aI(153600,11,1,c[m>>2]|0);f=c[m>>2]|0;if((a[30642]|0)==49){aI(153160,49,1,f|0)}else{aI(152728,45,1,f|0)}f=c[7661]|0;e=c[m>>2]|0;if((f|0)>0){cf(e|0,152344,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}else{g=(f|0)!=0?150376:150208;cf(e|0,152016,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}g=c[7665]|0;cf(c[m>>2]|0,151768,(v=i,i=i+16|0,c[v>>2]=c[7664],c[v+8>>2]=g,v)|0);aI(151600,31,1,c[m>>2]|0);g=c[7663]|0;if((g|0)==8){e=c[m>>2]|0;aI(150536,21,1,e|0);i=b;return}else if((g|0)==7){aI(150712,21,1,c[m>>2]|0);i=b;return}else if((g|0)==4){aI(151368,19,1,c[m>>2]|0);i=b;return}else if((g|0)==5){aI(151064,30,1,c[m>>2]|0);i=b;return}else if((g|0)==6){aI(150872,20,1,c[m>>2]|0);i=b;return}else{cf(c[m>>2]|0,150400,(v=i,i=i+8|0,c[v>>2]=g+1,v)|0);i=b;return}}function jQ(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0.0,ax=0.0,ay=0.0,az=0,aA=0,aB=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;g=c[8272]|0;do{if((f|0)<(g|0)){j=c[1054]|0;k=(a[j+(f*40&-1)|0]&1)==0;if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[j+(f*40&-1)+36>>2]|0;o=j+(f*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(l|0)){r=7852;break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}if((r|0)==7852){if((q|0)==1){break}}p=c[o>>2]|0;if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((l|0)>0){s=c[10036]|0;t=0;u=0;w=p;while(1){if((a[t+205488|0]|0)==(a[s+(t+w|0)|0]|0)){x=w;y=u}else{if((t|0)!=3){break}x=w-1|0;y=1}z=t+1|0;if((z|0)<(y+l|0)){t=z;u=y;w=x}else{r=7882;break}}do{if((r|0)==7882){if((y|0)==0){if(!((t|0)==2|(t|0)==7)){break}}w=f+1|0;c[13898]=w;if((w|0)>=(g|0)){uf(w,138608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L10757:do{if((a[j+(w*40&-1)|0]&1)!=0){u=c[j+(w*40&-1)+36>>2]|0;s=j+(w*40&-1)+32|0;z=c[10036]|0;A=0;while(1){if((A|0)>=(u|0)){break}if((a[z+((c[s>>2]|0)+A|0)|0]|0)==(a[A+103664|0]|0)){A=A+1|0}else{break L10757}}if((A|0)!=1){break}uf(w,138608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=is(d)|0;s=c[w>>2]|0;if((s|0)==1){B=+(c[w+8>>2]|0)}else if((s|0)==2){B=+h[w+8>>3]}else if((s|0)==3){B=+uz(c[w+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=d|0;if((c[w>>2]|0)==3){uu(c[d+8>>2]|0);c[w>>2]=1}w=~~B;s=(w|0)<2?128:w;w=c[13898]|0;do{if((w|0)<(c[8272]|0)){z=c[1054]|0;if((a[z+(w*40&-1)|0]&1)==0){uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[z+(w*40&-1)+36>>2]|0;C=z+(w*40&-1)+32|0;z=c[10036]|0;D=0;while(1){if((D|0)>=(u|0)){r=7903;break}E=c[C>>2]|0;if((a[z+(E+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{F=E;break}}if((r|0)==7903){if((D|0)==1){G=0;break}F=c[C>>2]|0}if((u|0)>0){H=0;I=0;J=F}else{uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){if((a[H+138408|0]|0)==(a[z+(H+J|0)|0]|0)){K=J;L=I}else{if((H|0)!=1){M=0;N=0;O=F;r=7912;break}K=J-1|0;L=1}A=H+1|0;if((A|0)<(L+u|0)){H=A;I=L;J=K}else{r=7910;break}}do{if((r|0)==7910){if((L|0)!=0){P=1;break}if((H|0)==0|(H|0)==5){P=1}else{M=0;N=0;O=F;r=7912}}}while(0);do{if((r|0)==7912){while(1){r=0;if((a[M+138104|0]|0)==(a[z+(M+O|0)|0]|0)){Q=O;R=N}else{if((M|0)!=1){r=8045;break}Q=O-1|0;R=1}C=M+1|0;if((C|0)<(R+u|0)){M=C;N=R;O=Q;r=7912}else{break}}if((r|0)==8045){uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((R|0)!=0){P=2;break}if((M|0)==0|(M|0)==3){P=2;break}uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[13898]=w+1;G=P}else{G=0}}while(0);w=c[7262]|0;u=c[m>>2]|0;if((w|0)==0|(w|0)==(u|0)){S=1}else{S=(w|0)==(c[n>>2]|0)}z=(w|0)!=0?w:u;w=(c[5163]|0)==103?137656:137544;cf(u|0,137800,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=s,v)|0);w=c[m>>2]|0;if(S){aI(137248,2,1,w|0)}else{u=c[7260]|0;cf(w|0,137360,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}if((s|0)<=0){i=b;return}T=+(s-1|0);u=e|0;w=e+8|0;C=e+16|0;D=0;do{U=+(D|0)/T;if((a[20668]|0)==110){V=1.0-U}else{V=U}fq(V,e);U=+h[u>>3];W=+h[w>>3];X=+h[C>>3];A=~~(U*255.0+.5);E=~~(W*255.0+.5);Y=~~(X*255.0+.5);if((G|0)==1){cf(z|0,137184,(v=i,i=i+24|0,h[v>>3]=U,h[v+8>>3]=W,h[v+16>>3]=X,v)|0)}else if((G|0)==2){cf(z|0,137056,(v=i,i=i+24|0,c[v>>2]=A&255,c[v+8>>2]=E&255,c[v+16>>2]=Y&255,v)|0)}else{Z=A&255;A=E&255;E=Y&255;cf(z|0,138856,(v=i,i=i+88|0,c[v>>2]=D,h[v+8>>3]=V,h[v+16>>3]=U,h[v+24>>3]=W,h[v+32>>3]=X,c[v+40>>2]=Z,c[v+48>>2]=A,c[v+56>>2]=E,c[v+64>>2]=Z,c[v+72>>2]=A,c[v+80>>2]=E,v)|0)}D=D+1|0;}while((D|0)<(s|0));i=b;return}}while(0);if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L10836:do{if((l|0)>0){t=c[10036]|0;s=0;D=0;z=p;while(1){if((a[s+142040|0]|0)==(a[t+(s+z|0)|0]|0)){_=z;$=D}else{if((s|0)!=3){break L10836}_=z-1|0;$=1}C=s+1|0;if((C|0)<($+l|0)){s=C;D=$;z=_}else{break}}if(($|0)==0){if(!((s|0)==2|(s|0)==8)){break}}c[13898]=f+1;if((c[5163]|0)!=100){z=c[m>>2]|0;aI(139016,47,1,z|0);i=b;return}if((c[5172]|0)>0){aa=0}else{i=b;return}do{z=c[5173]|0;T=+h[z+(aa<<5)>>3];X=+h[z+(aa<<5)+8>>3];W=+h[z+(aa<<5)+16>>3];U=+h[z+(aa<<5)+24>>3];z=~~(X*255.0+.5);D=~~(W*255.0+.5);t=~~(U*255.0+.5);cf(c[m>>2]|0,138856,(v=i,i=i+88|0,c[v>>2]=aa,h[v+8>>3]=T,h[v+16>>3]=X,h[v+24>>3]=W,h[v+32>>3]=U,c[v+40>>2]=z,c[v+48>>2]=D,c[v+56>>2]=t,c[v+64>>2]=z,c[v+72>>2]=D,c[v+80>>2]=t,v)|0);aa=aa+1|0;}while((aa|0)<(c[5172]|0));i=b;return}}while(0);if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)<=0){break}s=c[10036]|0;t=0;D=0;z=p;while(1){if((a[t+141864|0]|0)==(a[s+(t+z|0)|0]|0)){ab=z;ac=D}else{if((t|0)!=6){break}ab=z-1|0;ac=1}C=t+1|0;if((C|0)<(ac+l|0)){t=C;D=ac;z=ab}else{r=7954;break}}do{if((r|0)==7954){if((ac|0)==0){if(!((t|0)==5|(t|0)==11)){break}}z=c[m>>2]|0;D=c[5162]|0;cf(z|0,140040,(v=i,i=i+8|0,c[v>>2]=D,v)|0);if((a[c[7122]|0]|0)!=0){D=0;z=0;do{if(((D|0)%3&-1|0)==0){s=c[m>>2]|0;aI(139832,6,1,s|0)}s=c[28488+((z|1)<<2)>>2]|0;cf(c[m>>2]|0,139592,(v=i,i=i+16|0,c[v>>2]=D,c[v+8>>2]=s,v)|0);D=D+1|0;z=D<<1;}while((a[c[28488+(z<<2)>>2]|0]|0)!=0)}z=c[m>>2]|0;aF(10,z|0);z=c[m>>2]|0;aI(139400,62,1,z|0);z=c[m>>2]|0;D=(c[5162]|0)-1|0;cf(z|0,139168,(v=i,i=i+16|0,c[v>>2]=D,c[v+8>>2]=D,v)|0);c[13898]=(c[13898]|0)+1;i=b;return}}while(0);if(!k){break}uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);j=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){r=7965;break}if((a[j+(p+o|0)|0]|0)==(a[o+204344|0]|0)){o=o+1|0}else{r=7966;break}}if((r|0)==7965){if((o|0)!=6){r=7966}}do{if((r|0)==7966){if(!((l|0)>0&(k^1))){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[10036]|0;q=0;t=0;D=p;while(1){if((a[q+141544|0]|0)==(a[j+(q+D|0)|0]|0)){ad=D;ae=t}else{if((q|0)!=5){break}ad=D-1|0;ae=1}z=q+1|0;if((z|0)<(ae+l|0)){q=z;t=ae;D=ad}else{r=7972;break}}if((r|0)==7972){if((ae|0)!=0){break}if((q|0)==4|(q|0)==10){break}}if(!((l|0)>0&(k^1))){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=c[10036]|0;t=0;j=0;z=p;while(1){if((a[t+141352|0]|0)==(a[D+(t+z|0)|0]|0)){af=z;ag=j}else{if((t|0)!=7){r=8027;break}af=z-1|0;ag=1}s=t+1|0;if((s|0)<(ag+l|0)){t=s;j=ag;z=af}else{break}}if((r|0)==8027){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((ag|0)==0){if((t|0)==6|(t|0)==15){break}uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);t=(c[5162]|0)-1|0;c[13898]=f+1;if((c[5163]|0)==114&(c[5174]|0)==114){z=c[m>>2]|0;j=c[5164]|0;D=c[5165]|0;q=c[5166]|0;cf(z|0,141008,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=D,c[v+16>>2]=q,v)|0);i=b;return}q=ut(768)|0;do{if((q|0)==0){gk();D=ut(768)|0;if((D|0)!=0){ah=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140872,v)|0)}else{ah=q}}while(0);q=ah;D=0;do{fq(+(D|0)/31.0,q+(D*24&-1)|0);D=D+1|0;}while((D|0)<32);D=t<<1|1;j=D<<2;z=ut(j)|0;do{if((z|0)==0){gk();s=ut(j)|0;if((s|0)!=0){ai=s;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140736,v)|0)}else{ai=z}}while(0);z=ai;do{if((t|0)>=0){s=0;do{c[z+(s<<2)>>2]=s;s=s+1|0;}while((s|0)<=(t|0));if((t|0)<1){break}else{aj=1}do{c[z+(aj+t<<2)>>2]=-aj;aj=aj+1|0;}while((aj|0)<=(t|0))}}while(0);t=ut(j)|0;do{if((t|0)==0){gk();s=ut(j)|0;if((s|0)!=0){ak=s;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140536,v)|0)}else{ak=t}}while(0);t=ak;if((D|0)>0){j=0;while(1){s=ut(256)|0;if((s|0)==0){gk();C=ut(256)|0;if((C|0)==0){r=8003;break}else{al=C}}else{al=s}s=t+(j<<2)|0;c[s>>2]=al;C=z+(j<<2)|0;w=0;do{U=+fu(c[C>>2]|0,+(w|0)/31.0);h[(c[s>>2]|0)+(w<<3)>>3]=U;w=w+1|0;}while((w|0)<32);w=j+1|0;if((w|0)<(D|0)){j=w}else{am=0;an=0;ao=0;ap=8.988465674311579e+307;aq=0;break}}if((r|0)==8003){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140344,v)|0)}while(1){j=z+(aq<<2)|0;w=c[t+(aq<<2)>>2]|0;s=am;C=an;u=ao;U=ap;E=0;while(1){A=c[t+(E<<2)>>2]|0;Z=z+(E<<2)|0;Y=s;ar=C;as=u;W=U;at=0;while(1){au=c[t+(at<<2)>>2]|0;X=0.0;av=0;do{T=+h[q+(av*24&-1)>>3]- +h[w+(av<<3)>>3];aw=+h[q+(av*24&-1)+8>>3]- +h[A+(av<<3)>>3];ax=+h[q+(av*24&-1)+16>>3]- +h[au+(av<<3)>>3];X=X+(T*T+aw*aw+ax*ax);av=av+1|0;}while((av|0)<32);if(X<W){ay=X;az=c[j>>2]|0;aA=c[Z>>2]|0;aB=c[z+(at<<2)>>2]|0}else{ay=W;az=as;aA=ar;aB=Y}av=at+1|0;if((av|0)<(D|0)){Y=aB;ar=aA;as=az;W=ay;at=av}else{break}}at=E+1|0;if((at|0)<(D|0)){s=aB;C=aA;u=az;U=ay;E=at}else{break}}E=aq+1|0;if((E|0)<(D|0)){am=aB;an=aA;ao=az;ap=ay;aq=E}else{break}}cf(c[m>>2]|0,140160,(v=i,i=i+24|0,c[v>>2]=az,c[v+8>>2]=aA,c[v+16>>2]=aB,v)|0);z=0;do{uu(c[t+(z<<2)>>2]|0);z=z+1|0;}while((z|0)<(D|0))}else{cf(c[m>>2]|0,140160,(v=i,i=i+24|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=0,v)|0)}uu(ak);uu(ai);uu(ah);i=b;return}}while(0);jR();i=b;return}}while(0);cf(c[m>>2]|0,147560,(v=i,i=i+8|0,c[v>>2]=(c[5163]|0)==103?147288:147032,v)|0);ah=c[5163]|0;do{if((ah|0)==100){ai=c[m>>2]|0;aI(146576,35,1,ai|0)}else if((ah|0)==114){ai=c[5165]|0;ak=c[5166]|0;cf(c[m>>2]|0,146752,(v=i,i=i+24|0,c[v>>2]=c[5164],c[v+8>>2]=ai,c[v+16>>2]=ak,v)|0)}else if((ah|0)==102){aI(146384,49,1,c[m>>2]|0);ak=c[5179]|0;if((c[5178]|0)!=0&(ak|0)!=0){ai=c[m>>2]|0;cf(ai|0,146224,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}ak=c[5257]|0;if((c[5256]|0)!=0&(ak|0)!=0){ai=c[m>>2]|0;cf(ai|0,146056,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}ak=c[5335]|0;if(!((c[5334]|0)!=0&(ak|0)!=0)){break}cf(c[m>>2]|0,145904,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}else if((ah|0)==99){ay=+h[2707];ap=+h[2708];cf(c[m>>2]|0,145624,(v=i,i=i+24|0,h[v>>3]=+h[2706],h[v+8>>3]=ay,h[v+16>>3]=ap,v)|0)}else if((ah|0)!=103){cf(c[m>>2]|0,145456,(v=i,i=i+24|0,c[v>>2]=145192,c[v+8>>2]=2321,c[v+16>>2]=ah<<24>>24,v)|0)}}while(0);cf(c[m>>2]|0,144904,(v=i,i=i+8|0,c[v>>2]=(a[20668]|0)==112?144696:144440,v)|0);cf(c[m>>2]|0,144216,(v=i,i=i+8|0,c[v>>2]=(a[20684]|0)==0?144064:179864,v)|0);aI(143944,12,1,c[m>>2]|0);ah=c[5168]|0;ak=c[m>>2]|0;if((ah|0)==0){aI(143728,13,1,ak|0)}else{cf(ak|0,143880,(v=i,i=i+8|0,c[v>>2]=ah,v)|0)}aI(143544,48,1,c[m>>2]|0);aI(143376,14,1,c[m>>2]|0);ah=c[5174]|0;if((ah|0)==114){ak=c[m>>2]|0;aI(143256,4,1,ak|0)}else if((ah|0)==120){aI(142552,4,1,c[m>>2]|0)}else if((ah|0)==99){aI(142912,4,1,c[m>>2]|0)}else if((ah|0)==104){aI(143048,4,1,c[m>>2]|0)}else if((ah|0)==121){aI(142680,4,1,c[m>>2]|0)}else{cf(c[m>>2]|0,142392,(v=i,i=i+24|0,c[v>>2]=145192,c[v+8>>2]=2343,c[v+16>>2]=ah<<24>>24,v)|0)}cf(c[m>>2]|0,142264,(v=i,i=i+8|0,h[v>>3]=+h[2705],v)|0);i=b;return}function jR(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0;a=i;cf(c[m>>2]|0,136824,(v=i,i=i+8|0,c[v>>2]=112,v)|0);b=c[7642]|0;d=c[b>>2]|0;if((d|0)==0){e=c[m>>2]|0;f=aF(10,e|0)|0;g=c[13898]|0;h=g+1|0;c[13898]=h;i=a;return}else{j=b;k=d}do{d=c[j+4>>2]|0;b=d>>>16&255;l=d>>>8&255;n=d&255;cf(c[m>>2]|0,136440,(v=i,i=i+8|0,c[v>>2]=k,v)|0);cf(c[m>>2]|0,136240,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=l,c[v+16>>2]=n,c[v+24>>2]=b,c[v+32>>2]=l,c[v+40>>2]=n,v)|0);j=j+8|0;k=c[j>>2]|0;}while((k|0)!=0);e=c[m>>2]|0;f=aF(10,e|0)|0;g=c[13898]|0;h=g+1|0;c[13898]=h;i=a;return}function jS(){var b=0,d=0,e=0,f=0,g=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[8270]|0;do{if((d|0)!=0){if((aY(d|0,139696)|0)==0){break}bA(4,d|0)}}while(0);d=c[m>>2]|0;e=c[b$()>>2]|0;cf(d|0,170016,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[8270]|0;do{if((e|0)!=0){if((aY(e|0,139696)|0)==0){break}bA(4,139696)}}while(0);e=c[12886]|0;d=c[m>>2]|0;if((e|0)==0){aI(169e3,57,1,d|0);f=c[m>>2]|0;g=cf(f|0,168632,(v=i,i=i+8|0,c[v>>2]=48904,v)|0)|0;i=b;return}else{cf(d|0,169544,(v=i,i=i+8|0,c[v>>2]=e,v)|0);f=c[m>>2]|0;g=cf(f|0,168632,(v=i,i=i+8|0,c[v>>2]=48904,v)|0)|0;i=b;return}}function jT(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}cf(c[m>>2]|0,171816,(v=i,i=i+8|0,c[v>>2]=(a[42568]&1)!=0?179864:171496,v)|0);d=c[10568]|0;if((d|0)!=0){e=c[m>>2]|0;cf(e|0,171184,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=b;return}d=fg()|0;if((d|0)==0){i=b;return}cf(c[m>>2]|0,170744,(v=i,i=i+8|0,c[v>>2]=d,v)|0);uu(d);i=b;return}function jU(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(135832,29,1,c[m>>2]|0);d=c[57238]|0;cf(c[m>>2]|0,154696,(v=i,i=i+8|0,c[v>>2]=(d|0)!=0?d:135560,v)|0);aI(135336,38,1,c[m>>2]|0);d=c[m>>2]|0;e=bU(195768)|0;cf(d|0,154696,(v=i,i=i+8|0,c[v>>2]=(e|0)==0?135560:e,v)|0);cf(c[m>>2]|0,135072,(v=i,i=i+8|0,c[v>>2]=195896,v)|0);i=b;return}function jV(){var b=0,d=0,e=0.0,f=0.0,j=0.0,k=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(178128,9,1,c[m>>2]|0);d=c[m>>2]|0;if((c[5094]|0)==1){aI(177880,4,1,d|0);i=b;return}e=+g[3536];f=+g[3534];j=+g[3532];cf(d|0,177528,(v=i,i=i+32|0,h[v>>3]=+g[3538],h[v+8>>3]=e,h[v+16>>3]=f,h[v+24>>3]=j,v)|0);d=c[18072]|0;if((d|0)==2){k=176720}else{k=(d|0)==3?176120:179864}cf(c[m>>2]|0,177040,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=(d|0)>1?175728:175376,v)|0);i=b;return}function jW(){var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;b=i;c[13898]=(c[13898]|0)+1;d=c[m>>2]|0;do{if((a[54018]|0)==0){aI(149704,29,1,d|0)}else{aI(150216,24,1,d|0);e=c[13505]|0;f=c[m>>2]|0;if((e|0)>-1){cf(f|0,150056,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else{aI(149856,21,1,f|0);break}}}while(0);do{if((a[54016]|0)!=110){d=c[m>>2]|0;if((c[13506]|0)==1){aI(149576,13,1,d|0);break}else{aI(149312,12,1,d|0);break}}}while(0);d=a[54016]|0;if((d|0)==117){f=c[m>>2]|0;aI(148704,16,1,f|0);f=c[m>>2]|0;e=c[13508]|0;if((e|0)==0){g=179864}else{g=c[21784+(e<<2)>>2]|0}j=+h[6756];k=c[13509]|0;if((k|0)==(e|0)){l=179864}else{l=c[21784+(k<<2)>>2]|0}n=+h[6757];e=c[13510]|0;if((e|0)==(k|0)){o=179864}else{o=c[21784+(e<<2)>>2]|0}p=+h[6758];cf(f|0,77392,(v=i,i=i+48|0,c[v>>2]=g,h[v+8>>3]=j,c[v+16>>2]=l,h[v+24>>3]=n,c[v+32>>2]=o,h[v+40>>3]=p,v)|0);o=c[m>>2]|0;aI(148472,18,1,o|0);o=c[m>>2]|0;l=c[13518]|0;if((l|0)==0){q=179864}else{q=c[21784+(l<<2)>>2]|0}p=+h[6761];g=c[13519]|0;if((g|0)==(l|0)){r=179864}else{r=c[21784+(g<<2)>>2]|0}n=+h[6762];l=c[13520]|0;if((l|0)==(g|0)){s=179864}else{s=c[21784+(l<<2)>>2]|0}j=+h[6763];cf(o|0,77392,(v=i,i=i+48|0,c[v>>2]=q,h[v+8>>3]=p,c[v+16>>2]=r,h[v+24>>3]=n,c[v+32>>2]=s,h[v+40>>3]=j,v)|0);s=c[m>>2]|0;aF(10,s|0);t=c[m>>2]|0;u=a[54017]|0;w=u<<24>>24==118;x=w?148008:147816;y=cf(t|0,148168,(v=i,i=i+8|0,c[v>>2]=x,v)|0)|0;i=b;return}else if((d|0)==100){aI(148856,20,1,c[m>>2]|0);t=c[m>>2]|0;u=a[54017]|0;w=u<<24>>24==118;x=w?148008:147816;y=cf(t|0,148168,(v=i,i=i+8|0,c[v>>2]=x,v)|0)|0;i=b;return}else if((d|0)==110){aI(149024,10,1,c[m>>2]|0);t=c[m>>2]|0;u=a[54017]|0;w=u<<24>>24==118;x=w?148008:147816;y=cf(t|0,148168,(v=i,i=i+8|0,c[v>>2]=x,v)|0)|0;i=b;return}else{uf(-1,148400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jX(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;g=c[1054]|0;j=c[g+(f*40&-1)+36>>2]|0;k=c[g+(f*40&-1)+32>>2]|0;l=(a[g+(f*40&-1)|0]&1)==0;n=(j|0)>0;o=c[10036]|0;p=21680;q=116616;L11099:while(1){L11101:do{if(!l){if(n){r=0;s=0;t=k;while(1){u=a[q+r|0]|0;if(u<<24>>24==(a[o+(r+t|0)|0]|0)){w=t;x=s}else{if(u<<24>>24!=36){break L11101}w=t-1|0;x=1}y=r+1|0;if((y|0)<(x+j|0)){r=y;s=x;t=w}else{break}}if((x|0)==0){z=y}else{A=p;break L11099}}else{z=0}t=a[q+z|0]|0;if((t<<24>>24|0)==36|(t<<24>>24|0)==0){A=p;break L11099}}}while(0);t=p+8|0;s=c[t>>2]|0;if((s|0)==0){A=t;break}else{p=t;q=s}}q=c[A+4>>2]|0;if((q|0)==1){if(!(a[928]|0)){A=c[m>>2]|0;aF(10,A|0)}A=c[12890]|0;p=c[m>>2]|0;cf(p|0,114608,(v=i,i=i+8|0,c[v>>2]=122960,v)|0);jh(c[m>>2]|0,122960,A);c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==2){if(!(a[928]|0)){A=c[m>>2]|0;aF(10,A|0)}A=c[10058]|0;cf(c[m>>2]|0,114608,(v=i,i=i+8|0,c[v>>2]=122816,v)|0);jh(c[m>>2]|0,122816,A);c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==4){j7();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==9){aI(115400,27,1,c[m>>2]|0);A=c[m>>2]|0;if((a[30080]&1)==0){aI(115272,18,1,A|0)}else{aI(115320,56,1,A|0)}c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==3){A=f+1|0;c[13898]=A;L11134:do{if((A|0)<(c[8272]|0)){L11136:do{if((a[g+(A*40&-1)|0]&1)!=0){p=c[g+(A*40&-1)+36>>2]|0;z=g+(A*40&-1)+32|0;y=0;while(1){if((y|0)>=(p|0)){break}if((a[o+((c[z>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L11136}}if((y|0)==1){B=0;break L11134}}}while(0);z=is(e)|0;p=c[z>>2]|0;if((p|0)==1){C=+(c[z+8>>2]|0)}else if((p|0)==3){C=+uz(c[z+8>>2]|0,0)}else if((p|0)==2){C=+h[z+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=e|0;if((c[z>>2]|0)==3){uu(c[e+8>>2]|0);c[z>>2]=1}z=~~C;if((z|0)>=1){B=z;break}uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{B=0}}while(0);e=c[10820]|0;if((e|0)==0){D=0}else{A=(B|0)==0;z=0;p=e;while(1){e=c[p+4>>2]|0;if(A){E=e;F=8155}else{if((e|0)==(B|0)){E=B;F=8155}else{G=z}}if((F|0)==8155){F=0;e=c[m>>2]|0;cf(e|0,75168,(v=i,i=i+8|0,c[v>>2]=E,v)|0);ji(c[m>>2]|0,p+8|0,1);e=c[m>>2]|0;aF(10,e|0);G=1}e=c[p>>2]|0;if((e|0)==0){D=G;break}else{z=G;p=e}}}if((B|0)<1|D){i=b;return}else{uf(c[13898]|0,74736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else if((q|0)==8){ka();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==7){kb();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==11){j9();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==10){j8();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==5){D=f+1|0;c[13898]=D;L11198:do{if((D|0)<(c[8272]|0)){L11200:do{if((a[g+(D*40&-1)|0]&1)!=0){f=c[g+(D*40&-1)+36>>2]|0;B=g+(D*40&-1)+32|0;p=0;while(1){if((p|0)>=(f|0)){break}if((a[o+((c[B>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break L11200}}if((p|0)==1){H=0;break L11198}}}while(0);B=is(d)|0;f=c[B>>2]|0;if((f|0)==2){I=+h[B+8>>3]}else if((f|0)==3){I=+uz(c[B+8>>2]|0,0)}else if((f|0)==1){I=+(c[B+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=d|0;if((c[B>>2]|0)==3){uu(c[d+8>>2]|0);c[B>>2]=1}B=~~I;if((B|0)>=1){H=B;break}uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{H=0}}while(0);kd(H);i=b;return}else if((q|0)==6){if(!(a[928]|0)){q=c[m>>2]|0;aF(10,q|0)}aI(122192,33,1,c[m>>2]|0);q=c[12738]|0;if((q|0)==0){J=179864}else{J=c[21784+(q<<2)>>2]|0}I=+h[6371];H=c[12739]|0;if((H|0)==(q|0)){K=179864}else{K=c[21784+(H<<2)>>2]|0}C=+h[6372];q=c[12740]|0;if((q|0)==(H|0)){L=179864}else{L=c[21784+(q<<2)>>2]|0}M=+h[6373];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=J,h[v+8>>3]=I,c[v+16>>2]=K,h[v+24>>3]=C,c[v+32>>2]=L,h[v+40>>3]=M,v)|0);aF(10,c[m>>2]|0);c[13898]=(c[13898]|0)+1;i=b;return}else{L=c[12890]|0;cf(c[m>>2]|0,114608,(v=i,i=i+8|0,c[v>>2]=122960,v)|0);jh(c[m>>2]|0,122960,L);L=c[10058]|0;cf(c[m>>2]|0,114608,(v=i,i=i+8|0,c[v>>2]=122816,v)|0);jh(c[m>>2]|0,122816,L);L=c[10820]|0;if((L|0)!=0){K=L;do{cf(c[m>>2]|0,75168,(v=i,i=i+8|0,c[v>>2]=c[K+4>>2],v)|0);ji(c[m>>2]|0,K+8|0,1);aF(10,c[m>>2]|0);K=c[K>>2]|0;}while((K|0)!=0)}j7();aI(115400,27,1,c[m>>2]|0);K=c[m>>2]|0;if((a[30080]&1)==0){aI(115272,18,1,K|0)}else{aI(115320,56,1,K|0)}j8();kd(0);j9();ka();if(!(a[928]|0)){K=c[m>>2]|0;aF(10,K|0)}aI(122192,33,1,c[m>>2]|0);K=c[12738]|0;if((K|0)==0){N=179864}else{N=c[21784+(K<<2)>>2]|0}M=+h[6371];L=c[12739]|0;if((L|0)==(K|0)){O=179864}else{O=c[21784+(L<<2)>>2]|0}C=+h[6372];K=c[12740]|0;if((K|0)==(L|0)){P=179864}else{P=c[21784+(K<<2)>>2]|0}I=+h[6373];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=N,h[v+8>>3]=M,c[v+16>>2]=O,h[v+24>>3]=C,c[v+32>>2]=P,h[v+40>>3]=I,v)|0);aF(10,c[m>>2]|0);kb();i=b;return}}function jY(){var b=0,d=0,e=0.0,f=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}e=+g[38];cf(c[m>>2]|0,182560,(v=i,i=i+16|0,h[v>>3]=+g[178],h[v+8>>3]=e,v)|0);e=+g[18074];if(e>0.0){d=c[m>>2]|0;f=e;cf(d|0,181056,(v=i,i=i+8|0,h[v>>3]=f,v)|0);i=b;return}d=c[m>>2]|0;if(e==0.0){aI(180712,36,1,d|0);i=b;return}else{f=-0.0-e;cf(d|0,180280,(v=i,i=i+8|0,h[v>>3]=f,v)|0);i=b;return}}function jZ(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,n=0.0,o=0,p=0;k=i;if(!(a[928]|0)){l=c[m>>2]|0;aF(10,l|0)}l=c[m>>2]|0;n=+h[77];if((a[624]&1)==0){cf(l|0,185536,(v=i,i=i+8|0,h[v>>3]=n,v)|0)}else{cf(l|0,186024,(v=i,i=i+8|0,h[v>>3]=n,v)|0)}l=c[10026]|0;if((l|0)>-1){o=c[m>>2]|0;p=(l|0)==0?150704:150856;cf(o|0,185040,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}if(b){j4(2)}if(f){j4(6)}if(d){j4(1)}if(g){j4(5)}if(e){j4(0)}if(!j){a[25280]=0;i=k;return}j4(3);a[25280]=0;i=k;return}function j_(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[13898]|0;e=c[1054]|0;f=c[e+(d*40&-1)+36>>2]|0;g=c[e+(d*40&-1)+32>>2]|0;h=(a[e+(d*40&-1)|0]&1)==0;e=(f|0)>0;j=c[10036]|0;k=56720;l=77416;L11280:while(1){L11282:do{if(!h){if(e){n=0;o=0;p=g;while(1){q=a[l+n|0]|0;if(q<<24>>24==(a[j+(n+p|0)|0]|0)){r=p;s=o}else{if(q<<24>>24!=36){break L11282}r=p-1|0;s=1}t=n+1|0;if((t|0)<(s+f|0)){n=t;o=s;p=r}else{break}}if((s|0)==0){u=t}else{w=k;break L11280}}else{u=0}p=a[l+u|0]|0;if((p<<24>>24|0)==36|(p<<24>>24|0)==0){w=k;break L11280}}}while(0);p=k+8|0;o=c[p>>2]|0;if((o|0)==0){w=p;break}else{k=p;l=o}}l=c[w+4>>2]|0;if((l|0)>-1){c[13898]=d+1;d=c[m>>2]|0;w=56832+(l*24&-1)|0;k=j3(64813+(l*688&-1)|0)|0;cf(d|0,203592,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=k,v)|0);i=b;return}else{x=0}do{if((c[64808+(x*688&-1)>>2]|0)==1){k=c[m>>2]|0;w=56832+(x*24&-1)|0;d=j3(64813+(x*688&-1)|0)|0;cf(k|0,203592,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=d,v)|0)}x=x+1|0;}while((x|0)<11);i=b;return}function j$(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[65040+(a*688&-1)>>2]|0;if((d|0)==2){e=c[m>>2]|0;f=56832+(a*24&-1)|0;g=~~+h[65048+(a*688&-1)>>3];cf(e|0,187104,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=g,v)|0);i=b;return}else if((d|0)==1){g=56832+(a*24&-1)|0;cf(c[m>>2]|0,191400,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=b;return}else if((d|0)==0){cf(c[m>>2]|0,193440,(v=i,i=i+8|0,c[v>>2]=56832+(a*24&-1),v)|0);i=b;return}else if((d|0)==3){cf(c[m>>2]|0,188528,(v=i,i=i+8|0,c[v>>2]=56832+(a*24&-1),v)|0);i=b;return}else{uf(-1,186648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function j0(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[13898]|0;L11319:do{if((d|0)<(c[8272]|0)){e=c[1054]|0;f=(a[e+(d*40&-1)|0]&1)==0;if(f){break}g=c[e+(d*40&-1)+36>>2]|0;h=e+(d*40&-1)+32|0;e=c[10036]|0;j=0;while(1){if((j|0)>=(g|0)){k=8291;break}if((a[e+((c[h>>2]|0)+j|0)|0]|0)==(a[j+103664|0]|0)){j=j+1|0}else{break}}if((k|0)==8291){if((j|0)==1){k=8300;break}}if(!((g|0)>0&(f^1))){break}e=c[10036]|0;l=0;n=0;o=c[h>>2]|0;while(1){if((a[l+210832|0]|0)==(a[e+(l+o|0)|0]|0)){p=o;q=n}else{if((l|0)!=4){break L11319}p=o-1|0;q=1}r=l+1|0;if((r|0)<(q+g|0)){l=r;n=q;o=p}else{break}}if((q|0)!=0){k=8300;break}if((l|0)==3|(l|0)==7){k=8300}}else{k=8300}}while(0);do{if((k|0)==8300){q=c[8528]|0;p=c[m>>2]|0;if((q|0)==0){aI(210088,41,1,p|0);break}else{cf(p|0,209400,(v=i,i=i+8|0,c[v>>2]=q,v)|0);break}}}while(0);q=c[13898]|0;L11343:do{if((q|0)<(c[8272]|0)){p=c[1054]|0;d=(a[p+(q*40&-1)|0]&1)==0;if(d){break}o=c[p+(q*40&-1)+36>>2]|0;n=p+(q*40&-1)+32|0;p=c[10036]|0;g=0;while(1){if((g|0)>=(o|0)){k=8308;break}if((a[p+((c[n>>2]|0)+g|0)|0]|0)==(a[g+103664|0]|0)){g=g+1|0}else{break}}if((k|0)==8308){if((g|0)==1){k=8317;break}}if(!((o|0)>0&(d^1))){break}p=c[10036]|0;l=0;e=0;h=c[n>>2]|0;while(1){if((a[l+209008|0]|0)==(a[p+(l+h|0)|0]|0)){s=h;t=e}else{if((l|0)!=3){break L11343}s=h-1|0;t=1}f=l+1|0;if((f|0)<(t+o|0)){l=f;e=t;h=s}else{break}}if((t|0)!=0){k=8317;break}if((l|0)==2|(l|0)==9){k=8317}}else{k=8317}}while(0);do{if((k|0)==8317){t=a[47120]|0;s=c[m>>2]|0;if(t<<24>>24==0){aI(207840,41,1,s|0);break}else{q=t<<24>>24;cf(s|0,208456,(v=i,i=i+8|0,c[v>>2]=q,v)|0);break}}}while(0);q=c[13898]|0;L11367:do{if((q|0)<(c[8272]|0)){s=c[1054]|0;t=(a[s+(q*40&-1)|0]&1)==0;if(t){break}h=c[s+(q*40&-1)+36>>2]|0;e=s+(q*40&-1)+32|0;s=c[10036]|0;o=0;while(1){if((o|0)>=(h|0)){k=8325;break}if((a[s+((c[e>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break}}if((k|0)==8325){if((o|0)==1){k=8334;break}}if(!((h|0)>0&(t^1))){break}s=c[10036]|0;l=0;p=0;n=c[e>>2]|0;while(1){if((a[l+207024|0]|0)==(a[s+(l+n|0)|0]|0)){u=n;w=p}else{if((l|0)!=3){break L11367}u=n-1|0;w=1}d=l+1|0;if((d|0)<(w+h|0)){l=d;p=w;n=u}else{break}}if((w|0)!=0){k=8334;break}if((l|0)==2|(l|0)==8){k=8334}}else{k=8334}}while(0);if((k|0)==8334){w=c[m>>2]|0;u=c[11948]|0;cf(w|0,206416,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}if((a[47712]&1)!=0){u=c[m>>2]|0;aI(205568,55,1,u|0)}if((a[47472]&1)!=0){u=c[m>>2]|0;aI(204904,55,1,u|0)}u=c[13898]|0;w=c[1054]|0;q=c[w+(u*40&-1)+36>>2]|0;n=c[w+(u*40&-1)+32>>2]|0;L11394:do{if((a[w+(u*40&-1)|0]&1)!=0&(q|0)>0){p=c[10036]|0;h=0;s=0;e=n;while(1){if((a[h+204608|0]|0)==(a[p+(h+e|0)|0]|0)){x=e;y=s}else{if((h|0)!=3){z=u;break L11394}x=e-1|0;y=1}t=h+1|0;if((t|0)<(y+q|0)){h=t;s=y;e=x}else{break}}if((y|0)==0){if(!((h|0)==2|(h|0)==6)){z=u;break}}e=c[8272]|0;do{if((u|0)<(e|0)){s=c[10036]|0;p=0;while(1){if((p|0)>=(q|0)){k=8351;break}if((a[s+(n+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((k|0)==8351){if((p|0)==1){A=u;break}}s=u+1|0;c[13898]=s;A=s}else{A=u}}while(0);L11415:do{if((A|0)<(e|0)){if((a[w+(A*40&-1)|0]&1)==0){B=A;C=e;break}h=c[w+(A*40&-1)+36>>2]|0;s=w+(A*40&-1)+32|0;l=c[10036]|0;t=0;while(1){if((t|0)>=(h|0)){break}if((a[l+((c[s>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{B=A;C=e;break L11415}}if((t|0)==1){k=8359}else{B=A;C=e}}else{k=8359}}while(0);if((k|0)==8359){eN(c[m>>2]|0);e=c[m>>2]|0;aF(10,e|0);B=c[13898]|0;C=c[8272]|0}L11425:do{if((B|0)<(C|0)){e=c[1054]|0;s=(a[e+(B*40&-1)|0]&1)==0;if(s){D=B;E=C;break}l=c[e+(B*40&-1)+36>>2]|0;h=e+(B*40&-1)+32|0;e=c[10036]|0;p=0;while(1){if((p|0)>=(l|0)){k=8365;break}if((a[e+((c[h>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((k|0)==8365){if((p|0)==1){k=8374;break}}if(!((l|0)>0&(s^1))){D=B;E=C;break}e=c[10036]|0;t=0;o=0;d=c[h>>2]|0;while(1){if((a[t+204360|0]|0)==(a[e+(t+d|0)|0]|0)){F=d;G=o}else{if((t|0)!=5){D=B;E=C;break L11425}F=d-1|0;G=1}g=t+1|0;if((g|0)<(G+l|0)){t=g;o=G;d=F}else{break}}if((G|0)!=0){k=8374;break}if((t|0)==4|(t|0)==9){k=8374}else{D=B;E=C}}else{k=8374}}while(0);if((k|0)==8374){eO(c[m>>2]|0);D=c[13898]|0;E=c[8272]|0}L11446:do{if((D|0)<(E|0)){d=c[1054]|0;if((a[d+(D*40&-1)|0]&1)==0){H=D;I=E;break}o=c[d+(D*40&-1)+36>>2]|0;l=d+(D*40&-1)+32|0;d=c[10036]|0;e=0;while(1){if((e|0)>=(o|0)){break}if((a[d+((c[l>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{H=D;I=E;break L11446}}if((e|0)==1){k=8381}else{H=D;I=E}}else{k=8381}}while(0);if((k|0)==8381){l=c[m>>2]|0;aF(10,l|0);H=c[13898]|0;I=c[8272]|0}do{if((H|0)<(I|0)){l=c[1054]|0;d=(a[l+(H*40&-1)|0]&1)==0;if(d){z=H;break L11394}o=c[l+(H*40&-1)+36>>2]|0;t=l+(H*40&-1)+32|0;l=c[10036]|0;h=0;while(1){if((h|0)>=(o|0)){k=8387;break}if((a[l+((c[t>>2]|0)+h|0)|0]|0)==(a[h+103664|0]|0)){h=h+1|0}else{break}}if((k|0)==8387){if((h|0)==1){break}}if(!((o|0)>0&(d^1))){z=H;break L11394}l=c[10036]|0;e=0;s=0;p=c[t>>2]|0;while(1){if((a[e+204080|0]|0)==(a[l+(e+p|0)|0]|0)){J=p;K=s}else{if((e|0)!=5){z=H;break L11394}J=p-1|0;K=1}g=e+1|0;if((g|0)<(K+o|0)){e=g;s=K;p=J}else{break}}if((K|0)!=0){break}if(!((e|0)==4|(e|0)==9)){z=H;break L11394}}}while(0);p=c[m>>2]|0;aI(192576,70,1,p|0);s=c[12174]|0;if((s|0)!=0){o=0;l=s;do{o=o+1|0;cf(p|0,189936,(v=i,i=i+8|0,c[v>>2]=l,v)|0);l=c[48696+(o<<3)>>2]|0;}while((l|0)!=0)}aF(10,p|0);z=c[13898]|0}else{z=u}}while(0);if((z|0)>=(c[8272]|0)){i=b;return}u=c[1054]|0;L11483:do{if((a[u+(z*40&-1)|0]&1)!=0){H=c[u+(z*40&-1)+36>>2]|0;K=u+(z*40&-1)+32|0;J=c[10036]|0;k=0;while(1){if((k|0)>=(H|0)){break}if((a[J+((c[K>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L11483}}if((k|0)!=1){break}i=b;return}}while(0);c[13898]=z+1;i=b;return}function j1(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[m>>2]|0;if((c[8496]|0)==0){aI(211280,14,1,d|0);i=b;return}aI(221800,13,1,d|0);d=c[m>>2]|0;if((c[8498]|0)==0){aI(220672,35,1,d|0)}else{aI(221272,32,1,d|0)}d=c[m>>2]|0;if((c[8500]|0)==0){aI(218440,42,1,d|0)}else{aI(218904,53,1,d|0)}d=c[8497]|0;e=c[m>>2]|0;if((d|0)>0){cf(e|0,217848,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}else{aI(217288,32,1,e|0)}cf(c[m>>2]|0,216608,(v=i,i=i+8|0,c[v>>2]=c[8503],v)|0);cf(c[m>>2]|0,216184,(v=i,i=i+8|0,c[v>>2]=c[13532],v)|0);e=c[13534]|0;if((e|0)!=0){d=c[m>>2]|0;cf(d|0,215632,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}cf(c[m>>2]|0,215176,(v=i,i=i+8|0,c[v>>2]=c[8506],v)|0);e=c[8510]|0;if((e|0)!=0){d=c[m>>2]|0;cf(d|0,214656,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}e=c[m>>2]|0;if((c[8499]|0)==0){aI(213400,33,1,e|0)}else{d=c[8504]|0;cf(e|0,213952,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}cf(c[m>>2]|0,212848,(v=i,i=i+8|0,c[v>>2]=(c[8502]|0)!=0?150376:150208,v)|0);cf(c[m>>2]|0,212248,(v=i,i=i+8|0,c[v>>2]=(c[8501]|0)!=0?179864:211688,v)|0);i=b;return}function j2(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=i;i=i+56|0;d=b|0;e=c[10810]|0;f=d|0;uE(f|0,0,51);if(!(a[928]|0)){g=c[m>>2]|0;aF(10,g|0)}g=c[13898]|0;L11527:do{if((g|0)<(c[8272]|0)){h=c[1054]|0;j=(a[h+(g*40&-1)|0]&1)==0;k=c[h+(g*40&-1)+36>>2]|0;l=h+(g*40&-1)+32|0;L11529:do{if(j){n=c[l>>2]|0}else{h=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){p=8442;break}if((a[h+((c[l>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break}}if((p|0)==8442){if((o|0)==1){p=8452;break L11527}}h=c[l>>2]|0;if(!((k|0)>0&(j^1))){n=h;break}q=c[10036]|0;r=0;do{if((a[r+74272|0]|0)!=(a[q+(r+h|0)|0]|0)){n=h;break L11529}r=r+1|0;}while((r|0)<(k|0));if((r|0)!=3){n=h;break}c[13898]=g+1;aI(73856,27,1,c[m>>2]|0);s=1;break L11527}}while(0);j=(k|0)>49?49:k;l=c[10036]|0;q=n;o=0;while(1){t=o+1|0;a[d+o|0]=a[l+q|0]|0;if((t|0)==(j|0)){break}else{q=q+1|0;o=t}}a[d+j|0]=0;c[13898]=g+1;p=8452}else{p=8452}}while(0);do{if((p|0)==8452){g=c[m>>2]|0;if((a[f]|0)==0){aI(72912,30,1,g|0);s=0;break}else{cf(g|0,73512,(v=i,i=i+8|0,c[v>>2]=f,v)|0);s=0;break}}}while(0);if((e|0)==0){i=b;return}else{u=e}do{e=c[u+4>>2]|0;g=bk(e|0,73808)|0;d=(a[f]|0)==0;if(d){p=8459}else{if((a_(e|0,f|0,uA(f|0)|0)|0)==0){p=8459}}do{if((p|0)==8459){p=0;if(!s){if(!((a_(e|0,167320,6)|0)!=0|d^1)){break}}if((a[u+8|0]&1)!=0){break}n=c[m>>2]|0;cf(n|0,223688,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=e,v)|0);n=c[m>>2]|0;aI(223040,2,1,n|0);j5(c[m>>2]|0,u+16|0,1);n=c[m>>2]|0;aF(10,n|0)}}while(0);u=c[u>>2]|0;}while((u|0)!=0);i=b;return}function j3(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;if((b|0)==0){f=0;i=e;return f|0}g=c[13364]|0;h=db(g,(uA(b|0)<<2)+4|0,124472)|0;c[13364]=h;c[13362]=h;g=a[b]|0;if(g<<24>>24==0){j=h}else{h=b;b=g;do{g=b<<24>>24;do{if((g|0)==13){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=c[13362]|0;c[13362]=k+1;a[k]=114}else if((g|0)==10){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=c[13362]|0;c[13362]=k+1;a[k]=110}else if((g|0)==34|(g|0)==92){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=a[h]|0;l=c[13362]|0;c[13362]=l+1;a[l]=k}else if((g|0)==9){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=c[13362]|0;c[13362]=k+1;a[k]=116}else{if((c[11252]|0)==15){k=c[13362]|0;c[13362]=k+1;a[k]=b;break}if((bB(b&255|0)|0)!=0){k=a[h]|0;l=c[13362]|0;c[13362]=l+1;a[l]=k;break}k=c[13362]|0;c[13362]=k+1;a[k]=92;be(c[13362]|0,123064,(v=i,i=i+8|0,c[v>>2]=d[h]|0,v)|0);k=c[13362]|0;if((a[k]|0)==0){break}else{m=k}do{m=m+1|0;c[13362]=m;}while((a[m]|0)!=0)}}while(0);h=h+1|0;b=a[h]|0;}while(b<<24>>24!=0);j=c[13362]|0}a[j]=0;f=c[13364]|0;i=e;return f|0}function j4(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0,B=0;d=i;i=i+384|0;e=d|0;f=d+48|0;g=d+96|0;j=d+144|0;k=d+224|0;l=d+304|0;n=j3(64864+(b*688&-1)|0)|0;o=56832+(b*24&-1)|0;p=65072+(b*688&-1)|0;q=(a[p]&1)!=0?115944:115008;r=+h[65056+(b*688&-1)>>3];s=+h[65064+(b*688&-1)>>3];cf(c[m>>2]|0,116800,(v=i,i=i+32|0,c[v>>2]=o,c[v+8>>2]=q,h[v+16>>3]=r,h[v+24>>3]=s,v)|0);cf(c[m>>2]|0,113920,(v=i,i=i+8|0,c[v>>2]=o,v)|0);o=64916+(b*688&-1)|0;q=c[o>>2]&3;do{if((q|0)==2){t=c[m>>2]|0;aI(107752,7,1,t|0);if((c[o>>2]&4|0)==0){break}t=c[m>>2]|0;u=(a[p]&1)!=0?115008:115944;cf(t|0,106816,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}else if((q|0)==0){aI(109752,4,1,c[m>>2]|0);i=d;return}else if((q|0)==1){aI(105832,9,1,c[m>>2]|0);if((c[o>>2]&4|0)==0){break}aI(104760,32,1,c[m>>2]|0)}}while(0);if((a[65024+(b*688&-1)|0]&1)!=0){o=c[m>>2]|0;aI(104192,34,1,o|0)}aI(103824,15,1,c[m>>2]|0);do{if((a[65272+(b*688&-1)|0]&1)==0){o=c[m>>2]|0;aI(100008,25,1,o|0)}else{o=c[65128+(b*688&-1)>>2]|0;if((o|0)==0){q=c[m>>2]|0;aI(103432,16,1,q|0);break}else if((o|0)==2){aI(101240,17,1,c[m>>2]|0);break}else if((o|0)==1){aI(100688,18,1,c[m>>2]|0);break}else{break}}}while(0);cf(c[m>>2]|0,99584,(v=i,i=i+8|0,c[v>>2]=n,v)|0);n=65032+(b*688&-1)|0;o=c[m>>2]|0;if((c[n>>2]|0)==0){aI(97264,23,1,o|0)}else{aI(99160,8,1,o|0);o=c[m>>2]|0;q=c[n>>2]|0;cf(o|0,98536,(v=i,i=i+8|0,c[v>>2]=q,v)|0);q=c[m>>2]|0;aI(97880,35,1,q|0)}aI(96688,11,1,c[m>>2]|0);q=c[64984+(b*688&-1)>>2]|0;if((q|0)==0){w=179864}else{w=c[21784+(q<<2)>>2]|0}s=+h[65e3+(b*688&-1)>>3];o=c[64988+(b*688&-1)>>2]|0;if((o|0)==(q|0)){x=179864}else{x=c[21784+(o<<2)>>2]|0}r=+h[65008+(b*688&-1)>>3];q=c[64992+(b*688&-1)>>2]|0;if((q|0)==(o|0)){y=179864}else{y=c[21784+(q<<2)>>2]|0}z=+h[65016+(b*688&-1)>>3];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=w,h[v+8>>3]=s,c[v+16>>2]=x,h[v+24>>3]=r,c[v+32>>2]=y,h[v+40>>3]=z,v)|0);aI(84248,2,1,c[m>>2]|0);y=c[64920+(b*688&-1)>>2]|0;if((y|0)==5){x=c[m>>2]|0;aI(94856,30,1,x|0)}else if((y|0)==4){aI(95344,32,1,c[m>>2]|0)}else if((y|0)==2){aI(94192,8,1,c[m>>2]|0);x=64952+(b*688&-1)|0;do{if(+h[x>>3]!=-8.988465674311579e+307){w=c[m>>2]|0;aI(93552,6,1,w|0);w=64808+(b*688&-1)|0;q=c[m>>2]|0;if((c[w>>2]|0)==1){aF(34,q|0);o=j|0;n=64813+(b*688&-1)|0;z=+h[x>>3];t3(g,z);r=z- +O(+z);t4(o,80,n,g,r);n=j3(o)|0;o=c[m>>2]|0;aK(n|0,o|0);o=c[m>>2]|0;aF(34,o|0);A=w;break}else{r=+h[x>>3];cf(q|0,92736,(v=i,i=i+8|0,h[v>>3]=r,v)|0);A=w;break}}else{A=64808+(b*688&-1)|0}}while(0);x=(c[A>>2]|0)==1?91240:179864;cf(c[m>>2]|0,91888,(v=i,i=i+16|0,h[v>>3]=+h[64960+(b*688&-1)>>3],c[v+8>>2]=x,v)|0);x=64968+(b*688&-1)|0;do{if(+h[x>>3]!=8.988465674311579e+307){g=c[m>>2]|0;aI(90664,7,1,g|0);g=c[m>>2]|0;if((c[A>>2]|0)==1){aF(34,g|0);j=k|0;w=64813+(b*688&-1)|0;r=+h[x>>3];t3(f,r);z=r- +O(+r);t4(j,80,w,f,z);w=j3(j)|0;j=c[m>>2]|0;aK(w|0,j|0);j=c[m>>2]|0;aF(34,j|0);break}else{z=+h[x>>3];cf(g|0,92736,(v=i,i=i+8|0,h[v>>3]=z,v)|0);break}}}while(0);aF(10,c[m>>2]|0)}else if((y|0)==1){aI(95816,35,1,c[m>>2]|0)}else if((y|0)==3){aI(90168,25,1,c[m>>2]|0)}else{uf(-1,89432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=64944+(b*688&-1)|0;if((c[y>>2]|0)!=0){x=c[m>>2]|0;aI(89080,18,1,x|0);x=c[y>>2]|0;L11649:do{if((x|0)!=0){y=64808+(b*688&-1)|0;f=l|0;k=64813+(b*688&-1)|0;A=x;do{g=c[A+8>>2]|0;if((g|0)!=0){j=c[m>>2]|0;w=j3(g)|0;cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}w=c[m>>2]|0;if((c[y>>2]|0)==1){aF(34,w|0);z=+h[A>>3];t3(e,z);r=z- +O(+z);t4(f,80,k,e,r);j=j3(f)|0;g=c[m>>2]|0;aK(j|0,g|0);g=c[m>>2]|0;aF(34,g|0)}else{r=+h[A>>3];cf(w|0,92736,(v=i,i=i+8|0,h[v>>3]=r,v)|0)}w=c[A+12>>2]|0;if((w|0)!=0){g=c[m>>2]|0;cf(g|0,95144,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}w=A+16|0;if((c[w>>2]|0)==0){break L11649}aI(86120,2,1,c[m>>2]|0);A=c[w>>2]|0;}while((A|0)!=0)}}while(0);e=c[m>>2]|0;aI(84944,2,1,e|0)}e=64928+(b*688&-1)|0;x=e|0;if((c[x>>2]|0)!=0){l=c[m>>2]|0;aI(84256,2,1,l|0);l=c[m>>2]|0;if((c[x>>2]|0)==0){B=l}else{aI(145280,10,1,l|0);jg(l,e);B=c[m>>2]|0}aF(10,B|0)}B=c[64924+(b*688&-1)>>2]|0;if((B|0)==0){i=d;return}if((a[B]|0)==0){i=d;return}cf(c[m>>2]|0,82560,(v=i,i=i+8|0,c[v>>2]=B,v)|0);i=d;return}function j5(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0;f=i;g=c[d>>2]|0;if((g|0)==2){j=d+8|0;if((cg(+(+h[j>>3]))|0)==0){aI(133568,3,1,b|0);i=f;return}k=d+16|0;l=+h[k>>3]!=0.0;m=+h[j>>3];j=c[8300]|0;n=j+1|0;c[8300]=(n|0)>3?0:n;n=33096+(j*25&-1)|0;be(n|0,121864,(v=i,i=i+8|0,h[v>>3]=m,v)|0);do{if((a8(n|0,46)|0)==0){if((a8(n|0,101)|0)!=0){break}if((a8(n|0,69)|0)!=0){break}o=(uA(n|0)|0)+(33096+(j*25&-1))|0;a[o]=a[119960]|0;a[o+1|0]=a[119961|0]|0;a[o+2|0]=a[119962|0]|0}}while(0);if(!l){aK(n|0,b|0);i=f;return}m=+h[k>>3];k=c[8300]|0;l=k+1|0;c[8300]=(l|0)>3?0:l;l=33096+(k*25&-1)|0;be(l|0,121864,(v=i,i=i+8|0,h[v>>3]=m,v)|0);do{if((a8(l|0,46)|0)==0){if((a8(l|0,101)|0)!=0){break}if((a8(l|0,69)|0)!=0){break}j=(uA(l|0)|0)+(33096+(k*25&-1))|0;a[j]=a[119960]|0;a[j+1|0]=a[119961|0]|0;a[j+2|0]=a[119962|0]|0}}while(0);cf(b|0,129368,(v=i,i=i+16|0,c[v>>2]=n,c[v+8>>2]=l,v)|0);i=f;return}else if((g|0)==1){cf(b|0,21e4,(v=i,i=i+8|0,c[v>>2]=c[d+8>>2],v)|0);i=f;return}else if((g|0)==3){g=c[d+8>>2]|0;if((g|0)==0){i=f;return}if(e){e=j3(g)|0;cf(b|0,126760,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}else{aK(g|0,b|0);i=f;return}}else{uf(-1,125696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function j6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,n=0.0,o=0,p=0.0,q=0,r=0.0;f=i;if((e|0)==0){i=f;return}g=c[m>>2]|0;j=c[e+60>>2]|0;if((j|0)==0){k=179864}else{k=j3(j)|0}cf(g|0,201680,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=k,v)|0);k=c[e+144>>2]|0;if((k|0)==0){l=179864}else{l=c[21784+(k<<2)>>2]|0}n=+h[e+160>>3];d=c[e+148>>2]|0;if((d|0)==(k|0)){o=179864}else{o=c[21784+(d<<2)>>2]|0}p=+h[e+168>>3];k=c[e+152>>2]|0;if((k|0)==(d|0)){q=179864}else{q=c[21784+(k<<2)>>2]|0}r=+h[e+176>>3];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=l,h[v+8>>3]=n,c[v+16>>2]=o,h[v+24>>3]=p,c[v+32>>2]=q,h[v+40>>3]=r,v)|0);q=c[e+64>>2]|0;if((q|0)!=0){o=c[m>>2]|0;l=j3(q)|0;cf(o|0,200976,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}do{if((c[e+4>>2]|0)==-3){l=c[m>>2]|0;aI(200160,30,1,l|0)}else{l=c[e+52>>2]|0;if((l|0)==0){break}o=c[m>>2]|0;cf(o|0,199392,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}}while(0);l=e+72|0;if((c[l>>2]|0)!=0){o=c[m>>2]|0;aI(145280,10,1,o|0);jg(o,l)}if((a[e+184|0]&1)!=0){e=c[m>>2]|0;aI(199048,11,1,e|0)}aF(10,c[m>>2]|0);i=f;return}function j7(){var b=0,d=0,e=0,f=0,g=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[12372]|0;if((d|0)==1|(d|0)==4){e=c[m>>2]|0;f=(d|0)==1?179864:114984;g=+(c[12373]|0)/100.0;cf(e|0,115056,(v=i,i=i+16|0,c[v>>2]=f,h[v+8>>3]=g,v)|0)}else if((d|0)==2|(d|0)==5){f=c[12374]|0;cf(c[m>>2]|0,114872,(v=i,i=i+16|0,c[v>>2]=(d|0)==2?179864:114984,c[v+8>>2]=f,v)|0)}else{aI(114808,20,1,c[m>>2]|0)}f=c[m>>2]|0;if((c[12376]|0)==1&(c[12377]|0)==-3){aI(114720,16,1,f|0);i=b;return}else{aI(114672,13,1,f|0);jg(c[m>>2]|0,49504);f=c[m>>2]|0;aF(10,f|0);i=b;return}}function j8(){var a=0,b=0,d=0,e=0,f=0.0,g=0,j=0,k=0.0,l=0,n=0.0,o=0,p=0;a=i;b=c[9670]|0;if((b|0)==4){d=c[m>>2]|0;e=c[9671]|0;f=+h[4840];cf(d|0,115720,(v=i,i=i+16|0,c[v>>2]=e,h[v+8>>3]=f,v)|0)}else if((b|0)==3){cf(c[m>>2]|0,115896,(v=i,i=i+8|0,c[v>>2]=c[9671],v)|0)}else if((b|0)==1){aI(115656,31,1,c[m>>2]|0)}else if((b|0)==2){aI(115560,34,1,c[m>>2]|0)}aI(115520,14,1,c[m>>2]|0);b=c[9720]|0;if((b|0)==0){g=179864}else{g=c[21784+(b<<2)>>2]|0}f=+h[4862];e=c[9721]|0;if((e|0)==(b|0)){j=179864}else{j=c[21784+(e<<2)>>2]|0}k=+h[4863];b=c[9722]|0;if((b|0)==(e|0)){l=179864}else{l=c[21784+(b<<2)>>2]|0}n=+h[4864];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=g,h[v+8>>3]=f,c[v+16>>2]=j,h[v+24>>3]=k,c[v+32>>2]=l,h[v+40>>3]=n,v)|0);if((c[9702]|0)!=1){o=c[m>>2]|0;p=aF(10,o|0)|0;i=a;return}cf(c[m>>2]|0,115464,(v=i,i=i+8|0,c[v>>2]=(c[9703]|0)+1,v)|0);o=c[m>>2]|0;p=aF(10,o|0)|0;i=a;return}function j9(){var b=0,d=0,e=0.0,f=0,g=0;b=i;cf(c[m>>2]|0,121184,(v=i,i=i+8|0,c[v>>2]=(c[14068]|0)==257?120960:120872,v)|0);aI(120712,32,1,c[m>>2]|0);d=c[m>>2]|0;e=+h[7032];if((c[14062]|0)==1){cf(d|0,120416,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{cf(d|0,120264,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}d=c[m>>2]|0;if((a[56264]&1)==0){aI(119752,28,1,d|0)}else{f=(c[14067]|0)+1|0;cf(d|0,119912,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}cf(c[m>>2]|0,119616,(v=i,i=i+8|0,h[v>>3]=+h[7035],v)|0);f=c[m>>2]|0;d=c[14072]|0;do{if((d|0)==2){g=119368}else{if((d|0)==3){g=119280;break}g=(d|0)==1?119216:119160}}while(0);cf(f|0,119552,(v=i,i=i+8|0,c[v>>2]=g,v)|0);cf(c[m>>2]|0,119104,(v=i,i=i+8|0,c[v>>2]=(a[56292]&1)!=0?116904:116760,v)|0);i=b;return}function ka(){var b=0,d=0,e=0,f=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[12292]|0;if((d|0)>0){e=150856}else{e=(d|0)<0?121920:150704}cf(c[m>>2]|0,122136,(v=i,i=i+8|0,c[v>>2]=e,v)|0);do{if((a[49240]&1)==0){e=c[12303]|0;d=c[m>>2]|0;if((e|0)==-4){aI(121848,10,1,d|0);break}else{f=e+1|0;cf(d|0,121528,(v=i,i=i+8|0,c[v>>2]=f,v)|0);break}}else{jg(c[m>>2]|0,49248)}}while(0);cf(c[m>>2]|0,121456,(v=i,i=i+8|0,h[v>>3]=+h[6153],v)|0);aI(121392,11,1,c[m>>2]|0);jf(c[m>>2]|0,49176);i=b;return}function kb(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0.0,l=0,n=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(122752,32,1,c[m>>2]|0);d=c[12418]|0;if((d|0)==0){e=179864}else{e=c[21784+(d<<2)>>2]|0}f=+h[6211];g=c[12419]|0;if((g|0)==(d|0)){j=179864}else{j=c[21784+(g<<2)>>2]|0}k=+h[6212];d=c[12420]|0;if((d|0)==(g|0)){l=179864}else{l=c[21784+(d<<2)>>2]|0}n=+h[6213];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=e,h[v+8>>3]=f,c[v+16>>2]=j,h[v+24>>3]=k,c[v+32>>2]=l,h[v+40>>3]=n,v)|0);cf(c[m>>2]|0,122680,(v=i,i=i+8|0,h[v>>3]=+h[6214],v)|0);l=c[12406]|0;if((l|0)==1){j=c[m>>2]|0;aI(122448,53,1,j|0);i=b;return}else if((l|0)==0){aI(122568,66,1,c[m>>2]|0);i=b;return}else if((l|0)==2){aI(122360,53,1,c[m>>2]|0);i=b;return}else{i=b;return}}function kc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;e=i;f=b|0;if((c[f>>2]|0)<=0){i=e;return}g=(d|0)>0;h=(d|0)<6;j=d+2|0;k=0;do{aF(9,c[m>>2]|0);if(g){l=0;do{aF(32,c[m>>2]|0);l=l+1|0;}while((l|0)<(d|0))}l=b+8+(k<<5)|0;aK(c[41160+(c[l>>2]<<3)>>2]|0,c[m>>2]|0);n=b+8+(k<<5)+8|0;o=c[l>>2]|0;do{if((o|0)==37|(o|0)==38|(o|0)==39|(o|0)==40){l=c[m>>2]|0;p=c[n>>2]|0;cf(l|0,105024,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}else if((o|0)==6){p=n;cf(c[m>>2]|0,124744,(v=i,i=i+8|0,c[v>>2]=c[(c[p>>2]|0)+4>>2],v)|0);if(!h){l=c[m>>2]|0;aF(10,l|0);break}l=c[m>>2]|0;if((c[(c[p>>2]|0)+8>>2]|0)==0){aI(105080,13,1,l|0);break}else{aF(10,l|0);kc(c[(c[p>>2]|0)+8>>2]|0,j);break}}else if((o|0)==2){cf(c[m>>2]|0,105160,(v=i,i=i+8|0,c[v>>2]=a[c[(c[n>>2]|0)+4>>2]|0]|0,v)|0)}else if((o|0)==0){cf(c[m>>2]|0,105248,(v=i,i=i+8|0,c[v>>2]=c[(c[n>>2]|0)+4>>2],v)|0)}else if((o|0)==3){cf(c[m>>2]|0,105160,(v=i,i=i+8|0,c[v>>2]=a[(c[(c[n>>2]|0)+4>>2]|0)+1|0]|0,v)|0)}else if((o|0)==1){aF(32,c[m>>2]|0);j5(c[m>>2]|0,n|0,1);aF(10,c[m>>2]|0)}else if((o|0)==31){cf(c[m>>2]|0,104848,(v=i,i=i+8|0,c[v>>2]=c[b+8+(k<<5)+16>>2],v)|0)}else if((o|0)==7|(o|0)==8){p=n;cf(c[m>>2]|0,124744,(v=i,i=i+8|0,c[v>>2]=c[(c[p>>2]|0)+4>>2],v)|0);if(!h){l=c[m>>2]|0;aF(10,l|0);break}l=c[m>>2]|0;if((c[(c[p>>2]|0)+8>>2]|0)==0){aI(105080,13,1,l|0);break}else{aF(10,l|0);kc(c[(c[p>>2]|0)+8>>2]|0,j);break}}else{aF(10,c[m>>2]|0)}}while(0);k=k+1|0;}while((k|0)<(c[f>>2]|0));i=e;return}function kd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0;b=i;d=c[10824]|0;if((d|0)==0){e=0}else{f=(a|0)==0;g=0;j=d;while(1){d=c[j+4>>2]|0;if(f){k=d;l=8695}else{if((d|0)==(a|0)){k=a;l=8695}else{n=g}}do{if((l|0)==8695){l=0;d=c[m>>2]|0;cf(d|0,116640,(v=i,i=i+8|0,c[v>>2]=k,v)|0);d=c[m>>2]|0;aD(d|0);d=c[m>>2]|0;o=j+72|0;p=c[o>>2]|0;if((p|0)==0){q=116368}else{q=(p|0)==2?116472:116424}p=(c[j+12>>2]|0)!=0?150856:150704;cf(d|0,116584,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=p,v)|0);ji(c[m>>2]|0,j+16|0,0);p=c[m>>2]|0;aF(10,p|0);if((c[o>>2]|0)==0){n=1;break}o=c[m>>2]|0;p=j+112|0;d=c[p>>2]|0;if((d|0)==2){r=128e3}else{r=(d|0)==1?127904:127768}cf(o|0,116328,(v=i,i=i+8|0,c[v>>2]=r,v)|0);s=+h[j+80>>3];o=c[m>>2]|0;if(s<=0.0){aI(116160,29,1,o|0);n=1;break}d=c[j+88>>2]|0;if((d|0)==0){t=179864}else{t=c[21808+(d<<2)>>2]|0}u=+h[j+96>>3];cf(o|0,116216,(v=i,i=i+24|0,c[v>>2]=t,h[v+8>>3]=s,h[v+16>>3]=u,v)|0);if((c[p>>2]|0)!=0){p=c[m>>2]|0;u=+h[j+104>>3];cf(p|0,126792,(v=i,i=i+8|0,h[v>>3]=u,v)|0)}p=c[m>>2]|0;aF(10,p|0);n=1}}while(0);p=c[j>>2]|0;if((p|0)==0){e=n;break}else{g=n;j=p}}}if((a|0)<1|e){i=b;return}else{uf(c[13898]|0,115992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function ke(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+b3(+m);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==1){m=+(d|0);break}else if((f|0)==2){m=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+bu(+m);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{d=f+1|0;c[6354]=d;f=14296+(d*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(d*24&-1)>>3]=j;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}function kg(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0.0,y=0.0;b=i;i=i+32|0;d=b|0;e=b+8|0;f=b+16|0;g=b+24|0;j=c[6354]|0;if((j|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=j-1|0;c[6354]=k;l=c[14296+(j*24&-1)>>2]|0;m=14304+(j*24&-1)|0;n=+h[m>>3];j=c[m>>2]|0;h[g>>3]=n;m=j;j=m;do{if((l|0)==3){o=+uz(j,f);p=(j|0)==(c[f>>2]|0);uu(j);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[g>>3]=o;q=o;r=c[6354]|0;break}}else{if((l|0)==1){q=+(m|0);r=k;break}else if((l|0)==2){q=n;r=k;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((r|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=r-1|0;c[6354]=k;l=c[14296+(r*24&-1)>>2]|0;m=14304+(r*24&-1)|0;n=+h[m>>3];r=c[m>>2]|0;h[g>>3]=n;m=r;r=m;do{if((l|0)==3){o=+uz(r,e);j=(r|0)==(c[e>>2]|0);uu(r);if(j){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[g>>3]=o;s=o;t=c[6354]|0;break}}else{if((l|0)==2){s=n;t=k;break}else if((l|0)==1){s=+(m|0);t=k;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;k=14296+(t*24&-1)|0;m=c[k>>2]|0;l=c[k+4>>2]|0;k=14304+(t*24&-1)|0;n=+h[k>>3];r=c[k>>2]|0;h[g>>3]=n;o=+h[14312+(t*24&-1)>>3];t=r;r=t;do{if((m|0)==3){u=+uz(r,d);k=(r|0)==(c[d>>2]|0);uu(r);if(k){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[g>>3]=u;w=u;x=0.0;break}}else{if((m|0)==2){w=n;x=o;break}else if((m|0)==1){w=+(t|0);x=o;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(w>0.0&s>0.0){if(q<0.0|q>1.0){break}do{if(q==0.0|q==1.0){y=q}else{if(q*(s+w)<=w){y=+kr(w,s,q);break}o=+kr(s,w,1.0-q);if(o<0.0){y=o;break}y=1.0-o}}while(0);if(y==-1.0){break}h[g>>3]=y;t=c[6354]|0;if((t|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=t+1|0;c[6354]=m;t=14296+(m*24&-1)|0;c[t>>2]=2;c[t+4>>2]=l;h[14304+(m*24&-1)>>3]=y;h[14312+(m*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;c[g>>2]=0;m=c[6354]|0;if((m|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=m+1|0;c[6354]=t;m=14296+(t*24&-1)|0;c[m>>2]=1;c[m+4>>2]=l;h[14304+(t*24&-1)>>3]=+h[g>>3];h[14312+(t*24&-1)>>3]=x;i=b;return}function kh(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;k=c[14296+(g*24&-1)>>2]|0;l=14304+(g*24&-1)|0;m=+h[l>>3];g=c[l>>2]|0;h[f>>3]=m;l=g;g=l;do{if((k|0)==3){n=+uz(g,e);o=(g|0)==(c[e>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=n;p=n;q=c[6354]|0;break}}else{if((k|0)==1){p=+(l|0);q=j;break}else if((k|0)==2){p=m;q=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;j=14296+(q*24&-1)|0;k=c[j>>2]|0;l=c[j+4>>2]|0;j=14304+(q*24&-1)|0;m=+h[j>>3];g=c[j>>2]|0;h[f>>3]=m;n=+h[14312+(q*24&-1)>>3];q=g;g=q;do{if((k|0)==3){r=+uz(g,d);j=(g|0)==(c[d>>2]|0);uu(g);if(j){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=r;s=r;t=0.0;break}}else{if((k|0)==1){s=+(q|0);t=n;break}else if((k|0)==2){s=m;t=n;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);L12007:do{if(p>=0.0&s>0.0){do{if(p==0.0){u=0.0}else{if(p>1.0e8){u=1.0;break}n=s*+_(+p)-p;m=n- +b2(+(s+1.0));if(m<-706.893623549172){w=0.0}else{w=+Z(+m)}do{if(p>1.0){if(s+2.0>p){x=s;y=0;z=1.0;A=1.0;B=8809;break}m=1.0-s;n=p+m+1.0;r=p+1.0;C=p*n;D=n;k=1;n=1.0;E=p;F=r;G=C;H=m;m=r/C;while(1){C=H+1.0;r=D+2.0;I=C*+(k|0);J=F*r-n*I;K=G*r-E*I;if(K!=0.0){L=J/K;I=L*1.1920928955078125e-7;if(+P(+(m-L))>(I>1.1920928955078125e-7?1.1920928955078125e-7:I)){M=L}else{break}}else{M=m}if(+P(+J)<3.4028234663852886e+38){N=K;O=J;Q=G;R=F}else{N=K/3.4028234663852886e+38;O=J/3.4028234663852886e+38;Q=G/3.4028234663852886e+38;R=F/3.4028234663852886e+38}q=k+1|0;if((q|0)<201){D=r;k=q;n=R;E=Q;F=O;G=N;H=C;m=M}else{break L12007}}S=1.0-s*w*L}else{x=s;y=0;z=1.0;A=1.0;B=8809}}while(0);if((B|0)==8809){while(1){B=0;if((y|0)>=201){break L12007}m=x+1.0;H=A*(p/m);T=z+H;if(H<T*1.1920928955078125e-7){break}else{x=m;y=y+1|0;z=T;A=H;B=8809}}S=w*T}if(S==-1.0){break L12007}else{u=S}}}while(0);h[f>>3]=u;k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=k+1|0;c[6354]=q;k=14296+(q*24&-1)|0;c[k>>2]=2;c[k+4>>2]=l;h[14304+(q*24&-1)>>3]=u;h[14312+(q*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;c[f>>2]=0;B=c[6354]|0;if((B|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=B+1|0;c[6354]=y;B=14296+(y*24&-1)|0;c[B>>2]=1;c[B+4>>2]=l;h[14304+(y*24&-1)>>3]=+h[f>>3];h[14312+(y*24&-1)>>3]=t;i=b;return}function ki(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;b=i;i=i+16|0;d=b|0;e=b+8|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-1;g=14296+(f*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(f*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[e>>3]=l;n=+h[14312+(f*24&-1)>>3];f=m;m=f;do{if((j|0)==3){o=+uz(m,d);g=(m|0)==(c[d>>2]|0);uu(m);if(g){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=o;p=o;q=0.0;break}}else{if((j|0)==1){p=+(f|0);q=n;break}else if((j|0)==2){p=l;q=n;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);n=+b2(+p);if(n>709.1962086421661){a[1960]=1;c[e>>2]=0;j=c[6354]|0;if((j|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=j+1|0;c[6354]=f;j=14296+(f*24&-1)|0;c[j>>2]=1;c[j+4>>2]=k;h[14304+(f*24&-1)>>3]=+h[e>>3];h[14312+(f*24&-1)>>3]=q;i=b;return}q=+(c[aH()>>2]|0);if(n<-706.893623549172){r=0.0}else{r=+Z(+n)}n=q*r;h[e>>3]=n;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=2;c[e+4>>2]=k;h[14304+(f*24&-1)>>3]=n;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+b2(+m);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kk(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0,w=0.0,x=0,y=0,z=0,A=0,B=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=n;q=0.0;r=2;s=c[k>>2]|0;t=n;break}}else{if((g|0)==2){p=l;q=m;r=2;s=e;t=l;break}else if((g|0)==1){p=+(e|0);q=m;r=1;s=e;t=l;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(p!=0.0){if((r|0)==2){u=8870;break}else if((r|0)==1){w=+(s|0);x=0;y=s;u=8871;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{if((r|0)==2){if(q!=0.0){u=8870;break}}else if((r|0)!=1){uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(!(a[27800]|0)){u=8886;break}z=c[6948]|0;A=c[6946]|0}}while(0);if((u|0)==8870){w=t;x=~~q;y=~~t;u=8871}L12113:do{if((u|0)==8871){if(w!=+(y|0)){uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((r|0)==1){B=0.0}else if((r|0)==2){B=q}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(B!=+(x|0)){uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((y|0)<1){if((x|0)!=0){uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)>=0){break}a[27800]=0;u=8886;break L12113}else{if((x|0)>=0){break}uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[6948]=y;s=(x|0)!=0?x:y;c[6946]=s;a[27800]=1;z=y;A=s}}while(0);if((u|0)==8886){a[27800]=1;c[6948]=1234567890;c[6946]=1234567890;z=1234567890;A=1234567890}u=(z|0)/53668&-1;y=(((u*-53668&-1)+z|0)*40014&-1)+(u*-12211&-1)|0;u=(y|0)<0?y+2147483563|0:y;c[6948]=u;y=(A|0)/52774&-1;z=(((y*-52774&-1)+A|0)*40692&-1)+(y*-3791&-1)|0;y=(z|0)<0?z+2147483399|0:z;c[6946]=y;z=u-y|0;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=y+1|0;c[6354]=u;y=14296+(u*24&-1)|0;c[y>>2]=2;c[y+4>>2]=j;h[14304+(u*24&-1)>>3]=+(((z|0)<1?z+2147483562|0:z)|0)*4.656613057e-10;h[14312+(u*24&-1)>>3]=0.0;i=b;return}}function kl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;a=i;i=i+400|0;b=a|0;d=a+48|0;e=a+96|0;f=a+144|0;g=a+192|0;j=a+240|0;k=a+288|0;l=a+336|0;m=a+384|0;n=a+392|0;o=c[6354]|0;if((o|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=o-1|0;c[6354]=p;q=c[14296+(o*24&-1)>>2]|0;r=14304+(o*24&-1)|0;s=+h[r>>3];o=c[r>>2]|0;r=o;do{if((q|0)==3){t=+uz(r,n);u=(r|0)==(c[n>>2]|0);uu(r);if(u){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=t;x=c[6354]|0;break}}else{if((q|0)==2){w=s;x=p;break}else if((q|0)==1){w=+(o|0);x=p;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((x|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=x-1;p=14296+(x*24&-1)|0;o=c[p>>2]|0;q=c[p+4>>2]|0;p=14304+(x*24&-1)|0;s=+h[p>>3];x=c[p>>2]|0;p=x;do{if((o|0)==3){t=+uz(p,m);r=(p|0)==(c[m>>2]|0);uu(p);if(!r){y=t;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((o|0)==1){y=+(x|0);break}else if((o|0)==2){y=s;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);s=w*w;t=w*.56418958;z=+P(+y);A=z*z;do{if(w<70.55){B=+Q(+(w*(40.0-w*3.6)+15100.0));if(w<8.425){C=+Q(+(164.0-w*(w*1.8+4.3)))}else{C=0.0}D=w*18.1+1.65;o=w>1.0e-6;if(z>=B){E=t/(s+A);break}if(z>=(o?C:B)){F=s+.5;E=(F+A)*w*(.56418958/(F*F+A*(s+s+-1.0+A)));break}if(z>(o?6.8-w:B)){B=s*4.0;F=B+-6.0;E=(s*(s*(s+5.5)+8.25)+1.875+A*(s*(s*3.0+1.0)+5.25+A*(F*.75+A)))*w*(.56418958/(s*(s*(s*(s+6.0)+10.5)+4.5)+.5625+A*(s*(s*(B+6.0)+9.0)-4.5+A*(10.5-s*(6.0-s*6.0)+A*(F+A)))));break}if(z<w*2.4){F=w*5.0;B=w*10.0;G=w*.3183291;E=(w*(w*(w*(w*(w*(w*(w*(w*(G+4.264678)+27.93941)+115.3772)+328.2151)+662.8097)+946.897)+919.4955)+549.3954)+153.5168+A*(w*(w*(w*(w*(w*(w*(w*1.2733163+12.79458)+56.81652)+139.4665)+189.773)+124.5975)-1.322256)-34.16955+A*(w*(w*(w*(w*(w*1.9099744+12.79568)+29.81482)+24.01655)+10.46332)+2.584042+A*(w*(w*(w*1.273316+4.266322)+.9377051)+-.07272979+(G+.0005480304)*A))))*(1.7724538/(w*(w*(w*(w*(w*(w*(w*(w*(w*(w+13.3988)+88.26741)+369.1989)+1074.409)+2256.981)+3447.629)+3764.966)+2802.87)+1280.829)+272.1014+A*(w*(w*(w*(w*(w*(w*(w*(F+53.59518)+266.2987)+793.4273)+1549.675)+2037.31)+1758.336)+902.3066)+211.678+A*(w*(w*(w*(w*(w*(B+80.39278)+269.2916)+479.2576)+497.3014)+308.1852)+78.86585+A*(w*(w*(w*(B+53.59518)+92.75679)+55.02933)+22.03523+A*(w*(F+13.3988)+1.49646+A))))));break}F=w+1.5;B=F*F;o=0;do{G=+h[37496+(o<<3)>>3];H=y-G;I=H*H;h[e+(o<<3)>>3]=I;J=1.0/(B+I);h[b+(o<<3)>>3]=J;h[g+(o<<3)>>3]=J*H;h[j+(o<<3)>>3]=F*J;J=y+G;G=J*J;h[f+(o<<3)>>3]=G;H=1.0/(B+G);h[d+(o<<3)>>3]=H;h[k+(o<<3)>>3]=J*H;h[l+(o<<3)>>3]=F*H;o=o+1|0;}while((o|0)<6);if(z<=D){E=(+h[j>>3]+ +h[l>>3])*1.0117281-(+h[g>>3]- +h[k>>3])*1.393237+0.0+((+h[j+8>>3]+ +h[l+8>>3])*-.75197147-(+h[g+8>>3]- +h[k+8>>3])*.23115241)+((+h[j+16>>3]+ +h[l+16>>3])*.012557727-(+h[g+16>>3]- +h[k+16>>3])*-.15535147)+((+h[j+24>>3]+ +h[l+24>>3])*.010022008-(+h[g+24>>3]- +h[k+24>>3])*.0062183662)+((+h[j+32>>3]+ +h[l+32>>3])*-.00024206814-(+h[g+32>>3]- +h[k+32>>3])*91908299.0e-12)+((+h[j+40>>3]+ +h[l+40>>3])*5.0084806e-7-(+h[g+40>>3]- +h[k+40>>3])*-6.2752596e-7);break}F=w+3.0;B=0.0;o=0;do{H=+h[37592+(o<<3)>>3];J=+h[e+(o<<3)>>3];G=F*+h[37544+(o<<3)>>3];I=+h[f+(o<<3)>>3];B=B+((H*(J*+h[b+(o<<3)>>3]- +h[j+(o<<3)>>3]*1.5)+G*+h[g+(o<<3)>>3])/(J+2.25)+(H*(I*+h[d+(o<<3)>>3]- +h[l+(o<<3)>>3]*1.5)-G*+h[k+(o<<3)>>3])/(I+2.25));o=o+1|0;}while((o|0)<6);E=w*B+ +Z(+(-0.0-A))}else{E=t/(s+A)}}while(0);k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=k+1|0;c[6354]=l;k=14296+(l*24&-1)|0;c[k>>2]=2;c[k+4>>2]=q;h[14304+(l*24&-1)>>3]=E;h[14312+(l*24&-1)>>3]=0.0;i=a;return}}function km(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+bu(+(-0.0-m*.7071067811865476));d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j*.5;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kn(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){l=+uz(f,d);m=(f|0)==(c[d>>2]|0);uu(f);if(!m){n=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){n=k;break}else if((g|0)==1){n=+(e|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(n<=0.0|n>=1.0){a[1960]=1;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e+1|0;c[6354]=g;e=14296+(g*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;uE(14304+(g*24&-1)|0,0,16);i=b;return}do{if(n>0.0){if(n>=1.0){bD(75808,(v=i,i=i+8|0,c[v>>2]=205976,v)|0);bD(223272,(v=i,i=i+8|0,c[v>>2]=133496,v)|0);o=1.7976931348623157e+308;break}if(n>.8646647167633873){p=0;q=1.0-n}else{p=1;q=n}if(q>.1353352832366127){k=q+-.5;l=k*k;o=(k+k*(l*(l*(l*(l*(l*-59.96335010141079+98.00107541859997)-56.67628574690703)+13.931260938727968)-1.2391658386738125)/(l*(l*(l*(l*(l*(l*(l*(l+1.9544885833814176)+4.676279128988815)+86.36024213908905)-225.46268785411937)+200.26021238006066)-82.03722561683334)+15.90562251262117)-1.1833162112133)))*2.5066282746310007;break}l=+Q(+(+_(+q)*-2.0));k=l- +_(+l)/l;r=1.0/l;if(l<8.0){s=r*(r*(r*(r*(r*(r*(r*(r*(r*4.0554489230596245+31.525109459989388)+57.16281922464213)+44.08050738932008)+14.684956192885803)+2.1866330685079025)+-.1402560791713545)+-.03504246268278482)+-.0008574567851546854)/(r*(r*(r*(r*(r*(r*(r*(r+15.779988325646675)+45.39076351288792)+41.3172038254672)+15.04253856929075)+2.504649462083094)+-.14218292285478779)+-.03808064076915783)+-.0009332594808954574)}else{s=r*(r*(r*(r*(r*(r*(r*(r*(r*3.2377489177694603+6.915228890689842)+3.9388102529247444)+1.3330346081580755)+.20148538954917908)+.012371663481782003)+.00030158155350823543)+26580697468673755.0e-22)+6.239745391849833e-9)/(r*(r*(r*(r*(r*(r*(r*(r+6.02427039364742)+3.6798356385616087)+1.3770209948908132)+.21623699359449663)+.013420400608854318)+.00032801446468212774)+28924786474538068.0e-22)+6.790194080099813e-9)}r=k-s;if((p|0)==0){o=r;break}o=-0.0-r}else{bD(75808,(v=i,i=i+8|0,c[v>>2]=205976,v)|0);bD(223272,(v=i,i=i+8|0,c[v>>2]=133496,v)|0);o=-1.7976931348623157e+308}}while(0);p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=p+1|0;c[6354]=g;p=14296+(g*24&-1)|0;c[p>>2]=2;c[p+4>>2]=j;h[14304+(g*24&-1)>>3]=o;h[14312+(g*24&-1)>>3]=0.0;i=b;return}function ko(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){l=+uz(f,d);m=(f|0)==(c[d>>2]|0);uu(f);if(!m){n=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){n=k;break}else if((g|0)==1){n=+(e|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(+P(+n)>=1.0){a[1960]=1;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e+1|0;c[6354]=g;e=14296+(g*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;uE(14304+(g*24&-1)|0,0,16);i=b;return}do{if(n<-1.0|n>1.0){bD(137432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);o=+_(-1.0)}else{if(n==-1.0|n==1.0){o=+_(0.0)*(-0.0-n);break}do{if(n>-1.0&n<-.7){k=+Q(+(-0.0- +_(+((n+1.0)*.5))));p=(-0.0-(k*(k*(k*1.641345311+3.429567803)-1.624906493)-1.970840454))/(k*(k*1.6370678+3.5438892)+1.0)}else{if(!(n<-.7|n>.7)){k=n*n;p=n*(k*(k*(k*-.140543331+.914624893)-1.645349621)+.886226899)/(k*(k*(k*(k*.012229801+.012229801)+1.442710462)-2.118377725)+1.0);break}if(!(n>.7&n<1.0)){p=0.0;break}k=+Q(+(-0.0- +_(+((1.0-n)*.5))));p=(k*(k*(k*1.641345311+3.429567803)-1.624906493)-1.970840454)/(k*(k*1.6370678+3.5438892)+1.0)}}while(0);k=+b3(+p)-n;l=p*(-0.0-p);if(l<-706.893623549172){q=0.0}else{q=+Z(+l)*1.1283791670955126}l=p-k/q;k=+b3(+l)-n;r=l*(-0.0-l);if(r<-706.893623549172){s=0.0}else{s=+Z(+r)*1.1283791670955126}r=l-k/s;k=+b3(+r)-n;l=r*(-0.0-r);if(l<-706.893623549172){t=0.0}else{t=+Z(+l)*1.1283791670955126}l=r-k/t;k=+b3(+l)-n;r=l*(-0.0-l);if(r<-706.893623549172){u=0.0}else{u=+Z(+r)*1.1283791670955126}o=l-k/u}}while(0);g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=g+1|0;c[6354]=e;g=14296+(e*24&-1)|0;c[g>>2]=2;c[g+4>>2]=j;h[14304+(e*24&-1)>>3]=o;h[14312+(e*24&-1)>>3]=0.0;i=b;return}function kp(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){l=+uz(f,d);m=(f|0)==(c[d>>2]|0);uu(f);if(!m){n=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){n=k;break}else if((g|0)==1){n=+(e|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);L12315:do{if(n<-.36787944117144233){o=-1.0;p=9032}else{if(+P(+n)>1.1920928955078125e-7){if(n<1.0){k=+Q(+((n*2.718281828459045+1.0)*2.0));q=k+-1.0-k*k/3.0+k*k*k*.1527777777777778}else{q=+_(+n)}if(n>3.0){r=0;s=q- +_(+q)}else{r=0;s=q}while(1){if((r|0)>=20){o=-1.0;p=9032;break L12315}if(s<-706.893623549172){t=0.0}else{t=+Z(+s)}k=s*t-n;l=s+1.0;u=k/(l*t-(s+2.0)*.5*k/l);l=s-u;k=+P(+u);if(k<(+P(+l)+1.0)*1.1920928955078125e-7){w=l;break}else{r=r+1|0;s=l}}}else{w=n}if(w>-1.0){x=w}else{o=w;p=9032}}}while(0);if((p|0)==9032){a[1960]=1;x=o}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{r=p+1|0;c[6354]=r;p=14296+(r*24&-1)|0;c[p>>2]=2;c[p+4>>2]=j;h[14304+(r*24&-1)>>3]=x;h[14312+(r*24&-1)>>3]=0.0;i=b;return}}function kq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+P(+m);k=+R(+j,3.0);if(m<0.0){n=+Q(+(k+.37));o=+R(+j,1.5)*.6666666666666666;j=n*.3989422;p=(j+-.043883564)*+S(+o);q=p/+R(+n,1.1666666666666667)+0.0;p=m*(-.013883003-j)*+T(+o);r=q+p/(o*+R(+n,.8333333333333334)*1.5)}else{n=+Q(+(k+.0425));k=(n*.326662423+-.002800908)/+R(+n,1.1666666666666667)+0.0;o=k+m*(-.007232251-n*.044567423)/+R(+n,1.8333333333333333);r=o*+Z(+(n*-.6666666666666666))}d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kr(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0;d=a+b;e=+b2(+d);f=e+ +_(+c)*a;e=f+ +_(+(1.0-c))*b;f=e- +b2(+(a+1.0));e=f- +b2(+b);if(e<-706.893623549172){g=1.0;h=1.0;i=0.0;j=0.0;k=0.0;l=0;m=1}else{f=+Z(+e);g=1.0;h=1.0;i=f;j=f;k=0.0;l=0;m=1}while(1){f=+(m|0);e=+(l|0);n=e+(f+a);o=(d+e)*(-0.0-(e+a))*c/n/(n+-1.0);e=f*(b-f)*c/n/(n+1.0);n=j+k*o;f=g+h*o;o=n+j*e;p=f+g*e;e=+P(+p)<1.1920928955078125e-7?0.0:p;if(e!=0.0){p=o/e;q=+P(+(p-i));if(q<+P(+p)*1.1920928955078125e-7){r=p;s=9057;break}else{t=p}}else{t=i}u=l+1|0;if((u|0)<201){g=e;h=f;i=t;j=o;k=n;l=u;m=m+1|0}else{r=-1.0;s=9056;break}}if((s|0)==9056){return+r}else if((s|0)==9057){return+r}return 0.0}function ks(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;k=c[14296+(g*24&-1)>>2]|0;l=14304+(g*24&-1)|0;m=+h[l>>3];g=c[l>>2]|0;l=g;do{if((k|0)==3){n=+uz(l,f);o=(l|0)==(c[f>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=n;q=c[6354]|0;break}}else{if((k|0)==1){p=+(g|0);q=j;break}else if((k|0)==2){p=m;q=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;j=14296+(q*24&-1)|0;k=c[j>>2]|0;g=c[j+4>>2]|0;j=14304+(q*24&-1)|0;m=+h[j>>3];q=c[j>>2]|0;j=q;do{if((k|0)==3){n=+uz(j,e);l=(j|0)==(c[e>>2]|0);uu(j);if(!l){r=n;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((k|0)==2){r=m;break}else if((k|0)==1){r=+(q|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(r<0.0|p<0.0){s=-1.0;t=9095}else{if(+bj(+r,d|0)!=0.0){s=-1.0;t=9095;break}q=p==0.0;if(q&r<2.0){s=-1.0;t=9095;break}do{if(r==0.0){u=+Z(+(-0.0-p))/p}else{if(q){u=1.0/(r+-1.0);break}if(p>3.0){m=1.0;n=1.0;w=p;x=0.0;y=1.0;k=0;while(1){z=r+ +(k|0);A=x*z+m;B=w+z*n;j=k+1|0;z=+(j|0);C=z*m+p*A;D=z*w+p*B;E=C/D;if(E==y){break}if(D<3.4028234663852886e+38){F=A;G=D;H=B;I=C}else{F=A/3.4028234663852886e+38;G=D/3.4028234663852886e+38;H=B/3.4028234663852886e+38;I=C/3.4028234663852886e+38}if((j|0)<333){m=I;n=H;w=G;x=F;y=E;k=j}else{break}}u=E*+Z(+(-0.0-p));break}y=-.5772156649015329- +_(+p);x=0.0;w=1.0;k=1;while(1){n=+(k|0);m=p*(-0.0-w)/n;J=y-m/n;if(J==x){break}j=k+1|0;if((j|0)<333){y=J;x=J;w=m;k=j}else{break}}if(r<=1.0){u=J;break}w=+Z(+(-0.0-p));x=J;y=1.0;while(1){m=(w-p*x)/y;n=y+1.0;if(n<r){x=m;y=n}else{u=m;break}}}}while(0);if(u>-1.0){K=u}else{s=u;t=9095}}}while(0);if((t|0)==9095){a[1960]=1;K=s}t=c[6354]|0;if((t|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{d=t+1|0;c[6354]=d;t=14296+(d*24&-1)|0;c[t>>2]=2;c[t+4>>2]=g;h[14304+(d*24&-1)>>3]=K;h[14312+(d*24&-1)>>3]=0.0;i=b;return}}function kt(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(d*24&-1)|0;k=+h[f>>3];d=c[f>>2]|0;f=d;do{if((g|0)==3){l=+uz(f,b);m=(f|0)==(c[b>>2]|0);uu(f);if(m){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{n=l;o=c[6354]|0;break}}else{if((g|0)==1){n=+(d|0);o=e;break}else if((g|0)==2){n=k;o=e;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{e=o+1|0;c[6354]=e;o=14296+(e*24&-1)|0;c[o>>2]=2;c[o+4>>2]=j;h[14304+(e*24&-1)>>3]=n;h[14312+(e*24&-1)>>3]=0.0;i=a;return}}function ku(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=c[14304+(d*24&-1)>>2]|0;do{if((g|0)==3){uz(f,b);k=(f|0)==(c[b>>2]|0);uu(f);if(k){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=0.0;m=c[6354]|0;n=9118;break}}else{if((g|0)==2){l=+h[14312+(d*24&-1)>>3];m=e;n=9118;break}else if((g|0)==1){o=0.0;p=e;break}uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((n|0)==9118){o=l;p=m}if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{m=p+1|0;c[6354]=m;p=14296+(m*24&-1)|0;c[p>>2]=2;c[p+4>>2]=j;h[14304+(m*24&-1)>>3]=o;h[14312+(m*24&-1)>>3]=0.0;i=a;return}}function kv(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0.0,s=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(d*24&-1)|0;k=+h[f>>3];l=+h[14312+(d*24&-1)>>3];d=c[f>>2]|0;f=d;do{if((g|0)==3){m=+uz(f,b);n=(f|0)==(c[b>>2]|0);uu(f);if(n){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=m;p=c[6354]|0;q=9132;break}}else{if((g|0)==1){r=(d|0)>-1?0.0:3.141592653589793;s=e;break}else if((g|0)==2){if(l==0.0){o=k;p=e;q=9132;break}r=+Y(+l,+k);s=e;break}else{uf(-1,210664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9132){r=o<0.0?3.141592653589793:0.0;s=p}if((s|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=r/+h[9040];p=s+1|0;c[6354]=p;s=14296+(p*24&-1)|0;c[s>>2]=2;c[s+4>>2]=j;h[14304+(p*24&-1)>>3]=o;h[14312+(p*24&-1)>>3]=0.0;i=a;return}}function kw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(d*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;f=l;do{if((g|0)==3){m=+uz(f,b);n=(f|0)==(c[b>>2]|0);uu(f);if(n){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=0.0;p=m;q=c[6354]|0;break}}else{if((g|0)==2){o=+h[14312+(d*24&-1)>>3];p=k;q=e;break}else if((g|0)==1){o=0.0;p=+(l|0);q=e;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{e=q+1|0;c[6354]=e;q=14296+(e*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(e*24&-1)>>3]=p;h[14312+(e*24&-1)>>3]=-0.0-o;i=a;return}}function kx(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(m){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{n=0.0;o=+h[9040];p=l;q=9159;break}}else{l=+h[9040];if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=l;p=j;q=9159;break}else if((f|0)==1){r=+(k|0);s=+T(+(l*r));t=s*+a4(+(l*0.0));l=+h[9040];u=0.0;w=t;x=l;y=l*r;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9159){j=+T(+(o*p));r=j*+a4(+(n*o));o=+h[9040];u=n;w=r;x=o;y=o*p}p=+bz(+(x*u));q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=+S(+y)*p;k=q+1|0;c[6354]=k;q=14296+(k*24&-1)|0;c[q>>2]=2;c[q+4>>2]=g;h[14304+(k*24&-1)>>3]=w;h[14312+(k*24&-1)>>3]=u;i=a;return}}function ky(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(m){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{n=0.0;o=+h[9040];p=l;q=9172;break}}else{l=+h[9040];if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=l;p=j;q=9172;break}else if((f|0)==1){r=+(k|0);s=+S(+(l*r));t=s*+a4(+(l*0.0));l=+h[9040];u=0.0;w=t;x=l;y=l*r;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9172){j=+S(+(o*p));r=j*+a4(+(n*o));o=+h[9040];u=n;w=r;x=o;y=o*p}p=+bz(+(x*u));q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=p*(-0.0- +T(+y));k=q+1|0;c[6354]=k;q=14296+(k*24&-1)|0;c[q>>2]=2;c[q+4>>2]=g;h[14304+(k*24&-1)>>3]=w;h[14312+(k*24&-1)>>3]=u;i=a;return}}function kz(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0,w=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=+h[14312+(e*24&-1)>>3];e=c[g>>2]|0;g=e;do{if((j|0)==3){n=+uz(g,d);o=(g|0)==(c[d>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=n;q=+h[9040];r=c[6354]|0;break}}else{if((j|0)==1){p=+(e|0);q=+h[9040];r=f;break}else if((j|0)==2){n=+h[9040];if(m==0.0){p=l;q=n;r=f;break}s=n*2.0;n=+S(+(s*l));t=n+ +a4(+(m*s));if(t==0.0){a[1960]=1;o=c[6354]|0;if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=o+1|0;c[6354]=u;o=14296+(u*24&-1)|0;c[o>>2]=2;c[o+4>>2]=k;h[14304+(u*24&-1)>>3]=l;h[14312+(u*24&-1)>>3]=m;i=b;return}else{s=+h[9040]*2.0;n=+bz(+(m*s));u=c[6354]|0;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=+T(+(s*l))/t;o=u+1|0;c[6354]=o;u=14296+(o*24&-1)|0;c[u>>2]=2;c[u+4>>2]=k;h[14304+(o*24&-1)>>3]=w;h[14312+(o*24&-1)>>3]=n/t;i=b;return}}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=+U(+(q*p));f=r+1|0;c[6354]=f;r=14296+(f*24&-1)|0;c[r>>2]=2;c[r+4>>2]=k;h[14304+(f*24&-1)>>3]=l;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function kA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=+h[14312+(d*24&-1)>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=l;o=0.0;p=9209;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==1){n=+(d|0);o=0.0;p=9209;break}else if((f|0)==2){if(k==0.0){n=j;o=k;p=9209;break}else{q=j;r=k;break}}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((p|0)==9209){if(+P(+n)>1.0){q=n;r=o;break}f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=+h[9040];j=+W(+n)/k;d=f+1|0;c[6354]=d;f=14296+(d*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(d*24&-1)>>3]=j;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}while(0);if(q==0.0){p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=+h[9040];o=(-0.0- +_(+(+Q(+(r*r+1.0))-r)))/n;d=p+1|0;c[6354]=d;p=14296+(d*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(d*24&-1)>>3]=0.0;h[14312+(d*24&-1)>>3]=o;i=a;return}else{o=q+1.0;n=r*r;j=+Q(+(n+o*o))*.5;o=q+-1.0;q=+Q(+(n+o*o))*.5;o=j-q;n=j+q;q=+h[9040];d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+W(+(o>1.0?1.0:o))/q;o=(r>=0.0?1.0:-1.0)*+_(+(n+ +Q(+(n*n+-1.0))))/q;p=d+1|0;c[6354]=p;d=14296+(p*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(p*24&-1)>>3]=j;h[14312+(p*24&-1)>>3]=o;i=a;return}}function kB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=+h[14312+(d*24&-1)>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=l;o=0.0;p=9233;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){if(k==0.0){n=j;o=k;p=9233;break}else{q=j;r=k;break}}else if((f|0)==1){n=+(d|0);o=0.0;p=9233;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((p|0)==9233){if(+P(+n)>1.0){q=n;r=o;break}d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=+h[9040];j=+V(+n)/k;f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}while(0);n=q+1.0;o=r*r;j=+Q(+(o+n*n))*.5;n=q+-1.0;q=+Q(+(o+n*n))*.5;n=j+q;o=j-q;do{if(o>1.0){s=1.0}else{if(o>=-1.0){s=o;break}s=-1.0}}while(0);o=+h[9040];p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=+V(+s)/o;s=+_(+(n+ +Q(+(n*n+-1.0))))*(-0.0-(r>=0.0?1.0:-1.0))/o;f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=q;h[14312+(f*24&-1)>>3]=s;i=a;return}function kC(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=14312+(e*24&-1)|0;p=+h[o>>3];q=c[m>>2]|0;r=q;do{if((k|0)==3){s=+uz(r,d);t=(r|0)==(c[d>>2]|0);uu(r);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=s;w=c[6354]|0;break}}else{if((k|0)==2){if(p==0.0){u=n;w=f;break}do{if(n==0.0){if(+P(+p)<1.0){break}a[1960]=1;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=2;c[l>>2]=g;uE(m|0,0,16);i=b;return}}while(0);if(n<0.0){x=-0.0-p;y=-0.0-n}else{x=p;y=n}s=y*y;z=+X(+(y*2.0/(1.0-s-x*x)));A=x+1.0;B=x+-1.0;C=+_(+((s+A*A)/(s+B*B)))*.25;if(z<0.0){D=z+3.141592653589793}else{D=z}if(n<0.0){E=-0.0-D;F=-0.0-C}else{E=D;F=C}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}C=E*.5/+h[9040];c[6354]=e;c[j>>2]=2;c[l>>2]=g;h[m>>3]=C;h[o>>3]=F;i=b;return}else if((k|0)==1){u=+(q|0);w=f;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=+h[9040];E=+X(+u)/F;f=w+1|0;c[6354]=f;w=14296+(f*24&-1)|0;c[w>>2]=2;c[w+4>>2]=g;h[14304+(f*24&-1)>>3]=E;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function kD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;k=c[14296+(g*24&-1)>>2]|0;l=14304+(g*24&-1)|0;m=+h[l>>3];g=c[l>>2]|0;h[f>>3]=m;l=g;g=l;do{if((k|0)==3){n=+uz(g,e);o=(g|0)==(c[e>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=n;p=n;q=c[6354]|0;break}}else{if((k|0)==2){p=m;q=j;break}else if((k|0)==1){p=+(l|0);q=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;j=14296+(q*24&-1)|0;l=c[j>>2]|0;k=c[j+4>>2]|0;j=14304+(q*24&-1)|0;m=+h[j>>3];g=c[j>>2]|0;h[f>>3]=m;n=+h[14312+(q*24&-1)>>3];q=g;g=q;do{if((l|0)==3){r=+uz(g,d);j=(g|0)==(c[d>>2]|0);uu(g);if(j){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=r;s=r;t=0.0;break}}else{if((l|0)==2){s=m;t=n;break}else if((l|0)==1){s=+(q|0);t=n;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(p==0.0&s==0.0){a[1960]=1;c[f>>2]=0;q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=q+1|0;c[6354]=l;q=14296+(l*24&-1)|0;c[q>>2]=1;c[q+4>>2]=k;h[14304+(l*24&-1)>>3]=+h[f>>3];h[14312+(l*24&-1)>>3]=t;u=l;break}}else{u=c[6354]|0}}while(0);t=+Y(+s,+p);p=t/+h[9040];h[f>>3]=p;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=u+1|0;c[6354]=f;u=14296+(f*24&-1)|0;c[u>>2]=2;c[u+4>>2]=k;h[14304+(f*24&-1)>>3]=p;h[14312+(f*24&-1)>>3]=0.0;i=b;return}}function kE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;p=9311;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=+h[14312+(d*24&-1)>>3];if((f|0)==1){q=+(k|0);r=+bz(+q);s=0.0;t=r;u=+a4(+q);break}else if((f|0)==2){n=l;o=j;p=9311;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((p|0)==9311){j=+bz(+o);l=j*+S(+n);s=n;t=l;u=+a4(+o)}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=u*+T(+s);f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=t;h[14312+(f*24&-1)>>3]=o;i=a;return}}function kF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;p=9323;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=+h[14312+(d*24&-1)>>3];if((f|0)==1){q=+(k|0);r=+a4(+q);s=0.0;t=r;u=+bz(+q);break}else if((f|0)==2){n=l;o=j;p=9323;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((p|0)==9323){j=+a4(+o);l=j*+S(+n);s=n;t=l;u=+bz(+o)}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=u*+T(+s);f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=t;h[14312+(f*24&-1)>>3]=o;i=a;return}}function kG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=j;break}else if((f|0)==1){n=0.0;o=+(k|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=o*2.0;o=n*2.0;if(+P(+j)>706.893623549172){k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=k+1|0;c[6354]=f;k=14296+(f*24&-1)|0;c[k>>2]=2;c[k+4>>2]=g;h[14304+(f*24&-1)>>3]=j<0.0?-1.0:1.0;h[14312+(f*24&-1)>>3]=0.0;i=a;return}else{n=+a4(+j);l=n+ +S(+o);n=+bz(+j);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+T(+o)/l;k=f+1|0;c[6354]=k;f=14296+(k*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(k*24&-1)>>3]=n/l;h[14312+(k*24&-1)>>3]=j;i=a;return}}function kH(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;f=l;do{if((g|0)==3){m=+uz(f,d);n=(f|0)==(c[d>>2]|0);uu(f);if(!n){o=0.0;p=m;q=9353;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){o=+h[14312+(e*24&-1)>>3];p=k;q=9353;break}else if((g|0)==1){r=+(l|0);s=0.0;t=-0.0;break}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9353){r=p;s=o;t=-0.0-o}if(r==0.0){q=+P(+t)>1.0;l=c[6354]|0;g=(l|0)==249;if(q){if(g){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=l+1|0;c[6354]=q;e=14296+(q*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;uE(14304+(q*24&-1)|0,0,16);a[1960]=1;i=b;return}else{if(g){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=+h[9040];p=(-0.0- +W(+t))/o;g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=2;c[l+4>>2]=j;h[14304+(g*24&-1)>>3]=0.0;h[14312+(g*24&-1)>>3]=p;i=b;return}}else{if(s==-0.0){g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=r+ +Q(+(r*r+1.0));o=+h[9040];t=+_(+p)/o;l=g+1|0;c[6354]=l;g=14296+(l*24&-1)|0;c[g>>2]=2;c[g+4>>2]=j;h[14304+(l*24&-1)>>3]=t;h[14312+(l*24&-1)>>3]=0.0;i=b;return}else{t=1.0-s;o=r*r;p=+Q(+(t*t+o))*.5;t=-1.0-s;s=+Q(+(t*t+o))*.5;o=p+s;t=+h[9040];l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=(r>=0.0?1.0:-1.0)*+_(+(+Q(+(o*o+-1.0))+o))/t;o=(-0.0- +W(+(p-s)))/t;g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=2;c[l+4>>2]=j;h[14304+(g*24&-1)>>3]=k;h[14312+(g*24&-1)>>3]=o;i=b;return}}}function kI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f|0;j=c[g>>2]|0;k=f+4|0;f=c[k>>2]|0;l=14304+(d*24&-1)|0;m=+h[l>>3];n=14312+(d*24&-1)|0;o=+h[n>>3];p=c[l>>2]|0;q=p;do{if((j|0)==3){r=+uz(q,b);s=(q|0)==(c[b>>2]|0);uu(q);if(!s){t=r;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((j|0)==2){if(o==0.0){t=m;break}r=m+1.0;u=o*o;w=+Q(+(u+r*r))*.5;r=m+-1.0;x=+Q(+(u+r*r))*.5;r=w+x;u=+h[9040];if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=+_(+(+Q(+(r*r+-1.0))+r))/u;r=(o<0.0?-1.0:1.0)*+V(+(w-x))/u;c[6354]=d;c[g>>2]=2;c[k>>2]=f;h[l>>3]=y;h[n>>3]=r;i=a;return}else if((j|0)==1){t=+(p|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);p=+P(+t)>1.0;j=c[6354]|0;n=(j|0)==249;if(p){if(n){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=t+ +Q(+(t*t+-1.0));m=+h[9040];r=+_(+o)/m;p=j+1|0;c[6354]=p;l=14296+(p*24&-1)|0;c[l>>2]=2;c[l+4>>2]=f;h[14304+(p*24&-1)>>3]=r;h[14312+(p*24&-1)>>3]=0.0;i=a;return}else{if(n){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=+h[9040];m=+V(+t)/r;n=j+1|0;c[6354]=n;j=14296+(n*24&-1)|0;c[j>>2]=2;c[j+4>>2]=f;h[14304+(n*24&-1)>>3]=0.0;h[14312+(n*24&-1)>>3]=m;i=a;return}}function kJ(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;f=l;do{if((g|0)==3){m=+uz(f,d);n=(f|0)==(c[d>>2]|0);uu(f);if(!n){o=0.0;p=m;q=9405;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){o=+h[14312+(e*24&-1)>>3];p=k;q=9405;break}else if((g|0)==1){r=+(l|0);s=0.0;t=-0.0;break}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9405){r=p;s=o;t=-0.0-o}if(r==0.0){q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=+h[9040];p=(-0.0- +X(+t))/o;l=q+1|0;c[6354]=l;q=14296+(l*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(l*24&-1)>>3]=0.0;h[14312+(l*24&-1)>>3]=p;i=b;return}do{if(s==-0.0){if(+P(+r)<1.0){break}a[1960]=1;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=l+1|0;c[6354]=q;l=14296+(q*24&-1)|0;c[l>>2]=2;c[l+4>>2]=j;uE(14304+(q*24&-1)|0,0,16);i=b;return}}while(0);if(s>-0.0){u=-0.0-r;w=s}else{u=r;w=t}t=w*w;r=+X(+(w*2.0/(1.0-t-u*u)));w=u+1.0;p=u+-1.0;u=+_(+((t+w*w)/(t+p*p)))*.25;if(r<0.0){x=r+3.141592653589793}else{x=r}if(s>-0.0){y=-0.0-x;z=-0.0-u}else{y=x;z=u}q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=y*-.5/+h[9040];l=q+1|0;c[6354]=l;q=14296+(l*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(l*24&-1)>>3]=z;h[14312+(l*24&-1)>>3]=u;i=b;return}function kK(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=c[k>>2]|0;r=n;s=9435;break}}else{if((g|0)==2){p=m;q=e;r=l;s=9435;break}else if((g|0)==1){t=0.0;u=m;w=1;x=e;y=l;break}uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((s|0)==9435){t=p;u=p;w=2;x=q;y=r}r=+P(+t);if(r>+h[11]){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==1){z=+(x|0)}else if((w|0)==2){z=y}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=(1.0-z)*(z+1.0);if(r>0.0){A=1.0;B=r;C=0.0}else{x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=x+1|0;c[6354]=q;x=14296+(q*24&-1)|0;c[x>>2]=w;c[x+4>>2]=j;h[14304+(q*24&-1)>>3]=y;h[14312+(q*24&-1)>>3]=u;a[1960]=1;i=b;return}while(1){u=+Q(+C);y=+Q(+B);r=+Q(+A);z=y*r+u*(y+r);r=(C+z)*.25;y=(B+z)*.25;u=(A+z)*.25;D=(u+(r+y))*.3333333333333333;E=(D-r)/D;F=(D-y)/D;G=(D-u)/D;if(+P(+E)>.0025){A=u;B=y;C=r;continue}if(+P(+F)>.0025){A=u;B=y;C=r;continue}if(+P(+G)>.0025){A=u;B=y;C=r}else{break}}C=E*F;F=C-G*G;E=C*G;q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}G=(E*.07142857142857142+(F*(F*.041666666666666664+-.1-E*.06818181818181818)+1.0))/+Q(+D);x=q+1|0;c[6354]=x;q=14296+(x*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(x*24&-1)>>3]=G;h[14312+(x*24&-1)>>3]=0.0;i=b;return}function kL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=c[k>>2]|0;r=n;s=9462;break}}else{if((g|0)==1){t=0.0;u=m;w=1;x=e;y=l;break}else if((g|0)==2){p=m;q=e;r=l;s=9462;break}uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((s|0)==9462){t=p;u=p;w=2;x=q;y=r}r=+P(+t);if(r>+h[11]){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==1){z=+(x|0)}else if((w|0)==2){z=y}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=(1.0-z)*(z+1.0);if(r>0.0){A=1.0;B=r;C=0.0}else{if(r<0.0){a[1960]=1;x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=x+1|0;c[6354]=q;x=14296+(q*24&-1)|0;c[x>>2]=w;c[x+4>>2]=j;h[14304+(q*24&-1)>>3]=y;h[14312+(q*24&-1)>>3]=u;i=b;return}else{q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=q+1|0;c[6354]=x;q=14296+(x*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(x*24&-1)>>3]=1.0;h[14312+(x*24&-1)>>3]=0.0;i=b;return}}while(1){u=+Q(+C);y=+Q(+B);t=+Q(+A);p=y*t+u*(y+t);t=(C+p)*.25;y=(B+p)*.25;u=(A+p)*.25;D=(u+(t+y))*.3333333333333333;E=(D-t)/D;F=(D-y)/D;G=(D-u)/D;if(+P(+E)>.0025){A=u;B=y;C=t;continue}if(+P(+F)>.0025){A=u;B=y;C=t;continue}if(+P(+G)>.0025){A=u;B=y;C=t}else{break}}C=E*F;F=C-G*G;E=C*G;G=(E*.07142857142857142+(F*(F*.041666666666666664+-.1-E*.06818181818181818)+1.0))/+Q(+D);D=1.0;E=1.0;F=r;r=0.0;C=0.0;while(1){B=+Q(+r);A=+Q(+F);t=+Q(+E);y=A*t+B*(A+t);A=E+y;H=C+D/(t*A);I=D*.25;t=(r+y)*.25;B=(F+y)*.25;y=A*.25;J=(t+B+y*3.0)*.2;K=(J-t)/J;L=(J-B)/J;M=(J-y)/J;if(+P(+K)>.0015){D=I;E=y;F=B;r=t;C=H;continue}if(+P(+L)>.0015){D=I;E=y;F=B;r=t;C=H;continue}if(+P(+M)>.0015){D=I;E=y;F=B;r=t;C=H}else{break}}C=K*L;L=M*M;K=C-L;r=C-L*6.0;L=K+(K+r);x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=G-z*z*(H*3.0+I*(M*(M*(C*M*.11538461538461539+K*-.4090909090909091)+L*.16666666666666666)+(r*(r*.10227272727272728+-.21428571428571427-M*.17307692307692307*L)+1.0))/(J*+Q(+J)))/3.0;q=x+1|0;c[6354]=q;x=14296+(q*24&-1)|0;c[x>>2]=2;c[x+4>>2]=j;h[14304+(q*24&-1)>>3]=F;h[14312+(q*24&-1)>>3]=0.0;i=b;return}function kM(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0,y=0,z=0.0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0;b=i;i=i+16|0;d=b|0;e=b+8|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=14296+(f*24&-1)|0;l=c[j>>2]|0;m=c[j+4>>2]|0;j=14304+(f*24&-1)|0;n=+h[j>>3];o=+h[14312+(f*24&-1)>>3];f=c[j>>2]|0;j=f;do{if((l|0)==3){p=+uz(j,e);q=(j|0)==(c[e>>2]|0);uu(j);if(q){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;q=c[k>>2]|0;r=2;s=0.0;t=c[6354]|0;u=q;w=p;x=q;break}}else{r=l;s=o;t=g;u=f;w=n;x=j}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;j=14296+(t*24&-1)|0;f=c[j>>2]|0;g=c[j+4>>2]|0;j=14304+(t*24&-1)|0;n=+h[j>>3];o=+h[14312+(t*24&-1)>>3];t=c[j>>2]|0;j=t;do{if((f|0)==3){p=+uz(j,d);l=(j|0)==(c[d>>2]|0);uu(j);if(l){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;l=c[k>>2]|0;y=2;z=0.0;A=l;B=p;C=l;break}}else{y=f;z=o;A=t;B=n;C=j}}while(0);if((r|0)==2){D=s}else if((r|0)==1){D=0.0}else if((r|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=+P(+D);D=+h[11];if(n>D){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)==1){E=0.0}else if((y|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((y|0)==2){E=z}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(+P(+E)>D){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){F=+(u|0)}else if((r|0)==2){F=w}else if((r|0)==3){F=+uz(x,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)==3){G=+uz(C,0)}else if((y|0)==2){G=B}else if((y|0)==1){G=+(A|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=(1.0-F)*(F+1.0);if(B>0.0&G<1.0){H=1.0;I=B;J=0.0}else{a[1960]=1;A=c[6354]|0;if((A|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=A+1|0;c[6354]=y;A=14296+(y*24&-1)|0;c[A>>2]=r;c[A+4>>2]=m;h[14304+(y*24&-1)>>3]=w;h[14312+(y*24&-1)>>3]=s;h[k>>3]=w;y=c[k>>2]|0;if((r|0)!=3|(y|0)==0){i=b;return}r=bP(y|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=r;i=b;return}while(1){w=+Q(+J);s=+Q(+I);F=+Q(+H);D=s*F+w*(s+F);F=(J+D)*.25;s=(I+D)*.25;w=(H+D)*.25;K=(w+(F+s))*.3333333333333333;L=(K-F)/K;M=(K-s)/K;N=(K-w)/K;if(+P(+L)>.0025){H=w;I=s;J=F;continue}if(+P(+M)>.0025){H=w;I=s;J=F;continue}if(+P(+N)>.0025){H=w;I=s;J=F}else{break}}J=L*M;M=J-N*N;L=J*N;N=(L*.07142857142857142+(M*(M*.041666666666666664+-.1-L*.06818181818181818)+1.0))/+Q(+K);K=1.0-G;if(K>0.0){O=1.0;R=B;S=0.0;T=0.0;U=K;V=0.0}else{L=B<0.0?0.0:B;M=L>1.0?L:1.0;L=B+0.0+1.0-M;B=1.0/(L-K);J=L*(M-L)*B;I=L+J;H=M*0.0/L;F=K*I/L;if(F>0.0){W=1.0;X=F;Y=H}else{s=H-F;w=+Q(+H);W=w/+Q(+s);X=-0.0-F;Y=s}s=X;X=Y;do{Y=+Q(+X)*2.0;F=s+Y*+Q(+s);X=(X+F)*.25;s=(s+F)*.25;Z=(s+(X+s))*.3333333333333333;_=(s-Z)/Z;}while(+P(+_)>.0012);O=M;R=L;S=B;T=J;U=I;V=W*(_*_*(_*(_*(_*.4090909090909091+.375)+.14285714285714285)+.3)+1.0)/+Q(+Z)}Z=O;O=R;R=0.0;_=0.0;W=1.0;I=U;while(1){U=+Q(+R);J=+Q(+O);B=+Q(+Z);L=J*B+U*(J+B);M=U*J*B+I*(U+J+B);B=M*M;M=I+L;J=I*M*M;if(J>0.0){$=1.0;aa=J;ab=B}else{U=B-J;s=+Q(+B);$=s/+Q(+U);aa=-0.0-J;ab=U}U=aa;J=ab;do{s=+Q(+J)*2.0;B=U+s*+Q(+U);J=(J+B)*.25;U=(U+B)*.25;ac=(U+(J+U))*.3333333333333333;ad=(U-ac)/ac;}while(+P(+ad)>.0012);ae=_+W*($*(ad*ad*(ad*(ad*(ad*.4090909090909091+.375)+.14285714285714285)+.3)+1.0)/+Q(+ac));af=W*.25;ag=(R+L)*.25;ah=(O+L)*.25;ai=(Z+L)*.25;U=M*.25;aj=(U+(U+(ai+(ag+ah))))*.2;ak=(aj-ag)/aj;al=(aj-ah)/aj;am=(aj-ai)/aj;an=(aj-U)/aj;if(+P(+ak)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U;continue}if(+P(+al)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U;continue}if(+P(+am)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U;continue}if(+P(+an)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U}else{break}}I=al*am+ak*(al+am);W=ak*al*am;am=an*an;al=I-am*3.0;ak=ae*3.0+af*((.3333333333333333-an*.13636363636363635)*an*I+(W*(an*(an*.11538461538461539+-.2727272727272727)+.16666666666666666)+(al*(al*.10227272727272727+-.21428571428571427-(W+an*2.0*(I-am))*.17307692307692307)+1.0))-an*.3333333333333333*am)/(aj*+Q(+aj));if(K>0.0){ao=ak}else{K=ai;ai=ah;ah=ag;while(1){ag=+Q(+ah);aj=+Q(+ai);am=+Q(+K);an=aj*am+ag*(aj+am);am=(ah+an)*.25;aj=(ai+an)*.25;ag=(K+an)*.25;ap=(ag+(am+aj))*.3333333333333333;aq=(ap-am)/ap;ar=(ap-aj)/ap;as=(ap-ag)/ap;if(+P(+aq)>.0025){K=ag;ai=aj;ah=am;continue}if(+P(+ar)>.0025){K=ag;ai=aj;ah=am;continue}if(+P(+as)>.0025){K=ag;ai=aj;ah=am}else{break}}ah=aq*ar;ar=ah-as*as;aq=ah*as;ao=S*(T*ak+(V-(aq*.07142857142857142+(ar*(ar*.041666666666666664+-.1-aq*.06818181818181818)+1.0))/+Q(+ap))*3.0)}r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=r+1|0;c[6354]=y;r=14296+(y*24&-1)|0;c[r>>2]=2;c[r+4>>2]=g;h[14304+(y*24&-1)>>3]=N+G*ao/3.0;h[14312+(y*24&-1)>>3]=0.0;i=b;return}function kN(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[d>>3]=l;n=+h[14312+(e*24&-1)>>3];e=m;m=e;do{if((j|0)==3){o=+uz(m,b);g=(m|0)==(c[b>>2]|0);uu(m);if(g){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=o;p=o;q=0.0;r=c[6354]|0;break}}else{if((j|0)==2){p=l;q=n;r=f;break}else if((j|0)==1){p=+(e|0);q=n;r=f;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[d>>2]=~~p;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=r+1|0;c[6354]=f;r=14296+(f*24&-1)|0;c[r>>2]=1;c[r+4>>2]=k;h[14304+(f*24&-1)>>3]=+h[d>>3];h[14312+(f*24&-1)>>3]=q;i=a;return}}function kO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0.0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;break}}else{if((k|0)==2){u=q;w=n;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=(r|0)>-1?r:-r|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);q=+P(+w);w=+P(+u);do{if(u==0.0){x=q}else{if(q>w){n=w/q;x=q*+Q(+(n*n+1.0));break}else{n=q/w;x=w*+Q(+(n*n+1.0));break}}}while(0);h[d>>3]=x;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=d+1|0;c[6354]=p;d=14296+(p*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(p*24&-1)>>3]=x;h[14312+(p*24&-1)>>3]=0.0;i=a;return}function kP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;break}}else{if((k|0)==2){u=q;w=n;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=(r|0)>0?1:r>>31;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);if(w>0.0){x=1}else{x=(w<0.0)<<31>>31}c[d>>2]=x;x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=x+1|0;c[6354]=p;x=14296+(p*24&-1)|0;c[x>>2]=1;c[x+4>>2]=g;h[14304+(p*24&-1)>>3]=+h[d>>3];h[14312+(p*24&-1)>>3]=u;i=a;return}function kQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;p=9618;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=j;p=9618;break}else if((f|0)==1){q=+(k|0);r=+Q(+(+(((k|0)>-1?k:-k|0)|0)));break}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((p|0)==9618){j=+P(+o);l=+P(+n);k=n==0.0;if(k){q=o;r=+Q(+j);break}if(j>l){s=l/j;t=+Q(+(j*+Q(+(s*s+1.0))))}else{s=j/l;j=+Q(+(l*+Q(+(s*s+1.0))));if(k){q=o;r=j;break}else{t=j}}j=+Y(+n,+o)*.5;k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}s=t*+S(+j);l=t*+T(+j);f=k+1|0;c[6354]=f;k=14296+(f*24&-1)|0;c[k>>2]=2;c[k+4>>2]=g;h[14304+(f*24&-1)>>3]=s;h[14312+(f*24&-1)>>3]=l;i=a;return}}while(0);p=c[6354]|0;f=(p|0)==249;if(q<0.0){if(f){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=p+1|0;c[6354]=k;d=14296+(k*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(k*24&-1)>>3]=0.0;h[14312+(k*24&-1)>>3]=r;i=a;return}else{if(f){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=+h[14312+(d*24&-1)>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=l;o=0.0;p=2;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==1){n=+(d|0);o=k;p=1;break}else if((f|0)==2){n=j;o=k;p=2;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(n<-706.893623549172){q=0.0}else{q=+Z(+n)}if((p|0)==2){r=o}else if((p|0)==1){r=0.0}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=q*+S(+r);n=q*+T(+r);f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=o;h[14312+(f*24&-1)>>3]=n;i=a;return}}function kS(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=n;r=c[k>>2]|0;s=9662;break}}else{if((g|0)==1){t=+(((e|0)>-1?e:-e|0)|0);u=m;w=1;x=e;y=l;break}else if((g|0)==2){p=m;q=l;r=e;s=9662;break}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((s|0)==9662){l=+P(+q);m=+P(+p);if(p==0.0){t=l;u=p;w=2;x=r;y=q;break}if(l>m){n=m/l;t=l*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}else{n=l/m;t=m*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}}}while(0);if(t==0.0){a[1960]=1;r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}s=r+1|0;c[6354]=s;r=14296+(s*24&-1)|0;c[r>>2]=w;c[r+4>>2]=j;h[14304+(s*24&-1)>>3]=y;h[14312+(s*24&-1)>>3]=u;i=b;return}L13201:do{if((w|0)==1){z=(x|0)>-1?0.0:3.141592653589793;A=+_(+(+(((x|0)>-1?x:-x|0)|0)))/2.302585092994046}else if((w|0)==2){t=+P(+y);q=+P(+u);s=u==0.0;do{if(s){B=+_(+t)/2.302585092994046}else{if(t>q){p=q/t;C=+_(+(t*+Q(+(p*p+1.0))))/2.302585092994046}else{p=t/q;n=+_(+(q*+Q(+(p*p+1.0))))/2.302585092994046;if(s){B=n;break}else{C=n}}z=+Y(+u,+y);A=C;break L13201}}while(0);z=y<0.0?3.141592653589793:0.0;A=B}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=c[6354]|0;if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=w+1|0;c[6354]=x;w=14296+(x*24&-1)|0;c[w>>2]=2;c[w+4>>2]=j;h[14304+(x*24&-1)>>3]=A;h[14312+(x*24&-1)>>3]=z/2.302585092994046;i=b;return}function kT(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=n;r=c[k>>2]|0;s=9695;break}}else{if((g|0)==2){p=m;q=l;r=e;s=9695;break}else if((g|0)==1){t=+(((e|0)>-1?e:-e|0)|0);u=m;w=1;x=e;y=l;break}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((s|0)==9695){l=+P(+q);m=+P(+p);if(p==0.0){t=l;u=p;w=2;x=r;y=q;break}if(l>m){n=m/l;t=l*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}else{n=l/m;t=m*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}}}while(0);if(t==0.0){a[1960]=1;r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}s=r+1|0;c[6354]=s;r=14296+(s*24&-1)|0;c[r>>2]=w;c[r+4>>2]=j;h[14304+(s*24&-1)>>3]=y;h[14312+(s*24&-1)>>3]=u;i=b;return}L13245:do{if((w|0)==1){z=(x|0)>-1?0.0:3.141592653589793;A=+_(+(+(((x|0)>-1?x:-x|0)|0)))}else if((w|0)==2){t=+P(+y);q=+P(+u);s=u==0.0;do{if(s){B=+_(+t)}else{if(t>q){p=q/t;C=+_(+(t*+Q(+(p*p+1.0))))}else{p=t/q;n=+_(+(q*+Q(+(p*p+1.0))));if(s){B=n;break}else{C=n}}z=+Y(+u,+y);A=C;break L13245}}while(0);z=y<0.0?3.141592653589793:0.0;A=B}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=c[6354]|0;if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=w+1|0;c[6354]=x;w=14296+(x*24&-1)|0;c[w>>2]=2;c[w+4>>2]=j;h[14304+(x*24&-1)>>3]=A;h[14312+(x*24&-1)>>3]=z;i=b;return}function kU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;x=c[6354]|0;break}}else{if((k|0)==2){u=q;w=n;x=f;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=~~+O(+(+(r|0)));if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);c[d>>2]=~~+O(+w);if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=x+1|0;c[6354]=p;x=14296+(p*24&-1)|0;c[x>>2]=1;c[x+4>>2]=g;h[14304+(p*24&-1)>>3]=+h[d>>3];h[14312+(p*24&-1)>>3]=u;i=a;return}function kV(a){a=+a;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0;if(a>0.0){b=a}else{b=-0.0-a}if(b<8.0){a=b*b;c=(a*(a*(a*(a*(a*(a*(a*(a*26857.86856980015-40504123.71833133)+25071582855.36882)-8085222034853.794)+DOT$ZERO(0x51889c8a118fa))+-136762035308817140.0)+6382059341072356000.0)+-117915762910761060000.0)+49337872517941336.0e4)/(a*(a*(a*(a*(a*(a*(a*(a+1363.0636523289706)+1114636.0984629854)+669998767.298224)+312304311494.12134)+112775673967979.84)+30246356167094628.0)+5428918384092285000.0)+49337872517941336.0e4);return+c}else{a=+Q(+(.6366197723675814/b));d=8.0/b;e=d*d;f=b+-.7853981633974483;b=(e*(e*(e*(e*(e*.8896154842421046+153.76201909008356)+3480.648644324927)+21170.523380864943)+41345.38663958076)+22779.090197304686)/(e*(e*(e*(e*(e+157.11159858080893)+3502.8735138235606)+21215.350561880117)+41370.41249551042)+22779.090197304686)*+S(+f);c=a*(b-d*((e*(e*(e*(e*(e*-.008803330304868075-1.244102674583564)-22.300261666214197)-111.83429920482737)-185.91953644342993)-89.22660020080009)/(e*(e*(e*(e*(e+90.59376959499312)+1488.7231232283757)+7264.278016921102)+11951.131543434614)+5710.502412851206))*+T(+f));return+c}return 0.0}function kW(a){a=+a;var b=0,c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,h=0.0;b=a<0.0;if(b){c=-0.0-a}else{c=a}if(c<8.0){d=c*c;e=(d*(d*(d*(d*(d*(d*(d*(d*2701.1227108923235-4695753.530642996)+3413234182.3017006)-1322983480332.1265)+290879526383477.56)+-35888175699101060.0)+2316433580634002400.0)+-6672106568924916.0e4)+5811993540016061.0e5)/(d*(d*(d*(d*(d*(d*(d*(d+1606.9315734814877)+1501793.5949985855)+1013863514.358674)+524371026216.76495)+208166122130760.75)+60920613989175220.0)+11857707121903210000.0)+0x3f0385ca46d07a0000)*a;return+e}a=+Q(+(.6366197723675814/c));d=8.0/c;f=d*d;g=c-2.356194490192345;c=(f*(f*(f*(f*(f*1.2571716929145342+211.15291828539623)+4985.4832060594335)+31353.963110915956)+62758.84524716128)+35224.66491336798)/(f*(f*(f*(f*(f+203.07751891347593)+4930.396490181089)+31240.406381904104)+62694.34695935605)+35224.66491336798)*+S(+g);h=a*(c-d*((f*(f*(f*(f*(f*.03532840052740124+4.568171629551227)+83.18989576738508)+425.98730116544425)+721.0391804904475)+351.17519143035526)/(f*(f*(f*(f*(f+103.81875854621337)+1811.1867005523513)+9152.231701516992)+15414.177339265098)+7491.737417180912))*+T(+g));if(!b){e=h;return+e}e=-0.0-h;return+e}function kX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;x=c[6354]|0;break}}else{if((k|0)==2){u=q;w=n;x=f;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=~~+$(+(+(r|0)));if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);c[d>>2]=~~+$(+w);if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=x+1|0;c[6354]=p;x=14296+(p*24&-1)|0;c[x>>2]=1;c[x+4>>2]=g;h[14304+(p*24&-1)>>3]=+h[d>>3];h[14312+(p*24&-1)>>3]=u;i=a;return}function kY(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;i=i+16|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f;h=f|0;f=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=b|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((f|0)==3){f=m;m=e6(f)|0;uu(f);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=(a[m+8|0]&1^1)&255;m=f+1|0;c[6354]=m;f=14296+(m*24&-1)|0;p=f;c[f>>2]=1;c[p+4>>2]=k;c[14304+(m*24&-1)>>2]=o;o=p+12|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];i=b;return}else{if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=0;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=b;return}}function kZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0;a=i;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(b*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==2){l=+h[14312+(b*24&-1)>>3]}else if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==1){l=0.0}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==1){n=+(k|0);o=d}else if((f|0)==2){n=j;o=d}else if((f|0)==3){j=+uz(e,0);n=j;o=c[6354]|0}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+kV(n);e=o+1|0;c[6354]=e;o=14296+(e*24&-1)|0;c[o>>2]=2;c[o+4>>2]=g;h[14304+(e*24&-1)>>3]=j;h[14312+(e*24&-1)>>3]=0.0;i=a;return}}function k_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0;a=i;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(b*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==1){l=0.0}else if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==2){l=+h[14312+(b*24&-1)>>3]}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==3){m=+uz(e,0);n=m;o=c[6354]|0}else if((f|0)==1){n=+(k|0);o=d}else if((f|0)==2){n=j;o=d}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+kW(n);d=o+1|0;c[6354]=d;o=14296+(d*24&-1)|0;c[o>>2]=2;c[o+4>>2]=g;h[14304+(d*24&-1)>>3]=j;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}function k$(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,q=0.0,r=0.0,s=0.0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==2){l=+h[14312+(d*24&-1)>>3]}else if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==1){l=0.0}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==1){n=+(k|0)}else if((f|0)==2){n=j}else if((f|0)==3){n=+uz(e,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(n<=0.0){d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=d+1|0;c[6354]=o;d=14296+(o*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;uE(14304+(o*24&-1)|0,0,16);a[1960]=1;i=b;return}if((f|0)==2){q=j}else if((f|0)==1){q=+(k|0)}else if((f|0)==3){q=+uz(e,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if(q<0.0){r=p}else{if(q<8.0){j=q*q;n=+kV(q)*.6366197723675814;r=(j*(j*(j*(j*(j*(j*(j*(j*-41370.35497933149+59152134.6568689)-34363712229.790405)+10255208596863.943)-1648605817185729.5)+137562431639934400.0)+-5247065581112765000.0)+6587473275719555.0e4)+-27502866786291098000.0)/(j*(j*(j*(j*(j*(j*(j*(j+1282.452772478994)+1001702.6412889062)+579512264.070073)+261306575504.10812)+91620380340751.86)+DOT$ZERO(0x550324fdf7f63c))+419241704341084.0e4)+3726458838986166.0e5)+n*+_(+q);break}else{n=+Q(+(.6366197723675814/q));j=8.0/q;m=j*j;l=q+-.7853981633974483;s=(m*(m*(m*(m*(m*.8896154842421046+153.76201909008356)+3480.648644324927)+21170.523380864943)+41345.38663958076)+22779.090197304686)/(m*(m*(m*(m*(m+157.11159858080893)+3502.8735138235606)+21215.350561880117)+41370.41249551042)+22779.090197304686)*+T(+l);r=n*(s+j*((m*(m*(m*(m*(m*-.008803330304868075-1.244102674583564)-22.300261666214197)-111.83429920482737)-185.91953644342993)-89.22660020080009)/(m*(m*(m*(m*(m+90.59376959499312)+1488.7231232283757)+7264.278016921102)+11951.131543434614)+5710.502412851206))*+S(+l));break}}}while(0);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=2;c[e+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function k0(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,q=0.0,r=0.0,s=0.0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==1){l=0.0}else if((f|0)==2){l=+h[14312+(d*24&-1)>>3]}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==2){n=j}else if((f|0)==3){n=+uz(e,0)}else if((f|0)==1){n=+(k|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(n<=0.0){d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=d+1|0;c[6354]=o;d=14296+(o*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;uE(14304+(o*24&-1)|0,0,16);a[1960]=1;i=b;return}if((f|0)==1){q=+(k|0)}else if((f|0)==2){q=j}else if((f|0)==3){q=+uz(e,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if(q>0.0){if(q<8.0){j=q*q;n=+kW(q);r=q*((j*(j*(j*(j*(j*(j*(j*(j*0.0+355692.4009830526)-428947196.88552487)+204969667374.56622)-48633169425671.75)+5915160760490071.0)+-344104806308411460.0)+774852068218684.0e4)+-29238219615329624000.0)/(j*(j*(j*(j*(j*(j*(j*(j+1072.6961437789255)+726914.7307198885)+371666079.86219305)+150022169915.6709)+47551735888881.375)+DOT$ZERO(0x2834334232332e))+1818662841706135000.0)+149131151130292030000.0))+(n*+_(+q)-1.0/q)*.6366197723675814;break}else{n=+Q(+(.6366197723675814/q));j=8.0/q;m=j*j;l=q-2.356194490192345;s=(m*(m*(m*(m*(m*1.2571716929145342+211.15291828539623)+4985.4832060594335)+31353.963110915956)+62758.84524716128)+35224.66491336798)/(m*(m*(m*(m*(m+203.07751891347593)+4930.396490181089)+31240.406381904104)+62694.34695935605)+35224.66491336798)*+T(+l);r=n*(s+j*((m*(m*(m*(m*(m*.03532840052740124+4.568171629551227)+83.18989576738508)+425.98730116544425)+721.0391804904475)+351.17519143035526)/(m*(m*(m*(m*(m+103.81875854621337)+1811.1867005523513)+9152.231701516992)+15414.177339265098)+7491.737417180912))*+S(+l));break}}else{r=p}}while(0);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=2;c[e+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function k1(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;if((f|0)==1){k=+(d|0)}else if((f|0)==3){k=+uz(d,0)}else if((f|0)==2){k=j}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,k);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=+(c[b>>2]|0);b=f+1|0;c[6354]=b;f=14296+(b*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(b*24&-1)>>3]=k;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==3){j=+uz(d,0)}else if((f|0)==1){j=+(d|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+4>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==3){j=+uz(d,0)}else if((f|0)==1){j=+(d|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+8>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+12>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+16>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k6(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;if((f|0)==1){k=+(d|0)}else if((f|0)==2){k=j}else if((f|0)==3){k=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,k);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=+(c[b+20>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=k;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k7(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+24>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k8(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+28>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k9(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0,am=0.0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0;b=i;i=i+720|0;d=b|0;e=b+112|0;f=b+144|0;j=b+176|0;k=b+208|0;l=b+320|0;o=b+432|0;p=b+456|0;q=b+480|0;r=b+496|0;s=b+608|0;c[13898]=(c[13898]|0)+1;c[16506]=c[16507];h[8255]=+h[8257];h[8256]=+h[8258];h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;c[16334]=c[16335];h[8169]=+h[8171];h[8170]=+h[8172];h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;dq(2);dq(1);uu(c[3562]|0);uu(c[3560]|0);t=ut(32768)|0;do{if((t|0)==0){gk();u=ut(32768)|0;if((u|0)!=0){x=u;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{x=t}}while(0);c[3562]=x;x=ut(32768)|0;do{if((x|0)==0){gk();t=ut(32768)|0;if((t|0)!=0){y=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{y=x}}while(0);c[3560]=y;if(!((c[3562]|0)!=0&(y|0)!=0)){uf(-1,135152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}uu(c[3558]|0);y=c[13898]|0;L13568:do{if((y|0)<(c[8272]|0)){x=c[1054]|0;L13570:do{if((a[x+(y*40&-1)|0]&1)!=0){t=c[x+(y*40&-1)+36>>2]|0;u=x+(y*40&-1)+32|0;z=c[10036]|0;A=0;while(1){if((A|0)>=(t|0)){break}if((a[z+((c[u>>2]|0)+A|0)|0]|0)==(a[A+103664|0]|0)){A=A+1|0}else{break L13570}}if((A|0)==1){break L13568}}}while(0);a[14176]=1;is(p);a[14176]=0;if((c[p>>2]|0)!=3){c[13898]=y;break}x=c[p+8>>2]|0;c[3558]=x;u=c[13898]|0;if((x|0)==0){B=u;uf(B,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=c[1054]|0;t=c[z+(u*40&-1)+36>>2]|0;L13583:do{if((a[z+(u*40&-1)|0]&1)!=0&(t|0)>0){C=c[10036]|0;D=0;E=0;F=c[z+(u*40&-1)+32>>2]|0;while(1){if((a[D+151232|0]|0)==(a[C+(D+F|0)|0]|0)){G=F;H=E}else{if((D|0)!=3){I=9981;break L13583}G=F-1|0;H=1}J=D+1|0;if((J|0)<(H+t|0)){D=J;E=H;F=G}else{break}}if((H|0)==0){if(!((D|0)==6|(D|0)==2)){I=9981;break}}ey(x,3,0);F=(c[11864]|0)-1|0;E=c[12172]|0;C=c[E+(F*232&-1)+144>>2]|0;A=aa(C,c[E+(F*232&-1)+140>>2]|0);J=c[E+(F*232&-1)+224>>2]|0;if((A|0)<1){c[3562]=0;uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=A,v)|0)}F=A<<3;E=db(c[3562]|0,F,215008)|0;c[3562]=E;if((E|0)==0){uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=A,v)|0)}E=db(c[3560]|0,F,215008)|0;F=E;c[3560]=F;if((E|0)==0){uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=A,v)|0)}if((A|0)>0){E=0;do{h[F+(E<<3)>>3]=+g[J+(E<<2)>>2];E=E+1|0;}while((E|0)<(A|0))}ez();K=1;L=C;M=A;N=0;O=0;Q=0;R=0}else{I=9981}}while(0);if((I|0)==9981){t=ey(x,2,0)|0;if((t|0)<0){uf(-1,120240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)>2){uf(c[13898]|0,104256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[8270]|0;do{if((u|0)!=0){if((aY(u|0,139696)|0)==0){break}bA(4,u|0)}}while(0);if((a[66164]&1)!=0){uf(-1,91264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[65476]&1)!=0){uf(-1,91264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[16546]|0)==1|(c[16374]|0)==1){uf(-1,83576,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[30528]&1)!=0){uf(-1,75664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[32936]&1)!=0){uf(-1,223048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=q|0;x=eC(u,2)|0;do{if((x|0)==-1){ez();S=2;T=0;U=0;V=0;W=0;X=0;I=10029}else{z=q+8|0;E=4096;J=0;F=0;D=0;Y=0;Z=0;_=2;$=x;L13639:while(1){ab=($|0)>(_|0)?$:_;if((Z|0)<(E|0)){ac=E}else{ad=E*3&-1;ae=(ad|0)/2&-1;if((ad|0)<2){I=10002;break}ad=ae<<3;af=db(c[3562]|0,ad,215008)|0;c[3562]=af;if((af|0)==0){I=10358;break}af=db(c[3560]|0,ad,215008)|0;c[3560]=af;if((af|0)==0){I=10356;break}else{ac=ae}}L13646:do{if(($|0)==(-5|0)|($|0)==(-2|0)){ag=Z;ah=Y;ai=D;aj=F;ak=J+1|0}else if(($|0)==(-3|0)){ag=Z;ah=Y;ai=D;aj=F+1|0;ak=J}else if(($|0)==(-4|0)){ag=Z;ah=Y;ai=D+1|0;aj=F+1|0;ak=J}else if(($|0)==0){I=10011;break L13639}else if(($|0)==1){al=+h[u>>3];af=c[16334]&3;if((af|0)==3){I=10016}else if((af|0)==1){if(+h[8170]<al){I=10017}else{I=10016}}else if((af|0)==2){if(+h[8169]>al){I=10017}else{I=10016}}else if((af|0)==0){if(+h[8170]<al|+h[8169]>al){I=10017}else{I=10016}}else{I=10017}if((I|0)==10016){I=0;h[(c[3560]|0)+(Z<<3)>>3]=al;ag=Z+1|0;ah=Y;ai=D;aj=F;ak=J;break}else if((I|0)==10017){I=0;ag=Z;ah=Y+1|0;ai=D;aj=F;ak=J;break}}else if(($|0)==2){al=+h[u>>3];af=c[16506]&3;if((af|0)==0){if(!(+h[8256]<al|+h[8255]>al)){I=10022}}else if((af|0)==3){I=10022}else if((af|0)==1){if(+h[8256]>=al){I=10022}}else if((af|0)==2){if(+h[8255]<=al){I=10022}}do{if((I|0)==10022){I=0;am=+h[z>>3];af=c[16334]&3;if((af|0)==1){if(+h[8170]<am){break}}else if((af|0)==2){if(+h[8169]>am){break}}else if((af|0)==0){if(+h[8170]<am|+h[8169]>am){break}}else if((af|0)!=3){break}h[(c[3562]|0)+(Z<<3)>>3]=al;h[(c[3560]|0)+(Z<<3)>>3]=+h[z>>3];ag=Z+1|0;ah=Y;ai=D;aj=F;ak=J;break L13646}}while(0);ag=Z;ah=Y+1|0;ai=D;aj=F;ak=J}else{ag=Z;ah=Y;ai=D;aj=F;ak=J}}while(0);af=eC(u,2)|0;if((af|0)==-1){I=10028;break}else{E=ac;J=ak;F=aj;D=ai;Y=ah;Z=ag;_=ab;$=af}}if((I|0)==10356){ez();uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=ae,v)|0)}else if((I|0)==10358){ez();uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=ae,v)|0)}else if((I|0)==10011){$=c[11932]|0;uf(-1,216224,(v=i,i=i+16|0,c[v>>2]=c[11900],c[v+8>>2]=($|0)!=0?$:179864,v)|0)}else if((I|0)==10002){c[3562]=0;ez();uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=ae,v)|0)}else if((I|0)==10028){ez();if((ag|0)<1){S=ab;T=ag;U=ah;V=ai;W=aj;X=ak;I=10029;break}$=ag<<3;c[3562]=db(c[3562]|0,$,215008)|0;an=db(c[3560]|0,$,215008)|0;ao=ab;ap=ag;aq=ah;ar=ai;as=aj;at=ak;break}}}while(0);if((I|0)==10029){c[3562]=0;an=0;ao=S;ap=T;aq=U;ar=V;as=W;at=X}c[3560]=an;K=(t|0)==0?ao:t;L=0;M=ap;N=aq;O=ar;Q=as;R=at}u=c[8270]|0;do{if((u|0)!=0){if((aY(u|0,139696)|0)==0){break}bA(4,139696)}}while(0);if((M|0)==0){if((N|0)>0){uf(-1,204632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(-1,201008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}u=o|0;t=o+8|0;x=1;L13694:while(1){L13696:while(1){au=c[13898]|0;if((au|0)>=(c[8272]|0)){I=10098;break L13694}$=c[1054]|0;_=(a[$+(au*40&-1)|0]&1)==0;if(_){I=10351;break L13694}Z=c[$+(au*40&-1)+36>>2]|0;Y=$+(au*40&-1)+32|0;$=c[10036]|0;D=0;while(1){if((D|0)>=(Z|0)){I=10045;break}if((a[$+((c[Y>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break}}if((I|0)==10045){I=0;if((D|0)==1){I=10098;break L13694}}$=c[Y>>2]|0;if(_){I=10345;break L13694}do{if((Z|0)>0){F=c[10036]|0;J=0;E=0;z=$;while(1){if((a[J+184704|0]|0)==(a[F+(J+z|0)|0]|0)){av=z;aw=E}else{if((J|0)!=3){break}av=z-1|0;aw=1}A=J+1|0;if((A|0)<(aw+Z|0)){J=A;E=aw;z=av}else{I=10053;break}}if((I|0)==10053){I=0;if((aw|0)!=0){ax=1;break L13696}if((J|0)==6|(J|0)==2){ax=1;break L13696}}if(_){I=10346;break L13694}if((Z|0)<=0){I=10076;break}z=c[10036]|0;E=0;F=0;A=$;while(1){if((a[E+179552|0]|0)==(a[z+(E+A|0)|0]|0)){ay=A;az=F}else{if((E|0)!=5){break}ay=A-1|0;az=1}C=E+1|0;if((C|0)<(az+Z|0)){E=C;F=az;A=ay}else{I=10064;break}}if((I|0)==10064){I=0;if((az|0)!=0){ax=0;break L13696}if((E|0)==8|(E|0)==4){ax=0;break L13696}}if(_){I=10350;break L13694}if((Z|0)<=0){I=10076;break}A=c[10036]|0;F=0;z=0;J=$;while(1){if((a[F+175408|0]|0)==(a[A+(F+J|0)|0]|0)){aA=J;aB=z}else{if((F|0)!=3){break}aA=J-1|0;aB=1}C=F+1|0;if((C|0)<(aB+Z|0)){F=C;z=aB;J=aA}else{I=10073;break}}if((I|0)==10073){I=0;if((aB|0)!=0){break}if((F|0)==2|(F|0)==6){break}}if(_){I=10348;break L13694}else{I=10076}}else{I=10076}}while(0);if((I|0)==10076){I=0;_=c[10036]|0;Y=0;while(1){if((Y|0)>=(Z|0)){break}if((a[_+($+Y|0)|0]|0)==(a[Y+218432|0]|0)){Y=Y+1|0}else{I=10349;break L13694}}if((Y|0)!=4){I=10347;break L13694}}c[13898]=au+1;uu(c[3556]|0);aC=c[13898]|0;if((aC|0)>=(c[8272]|0)){break L13694}$=c[1054]|0;L13751:do{if((a[$+(aC*40&-1)|0]&1)!=0){_=c[$+(aC*40&-1)+36>>2]|0;Z=$+(aC*40&-1)+32|0;D=c[10036]|0;J=0;while(1){if((J|0)>=(_|0)){break}if((a[D+((c[Z>>2]|0)+J|0)|0]|0)==(a[J+103664|0]|0)){J=J+1|0}else{break L13751}}if((J|0)==1){break L13694}}}while(0);a[14176]=1;is(o);a[14176]=0;if((c[u>>2]|0)!=3){I=10087;break L13694}$=c[t>>2]|0;c[3556]=$;if(($|0)==0){I=10341;break L13694}Y=a[$]|0;if(Y<<24>>24==0){I=10342;break L13694}if(((Y<<24>>24)-48|0)>>>0<10){I=10343;break L13694}else{aD=$;aE=Y}do{if((bs(aE&255|0)|0)==0){if((a[aD]|0)!=95){I=10339;break L13694}}aD=aD+1|0;aE=a[aD]|0;}while(aE<<24>>24!=0);if((aY(167320,c[3556]|0)|0)==0){I=10340;break L13694}}c[13898]=au+1;x=ax}if((I|0)==10098){t=c[3556]|0;if((t|0)==0){u=bP(150920)|0;c[3556]=u;aG=u}else{aG=t}t=uA(aG|0)|0;if((a[aG+(t-1|0)|0]|0)!=95){u=db(aG,t+2|0,149064)|0;c[3556]=u;t=u+(uA(u|0)|0)|0;w=95;a[t]=w&255;w=w>>8;a[t+1|0]=w&255}t=O+1|0;u=(K|0)==1;do{if(u){lc(s,c[3560]|0,M,L);aH=0.0;aJ=0.0;aK=0.0;aL=0.0;aM=0.0;aN=0.0;aO=0}else{if((K|0)!=2){aH=0.0;aJ=0.0;aK=0.0;aL=0.0;aM=0.0;aN=0.0;aO=0;break}lc(r,c[3562]|0,M,0);lc(s,c[3560]|0,M,0);Y=c[3562]|0;$=c[3560]|0;al=+h[r+8>>3];am=+h[r+16>>3];aP=+h[r+24>>3];aQ=+h[r+32>>3];aR=+h[s+8>>3];aS=+h[s+16>>3];aT=+h[s+24>>3];Z=c[s+48>>2]|0;D=c[s+64>>2]|0;if((M|0)>0){_=0;aU=0.0;while(1){aV=aU+ +h[Y+(_<<3)>>3]*+h[$+(_<<3)>>3];F=_+1|0;if((F|0)<(M|0)){_=F;aU=aV}else{aW=aV;break}}}else{aW=0.0}aU=+(M|0);aV=(aW-aP*aT/aU)/(aQ-aP*aP/aU);aH=aW;aJ=aV;aK=aR-al*aV;aL=am*aV/aS;aM=+h[Y+(Z<<3)>>3];aN=+h[Y+(D<<3)>>3];aO=1}}while(0);_=c[3556]|0;$=c[10810]|0;if(($|0)==0){aX=_}else{F=$;do{$=c[F+4>>2]|0;do{if((a_(_|0,$|0,uA(_|0)|0)|0)==0){a[F+8|0]=1;z=F+16|0;if((c[z>>2]|0)!=3){break}uu(c[F+24>>2]|0);c[z>>2]=1}}while(0);F=c[F>>2]|0;}while((F|0)!=0);aX=c[3556]|0}aS=+(M|0);F=(aX|0)!=0?aX:179864;_=(uA(F|0)|0)+8|0;$=ut(_)|0;do{if(($|0)==0){gk();D=ut(_)|0;if((D|0)!=0){aZ=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{aZ=$}}while(0);be(aZ|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=83376,c[v+16>>2]=179864,v)|0);$=e6(aZ)|0;c[$+16>>2]=2;h[$+24>>3]=aS;h[$+32>>3]=0.0;a[$+8|0]=0;uu(aZ);am=+(R|0);$=(uA(F|0)|0)+8|0;_=ut($)|0;do{if((_|0)==0){gk();D=ut($)|0;if((D|0)!=0){a$=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a$=_}}while(0);be(a$|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=82464,c[v+16>>2]=179864,v)|0);_=e6(a$)|0;c[_+16>>2]=2;h[_+24>>3]=am;h[_+32>>3]=0.0;a[_+8|0]=0;uu(a$);al=+(Q|0);_=(uA(F|0)|0)+6|0;$=ut(_)|0;do{if(($|0)==0){gk();D=ut(_)|0;if((D|0)!=0){a0=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a0=$}}while(0);be(a0|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=224608,c[v+16>>2]=179864,v)|0);$=e6(a0)|0;c[$+16>>2]=2;h[$+24>>3]=al;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a0);am=+(t|0);$=(uA(F|0)|0)+7|0;_=ut($)|0;do{if((_|0)==0){gk();D=ut($)|0;if((D|0)!=0){a1=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a1=_}}while(0);be(a1|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=79624,c[v+16>>2]=179864,v)|0);_=e6(a1)|0;c[_+16>>2]=2;h[_+24>>3]=am;h[_+32>>3]=0.0;a[_+8|0]=0;uu(a1);al=+(N|0);_=(uA(F|0)|0)+11|0;$=ut(_)|0;do{if(($|0)==0){gk();D=ut(_)|0;if((D|0)!=0){a2=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a2=$}}while(0);be(a2|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=78880,c[v+16>>2]=179864,v)|0);$=e6(a2)|0;c[$+16>>2]=2;h[$+24>>3]=al;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a2);if(u){ld(s,c[3556]|0,179864)}if(aO){ld(r,c[3556]|0,144920);ld(s,c[3556]|0,143296);$=c[3556]|0;_=($|0)!=0?$:179864;$=(uA(_|0)|0)+6|0;D=ut($)|0;do{if((D|0)==0){gk();Y=ut($)|0;if((Y|0)!=0){a3=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a3=D}}while(0);be(a3|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=140096,c[v+16>>2]=179864,v)|0);D=e6(a3)|0;c[D+16>>2]=2;h[D+24>>3]=aJ;h[D+32>>3]=0.0;a[D+8|0]=0;uu(a3);D=(uA(_|0)|0)+10|0;$=ut(D)|0;do{if(($|0)==0){gk();F=ut(D)|0;if((F|0)!=0){a4=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a4=$}}while(0);be(a4|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=138e3,c[v+16>>2]=179864,v)|0);$=e6(a4)|0;c[$+16>>2]=2;h[$+24>>3]=aK;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a4);$=(uA(_|0)|0)+12|0;D=ut($)|0;do{if((D|0)==0){gk();F=ut($)|0;if((F|0)!=0){a5=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a5=D}}while(0);be(a5|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=136336,c[v+16>>2]=179864,v)|0);D=e6(a5)|0;c[D+16>>2]=2;h[D+24>>3]=aL;h[D+32>>3]=0.0;a[D+8|0]=0;uu(a5);D=(uA(_|0)|0)+6|0;$=ut(D)|0;do{if(($|0)==0){gk();F=ut(D)|0;if((F|0)!=0){a6=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a6=$}}while(0);be(a6|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=134616,c[v+16>>2]=179864,v)|0);$=e6(a6)|0;c[$+16>>2]=2;h[$+24>>3]=aH;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a6);$=(uA(_|0)|0)+10|0;D=ut($)|0;do{if((D|0)==0){gk();F=ut($)|0;if((F|0)!=0){a7=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a7=D}}while(0);be(a7|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=75120,c[v+16>>2]=179864,v)|0);D=e6(a7)|0;c[D+16>>2]=2;h[D+24>>3]=aM;h[D+32>>3]=0.0;a[D+8|0]=0;uu(a7);D=(uA(_|0)|0)+10|0;$=ut(D)|0;do{if(($|0)==0){gk();F=ut(D)|0;if((F|0)!=0){a8=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a8=$}}while(0);be(a8|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=74616,c[v+16>>2]=179864,v)|0);$=e6(a8)|0;c[$+16>>2]=2;h[$+24>>3]=aN;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a8)}if(!x){a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}$=(M|0)>0;if($){bg=~~+bQ(+aS)+1|0}else{bg=3}D=c[7262]|0;F=c[m>>2]|0;do{if((D|0)==0){c[7262]=F;bh=F;I=10158}else{if((D|0)==(c[n>>2]|0)|(D|0)==(F|0)){bh=D;I=10158;break}cf(D|0,84208,(v=i,i=i+16|0,c[v>>2]=83376,c[v+8>>2]=M,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=82464,c[v+8>>2]=R,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=80984,c[v+8>>2]=Q,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=79624,c[v+8>>2]=t,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=78880,c[v+8>>2]=N,v)|0)}}while(0);if((I|0)==10158){aF(10,bh|0);D=c[7262]|0;aI(78344,9,1,D|0);D=c[7262]|0;cf(D|0,77936,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=M,v)|0);D=c[7262]|0;cf(D|0,77320,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=N,v)|0);D=c[7262]|0;cf(D|0,76744,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=R,v)|0);D=c[7262]|0;cf(D|0,76144,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=Q,v)|0);D=c[7262]|0;cf(D|0,75560,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=t,v)|0)}if(u){uD(d|0,s|0,112);D=e|0;F=f|0;if($){bi=~~+bQ(+aS)+1|0}else{bi=1}x=c[7262]|0;_=c[m>>2]|0;do{if((x|0)==0){c[7262]=_;bj=_}else{if((x|0)==(c[n>>2]|0)|(x|0)==(_|0)){bj=x;break}lb(d,143296);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}}while(0);aF(10,bj|0);x=c[d>>2]|0;_=(x|0)>0;u=c[7262]|0;if(_){t=c[d+4>>2]|0;cf(u|0,94136,(v=i,i=i+16|0,c[v>>2]=x,c[v+8>>2]=t,v)|0)}else{aI(93512,11,1,u|0)}u=c[7262]|0;al=+h[d+8>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(u|0,92672,(v=i,i=i+8|0,c[v>>2]=D,v)|0);t=c[7262]|0;al=+h[d+16>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,91840,(v=i,i=i+8|0,c[v>>2]=D,v)|0);u=c[7262]|0;al=+h[d+24>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(u|0,91184,(v=i,i=i+8|0,c[v>>2]=D,v)|0);t=c[7262]|0;al=+h[d+32>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,90616,(v=i,i=i+8|0,c[v>>2]=D,v)|0);u=c[7262]|0;aF(10,u|0);u=c[7262]|0;al=+h[d+40>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);t=c[d+48>>2]|0;if(_){Y=(t|0)/(x|0)&-1;Z=(t|0)%(x|0)&-1;cf(u|0,90112,(v=i,i=i+32|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=Y,c[v+24>>2]=Z,v)|0);Z=c[7262]|0;al=+h[d+56>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);_=c[d+64>>2]|0;Y=(_|0)/(x|0)&-1;z=(_|0)%(x|0)&-1;cf(Z|0,89384,(v=i,i=i+32|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=Y,c[v+24>>2]=z,v)|0);z=c[7262]|0;al=+h[d+96>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[d+104>>3];am=+P(+al);do{if(am<1.0e-14){be(F|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(F|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(F|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,88904,(v=i,i=i+16|0,c[v>>2]=D,c[v+8>>2]=F,v)|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}cf(u|0,88336,(v=i,i=i+24|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=t,v)|0);Z=c[7262]|0;al=+h[d+56>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);t=c[d+64>>2]|0;cf(Z|0,87048,(v=i,i=i+24|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=t,v)|0);t=c[7262]|0;al=+h[d+80>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,86e3,(v=i,i=i+8|0,c[v>>2]=D,v)|0);Z=c[7262]|0;al=+h[d+72>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(Z|0,84768,(v=i,i=i+8|0,c[v>>2]=D,v)|0);t=c[7262]|0;al=+h[d+88>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,86e3,(v=i,i=i+8|0,c[v>>2]=D,v)|0);Z=c[7262]|0;aF(10,Z|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}uD(l|0,r|0,112);uD(k|0,s|0,112);Z=e|0;u=f|0;F=j|0;if($){bk=~~+bQ(+aS)+1|0}else{bk=1}z=c[7262]|0;if(!((z|0)==(c[n>>2]|0)|(z|0)==(c[m>>2]|0))){lb(l,144920);lb(k,143296);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=140096,h[v+8>>3]=aJ,v)|0);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=138e3,h[v+8>>3]=aK,v)|0);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=136336,h[v+8>>3]=aL,v)|0);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=134616,h[v+8>>3]=aH,v)|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}z=bk+4|0;uF(F|0,132920,z|0);a[j+z|0]=0;z=c[7262]|0;if((z|0)==0){x=c[m>>2]|0;c[7262]=x;bl=x}else{bl=z}aF(10,bl|0);z=c[7262]|0;aI(130456,11,1,z|0);z=c[7262]|0;al=+h[l+8>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+8>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,129328,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;al=+h[l+16>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+16>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf($|0,128056,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);z=c[7262]|0;al=+h[l+24>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+24>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,126736,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;al=+h[l+32>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+32>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf($|0,125656,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);z=c[7262]|0;aF(10,z|0);z=c[7262]|0;al=+h[l+40>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);$=c[l+48>>2]|0;al=+h[k+40>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);D=c[k+48>>2]|0;cf(z|0,124424,(v=i,i=i+48|0,c[v>>2]=Z,c[v+8>>2]=bk,c[v+16>>2]=$,c[v+24>>2]=u,c[v+32>>2]=bk,c[v+40>>2]=D,v)|0);D=c[7262]|0;al=+h[l+56>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);$=c[l+64>>2]|0;al=+h[k+56>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);z=c[k+64>>2]|0;cf(D|0,122968,(v=i,i=i+48|0,c[v>>2]=Z,c[v+8>>2]=bk,c[v+16>>2]=$,c[v+24>>2]=u,c[v+32>>2]=bk,c[v+40>>2]=z,v)|0);z=c[7262]|0;al=+h[l+80>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+80>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,121824,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;al=+h[l+72>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+72>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf($|0,119880,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);z=c[7262]|0;al=+h[l+88>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+88>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,121824,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;aF(10,$|0);$=c[7262]|0;if(aK<0.0){al=-0.0-aK;cf($|0,116720,(v=i,i=i+16|0,h[v>>3]=aJ,h[v+8>>3]=al,v)|0)}else{cf($|0,115856,(v=i,i=i+16|0,h[v>>3]=aJ,h[v+8>>3]=aK,v)|0)}$=c[7262]|0;cf($|0,114952,(v=i,i=i+8|0,h[v>>3]=aL,v)|0);$=c[7262]|0;cf($|0,113880,(v=i,i=i+8|0,h[v>>3]=aH,v)|0);$=c[7262]|0;aF(10,$|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}else if((I|0)==10339){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10340){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10341){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10342){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10343){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10345){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10346){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10347){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10348){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10349){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10350){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10351){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10087){c[13898]=aC}c[3556]=0;bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[3558]=0;B=y;uf(B,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function la(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a>>3];d=+h[b>>3];if(c<d){e=-1;return e|0}e=c>d&1;return e|0}function lb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,m=0;d=i;e=a;a=i;i=i+112|0;uD(a,e,112);f=+h[a+8>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=105792,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+16>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=104736,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+24>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=104152,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+32>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=103792,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+40>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=103256,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);e=c[a>>2]|0;if((e|0)==0){g=c[7262]|0;f=+h[a+80>>3];cf(g|0,106776,(v=i,i=i+24|0,c[v>>2]=101216,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);g=c[7262]|0;f=+h[a+72>>3];cf(g|0,106776,(v=i,i=i+24|0,c[v>>2]=100616,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);g=c[7262]|0;f=+h[a+88>>3];cf(g|0,106776,(v=i,i=i+24|0,c[v>>2]=99968,c[v+8>>2]=b,h[v+16>>3]=f,v)|0)}f=+h[a+56>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=99528,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);g=c[7262]|0;j=c[a+48>>2]|0;if((e|0)>0){k=(j|0)/(e|0)&-1;cf(g|0,99104,(v=i,i=i+24|0,c[v>>2]=98432,c[v+8>>2]=b,c[v+16>>2]=k,v)|0);k=c[7262]|0;l=(j|0)%(e|0)&-1;cf(k|0,99104,(v=i,i=i+24|0,c[v>>2]=97816,c[v+8>>2]=b,c[v+16>>2]=l,v)|0);l=c[7262]|0;k=c[a+64>>2]|0;m=(k|0)/(e|0)&-1;cf(l|0,99104,(v=i,i=i+24|0,c[v>>2]=97216,c[v+8>>2]=b,c[v+16>>2]=m,v)|0);m=c[7262]|0;l=(k|0)%(e|0)&-1;cf(m|0,99104,(v=i,i=i+24|0,c[v>>2]=96656,c[v+8>>2]=b,c[v+16>>2]=l,v)|0);l=c[7262]|0;f=+h[a+96>>3];cf(l|0,106776,(v=i,i=i+24|0,c[v>>2]=96240,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);l=c[7262]|0;f=+h[a+104>>3];cf(l|0,106776,(v=i,i=i+24|0,c[v>>2]=95776,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);i=d;return}else{cf(g|0,99104,(v=i,i=i+24|0,c[v>>2]=95288,c[v+8>>2]=b,c[v+16>>2]=j,v)|0);j=c[7262]|0;g=c[a+64>>2]|0;cf(j|0,99104,(v=i,i=i+24|0,c[v>>2]=94824,c[v+8>>2]=b,c[v+16>>2]=g,v)|0);i=d;return}}function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;f=i;i=i+32|0;g=f|0;j=d<<4;k=ut(j)|0;do{if((k|0)==0){gk();l=ut(j)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=223576,v)|0)}else{m=k}}while(0);k=m;j=(e|0)>0;if(j){n=e;o=(d|0)/(e|0)&-1}else{n=0;o=d}e=(d|0)>0;if(e){l=0;p=0.0;q=0.0;r=0.0;s=0.0;while(1){t=+h[b+(l<<3)>>3];u=p+t;w=q+t*t;if(j){x=s+t*+((l|0)/(n|0)&-1|0);y=r+t*+((l|0)%(n|0)&-1|0)}else{x=s;y=r}z=l+1|0;if((z|0)<(d|0)){l=z;p=u;q=w;r=y;s=x}else{A=u;B=w;C=y;D=x;break}}}else{A=0.0;B=0.0;C=0.0;D=0.0}x=+(d|0);y=A/x;s=+Q(+(B/x-y*y));if(e){e=0;do{h[k+(e<<4)>>3]=+h[b+(e<<3)>>3];c[k+(e<<4)+8>>2]=e;e=e+1|0;}while((e|0)<(d|0))}bM(m|0,d|0,16,4);e=g;c[e>>2]=c[m>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[e+12>>2]=c[m+12>>2];b=d-1|0;l=k+(b<<4)|0;j=g+16|0;c[j>>2]=c[l>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];if((d&1|0)==0){l=(d|0)/2&-1;E=(+h[k+(l-1<<4)>>3]+ +h[k+(l<<4)>>3])*.5}else{E=+h[k+(((b|0)/2&-1)<<4)>>3]}if((d&3|0)==0){b=(d|0)/4&-1;l=d-b|0;F=(+h[k+(l<<4)>>3]+ +h[k+(l-1<<4)>>3])*.5;G=(+h[k+(b-1<<4)>>3]+ +h[k+(b<<4)>>3])*.5}else{b=(d+3|0)/4&-1;F=+h[k+(d-b<<4)>>3];G=+h[k+(b-1<<4)>>3]}if(C==0.0&D==0.0){H=0.0;I=0.0}else{H=D/A;I=C/A}uu(m);c[a>>2]=n;c[a+4>>2]=o;h[a+8>>3]=y;h[a+16>>3]=s;h[a+24>>3]=A;h[a+32>>3]=B;o=a+40|0;c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];c[o+16>>2]=c[e+16>>2];c[o+20>>2]=c[e+20>>2];c[o+24>>2]=c[e+24>>2];c[o+28>>2]=c[e+28>>2];h[a+72>>3]=E;h[a+80>>3]=G;h[a+88>>3]=F;h[a+96>>3]=I;h[a+104>>3]=H;i=f;return}function ld(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;g=b;b=i;i=i+112|0;uD(b,g,112);j=+h[b+8>>3];g=(d|0)!=0?d:179864;d=(e|0)!=0?e:179864;e=uA(g|0)|0;k=(e+5|0)+(uA(d|0)|0)|0;e=ut(k)|0;do{if((e|0)==0){gk();l=ut(k)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{m=e}}while(0);be(m|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=105792,c[v+16>>2]=d,v)|0);e=e6(m)|0;c[e+16>>2]=2;h[e+24>>3]=j;h[e+32>>3]=0.0;a[e+8|0]=0;uu(m);j=+h[b+16>>3];m=uA(g|0)|0;e=(m+7|0)+(uA(d|0)|0)|0;m=ut(e)|0;do{if((m|0)==0){gk();k=ut(e)|0;if((k|0)!=0){n=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{n=m}}while(0);be(n|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=104736,c[v+16>>2]=d,v)|0);m=e6(n)|0;c[m+16>>2]=2;h[m+24>>3]=j;h[m+32>>3]=0.0;a[m+8|0]=0;uu(n);j=+h[b+24>>3];n=uA(g|0)|0;m=(n+4|0)+(uA(d|0)|0)|0;n=ut(m)|0;do{if((n|0)==0){gk();e=ut(m)|0;if((e|0)!=0){o=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{o=n}}while(0);be(o|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=104152,c[v+16>>2]=d,v)|0);n=e6(o)|0;c[n+16>>2]=2;h[n+24>>3]=j;h[n+32>>3]=0.0;a[n+8|0]=0;uu(o);j=+h[b+32>>3];o=uA(g|0)|0;n=(o+6|0)+(uA(d|0)|0)|0;o=ut(n)|0;do{if((o|0)==0){gk();m=ut(n)|0;if((m|0)!=0){p=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{p=o}}while(0);be(p|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=73440,c[v+16>>2]=d,v)|0);o=e6(p)|0;c[o+16>>2]=2;h[o+24>>3]=j;h[o+32>>3]=0.0;a[o+8|0]=0;uu(p);j=+h[b+40>>3];p=uA(g|0)|0;o=(p+4|0)+(uA(d|0)|0)|0;p=ut(o)|0;do{if((p|0)==0){gk();n=ut(o)|0;if((n|0)!=0){q=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{q=p}}while(0);be(q|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=103256,c[v+16>>2]=d,v)|0);p=e6(q)|0;c[p+16>>2]=2;h[p+24>>3]=j;h[p+32>>3]=0.0;a[p+8|0]=0;uu(q);j=+h[b+56>>3];q=uA(g|0)|0;p=(q+4|0)+(uA(d|0)|0)|0;q=ut(p)|0;do{if((q|0)==0){gk();o=ut(p)|0;if((o|0)!=0){r=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{r=q}}while(0);be(r|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=99528,c[v+16>>2]=d,v)|0);q=e6(r)|0;c[q+16>>2]=2;h[q+24>>3]=j;h[q+32>>3]=0.0;a[q+8|0]=0;uu(r);r=c[b>>2]|0;if((r|0)>0){q=c[b+48>>2]|0;j=+((q|0)/(r|0)&-1|0);p=uA(g|0)|0;o=(p+12|0)+(uA(d|0)|0)|0;p=ut(o)|0;do{if((p|0)==0){gk();n=ut(o)|0;if((n|0)!=0){s=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{s=p}}while(0);be(s|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=98432,c[v+16>>2]=d,v)|0);p=e6(s)|0;c[p+16>>2]=2;h[p+24>>3]=j;h[p+32>>3]=0.0;a[p+8|0]=0;uu(s);j=+((q|0)%(r|0)&-1|0);q=uA(g|0)|0;s=(q+12|0)+(uA(d|0)|0)|0;q=ut(s)|0;do{if((q|0)==0){gk();p=ut(s)|0;if((p|0)!=0){t=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{t=q}}while(0);be(t|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=97816,c[v+16>>2]=d,v)|0);q=e6(t)|0;c[q+16>>2]=2;h[q+24>>3]=j;h[q+32>>3]=0.0;a[q+8|0]=0;uu(t);t=c[b+64>>2]|0;j=+((t|0)/(r|0)&-1|0);q=uA(g|0)|0;s=(q+12|0)+(uA(d|0)|0)|0;q=ut(s)|0;do{if((q|0)==0){gk();p=ut(s)|0;if((p|0)!=0){u=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{u=q}}while(0);be(u|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=97216,c[v+16>>2]=d,v)|0);q=e6(u)|0;c[q+16>>2]=2;h[q+24>>3]=j;h[q+32>>3]=0.0;a[q+8|0]=0;uu(u);j=+((t|0)%(r|0)&-1|0);r=uA(g|0)|0;t=(r+12|0)+(uA(d|0)|0)|0;r=ut(t)|0;do{if((r|0)==0){gk();u=ut(t)|0;if((u|0)!=0){w=u;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{w=r}}while(0);be(w|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=96656,c[v+16>>2]=d,v)|0);r=e6(w)|0;c[r+16>>2]=2;h[r+24>>3]=j;h[r+32>>3]=0.0;a[r+8|0]=0;uu(w);i=f;return}j=+h[b+72>>3];w=uA(g|0)|0;r=(w+7|0)+(uA(d|0)|0)|0;w=ut(r)|0;do{if((w|0)==0){gk();t=ut(r)|0;if((t|0)!=0){x=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{x=w}}while(0);be(x|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=100616,c[v+16>>2]=d,v)|0);w=e6(x)|0;c[w+16>>2]=2;h[w+24>>3]=j;h[w+32>>3]=0.0;a[w+8|0]=0;uu(x);j=+h[b+80>>3];x=uA(g|0)|0;w=(x+12|0)+(uA(d|0)|0)|0;x=ut(w)|0;do{if((x|0)==0){gk();r=ut(w)|0;if((r|0)!=0){y=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{y=x}}while(0);be(y|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=101216,c[v+16>>2]=d,v)|0);x=e6(y)|0;c[x+16>>2]=2;h[x+24>>3]=j;h[x+32>>3]=0.0;a[x+8|0]=0;uu(y);j=+h[b+88>>3];y=uA(g|0)|0;x=(y+12|0)+(uA(d|0)|0)|0;y=ut(x)|0;do{if((y|0)==0){gk();w=ut(x)|0;if((w|0)!=0){z=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{z=y}}while(0);be(z|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=99968,c[v+16>>2]=d,v)|0);y=e6(z)|0;c[y+16>>2]=2;h[y+24>>3]=j;h[y+32>>3]=0.0;a[y+8|0]=0;uu(z);j=+(c[b+48>>2]|0);z=uA(g|0)|0;y=(z+10|0)+(uA(d|0)|0)|0;z=ut(y)|0;do{if((z|0)==0){gk();x=ut(y)|0;if((x|0)!=0){A=x;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{A=z}}while(0);be(A|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=72824,c[v+16>>2]=d,v)|0);z=e6(A)|0;c[z+16>>2]=2;h[z+24>>3]=j;h[z+32>>3]=0.0;a[z+8|0]=0;uu(A);j=+(c[b+64>>2]|0);b=uA(g|0)|0;A=(b+10|0)+(uA(d|0)|0)|0;b=ut(A)|0;do{if((b|0)==0){gk();z=ut(A)|0;if((z|0)!=0){B=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{B=b}}while(0);be(B|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=225064,c[v+16>>2]=d,v)|0);d=e6(B)|0;c[d+16>>2]=2;h[d+24>>3]=j;h[d+32>>3]=0.0;a[d+8|0]=0;uu(B);i=f;return}function le(b,d,e){b=+b;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0;f=i;i=i+48|0;g=f|0;do{if((c[64808+(d*688&-1)>>2]|0)==1){j=64864+(d*688&-1)|0;if((aY(j|0,132824)|0)==0){ud(e,150,74984,1.0,b);break}a[e]=34;k=e+1|0;t3(g,b);l=b- +O(+b);t4(k,149,j,g,l);j=a8(e|0,10)|0;if((j|0)!=0){k=j;do{a[k]=32;k=a8(e|0,10)|0;}while((k|0)!=0)}k=e+(uA(e|0)|0)|0;w=34;a[k]=w&255;w=w>>8;a[k+1|0]=w&255}else{if((a[64788+(d*688&-1)|0]&1)==0){ud(e,150,64864+(d*688&-1)|0,1.0,b);break}else{ud(e,150,64864+(d*688&-1)|0,1.0,+R(+(+h[64792+(d*688&-1)>>3]),+b));break}}}while(0);aK(e|0,c[8248]|0);aF(32,c[8248]|0);i=f;return}function lf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0;e=i;f=ut(150)|0;do{if((f|0)==0){gk();g=ut(150)|0;if((g|0)!=0){j=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=126456,v)|0)}else{j=f}}while(0);f=c[3526]|0;g=(f|0)!=0?f:c[10030]|0;c[8248]=g;if((d|0)>0){k=0;l=b;n=g}else{o=g;p=aD(o|0)|0;uu(j);i=e;return}L14252:while(1){g=l+300|0;b=c[g>>2]|0;cf(n|0,203280,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=d,c[v+16>>2]=b,v)|0);b=c[l+16>>2]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}f=uA(b|0)<<1;q=ut(f)|0;if((q|0)==0){gk();r=ut(f)|0;if((r|0)==0){s=10464;break L14252}else{t=r}}else{t=q}q=t;r=b;while(1){f=a[r]|0;if(f<<24>>24==10){u=q+1|0;a[q]=92;a[u]=110;w=u}else{a[q]=f;w=q}if((a[r]|0)==0){break}else{q=w+1|0;r=r+1|0}}cf(c[8248]|0,15e4,(v=i,i=i+8|0,c[v>>2]=t,v)|0);uu(t)}}while(0);aI(132264,6,1,c[8248]|0);b=l+12|0;r=c[b>>2]|0;do{if((r|0)==137|(r|0)==118){q=c[8248]|0;aI(96928,22,1,q|0)}else if((r|0)==252){aI(75296,29,1,c[8248]|0)}else if((r|0)==416|(r|0)==432){aI(204480,22,1,c[8248]|0)}else if((r|0)==400){aI(210472,7,1,c[8248]|0)}else if((r|0)==257){aI(82936,23,1,c[8248]|0)}else if((r|0)==153|(r|0)==86){aI(119232,11,1,c[8248]|0)}else if((r|0)==345){aI(90824,4,1,c[8248]|0)}else if((r|0)==169|(r|0)==102){aI(103984,11,1,c[8248]|0)}else if((r|0)==225){aI(215896,16,1,c[8248]|0)}else if((r|0)==368){aI(222792,6,1,c[8248]|0)}else if(!((r|0)==1|(r|0)==18|(r|0)==51|(r|0)==64|(r|0)==33|(r|0)==177|(r|0)==193|(r|0)==209)){if((a[37400]&1)==0){break}cf(c[m>>2]|0,200512,(v=i,i=i+8|0,c[v>>2]=(r|0)==392?195192:184488,v)|0)}}while(0);r=l+316|0;if((c[r>>2]|0)!=0){q=c[8248]|0;aI(179312,7,1,q|0)}aI(175152,6,1,c[8248]|0);q=c[b>>2]|0;do{if((q|0)==392){x=(c[c[l+276>>2]>>2]|0)==4?102:392;s=10499}else if((q|0)==368){f=c[c[l+224>>2]>>2]|0;if((f|0)==0){break}u=l+304|0;y=l+308|0;z=f;do{f=c[z+60>>2]|0;A=uA(f|0)<<1;B=ut(A)|0;if((B|0)==0){gk();C=ut(A)|0;if((C|0)==0){s=10491;break L14252}else{D=C}}else{D=B}B=D;C=f;while(1){f=a[C]|0;if(f<<24>>24==10){A=B+1|0;a[B]=92;a[A]=110;E=A}else{a[B]=f;E=B}if((a[C]|0)==0){break}else{B=E+1|0;C=C+1|0}}le(+h[z+24>>3],c[u>>2]|0,j);le(+h[z+32>>3],c[y>>2]|0,j);cf(c[8248]|0,171376,(v=i,i=i+8|0,c[v>>2]=D,v)|0);uu(D);z=c[z>>2]|0;}while((z|0)!=0)}else{x=q;s=10499}}while(0);do{if((s|0)==10499){s=0;q=l+320|0;if((c[g>>2]|0)<=0){break}b=l+304|0;z=l+308|0;y=l+72|0;u=l+64|0;C=l+28|0;B=c[q>>2]|0;f=0;while(1){if((uG(B|0,56440,64)|0)==0){A=c[8248]|0;aF(10,A|0)}else{A=B+8|0;le(+h[A>>3],c[b>>2]|0,j);F=B+16|0;le(+h[F>>3],c[z>>2]|0,j);if((x|0)==345){le(+h[B+40>>3],c[z>>2]|0,j)}else if((x|0)==169|(x|0)==102){s=10506}else if((x|0)==400){cf(c[8248]|0,184536,(v=i,i=i+8|0,h[v>>3]=+h[B+24>>3],v)|0)}else if((x|0)==416|(x|0)==432){cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+40>>3],v)|0);cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+48>>3],v)|0);cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+56>>3],v)|0);cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+32>>3],v)|0)}else if((x|0)==153|(x|0)==86){le(+h[B+48>>3],c[b>>2]|0,j);le(+h[B+56>>3],c[b>>2]|0,j)}else if((x|0)==137|(x|0)==118){le(+h[B+48>>3],c[b>>2]|0,j);le(+h[B+56>>3],c[b>>2]|0,j);s=10506}else if((x|0)==257){le(+h[B+32>>3],c[z>>2]|0,j);le(+h[B+40>>3],c[z>>2]|0,j);le(+h[B+24>>3],c[z>>2]|0,j)}else if((x|0)==252){le(+h[B+32>>3],c[z>>2]|0,j);le(+h[B+40>>3],c[z>>2]|0,j);le(+h[B+24>>3],c[z>>2]|0,j);le((+h[A>>3]- +h[B+48>>3])*2.0,c[b>>2]|0,j)}else if((x|0)==225){le(+h[B+56>>3]- +h[A>>3],c[b>>2]|0,j);le(+h[B+40>>3]- +h[F>>3],c[z>>2]|0,j)}if((s|0)==10506){s=0;le(+h[B+32>>3],c[z>>2]|0,j);le(+h[B+40>>3],c[z>>2]|0,j)}F=c[r>>2]|0;do{if((F|0)!=0){G=+h[F+(f<<3)>>3];A=c[u>>2]|0;if(+h[y>>3]<0.0&(A|0)==3){H=c[8248]|0;I=~~G;cf(H|0,150832,(v=i,i=i+8|0,c[v>>2]=I,v)|0);break}if((A|0)==6){le(G,3,j);break}if((c[C>>2]|0)!=-6){break}le(G,3,j)}}while(0);F=c[8248]|0;A=c[(c[q>>2]|0)+(f<<6)>>2]|0;if((A|0)==0){J=105}else{J=(A|0)==1?111:117}cf(F|0,148928,(v=i,i=i+8|0,c[v>>2]=J,v)|0)}F=f+1|0;if((F|0)<(c[g>>2]|0)){B=B+64|0;f=F}else{break}}}}while(0);aF(10,c[8248]|0);g=k+1|0;r=c[8248]|0;if((g|0)<(d|0)){k=g;l=c[l>>2]|0;n=r}else{o=r;s=10527;break}}if((s|0)==10527){p=aD(o|0)|0;uu(j);i=e;return}else if((s|0)==10464){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}else if((s|0)==10491){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}}function lg(){var b=0.0,d=0,e=0.0,f=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0;if((a[33656]&1)==0){return}b=+h[4211];d=c[8417]|0;e=+(d|0);g[178]=b/e;f=+h[4212];i=c[8416]|0;j=+(i|0);k=f/j;g[38]=k;l=+(c[8420]|0)/e;g[184]=l;m=c[8419]|0;if((a[33673]&1)==0){n=+(m|0)/j}else{n=1.0- +(m+1|0)/j}j=n;g[44]=j;if((c[8453]|0)==0){o=j}else{n=1.0- +h[4243];g[38]=n*k;k=n*j;g[44]=k;o=k}g[184]=+h[4213]+(l-(b+-1.0)/+(d<<1|0));g[44]=+h[4214]+(o-(f+-1.0)/+(i<<1|0));return}function lh(){var b=0;if((a[14080]&1)==0){return}cM[c[(c[3524]|0)+168>>2]&511](5);do{if((a[33512]&1)==0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}else{c[8415]=(c[8415]|0)+1;if((a[33656]&1)==0){break}do{if((a[33672]&1)==0){b=(c[8420]|0)+1|0;c[8420]=b;if((b|0)!=(c[8417]|0)){break}c[8420]=0;b=(c[8419]|0)+1|0;c[8419]=b;if((b|0)!=(c[8416]|0)){break}c[8420]=0}else{b=(c[8419]|0)+1|0;c[8419]=b;if((b|0)!=(c[8416]|0)){break}c[8419]=0;b=(c[8420]|0)+1|0;c[8420]=b;if((b|0)!=(c[8417]|0)){break}c[8420]=0}}while(0);lg()}}while(0);aD(c[10030]|0);hN(c[8494]|0,c[8492]|0,27760,27744,27752,27736);hM();hW();return}function li(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;d=i;e=ut(150)|0;do{if((e|0)==0){gk();f=ut(150)|0;if((f|0)!=0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=146952,v)|0)}else{g=e}}while(0);e=c[3526]|0;f=(e|0)!=0?e:c[10030]|0;c[8248]=f;if((b|0)>0){j=0;k=43312;l=f}else{n=f;o=aD(n|0)|0;uu(g);i=d;return}L14377:while(1){f=c[k>>2]|0;cf(l|0,144784,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=b,v)|0);e=c[f+16>>2]|0;do{if((e|0)!=0){if((a[e]|0)==0){break}p=uA(e|0)<<1;q=ut(p)|0;if((q|0)==0){gk();r=ut(p)|0;if((r|0)==0){s=10562;break L14377}else{t=r}}else{t=q}q=t;r=e;while(1){p=a[r]|0;if(p<<24>>24==10){u=q+1|0;a[q]=92;a[u]=110;w=u}else{a[q]=p;w=q}if((a[r]|0)==0){break}else{q=w+1|0;r=r+1|0}}cf(c[8248]|0,15e4,(v=i,i=i+8|0,c[v>>2]=t,v)|0);uu(t)}}while(0);e=f+12|0;r=c[e>>2]|0;do{if((r|0)==368){q=c[c[f+224>>2]>>2]|0;if((q|0)==0){break}else{x=q}do{q=c[x+60>>2]|0;p=uA(q|0)<<1;u=ut(p)|0;if((u|0)==0){gk();y=ut(p)|0;if((y|0)==0){s=10573;break L14377}else{z=y}}else{z=u}u=z;y=q;while(1){q=a[y]|0;if(q<<24>>24==10){p=u+1|0;a[u]=92;a[p]=110;A=p}else{a[u]=q;A=u}if((a[y]|0)==0){break}else{u=A+1|0;y=y+1|0}}le(+h[x+24>>3],2,g);le(+h[x+32>>3],1,g);le(+h[x+40>>3],0,g);cf(c[8248]|0,171376,(v=i,i=i+8|0,c[v>>2]=z,v)|0);uu(z);x=c[x>>2]|0;}while((x|0)!=0)}else if((r|0)==1|(r|0)==18|(r|0)==33|(r|0)==64|(r|0)==225|(r|0)==400){if((a[46752]&1)!=0){y=c[f+260>>2]|0;L14410:do{if((y|0)==0){s=10584}else{u=f+252|0;q=0;p=y;while(1){B=c[8248]|0;if((q|0)>=(c[u>>2]|0)){C=B;break L14410}D=p+8|0;E=c[D>>2]|0;cf(B|0,141688,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=E,v)|0);if((c[e>>2]|0)==225){E=c[(c[p>>2]|0)+12>>2]|0;B=c[8248]|0;aI(139920,24,1,B|0);F=E}else{F=0}aI(175152,6,1,c[8248]|0);if((c[D>>2]|0)>0){E=c[p+12>>2]|0;B=F;G=0;while(1){H=E+8|0;le(+h[H>>3],2,g);I=E+16|0;le(+h[I>>3],1,g);J=E+24|0;le(+h[J>>3],0,g);K=c[e>>2]|0;if((K|0)==225){le(+h[B+8>>3]- +h[H>>3],2,g);le(+h[B+16>>3]- +h[I>>3],1,g);le(+h[B+24>>3]- +h[J>>3],0,g);L=B+64|0}else if((K|0)==400){cf(c[8248]|0,184536,(v=i,i=i+8|0,h[v>>3]=+h[E+32>>3],v)|0);L=B}else{L=B}K=c[E>>2]|0;if((K|0)==0){M=105}else{M=(K|0)==1?111:117}cf(c[8248]|0,137904,(v=i,i=i+8|0,c[v>>2]=M,v)|0);K=G+1|0;if((K|0)<(c[D>>2]|0)){E=E+64|0;B=L;G=K}else{break}}}G=c[p>>2]|0;if((G|0)==0){s=10584;break}else{q=q+1|0;p=G}}}}while(0);if((s|0)==10584){s=0;C=c[8248]|0}aF(10,C|0)}if((c[11690]|0)==0){break}y=c[f+256>>2]|0;if((y|0)==0){break}else{N=0;O=y}while(1){y=c[O+44>>2]|0;p=c[O+4>>2]|0;if((a[O+8|0]|0)==0){P=N}else{q=c[8248]|0;u=N+1|0;G=O+9|0;cf(q|0,136176,(v=i,i=i+16|0,c[v>>2]=N,c[v+8>>2]=G,v)|0);P=u}if((y|0)>0){u=y;y=p;while(1){p=u-1|0;le(+h[y+8>>3],2,g);le(+h[y+16>>3],1,g);le(+h[y+24>>3],0,g);aF(10,c[8248]|0);if((p|0)>0){u=p;y=y+64|0}else{break}}}aF(10,c[8248]|0);y=c[O>>2]|0;if((y|0)==0){break}else{N=P;O=y}}}else{aI(143080,53,1,c[m>>2]|0)}}while(0);e=j+1|0;r=c[8248]|0;if((e|0)<(b|0)){j=e;k=f|0;l=r}else{n=r;s=10608;break}}if((s|0)==10562){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}else if((s|0)==10608){o=aD(n|0)|0;uu(g);i=d;return}else if((s|0)==10573){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}}function lj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=(b|0)==0;if((c[8244]|0)==(b|0)&(e^1)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=141656,v)|0)}if((a[33512]&1)!=0){f=c[m>>2]|0;aI(139872,46,1,f|0);i=d;return}f=c[3524]|0;do{if((f|0)!=0){if((a[14080]&1)==0){break}cS[c[f+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);if(e){a[33072]=0;if((c[8244]|0)==0){i=d;return}e=c[10030]|0;do{if(a[32984]|0){a2(e|0);a[32984]=0}else{if((e|0)==(c[10028]|0)){break}az(e|0)}}while(0);c[10030]=c[n>>2];uu(c[8244]|0);c[8244]=0;e=c[10028]|0;if((e|0)!=0){az(e|0)}c[10028]=0;i=d;return}do{if((a[b]|0)==124){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=bt(b+1|0,137896)|0;if((e|0)==0){uj(c[13898]|0,136136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{a[32984]=1;g=e;break}}else{e=c[3524]|0;do{if((e|0)==0){h=10634}else{if((c[e+96>>2]&4|0)==0){h=10634;break}j=bF(b|0,134520)|0}}while(0);if((h|0)==10634){j=bF(b|0,137896)|0}if((j|0)!=0){g=j;break}uj(c[13898]|0,132784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[33072]=0;if((c[8244]|0)!=0){j=c[10030]|0;do{if(a[32984]|0){a2(j|0);a[32984]=0}else{if((j|0)==(c[10028]|0)){break}az(j|0)}}while(0);c[10030]=c[n>>2];uu(c[8244]|0);c[8244]=0;j=c[10028]|0;if((j|0)!=0){az(j|0)}c[10028]=0}c[10030]=g;c[8244]=b;b=c[3524]|0;if((b|0)==0){k=0}else{k=(c[b+96>>2]|0)>>>2&1}a[33072]=k;i=d;return}function lk(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=c[3524]|0;if((d|0)==0){uf(-1,131560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[8244]|0;L14513:do{if((e|0)!=0){do{if((c[d+96>>2]&64|0)==0){f=e}else{if((a[37400]&1)==0){g=e}else{h=c[m>>2]|0;cf(h|0,130376,(v=i,i=i+8|0,c[v>>2]=e,v)|0);g=c[8244]|0}a[33072]=0;if((g|0)==0){break L14513}h=c[10030]|0;do{if(a[32984]|0){a2(h|0);a[32984]=0}else{if((h|0)==(c[10028]|0)){break}az(h|0)}}while(0);c[10030]=c[n>>2];uu(c[8244]|0);c[8244]=0;h=c[10028]|0;if((h|0)==0){c[10028]=0;break L14513}else{az(h|0);h=c[8244]|0;c[10028]=0;if((h|0)==0){break L14513}else{f=h;break}}}}while(0);h=(a[33072]&1)==0;if((c[(c[3524]|0)+96>>2]&4|0)==0){if(h){break}}else{if(!h){break}}h=(uA(f|0)|0)+1|0;j=ut(h)|0;do{if((j|0)==0){gk();k=ut(h)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129080,v)|0)}else{l=j}}while(0);j=c[8244]|0;uB(l|0,j|0);lj(l);if((l|0)==(c[8244]|0)|(l|0)==0){break}uu(l)}}while(0);if((a[14080]&1)!=0){i=b;return}cS[c[(c[3524]|0)+36>>2]&511]();a[14080]=1;i=b;return}function ll(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0.0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0,ao=0,ap=0,aq=0,ar=0,as=0.0,at=0,au=0,av=0.0,aw=0.0,ax=0,ay=0.0,az=0,aA=0,aB=0,aC=0.0;b=i;i=i+208|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=b+120|0;m=b+144|0;n=b+168|0;o=b+192|0;p=b+200|0;c[13898]=(c[13898]|0)+1;if((a[33512]&1)!=0){lm()}if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}q=c[(c[3524]|0)+104>>2]|0;if((q|0)!=0){cS[q&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);q=c[3524]|0;if((c[q+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[q+8>>2]|0)-1;c[13882]=0;c[13883]=(c[q+12>>2]|0)-1;a[33656]=0;c[8415]=0;a[33936]=0;q=c[13898]|0;r=c[8272]|0;L14563:do{if((q|0)<(r|0)){s=m|0;t=m+8|0;u=j|0;w=j+8|0;x=f|0;y=f+8|0;z=e|0;A=e+8|0;B=d|0;C=d+8|0;D=l|0;E=l+8|0;F=k|0;G=k+8|0;H=n|0;I=n+8|0;J=q;K=r;L14565:while(1){L=c[1054]|0;M=(a[L+(J*40&-1)|0]&1)==0;N=c[L+(J*40&-1)+36>>2]|0;O=L+(J*40&-1)+32|0;L14567:do{if(M){P=c[O>>2]|0;Q=10719}else{R=c[10036]|0;S=0;while(1){if((S|0)>=(N|0)){Q=10700;break}if((a[R+((c[O>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break}}if((Q|0)==10700){Q=0;if((S|0)==1){break L14563}}R=c[O>>2]|0;if(!((N|0)>0&(M^1))){P=R;Q=10719;break}T=c[10036]|0;U=0;V=0;W=R;while(1){if((a[U+125568|0]|0)==(a[T+(U+W|0)|0]|0)){X=W;Y=V}else{if((U|0)!=2){P=R;Q=10719;break L14567}X=W-1|0;Y=1}Z=U+1|0;if((Z|0)<(Y+N|0)){U=Z;V=Y;W=X}else{break}}if((Y|0)==0){if(!((U|0)==5|(U|0)==1)){P=R;Q=10719;break}}W=J+1|0;c[13898]=W;if((W|0)>=(K|0)){break}L14588:do{if((a[L+(W*40&-1)|0]&1)!=0){V=c[L+(W*40&-1)+36>>2]|0;T=L+(W*40&-1)+32|0;S=c[10036]|0;Z=0;while(1){if((Z|0)>=(V|0)){break}if((a[S+((c[T>>2]|0)+Z|0)|0]|0)==(a[Z+103664|0]|0)){Z=Z+1|0}else{break L14588}}if((Z|0)==1){break L14567}}}while(0);a[14176]=1;is(n);a[14176]=0;if((c[H>>2]|0)!=3){c[13898]=W;break}R=c[I>>2]|0;if((R|0)==0){break}uu(c[8453]|0);c[8453]=R}}while(0);L14599:do{if((Q|0)==10719){Q=0;L14601:do{if((K|0)>(J|0)){if(M){Q=10765;break}O=c[10036]|0;R=0;while(1){if((R|0)>=(N|0)){break}if((a[O+(P+R|0)|0]|0)==(a[R+124352|0]|0)){R=R+1|0}else{Q=10735;break L14601}}if((R|0)!=4){Q=10735;break}Z=J+1|0;c[13898]=Z;if((Z|0)>=(K|0)){break L14599}L14610:do{if((a[L+(Z*40&-1)|0]&1)!=0){U=c[L+(Z*40&-1)+36>>2]|0;T=L+(Z*40&-1)+32|0;S=0;while(1){if((S|0)>=(U|0)){break}if((a[O+((c[T>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L14610}}if((S|0)==1){break L14599}}}while(0);a[14176]=1;is(m);a[14176]=0;if((c[s>>2]|0)!=3){c[13898]=Z;break L14599}O=c[t>>2]|0;if((O|0)==0){break L14599}uu(c[8454]|0);c[8454]=O;break L14599}else{Q=10735}}while(0);L14621:do{if((Q|0)==10735){Q=0;if(M){Q=10765;break}do{if((N|0)>0){W=c[10036]|0;O=0;R=0;T=P;while(1){if((a[O+122880|0]|0)==(a[W+(O+T|0)|0]|0)){_=T;$=R}else{if((O|0)!=3){break}_=T-1|0;$=1}U=O+1|0;if((U|0)<($+N|0)){O=U;R=$;T=_}else{Q=10742;break}}do{if((Q|0)==10742){Q=0;if(($|0)==0){if(!((O|0)==2|(O|0)==8)){break}}a[33936]=0;c[13898]=J+1;break L14599}}while(0);if(M){Q=10765;break L14621}L14639:do{if((N|0)>0){O=c[10036]|0;T=0;R=0;W=P;while(1){if((a[T+121536|0]|0)==(a[O+(T+W|0)|0]|0)){ab=W;ac=R}else{if((T|0)!=5){break L14639}ab=W-1|0;ac=1}S=T+1|0;if((S|0)<(ac+N|0)){T=S;R=ac;W=ab}else{break}}if((ac|0)==0){if(!((T|0)==4|(T|0)==10)){break}}a[33936]=1;c[13898]=J+1;break L14599}}while(0);if(M){Q=10765;break L14621}if((N|0)<=0){break}W=c[10036]|0;R=0;O=0;S=P;while(1){if((a[R+119784|0]|0)==(a[W+(R+S|0)|0]|0)){ad=S;ae=O}else{if((R|0)!=3){Q=10765;break L14621}ad=S-1|0;ae=1}af=R+1|0;if((af|0)<(ae+N|0)){R=af;O=ae;S=ad}else{break}}do{if((ae|0)!=0|(af|0)==3){if((a[33656]&1)!=0){Q=10925;break L14565}}else{S=(a[33656]&1)!=0;if((af|0)==7){if(S){Q=10926;break L14565}else{break}}else{if(S){break L14621}else{Q=10920;break L14565}}}}while(0);a[33656]=1;ag=J+1|0;c[13898]=ag;if((ag|0)>=(K|0)){Q=10923;break L14565}L14669:do{if((a[L+(ag*40&-1)|0]&1)!=0){S=c[L+(ag*40&-1)+36>>2]|0;O=L+(ag*40&-1)+32|0;R=c[10036]|0;W=0;while(1){if((W|0)>=(S|0)){break}if((a[R+((c[O>>2]|0)+W|0)|0]|0)==(a[W+103664|0]|0)){W=W+1|0}else{break L14669}}if((W|0)==1){Q=10924;break L14565}}}while(0);O=is(l)|0;R=c[O>>2]|0;if((R|0)==1){ah=+(c[O+8>>2]|0)}else if((R|0)==2){ah=+h[O+8>>3]}else if((R|0)==3){ah=+uz(c[O+8>>2]|0,0)}else{Q=10781;break L14565}if((c[D>>2]|0)==3){uu(c[E>>2]|0);c[D>>2]=1}c[8416]=~~ah;ai=c[13898]|0;O=c[8272]|0;if((ai|0)>=(O|0)){Q=10939;break L14565}R=c[1054]|0;S=(a[R+(ai*40&-1)|0]&1)==0;if(S){Q=10934;break L14565}T=c[R+(ai*40&-1)+36>>2]|0;U=R+(ai*40&-1)+32|0;V=c[10036]|0;aj=0;while(1){if((aj|0)>=(T|0)){Q=10789;break}if((a[V+((c[U>>2]|0)+aj|0)|0]|0)==(a[aj+103664|0]|0)){aj=aj+1|0}else{Q=10790;break}}if((Q|0)==10790){Q=0;if(S){Q=10935;break L14565}}else if((Q|0)==10789){Q=0;if((aj|0)==1|S){Q=10936;break L14565}}U=c[R+(ai*40&-1)+36>>2]|0;V=R+(ai*40&-1)+32|0;T=c[10036]|0;ak=0;while(1){if((ak|0)>=(U|0)){break}if((a[T+((c[V>>2]|0)+ak|0)|0]|0)==(a[ak+148464|0]|0)){ak=ak+1|0}else{Q=10937;break L14565}}if((ak|0)!=1){Q=10938;break L14565}al=ai+1|0;c[13898]=al;if((al|0)>=(O|0)){Q=10929;break L14565}L14699:do{if((a[R+(al*40&-1)|0]&1)!=0){V=c[R+(al*40&-1)+36>>2]|0;U=R+(al*40&-1)+32|0;S=0;while(1){if((S|0)>=(V|0)){break}if((a[T+((c[U>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L14699}}if((S|0)==1){Q=10930;break L14565}}}while(0);T=is(k)|0;R=c[T>>2]|0;if((R|0)==2){am=+h[T+8>>3]}else if((R|0)==3){am=+uz(c[T+8>>2]|0,0)}else if((R|0)==1){am=+(c[T+8>>2]|0)}else{Q=10807;break L14565}if((c[F>>2]|0)==3){uu(c[G>>2]|0);c[F>>2]=1}c[8417]=~~am;h[4215]=+g[178];h[4216]=+g[38];h[4217]=+g[184];h[4218]=+g[44];c[8419]=0;c[8420]=0;break L14599}}while(0);if((a[33656]&1)==0){Q=10922;break L14565}}}while(0);if((Q|0)==10765){Q=0;if((a[33656]&1)==0){Q=10921;break L14565}}Z=(N|0)>0;T=c[10036]|0;R=23840;O=119784;L14718:while(1){L14720:do{if(!M){if(Z){ak=0;U=0;V=P;while(1){W=a[O+ak|0]|0;if(W<<24>>24==(a[T+(ak+V|0)|0]|0)){an=V;ao=U}else{if(W<<24>>24!=36){break L14720}an=V-1|0;ao=1}ap=ak+1|0;if((ap|0)<(ao+N|0)){ak=ap;U=ao;V=an}else{break}}if((ao|0)==0){aq=ap}else{ar=R;break L14718}}else{aq=0}V=a[O+aq|0]|0;if((V<<24>>24|0)==36|(V<<24>>24|0)==0){ar=R;break L14718}}}while(0);V=R+8|0;U=c[V>>2]|0;if((U|0)==0){ar=V;break}else{R=V;O=U}}O=c[ar+4>>2]|0;if((O|0)==1){a[33672]=1;c[13898]=J+1;break}else if((O|0)==6){c[13898]=J+1;R=is(e)|0;T=c[R>>2]|0;if((T|0)==1){as=+(c[R+8>>2]|0)}else if((T|0)==2){as=+h[R+8>>3]}else if((T|0)==3){as=+uz(c[R+8>>2]|0,0)}else{Q=10865;break L14565}if((c[z>>2]|0)==3){uu(c[A>>2]|0);c[z>>2]=1}h[4213]=as;h[4214]=as;R=c[13898]|0;T=c[8272]|0;if((R|0)>=(T|0)){break}Z=c[1054]|0;U=(a[Z+(R*40&-1)|0]&1)==0;if(U){break}V=c[Z+(R*40&-1)+36>>2]|0;ak=Z+(R*40&-1)+32|0;W=c[10036]|0;aj=0;while(1){if((aj|0)>=(V|0)){Q=10873;break}if((a[W+((c[ak>>2]|0)+aj|0)|0]|0)==(a[aj+103664|0]|0)){aj=aj+1|0}else{Q=10874;break}}if((Q|0)==10873){Q=0;if((aj|0)==1|U){break}}else if((Q|0)==10874){Q=0;if(U){break}}ak=c[Z+(R*40&-1)+36>>2]|0;W=Z+(R*40&-1)+32|0;V=c[10036]|0;at=0;while(1){if((at|0)>=(ak|0)){break}if((a[V+((c[W>>2]|0)+at|0)|0]|0)==(a[at+148464|0]|0)){at=at+1|0}else{break L14599}}if((at|0)!=1){break}au=R+1|0;c[13898]=au;if((au|0)>=(T|0)){Q=10927;break L14565}L14759:do{if((a[Z+(au*40&-1)|0]&1)!=0){W=c[Z+(au*40&-1)+36>>2]|0;ak=Z+(au*40&-1)+32|0;U=0;while(1){if((U|0)>=(W|0)){break}if((a[V+((c[ak>>2]|0)+U|0)|0]|0)==(a[U+103664|0]|0)){U=U+1|0}else{break L14759}}if((U|0)==1){Q=10928;break L14565}}}while(0);V=is(d)|0;Z=c[V>>2]|0;if((Z|0)==1){av=+(c[V+8>>2]|0)}else if((Z|0)==2){av=+h[V+8>>3]}else if((Z|0)==3){av=+uz(c[V+8>>2]|0,0)}else{Q=10890;break L14565}if((c[B>>2]|0)==3){uu(c[C>>2]|0);c[B>>2]=1}h[4214]=av;break}else if((O|0)==2){a[33672]=0;c[13898]=J+1;break}else if((O|0)==4){a[33673]=1;c[13898]=J+1;break}else if((O|0)==5){a[33673]=0;c[13898]=J+1;break}else if((O|0)==3){c[13898]=J+1;V=is(j)|0;Z=c[V>>2]|0;if((Z|0)==1){aw=+(c[V+8>>2]|0)}else if((Z|0)==2){aw=+h[V+8>>3]}else if((Z|0)==3){aw=+uz(c[V+8>>2]|0,0)}else{Q=10832;break L14565}if((c[u>>2]|0)==3){uu(c[w>>2]|0);c[u>>2]=1}h[4211]=aw;h[4212]=aw;V=c[13898]|0;Z=c[8272]|0;if((V|0)>=(Z|0)){break}T=c[1054]|0;R=(a[T+(V*40&-1)|0]&1)==0;if(R){break}at=c[T+(V*40&-1)+36>>2]|0;ak=T+(V*40&-1)+32|0;W=c[10036]|0;aj=0;while(1){if((aj|0)>=(at|0)){Q=10840;break}if((a[W+((c[ak>>2]|0)+aj|0)|0]|0)==(a[aj+103664|0]|0)){aj=aj+1|0}else{Q=10841;break}}if((Q|0)==10840){Q=0;if((aj|0)==1|R){break}}else if((Q|0)==10841){Q=0;if(R){break}}ak=c[T+(V*40&-1)+36>>2]|0;W=T+(V*40&-1)+32|0;at=c[10036]|0;O=0;while(1){if((O|0)>=(ak|0)){break}if((a[at+((c[W>>2]|0)+O|0)|0]|0)==(a[O+148464|0]|0)){O=O+1|0}else{break L14599}}if((O|0)!=1){break}ax=V+1|0;c[13898]=ax;if((ax|0)>=(Z|0)){Q=10940;break L14565}L14801:do{if((a[T+(ax*40&-1)|0]&1)!=0){W=c[T+(ax*40&-1)+36>>2]|0;ak=T+(ax*40&-1)+32|0;R=0;while(1){if((R|0)>=(W|0)){break}if((a[at+((c[ak>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L14801}}if((R|0)==1){Q=10941;break L14565}}}while(0);at=is(f)|0;T=c[at>>2]|0;if((T|0)==2){ay=+h[at+8>>3]}else if((T|0)==3){ay=+uz(c[at+8>>2]|0,0)}else if((T|0)==1){ay=+(c[at+8>>2]|0)}else{Q=10857;break L14565}if((c[x>>2]|0)==3){uu(c[y>>2]|0);c[x>>2]=1}h[4212]=ay;break}else{Q=10894;break L14565}}}while(0);N=c[13898]|0;M=c[8272]|0;if((N|0)<(M|0)){J=N;K=M}else{break L14563}}if((Q|0)==10926){uf(J,116664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10927){uf(au,105736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10928){uf(au,105736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10894){uf(J,104688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10920){uf(J,107656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10921){uf(J,107656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10922){uf(J,107656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10923){uf(ag,115776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10924){uf(ag,115776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10925){uf(J,116664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10929){uf(al,109336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10930){uf(al,109336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10934){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10935){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10936){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10937){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10941){uf(ax,106712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10938){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10939){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10940){uf(ax,106712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10890){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10832){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10781){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10857){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10865){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10807){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);a[33512]=1;Q=e6(104120)|0;if((Q|0)!=0){a[Q+8|0]=0;c[Q+16>>2]=1;c[Q+24>>2]=1}Q=c[8453]|0;if((Q|0)==0){h[4243]=0.0;lg();hM();i=b;return}fN(33896,o,p,103768);ax=c[3524]|0;ai=~~(+h[o>>3]+ +((c[ax+8>>2]|0)>>>1>>>0>>>0));o=~~(+h[p>>3]+ +(((c[ax+12>>2]|0)-(c[ax+16>>2]|0)|0)>>>0>>>0));p=a[33936]&1;do{if(p<<24>>24==0){az=ax}else{if((a[37456]&1)!=0){az=ax;break}a[37456]=1;al=c[ax+88>>2]|0;if((al|0)==0){az=ax;break}cO[al&255](179864);az=c[3524]|0}}while(0);a[37456]=p;fn(33824,az);ln(ai,o,c[8453]|0,1,0,0,c[8454]|0);if((c[8456]|0)!=0){cM[c[(c[3524]|0)+64>>2]&511](-2)}a[37456]=0;o=Q;Q=1;while(1){ai=a[o]|0;if((ai<<24>>24|0)==0){break}else if((ai<<24>>24|0)==10){aA=Q+1|0}else{aA=Q}o=o+1|0;Q=aA}aA=c[8454]|0;do{if((aA|0)==0){aB=0}else{if((a[aA]|0)==0){aB=aA;break}o=c[(c[3524]|0)+88>>2]|0;if((o|0)==0){aB=aA;break}cO[o&255](aA);aB=c[8454]|0}}while(0);aA=c[3524]|0;ay=+(aa(c[aA+16>>2]|0,Q)>>>0>>>0);aw=ay/+((c[aA+12>>2]|0)>>>0>>>0);h[4243]=aw;do{if((aB|0)==0){aC=aw}else{if((a[aB]|0)==0){aC=aw;break}Q=c[aA+88>>2]|0;if((Q|0)==0){aC=aw;break}cO[Q&255](179864);aC=+h[4243]}}while(0);if(aC<=.9){lg();hM();i=b;return}h[4243]=.05;lg();hM();i=b;return}function lm(){var b=0;if((a[33512]&1)==0){return}if(a[13032]|0){b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}a[33512]=0;b=e6(104120)|0;if((b|0)!=0){a[b+8|0]=0;c[b+16>>2]=1;c[b+24>>2]=0}if((a[33656]&1)!=0){g[178]=+h[4215];g[38]=+h[4216];g[184]=+h[4217];g[44]=+h[4218]}a[33656]=0;h[4212]=1.0;h[4211]=1.0;uE(33704,0,16);b=c[8453]|0;if((b|0)!=0){uu(b);c[8453]=0}lh();hM();return}function ln(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=c[3524]|0;if((e|0)==0){return}k=(i|0)!=0;do{if(k){if((a[i]|0)==0){break}l=c[j+88>>2]|0;if((l|0)==0){break}cO[l&255](i)}}while(0);do{if((g|0)==0){m=b;n=e;o=d;p=j+16|0}else{l=a[e]|0;if(l<<24>>24==0){q=e;r=0}else{s=e;t=0;u=l;while(1){l=s+1|0;v=(u<<24>>24==10&1)+t|0;w=a[l]|0;if(w<<24>>24==0){q=l;r=v;break}else{s=l;t=v;u=w}}}u=aa(r,g);t=j+16|0;s=aa(u,c[t>>2]|0)>>>1;if((h|0)==0){m=b;n=q;o=s+d|0;p=t;break}else{m=b-s|0;n=q;o=d;p=t;break}}}while(0);d=j+76|0;q=j+20|0;b=(h|0)==0;g=j+68|0;r=m;m=n;n=o;o=e;while(1){do{if((o|0)==0){x=m}else{e=a8(o|0,10)|0;if((e|0)==0){x=0;break}a[e]=0;x=e}}while(0);do{if((cO[c[d>>2]&255](f)|0)==0){e=aa(c[q>>2]|0,f);t=aa(e,lp(o)|0)>>>1;if(b){e=r-t|0;s=c[3524]|0;if((c[s+96>>2]&128|0)==0){if((e|0)<=0){break}if(!((c[s+8>>2]|0)>>>0>e>>>0&(n|0)>0)){break}if((c[s+12>>2]|0)>>>0<=n>>>0){break}}cR[c[g>>2]&127](e,n,o);break}else{e=n-t|0;t=c[3524]|0;if((c[t+96>>2]&128|0)==0){if((r|0)<=0){break}if(!((c[t+8>>2]|0)>>>0>r>>>0&(e|0)>0)){break}if((c[t+12>>2]|0)>>>0<=e>>>0){break}}cR[c[g>>2]&127](r,e,o);break}}else{e=c[3524]|0;if((c[e+96>>2]&128|0)==0){if((r|0)<=0){break}if(!((c[e+8>>2]|0)>>>0>r>>>0&(n|0)>0)){break}if((c[e+12>>2]|0)>>>0<=n>>>0){break}}cR[c[g>>2]&127](r,n,o)}}while(0);do{if((h|0)==(-270|0)|(h|0)==90){y=(c[p>>2]|0)+r|0;z=n}else{e=c[p>>2]|0;if((h|0)==(-90|0)|(h|0)==270){y=r-e|0;z=n;break}else{y=r;z=n-e|0;break}}}while(0);if((x|0)==0){break}a[x]=10;r=y;m=x;n=z;o=x+1|0}if(!k){return}if((a[i]|0)==0){return}i=c[j+88>>2]|0;if((i|0)==0){return}cO[i&255](179864);return}function lo(){var b=0;c[8026]=0;if((a[14080]&1)==0){return}if(a[13032]|0){b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){return}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0;return}function lp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=c[3524]|0;e=c[d+96>>2]|0;if((e&8192|0)==0){do{if((a8(b|0,10)|0)==0){if((e&32|0)!=0){break}if((c[11252]|0)!=15){f=uA(b|0)|0;return f|0}g=a[b]|0;if(g<<24>>24==0){f=0;return f|0}else{h=0;i=0;j=g}while(1){if((j&-64)<<24>>24==-128){k=i}else{k=((j&255)>226?2:1)+i|0}g=h+1|0;l=a[b+g|0]|0;if(l<<24>>24==0){f=k;break}else{h=g;i=k;j=l}}return f|0}}while(0);c[3524]=238024;cR[c[59523]&127](0,0,b);j=c[(c[3524]|0)+8>>2]|0;c[3524]=d;f=j;return f|0}if((cy(b|0,203320)|0)==0){f=uA(b|0)|0;return f|0}j=a[b]|0;if(j<<24>>24==0){f=0;return f|0}else{m=b;n=0;o=j}L15011:while(1){j=m;b=o;L15013:while(1){d=b<<24>>24;L15015:do{if((d|0)==91){if(b<<24>>24==0){p=j}else{k=b;i=j;while(1){h=i+1|0;if(k<<24>>24==93){q=h;break L15015}e=a[h]|0;if(e<<24>>24==0){p=h;break}else{k=e;i=h}}}q=p+1|0}else if((d|0)==92){r=j;s=11030;break L15013}else if((d|0)==123|(d|0)==125|(d|0)==36|(d|0)==95|(d|0)==94){q=j+1|0}else{s=11034;break L15013}}while(0);d=a[q]|0;if(d<<24>>24==0){f=n;s=11046;break L15011}else{j=q;b=d}}L15024:do{if((s|0)==11030){while(1){s=0;b=r+1|0;d=a[b]|0;if(d<<24>>24==0){t=b;break L15024}if((bO(d<<24>>24|0)|0)==0){t=b;break}else{r=b;s=11030}}}else if((s|0)==11034){s=0;t=j+1|0}}while(0);j=n+1|0;b=a[t]|0;if(b<<24>>24==0){f=j;s=11049;break}else{m=t;n=j;o=b}}if((s|0)==11049){return f|0}else if((s|0)==11046){return f|0}return 0}function lq(a,b,d,e,f,g){a=a|0;b=b|0;d=+d;e=+e;f=+f;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;h=i;i=i+3048|0;j=h|0;k=h+8|0;l=h+16|0;m=h+24|0;n=h+32|0;o=h+3032|0;p=h+3040|0;if(e<0.0){q=e;while(1){r=q+360.0;if(r<0.0){q=r}else{s=r;break}}}else{s=e}if(f>360.0){e=f;while(1){q=e+-360.0;if(q>360.0){e=q}else{t=q;break}}}else{t=f}if(t<s){f=t;while(1){e=f+360.0;if(e<s){f=e}else{u=e;break}}}else{u=t}t=u-s;v=~~(t/3.0);w=(v|0)<1?1:v;v=c[3524]|0;f=+((c[v+24>>2]|0)>>>0>>>0)/+((c[v+28>>2]|0)>>>0>>>0);v=n|0;c[n+8>>2]=g;e=+(a>>>0>>>0);q=+(b>>>0>>>0);if((w|0)>0){x=0;y=0;while(1){r=(s+ +(x|0)*3.0)*.017453292519943295;z=n+(y*12&-1)|0;c[z>>2]=~~(e+ +S(+r)*d);A=n+(y*12&-1)+4|0;c[A>>2]=~~(q+f*+T(+r)*d);c[o>>2]=a;c[p>>2]=b;B=((fl(o,p,z,A)|0)!=0&1)+y|0;A=x+1|0;if((A|0)<(w|0)){x=A;y=B}else{C=B;break}}}else{C=0}s=u*.017453292519943295;y=n+(C*12&-1)|0;c[y>>2]=~~(e+ +S(+s)*d);x=n+(C*12&-1)+4|0;c[x>>2]=~~(q+f*+T(+s)*d);w=(((fl(o,p,y,x)|0)==0)<<31>>31)+C|0;d=+P(+t);if(d>.1&d<359.9){C=w+1|0;c[n+(C*12&-1)>>2]=a;c[n+(C*12&-1)+4>>2]=b;b=w+2|0;c[n+(b*12&-1)>>2]=c[n>>2];c[n+(b*12&-1)+4>>2]=c[n+4>>2];D=b}else{D=w}if((g|0)!=0){g=c[(c[3524]|0)+148>>2]|0;if((g|0)==0){i=h;return}cN[g&255](D+1|0,v);i=h;return}if((D|0)<=0){i=h;return}v=0;while(1){g=c[n+(v*12&-1)+4>>2]|0;w=v+1|0;b=c[n+(w*12&-1)>>2]|0;C=c[n+(w*12&-1)+4>>2]|0;c[j>>2]=c[n+(v*12&-1)>>2];c[k>>2]=g;c[l>>2]=b;c[m>>2]=C;C=c[3524]|0;if((fl(j,k,l,m)|0)!=0){cN[c[C+56>>2]&255](c[j>>2]|0,c[k>>2]|0);cN[c[C+60>>2]&255](c[l>>2]|0,c[m>>2]|0)}if((w|0)<(D|0)){v=w}else{break}}i=h;return}function lr(a,b){a=a|0;b=b|0;return uK(c[6224+((c[a>>2]|0)*184&-1)>>2]|0,c[6224+((c[b>>2]|0)*184&-1)>>2]|0)|0}function ls(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;i=i+152|0;b=a|0;d=ut(1024)|0;do{if((d|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=75488,v)|0)}else{f=d}}while(0);d=0;do{c[b+(d<<2)>>2]=d;d=d+1|0;}while(d>>>0<37);bM(b|0,37,4,2);gq();uD(f|0,75064,28);d=c[8250]|0;if((d|0)==(c[m>>2]|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){g=d}else{aI(125440,23,1,d|0);do{e=a1(c[o>>2]|0)|0}while(!((e|0)==(-1|0)|(e|0)==10));c[8238]=0;g=c[m>>2]|0}aK(f|0,g|0);c[8238]=(c[8238]|0)+1;h=0}else{aK(f|0,d|0);h=0}do{d=c[b+(h<<2)>>2]|0;g=c[6228+(d*184&-1)>>2]|0;be(f|0,74576,(v=i,i=i+16|0,c[v>>2]=c[6224+(d*184&-1)>>2],c[v+8>>2]=g,v)|0);g=c[8250]|0;if((g|0)==(c[m>>2]|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){j=g}else{aI(125440,23,1,g|0);do{d=a1(c[o>>2]|0)|0}while(!((d|0)==(-1|0)|(d|0)==10));c[8238]=0;j=c[m>>2]|0}aK(f|0,j|0);c[8238]=(c[8238]|0)+1}else{aK(f|0,g|0)}h=h+1|0;}while(h>>>0<37);h=c[8250]|0;if((h|0)==(c[m>>2]|0)){uu(f);i=a;return}a2(h|0);uu(f);i=a;return}function lt(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+152|0;d=b|0;e=ut(555)|0;do{if((e|0)==0){gk();f=ut(555)|0;if((f|0)!=0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74144,v)|0);return 0}else{g=e}}while(0);e=0;do{c[d+(e<<2)>>2]=e;e=e+1|0;}while(e>>>0<37);bM(d|0,37,4,2);e=g;w=32;a[e]=w&255;w=w>>8;a[e+1|0]=w&255;e=0;f=uA(g|0)|0;do{be(g+f|0,73368,(v=i,i=i+8|0,c[v>>2]=c[6224+((c[d+(e<<2)>>2]|0)*184&-1)>>2],v)|0);e=e+1|0;f=uA(g|0)|0}while(e>>>0<37);e=f+1|0;f=ut(e)|0;if((f|0)!=0){h=f;j=uB(h|0,g|0)|0;uu(g);i=b;return h|0}gk();f=ut(e)|0;if((f|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=72784,v)|0);return 0}else{h=f;j=uB(h|0,g|0)|0;uu(g);i=b;return h|0}return 0}function lu(a,b){a=+a;b=+b;return 0}function lv(a){a=a|0;return(a|0)==0&1|0}function lw(a){a=a|0;return(a|0)==0&1|0}function lx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;e=i;f=(a_(b|0,223552,d|0)|0)==0;g=f?3:d;d=f?222936:b;b=0;f=0;j=0;while(1){k=c[6224+(b*184&-1)>>2]|0;if((a_(d|0,k|0,g|0)|0)==0){l=6224+(b*184&-1)|0;if((g|0)==(uA(k|0)|0)){n=0;o=l;break}else{p=j|(f|0)!=0;q=l}}else{p=j;q=f}l=b+1|0;if(l>>>0<37){b=l;f=q;j=p}else{n=p;o=q;break}}if((o|0)==0|n){r=0;i=e;return r|0}c[3524]=o;a[14080]=0;if((c[o+48>>2]|0)==2){s=o}else{n=c[m>>2]|0;aI(222416,73,1,n|0);s=c[3524]|0}n=s+72|0;if((c[n>>2]|0)==0){c[n>>2]=12;t=c[3524]|0}else{t=s}s=t+76|0;if((c[s>>2]|0)==0){c[s>>2]=124;u=c[3524]|0}else{u=t}t=u+80|0;if((c[t>>2]|0)==0){c[t>>2]=60;w=c[3524]|0}else{w=u}u=w+84|0;if((c[u>>2]|0)==0){c[u>>2]=48;x=c[3524]|0}else{x=w}w=x+92|0;if((c[w>>2]|0)==0){c[w>>2]=10;y=c[3524]|0}else{y=x}x=y+112|0;if((c[x>>2]|0)==0){c[x>>2]=34;z=c[3524]|0}else{z=y}y=z+168|0;if((c[y>>2]|0)==0){c[y>>2]=144;A=c[3524]|0}else{A=z}z=A+176|0;if(+h[z>>3]<=0.0){h[z>>3]=1.0}if((a[37400]&1)!=0){z=c[m>>2]|0;y=c[A>>2]|0;cf(z|0,221648,(v=i,i=i+8|0,c[v>>2]=y,v)|0)}c[7271]=-1;r=o;i=e;return r|0}function ly(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=c[3524]|0;if((d|0)<0){cN[c[e+56>>2]&255](a,b);cN[c[e+60>>2]&255](a,b);return}f=(d|0)%6&-1;g=+h[1630];d=~~(g*+((c[e+28>>2]|0)>>>0>>>0)*.5);i=~~(g*+((c[e+24>>2]|0)>>>0>>>0)*.5);if((f|0)==0){j=e+56|0;k=a-d|0;cN[c[j>>2]&255](k,b);l=e+60|0;cN[c[l>>2]&255](k,b);cN[c[l>>2]&255](d+a|0,b);k=b-i|0;cN[c[j>>2]&255](a,k);cN[c[l>>2]&255](a,k);cN[c[l>>2]&255](a,i+b|0);return}else if((f|0)==3){l=e+56|0;k=a-d|0;j=b-i|0;cN[c[l>>2]&255](k,j);m=e+60|0;cN[c[m>>2]&255](k,j);n=d+a|0;cN[c[m>>2]&255](n,j);o=i+b|0;cN[c[m>>2]&255](n,o);cN[c[m>>2]&255](k,o);cN[c[m>>2]&255](k,j);cN[c[l>>2]&255](a,b);cN[c[m>>2]&255](a,b);return}else if((f|0)==2){m=e+56|0;l=a-d|0;cN[c[m>>2]&255](l,b);j=e+60|0;cN[c[j>>2]&255](l,b);k=d+a|0;cN[c[j>>2]&255](k,b);o=b-i|0;cN[c[m>>2]&255](a,o);cN[c[j>>2]&255](a,o);n=i+b|0;cN[c[j>>2]&255](a,n);cN[c[m>>2]&255](l,o);cN[c[j>>2]&255](l,o);cN[c[j>>2]&255](k,n);cN[c[m>>2]&255](l,n);cN[c[j>>2]&255](l,n);cN[c[j>>2]&255](k,o);return}else if((f|0)==4){o=e+56|0;k=a-d|0;cN[c[o>>2]&255](k,b);j=e+60|0;cN[c[j>>2]&255](a,b-i|0);cN[c[j>>2]&255](d+a|0,b);cN[c[j>>2]&255](a,i+b|0);cN[c[j>>2]&255](k,b);cN[c[o>>2]&255](a,b);cN[c[j>>2]&255](a,b);return}else if((f|0)==5){j=e+56|0;o=((i<<2|0)/3&-1)+b|0;cN[c[j>>2]&255](a,o);k=e+60|0;n=(d<<2|0)/3&-1;l=b-((i<<1|0)/3&-1)|0;cN[c[k>>2]&255](a-n|0,l);cN[c[k>>2]&255](n+a|0,l);cN[c[k>>2]&255](a,o);cN[c[j>>2]&255](a,b);cN[c[k>>2]&255](a,b);return}else if((f|0)==1){f=e+56|0;k=a-d|0;j=b-i|0;cN[c[f>>2]&255](k,j);o=e+60|0;cN[c[o>>2]&255](k,j);e=d+a|0;a=i+b|0;cN[c[o>>2]&255](e,a);cN[c[f>>2]&255](k,a);cN[c[o>>2]&255](k,a);cN[c[o>>2]&255](e,j);return}else{return}}function lz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;if((e|0)>=(c[8272]|0)){f=lx(225016,7)|0;g=c[13898]|0;h=g-1|0;uf(h,224456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}j=c[1054]|0;L15188:do{if((a[j+(e*40&-1)|0]&1)==0){k=c[10036]|0;l=c[j+(e*40&-1)+36>>2]|0;m=j+(e*40&-1)+32|0}else{n=c[j+(e*40&-1)+36>>2]|0;o=j+(e*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{k=p;l=n;m=o;break L15188}}if((q|0)!=1){k=p;l=n;m=o;break}f=lx(225016,7)|0;g=c[13898]|0;h=g-1|0;uf(h,224456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);e=lx(k+(c[m>>2]|0)|0,l)|0;l=c[13898]|0;L15197:do{if((e|0)==0){m=c[1054]|0;k=(a[m+(l*40&-1)|0]&1)==0;if(k){r=11176}else{j=c[10036]|0;s=a[j+(c[m+(l*40&-1)+32>>2]|0)|0]|0;if((s<<24>>24|0)==39|(s<<24>>24|0)==34){t=j}else{r=11176}}if((r|0)==11176){j=c[10810]|0;if((j|0)==0){r=11196;break}s=c[8272]|0;u=m+(l*40&-1)+36|0;w=m+(l*40&-1)+32|0;x=c[10036]|0;y=j;L15204:while(1){j=c[y+4>>2]|0;L15206:do{if(!((s|0)<=(l|0)|k)){z=c[u>>2]|0;A=0;while(1){if((A|0)>=(z|0)){break}if((a[x+((c[w>>2]|0)+A|0)|0]|0)==(a[j+A|0]|0)){A=A+1|0}else{break L15206}}if((a[j+A|0]|0)==0){break L15204}}}while(0);j=c[y>>2]|0;if((j|0)==0){r=11196;break L15197}else{y=j}}if((a[y+8|0]&1)!=0){r=11196;break}if((c[y+16>>2]|0)==3){t=x}else{r=11196;break}}L15216:do{if((l|0)<(c[8272]|0)){L15218:do{if(!k){w=c[m+(l*40&-1)+36>>2]|0;u=m+(l*40&-1)+32|0;s=0;while(1){if((s|0)>=(w|0)){break}if((a[t+((c[u>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break L15218}}if((s|0)==1){B=0;break L15216}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)==3){B=c[d+8>>2]|0;break}else{c[13898]=l;B=0;break}}else{B=0}}while(0);m=lx(B,uA(B|0)|0)|0;uu(B);C=m}else{r=11196}}while(0);if((r|0)==11196){c[13898]=l+1;C=e}if((C|0)==0){f=lx(225016,7)|0;g=c[13898]|0;h=g-1|0;uf(h,224456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{i=b;return C|0}return 0}function lA(a){a=+a;return}function lB(a){a=a|0;return}function lC(a){a=+a;h[1630]=a>=0.0?a:1.0;return}function lD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,R=0,V=0,W=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0.0,aE=0.0,aF=0.0,aG=0,aH=0.0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0;g=i;i=i+480|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+40|0;p=g+48|0;q=g+56|0;r=g+64|0;s=g+72|0;t=g+80|0;u=g+88|0;v=g+96|0;w=g+104|0;x=g+112|0;y=g+120|0;z=g+128|0;A=g+136|0;B=g+144|0;C=g+152|0;D=g+160|0;E=g+168|0;F=g+176|0;G=g+184|0;H=g+192|0;I=g+200|0;J=g+208|0;K=g+216|0;L=g+224|0;M=g+232|0;N=g+240|0;O=g+248|0;R=g+256|0;V=g+264|0;W=g+272|0;Z=g+280|0;_=g+288|0;$=g+296|0;aa=g+304|0;ab=g+312|0;ac=g+320|0;ad=g+328|0;ae=g+336|0;af=g+344|0;ag=g+352|0;ah=g+360|0;ai=g+368|0;aj=g+376|0;ak=g+384|0;al=g+392|0;am=g+400|0;an=g+408|0;ao=g+416|0;ap=c[3524]|0;aq=+(((c[ap+24>>2]|0)+(c[ap+28>>2]|0)|0)>>>0>>>0)*.5;ar=+(a-d|0);as=+(b-e|0);at=+Q(+(ar*ar+as*as));au=(f|0)<0?-f|0:f;av=c[13542]|0;aw=(c[ap+96>>2]&128|0)==0;ax=aw?55520:0;c[13542]=ax;do{if((f|0)==0){ay=0;az=0}else{L15241:do{if(+P(+at)<2.220446049250313e-16){aA=0;aB=0}else{aC=c[12910]|0;if((aC|0)<1){aD=aq;aE=aD*.3/at;aF=aD*2.0/at;aD=aF>.3?.3:aF;aF=aE>aD?aE:aD;aD=ar*.96593;aE=as*.25882;aG=~~((aD-aE)*aF);aH=as*.96593;aI=~~((ar*.25882+aH)*aF);aJ=~~((aD+aE)*aF);aK=~~((ar*-.25882+aH)*aF);aL=(aG+aJ|0)/2&-1;aM=(aI+aK|0)/2&-1;aN=aG;aO=aK;aP=aJ;aQ=aI}else{aF=+h[6458]*.017453292519943295;aH=+h[6457]*.017453292519943295;aE=+Y(+(-0.0-as),+(-0.0-ar));aD=+(aC|0);aR=at*.5;if(aD>aR){aS=aD/aR;aT=+X(+(+U(+aF)*aS));aU=aR;aV=+X(+(aS*+U(+aH)));aW=aT}else{aU=aD;aV=aH;aW=aF}aF=+T(+aW);aH=aF/+T(+aV);aF=aW-aE;aC=-~~(aU*+S(+aF))|0;aI=~~(aU*+T(+aF));aF=-0.0-aU;aD=aE+aW;aT=+S(+aD)*aF;aS=+T(+aD)*aF;aF=aU*aH;aH=aE+aV;aJ=~~(aT+aF*+S(+aH));aL=aJ;aM=~~(aS+aF*+T(+aH));aN=aC;aO=~~aS;aP=~~aT;aQ=aI}do{if((au&1|0)!=0){do{if((c[12912]|0)==2){if(aw){aI=(c[ax>>2]|0)>(d|0)&1;aC=(c[ax+4>>2]|0)<(d|0)?aI|2:aI;aI=(c[ax+8>>2]|0)>(e|0)?aC|4:aC;if((((c[ax+12>>2]|0)<(e|0)?aI|8:aI)|0)!=0){aX=ax;break}}aI=aL+d|0;c[ao>>2]=aI;aC=aM+e|0;c[ao+4>>2]=aC;c[ao+12>>2]=aN+d;c[ao+16>>2]=aQ+e;c[ao+24>>2]=d;c[ao+28>>2]=e;c[ao+36>>2]=aP+d;c[ao+40>>2]=aO+e;c[ao+48>>2]=aI;c[ao+52>>2]=aC;c[ao+8>>2]=1601;aC=c[ap+148>>2]|0;if((aC|0)==0){aX=ax;break}cN[aC&255](5,ao|0);aX=c[13542]|0}else{aX=ax}}while(0);if((aX|0)!=0){aC=(c[aX>>2]|0)>(d|0)&1;aI=(c[aX+4>>2]|0)<(d|0)?aC|2:aC;aC=(c[aX+8>>2]|0)>(e|0)?aI|4:aI;if((((c[aX+12>>2]|0)<(e|0)?aC|8:aC)|0)!=0){break}}if((c[12912]|0)==0){c[L>>2]=aN+d;c[M>>2]=aQ+e;c[N>>2]=d;c[O>>2]=e;aC=c[3524]|0;if((fl(L,M,N,O)|0)!=0){cN[c[aC+56>>2]&255](c[L>>2]|0,c[M>>2]|0);cN[c[aC+60>>2]&255](c[N>>2]|0,c[O>>2]|0)}c[H>>2]=d;c[I>>2]=e;c[J>>2]=aP+d;c[K>>2]=aO+e;aC=c[3524]|0;if((fl(H,I,J,K)|0)==0){break}cN[c[aC+56>>2]&255](c[H>>2]|0,c[I>>2]|0);cN[c[aC+60>>2]&255](c[J>>2]|0,c[K>>2]|0);break}aC=aL+d|0;aI=aM+e|0;aJ=aN+d|0;aK=aQ+e|0;c[ag>>2]=aC;c[ah>>2]=aI;c[ai>>2]=aJ;c[aj>>2]=aK;aG=c[3524]|0;if((fl(ag,ah,ai,aj)|0)!=0){cN[c[aG+56>>2]&255](c[ag>>2]|0,c[ah>>2]|0);cN[c[aG+60>>2]&255](c[ai>>2]|0,c[aj>>2]|0)}c[ac>>2]=aJ;c[ad>>2]=aK;c[ae>>2]=d;c[af>>2]=e;aK=c[3524]|0;if((fl(ac,ad,ae,af)|0)!=0){cN[c[aK+56>>2]&255](c[ac>>2]|0,c[ad>>2]|0);cN[c[aK+60>>2]&255](c[ae>>2]|0,c[af>>2]|0)}aK=aP+d|0;aJ=aO+e|0;c[_>>2]=d;c[$>>2]=e;c[aa>>2]=aK;c[ab>>2]=aJ;aG=c[3524]|0;if((fl(_,$,aa,ab)|0)!=0){cN[c[aG+56>>2]&255](c[_>>2]|0,c[$>>2]|0);cN[c[aG+60>>2]&255](c[aa>>2]|0,c[ab>>2]|0)}c[R>>2]=aK;c[V>>2]=aJ;c[W>>2]=aC;c[Z>>2]=aI;aI=c[3524]|0;if((fl(R,V,W,Z)|0)==0){break}cN[c[aI+56>>2]&255](c[R>>2]|0,c[V>>2]|0);cN[c[aI+60>>2]&255](c[W>>2]|0,c[Z>>2]|0)}}while(0);if((au&2|0)==0){aA=aL;aB=aM;break}aI=c[13542]|0;if((aI|0)!=0){aC=(c[aI>>2]|0)>(a|0)&1;aJ=(c[aI+4>>2]|0)<(a|0)?aC|2:aC;aC=(c[aI+8>>2]|0)>(b|0)?aJ|4:aJ;if((((c[aI+12>>2]|0)<(b|0)?aC|8:aC)|0)!=0){aA=aL;aB=aM;break}}aC=c[12912]|0;do{if((aC|0)==2){aI=a-aL|0;c[ao>>2]=aI;aJ=b-aM|0;c[ao+4>>2]=aJ;c[ao+12>>2]=a-aN;c[ao+16>>2]=b-aQ;c[ao+24>>2]=a;c[ao+28>>2]=b;c[ao+36>>2]=a-aP;c[ao+40>>2]=b-aO;c[ao+48>>2]=aI;c[ao+52>>2]=aJ;c[ao+8>>2]=1601;aJ=c[ap+148>>2]|0;if((aJ|0)==0){break}cN[aJ&255](5,ao|0);aY=c[12912]|0;aZ=11240}else{aY=aC;aZ=11240}}while(0);do{if((aZ|0)==11240){if((aY|0)!=0){break}c[n>>2]=a-aP;c[o>>2]=b-aO;c[p>>2]=a;c[q>>2]=b;aC=c[3524]|0;if((fl(n,o,p,q)|0)!=0){cN[c[aC+56>>2]&255](c[n>>2]|0,c[o>>2]|0);cN[c[aC+60>>2]&255](c[p>>2]|0,c[q>>2]|0)}c[j>>2]=a;c[k>>2]=b;c[l>>2]=a-aN;c[m>>2]=b-aQ;aC=c[3524]|0;if((fl(j,k,l,m)|0)==0){aA=aL;aB=aM;break L15241}cN[c[aC+56>>2]&255](c[j>>2]|0,c[k>>2]|0);cN[c[aC+60>>2]&255](c[l>>2]|0,c[m>>2]|0);aA=aL;aB=aM;break L15241}}while(0);aC=a-aL|0;aJ=b-aM|0;aI=a-aP|0;aK=b-aO|0;c[D>>2]=aC;c[E>>2]=aJ;c[F>>2]=aI;c[G>>2]=aK;aG=c[3524]|0;if((fl(D,E,F,G)|0)!=0){cN[c[aG+56>>2]&255](c[D>>2]|0,c[E>>2]|0);cN[c[aG+60>>2]&255](c[F>>2]|0,c[G>>2]|0)}c[z>>2]=aI;c[A>>2]=aK;c[B>>2]=a;c[C>>2]=b;aK=c[3524]|0;if((fl(z,A,B,C)|0)!=0){cN[c[aK+56>>2]&255](c[z>>2]|0,c[A>>2]|0);cN[c[aK+60>>2]&255](c[B>>2]|0,c[C>>2]|0)}aK=a-aN|0;aI=b-aQ|0;c[v>>2]=a;c[w>>2]=b;c[x>>2]=aK;c[y>>2]=aI;aG=c[3524]|0;if((fl(v,w,x,y)|0)!=0){cN[c[aG+56>>2]&255](c[v>>2]|0,c[w>>2]|0);cN[c[aG+60>>2]&255](c[x>>2]|0,c[y>>2]|0)}c[r>>2]=aK;c[s>>2]=aI;c[t>>2]=aC;c[u>>2]=aJ;aJ=c[3524]|0;if((fl(r,s,t,u)|0)==0){aA=aL;aB=aM;break}cN[c[aJ+56>>2]&255](c[r>>2]|0,c[s>>2]|0);cN[c[aJ+60>>2]&255](c[t>>2]|0,c[u>>2]|0);aA=aL;aB=aM}}while(0);if((f|0)>-1){ay=aB;az=aA;break}c[13542]=av;i=g;return}}while(0);do{if((au&2|0)==0){a_=a;a$=b}else{aA=+P(+at)>=2.220446049250313e-16;if(!(aA&(c[12912]|0)!=0)){a_=a;a$=b;break}a_=a-az|0;a$=b-ay|0}}while(0);do{if((au&1|0)==0){a0=d;a1=e}else{b=+P(+at)>=2.220446049250313e-16;if(!(b&(c[12912]|0)!=0)){a0=d;a1=e;break}a0=az+d|0;a1=ay+e|0}}while(0);c[ak>>2]=a_;c[al>>2]=a$;c[am>>2]=a0;c[an>>2]=a1;a1=c[3524]|0;if((fl(ak,al,am,an)|0)==0){c[13542]=av;i=g;return}cN[c[a1+56>>2]&255](c[ak>>2]|0,c[al>>2]|0);cN[c[a1+60>>2]&255](c[am>>2]|0,c[an>>2]|0);c[13542]=av;i=g;return}function lE(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=bU(215528)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}e=uA(d|0)|0;f=e6(215528)|0;g=bP(d|0)|0;c[f+16>>2]=3;c[f+24>>2]=g;a[f+8|0]=0;f=a8(d|0,32)|0;if((f|0)==0){h=e}else{h=f-d|0}if((lx(d,h)|0)==0){f=c[m>>2]|0;cf(f|0,220472,(v=i,i=i+8|0,c[v>>2]=d,v)|0);break}f=c[3524]|0;if((aY(c[f>>2]|0,222936)|0)==0){i=b;return}cS[c[f+32>>2]&511]();i=b;return}}while(0);lx(225016,7);i=b;return}function lF(b){b=b|0;var d=0;d=c[11232]|0;c[11232]=d+1;a[d]=b&255;return}function lG(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0.0,ag=0,ah=0.0,ai=0.0,aj=0.0,ak=0;b=i;i=i+224|0;d=b|0;e=b+16|0;f=b+72|0;j=b+136|0;k=c[3524]|0;l=k+96|0;m=(c[l>>2]&32|0)!=0;if(!m){dL(bP(218776)|0)}if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}n=c[(c[3524]|0)+104>>2]|0;if((n|0)!=0){cS[n&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);n=c[3524]|0;if((c[n+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[n+8>>2]|0)-1;c[13882]=0;c[13883]=(c[n+12>>2]|0)-1;a[25280]=0;n=~~(+((c[k+8>>2]|0)>>>0>>>0)*+g[178]);o=~~(+((c[k+12>>2]|0)>>>0>>>0)*+g[38]);p=+h[3817];q=k+28|0;r=~~(p*+((c[q>>2]|0)>>>0>>>0));s=k+24|0;t=~~(p*+((c[s>>2]|0)>>>0>>>0)*1.25);u=k+16|0;w=c[u>>2]|0;x=t>>>0<w>>>0?w:t;cM[c[k+168>>2]&511](2);t=k+112|0;cK[c[t>>2]&63](1.0);w=k+64|0;cM[c[w>>2]&511](-2);y=k+56|0;cN[c[y>>2]&255](0,0);z=k+60|0;A=n-1|0;cN[c[z>>2]&255](A,0);B=o-1|0;cN[c[z>>2]&255](A,B);cN[c[z>>2]&255](0,B);cN[c[z>>2]&255](0,0);cM[c[w>>2]&511](0);C=c[c[3524]>>2]|0;if((aY(C|0,225016)|0)==0){uf(-1,218360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=f|0;uB(D|0,C|0);uD(f+(uA(D|0)|0)|0,217760,16);f=k+76|0;cO[c[f>>2]&255](0);C=k+68|0;E=k+20|0;p=+(o>>>0>>>0);cR[c[C>>2]&127](c[E>>2]<<1,~~(p- +((c[u>>2]|0)>>>0>>>0)*.5),D);if((c[k+124>>2]|0)!=0){cR[c[C>>2]&127]((c[E>>2]|0)*5&-1,((c[u>>2]|0)*-3&-1)+o|0,217152)}cM[c[w>>2]&511](-2);cM[c[w>>2]&511](-1);D=n>>>1;cN[c[y>>2]&255](D,0);cN[c[z>>2]&255](D,B);F=o>>>1;cN[c[y>>2]&255](0,F);cN[c[z>>2]&255](A,F);cM[c[w>>2]&511](3);cN[c[y>>2]&255](((c[E>>2]|0)*-10&-1)+D|0,((c[u>>2]|0)>>>1)+F|0);cN[c[z>>2]&255](((c[E>>2]|0)*10&-1)+D|0,((c[u>>2]|0)>>>1)+F|0);cN[c[z>>2]&255](((c[E>>2]|0)*10&-1)+D|0,F-((c[u>>2]|0)>>>1)|0);cN[c[z>>2]&255](((c[E>>2]|0)*-10&-1)+D|0,F-((c[u>>2]|0)>>>1)|0);cN[c[z>>2]&255](((c[E>>2]|0)*-10&-1)+D|0,((c[u>>2]|0)>>>1)+F|0);cR[c[C>>2]&127](((c[E>>2]|0)*-10&-1)+D|0,F,216528);cR[c[C>>2]&127](((c[E>>2]|0)*-10&-1)+D|0,~~(+(F>>>0>>>0)+ +((c[u>>2]|0)>>>0>>>0)*1.4),216048);cM[c[w>>2]&511](-2);do{if((c[l>>2]&32|0)!=0){A=bP(215568)|0;cR[c[C>>2]&127](~~(+(n>>>0>>>0)*.5),~~(p*.4),A);uu(A);if(m){break}dL(bP(215048)|0)}}while(0);cO[c[f>>2]&255](0);cR[c[C>>2]&127](D,((c[u>>2]|0)*6&-1)+F|0,214488);m=(cO[c[f>>2]&255](1)|0)==0;l=c[C>>2]|0;if(m){cR[l&127](D-(((c[E>>2]|0)*13&-1)>>>1)|0,((c[u>>2]|0)*5&-1)+F|0,213832)}else{cR[l&127](D,((c[u>>2]|0)*5&-1)+F|0,213832)}l=(cO[c[f>>2]&255](2)|0)==0;m=c[C>>2]|0;if(l){cR[m&127](((c[E>>2]|0)*-15&-1)+D|0,(c[u>>2]<<2)+F|0,213336)}else{cR[m&127](D,(c[u>>2]<<2)+F|0,213336)}cM[c[w>>2]&511](1);m=k+72|0;l=(cO[c[m>>2]&255](-270)|0)==0;A=c[f>>2]|0;if(l){cO[A&255](0);cR[c[C>>2]&127](c[E>>2]<<1,F-(c[u>>2]<<1)|0,211168)}else{l=(cO[A&255](1)|0)==0;A=c[C>>2]|0;G=c[u>>2]|0;if(l){cR[A&127](G,F-(((c[E>>2]|0)*21&-1)>>>1)|0,212752)}else{cR[A&127](G,F,212752)}G=c[f>>2]|0;cO[G&255](0);G=c[m>>2]|0;cO[G&255](45);cR[c[C>>2]&127]((c[u>>2]|0)*3&-1,F,212104);G=c[f>>2]|0;cO[G&255](0);G=c[m>>2]|0;cO[G&255](-45);cR[c[C>>2]&127](c[u>>2]<<1,F,211576)}cO[c[f>>2]&255](0);cO[c[m>>2]&255](0);cM[c[w>>2]&511](-2);cM[c[w>>2]&511](4);H=+(D>>>0>>>0);cN[c[y>>2]&255](~~(H+ +((c[q>>2]|0)>>>0>>>0)*(+h[8304]+1.0)),B);I=+h[8304];cN[c[z>>2]&255](~~(H+ +((c[q>>2]|0)>>>0>>>0)*(I+1.0)),~~(p-I*+((c[s>>2]|0)>>>0>>>0)));cN[c[y>>2]&255](D,~~(p- +((c[s>>2]|0)>>>0>>>0)*(+h[8304]+1.0)));I=+h[8304];cN[c[z>>2]&255](~~(H+I*+((c[q>>2]|0)>>>0>>>0)),~~(p-(I+1.0)*+((c[s>>2]|0)>>>0>>>0)));B=(cO[c[f>>2]&255](2)|0)==0;m=c[C>>2]|0;F=c[E>>2]|0;if(B){cR[m&127]((F*-14&-1)+D|0,(o-(c[s>>2]<<1)|0)-((c[u>>2]|0)>>>1)|0,210688)}else{cR[m&127](D-F|0,(o-(c[s>>2]<<1)|0)-((c[u>>2]|0)>>>1)|0,210688)}cO[c[f>>2]&255](0);cM[c[w>>2]&511](-2);F=(n-r|0)+((c[E>>2]|0)*-6&-1)|0;cK[c[k+92>>2]&63](+h[3817]);D=o-x|0;if((D|0)>(x|0)){m=d|0;B=d+4|0;G=d+8|0;A=e|0;l=k+80|0;J=(r|0)/2&-1;r=-2;K=D;while(1){D=r+1|0;L=c[8798]|0;M=(L|0)>0;N=D;L15390:while(1){O=43264;while(1){P=c[O>>2]|0;if((P|0)==0){break}if((c[P+4>>2]|0)==(N|0)){Q=11322;break L15390}else{O=P|0}}O=N-1|0;if(!((N|0)>(L|0)&M)){R=O;S=1.0;T=0;U=1;V=O;W=0.0;break}N=((O|0)%(L|0)&-1)+1|0}do{if((Q|0)==11322){Q=0;L=c[P+12>>2]|0;I=+h[P+24>>3];M=c[P+48>>2]|0;O=c[P+52>>2]|0;H=+h[P+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){R=N;S=I;T=0;U=M;V=O;W=H;break}X=a[P+40|0]&1;Y=X<<24>>24==0;R=L;S=I;T=X;U=Y?1:M;V=Y?L:O;W=H}}while(0);c[m>>2]=U;c[B>>2]=V;h[G>>3]=W;cK[c[(c[3524]|0)+112>>2]&63](S);N=c[(c[3524]|0)+64>>2]|0;if((R|0)<-5){cM[N&511](-2)}else{cM[N&511](R)}N=c[3524]|0;do{if(T<<24>>24==0){if((c[N+96>>2]&1024|0)!=0){break}c[m>>2]=1;c[B>>2]=R;Q=11332}else{Q=11332}}while(0);if((Q|0)==11332){Q=0;fn(d,N)}be(A|0,21e4,(v=i,i=i+8|0,c[v>>2]=D,v)|0);O=(cO[c[f>>2]&255](2)|0)==0;L=c[C>>2]|0;if(O){O=uA(A|0)|0;Y=F-aa(c[E>>2]|0,O)|0;cR[L&127](Y,K,A)}else{cR[L&127](F,K,A)}cN[c[y>>2]&255]((c[E>>2]|0)+F|0,K);cN[c[z>>2]&255]((c[E>>2]<<2)+F|0,K);if((r|0)>-2){cR[c[l>>2]&127]((((c[E>>2]|0)*5&-1)+F|0)+J|0,K,r)}L=K-x|0;if((L|0)>(x|0)){r=D;K=L}else{Z=A;break}}}else{Z=e|0}cK[c[t>>2]&63](1.0);cM[c[w>>2]&511](0);S=+(n>>>0>>>0);e=~~(S*.375);A=~~(p*.25);K=(c[q>>2]|0)*7&-1;r=(c[s>>2]|0)*7&-1;x=c[12912]|0;c[12912]=0;J=k+84|0;cI[c[J>>2]&63](e,A,K+e|0,A,1);c[12912]=1;cI[c[J>>2]&63](e,A,e-K|0,A,1);c[12912]=2;cI[c[J>>2]&63](e,A,e,r+A|0,1);c[12912]=1;cI[c[J>>2]&63](e,A,e,A-r|0,1);c[12912]=x;x=(c[q>>2]|0)*5&-1;q=(c[s>>2]|0)*5&-1;s=e-x|0;r=A-q|0;K=x+e|0;x=q+A|0;cI[c[J>>2]&63](s,r,K,x,3);cI[c[J>>2]&63](s,x,e,A,0);c[12912]=1;cI[c[J>>2]&63](e,A,K,r,2);cO[c[f>>2]&255](0);r=(o>>>0)/25>>>0;K=~~(S*.075);A=((n>>>0)/10>>>0)+K|0;e=1;J=r;while(1){cK[c[t>>2]&63](+(e|0));cM[c[w>>2]&511](-2);cN[c[y>>2]&255](K,J);cN[c[z>>2]&255](A,J);be(Z|0,209288,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=0,v)|0);cR[c[C>>2]&127](A,J,Z);x=e+1|0;if((x|0)<7){e=x;J=J+r|0}else{break}}cR[c[C>>2]&127](K,r*7&-1,208960);r=~~(S*.5);K=(n>>>0)/40>>>0;J=o>>>3;cK[c[t>>2]&63](1.0);cM[c[w>>2]&511](-2);cO[c[f>>2]&255](1);W=+(J|0);cR[c[C>>2]&127]((K*7&-1)+r|0,~~(W+ +((c[u>>2]|0)>>>0>>>0)*1.5),208328);t=k+108|0;o=(n>>>0)/80>>>0;H=+(K|0)*1.5;e=0;A=r;while(1){r=c[t>>2]|0;if((r|0)!=0){cI[r&63](e<<4|2,A,0,K,J)}cN[c[y>>2]&255](A,0);cN[c[z>>2]&255](A,J);r=A+K|0;cN[c[z>>2]&255](r,J);cN[c[z>>2]&255](r,0);cN[c[z>>2]&255](A,0);be(Z|0,207744,(v=i,i=i+8|0,c[v>>2]=e,v)|0);cR[c[C>>2]&127](o+A|0,~~(W+ +((c[u>>2]|0)>>>0>>>0)*.5),Z);r=e+1|0;if((r|0)<10){e=r;A=~~(H+ +(A|0))}else{break}}A=~~(S*.7);e=~~(p*.83);Z=(n>>>0)/20>>>0;if((c[k+148>>2]|0)==0){_=206240}else{p=+(Z|0);k=j|0;n=j|0;o=j+72|0;z=j+4|0;J=j+76|0;K=j+8|0;y=0;while(1){t=aa(y,Z);S=+(t+A|0);H=+(e-((t|0)/2&-1)|0);t=~~(S+p);c[n>>2]=t;r=~~(H+p*0.0);c[z>>2]=r;c[j+12>>2]=~~(S+p*.5000000000000001);c[j+16>>2]=~~(H+p*.8660254037844386);c[j+24>>2]=~~(S+p*-.4999999999999998);c[j+28>>2]=~~(H+p*.8660254037844387);c[j+36>>2]=~~(S+p*-1.0);c[j+40>>2]=~~(H+p*1.2246467991473532e-16);c[j+48>>2]=~~(S+p*-.5000000000000004);c[j+52>>2]=~~(H+p*-.8660254037844384);c[j+60>>2]=~~(S+p*.5000000000000001);c[j+64>>2]=~~(H+p*-.8660254037844386);c[o>>2]=t;c[J>>2]=r;r=c[w>>2]|0;if((y|0)==0){cM[r&511](2);$=1601}else{cM[r&511](1);$=804}c[K>>2]=$;cN[c[(c[3524]|0)+148>>2]&255](7,k);r=y+1|0;if((r|0)<2){y=r}else{_=206944;break}}}cM[c[w>>2]&511](-2);if((cO[c[f>>2]&255](1)|0)!=0){ab=0;ac=c[C>>2]|0;ad=ab+A|0;ae=Z+e|0;af=+(ae|0);ag=c[u>>2]|0;ah=+(ag>>>0>>>0);ai=ah*.5;aj=af+ai;ak=~~aj;cR[ac&127](ad,ak,_);lh();i=b;return}f=c[E>>2]|0;ab=aa(uA(_|0)|0,f)>>>1;ac=c[C>>2]|0;ad=ab+A|0;ae=Z+e|0;af=+(ae|0);ag=c[u>>2]|0;ah=+(ag>>>0>>>0);ai=ah*.5;aj=af+ai;ak=~~aj;cR[ac&127](ad,ak,_);lh();i=b;return}function lH(b,d,e,f,g,i){b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;var j=0.0;if((i|0)==4){h[29743]=+h[29742];h[29741]=+h[29740];return}else if((i|0)==3){h[29742]=+h[29743];h[29740]=+h[29741];return}else{if(a[237976]|0){return}a[237976]=1;h[29750]=0.0;h[29751]=d>2.0?1.0:d;h[29752]=e;j=d+e;if(+h[29749]<j){h[29749]=j}if(+h[29748]>e){h[29748]=e}c[59492]=i;a[237952]=f&1;return}}function lI(){var b=0.0,d=0.0,e=0.0;b=+h[29750];if(!(a[237976]|0)){return}h[29750]=0.0;do{if((a[237952]&1)==0){d=+h[29743]}else{if((c[59492]|0)==1){e=b*.5+ +h[29743];h[29743]=e;d=e;break}else{e=b+ +h[29743];h[29743]=e;d=e;break}}}while(0);b=+h[29745];h[29745]=b>d?b:d;a[237976]=0;return}function lJ(b,d,e,f,g,j,k,l){b=b|0;d=d|0;e=e|0;f=+f;g=+g;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0;m=i;i=i+48|0;n=m|0;o=m+8|0;p=m+16|0;q=m+40|0;r=q;c[n>>2]=b;cS[c[(c[3524]|0)+160>>2]&511]();s=f+g;if(s>+h[5612]){h[5612]=s}if(+h[5611]>g){h[5611]=g}b=c[n>>2]|0;t=a[b]|0;L15478:do{if(t<<24>>24!=0){s=f*.8;u=f;w=q;x=r+1|0;y=r+2|0;z=m+24|0;A=l;B=g;C=b;D=t;L15480:while(1){E=c[11252]|0;do{if(D<<24>>24<0){if(!((E|0)==15|(E|0)==0)){F=11393;break}c[p>>2]=C;cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);if(!(ug(o,p)|0)){cM[c[(c[3524]|0)+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A;break}I=c[n>>2]|0;J=c[p>>2]|0;if(I>>>0<J>>>0){K=I;while(1){L=c[(c[3524]|0)+164>>2]|0;c[n>>2]=K+1;cM[L&511](a[K]|0);L=c[n>>2]|0;if(L>>>0<J>>>0){K=L}else{M=L;break}}}else{M=I}c[n>>2]=M-1;G=B;H=A}else{F=11393}}while(0);L15492:do{if((F|0)==11393){F=0;K=D<<24>>24;if((K&128|0)!=0&(E|0)==14){cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);J=c[(c[3524]|0)+164>>2]|0;L=c[n>>2]|0;c[n>>2]=L+1;cM[J&511](a[L]|0);cM[c[(c[3524]|0)+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A;break}do{if((K|0)==125){F=11396;break L15480}else if((K|0)==64){cS[c[(c[3524]|0)+160>>2]&511]();cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,3);L=(c[n>>2]|0)+1|0;c[n>>2]=L;c[n>>2]=lJ(L,0,e,f,B,j,k,A)|0;cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,4);G=B;H=A;break L15492}else if((K|0)==38){cS[c[(c[3524]|0)+160>>2]&511]();L=(c[n>>2]|0)+1|0;c[n>>2]=L;c[n>>2]=lJ(L,0,e,f,B,j,0,A)|0;G=B;H=A;break L15492}else if((K|0)==40|(K|0)==41){cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);L=c[3524]|0;if((c[L+96>>2]&16|0)==0){N=L}else{cM[c[L+164>>2]&511](92);N=c[3524]|0}cM[c[N+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A;break L15492}else if((K|0)==123){L=C;do{L=L+1|0;c[n>>2]=L;}while((a[L]|0)==32);do{if((A|0)==2){O=+uz(L,n);P=u*O;if((c[(c[3524]|0)+96>>2]&16|0)!=0){Q=P;break}Q=B+P}else{Q=B}}while(0);L=c[n>>2]|0;if((a[L]|0)==47){J=L;while(1){R=J+1|0;c[n>>2]=R;S=a[R]|0;if((S<<24>>24|0)==45){T=R;F=11405;break}else if((S<<24>>24|0)==32){J=R}else{U=R;V=S;break}}if((F|0)==11405){while(1){F=0;J=T+1|0;c[n>>2]=J;S=a[J]|0;if(S<<24>>24==32){T=J;F=11405}else{U=J;V=S;break}}}L15518:do{if(V<<24>>24<33){W=U;X=V}else{S=V;J=U;while(1){if((S<<24>>24|0)==61|(S<<24>>24|0)==42|(S<<24>>24|0)==125){W=J;X=S;break L15518}R=J+1|0;c[n>>2]=R;Y=a[R]|0;if(Y<<24>>24<33){W=R;X=Y;break}else{S=Y;J=R}}}}while(0);do{if((X<<24>>24|0)==61){c[n>>2]=W+1;a[W]=0;P=+uz(c[n>>2]|0,n);if(P==0.0){Z=u;break}Z=P*+h[5613]}else if((X<<24>>24|0)==125){uh(-1,204816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);J=c[n>>2]|0;c[n>>2]=J+1;a[J]=0;Z=u}else if((X<<24>>24|0)==42){c[n>>2]=W+1;a[W]=0;P=+uz(c[n>>2]|0,n);if(P==0.0){Z=u;break}Z=P*f}else{c[n>>2]=W+1;a[W]=0;Z=u}}while(0);J=c[n>>2]|0;if((a[J]|0)==32){S=J;while(1){R=S+1|0;c[n>>2]=R;if((a[R]|0)==32){S=R}else{_=R;break}}}else{_=J}$=Z;aa=(a[U]|0)==0?e:U;ab=X;ac=W;ad=_}else{$=u;aa=e;ab=0;ac=0;ad=L}c[n>>2]=lJ(ad,1,aa,$,Q,j,k,A)|0;cS[c[(c[3524]|0)+160>>2]&511]();if((ac|0)==0){G=Q;H=A;break L15492}a[ac]=ab;G=Q;H=A;break L15492}else if((K|0)==95|(K|0)==94){cS[c[(c[3524]|0)+160>>2]&511]();c[n>>2]=lJ((c[n>>2]|0)+1|0,0,e,s,B+(D<<24>>24==94?.5:-.30000001192092896)*f,j,k,A)|0;G=B;H=A;break L15492}else if((K|0)==126){cS[c[(c[3524]|0)+160>>2]&511]();S=(c[n>>2]|0)+1|0;c[n>>2]=S;c[n>>2]=lJ(S,0,e,f,B,j,k,1)|0;cS[c[(c[3524]|0)+160>>2]&511]();S=c[n>>2]|0;if((a[S]|0)==0){G=B;H=A;break L15492}R=S+1|0;c[n>>2]=R;c[n>>2]=lJ(R,0,e,f,B,0,k,2)|0;G=B;H=0;break L15492}else if((K|0)==92){R=a[C+1|0]|0;if((R-48&255)<8){c[q>>2]=0;cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);S=c[n>>2]|0;Y=S+1|0;c[n>>2]=Y;a[w]=a[Y]|0;Y=S+2|0;do{if(((a[Y]|0)-48&255)<8){c[n>>2]=Y;a[x]=a[Y]|0;ae=S+3|0;if(((a[ae]|0)-48&255)>=8){break}c[n>>2]=ae;a[y]=a[ae]|0}}while(0);S=aE(w|0,0,8)|0;be(z|0,44912,(v=i,i=i+8|0,c[v>>2]=S,v)|0);S=a[z]|0;if(S<<24>>24==0){G=B;H=A;break L15492}else{af=z;ag=S}while(1){cM[c[(c[3524]|0)+164>>2]&511](ag<<24>>24);S=af+1|0;Y=a[S]|0;if(Y<<24>>24==0){G=B;H=A;break L15492}else{af=S;ag=Y}}}Y=c[3524]|0;do{if((c[Y+96>>2]&16|0)==0){ah=C}else{if((R<<24>>24|0)==92|(R<<24>>24|0)==40|(R<<24>>24|0)==41){cJ[c[Y+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](92);ah=c[n>>2]|0;break}if((aZ(204560,R<<24>>24|0,8)|0)!=0){ah=C;break}cJ[c[Y+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](92);cM[c[(c[3524]|0)+164>>2]&511](92);G=B;H=A;break L15492}}while(0);Y=ah+1|0;c[n>>2]=Y;R=a[Y]|0;if(R<<24>>24==0){uh(-1,204288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);G=B;H=A;break L15492}if(!(R<<24>>24==38&(c[11252]|0)==0)){break}R=c[3524]|0;if((aY(c[R>>2]|0,204032)|0)!=0){break}cJ[c[R+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](-2);G=B;H=A;break L15492}}while(0);cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A}}while(0);if(!d){break}E=c[n>>2]|0;if((a[E]|0)==0){break L15478}K=E+1|0;c[n>>2]=K;E=a[K]|0;if(E<<24>>24==0){break L15478}else{A=H;B=G;C=K;D=E}}do{if((F|0)==11396){if(d){ai=C;i=m;return ai|0}else{uh(-1,205424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}}}while(0);cS[c[(c[3524]|0)+160>>2]&511]();ai=c[n>>2]|0;i=m;return ai|0}}while(0);cS[c[(c[3524]|0)+160>>2]&511]();ai=c[n>>2]|0;i=m;return ai|0}function lK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=b|0;f=c[e>>2]|0;g=43280;while(1){h=c[g>>2]|0;if((h|0)==0){break}if((c[h+4>>2]|0)==(d|0)){i=11457;break}else{g=h|0}}if((i|0)==11457){g=b;j=h+8|0;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];c[g+16>>2]=c[j+16>>2];c[g+20>>2]=c[j+20>>2];c[g+24>>2]=c[j+24>>2];c[g+28>>2]=c[j+28>>2];c[g+32>>2]=c[j+32>>2];c[g+36>>2]=c[j+36>>2];c[g+40>>2]=c[j+40>>2];c[g+44>>2]=c[j+44>>2];c[g+48>>2]=c[j+48>>2];c[g+52>>2]=c[j+52>>2];c[e>>2]=f;if((a[b+32|0]&1)!=0){return}c[b+40>>2]=1;c[b+44>>2]=c[b+4>>2];return}j=c[8798]|0;g=(j|0)>0;h=d;L15586:while(1){d=43264;while(1){k=c[d>>2]|0;if((k|0)==0){break}if((c[k+4>>2]|0)==(h|0)){break L15586}else{d=k|0}}l=h-1|0;if(!((h|0)>(j|0)&g)){i=11469;break}h=((l|0)%(j|0)&-1)+1|0}if((i|0)==11469){c[b+4>>2]=l;c[b+40>>2]=1;c[b+44>>2]=l;c[b+8>>2]=l;return}l=b;i=k+8|0;c[l>>2]=c[i>>2];c[l+4>>2]=c[i+4>>2];c[l+8>>2]=c[i+8>>2];c[l+12>>2]=c[i+12>>2];c[l+16>>2]=c[i+16>>2];c[l+20>>2]=c[i+20>>2];c[l+24>>2]=c[i+24>>2];c[l+28>>2]=c[i+28>>2];c[l+32>>2]=c[i+32>>2];c[l+36>>2]=c[i+36>>2];c[l+40>>2]=c[i+40>>2];c[l+44>>2]=c[i+44>>2];c[l+48>>2]=c[i+48>>2];c[l+52>>2]=c[i+52>>2];c[e>>2]=f;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[b+4>>2]=h;a[b+32|0]=0;return}if((a[b+32|0]&1)!=0){return}c[b+40>>2]=1;c[b+44>>2]=c[b+4>>2];return}function lL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0;f=i;h[29751]=1.0;a[237976]=0;h[29749]=1.0;h[29748]=0.0;h[29745]=0.0;uF(44912,202200,16);do{if((a[37456]&1)==0){if((cy(e|0,201600)|0)==0){break}h[29743]=+(b>>>0>>>0);h[29741]=+(d>>>0>>>0);g=e;do{j=lJ(g,1,179864,+h[29751],0.0,1,1,0)|0;if((a[j]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[j]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=j+1|0;}while((a[g]|0)!=0);k=+h[29743];if(k>0.0&k<1.0){h[29743]=1.0}c[(c[3524]|0)+8>>2]=~~+h[29745];c[(c[3524]|0)+12>>2]=~~((+h[29749]- +h[29748])*10.0+.5);i=f;return}}while(0);if((c[11252]|0)==15){d=a[e]|0;if(d<<24>>24==0){l=0}else{b=0;g=0;j=d;while(1){if((j&-64)<<24>>24==-128){m=g}else{m=((j&255)>226?2:1)+g|0}d=b+1|0;n=a[e+d|0]|0;if(n<<24>>24==0){l=m;break}else{b=d;g=m;j=n}}}c[(c[3524]|0)+8>>2]=l}else{l=uA(e|0)|0;c[(c[3524]|0)+8>>2]=l}c[(c[3524]|0)+12>>2]=10;i=f;return}function lM(){a[13048|0]=0;return}function lN(){return}function lO(a,b){a=a|0;b=b|0;return}function lP(a){a=a|0;return}function lQ(a,b,c){a=a|0;b=b|0;c=c|0;return}function lR(a){a=a|0;c[59236]=a;return 1}function lS(a){a=a|0;c[56732]=a;return 1}function lT(b){b=b|0;var d=0.0,e=0.0,f=0.0;if((b|0)==10){d=+h[29750];if(a[237976]|0){h[29750]=0.0;do{if((a[237952]&1)==0){e=+h[29743]}else{if((c[59492]|0)==1){f=d*.5+ +h[29743];h[29743]=f;e=f;break}else{f=d+ +h[29743];h[29743]=f;e=f;break}}}while(0);d=+h[29745];h[29745]=d>e?d:e;a[237976]=0}a[237976]=1;e=+h[29751];h[29748]=+h[29748]-e;h[29752]=+h[29752]-e;h[29743]=0.0}if((c[11252]|0)!=15){h[29750]=+h[29751]+ +h[29750];return}if((b&192|0)==128){return}e=+h[29751];d=e+ +h[29750];h[29750]=d;if(b>>>0<=235){return}h[29750]=d+e;return}function lU(a){a=a|0;var b=0;b=(a|0)<-2?-2:a;c[59226]=b>>>0>3?b&3:b;return}function lV(){c[59226]=3;aI(152264,54,1,c[10030]|0);return}function lW(){aD(c[10030]|0);return}function lX(){var a=0;if((c[59234]|0)>0){a=c[10030]|0;aI(152912,16,1,a|0);c[59234]=0}aI(152336,4,1,c[10030]|0);return}function lY(){var a=0,b=0,d=0.0;a=i;b=c[3524]|0;d=+((c[b+12>>2]|0)>>>0>>>0)/300.0;cf(c[10030]|0,152464,(v=i,i=i+16|0,h[v>>3]=+((c[b+8>>2]|0)>>>0>>>0)/300.0,h[v+8>>3]=d,v)|0);d=+g[59222];cf(c[10030]|0,152432,(v=i,i=i+16|0,h[v>>3]=+g[59224],h[v+8>>3]=d,v)|0);i=a;return}function lZ(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[59234]|0)>0){e=c[10030]|0;aI(152912,16,1,e|0);c[59234]=0}cf(c[10030]|0,152480,(v=i,i=i+16|0,h[v>>3]=+(a>>>0>>>0)/300.0,h[v+8>>3]=+(b>>>0>>>0)/300.0,v)|0);c[59234]=1;i=d;return}function l_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0,l=0;d=i;e=c[10030]|0;if((c[59234]|0)==1){f=c[236912+((c[59226]|0)+2<<2)>>2]|0;g=+(a>>>0>>>0)/300.0;j=+(b>>>0>>>0)/300.0;cf(e|0,152664,(v=i,i=i+24|0,c[v>>2]=f,h[v+8>>3]=g,h[v+16>>3]=j,v)|0);k=c[59234]|0;l=k+1|0;c[59234]=l;i=d;return}else{j=+(a>>>0>>>0)/300.0;g=+(b>>>0>>>0)/300.0;cf(e|0,152624,(v=i,i=i+16|0,h[v>>3]=j,h[v+8>>3]=g,v)|0);k=c[59234]|0;l=k+1|0;c[59234]=l;i=d;return}}function l$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((c[59234]|0)>0){f=c[10030]|0;aI(152912,16,1,f|0);c[59234]=0}cf(c[10030]|0,103640,(v=i,i=i+8|0,c[v>>2]=d,v)|0);d=c[59236]|0;if((d|0)==1){f=c[10030]|0;aF(32,f|0)}else if((d|0)==0){aI(152848,6,1,c[10030]|0)}else if((d|0)==2){aI(152840,6,1,c[10030]|0)}cf(c[10030]|0,152712,(v=i,i=i+16|0,h[v>>3]=+(a>>>0>>>0)/300.0,h[v+8>>3]=+(b>>>0>>>0)/300.0,v)|0);i=e;return}function l0(a){a=a|0;if((c[59234]|0)<=0){return 0}aI(152912,16,1,c[10030]|0);c[59234]=0;return 0}function l1(a,b,d){a=a|0;b=b|0;d=d|0;cM[c[(c[3524]|0)+64>>2]&511](0);ly(a,b,d);return}function l2(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;g=i;if((c[59234]|0)>0){j=c[10030]|0;aI(152912,16,1,j|0);c[59234]=0}j=c[10030]|0;k=+(a>>>0>>>0)/300.0;l=+(b>>>0>>>0)/300.0;m=+(d>>>0>>>0)/300.0;n=+(e>>>0>>>0)/300.0;if((f|0)==0){cf(j|0,152984,(v=i,i=i+32|0,h[v>>3]=k,h[v+8>>3]=l,h[v+16>>3]=m,h[v+24>>3]=n,v)|0);i=g;return}else{cf(j|0,153024,(v=i,i=i+32|0,h[v>>3]=k,h[v+8>>3]=l,h[v+16>>3]=m,h[v+24>>3]=n,v)|0);i=g;return}}function l3(){aI(153080,10,1,c[10030]|0);return}function l4(){aI(153112,11,1,c[10030]|0);return}function l5(){aI(153144,9,1,c[10030]|0);return}function l6(){aI(153304,23,1,c[10030]|0);c[57146]=0;aI(153392,9,1,c[10030]|0);return}function l7(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,153328,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=439-b,v)|0);i=d;return}function l8(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,153344,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=439-b,v)|0);i=d;return}function l9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=(a|0)<-2?-2:a;if((c[57208]|0)==0){if((d|0)>8){e=(d|0)%9&-1}else{e=d}a=c[10030]|0;f=e+2|0;e=c[228712+(f<<2)>>2]|0;cf(a|0,153376,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[10030]|0;a=c[228592+(f<<2)>>2]|0;cf(e|0,153368,(v=i,i=i+8|0,c[v>>2]=a,v)|0);i=b;return}else{if((d|0)>14){g=(d|0)%15&-1}else{g=d}d=c[10030]|0;a=g+2|0;g=c[228760+(a<<2)>>2]|0;cf(d|0,153376,(v=i,i=i+8|0,c[v>>2]=g,v)|0);g=c[10030]|0;d=c[228640+(a<<2)>>2]|0;cf(g|0,153368,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=b;return}}function ma(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;if((c[57146]|0)==1){g=b-11|0;h=c[10030]|0;j=439-d|0;cf(h|0,153328,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=j,v)|0)}else{j=c[10030]|0;g=430-d|0;cf(j|0,153328,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0)}aF(84,c[10030]|0);aF(39,c[10030]|0);g=a[e]|0;if(g<<24>>24==0){k=c[10030]|0;l=aF(39,k|0)|0;m=c[10030]|0;n=aF(10,m|0)|0;i=f;return}else{o=e;p=g}do{aF(p<<24>>24|0,c[10030]|0);if((a[o]|0)==39){g=c[10030]|0;aF(39,g|0)}o=o+1|0;p=a[o]|0;}while(p<<24>>24!=0);k=c[10030]|0;l=aF(39,k|0)|0;m=c[10030]|0;n=aF(10,m|0)|0;i=f;return}function mb(a){a=a|0;var b=0;b=(a|0)!=0;c[57146]=b&1;a=c[10030]|0;if(b){aI(153416|0,10,1,a|0);return 1}else{aI(153392|0,9,1,a|0);return 1}return 0}function mc(){aI(153552,24,1,c[10030]|0);aI(153520,20,1,c[10030]|0);aD(c[10030]|0);return}function md(){aI(153584,13,1,c[10030]|0);aD(c[10030]|0);return}function me(){aI(153704,9,1,c[10030]|0);aD(c[10030]|0);return}function mf(){aI(153720,11,1,c[10030]|0);aD(c[10030]|0);return}function mg(a,b){a=a|0;b=b|0;aI(153736,3,1,c[10030]|0);t0(a,b);aD(c[10030]|0);return}function mh(a,b){a=a|0;b=b|0;aI(153760,3,1,c[10030]|0);t0(a,b);aD(c[10030]|0);return}function mi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=(a|0)<-2?-2:a;if((b|0)==(-1|0)){a=c[10030]|0;aI(153824,4,1,a|0)}else if((b|0)==(-2|0)){aI(153800,4,1,c[10030]|0)}else{aI(153792,3,1,c[10030]|0);a=(b|0)%14&-1;d=a+2|0;e=(d|0)>-1?d:-2-a|0;a=e>>>10;f=e>>>4&63|64;g=e&15|(d>>31)+48&-16;if((a|0)==0){if((f|0)!=64){h=11606}}else{d=a+64|0;a=c[10030]|0;aF(d|0,a|0);h=11606}if((h|0)==11606){h=c[10030]|0;aF(f|0,h|0)}aF(g|0,c[10030]|0)}aI(153784,3,1,c[10030]|0);g=(b|0)>0?(b|0)%8&-1:0;b=(g|0)>-1?g:-g|0;h=b>>>10;f=b>>>4&63|64;a=b&15|(g>>31)+48&-16;do{if((h|0)==0){if((f|0)!=64){break}i=c[10030]|0;j=aF(a|0,i|0)|0;k=c[10030]|0;l=aD(k|0)|0;return}else{g=h+64|0;b=c[10030]|0;aF(g|0,b|0)}}while(0);aF(f|0,c[10030]|0);i=c[10030]|0;j=aF(a|0,i|0)|0;k=c[10030]|0;l=aD(k|0)|0;return}function mj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if((c[56732]|0)==0){e=b-29|0;f=c[10030]|0;aI(153736,3,1,f|0);t0(a,e);e=c[10030]|0;aD(e|0);e=c[10030]|0;aI(154080,5,1,e|0)}else{e=a+19|0;a=c[10030]|0;aI(153736,3,1,a|0);t0(e,b);b=c[10030]|0;aD(b|0);b=c[10030]|0;aI(153952,6,1,b|0)}aI(153920,3,1,c[10030]|0);b=uA(d|0)|0;e=(b|0)>-1?b:-b|0;a=e>>>10;f=e>>>4&63|64;g=e&15|(b>>31)+48&-16;do{if((a|0)==0){if((f|0)!=64){break}h=c[10030]|0;i=aF(g|0,h|0)|0;j=c[10030]|0;k=aK(d|0,j|0)|0;l=c[10030]|0;m=aD(l|0)|0;return}else{b=a+64|0;e=c[10030]|0;aF(b|0,e|0)}}while(0);aF(f|0,c[10030]|0);h=c[10030]|0;i=aF(g|0,h|0)|0;j=c[10030]|0;k=aK(d|0,j|0)|0;l=c[10030]|0;m=aD(l|0)|0;return}function mk(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0;b=i;i=i+24|0;d=b|0;g[59224]=0.0;g[59222]=0.0;e=c[13898]|0;L15781:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L15783:do{if((a[f+(e*40&-1)|0]&1)!=0){j=c[f+(e*40&-1)+36>>2]|0;k=f+(e*40&-1)+32|0;l=c[10036]|0;m=0;while(1){if((m|0)>=(j|0)){break}if((a[l+((c[k>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{break L15783}}if((m|0)==1){break L15781}}}while(0);f=is(d)|0;k=c[f>>2]|0;if((k|0)==2){n=+h[f+8>>3]}else if((k|0)==1){n=+(c[f+8>>2]|0)}else if((k|0)==3){n=+uz(c[f+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=n;f=c[13898]|0;if((f|0)>=(c[8272]|0)){break}k=c[1054]|0;L15797:do{if((a[k+(f*40&-1)|0]&1)!=0){l=c[k+(f*40&-1)+36>>2]|0;j=k+(f*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(l|0)){break}if((a[p+((c[j>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L15797}}if((q|0)==1){break L15781}}}while(0);f=is(d)|0;k=c[f>>2]|0;if((k|0)==3){r=+uz(c[f+8>>2]|0,0)}else if((k|0)==2){r=+h[f+8>>3]}else if((k|0)==1){r=+(c[f+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g[59224]=o;g[59222]=r}}while(0);r=+g[59222];be(13048,152224,(v=i,i=i+16|0,h[v>>3]=+g[59224],h[v+8>>3]=r,v)|0);i=b;return}function ml(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;L15812:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L15814:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;j=f+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(g|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L15814}}if((l|0)==1){m=0;break L15812}}}while(0);f=is(d)|0;j=c[f>>2]|0;if((j|0)==2){n=+h[f+8>>3]}else if((j|0)==1){n=+(c[f+8>>2]|0)}else if((j|0)==3){n=+uz(c[f+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=(~~n|0)==16}else{m=0}}while(0);c[57208]=m&1;d=m?153072:170216;uD(13048,d|0,(uA(d|0)|0)+1|0);i=b;return}function mm(){return}function mn(){return}function mo(a){a=a|0;var b=0;b=(a|0)<0?0:a&7;c[60208]=240840+(b<<2);c[60222]=b;return}function mp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;aI(154096,3,1,c[10030]|0);e=(d|0)>0?(d|0)%11&-1:0;d=(e|0)>-1?e:-e|0;f=d>>>10;g=d>>>4&63|64;h=d&15|(e>>31)+48&-16;if((f|0)==0){if((g|0)!=64){i=11668}}else{e=f+64|0;f=c[10030]|0;aF(e|0,f|0);i=11668}if((i|0)==11668){i=c[10030]|0;aF(g|0,i|0)}aF(h|0,c[10030]|0);aI(154088,3,1,c[10030]|0);t0(a,b);aD(c[10030]|0);return}function mq(){aF(29,c[10030]|0);aF(32,c[10030]|0);aF(108,c[10030]|0);aF(32,c[10030]|0);aF(64,c[10030]|0);aF(31,c[10030]|0);return}function mr(){aI(154304,2,1,c[10030]|0);aD(c[10030]|0);aB(1);return}function ms(a,b){a=a|0;b=b|0;aF(29,c[10030]|0);aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);c[60220]=a;c[60218]=b;return}function mt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((c[60222]|0)<1){d=b>>>5&31|32;e=c[10030]|0;aF(d|0,e|0);e=b&31|96;d=c[10030]|0;aF(e|0,d|0);d=a>>>5&31|32;e=c[10030]|0;aF(d|0,e|0);e=a&31|64;d=c[10030]|0;aF(e|0,d|0);c[60220]=a;c[60218]=b;return}d=c[60220]|0;e=c[60218]|0;f=a-d|0;g=b-e|0;h=(f|0)>-1;i=(h?f:-f|0)<<1;j=(g|0)>-1;k=(j?g:-g|0)<<1;l=f>>31|1;f=g>>31|1;do{if((i|0)<(k|0)){if((e|0)==(b|0)){m=d;n=b;break}g=j^1;o=e;p=d;q=i-(k>>1)|0;while(1){t$(p,o,0);if((q|0)<1&((q|0)!=0|g)){r=q;s=p}else{r=q-k|0;s=p+l|0}t=o+f|0;if((t|0)==(b|0)){m=s;n=b;break}else{o=t;p=s;q=r+i|0}}}else{if((d|0)==(a|0)){m=a;n=e;break}q=h^1;p=e;o=d;g=k-(i>>1)|0;while(1){t$(o,p,0);if((g|0)<1&((g|0)!=0|q)){u=g;v=p}else{u=g-i|0;v=p+f|0}t=o+l|0;if((t|0)==(a|0)){m=a;n=v;break}else{p=v;o=t;g=u+k|0}}}}while(0);t$(m,n,1);c[60220]=a;c[60218]=b;return}function mu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b-11|0;aF(29,c[10030]|0);aF(f>>>5&31|32|0,c[10030]|0);aF(f&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);cf(c[10030]|0,154112,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=e;return}function mv(){aI(154432,6,1,c[10030]|0);aD(c[10030]|0);aB(1);return}function mw(){aI(154120,6,1,c[10030]|0);aD(c[10030]|0);aB(1);return}function mx(a,b){a=a|0;b=b|0;aF(29,c[10030]|0);aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);return}function my(a,b){a=a|0;b=b|0;aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);return}function mz(b){b=b|0;var d=0,e=0,f=0;d=i;e=(b|0)<-2?-2:b;if((e|0)>9){f=(e|0)%10&-1}else{f=e}cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=a[154144+(f+2|0)|0]|0,v)|0);c[8836]=f;i=d;return}function mA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=c[8836]|0;cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=96,v)|0);c[8836]=0;h=d-11|0;aF(29,c[10030]|0);aF(h>>>5&31|32|0,c[10030]|0);aF(h&31|96|0,c[10030]|0);aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|64|0,c[10030]|0);cf(c[10030]|0,154112,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=(g|0)<-2?-2:g;if((e|0)>9){j=(e|0)%10&-1}else{j=e}cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=a[154144+(j+2|0)|0]|0,v)|0);c[8836]=j;i=f;return}function mB(){aI(154160,3,1,c[10030]|0);return}function mC(){aI(154432,6,1,c[10030]|0);aI(154304,2,1,c[10030]|0);return}function mD(b){b=b|0;var e=0,f=0,g=0;e=i;do{if((b|0)==0){f=0}else{g=uA(b|0)|0;if((g|0)==0){f=0;break}f=((d[b+(g-1|0)|0]|0)<<24)-822083584>>24}}while(0);cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=a[154344+((f-1|0)>>>0<3?f:0)|0]|0,v)|0);i=e;return 1}function mE(){aI(154432,6,1,c[10030]|0);return}function mF(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0.0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0,aA=0;b=i;i=i+240|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=b+96|0;k=b+120|0;l=b+144|0;m=b+168|0;n=b+192|0;o=b+216|0;if((c[13898]|0)==2){p=2}else{h[30427]=10.0;h[6936]=10.0;h[6935]=1.0;a[243104]=0;a[243312]=0;uu(c[60826]|0);c[60826]=0;uu(c[60774]|0);c[60774]=0;uu(c[60778]|0);c[60778]=0;h[6931]=1.0;a[55512]=0;h[6938]=1.0;a[243424]=0;p=c[13898]|0}q=c[8272]|0;L15888:do{if((p|0)<(q|0)){r=n|0;s=n+8|0;t=m|0;u=m+8|0;w=l|0;x=l+8|0;y=k|0;z=k+8|0;A=j|0;B=j+8|0;C=g|0;D=g+8|0;E=f|0;F=f+8|0;G=e|0;H=e+8|0;I=d|0;J=d+8|0;K=o|0;L=o+8|0;M=0;N=p;O=q;L15890:while(1){P=c[1054]|0;Q=P+(N*40&-1)|0;L15892:do{if((a[Q]&1)!=0){R=c[P+(N*40&-1)+36>>2]|0;S=P+(N*40&-1)+32|0;T=c[10036]|0;U=0;while(1){if((U|0)>=(R|0)){break}if((a[T+((c[S>>2]|0)+U|0)|0]|0)==(a[U+103664|0]|0)){U=U+1|0}else{break L15892}}if((U|0)==1){V=M;break L15888}}}while(0);W=N+1|0;c[13898]=W;S=c[60782]|0;L15899:do{if((S|0)==0){X=243128}else{T=c[P+(N*40&-1)+36>>2]|0;R=c[P+(N*40&-1)+32>>2]|0;Y=(a[Q]&1)==0;Z=(T|0)>0;_=c[10036]|0;$=243128;aa=S;while(1){L15903:do{if(!Y){if(Z){ab=0;ac=0;ad=R;while(1){ae=a[aa+ab|0]|0;if(ae<<24>>24==(a[_+(ab+ad|0)|0]|0)){af=ad;ag=ac}else{if(ae<<24>>24!=36){break L15903}af=ad-1|0;ag=1}ah=ab+1|0;if((ah|0)<(ag+T|0)){ab=ah;ac=ag;ad=af}else{break}}if((ag|0)==0){ai=ah}else{X=$;break L15899}}else{ai=0}ad=a[aa+ai|0]|0;if((ad<<24>>24|0)==36|(ad<<24>>24|0)==0){X=$;break L15899}}}while(0);ad=$+8|0;ac=c[ad>>2]|0;if((ac|0)==0){X=ad;break}else{$=ad;aa=ac}}}}while(0);S=c[X+4>>2]|0;do{if((S|0)==3){if((W|0)>=(O|0)){aj=11782;break L15890}L15919:do{if((a[P+(W*40&-1)|0]&1)!=0){Q=c[P+(W*40&-1)+36>>2]|0;aa=P+(W*40&-1)+32|0;$=c[10036]|0;T=0;while(1){if((T|0)>=(Q|0)){break}if((a[$+((c[aa>>2]|0)+T|0)|0]|0)==(a[T+103664|0]|0)){T=T+1|0}else{break L15919}}if((T|0)==1){aj=11782;break L15890}}}while(0);a[14176]=1;is(k);a[14176]=0;if((c[y>>2]|0)!=3){aj=11781;break L15890}aa=c[z>>2]|0;c[60826]=aa;if((aa|0)==0){aj=11784;break L15890}if((a[aa+(b4(aa|0,218288)|0)|0]|0)!=0){aj=11787;break L15890}a[243104]=1;ak=M}else if((S|0)==7){a[243312]=1;ak=M}else if((S|0)==8){L15932:do{if((W|0)<(O|0)){L15934:do{if((a[P+(W*40&-1)|0]&1)!=0){aa=c[P+(W*40&-1)+36>>2]|0;$=P+(W*40&-1)+32|0;Q=c[10036]|0;_=0;while(1){if((_|0)>=(aa|0)){break}if((a[Q+((c[$>>2]|0)+_|0)|0]|0)==(a[_+103664|0]|0)){_=_+1|0}else{break L15934}}if((_|0)==1){al=0;break L15932}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[E>>2]|0)==3){al=c[F>>2]|0;break}else{c[13898]=W;al=0;break}}else{al=0}}while(0);c[60778]=al;ak=M}else if((S|0)==9){c[(c[3524]|0)+68>>2]=46;T=(c[3524]|0)+96|0;c[T>>2]=c[T>>2]|32;ak=M}else if((S|0)==5){if((W|0)>=(O|0)){aj=11770;break L15890}L15948:do{if((a[P+(W*40&-1)|0]&1)!=0){T=c[P+(W*40&-1)+36>>2]|0;$=P+(W*40&-1)+32|0;Q=c[10036]|0;aa=0;while(1){if((aa|0)>=(T|0)){break}if((a[Q+((c[$>>2]|0)+aa|0)|0]|0)==(a[aa+103664|0]|0)){aa=aa+1|0}else{break L15948}}if((aa|0)==1){aj=11770;break L15890}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[w>>2]|0)!=3){aj=11769;break L15890}$=c[x>>2]|0;c[60774]=$;if(($|0)==0){aj=11772;break L15890}else{ak=M}}else if((S|0)==13){a[55512]=1;ak=M}else if((S|0)==14){$=is(o)|0;Q=c[$>>2]|0;if((Q|0)==2){am=+h[$+8>>3]}else if((Q|0)==3){am=+uz(c[$+8>>2]|0,0)}else if((Q|0)==1){am=+(c[$+8>>2]|0)}else{aj=11854;break L15890}if((c[K>>2]|0)==3){uu(c[L>>2]|0);c[K>>2]=1}h[6938]=am;if(am>.2){ak=M;break}h[6938]=1.0;ak=M}else if((S|0)==0){L15968:do{if((W|0)<(O|0)){L15970:do{if((a[P+(W*40&-1)|0]&1)!=0){$=c[P+(W*40&-1)+36>>2]|0;Q=P+(W*40&-1)+32|0;T=c[10036]|0;R=0;while(1){if((R|0)>=($|0)){break}if((a[T+((c[Q>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L15970}}if((R|0)==1){aj=11735;break L15968}}}while(0);aa=is(n)|0;Q=c[aa>>2]|0;if((Q|0)==3){an=+uz(c[aa+8>>2]|0,0)}else if((Q|0)==1){an=+(c[aa+8>>2]|0)}else if((Q|0)==2){an=+h[aa+8>>3]}else{aj=11740;break L15890}if((c[r>>2]|0)==3){uu(c[s>>2]|0);c[r>>2]=1}aa=~~(+(~~an|0)*10.0);c[13836]=aa;Q=c[13898]|0;L15985:do{if((c[8272]|0)>(Q|0)){T=c[1054]|0;if((a[T+(Q*40&-1)|0]&1)==0){ao=aa;break}$=c[T+(Q*40&-1)+36>>2]|0;_=T+(Q*40&-1)+32|0;T=c[10036]|0;Z=0;while(1){if((Z|0)>=($|0)){break}if((a[T+((c[_>>2]|0)+Z|0)|0]|0)==(a[Z+148464|0]|0)){Z=Z+1|0}else{ao=aa;break L15985}}if((Z|0)!=1){ao=aa;break}c[13898]=Q+1;_=is(m)|0;T=c[_>>2]|0;if((T|0)==2){ap=+h[_+8>>3]}else if((T|0)==3){ap=+uz(c[_+8>>2]|0,0)}else if((T|0)==1){ap=+(c[_+8>>2]|0)}else{aj=11753;break L15890}if((c[t>>2]|0)==3){uu(c[u>>2]|0);c[t>>2]=1}c[13832]=~~(+(~~ap|0)*10.0);ao=c[13836]|0}else{ao=aa}}while(0);if((ao|0)<1){c[13836]=6e3;aq=6e3}else{aq=ao}if((c[13832]|0)>=1){ar=aq;break}c[13832]=4e3;ar=aq}else{aj=11735}}while(0);if((aj|0)==11735){aj=0;c[13836]=6e3;c[13832]=4e3;ar=6e3}c[(c[3524]|0)+8>>2]=ar;c[(c[3524]|0)+12>>2]=c[13832];ak=M}else if((S|0)==10){c[(c[3524]|0)+68>>2]=118;aa=(c[3524]|0)+96|0;c[aa>>2]=c[aa>>2]&-33;ak=M}else if((S|0)==4){a[243104]=0;ak=M}else if((S|0)==1){uu(c[13874]|0);as=c[13898]|0;if((as|0)>=(c[8272]|0)){aj=11798;break L15890}aa=c[1054]|0;L16013:do{if((a[aa+(as*40&-1)|0]&1)!=0){Q=c[aa+(as*40&-1)+36>>2]|0;_=aa+(as*40&-1)+32|0;T=c[10036]|0;$=0;while(1){if(($|0)>=(Q|0)){break}if((a[T+((c[_>>2]|0)+$|0)|0]|0)==(a[$+103664|0]|0)){$=$+1|0}else{break L16013}}if(($|0)==1){aj=11798;break L15890}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[A>>2]|0)!=3){aj=11797;break L15890}aa=c[B>>2]|0;c[13874]=aa;if((aa|0)==0){aj=11800;break L15890}do{if((a[aa]|0)==0){at=+h[30427];h[6936]=at;au=at}else{_=bk(aa|0,148464)|0;if((a[aa+_|0]|0)!=44){au=+h[6936];break}T=aa+(_+1|0)|0;ca(T|0,148448,(v=i,i=i+8|0,c[v>>2]=55488,v)|0);at=+h[6936];if(at>0.0){au=at;break}at=+h[30427];h[6936]=at;au=at}}while(0);c[(c[3524]|0)+16>>2]=~~(au*+h[6935]*10.0);c[(c[3524]|0)+20>>2]=~~(+h[6936]*+h[6935]*.8*10.0);ak=M}else if((S|0)==15){a[55440]=1;ak=M}else if((S|0)==16){a[55440]=0;ak=M}else if((S|0)==12){a[55512]=0;ak=M}else if((S|0)==2){aa=is(g)|0;T=c[aa>>2]|0;if((T|0)==2){av=+h[aa+8>>3]}else if((T|0)==3){av=+uz(c[aa+8>>2]|0,0)}else if((T|0)==1){av=+(c[aa+8>>2]|0)}else{aj=11813;break L15890}if((c[C>>2]|0)==3){uu(c[D>>2]|0);c[C>>2]=1}at=av>0.0?av:10.0;h[30427]=at;h[6936]=at;ak=M}else if((S|0)==17){aa=hK()|0;be(243424,164384,(v=i,i=i+24|0,c[v>>2]=aa>>>16&255,c[v+8>>2]=aa>>>8&255,c[v+16>>2]=aa&255,v)|0);ak=aa}else if((S|0)==11){aa=is(d)|0;T=c[aa>>2]|0;if((T|0)==1){aw=+(c[aa+8>>2]|0)}else if((T|0)==2){aw=+h[aa+8>>3]}else if((T|0)==3){aw=+uz(c[aa+8>>2]|0,0)}else{aj=11843;break L15890}if((c[I>>2]|0)==3){uu(c[J>>2]|0);c[I>>2]=1}h[6935]=aw;if(aw>0.0){ak=M;break}h[6935]=1.0;ak=M}else if((S|0)==6){aa=is(e)|0;T=c[aa>>2]|0;if((T|0)==2){ax=+h[aa+8>>3]}else if((T|0)==3){ax=+uz(c[aa+8>>2]|0,0)}else if((T|0)==1){ax=+(c[aa+8>>2]|0)}else{aj=11834;break L15890}if((c[G>>2]|0)==3){uu(c[H>>2]|0);c[G>>2]=1}h[6931]=ax;if(ax>0.0){ak=M;break}h[6931]=1.0;ak=M}else{uh(N,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);ak=M}}while(0);S=c[13898]|0;P=c[8272]|0;if((S|0)<(P|0)){M=ak;N=S;O=P}else{V=ak;break L15888}}if((aj|0)==11843){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11800){ay=c[13898]|0;uf(ay,154936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11781){c[13898]=W;aj=11782}else if((aj|0)==11769){c[13898]=W;aj=11770}else if((aj|0)==11813){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11854){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11787){uf((c[13898]|0)-1|0,154976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11797){c[13898]=as;aj=11798}else if((aj|0)==11834){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11784){az=c[13898]|0;uf(az,155080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11740){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11772){aA=c[13898]|0;uf(aA,155136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11753){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aj|0)==11798){c[13874]=0;ay=as;uf(ay,154936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11782){c[60826]=0;az=W;uf(az,155080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11770){c[60774]=0;aA=W;uf(aA,155136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{V=0}}while(0);c[(c[3524]|0)+16>>2]=~~(+h[6936]*+h[6935]*10.0);c[(c[3524]|0)+20>>2]=~~(+h[6936]*+h[6935]*.8*10.0);be(13048,(a[55512]|0?95248:154912)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);ax=+h[6938];if(a[55512]&ax!=1.0){aA=13048+(uA(13048)|0)|0;be(aA|0,154888,(v=i,i=i+8|0,h[v>>3]=ax,v)|0)}aA=13048+(uA(13048)|0)|0;be(aA|0,(a[55440]|0?154872:154864)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aA=13048+(uA(13048)|0)|0;W=c[3524]|0;aj=~~(+((c[W+12>>2]|0)>>>0>>>0)/10.0);be(aA|0,154848,(v=i,i=i+16|0,c[v>>2]=~~(+((c[W+8>>2]|0)>>>0>>>0)/10.0),c[v+8>>2]=aj,v)|0);aj=13048+(uA(13048)|0)|0;ax=+h[6936];aw=+h[6931];be(aj|0,154816,(v=i,i=i+24|0,c[v>>2]=(c[(c[3524]|0)+68>>2]|0)==46?154784:179864,h[v+8>>3]=ax,h[v+16>>3]=aw,v)|0);aj=13048+(uA(13048)|0)|0;be(aj|0,154712,(v=i,i=i+8|0,h[v>>3]=+h[6935],v)|0);if((a[243424]|0)!=0){aj=13048+(uA(13048)|0)|0;be(aj|0,170616,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}V=c[60826]|0;aj=13048+(uA(13048)|0)|0;do{if((V|0)==0){uD(aj|0,154600,12);if(a[243312]|0){uD(13048+(uA(13048)|0)|0,154568,9)}W=c[60774]|0;if((W|0)==0){break}aA=13048+(uA(13048)|0)|0;be(aA|0,154544,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}else{be(aj|0,154624,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}}while(0);V=c[60778]|0;if((V|0)==0){i=b;return}be(13048+(uA(13048)|0)|0,154512,(v=i,i=i+8|0,c[v>>2]=V,v)|0);i=b;return}function mG(){return}function mH(){return}function mI(a){a=a|0;c[13840]=-a;return 1}function mJ(){var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0;b=i;if(a[55472]|0){d=c[10030]|0;aI(165112,14,1,d|0);if(!(a[72328]|0)){d=c[10030]|0;aI(165528,17,1,d|0)}a[55472]=0;a[72328]=1}aI(159504,62,1,c[10030]|0);cf(c[10030]|0,159472,(v=i,i=i+8|0,c[v>>2]=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/10.0),v)|0);cf(c[10030]|0,159440,(v=i,i=i+8|0,c[v>>2]=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/10.0),v)|0);cf(c[10030]|0,159408,(v=i,i=i+8|0,h[v>>3]=+(c[7938]|0)/10.0,v)|0);cf(c[10030]|0,159320,(v=i,i=i+8|0,h[v>>3]=+(c[7939]|0)/10.0,v)|0);cf(c[10030]|0,159248,(v=i,i=i+8|0,h[v>>3]=+(((c[(c[3524]|0)+12>>2]|0)-(c[7940]|0)|0)>>>0>>>0)/10.0,v)|0);cf(c[10030]|0,159216,(v=i,i=i+8|0,h[v>>3]=+(((c[(c[3524]|0)+12>>2]|0)-(c[7941]|0)|0)>>>0>>>0)/10.0,v)|0);cf(c[10030]|0,159176,(v=i,i=i+8|0,h[v>>3]=+((c[7939]|0)-(c[7938]|0)|0)/10.0,v)|0);cf(c[10030]|0,159016,(v=i,i=i+8|0,h[v>>3]=+((c[7941]|0)-(c[7940]|0)|0)/10.0,v)|0);e7(1);do{if((c[16546]|0)!=1){d=e6(72800)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158952,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158952,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(72544)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;f=c[d+24>>2]|0;cf(g|0,158984,(v=i,i=i+16|0,c[v>>2]=158912,c[v+8>>2]=f,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158912,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(225256)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158856,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158856,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(225200)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;f=c[d+24>>2]|0;cf(g|0,158984,(v=i,i=i+16|0,c[v>>2]=158832,c[v+8>>2]=f,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158832,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);if((a[30528]&1)!=0){d=c[10030]|0;j=(c[17366]&1|0)==0?+h[8687]:0.0;cf(d|0,158760,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}do{if((c[17261]&3|0)==0){d=c[10030]|0;aI(158560,33,1,d|0)}else{d=e6(224936)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158736,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158736,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(224872)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;f=c[d+24>>2]|0;cf(g|0,158984,(v=i,i=i+16|0,c[v>>2]=158664,c[v+8>>2]=f,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158664,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);do{if((c[17089]&3|0)==0){d=c[10030]|0;aI(158424,33,1,d|0)}else{d=e6(224640)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158520,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158520,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(224432)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==2){g=c[10030]|0;j=+h[d+24>>3];cf(g|0,158936,(v=i,i=i+16|0,c[v>>2]=158480,h[v+8>>3]=j,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,158984,(v=i,i=i+16|0,c[v>>2]=158480,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);cf(c[10030]|0,158392,(v=i,i=i+8|0,c[v>>2]=a[66164]&1,v)|0);cf(c[10030]|0,158360,(v=i,i=i+8|0,c[v>>2]=a[65476]&1,v)|0);if((a[30528]&1)!=0){e=c[10030]|0;d=a[69604]&1;cf(e|0,158328,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}aI(158192,75,1,c[10030]|0);aI(158112,76,1,c[10030]|0);d=c[10030]|0;if((c[16546]|0)==1){j=+h[8255];cf(d|0,158064,(v=i,i=i+8|0,h[v>>3]=j,v)|0);e=c[10030]|0;j=+h[8256];cf(e|0,157952,(v=i,i=i+8|0,h[v>>3]=j,v)|0);e=c[10030]|0;g=c[8510]|0;do{if((g|0)==0){f=c[8506]|0;if((f|0)==4){k=223560;break}k=(f|0)==5?223536:223520}else{k=g}}while(0);cf(e|0,157896,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}else{aI(157856,30,1,d|0)}aI(86144,2,1,c[10030]|0);if(a[243104]|0){l=c[10030]|0;m=aD(l|0)|0;i=b;return}d=c[60778]|0;cf(c[10030]|0,157664,(v=i,i=i+8|0,c[v>>2]=(d|0)!=0?d:179864,v)|0);if(a[243312]|0){d=c[10030]|0;k=c[60778]|0;e=(k|0)!=0?k:179864;cf(d|0,156600,(v=i,i=i+40|0,c[v>>2]=e,c[v+8>>2]=e,c[v+16>>2]=e,c[v+24>>2]=e,c[v+32>>2]=e,v)|0);e=c[13858]|0;d=e+5|0;if((d-((d|0)%6&-1)|0)>=1){d=1;k=e;do{e=(d|0)%6&-1;if((e|0)==1){g=c[10030]|0;aI(156592,6,1,g|0);n=c[13858]|0}else{n=k}g=c[10030]|0;if((d|0)>(n|0)){aI(156256,28,1,g|0)}else{cf(g|0,156408,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0)}if((e|0)==0){e=c[10030]|0;aI(156248,7,1,e|0)}d=d+1|0;k=c[13858]|0;e=k+5|0;}while((d|0)<=(e-((e|0)%6&-1)|0))}d=c[10030]|0;aI(156152,72,1,d|0);d=c[10030]|0;aI(155832,262,1,d|0);if((c[17261]&3|0)!=0){d=c[10030]|0;aI(155680,105,1,d|0)}if((c[17089]&3|0)!=0){d=c[10030]|0;aI(155568,105,1,d|0)}d=c[10030]|0;aI(155536,28,1,d|0);d=c[10030]|0;aI(155504,10,1,d|0)}d=c[3524]|0;k=~~(+((c[d+12>>2]|0)>>>0>>>0)/10.0);cf(c[10030]|0,155296,(v=i,i=i+16|0,c[v>>2]=~~(+((c[d+8>>2]|0)>>>0>>>0)/10.0),c[v+8>>2]=k,v)|0);if(a[243312]|0){k=c[10030]|0;aI(155248,19,1,k|0)}aI(155168,24,1,c[10030]|0);l=c[10030]|0;m=aD(l|0)|0;i=b;return}function mK(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;b=i;c[13864]=-5;c[13840]=0;a[55472]=0;c[13842]=-1;a[55390]=0;a[55408]=0;uD(55372,163848,17);c[13858]=0;d=c[60778]|0;if((d|0)==0){e=bP(221464)|0;c[60778]=e;f=e}else{f=d}d=uA(f|0)|0;do{if((a[f]|0)!=0){if((a[f+(d-1|0)|0]|0)==47){break}e=db(f,d+2|0,221440)|0;c[60778]=e;g=e+(uA(e|0)|0)|0;w=47;a[g]=w&255;w=w>>8;a[g+1|0]=w&255}}while(0);d=c[10030]|0;if(a[243104]|0){f=c[60826]|0;cf(d|0,161488,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=f,v)|0);f=c[10030]|0;g=c[60826]|0;e=(a[30528]&1)!=0?225e3:224992;j=c[3524]|0;k=~~(+((c[j+8>>2]|0)>>>0>>>0)/10.0);l=~~(+((c[j+12>>2]|0)>>>0>>>0)/10.0);cf(f|0,160752,(v=i,i=i+64|0,c[v>>2]=g,c[v+8>>2]=g,c[v+16>>2]=g,c[v+24>>2]=g,c[v+32>>2]=g,c[v+40>>2]=e,c[v+48>>2]=k,c[v+56>>2]=l,v)|0)}else{l=c[60774]|0;k=(l|0)!=0?l:162656;cf(d|0,162680,(v=i,i=i+8|0,c[v>>2]=k,v)|0);k=c[11252]|0;if((k|0)==15|(k|0)==0){d=c[10030]|0;aI(162584,68,1,d|0);m=c[11252]|0}else{m=k}k=c[10030]|0;d=c[60778]|0;l=(m|0)==15?162360:162344;cf(k|0,162424,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=l,c[v+16>>2]=d,v)|0);if(a[55512]|0){d=c[10030]|0;l=c[60778]|0;cf(d|0,162272,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}l=c[10030]|0;if(a[243312]|0){d=c[60778]|0;cf(l|0,162144,(v=i,i=i+8|0,c[v>>2]=d,v)|0);d=c[10030]|0;k=c[60778]|0;cf(d|0,162048,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}else{aI(161928,70,1,l|0)}l=c[10030]|0;aI(161664,257,1,l|0)}cf(c[10030]|0,160720,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);aI(159864,807,1,c[10030]|0);if(a[55512]|0){l=c[10030]|0;k=~~(+h[6938]*200.0);cf(l|0,159832,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}k=a[55440]|0;cf(c[10030]|0,159776,(v=i,i=i+16|0,c[v>>2]=k?131936:137232,c[v+8>>2]=k?131936:75184,v)|0);if((a[243424]|0)==0){n=c[10030]|0;o=+h[6931];p=cf(n|0,159584,(v=i,i=i+8|0,h[v>>3]=o,v)|0)|0;i=b;return}k=c[3524]|0;l=~~(+((c[k+8>>2]|0)>>>0>>>0)/10.0);d=~~(+((c[k+12>>2]|0)>>>0>>>0)/10.0);cf(c[10030]|0,159696,(v=i,i=i+24|0,c[v>>2]=243424,c[v+8>>2]=l,c[v+16>>2]=d,v)|0);n=c[10030]|0;o=+h[6931];p=cf(n|0,159584,(v=i,i=i+8|0,h[v>>3]=o,v)|0)|0;i=b;return}function mL(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=a[55472]|0;if(f&(c[13838]|0)==(b|0)&(c[13834]|0)==(d|0)){i=e;return}if(!f){f=c[10030]|0;aI(162736,17,1,f|0);a[55472]=1;a[72328]=0}f=(c[13832]|0)-d|0;cf(c[10030]|0,162768,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=f,v)|0);c[13838]=b;c[13834]=d;i=e;return}function mM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[13838]|0;g=c[13834]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}if(!(a[55472]|0)){h=c[10030]|0;aI(162736,17,1,h|0);a[55472]=1;a[72328]=0;h=c[10030]|0;j=(c[13832]|0)-g|0;cf(h|0,162768,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=j,v)|0);c[13838]=f;c[13834]=g}g=(c[13832]|0)-d|0;cf(c[10030]|0,162808,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0);c[13838]=b;c[13834]=d;i=e;return}function mN(b){b=b|0;var d=0,e=0,f=0;d=i;if((c[13864]|0)==(b|0)){i=d;return}c[13864]=b;if(a[55472]|0){e=c[10030]|0;aI(165112,14,1,e|0);if(!(a[72328]|0)){e=c[10030]|0;aI(165528,17,1,e|0)}a[55472]=0;a[72328]=1}if((b|0)>13){f=(b|0)%14&-1}else{f=b}b=(f|0)>-3;e=b?f:-3;if(b|(a[243424]|0)==0){b=c[243320+(e+3<<2)>>2]|0;uB(55372,b|0)}else{uB(55372,243424)}if((aY(55372,55390)|0)!=0){b=c[10030]|0;cf(b|0,164320,(v=i,i=i+8|0,c[v>>2]=55372,v)|0);uB(55390,55372)}if(!(a[55512]|0)){i=d;return}if((e-1|0)>>>0<4){b=c[10030]|0;f=e+1|0;cf(b|0,162968,(v=i,i=i+8|0,c[v>>2]=f,v)|0);i=d;return}f=c[10030]|0;if((e|0)==-1){aI(162920,26,1,f|0);i=d;return}else{aI(164808,19,1,f|0);i=d;return}}function mO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0;f=i;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}if(a[55472]|0){g=c[10030]|0;aI(165112,14,1,g|0);if(!(a[72328]|0)){g=c[10030]|0;aI(165528,17,1,g|0)}a[55472]=0;a[72328]=1}g=c[13840]|0;j=c[10030]|0;k=~~(+(c[13832]|0)+50.0- +(d>>>0>>>0));l=+h[6936]*+h[6935];d=c[13866]|0;if((g|0)==0){cf(j|0,164024,(v=i,i=i+32|0,c[v>>2]=b,c[v+8>>2]=k,h[v+16>>3]=l,c[v+24>>2]=d,v)|0)}else{cf(j|0,164152,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=k,c[v+16>>2]=g,h[v+24>>3]=l,c[v+32>>2]=d,v)|0)}d=e;g=a[e]|0;do{if((g<<24>>24|0)==34|(g<<24>>24|0)==92){e=c[10030]|0;aF(92,e|0);m=a[d]|0}else{m=g}d=d+1|0;aF(m<<24>>24|0,c[10030]|0);g=a[d]|0;}while(g<<24>>24!=0);aI(163984,4,1,c[10030]|0);i=f;return}function mP(a){a=a|0;if((a|0)==2){c[13866]=164216}else if((a|0)==1){c[13866]=173184}else{c[13866]=179864}return 1}function mQ(a){a=a|0;return 0}function mR(a){a=+a;h[30390]=a<0.0?1.0:a;return}function mS(b,d,e,f,g,i){b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;if((i|0)==3){c[59636]=c[13838];c[59634]=c[13834];return}else if((i|0)==4){c[13838]=c[59636];c[13834]=c[59634];return}else{if(a[238512]|0){return}a[238512]=1;c[11232]=43856;h[29815]=d;h[29816]=e*10.0;a[238496]=g&1;a[238480]=f&1;a[238504]=(i|0)!=0&1;return}}function mT(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0;f=i;g=+h[30390]*.6*100.0;j=(e|0)%9&-1;if(g<=0.0&(j|0)>-1){i=f;return}if(a[55472]|0){e=c[10030]|0;aI(165112,14,1,e|0);if(!(a[72328]|0)){e=c[10030]|0;aI(165528,17,1,e|0)}a[55472]=0;a[72328]=1}do{if((j|0)==4|(j|0)==6|(j|0)==8){if((aY(55408,55372)|0)==0){break}e=c[10030]|0;cf(e|0,164776,(v=i,i=i+8|0,c[v>>2]=55372,v)|0);uB(55408,55372)}else if(!((j|0)==0|(j|0)==1|(j|0)==2|(j|0)==3|(j|0)==5|(j|0)==7)){e=(c[13832]|0)-d|0;cf(c[10030]|0,164256,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=e,v)|0);i=f;return}}while(0);e=(c[13832]|0)-d|0;cf(c[10030]|0,164232,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=b,c[v+16>>2]=e,h[v+24>>3]=g,v)|0);i=f;return}function mU(b){b=b|0;var d=0,e=0,f=0,g=0.0,j=0,k=0.0;d=i;do{if((b|0)==0){e=12072}else{if((a[b]|0)==0){e=12072;break}f=bk(b|0,148464)|0;if((a[b+f|0]|0)!=44){g=+h[6936];break}j=b+(f+1|0)|0;ca(j|0,148448,(v=i,i=i+8|0,c[v>>2]=55488,v)|0);k=+h[6936];if(k>0.0){g=k;break}k=+h[30427];h[6936]=k;g=k}}while(0);if((e|0)==12072){k=+h[30427];h[6936]=k;g=k}c[(c[3524]|0)+16>>2]=~~(g*+h[6935]*10.0);c[(c[3524]|0)+20>>2]=~~(+h[6936]*+h[6935]*.8*10.0);i=d;return 1}function mV(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;tW(b);if(a[55512]|0){b=c[10030]|0;aI(164808,19,1,b|0);c[13864]=-5}if((aY(55408,243392)|0)!=0){b=c[10030]|0;cf(b|0,164776,(v=i,i=i+8|0,c[v>>2]=243392,v)|0);uB(55408,243392)}b=(c[13832]|0)-(g+e|0)|0;cf(c[10030]|0,164272,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=b,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);i=h;return}function mW(b){b=+b;var d=0,e=0;d=i;if(a[55472]|0){e=c[10030]|0;aI(165112,14,1,e|0);if(!(a[72328]|0)){e=c[10030]|0;aI(165528,17,1,e|0)}a[55472]=0;a[72328]=1}if(+(c[13842]|0)==b){i=d;return}cf(c[10030]|0,164296,(v=i,i=i+8|0,h[v>>3]=+h[6931]*b,v)|0);c[13842]=~~b;i=d;return}function mX(b){b=b|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e|0;g=c[b>>2]|0;if((g|0)==5){fr(+h[b+8>>3],f)}else if((g|0)==1){mN(c[b+4>>2]|0);i=e;return}else if((g|0)==3){g=c[b+4>>2]|0;a[f|0]=g>>>16&255;a[f+1|0]=g>>>8&255;a[f+2|0]=g&255}else{i=e;return}if(a[55472]|0){g=c[10030]|0;aI(165112,14,1,g|0);if(!(a[72328]|0)){g=c[10030]|0;aI(165528,17,1,g|0)}a[55472]=0;a[72328]=1}g=d[f+1|0]|0;b=d[f+2|0]|0;be(55372,164384,(v=i,i=i+24|0,c[v>>2]=d[f|0]|0,c[v+8>>2]=g,c[v+16>>2]=b,v)|0);if((aY(55372,55390)|0)!=0){b=c[10030]|0;cf(b|0,164320,(v=i,i=i+8|0,c[v>>2]=55372,v)|0);uB(55390,55372)}c[13864]=-5;i=e;return}function mY(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if(a[55472]|0){f=c[10030]|0;aI(165112,14,1,f|0);if(!(a[72328]|0)){f=c[10030]|0;aI(165528,17,1,f|0)}a[55472]=0;a[72328]=1}if(a[55512]|0){f=c[10030]|0;aI(164808,19,1,f|0);c[13864]=-5}f=d+8|0;g=c[f>>2]|0;do{if(!((g|0)==1601|(g|0)==3)){tW(g);if((aY(55408,243392)|0)==0){break}h=c[10030]|0;cf(h|0,164776,(v=i,i=i+8|0,c[v>>2]=243392,v)|0);uB(55408,243392)}}while(0);g=(c[13832]|0)-(c[d+4>>2]|0)|0;cf(c[10030]|0,164760,(v=i,i=i+16|0,c[v>>2]=c[d>>2],c[v+8>>2]=g,v)|0);if((b|0)>1){g=1;do{h=(c[13832]|0)-(c[d+(g*12&-1)+4>>2]|0)|0;cf(c[10030]|0,164744,(v=i,i=i+16|0,c[v>>2]=c[d+(g*12&-1)>>2],c[v+8>>2]=h,v)|0);g=g+1|0;}while((g|0)<(b|0))}b=c[f>>2]|0;if((b|0)==1601|(b|0)==3){b=c[10030]|0;aI(164680,8,1,b|0);i=e;return}else{b=c[10030]|0;aI(164736,7,1,b|0);i=e;return}}function mZ(){var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0;if(!(a[238512]|0)){return}a[238512]=0;a[c[11232]|0]=0;b=+h[6936];d=c[13838]|0;e=c[13834]|0;f=43856+(uA(43856)|0)|0;g=a[43856]|0;L16425:do{if(g<<24>>24==0){i=0}else{j=(c[11252]|0)==15;k=0;l=43856;m=g;while(1){n=m<<24>>24;if((n&128|0)==0){do{if((aZ(165104,n|0,5)|0)==0){if((aZ(165088,n|0,9)|0)!=0){o=k+10|0;break}if((aZ(165080,n|0,4)|0)!=0){o=k+12|0;break}if((aZ(165072,n|0,8)|0)!=0){o=k+14|0;break}if((aZ(165032,n|0,15)|0)!=0){o=k+16|0;break}if((aZ(165008,n|0,18)|0)!=0){o=k+18|0;break}if((aZ(164944,n|0,10)|0)!=0){o=k+24|0;break}if((aZ(164840,n|0,2)|0)==0){o=k+20|0;break}else{o=k+30|0;break}}else{o=k+8|0}}while(0);p=l+1|0;q=o}else{do{if(j){if((n&224|0)==192){r=l+2|0;break}if((n&240|0)==224){r=l+3|0;break}else{r=l+4|0;break}}else{r=l+1|0}}while(0);n=k+18|0;if(r>>>0>f>>>0){i=n;break L16425}else{p=r;q=n}}n=a[p]|0;if(n<<24>>24==0){i=q;break}else{k=q;l=p;m=n}}}}while(0);s=+h[29815];t=s*+(i|0)*10.0/25.0;h[6936]=s;s=+(c[13840]|0)*1.5707963267948966/90.0;u=+T(+s);v=+h[29816];i=~~(+(d|0)+u*v);d=~~(+(e|0)+v*+S(+s));do{if((a[238496]&1)!=0){if(a[238488]|0){break}mO(i,d,43856)}}while(0);do{if((a[238504]&1)==0){if((a[238480]&1)==0){break}s=+(c[13840]|0)*1.5707963267948966/90.0;v=t*+S(+s);c[13838]=~~(v+ +(c[13838]|0));v=t*+T(+s);c[13834]=~~(+(c[13834]|0)-v)}else{v=+(c[13840]|0)*1.5707963267948966/90.0;s=t*+S(+v)*.5;c[13838]=~~(+(c[13838]|0)+s);s=t*+T(+v)*.5;c[13834]=~~(+(c[13834]|0)-s)}}while(0);h[6936]=b;return}function m_(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[60826]|0;f=(e|0)!=0?e:165512;if((b|0)==0|(b|0)==10){c[13858]=0;i=d;return}else if((b|0)==6){e=(c[13858]|0)+1|0;c[13858]=e;if(a[55472]|0){g=c[10030]|0;aI(165112,14,1,g|0);if(!(a[72328]|0)){g=c[10030]|0;aI(165528,17,1,g|0)}a[55472]=0;a[72328]=1;h=c[13858]|0}else{h=e}cf(c[10030]|0,165424,(v=i,i=i+32|0,c[v>>2]=f,c[v+8>>2]=h,c[v+16>>2]=f,c[v+24>>2]=h,v)|0);i=d;return}else if((b|0)==7){if(a[55472]|0){h=c[10030]|0;aI(165112,14,1,h|0);if(!(a[72328]|0)){h=c[10030]|0;aI(165528,17,1,h|0)}a[55472]=0;a[72328]=1}h=c[13858]|0;cf(c[10030]|0,165376,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=h,v)|0);c[13864]=-5;c[13842]=-1;a[55390]=0;a[55408]=0;i=d;return}else if((b|0)==3){aI(165224,94,1,c[10030]|0);i=d;return}else if((b|0)==4){aI(165160,43,1,c[10030]|0);i=d;return}else{i=d;return}}function m$(b){b=b|0;if((b|0)!=1){return}aI(165528,17,1,c[10030]|0);a[72328]=1;return}function m0(){var b=0,d=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0,_=0,$=0,ab=0.0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0.0,ao=0;b=i;i=i+120|0;d=b|0;f=b+24|0;g=b+48|0;j=b+72|0;k=b+96|0;l=b+104|0;m=b+112|0;if((c[13898]|0)==2){n=2}else{tV();n=c[13898]|0}o=c[8272]|0;L16513:do{if((n|0)<(o|0)){p=d|0;q=d+8|0;r=f|0;s=f+8|0;t=j|0;u=j+8|0;w=g|0;x=g+8|0;y=n;z=o;L16515:while(1){A=c[1054]|0;B=a[A+(y*40&-1)|0]|0;C=(B&1)==0;L16517:do{if(!C){D=c[A+(y*40&-1)+36>>2]|0;E=A+(y*40&-1)+32|0;F=c[10036]|0;G=0;while(1){if((G|0)>=(D|0)){break}if((a[F+((c[E>>2]|0)+G|0)|0]|0)==(a[G+103664|0]|0)){G=G+1|0}else{break L16517}}if((G|0)==1){break L16513}}}while(0);E=c[60494]|0;L16524:do{if((E|0)==0){H=241976}else{F=c[A+(y*40&-1)+36>>2]|0;D=c[A+(y*40&-1)+32>>2]|0;I=(F|0)>0;J=c[10036]|0;K=241976;L=E;while(1){L16528:do{if(!C){if(I){M=0;N=0;O=D;while(1){P=a[L+M|0]|0;if(P<<24>>24==(a[J+(M+O|0)|0]|0)){Q=O;R=N}else{if(P<<24>>24!=36){break L16528}Q=O-1|0;R=1}S=M+1|0;if((S|0)<(R+F|0)){M=S;N=R;O=Q}else{break}}if((R|0)==0){T=S}else{H=K;break L16524}}else{T=0}O=a[L+T|0]|0;if((O<<24>>24|0)==36|(O<<24>>24|0)==0){H=K;break L16524}}}while(0);O=K+8|0;N=c[O>>2]|0;if((N|0)==0){H=O;break}else{K=O;L=N}}}}while(0);E=c[H+4>>2]|0;L16541:do{if((E|0)==12){c[13898]=y+1;L=hK()|0;c[13828]=L;if((c[13554]|0)==0){c[13554]=1;K=ut(16)|0;if((K|0)==0){gk();F=ut(16)|0;if((F|0)==0){U=12256;break L16515}else{V=F}}else{V=K}K=V;c[13550]=K;c[K>>2]=0;W=c[13828]|0}else{W=L}c[(c[13550]|0)+4>>2]=W>>>16&255;c[(c[13550]|0)+8>>2]=(c[13828]|0)>>>8&255;c[(c[13550]|0)+12>>2]=c[13828]&255}else if((E|0)==7){a[54576]=0;c[13898]=y+1}else if((E|0)==8){a[54576]=1;c[13898]=y+1}else if((E|0)==1){a[54400]=0;c[13898]=y+1}else if((E|0)==4){a[54472]=0;L=(c[3524]|0)+96|0;c[L>>2]=c[L>>2]&-1025;c[13898]=(c[13898]|0)+1}else if((E|0)==0){a[54400]=1;c[13898]=y+1}else if((E|0)==5){a[54336]=0;c[13898]=y+1}else if((E|0)==9){L=y+1|0;c[13898]=L;if((L|0)>=(z|0)){break}L16557:do{if((a[A+(L*40&-1)|0]&1)!=0){K=c[A+(L*40&-1)+36>>2]|0;F=A+(L*40&-1)+32|0;J=c[10036]|0;D=0;while(1){if((D|0)>=(K|0)){break}if((a[J+((c[F>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L16557}}if((D|0)==1){break L16541}}}while(0);L=is(j)|0;F=c[L>>2]|0;if((F|0)==2){X=+h[L+8>>3]}else if((F|0)==3){X=+uz(c[L+8>>2]|0,0)}else if((F|0)==1){X=+(c[L+8>>2]|0)}else{U=12233;break L16515}if((c[t>>2]|0)==3){uu(c[u>>2]|0);c[t>>2]=1}L=~~X;c[13622]=L;if(!((L|0)==0|L>>>0>1e4)){break}uh(c[13898]|0,166032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13622]=1}else if((E|0)==2){tV();c[13898]=(c[13898]|0)+1}else if((E|0)==10){L=y+1|0;c[13898]=L;if((L|0)>=(z|0)){break}L16666:do{if((a[A+(L*40&-1)|0]&1)!=0){F=c[A+(L*40&-1)+36>>2]|0;J=A+(L*40&-1)+32|0;K=c[10036]|0;I=0;while(1){if((I|0)>=(F|0)){break}if((a[K+((c[J>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{break L16666}}if((I|0)==1){break L16541}}}while(0);L=is(g)|0;J=c[L>>2]|0;if((J|0)==2){Y=+h[L+8>>3]}else if((J|0)==1){Y=+(c[L+8>>2]|0)}else if((J|0)==3){Y=+uz(c[L+8>>2]|0,0)}else{U=12248;break L16515}if((c[w>>2]|0)==3){uu(c[x>>2]|0);c[w>>2]=1}L=~~Y;c[13604]=L;if(L>>>0<=1e4){break}uh(c[13898]|0,166008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13604]=432}else if((E|0)==6){a[54336]=1;c[13898]=y+1}else if((E|0)==11){a[54424]=1;c[13898]=y+1}else if((E|0)==3){a[54472]=1;L=(c[3524]|0)+96|0;c[L>>2]=c[L>>2]|1024;c[13898]=(c[13898]|0)+1}else{L=c[10036]|0;J=c[A+(y*40&-1)+32>>2]|0;K=L+J|0;if((a[K]|0)==120){if((ca(K|0,165992,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=l,c[v+16>>2]=m,v)|0)|0)!=3){U=12261;break L16515}K=c[13554]|0;F=c[13552]|0;if((K|0)<(F|0)){Z=K}else{K=(F<<1)+4|0;c[13552]=K;F=db(c[13550]|0,K*12&-1|4,167368)|0;c[13550]=F;c[F>>2]=0;Z=c[13554]|0}c[(c[13550]|0)+((Z*3&-1)+1<<2)>>2]=e[k>>1]|0;c[(c[13550]|0)+(((c[13554]|0)*3&-1)+2<<2)>>2]=e[l>>1]|0;c[(c[13550]|0)+(((c[13554]|0)*3&-1)+3<<2)>>2]=e[m>>1]|0;c[13554]=(c[13554]|0)+1;c[13898]=(c[13898]|0)+1;break}L16582:do{if((z|0)<=(y|0)|C){_=y;$=B}else{F=c[A+(y*40&-1)+36>>2]|0;K=0;while(1){if((K|0)>=(F|0)){break}if((a[L+(J+K|0)|0]|0)==(a[K+124352|0]|0)){K=K+1|0}else{_=y;$=B;break L16582}}if((K|0)!=4){_=y;$=B;break}F=y+1|0;c[13898]=F;_=F;$=a[A+(F*40&-1)|0]|0}}while(0);J=($&1)==0;if(J){U=12273}else{F=a[L+(c[A+(_*40&-1)+32>>2]|0)|0]|0;if(!((F<<24>>24|0)==39|(F<<24>>24|0)==34)){U=12273}}L16592:do{if((U|0)==12273){U=0;F=c[10810]|0;L16594:do{if((F|0)!=0){I=A+(_*40&-1)+36|0;D=A+(_*40&-1)+32|0;G=F;L16596:while(1){N=c[G+4>>2]|0;L16598:do{if(!((z|0)<=(_|0)|J)){O=c[I>>2]|0;M=0;while(1){if((M|0)>=(O|0)){break}if((a[L+((c[D>>2]|0)+M|0)|0]|0)==(a[N+M|0]|0)){M=M+1|0}else{break L16598}}if((a[N+M|0]|0)==0){break L16596}}}while(0);N=c[G>>2]|0;if((N|0)==0){break L16594}else{G=N}}if((a[G+8|0]&1)!=0){break}if((c[G+16>>2]|0)==3){break L16592}}}while(0);F=is(d)|0;K=c[F>>2]|0;if((K|0)==2){ab=+h[F+8>>3]}else if((K|0)==3){ab=+uz(c[F+8>>2]|0,0)}else if((K|0)==1){ab=+(c[F+8>>2]|0)}else{U=12321;break L16515}if((c[p>>2]|0)==3){uu(c[q>>2]|0);c[p>>2]=1}c[13628]=~~ab;break L16541}}while(0);L16617:do{if((_|0)<(z|0)){L16619:do{if(!J){F=c[A+(_*40&-1)+36>>2]|0;K=A+(_*40&-1)+32|0;D=0;while(1){if((D|0)>=(F|0)){break}if((a[L+((c[K>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L16619}}if((D|0)==1){ac=0;break L16617}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[r>>2]|0)==3){ac=c[s>>2]|0;break}else{c[13898]=_;ac=0;break}}else{ac=0}}while(0);L=a8(ac|0,44)|0;do{if((L|0)!=0){if((ca(L+1|0,21e4,(v=i,i=i+8|0,c[v>>2]=54512,v)|0)|0)!=1){break}a[L]=0}}while(0);L16634:do{if((a[ac]|0)==0){L=uA(54528)|0;J=c[13630]|0;K=c[J>>2]|0;if((K|0)==0){ad=J;U=12305;break}else{ae=0;af=K}while(1){if((uA(af|0)|0)==(L|0)){if((uJ(54528,af|0,L|0)|0)==0){ag=ae;ah=J;U=12304;break L16634}}K=ae+1|0;F=c[J+(K<<4)>>2]|0;if((F|0)==0){ad=J;U=12305;break}else{ae=K;af=F}}}else{J=uA(ac|0)|0;L=c[13630]|0;F=c[L>>2]|0;if((F|0)==0){ad=L;U=12305;break}else{ai=0;aj=F}while(1){if((uA(aj|0)|0)==(J|0)){if((uJ(ac|0,aj|0,J|0)|0)==0){ag=ai;ah=L;U=12304;break L16634}}F=ai+1|0;K=c[L+(F<<4)>>2]|0;if((K|0)==0){ad=L;U=12305;break}else{ai=F;aj=K}}}}while(0);do{if((U|0)==12304){U=0;if((ag|0)==-1){ad=ah;U=12305;break}uu(ac);ak=ag;al=c[13630]|0}}while(0);if((U|0)==12305){U=0;L=0;while(1){if((c[ad+(L<<4)>>2]|0)==0){break}else{L=L+1|0}}J=(L<<4)+32|0;K=ut(J)|0;if((K|0)==0){gk();F=ut(J)|0;if((F|0)==0){U=12309;break L16515}else{am=F}}else{am=K}K=am;c[am>>2]=ac;h[am+8>>3]=1.0;if((L|0)>=0){F=c[13630]|0;J=0;while(1){G=J+1|0;I=K+(G<<4)|0;N=F+(J<<4)|0;c[I>>2]=c[N>>2];c[I+4>>2]=c[N+4>>2];c[I+8>>2]=c[N+8>>2];c[I+12>>2]=c[N+12>>2];if((G|0)>(L|0)){break}else{J=G}}}c[13630]=K;ak=0;al=K}uF(54528,c[al+(ak<<4)>>2]|0,32)}}while(0);y=c[13898]|0;z=c[8272]|0;if((y|0)>=(z|0)){break L16513}}if((U|0)==12321){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12233){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12256){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=167368,v)|0)}else if((U|0)==12248){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12261){uf(c[13898]|0,165952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12309){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=166248,v)|0)}}}while(0);U=(c[3524]|0)+8|0;if(a[54400]|0){c[U>>2]=23478;c[(c[3524]|0)+12>>2]=32585}else{c[U>>2]=32585;c[(c[3524]|0)+12>>2]=23478}U=uA(54528)|0;ak=c[13630]|0;al=c[ak>>2]|0;L16698:do{if((al|0)==0){an=1.0}else{am=0;ac=al;while(1){if((uA(ac|0)|0)==(U|0)){if((uJ(54528,ac|0,U|0)|0)==0){break}}ad=am+1|0;ag=c[ak+(ad<<4)>>2]|0;if((ag|0)==0){an=1.0;break L16698}else{am=ad;ac=ag}}an=+h[ak+(am<<4)+8>>3]}}while(0);ak=c[3524]|0;c[ak+16>>2]=aa((((c[ak+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13628]|0);ak=c[3524]|0;c[ak+20>>2]=~~(an*+(aa((((c[ak+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13628]|0)>>>0>>>0)*.527);ak=c[13628]|0;be(242752,165944,(v=i,i=i+16|0,c[v>>2]=54528,c[v+8>>2]=ak,v)|0);ak=a[54472]|0?116408:116440;U=a[54336]|0?185368:185408;al=a[54576]|0?131504:131584;ac=a[54424]|0?165816:179864;ag=c[13604]|0;ad=c[13622]|0;ah=c[13628]|0;be(13048,165832,(v=i,i=i+72|0,c[v>>2]=a[54400]|0?78720:78704,c[v+8>>2]=ak,c[v+16>>2]=U,c[v+24>>2]=al,c[v+32>>2]=ac,c[v+40>>2]=ag,c[v+48>>2]=ad,c[v+56>>2]=54528,c[v+64>>2]=ah,v)|0);ah=c[13554]|0;do{if((ah|0)>0){ad=0;ag=ah;while(1){ac=uA(13048)|0;if((ac+9|0)>>>0>=1024){ao=ag;break}al=ad*3&-1;U=c[13550]|0;ak=c[U+(al+2<<2)>>2]|0;aj=c[U+(al+3<<2)>>2]|0;be(ac+13048|0,165744,(v=i,i=i+24|0,c[v>>2]=c[U+(al+1<<2)>>2],c[v+8>>2]=ak,c[v+16>>2]=aj,v)|0);aj=ad+1|0;ak=c[13554]|0;if((aj|0)<(ak|0)){ad=aj;ag=ak}else{ao=ak;break}}if((ao|0)<96){break}i=b;return}}while(0);ao=db(c[13550]|0,1156,167368)|0;c[13550]=ao;c[ao>>2]=0;ao=c[13554]|0;if((ao|0)<96){ah=ao;ag=ao*3&-1;do{c[(c[13550]|0)+(ag+1<<2)>>2]=(c[(c[7642]|0)+(ah<<3)+4>>2]|0)>>>16&255;c[(c[13550]|0)+(ag+2<<2)>>2]=(c[(c[7642]|0)+(ah<<3)+4>>2]|0)>>>8&255;ag=ag+3|0;c[(c[13550]|0)+(ag<<2)>>2]=c[(c[7642]|0)+(ah<<3)+4>>2]&255;ah=ah+1|0;}while((ah|0)<96)}c[13554]=96;i=b;return}function m1(){c[13596]=0;c[13598]=0;uu(c[13602]|0);return}function m2(){var a=0,b=0,d=0,e=0;a=i;c[13596]=0;c[13598]=0;c[13626]=0;h[6804]=0.0;c[13616]=1;c[13617]=1;b=ut(65528)|0;if((b|0)!=0){d=b;e=d;c[13602]=e;i=a;return}gk();b=ut(65528)|0;if((b|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=166104,v)|0)}else{d=b;e=d;c[13602]=e;i=a;return}}function m3(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[13656]|0;if((g|0)!=0){h=c[13602]|0;tY(4,1,g<<1);L16730:do{if((g|0)>0){j=d;k=d+1|0;l=0;while(1){m=c[h+(l<<2)>>2]|0;if((m|0)<=-32769){n=12355;break}if((m|0)>=32768){n=12357;break}a[j]=m>>>8&255;a[k]=m&255;aI(j|0,1,2,c[10030]|0);l=l+1|0;if((l|0)>=(g|0)){break L16730}}if((n|0)==12357){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((n|0)==12355){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}n=f;a[n]=0;a[f+1|0]=-96;aI(n|0,1,2,c[10030]|0);n=e;a[n]=0;a[e+1|0]=64;aI(n|0,1,2,c[10030]|0);i=b;return}function m4(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0.0;b=i;i=i+832|0;d=b|0;e=b+8|0;f=b+16|0;g=b+24|0;j=b+32|0;k=b+40|0;l=b+48|0;m=b+56|0;n=b+64|0;o=b+72|0;p=b+80|0;q=b+88|0;r=b+96|0;s=b+104|0;t=b+112|0;u=b+120|0;w=b+128|0;x=b+136|0;y=b+144|0;z=b+152|0;A=b+160|0;B=b+168|0;C=b+176|0;D=b+184|0;E=b+192|0;F=b+200|0;G=b+208|0;H=b+216|0;I=b+224|0;J=b+232|0;K=b+240|0;L=b+248|0;M=b+256|0;N=b+320|0;O=b+328|0;P=b+336|0;Q=b+344|0;R=b+352|0;S=b+360|0;T=b+368|0;U=b+376|0;V=b+384|0;W=b+392|0;X=b+400|0;Y=b+408|0;Z=b+416|0;_=b+424|0;$=b+432|0;ab=b+440|0;ac=b+448|0;ad=b+456|0;ae=b+464|0;af=b+472|0;ag=b+480|0;ah=b+488|0;ai=b+496|0;aj=b+504|0;ak=b+512|0;al=b+520|0;am=b+784|0;an=c[3524]|0;ao=c[8244]|0;if((ao|0)==0){t_(0,1,1,0)}else{t_(0,1,(uA(ao|0)|0)+1|0,ao)}ao=L;a[ao]=16;a[L+1|0]=34;aI(ao|0,1,2,c[10030]|0);ao=al;L=c[60528]|0;if((L|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((L|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[ao]=L>>>8&255;a[al+1|0]=L&255;aI(ao|0,1,2,c[10030]|0);ao=b+528|0;L=a[54472]|0?0:2;be(ao|0,166264,(v=i,i=i+24|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=L,v)|0);t_(1,2,uA(ao|0)|0,ao);c[60558]=54;ao=K;a[ao]=17;a[K+1|0]=127;aI(ao|0,1,2,c[10030]|0);ao=J;a[ao]=0;a[J+1|0]=-38;aI(ao|0,1,2,c[10030]|0);ao=ak;J=ak+1|0;ak=0;while(1){K=c[242232+(ak<<2)>>2]|0;if((K|0)<=-32769){ap=12370;break}if((K|0)>=32768){ap=12372;break}a[ao]=K>>>8&255;a[J]=K&255;aI(ao|0,1,2,c[10030]|0);K=ak+1|0;if((K|0)<109){ak=K}else{ap=12374;break}}if((ap|0)==12374){ak=I;a[ak]=16;a[I+1|0]=98;I=c[10030]|0;aI(ak|0,1,2,I|0);I=aj;ak=c[60530]|0;if((ak|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ak|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[I]=ak>>>8&255;a[aj+1|0]=ak&255;ak=c[10030]|0;aI(I|0,1,2,ak|0);ak=H;a[ak]=16;a[H+1|0]=-126;H=c[10030]|0;aI(ak|0,1,2,H|0);H=ai;ak=c[60552]|0;if((ak|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ak|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[H]=ak>>>8&255;a[ai+1|0]=ak&255;ak=c[10030]|0;aI(H|0,1,2,ak|0);ak=G;a[ak]=16;a[G+1|0]=-90;G=c[10030]|0;aI(ak|0,1,2,G|0);G=ah;ak=ah+1|0;ah=c[60540]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[G]=ah>>>8&255;a[ak]=ah&255;ah=c[10030]|0;aI(G|0,1,2,ah|0);ah=c[60541]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[G]=ah>>>8&255;a[ak]=ah&255;ah=c[10030]|0;aI(G|0,1,2,ah|0);ah=c[60542]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[G]=ah>>>8&255;a[ak]=ah&255;ah=c[10030]|0;aI(G|0,1,2,ah|0);ah=F;a[ah]=16;a[F+1|0]=-62;F=c[10030]|0;aI(ah|0,1,2,F|0);F=ag;ah=c[60554]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[F]=ah>>>8&255;a[ag+1|0]=ah&255;ah=c[10030]|0;aI(F|0,1,2,ah|0);ah=E;a[ah]=16;a[E+1|0]=-30;E=c[10030]|0;aI(ah|0,1,2,E|0);E=af;ah=c[60678]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[E]=ah>>>8&255;a[af+1|0]=ah&255;ah=c[10030]|0;aI(E|0,1,2,ah|0);ah=D;a[ah]=17;a[D+1|0]=2;D=c[10030]|0;aI(ah|0,1,2,D|0);D=ae;ah=c[60680]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[D]=ah>>>8&255;a[ae+1|0]=ah&255;ah=c[10030]|0;aI(D|0,1,2,ah|0);ah=C;a[ah]=17;a[C+1|0]=34;C=c[10030]|0;aI(ah|0,1,2,C|0);C=ad;ah=c[13620]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[C]=ah>>>8&255;a[ad+1|0]=ah&255;ah=c[10030]|0;aI(C|0,1,2,ah|0);ah=B;a[ah]=17;a[B+1|0]=76;B=c[10030]|0;aI(ah|0,1,2,B|0);B=ac;ah=ac+1|0;ac=c[60670]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60671]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60672]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60673]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60674]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60675]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);if(!(a[54424]|0)){ac=c[13630]|0;B=c[ac>>2]|0;if((B|0)==0){aq=0}else{ah=0;C=0;ad=B;while(1){B=(C+1|0)+(uA(ad|0)|0)|0;D=ah+1|0;ae=c[ac+(D<<4)>>2]|0;if((ae|0)==0){aq=B;break}else{ah=D;C=B;ad=ae}}}ad=aq+1|0;C=ut(ad)|0;do{if((C|0)==0){gk();ah=ut(ad)|0;if((ah|0)!=0){ar=ah;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=166248,v)|0)}else{ar=C}}while(0);C=c[c[13630]>>2]|0;if((C|0)!=0){ad=0;ah=ar;ac=C;while(1){C=uA(ac|0)|0;a[ah]=C&255;uB(ah+1|0,c[(c[13630]|0)+(ad<<4)>>2]|0);ae=ad+1|0;B=c[(c[13630]|0)+(ae<<4)>>2]|0;if((B|0)==0){break}else{ad=ae;ah=ah+(C+1|0)|0;ac=B}}}ac=aq&1;tY(1,13,aq);ah=c[10030]|0;aI(ar|0,1,aq|0,ah|0);if((ac|0)!=0){ac=c[10030]|0;ah=a[241912]|0;aF(ah|0,ac|0)}uu(ar)}ar=A;a[ar]=0;a[A+1|0]=105;A=c[10030]|0;aI(ar|0,1,2,A|0);A=c[10030]|0;aF(8,A|0);A=c[10030]|0;aI(166208,1,8,A|0);A=c[10030]|0;ar=a[241896]|0;aF(ar|0,A|0);A=z;a[A]=32;a[z+1|0]=38;z=c[10030]|0;aI(A|0,1,2,z|0);z=ab;A=ab+1|0;ab=c[60536]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[z]=ab>>>8&255;a[A]=ab&255;ab=c[10030]|0;aI(z|0,1,2,ab|0);ab=c[60537]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[z]=ab>>>8&255;a[A]=ab&255;ab=c[10030]|0;aI(z|0,1,2,ab|0);ab=c[60538]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[z]=ab>>>8&255;a[A]=ab&255;ab=c[10030]|0;aI(z|0,1,2,ab|0);ab=y;a[ab]=32;a[y+1|0]=66;y=c[10030]|0;aI(ab|0,1,2,y|0);y=$;ab=c[60676]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[y]=ab>>>8&255;a[$+1|0]=ab&255;ab=c[10030]|0;aI(y|0,1,2,ab|0);ab=x;a[ab]=32;a[x+1|0]=98;x=c[10030]|0;aI(ab|0,1,2,x|0);x=_;ab=c[60546]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[x]=ab>>>8&255;a[_+1|0]=ab&255;ab=c[10030]|0;aI(x|0,1,2,ab|0);ab=w;a[ab]=32;a[w+1|0]=-126;w=c[10030]|0;aI(ab|0,1,2,w|0);w=Z;ab=c[60544]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=ab>>>8&255;a[Z+1|0]=ab&255;ab=c[10030]|0;aI(w|0,1,2,ab|0);ab=u;a[ab]=32;a[u+1|0]=-94;u=c[10030]|0;aI(ab|0,1,2,u|0);u=Y;ab=c[60668]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[u]=ab>>>8&255;a[Y+1|0]=ab&255;ab=c[10030]|0;aI(u|0,1,2,ab|0);ab=an+8|0;c[60534]=(c[ab>>2]|0)+182;u=an+12|0;c[60535]=(c[u>>2]|0)+182;Y=t;a[Y]=32;a[t+1|0]=-56;t=c[10030]|0;aI(Y|0,1,2,t|0);t=X;Y=X+1|0;X=c[60532]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=c[60533]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=c[60534]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=c[60535]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=W;a[X]=0;a[W+1|0]=-128;W=c[10030]|0;aI(X|0,1,2,W|0);L16932:do{if(!(a[54472]|0)){W=((c[13554]|0)*12&-1)+4|0;X=c[13550]|0;tY(5,34,W>>>1);t=W>>>2;if((t|0)==0){break}W=V;Y=V+1|0;w=0;while(1){Z=c[X+(w<<2)>>2]|0;if((Z|0)<=-32769){ap=12445;break}if((Z|0)>=32768){ap=12447;break}a[W]=Z>>>8&255;a[Y]=Z&255;aI(W|0,1,2,c[10030]|0);w=w+1|0;if((w|0)>=(t|0)){break L16932}}if((ap|0)==12447){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((ap|0)==12445){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);V=s;a[V]=80;a[s+1|0]=66;s=c[10030]|0;aI(V|0,1,2,s|0);s=U;V=c[60548]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[s]=V>>>8&255;a[U+1|0]=V&255;V=c[10030]|0;aI(s|0,1,2,V|0);c[13624]=aa((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13622]|0);V=r;a[V]=80;a[r+1|0]=98;r=c[10030]|0;aI(V|0,1,2,r|0);r=T;V=c[13624]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[r]=V>>>8&255;a[T+1|0]=V&255;V=c[10030]|0;aI(r|0,1,2,V|0);V=q;a[V]=83;a[q+1|0]=-126;q=c[10030]|0;aI(V|0,1,2,q|0);q=S;V=c[13624]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[q]=V>>>8&255;a[S+1|0]=V&255;V=c[10030]|0;aI(q|0,1,2,V|0);V=p;a[V]=83;a[p+1|0]=98;p=c[10030]|0;aI(V|0,1,2,p|0);p=R;V=c[60548]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[p]=V>>>8&255;a[R+1|0]=V&255;V=c[10030]|0;aI(p|0,1,2,V|0);do{if(a[54472]|0){c[13658]=1}else{if((c[13658]|0)==3){break}c[13658]=3;c[13615]=3;V=c[13656]|0;if((V|0)!=0){p=c[13602]|0;tY(4,1,V<<1);L16972:do{if((V|0)>0){R=g;q=g+1|0;S=0;while(1){r=c[p+(S<<2)>>2]|0;if((r|0)<=-32769){ap=12472;break}if((r|0)>=32768){ap=12474;break}a[R]=r>>>8&255;a[q]=r&255;aI(R|0,1,2,c[10030]|0);S=S+1|0;if((S|0)>=(V|0)){break L16972}}if((ap|0)==12472){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((ap|0)==12474){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}V=f;a[V]=80;a[f+1|0]=-126;p=c[10030]|0;aI(V|0,1,2,p|0);p=o;V=c[13658]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[p]=V>>>8&255;a[o+1|0]=V&255;V=c[10030]|0;aI(p|0,1,2,V|0);V=n;a[V]=81;a[n+1|0]=-62;p=c[10030]|0;aI(V|0,1,2,p|0);p=Q;V=c[13658]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)<32768){a[p]=V>>>8&255;a[Q+1|0]=V&255;V=c[10030]|0;aI(p|0,1,2,V|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13646]=c[13586];c[13647]=c[13587];c[13648]=c[13588];c[13649]=c[13589];c[13650]=c[13590];c[13651]=c[13591];c[13652]=c[13592];c[13653]=c[13593];c[13654]=c[13594];c[13655]=c[13595];c[13611]=c[an+16>>2];an=m;a[an]=82;a[m+1|0]=-62;m=c[10030]|0;aI(an|0,1,2,m|0);m=P;an=c[60550]|0;if((an|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((an|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[m]=an>>>8&255;a[P+1|0]=an&255;an=c[10030]|0;aI(m|0,1,2,an|0);an=l;a[an]=83;a[l+1|0]=2;l=c[10030]|0;aI(an|0,1,2,l|0);l=O;an=c[60556]|0;if((an|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((an|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[l]=an>>>8&255;a[O+1|0]=an&255;an=c[10030]|0;aI(l|0,1,2,an|0);an=am|0;am=c[13628]|0;be(an|0,166136,(v=i,i=i+16|0,c[v>>2]=54528,c[v+8>>2]=am,v)|0);nc(an);as=+h[3817];an=~~((as<0.0?1.0:as)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0)*.5);c[13568]=an;c[13558]=(an*12&-1|0)/17&-1;c[13556]=(an*13&-1|0)/15&-1;c[13562]=(an|0)/2&-1;c[13564]=(an*36&-1|0)/29&-1;c[13566]=(an*14&-1|0)/13&-1;c[13560]=(an*18&-1|0)/29&-1;an=a[54472]|0;if(!((c[13554]|0)>0&(an^1))){i=b;return}do{if(!(an|(c[13658]|0)==0)){c[13658]=0;c[13615]=0;am=c[13656]|0;if((am|0)!=0){l=c[13602]|0;tY(4,1,am<<1);L17016:do{if((am|0)>0){O=e;m=e+1|0;P=0;while(1){Q=c[l+(P<<2)>>2]|0;if((Q|0)<=-32769){ap=12500;break}if((Q|0)>=32768){ap=12502;break}a[O]=Q>>>8&255;a[m]=Q&255;aI(O|0,1,2,c[10030]|0);P=P+1|0;if((P|0)>=(am|0)){break L17016}}if((ap|0)==12500){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((ap|0)==12502){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}am=d;a[am]=80;a[d+1|0]=-126;l=c[10030]|0;aI(am|0,1,2,l|0);l=k;am=c[13658]|0;if((am|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((am|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[l]=am>>>8&255;a[k+1|0]=am&255;am=c[10030]|0;aI(l|0,1,2,am|0);am=j;a[am]=81;a[j+1|0]=-62;l=c[10030]|0;aI(am|0,1,2,l|0);l=N;am=c[13658]|0;if((am|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((am|0)<32768){a[l]=am>>>8&255;a[N+1|0]=am&255;am=c[10030]|0;aI(l|0,1,2,am|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);N=c[ab>>2]|0;ab=c[u>>2]|0;c[M>>2]=0;c[M+4>>2]=0;c[M+12>>2]=N;c[M+16>>2]=0;c[M+24>>2]=N;c[M+28>>2]=ab;c[M+36>>2]=0;c[M+40>>2]=ab;c[M+48>>2]=0;c[M+52>>2]=0;c[M+8>>2]=1;no(5,M|0);i=b;return}else if((ap|0)==12370){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((ap|0)==12372){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}function m5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+8|0;f=e|0;g=c[3524]|0;h=c[g+8>>2]|0;j=h>>>0>b>>>0?b:h;h=c[g+12>>2]|0;g=h>>>0>d>>>0?d:h;if((j|0)==(c[13598]|0)&(g|0)==(c[13596]|0)){i=e;return}h=c[13656]|0;if((h|0)!=0){d=c[13602]|0;tY(4,1,h<<1);L17049:do{if((h|0)>0){b=f;k=f+1|0;l=0;while(1){m=c[d+(l<<2)>>2]|0;if((m|0)<=-32769){n=12579;break}if((m|0)>=32768){n=12581;break}a[b]=m>>>8&255;a[k]=m&255;aI(b|0,1,2,c[10030]|0);l=l+1|0;if((l|0)>=(h|0)){break L17049}}if((n|0)==12579){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((n|0)==12581){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}c[13598]=j;c[13596]=g;i=e;return}function m6(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e|0;g=e+8|0;h=c[3524]|0;j=c[h+8>>2]|0;k=j>>>0>b>>>0?b:j;j=c[h+12>>2]|0;h=j>>>0>d>>>0?d:j;j=c[13598]|0;if((k|0)==(j|0)&(h|0)==(c[13596]|0)){i=e;return}d=c[13656]|0;do{if((d|0)>16380){b=c[13602]|0;l=d<<1;L17067:do{if(a[54560]|0){tY(4,7,l);m=g;n=g+1|0;o=0;while(1){p=c[b+(o<<2)>>2]|0;if((p|0)<=-32769){q=12593;break}if((p|0)>=32768){q=12595;break}a[m]=p>>>8&255;a[n]=p&255;aI(m|0,1,2,c[10030]|0);o=o+1|0;if((o|0)>=(d|0)){break L17067}}if((q|0)==12595){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((q|0)==12593){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}else{tY(4,1,l);o=f;m=f+1|0;n=0;while(1){p=c[b+(n<<2)>>2]|0;if((p|0)<=-32769){q=12599;break}if((p|0)>=32768){q=12601;break}a[o]=p>>>8&255;a[m]=p&255;aI(o|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(d|0)){break L17067}}if((q|0)==12601){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((q|0)==12599){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);b=c[13598]|0;c[13656]=1;c[c[13602]>>2]=b;b=(c[13596]|0)+182|0;l=c[13656]|0;c[13656]=l+1;c[(c[13602]|0)+(l<<2)>>2]=b}else{if((d|0)!=0){break}c[13656]=1;c[c[13602]>>2]=j;b=(c[13596]|0)+182|0;l=c[13656]|0;c[13656]=l+1;c[(c[13602]|0)+(l<<2)>>2]=b}}while(0);j=c[13656]|0;c[13656]=j+1;c[(c[13602]|0)+(j<<2)>>2]=k;j=c[13656]|0;c[13656]=j+1;c[(c[13602]|0)+(j<<2)>>2]=h+182;c[13598]=k;c[13596]=h;i=e;return}function m7(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+40|0;e=d|0;f=d+8|0;g=d+16|0;h=d+24|0;j=d+32|0;k=(b|0)<-3?-3:b;if((k|0)==(c[13626]|0)){i=d;return}c[13626]=k;do{if((k|0)>-1){l=(k>>>0)%9>>>0;m=12616}else{if((k|0)==-4){if(a[54472]|0){break}else{n=0;m=12619;break}}else{if((k|0)<-2){break}else{l=k;m=12616;break}}}}while(0);do{if((m|0)==12616){if(a[54472]|0){c[13658]=1;n=1;m=12619;break}else{n=l+3|0;m=12619;break}}}while(0);do{if((m|0)==12619){if((n|0)==(c[13658]|0)){break}c[13658]=n;c[13615]=n;l=c[13656]|0;if((l|0)!=0){b=c[13602]|0;tY(4,1,l<<1);L17109:do{if((l|0)>0){o=f;p=f+1|0;q=0;while(1){r=c[b+(q<<2)>>2]|0;if((r|0)<=-32769){m=12624;break}if((r|0)>=32768){m=12626;break}a[o]=r>>>8&255;a[p]=r&255;aI(o|0,1,2,c[10030]|0);q=q+1|0;if((q|0)>=(l|0)){break L17109}}if((m|0)==12626){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((m|0)==12624){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}l=e;a[l]=80;a[e+1|0]=-126;b=c[10030]|0;aI(l|0,1,2,b|0);b=h;l=c[13658]|0;if((l|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((l|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=l>>>8&255;a[h+1|0]=l&255;l=c[10030]|0;aI(b|0,1,2,l|0);l=g;a[l]=81;a[g+1|0]=-62;b=c[10030]|0;aI(l|0,1,2,b|0);b=j;l=c[13658]|0;if((l|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((l|0)<32768){a[b]=l>>>8&255;a[j+1|0]=l&255;l=c[10030]|0;aI(b|0,1,2,l|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);if(a[54576]|0){tT((k|0)==-1?2:0);i=d;return}else{tT(k);i=d;return}}function m8(a){a=a|0;c[13612]=a;return 1}function m9(b){b=b|0;var c=0;if(a[54336]|0){c=(b|0)==0&1;return c|0}else{h[6804]=+(b|0)*1.5707963267948966/90.0;c=1;return c|0}return 0}function na(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;f=i;i=i+88|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+40|0;o=f+48|0;p=f+56|0;q=f+64|0;r=f+72|0;s=f+80|0;if(b>>>0>32767|d>>>0>32767){i=f;return}else{t=e}while(1){u=a[t]|0;if(u<<24>>24==0){w=12726;break}if((aM(u&255|0)|0)==0){break}else{t=t+1|0}}if((w|0)==12726){i=f;return}t=c[13656]|0;if((t|0)!=0){u=c[13602]|0;tY(4,1,t<<1);L17156:do{if((t|0)>0){x=m;y=m+1|0;z=0;while(1){A=c[u+(z<<2)>>2]|0;if((A|0)<=-32769){w=12659;break}if((A|0)>=32768){w=12661;break}a[x]=A>>>8&255;a[y]=A&255;aI(x|0,1,2,c[10030]|0);z=z+1|0;if((z|0)>=(t|0)){break L17156}}if((w|0)==12661){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((w|0)==12659){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}w=c[13610]|0;do{if((c[13648]|0)!=(w|0)){c[13648]=w;t=l;a[t]=81;a[l+1|0]=66;u=c[10030]|0;aI(t|0,1,2,u|0);u=s;t=c[13610]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)<32768){a[u]=t>>>8&255;a[s+1|0]=t&255;t=c[10030]|0;aI(u|0,1,2,t|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);s=c[13612]|0;do{if((c[13650]|0)!=(s|0)){c[13650]=s;if((s|0)==2){c[60488]=3}else if((s|0)==1){c[60488]=2}else if((s|0)==0){c[60488]=1}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=103960,v)|0)}l=k;a[l]=82;a[k+1|0]=76;w=c[10030]|0;aI(l|0,1,2,w|0);w=r;l=r+1|0;t=c[60488]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60489]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60490]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60491]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60492]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60493]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)<32768){a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);r=c[13611]|0;do{if((c[13649]|0)!=(r|0)){c[13649]=r;k=r<<1;s=(k|0)/3&-1;t=j;a[t]=81;a[j+1|0]=-30;w=c[10030]|0;aI(t|0,1,2,w|0);w=q;if((k|0)<=-98307){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((k|0)<98304){a[w]=s>>>8&255;a[q+1|0]=s&255;s=c[10030]|0;aI(w|0,1,2,s|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);B=+h[6804];do{if(+h[6823]!=B){h[6823]=B;C=+(c[13611]|0);D=B+1.5707963267948966;c[60484]=~~(C*+S(+D));c[60485]=~~(C*+T(+D));c[60486]=~~(C*+S(+B));c[60487]=~~(C*+T(+B));q=g;a[q]=82;a[g+1|0]=8;j=c[10030]|0;aI(q|0,1,2,j|0);j=p;q=p+1|0;r=c[60484]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);r=c[60485]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);r=c[60486]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);r=c[60487]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)<32768){a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[60480]=b;c[60481]=d+182;d=uA(e|0)|0;b=((d|0)>254?3:1)+d|0;p=(b&1|0)==0;tY(4,4,b+6|0);b=o;g=o+1|0;o=c[60480]|0;if((o|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((o|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=o>>>8&255;a[g]=o&255;aI(b|0,1,2,c[10030]|0);o=c[60481]|0;if((o|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((o|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=o>>>8&255;a[g]=o&255;aI(b|0,1,2,c[10030]|0);o=c[60482]|0;if((o|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((o|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=o>>>8&255;a[g]=o&255;aI(b|0,1,2,c[10030]|0);b=c[10030]|0;do{if((d|0)<255){o=d<<24>>24;aF(o|0,b|0)}else{o=a[241888]|0;aF(o|0,b|0);o=n;if((d|0)<32768){a[o]=d>>>8&255;a[n+1|0]=d&255;g=c[10030]|0;aI(o|0,1,2,g|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);aI(e|0,1,d|0,c[10030]|0);if(!p){p=c[10030]|0;d=a[241880]|0;aF(d|0,p|0)}c[13596]=-2e3;c[13598]=-2e3;i=f;return}function nb(a){a=+a;var b=0;b=~~((a<0.0?1.0:a)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0)*.5);c[13568]=b;c[13558]=(b*12&-1|0)/17&-1;c[13556]=(b*13&-1|0)/15&-1;c[13562]=(b|0)/2&-1;c[13564]=(b*36&-1|0)/29&-1;c[13566]=(b*14&-1|0)/13&-1;c[13560]=(b*18&-1|0)/29&-1;return}function nc(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+8|0;e=d|0;f=c[3524]|0;g=a8(b|0,44)|0;if((b|0)==0){j=12758}else{if((a[b]|0)==0){j=12758}else{k=b}}if((j|0)==12758){k=242752}j=(g|0)!=0;if(j){l=g-k|0}else{l=uA(k|0)|0}b=c[13630]|0;m=c[b>>2]|0;L17297:do{if((m|0)==0){n=0;o=1.0}else{p=0;q=m;while(1){if((uA(q|0)|0)==(l|0)){if((uJ(k|0,q|0,l|0)|0)==0){break}}r=p+1|0;s=c[b+(r<<4)>>2]|0;if((s|0)==0){n=0;o=1.0;break L17297}else{p=r;q=s}}n=p+1|0;o=+h[b+(p<<4)+8>>3]}}while(0);l=(n|0)==0?1:n;c[13610]=l;n=c[b+(l-1<<4)>>2]|0;l=uA(n|0)|0;b=(l|0)>31?31:l;uF(54528,n|0,b|0);a[b+54528|0]=0;b=c[13628]|0;c[e>>2]=b;if(j){j=g+1|0;ca(j|0,21e4,(v=i,i=i+8|0,c[v>>2]=e,v)|0);t=c[e>>2]|0}else{t=b}b=aa((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,t);c[f+16>>2]=b;c[f+20>>2]=~~(o*+(aa((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[e>>2]|0)>>>0>>>0)*.527);c[13611]=b;i=d;return 1}function nd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+64|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+48>>2]=b;c[h+52>>2]=d;c[h+8>>2]=a;no(5,h|0);i=g;return}function ne(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+112|0;g=f|0;h=f+8|0;j=f+16|0;k=f+24|0;l=f+32|0;m=f+40|0;n=f+48|0;o=f+56|0;p=f+64|0;q=f+72|0;r=f+80|0;s=f+88|0;t=f+96|0;u=f+104|0;if((e|0)<0){m5(b,d);m6(b+1|0,d);i=f;return}w=(e|0)%13&-1;e=c[13656]|0;if((e|0)!=0){x=c[13602]|0;tY(4,1,e<<1);L17316:do{if((e|0)>0){y=q;z=q+1|0;A=0;while(1){B=c[x+(A<<2)>>2]|0;if((B|0)<=-32769){C=12777;break}if((B|0)>=32768){C=12779;break}a[y]=B>>>8&255;a[z]=B&255;aI(y|0,1,2,c[10030]|0);A=A+1|0;if((A|0)>=(e|0)){break L17316}}if((C|0)==12777){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((C|0)==12779){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}e=c[13642]|0;tT(0);if((w|0)>2){c[13616]=1}if((w|0)==12|(w|0)==10|(w|0)==8|(w|0)==6|(w|0)==4){c[13613]=0;c[13615]=c[13658];D=c[13616]|0}else{c[13613]=1;c[13616]=0;c[13614]=c[13658];D=0}do{if((c[13654]|0)!=(D|0)){c[13654]=D;x=p;a[x]=82;a[p+1|0]=-62;q=c[10030]|0;aI(x|0,1,2,q|0);q=u;x=c[13616]|0;if((x|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((x|0)<32768){a[q]=x>>>8&255;a[u+1|0]=x&255;x=c[10030]|0;aI(q|0,1,2,x|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);u=c[13615]|0;do{if((c[13653]|0)!=(u|0)){c[13653]=u;p=o;a[p]=82;a[o+1|0]=-30;D=c[10030]|0;aI(p|0,1,2,D|0);D=t;p=c[13615]|0;if((p|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((p|0)<32768){a[D]=p>>>8&255;a[t+1|0]=p&255;p=c[10030]|0;aI(D|0,1,2,p|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);t=c[13651]|0;o=c[13613]|0;do{if((t|0)==(o|0)){E=t}else{c[13651]=o;u=n;a[u]=83;a[n+1|0]=-62;p=c[10030]|0;aI(u|0,1,2,p|0);p=s;u=c[13651]|0;if((u|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((u|0)<32768){a[p]=u>>>8&255;a[s+1|0]=u&255;u=c[10030]|0;aI(p|0,1,2,u|0);E=c[13651]|0;break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);do{if((E|0)!=0){s=c[13614]|0;if((c[13652]|0)==(s|0)){break}c[13652]=s;s=m;a[s]=83;a[m+1|0]=-94;n=c[10030]|0;aI(s|0,1,2,n|0);n=r;s=c[13652]|0;if((s|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((s|0)<32768){a[n]=s>>>8&255;a[r+1|0]=s&255;s=c[10030]|0;aI(n|0,1,2,s|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);do{if((w|0)==0){m5(b-(c[13568]|0)|0,d);m6((c[13568]|0)+b|0,d);m5(b,d-(c[13568]|0)|0);m6(b,(c[13568]|0)+d|0)}else if((w|0)==2){m5(b,d-(c[13568]|0)|0);m6(b,(c[13568]|0)+d|0);m5((c[13556]|0)+b|0,d-(c[13562]|0)|0);m6(b-(c[13556]|0)|0,(c[13562]|0)+d|0);m5((c[13556]|0)+b|0,(c[13562]|0)+d|0);m6(b-(c[13556]|0)|0,d-(c[13562]|0)|0)}else if((w|0)==1){r=c[13558]|0;m5(b-r|0,d-r|0);r=c[13558]|0;m6(r+b|0,r+d|0);r=c[13558]|0;m5(b-r|0,r+d|0);r=c[13558]|0;m6(r+b|0,d-r|0)}else if((w|0)==3|(w|0)==4){r=c[13558]|0;m5(b-r|0,d-r|0);r=c[13558]|0;m6(r+b|0,d-r|0);r=c[13558]|0;m6(r+b|0,r+d|0);r=c[13558]|0;m6(b-r|0,r+d|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17377:do{if((r|0)>0){E=l;s=l+1|0;n=0;while(1){o=c[m+(n<<2)>>2]|0;if((o|0)<=-32769){C=12820;break}if((o|0)>=32768){C=12822;break}a[E]=o>>>8&255;a[s]=o&255;aI(E|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(r|0)){break L17377}}if((C|0)==12822){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12820){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}else if((w|0)==5|(w|0)==6){m5(b,d-(c[13568]|0)|0);m6((c[13562]|0)+b|0,d-(c[13556]|0)|0);m6((c[13556]|0)+b|0,d-(c[13562]|0)|0);m6((c[13568]|0)+b|0,d);m6((c[13556]|0)+b|0,(c[13562]|0)+d|0);m6((c[13562]|0)+b|0,(c[13556]|0)+d|0);m6(b,(c[13568]|0)+d|0);m6(b-(c[13562]|0)|0,(c[13556]|0)+d|0);m6(b-(c[13556]|0)|0,(c[13562]|0)+d|0);m6(b-(c[13568]|0)|0,d);m6(b-(c[13556]|0)|0,d-(c[13562]|0)|0);m6(b-(c[13562]|0)|0,d-(c[13556]|0)|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17389:do{if((r|0)>0){n=k;E=k+1|0;s=0;while(1){o=c[m+(s<<2)>>2]|0;if((o|0)<=-32769){C=12829;break}if((o|0)>=32768){C=12831;break}a[n]=o>>>8&255;a[E]=o&255;aI(n|0,1,2,c[10030]|0);s=s+1|0;if((s|0)>=(r|0)){break L17389}}if((C|0)==12829){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((C|0)==12831){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}else if((w|0)==7|(w|0)==8){m5(b,(c[13564]|0)+d|0);m6(b-(c[13566]|0)|0,d-(c[13560]|0)|0);m6((c[13566]|0)+b|0,d-(c[13560]|0)|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17401:do{if((r|0)>0){s=j;n=j+1|0;E=0;while(1){o=c[m+(E<<2)>>2]|0;if((o|0)<=-32769){C=12838;break}if((o|0)>=32768){C=12840;break}a[s]=o>>>8&255;a[n]=o&255;aI(s|0,1,2,c[10030]|0);E=E+1|0;if((E|0)>=(r|0)){break L17401}}if((C|0)==12840){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12838){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}else if((w|0)==11|(w|0)==12){m5(b-(c[13568]|0)|0,d);m6(b,d-(c[13568]|0)|0);m6((c[13568]|0)+b|0,d);m6(b,(c[13568]|0)+d|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17413:do{if((r|0)>0){E=g;s=g+1|0;n=0;while(1){o=c[m+(n<<2)>>2]|0;if((o|0)<=-32769){C=12856;break}if((o|0)>=32768){C=12858;break}a[E]=o>>>8&255;a[s]=o&255;aI(E|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(r|0)){break L17413}}if((C|0)==12858){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12856){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}else if((w|0)==9|(w|0)==10){m5(b,d-(c[13564]|0)|0);m6(b-(c[13566]|0)|0,(c[13560]|0)+d|0);m6((c[13566]|0)+b|0,(c[13560]|0)+d|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17425:do{if((r|0)>0){n=h;E=h+1|0;s=0;while(1){o=c[m+(s<<2)>>2]|0;if((o|0)<=-32769){C=12847;break}if((o|0)>=32768){C=12849;break}a[n]=o>>>8&255;a[E]=o&255;aI(n|0,1,2,c[10030]|0);s=s+1|0;if((s|0)>=(r|0)){break L17425}}if((C|0)==12849){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12847){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}}while(0);tT(e);i=f;return}function nf(b){b=+b;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+24|0;e=d|0;f=d+8|0;g=d+16|0;h=~~((b>0.0?b:.5)*+((c[13622]|0)>>>0>>>0)*+((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0>>>0>>>0));if((h|0)==(c[13624]|0)){i=d;return}j=c[13656]|0;if((j|0)!=0){k=c[13602]|0;tY(4,1,j<<1);L17443:do{if((j|0)>0){l=f;m=f+1|0;n=0;while(1){o=c[k+(n<<2)>>2]|0;if((o|0)<=-32769){p=12870;break}if((o|0)>=32768){p=12872;break}a[l]=o>>>8&255;a[m]=o&255;aI(l|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(j|0)){break L17443}}if((p|0)==12872){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((p|0)==12870){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}c[13624]=h;h=e;a[h]=80;a[e+1|0]=98;aI(h|0,1,2,c[10030]|0);h=g;e=c[13624]|0;if((e|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((e|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[h]=e>>>8&255;a[g+1|0]=e&255;aI(h|0,1,2,c[10030]|0);tT(c[13642]|0);i=d;return}function ng(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+8|0;e=d|0;if((b|0)==0){f=(c[13620]|0)-96|0;i=d;return f|0}g=c[b+28>>2]|0;c[13582]=g;j=g+96|0;if((j|0)>(c[13552]|0)){c[13552]=j;c[13550]=db(c[13550]|0,(j*12&-1)+4|0,167368)|0;k=c[13582]|0}else{k=g}L17469:do{if((k|0)>0){g=b+32|0;j=0;l=289;while(1){c[(c[13550]|0)+(l<<2)>>2]=~~(+h[(c[g>>2]|0)+(j*24&-1)>>3]*255.9);c[(c[13550]|0)+(l+1<<2)>>2]=~~(+h[(c[g>>2]|0)+(j*24&-1)+8>>3]*255.9);c[(c[13550]|0)+(l+2<<2)>>2]=~~(+h[(c[g>>2]|0)+(j*24&-1)+16>>3]*255.9);m=j+1|0;n=c[13582]|0;if((m|0)>=(n|0)){o=n;break L17469}j=m;l=l+3|0}}else{o=k}}while(0);k=o+96|0;c[13554]=k;o=(k*12&-1)+4|0;k=c[13550]|0;tY(5,34,o>>>1);b=o>>>2;if((b|0)==0){f=0;i=d;return f|0}o=e;l=e+1|0;e=0;while(1){j=c[k+(e<<2)>>2]|0;if((j|0)<=-32769){p=12893;break}if((j|0)>=32768){p=12895;break}a[o]=j>>>8&255;a[l]=j&255;aI(o|0,1,2,c[10030]|0);j=e+1|0;if((j|0)<(b|0)){e=j}else{f=0;p=12901;break}}if((p|0)==12893){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0);return 0}else if((p|0)==12895){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0);return 0}else if((p|0)==12901){i=d;return f|0}return 0}function nh(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0;d=i;i=i+80|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+72|0;q=c[b>>2]|0;L17487:do{if((q|0)==1){r=b+4|0;s=c[r>>2]|0;do{if((s|0)>-1){t=(s>>>0)%9>>>0;u=12908}else{if((s|0)==-4){if(a[54472]|0){break}else{w=0;u=12911;break}}else{if((s|0)<-2){break}else{t=s;u=12908;break}}}}while(0);do{if((u|0)==12908){if(a[54472]|0){c[13658]=1;w=1;u=12911;break}else{w=t+3|0;u=12911;break}}}while(0);do{if((u|0)==12911){if((w|0)==(c[13658]|0)){break}c[13658]=w;c[13615]=w;s=c[13656]|0;if((s|0)!=0){x=c[13602]|0;tY(4,1,s<<1);L17506:do{if((s|0)>0){y=f;z=f+1|0;A=0;while(1){B=c[x+(A<<2)>>2]|0;if((B|0)<=-32769){u=12916;break}if((B|0)>=32768){u=12918;break}a[y]=B>>>8&255;a[z]=B&255;aI(y|0,1,2,c[10030]|0);A=A+1|0;if((A|0)>=(s|0)){break L17506}}if((u|0)==12916){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((u|0)==12918){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}s=e;a[s]=80;a[e+1|0]=-126;x=c[10030]|0;aI(s|0,1,2,x|0);x=m;s=c[13658]|0;if((s|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((s|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[x]=s>>>8&255;a[m+1|0]=s&255;s=c[10030]|0;aI(x|0,1,2,s|0);s=l;a[s]=81;a[l+1|0]=-62;x=c[10030]|0;aI(s|0,1,2,x|0);x=p;s=c[13658]|0;if((s|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((s|0)<32768){a[x]=s>>>8&255;a[p+1|0]=s&255;s=c[10030]|0;aI(x|0,1,2,s|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13626]=c[r>>2];i=d;return}else if((q|0)==3){s=c[b+4>>2]|0;x=s>>>16&255;A=s>>>8&255;y=s&255;s=c[13554]|0;if((s|0)<=0){C=0;break}z=c[13550]|0;B=0;D=1;E=65536;F=0;while(1){G=(c[z+(D<<2)>>2]|0)-x|0;H=(c[z+(D+1<<2)>>2]|0)-A|0;I=(c[z+(D+2<<2)>>2]|0)-y|0;J=aa(G,G);G=aa(H,H)+J|0;J=G+aa(I,I)|0;I=(J|0)<(E|0);G=I?B:F;if((J|0)<32){C=G;break L17487}H=B+1|0;if((H|0)<(s|0)){B=H;D=D+3|0;E=I?J:E;F=G}else{C=G;break}}}else if((q|0)==5){K=+h[b+8>>3];F=c[13582]|0;if(K>0.0){L=~~(K*+(F|0))}else{L=0}E=(L|0)<(F|0)?L:F-1|0;c[13615]=E;C=E+96|0}else{i=d;return}}while(0);c[13615]=C;if((c[13658]|0)==(C|0)){i=d;return}c[13658]=C;c[13626]=C;C=c[13656]|0;if((C|0)!=0){L=c[13602]|0;tY(4,1,C<<1);L17546:do{if((C|0)>0){b=k;q=k+1|0;p=0;while(1){l=c[L+(p<<2)>>2]|0;if((l|0)<=-32769){u=12943;break}if((l|0)>=32768){u=12945;break}a[b]=l>>>8&255;a[q]=l&255;aI(b|0,1,2,c[10030]|0);p=p+1|0;if((p|0)>=(C|0)){break L17546}}if((u|0)==12945){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((u|0)==12943){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}u=j;a[u]=80;a[j+1|0]=-126;aI(u|0,1,2,c[10030]|0);u=o;j=c[13658]|0;if((j|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((j|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[u]=j>>>8&255;a[o+1|0]=j&255;aI(u|0,1,2,c[10030]|0);u=g;a[u]=81;a[g+1|0]=-62;aI(u|0,1,2,c[10030]|0);u=n;g=c[13658]|0;if((g|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((g|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[u]=g>>>8&255;a[n+1|0]=g&255;aI(u|0,1,2,c[10030]|0);i=d;return}function ni(){c[13330]=0;a[53312]=0;return}function nj(){var a=0,b=0,d=0;a=i;b=~~(+((c[13326]|0)>>>0>>>0)/10.0+.5+0.0);d=~~(+((c[13324]|0)>>>0>>>0)/10.0+.5+0.0);cf(c[10030]|0,167816,(v=i,i=i+64|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=b,c[v+24>>2]=d,c[v+32>>2]=0,c[v+40>>2]=0,c[v+48>>2]=b,c[v+56>>2]=d,v)|0);i=a;return}function nk(){aI(199192,10,1,c[10030]|0);return}function nl(){if(!(a[53312]|0)){c[13330]=0;return}aI(169392,2,1,c[10030]|0);a[53312]=0;c[13330]=0;return}function nm(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if(a[53312]|0){f=c[10030]|0;aI(169392,2,1,f|0)}cf(c[10030]|0,167984,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=+(d>>>0>>>0)/10.0,v)|0);c[13330]=(c[13330]|0)+1;a[53312]=1;i=e;return}function nn(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0;e=i;f=+(b>>>0>>>0)/10.0;g=+(d>>>0>>>0)/10.0;cf(c[10030]|0,168040,(v=i,i=i+16|0,h[v>>3]=f,h[v+8>>3]=g,v)|0);d=(c[13330]|0)+1|0;c[13330]=d;a[53312]=1;if((d|0)<=399){i=e;return}cf(c[10030]|0,168016,(v=i,i=i+16|0,h[v>>3]=f,h[v+8>>3]=g,v)|0);c[13330]=0;i=e;return}function no(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+72|0;f=e|0;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=e+48|0;n=e+56|0;o=e+64|0;p=c[d+8>>2]|0;q=(p>>4|0)%6&-1;r=p&15;do{if((r|0)==1|(r|0)==4){c[13616]=1;s=1}else if((r|0)==2|(r|0)==5){if((q|0)==0){c[13616]=0;s=0;break}else if((q|0)==3){c[13616]=1;s=1;break}else{c[13616]=3;c[13617]=c[242728+(q<<2)>>2];s=3;break}}else{c[13615]=0;c[13616]=1;s=1}}while(0);do{if((c[13654]|0)!=(s|0)){c[13654]=s;q=k;a[q]=82;a[k+1|0]=-62;r=c[10030]|0;aI(q|0,1,2,r|0);r=o;q=c[13616]|0;if((q|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((q|0)<32768){a[r]=q>>>8&255;a[o+1|0]=q&255;q=c[10030]|0;aI(r|0,1,2,q|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);o=c[13615]|0;do{if((c[13653]|0)!=(o|0)){c[13653]=o;k=j;a[k]=82;a[j+1|0]=-30;s=c[10030]|0;aI(k|0,1,2,s|0);s=n;k=c[13615]|0;if((k|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((k|0)<32768){a[s]=k>>>8&255;a[n+1|0]=k&255;k=c[10030]|0;aI(s|0,1,2,k|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);n=c[13617]|0;do{if((c[13655]|0)!=(n|0)&(c[13616]|0)==3){c[13655]=n;j=h;a[j]=83;a[h+1|0]=2;o=c[10030]|0;aI(j|0,1,2,o|0);o=m;j=c[13617]|0;if((j|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((j|0)<32768){a[o]=j>>>8&255;a[m+1|0]=j&255;j=c[10030]|0;aI(o|0,1,2,j|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13613]=0;do{if((c[13651]|0)!=0){c[13651]=0;m=g;a[m]=83;a[g+1|0]=-62;h=c[10030]|0;aI(m|0,1,2,h|0);h=l;m=c[13651]|0;if((m|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((m|0)<32768){a[h]=m>>>8&255;a[l+1|0]=m&255;m=c[10030]|0;aI(h|0,1,2,m|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);m5(c[d>>2]|0,c[d+4>>2]|0);a[54560]=1;if((b|0)>1){l=1;do{m6(c[d+(l*12&-1)>>2]|0,c[d+(l*12&-1)+4>>2]|0);l=l+1|0;}while((l|0)<(b|0))}b=c[13656]|0;if((b|0)==0){a[54560]=0;i=e;return}l=c[13602]|0;tY(4,7,b<<1);L17640:do{if((b|0)>0){d=f;g=f+1|0;m=0;while(1){h=c[l+(m<<2)>>2]|0;if((h|0)<=-32769){t=13015;break}if((h|0)>=32768){t=13017;break}a[d]=h>>>8&255;a[g]=h&255;aI(d|0,1,2,c[10030]|0);m=m+1|0;if((m|0)>=(b|0)){break L17640}}if((t|0)==13015){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((t|0)==13017){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0;a[54560]=0;i=e;return}function np(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0.0,W=0.0,X=0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0,ac=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;f=c[8272]|0;L17652:do{if((e|0)<(f|0)){j=e;k=f;L17653:while(1){l=c[1054]|0;m=(a[l+(j*40&-1)|0]&1)==0;L17655:do{if(!m){n=c[l+(j*40&-1)+36>>2]|0;o=l+(j*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L17655}}if((q|0)==1){r=k;s=j;break L17652}}}while(0);o=c[60232]|0;L17662:do{if((o|0)==0){t=240928}else{p=c[l+(j*40&-1)+36>>2]|0;n=c[l+(j*40&-1)+32>>2]|0;u=(p|0)>0;w=c[10036]|0;x=240928;y=o;while(1){L17666:do{if(!m){if(u){z=0;A=0;B=n;while(1){C=a[y+z|0]|0;if(C<<24>>24==(a[w+(z+B|0)|0]|0)){D=B;E=A}else{if(C<<24>>24!=36){break L17666}D=B-1|0;E=1}F=z+1|0;if((F|0)<(E+p|0)){z=F;A=E;B=D}else{break}}if((E|0)==0){G=F}else{t=x;break L17662}}else{G=0}B=a[y+G|0]|0;if((B<<24>>24|0)==36|(B<<24>>24|0)==0){t=x;break L17662}}}while(0);B=x+8|0;A=c[B>>2]|0;if((A|0)==0){t=B;break}else{x=B;y=A}}}}while(0);o=c[t+4>>2]|0;L17679:do{if((o|0)==0){a[53408]=0;uD(53352,167792,17);c[13336]=22;g[13332]=12.0;c[13326]=5960;c[13324]=7200;y=j+1|0;c[13898]=y;H=y}else if((o|0)==2){a[53408]=1;y=j+1|0;c[13898]=y;H=y}else if((o|0)==1){a[53408]=0;y=j+1|0;c[13898]=y;H=y}else{do{if(!m){y=l+(j*40&-1)+32|0;x=c[y>>2]|0;p=c[10036]|0;w=a[p+x|0]|0;if(!((w<<24>>24|0)==39|(w<<24>>24|0)==34)){break}w=(c[l+(j*40&-1)+36>>2]|0)-2|0;n=(w|0)>49?49:w;if((n|0)>0){w=x;x=0;while(1){u=w+1|0;q=x+1|0;a[x+53352|0]=a[p+u|0]|0;if((q|0)==(n|0)){I=n;break}else{w=u;x=q}}}else{I=0}a[I+53352|0]=0;if((a[p+(c[y>>2]|0)|0]|0)==34){ua(53352)}else{x=53352;w=53352;while(1){n=a[w]|0;if((n<<24>>24|0)==0){break}else if((n<<24>>24|0)==39){q=w+1|0;u=(a[q]|0)==39?q:w;J=u;K=a[u]|0}else{J=w;K=n}a[x]=K;x=x+1|0;w=J+1|0}a[x]=0}w=(c[13898]|0)+1|0;c[13898]=w;H=w;break L17679}}while(0);w=is(d)|0;y=c[w>>2]|0;if((y|0)==2){L=+h[w+8>>3]}else if((y|0)==3){L=+uz(c[w+8>>2]|0,0)}else if((y|0)==1){L=+(c[w+8>>2]|0)}else{break L17653}w=~~L;c[13336]=w;c[13898]=(c[13898]|0)+1;c[(c[3524]|0)+16>>2]=~~(+(w|0)*10.0);c[(c[3524]|0)+20>>2]=~~(+(c[13336]|0)*10.0*6.0/10.0);H=c[13898]|0}}while(0);l=c[8272]|0;if((H|0)<(l|0)){j=H;k=l}else{r=l;s=H;break L17652}}uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{r=f;s=e}}while(0);L17709:do{if((s|0)<(r|0)){e=c[1054]|0;L17711:do{if((a[e+(s*40&-1)|0]&1)!=0){f=c[e+(s*40&-1)+36>>2]|0;H=e+(s*40&-1)+32|0;J=c[10036]|0;K=0;while(1){if((K|0)>=(f|0)){break}if((a[J+((c[H>>2]|0)+K|0)|0]|0)==(a[K+103664|0]|0)){K=K+1|0}else{break L17711}}if((K|0)==1){M=s;N=r;break L17709}}}while(0);e=is(d)|0;H=c[e>>2]|0;if((H|0)==3){O=+uz(c[e+8>>2]|0,0)}else if((H|0)==2){O=+h[e+8>>3]}else if((H|0)==1){O=+(c[e+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=~~(O*720.0);c[13326]=e;H=(c[13898]|0)+1|0;c[13898]=H;L17724:do{if((H|0)<(c[8272]|0)){J=c[1054]|0;L17726:do{if((a[J+(H*40&-1)|0]&1)!=0){f=c[J+(H*40&-1)+36>>2]|0;I=J+(H*40&-1)+32|0;t=c[10036]|0;G=0;while(1){if((G|0)>=(f|0)){break}if((a[t+((c[I>>2]|0)+G|0)|0]|0)==(a[G+103664|0]|0)){G=G+1|0}else{break L17726}}if((G|0)==1){P=e;break L17724}}}while(0);J=is(d)|0;K=c[J>>2]|0;if((K|0)==3){Q=+uz(c[J+8>>2]|0,0)}else if((K|0)==1){Q=+(c[J+8>>2]|0)}else if((K|0)==2){Q=+h[J+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13324]=~~(Q*720.0);c[13898]=(c[13898]|0)+1;P=c[13326]|0}else{P=e}}while(0);c[(c[3524]|0)+8>>2]=P;c[(c[3524]|0)+12>>2]=c[13324];c[(c[3524]|0)+24>>2]=((c[13324]|0)>>>0)/80>>>0;c[(c[3524]|0)+28>>2]=((c[13324]|0)>>>0)/80>>>0;M=c[13898]|0;N=c[8272]|0}else{M=s;N=r}}while(0);if((M|0)>=(N|0)){R=a[53408]|0;S=R?116440:116408;T=c[13336]|0;U=c[13326]|0;V=+(U>>>0>>>0);W=V/720.0;X=c[13324]|0;Y=+(X>>>0>>>0);Z=Y/720.0;_=+g[13332];$=_;aa=$/10.0;ab=be(13048,167736,(v=i,i=i+48|0,c[v>>2]=S,c[v+8>>2]=53352,c[v+16>>2]=T,h[v+24>>3]=W,h[v+32>>3]=Z,h[v+40>>3]=aa,v)|0)|0;i=b;return}N=c[1054]|0;L17744:do{if((a[N+(M*40&-1)|0]&1)!=0){r=c[N+(M*40&-1)+36>>2]|0;s=N+(M*40&-1)+32|0;P=c[10036]|0;e=0;while(1){if((e|0)>=(r|0)){break}if((a[P+((c[s>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{break L17744}}if((e|0)!=1){break}R=a[53408]|0;S=R?116440:116408;T=c[13336]|0;U=c[13326]|0;V=+(U>>>0>>>0);W=V/720.0;X=c[13324]|0;Y=+(X>>>0>>>0);Z=Y/720.0;_=+g[13332];$=_;aa=$/10.0;ab=be(13048,167736,(v=i,i=i+48|0,c[v>>2]=S,c[v+8>>2]=53352,c[v+16>>2]=T,h[v+24>>3]=W,h[v+32>>3]=Z,h[v+40>>3]=aa,v)|0)|0;i=b;return}}while(0);M=is(d)|0;d=c[M>>2]|0;if((d|0)==1){ac=+(c[M+8>>2]|0)}else if((d|0)==2){ac=+h[M+8>>3]}else if((d|0)==3){ac=+uz(c[M+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g[13332]=ac*10.0;c[13898]=(c[13898]|0)+1;R=a[53408]|0;S=R?116440:116408;T=c[13336]|0;U=c[13326]|0;V=+(U>>>0>>>0);W=V/720.0;X=c[13324]|0;Y=+(X>>>0>>>0);Z=Y/720.0;_=+g[13332];$=_;aa=$/10.0;ab=be(13048,167736,(v=i,i=i+48|0,c[v>>2]=S,c[v+8>>2]=53352,c[v+16>>2]=T,h[v+24>>3]=W,h[v+32>>3]=Z,h[v+40>>3]=aa,v)|0)|0;i=b;return}function nq(a){a=a|0;c[13354]=a;return 1}function nr(a){a=a|0;c[13334]=a;return 1}function ns(a,b){a=a|0;b=b|0;c[11678]=a;c[11674]=b;return}function nt(){var b=0,d=0,e=0,f=0;b=aa(c[11672]|0,c[11676]|0);if((b|0)<=0){return}d=b;b=c[11684]|0;e=c[11680]|0;while(1){a[b]=32;a[e]=0;f=d-1|0;if((f|0)>0){d=f;b=b+1|0;e=e+1|0}else{break}}return}function nu(b){b=b|0;var d=0,e=0,f=0.0;d=i;if(a[53312]|0){e=c[10030]|0;aI(169392,2,1,e|0);a[53312]=0}do{if((b|0)==3){e=c[10030]|0;f=+g[13332]/10.0;cf(e|0,168928,(v=i,i=i+8|0,h[v>>3]=f,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168520,10,1,e|0);break}else{aI(168496,20,1,e|0);break}}else if((b|0)==8){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168120,16,1,e|0);break}else{aI(168088,30,1,e|0);break}}else if((b|0)==6){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168912,10,1,e|0);break}else{aI(168288,22,1,e|0);break}}else if((b|0)==5){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168432,10,1,e|0);break}else{aI(168368,22,1,e|0);break}}else if((b|0)==1){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168768,10,1,e|0);break}else{aI(168696,18,1,e|0);break}}else if((b|0)==(-2|0)){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168912,10,1,e|0);break}else{aI(168896,15,1,e|0);break}}else if((b|0)==4){cf(c[10030]|0,168488,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168472,10,1,e|0);break}else{aI(168448,22,1,e|0);break}}else if((b|0)==(-1|0)){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168912,10,1,e|0);break}else{aI(168824,18,1,e|0);break}}else if((b|0)==0){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168808,10,1,e|0);break}else{aI(168784,15,1,e|0);break}}else if((b|0)==2){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168616,10,1,e|0);break}else{aI(168576,18,1,e|0);break}}else if((b|0)==7){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168232,12,1,e|0);break}else{aI(168184,26,1,e|0);break}}}while(0);c[13330]=0;i=d;return}function nv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0;f=i;if(a[53312]|0){g=c[10030]|0;aI(169392,2,1,g|0);a[53312]=0}g=c[13334]|0;if((g|0)==2){j=c[10030]|0;k=c[13336]|0;cf(j|0,169240,(v=i,i=i+24|0,c[v>>2]=53352,c[v+8>>2]=k,c[v+16>>2]=k,v)|0)}else if((g|0)==0){k=c[13336]|0;cf(c[10030]|0,169368,(v=i,i=i+24|0,c[v>>2]=53352,c[v+8>>2]=k,c[v+16>>2]=k,v)|0)}else if((g|0)==1){g=c[13336]|0;cf(c[10030]|0,169264,(v=i,i=i+24|0,c[v>>2]=53352,c[v+8>>2]=g,c[v+16>>2]=g,v)|0)}g=c[10030]|0;l=+(b>>>0>>>0)/10.0;if((c[13354]|0)==0){m=+(d>>>0>>>0)/10.0- +(c[13336]|0)/3.0;cf(g|0,169064,(v=i,i=i+16|0,h[v>>3]=l,h[v+8>>3]=m,v)|0)}else{m=l- +(c[13336]|0)/3.0;l=+(d>>>0>>>0)/10.0;cf(g|0,168968,(v=i,i=i+16|0,h[v>>3]=m,h[v+8>>3]=l,v)|0)}aF(40,c[10030]|0);g=e;while(1){e=a[g]|0;d=g+1|0;b=e<<24>>24;if((e<<24>>24|0)==40|(e<<24>>24|0)==41|(e<<24>>24|0)==92){k=c[10030]|0;aF(92,k|0)}else if((e<<24>>24|0)==0){break}aF(b|0,c[10030]|0);g=d}aI(168944,5,1,c[10030]|0);c[13330]=0;i=f;return}function nw(){var a=0;a=c[11684]|0;if((a|0)!=0){uu(a)}c[11684]=0;return}function nx(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;aF(12,c[10030]|0);b=c[11672]|0;if((b|0)>0){d=b}else{e=c[10030]|0;f=aD(e|0)|0;return}do{d=d-1|0;b=c[11676]|0;g=aa(b,d);h=c[11684]|0;i=b;while(1){if((i|0)<=0){break}j=i-1|0;if((a[h+(g+j|0)|0]|0)==32){i=j}else{k=0;l=b;m=h;n=13169;break}}L17850:do{if((n|0)==13169){while(1){n=0;h=a[m+(aa(l,d)+k|0)|0]|0;aF(h|0,c[10030]|0);h=k+1|0;if((h|0)>=(i|0)){break L17850}k=h;l=c[11676]|0;m=c[11684]|0;n=13169}}}while(0);i=(d|0)>0;if(i|a[46744]^1){h=c[10030]|0;aF(10,h|0)}}while(i);e=c[10030]|0;f=aD(e|0)|0;return}function ny(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;L17860:do{if((f|0)<(c[8272]|0)){g=d|0;j=d+8|0;k=e|0;l=e+8|0;m=f;L17862:while(1){n=c[1054]|0;o=(a[n+(m*40&-1)|0]&1)==0;L17864:do{if(!o){p=c[n+(m*40&-1)+36>>2]|0;q=n+(m*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break L17864}}if((s|0)==1){break L17860}}}while(0);q=c[60192]|0;L17871:do{if((q|0)==0){t=240768}else{r=c[n+(m*40&-1)+36>>2]|0;p=c[n+(m*40&-1)+32>>2]|0;u=(r|0)>0;w=c[10036]|0;x=240768;y=q;while(1){L17875:do{if(!o){if(u){z=0;A=0;B=p;while(1){C=a[y+z|0]|0;if(C<<24>>24==(a[w+(z+B|0)|0]|0)){D=B;E=A}else{if(C<<24>>24!=36){break L17875}D=B-1|0;E=1}F=z+1|0;if((F|0)<(E+r|0)){z=F;A=E;B=D}else{break}}if((E|0)==0){G=F}else{t=x;break L17871}}else{G=0}B=a[y+G|0]|0;if((B<<24>>24|0)==36|(B<<24>>24|0)==0){t=x;break L17871}}}while(0);B=x+8|0;A=c[B>>2]|0;if((A|0)==0){t=B;break}else{x=B;y=A}}}}while(0);o=c[t+4>>2]|0;if((o|0)==4){c[13898]=m+1;H=13201}else if((o|0)==0){c[13898]=m+1;a[46744]=0}else if((o|0)==3){c[13898]=m+1;c[(c[3524]|0)+68>>2]=104;q=(c[3524]|0)+96|0;c[q>>2]=c[q>>2]&-33}else if((o|0)==1){c[13898]=m+1;a[46744]=1}else if((o|0)==2){c[13898]=m+1;c[(c[3524]|0)+68>>2]=74;o=(c[3524]|0)+96|0;c[o>>2]=c[o>>2]|32}else{H=13201}L17894:do{if((H|0)==13201){H=0;o=is(d)|0;q=c[o>>2]|0;if((q|0)==2){I=+h[o+8>>3]}else if((q|0)==3){I=+uz(c[o+8>>2]|0,0)}else if((q|0)==1){I=+(c[o+8>>2]|0)}else{H=13205;break L17862}if((c[g>>2]|0)==3){uu(c[j>>2]|0);c[g>>2]=1}o=~~I;q=c[13898]|0;if((q|0)>=(c[8272]|0)){break}n=c[1054]|0;y=(a[n+(q*40&-1)|0]&1)==0;L17905:do{if(!y){x=c[n+(q*40&-1)+36>>2]|0;r=n+(q*40&-1)+32|0;w=c[10036]|0;p=0;while(1){if((p|0)>=(x|0)){H=13213;break}if((a[w+((c[r>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((H|0)==13213){H=0;if((p|0)==1){break L17894}}if(y){break}r=c[n+(q*40&-1)+36>>2]|0;w=n+(q*40&-1)+32|0;x=c[10036]|0;u=0;while(1){if((u|0)>=(r|0)){break}if((a[x+((c[w>>2]|0)+u|0)|0]|0)==(a[u+148464|0]|0)){u=u+1|0}else{break L17905}}if((u|0)!=1){break}c[13898]=q+1}}while(0);q=is(e)|0;n=c[q>>2]|0;if((n|0)==1){J=+(c[q+8>>2]|0)}else if((n|0)==2){J=+h[q+8>>3]}else if((n|0)==3){J=+uz(c[q+8>>2]|0,0)}else{H=13224;break L17862}if((c[k>>2]|0)==3){uu(c[l>>2]|0);c[k>>2]=1}q=~~J;c[(c[3524]|0)+8>>2]=o;c[11676]=o;c[(c[3524]|0)+12>>2]=q;c[11672]=q}}while(0);m=c[13898]|0;if((m|0)>=(c[8272]|0)){break L17860}}if((H|0)==13224){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((H|0)==13205){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);H=(c[(c[3524]|0)+68>>2]|0)==74?217456:179864;e=c[11676]|0;d=c[11672]|0;be(13048,169488,(v=i,i=i+32|0,c[v>>2]=a[46744]|0?136208:179864,c[v+8>>2]=H,c[v+16>>2]=e,c[v+24>>2]=d,v)|0);i=b;return}function nz(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[11684]|0;if((b|0)!=0){uu(b)}b=aa((c[11676]<<1)+2|0,(c[11672]|0)+1|0);d=ut(b)|0;do{if((d|0)==0){gk();e=ut(b)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=169528,v)|0)}else{f=d}}while(0);c[11684]=f;c[11680]=f+aa(c[11672]|0,c[11676]|0);i=a;return}function nA(){c[59832]=0;c[59834]=0;c[11664]=0;g[11668]=0.0;a[920]=0;return}function nB(){c[59832]=0;c[59834]=0;return}function nC(a){a=a|0;c[11666]=a;return 1}function nD(b,d,e,f,g,i){b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;if((i|0)==3){c[59572]=c[11678];c[59570]=c[11674];return}else if((i|0)==4){b=c[59570]|0;c[11678]=c[59572];c[11674]=b;return}else{if(a[238320]|0){return}a[238320]=1;c[11232]=43856;h[29791]=e*2.0;a[238304]=g&1;c[59578]=i;a[238296]=f&1;return}}function nE(a){a=a|0;c[11664]=(((a|0)>-1?a:-a|0)|0)%7&-1;return}function nF(a){a=a|0;g[11668]=(a|0)!=0?90.0:0.0;return 1}function nG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=c[11674]|0;f=d-e|0;g=(f|0)>-1?f:-f|0;f=c[11678]|0;h=b-f|0;i=(h|0)>-1?h:-h|0;if((g|0)>(i|0)){j=a[46728]|0;k=j<<24>>24;if((k|0)==1){l=1;m=43;n=58}else if((k|0)==2){l=2;m=43;n=124}else{l=3;m=j;n=j}j=c[11676]|0;do{if(j>>>0<f>>>0|(c[11672]|0)>>>0<e>>>0){o=e}else{k=aa(j,e)+f|0;if((a[(c[11680]|0)+k|0]|0|0)>=(l|0)){o=e;break}a[(c[11684]|0)+k|0]=m;k=aa(c[11676]|0,e)+f|0;a[(c[11680]|0)+k|0]=l&255;o=c[11674]|0}}while(0);j=d-o|0;k=(j|0)>-1?j:-j|0;if((k|0)>1){p=l&255;q=1;r=o;o=j;j=k;while(1){k=c[11678]|0;s=~~(+(q|0)*+(b-k|0)/+(j|0)+.5)+k|0;k=aa(o>>31|1,q)+r|0;t=c[11676]|0;do{if(t>>>0<s>>>0|(c[11672]|0)>>>0<k>>>0){u=r}else{v=s+aa(t,k)|0;if((a[(c[11680]|0)+v|0]|0|0)>=(l|0)){u=r;break}a[(c[11684]|0)+v|0]=n;v=aa(c[11676]|0,k)+s|0;a[(c[11680]|0)+v|0]=p;u=c[11674]|0}}while(0);s=q+1|0;k=d-u|0;t=(k|0)>-1?k:-k|0;if((s|0)<(t|0)){q=s;r=u;o=k;j=t}else{break}}}j=c[11676]|0;if(j>>>0<b>>>0|(c[11672]|0)>>>0<d>>>0){c[11678]=b;c[11674]=d;return}o=aa(j,d)+b|0;if((a[(c[11680]|0)+o|0]|0|0)>=(l|0)){c[11678]=b;c[11674]=d;return}a[(c[11684]|0)+o|0]=m;m=aa(c[11676]|0,d)+b|0;a[(c[11680]|0)+m|0]=l&255;c[11678]=b;c[11674]=d;return}l=a[46728]|0;m=l<<24>>24;if((i|0)<=(g|0)){g=(m-1|0)>>>0<2;o=g?m:3;if((i|0)<0){c[11678]=b;c[11674]=d;return}i=g?43:l;g=o&255;j=0;u=f;r=h;h=e;while(1){q=aa(r>>31|1,j)+u|0;p=aa(d-h>>31|1,j)+h|0;n=c[11676]|0;do{if(n>>>0<q>>>0|(c[11672]|0)>>>0<p>>>0){w=u}else{t=aa(p,n)+q|0;if((a[(c[11680]|0)+t|0]|0|0)>=(o|0)){w=u;break}a[(c[11684]|0)+t|0]=i;t=aa(c[11676]|0,p)+q|0;a[(c[11680]|0)+t|0]=g;w=c[11678]|0}}while(0);q=j+1|0;p=b-w|0;if((q|0)>(((p|0)>-1?p:-p|0)|0)){break}j=q;u=w;r=p;h=c[11674]|0}c[11678]=b;c[11674]=d;return}if((m|0)==2){x=2;y=43;z=45}else if((m|0)==1){x=1;y=43;z=46}else{x=3;y=l;z=l}l=c[11676]|0;do{if(l>>>0<f>>>0|(c[11672]|0)>>>0<e>>>0){A=f}else{m=aa(l,e)+f|0;if((a[(c[11680]|0)+m|0]|0|0)>=(x|0)){A=f;break}a[(c[11684]|0)+m|0]=y;m=aa(c[11676]|0,e)+f|0;a[(c[11680]|0)+m|0]=x&255;A=c[11678]|0}}while(0);f=b-A|0;e=(f|0)>-1?f:-f|0;if((e|0)>1){l=x&255;m=1;h=A;A=f;f=e;while(1){e=aa(A>>31|1,m)+h|0;r=c[11674]|0;w=~~(+(m|0)*+(d-r|0)/+(f|0)+.5)+r|0;r=c[11676]|0;do{if(r>>>0<e>>>0|(c[11672]|0)>>>0<w>>>0){B=h}else{u=aa(w,r)+e|0;if((a[(c[11680]|0)+u|0]|0|0)>=(x|0)){B=h;break}a[(c[11684]|0)+u|0]=z;u=aa(c[11676]|0,w)+e|0;a[(c[11680]|0)+u|0]=l;B=c[11678]|0}}while(0);e=m+1|0;w=b-B|0;r=(w|0)>-1?w:-w|0;if((e|0)<(r|0)){m=e;h=B;A=w;f=r}else{break}}}f=c[11676]|0;if(f>>>0<b>>>0|(c[11672]|0)>>>0<d>>>0){c[11678]=b;c[11674]=d;return}A=aa(f,d)+b|0;if((a[(c[11680]|0)+A|0]|0|0)>=(x|0)){c[11678]=b;c[11674]=d;return}a[(c[11684]|0)+A|0]=y;y=aa(c[11676]|0,d)+b|0;a[(c[11680]|0)+y|0]=x&255;c[11678]=b;c[11674]=d;return}function nH(b){b=b|0;if((b|0)==(-1|0)){a[46728]=1;return}else if((b|0)==(-2|0)){a[46728]=2;return}else{if((b|0)<-2){a[46728]=32;return}else{a[46728]=a[240816+((b|0)%7&-1)|0]|0;return}}}function nI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;if((e|0)==-1){f=46}else{f=((e|0)%26&-1)+65&255}e=c[11676]|0;if(e>>>0<b>>>0|(c[11672]|0)>>>0<d>>>0){return}g=aa(e,d)+b|0;if((a[(c[11680]|0)+g|0]|0)>=4){return}a[(c[11684]|0)+g|0]=f;f=aa(c[11676]|0,d)+b|0;a[(c[11680]|0)+f|0]=4;return}function nJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=uA(e|0)|0;g=c[11676]|0;if((f+b|0)>>>0>g>>>0){h=g-f|0;i=(h|0)<0?0:h}else{i=b}if(i>>>0<g>>>0){j=e;k=i;l=g}else{return}while(1){g=a[j]|0;if(g<<24>>24==0){m=13328;break}do{if(l>>>0<k>>>0|(c[11672]|0)>>>0<d>>>0){n=l}else{i=aa(l,d)+k|0;if((a[(c[11680]|0)+i|0]|0)>=5){n=l;break}a[(c[11684]|0)+i|0]=g;i=aa(c[11676]|0,d)+k|0;a[(c[11680]|0)+i|0]=5;n=c[11676]|0}}while(0);g=k+1|0;if(g>>>0<n>>>0){j=j+1|0;k=g;l=n}else{m=13329;break}}if((m|0)==13329){return}else if((m|0)==13328){return}}function nK(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;g=a[46728]|0;h=c[11678]|0;i=c[11674]|0;a[46728]=62;c[11678]=b;c[11674]=d;nG(e,f);a[46728]=g;c[11678]=h<<24>>24;c[11674]=i<<24>>24;return}function nL(){var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;if(!(a[238320]|0)){return}b=c[11678]|0;a[c[11232]|0]=0;d=uA(43856)|0;e=c[11676]|0;L18067:do{if((b|0)<(e|0)){f=b;g=43856;i=e;while(1){j=a[g]|0;if(j<<24>>24==0){break L18067}do{if((a[238304]&1)==0){k=i}else{l=~~(+(c[11674]|0)+ +h[29791]);if(i>>>0<f>>>0|(c[11672]|0)>>>0<l>>>0){k=i;break}m=aa(l,i)+f|0;if((a[(c[11680]|0)+m|0]|0)>=5){k=i;break}a[(c[11684]|0)+m|0]=j;m=aa(c[11676]|0,l)+f|0;a[(c[11680]|0)+m|0]=5;k=c[11676]|0}}while(0);j=f+1|0;if((j|0)<(k|0)){f=j;g=g+1|0;i=k}else{break}}}}while(0);do{if((a[238296]&1)!=0){if((c[59578]|0)==1){c[11678]=(c[11678]|0)+((d|0)/2&-1);break}else{c[11678]=(c[11678]|0)+d;break}}}while(0);a[238320]=0;return}function nM(){var b=0;if(a[920]|0){b=c[10030]|0;aI(170576,11,1,b|0)}aI(169584,19,1,c[10030]|0);return}function nN(){var a=0,b=0,d=0.0,e=0.0;a=i;b=c[3524]|0;d=+((c[b+8>>2]|0)>>>0>>>0)/60.0;e=+((c[b+12>>2]|0)>>>0>>>0)/60.0;cf(c[10030]|0,240336,(v=i,i=i+72|0,h[v>>3]=d,h[v+8>>3]=e,h[v+16>>3]=d,h[v+24>>3]=e,c[v+32>>2]=170312,h[v+40>>3]=1.456,h[v+48>>3]=.0351,h[v+56>>3]=1.0,c[v+64>>2]=169624,v)|0);cf(c[10030]|0,239344,(v=i,i=i+8|0,c[v>>2]=7,v)|0);cf(c[10030]|0,169824,(v=i,i=i+8|0,c[v>>2]=7,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=103960,c[v+8>>2]=169624,c[v+16>>2]=170112,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170288,c[v+8>>2]=170288,c[v+16>>2]=170104,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170224,c[v+8>>2]=170224,c[v+16>>2]=170080,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=40160,c[v+8>>2]=40160,c[v+16>>2]=170008,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170216,c[v+8>>2]=170216,c[v+16>>2]=169992,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170208,c[v+8>>2]=170208,c[v+16>>2]=169976,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=174448,c[v+8>>2]=174448,c[v+16>>2]=169952,v)|0);aI(169632,79,1,c[10030]|0);i=a;return}function nO(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0;e=i;c[59834]=b;c[59832]=d;if(a[920]|0){f=c[10030]|0;aI(170576,11,1,f|0);g=c[59834]|0;j=c[59832]|0}else{g=b;j=d}a[920]=0;d=c[11664]|0;b=c[35224+(d<<2)>>2]|0;f=c[35256+(d<<2)>>2]|0;cf(c[10030]|0,169856,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=f,c[v+16>>2]=b,c[v+24>>2]=f,h[v+32>>3]=+(g>>>0>>>0)/60.0,h[v+40>>3]=+(j>>>0>>>0)/60.0,v)|0);i=e;return}function nP(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;c[59834]=b;c[59832]=d;a[920]=1;f=c[11664]|0;g=c[35256+(f<<2)>>2]|0;cf(c[10030]|0,170144,(v=i,i=i+32|0,c[v>>2]=c[35224+(f<<2)>>2],c[v+8>>2]=g,h[v+16>>3]=+(b>>>0>>>0)/60.0,h[v+24>>3]=+(d>>>0>>>0)/60.0,v)|0);i=e;return}function nQ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;f=i;j=a[e]|0;if(j<<24>>24==0){i=f;return}else{k=0;l=j}while(1){j=k+1|0;if(l<<24>>24==0){break}k=j;l=a[e+j|0]|0}if(a[920]|0){l=c[10030]|0;aI(170576,11,1,l|0)}a[920]=0;cf(c[10030]|0,170552,(v=i,i=i+8|0,c[v>>2]=103960,v)|0);m=+g[11668];l=c[11666]|0;do{if(m!=90.0){if((l|0)==0){n=+(d>>>0>>>0)-31.2;o=n;p=+(b>>>0>>>0)+ +(k|0)*70.55999999999999;q=n;r=+(b>>>0>>>0);break}else if((l|0)==2){n=+(d>>>0>>>0)-31.2;o=n;p=+(b>>>0>>>0);q=n;r=+(b>>>0>>>0)- +(k|0)*70.55999999999999;break}else if((l|0)==1){n=+(d>>>0>>>0)-31.2;o=n;p=+(b>>>0>>>0);q=n;r=+(b>>>0>>>0)- +(k|0)*70.55999999999999*.5;break}else{o=1.0;p=1.0;q=1.0;r=1.0;break}}else{if((l|0)==2){n=+(b>>>0>>>0)+31.2;o=+(d>>>0>>>0);p=n;q=+(d>>>0>>>0)- +(k|0)*100.8;r=n;break}else if((l|0)==0){n=+(b>>>0>>>0)+31.2;o=+(d>>>0>>>0)+ +(k|0)*70.55999999999999;p=n;q=+(d>>>0>>>0);r=n;break}else if((l|0)==1){n=+(b>>>0>>>0)+31.2;o=+(d>>>0>>>0);p=n;q=+(d>>>0>>>0)- +(k|0)*70.55999999999999*.5;r=n;break}else{o=1.0;p=1.0;q=1.0;r=1.0;break}}}while(0);cf(c[10030]|0,170480,(v=i,i=i+48|0,h[v>>3]=r/60.0,h[v+8>>3]=q/60.0,h[v+16>>3]=1.456,c[v+24>>2]=e,h[v+32>>3]=m,c[v+40>>2]=170312,v)|0);e=c[11666]|0;if((e|0)==0){i=f;return}cf(c[10030]|0,170424,(v=i,i=i+24|0,c[v>>2]=e,h[v+8>>3]=p/60.0,h[v+16>>3]=o/60.0,v)|0);i=f;return}function nR(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0.0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0.0,aV=0,aW=0,aX=0.0,aY=0,aZ=0,a_=0,a$=0.0,a0=0.0,a1=0.0,a2=0;b=i;i=i+192|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=b+120|0;m=b+144|0;n=b+168|0;o=c[13898]|0;p=o-1|0;q=c[1054]|0;r=c[q+(p*40&-1)+36>>2]|0;L18121:do{if((a[q+(p*40&-1)|0]&1)!=0&(r|0)>0){s=c[10036]|0;t=0;u=0;w=c[q+(p*40&-1)+32>>2]|0;while(1){if((a[t+171032|0]|0)==(a[s+(t+w|0)|0]|0)){x=w;y=u}else{if((t|0)!=7){z=13384;break L18121}x=w-1|0;y=1}A=t+1|0;if((A|0)<(y+r|0)){t=A;u=y;w=x}else{break}}if((y|0)!=0){B=o;break}if((t|0)==6|(t|0)==10){B=o}else{z=13384}}else{z=13384}}while(0);if((z|0)==13384){c[(c[3524]|0)+8>>2]=27002;c[(c[3524]|0)+12>>2]=20252;a[46232]=0;a[45624]=0;c[11564]=16777215;a[45056]=0;B=c[13898]|0}o=c[8272]|0;L18134:do{if((B|0)<(o|0)){y=f|0;x=f+8|0;r=l|0;p=l+8|0;q=m|0;w=m+8|0;u=e|0;s=e+8|0;A=d|0;C=d+8|0;D=j|0;E=j+8|0;F=k|0;G=k+8|0;H=0;I=B;J=o;L18136:while(1){K=c[1054]|0;L=a[K+(I*40&-1)|0]|0;M=(L&1)==0;N=c[K+(I*40&-1)+36>>2]|0;O=K+(I*40&-1)+32|0;L18138:do{if(M){P=c[O>>2]|0;z=13456}else{Q=c[10036]|0;R=0;while(1){if((R|0)>=(N|0)){z=13392;break}if((a[Q+((c[O>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break}}if((z|0)==13392){z=0;if((R|0)==1){S=H;T=I;break L18134}}Q=c[O>>2]|0;if(!((N|0)>0&(M^1))){P=Q;z=13456;break}U=c[10036]|0;V=0;W=0;X=Q;while(1){if((a[V+170976|0]|0)==(a[U+(V+X|0)|0]|0)){Y=X;Z=W}else{if((V|0)!=2){break}Y=X-1|0;Z=1}_=V+1|0;if((_|0)<(Z+N|0)){V=_;W=Z;X=Y}else{z=13399;break}}do{if((z|0)==13399){z=0;if((Z|0)==0){if(!((V|0)==1|(V|0)==7)){break}}a[45952]=a[216600]|0;a[45953|0]=a[216601|0]|0;a[45954|0]=a[216602|0]|0;a[45955|0]=a[216603|0]|0;a[45956|0]=a[216604|0]|0;a[45957|0]=a[216605|0]|0;g[11486]=12.0;a[45624]=0;a[46232]=0;X=(c[3524]|0)+96|0;c[X>>2]=c[X>>2]&-1025;c[13898]=(c[13898]|0)+1;$=H;break L18138}}while(0);if(M){P=Q;z=13456;break}L18160:do{if((N|0)>0){V=c[10036]|0;X=0;W=0;U=Q;while(1){if((a[X+184472|0]|0)==(a[V+(X+U|0)|0]|0)){aa=U;ab=W}else{if((X|0)!=1){break L18160}aa=U-1|0;ab=1}R=X+1|0;if((R|0)<(ab+N|0)){X=R;W=ab;U=aa}else{break}}if((ab|0)==0){if(!((X|0)==0|(X|0)==10)){break}}a[45624]=1;U=(c[3524]|0)+96|0;c[U>>2]=c[U>>2]|1024;c[13898]=(c[13898]|0)+1;$=H;break L18138}}while(0);if(!((N|0)>0&(M^1))){P=Q;z=13456;break}U=c[10036]|0;W=0;V=0;R=Q;while(1){if((a[W+115600|0]|0)==(a[U+(W+R|0)|0]|0)){ac=R;ad=V}else{if((W|0)!=1){z=13421;break}ac=R-1|0;ad=1}_=W+1|0;if((_|0)<(ad+N|0)){W=_;V=ad;R=ac}else{z=13419;break}}do{if((z|0)==13419){z=0;if((ad|0)!=0){break}if(!((W|0)==0|(W|0)==5)){z=13421}}}while(0);L18183:do{if((z|0)==13421){z=0;if(M){P=Q;z=13456;break L18138}L18186:do{if((N|0)>0){W=c[10036]|0;R=0;V=0;U=Q;while(1){if((a[R+115536|0]|0)==(a[W+(R+U|0)|0]|0)){ae=U;af=V}else{if((R|0)!=1){break L18186}ae=U-1|0;af=1}_=R+1|0;if((_|0)<(af+N|0)){R=_;V=af;U=ae}else{break}}if((af|0)!=0){break L18183}if((R|0)==0|(R|0)==6){break L18183}}}while(0);if(!((N|0)>0&(M^1))){P=Q;z=13456;break L18138}X=c[10036]|0;U=0;V=0;W=Q;while(1){if((a[U+129104|0]|0)==(a[X+(U+W|0)|0]|0)){ag=W;ah=V}else{if((U|0)!=2){break}ag=W-1|0;ah=1}_=U+1|0;if((_|0)<(ah+N|0)){U=_;V=ah;W=ag}else{z=13437;break}}do{if((z|0)==13437){z=0;if((ah|0)==0){if(!((U|0)==1|(U|0)==6)){break}}a[46232]=1;c[13898]=I+1;$=H;break L18138}}while(0);if(M){P=Q;z=13456;break L18138}L18211:do{if((N|0)>0){U=c[10036]|0;W=0;V=0;X=Q;while(1){if((a[W+217776|0]|0)==(a[U+(W+X|0)|0]|0)){ai=X;aj=V}else{if((W|0)!=5){break L18211}ai=X-1|0;aj=1}_=W+1|0;if((_|0)<(aj+N|0)){W=_;V=aj;X=ai}else{break}}if((aj|0)==0){if(!((W|0)==4|(W|0)==7)){break}}a[45616]=1;c[13898]=I+1;$=H;break L18138}}while(0);if(!((N|0)>0&(M^1))){P=Q;z=13456;break L18138}X=c[10036]|0;V=0;do{if((a[V+137232|0]|0)!=(a[X+(V+Q|0)|0]|0)){P=Q;z=13456;break L18138}V=V+1|0;}while((V|0)<(N|0));if((V|0)!=4){P=Q;z=13456;break L18138}a[45616]=0;c[13898]=I+1;$=H;break L18138}}while(0);a[45624]=0;Q=(c[3524]|0)+96|0;c[Q>>2]=c[Q>>2]&-1025;c[13898]=(c[13898]|0)+1;$=H}}while(0);L18232:do{if((z|0)==13456){z=0;O=(J|0)>(I|0);L18234:do{if(O){if(M){ak=I;al=K;am=N;an=P;ao=L;break}Q=c[10036]|0;X=0;while(1){if((X|0)>=(N|0)){break}if((a[Q+(P+X|0)|0]|0)==(a[X+128480|0]|0)){X=X+1|0}else{z=13462;break L18234}}if((X|0)==2){z=13470}else{z=13462}}else{z=13462}}while(0);L18241:do{if((z|0)==13462){z=0;L18243:do{if((N|0)>0&(M^1)){Q=c[10036]|0;V=0;U=0;R=P;while(1){if((a[V+128560|0]|0)==(a[Q+(V+R|0)|0]|0)){ap=R;aq=U}else{if((V|0)!=5){break}ap=R-1|0;aq=1}_=V+1|0;if((_|0)<(aq+N|0)){V=_;U=aq;R=ap}else{z=13468;break}}if((z|0)==13468){z=0;if((aq|0)!=0){z=13470;break L18241}if((V|0)==4|(V|0)==10){z=13470;break L18241}}if(!((N|0)>0&(M^1))){break}R=c[10036]|0;U=0;Q=0;W=P;while(1){if((a[U+115496|0]|0)==(a[R+(U+W|0)|0]|0)){ar=W;as=Q}else{if((U|0)!=1){break L18243}ar=W-1|0;as=1}_=U+1|0;if((_|0)<(as+N|0)){U=_;Q=as;W=ar}else{break}}if((as|0)==0){if(!((U|0)==0|(U|0)==5)){break}}a[46232]=0;c[13898]=I+1;$=H;break L18232}}while(0);L18267:do{if(O){if(M){ak=I;al=K;am=N;an=P;ao=L;break L18241}X=c[10036]|0;W=0;while(1){if((W|0)>=(N|0)){break}if((a[X+(P+W|0)|0]|0)==(a[W+128296|0]|0)){W=W+1|0}else{z=13494;break L18267}}if((W|0)!=2){z=13494}}else{z=13494}}while(0);do{if((z|0)==13494){z=0;if(!((N|0)>0&(M^1))){ak=I;al=K;am=N;an=P;ao=L;break L18241}X=c[10036]|0;U=0;Q=0;R=P;while(1){if((a[U+128400|0]|0)==(a[X+(U+R|0)|0]|0)){at=R;au=Q}else{if((U|0)!=5){break}at=R-1|0;au=1}V=U+1|0;if((V|0)<(au+N|0)){U=V;Q=au;R=at}else{z=13500;break}}if((z|0)==13500){z=0;if((au|0)!=0){break}if((U|0)==4|(U|0)==9){break}}if(M){ak=I;al=K;am=N;an=P;ao=L;break L18241}L18288:do{if((N|0)>0){R=c[10036]|0;Q=0;X=0;W=P;while(1){if((a[Q+122880|0]|0)==(a[R+(Q+W|0)|0]|0)){av=W;aw=X}else{if((Q|0)!=3){break L18288}av=W-1|0;aw=1}V=Q+1|0;if((V|0)<(aw+N|0)){Q=V;X=aw;W=av}else{break}}if((aw|0)==0){if(!((Q|0)==8|(Q|0)==2)){break}}c[13898]=I+1;c[(c[3524]|0)+68>>2]=124;W=(c[3524]|0)+96|0;c[W>>2]=c[W>>2]|32;$=H;break L18232}}while(0);if(!((N|0)>0&(M^1))){ak=I;al=K;am=N;an=P;ao=L;break L18241}U=c[10036]|0;W=0;X=0;R=P;while(1){if((a[W+121536|0]|0)==(a[U+(W+R|0)|0]|0)){ax=R;ay=X}else{if((W|0)!=5){ak=I;al=K;am=N;an=P;ao=L;break L18241}ax=R-1|0;ay=1}V=W+1|0;if((V|0)<(ay+N|0)){W=V;X=ay;R=ax}else{break}}if((ay|0)==0){if(!((W|0)==4|(W|0)==10)){ak=I;al=K;am=N;an=P;ao=L;break L18241}}c[13898]=I+1;c[(c[3524]|0)+68>>2]=102;R=(c[3524]|0)+96|0;c[R>>2]=c[R>>2]&-33;R=c[13898]|0;X=c[1054]|0;ak=R;al=X;am=c[X+(R*40&-1)+36>>2]|0;an=c[X+(R*40&-1)+32>>2]|0;ao=a[X+(R*40&-1)|0]|0;break L18241}}while(0);c[13898]=I+1;R=is(j)|0;X=c[R>>2]|0;if((X|0)==1){az=+(c[R+8>>2]|0)}else if((X|0)==2){az=+h[R+8>>3]}else if((X|0)==3){az=+uz(c[R+8>>2]|0,0)}else{z=13506;break L18136}if((c[D>>2]|0)==3){uu(c[E>>2]|0);c[D>>2]=1}h[5704]=az;if(az>=.1){$=H;break L18232}h[5704]=1.0;$=H;break L18232}}while(0);if((z|0)==13470){z=0;c[13898]=I+1;O=is(k)|0;R=c[O>>2]|0;if((R|0)==2){aA=+h[O+8>>3]}else if((R|0)==1){aA=+(c[O+8>>2]|0)}else if((R|0)==3){aA=+uz(c[O+8>>2]|0,0)}else{z=13474;break L18136}if((c[F>>2]|0)==3){uu(c[G>>2]|0);c[F>>2]=1}h[5778]=aA;if(aA>=.5){$=H;break}h[5778]=1.0;$=H;break}L18334:do{if((ao&1)!=0&(am|0)>0){O=c[10036]|0;R=0;X=0;U=an;while(1){if((a[R+170936|0]|0)==(a[O+(R+U|0)|0]|0)){aB=U;aC=X}else{if((R|0)!=4){aD=H;aE=ak;aF=al;aG=am;aH=an;aI=ao;break L18334}aB=U-1|0;aC=1}V=R+1|0;if((V|0)<(aC+am|0)){R=V;X=aC;U=aB}else{break}}if((aC|0)==0){if(!((R|0)==3|(R|0)==10)){aD=H;aE=ak;aF=al;aG=am;aH=an;aI=ao;break}}c[13898]=ak+1;U=hK()|0;c[11564]=U>>>16&255|U&65280|U<<16&16711680;X=c[13898]|0;O=c[1054]|0;aD=U;aE=X;aF=O;aG=c[O+(X*40&-1)+36>>2]|0;aH=c[O+(X*40&-1)+32>>2]|0;aI=a[O+(X*40&-1)|0]|0}else{aD=H;aE=ak;aF=al;aG=am;aH=an;aI=ao}}while(0);L18347:do{if((aI&1)!=0&(aG|0)>0){X=c[10036]|0;O=0;U=0;V=aH;while(1){if((a[O+170920|0]|0)==(a[X+(O+V|0)|0]|0)){aJ=V;aK=U}else{if((O|0)!=5){aL=aE;aM=aG;aN=aH;aO=aI;break L18347}aJ=V-1|0;aK=1}_=O+1|0;if((_|0)<(aK+aG|0)){O=_;U=aK;V=aJ}else{break}}if((aK|0)==0){if(!((O|0)==4|(O|0)==14)){aL=aE;aM=aG;aN=aH;aO=aI;break}}V=aE+1|0;c[13898]=V;a[45056]=1;aL=V;aM=c[aF+(V*40&-1)+36>>2]|0;aN=c[aF+(V*40&-1)+32>>2]|0;aO=a[aF+(V*40&-1)|0]|0}else{aL=aE;aM=aG;aN=aH;aO=aI}}while(0);V=(aO&1)==0;L18360:do{if((aM|0)>0&(V^1)){U=c[10036]|0;X=0;R=0;_=aN;while(1){if((a[X+90488|0]|0)==(a[U+(X+_|0)|0]|0)){aP=_;aQ=R}else{if((X|0)!=2){break L18360}aP=_-1|0;aQ=1}aR=X+1|0;if((aR|0)<(aQ+aM|0)){X=aR;R=aQ;_=aP}else{break}}if((aQ|0)==0){if(!((X|0)==4|(X|0)==1)){break}}_=aL+1|0;c[13898]=_;L18372:do{if((_|0)<(c[8272]|0)){L18374:do{if((a[aF+(_*40&-1)|0]&1)!=0){R=c[aF+(_*40&-1)+36>>2]|0;U=aF+(_*40&-1)+32|0;O=c[10036]|0;aR=0;while(1){if((aR|0)>=(R|0)){break}if((a[O+((c[U>>2]|0)+aR|0)|0]|0)==(a[aR+103664|0]|0)){aR=aR+1|0}else{break L18374}}if((aR|0)==1){aS=1024;aT=768;z=13584;break L18372}}}while(0);W=is(e)|0;U=c[W>>2]|0;if((U|0)==1){aU=+(c[W+8>>2]|0)}else if((U|0)==2){aU=+h[W+8>>3]}else if((U|0)==3){aU=+uz(c[W+8>>2]|0,0)}else{z=13566;break L18136}if((c[u>>2]|0)==3){uu(c[s>>2]|0);c[u>>2]=1}W=~~aU;U=c[13898]|0;L18389:do{if((c[8272]|0)>(U|0)){O=c[1054]|0;if((a[O+(U*40&-1)|0]&1)==0){aV=768;break}R=c[O+(U*40&-1)+36>>2]|0;Q=O+(U*40&-1)+32|0;O=c[10036]|0;aW=0;while(1){if((aW|0)>=(R|0)){break}if((a[O+((c[Q>>2]|0)+aW|0)|0]|0)==(a[aW+148464|0]|0)){aW=aW+1|0}else{aV=768;break L18389}}if((aW|0)!=1){aV=768;break}c[13898]=U+1;Q=is(d)|0;O=c[Q>>2]|0;if((O|0)==3){aX=+uz(c[Q+8>>2]|0,0)}else if((O|0)==1){aX=+(c[Q+8>>2]|0)}else if((O|0)==2){aX=+h[Q+8>>3]}else{z=13579;break L18136}if((c[A>>2]|0)==3){uu(c[C>>2]|0);c[A>>2]=1}aV=~~aX}else{aV=768}}while(0);if((W|0)>0){aS=W;aT=aV;z=13584}else{aY=aV}}else{aS=1024;aT=768;z=13584}}while(0);if((z|0)==13584){z=0;c[(c[3524]|0)+8>>2]=~~(+(aS|0)*26.37);aY=aT}if((aY|0)>0){c[(c[3524]|0)+12>>2]=~~(+(aY|0)*26.37)}_=c[3524]|0;c[_+28>>2]=((c[_+8>>2]|0)>>>0)/160>>>0;_=c[3524]|0;c[_+24>>2]=c[_+28>>2];$=aD;break L18232}}while(0);_=c[8272]|0;X=(_|0)>(aL|0);L18413:do{if(V|X^1){aZ=aL}else{U=c[10036]|0;Q=0;while(1){if((Q|0)>=(aM|0)){z=13592;break}if((a[U+(aN+Q|0)|0]|0)==(a[Q+128096|0]|0)){Q=Q+1|0}else{break}}do{if((z|0)==13592){z=0;if((Q|0)!=9){break}O=aL+1|0;c[13898]=O;L18421:do{if((O|0)<(_|0)){L18423:do{if((a[aF+(O*40&-1)|0]&1)!=0){R=c[aF+(O*40&-1)+36>>2]|0;aR=aF+(O*40&-1)+32|0;a_=0;while(1){if((a_|0)>=(R|0)){break}if((a[U+((c[aR>>2]|0)+a_|0)|0]|0)==(a[a_+103664|0]|0)){a_=a_+1|0}else{break L18423}}if((a_|0)==1){z=13606;break L18421}}}while(0);aW=is(f)|0;aR=c[aW>>2]|0;if((aR|0)==1){a$=+(c[aW+8>>2]|0)}else if((aR|0)==2){a$=+h[aW+8>>3]}else if((aR|0)==3){a$=+uz(c[aW+8>>2]|0,0)}else{z=13603;break L18136}if((c[y>>2]|0)==3){uu(c[x>>2]|0);c[y>>2]=1}h[5710]=a$;if(a$>0.0){$=aD;break L18232}}else{z=13606}}while(0);if((z|0)==13606){z=0;h[5710]=-1.0}h[5710]=1.0;$=aD;break L18232}}while(0);if(V|X^1){aZ=aL;break}U=c[10036]|0;Q=0;while(1){if((Q|0)>=(aM|0)){break}if((a[U+(aN+Q|0)|0]|0)==(a[Q+124352|0]|0)){Q=Q+1|0}else{aZ=aL;break L18413}}if((Q|0)!=4){aZ=aL;break}U=aL+1|0;c[13898]=U;aZ=U}}while(0);if((aZ|0)>=(_|0)){S=aD;T=aZ;break L18134}L18450:do{if((a[aF+(aZ*40&-1)|0]&1)!=0){X=c[aF+(aZ*40&-1)+36>>2]|0;V=aF+(aZ*40&-1)+32|0;U=c[10036]|0;O=0;while(1){if((O|0)>=(X|0)){break}if((a[U+((c[V>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L18450}}if((O|0)==1){S=aD;T=aZ;break L18134}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[r>>2]|0)!=3){z=13622;break L18136}_=c[p>>2]|0;if((_|0)==0){z=13624;break L18136}V=bh(_|0,44)|0;do{if((V|0)!=0){if((ca(V+1|0,170912,(v=i,i=i+8|0,c[v>>2]=45944,v)|0)|0)!=1){break}a[V]=0}}while(0);if((a[_]|0)!=0){uF(45952,_|0,255)}uu(_);if((a[(c[1054]|0)+((c[13898]|0)*40&-1)|0]&1)!=0){$=aD;break}V=is(m)|0;U=c[V>>2]|0;if((U|0)==2){a0=+h[V+8>>3]}else if((U|0)==3){a0=+uz(c[V+8>>2]|0,0)}else if((U|0)==1){a0=+(c[V+8>>2]|0)}else{z=13635;break L18136}if((c[q>>2]|0)==3){uu(c[w>>2]|0);c[q>>2]=1}g[11486]=+(~~a0|0);$=aD}}while(0);L=c[13898]|0;N=c[8272]|0;if((L|0)<(N|0)){H=$;I=L;J=N}else{S=$;T=L;break L18134}}if((z|0)==13603){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13622){c[13898]=aZ;S=aD;T=aZ;break}else if((z|0)==13579){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13624){S=aD;T=c[13898]|0;break}else if((z|0)==13474){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13566){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13506){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13635){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{S=0;T=B}}while(0);L18486:do{if((T|0)<(c[8272]|0)){B=c[1054]|0;L18488:do{if((a[B+(T*40&-1)|0]&1)!=0){z=c[B+(T*40&-1)+36>>2]|0;aD=B+(T*40&-1)+32|0;aZ=c[10036]|0;$=0;while(1){if(($|0)>=(z|0)){break}if((a[aZ+((c[aD>>2]|0)+$|0)|0]|0)==(a[$+103664|0]|0)){$=$+1|0}else{break L18488}}if(($|0)==1){break L18486}}}while(0);B=is(n)|0;aD=c[B>>2]|0;if((aD|0)==1){a1=+(c[B+8>>2]|0)}else if((aD|0)==2){a1=+h[B+8>>3]}else if((aD|0)==3){a1=+uz(c[B+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=n|0;if((c[B>>2]|0)==3){uu(c[n+8>>2]|0);c[B>>2]=1}g[11486]=+(~~a1|0)}}while(0);n4(0);n=a[46232]|0?131584:131504;T=a[45616]|0?137776:137232;a1=+g[11486];be(13048,170872,(v=i,i=i+40|0,c[v>>2]=a[45624]|0?116408:116440,c[v+8>>2]=n,c[v+16>>2]=T,c[v+24>>2]=45952,h[v+32>>3]=a1,v)|0);T=c[3524]|0;if((c[T+96>>2]&32|0)!=0){uD(13048+(uA(13048)|0)|0,170856,11)}a1=+h[5710];if(a1!=1.0){n=13048+(uA(13048)|0)|0;be(n|0,170824,(v=i,i=i+8|0,h[v>>3]=a1,v)|0);a2=c[3524]|0}else{a2=T}T=c[a2+8>>2]|0;n=c[a2+12>>2]|0;if(!((T|0)==27002&(n|0)==20252)){a2=13048+(uA(13048)|0)|0;B=~~(+(T>>>0>>>0)/26.37+.5);T=~~(+(n>>>0>>>0)/26.37+.5);be(a2|0,170728,(v=i,i=i+16|0,c[v>>2]=B,c[v+8>>2]=T,v)|0)}a1=+h[5704];if(a1!=1.0){T=13048+(uA(13048)|0)|0;be(T|0,170680,(v=i,i=i+8|0,h[v>>3]=a1,v)|0)}a1=+h[5778];if(a1!=1.0){T=13048+(uA(13048)|0)|0;be(T|0,170640,(v=i,i=i+8|0,h[v>>3]=a1,v)|0)}if((S|0)==0){i=b;return}be(13048+(uA(13048)|0)|0,170616,(v=i,i=i+8|0,c[v>>2]=S,v)|0);i=b;return}function nS(){c[11296]=0;c[11298]=0;c[11412]=0;c[11262]=0;a[45664]=0;return}function nT(){c[11296]=0;c[11298]=0;a[45664]=0;return}function nU(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+8|0;d=b|0;e=d;tN();a[45664]=0;f=d;g=e+3|0;a[g]=0;h=e+2|0;a[h]=0;j=e+1|0;a[j]=0;a[f]=27;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=16;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;e=c[11300]|0;a[g]=e>>>24&255;a[h]=e>>>16&255;a[j]=e>>>8&255;a[f]=e&255;aI(f|0,1,4,c[10030]|0);e=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[g]=e>>>24&255;a[h]=e>>>16&255;a[j]=e>>>8&255;a[f]=e&255;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=37;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=-128;a[h]=0;a[j]=0;a[f]=10;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=40;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[f]=2;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=37;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=-128;a[h]=0;a[j]=0;a[f]=7;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=40;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[f]=1;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=37;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=-128;a[h]=0;a[j]=0;a[f]=0;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=40;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[f]=3;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=14;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=20;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;c[d>>2]=0;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=16;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=20;aI(f|0,1,4,c[10030]|0);d=bc(c[10030]|0)|0;cp(c[10030]|0,48,0);a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[f]=d&255;aI(f|0,1,4,c[10030]|0);d=c[11294]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[f]=d&255;aI(f|0,1,4,c[10030]|0);cp(c[10030]|0,0,0);i=b;return}function nV(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=i;i=i+64|0;d=b|0;e=b+48|0;f=b+56|0;g=f;h=c[3524]|0;j=+((c[h+8>>2]|0)>>>0>>>0)/26.37;k=~~(j+.5);l=+((c[h+12>>2]|0)>>>0>>>0)/26.37;h=~~(l+.5);m=~~(j*.263671875+.5);n=~~(l*.2604166666666667+.5);c[11294]=0;o=f;p=g+3|0;a[p]=0;q=g+2|0;a[q]=0;r=g+1|0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=100;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);g=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/26.37);a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);g=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/26.37);a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);g=c[(c[3524]|0)+8>>2]|0;a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);g=c[(c[3524]|0)+12>>2]|0;a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);a[p]=70;a[q]=77;a[r]=69;a[o]=32;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=1;a[r]=0;a[o]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);g=e|0;s=e+1|0;a[s]=0;a[g]=4;aI(g|0,1,2,c[10030]|0);a[s]=0;a[g]=0;aI(g|0,1,2,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[p]=k>>>24&255;a[q]=k>>>16&255;a[r]=k>>>8&255;a[o]=k&255;aI(o|0,1,4,c[10030]|0);a[p]=h>>>24&255;a[q]=h>>>16&255;a[r]=h>>>8&255;a[o]=h&255;aI(o|0,1,4,c[10030]|0);a[p]=m>>>24&255;a[q]=m>>>16&255;a[r]=m>>>8&255;a[o]=m&255;aI(o|0,1,4,c[10030]|0);a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[45664]=1;a[p]=0;a[q]=0;a[r]=0;a[o]=17;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=8;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=9;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=16;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;n=c[(c[3524]|0)+8>>2]|0;a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);n=c[(c[3524]|0)+12>>2]|0;a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=11;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=16;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;n=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/26.37);a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);n=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/26.37);a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);if((c[11564]|0)!=16777215){n=c[3524]|0;m=c[n+8>>2]|0;h=c[n+12>>2]|0;c[d>>2]=0;c[d+4>>2]=0;c[d+12>>2]=m;c[d+16>>2]=0;c[d+24>>2]=m;c[d+28>>2]=h;c[d+36>>2]=0;c[d+40>>2]=h;c[d+8>>2]=0;n9(4,d|0)}a[p]=0;a[q]=0;a[r]=0;a[o]=38;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=28;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);d=a[45616]|0;a[p]=0;a[q]=0;a[r]=d?0:34;a[o]=0;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=18;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=39;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=24;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);n4(0);c[11280]=-5;c[11562]=-5;i=b;return}function nW(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>a>>>0){if((c[e+12>>2]|0)>>>0>b>>>0){f=b;g=a}else{h=13676}}else{h=13676}if((h|0)==13676){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);h=c[3524]|0;e=c[h+8>>2]|0;j=c[h+12>>2]|0;f=j>>>0>b>>>0?b:j;g=e>>>0>a>>>0?a:e}if((g|0)==(c[11298]|0)&(f|0)==(c[11296]|0)){i=d;return}tN();c[11298]=g;c[11296]=f;i=d;return}function nX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>a>>>0){if((c[e+12>>2]|0)>>>0<=b>>>0){f=13684}}else{f=13684}if((f|0)==13684){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0)}if((c[11298]|0)==(a|0)&(c[11296]|0)==(b|0)){i=d;return}f=c[11560]|0;if((f<<1|0)>102){tN();g=c[11560]|0}else{g=f}if((g|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;h=1}else{h=g}g=h<<1;c[45200+(g<<2)>>2]=a;c[11298]=a;c[45200+((g|1)<<2)>>2]=b;c[11296]=b;c[11560]=h+1;i=d;return}function nY(b){b=b|0;var d=0,e=0,f=0;tN();d=(b|0)==-3?-4:b;c[11412]=d;if((d|0)==-4){e=46256}else{if((d|0)<0|a[45624]){f=7}else{f=(d|0)%15&-1}e=238816+(f<<2)|0}c[11562]=c[e>>2];tN();tL(d);return}function nZ(a){a=a|0;do{if((a|0)==0){if((c[11262]|0)==0){break}c[11262]=0;tO()}else if((a|0)==(-270|0)){if((c[11262]|0)==900){break}c[11262]=900;tO()}else{c[11262]=a*10&-1;tO()}}while(0);return 1}function n_(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+8|0;e=d|0;c[11414]=b;if((b|0)==2){f=10}else if((b|0)==1){f=14}else{f=8}b=e|0;g=e+3|0;a[g]=0;h=e+2|0;a[h]=0;j=e+1|0;a[j]=0;a[b]=22;aI(b|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[b]=12;aI(b|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[b]=f;aI(b|0,1,4,c[10030]|0);i=d;return 1}function n$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0.0,z=0,A=0,B=0;f=i;i=i+8|0;g=f|0;h=g;j=i;i=i+4|0;i=i+7>>3<<3;k=i;i=i+4|0;i=i+7>>3<<3;l=i;i=i+4|0;i=i+7>>3<<3;m=i;i=i+4|0;i=i+7>>3<<3;n=uA(e|0)|0;do{if(((c[11252]|0)-14|0)>>>0<2){c[l>>2]=e;o=uA(e|0)|0;c[k>>2]=o;p=(o<<1)+2|0;c[j>>2]=p;q=ut(p)|0;do{if((q|0)==0){gk();r=ut(p)|0;if((r|0)!=0){s=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=171392,v)|0)}else{s=q}}while(0);c[m>>2]=s;q=bi(171336,((c[11252]|0)==15?171384:171360)|0)|0;if((q|0)==-1){uh(-1,171312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);t=s;u=o;w=n;break}if((aG(q|0,l|0,k|0,m|0,j|0)|0)==-1){uh(-1,171280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}cz(q|0);q=p-(c[j>>2]|0)|0;t=s;u=(q|0)/2&-1;w=q}else{t=0;u=n;w=n}}while(0);if((w|0)<1){i=f;return}tN();if((c[11280]|0)!=(c[11562]|0)){n=g;s=h+3|0;a[s]=0;j=h+2|0;a[j]=0;m=h+1|0;a[m]=0;a[n]=24;k=c[10030]|0;aI(n|0,1,4,k|0);a[s]=0;a[j]=0;a[m]=0;a[n]=12;k=c[10030]|0;aI(n|0,1,4,k|0);c[11294]=(c[11294]|0)+1;k=c[11562]|0;a[s]=k>>>24&255;a[j]=k>>>16&255;a[m]=k>>>8&255;a[n]=k&255;k=c[10030]|0;aI(n|0,1,4,k|0);c[11280]=c[11562]}k=(w|0)%4&-1;if((k|0)==0){x=w}else{x=(w+4|0)-k|0}k=((c[11252]|0)-14|0)>>>0<2;n=g;m=h+3|0;a[m]=0;j=h+2|0;a[j]=0;s=h+1|0;a[s]=0;if(k){a[n]=84;k=c[10030]|0;aI(n|0,1,4,k|0);k=((u<<2)+76|0)+x|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;k=c[10030]|0;aI(n|0,1,4,k|0)}else{a[n]=83;k=c[10030]|0;aI(n|0,1,4,k|0);k=((u<<2)+76|0)+x|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;k=c[10030]|0;aI(n|0,1,4,k|0)}c[11294]=(c[11294]|0)+1;c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);a[m]=0;a[j]=0;a[s]=0;a[n]=1;aI(n|0,1,4,c[10030]|0);a[m]=65;a[j]=-46;a[s]=-11;a[n]=-61;aI(n|0,1,4,c[10030]|0);a[m]=65;a[j]=-46;a[s]=-11;a[n]=-61;aI(n|0,1,4,c[10030]|0);y=+((c[(c[3524]|0)+16>>2]|0)>>>1>>>0>>>0);k=~~(y*+T(+(+(c[11262]|0)*.0017453292519944445)))+b|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;aI(n|0,1,4,c[10030]|0);k=c[3524]|0;b=(c[k+12>>2]|0)-d|0;y=+((c[k+16>>2]|0)>>>1>>>0>>>0);k=~~(y*+S(+(+(c[11262]|0)*.0017453292519944445)))+b|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;aI(n|0,1,4,c[10030]|0);a[m]=u>>>24&255;a[j]=u>>>16&255;a[s]=u>>>8&255;a[n]=u&255;aI(n|0,1,4,c[10030]|0);a[m]=0;a[j]=0;a[s]=0;a[n]=76;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);g=(x|0)>0;do{if(((c[11252]|0)-14|0)>>>0<2){if(g){k=0;do{if((k|0)<(w|0)){z=a[t+k|0]|0}else{z=0}aF(z|0,c[10030]|0);k=k+1|0;}while((k|0)<(x|0))}uu(t)}else{if(g){A=0}else{break}do{if((A|0)<(w|0)){B=a[e+A|0]|0}else{B=0}aF(B|0,c[10030]|0);A=A+1|0;}while((A|0)<(x|0))}}while(0);if((u|0)>0){x=0;do{a[m]=0;a[j]=0;a[s]=1;a[n]=44;aI(n|0,1,4,c[10030]|0);x=x+1|0;}while((x|0)<(u|0))}c[11296]=-2e3;c[11298]=-2e3;i=f;return}function n0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0;f=i;i=i+8|0;g=f|0;h=g;j=i;i=i+144|0;k=j|0;c[j+8>>2]=1601;tN();l=c[11554]|0;c[11554]=0;c[11552]=(c[11552]|0)+1;if((e-69|0)>>>0<5){m=c[11562]|0;c[11562]=c[11564];if((e|0)==71){n0(b,d,8);c[11562]=m;n0(b,d,7);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==73){n0(b,d,12);c[11562]=m;n0(b,d,11);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==69){n0(b,d,4);c[11562]=m;n0(b,d,3);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==70){n0(b,d,6);c[11562]=m;n0(b,d,5);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==72){n0(b,d,10);c[11562]=m;n0(b,d,9);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else{c[11562]=m;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}}m=c[3524]|0;if((c[m+8>>2]|0)>>>0>b>>>0){if((c[m+12>>2]|0)>>>0>d>>>0){p=d;q=b;r=m}else{s=13753}}else{s=13753}if((s|0)==13753){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);m=c[3524]|0;t=c[m+8>>2]|0;u=c[m+12>>2]|0;p=u>>>0>d>>>0?d:u;q=t>>>0>b>>>0?b:t;r=m}if((q|0)==(c[11298]|0)&(p|0)==(c[11296]|0)){w=r}else{tN();c[11298]=q;c[11296]=p;w=c[3524]|0}r=b+1|0;if((c[w+8>>2]|0)>>>0>r>>>0){if((c[w+12>>2]|0)>>>0>d>>>0){x=q;y=p}else{s=13758}}else{s=13758}if((s|0)==13758){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=d,v)|0);x=c[11298]|0;y=c[11296]|0}if(!((x|0)==(r|0)&(y|0)==(d|0))){y=c[11560]|0;if((y<<1|0)>102){tN();z=c[11560]|0}else{z=y}if((z|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;A=1}else{A=z}z=A<<1;c[45200+(z<<2)>>2]=r;c[11298]=r;c[45200+((z|1)<<2)>>2]=d;c[11296]=d;c[11560]=A+1}A=(e|0)%13&-1;if((A|0)==10){c[j>>2]=b;c[j+4>>2]=d-(c[11274]|0);e=c[11276]|0;c[j+12>>2]=b-e;z=(c[11270]|0)+d|0;c[j+16>>2]=z;c[j+24>>2]=e+b;c[j+28>>2]=z;n9(3,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==11){z=b-(c[11278]|0)|0;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>z>>>0){if((c[e+12>>2]|0)>>>0>d>>>0){B=d;C=z;D=r;E=d;F=e}else{s=13949}}else{s=13949}if((s|0)==13949){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=z,c[v+8>>2]=d,v)|0);e=c[3524]|0;y=c[e+8>>2]|0;x=c[e+12>>2]|0;B=x>>>0>d>>>0?d:x;C=y>>>0>z>>>0?z:y;D=c[11298]|0;E=c[11296]|0;F=e}if((C|0)==(D|0)&(B|0)==(E|0)){G=F;H=D;I=E}else{tN();c[11298]=C;c[11296]=B;G=c[3524]|0;H=C;I=B}B=d-(c[11278]|0)|0;if((c[G+8>>2]|0)>>>0>b>>>0){if((c[G+12>>2]|0)>>>0>B>>>0){J=H;K=I}else{s=13954}}else{s=13954}if((s|0)==13954){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=B,v)|0);J=c[11298]|0;K=c[11296]|0}if(!((J|0)==(b|0)&(K|0)==(B|0))){K=c[11560]|0;if((K<<1|0)>102){tN();L=c[11560]|0}else{L=K}if((L|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;M=1}else{M=L}L=M<<1;c[45200+(L<<2)>>2]=b;c[11298]=b;c[45200+((L|1)<<2)>>2]=B;c[11296]=B;c[11560]=M+1}M=(c[11278]|0)+b|0;L=c[3524]|0;if((c[L+8>>2]|0)>>>0>M>>>0){if((c[L+12>>2]|0)>>>0>d>>>0){N=b;O=B}else{s=13963}}else{s=13963}if((s|0)==13963){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=M,c[v+8>>2]=d,v)|0);N=c[11298]|0;O=c[11296]|0}if(!((N|0)==(M|0)&(O|0)==(d|0))){O=c[11560]|0;if((O<<1|0)>102){tN();P=c[11560]|0}else{P=O}if((P|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;Q=1}else{Q=P}P=Q<<1;c[45200+(P<<2)>>2]=M;c[11298]=M;c[45200+((P|1)<<2)>>2]=d;c[11296]=d;c[11560]=Q+1}Q=(c[11278]|0)+d|0;P=c[3524]|0;if((c[P+8>>2]|0)>>>0>b>>>0){if((c[P+12>>2]|0)>>>0>Q>>>0){R=M;S=d}else{s=13972}}else{s=13972}if((s|0)==13972){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=Q,v)|0);R=c[11298]|0;S=c[11296]|0}if(!((R|0)==(b|0)&(S|0)==(Q|0))){S=c[11560]|0;if((S<<1|0)>102){tN();T=c[11560]|0}else{T=S}if((T|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;U=1}else{U=T}T=U<<1;c[45200+(T<<2)>>2]=b;c[11298]=b;c[45200+((T|1)<<2)>>2]=Q;c[11296]=Q;c[11560]=U+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==12){U=c[11278]|0;c[j>>2]=b-U;c[j+4>>2]=d;c[j+12>>2]=b;c[j+16>>2]=d-U;c[j+24>>2]=U+b;c[j+28>>2]=d;c[j+36>>2]=b;c[j+40>>2]=U+d;n9(4,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==4){U=c[11268]|0;Q=b-U|0;c[j>>2]=Q;T=d-U|0;c[j+4>>2]=T;S=U+b|0;c[j+12>>2]=S;c[j+16>>2]=T;c[j+24>>2]=S;S=U+d|0;c[j+28>>2]=S;c[j+36>>2]=Q;c[j+40>>2]=S;n9(4,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==5){S=(c[(c[3524]|0)+12>>2]|0)-d|0;Q=g;U=h+3|0;a[U]=0;T=h+2|0;a[T]=0;R=h+1|0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=-128;a[T]=0;a[R]=0;a[Q]=7;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=-128;a[T]=0;a[R]=0;a[Q]=0;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=40;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=3;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=39;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=24;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=3;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);c[g>>2]=0;aI(Q|0,1,4,c[10030]|0);c[g>>2]=0;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=3;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=40;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=38;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=28;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);M=a[45616]|0;a[U]=0;a[T]=0;a[R]=M?0:34;a[Q]=0;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);c[g>>2]=0;aI(Q|0,1,4,c[10030]|0);M=c[11562]|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=42;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=24;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;M=b-(c[11278]|0)|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);M=S-(c[11278]|0)|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);M=(c[11278]|0)+b|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);M=(c[11278]|0)+S|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==6){Q=(c[(c[3524]|0)+12>>2]|0)-d|0;M=g;R=h+3|0;a[R]=0;T=h+2|0;a[T]=0;U=h+1|0;a[U]=0;a[M]=37;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=12;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=-128;a[T]=0;a[U]=0;a[M]=0;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=40;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=12;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=0;a[T]=0;a[U]=0;a[M]=3;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=39;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=24;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=0;a[T]=0;a[U]=0;a[M]=3;aI(M|0,1,4,c[10030]|0);c[g>>2]=0;aI(M|0,1,4,c[10030]|0);h=c[11562]|0;a[R]=h>>>24&255;a[T]=h>>>16&255;a[U]=h>>>8&255;a[M]=h&255;aI(M|0,1,4,c[10030]|0);c[g>>2]=0;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=37;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=12;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=0;a[T]=0;a[U]=0;a[M]=3;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=42;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=24;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;g=b-(c[11278]|0)|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);g=Q-(c[11278]|0)|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);g=(c[11278]|0)+b|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);g=(c[11278]|0)+Q|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==7){M=(c[11274]|0)+d|0;g=c[3524]|0;if((c[g+8>>2]|0)>>>0>b>>>0){if((c[g+12>>2]|0)>>>0>M>>>0){V=b;W=M;s=13902}else{s=13901}}else{s=13901}if((s|0)==13901){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=M,v)|0);g=c[3524]|0;U=c[g+8>>2]|0;T=U>>>0>b>>>0?b:U;U=c[g+12>>2]|0;R=U>>>0>M>>>0?M:U;U=c[11298]|0;M=c[11296]|0;if((T|0)==(U|0)&(R|0)==(M|0)){X=g;Y=U;Z=M}else{V=T;W=R;s=13902}}if((s|0)==13902){tN();c[11298]=V;c[11296]=W;X=c[3524]|0;Y=V;Z=W}W=b-(c[11276]|0)|0;V=d-(c[11270]|0)|0;if((c[X+8>>2]|0)>>>0>W>>>0){if((c[X+12>>2]|0)>>>0>V>>>0){_=Y;$=Z}else{s=13905}}else{s=13905}if((s|0)==13905){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=W,c[v+8>>2]=V,v)|0);_=c[11298]|0;$=c[11296]|0}if(!((_|0)==(W|0)&($|0)==(V|0))){$=c[11560]|0;if(($<<1|0)>102){tN();aa=c[11560]|0}else{aa=$}if((aa|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ab=1}else{ab=aa}aa=ab<<1;c[45200+(aa<<2)>>2]=W;c[11298]=W;c[45200+((aa|1)<<2)>>2]=V;c[11296]=V;c[11560]=ab+1}ab=(c[11276]|0)+b|0;aa=d-(c[11270]|0)|0;$=c[3524]|0;if((c[$+8>>2]|0)>>>0>ab>>>0){if((c[$+12>>2]|0)>>>0>aa>>>0){ac=W;ad=V}else{s=13914}}else{s=13914}if((s|0)==13914){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=ab,c[v+8>>2]=aa,v)|0);ac=c[11298]|0;ad=c[11296]|0}if(!((ac|0)==(ab|0)&(ad|0)==(aa|0))){ad=c[11560]|0;if((ad<<1|0)>102){tN();ae=c[11560]|0}else{ae=ad}if((ae|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;af=1}else{af=ae}ae=af<<1;c[45200+(ae<<2)>>2]=ab;c[11298]=ab;c[45200+((ae|1)<<2)>>2]=aa;c[11296]=aa;c[11560]=af+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==1){af=c[11268]|0;aa=b-af|0;ae=d-af|0;af=c[3524]|0;if((c[af+8>>2]|0)>>>0>aa>>>0){if((c[af+12>>2]|0)>>>0>ae>>>0){ag=ae;ah=aa;ai=r;aj=d;ak=af}else{s=13796}}else{s=13796}if((s|0)==13796){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=aa,c[v+8>>2]=ae,v)|0);af=c[3524]|0;ab=c[af+8>>2]|0;ad=c[af+12>>2]|0;ag=ad>>>0>ae>>>0?ae:ad;ah=ab>>>0>aa>>>0?aa:ab;ai=c[11298]|0;aj=c[11296]|0;ak=af}if((ah|0)==(ai|0)&(ag|0)==(aj|0)){al=ak;am=ai;an=aj}else{tN();c[11298]=ah;c[11296]=ag;al=c[3524]|0;am=ah;an=ag}ag=c[11268]|0;ah=ag+b|0;aj=ag+d|0;if((c[al+8>>2]|0)>>>0>ah>>>0){if((c[al+12>>2]|0)>>>0>aj>>>0){ao=am;ap=an}else{s=13801}}else{s=13801}if((s|0)==13801){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=ah,c[v+8>>2]=aj,v)|0);ao=c[11298]|0;ap=c[11296]|0}if(!((ao|0)==(ah|0)&(ap|0)==(aj|0))){ap=c[11560]|0;if((ap<<1|0)>102){tN();aq=c[11560]|0}else{aq=ap}if((aq|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ar=1}else{ar=aq}aq=ar<<1;c[45200+(aq<<2)>>2]=ah;c[11298]=ah;c[45200+((aq|1)<<2)>>2]=aj;c[11296]=aj;c[11560]=ar+1}ar=c[11268]|0;aq=b-ar|0;ap=ar+d|0;ar=c[3524]|0;if((c[ar+8>>2]|0)>>>0>aq>>>0){if((c[ar+12>>2]|0)>>>0>ap>>>0){as=ap;at=aq;au=ah;av=aj;aw=ar}else{s=13810}}else{s=13810}if((s|0)==13810){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=aq,c[v+8>>2]=ap,v)|0);ar=c[3524]|0;aj=c[ar+8>>2]|0;ah=c[ar+12>>2]|0;as=ah>>>0>ap>>>0?ap:ah;at=aj>>>0>aq>>>0?aq:aj;au=c[11298]|0;av=c[11296]|0;aw=ar}if((at|0)==(au|0)&(as|0)==(av|0)){ax=aw;ay=au;az=av}else{tN();c[11298]=at;c[11296]=as;ax=c[3524]|0;ay=at;az=as}as=c[11268]|0;at=as+b|0;av=d-as|0;if((c[ax+8>>2]|0)>>>0>at>>>0){if((c[ax+12>>2]|0)>>>0>av>>>0){aA=ay;aB=az}else{s=13815}}else{s=13815}if((s|0)==13815){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=at,c[v+8>>2]=av,v)|0);aA=c[11298]|0;aB=c[11296]|0}if((aA|0)==(at|0)&(aB|0)==(av|0)){c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}aB=c[11560]|0;if((aB<<1|0)>102){tN();aC=c[11560]|0}else{aC=aB}if((aC|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;aD=1}else{aD=aC}aC=aD<<1;c[45200+(aC<<2)>>2]=at;c[11298]=at;c[45200+((aC|1)<<2)>>2]=av;c[11296]=av;c[11560]=aD+1;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==8){c[j>>2]=b;c[j+4>>2]=(c[11274]|0)+d;aD=c[11276]|0;c[j+12>>2]=b-aD;av=d-(c[11270]|0)|0;c[j+16>>2]=av;c[j+24>>2]=aD+b;c[j+28>>2]=av;n9(3,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==9){k=d-(c[11274]|0)|0;av=c[3524]|0;if((c[av+8>>2]|0)>>>0>b>>>0){if((c[av+12>>2]|0)>>>0>k>>>0){aE=b;aF=k;s=13926}else{s=13925}}else{s=13925}if((s|0)==13925){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=k,v)|0);av=c[3524]|0;j=c[av+8>>2]|0;aD=j>>>0>b>>>0?b:j;j=c[av+12>>2]|0;aC=j>>>0>k>>>0?k:j;j=c[11298]|0;k=c[11296]|0;if((aD|0)==(j|0)&(aC|0)==(k|0)){aG=av;aH=j;aJ=k}else{aE=aD;aF=aC;s=13926}}if((s|0)==13926){tN();c[11298]=aE;c[11296]=aF;aG=c[3524]|0;aH=aE;aJ=aF}aF=b-(c[11276]|0)|0;aE=(c[11270]|0)+d|0;if((c[aG+8>>2]|0)>>>0>aF>>>0){if((c[aG+12>>2]|0)>>>0>aE>>>0){aK=aH;aL=aJ}else{s=13929}}else{s=13929}if((s|0)==13929){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=aF,c[v+8>>2]=aE,v)|0);aK=c[11298]|0;aL=c[11296]|0}if(!((aK|0)==(aF|0)&(aL|0)==(aE|0))){aL=c[11560]|0;if((aL<<1|0)>102){tN();aM=c[11560]|0}else{aM=aL}if((aM|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;aN=1}else{aN=aM}aM=aN<<1;c[45200+(aM<<2)>>2]=aF;c[11298]=aF;c[45200+((aM|1)<<2)>>2]=aE;c[11296]=aE;c[11560]=aN+1}aN=(c[11276]|0)+b|0;aM=(c[11270]|0)+d|0;aL=c[3524]|0;if((c[aL+8>>2]|0)>>>0>aN>>>0){if((c[aL+12>>2]|0)>>>0>aM>>>0){aO=aF;aP=aE}else{s=13938}}else{s=13938}if((s|0)==13938){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=aN,c[v+8>>2]=aM,v)|0);aO=c[11298]|0;aP=c[11296]|0}if(!((aO|0)==(aN|0)&(aP|0)==(aM|0))){aP=c[11560]|0;if((aP<<1|0)>102){tN();aQ=c[11560]|0}else{aQ=aP}if((aQ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;aR=1}else{aR=aQ}aQ=aR<<1;c[45200+(aQ<<2)>>2]=aN;c[11298]=aN;c[45200+((aQ|1)<<2)>>2]=aM;c[11296]=aM;c[11560]=aR+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==2){aR=d-(c[11278]|0)|0;aM=c[3524]|0;if((c[aM+8>>2]|0)>>>0>b>>>0){if((c[aM+12>>2]|0)>>>0>aR>>>0){aS=b;aT=aR;s=13825}else{s=13824}}else{s=13824}if((s|0)==13824){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=aR,v)|0);aM=c[3524]|0;aQ=c[aM+8>>2]|0;aN=aQ>>>0>b>>>0?b:aQ;aQ=c[aM+12>>2]|0;aP=aQ>>>0>aR>>>0?aR:aQ;aQ=c[11298]|0;aR=c[11296]|0;if((aN|0)==(aQ|0)&(aP|0)==(aR|0)){aU=aM;aV=aQ;aW=aR}else{aS=aN;aT=aP;s=13825}}if((s|0)==13825){tN();c[11298]=aS;c[11296]=aT;aU=c[3524]|0;aV=aS;aW=aT}aT=(c[11278]|0)+d|0;if((c[aU+8>>2]|0)>>>0>b>>>0){if((c[aU+12>>2]|0)>>>0>aT>>>0){aX=aV;aY=aW}else{s=13828}}else{s=13828}if((s|0)==13828){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=aT,v)|0);aX=c[11298]|0;aY=c[11296]|0}if(!((aX|0)==(b|0)&(aY|0)==(aT|0))){aY=c[11560]|0;if((aY<<1|0)>102){tN();aZ=c[11560]|0}else{aZ=aY}if((aZ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;a_=1}else{a_=aZ}aZ=a_<<1;c[45200+(aZ<<2)>>2]=b;c[11298]=b;c[45200+((aZ|1)<<2)>>2]=aT;c[11296]=aT;c[11560]=a_+1}a_=(c[11266]|0)+b|0;aZ=d-(c[11272]|0)|0;aY=c[3524]|0;if((c[aY+8>>2]|0)>>>0>a_>>>0){if((c[aY+12>>2]|0)>>>0>aZ>>>0){a$=aZ;a0=a_;a1=b;a2=aT;a3=aY}else{s=13837}}else{s=13837}if((s|0)==13837){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=a_,c[v+8>>2]=aZ,v)|0);aY=c[3524]|0;aT=c[aY+8>>2]|0;aX=c[aY+12>>2]|0;a$=aX>>>0>aZ>>>0?aZ:aX;a0=aT>>>0>a_>>>0?a_:aT;a1=c[11298]|0;a2=c[11296]|0;a3=aY}if((a0|0)==(a1|0)&(a$|0)==(a2|0)){a4=a3;a5=a1;a6=a2}else{tN();c[11298]=a0;c[11296]=a$;a4=c[3524]|0;a5=a0;a6=a$}a$=b-(c[11266]|0)|0;a0=(c[11272]|0)+d|0;if((c[a4+8>>2]|0)>>>0>a$>>>0){if((c[a4+12>>2]|0)>>>0>a0>>>0){a7=a5;a8=a6}else{s=13842}}else{s=13842}if((s|0)==13842){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=a$,c[v+8>>2]=a0,v)|0);a7=c[11298]|0;a8=c[11296]|0}if(!((a7|0)==(a$|0)&(a8|0)==(a0|0))){a8=c[11560]|0;if((a8<<1|0)>102){tN();a9=c[11560]|0}else{a9=a8}if((a9|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ba=1}else{ba=a9}a9=ba<<1;c[45200+(a9<<2)>>2]=a$;c[11298]=a$;c[45200+((a9|1)<<2)>>2]=a0;c[11296]=a0;c[11560]=ba+1}ba=(c[11266]|0)+b|0;a9=(c[11272]|0)+d|0;a8=c[3524]|0;if((c[a8+8>>2]|0)>>>0>ba>>>0){if((c[a8+12>>2]|0)>>>0>a9>>>0){bb=a9;bc=ba;bd=a$;be=a0;bf=a8}else{s=13851}}else{s=13851}if((s|0)==13851){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=ba,c[v+8>>2]=a9,v)|0);a8=c[3524]|0;a0=c[a8+8>>2]|0;a$=c[a8+12>>2]|0;bb=a$>>>0>a9>>>0?a9:a$;bc=a0>>>0>ba>>>0?ba:a0;bd=c[11298]|0;be=c[11296]|0;bf=a8}if((bc|0)==(bd|0)&(bb|0)==(be|0)){bg=bf;bh=bd;bi=be}else{tN();c[11298]=bc;c[11296]=bb;bg=c[3524]|0;bh=bc;bi=bb}bb=b-(c[11266]|0)|0;bc=d-(c[11272]|0)|0;if((c[bg+8>>2]|0)>>>0>bb>>>0){if((c[bg+12>>2]|0)>>>0>bc>>>0){bj=bh;bk=bi}else{s=13856}}else{s=13856}if((s|0)==13856){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bb,c[v+8>>2]=bc,v)|0);bj=c[11298]|0;bk=c[11296]|0}if((bj|0)==(bb|0)&(bk|0)==(bc|0)){c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}bk=c[11560]|0;if((bk<<1|0)>102){tN();bl=c[11560]|0}else{bl=bk}if((bl|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;bm=1}else{bm=bl}bl=bm<<1;c[45200+(bl<<2)>>2]=bb;c[11298]=bb;c[45200+((bl|1)<<2)>>2]=bc;c[11296]=bc;c[11560]=bm+1;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==0){bm=b-(c[11278]|0)|0;bc=c[3524]|0;if((c[bc+8>>2]|0)>>>0>bm>>>0){if((c[bc+12>>2]|0)>>>0>d>>>0){bn=d;bo=bm;bp=r;bq=d;br=bc}else{s=13768}}else{s=13768}if((s|0)==13768){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=bm,c[v+8>>2]=d,v)|0);bc=c[3524]|0;bl=c[bc+8>>2]|0;bb=c[bc+12>>2]|0;bn=bb>>>0>d>>>0?d:bb;bo=bl>>>0>bm>>>0?bm:bl;bp=c[11298]|0;bq=c[11296]|0;br=bc}if((bo|0)==(bp|0)&(bn|0)==(bq|0)){bs=br;bt=bp;bu=bq}else{tN();c[11298]=bo;c[11296]=bn;bs=c[3524]|0;bt=bo;bu=bn}bn=(c[11278]|0)+b|0;if((c[bs+8>>2]|0)>>>0>bn>>>0){if((c[bs+12>>2]|0)>>>0>d>>>0){bv=bt;bw=bu}else{s=13773}}else{s=13773}if((s|0)==13773){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bn,c[v+8>>2]=d,v)|0);bv=c[11298]|0;bw=c[11296]|0}if(!((bv|0)==(bn|0)&(bw|0)==(d|0))){bw=c[11560]|0;if((bw<<1|0)>102){tN();bx=c[11560]|0}else{bx=bw}if((bx|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;by=1}else{by=bx}bx=by<<1;c[45200+(bx<<2)>>2]=bn;c[11298]=bn;c[45200+((bx|1)<<2)>>2]=d;c[11296]=d;c[11560]=by+1}by=d-(c[11278]|0)|0;bx=c[3524]|0;if((c[bx+8>>2]|0)>>>0>b>>>0){if((c[bx+12>>2]|0)>>>0>by>>>0){bz=by;bA=b;bB=bn;bC=d;bD=bx}else{s=13782}}else{s=13782}if((s|0)==13782){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=by,v)|0);bx=c[3524]|0;bn=c[bx+8>>2]|0;bw=c[bx+12>>2]|0;bz=bw>>>0>by>>>0?by:bw;bA=bn>>>0>b>>>0?b:bn;bB=c[11298]|0;bC=c[11296]|0;bD=bx}if((bA|0)==(bB|0)&(bz|0)==(bC|0)){bE=bD;bF=bB;bG=bC}else{tN();c[11298]=bA;c[11296]=bz;bE=c[3524]|0;bF=bA;bG=bz}bz=(c[11278]|0)+d|0;if((c[bE+8>>2]|0)>>>0>b>>>0){if((c[bE+12>>2]|0)>>>0>bz>>>0){bH=bF;bI=bG}else{s=13787}}else{s=13787}if((s|0)==13787){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=bz,v)|0);bH=c[11298]|0;bI=c[11296]|0}if((bH|0)==(b|0)&(bI|0)==(bz|0)){c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}bI=c[11560]|0;if((bI<<1|0)>102){tN();bJ=c[11560]|0}else{bJ=bI}if((bJ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;bK=1}else{bK=bJ}bJ=bK<<1;c[45200+(bJ<<2)>>2]=b;c[11298]=b;c[45200+((bJ|1)<<2)>>2]=bz;c[11296]=bz;c[11560]=bK+1;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==3){A=c[11268]|0;bK=b-A|0;bz=d-A|0;A=c[3524]|0;if((c[A+8>>2]|0)>>>0>bK>>>0){if((c[A+12>>2]|0)>>>0>bz>>>0){bL=bz;bM=bK;bN=r;bO=d;bP=A}else{s=13865}}else{s=13865}if((s|0)==13865){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=bK,c[v+8>>2]=bz,v)|0);A=c[3524]|0;r=c[A+8>>2]|0;bJ=c[A+12>>2]|0;bL=bJ>>>0>bz>>>0?bz:bJ;bM=r>>>0>bK>>>0?bK:r;bN=c[11298]|0;bO=c[11296]|0;bP=A}if((bM|0)==(bN|0)&(bL|0)==(bO|0)){bQ=bP;bR=bN;bS=bO}else{tN();c[11298]=bM;c[11296]=bL;bQ=c[3524]|0;bR=bM;bS=bL}bL=c[11268]|0;bM=bL+b|0;bO=d-bL|0;if((c[bQ+8>>2]|0)>>>0>bM>>>0){if((c[bQ+12>>2]|0)>>>0>bO>>>0){bT=bR;bU=bS}else{s=13870}}else{s=13870}if((s|0)==13870){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bM,c[v+8>>2]=bO,v)|0);bT=c[11298]|0;bU=c[11296]|0}if(!((bT|0)==(bM|0)&(bU|0)==(bO|0))){bU=c[11560]|0;if((bU<<1|0)>102){tN();bV=c[11560]|0}else{bV=bU}if((bV|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;bW=1}else{bW=bV}bV=bW<<1;c[45200+(bV<<2)>>2]=bM;c[11298]=bM;c[45200+((bV|1)<<2)>>2]=bO;c[11296]=bO;c[11560]=bW+1}bW=c[11268]|0;bV=bW+b|0;bU=bW+d|0;bW=c[3524]|0;if((c[bW+8>>2]|0)>>>0>bV>>>0){if((c[bW+12>>2]|0)>>>0>bU>>>0){bX=bM;bY=bO}else{s=13879}}else{s=13879}if((s|0)==13879){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bV,c[v+8>>2]=bU,v)|0);bX=c[11298]|0;bY=c[11296]|0}if(!((bX|0)==(bV|0)&(bY|0)==(bU|0))){bY=c[11560]|0;if((bY<<1|0)>102){tN();bZ=c[11560]|0}else{bZ=bY}if((bZ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;b_=1}else{b_=bZ}bZ=b_<<1;c[45200+(bZ<<2)>>2]=bV;c[11298]=bV;c[45200+((bZ|1)<<2)>>2]=bU;c[11296]=bU;c[11560]=b_+1}b_=c[11268]|0;bZ=b-b_|0;b=b_+d|0;d=c[3524]|0;if((c[d+8>>2]|0)>>>0>bZ>>>0){if((c[d+12>>2]|0)>>>0>b>>>0){b$=bV;b0=bU}else{s=13888}}else{s=13888}if((s|0)==13888){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bZ,c[v+8>>2]=b,v)|0);b$=c[11298]|0;b0=c[11296]|0}if(!((b$|0)==(bZ|0)&(b0|0)==(b|0))){b0=c[11560]|0;if((b0<<1|0)>102){tN();b1=c[11560]|0}else{b1=b0}if((b1|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;b2=1}else{b2=b1}b1=b2<<1;c[45200+(b1<<2)>>2]=bZ;c[11298]=bZ;c[45200+((b1|1)<<2)>>2]=b;c[11296]=b;c[11560]=b2+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else{c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}}function n1(a){a=a|0;return 0}function n2(){return}function n3(b,d,e,f,i,j){b=b|0;d=+d;e=+e;f=f|0;i=i|0;j=j|0;if((j|0)==3){c[59568]=c[11298];c[59566]=c[11296];return}else if((j|0)==4){c[11298]=c[59568];c[11296]=c[59566];return}else{if(a[238232]|0){return}a[238232]=1;c[11232]=43856;c[59562]=b;g[59560]=d;g[59564]=+h[5710]*e;a[238216]=i&1;c[59556]=j;return}}function n4(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0.0;d=i;i=i+8|0;e=d|0;L19029:do{if((b|0)!=45688){do{if((b|0)!=0){if((a[b]|0)==0){break}f=bk(b|0,148464)|0;do{if((f|0)>0){j=f+1|0;k=(j|0)<32?j:32;uF(45688,b|0,k|0);if((uA(b|0)|0)>>>0<k>>>0){break}a[45688+((k|0)==0?0:k-1|0)|0]=0}}while(0);if(f>>>0>=(uA(b|0)|0)>>>0){break L19029}if((ca(b+(f+1|0)|0,205104,(v=i,i=i+8|0,c[v>>2]=e,v)|0)|0)==0){break L19029}g[11418]=+g[e>>2];break L19029}}while(0);uB(45688,45952);g[11418]=+g[11486]}}while(0);do{if((aY(238560,45688)|0)==0){if(+g[59638]!=+g[11418]){break}i=d;return 1}}while(0);uF(238560,45688,256);if((uA(45688)|0)>>>0>=256){a[238815]=0}l=+g[11418];g[59638]=l;c[(c[3524]|0)+20>>2]=~~(+h[5710]*l*35.28*.6);c[(c[3524]|0)+16>>2]=~~(+h[5710]*+g[11418]*35.28*1.3);tO();i=d;return 1}function n5(a){a=+a;var b=0;b=~~((a<0.0?1.0:a)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));c[11278]=b;c[11268]=~~+O(+(+(b|0)*.707+.5));c[11266]=(b*13&-1|0)/15&-1;c[11272]=(b|0)/2&-1;c[11274]=(b*36&-1|0)/29&-1;c[11276]=(b*14&-1|0)/13&-1;c[11270]=(b*18&-1|0)/29&-1;return}function n6(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+48|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+8>>2]=a;n9(4,h|0);i=g;return}function n7(a){a=+a;var b=0.0;tN();b=+h[5704]*a;if(b==+h[5705]){return}h[5705]=b;c[11552]=(c[11552]|0)+1;return}function n8(b){b=b|0;var e=0,f=0,g=0,j=0,k=0;e=i;i=i+8|0;f=e|0;tN();g=c[b>>2]|0;if((g|0)==5){fr(+h[b+8>>3],f);c[11562]=(d[f+1|0]|0)<<8|(d[f|0]|0)|(d[f+2|0]|0)<<16}else if((g|0)==3){f=c[b+4>>2]|0;c[11562]=f>>>16&255|f&65280|f<<16&16711680}else if((g|0)==1){g=c[b+4>>2]|0;if((g|0)==-4){j=46256}else{if((g|0)<0|a[45624]){k=7}else{k=(g|0)%15&-1}j=238816+(k<<2)|0}c[11562]=c[j>>2];tN()}c[11554]=c[11412];c[11552]=(c[11552]|0)+1;i=e;return}function n9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0;e=i;i=i+8|0;f=e|0;g=f;h=c[11562]|0;j=c[d+8>>2]|0;k=j>>4;l=j&15;j=h&255;m=h>>>8;n=m&255;o=h>>>16;p=o&255;q=h>>>24&255;if((l|0)==0){r=c[11564]|0;s=r>>>24&255;t=r>>>16&255;u=r>>>8&255;v=r&255}else if((l|0)==2){w=k*12&-1;x=14054}else if((l|0)==1){w=k;x=14054}else{s=q;t=p;u=n;v=j}do{if((x|0)==14054){if(w>>>0>=100){s=q;t=p;u=n;v=j;break}y=+(w|0)/100.0;k=((~~(y*+(h&255|0))+(~~((1.0-y)*255.0)*65793&-1)|0)+(~~(y*+(m&255|0))<<8)|0)+(~~(y*+(o&255|0))<<16)|0;s=k>>>24&255;t=k>>>16&255;u=k>>>8&255;v=k&255}}while(0);if((c[11552]|0)>0){tL(c[11554]|0);c[11552]=0}o=f;m=g+3|0;a[m]=0;h=g+2|0;a[h]=0;w=g+1|0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=-128;a[h]=0;a[w]=0;a[o]=7;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=-128;a[h]=0;a[w]=0;a[o]=0;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=40;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=39;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=24;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=s;a[h]=t;a[w]=u;a[o]=v;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=40;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=38;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=28;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);g=a[45616]|0;a[m]=0;a[h]=0;a[w]=g?0:34;a[o]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=s;a[h]=t;a[w]=u;a[o]=v;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);v=(b<<3)+28|0;a[m]=v>>>24&255;a[h]=v>>>16&255;a[w]=v>>>8&255;a[o]=v&255;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=b>>>24&255;a[h]=b>>>16&255;a[w]=b>>>8&255;a[o]=b&255;aI(o|0,1,4,c[10030]|0);if((b|0)>0){z=0}else{c[11412]=-5;c[11554]=-5;i=e;return}do{f=c[d+(z*12&-1)>>2]|0;a[m]=f>>>24&255;a[h]=f>>>16&255;a[w]=f>>>8&255;a[o]=f&255;aI(o|0,1,4,c[10030]|0);f=(c[(c[3524]|0)+12>>2]|0)-(c[d+(z*12&-1)+4>>2]|0)|0;a[m]=f>>>24&255;a[h]=f>>>16&255;a[w]=f>>>8&255;a[o]=f&255;aI(o|0,1,4,c[10030]|0);z=z+1|0;}while((z|0)<(b|0));c[11412]=-5;c[11554]=-5;i=e;return}function oa(){var b=0,d=0,e=0,f=0.0,h=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+256|0;if(!(a[238232]|0)){i=b;return}a[c[11232]|0]=0;a[238232]=0;d=c[11298]|0;e=c[11296]|0;f=+g[11418];h=b|0;uB(h|0,45688);g[11418]=+g[59560];n4(c[59562]|0);g[11418]=f;uB(45688,h|0);h=b4(43856,73808)|0;if((h|0)>0){f=+(aa(c[(c[3524]|0)+20>>2]|0,h)>>>0>>>0)*.8;j=c[11262]|0;k=+(j|0)*.0017453292519944445;l=~~(+(d>>>0>>>0)+ +S(+k)*f);m=~~(+(e>>>0>>>0)+ +T(+k)*f);c[11298]=l;c[11296]=m;n=l;o=m;p=h+43856|0;q=j}else{n=d;o=e;p=43856;q=c[11262]|0}f=+(q|0)*.0017453292519944445;k=+T(+f);r=+g[59564];q=~~(k*r*26.37);e=~~(+S(+f)*r*26.37);do{if((a[238216]&1)!=0){if(a[238208]|0){break}n$(n-q|0,e+o|0,p)}}while(0);r=+((uA(p|0)|0)>>>0>>>0);if(a[45056]|0){s=r*.8*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}else{e=a[p]|0;L19099:do{if(e<<24>>24==0){t=0;u=0}else{q=uA(p|0)|0;d=1;j=0;h=0;m=e;while(1){l=m<<24>>24;v=((aZ(171640,l|0,18)|0)!=0&1)+j|0;if((m-65&255)<26){w=14075}else{if((aZ(171632,l|0,5)|0)==0){x=h}else{w=14075}}if((w|0)==14075){w=0;x=h+1|0}y=v+((aZ(171608,l|0,10)|0)!=0&1)|0;if(d>>>0>=q>>>0){t=y;u=x;break L19099}l=a[p+d|0]|0;d=d+1|0;j=y;h=x;m=l}}}while(0);s=(+(-t|0)*.2+(r*.8+ +(u|0)*.3))*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}r=+(~~s|0);s=+(c[11262]|0)*.0017453292519944445;f=+S(+s);u=~~(+(n>>>0>>>0)+r*f);c[11298]=u;k=+T(+s);n=~~(+(o>>>0>>>0)+r*k);c[11296]=n;if((c[59556]|0)!=1){i=b;return}s=r*.5;c[11298]=~~(+(u|0)-s*f);c[11296]=~~(+(n|0)-s*k);i=b;return}function ob(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0.0,ac=0.0,ad=0,ae=0,af=0.0,ag=0,ah=0.0,ai=0,aj=0.0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0.0,ar=0,as=0.0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0,aH=0,aI=0,aJ=0;b=i;i=i+424|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=b+96|0;k=b+120|0;l=b+144|0;m=b+168|0;n=c[13898]|0;o=c[8272]|0;L19117:do{if((n|0)<(o|0)){p=l|0;q=l+8|0;r=k|0;s=k+8|0;t=j|0;u=j+8|0;w=g|0;x=g+8|0;y=f|0;z=f+8|0;A=e|0;B=e+8|0;C=d|0;D=d+8|0;E=0.0;F=0.0;G=n;H=o;L19119:while(1){I=c[1054]|0;J=(a[I+(G*40&-1)|0]&1)==0;L19121:do{if(!J){K=c[I+(G*40&-1)+36>>2]|0;L=I+(G*40&-1)+32|0;M=c[10036]|0;N=0;while(1){if((N|0)>=(K|0)){break}if((a[M+((c[L>>2]|0)+N|0)|0]|0)==(a[N+103664|0]|0)){N=N+1|0}else{break L19121}}if((N|0)==1){O=E;P=F;break L19117}}}while(0);L=c[59286]|0;L19128:do{if((L|0)==0){Q=237144}else{M=c[I+(G*40&-1)+36>>2]|0;K=c[I+(G*40&-1)+32>>2]|0;R=(M|0)>0;S=c[10036]|0;T=237144;U=L;while(1){L19132:do{if(!J){if(R){V=0;W=0;X=K;while(1){Y=a[U+V|0]|0;if(Y<<24>>24==(a[S+(V+X|0)|0]|0)){Z=X;_=W}else{if(Y<<24>>24!=36){break L19132}Z=X-1|0;_=1}$=V+1|0;if(($|0)<(_+M|0)){V=$;W=_;X=Z}else{break}}if((_|0)==0){aa=$}else{Q=T;break L19128}}else{aa=0}X=a[U+aa|0]|0;if((X<<24>>24|0)==36|(X<<24>>24|0)==0){Q=T;break L19128}}}while(0);X=T+8|0;W=c[X>>2]|0;if((W|0)==0){Q=X;break}else{T=X;U=W}}}}while(0);J=c[Q+4>>2]|0;do{if((J|0)==0){a[237032]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==1){a[237032]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==17){c[59264]=c[59264]&-7|2;c[59444]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==16){c[59264]=4;c[13898]=G+1;ab=F;ac=E}else if((J|0)==19){c[59264]=c[59264]|1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==3){a[237464]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==7){a[237096]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==8){ad=G+1|0;c[13898]=ad;if((ad|0)>=(H|0)){ae=14288;break L19119}L19155:do{if((a[I+(ad*40&-1)|0]&1)!=0){L=c[I+(ad*40&-1)+36>>2]|0;U=I+(ad*40&-1)+32|0;T=c[10036]|0;M=0;while(1){if((M|0)>=(L|0)){break}if((a[T+((c[U>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break L19155}}if((M|0)==1){ae=14289;break L19119}}}while(0);U=is(l)|0;T=c[U>>2]|0;if((T|0)==1){af=+(c[U+8>>2]|0)}else if((T|0)==2){af=+h[U+8>>3]}else if((T|0)==3){af=+uz(c[U+8>>2]|0,0)}else{ae=14130;break L19119}if((c[p>>2]|0)==3){uu(c[q>>2]|0);c[p>>2]=1}U=c[13898]|0;T=c[8272]|0;L19170:do{if((T|0)>(U|0)){L=c[1054]|0;if((a[L+(U*40&-1)|0]&1)==0){ag=U;break}S=c[L+(U*40&-1)+36>>2]|0;K=L+(U*40&-1)+32|0;L=c[10036]|0;R=0;while(1){if((R|0)>=(S|0)){break}if((a[L+((c[K>>2]|0)+R|0)|0]|0)==(a[R+148464|0]|0)){R=R+1|0}else{ag=U;break L19170}}if((R|0)!=1){ag=U;break}K=U+1|0;c[13898]=K;ag=K}else{ag=U}}while(0);if((ag|0)>=(T|0)){ae=14286;break L19119}U=c[1054]|0;L19180:do{if((a[U+(ag*40&-1)|0]&1)!=0){K=c[U+(ag*40&-1)+36>>2]|0;L=U+(ag*40&-1)+32|0;S=c[10036]|0;M=0;while(1){if((M|0)>=(K|0)){break}if((a[S+((c[L>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break L19180}}if((M|0)==1){ae=14287;break L19119}}}while(0);U=is(k)|0;T=c[U>>2]|0;if((T|0)==1){ah=+(c[U+8>>2]|0)}else if((T|0)==2){ah=+h[U+8>>3]}else if((T|0)==3){ah=+uz(c[U+8>>2]|0,0)}else{ae=14151;break L19119}if((c[r>>2]|0)==3){uu(c[s>>2]|0);c[r>>2]=1}if(!(af<2.0|ah<2.0|af>99.0|ah>99.0)){ab=af;ac=ah;break}if(af!=0.0|ah!=0.0){ae=14156;break L19119}else{ab=0.0;ac=0.0}}else if((J|0)==18){c[59264]=c[59264]|8;c[13898]=G+1;ab=F;ac=E}else if((J|0)==12){ai=G+1|0;c[13898]=ai;if((ai|0)>=(H|0)){ae=14290;break L19119}L19199:do{if((a[I+(ai*40&-1)|0]&1)!=0){U=c[I+(ai*40&-1)+36>>2]|0;T=I+(ai*40&-1)+32|0;L=c[10036]|0;S=0;while(1){if((S|0)>=(U|0)){break}if((a[L+((c[T>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L19199}}if((S|0)==1){ae=14291;break L19119}}}while(0);T=is(e)|0;L=c[T>>2]|0;if((L|0)==1){aj=+(c[T+8>>2]|0)}else if((L|0)==2){aj=+h[T+8>>3]}else if((L|0)==3){aj=+uz(c[T+8>>2]|0,0)}else{ae=14214;break L19119}if((c[A>>2]|0)==3){uu(c[B>>2]|0);c[A>>2]=1}T=~~aj;c[59446]=T;if(T>>>0>99){ae=14218;break L19119}c[59344]=T;ab=F;ac=E}else if((J|0)==2){a[237464]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==15){a[237072]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==20){ak=G+1|0;c[13898]=ak;if((ak|0)>=(H|0)){ae=14284;break L19119}T=c[I+(ak*40&-1)+36>>2]|0;L19219:do{if((a[I+(ak*40&-1)|0]&1)==0){al=c[10036]|0;am=I+(ak*40&-1)+32|0}else{L=I+(ak*40&-1)+32|0;U=c[10036]|0;M=0;while(1){if((M|0)>=(T|0)){break}if((a[U+((c[L>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{al=U;am=L;break L19219}}if((M|0)==1){ae=14285;break L19119}else{al=U;am=L}}}while(0);S=(T|0)>49?49:T;K=c[am>>2]|0;R=0;while(1){N=R+1|0;a[R+236976|0]=a[al+K|0]|0;if((N|0)==(S|0)){break}else{K=K+1|0;R=N}}a[S+236976|0]=0;an=G+2|0;c[13898]=an;if((aY(236976,173280)|0)==0){ab=F;ac=E;break}if((aY(236976,173088)|0)==0){ab=F;ac=E}else{ae=14249;break L19119}}else if((J|0)==14){a[237072]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==13){ao=G+1|0;c[13898]=ao;if((ao|0)>=(H|0)){ae=14297;break L19119}L19234:do{if((a[I+(ao*40&-1)|0]&1)!=0){R=c[I+(ao*40&-1)+36>>2]|0;K=I+(ao*40&-1)+32|0;T=c[10036]|0;N=0;while(1){if((N|0)>=(R|0)){break}if((a[T+((c[K>>2]|0)+N|0)|0]|0)==(a[N+103664|0]|0)){N=N+1|0}else{break L19234}}if((N|0)==1){ae=14296;break L19119}}}while(0);S=is(d)|0;K=c[S>>2]|0;if((K|0)==2){ap=+h[S+8>>3]}else if((K|0)==3){ap=+uz(c[S+8>>2]|0,0)}else if((K|0)==1){ap=+(c[S+8>>2]|0)}else{ae=14231;break L19119}if((c[C>>2]|0)==3){uu(c[D>>2]|0);c[C>>2]=1}S=~~ap;if((S-2|0)>>>0>=99999){ae=14236;break L19119}c[59278]=S-1;ab=F;ac=E}else if((J|0)==10){c[13898]=G+1;S=is(g)|0;K=c[S>>2]|0;if((K|0)==1){aq=+(c[S+8>>2]|0)}else if((K|0)==2){aq=+h[S+8>>3]}else if((K|0)==3){aq=+uz(c[S+8>>2]|0,0)}else{ae=14182;break L19119}if((c[w>>2]|0)==3){uu(c[x>>2]|0);c[w>>2]=1}c[59442]=~~aq;ab=F;ac=E}else if((J|0)==11){ar=G+1|0;c[13898]=ar;if((ar|0)>=(H|0)){ae=14295;break L19119}L19261:do{if((a[I+(ar*40&-1)|0]&1)!=0){S=c[I+(ar*40&-1)+36>>2]|0;K=I+(ar*40&-1)+32|0;T=c[10036]|0;R=0;while(1){if((R|0)>=(S|0)){break}if((a[T+((c[K>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L19261}}if((R|0)==1){ae=14294;break L19119}}}while(0);K=is(f)|0;T=c[K>>2]|0;if((T|0)==1){as=+(c[K+8>>2]|0)}else if((T|0)==2){as=+h[K+8>>3]}else if((T|0)==3){as=+uz(c[K+8>>2]|0,0)}else{ae=14197;break L19119}if((c[y>>2]|0)==3){uu(c[z>>2]|0);c[y>>2]=1}K=~~as;c[59448]=K;if((K-1|0)>>>0>9){ae=14202;break L19119}else{ab=F;ac=E}}else if((J|0)==9){at=G+1|0;c[13898]=at;if((at|0)>=(H|0)){au=at;ae=14282;break L19119}K=(a[I+(at*40&-1)|0]&1)==0;L19278:do{if(!K){T=c[I+(at*40&-1)+36>>2]|0;S=I+(at*40&-1)+32|0;N=c[10036]|0;L=0;while(1){if((L|0)>=(T|0)){ae=14162;break}if((a[N+((c[S>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break}}if((ae|0)==14162){ae=0;if((L|0)==1){au=at;ae=14281;break L19119}}if(K){break}S=c[I+(at*40&-1)+36>>2]|0;N=I+(at*40&-1)+32|0;T=c[10036]|0;R=0;while(1){if((R|0)>=(S|0)){break}if((a[T+((c[N>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L19278}}if((R|0)==1){au=at;ae=14279;break L19119}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[t>>2]|0)!=3){ae=14169;break L19119}K=c[u>>2]|0;if((K|0)==0){ae=14171;break L19119}N=bk(K|0,148464)|0;ca(K+(N+1|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=237768,v)|0);a[K+N|0]=0;N=237480;while(1){T=c[N>>2]|0;if((T|0)==0){av=-1;break}if((a_(K|0,T|0,uA(K|0)|0)|0)==0){ae=14176;break}else{N=N+8|0}}if((ae|0)==14176){ae=0;av=c[N+4>>2]|0}c[59444]=(av|0)<0?0:av;uu(K);ab=F;ac=E}else if((J|0)==5){a[237472]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==6){a[237096]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==4){a[237472]=0;c[13898]=G+1;ab=F;ac=E}else{ae=14250;break L19119}}while(0);J=c[13898]|0;I=c[8272]|0;if((J|0)<(I|0)){E=ac;F=ab;G=J;H=I}else{O=ac;P=ab;break L19117}}if((ae|0)==14171){au=c[13898]|0;uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14294){uf(ar,172856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14295){uf(ar,172856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14296){uf(ao,172696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14291){uf(ai,172784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14297){uf(ao,172696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14130){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14202){uf((c[13898]|0)-1|0,172816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14285){uf(ak,172624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14286){uf(ag,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14287){uf(ag,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14279){uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14281){uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14249){uf(an,172552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14250){uf(G,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14214){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14288){uf(ad,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14289){uf(ad,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14290){uf(ai,172784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14197){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14236){uf(c[13898]|0,172656,(v=i,i=i+8|0,c[v>>2]=1e5,v)|0)}else if((ae|0)==14282){uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14284){uf(ak,172624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14182){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14151){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14156){uf(c[13898]|0,130744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14231){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14169){c[13898]=at;au=at;uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14218){uf((c[13898]|0)-1|0,172744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{O=0.0;P=0.0}}while(0);ae=c[59264]|0;au=m|0;if((ae|0)==4){uD(au|0,172520,12)}else{m=(ae&2|0)!=0?172480:179864;at=(ae&8|0)!=0?172440:179864;ak=(ae&1|0)!=0?172408:179864;be(au|0,172512,(v=i,i=i+24|0,c[v>>2]=m,c[v+8>>2]=at,c[v+16>>2]=ak,v)|0)}ak=a[237464]|0;at=(c[59278]|0)+1|0;m=a[237096]|0?78720:78704;ae=a[237472]|0?172248:172264;ai=a[237072]|0?131504:131584;ad=c[237480+(c[59444]<<3)>>2]|0;an=c[59442]|0;if((an|0)>0){aw=an}else{aw=ak?16:10}an=c[59448]|0;ag=c[59446]|0;be(13048,172304,(v=i,i=i+136|0,c[v>>2]=a[237032]|0?116440:116408,c[v+8>>2]=ak?172296:172288,c[v+16>>2]=172272,c[v+24>>2]=at,c[v+32>>2]=m,c[v+40>>2]=ae,c[v+48>>2]=ai,c[v+56>>2]=au,c[v+64>>2]=124352,c[v+72>>2]=ad,c[v+80>>2]=aw,c[v+88>>2]=208960,c[v+96>>2]=an,c[v+104>>2]=172240,c[v+112>>2]=ag,c[v+120>>2]=172200,c[v+128>>2]=236976,v)|0);ag=P>0.0&O>0.0;L19344:do{if(ag){an=~~P;do{if(P- +(an|0)==0.0){aw=~~O;if(O- +(aw|0)!=0.0){break}ad=13048+(uA(13048)|0)|0;be(ad|0,172160,(v=i,i=i+16|0,c[v>>2]=an,c[v+8>>2]=aw,v)|0);break L19344}}while(0);an=13048+(uA(13048)|0)|0;be(an|0,172120,(v=i,i=i+16|0,h[v>>3]=P,h[v+8>>3]=O,v)|0)}}while(0);an=(c[59442]|0)<1;if(a[237464]|0){if(an){c[59442]=16}G=a[237472]|0;c[(c[3524]|0)+8>>2]=G?9e3:9600;c[(c[3524]|0)+12>>2]=G?6750:6e3;aw=G?90:105;c[(c[3524]|0)+24>>2]=aw;c[(c[3524]|0)+28>>2]=aw;ax=G;ay=G?900:1200}else{if(an){c[59442]=10}an=a[237472]|0;c[(c[3524]|0)+8>>2]=an?5400:6e3;c[(c[3524]|0)+12>>2]=3600;G=an?67:75;c[(c[3524]|0)+24>>2]=G;c[(c[3524]|0)+28>>2]=G;ax=an;ay=an?900:1200}c[59242]=ay;c[59240]=ax?900:1200;if(a[237096]|0){ay=c[3524]|0;an=ay+8|0;G=c[an>>2]|0;c[an>>2]=c[ay+12>>2];c[(c[3524]|0)+12>>2]=G}if(ag){ab=ax?450.0:1200.0;c[(c[3524]|0)+8>>2]=~~(P*ab);c[(c[3524]|0)+12>>2]=~~(O*ab)}ag=c[59442]|0;if(ax){az=+(ag*450&-1|0)*2.54}else{az=+(ag*1200&-1|0)}c[(c[3524]|0)+16>>2]=~~(az/72.0*3.0*.25);ag=c[59442]|0;if(ax){aA=+(ag*450&-1|0)*2.54;aB=aA/72.0;aC=aB*3.0;aD=aC*.25;aE=aD*6.0;aF=aE/10.0;aG=~~aF;aH=c[3524]|0;aI=aH+20|0;c[aI>>2]=aG;aJ=c[59448]|0;c[59262]=aJ;i=b;return}else{aA=+(ag*1200&-1|0);aB=aA/72.0;aC=aB*3.0;aD=aC*.25;aE=aD*6.0;aF=aE/10.0;aG=~~aF;aH=c[3524]|0;aI=aH+20|0;c[aI>>2]=aG;aJ=c[59448]|0;c[59262]=aJ;i=b;return}}function oc(){c[59270]=0;c[59272]=0;a[237104]=0;return}function od(a){a=a|0;var b=0;if((a|0)==1){c[59364]=1;b=1}else if((a|0)==0){c[59364]=0;b=1}else if((a|0)==2){c[59364]=2;b=1}else{c[59364]=0;b=0}return b|0}function oe(a){a=a|0;g[59456]=+(a|0)*1.5707963267948966/90.0;return 1}function of(a){a=+a;var b=0.0;h[29725]=a<0.0?1.0:a;b=+(c[59442]|0)*a/10.0;h[1630]=b>=0.0?b:1.0;return}function og(){var b=0,d=0,e=0,f=0;b=i;c[59270]=0;c[59272]=0;a[237104]=0;ol(-1);c[59364]=0;g[59456]=0.0;a[237136]=0;a[237432]=1;c[59356]=0;c[59354]=c[59262];a[237392]=1;c[59346]=c[59344];g[59360]=0.0;if((aY(236976,173280)|0)==0){d=c[10030]|0;e=a[237096]|0?198816:198832;f=a[237472]|0?173096:173160;cf(d|0,173232,(v=i,i=i+40|0,c[v>>2]=e,c[v+8>>2]=173184,c[v+16>>2]=f,c[v+24>>2]=1200,c[v+32>>2]=2,v)|0);i=b;return}if((aY(236976,173088)|0)!=0){i=b;return}f=a[237472]|0;cf(c[10030]|0,173048,(v=i,i=i+72|0,c[v>>2]=a[237096]|0?198816:198832,c[v+8>>2]=173184,c[v+16>>2]=f?173096:173160,c[v+24>>2]=f?173032:173040,h[v+32>>3]=100.0,c[v+40>>2]=172944,c[v+48>>2]=-2,c[v+56>>2]=1200,c[v+64>>2]=2,v)|0);i=b;return}function oh(){tK(a[237104]&1);c[59270]=0;c[59272]=0;aD(c[10030]|0);return}function oi(){tK(a[237104]&1);c[59270]=0;c[59272]=0;aD(c[10030]|0);return}function oj(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[59272]|0;f=c[59270]|0;c[59272]=b;c[59270]=d;if((e|0)==(b|0)&(f|0)==(d|0)){return}tK(a[237104]&1);return}function ok(b,d){b=b|0;d=d|0;var e=0,f=0;if(a[237104]|0){e=(c[59280]<<3)+8|0}else{f=c[59454]|0;c[59352]=f;c[59350]=f;c[59356]=c[59260];g[59360]=+g[59266];c[59346]=c[59344];c[59354]=c[59262];c[59280]=0;f=db(c[59282]|0,8,173288)|0;c[59282]=f;c[f+(c[59280]<<3)>>2]=(c[59272]|0)+(c[59242]|0);c[(c[59282]|0)+(c[59280]<<3)+4>>2]=((c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0)-(c[59270]|0);c[59280]=1;a[237104]=1;e=16}f=db(c[59282]|0,e,173288)|0;c[59282]=f;c[f+(c[59280]<<3)>>2]=(c[59242]|0)+b;c[(c[59282]|0)+(c[59280]<<3)+4>>2]=((c[(c[3524]|0)+12>>2]|0)-d|0)+(c[59240]|0);f=(c[59280]|0)+1|0;c[59280]=f;if((f|0)<=(c[59278]|0)){c[59272]=b;c[59270]=d;return}tK(a[237104]&1);c[59272]=b;c[59270]=d;return}function ol(b){b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;d=c[59260]|0;e=~~+g[59266];f=c[59454]|0;i=c[59344]|0;j=c[59262]|0;k=c[59446]|0;c[59344]=k;l=~~(+h[29726]*+(c[59448]|0));m=(l|0)<1?1:l;c[59262]=m;c[59454]=-1;n=(b|0)<-2?-2:b;do{if((n|0)==0|(n|0)==(-2|0)){c[59260]=0;g[59266]=0.0;if(!(a[237032]&(n|0)==0)){o=0;p=0.0;q=-1;r=k;s=m;break}c[59454]=4;o=0;p=0.0;q=4;r=k;s=m}else if((n|0)==(-1|0)){c[59260]=2;if(a[237072]|0){c[59260]=0;t=0}else{t=2}g[59266]=4.0;if(!(a[237032]|0)){o=t;p=4.0;q=-1;r=k;s=m;break}c[59454]=0;o=t;p=4.0;q=0;r=k;s=m}else{b=((n|0)/1e3&-1)+k|0;c[59344]=b;u=(n|0)%1e3&-1;v=(u+99|0)>>>0<199?l:(u|0)/100&-1;w=(v|0)<1?1:v;c[59262]=w;v=(u|0)%100&-1;if(a[237032]|0){u=(v|0)>8&1;c[59260]=u;x=c[237336+(((v|0)%9&-1)<<2)>>2]|0;c[59454]=x;y=(v|0)/9&-1;z=u;A=x}else{if((v|0)==0){B=0}else{B=((v|0)%2&-1)+1|0}c[59260]=B;y=(v+1|0)/2&-1;z=B;A=-1}C=+(y*3&-1|0);g[59266]=C;if(!(a[237072]|0)){o=z;p=C;q=A;r=b;s=w;break}c[59260]=0;o=0;p=C;q=A;r=b;s=w}}while(0);do{if((o|0)==(d|0)){if(!(p==+(e|0)&(q|0)==(f|0)&(r|0)==(i|0)&(s|0)==(j|0))){break}return}}while(0);tK(a[237104]&1);return}function om(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,w=0;f=i;c[59260]=0;if((((e|0)%100&-1)-49|0)>>>0<50){j=e}else{k=(e|0)%13&-1;if((k|0)==12){l=78}else if((k|0)==8){l=88}else if((k|0)==4){l=68}else if((k|0)==10){l=98}else if((k|0)==6){c[59260]=0;tK(a[237104]&1);e=(c[59344]|0)-1|0;m=c[59454]|0;n=(c[59242]|0)+b|0;o=c[3524]|0;p=((c[o+12>>2]|0)-d|0)+(c[59240]|0)|0;q=~~(+h[29725]*+((c[o+16>>2]|0)>>>0>>>0)*.25+1.0);o=c[59262]|0;r=+g[59266];cf(c[10030]|0,173528,(v=i,i=i+128|0,c[v>>2]=c[59260],c[v+8>>2]=o,c[v+16>>2]=m,c[v+24>>2]=m,c[v+32>>2]=(e|0)<0?0:e,c[v+40>>2]=0,c[v+48>>2]=20,h[v+56>>3]=r,c[v+64>>2]=n,c[v+72>>2]=p,c[v+80>>2]=q,c[v+88>>2]=q,c[v+96>>2]=n,c[v+104>>2]=p,c[v+112>>2]=n,c[v+120>>2]=p-q,v)|0);i=f;return}else if((k|0)==7){l=84}else if((k|0)==11){l=74}else if((k|0)==3){c[59260]=0;tK(a[237104]&1);q=(c[59344]|0)-1|0;p=c[59454]|0;n=(c[59242]|0)+b|0;e=((c[(c[3524]|0)+12>>2]|0)-d|0)+(c[59240]|0)|0;m=c[59262]|0;r=+g[59266];cf(c[10030]|0,173472,(v=i,i=i+64|0,c[v>>2]=c[59260],c[v+8>>2]=m,c[v+16>>2]=p,c[v+24>>2]=p,c[v+32>>2]=(q|0)<0?0:q,c[v+40>>2]=0,c[v+48>>2]=-1,h[v+56>>3]=r,v)|0);q=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)*.25+1.0);p=n-q|0;m=e-q|0;o=q+e|0;e=q+n|0;cf(c[10030]|0,173424,(v=i,i=i+80|0,c[v>>2]=p,c[v+8>>2]=m,c[v+16>>2]=p,c[v+24>>2]=o,c[v+32>>2]=e,c[v+40>>2]=o,c[v+48>>2]=e,c[v+56>>2]=m,c[v+64>>2]=p,c[v+72>>2]=m,v)|0);i=f;return}else if((k|0)==9){l=94}else if((k|0)==5){c[59260]=0;tK(a[237104]&1);m=(c[59344]|0)-1|0;p=c[59454]|0;e=(c[59242]|0)+b|0;o=c[3524]|0;n=((c[o+12>>2]|0)-d|0)+(c[59240]|0)|0;q=~~(+h[29725]*+((c[o+16>>2]|0)>>>0>>>0)*.25+1.0);o=c[59262]|0;r=+g[59266];cf(c[10030]|0,173528,(v=i,i=i+128|0,c[v>>2]=c[59260],c[v+8>>2]=o,c[v+16>>2]=p,c[v+24>>2]=p,c[v+32>>2]=(m|0)<0?0:m,c[v+40>>2]=0,c[v+48>>2]=-1,h[v+56>>3]=r,c[v+64>>2]=e,c[v+72>>2]=n,c[v+80>>2]=q,c[v+88>>2]=q,c[v+96>>2]=e,c[v+104>>2]=n,c[v+112>>2]=e,c[v+120>>2]=n-q,v)|0);i=f;return}else{ly(b,d,k);i=f;return}c[59260]=0;j=l}tK(a[237104]&1);if((j|0)>1e3){s=((j|0)/1e3&-1)+(c[59446]|0)|0}else{s=c[59344]|0}l=s-1|0;s=(j|0)%1e3&-1;j=(l|0)<0?0:l;do{if((s|0)<100){t=c[59454]|0}else{if(a[237032]|0){t=((s|0)/100&-1)-1|0;break}else{t=(s|0)>699?7:-1;break}}}while(0);l=(s|0)%100&-1;s=(l+1|0)%10&-1;if((s|0)<5){u=(a[237032]^1)<<31>>31}else{u=c[59454]|0}if((s|0)==5|(s|0)==0){w=-1}else{w=((s|0)%5&-1)*5&-1}s=(c[59242]|0)+b|0;b=c[3524]|0;k=((c[b+12>>2]|0)-d|0)+(c[59240]|0)|0;if((l-40|0)>>>0<19){d=~~(+h[29725]*+((c[b+16>>2]|0)>>>0>>>0)*.25+1.0);b=c[10030]|0;q=c[59260]|0;n=c[59262]|0;r=+g[59266];e=k-d|0;cf(b|0,173528,(v=i,i=i+128|0,c[v>>2]=q,c[v+8>>2]=n,c[v+16>>2]=u,c[v+24>>2]=t,c[v+32>>2]=j,c[v+40>>2]=0,c[v+48>>2]=w,h[v+56>>3]=r,c[v+64>>2]=s,c[v+72>>2]=k,c[v+80>>2]=d,c[v+88>>2]=d,c[v+96>>2]=s,c[v+104>>2]=k,c[v+112>>2]=s,c[v+120>>2]=e,v)|0);i=f;return}e=c[59262]|0;r=+g[59266];cf(c[10030]|0,173472,(v=i,i=i+64|0,c[v>>2]=c[59260],c[v+8>>2]=e,c[v+16>>2]=u,c[v+24>>2]=t,c[v+32>>2]=j,c[v+40>>2]=0,c[v+48>>2]=w,h[v+56>>3]=r,v)|0);if((l-59|0)>>>0<10){w=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)*.25+1.0);j=c[10030]|0;t=s-w|0;u=k-w|0;e=w+k|0;d=w+s|0;cf(j|0,173424,(v=i,i=i+80|0,c[v>>2]=t,c[v+8>>2]=u,c[v+16>>2]=t,c[v+24>>2]=e,c[v+32>>2]=d,c[v+40>>2]=e,c[v+48>>2]=d,c[v+56>>2]=u,c[v+64>>2]=t,c[v+72>>2]=u,v)|0);i=f;return}if((l-69|0)>>>0<10){u=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)/3.0+1.0);t=c[10030]|0;d=s-u|0;e=u+k|0;j=u+s|0;w=k-u|0;cf(t|0,173424,(v=i,i=i+80|0,c[v>>2]=d,c[v+8>>2]=k,c[v+16>>2]=s,c[v+24>>2]=e,c[v+32>>2]=j,c[v+40>>2]=k,c[v+48>>2]=s,c[v+56>>2]=w,c[v+64>>2]=d,c[v+72>>2]=k,v)|0);i=f;return}if((l-79|0)>>>0<10){d=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)/3.0+1.0);w=(d<<2|0)/7&-1;j=c[10030]|0;e=s-d|0;t=w+k|0;u=k-(w<<1)|0;w=d+s|0;cf(j|0,173392,(v=i,i=i+64|0,c[v>>2]=e,c[v+8>>2]=t,c[v+16>>2]=s,c[v+24>>2]=u,c[v+32>>2]=w,c[v+40>>2]=t,c[v+48>>2]=e,c[v+56>>2]=t,v)|0);i=f;return}if((l-89|0)>>>0>=10){i=f;return}l=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)/3.0+1.0);t=(l<<2|0)/7&-1;e=s-l|0;w=k-t|0;cf(c[10030]|0,173392,(v=i,i=i+64|0,c[v>>2]=e,c[v+8>>2]=w,c[v+16>>2]=s,c[v+24>>2]=(t<<1)+k,c[v+32>>2]=l+s,c[v+40>>2]=w,c[v+48>>2]=e,c[v+56>>2]=w,v)|0);i=f;return}function on(b,d,e,f,j){b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0;k=i;tK(a[237104]&1);l=(c[59356]|0)==2&1;m=a[237432]&1;n=c[59260]|0;o=c[59262]|0;p=c[59454]|0;q=c[59344]|0;r=a[237392]<<31>>31;s=+g[59266];t=(j|0)!=0;u=(j|0)==2;cf(c[10030]|0,173752,(v=i,i=i+128|0,c[v>>2]=2,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,c[v+32>>2]=p,c[v+40>>2]=p,c[v+48>>2]=q,c[v+56>>2]=0,c[v+64>>2]=r,h[v+72>>3]=s,c[v+80>>2]=0,c[v+88>>2]=l,c[v+96>>2]=0,c[v+104>>2]=t&1,c[v+112>>2]=u&1,c[v+120>>2]=2,v)|0);do{if(t){l=c[12910]|0;if((l|0)==0){r=c[(c[3524]|0)+28>>2]|0;w=+(r>>>0>>>0);x=+(((r>>>1)+1|0)>>>0>>>0)}else{s=+(l|0);y=+h[6458]*3.141592653589793/180.0;z=s*2.0*+T(+y);w=s*+S(+y);x=z}z=+h[6457];if(z<70.0){A=2}else{A=z>110.0?3:1}l=(c[12912]|0)==2&1;r=c[10030]|0;cf(r|0,173640,(v=i,i=i+40|0,c[v>>2]=A,c[v+8>>2]=l,h[v+16>>3]=1.0,h[v+24>>3]=x,h[v+32>>3]=w,v)|0);if(!u){break}r=c[10030]|0;cf(r|0,173640,(v=i,i=i+40|0,c[v>>2]=A,c[v+8>>2]=l,h[v+16>>3]=1.0,h[v+24>>3]=x,h[v+32>>3]=w,v)|0)}}while(0);A=c[59240]|0;u=(c[(c[3524]|0)+12>>2]|0)+A|0;cf(c[10030]|0,173608,(v=i,i=i+32|0,c[v>>2]=(c[59242]|0)+b,c[v+8>>2]=u-d,c[v+16>>2]=A+e,c[v+24>>2]=u-f,v)|0);c[59272]=e;c[59270]=f;i=k;return}function oo(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,w=0.0;f=i;if((a[e]|0)==0){i=f;return}j=uA(e|0)<<1|1;k=ut(j)|0;do{if((k|0)==0){gk();l=ut(j)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=173376,v)|0)}else{m=k}}while(0);k=m;j=e;while(1){l=a[j]|0;if(l<<24>>24==92){a[k]=92;n=k+1|0;o=a[j]|0}else{n=k;o=l}a[n]=o;if((a[j]|0)==0){break}else{k=n+1|0;j=j+1|0}}tK(a[237104]&1);p=+g[59456];q=p;j=c[3524]|0;n=c[j+16>>2]|0;if(p==0.0){r=b;s=n>>>1}else{p=+(n>>>0>>>0);k=~~(p*+T(+q)*.25)+b|0;r=k;s=~~(p*+S(+q)*.25)}k=c[10030]|0;b=c[59364]|0;o=c[59454]|0;l=c[59444]|0;p=+(c[59442]|0);t=c[59264]|0;u=+((c[j+20>>2]|0)>>>0>>>0);w=u*+((uA(e|0)|0)>>>0>>>0);e=(c[59242]|0)+r|0;r=((s-d|0)+(c[j+12>>2]|0)|0)+(c[59240]|0)|0;cf(k|0,173312,(v=i,i=i+112|0,c[v>>2]=4,c[v+8>>2]=b,c[v+16>>2]=o,c[v+24>>2]=0,c[v+32>>2]=-1,c[v+40>>2]=l,h[v+48>>3]=p,h[v+56>>3]=q,c[v+64>>2]=t,h[v+72>>3]=+(n>>>0>>>0),h[v+80>>3]=w,c[v+88>>2]=e,c[v+96>>2]=r,c[v+104>>2]=m,v)|0);uu(m);i=f;return}function op(a){a=+a;h[29726]=a;return}function oq(b,d,e,f,j){b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0;k=i;tK(a[237104]&1);l=c[59454]|0;c[59352]=l;m=b&15;do{if((m|0)==1|(m|0)==4){n=b>>4;o=(n|0)<0?0:n;n=(o|0)>100?20:(o|0)/5&-1;if((l|0)==(-1|0)|(l|0)==0){p=n;q=l;break}p=40-n|0;q=l}else if((m|0)==2|(m|0)==5){n=b>>4;p=(n|0)<0?41:n+41|0;q=7}else{p=20;q=7}}while(0);b=(c[59242]|0)+d|0;d=((c[(c[3524]|0)+12>>2]|0)-e|0)+(c[59240]|0)|0;e=a[237432]&1;m=c[59356]|0;n=c[59354]|0;o=c[59346]|0;r=+g[59360];s=b+f|0;f=d-j|0;cf(c[10030]|0,173808,(v=i,i=i+208|0,c[v>>2]=2,c[v+8>>2]=e,c[v+16>>2]=m,c[v+24>>2]=n,c[v+32>>2]=l,c[v+40>>2]=q,c[v+48>>2]=o,c[v+56>>2]=0,c[v+64>>2]=p,h[v+72>>3]=r,c[v+80>>2]=0,c[v+88>>2]=0,c[v+96>>2]=0,c[v+104>>2]=0,c[v+112>>2]=0,c[v+120>>2]=5,c[v+128>>2]=b,c[v+136>>2]=d,c[v+144>>2]=s,c[v+152>>2]=d,c[v+160>>2]=s,c[v+168>>2]=f,c[v+176>>2]=b,c[v+184>>2]=f,c[v+192>>2]=b,c[v+200>>2]=d,v)|0);i=k;return}function or(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0;d=i;if((b|0)==0){e=128;i=d;return e|0}tK(a[237104]&1);if(a[237136]|0){f=c[m>>2]|0;aI(173976,34,1,f|0);e=0;i=d;return e|0}a[237136]=1;f=a[237032]^1;g=c[5163]|0;if(!((g|0)==103|f)){if((c[5169]|0)<=0){e=0;i=d;return e|0}j=b+32|0;b=0;while(1){k=c[j>>2]|0;l=~~(+h[k+(b*24&-1)>>3]*255.0+.5);n=~~(+h[k+(b*24&-1)+8>>3]*255.0+.5);o=~~(+h[k+(b*24&-1)+16>>3]*255.0+.5);cf(c[10030]|0,174016,(v=i,i=i+40|0,c[v>>2]=0,c[v+8>>2]=b+32,c[v+16>>2]=l,c[v+24>>2]=n,c[v+32>>2]=o,v)|0);o=b+1|0;if((o|0)<(c[5169]|0)){b=o}else{e=0;break}}i=d;return e|0}if((g|0)==114&f){f=c[m>>2]|0;aI(174040,57,1,f|0)}f=c[5169]|0;if((f|0)>0){p=0;q=f}else{e=0;i=d;return e|0}while(1){f=~~(+(p|0)*255.0/+(q-1|0)+.5);cf(c[10030]|0,174016,(v=i,i=i+40|0,c[v>>2]=0,c[v+8>>2]=p+32,c[v+16>>2]=f,c[v+24>>2]=f,c[v+32>>2]=f,v)|0);f=p+1|0;g=c[5169]|0;if((f|0)<(g|0)){p=f;q=g}else{e=0;break}}i=d;return e|0}function os(b){b=b|0;var d=0.0,e=0,f=0,g=0;d=+h[b+8>>3];e=c[b>>2]|0;if((e|0)==5){if(d>0.0){f=~~(d*+(c[5169]|0))}else{f=0}if(!(a[237136]|0)){g=c[m>>2]|0;aI(174104,29,1,g|0)}g=(f|0)>127?159:f+32|0;if((c[59454]|0)==(g|0)){return}tK(a[237104]&1);c[59454]=g;return}else if((e|0)==1){ol(c[b+4>>2]|0);return}else{return}}function ot(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;e=i;tK(a[237104]&1);f=c[59356]|0;j=c[59454]|0;k=c[59346]|0;l=+g[59360];cf(c[10030]|0,174184,(v=i,i=i+128|0,c[v>>2]=2,c[v+8>>2]=3,c[v+16>>2]=f,c[v+24>>2]=0,c[v+32>>2]=j,c[v+40>>2]=j,c[v+48>>2]=k,c[v+56>>2]=0,c[v+64>>2]=20,h[v+72>>3]=l,c[v+80>>2]=0,c[v+88>>2]=0,c[v+96>>2]=0,c[v+104>>2]=0,c[v+112>>2]=0,c[v+120>>2]=b+1,v)|0);k=c[10030]|0;j=c[59242]|0;if((b|0)>0){f=b-1|0;m=0;n=0;o=k;p=j;while(1){q=((c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0)-(c[d+(m*12&-1)+4>>2]|0)|0;cf(o|0,174136,(v=i,i=i+16|0,c[v>>2]=(c[d+(m*12&-1)>>2]|0)+p,c[v+8>>2]=q,v)|0);if((n|0)<5|(m|0)==(f|0)){r=n+1|0}else{q=c[10030]|0;aI(84248,2,1,q|0);r=0}q=m+1|0;s=c[10030]|0;t=c[59242]|0;if((q|0)<(b|0)){m=q;n=r;o=s;p=t}else{u=r;w=s;x=t;break}}}else{u=0;w=k;x=j}j=((c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0)-(c[d+4>>2]|0)|0;cf(w|0,174136,(v=i,i=i+16|0,c[v>>2]=(c[d>>2]|0)+x,c[v+8>>2]=j,v)|0);if((u|0)==-1){i=e;return}aF(10,c[10030]|0);i=e;return}function ou(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((b|0)==6){tK(a[237104]&1);e=c[10030]|0;aF(54,e|0);e=c[10030]|0;f=c[59242]|0;g=(c[7938]|0)+f|0;h=(c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0;j=h-(c[7941]|0)|0;k=(c[7939]|0)+f|0;f=h-(c[7940]|0)|0;cf(e|0,174424,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=j,c[v+16>>2]=k,c[v+24>>2]=f,v)|0);f=c[10030]|0;k=(c[59362]|0)+1|0;c[59362]=k;cf(f|0,174400,(v=i,i=i+8|0,c[v>>2]=k,v)|0);i=d;return}else if((b|0)==7){tK(a[237104]&1);cf(c[10030]|0,174320,(v=i,i=i+8|0,c[v>>2]=c[59362],v)|0);aI(174256,3,1,c[10030]|0);i=d;return}else if((b|0)==0){c[59362]=0;i=d;return}else{i=d;return}}function ov(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0;a=i;b=ut(28)|0;do{if((b|0)==0){gk();d=ut(28)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{e=b}}while(0);b=e;c[e>>2]=0;c[e+12>>2]=7;c[e+4>>2]=2048;c[e+8>>2]=0;d=ut(8192)|0;do{if((d|0)==0){gk();f=ut(8192)|0;if((f|0)!=0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{g=d}}while(0);d=e+16|0;c[d>>2]=g;g=ut(8192)|0;do{if((g|0)==0){gk();f=ut(8192)|0;if((f|0)!=0){h=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{h=g}}while(0);g=e+20|0;c[g>>2]=h;h=ut(2048)|0;do{if((h|0)==0){gk();f=ut(2048)|0;if((f|0)!=0){j=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{j=h}}while(0);c[e+24>>2]=j;do{if((c[d>>2]|0)==0){k=0}else{if((c[g>>2]|0)==0){k=0;break}uE(j|0,0,2048);k=b}}while(0);c[59112]=k;c[59113]=k;k=ut(28)|0;do{if((k|0)==0){gk();b=ut(28)|0;if((b|0)!=0){l=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{l=k}}while(0);k=l;c[l>>2]=2;c[l+12>>2]=1;c[l+4>>2]=3072;c[l+8>>2]=0;b=ut(12288)|0;do{if((b|0)==0){gk();j=ut(12288)|0;if((j|0)!=0){m=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{m=b}}while(0);b=l+16|0;c[b>>2]=m;m=ut(12288)|0;do{if((m|0)==0){gk();j=ut(12288)|0;if((j|0)!=0){n=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{n=m}}while(0);m=l+20|0;c[m>>2]=n;n=ut(3072)|0;do{if((n|0)==0){gk();j=ut(3072)|0;if((j|0)!=0){o=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{o=n}}while(0);c[l+24>>2]=o;do{if((c[b>>2]|0)==0){p=0}else{if((c[m>>2]|0)==0){p=0;break}uE(o|0,0,3072);p=k}}while(0);c[59114]=p;c[59115]=c[59112];p=ut(28)|0;do{if((p|0)==0){gk();k=ut(28)|0;if((k|0)!=0){q=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{q=p}}while(0);p=q;c[q>>2]=4;c[q+12>>2]=5;c[q+4>>2]=1024;c[q+8>>2]=0;k=ut(4096)|0;do{if((k|0)==0){gk();o=ut(4096)|0;if((o|0)!=0){r=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{r=k}}while(0);k=q+16|0;c[k>>2]=r;r=ut(4096)|0;do{if((r|0)==0){gk();o=ut(4096)|0;if((o|0)!=0){s=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{s=r}}while(0);r=q+20|0;c[r>>2]=s;s=ut(1024)|0;do{if((s|0)==0){gk();o=ut(1024)|0;if((o|0)!=0){t=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{t=s}}while(0);c[q+24>>2]=t;do{if((c[k>>2]|0)==0){u=0}else{if((c[r>>2]|0)==0){u=0;break}uE(t|0,0,1024);u=p}}while(0);c[59116]=u;u=ut(28)|0;do{if((u|0)==0){gk();p=ut(28)|0;if((p|0)!=0){w=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{w=u}}while(0);u=w;c[w>>2]=5;c[w+12>>2]=6;c[w+4>>2]=256;c[w+8>>2]=0;p=ut(1024)|0;do{if((p|0)==0){gk();t=ut(1024)|0;if((t|0)!=0){x=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{x=p}}while(0);p=w+16|0;c[p>>2]=x;x=ut(1024)|0;do{if((x|0)==0){gk();t=ut(1024)|0;if((t|0)!=0){y=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{y=x}}while(0);x=w+20|0;c[x>>2]=y;y=ut(256)|0;do{if((y|0)==0){gk();t=ut(256)|0;if((t|0)!=0){z=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{z=y}}while(0);c[w+24>>2]=z;do{if((c[p>>2]|0)==0){A=0}else{if((c[x>>2]|0)==0){A=0;break}uE(z|0,0,256);A=u}}while(0);c[59117]=A;A=ut(28)|0;do{if((A|0)==0){gk();u=ut(28)|0;if((u|0)!=0){B=u;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{B=A}}while(0);A=B;c[B>>2]=6;c[B+12>>2]=8;c[B+4>>2]=256;c[B+8>>2]=0;u=ut(1024)|0;do{if((u|0)==0){gk();z=ut(1024)|0;if((z|0)!=0){C=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{C=u}}while(0);u=B+16|0;c[u>>2]=C;C=ut(1024)|0;do{if((C|0)==0){gk();z=ut(1024)|0;if((z|0)!=0){D=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{D=C}}while(0);C=B+20|0;c[C>>2]=D;D=ut(256)|0;do{if((D|0)==0){gk();z=ut(256)|0;if((z|0)!=0){E=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{E=D}}while(0);c[B+24>>2]=E;do{if((c[u>>2]|0)==0){F=0}else{if((c[C>>2]|0)==0){F=0;break}uE(E|0,0,256);F=A}}while(0);c[59118]=F;F=ut(28)|0;do{if((F|0)==0){gk();A=ut(28)|0;if((A|0)!=0){G=A;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{G=F}}while(0);F=G;c[G>>2]=7;c[G+12>>2]=9;c[G+4>>2]=128;c[G+8>>2]=0;A=ut(512)|0;do{if((A|0)==0){gk();E=ut(512)|0;if((E|0)!=0){H=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{H=A}}while(0);A=G+16|0;c[A>>2]=H;H=ut(512)|0;do{if((H|0)==0){gk();E=ut(512)|0;if((E|0)!=0){I=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{I=H}}while(0);H=G+20|0;c[H>>2]=I;I=ut(128)|0;do{if((I|0)==0){gk();E=ut(128)|0;if((E|0)!=0){J=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{J=I}}while(0);c[G+24>>2]=J;do{if((c[A>>2]|0)==0){K=0}else{if((c[H>>2]|0)==0){K=0;break}uE(J|0,0,128);K=F}}while(0);c[59119]=K;K=ut(28)|0;do{if((K|0)==0){gk();F=ut(28)|0;if((F|0)!=0){L=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{L=K}}while(0);K=L;c[L>>2]=8;c[L+12>>2]=10;c[L+4>>2]=128;c[L+8>>2]=0;F=ut(512)|0;do{if((F|0)==0){gk();J=ut(512)|0;if((J|0)!=0){M=J;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{M=F}}while(0);F=L+16|0;c[F>>2]=M;M=ut(512)|0;do{if((M|0)==0){gk();J=ut(512)|0;if((J|0)!=0){N=J;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{N=M}}while(0);M=L+20|0;c[M>>2]=N;N=ut(128)|0;do{if((N|0)==0){gk();J=ut(128)|0;if((J|0)!=0){O=J;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{O=N}}while(0);c[L+24>>2]=O;do{if((c[F>>2]|0)==0){P=0}else{if((c[M>>2]|0)==0){P=0;break}uE(O|0,0,128);P=K}}while(0);c[59120]=P;P=ut(28)|0;do{if((P|0)==0){gk();K=ut(28)|0;if((K|0)!=0){Q=K;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{Q=P}}while(0);P=Q;c[Q>>2]=9;c[Q+12>>2]=6;c[Q+4>>2]=64;c[Q+8>>2]=0;K=ut(256)|0;do{if((K|0)==0){gk();O=ut(256)|0;if((O|0)!=0){R=O;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{R=K}}while(0);K=Q+16|0;c[K>>2]=R;R=ut(256)|0;do{if((R|0)==0){gk();O=ut(256)|0;if((O|0)!=0){S=O;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{S=R}}while(0);R=Q+20|0;c[R>>2]=S;S=ut(64)|0;do{if((S|0)==0){gk();O=ut(64)|0;if((O|0)!=0){T=O;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{T=S}}while(0);c[Q+24>>2]=T;do{if((c[K>>2]|0)==0){U=0}else{if((c[R>>2]|0)==0){U=0;break}uE(T|0,0,64);U=P}}while(0);c[59121]=U;U=ut(28)|0;do{if((U|0)==0){gk();P=ut(28)|0;if((P|0)!=0){V=P;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{V=U}}while(0);U=V;c[V>>2]=10;c[V+12>>2]=4;c[V+4>>2]=64;c[V+8>>2]=0;P=ut(256)|0;do{if((P|0)==0){gk();T=ut(256)|0;if((T|0)!=0){W=T;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{W=P}}while(0);P=V+16|0;c[P>>2]=W;W=ut(256)|0;do{if((W|0)==0){gk();T=ut(256)|0;if((T|0)!=0){X=T;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{X=W}}while(0);W=V+20|0;c[W>>2]=X;X=ut(64)|0;do{if((X|0)==0){gk();T=ut(64)|0;if((T|0)!=0){Y=T;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{Y=X}}while(0);c[V+24>>2]=Y;do{if((c[P>>2]|0)==0){Z=0}else{if((c[W>>2]|0)==0){Z=0;break}uE(Y|0,0,64);Z=U}}while(0);c[59122]=Z;Z=ut(28)|0;do{if((Z|0)==0){gk();U=ut(28)|0;if((U|0)!=0){_=U;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{_=Z}}while(0);Z=_;c[_>>2]=11;c[_+12>>2]=11;c[_+4>>2]=512;c[_+8>>2]=0;U=ut(2048)|0;do{if((U|0)==0){gk();Y=ut(2048)|0;if((Y|0)!=0){$=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{$=U}}while(0);U=_+16|0;c[U>>2]=$;$=ut(2048)|0;do{if(($|0)==0){gk();Y=ut(2048)|0;if((Y|0)!=0){aa=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{aa=$}}while(0);$=_+20|0;c[$>>2]=aa;aa=ut(512)|0;do{if((aa|0)==0){gk();Y=ut(512)|0;if((Y|0)!=0){ab=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{ab=aa}}while(0);c[_+24>>2]=ab;if((c[U>>2]|0)==0){ac=0;c[59123]=ac;ad=c[59122]|0;c[59128]=ad;c[59108]=0;ae=c[10030]|0;af=aI(174480,10,1,ae|0)|0;ag=c[10030]|0;ah=aD(ag|0)|0;i=a;return}if((c[$>>2]|0)==0){ac=0;c[59123]=ac;ad=c[59122]|0;c[59128]=ad;c[59108]=0;ae=c[10030]|0;af=aI(174480,10,1,ae|0)|0;ag=c[10030]|0;ah=aD(ag|0)|0;i=a;return}uE(ab|0,0,512);ac=Z;c[59123]=ac;ad=c[59122]|0;c[59128]=ad;c[59108]=0;ae=c[10030]|0;af=aI(174480,10,1,ae|0)|0;ag=c[10030]|0;ah=aD(ag|0)|0;i=a;return}function ow(a){a=a|0;var b=0,d=0;b=(a|0)<-2?-2:a;if((b|0)>8){d=(b|0)%9&-1}else{d=b}b=c[236448+(d+2<<2)>>2]|0;if((b|0)==(c[59128]|0)){c[59106]=(c[59106]|0)+1;return}else{c[59128]=b;return}}function ox(){var a=0,b=0;a=2;do{b=c[236448+(a<<2)>>2]|0;uu(c[b+16>>2]|0);uu(c[b+20>>2]|0);uu(c[b+24>>2]|0);uu(b);a=a+1|0;}while((a|0)<12);return}function oy(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a=c[59112]|0;b=c[59108]|0;if((c[a+12>>2]|0)==(b|0)){tJ(a);d=c[59108]|0}else{d=b}b=c[59113]|0;if((c[b+12>>2]|0)==(d|0)){tJ(b);e=c[59108]|0}else{e=d}d=c[59114]|0;if((c[d+12>>2]|0)==(e|0)){tJ(d);f=c[59108]|0}else{f=e}e=c[59115]|0;if((c[e+12>>2]|0)==(f|0)){tJ(e);g=c[59108]|0}else{g=f}f=c[59116]|0;if((c[f+12>>2]|0)==(g|0)){tJ(f);h=c[59108]|0}else{h=g}g=c[59117]|0;if((c[g+12>>2]|0)==(h|0)){tJ(g);i=c[59108]|0}else{i=h}h=c[59118]|0;if((c[h+12>>2]|0)==(i|0)){tJ(h);j=c[59108]|0}else{j=i}i=c[59119]|0;if((c[i+12>>2]|0)==(j|0)){tJ(i);k=c[59108]|0}else{k=j}j=c[59120]|0;if((c[j+12>>2]|0)==(k|0)){tJ(j);l=c[59108]|0}else{l=k}k=c[59121]|0;if((c[k+12>>2]|0)==(l|0)){tJ(k);m=c[59108]|0}else{m=l}l=c[59122]|0;if((c[l+12>>2]|0)==(m|0)){tJ(l);n=c[59108]|0}else{n=m}m=c[59123]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m);o=0}else{o=0}do{m=236448+(o<<2)|0;tJ(c[m>>2]|0);n=c[(c[m>>2]|0)+12>>2]|0;m=c[59112]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59113]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59114]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59115]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59116]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59117]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59118]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59119]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59120]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59121]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59122]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59123]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}o=o+1|0;}while((o|0)<12);aI(174496,5,1,c[10030]|0);aD(c[10030]|0);return}function oz(){aI(174504,8,1,c[10030]|0);c[59096]=-200;c[59098]=-200;c[59124]=800;c[59126]=800;a[236440]=1;c[59104]=0;c[59102]=0;c[59106]=0;c[59100]=0;return}function oA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[59128]|0;f=c[e+8>>2]|0;do{if((f|0)>0){g=f-1|0;h=(c[e+16>>2]|0)+(g<<2)|0;do{if((c[h>>2]|0)==(b|0)){if((c[(c[e+20>>2]|0)+(g<<2)>>2]|0)!=(d|0)){break}c[59104]=(c[59104]|0)+1;return}}while(0);if((a[(c[e+24>>2]|0)+g|0]&1)==0){break}c[h>>2]=b;i=c[59128]|0;c[(c[i+20>>2]|0)+((c[i+8>>2]|0)-1<<2)>>2]=d;c[59104]=(c[59104]|0)+1;return}}while(0);if((f|0)==(c[e+4>>2]|0)){tI();i=c[59128]|0;j=i;k=c[i+8>>2]|0}else{j=e;k=f}c[(c[j+16>>2]|0)+(k<<2)>>2]=b;b=c[59128]|0;c[(c[b+20>>2]|0)+(c[b+8>>2]<<2)>>2]=d;d=c[59128]|0;a[(c[d+24>>2]|0)+(c[d+8>>2]|0)|0]=1;d=(c[59128]|0)+8|0;c[d>>2]=(c[d>>2]|0)+1;return}function oB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=c[59128]|0;f=c[e+8>>2]|0;do{if((f|0)>2){g=f-1|0;if((c[(c[e+16>>2]|0)+(g<<2)>>2]|0)!=(b|0)){break}if((c[(c[e+20>>2]|0)+(g<<2)>>2]|0)!=(d|0)){break}if((a[(c[e+24>>2]|0)+g|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;return}}while(0);if((f|0)==(c[e+4>>2]|0)){tI();g=c[59128]|0;h=g;i=c[g+8>>2]|0}else{h=e;i=f}c[(c[h+16>>2]|0)+(i<<2)>>2]=b;b=c[59128]|0;c[(c[b+20>>2]|0)+(c[b+8>>2]<<2)>>2]=d;d=c[59128]|0;a[(c[d+24>>2]|0)+(c[d+8>>2]|0)|0]=0;d=(c[59128]|0)+8|0;c[d>>2]=(c[d>>2]|0)+1;return}function oC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+32|0;if((a[e]|0)==0){i=f;return}aI(174736,3,1,c[10030]|0);if(!(a[236440]|0)){g=c[10030]|0;aF(115,g|0);a[236440]=1}g=f+16|0;h=d-(c[59124]|0)|0;be(g|0,174720,(v=i,i=i+16|0,c[v>>2]=b-(c[59126]|0),c[v+8>>2]=h,v)|0);h=f|0;be(h|0,174712,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);j=uA(g|0)|0;k=j>>>0<(uA(h|0)|0)>>>0;j=c[10030]|0;if(k){aK(g|0,j|0)}else{aK(h|0,j|0)}aK(e|0,c[10030]|0);c[59126]=b;c[59098]=b;c[59124]=d;c[59096]=d;i=f;return}function oD(a){a=a|0;var b=0;b=i;cf(c[10030]|0,174744,(v=i,i=i+8|0,c[v>>2]=(a|0)!=0?2:1,v)|0);i=b;return 1}function oE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0;f=c[59128]|0;g=c[f+12>>2]|0;h=(g|0)!=1;do{if(h){i=c[59114]|0;if((i|0)==(f|0)){c[59106]=(c[59106]|0)+1;j=g;k=f;break}else{c[59128]=i;j=g;k=i;break}}else{j=0;k=f}}while(0);if((e|0)<0){f=c[59123]|0;c[59128]=f;g=c[f+8>>2]|0;do{if((g|0)>2){i=g-1|0;if((c[(c[f+16>>2]|0)+(i<<2)>>2]|0)!=(b|0)){l=14737;break}if((c[(c[f+20>>2]|0)+(i<<2)>>2]|0)!=(d|0)){l=14737;break}if((a[(c[f+24>>2]|0)+i|0]&1)!=0){l=14737;break}c[59102]=(c[59102]|0)+1}else{l=14737}}while(0);if((l|0)==14737){if((g|0)==(c[f+4>>2]|0)){tI();i=c[59128]|0;m=i;n=c[i+8>>2]|0}else{m=f;n=g}c[(c[m+16>>2]|0)+(n<<2)>>2]=b;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=d;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}c[59128]=k}k=(e|0)%9&-1;L19947:do{if((k|0)==6){e=b+2|0;n=d+2|0;oA(e,n);m=b-2|0;g=d-2|0;f=c[59128]|0;i=c[f+8>>2]|0;do{if((i|0)>2){o=i-1|0;if((c[(c[f+16>>2]|0)+(o<<2)>>2]|0)!=(m|0)){l=14891;break}if((c[(c[f+20>>2]|0)+(o<<2)>>2]|0)!=(g|0)){l=14891;break}if((a[(c[f+24>>2]|0)+o|0]&1)!=0){l=14891;break}c[59102]=(c[59102]|0)+1}else{l=14891}}while(0);if((l|0)==14891){if((i|0)==(c[f+4>>2]|0)){tI();o=c[59128]|0;p=o;q=c[o+8>>2]|0}else{p=f;q=i}c[(c[p+16>>2]|0)+(q<<2)>>2]=m;o=c[59128]|0;c[(c[o+20>>2]|0)+(c[o+8>>2]<<2)>>2]=g;o=c[59128]|0;a[(c[o+24>>2]|0)+(c[o+8>>2]|0)|0]=0;o=(c[59128]|0)+8|0;c[o>>2]=(c[o>>2]|0)+1}oA(m,n);o=c[59128]|0;r=c[o+8>>2]|0;do{if((r|0)>2){s=r-1|0;if((c[(c[o+16>>2]|0)+(s<<2)>>2]|0)!=(e|0)){break}if((c[(c[o+20>>2]|0)+(s<<2)>>2]|0)!=(g|0)){break}if((a[(c[o+24>>2]|0)+s|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((r|0)==(c[o+4>>2]|0)){tI();n=c[59128]|0;t=n;u=c[n+8>>2]|0}else{t=o;u=r}c[(c[t+16>>2]|0)+(u<<2)>>2]=e;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=g;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}else if((k|0)==2){n=b-2|0;oA(n,d);m=b+2|0;i=d+2|0;f=c[59128]|0;s=c[f+8>>2]|0;do{if((s|0)>2){v=s-1|0;if((c[(c[f+16>>2]|0)+(v<<2)>>2]|0)!=(m|0)){l=14795;break}if((c[(c[f+20>>2]|0)+(v<<2)>>2]|0)!=(i|0)){l=14795;break}if((a[(c[f+24>>2]|0)+v|0]&1)!=0){l=14795;break}c[59102]=(c[59102]|0)+1;w=f}else{l=14795}}while(0);if((l|0)==14795){if((s|0)==(c[f+4>>2]|0)){tI();g=c[59128]|0;x=g;y=c[g+8>>2]|0}else{x=f;y=s}c[(c[x+16>>2]|0)+(y<<2)>>2]=m;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=i;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1;w=c[59128]|0}g=d-2|0;e=c[w+8>>2]|0;do{if((e|0)>2){r=e-1|0;if((c[(c[w+16>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14803;break}if((c[(c[w+20>>2]|0)+(r<<2)>>2]|0)!=(g|0)){l=14803;break}if((a[(c[w+24>>2]|0)+r|0]&1)!=0){l=14803;break}c[59102]=(c[59102]|0)+1;z=w}else{l=14803}}while(0);if((l|0)==14803){if((e|0)==(c[w+4>>2]|0)){tI();i=c[59128]|0;A=i;B=c[i+8>>2]|0}else{A=w;B=e}c[(c[A+16>>2]|0)+(B<<2)>>2]=m;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=g;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;z=c[59128]|0}i=c[z+8>>2]|0;do{if((i|0)>2){s=i-1|0;if((c[(c[z+16>>2]|0)+(s<<2)>>2]|0)!=(n|0)){break}if((c[(c[z+20>>2]|0)+(s<<2)>>2]|0)!=(d|0)){break}if((a[(c[z+24>>2]|0)+s|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[z+4>>2]|0)){tI();g=c[59128]|0;C=g;D=c[g+8>>2]|0}else{C=z;D=i}c[(c[C+16>>2]|0)+(D<<2)>>2]=n;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=d;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1}else if((k|0)==3){g=b+2|0;oA(g,d);m=b-2|0;e=d+2|0;s=c[59128]|0;f=c[s+8>>2]|0;do{if((f|0)>2){r=f-1|0;if((c[(c[s+16>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14819;break}if((c[(c[s+20>>2]|0)+(r<<2)>>2]|0)!=(e|0)){l=14819;break}if((a[(c[s+24>>2]|0)+r|0]&1)!=0){l=14819;break}c[59102]=(c[59102]|0)+1;E=s}else{l=14819}}while(0);if((l|0)==14819){if((f|0)==(c[s+4>>2]|0)){tI();n=c[59128]|0;F=n;G=c[n+8>>2]|0}else{F=s;G=f}c[(c[F+16>>2]|0)+(G<<2)>>2]=m;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=e;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1;E=c[59128]|0}n=d-2|0;i=c[E+8>>2]|0;do{if((i|0)>2){r=i-1|0;if((c[(c[E+16>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14827;break}if((c[(c[E+20>>2]|0)+(r<<2)>>2]|0)!=(n|0)){l=14827;break}if((a[(c[E+24>>2]|0)+r|0]&1)!=0){l=14827;break}c[59102]=(c[59102]|0)+1;H=E}else{l=14827}}while(0);if((l|0)==14827){if((i|0)==(c[E+4>>2]|0)){tI();e=c[59128]|0;I=e;J=c[e+8>>2]|0}else{I=E;J=i}c[(c[I+16>>2]|0)+(J<<2)>>2]=m;e=c[59128]|0;c[(c[e+20>>2]|0)+(c[e+8>>2]<<2)>>2]=n;e=c[59128]|0;a[(c[e+24>>2]|0)+(c[e+8>>2]|0)|0]=0;e=(c[59128]|0)+8|0;c[e>>2]=(c[e>>2]|0)+1;H=c[59128]|0}e=c[H+8>>2]|0;do{if((e|0)>2){f=e-1|0;if((c[(c[H+16>>2]|0)+(f<<2)>>2]|0)!=(g|0)){break}if((c[(c[H+20>>2]|0)+(f<<2)>>2]|0)!=(d|0)){break}if((a[(c[H+24>>2]|0)+f|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((e|0)==(c[H+4>>2]|0)){tI();n=c[59128]|0;K=n;L=c[n+8>>2]|0}else{K=H;L=e}c[(c[K+16>>2]|0)+(L<<2)>>2]=g;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=d;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}else if((k|0)==0){n=b-2|0;m=d-2|0;oA(n,m);i=d+2|0;f=c[59128]|0;s=c[f+8>>2]|0;do{if((s|0)>2){r=s-1|0;if((c[(c[f+16>>2]|0)+(r<<2)>>2]|0)!=(b|0)){l=14747;break}if((c[(c[f+20>>2]|0)+(r<<2)>>2]|0)!=(i|0)){l=14747;break}if((a[(c[f+24>>2]|0)+r|0]&1)!=0){l=14747;break}c[59102]=(c[59102]|0)+1;M=f}else{l=14747}}while(0);if((l|0)==14747){if((s|0)==(c[f+4>>2]|0)){tI();g=c[59128]|0;N=g;O=c[g+8>>2]|0}else{N=f;O=s}c[(c[N+16>>2]|0)+(O<<2)>>2]=b;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=i;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1;M=c[59128]|0}g=b+2|0;e=c[M+8>>2]|0;do{if((e|0)>2){r=e-1|0;if((c[(c[M+16>>2]|0)+(r<<2)>>2]|0)!=(g|0)){l=14755;break}if((c[(c[M+20>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14755;break}if((a[(c[M+24>>2]|0)+r|0]&1)!=0){l=14755;break}c[59102]=(c[59102]|0)+1;P=M}else{l=14755}}while(0);if((l|0)==14755){if((e|0)==(c[M+4>>2]|0)){tI();i=c[59128]|0;Q=i;R=c[i+8>>2]|0}else{Q=M;R=e}c[(c[Q+16>>2]|0)+(R<<2)>>2]=g;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=m;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;P=c[59128]|0}i=c[P+8>>2]|0;do{if((i|0)>2){s=i-1|0;if((c[(c[P+16>>2]|0)+(s<<2)>>2]|0)!=(n|0)){break}if((c[(c[P+20>>2]|0)+(s<<2)>>2]|0)!=(m|0)){break}if((a[(c[P+24>>2]|0)+s|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[P+4>>2]|0)){tI();g=c[59128]|0;S=g;T=c[g+8>>2]|0}else{S=P;T=i}c[(c[S+16>>2]|0)+(T<<2)>>2]=n;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=m;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1}else if((k|0)==5){oA(b,d+2|0);g=d-2|0;e=c[59128]|0;s=c[e+8>>2]|0;do{if((s|0)>2){f=s-1|0;if((c[(c[e+16>>2]|0)+(f<<2)>>2]|0)!=(b|0)){l=14875;break}if((c[(c[e+20>>2]|0)+(f<<2)>>2]|0)!=(g|0)){l=14875;break}if((a[(c[e+24>>2]|0)+f|0]&1)!=0){l=14875;break}c[59102]=(c[59102]|0)+1}else{l=14875}}while(0);if((l|0)==14875){if((s|0)==(c[e+4>>2]|0)){tI();m=c[59128]|0;U=m;V=c[m+8>>2]|0}else{U=e;V=s}c[(c[U+16>>2]|0)+(V<<2)>>2]=b;m=c[59128]|0;c[(c[m+20>>2]|0)+(c[m+8>>2]<<2)>>2]=g;m=c[59128]|0;a[(c[m+24>>2]|0)+(c[m+8>>2]|0)|0]=0;m=(c[59128]|0)+8|0;c[m>>2]=(c[m>>2]|0)+1}oA(b-2|0,d);m=b+2|0;n=c[59128]|0;i=c[n+8>>2]|0;do{if((i|0)>2){f=i-1|0;if((c[(c[n+16>>2]|0)+(f<<2)>>2]|0)!=(m|0)){break}if((c[(c[n+20>>2]|0)+(f<<2)>>2]|0)!=(d|0)){break}if((a[(c[n+24>>2]|0)+f|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[n+4>>2]|0)){tI();g=c[59128]|0;W=g;X=c[g+8>>2]|0}else{W=n;X=i}c[(c[W+16>>2]|0)+(X<<2)>>2]=m;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=d;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1}else if((k|0)==1){g=b-2|0;s=d+2|0;oA(g,s);e=d-2|0;f=c[59128]|0;r=c[f+8>>2]|0;do{if((r|0)>2){o=r-1|0;if((c[(c[f+16>>2]|0)+(o<<2)>>2]|0)!=(b|0)){l=14771;break}if((c[(c[f+20>>2]|0)+(o<<2)>>2]|0)!=(e|0)){l=14771;break}if((a[(c[f+24>>2]|0)+o|0]&1)!=0){l=14771;break}c[59102]=(c[59102]|0)+1;Y=f}else{l=14771}}while(0);if((l|0)==14771){if((r|0)==(c[f+4>>2]|0)){tI();m=c[59128]|0;Z=m;_=c[m+8>>2]|0}else{Z=f;_=r}c[(c[Z+16>>2]|0)+(_<<2)>>2]=b;m=c[59128]|0;c[(c[m+20>>2]|0)+(c[m+8>>2]<<2)>>2]=e;m=c[59128]|0;a[(c[m+24>>2]|0)+(c[m+8>>2]|0)|0]=0;m=(c[59128]|0)+8|0;c[m>>2]=(c[m>>2]|0)+1;Y=c[59128]|0}m=b+2|0;i=c[Y+8>>2]|0;do{if((i|0)>2){n=i-1|0;if((c[(c[Y+16>>2]|0)+(n<<2)>>2]|0)!=(m|0)){l=14779;break}if((c[(c[Y+20>>2]|0)+(n<<2)>>2]|0)!=(s|0)){l=14779;break}if((a[(c[Y+24>>2]|0)+n|0]&1)!=0){l=14779;break}c[59102]=(c[59102]|0)+1;$=Y}else{l=14779}}while(0);if((l|0)==14779){if((i|0)==(c[Y+4>>2]|0)){tI();e=c[59128]|0;aa=e;ab=c[e+8>>2]|0}else{aa=Y;ab=i}c[(c[aa+16>>2]|0)+(ab<<2)>>2]=m;e=c[59128]|0;c[(c[e+20>>2]|0)+(c[e+8>>2]<<2)>>2]=s;e=c[59128]|0;a[(c[e+24>>2]|0)+(c[e+8>>2]|0)|0]=0;e=(c[59128]|0)+8|0;c[e>>2]=(c[e>>2]|0)+1;$=c[59128]|0}e=c[$+8>>2]|0;do{if((e|0)>2){r=e-1|0;if((c[(c[$+16>>2]|0)+(r<<2)>>2]|0)!=(g|0)){break}if((c[(c[$+20>>2]|0)+(r<<2)>>2]|0)!=(s|0)){break}if((a[(c[$+24>>2]|0)+r|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((e|0)==(c[$+4>>2]|0)){tI();m=c[59128]|0;ac=m;ad=c[m+8>>2]|0}else{ac=$;ad=e}c[(c[ac+16>>2]|0)+(ad<<2)>>2]=g;m=c[59128]|0;c[(c[m+20>>2]|0)+(c[m+8>>2]<<2)>>2]=s;m=c[59128]|0;a[(c[m+24>>2]|0)+(c[m+8>>2]|0)|0]=0;m=(c[59128]|0)+8|0;c[m>>2]=(c[m>>2]|0)+1}else if((k|0)==4){m=b-2|0;i=d-2|0;oA(m,i);r=d+2|0;f=c[59128]|0;n=c[f+8>>2]|0;do{if((n|0)>2){o=n-1|0;if((c[(c[f+16>>2]|0)+(o<<2)>>2]|0)!=(m|0)){l=14843;break}if((c[(c[f+20>>2]|0)+(o<<2)>>2]|0)!=(r|0)){l=14843;break}if((a[(c[f+24>>2]|0)+o|0]&1)!=0){l=14843;break}c[59102]=(c[59102]|0)+1;ae=f}else{l=14843}}while(0);if((l|0)==14843){if((n|0)==(c[f+4>>2]|0)){tI();s=c[59128]|0;af=s;ag=c[s+8>>2]|0}else{af=f;ag=n}c[(c[af+16>>2]|0)+(ag<<2)>>2]=m;s=c[59128]|0;c[(c[s+20>>2]|0)+(c[s+8>>2]<<2)>>2]=r;s=c[59128]|0;a[(c[s+24>>2]|0)+(c[s+8>>2]|0)|0]=0;s=(c[59128]|0)+8|0;c[s>>2]=(c[s>>2]|0)+1;ae=c[59128]|0}s=b+2|0;g=c[ae+8>>2]|0;do{if((g|0)>2){e=g-1|0;if((c[(c[ae+16>>2]|0)+(e<<2)>>2]|0)!=(s|0)){l=14851;break}if((c[(c[ae+20>>2]|0)+(e<<2)>>2]|0)!=(r|0)){l=14851;break}if((a[(c[ae+24>>2]|0)+e|0]&1)!=0){l=14851;break}c[59102]=(c[59102]|0)+1;ah=ae}else{l=14851}}while(0);if((l|0)==14851){if((g|0)==(c[ae+4>>2]|0)){tI();n=c[59128]|0;ai=n;aj=c[n+8>>2]|0}else{ai=ae;aj=g}c[(c[ai+16>>2]|0)+(aj<<2)>>2]=s;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=r;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1;ah=c[59128]|0}n=c[ah+8>>2]|0;do{if((n|0)>2){f=n-1|0;if((c[(c[ah+16>>2]|0)+(f<<2)>>2]|0)!=(s|0)){l=14859;break}if((c[(c[ah+20>>2]|0)+(f<<2)>>2]|0)!=(i|0)){l=14859;break}if((a[(c[ah+24>>2]|0)+f|0]&1)!=0){l=14859;break}c[59102]=(c[59102]|0)+1;ak=ah}else{l=14859}}while(0);if((l|0)==14859){if((n|0)==(c[ah+4>>2]|0)){tI();r=c[59128]|0;al=r;am=c[r+8>>2]|0}else{al=ah;am=n}c[(c[al+16>>2]|0)+(am<<2)>>2]=s;r=c[59128]|0;c[(c[r+20>>2]|0)+(c[r+8>>2]<<2)>>2]=i;r=c[59128]|0;a[(c[r+24>>2]|0)+(c[r+8>>2]|0)|0]=0;r=(c[59128]|0)+8|0;c[r>>2]=(c[r>>2]|0)+1;ak=c[59128]|0}r=c[ak+8>>2]|0;do{if((r|0)>2){g=r-1|0;if((c[(c[ak+16>>2]|0)+(g<<2)>>2]|0)!=(m|0)){break}if((c[(c[ak+20>>2]|0)+(g<<2)>>2]|0)!=(i|0)){break}if((a[(c[ak+24>>2]|0)+g|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((r|0)==(c[ak+4>>2]|0)){tI();s=c[59128]|0;an=s;ao=c[s+8>>2]|0}else{an=ak;ao=r}c[(c[an+16>>2]|0)+(ao<<2)>>2]=m;s=c[59128]|0;c[(c[s+20>>2]|0)+(c[s+8>>2]<<2)>>2]=i;s=c[59128]|0;a[(c[s+24>>2]|0)+(c[s+8>>2]|0)|0]=0;s=(c[59128]|0)+8|0;c[s>>2]=(c[s>>2]|0)+1}else{s=d-2|0;oA(b,s);n=b-2|0;g=c[59128]|0;f=c[g+8>>2]|0;do{if((f|0)>2){e=f-1|0;if((c[(c[g+16>>2]|0)+(e<<2)>>2]|0)!=(n|0)){l=14907;break}if((c[(c[g+20>>2]|0)+(e<<2)>>2]|0)!=(d|0)){l=14907;break}if((a[(c[g+24>>2]|0)+e|0]&1)!=0){l=14907;break}c[59102]=(c[59102]|0)+1;ap=g}else{l=14907}}while(0);if((l|0)==14907){if((f|0)==(c[g+4>>2]|0)){tI();i=c[59128]|0;aq=i;ar=c[i+8>>2]|0}else{aq=g;ar=f}c[(c[aq+16>>2]|0)+(ar<<2)>>2]=n;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=d;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;ap=c[59128]|0}i=d+2|0;m=c[ap+8>>2]|0;do{if((m|0)>2){r=m-1|0;if((c[(c[ap+16>>2]|0)+(r<<2)>>2]|0)!=(b|0)){l=14915;break}if((c[(c[ap+20>>2]|0)+(r<<2)>>2]|0)!=(i|0)){l=14915;break}if((a[(c[ap+24>>2]|0)+r|0]&1)!=0){l=14915;break}c[59102]=(c[59102]|0)+1;as=ap}else{l=14915}}while(0);if((l|0)==14915){if((m|0)==(c[ap+4>>2]|0)){tI();n=c[59128]|0;at=n;au=c[n+8>>2]|0}else{at=ap;au=m}c[(c[at+16>>2]|0)+(au<<2)>>2]=b;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=i;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1;as=c[59128]|0}n=b+2|0;f=c[as+8>>2]|0;do{if((f|0)>2){g=f-1|0;if((c[(c[as+16>>2]|0)+(g<<2)>>2]|0)!=(n|0)){l=14923;break}if((c[(c[as+20>>2]|0)+(g<<2)>>2]|0)!=(d|0)){l=14923;break}if((a[(c[as+24>>2]|0)+g|0]&1)!=0){l=14923;break}c[59102]=(c[59102]|0)+1;av=as}else{l=14923}}while(0);if((l|0)==14923){if((f|0)==(c[as+4>>2]|0)){tI();i=c[59128]|0;aw=i;ax=c[i+8>>2]|0}else{aw=as;ax=f}c[(c[aw+16>>2]|0)+(ax<<2)>>2]=n;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=d;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;av=c[59128]|0}i=c[av+8>>2]|0;do{if((i|0)>2){m=i-1|0;if((c[(c[av+16>>2]|0)+(m<<2)>>2]|0)!=(b|0)){break}if((c[(c[av+20>>2]|0)+(m<<2)>>2]|0)!=(s|0)){break}if((a[(c[av+24>>2]|0)+m|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[av+4>>2]|0)){tI();n=c[59128]|0;ay=n;az=c[n+8>>2]|0}else{ay=av;az=i}c[(c[ay+16>>2]|0)+(az<<2)>>2]=b;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=s;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}}while(0);if(!h){return}h=(j|0)<-2?-2:j;if((h|0)>8){aA=(h|0)%9&-1}else{aA=h}h=c[236448+(aA+2<<2)>>2]|0;if((h|0)==(c[59128]|0)){c[59106]=(c[59106]|0)+1;return}else{c[59128]=h;return}}function oF(){return}function oG(){return}function oH(){return}function oI(){return}function oJ(){aI(174776,14,1,c[10030]|0);return}function oK(){aI(174800,6,1,c[10030]|0);return}function oL(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,174824,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);i=d;return}function oM(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,174848,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);i=d;return}function oN(a){a=a|0;var b=0;b=i;cf(c[10030]|0,174880,(v=i,i=i+8|0,c[v>>2]=c[236584+(((a+2|0)%11&-1)<<2)>>2],v)|0);i=b;return}function oO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;cf(c[10030]|0,174824,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b-5,v)|0);cf(c[10030]|0,174976,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=e;return}function oP(a){a=a|0;var b=0;b=i;cf(c[10030]|0,175008,(v=i,i=i+8|0,c[v>>2]=(a|0)!=0?2:1,v)|0);i=b;return 1}function oQ(){var b=0;b=c[10030]|0;if(a[235320]|0){aI(175320|0,13,1,b|0);c[58826]=1;return}else{aI(175360|0,10,1,b|0);c[58826]=1;return}}function oR(){var a=0,b=0,d=0;a=i;aI(175544,29,1,c[10030]|0);b=c[11252]|0;if((b|0)==6){d=175480}else{d=(b|0)==1?175480:179864}cf(c[10030]|0,175512,(v=i,i=i+40|0,c[v>>2]=d,c[v+8>>2]=1e4,c[v+16>>2]=7500,h[v+24>>3]=.2,h[v+32>>3]=.4,v)|0);c[58832]=0;i=a;return}function oS(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[58822]|0)==(a|0)&(c[58820]|0)==(b|0)){i=d;return}cf(c[10030]|0,175584,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58826]=1;c[58822]=a;c[58820]=b;i=d;return}function oT(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[10030]|0;if((c[58826]|0)==0){cf(e|0,175600,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58822]=a;c[58820]=b;i=d;return}else{cf(e|0,175616,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58826]=0;c[58822]=a;c[58820]=b;i=d;return}}function oU(a){a=a|0;var b=0,d=0;b=i;d=((((a|0)<-2?0:a+2|0)|0)%(c[58828]|0)&-1)+1|0;if((c[58824]|0)==(d|0)){i=b;return}cf(c[10030]|0,175648,(v=i,i=i+8|0,c[v>>2]=d,v)|0);c[58824]=d;c[58826]=1;i=b;return}function oV(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;do{if((c[58832]|0)==1){g=b+15|0;if((c[58822]|0)==(g|0)&(c[58820]|0)==(d|0)){break}h=c[10030]|0;cf(h|0,175584,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=d,v)|0);c[58826]=1;c[58822]=g;c[58820]=d}else{g=d-15|0;if((c[58822]|0)==(b|0)&(c[58820]|0)==(g|0)){break}h=c[10030]|0;cf(h|0,175584,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0);c[58826]=1;c[58822]=b;c[58820]=g}}while(0);b=c[11252]|0;if((b|0)==6){d=c[10030]|0;aI(175688,2,1,d|0);d=a[e]|0;if(d<<24>>24!=0){g=e;h=d;do{d=h&255;do{if(h<<24>>24<0){j=38152+(d-128<<2)|0;if((a[j]|0)==0){k=14990;break}l=c[10030]|0;aK(j|0,l|0)}else{k=14990}}while(0);if((k|0)==14990){k=0;l=c[10030]|0;aF(d|0,l|0)}g=g+1|0;h=a[g]|0;}while(h<<24>>24!=0)}h=c[10030]|0;aI(175664,2,1,h|0);i=f;return}h=c[10030]|0;if((b|0)!=1){cf(h|0,177872,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}aI(175688,2,1,h|0);h=a[e]|0;if(h<<24>>24!=0){b=e;e=h;do{h=e&255;do{if(e<<24>>24<0){g=37640+(h-128<<2)|0;if((a[g]|0)==0){k=14998;break}l=c[10030]|0;aK(g|0,l|0)}else{k=14998}}while(0);if((k|0)==14998){k=0;d=c[10030]|0;aF(h|0,d|0)}b=b+1|0;e=a[b]|0;}while(e<<24>>24!=0)}aI(175664,2,1,c[10030]|0);i=f;return}function oW(a){a=a|0;var b=0;if((a|0)==(-90|0)|(a|0)==270){c[58832]=-1;b=c[10030]|0;aI(175768,8,1,b|0);return 1}b=(a|0)!=0;c[58832]=b&1;a=c[10030]|0;if(b){aI(175720,7,1,a|0);return 1}else{aI(175816,7,1,a|0);return 1}return 0}function oX(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;b=i;c[58828]=6;a[235320]=0;d=c[13898]|0;e=c[8272]|0;L20300:do{if((d|0)<(e|0)){f=d;g=6;j=e;L20301:while(1){k=c[1054]|0;l=(a[k+(f*40&-1)|0]&1)==0;L20303:do{if(l){m=15032}else{n=c[k+(f*40&-1)+36>>2]|0;o=k+(f*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){m=15020;break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}if((m|0)==15020){m=0;if((q|0)==1){r=g;break L20300}}if(l){m=15032;break}if((n|0)<=0){m=15044;break L20301}p=c[10036]|0;s=0;t=0;u=c[o>>2]|0;while(1){if((a[s+175248|0]|0)==(a[p+(s+u|0)|0]|0)){w=u;x=t}else{if((s|0)!=3){break}w=u-1|0;x=1}y=s+1|0;if((y|0)<(x+n|0)){s=y;t=x;u=w}else{m=15028;break}}do{if((m|0)==15028){m=0;if((x|0)==0){if(!((s|0)==2|(s|0)==5)){break}}a[235320]=1;z=g;A=f;B=j;break L20303}}while(0);if(l){m=15032}else{m=15043;break L20301}}}while(0);if((m|0)==15032){m=0;l=c[k+(f*40&-1)+8>>2]|0;if((l|0)==1){C=+(c[k+(f*40&-1)+16>>2]|0)}else if((l|0)==3){C=+uz(c[k+(f*40&-1)+16>>2]|0,0)}else if((l|0)==2){C=+h[k+(f*40&-1)+16>>3]}else{m=15036;break}l=~~C;c[58828]=l;if((l|0)<1){m=15039;break}z=l;A=c[13898]|0;B=c[8272]|0}l=A+1|0;c[13898]=l;if((l|0)<(B|0)){f=l;g=z;j=B}else{r=z;break L20300}}if((m|0)==15036){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==15043){uf(f,175176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==15039){c[58828]=6;uf(c[13898]|0,175216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==15044){uf(f,175176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{r=6}}while(0);m=a[235320]|0?175144:175024;be(13048,175160,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=m,v)|0);i=b;return}function oY(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0.0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0.0,at=0.0,au=0.0,av=0,aw=0,ax=0,ay=0,az=0;b=i;d=c[13898]|0;e=c[8272]|0;L20341:do{if((d|0)<(e|0)){f=c[1054]|0;g=(a[f+(d*40&-1)|0]&1)==0;if(g){j=d;break}k=c[f+(d*40&-1)+36>>2]|0;l=f+(d*40&-1)+32|0;m=c[10036]|0;n=0;while(1){if((n|0)>=(k|0)){o=15050;break}if((a[m+((c[l>>2]|0)+n|0)|0]|0)==(a[n+103664|0]|0)){n=n+1|0}else{break}}if((o|0)==15050){if((n|0)==1){j=d;break}}if(!((k|0)>0&(g^1))){j=d;break}m=c[10036]|0;p=0;q=0;r=c[l>>2]|0;while(1){if((a[p+176888|0]|0)==(a[m+(p+r|0)|0]|0)){s=r;t=q}else{if((p|0)!=1){j=d;break L20341}s=r-1|0;t=1}u=p+1|0;if((u|0)<(t+k|0)){p=u;q=t;r=s}else{break}}if((t|0)==0){if(!((p|0)==0|(p|0)==4)){j=d;break}}r=d+1|0;c[13898]=r;if((r|0)>=(e|0)){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=(a[f+(r*40&-1)|0]&1)==0;k=c[f+(r*40&-1)+36>>2]|0;L20364:do{if(q){w=c[10036]|0;x=f+(r*40&-1)+32|0}else{m=f+(r*40&-1)+32|0;l=c[10036]|0;g=0;while(1){if((g|0)>=(k|0)){break}if((a[l+((c[m>>2]|0)+g|0)|0]|0)==(a[g+103664|0]|0)){g=g+1|0}else{w=l;x=m;break L20364}}if((g|0)!=1){w=l;x=m;break}uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);f=(k|0)>0;p=c[58058]|0;L20373:do{if((p|0)==0){o=15075}else{if(q){o=15075;break}if(f){n=0;u=0;y=c[x>>2]|0;while(1){z=a[p+n|0]|0;if(z<<24>>24==(a[w+(n+y|0)|0]|0)){A=y;B=u}else{if(z<<24>>24!=36){o=15075;break L20373}A=y-1|0;B=1}C=n+1|0;if((C|0)<(B+k|0)){n=C;u=B;y=A}else{break}}if((B|0)==0){D=C}else{E=0;break}}else{D=0}y=a[p+D|0]|0;if((y<<24>>24|0)==36|(y<<24>>24|0)==0){E=0}else{o=15075}}}while(0);L20385:do{if((o|0)==15075){p=c[58063]|0;if((p|0)==0){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(q){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if(f){y=0;u=0;n=c[x>>2]|0;while(1){m=a[p+y|0]|0;if(m<<24>>24==(a[w+(y+n|0)|0]|0)){F=n;G=u}else{if(m<<24>>24!=36){o=15225;break}F=n-1|0;G=1}H=y+1|0;if((H|0)<(G+k|0)){y=H;u=G;n=F}else{o=15223;break}}if((o|0)==15225){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15223){if((G|0)==0){I=H;break}else{E=1;break L20385}}}else{I=0}}while(0);n=a[p+I|0]|0;if((n<<24>>24|0)==36|(n<<24>>24|0)==0){E=1;break}uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[58068]=232232+(E*20&-1);r=d+2|0;c[13898]=r;j=r}else{j=d}}while(0);d=(j|0)<(e|0);L20407:do{if(d){e=c[1054]|0;E=(a[e+(j*40&-1)|0]&1)==0;L20409:do{if(!E){I=c[e+(j*40&-1)+36>>2]|0;H=e+(j*40&-1)+32|0;G=c[10036]|0;F=0;while(1){if((F|0)>=(I|0)){o=15084;break}if((a[G+((c[H>>2]|0)+F|0)|0]|0)==(a[F+103664|0]|0)){F=F+1|0}else{break}}if((o|0)==15084){if((F|0)==1){break}}if(!((I|0)>0&(E^1))){break}G=c[10036]|0;p=0;w=0;x=c[H>>2]|0;while(1){if((a[p+176824|0]|0)==(a[G+(p+x|0)|0]|0)){J=x;K=w}else{if((p|0)!=3){break L20409}J=x-1|0;K=1}D=p+1|0;if((D|0)<(K+I|0)){p=D;w=K;x=J}else{break}}if((K|0)==0){if(!((p|0)==2|(p|0)==8)){break}}c[(c[58068]|0)+12>>2]=52e3;c[(c[58068]|0)+16>>2]=33940;c[58070]=176808;c[13898]=(c[13898]|0)+1;break L20407}}while(0);if(!d){break}E=c[1054]|0;e=(a[E+(j*40&-1)|0]&1)==0;L20430:do{if(!e){x=c[E+(j*40&-1)+36>>2]|0;w=E+(j*40&-1)+32|0;I=c[10036]|0;G=0;while(1){if((G|0)>=(x|0)){o=15099;break}if((a[I+((c[w>>2]|0)+G|0)|0]|0)==(a[G+103664|0]|0)){G=G+1|0}else{break}}if((o|0)==15099){if((G|0)==1){break}}if(!((x|0)>0&(e^1))){break}I=c[10036]|0;p=0;H=0;F=c[w>>2]|0;while(1){if((a[p+176760|0]|0)==(a[I+(p+F|0)|0]|0)){L=F;M=H}else{if((p|0)!=5){break L20430}L=F-1|0;M=1}D=p+1|0;if((D|0)<(M+x|0)){p=D;H=M;F=L}else{break}}if((M|0)==0){if(!((p|0)==4|(p|0)==10)){break}}c[(c[58068]|0)+12>>2]=45333;c[(c[58068]|0)+16>>2]=33940;c[58070]=176704;c[13898]=(c[13898]|0)+1;break L20407}}while(0);if(!d){break}e=c[1054]|0;E=(a[e+(j*40&-1)|0]&1)==0;L20451:do{if(!E){F=c[e+(j*40&-1)+36>>2]|0;H=e+(j*40&-1)+32|0;x=c[10036]|0;I=0;while(1){if((I|0)>=(F|0)){o=15114;break}if((a[x+((c[H>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{break}}if((o|0)==15114){if((I|0)==1){break}}if(!((F|0)>0&(E^1))){break}x=c[10036]|0;p=0;w=0;G=c[H>>2]|0;while(1){if((a[p+176680|0]|0)==(a[x+(p+G|0)|0]|0)){N=G;O=w}else{if((p|0)!=3){break L20451}N=G-1|0;O=1}D=p+1|0;if((D|0)<(O+F|0)){p=D;w=O;G=N}else{break}}if((O|0)==0){if(!((p|0)==2|(p|0)==5)){break}}c[(c[58068]|0)+12>>2]=13e3;c[(c[58068]|0)+16>>2]=7440;c[58070]=176664;c[13898]=(c[13898]|0)+1;break L20407}}while(0);if(!d){break}E=c[1054]|0;e=(a[E+(j*40&-1)|0]&1)==0;if(e){break}G=c[E+(j*40&-1)+36>>2]|0;w=E+(j*40&-1)+32|0;E=c[10036]|0;F=0;while(1){if((F|0)>=(G|0)){o=15129;break}if((a[E+((c[w>>2]|0)+F|0)|0]|0)==(a[F+103664|0]|0)){F=F+1|0}else{break}}if((o|0)==15129){if((F|0)==1){break}}if(!((G|0)>0&(e^1))){break}E=c[10036]|0;x=0;H=0;I=c[w>>2]|0;while(1){if((a[x+176656|0]|0)==(a[E+(x+I|0)|0]|0)){P=I;Q=H}else{if((x|0)!=3){break L20407}P=I-1|0;Q=1}D=x+1|0;if((D|0)<(Q+G|0)){x=D;H=Q;I=P}else{break}}if((Q|0)==0){if(!((x|0)==2|(x|0)==6)){break}}c[(c[58068]|0)+12>>2]=1e4;c[(c[58068]|0)+16>>2]=7440;c[58070]=176648;c[13898]=(c[13898]|0)+1}}while(0);Q=c[58070]|0;be(13048,84616,(v=i,i=i+16|0,c[v>>2]=c[(c[58068]|0)+4>>2],c[v+8>>2]=Q,v)|0);Q=c[3524]|0;P=c[13898]|0;j=c[8272]|0;if((P|0)>=(j|0)){R=uA(13048)|0;S=R+13048|0;T=a[236376]|0;U=T?116408:116440;V=c[58868]|0;W=T?1:V;X=a[235336]|0;Y=X?131584:131504;Z=c[59090]|0;_=Z+4|0;$=c[_>>2]|0;aa=Z+12|0;ab=c[aa>>2]|0;ac=(ab|0)!=0;ad=ac?176184:176112;ae=Z+24|0;af=Z+16|0;ag=ac?ae:af;ah=+h[ag>>3];ai=a[28152]|0;aj=ai?176072:176024;ak=be(S|0,176232,(v=i,i=i+56|0,c[v>>2]=U,c[v+8>>2]=W,c[v+16>>2]=Y,c[v+24>>2]=$,c[v+32>>2]=ad,h[v+40>>3]=ah,c[v+48>>2]=aj,v)|0)|0;i=b;return}d=Q+16|0;O=Q+20|0;Q=P;P=j;L20494:while(1){j=c[1054]|0;N=(a[j+(Q*40&-1)|0]&1)==0;L20496:do{if(!N){M=c[j+(Q*40&-1)+36>>2]|0;L=j+(Q*40&-1)+32|0;K=c[10036]|0;J=0;while(1){if((J|0)>=(M|0)){break}if((a[K+((c[L>>2]|0)+J|0)|0]|0)==(a[J+103664|0]|0)){J=J+1|0}else{break L20496}}if((J|0)==1){o=15233;break L20494}}}while(0);x=c[58848]|0;L20503:do{if((x|0)==0){al=235392}else{L=c[j+(Q*40&-1)+36>>2]|0;K=c[j+(Q*40&-1)+32>>2]|0;M=(L|0)>0;p=c[10036]|0;I=235392;H=x;while(1){L20507:do{if(!N){if(M){G=0;E=0;w=K;while(1){e=a[H+G|0]|0;if(e<<24>>24==(a[p+(G+w|0)|0]|0)){am=w;an=E}else{if(e<<24>>24!=36){break L20507}am=w-1|0;an=1}ao=G+1|0;if((ao|0)<(an+L|0)){G=ao;E=an;w=am}else{break}}if((an|0)==0){ap=ao}else{al=I;break L20503}}else{ap=0}w=a[H+ap|0]|0;if((w<<24>>24|0)==36|(w<<24>>24|0)==0){al=I;break L20503}}}while(0);w=I+8|0;E=c[w>>2]|0;if((E|0)==0){al=w;break}else{I=w;H=E}}}}while(0);N=c[al+4>>2]|0;L20520:do{if((N|0)==2){a[235336]=0;x=Q+1|0;c[13898]=x;aq=x}else if((N|0)==5){ar=Q+1|0;c[13898]=ar;if((ar|0)>=(P|0)){o=15237;break L20494}L20524:do{if((a[j+(ar*40&-1)|0]&1)!=0){x=c[j+(ar*40&-1)+36>>2]|0;H=j+(ar*40&-1)+32|0;I=c[10036]|0;L=0;while(1){if((L|0)>=(x|0)){break}if((a[I+((c[H>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break L20524}}if((L|0)==1){o=15236;break L20494}}}while(0);H=c[j+(ar*40&-1)+8>>2]|0;if((H|0)==2){as=+h[j+(ar*40&-1)+16>>3]}else if((H|0)==3){as=+uz(c[j+(ar*40&-1)+16>>2]|0,0)}else if((H|0)==1){as=+(c[j+(ar*40&-1)+16>>2]|0)}else{o=15205;break L20494}h[29422]=as;if(as<=0.0){o=15210;break L20494}h[29421]=as;H=~~(as*1016.0/72.0);c[d>>2]=H;c[O>>2]=(H<<1>>>0)/3>>>0;H=c[59090]|0;at=+h[29422];if((c[H+12>>2]|0)==0){h[H+16>>3]=216.0/(at*2.0)}else{h[H+24>>3]=at}H=(c[13898]|0)+1|0;c[13898]=H;aq=H}else if((N|0)==0){a[236376]=1;H=Q+1|0;c[13898]=H;aq=H}else if((N|0)==1){a[236376]=0;H=Q+1|0;c[13898]=H;if((H|0)>=(P|0)){aq=H;break}if((a[j+(H*40&-1)|0]&1)!=0){I=c[j+(H*40&-1)+36>>2]|0;x=j+(H*40&-1)+32|0;p=c[10036]|0;K=0;while(1){if((K|0)>=(I|0)){aq=H;break L20520}if((a[p+((c[x>>2]|0)+K|0)|0]|0)==(a[K+103664|0]|0)){K=K+1|0}else{aq=H;break L20520}}}K=c[j+(H*40&-1)+8>>2]|0;if((K|0)==2){au=+h[j+(H*40&-1)+16>>3]}else if((K|0)==1){au=+(c[j+(H*40&-1)+16>>2]|0)}else if((K|0)==3){au=+uz(c[j+(H*40&-1)+16>>2]|0,0)}else{o=15169;break L20494}K=~~au;c[58868]=K;if((K|0)<1){o=15171;break L20494}K=(c[13898]|0)+1|0;c[13898]=K;aq=K}else if((N|0)==7){K=Q+1|0;c[13898]=K;a[28152]=1;aq=K}else if((N|0)==8){K=Q+1|0;c[13898]=K;aq=K}else if((N|0)==3){a[235336]=1;K=Q+1|0;c[13898]=K;aq=K}else if((N|0)==4){av=Q+1|0;c[13898]=av;if((av|0)>=(P|0)){o=15232;break L20494}K=(a[j+(av*40&-1)|0]&1)==0;x=c[j+(av*40&-1)+36>>2]|0;p=j+(av*40&-1)+32|0;L20561:do{if(!K){I=c[10036]|0;M=0;while(1){if((M|0)>=(x|0)){break}if((a[I+((c[p>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break L20561}}if((M|0)==1){o=15231;break L20494}}}while(0);H=(x|0)>0;I=c[10036]|0;L=0;L20568:while(1){J=c[235528+(L*48&-1)>>2]|0;L20570:do{if(!((J|0)==0|K)){if(H){E=0;w=0;G=c[p>>2]|0;while(1){e=a[J+E|0]|0;if(e<<24>>24==(a[I+(E+G|0)|0]|0)){aw=G;ax=w}else{if(e<<24>>24!=36){break L20570}aw=G-1|0;ax=1}ay=E+1|0;if((ay|0)<(ax+x|0)){E=ay;w=ax;G=aw}else{break}}if((ax|0)==0){az=ay}else{break L20568}}else{az=0}G=a[J+az|0]|0;if((G<<24>>24|0)==36|(G<<24>>24|0)==0){break L20568}}}while(0);J=L+1|0;if(J>>>0<17){L=J}else{o=15193;break L20494}}c[59090]=235528+(L*48&-1);c[59088]=L;c[59086]=L;x=Q+2|0;c[13898]=x;aq=x}else if((N|0)==6){x=Q+1|0;c[13898]=x;a[28152]=0;aq=x}else{aq=Q}}while(0);N=c[8272]|0;if((aq|0)<(N|0)){Q=aq;P=N}else{o=15235;break}}if((o|0)==15231){uf(av,176384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15232){uf(av,176384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15233){R=uA(13048)|0;S=R+13048|0;T=a[236376]|0;U=T?116408:116440;V=c[58868]|0;W=T?1:V;X=a[235336]|0;Y=X?131584:131504;Z=c[59090]|0;_=Z+4|0;$=c[_>>2]|0;aa=Z+12|0;ab=c[aa>>2]|0;ac=(ab|0)!=0;ad=ac?176184:176112;ae=Z+24|0;af=Z+16|0;ag=ac?ae:af;ah=+h[ag>>3];ai=a[28152]|0;aj=ai?176072:176024;ak=be(S|0,176232,(v=i,i=i+56|0,c[v>>2]=U,c[v+8>>2]=W,c[v+16>>2]=Y,c[v+24>>2]=$,c[v+32>>2]=ad,h[v+40>>3]=ah,c[v+48>>2]=aj,v)|0)|0;i=b;return}else if((o|0)==15193){uf(av,176384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15235){R=uA(13048)|0;S=R+13048|0;T=a[236376]|0;U=T?116408:116440;V=c[58868]|0;W=T?1:V;X=a[235336]|0;Y=X?131584:131504;Z=c[59090]|0;_=Z+4|0;$=c[_>>2]|0;aa=Z+12|0;ab=c[aa>>2]|0;ac=(ab|0)!=0;ad=ac?176184:176112;ae=Z+24|0;af=Z+16|0;ag=ac?ae:af;ah=+h[ag>>3];ai=a[28152]|0;aj=ai?176072:176024;ak=be(S|0,176232,(v=i,i=i+56|0,c[v>>2]=U,c[v+8>>2]=W,c[v+16>>2]=Y,c[v+24>>2]=$,c[v+32>>2]=ad,h[v+40>>3]=ah,c[v+48>>2]=aj,v)|0)|0;i=b;return}else if((o|0)==15205){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15171){c[58868]=6;uf(c[13898]|0,176608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15210){uf(c[13898]|0,176336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15169){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15236){uf(ar,176336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15237){uf(ar,176336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function oZ(){var a=0,b=0;a=i;b=c[3524]|0;cf(c[10030]|0,176968,(v=i,i=i+8|0,c[v>>2]=c[(c[58068]|0)+8>>2],v)|0);c[b+8>>2]=c[(c[58068]|0)+12>>2];c[b+12>>2]=c[(c[58068]|0)+16>>2];aI(177432,4,1,c[10030]|0);i=a;return}function o_(){aI(177008,7,1,c[10030]|0);return}function o$(){var b=0;if(a[235520]|0){b=c[10030]|0;aI(125976,2,1,b|0);a[235520]=0}aI(177024,10,1,c[10030]|0);return}function o0(){var b=0,d=0,e=0,f=0.0,g=0;b=i;aI(177432,4,1,c[10030]|0);d=c[59090]|0;e=c[d+12>>2]|0;cf(c[10030]|0,177408,(v=i,i=i+16|0,c[v>>2]=c[d+8>>2],c[v+8>>2]=e,v)|0);e=c[59090]|0;d=c[10030]|0;if((c[e+12>>2]|0)==0){f=+h[e+16>>3];cf(d|0,180656,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}else{f=+h[e+24>>3];cf(d|0,180672,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}d=c[59090]|0;e=c[d+36>>2]|0;g=c[d+40>>2]|0;cf(c[10030]|0,180632,(v=i,i=i+24|0,c[v>>2]=c[d+32>>2],c[v+8>>2]=e,c[v+16>>2]=g,v)|0);if(!(a[235336]|0)){c[58832]=0;a[235520]=0;a[235512]=1;c[58826]=1;i=b;return}aI(177112,255,1,c[10030]|0);c[58832]=0;a[235520]=0;a[235512]=1;c[58826]=1;i=b;return}function o1(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if(a[235520]|0){e=b-(c[58822]|0)|0;f=d-(c[58820]|0)|0;g=c[10030]|0;aF(60,g|0);h=f;i=e}else{e=c[10030]|0;aI(177464,3,1,e|0);if(a[235512]|0){a[235512]=0;e=c[10030]|0;aF(61,e|0);j=d;k=b}else{j=d-(c[58820]|0)|0;k=b-(c[58822]|0)|0}a[235520]=1;h=j;i=k}k=i<<1;i=(k|0)<0?1-k|0:k;k=i&63;j=i>>6;if((j|0)>0){i=k;e=j;while(1){aF(i+63|0,c[10030]|0);j=e&63;f=e>>6;if((f|0)>0){i=j;e=f}else{l=j;break}}}else{l=k}aF((l<<24)-1090519040>>24|0,c[10030]|0);l=h<<1;h=(l|0)<0?1-l|0:l;l=h&63;k=h>>6;if((k|0)>0){m=l;n=k}else{o=l;p=o<<24;q=p-1090519040|0;r=q>>24;s=c[10030]|0;t=aF(r|0,s|0)|0;u=c[10030]|0;v=aF(10,u|0)|0;c[58822]=b;c[58820]=d;return}while(1){aF(m+63|0,c[10030]|0);l=n&63;k=n>>6;if((k|0)>0){m=l;n=k}else{o=l;break}}p=o<<24;q=p-1090519040|0;r=q>>24;s=c[10030]|0;t=aF(r|0,s|0)|0;u=c[10030]|0;v=aF(10,u|0)|0;c[58822]=b;c[58820]=d;return}function o2(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(a[235520]|0){e=d-(c[58820]|0)|0;f=b-(c[58822]|0)|0}else{g=c[10030]|0;aI(177472,2,1,g|0);if(a[235512]|0){a[235512]=0;g=c[10030]|0;aF(61,g|0);h=d;i=b}else{h=d-(c[58820]|0)|0;i=b-(c[58822]|0)|0}a[235520]=1;e=h;f=i}i=f<<1;f=(i|0)<0?1-i|0:i;i=f&63;h=f>>6;if((h|0)>0){f=i;g=h;while(1){aF(f+63|0,c[10030]|0);h=g&63;j=g>>6;if((j|0)>0){f=h;g=j}else{k=h;break}}}else{k=i}aF((k<<24)-1090519040>>24|0,c[10030]|0);k=e<<1;e=(k|0)<0?1-k|0:k;k=e&63;i=e>>6;if((i|0)>0){l=k;m=i}else{n=k;o=n<<24;p=o-1090519040|0;q=p>>24;r=c[10030]|0;s=aF(q|0,r|0)|0;t=c[10030]|0;u=aF(10,t|0)|0;c[58822]=b;c[58820]=d;return}while(1){aF(l+63|0,c[10030]|0);k=m&63;i=m>>6;if((i|0)>0){l=k;m=i}else{n=k;break}}o=n<<24;p=o-1090519040|0;q=p>>24;r=c[10030]|0;s=aF(q|0,r|0)|0;t=c[10030]|0;u=aF(10,t|0)|0;c[58822]=b;c[58820]=d;return}function o3(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if(a[235520]|0){e=c[10030]|0;aI(125976,2,1,e|0);a[235520]=0}e=(b|0)>-1;if(a[236376]|0){if(e){if(a[235336]|0){c[59092]=(b&7)+1}f=(b>>>0)%24>>>0}else{f=b}if((f|0)==(c[58846]|0)){i=d;return}do{if((f|0)>-1){g=c[10030]|0;h=c[235344+(f>>>3<<2)>>2]|0;if(a[235336]|0){j=c[59092]|0;k=c[235480+((f&7)<<2)>>2]|0;cf(g|0,177704,(v=i,i=i+24|0,c[v>>2]=h,c[v+8>>2]=j,c[v+16>>2]=k,v)|0);break}else{cf(g|0,177696,(v=i,i=i+8|0,c[v>>2]=h,v)|0);break}}else{if((f|0)==(-2|0)){h=c[10030]|0;aI(177680,6,1,h|0);break}else if((f|0)==(-1|0)){aI(177664,11,1,c[10030]|0);break}else{break}}}while(0);c[58846]=f;i=d;return}else{if(e){if(a[235336]|0){c[59092]=(b&7)+1}l=((b+2|0)%(c[58868]|0)&-1)+1|0}else{l=b}if((l|0)==(c[58846]|0)){i=d;return}do{if((l|0)>-1){b=c[10030]|0;if(a[235336]|0){e=c[59092]|0;cf(b|0,177848,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=e,v)|0);break}else{cf(b|0,177768,(v=i,i=i+8|0,c[v>>2]=l,v)|0);break}}else{if((l|0)==(-2|0)){b=c[10030]|0;aI(177744,15,1,b|0);break}else if((l|0)==(-1|0)){aI(177720,20,1,c[10030]|0);break}else{break}}}while(0);c[58826]=1;c[58846]=l;i=d;return}}function o4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=(c[(c[3524]|0)+16>>2]|0)>>>2;if((c[58832]|0)==1){o1(g+b|0,d)}else{o1(b,d-g|0)}if(a[235520]|0){g=c[10030]|0;aI(125976,2,1,g|0);a[235520]=0}cf(c[10030]|0,177872,(v=i,i=i+8|0,c[v>>2]=e,v)|0);a[235512]=1;i=f;return}function o5(b){b=b|0;var d=0,e=0;if((b|0)==(-90|0)|(b|0)==270){d=-1}else{d=(b|0)!=0&1}c[58832]=d;if(a[235520]|0){b=c[10030]|0;aF(59,b|0);a[235520]=0;e=c[58832]|0}else{e=d}if((e|0)==1){d=c[10030]|0;aI(177968,5,1,d|0);return 1}d=c[10030]|0;if((e|0)==-1){aI(177960,6,1,d|0);return 1}else{aI(177912,5,1,d|0);return 1}return 0}function o6(b){b=b|0;var d=0,e=0;if(a[235520]|0){d=c[10030]|0;aI(125976,2,1,d|0);a[235520]=0}if((b|0)==2){d=c[10030]|0;aI(177984,3,1,d|0);e=1;return e|0}else if((b|0)==1){aI(177992,3,1,c[10030]|0);e=1;return e|0}else if((b|0)==0){aI(178e3,3,1,c[10030]|0);e=1;return e|0}else{e=0;return e|0}return 0}function o7(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;f=i;g=(e|0)<0;if(!(a[28152]|0)){if(g){tH(b,d,e);i=f;return}j=~~(+h[29420]*106.0*.5);k=(e|0)%6&-1;if((k|0)==4){l=(j<<2|0)/3&-1;m=l+d|0;o1(b,m);n=d-((j<<1|0)/3&-1)|0;o2(b-l|0,n);o2(l+b|0,n);o2(b,m);o1(b,d);o2(b,d);i=f;return}else if((k|0)==5){m=b-j|0;o1(m,d);o2(m,d);n=j+b|0;o2(n,d);l=d-j|0;o1(b,l);o2(b,l);o=j+d|0;o2(b,o);o1(m,l);o2(m,l);o2(n,o);o1(m,o);o2(m,o);o2(n,l);i=f;return}else if((k|0)==2){l=b-j|0;n=d-j|0;o1(l,n);o2(l,n);o=j+b|0;o2(o,n);m=j+d|0;o2(o,m);o2(l,m);o2(l,n);o1(b,d);o2(b,d);i=f;return}else if((k|0)==3){n=b-j|0;l=d-j|0;o1(n,l);o2(n,l);m=j+b|0;o=j+d|0;o2(m,o);o1(n,o);o2(n,o);o2(m,l);i=f;return}else if((k|0)==0){l=b-j|0;o1(l,d);o2(b,d-j|0);o2(j+b|0,d);o2(b,j+d|0);o2(l,d);o1(b,d);o2(b,d);i=f;return}else if((k|0)==1){k=b-j|0;o1(k,d);o2(k,d);o2(j+b|0,d);k=d-j|0;o1(b,k);o2(b,k);o2(b,j+d|0);i=f;return}else{i=f;return}}if(g){tH(b,d,e);i=f;return}g=~~(+h[29420]*106.0*.5);j=(e|0)%75&-1;if((j|0)==52){e=(g|0)/2&-1;k=b-e|0;l=e+d|0;o1(k,l);o2(b-g|0,d);m=d-e|0;o2(k,m);o=c[10030]|0;aI(125976,2,1,o|0);a[235520]=0;o=c[10030]|0;aI(179152,5,1,o|0);o2(b,d);o=e+b|0;o2(o,m);o2(b,d-g|0);o2(k,m);e=c[10030]|0;aI(125976,2,1,e|0);a[235520]=0;e=c[10030]|0;aI(179120,11,1,e|0);o1(o,m);o2(g+b|0,d);o2(o,l);m=c[10030]|0;aI(125976,2,1,m|0);a[235520]=0;m=c[10030]|0;aI(179152,5,1,m|0);o2(b,g+d|0);o2(k,l);o2(b,d);o2(o,l);l=c[10030]|0;aI(125976,2,1,l|0);a[235520]=0;l=c[10030]|0;aI(179120,11,1,l|0);i=f;return}else if((j|0)==13){l=((g*3&-1|0)/4&-1)+d|0;o1(b,l);p=+(b>>>0>>>0);q=+(g|0);r=q*2.8531695488854605*.25;s=+(d>>>0>>>0);o=~~(s+q*.9270509831248421*.25);o2(~~(p-r),o);t=q*1.7633557568774194*.25;k=~~(s-q*2.4270509831248424*.25);o2(~~(p-t),k);o2(~~(p+t),k);o2(~~(p+r),o);o2(b,l);o1(b,d);o2(b,d);i=f;return}else if((j|0)==38){l=d-g|0;o1(b,l);o=g+b|0;o2(o,l);o2(o,d);o1(b-g|0,l);aI(125976,2,1,c[10030]|0);a[235520]=0;l=g+d|0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=l,v)|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=o,c[v+8>>2]=l,v)|0);i=f;return}else if((j|0)==14){l=((g*3&-1|0)/4&-1)+d|0;o1(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);r=+(b>>>0>>>0);p=+(g|0);t=p*2.8531695488854605*.25;q=+(d>>>0>>>0);o=~~(q+p*.9270509831248421*.25);o2(~~(r-t),o);s=p*1.7633557568774194*.25;k=~~(q-p*2.4270509831248424*.25);o2(~~(r-s),k);o2(~~(r+s),k);o2(~~(r+t),o);o2(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==68){l=((g*3&-1|0)/4&-1)+d|0;o1(b,l);t=+(b>>>0>>>0);r=+(g|0);s=r*2.8531695488854605*.25;p=+(d>>>0>>>0);o=~~(p+r*.9270509831248421*.25);o2(~~(t-s),o);q=r*1.7633557568774194*.25;k=~~(p-r*2.4270509831248424*.25);o2(~~(t-q),k);o2(~~(t+q),k);o2(~~(t+s),o);o2(b,l);i=f;return}else if((j|0)==33){l=b-g|0;o1(l,d);o=d-g|0;o2(l,o);k=g+b|0;o2(k,o);o=g+d|0;o2(k,o);o2(b,o);o1(l,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=o,v)|0);i=f;return}else if((j|0)==46){o1(b-g|0,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=g+b,c[v+8>>2]=g+d,v)|0);i=f;return}else if((j|0)==22){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178624,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==34){o=b-g|0;o1(o,d);l=d-g|0;o2(o,l);k=g+b|0;o2(k,l);o2(k,d);o1(o,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=g+d,v)|0);i=f;return}else if((j|0)==37){k=d-g|0;o1(b,k);o=g+b|0;o2(o,k);l=g+d|0;o2(o,l);o2(b,l);o1(b-g|0,k);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=l,v)|0);i=f;return}else if((j|0)==3){l=(g*3&-1|0)/4&-1;k=b-l|0;o=d-l|0;o1(k,o);m=l+b|0;o2(m,o);e=l+d|0;o2(m,e);o2(k,e);o2(k,o);o1(b,d);o2(b,d);i=f;return}else if((j|0)==5){o1(b,d);o2(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==10){o=g*3&-1;k=d-((o|0)/4&-1)|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;e=((o|0)/8&-1)+d|0;o2(~~(s-t),e);o2(~~(s+t),e);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==58){k=(g|0)/2&-1;e=b-k|0;o=d-k|0;o1(e,o);o2(b,d-g|0);m=k+b|0;o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(e,o);o2(b-g|0,d);o2(b,g+d|0);o2(g+b|0,d);o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==51){o=(g|0)/2&-1;m=o+b|0;e=d-o|0;o1(m,e);o2(g+b|0,d);o2(b,g+d|0);o2(b-g|0,d);k=b-o|0;o2(k,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(m,e);o2(b,d-g|0);o2(k,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==36){e=d-g|0;o1(b,e);k=g+b|0;o2(k,e);o2(k,d);m=g+d|0;o1(b,m);o=b-g|0;o2(o,m);o2(o,d);o1(o,e);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=m,v)|0);i=f;return}else if((j|0)==42){m=b-g|0;o1(m,d);k=d-g|0;o2(m,k);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;k=g+d|0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=g+b,c[v+8>>2]=k,v)|0);o1(m,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=k,v)|0);i=f;return}else if((j|0)==67){k=(g*3&-1|0)/4&-1;m=b-k|0;o1(m,d);o2(b,d-k|0);o2(k+b|0,d);o2(b,k+d|0);o2(m,d);i=f;return}else if((j|0)==71){m=g*3&-1;k=((m|0)/4&-1)+d|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;e=d-((m|0)/8&-1)|0;o2(~~(t-s),e);o2(~~(t+s),e);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==63){k=(g*3&-1|0)/4&-1;e=b-k|0;m=d-k|0;o1(e,m);o=k+b|0;o2(o,m);l=k+d|0;o2(o,l);o2(e,l);o2(e,m);i=f;return}else if((j|0)==27){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178328,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==15){o1(b,g+d|0);o2(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179104,(v=i,i=i+8|0,c[v>>2]=g,v)|0);i=f;return}else if((j|0)==60){m=(g|0)/2&-1;e=b-m|0;l=m+d|0;o1(e,l);o2(b-g|0,d);o=d-m|0;o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);o2(e,l);o2(b,d);o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==29){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178264,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==69){o1(b-g|0,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;o=(g*3&-1|0)/4&-1;cf(c[10030]|0,178192,(v=i,i=i+16|0,c[v>>2]=o+b,c[v+8>>2]=o+d,v)|0);i=f;return}else if((j|0)==59){o=(g|0)/2&-1;e=o+b|0;l=o+d|0;o1(e,l);o2(b,g+d|0);o2(b-g|0,d);m=b-o|0;k=d-o|0;o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(e,l);o2(g+b|0,d);o2(b,d-g|0);o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==31){k=b-g|0;m=d-g|0;o1(k,m);l=g+b|0;o2(l,m);e=g+d|0;o2(l,e);o2(k,e);o2(k,m);o1(b,e);o2(b,d);i=f;return}else if((j|0)==0){e=b-g|0;o1(e,d);o2(e,d);o2(g+b|0,d);e=d-g|0;o1(b,e);o2(b,e);o2(b,g+d|0);i=f;return}else if((j|0)==9){e=g*3&-1;m=d-((e|0)/4&-1)|0;o1(b,m);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;k=((e|0)/8&-1)+d|0;o2(~~(s-t),k);o2(~~(s+t),k);o2(b,m);o1(b,d);o2(b,d);i=f;return}else if((j|0)==61){m=(g|0)/2&-1;k=m+b|0;e=m+d|0;o1(k,e);o2(b,g+d|0);l=b-m|0;o2(l,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b-g|0,d);o2(b,d-g|0);o2(g+b|0,d);o2(k,e);o2(b,d);o2(l,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==48){e=(g|0)/2&-1;l=b-e|0;k=e+d|0;o1(l,k);o2(b-g|0,d);o2(b,d-g|0);o2(g+b|0,d);m=e+b|0;o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,g+d|0);o2(l,k);o2(b,d);o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==16){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179008,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==1){k=b-g|0;m=d-g|0;o1(k,m);o2(k,m);l=g+b|0;e=g+d|0;o2(l,e);o1(k,e);o2(k,e);o2(l,m);i=f;return}else if((j|0)==55){m=(g|0)/2&-1;l=m+b|0;e=m+d|0;o1(l,e);o2(b,g+d|0);o2(b-g|0,d);o2(b,d-g|0);k=d-m|0;o2(l,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(l,e);o2(g+b|0,d);o2(l,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==7){k=g*3&-1;l=((k|0)/4&-1)+d|0;o1(b,l);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;e=d-((k|0)/8&-1)|0;o2(~~(t-s),e);o2(~~(t+s),e);o2(b,l);o1(b,d);o2(b,d);i=f;return}else if((j|0)==39){l=g+b|0;o1(l,d);e=g+d|0;o2(l,e);k=b-g|0;o2(k,e);e=d-g|0;o2(k,e);o2(b,e);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==28){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178296,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==20){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178752,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=g,c[v+16>>2]=g,c[v+24>>2]=g,v)|0);i=f;return}else if((j|0)==64){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==65){l=g*3&-1;e=((l|0)/4&-1)+d|0;o1(b,e);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;k=d-((l|0)/8&-1)|0;o2(~~(s-t),k);o2(~~(s+t),k);o2(b,e);i=f;return}else if((j|0)==66){e=g*3&-1;k=d-((e|0)/4&-1)|0;o1(b,k);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;l=((e|0)/8&-1)+d|0;o2(~~(t-s),l);o2(~~(t+s),l);o2(b,k);i=f;return}else if((j|0)==62){k=b-g|0;o1(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);o2(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==8){k=g*3&-1;l=((k|0)/4&-1)+d|0;o1(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;e=d-((k|0)/8&-1)|0;o2(~~(s-t),e);o2(~~(s+t),e);o2(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==11){l=(g*3&-1|0)/4&-1;e=b-l|0;o1(e,d);o2(b,d-l|0);o2(l+b|0,d);o2(b,l+d|0);o2(e,d);o1(b,d);o2(b,d);i=f;return}else if((j|0)==70){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178096,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==21){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178720,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==44){e=g+d|0;o1(b,e);l=b-g|0;o2(l,e);o2(l,d);o1(l,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;l=g+b|0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=e,v)|0);i=f;return}else if((j|0)==45){e=g+b|0;o1(e,d);l=g+d|0;o2(e,l);o2(b,l);k=b-g|0;o1(k,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=d,v)|0);o1(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=l,v)|0);i=f;return}else if((j|0)==43){l=g+b|0;o1(l,d);k=g+d|0;o2(l,k);e=b-g|0;o2(e,k);o2(e,d);o1(e,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==53){l=(g|0)/2&-1;e=l+b|0;k=d-l|0;o1(e,k);o2(g+b|0,d);o2(b,g+d|0);m=b-l|0;o=l+d|0;o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b-g|0,d);o2(b,d-g|0);o2(e,k);o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==56){o=(g|0)/2&-1;m=b-o|0;k=o+d|0;o1(m,k);o2(b-g|0,d);o2(b,d-g|0);e=o+b|0;l=d-o|0;o2(e,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(m,k);o2(b,g+d|0);o2(g+b|0,d);o2(e,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==18){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178904,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==73){l=(g*3&-1|0)/4&-1;e=b-l|0;o1(e,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-l|0);o2(l+b|0,d);o2(b,l+d|0);o2(e,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==50){e=(g|0)/2&-1;l=b-e|0;k=d-e|0;o1(l,k);o2(b,d-g|0);o2(g+b|0,d);m=e+b|0;o=e+d|0;o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(l,k);o2(b-g|0,d);o2(b,g+d|0);o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==2){o=b-g|0;o1(o,d);o2(o,d);m=g+b|0;o2(m,d);k=d-g|0;o1(b,k);o2(b,k);l=g+d|0;o2(b,l);o1(o,k);o2(o,k);o2(m,l);o1(o,l);o2(o,l);o2(m,k);i=f;return}else if((j|0)==12){k=(g*3&-1|0)/4&-1;m=b-k|0;o1(m,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-k|0);o2(k+b|0,d);o2(b,k+d|0);o2(m,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==17){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178960,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==4){m=(g*3&-1|0)/4&-1;o1(b-m|0,d-m|0);aI(125976,2,1,c[10030]|0);a[235520]=0;t=+(m|0);cf(c[10030]|0,179264,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)+t,h[v+8>>3]=+(d>>>0>>>0)+t,v)|0);i=f;return}else if((j|0)==72){m=g*3&-1;k=d-((m|0)/4&-1)|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;l=((m|0)/8&-1)+d|0;o2(~~(t-s),l);o2(~~(t+s),l);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==35){k=d-g|0;o1(b,k);l=g+b|0;o2(l,k);m=g+d|0;o2(l,m);l=b-g|0;o2(l,m);o2(l,d);o1(l,k);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==32){k=g+d|0;o1(b,k);l=b-g|0;o2(l,k);m=d-g|0;o2(l,m);l=g+b|0;o2(l,m);o2(l,d);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=k,v)|0);i=f;return}else if((j|0)==47){k=b-g|0;o1(k,d);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);o2(k,d);k=(g|0)/2&-1;o1(b-k|0,k+d|0);o2(b,d);i=f;return}else if((j|0)==40){k=g+d|0;o1(b,k);l=b-g|0;o2(l,k);m=d-g|0;o2(l,m);o2(b,m);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=g+b,c[v+8>>2]=k,v)|0);i=f;return}else if((j|0)==24){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178496,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==6){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==41){k=b-g|0;o1(k,d);m=d-g|0;o2(k,m);o2(b,m);l=g+b|0;o1(l,d);o=g+d|0;o2(l,o);o2(b,o);o1(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=o,v)|0);o1(b,m);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==25){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178392,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=g,c[v+16>>2]=g,c[v+24>>2]=g,v)|0);i=f;return}else if((j|0)==19){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178872,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==23){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178536,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==26){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178360,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==30){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178240,(v=i,i=i+8|0,c[v>>2]=g,v)|0);i=f;return}else if((j|0)==49){l=(g|0)/2&-1;m=b-l|0;o=d-l|0;o1(m,o);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);k=l+d|0;o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b-g|0,d);o2(m,o);o2(b,d);o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==74){k=((g*3&-1|0)/4&-1)+d|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);s=+(b>>>0>>>0);t=+(g|0);q=t*2.8531695488854605*.25;r=+(d>>>0>>>0);m=~~(r+t*.9270509831248421*.25);o2(~~(s-q),m);p=t*1.7633557568774194*.25;o=~~(r-t*2.4270509831248424*.25);o2(~~(s-p),o);o2(~~(s+p),o);o2(~~(s+q),m);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==57){k=(g|0)/2&-1;m=k+b|0;o=k+d|0;o1(m,o);o2(b,g+d|0);l=b-k|0;o2(l,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);e=d-k|0;o2(l,e);o2(b-g|0,d);o2(l,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);o1(l,e);o2(b,d-g|0);o2(m,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(m,o);o2(g+b|0,d);o2(m,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==54){j=(g|0)/2&-1;e=j+b|0;m=d-j|0;o1(e,m);o2(g+b|0,d);o=j+d|0;o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,g+d|0);o2(b-g|0,d);o2(b,d-g|0);o2(e,m);o2(b,d);o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else{i=f;return}}function o8(a){a=+a;h[29420]=a>=0.0?a:1.0;return}function o9(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0;d=i;i=i+64|0;e=d|0;f=d+56|0;g=c[3524]|0;if(a[235520]|0){j=c[10030]|0;aI(125976,2,1,j|0);a[235520]=0}j=bk(b|0,148464)|0;k=e|0;uF(k|0,b|0,j|0);a[e+j|0]=0;e=0;while(1){if(e>>>0>=17){break}l=c[235528+(e*48&-1)>>2]|0;if((a_(k|0,l|0,bk(l|0,180784)|0)|0)==0){break}else{e=e+1|0}}k=e>>>0>16?c[59088]|0:e;c[f>>2]=0;ca(b+(j+1|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=f,v)|0);j=c[f>>2]|0;if((j|0)>0){m=+(j|0)}else{m=+h[29422]}if(m==+h[29421]&(k|0)==(c[59086]|0)){n=0;i=d;return n|0}c[59090]=235528+(k*48&-1);c[59086]=k;h[29421]=m;k=~~(m*1016.0/72.0);c[g+16>>2]=k;c[g+20>>2]=(k<<1>>>0)/3>>>0;k=c[59090]|0;g=c[k+12>>2]|0;cf(c[10030]|0,180696,(v=i,i=i+16|0,c[v>>2]=c[k+8>>2],c[v+8>>2]=g,v)|0);g=c[59090]|0;m=+h[29421];if((c[g+12>>2]|0)==0){o=216.0/(m*2.0);h[g+16>>3]=o;k=c[10030]|0;cf(k|0,180656,(v=i,i=i+8|0,h[v>>3]=o,v)|0)}else{h[g+24>>3]=m;g=c[10030]|0;cf(g|0,180672,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}g=c[59090]|0;k=c[g+36>>2]|0;j=c[g+40>>2]|0;cf(c[10030]|0,180632,(v=i,i=i+24|0,c[v>>2]=c[g+32>>2],c[v+8>>2]=k,c[v+16>>2]=j,v)|0);n=1;i=d;return n|0}function pa(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0.0,Q=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;f=c[8272]|0;if((e|0)<(f|0)){g=e;j=f}else{k=c[58772]|0;l=a[234984]|0;m=l?78720:78704;n=c[58574]|0;o=c[58572]|0;p=be(13048,180808,(v=i,i=i+32|0,c[v>>2]=k,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,v)|0)|0;i=b;return}L20934:while(1){f=c[1054]|0;e=(a[f+(g*40&-1)|0]&1)==0;L20936:do{if(!e){q=c[f+(g*40&-1)+36>>2]|0;r=f+(g*40&-1)+32|0;s=c[10036]|0;t=0;while(1){if((t|0)>=(q|0)){break}if((a[s+((c[r>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L20936}}if((t|0)==1){u=15625;break L20934}}}while(0);r=c[58760]|0;L20943:do{if((r|0)==0){w=235040}else{s=c[f+(g*40&-1)+36>>2]|0;q=c[f+(g*40&-1)+32>>2]|0;x=(s|0)>0;y=c[10036]|0;z=235040;A=r;while(1){L20947:do{if(!e){if(x){B=0;C=0;D=q;while(1){E=a[A+B|0]|0;if(E<<24>>24==(a[y+(B+D|0)|0]|0)){F=D;G=C}else{if(E<<24>>24!=36){break L20947}F=D-1|0;G=1}H=B+1|0;if((H|0)<(G+s|0)){B=H;C=G;D=F}else{break}}if((G|0)==0){I=H}else{w=z;break L20943}}else{I=0}D=a[A+I|0]|0;if((D<<24>>24|0)==36|(D<<24>>24|0)==0){w=z;break L20943}}}while(0);D=z+8|0;C=c[D>>2]|0;if((C|0)==0){w=D;break}else{z=D;A=C}}}}while(0);r=c[w+4>>2]|0;L20960:do{if((r|0)==0){a[234984]=1;a[235e3]=1;a[234992]=1;a[235272]=1;a[235264]=1;c[13898]=g+1}else if((r|0)==1){a[234984]=0;c[13898]=g+1}else{L20963:do{if(!((j|0)<=(g|0)|e)){A=c[f+(g*40&-1)+36>>2]|0;z=f+(g*40&-1)+32|0;s=c[10036]|0;y=0;while(1){if((y|0)>=(A|0)){break}if((a[s+((c[z>>2]|0)+y|0)|0]|0)==(a[y+78280|0]|0)){y=y+1|0}else{break L20963}}if((y|0)!=1){break}J=g+1|0;c[13898]=J;z=(j|0)>(J|0);if(!z){u=15629;break L20934}if((a[f+(J*40&-1)|0]&1)!=0){A=c[f+(J*40&-1)+36>>2]|0;q=f+(J*40&-1)+32|0;x=0;while(1){if((x|0)>=(A|0)){u=15562;break}if((a[s+((c[q>>2]|0)+x|0)|0]|0)==(a[x+78864|0]|0)){x=x+1|0}else{break}}do{if((u|0)==15562){u=0;if((x|0)!=1){break}if((c[58576]|0)!=0){tG()}q=c[10030]|0;aF(219,q|0);c[13898]=(c[13898]|0)+1;break L20960}}while(0);if(!z){u=15627;break L20934}}x=(a[f+(J*40&-1)|0]&1)==0;L20984:do{if(x){u=15578}else{q=c[f+(J*40&-1)+36>>2]|0;A=f+(J*40&-1)+32|0;y=0;while(1){if((y|0)>=(q|0)){u=15571;break}if((a[s+((c[A>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break}}if((u|0)==15571){u=0;if((y|0)==1){u=15628;break L20934}}if(x){u=15578;break}A=c[f+(J*40&-1)+36>>2]|0;q=f+(J*40&-1)+32|0;t=0;while(1){if((t|0)>=(A|0)){break}if((a[s+((c[q>>2]|0)+t|0)|0]|0)==(a[t+148464|0]|0)){t=t+1|0}else{u=15578;break L20984}}if((t|0)==1){K=J;L=j}else{u=15578}}}while(0);if((u|0)==15578){u=0;s=is(d)|0;x=c[s>>2]|0;if((x|0)==2){M=+h[s+8>>3]}else if((x|0)==1){M=+(c[s+8>>2]|0)}else if((x|0)==3){M=+uz(c[s+8>>2]|0,0)}else{u=15582;break L20934}c[58574]=~~M;K=c[13898]|0;L=c[8272]|0}if((L|0)<=(K|0)){u=15631;break L20934}s=c[1054]|0;if((a[s+(K*40&-1)|0]&1)==0){u=15632;break L20934}x=c[s+(K*40&-1)+36>>2]|0;z=s+(K*40&-1)+32|0;q=c[10036]|0;A=0;while(1){if((A|0)>=(x|0)){break}if((a[q+((c[z>>2]|0)+A|0)|0]|0)==(a[A+148464|0]|0)){A=A+1|0}else{u=15633;break L20934}}if((A|0)!=1){u=15630;break L20934}z=K+1|0;c[13898]=z;L21012:do{if((L|0)>(z|0)){if((a[s+(z*40&-1)|0]&1)==0){u=15597;break}x=c[s+(z*40&-1)+36>>2]|0;y=s+(z*40&-1)+32|0;C=0;while(1){if((C|0)>=(x|0)){break}if((a[q+((c[y>>2]|0)+C|0)|0]|0)==(a[C+78864|0]|0)){C=C+1|0}else{u=15597;break L21012}}if((C|0)==1){N=z;O=L}else{u=15597}}else{u=15597}}while(0);if((u|0)==15597){u=0;z=is(d)|0;q=c[z>>2]|0;if((q|0)==3){P=+uz(c[z+8>>2]|0,0)}else if((q|0)==2){P=+h[z+8>>3]}else if((q|0)==1){P=+(c[z+8>>2]|0)}else{u=15601;break L20934}c[58572]=~~P;N=c[13898]|0;O=c[8272]|0}if((O|0)<=(N|0)){u=15621;break L20934}z=c[1054]|0;if((a[z+(N*40&-1)|0]&1)==0){u=15623;break L20934}q=c[z+(N*40&-1)+36>>2]|0;s=z+(N*40&-1)+32|0;z=c[10036]|0;A=0;while(1){if((A|0)>=(q|0)){break}if((a[z+((c[s>>2]|0)+A|0)|0]|0)==(a[A+78864|0]|0)){A=A+1|0}else{u=15622;break L20934}}if((A|0)!=1){u=15620;break L20934}c[13898]=N+1;break L20960}}while(0);s=is(d)|0;z=c[s>>2]|0;if((z|0)==2){Q=+h[s+8>>3]}else if((z|0)==3){Q=+uz(c[s+8>>2]|0,0)}else if((z|0)==1){Q=+(c[s+8>>2]|0)}else{u=15616;break L20934}s=~~Q;z=(s|0)<8?8:s;c[58772]=z;if((z|0)<=15){break}c[58772]=15}}while(0);f=c[13898]|0;e=c[8272]|0;if((f|0)<(e|0)){g=f;j=e}else{u=15624;break}}if((u|0)==15633){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15632){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15625){k=c[58772]|0;l=a[234984]|0;m=l?78720:78704;n=c[58574]|0;o=c[58572]|0;p=be(13048,180808,(v=i,i=i+32|0,c[v>>2]=k,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,v)|0)|0;i=b;return}else if((u|0)==15627){uf(J,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15628){uf(J,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15582){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15621){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15622){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15601){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15623){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15624){k=c[58772]|0;l=a[234984]|0;m=l?78720:78704;n=c[58574]|0;o=c[58572]|0;p=be(13048,180808,(v=i,i=i+32|0,c[v>>2]=k,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,v)|0)|0;i=b;return}else if((u|0)==15629){uf(J,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15630){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15616){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15631){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15620){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function pb(){return}function pc(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0;d=i;i=i+24|0;e=d|0;f=c[3524]|0;g=a[235272]|0?2340:3300;c[58758]=((a[234992]|0?2490:3480)-g|0)/2&-1;h=a[235264]|0?3300:2340;c[58756]=((a[235e3]|0?3480:2490)-h|0)/2&-1;j=(g|0)/(c[58574]|0)&-1;c[58742]=j;c[58738]=j;g=(h|0)/(c[58572]|0)&-1;c[58740]=g;c[58736]=g;c[f+8>>2]=j;c[f+12>>2]=c[58736];aI(180888,37,1,c[10030]|0);if(a[234984]|0){f=c[10030]|0;aF(137,f|0);f=c[10030]|0;aF(13,f|0);f=c[10030]|0;aF(3520,f|0)}aF(205,c[10030]|0);f=a[234984]|0;aF((f?120:24)|(f?0:5)|0,c[10030]|0);f=32;do{b[234432+(f<<1)>>1]=f&65535;f=f+1|0;}while((f|0)<127);b[117217]=225;b[117218]=233;b[117219]=-3800;b[117220]=241;b[117221]=249;b[117222]=-3672;b[117223]=162;b[117224]=163;b[117225]=164;b[117226]=165;b[117227]=167;b[117228]=171;b[117229]=182;b[117230]=-4190;b[117231]=191;b[117232]=187;b[117233]=188;b[117234]=189;b[117235]=190;b[117236]=210;b[117237]=211;b[117238]=251;b[117239]=-4304;b[117240]=212;b[117241]=137;b[117242]=176;b[117243]=161;b[117244]=139;b[117245]=133;b[117246]=140;b[117247]=-4287;b[117248]=8738;b[117250]=186;b[117252]=164;b[117255]=185;b[117343]=-4250;f=32;do{a[f+234688|0]=f&255;f=f+1|0;}while((f|0)<128);uE(234816,-128|0,126);a[234849]=27;a[234850]=7;a[234851]=8;a[234852]=120;a[234853]=10;a[234854]=124;a[234855]=11;a[234856]=25;a[234857]=21;a[234858]=45;a[234859]=12;a[234860]=83;a[234861]=45;a[234862]=20;a[234863]=126;a[234864]=26;a[234865]=12;a[234866]=1;a[234867]=2;a[234868]=29;a[234869]=52;a[234870]=13;a[234871]=5;a[234872]=28;a[234873]=3;a[234874]=45;a[234875]=16;a[234876]=17;a[234877]=18;a[234878]=19;a[234879]=15;uE(234880,65,5);a[234885]=3;a[234886]=1;a[234887]=67;w=1162167621;a[234888]=w&255;w=w>>8;a[234889|0]=w&255;w=w>>8;a[234890|0]=w&255;w=w>>8;a[234891|0]=w&255;w=1229539657;a[234892]=w&255;w=w>>8;a[234893|0]=w&255;w=w>>8;a[234894|0]=w&255;w=w>>8;a[234895|0]=w&255;a[234896]=68;a[234897]=78;uE(234898,79,5);a[234903]=13;a[234904]=2;w=1431655765;a[234905]=w&255;w=w>>8;a[234906|0]=w&255;w=w>>8;a[234907|0]=w&255;w=w>>8;a[234908|0]=w&255;a[234909]=89;a[234910]=32;a[234911]=22;uE(234912,97,5);a[234917]=6;a[234918]=4;a[234919]=99;w=1701143909;a[234920]=w&255;w=w>>8;a[234921|0]=w&255;w=w>>8;a[234922|0]=w&255;w=w>>8;a[234923|0]=w&255;w=1768515945;a[234924]=w&255;w=w>>8;a[234925|0]=w&255;w=w>>8;a[234926|0]=w&255;w=w>>8;a[234927|0]=w&255;a[234928]=100;a[234929]=110;uE(234930,111,5);a[234935]=10;a[234936]=5;w=1970632053;a[234937]=w&255;w=w>>8;a[234938|0]=w&255;w=w>>8;a[234939|0]=w&255;w=w>>8;a[234940|0]=w&255;a[234941]=121;a[234942]=32;a[234943]=121;f=0;j=0;do{j=((b[234432+(f<<1)>>1]|0)!=0&1)+j|0;f=f+1|0;}while((f|0)<127);aF(222,c[10030]|0);aF(1,c[10030]|0);aF(j&255|0,c[10030]|0);j=0;do{f=b[234432+(j<<1)>>1]|0;if(f<<16>>16!=0){g=(f&65535)>>>8;h=c[10030]|0;aF(j|0,h|0);h=g&65535;g=c[10030]|0;aF(h|0,g|0);g=f&255;f=c[10030]|0;aF(g|0,f|0);f=c[10030]|0;aF(1,f|0)}j=j+1|0;}while((j|0)<127);j=c[58772]|0;f=e|0;e=235096+(j<<2)|0;if((c[e>>2]|0)==0){be(f|0,180880,(v=i,i=i+16|0,c[v>>2]=180824,c[v+8>>2]=j,v)|0);g=c[10030]|0;aF(221,g|0);g=c[10030]|0;aF(j|0,g|0);g=c[10030]|0;aF(1,g|0);g=c[10030]|0;aF(1,g|0);g=c[10030]|0;aK(f|0,g|0);g=c[10030]|0;aF(0,g|0);c[e>>2]=j}e=j*5&-1;c[58770]=e;c[58744]=(e|0)/2&-1;c[58812]=(e|0)/3&-1;c[(c[3524]|0)+16>>2]=e;c[(c[3524]|0)+20>>2]=c[58744];aF(207,c[10030]|0);aF(j|0,c[10030]|0);aF(210,c[10030]|0);j=c[58744]|0;aF(j>>>8|0,c[10030]|0);aF(j|0,c[10030]|0);aF(208,c[10030]|0);j=c[58770]|0;aF(j>>>8|0,c[10030]|0);aF(j|0,c[10030]|0);if((c[58576]|0)!=0){tG()}if((c[58814]|0)==0){k=c[10030]|0;l=aF(135,k|0)|0;m=c[10030]|0;n=aF(0,m|0)|0;o=c[10030]|0;p=aF(0,o|0)|0;q=c[10030]|0;r=aF(137,q|0)|0;s=c[10030]|0;t=aF(0,s|0)|0;u=c[10030]|0;x=aF(0,u|0)|0;ph(-1);a[234312]=1;c[58576]=0;i=d;return}c[58814]=0;aF(206,c[10030]|0);aF(0,c[10030]|0);k=c[10030]|0;l=aF(135,k|0)|0;m=c[10030]|0;n=aF(0,m|0)|0;o=c[10030]|0;p=aF(0,o|0)|0;q=c[10030]|0;r=aF(137,q|0)|0;s=c[10030]|0;t=aF(0,s|0)|0;u=c[10030]|0;x=aF(0,u|0)|0;ph(-1);a[234312]=1;c[58576]=0;i=d;return}function pd(){if((c[58576]|0)!=0){tG()}aF(255,c[10030]|0);return}function pe(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;if((c[58576]|0)!=0){tG()}a=c[58580]|0;b=c[58574]|0;d=c[58572]|0;if((a|0)<(aa(d,b)|0)){e=a;f=b;g=d}else{if((c[58576]|0)!=0){tG()}d=c[10030]|0;aF(219,d|0);c[58580]=0;e=0;f=c[58574]|0;g=c[58572]|0}c[58580]=e+1;d=c[58758]|0;b=c[58742]|0;a=aa(b,(e|0)%(f|0)&-1)+d|0;d=c[58756]|0;h=c[58740]|0;i=aa((g-1|0)-((e|0)/(f|0)&-1)|0,h)+d|0;c[58754]=a+((b-(c[58738]|0)|0)/2&-1);c[58752]=i+((h-(c[58736]|0)|0)/2&-1);return}function pf(a,b){a=a|0;b=b|0;if((c[58576]|0)!=0){tG()}c[58472]=(c[58754]|0)+a;c[58372]=(c[58752]|0)+b;c[58576]=1;return}function pg(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[58576]|0;c[233888+(e<<2)>>2]=(c[58754]|0)+b;c[233488+(e<<2)>>2]=(c[58752]|0)+d;f=e+1|0;c[58576]=f;if(f>>>0<(a[234312]|0?100:0)>>>0){return}tG();c[58472]=(c[58754]|0)+b;c[58372]=(c[58752]|0)+d;c[58576]=1;return}function ph(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;if((c[58576]|0)!=0){tG()}d=(b|0)<-2?-2:b;if((d|0)==-2){e=4}else{b=((d|0)/8&-1)<<1;e=(b|0)<1?1:b}b=((d|0)%8&-1)+2|0;if((c[58766]|0)==(b|0)){return}c[58766]=b;aF(232,c[10030]|0);aF(e|0,c[10030]|0);aF(237,c[10030]|0);aF(0,c[10030]|0);aF(237,c[10030]|0);d=234328+(b*10&-1)|0;f=uA(d|0)|0;aF(f|0,c[10030]|0);f=a[d]|0;if(f<<24>>24==0){return}g=aa(f<<24>>24,e);aF(g>>>8|0,c[10030]|0);aF(g|0,c[10030]|0);if((uA(d|0)|0)>>>0>1){h=1}else{return}while(1){g=h+1|0;f=aa(a[234328+(b*10&-1)+h|0]|0,e);aF(f>>>8|0,c[10030]|0);aF(f|0,c[10030]|0);if(g>>>0<(uA(d|0)|0)>>>0){h=g}else{break}}return}function pi(a){a=a|0;if((c[58576]|0)!=0){tG()}if((c[58814]|0)==(a|0)){return 1}c[58814]=a;aF(206,c[10030]|0);aF(((a|0)==0?0:7)|0,c[10030]|0);return 1}function pj(a){a=a|0;if((c[58576]|0)!=0){tG()}c[58768]=a;return 1}function pk(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=i;d=c[13898]|0;e=c[8272]|0;L21144:do{if((d|0)<(e|0)){f=d;g=e;while(1){h=c[1054]|0;j=(a[h+(f*40&-1)|0]&1)==0;L21147:do{if(!j){k=c[h+(f*40&-1)+36>>2]|0;l=h+(f*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){break}if((a[n+((c[l>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break L21147}}if((o|0)==1){break L21144}}}while(0);l=c[58164]|0;L21154:do{if((l|0)==0){p=232656}else{n=c[h+(f*40&-1)+36>>2]|0;k=c[h+(f*40&-1)+32>>2]|0;q=(n|0)>0;r=c[10036]|0;s=232656;t=l;while(1){L21158:do{if(!j){if(q){u=0;w=0;x=k;while(1){y=a[t+u|0]|0;if(y<<24>>24==(a[r+(u+x|0)|0]|0)){z=x;A=w}else{if(y<<24>>24!=36){break L21158}z=x-1|0;A=1}B=u+1|0;if((B|0)<(A+n|0)){u=B;w=A;x=z}else{break}}if((A|0)==0){C=B}else{p=s;break L21154}}else{C=0}x=a[t+C|0]|0;if((x<<24>>24|0)==36|(x<<24>>24|0)==0){p=s;break L21154}}}while(0);x=s+8|0;w=c[x>>2]|0;if((w|0)==0){p=x;break}else{s=x;t=w}}}}while(0);j=c[p+4>>2]|0;if((j|0)==0){a[34768]=1;l=f+1|0;c[13898]=l;D=l;E=g}else if((j|0)==3){a[34256]=0;l=f+1|0;c[13898]=l;D=l;E=g}else if((j|0)==2){a[34256]=1;l=f+1|0;c[13898]=l;D=l;E=g}else if((j|0)==1){a[34768]=0;j=f+1|0;c[13898]=j;D=j;E=g}else{aI(181208,337,1,c[m>>2]|0);j=(c[13898]|0)+1|0;c[13898]=j;D=j;E=c[8272]|0}if((D|0)<(E|0)){f=D;g=E}else{break}}}}while(0);E=a[34256]|0?181144:181176;be(13048,84616,(v=i,i=i+16|0,c[v>>2]=a[34768]|0?116408:181192,c[v+8>>2]=E,v)|0);i=b;return}function pl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;if((c[58576]|0)!=0){tG()}g=c[58810]|0;if((g|0)!=0){uu(g)}g=(uA(e|0)|0)+2|0;h=ut(g)|0;do{if((h|0)==0){gk();j=ut(g)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180928,v)|0)}else{k=h}}while(0);c[58810]=k;h=a[e]|0;if(h<<24>>24==0){l=k;m=1}else{g=e;e=k;k=1;j=h;while(1){h=j&255;do{if((h|0)==92){n=g+1|0;o=a[n]|0;if(o<<24>>24!=92){p=n;q=o;r=15734;break}a[e]=10;s=k+1|0;t=n}else if((h|0)==32){a[e]=-128;s=k;t=g}else{p=g;q=j;r=15734}}while(0);if((r|0)==15734){r=0;a[e]=a[234688+(q&255)|0]|0;s=k;t=p}h=e+1|0;n=t+1|0;o=a[n]|0;if(o<<24>>24==0){l=h;m=s;break}else{g=n;e=h;k=s;j=o}}}a[l]=10;a[l+1|0]=0;l=(c[58814]|0)==0;j=aa(c[58770]|0,m);m=c[58810]|0;if(l){u=m;w=b;x=(((j|0)/2&-1)+d|0)-(c[58770]|0)|0}else{u=m;w=(((j|0)/-2&-1)+b|0)+(c[58770]|0)|0;x=d}L21204:while(1){d=u;b=w;while(1){j=a8(d|0,10)|0;if((j|0)==0){break L21204}a[j]=0;m=(c[58814]|0)==0;l=c[58812]|0;s=b-(m?0:l)|0;k=(m?l:0)+x|0;l=uA(d|0)|0;e=aa(c[58744]|0,l);l=c[58768]|0;do{if((l|0)==1){g=(e|0)/2&-1;if(m){y=k;z=b-g|0;break}else{y=x-g|0;z=s;break}}else if((l|0)==2){if(m){y=k;z=b-e|0;break}else{y=x-e|0;z=s;break}}else{y=k;z=s}}while(0);aF(135,c[10030]|0);s=(c[58754]|0)+z|0;aF(s>>>8|0,c[10030]|0);aF(s|0,c[10030]|0);aF(137,c[10030]|0);s=(c[58752]|0)+y|0;aF(s>>>8|0,c[10030]|0);aF(s|0,c[10030]|0);aF(209,c[10030]|0);s=c[58754]|0;if((c[58814]|0)==1){k=s+y|0;e=k>>>8;m=c[10030]|0;aF(e|0,m|0);m=c[10030]|0;aF(k|0,m|0)}else{m=s+z|0;s=m>>>8;k=c[10030]|0;aF(s|0,k|0);k=c[10030]|0;aF(m|0,k|0)}aK(d|0,c[10030]|0);A=j+1|0;B=c[58770]|0;if((c[58814]|0)==0){break}else{d=A;b=B+b|0}}u=A;w=b;x=x-B|0}i=f;return}function pm(a){a=a|0;c[8546]=a;return 1}function pn(){var b=0,d=0,e=0,f=0,h=0;b=i;if(a[34544]|a[34552]){i=b;return}a[34544]=1;a[34552]=0;d=c[8619]|0;if((d|0)==34464){e=1;f=0}else{h=d;do{d=c[h+12>>2]|0;c[8619]=d;c[d+8>>2]=34464;uu(h);h=c[8619]|0;}while((h|0)!=34464);e=a[34544]|0;f=a[34552]|0}c[8619]=34464;c[8618]=34464;g[8616]=0.0;g[8617]=9.99899959564209;a[34336]=0;a[34272]=0;a[34192]=0;if(e&f){uD(34480,183216,21)}uE(34560,0,160);cf(c[10030]|0,181648,(v=i,i=i+48|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=72,c[v+24>>2]=9,c[v+32>>2]=40,c[v+40>>2]=56,v)|0);i=b;return}function po(){if(!(a[34544]&(a[34552]^1))){return}aI(182144,19,1,c[10030]|0);a[34544]=0;c[8680]=-1;return}function pp(){var b=0,d=0,e=0,f=0;b=i;if(!(a[34544]&a[34552])){i=b;return}if(!(a[34256]|0)){tF()}aI(182248,117,1,c[10030]|0);d=0;do{e=c[34564+(d<<3)>>2]|0;do{if((e|0)!=0){if((c[34560+(d<<3)>>2]|0)!=1){break}f=c[10030]|0;cf(f|0,182216,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}}while(0);d=d+1|0;}while((d|0)<20);cf(c[10030]|0,182168,(v=i,i=i+8|0,c[v>>2]=c[8680],v)|0);a[34552]=0;i=b;return}function pq(){var b=0,d=0,e=0,f=0,j=0;b=i;if(!(a[34544]&(a[34552]^1))){i=b;return}a[34552]=1;c[8680]=(c[8680]|0)+1;d=c[8619]|0;if((d|0)==34464){e=1;f=1}else{j=d;do{d=c[j+12>>2]|0;c[8619]=d;c[d+8>>2]=34464;uu(j);j=c[8619]|0;}while((j|0)!=34464);e=a[34544]|0;f=a[34552]|0}c[8619]=34464;c[8618]=34464;g[8616]=0.0;g[8617]=9.99899959564209;a[34336]=0;a[34272]=0;a[34192]=0;if(e&f){uD(34480,183216,21)}uE(34560,0,160);f=c[8680]|0;cf(c[10030]|0,182384,(v=i,i=i+32|0,c[v>>2]=f,h[v+8>>3]=+(f|0)*10.1,h[v+16>>3]=15.0,h[v+24>>3]=10.0,v)|0);i=b;return}function pr(b,c){b=b|0;c=c|0;if(!(a[34544]&a[34552])){return}if(!(a[34256]|0)){tF()}g[8616]=+(b>>>0>>>0)/1.0e3;g[8617]=+(9999-c|0)/1.0e3;return}function ps(b){b=b|0;var d=0,e=0,f=0;d=i;if(!(a[34544]&a[34552])){i=d;return}if(!(a[34256]|0)){tF()}do{if((b|0)<0){do{if((b|0)==-1){c[8566]=24;if(a[34768]|0){break}uD(34192,182904,17)}else{c[8566]=16;if(a[34768]|0){break}uD(34192,182904,17)}}while(0);uD(34272,182856,20);uD(34120,182824,25)}else{e=(b|0)%16&-1;c[8566]=e;uD(34272,182800,20);if(a[34768]|0){break}f=((e|0)%6&-1)+2|0;be(34192,182776,(v=i,i=i+8|0,c[v>>2]=f,v)|0);if(a[34768]|0){break}f=((c[8566]|0)%6&-1)+2|0;be(34120,182664,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}}while(0);be(34336,182648,(v=i,i=i+8|0,c[v>>2]=c[34400+(((c[8566]|0)%16&-1)<<2)>>2],v)|0);i=d;return}function pt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0.0,m=0,n=0,o=0;f=i;if(!(a[34544]&a[34552])){i=f;return}if(a[34256]|0){j=1;k=1}else{tF();j=a[34544]|0;k=a[34552]|0}if(j&k){if(!(a[34256]|0)){tF()}g[8616]=+(b>>>0>>>0)/1.0e3;g[8617]=+(10063-d|0)/1.0e3}if((a[e]|0)==0){i=f;return}cf(c[10030]|0,183024,(v=i,i=i+40|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34336,c[v+16>>2]=34272,c[v+24>>2]=34192,c[v+32>>2]=34120,v)|0);if((c[8682]|0)!=72){d=c[10030]|0;cf(d|0,183328,(v=i,i=i+8|0,c[v>>2]=72,v)|0);c[8682]=72}l=+g[8617];d=c[8546]|0;cf(c[10030]|0,182960,(v=i,i=i+40|0,h[v>>3]=+g[8616],h[v+8>>3]=l,c[v+16>>2]=34480,c[v+24>>2]=d,c[v+32>>2]=e,v)|0);e=(c[8566]|0)+1|0;L21319:do{if(a[34544]&a[34552]){d=0;while(1){if((d|0)>=20){break L21319}m=34564+(d<<3)|0;b=c[m>>2]|0;n=(b|0)==0;o=(b|0)==(e|0);if(n|o){break}else{d=d+1|0}}b=34560+(d<<3)|0;if(n){c[m>>2]=e;c[b>>2]=0;break}if(!o){break}c[b>>2]=1}}while(0);a[34336]=0;a[34272]=0;a[34192]=0;a[34480]=0;i=f;return}function pu(b){b=b|0;var c=0;do{if(a[34544]&a[34552]){if((b|0)==0){uD(34480,183216,21);c=1;break}else if((b|0)==2){uD(34480,183136,22);c=1;break}else if((b|0)==1){uD(34480,183184,23);c=1;break}else{c=0;break}}else{c=0}}while(0);return c|0}function pv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0;f=i;if((e|0)<0){j=-1}else{j=(e|0)%6&-1}if(!(a[34544]&a[34552])){i=f;return}if(a[34256]|0){k=1;l=1}else{tF();k=a[34544]|0;l=a[34552]|0}if(k&l){if(a[34256]|0){m=1;n=1}else{tF();m=a[34544]|0;n=a[34552]|0}g[8616]=+(b>>>0>>>0)/1.0e3;g[8617]=+(9999-d|0)/1.0e3;o=m;p=n}else{o=k;p=l}if(o&p){uD(34480,183184,23)}cf(c[10030]|0,183424,(v=i,i=i+16|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34120,v)|0);p=c[33548+(j<<4)>>2]|0;if((c[8682]|0)!=(p|0)){o=c[10030]|0;cf(o|0,183328,(v=i,i=i+8|0,c[v>>2]=p,v)|0);c[8682]=p}q=+g[8617]+ +g[33544+(j<<4)>>2];p=c[33536+(j<<4)>>2]|0;cf(c[10030]|0,183368,(v=i,i=i+32|0,h[v>>3]=+g[8616]+ +g[33540+(j<<4)>>2],h[v+8>>3]=q,c[v+16>>2]=34480,c[v+24>>2]=p,v)|0);aI(183360,3,1,c[10030]|0);p=(c[8566]|0)+1|0;L21360:do{if(a[34544]&a[34552]){j=0;while(1){if((j|0)>=20){break L21360}r=34564+(j<<3)|0;o=c[r>>2]|0;s=(o|0)==0;t=(o|0)==(p|0);if(s|t){break}else{j=j+1|0}}o=34560+(j<<3)|0;if(s){c[r>>2]=p;c[o>>2]=0;break}if(!t){break}c[o>>2]=1}}while(0);a[34480]=0;i=f;return}function pw(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;k=b&15;if((k|0)==1){l=0}else if((k|0)==2){l=c[34736+(((b>>4|0)%8&-1)<<2)>>2]|0}else{l=7}cf(c[10030]|0,183520,(v=i,i=i+16|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34192,v)|0);cf(c[10030]|0,183696,(v=i,i=i+8|0,c[v>>2]=l,v)|0);cf(c[10030]|0,183464,(v=i,i=i+32|0,h[v>>3]=+(d>>>0>>>0)/1.0e3,h[v+8>>3]=+(((9999-e|0)-g|0)>>>0>>>0)/1.0e3,h[v+16>>3]=+(f>>>0>>>0)/1.0e3,h[v+24>>3]=+(g>>>0>>>0)/1.0e3,v)|0);aI(183600,4,1,c[10030]|0);g=(c[8566]|0)+1|0;if(a[34544]&a[34552]){m=0}else{i=j;return}while(1){if((m|0)>=20){n=15879;break}o=34564+(m<<3)|0;f=c[o>>2]|0;p=(f|0)==0;q=(f|0)==(g|0);if(p|q){break}else{m=m+1|0}}if((n|0)==15879){i=j;return}n=34560+(m<<3)|0;if(p){c[o>>2]=g;c[n>>2]=0;i=j;return}if(!q){i=j;return}c[n>>2]=1;i=j;return}function px(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;cf(c[10030]|0,183712,(v=i,i=i+8|0,c[v>>2]=(c[8566]|0)+1,v)|0);cf(c[10030]|0,183696,(v=i,i=i+8|0,c[v>>2]=0,v)|0);cf(c[10030]|0,183648,(v=i,i=i+8|0,c[v>>2]=b,v)|0);f=c[10030]|0;if((b|0)>0){g=0;j=f;while(1){k=+(9999-(c[d+(g*12&-1)+4>>2]|0)|0)/1.0e3;cf(j|0,183624,(v=i,i=i+16|0,h[v>>3]=+(c[d+(g*12&-1)>>2]|0)/1.0e3,h[v+8>>3]=k,v)|0);l=g+1|0;m=c[10030]|0;if((l|0)<(b|0)){g=l;j=m}else{n=m;break}}}else{n=f}aI(183600,4,1,n|0);n=(c[8566]|0)+1|0;if(a[34544]&a[34552]){o=0}else{i=e;return}while(1){if((o|0)>=20){p=15896;break}q=34564+(o<<3)|0;f=c[q>>2]|0;r=(f|0)==0;s=(f|0)==(n|0);if(r|s){break}else{o=o+1|0}}if((p|0)==15896){i=e;return}p=34560+(o<<3)|0;if(r){c[q>>2]=n;c[p>>2]=0;i=e;return}if(!s){i=e;return}c[p>>2]=1;i=e;return}function py(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,j=0;e=i;if(!(a[34544]&a[34552])){i=e;return}f=+(b>>>0>>>0)/1.0e3;h=+(9999-d|0)/1.0e3;d=ut(16)|0;do{if((d|0)==0){gk();b=ut(16)|0;if((b|0)!=0){j=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=182608,v)|0)}else{j=d}}while(0);c[(c[8619]|0)+8>>2]=j;c[(c[(c[8619]|0)+8>>2]|0)+8>>2]=34464;j=c[8619]|0;c[(c[j+8>>2]|0)+12>>2]=j;j=c[(c[8619]|0)+8>>2]|0;c[8619]=j;g[j>>2]=f;g[(c[8619]|0)+4>>2]=h;if(!(a[34256]|0)){i=e;return}tF();i=e;return}function pz(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0.0,bf=0.0,bg=0.0,bi=0.0,bj=0.0,bk=0.0,bl=0.0,bm=0,bn=0,bo=0,bp=0,bq=0.0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0,cI=0.0,cJ=0.0,cK=0,cL=0;b=i;i=i+1272|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=b+120|0;m=b+144|0;n=b+168|0;o=b+192|0;p=b+1248|0;q=b+1256|0;r=b+1264|0;s=b+216|0;uE(s|0,0,1025);if((c[13898]|0)!=2){a[28824]=0}t=c[3524]|0;u=c[t>>2]|0;do{if((aY(u|0,168936)|0)==0){c[7118]=28e3;w=28e3}else{if((aY(u|0,169984)|0)==0){c[7118]=28304;w=28304;break}if((aY(u|0,170664)|0)==0){c[7118]=43680;w=43680;break}else{c[7118]=30304;w=30304;break}}}while(0);if((c[w>>2]|0)==3){w=c[7112]|0;if((w|0)!=0){uu(w)}c[7112]=0}else{c[t+88>>2]=90}t=c[13898]|0;w=c[8272]|0;L21446:do{if((t|0)<(w|0)){u=c[1054]|0;x=(a[u+(t*40&-1)|0]&1)==0;L21448:do{if(!x){y=c[u+(t*40&-1)+36>>2]|0;z=u+(t*40&-1)+32|0;A=c[10036]|0;B=0;while(1){if((B|0)>=(y|0)){break}if((a[A+((c[z>>2]|0)+B|0)|0]|0)==(a[B+103664|0]|0)){B=B+1|0}else{break L21448}}if((B|0)==1){C=t;D=w;break L21446}}}while(0);z=c[57330]|0;L21455:do{if((z|0)==0){E=229320}else{A=c[u+(t*40&-1)+36>>2]|0;y=c[u+(t*40&-1)+32>>2]|0;F=(A|0)>0;G=c[10036]|0;H=229320;I=z;while(1){L21459:do{if(!x){if(F){J=0;K=0;L=y;while(1){M=a[I+J|0]|0;if(M<<24>>24==(a[G+(J+L|0)|0]|0)){N=L;O=K}else{if(M<<24>>24!=36){break L21459}N=L-1|0;O=1}Q=J+1|0;if((Q|0)<(O+A|0)){J=Q;K=O;L=N}else{break}}if((O|0)==0){R=Q}else{E=H;break L21455}}else{R=0}L=a[I+R|0]|0;if((L<<24>>24|0)==36|(L<<24>>24|0)==0){E=H;break L21455}}}while(0);L=H+8|0;K=c[L>>2]|0;if((K|0)==0){E=L;break}else{H=L;I=K}}}}while(0);if((c[E+4>>2]|0)!=3){C=t;D=w;break}x=c[7118]|0;z=c[x>>2]|0;if((z|0)==2){uD(x|0,43536,144)}else if((z|0)==0){uD(x|0,27856,144)}else if((z|0)==3){u=x+32|0;I=c[u>>2]|0;if((I|0)==0){S=x}else{H=u;u=I;while(1){c[H>>2]=c[u>>2];uu(c[u+4>>2]|0);uu(c[u+8>>2]|0);uu(c[u+12>>2]|0);uu(u);I=c[7118]|0;A=I+32|0;G=c[A>>2]|0;if((G|0)==0){S=I;break}else{H=A;u=G}}}uD(S|0,30160,144)}else if((z|0)==1){uD(x|0,28160,144)}u=(c[3524]|0)+96|0;c[u>>2]=c[u>>2]&-33;u=(c[13898]|0)+1|0;c[13898]=u;H=c[8272]|0;if((u|0)>=(H|0)){C=u;D=H;break}G=c[1054]|0;if((a[G+(u*40&-1)|0]&1)==0){T=c[3524]|0;U=T|0;V=c[U>>2]|0;uf(u,134056,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}A=c[G+(u*40&-1)+36>>2]|0;I=G+(u*40&-1)+32|0;G=c[10036]|0;y=0;while(1){if((y|0)>=(A|0)){break}if((a[G+((c[I>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{W=16364;break}}if((W|0)==16364){T=c[3524]|0;U=T|0;V=c[U>>2]|0;uf(u,134056,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}if((y|0)==1){C=u;D=H;break}T=c[3524]|0;U=T|0;V=c[U>>2]|0;uf(u,134056,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}else{C=t;D=w}}while(0);L21495:do{if((C|0)<(D|0)){w=e|0;t=e+8|0;V=d|0;U=d+8|0;T=o|0;S=o+8|0;E=n|0;R=n+8|0;Q=m|0;O=m+8|0;N=l|0;I=l+8|0;G=k|0;A=k+8|0;x=j|0;z=j+8|0;F=f|0;B=f+8|0;K=0;L=0;J=0;M=0;X=0;Y=0;Z=0;_=0;$=0;aa=0;ab=0;ac=0;ad=0;ae=0;af=0;ag=0;ah=0;ai=0;aj=0;ak=0;al=C;am=D;L21497:while(1){an=c[1054]|0;ao=(a[an+(al*40&-1)|0]&1)==0;L21499:do{if(!ao){ap=c[an+(al*40&-1)+36>>2]|0;aq=an+(al*40&-1)+32|0;ar=c[10036]|0;as=0;while(1){if((as|0)>=(ap|0)){break}if((a[ar+((c[aq>>2]|0)+as|0)|0]|0)==(a[as+103664|0]|0)){as=as+1|0}else{break L21499}}if((as|0)==1){break L21495}}}while(0);aq=c[57330]|0;L21506:do{if((aq|0)==0){at=229320}else{ar=c[an+(al*40&-1)+36>>2]|0;ap=c[an+(al*40&-1)+32>>2]|0;au=(ar|0)>0;av=c[10036]|0;aw=229320;ax=aq;while(1){L21510:do{if(!ao){if(au){ay=0;az=0;aA=ap;while(1){aB=a[ax+ay|0]|0;if(aB<<24>>24==(a[av+(ay+aA|0)|0]|0)){aC=aA;aD=az}else{if(aB<<24>>24!=36){break L21510}aC=aA-1|0;aD=1}aE=ay+1|0;if((aE|0)<(aD+ar|0)){ay=aE;az=aD;aA=aC}else{break}}if((aD|0)==0){aF=aE}else{at=aw;break L21506}}else{aF=0}aA=a[ax+aF|0]|0;if((aA<<24>>24|0)==36|(aA<<24>>24|0)==0){at=aw;break L21506}}}while(0);aA=aw+8|0;az=c[aA>>2]|0;if((az|0)==0){at=aA;break}else{aw=aA;ax=az}}}}while(0);ao=c[at+4>>2]|0;L21523:do{if((ao|0)==12){if(aa){W=16377;break L21497}aq=c[7118]|0;if(((c[aq>>2]|0)-2|0)>>>0>=2){W=16378;break L21497}a[aq+18|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=1;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==1){if(ak){W=16375;break L21497}aq=c[7118]|0;if((c[aq>>2]|0)!=3){W=16376;break L21497}c[aq+12>>2]=2;c[13898]=(c[13898]|0)+1;aG=1;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==10){if(J){W=16058;break L21497}a[(c[7118]|0)+17|0]=1;aq=(c[3524]|0)+96|0;c[aq>>2]=c[aq>>2]&-1025;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=1;aZ=L;a_=K}else if((ao|0)==24){c[p>>2]=0;a$=al+1|0;c[13898]=a$;if((c[c[7118]>>2]|0)!=3){W=16139;break L21497}aq=a[an+(a$*40&-1)|0]|0;L21534:do{if((am|0)>(a$|0)){if((aq&1)==0){W=16145;break}ax=c[an+(a$*40&-1)+36>>2]|0;aw=an+(a$*40&-1)+32|0;ar=c[10036]|0;av=0;while(1){if((av|0)>=(ax|0)){break}if((a[ar+((c[aw>>2]|0)+av|0)|0]|0)==(a[av+186440|0]|0)){av=av+1|0}else{W=16145;break L21534}}if((av|0)!=3){a0=ax;a1=aw;W=16148;break}ar=al+2|0;c[13898]=ar;a2=0;a3=ar}else{W=16145}}while(0);if((W|0)==16145){W=0;a0=c[an+(a$*40&-1)+36>>2]|0;a1=an+(a$*40&-1)+32|0;W=16148}L21544:do{if((W|0)==16148){W=0;if(!((aq&1)!=0&(a0|0)>0)){a2=0;a3=a$;break}ar=c[10036]|0;ap=0;au=0;as=c[a1>>2]|0;while(1){if((a[ap+186432|0]|0)==(a[ar+(ap+as|0)|0]|0)){a4=as;a5=au}else{if((ap|0)!=3){a2=0;a3=a$;break L21544}a4=as-1|0;a5=1}az=ap+1|0;if((az|0)<(a5+a0|0)){ap=az;au=a5;as=a4}else{break}}if((a5|0)==0){if(!((ap|0)==2|(ap|0)==6)){a2=0;a3=a$;break}}as=al+2|0;c[13898]=as;a2=1;a3=as}}while(0);if((a3|0)>=(am|0)){W=16165;break L21497}L21559:do{if((a[an+(a3*40&-1)|0]&1)!=0){aq=c[an+(a3*40&-1)+36>>2]|0;as=an+(a3*40&-1)+32|0;au=c[10036]|0;ar=0;while(1){if((ar|0)>=(aq|0)){break}if((a[au+((c[as>>2]|0)+ar|0)|0]|0)==(a[ar+103664|0]|0)){ar=ar+1|0}else{break L21559}}if((ar|0)==1){W=16165;break L21497}}}while(0);a[14176]=1;is(k);a[14176]=0;if((c[G>>2]|0)!=3){W=16164;break L21497}as=c[A>>2]|0;c[p>>2]=as;if((as|0)==0){W=16167;break L21497}as=c[(c[7118]|0)+32>>2]|0;au=ut(16)|0;if((au|0)==0){gk();aq=ut(16)|0;if((aq|0)==0){W=16171;break L21497}else{a6=aq}}else{a6=au}au=a6;aq=c[(c[1054]|0)+((c[13898]|0)*40&-1)+36>>2]|0;ap=ut(aq)|0;if((ap|0)==0){gk();aw=ut(aq)|0;if((aw|0)==0){W=16174;break L21497}else{a7=aw}}else{a7=ap}a8=a6+4|0;c[a8>>2]=a7;iQ(p);ap=c[p>>2]|0;c[a8>>2]=ap;c[a6+12>>2]=0;do{if(a2){c[a6>>2]=0}else{if((a[ap]|0)==60){c[a6+8>>2]=0;c[a6>>2]=0}else{aw=hB(ap)|0;c[a6+8>>2]=aw;if((aw|0)==0){W=16178;break L21497}c[a6>>2]=0}aw=c[8804]|0;if((aw|0)==0){W=16184}else{aq=aw;while(1){aw=c[aq+48>>2]|0;if((aw|0)==0){break}else{aq=aw}}if((a[aq+12|0]&1)==0){W=16184}}if((W|0)==16184){W=0;if((a[37400]&1)==0){break}}tD(au,0)}}while(0);ap=(c[7118]|0)+32|0;if((c[ap>>2]|0)==0){if(a2){uh((c[13898]|0)-1|0,186216,(v=i,i=i+8|0,c[v>>2]=c[a8>>2],v)|0);aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}else{c[ap>>2]=au;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}}do{if((as|0)==0){a9=0}else{ar=c[a8>>2]|0;aw=a2^1;ax=0;av=as;az=0;while(1){ba=av+4|0;aA=(aY(c[ba>>2]|0,ar|0)|0)!=0;if(!(aA|aw)){break}bb=ax|aA^1;aA=c[av>>2]|0;if((aA|0)==0){W=16196;break}else{ax=bb;az=av;av=aA}}if((W|0)==16196){W=0;if(bb){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21523}else{a9=av;break}}ax=c[av>>2]|0;if((az|0)==0){c[ap>>2]=ax}else{c[az>>2]=ax}uu(c[ba>>2]|0);uu(c[av+8>>2]|0);uu(c[av+12>>2]|0);uu(av);aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21523}}while(0);if(a2){uh((c[13898]|0)-1|0,186216,(v=i,i=i+8|0,c[v>>2]=c[a8>>2],v)|0);aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}else{c[a9>>2]=au;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}}else if((ao|0)==13){if(M){W=16069;break L21497}a[(c[7118]|0)+19|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=1;aX=J;aZ=L;a_=K}else if((ao|0)==33){if(ae){W=16332;break L21497}ap=c[7118]|0;if(((c[ap>>2]|0)-2|0)>>>0<2){W=16333;break L21497}a[ap+96|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=1;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==34){if(ae){W=16373;break L21497}ap=c[7118]|0;if(((c[ap>>2]|0)-2|0)>>>0<2){W=16374;break L21497}a[ap+96|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=1;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==21){if(Z){W=16112;break L21497}a[(c[7118]|0)+30|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=1;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==23){if(_){W=16118;break L21497}a[(c[7118]|0)+31|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=1;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==22){if(_){W=16115;break L21497}a[(c[7118]|0)+31|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=1;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==25){ap=c[7118]|0;if((c[ap>>2]|0)!=3){W=16205;break L21497}as=ap+32|0;ap=c[as>>2]|0;if((ap|0)==0){bc=al}else{ax=as;as=ap;do{c[ax>>2]=c[as>>2];uu(c[as+4>>2]|0);uu(c[as+8>>2]|0);uu(c[as+12>>2]|0);uu(as);ax=(c[7118]|0)+32|0;as=c[ax>>2]|0;}while((as|0)!=0);bc=c[13898]|0}c[13898]=bc+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==41){a[(c[7118]|0)+114|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==42){c[13898]=al+1;as=hK()|0;ax=c[7118]|0;h[ax+120>>3]=+(as>>>16&255|0)/255.0;h[ax+128>>3]=+(as>>>8&255|0)/255.0;h[ax+136>>3]=+(as&255|0)/255.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==17){if(K){W=16338;break L21497}as=c[7118]|0;if((c[as>>2]|0)!=3){W=16339;break L21497}a[as+29|0]=0;a[(c[7118]|0)+28|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=1}else if((ao|0)==5){if(aj){W=16344;break L21497}if((c[c[7118]>>2]|0)!=3){W=16345;break L21497}c[(c[3524]|0)+68>>2]=116;c[(c[3524]|0)+88>>2]=90;as=(c[3524]|0)+96|0;c[as>>2]=c[as>>2]&-33;c[13898]=(c[13898]|0)+1;aG=ak;aH=1;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==2){if(ak){W=16334;break L21497}as=c[7118]|0;if((c[as>>2]|0)!=3){W=16335;break L21497}c[as+12>>2]=0;c[13898]=(c[13898]|0)+1;aG=1;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==19){if(K){W=16348;break L21497}as=c[7118]|0;if((c[as>>2]|0)!=3){W=16349;break L21497}a[as+28|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=1}else if((ao|0)==20){if(Z){W=16109;break L21497}a[(c[7118]|0)+30|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=1;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==28){if(L){W=15990;break L21497}a[(c[7118]|0)+16|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=1;a_=K}else if((ao|0)==3){W=15992;break L21497}else if((ao|0)==4){if(aj){W=16347;break L21497}if((c[c[7118]>>2]|0)!=3){W=16346;break L21497}c[(c[3524]|0)+68>>2]=86;c[(c[3524]|0)+88>>2]=126;as=(c[3524]|0)+96|0;c[as>>2]=c[as>>2]|32;c[13898]=(c[13898]|0)+1;aG=ak;aH=1;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==38){if(ac){W=16379;break L21497}if((c[c[7118]>>2]|0)!=2){W=16380;break L21497}uu(c[10956]|0);c[10956]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=1;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==16){if(Y){W=16086;break L21497}c[13898]=al+1;as=is(m)|0;ax=c[as>>2]|0;if((ax|0)==1){bd=+(c[as+8>>2]|0)}else if((ax|0)==2){bd=+h[as+8>>3]}else if((ax|0)==3){bd=+uz(c[as+8>>2]|0,0)}else{W=16091;break L21497}if((c[Q>>2]|0)==3){uu(c[O>>2]|0);c[Q>>2]=1}g[(c[7118]|0)+24>>2]=bd;as=(c[7118]|0)+24|0;if(+g[as>>2]>0.0){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=1;aV=X;aW=M;aX=J;aZ=L;a_=K;break}g[as>>2]=1.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=1;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==30){if(ai){W=16121;break L21497}as=al+1|0;c[13898]=as;L21670:do{if((as|0)<(am|0)){L21672:do{if((a[an+(as*40&-1)|0]&1)!=0){ax=c[an+(as*40&-1)+36>>2]|0;au=an+(as*40&-1)+32|0;ap=c[10036]|0;aw=0;while(1){if((aw|0)>=(ax|0)){break}if((a[ap+((c[au>>2]|0)+aw|0)|0]|0)==(a[aw+103664|0]|0)){aw=aw+1|0}else{break L21672}}if((aw|0)==1){bf=-1.0;break L21670}}}while(0);av=is(l)|0;az=c[av>>2]|0;if((az|0)==3){bg=+uz(c[av+8>>2]|0,0)}else if((az|0)==1){bg=+(c[av+8>>2]|0)}else if((az|0)==2){bg=+h[av+8>>3]}else{W=16132;break L21497}if((c[N>>2]|0)==3){uu(c[I>>2]|0);c[N>>2]=1}bf=bg}else{bf=-1.0}}while(0);g[(c[7118]|0)+92>>2]=bf;as=(c[7118]|0)+92|0;if(+g[as>>2]>=0.0){aG=ak;aH=aj;aI=1;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}g[as>>2]=1.0;aG=ak;aH=aj;aI=1;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==43){c[13898]=al+1;as=c[7118]|0;h[as+136>>3]=-1.0;h[as+128>>3]=-1.0;h[as+120>>3]=-1.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==26){if($){W=16214;break L21497}c[13898]=al+1;as=is(j)|0;av=c[as>>2]|0;if((av|0)==1){bi=+(c[as+8>>2]|0)}else if((av|0)==2){bi=+h[as+8>>3]}else if((av|0)==3){bi=+uz(c[as+8>>2]|0,0)}else{W=16219;break L21497}if((c[x>>2]|0)==3){uu(c[z>>2]|0);c[x>>2]=1}c[(c[7118]|0)+100>>2]=~~bi;as=(c[7118]|0)+100|0;if((c[as>>2]|0)<2){c[as>>2]=2}as=c[13898]|0;if((as|0)>=(c[8272]|0)){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}av=c[1054]|0;az=(a[av+(as*40&-1)|0]&1)==0;if(az){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}au=c[av+(as*40&-1)+36>>2]|0;ap=av+(as*40&-1)+32|0;ax=c[10036]|0;ar=0;while(1){if((ar|0)>=(au|0)){W=16229;break}if((a[ax+((c[ap>>2]|0)+ar|0)|0]|0)==(a[ar+103664|0]|0)){ar=ar+1|0}else{break}}if((W|0)==16229){W=0;if((ar|0)==1){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}}if(az){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}ap=c[av+(as*40&-1)+36>>2]|0;ax=av+(as*40&-1)+32|0;au=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){break}if((a[au+((c[ax>>2]|0)+aq|0)|0]|0)==(a[aq+148464|0]|0)){aq=aq+1|0}else{aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21523}}if((aq|0)!=1){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}c[13898]=as+1;ax=is(f)|0;au=c[ax>>2]|0;if((au|0)==1){bj=+(c[ax+8>>2]|0)}else if((au|0)==2){bj=+h[ax+8>>3]}else if((au|0)==3){bj=+uz(c[ax+8>>2]|0,0)}else{W=16239;break L21497}if((c[F>>2]|0)==3){uu(c[B>>2]|0);c[F>>2]=1}bk=+P(+bj);h[(c[7118]|0)+104>>3]=bk;if(bk<1.0){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else{W=16243;break L21497}}else if((ao|0)==14){if(M){W=16072;break L21497}a[(c[7118]|0)+19|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=1;aX=J;aZ=L;a_=K}else if((ao|0)==15){if(X){W=16075;break L21497}c[13898]=al+1;ax=is(n)|0;au=c[ax>>2]|0;if((au|0)==1){bl=+(c[ax+8>>2]|0)}else if((au|0)==2){bl=+h[ax+8>>3]}else if((au|0)==3){bl=+uz(c[ax+8>>2]|0,0)}else{W=16080;break L21497}if((c[E>>2]|0)==3){uu(c[R>>2]|0);c[E>>2]=1}g[(c[7118]|0)+20>>2]=bl;ax=(c[7118]|0)+20|0;if(+g[ax>>2]>0.0){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=1;aW=M;aX=J;aZ=L;a_=K;break}g[ax>>2]=1.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=1;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==35){if(af){W=16352;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)==3){W=16353;break L21497}a[ax+112|0]=1;ax=c[7118]|0;if((c[ax>>2]|0)==2){a[ax+30|0]=1}c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=1;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==18){if(K){W=16340;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=3){W=16341;break L21497}a[ax+29|0]=1;a[(c[7118]|0)+28|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=1}else if((ao|0)==31){if(ad){W=16343;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)>>>0>=2){W=16342;break L21497}a[ax+97|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=1;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==9){if(J){W=16055;break L21497}a[(c[7118]|0)+17|0]=0;ax=(c[3524]|0)+96|0;c[ax>>2]=c[ax>>2]|1024;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=1;aZ=L;a_=K}else if((ao|0)==27){if(L){W=15987;break L21497}a[(c[7118]|0)+16|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=1;a_=K}else if((ao|0)==8){if(ab){W=16358;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=2){W=16359;break L21497}a[ax+113|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=1;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==39){c[13898]=al+1;a[28824]=1;c[7204]=s4(q,r,1)|0;c[(c[3524]|0)+8>>2]=~~(+g[q>>2]*10.0*72.0/+(c[10032]|0));c[(c[3524]|0)+12>>2]=~~(+g[r>>2]*10.0*72.0/+(c[10032]|0));ax=c[3524]|0;c[10962]=c[ax+8>>2]<<1;c[10960]=c[ax+12>>2]<<1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==29){ax=al+1|0;c[13898]=ax;bm=ax;W=16246}else if((ao|0)==7){if(ab){W=16355;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=2){W=16354;break L21497}a[ax+113|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=1;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==37){if(ac){W=16369;break L21497}if((c[c[7118]>>2]|0)!=2){W=16370;break L21497}c[13898]=al+1;uu(c[10956]|0);c[10956]=0;bn=c[13898]|0;if((bn|0)>=(c[8272]|0)){W=16020;break L21497}ax=c[1054]|0;L21766:do{if((a[ax+(bn*40&-1)|0]&1)!=0){au=c[ax+(bn*40&-1)+36>>2]|0;ap=ax+(bn*40&-1)+32|0;av=c[10036]|0;az=0;while(1){if((az|0)>=(au|0)){break}if((a[av+((c[ap>>2]|0)+az|0)|0]|0)==(a[az+103664|0]|0)){az=az+1|0}else{break L21766}}if((az|0)==1){W=16020;break L21497}}}while(0);a[14176]=1;is(o);a[14176]=0;if((c[T>>2]|0)!=3){W=16019;break L21497}ax=c[S>>2]|0;c[10956]=ax;if((ax|0)==0){W=16022;break L21497}else{aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=1;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}}else if((ao|0)==0){if(ak){W=16337;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=3){W=16336;break L21497}c[ax+12>>2]=1;c[13898]=(c[13898]|0)+1;aG=1;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==32){if(ad){W=16367;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)>>>0>=2){W=16368;break L21497}a[ax+97|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=1;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==11){if(aa){W=16372;break L21497}ax=c[7118]|0;if(((c[ax>>2]|0)-2|0)>>>0>=2){W=16371;break L21497}a[ax+18|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=1;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==36){if(af){W=16357;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)==3){W=16356;break L21497}a[ax+112|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=1;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==40){a[(c[7118]|0)+114|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else{bm=al;W=16246}}while(0);L21787:do{if((W|0)==16246){W=0;L21789:do{if((bm|0)<(am|0)){L21791:do{if((a[an+(bm*40&-1)|0]&1)!=0){ao=c[an+(bm*40&-1)+36>>2]|0;ax=an+(bm*40&-1)+32|0;as=c[10036]|0;aq=0;while(1){if((aq|0)>=(ao|0)){break}if((a[as+((c[ax>>2]|0)+aq|0)|0]|0)==(a[aq+103664|0]|0)){aq=aq+1|0}else{break L21791}}if((aq|0)==1){break L21789}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[w>>2]|0)!=3){c[13898]=bm;break}az=c[t>>2]|0;if((az|0)==0){break}if(ag){W=16256;break L21497}ax=c[7118]|0;if(((c[ax>>2]|0)-2|0)>>>0>=2){W=16268;break L21497}as=bh(az|0,44)|0;do{if((as|0)==0){bo=ah}else{if((ca(as+1|0,205104,(v=i,i=i+8|0,c[v>>2]=ax+88,v)|0)|0)!=1){bo=ah;break}a[as]=0;bo=1}}while(0);if((a[az]|0)!=0){do{if((cy(az|0,186120)|0)!=0){uh((c[13898]|0)-1|0,185976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uh(-1,185920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);as=cy(az|0,186120)|0;if((as|0)==0){break}else{bp=as}do{a[bp]=45;bp=cy(az|0,186120)|0;}while((bp|0)!=0)}}while(0);a[(c[7118]|0)+86|0]=0;aq=(c[7118]|0)+36|0;uF(aq|0,az|0,50)}uu(az);aG=ak;aH=aj;aI=ai;aJ=bo;aK=1;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21787}}while(0);if(ah){W=16270;break L21497}aq=is(d)|0;as=c[aq>>2]|0;if((as|0)==1){bq=+(c[aq+8>>2]|0)}else if((as|0)==2){bq=+h[aq+8>>3]}else if((as|0)==3){bq=+uz(c[aq+8>>2]|0,0)}else{W=16275;break L21497}if((c[V>>2]|0)==3){uu(c[U>>2]|0);c[V>>2]=1}g[(c[7118]|0)+88>>2]=bq;aG=ak;aH=aj;aI=ai;aJ=1;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}}while(0);an=c[13898]|0;aq=c[8272]|0;if((an|0)<(aq|0)){K=a_;L=aZ;J=aX;M=aW;X=aV;Y=aU;Z=aT;_=aS;$=aR;aa=aQ;ab=aP;ac=aO;ad=aN;ae=aM;af=aL;ag=aK;ah=aJ;ai=aI;aj=aH;ak=aG;al=an;am=aq}else{break L21495}}if((W|0)==16352){br=c[3524]|0;bs=br|0;bt=c[bs>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bt,v)|0)}else if((W|0)==16353){br=c[3524]|0;bs=br|0;bt=c[bs>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bt,v)|0)}else if((W|0)==16354){bu=c[3524]|0;bv=bu|0;bw=c[bv>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bw,v)|0)}else if((W|0)==16355){bu=c[3524]|0;bv=bu|0;bw=c[bv>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bw,v)|0)}else if((W|0)==16356){bx=c[3524]|0;by=bx|0;bz=c[by>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bz,v)|0)}else if((W|0)==16357){bx=c[3524]|0;by=bx|0;bz=c[by>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bz,v)|0)}else if((W|0)==16358){bA=c[3524]|0;bB=bA|0;bC=c[bB>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bC,v)|0)}else if((W|0)==16359){bA=c[3524]|0;bB=bA|0;bC=c[bB>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bC,v)|0)}else if((W|0)==16367){bD=c[3524]|0;bE=bD|0;bF=c[bE>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bF,v)|0)}else if((W|0)==16368){bD=c[3524]|0;bE=bD|0;bF=c[bE>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bF,v)|0)}else if((W|0)==16369){bG=c[3524]|0;bH=bG|0;bI=c[bH>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bI,v)|0)}else if((W|0)==16370){bG=c[3524]|0;bH=bG|0;bI=c[bH>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bI,v)|0)}else if((W|0)==16371){bJ=c[3524]|0;bK=bJ|0;bL=c[bK>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bL,v)|0)}else if((W|0)==16372){bJ=c[3524]|0;bK=bJ|0;bL=c[bK>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bL,v)|0)}else if((W|0)==16373){bM=c[3524]|0;bN=bM|0;bO=c[bN>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bO,v)|0)}else if((W|0)==16374){bM=c[3524]|0;bN=bM|0;bO=c[bN>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bO,v)|0)}else if((W|0)==16375){bP=c[3524]|0;bQ=bP|0;bR=c[bQ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bR,v)|0)}else if((W|0)==16376){bP=c[3524]|0;bQ=bP|0;bR=c[bQ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bR,v)|0)}else if((W|0)==16377){bS=c[3524]|0;bT=bS|0;bU=c[bT>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bU,v)|0)}else if((W|0)==16378){bS=c[3524]|0;bT=bS|0;bU=c[bT>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bU,v)|0)}else if((W|0)==16379){bV=c[3524]|0;bW=bV|0;bX=c[bW>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bX,v)|0)}else if((W|0)==16380){bV=c[3524]|0;bW=bV|0;bX=c[bW>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bX,v)|0)}else if((W|0)==16256){uf(c[13898]|0,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16332){bY=c[3524]|0;bZ=bY|0;b_=c[bZ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b_,v)|0)}else if((W|0)==16333){bY=c[3524]|0;bZ=bY|0;b_=c[bZ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b_,v)|0)}else if((W|0)==16334){b$=c[3524]|0;b0=b$|0;b1=c[b0>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b1,v)|0)}else if((W|0)==16335){b$=c[3524]|0;b0=b$|0;b1=c[b0>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b1,v)|0)}else if((W|0)==16336){b2=c[3524]|0;b3=b2|0;b4=c[b3>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b4,v)|0)}else if((W|0)==16337){b2=c[3524]|0;b3=b2|0;b4=c[b3>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b4,v)|0)}else if((W|0)==16338){b5=c[3524]|0;b6=b5|0;b7=c[b6>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b7,v)|0)}else if((W|0)==16339){b5=c[3524]|0;b6=b5|0;b7=c[b6>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b7,v)|0)}else if((W|0)==16340){b8=c[3524]|0;b9=b8|0;cb=c[b9>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cb,v)|0)}else if((W|0)==16341){b8=c[3524]|0;b9=b8|0;cb=c[b9>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cb,v)|0)}else if((W|0)==16342){cc=c[3524]|0;cd=cc|0;ce=c[cd>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ce,v)|0)}else if((W|0)==16343){cc=c[3524]|0;cd=cc|0;ce=c[cd>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ce,v)|0)}else if((W|0)==16344){cf=c[3524]|0;cg=cf|0;ch=c[cg>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ch,v)|0)}else if((W|0)==16345){cf=c[3524]|0;cg=cf|0;ch=c[cg>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ch,v)|0)}else if((W|0)==16346){ci=c[3524]|0;cj=ci|0;ck=c[cj>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ck,v)|0)}else if((W|0)==16347){ci=c[3524]|0;cj=ci|0;ck=c[cj>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ck,v)|0)}else if((W|0)==16348){cl=c[3524]|0;cm=cl|0;cn=c[cm>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cn,v)|0)}else if((W|0)==16349){cl=c[3524]|0;cm=cl|0;cn=c[cm>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cn,v)|0)}else if((W|0)==16139){uf(a$,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16112){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16115){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16091){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16109){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16205){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16178){uf((c[13898]|0)-1|0,219072,(v=i,i=i+8|0,c[v>>2]=c[a8>>2],v)|0)}else if((W|0)==16275){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16219){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16080){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16019){c[13898]=bn;W=16020}else if((W|0)==16239){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16132){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==15992){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16086){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16121){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16214){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16072){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16268){uf((c[13898]|0)-1|0,185864,(v=i,i=i+16|0,c[v>>2]=c[c[3524]>>2],c[v+8>>2]=185832,v)|0)}else if((W|0)==16270){uf(c[13898]|0,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16075){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16058){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16055){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16069){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==15987){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16243){uf((c[13898]|0)-1|0,186184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16171){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=186328,v)|0)}else if((W|0)==16022){co=c[13898]|0;uf(co,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==15990){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16174){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=186296,v)|0)}else if((W|0)==16164){c[13898]=a3;W=16165}else if((W|0)==16167){cp=c[13898]|0;uf(cp,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16118){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}if((W|0)==16020){c[10956]=0;co=bn;uf(co,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16165){c[p>>2]=0;cp=a3;uf(cp,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);cp=c[7118]|0;a3=c[cp>>2]|0;do{if((a3|0)==3){g[7202]=+g[cp+88>>2]}else if((a3|0)==2){g[7202]=+g[cp+88>>2]*2.0}else if((a3|0)==1|(a3|0)==0){bq=+g[cp+88>>2];if(bq>0.0){g[7202]=bq*2.0;break}else{g[7202]=20.0;break}}}while(0);c[(c[3524]|0)+16>>2]=~~(+g[7202]*+g[cp+92>>2]*10.0);cp=c[7118]|0;bq=+g[7202]*+g[cp+92>>2]*10.0;if((a[cp+112|0]&1)==0){c[(c[3524]|0)+20>>2]=~~(bq*6.0/10.0)}else{c[(c[3524]|0)+20>>2]=~~(bq*5.0/10.0)}bq=+g[7202];be(229744,185824,(v=i,i=i+16|0,c[v>>2]=(c[7118]|0)+36,h[v+8>>3]=bq,v)|0);cp=c[7118]|0;a3=c[cp>>2]|0;do{if((a3|0)==3){p=c[cp+32>>2]|0;if((p|0)==0){cq=cp;cr=0;W=16298;break}else{cs=p;ct=0}do{ct=(ct+12|0)+(uA(c[cs+4>>2]|0)|0)|0;cs=c[cs>>2]|0;}while((cs|0)!=0);al=ct+1|0;co=ut(al)|0;do{if((co|0)==0){gk();bn=ut(al)|0;if((bn|0)!=0){cu=bn;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=185800,v)|0)}else{cu=co}}while(0);co=p;al=cu;do{be(al|0,185784,(v=i,i=i+8|0,c[v>>2]=c[co+4>>2],v)|0);al=al+(uA(al|0)|0)|0;co=c[co>>2]|0;}while((co|0)!=0);co=c[7118]|0;cv=cu;cw=co;cx=c[co>>2]|0;W=16297}else{cv=0;cw=cp;cx=a3;W=16297}}while(0);do{if((W|0)==16297){if((cx|0)==3){cq=cw;cr=cv;W=16298;break}else if((cx|0)==2){a[13048]=0;cz=cv;break}else{a3=(a[cw+96|0]&1)!=0?185320:179864;be(13048,199128,(v=i,i=i+16|0,c[v>>2]=(a[cw+97|0]&1)!=0?185408:185368,c[v+8>>2]=a3,v)|0);cz=cv;break}}}while(0);if((W|0)==16298){W=c[cq+12>>2]|0;if((W|0)==0){cA=199032}else{cA=(W|0)==1?78720:78704}W=(c[(c[3524]|0)+68>>2]|0)==86?217456:185688;if((a[cq+28|0]&1)==0){cB=185496}else{cB=(a[cq+29|0]&1)!=0?185600:185528}be(13048,185752,(v=i,i=i+24|0,c[v>>2]=cA,c[v+8>>2]=W,c[v+16>>2]=cB,v)|0);cz=cr}cr=c[7118]|0;cB=(a[cr+17|0]&1)!=0?116440:116408;W=(a[cr+18|0]&1)!=0?185096:185080;cA=(a[cr+19|0]&1)!=0?131504:131584;bq=+g[cr+20>>2];bl=+g[cr+24>>2];cq=(a[cr+30|0]&1)!=0?137776:137232;cv=(a[cr+31|0]&1)!=0?185032:185008;be(s|0,185256,(v=i,i=i+64|0,c[v>>2]=(a[cr+16|0]&1)!=0?185184:185112,c[v+8>>2]=cB,c[v+16>>2]=W,c[v+24>>2]=cA,h[v+32>>3]=bq,h[v+40>>3]=bl,c[v+48>>2]=cq,c[v+56>>2]=cv,v)|0);uC(13048,s|0);cv=c[7118]|0;bl=+h[cv+120>>3];if(bl<0.0){uD(13048+(uA(13048)|0)|0,184912,19);cC=cv}else{cq=~~(bl*255.0);cA=~~(+h[cv+128>>3]*255.0);W=~~(+h[cv+136>>3]*255.0);be(s|0,184960,(v=i,i=i+24|0,c[v>>2]=cq,c[v+8>>2]=cA,c[v+16>>2]=W,v)|0);uC(13048,s|0);cC=c[7118]|0}bl=+h[cC+104>>3];be(s|0,184848,(v=i,i=i+16|0,c[v>>2]=c[cC+100>>2],h[v+8>>3]=bl,v)|0);uC(13048,s|0);cC=c[7118]|0;W=c[cC>>2]|0;if(W>>>0<2){cA=(a[cC+97|0]&1)!=0?185408:185368;cq=(a[cC+96|0]&1)!=0?184832:184816;be(s|0,184840,(v=i,i=i+16|0,c[v>>2]=cA,c[v+8>>2]=cq,v)|0);uC(13048,s|0);cq=c[7118]|0;cD=cq;cE=c[cq>>2]|0}else{cD=cC;cE=W}if((cE|0)==2){cE=(a[cD+113|0]&1)!=0?133784:133640;be(s|0,73368,(v=i,i=i+8|0,c[v>>2]=cE,v)|0);cE=c[10956]|0;if((cE|0)==0){uD(s|0,184720,10)}else{be(s|0,184800,(v=i,i=i+8|0,c[v>>2]=cE,v)|0)}uC(13048,s|0)}do{if((c[11252]|0)==15){cE=c[7118]|0;if((c[cE>>2]|0)!=3){break}cD=(a[cE+114|0]&1)!=0?179864:136208;be(s|0,184664,(v=i,i=i+8|0,c[v>>2]=cD,v)|0);uC(13048,s|0)}}while(0);if(a[28824]|0){cD=c[3524]|0;bl=+((c[cD+8>>2]|0)>>>0>>>0);if((c[7204]|0)==2){bq=bl*2.54/720.0;bj=+((c[cD+12>>2]|0)>>>0>>>0)*2.54/720.0;be(s|0,90672,(v=i,i=i+16|0,h[v>>3]=bq,h[v+8>>3]=bj,v)|0)}else{bj=bl/720.0;bl=+((c[cD+12>>2]|0)>>>0>>>0)/720.0;be(s|0,90632,(v=i,i=i+16|0,h[v>>3]=bj,h[v+8>>3]=bl,v)|0)}uC(13048,s|0)}cD=c[7118]|0;cE=c[cD>>2]|0;do{if((cE|0)==3){W=cD+36|0;bl=+g[cD+88>>2];cC=(cz|0)!=0?cz:179864;be(s|0,184608,(v=i,i=i+24|0,c[v>>2]=W,h[v+8>>3]=bl,c[v+16>>2]=cC,v)|0)}else if((cE|0)==2){bl=+g[cD+88>>2];be(s|0,184552,(v=i,i=i+16|0,c[v>>2]=cD+36,h[v+8>>3]=bl,v)|0)}else{bl=+g[cD+88>>2];if(bl!=0.0){bj=bl;be(s|0,184536,(v=i,i=i+8|0,h[v>>3]=bj,v)|0);break}else{a[s]=0;break}}}while(0);if((cz|0)==0){cF=uC(13048,s|0)|0;cG=c[7118]|0;cH=cG+92|0;cI=+g[cH>>2];cJ=cI;cK=be(s|0,184512,(v=i,i=i+8|0,h[v>>3]=cJ,v)|0)|0;cL=uC(13048,s|0)|0;i=b;return}uu(cz);cF=uC(13048,s|0)|0;cG=c[7118]|0;cH=cG+92|0;cI=+g[cH>>2];cJ=cI;cK=be(s|0,184512,(v=i,i=i+8|0,h[v>>3]=cJ,v)|0)|0;cL=uC(13048,s|0)|0;i=b;return}function pA(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,aA=0;b=i;i=i+4400|0;d=b|0;e=b+8|0;f=b+40|0;j=b+296|0;k=b+304|0;l=c[(c[7118]|0)+12>>2]|0;if((l|0)==1){if(!(a[28824]|0)){c[(c[3524]|0)+8>>2]=5040;c[(c[3524]|0)+12>>2]=7200}n=c[3524]|0;o=+((c[n+8>>2]|0)>>>0>>>0);p=+g[184];q=o*(p+ +g[178])/10.0;r=+((c[n+12>>2]|0)>>>0>>>0);s=+g[44];t=r*(s+ +g[38])/10.0;h[n+176>>3]=10.0;u=t;x=q;y=r*s/10.0;z=o*p/10.0}else if((l|0)==0){do{if(a[28824]|0){c[(c[3524]|0)+8>>2]=c[10962];c[(c[3524]|0)+12>>2]=c[10960]}else{c[(c[3524]|0)+8>>2]=7200;n=(c[3524]|0)+12|0;if((a[(c[7118]|0)+112|0]&1)==0){c[n>>2]=5040;break}else{c[n>>2]=4320;break}}}while(0);n=c[3524]|0;p=+((c[n+8>>2]|0)>>>0>>>0);o=+g[184];s=p*(o+ +g[178])/20.0;r=+((c[n+12>>2]|0)>>>0>>>0);q=+g[44];t=r*(q+ +g[38])/20.0;h[n+176>>3]=20.0;u=t;x=s;y=r*q/20.0;z=p*o/20.0}else if((l|0)==2){if(!(a[28824]|0)){c[(c[3524]|0)+8>>2]=7200;c[(c[3524]|0)+12>>2]=5040}l=c[3524]|0;o=+((c[l+8>>2]|0)>>>0>>>0);p=+g[184];q=o*(p+ +g[178])/10.0;r=+((c[l+12>>2]|0)>>>0>>>0);s=+g[44];t=r*(1.0- +g[38]-s)/10.0;h[l+176>>3]=10.0;u=q;x=r*(1.0-s)/10.0;y=o*p/10.0;z=t}else{uf(-1,199080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=~~u;n=~~x;A=~~y;B=~~z;uB(28840,(c[7118]|0)+36|0);g[7208]=+g[7202];C=c[7118]|0;D=c[C>>2]|0;do{if((D|0)==2){E=k|0;F=c[8244]|0;if((F|0)==0){break}G=uA(F|0)|0;H=G-4|0;if((bh(F|0,46)|0)!=(F+H|0)){uf(-1,187368,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=G+5|0;G=ut(F)|0;do{if((G|0)==0){gk();I=ut(F)|0;if((I|0)!=0){J=I;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=187344,v)|0)}else{J=G}}while(0);G=c[8244]|0;uB(J|0,G|0);G=(c[8244]|0)+H|0;do{if((a_(G|0,187336,4)|0)==0){K=16417}else{if((a_(G|0,187312,4)|0)==0){K=16417;break}if((a[(c[7118]|0)+113|0]&1)==0){be(E|0,186952,(v=i,i=i+8|0,c[v>>2]=199032,v)|0)}else{be(E|0,186960,(v=i,i=i+8|0,c[v>>2]=199032,v)|0)}F=J+H|0;I=(uA(E|0)|0)+1|0;uF(F|0,E|0,I|0);I=bF(J|0,134520)|0;c[10028]=I;L=I}}while(0);do{if((K|0)==16417){if((a[(c[7118]|0)+113|0]&1)!=0){uf(-1,187264,(v=i,i=i+8|0,c[v>>2]=187208,v)|0)}E=G;w=2019914798;a[E]=w&255;w=w>>8;a[E+1|0]=w&255;w=w>>8;a[E+2|0]=w&255;w=w>>8;a[E+3|0]=w&255;c[10028]=c[10030];c[10030]=bF(c[8244]|0,137896)|0;uh(-1,187016,(v=i,i=i+16|0,c[v>>2]=c[8244],c[v+8>>2]=J,v)|0);if((c[10030]|0)==0){uf(-1,186984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{L=c[10028]|0;break}}}while(0);if((L|0)==0){uf(-1,186896,(v=i,i=i+8|0,c[v>>2]=J,v)|0)}G=(uA(J|0)|0)-3|0;E=ut(G)|0;do{if((E|0)==0){gk();H=ut(G)|0;if((H|0)!=0){M=H;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=186872,v)|0)}else{M=E}}while(0);c[7112]=M;E=(uA(J|0)|0)-4|0;uF(M|0,J|0,E|0);E=(uA(J|0)|0)-4|0;a[(c[7112]|0)+E|0]=0;uu(J)}else if((D|0)==3){c[10028]=c[10030]}else{E=c[8244]|0;if((E|0)==0){if((a[C+96|0]&1)!=0){G=c[m>>2]|0;aI(186464,61,1,G|0);a[(c[7118]|0)+96|0]=0}c[10028]=c[10030];break}G=bh(E|0,46)|0;if((G|0)==0){N=a8(E|0,0)|0}else{N=G}if((a[C+96|0]&1)==0){c[10028]=c[10030];break}G=N;H=db(c[7112]|0,(5-E|0)+G|0,186784)|0;c[7112]=H;if((H|0)==0){E=c[m>>2]|0;I=c[8244]|0;cf(E|0,186600,(v=i,i=i+8|0,c[v>>2]=I,v)|0);I=c[m>>2]|0;aI(186560,27,1,I|0);a[(c[7118]|0)+96|0]=0;c[10028]=c[10030];break}I=c[8244]|0;uF(H|0,I|0,(G+1|0)-I|0);I=(c[7112]|0)+(G-(c[8244]|0)|0)|0;w=7565358;a[I]=w&255;w=w>>8;a[I+1|0]=w&255;w=w>>8;a[I+2|0]=w&255;w=w>>8;a[I+3|0]=w&255;I=bF(c[7112]|0,137896)|0;c[10028]=I;if((I|0)!=0){break}cf(c[m>>2]|0,186696,(v=i,i=i+8|0,c[v>>2]=c[7112],v)|0);uu(c[7112]|0);c[7112]=0;a[(c[7118]|0)+96|0]=0;c[10028]=c[10030]}}while(0);N=c[7118]|0;C=(c[N>>2]|0)==3;D=c[N+4>>2]|0;J=c[N+8>>2]|0;N=c[3524]|0;M=(c[N+68>>2]|0)==86;L=M?238344:0;a[28912]=C&1;c[7226]=D;c[7224]=J;c[7120]=0;cG(j|0);k=bg(aN(j|0)|0)|0;a[k+((uA(k|0)|0)-1|0)|0]=0;j=c[c[7118]>>2]|0;do{if((j|0)==2){do{if((c[10030]|0)==0){I=(uA(c[8244]|0)|0)+1|0;G=ut(I)|0;do{if((G|0)==0){gk();H=ut(I)|0;if((H|0)!=0){O=H;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129080,v)|0)}else{O=G}}while(0);G=c[8244]|0;uB(O|0,G|0);lj(O);G=c[8244]|0;if((O|0)==(G|0)|(O|0)==0){P=G;break}uu(O);K=16439}else{K=16439}}while(0);if((K|0)==16439){P=c[8244]|0}if((P|0)==0){uj(c[13898]|0,193824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}G=c[10030]|0;if((G|0)==0){Q=0;R=0;S=0}else{cf(G|0,193768,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);G=c[11252]|0;if((G|0)==1){T=193704}else if((G|0)==2){T=193640}else if((G|0)==3){T=193624}else if((G|0)==4){T=193616}else if((G|0)==5){T=193560}else if((G|0)==6){T=96912}else if((G|0)==7){T=90808}else if((G|0)==9){T=75288}else if((G|0)==10){T=222760}else if((G|0)==12){T=193552}else if((G|0)==13){T=193480}else if((G|0)==16){uf(-1,193408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{T=0}c[1402]=-1;c[10882]=0;G=(c[7118]|0)+36|0;do{if((a[G]|0)==0){U=0;V=0;W=0}else{if((aY(G|0,126024)|0)==0){U=0;V=0;W=0;break}I=(uA(G|0)|0)+1|0;H=ut(I)|0;do{if((H|0)==0){gk();E=ut(I)|0;if((E|0)!=0){X=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193376,v)|0)}else{X=H}}while(0);H=(uA((c[7118]|0)+36|0)|0)+1|0;I=ut(H)|0;do{if((I|0)==0){gk();E=ut(H)|0;if((E|0)!=0){Y=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193376,v)|0)}else{Y=I}}while(0);I=(uA((c[7118]|0)+36|0)|0)+1|0;H=ut(I)|0;do{if((H|0)==0){gk();E=ut(I)|0;if((E|0)!=0){Z=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193376,v)|0)}else{Z=H}}while(0);H=(c[7118]|0)+36|0;uB(X|0,H|0);a[Y]=0;a[Z]=0;H=a8(X|0,44)|0;if((H|0)==0){U=Z;V=Y;W=X;break}a[H]=0;I=H+1|0;uB(Y|0,I|0);I=a8(Y|0,44)|0;if((I|0)==0){U=Z;V=Y;W=X;break}a[I]=0;H=I+1|0;uB(Z|0,H|0);U=Z;V=Y;W=X}}while(0);G=c[7118]|0;if((a[G+113|0]&1)!=0){H=c[10030]|0;z=+g[G+88>>2];G=~~(z+-10.0);I=~~z;cf(H|0,192864,(v=i,i=i+24|0,c[v>>2]=G,c[v+8>>2]=I,c[v+16>>2]=I,v)|0);do{if((W|0)!=0){if((a[W]|0)==0){break}I=c[10030]|0;cf(I|0,192816,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}}while(0);do{if((V|0)!=0){if((a[V]|0)==0){break}I=c[10030]|0;cf(I|0,192784,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}}while(0);do{if((U|0)!=0){if((a[U]|0)==0){break}I=c[10030]|0;cf(I|0,192752,(v=i,i=i+8|0,c[v>>2]=U,v)|0)}}while(0);I=c[10030]|0;aI(192648,57,1,I|0);if((T|0)!=0){I=c[10030]|0;cf(I|0,192544,(v=i,i=i+8|0,c[v>>2]=T,v)|0)}I=c[10030]|0;G=c[3524]|0;z=+((c[G+8>>2]|0)>>>0>>>0)*+g[178]/20.0;y=+((c[G+12>>2]|0)>>>0>>>0)*+g[38]/20.0;G=c[10956]|0;H=(G|0)!=0?G:191528;cf(I|0,191600,(v=i,i=i+40|0,h[v>>3]=z,h[v+8>>3]=y,h[v+16>>3]=z,h[v+24>>3]=y,c[v+32>>2]=H,v)|0)}H=c[10030]|0;aI(191384,12,1,H|0);if((T|0)!=0){H=c[10030]|0;cf(H|0,191184,(v=i,i=i+16|0,c[v>>2]=T,c[v+8>>2]=T,v)|0)}do{if((a[(c[7118]|0)+113|0]&1)==0){H=(W|0)!=0;do{if(H){if((a[W]|0)==0){break}I=c[10030]|0;cf(I|0,191152,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}}while(0);I=(V|0)!=0;do{if(I){if((a[V]|0)==0){break}G=c[10030]|0;cf(G|0,191104,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}}while(0);do{if((U|0)==0){if(H|I){K=16496}}else{if((a[U]|0)==0){K=16496;break}G=c[10030]|0;cf(G|0,191080,(v=i,i=i+8|0,c[v>>2]=U,v)|0);K=16496}}while(0);if((K|0)==16496){I=c[10030]|0;aI(191064,14,1,I|0)}I=c[10956]|0;if((I|0)==0){break}H=c[10030]|0;cf(H|0,154696,(v=i,i=i+8|0,c[v>>2]=I,v)|0)}}while(0);I=c[10030]|0;H=c[7118]|0;G=(a[H+17|0]&1)!=0?225e3:224992;E=(a[H+18|0]&1)!=0?225e3:224992;cf(I|0,189944,(v=i,i=i+16|0,c[v>>2]=G,c[v+8>>2]=E,v)|0);E=c[10030]|0;aI(189536,396,1,E|0);E=c[10030]|0;if((a[(c[7118]|0)+112|0]&1)==0){aI(188600,593,1,E|0)}else{aI(189272,260,1,E|0)}E=c[10030]|0;aI(187688,837,1,E|0);E=c[10030]|0;G=c[3524]|0;y=+((c[G+8>>2]|0)>>>0>>>0)*+g[178];z=+((c[G+12>>2]|0)>>>0>>>0)*+g[38];cf(E|0,187608,(v=i,i=i+24|0,h[v>>3]=.05,h[v+8>>3]=y,h[v+16>>3]=z,v)|0);Q=U;R=V;S=W}E=c[7118]|0;z=+h[E+120>>3];if(z>=0.0){G=c[10030]|0;y=+h[E+128>>3];x=+h[E+136>>3];cf(G|0,187528,(v=i,i=i+24|0,h[v>>3]=z,h[v+8>>3]=y,h[v+16>>3]=x,v)|0);G=c[10030]|0;E=c[3524]|0;x=+((c[E+8>>2]|0)>>>0>>>0)*+g[178];y=+((c[E+12>>2]|0)>>>0>>>0)*+g[38];cf(G|0,187432,(v=i,i=i+16|0,h[v>>3]=x,h[v+8>>3]=y,v)|0)}if((S|0)!=0){uu(S)}if((R|0)!=0){uu(R)}if((Q|0)==0){break}uu(Q)}else if((j|0)==1){cf(c[10030]|0,195248,(v=i,i=i+8|0,h[v>>3]=.05,v)|0);G=c[3524]|0;E=~~(+g[38]*+((c[G+12>>2]|0)>>>0>>>0));cf(c[10030]|0,195216,(v=i,i=i+16|0,c[v>>2]=~~(+g[178]*+((c[G+8>>2]|0)>>>0>>>0)),c[v+8>>2]=E,v)|0);K=16513}else if((j|0)==0){cf(c[10030]|0,194104,(v=i,i=i+8|0,h[v>>3]=.05,v)|0);E=c[3524]|0;G=~~(+g[38]*+((c[E+12>>2]|0)>>>0>>>0));cf(c[10030]|0,194064,(v=i,i=i+16|0,c[v>>2]=~~(+g[178]*+((c[E+8>>2]|0)>>>0>>>0)),c[v+8>>2]=G,v)|0);K=16513}}while(0);if((K|0)==16513){j=c[10028]|0;Q=c[10030]|0;if((j|0)==(Q|0)){aI(193952,21,1,j|0)}else{j=c[3524]|0;R=~~(+g[178]*+((c[j+8>>2]|0)>>>0>>>0)/20.0+.5);S=~~(+g[38]*+((c[j+12>>2]|0)>>>0>>>0)/20.0+.5);j=c[7112]|0;W=bh(j|0,47)|0;V=(W|0)==0?j:W+1|0;W=R*10&-1;cf(Q|0,194008,(v=i,i=i+32|0,c[v>>2]=V,c[v+8>>2]=R,c[v+16>>2]=S,c[v+24>>2]=W,v)|0)}c[7036]=0}W=c[10028]|0;if((c[(c[7118]|0)+12>>2]|0)==0){aI(198992,24,1,W|0)}else{aI(198968,15,1,W|0)}W=c[8244]|0;if((W|0)!=0){S=c[10028]|0;cf(S|0,198936,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}cf(c[10028]|0,230952,(v=i,i=i+32|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=k,c[v+24>>2]=C?198928:179864,v)|0);W=D+B|0;B=J+A|0;A=D+n|0;n=J+l|0;cf(c[10028]|0,198896,(v=i,i=i+32|0,c[v>>2]=W,c[v+8>>2]=B,c[v+16>>2]=A,c[v+24>>2]=n,v)|0);l=c[7118]|0;do{if((c[l>>2]|0)==3){J=c[l+12>>2]|0;if((J|0)==0){_=l;break}D=c[10028]|0;S=(J|0)==2?198832:198816;cf(D|0,198872,(v=i,i=i+8|0,c[v>>2]=S,v)|0);_=c[7118]|0}else{_=l}}while(0);if((c[_+12>>2]|0)==0){$=_;aa=224992}else{_=c[10028]|0;aI(198792,17,1,_|0);_=c[7118]|0;$=_;aa=(c[_+12>>2]|0)==2?225e3:224992}_=(a[$+18|0]&1)!=0?225e3:224992;l=(a[$+19|0]&1)!=0?225e3:224992;y=+g[$+20>>2];S=(a[$+16|0]&1)!=0?225e3:224992;D=(a[$+30|0]&1)!=0?225e3:224992;J=(a[$+31|0]&1)!=0?225e3:224992;x=+g[$+24>>2]*5.0;z=+h[$+120>>3];u=+h[$+128>>3];t=+h[$+136>>3];R=(c[N+16>>2]|0)/-3&-1;cf(c[10028]|0,230144,(v=i,i=i+136|0,c[v>>2]=(a[$+17|0]&1)!=0?225e3:224992,c[v+8>>2]=_,c[v+16>>2]=l,h[v+24>>3]=y,c[v+32>>2]=aa,c[v+40>>2]=S,c[v+48>>2]=D,c[v+56>>2]=J,h[v+64>>3]=x,h[v+72>>3]=z,h[v+80>>3]=u,h[v+88>>3]=t,c[v+96>>2]=R,h[v+104>>3]=10.0,h[v+112>>3]=10.0,h[v+120>>3]=31.5,h[v+128>>3]=31.5,v)|0);cf(c[10028]|0,198632,(v=i,i=i+64|0,c[v>>2]=W,c[v+8>>2]=B,c[v+16>>2]=A,c[v+24>>2]=B,c[v+32>>2]=A,c[v+40>>2]=n,c[v+48>>2]=W,c[v+56>>2]=n,v)|0);n=f|0;f=tE(198600)|0;if((f|0)!=0){if((a6(n|0,256,f|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,f|0)|0)!=0)}az(f|0)}do{if(C){f=c[11252]|0;if((f|0)==12){W=tE(198296)|0;if((W|0)==0){break}if((a6(n|0,256,W|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,W|0)|0)!=0)}az(W|0);break}else if((f|0)==9){A=tE(198384)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==15){W=tE(198232)|0;if((W|0)!=0){if((a6(n|0,256,W|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,W|0)|0)!=0)}az(W|0)}if((c[18090]|0)!=0){break}A=e|0;c[d>>2]=0;B=tE(195944)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{R=a[n]|0;do{if(!((R<<24>>24|0)==35|(R<<24>>24|0)==10)){J=aE(n|0,d|0,16)|0;if(J>>>0>255){if((a[(c[7118]|0)+114|0]&1)==0){break}}D=(c[d>>2]|0)+1|0;c[d>>2]=D;S=(a8(D|0,59)|0)-D|0;uF(A|0,D|0,S|0);a[e+S|0]=0;S=c[18088]|0;if(((c[18086]|0)+8|0)>>>0>S>>>0){D=S+2048|0;c[18088]=D;S=db(c[18090]|0,D,195936)|0;c[18090]=S;ab=S}else{ab=c[18090]|0}c[ab+(c[7114]<<3)>>2]=J;J=bP(A|0)|0;c[(c[18090]|0)+(c[7114]<<3)+4>>2]=J;c[18086]=(c[18086]|0)+8;c[7114]=(c[7114]|0)+1}}while(0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==10){A=tE(198328)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==1){B=tE(198552)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==2){A=tE(198488)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==11|(f|0)==3){B=tE(198472)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==4){A=tE(198456)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==5){B=tE(198440)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==6){A=tE(198424)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==7){B=tE(198408)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==13){A=tE(198272)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else{break}}}while(0);n=c[7118]|0;do{if((c[n>>2]|0)==2){if((a[n+112|0]&1)==0){ac=n;break}ab=c[10028]|0;aI(196392,51,1,ab|0);ab=c[10028]|0;aI(196344,29,1,ab|0);ab=c[10028]|0;aI(196312,28,1,ab|0);ab=c[10028]|0;aI(196216,66,1,ab|0);ab=c[10028]|0;aI(196136,28,1,ab|0);ab=c[10028]|0;aI(196080,39,1,ab|0);ab=c[10028]|0;aI(196032,39,1,ab|0);ab=c[10028]|0;aI(195960,53,1,ab|0);ac=c[7118]|0}else{ac=n}}while(0);if((a[ac+28|0]&1)!=0){n=c[10028]|0;ab=(a[ac+29|0]&1)!=0?225e3:224992;cf(n|0,198176,(v=i,i=i+8|0,c[v>>2]=ab,v)|0)}do{if(M){ab=c[L>>2]|0;if((ab|0)==0){break}else{ad=L;ae=ab}do{ad=ad+4|0;aK(ae|0,c[10028]|0);ae=c[ad>>2]|0;}while((ae|0)!=0)}}while(0);if(C){C=c[7118]|0;ae=c[C+32>>2]|0;if((ae|0)==0){af=C}else{C=ae;do{tD(C,1);ae=c[C+12>>2]|0;if((ae|0)!=0){tz(ae)}C=c[C>>2]|0;}while((C|0)!=0);af=c[7118]|0}tz(af+36|0)}af=bU(131496)|0;if((af|0)==0){C=bU(130312)|0;if((C|0)==0){ag=0;ah=0;ai=1}else{aj=C;K=16610}}else{aj=af;K=16610}do{if((K|0)==16610){af=bP(aj|0)|0;if((af|0)==0){ag=0;ah=0;ai=1;break}if((a[af]|0)==0){ag=0;ah=af;ai=0;break}C=uA(af|0)<<1|1;ae=ut(C)|0;do{if((ae|0)==0){gk();ad=ut(C)|0;if((ad|0)!=0){ak=ad;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197984,v)|0)}else{ak=ae}}while(0);ae=a[af]|0;if(ae<<24>>24==0){al=ak}else{C=af;ad=ak;L=ae;while(1){if((aZ(198168,L<<24>>24|0,4)|0)==0){am=ad;an=L}else{a[ad]=92;am=ad+1|0;an=a[C]|0}ae=C+1|0;M=am+1|0;a[am]=an;A=a[ae]|0;if(A<<24>>24==0){al=M;break}else{C=ae;ad=M;L=A}}}a[al]=0;ag=ak;ah=af;ai=0}}while(0);ak=c[8244]|0;do{if((ak|0)==0){ao=0}else{if((a[ak]|0)==0){ao=0;break}al=uA(ak|0)<<1|1;an=ut(al)|0;do{if((an|0)==0){gk();am=ut(al)|0;if((am|0)!=0){ap=am;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197984,v)|0)}else{ap=an}}while(0);an=a[ak]|0;if(an<<24>>24==0){aq=ap}else{al=ak;af=ap;am=an;while(1){if((aZ(198168,am<<24>>24|0,4)|0)==0){ar=af;as=am}else{a[af]=92;ar=af+1|0;as=a[al]|0}an=al+1|0;aj=ar+1|0;a[ar]=as;K=a[an]|0;if(K<<24>>24==0){aq=aj;break}else{al=an;af=aj;am=K}}}a[aq]=0;ao=ap}}while(0);ap=(ao|0)!=0;aq=(ag|0)!=0;cf(c[10028]|0,229800,(v=i,i=i+40|0,c[v>>2]=ap?ao:179864,c[v+8>>2]=40152,c[v+16>>2]=40160,c[v+24>>2]=aq?ag:179864,c[v+32>>2]=k,v)|0);if(!ai){uu(ah)}if(aq){uu(ag)}if(!ap){at=c[10028]|0;au=aI(198144,16,1,at|0)|0;av=c[3524]|0;aw=av+68|0;ax=c[aw>>2]|0;ay=(ax|0)==86;aA=ay?2:1;c[59584]=aA;i=b;return}uu(ao);at=c[10028]|0;au=aI(198144,16,1,at|0)|0;av=c[3524]|0;aw=av+68|0;ax=c[aw>>2]|0;ay=(ax|0)==86;aA=ay?2:1;c[59584]=aA;i=b;return}function pB(a){a=a|0;c[7230]=a;return 1}function pC(a){a=a|0;c[7198]=a;return 1}function pD(){var b=0,d=0,e=0;b=i;aI(199192,10,1,c[10028]|0);do{if((a[28912]&1)!=0){d=c[10028]|0;aI(199160,17,1,d|0);d=c[57760]|0;if((d|0)==0){break}else{e=d}while(1){d=c[e+4>>2]|0;cf(c[10028]|0,199128,(v=i,i=i+16|0,c[v>>2]=c[e>>2],c[v+8>>2]=(d|0)!=0?73808:140136,v)|0);uu(c[c[57760]>>2]|0);uu(c[57760]|0);c[57760]=d;if((d|0)==0){break}else{e=d}}}}while(0);if((c[(c[7118]|0)+12>>2]|0)==0){i=b;return}cf(c[10028]|0,199112,(v=i,i=i+8|0,c[v>>2]=c[7120],v)|0);i=b;return}function pE(){c[7116]=0;aI(199208,29,1,c[10028]|0);return}function pF(){var b=0,d=0,e=0,f=0,j=0,k=0.0,l=0.0;b=i;d=c[3524]|0;e=(c[7120]|0)+1|0;c[7120]=e;cf(c[10028]|0,202176,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=e,v)|0);if((c[(c[3524]|0)+68>>2]|0)==86&(c[59584]|0)==1){e=c[59586]|0;if((e|0)!=0){f=238344;j=e;do{f=f+4|0;aK(j|0,c[10028]|0);j=c[f>>2]|0;}while((j|0)!=0)}j=c[m>>2]|0;aI(202120,53,1,j|0);c[59584]=2}j=c[7224]|0;k=((c[(c[7118]|0)+12>>2]|0)==0?.5:1.0)/10.0;cf(c[10028]|0,202048,(v=i,i=i+32|0,c[v>>2]=c[7226],c[v+8>>2]=j,h[v+16>>3]=k,h[v+24>>3]=k,v)|0);if((c[(c[7118]|0)+12>>2]|0)==2){j=c[10028]|0;f=-(c[(c[3524]|0)+12>>2]|0)|0;cf(j|0,202016,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}aI(201976,18,1,c[10028]|0);if((a[28912]&1)!=0){f=c[10028]|0;j=(c[7118]|0)+36|0;e=c[d+16>>2]|0;cf(f|0,201872,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=e,v)|0)}c[7116]=0;a[228944]=0;c[57326]=-4e3;c[57328]=-4e3;c[57234]=0;c[57432]=-5;h[28715]=-5.0;h[28714]=-5.0;g[7200]=-1.0;if((c[c[7118]>>2]|0)==2){i=b;return}aI(201808,56,1,c[10028]|0);e=c[10028]|0;if((c[(c[7118]|0)+12>>2]|0)==0){j=c[3524]|0;k=+((c[j+8>>2]|0)>>>0>>>0)*+g[178];l=+((c[j+12>>2]|0)>>>0>>>0)*+g[38];cf(e|0,201752,(v=i,i=i+16|0,h[v>>3]=k,h[v+8>>3]=l,v)|0)}else{aI(201632,46,1,e|0)}aI(201616,5,1,c[10028]|0);i=b;return}function pG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+64|0;f=e|0;g=e+32|0;h=c[57328]|0;j=b-h|0;k=c[57326]|0;l=d-k|0;do{if((h|0)==(b|0)&(k|0)==(d|0)){if(!(a[228944]|0)){break}i=e;return}}while(0);k=f|0;be(k|0,202376|0,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);f=g|0;be(f|0,202240|0,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=l,v)|0);L22391:do{if(a[229704]|0){l=c[10028]|0;cf(l|0,202208|0,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);a[229704]=0}else{l=uA(f|0)|0;do{if(l>>>0<(uA(k|0)|0)>>>0){if(!(a[228944]|0)){break}j=c[10028]|0;aK(f|0,j|0);c[57234]=(c[57234]|0)+1;break L22391}}while(0);l=c[10028]|0;aK(k|0,l|0)}}while(0);a[228944]=1;c[7116]=(c[7116]|0)+1;c[57328]=b;c[57326]=d;i=e;return}function pH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+64|0;f=c[57328]|0;g=c[57326]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}h=e|0;be(h|0,202608,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);j=e+32|0;be(j|0,202560,(v=i,i=i+16|0,c[v>>2]=b-f,c[v+8>>2]=d-g,v)|0);if(!(a[228944]|0)){pG(c[57328]|0,c[57326]|0)}g=uA(j|0)|0;f=g>>>0<(uA(h|0)|0)>>>0;g=c[10028]|0;do{if(f){aK(j|0,g|0);c[57234]=(c[57234]|0)+1;k=(c[7116]|0)+1|0;c[7116]=k;if((k|0)<=104){break}k=c[10028]|0;cf(k|0,202480,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);c[7116]=1}else{aK(h|0,g|0);c[7116]=1}}while(0);a[228944]=1;c[57328]=b;c[57326]=d;i=e;return}function pI(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[7118]|0;do{if((c[e>>2]|0)==2){if((a[e+112|0]&1)==0){f=16692;break}g=(b|0)%4&-1}else{f=16692}}while(0);if((f|0)==16692){g=(b|0)%9&-1}b=g+3|0;g=(b|0)<0?0:b;if((c[57432]|0)==(g|0)){i=d;return}a[228944]=0;if((c[7116]|0)!=0){b=c[10028]|0;aI(215952,7,1,b|0);c[7116]=0;a[228944]=0}c[57432]=g;h[28714]=+h[28715];cf(c[10028]|0,202624,(v=i,i=i+8|0,c[v>>2]=a[g+93672|0]|0,v)|0);c[7116]=0;i=d;return}function pJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[7118]|0;do{if((c[g>>2]|0)==2){if((a[g+112|0]&1)==0){break}if((e|0)<0){h=0}else{h=(e&7)+1|0}j=c[10028]|0;k=c[228960+(h<<2)>>2]|0;cf(j|0,202896,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=k,v)|0);a[228944]=0;c[7116]=0;c[57432]=-5;i=f;return}}while(0);if((e|0)<0){l=0}else{l=((e>>>0)%75>>>0)+1|0}e=c[229e3+(l<<2)>>2]|0;cf(c[10028]|0,202896,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=e,v)|0);a[228944]=0;c[7116]=0;c[57432]=-5;i=f;return}function pK(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;lD(b,d,e,f,g);if((a[(c[7118]|0)+19|0]&1)!=0|(g|0)==0){return}if((c[7116]|0)!=0){h=c[10028]|0;aI(215952,7,1,h|0);c[7116]=0;a[228944]=0}aI(204880,19,1,c[10028]|0);lD(b,d,e,f,-g|0);if((c[7116]|0)!=0){g=c[10028]|0;aI(215952,7,1,g|0);c[7116]=0;a[228944]=0}aI(212688,9,1,c[10028]|0);return}function pL(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0.0,n=0.0;d=i;i=i+8|0;e=d|0;if((b|0)==0){f=16722}else{if((a[b]|0)==0){f=16722}else{j=b}}if((f|0)==16722){j=229744}f=bk(j|0,148464)|0;g[e>>2]=+g[7202];if((a[j+f|0]|0)==44){b=j+(f+1|0)|0;ca(b|0,205104,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}do{if((f|0)==0){b=bP(229744)|0;k=bk(b|0,148464)|0;l=b}else{if((j|0)==0){k=f;l=0;break}k=f;l=bP(j|0)|0}}while(0);a[l+k|0]=0;if((k|0)!=0){j=0;do{f=l+j|0;if((a[f]|0)==32){a[f]=45}j=j+1|0;}while(j>>>0<k>>>0)}if((c[c[7118]>>2]|0)==3){tz(l);k=c[10028]|0;m=+g[e>>2]*+g[(c[7118]|0)+92>>2]*10.0;cf(k|0,205064,(v=i,i=i+16|0,c[v>>2]=l,h[v+8>>3]=m,v)|0);m=+g[e>>2];if(m!=+g[7200]){k=c[10028]|0;j=-~~(m*+g[(c[7118]|0)+92>>2]*10.0/3.0)|0;cf(k|0,205040,(v=i,i=i+8|0,c[v>>2]=j,v)|0);n=+g[e>>2]}else{n=m}g[7200]=n}uu(l);c[(c[3524]|0)+16>>2]=~~(+g[e>>2]*+g[(c[7118]|0)+92>>2]*10.0);c[(c[3524]|0)+20>>2]=~~(+g[e>>2]*+g[(c[7118]|0)+92>>2]*10.0*6.0/10.0);i=d;return 1}function pM(a){a=+a;var b=0;b=i;cf(c[10028]|0,205136,(v=i,i=i+8|0,h[v>>3]=a,v)|0);i=b;return}function pN(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0;j=i;if((c[7116]|0)!=0){k=c[10028]|0;aI(215952,7,1,k|0);c[7116]=0;a[228944]=0}k=b&15;if((k|0)==3){l=c[10028]|0;cf(l|0,205808,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==5){aI(205528,32,1,c[10028]|0)}else if((k|0)==1|(k|0)==4){m=+(b>>4|0)/100.0;n=m<0.0?0.0:m;cf(c[10028]|0,205672,(v=i,i=i+40|0,h[v>>3]=n>1.0?1.0:n,c[v+8>>2]=d,c[v+16>>2]=e,c[v+24>>2]=f,c[v+32>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)!=2){cf(c[10028]|0,205464,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}k=(b>>4|0)%8&-1;if((k|0)==7){b=c[10028]|0;cf(b|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=40,c[v+40>>2]=-30,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==3){cf(c[10028]|0,205240,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==1){cf(c[10028]|0,205352,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=80,c[v+40>>2]=-45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==2){cf(c[10028]|0,205312,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=40,c[v+40>>2]=45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==5){cf(c[10028]|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=80,c[v+40>>2]=-45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==6){cf(c[10028]|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=40,c[v+40>>2]=30,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==4){cf(c[10028]|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=80,c[v+40>>2]=45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else{cf(c[10028]|0,205464,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}}function pO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;f=i;i=i+16|0;g=f|0;h=f+8|0;c[g>>2]=e;if((e|0)==0){b7()}pG(b,d);d=c[7230]|0;if((d|0)!=0){b=c[10028]|0;cf(b|0,202848,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}L22516:do{if((c[11252]|0)==15){d=e;while(1){b=a[d]|0;if(b<<24>>24==0){j=16796;break L22516}if(b<<24>>24<0){break}else{d=d+1|0}}aF(91,c[10028]|0);ug(h,g);d=c[h>>2]|0;do{if((d|0)!=0){b=0;k=d;while(1){l=(b|0)==1;do{if(k>>>0<256){if(l){m=k}else{n=c[10028]|0;aF(40,n|0);m=c[h>>2]|0}if((m-40|0)>>>0<2|(m|0)==92){n=c[10028]|0;aF(92,n|0);o=c[h>>2]|0}else{o=m}n=o<<24>>24;p=c[10028]|0;aF(n|0,p|0);q=1}else{if(l){p=c[10028]|0;aF(41,p|0)}p=c[10028]|0;aF(47,p|0);p=c[7114]|0;n=c[18090]|0;r=c[h>>2]|0;s=0;while(1){if((s|0)>=(p|0)){t=p;break}if((c[n+(s<<3)>>2]|0)==(r|0)){j=16786;break}else{s=s+1|0}}if((j|0)==16786){j=0;r=c[n+(s<<3)+4>>2]|0;p=c[10028]|0;aK(r|0,p|0);t=c[7114]|0}if((s|0)<(t|0)){q=2;break}p=c[h>>2]|0;cf(c[10028]|0,(p>>>0>65535?215776:215728)|0,(v=i,i=i+8|0,c[v>>2]=p,v)|0);q=2}}while(0);ug(h,g);l=c[h>>2]|0;if((l|0)==0){break}else{b=q;k=l}}if((q|0)!=1){break}aF(41,c[10028]|0)}}while(0);d=c[7198]|0;if((d|0)==1){k=c[10028]|0;aI(202768,9,1,k|0);break}else if((d|0)==0){aI(202832,9,1,c[10028]|0);break}else if((d|0)==2){aI(202736,9,1,c[10028]|0);break}else{break}}else{j=16796}}while(0);do{if((j|0)==16796){q=c[10028]|0;aF(40,q|0);q=e+1|0;c[g>>2]=q;t=a[e]|0;o=t<<24>>24;c[h>>2]=o;if(t<<24>>24!=0){m=t;t=q;q=o;while(1){if((m-40&255)<2|m<<24>>24==92){o=c[10028]|0;aF(92,o|0);u=c[h>>2]|0}else{u=q}aF(u<<24>>24|0,c[10028]|0);w=t+1|0;o=a[t]|0;d=o<<24>>24;c[h>>2]=d;if(o<<24>>24==0){break}else{m=o;t=w;q=d}}c[g>>2]=w}q=c[7198]|0;if((q|0)==2){t=c[10028]|0;aI(202632,8,1,t|0);break}else if((q|0)==1){aI(202648,8,1,c[10028]|0);break}else if((q|0)==0){aI(202680,8,1,c[10028]|0);break}else{break}}}while(0);if((c[7230]|0)==0){c[7116]=0;a[228944]=0;i=f;return}aI(212688,9,1,c[10028]|0);c[7116]=0;a[228944]=0;i=f;return}function pP(b){b=+b;var d=0,e=0;d=i;e=c[7116]|0;if((e|0)!=0&+h[28714]==b){i=d;return}if((e|0)!=0){e=c[10028]|0;aI(215952,7,1,e|0);c[7116]=0;a[228944]=0}h[28715]=b;c[57432]=-5;cf(c[10028]|0,205832,(v=i,i=i+8|0,h[v>>3]=b,v)|0);i=d;return}function pQ(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;d=i;i=i+8|0;e=d|0;if((b|0)==0){i=d;return 0}aI(210952,29,1,c[10028]|0);cf(c[10028]|0,210928,(v=i,i=i+8|0,c[v>>2]=c[5168],v)|0);f=0;do{aK(c[34936+(f<<2)>>2]|0,c[10028]|0);f=f+1|0;}while((f|0)!=27);f=c[5163]|0;L22585:do{if((f|0)==100){g=c[10028]|0;aI(210800,28,1,g|0);ty();g=c[b+44>>2]|0;j=c[b+40>>2]|0;tA(209040,g,j,0);tA(209e3,g,j,8);tA(208976,g,j,16);tA(208856,g,j,24)}else if((f|0)==99|(f|0)==102){c[e>>2]=0;aI(210800,28,1,c[10028]|0);ty();j=c[7118]|0;g=fs(0,c[j+100>>2]|0,+h[j+104>>3],e)|0;j=c[e>>2]|0;tA(209040,g,j,0);tA(209e3,g,j,8);tA(208976,g,j,16);tA(208856,g,j,24);uu(g)}else if((f|0)==103){aI(210856,29,1,c[10028]|0)}else if((f|0)==114){aI(210856,29,1,c[10028]|0);if((a[20684]|0)!=0){g=c[7122]|0;if((a[g]|0)==0){break}else{k=0;l=0;n=g}while(1){g=c[28488+((l|1)<<2)>>2]|0;cf(c[10028]|0,207920,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=n,c[v+16>>2]=g,v)|0);k=k+1|0;l=k<<1;n=c[28488+(l<<2)>>2]|0;if((a[n]|0)==0){break L22585}}}g=c[5164]|0;j=(g|0)>-1?g:-g|0;g=j<<1;o=c[28488+(g<<2)>>2]|0;p=c[28488+((g|1)<<2)>>2]|0;cf(c[10028]|0,207920,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=o,c[v+16>>2]=p,v)|0);p=c[5165]|0;o=(p|0)>-1?p:-p|0;p=c[5164]|0;if((o|0)==(((p|0)>-1?p:-p|0)|0)){q=p}else{p=c[10028]|0;j=o<<1;g=c[28488+(j<<2)>>2]|0;r=c[28488+((j|1)<<2)>>2]|0;cf(p|0,207920,(v=i,i=i+24|0,c[v>>2]=o,c[v+8>>2]=g,c[v+16>>2]=r,v)|0);q=c[5164]|0}r=c[5166]|0;g=(r|0)>-1?r:-r|0;if((g|0)==(((q|0)>-1?q:-q|0)|0)){break}r=c[5165]|0;if((g|0)==(((r|0)>-1?r:-r|0)|0)){break}r=g<<1;o=c[28488+(r<<2)>>2]|0;p=c[28488+((r|1)<<2)>>2]|0;cf(c[10028]|0,207920,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=o,c[v+16>>2]=p,v)|0)}else{cf(c[m>>2]|0,210704,(v=i,i=i+24|0,c[v>>2]=210640,c[v+8>>2]=2883,c[v+16>>2]=f<<24>>24,v)|0)}}while(0);aI(210600,37,1,c[10028]|0);aI(210528,67,1,c[10028]|0);cf(c[10028]|0,210480,(v=i,i=i+8|0,h[v>>3]=+h[2705],v)|0);aI(209304,12,1,c[10028]|0);f=c[b+48>>2]|0;if((f|0)==121){b=c[10028]|0;aI(209160,5,1,b|0)}else if((f|0)==114){aI(209216,5,1,c[10028]|0)}else if((f|0)==120){aI(209152,5,1,c[10028]|0)}else if((f|0)==99){aI(209200,5,1,c[10028]|0)}else if((f|0)==104){aI(209208,5,1,c[10028]|0)}else{cf(c[m>>2]|0,209064,(v=i,i=i+24|0,c[v>>2]=210640,c[v+8>>2]=2794,c[v+16>>2]=f<<24>>24,v)|0);aI(209216,5,1,c[10028]|0)}aI(209056,5,1,c[10028]|0);f=c[10028]|0;if((c[5163]|0)==103){aI(210440,30,1,f|0)}else{aI(210368,51,1,f|0)}aI(210312,55,1,c[10028]|0);aI(210184,53,1,c[10028]|0);aI(210040,42,1,c[10028]|0);aI(210008,5,1,c[10028]|0);aI(209864,27,1,c[10028]|0);f=c[5164]|0;if((f|0)<0){b=c[10028]|0;aI(209784,11,1,b|0);s=c[5164]|0}else{s=f}cf(c[10028]|0,209696,(v=i,i=i+8|0,c[v>>2]=(s|0)>-1?s:-s|0,v)|0);s=c[5165]|0;if((s|0)<0){f=c[10028]|0;aI(209784,11,1,f|0);t=c[5165]|0}else{t=s}cf(c[10028]|0,209664,(v=i,i=i+8|0,c[v>>2]=(t|0)>-1?t:-t|0,v)|0);t=c[5166]|0;if((c[5165]|c[5164]|t|0)<0){s=c[10028]|0;aI(84248,2,1,s|0);u=c[5166]|0}else{u=t}if((u|0)<0){t=c[10028]|0;aI(209784,11,1,t|0);w=c[5166]|0}else{w=u}cf(c[10028]|0,209648,(v=i,i=i+8|0,c[v>>2]=(w|0)>-1?w:-w|0,v)|0);aI(209584,42,1,c[10028]|0);aI(209568,11,1,c[10028]|0);aI(209552,3,1,c[10028]|0);aI(209344,55,1,c[10028]|0);aI(213784,9,1,c[10028]|0);i=d;return 0}function pR(){var b=0;if((c[7116]|0)!=0){b=c[10028]|0;aI(215952,7,1,b|0);c[7116]=0;a[228944]=0}aI(211040,30,1,c[10028]|0);return}function pS(b){b=b|0;var d=0,e=0.0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0;d=i;c[57432]=-5;e=+h[28715];if(+h[28714]!=e){h[28714]=e;f=c[10028]|0;aI(211272,3,1,f|0)}f=b|0;g=c[f>>2]|0;if((g|0)==3){j=c[b+4>>2]|0;e=+(j>>>16&255|0)/255.0;k=+(j>>>8&255|0)/255.0;l=+(j&255|0)/255.0;if((c[7116]|0)!=0){j=c[10028]|0;aI(215952,7,1,j|0);c[7116]=0;a[228944]=0}j=c[10028]|0;cf(j|0,211112,(v=i,i=i+24|0,h[v>>3]=e,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);m=16871}else if((g|0)==1){j=c[b+4>>2]|0;if((c[7116]|0)!=0){n=c[10028]|0;aI(215952,7,1,n|0);c[7116]=0;a[228944]=0}n=c[7118]|0;do{if((c[n>>2]|0)==2){if((a[n+112|0]&1)==0){m=16866;break}o=(j|0)%4&-1}else{m=16866}}while(0);if((m|0)==16866){o=(j|0)%9&-1}j=o+3|0;cf(c[10028]|0,211192,(v=i,i=i+8|0,c[v>>2]=a[93672+((j|0)<0?0:j)|0]|0,v)|0);m=16871}else{p=g}if((m|0)==16871){p=c[f>>2]|0}if((p|0)!=5){i=d;return}l=+h[b+8>>3];do{if(l>0.0){b=c[10028]|0;if(l<1.0){k=+(~~(l*1.0e4+.5)|0)*1.0e-4;be(25336,141840,(v=i,i=i+8|0,h[v>>3]=k,v)|0);p=(a[25336]|0)==48&(a[25337]|0)==46?25337:25336;cf(b|0,211072,(v=i,i=i+8|0,c[v>>2]=p,v)|0);break}else{aI(211080,4,1,b|0);break}}else{b=c[10028]|0;aI(211104,4,1,b|0)}}while(0);a[228944]=0;i=d;return}function pT(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;e=i;f=c[d+8>>2]|0;if(a[228944]&(c[7116]|0)!=0){g=c[10028]|0;aI(215952,7,1,g|0);c[7116]=0;a[228944]=0}if((b|0)==4&(f|0)==1601){g=c[10028]|0;j=d|0;k=c[j>>2]|0;l=d+4|0;m=c[l>>2]|0;cf(g|0,211680,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=m,v)|0);m=c[10028]|0;k=c[d+24>>2]|0;g=(c[d+36>>2]|0)-k|0;n=c[d+28>>2]|0;o=(c[d+40>>2]|0)-n|0;p=c[d+12>>2]|0;q=k-p|0;k=c[d+16>>2]|0;r=n-k|0;n=p-(c[j>>2]|0)|0;j=k-(c[l>>2]|0)|0;cf(m|0,211600,(v=i,i=i+48|0,c[v>>2]=g,c[v+8>>2]=o,c[v+16>>2]=q,c[v+24>>2]=r,c[v+32>>2]=n,c[v+40>>2]=j,v)|0);a[228944]=0;i=e;return}j=f>>4;n=f&15;aI(211544,6,1,c[10028]|0);f=c[d+4>>2]|0;cf(c[10028]|0,211680,(v=i,i=i+16|0,c[v>>2]=c[d>>2],c[v+8>>2]=f,v)|0);if((b|0)>1){f=1;do{r=c[10028]|0;q=c[d+(f*12&-1)>>2]|0;if(((f|0)%105&-1|0)==0){o=c[d+(f*12&-1)+4>>2]|0;cf(r|0,211480,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=o,v)|0)}else{o=f-1|0;g=q-(c[d+(o*12&-1)>>2]|0)|0;q=(c[d+(f*12&-1)+4>>2]|0)-(c[d+(o*12&-1)+4>>2]|0)|0;cf(r|0,211528,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=q,v)|0)}f=f+1|0;}while((f|0)<(b|0))}if((n|0)==1|(n|0)==4){s=+(j|0)/100.0;t=s<0.0?0.0:s;b=c[10028]|0;if(t<1.0){s=t;cf(b|0,211448,(v=i,i=i+8|0,h[v>>3]=s,v)|0);a[228944]=0;i=e;return}else{aI(211464,12,1,b|0);a[228944]=0;i=e;return}}else if((n|0)==5){aI(211416,31,1,c[10028]|0)}else if((n|0)!=2){aI(211464,12,1,c[10028]|0);a[228944]=0;i=e;return}n=(j|0)%8&-1;j=c[10028]|0;if((n|0)==0){cf(j|0,211400,(v=i,i=i+8|0,h[v>>3]=.5,v)|0);a[228944]=0;i=e;return}else{cf(j|0,211360,(v=i,i=i+8|0,c[v>>2]=n,v)|0);a[228944]=0;i=e;return}}function pU(){if(!(a[237912]|0)){return}aI(215624,3,1,c[10028]|0);a[237912]=0;return}function pV(b,e,f,g,j){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0;k=i;i=i+24|0;l=k|0;n=k+8|0;o=k+16|0;p=c[5168]|0;q=(p|0)>0?p:256;do{if((q|0)>1){p=1;r=0;do{r=r+1&65535;p=p<<1;}while((p|0)<(q|0));if(r<<16>>16==0|(r&65535)>12){s=r;break}do{if((r&65535)>8){t=12}else{if((r&65535)>4){t=8;break}t=(r&65535)>2?4:r}}while(0);r=(j|0)==1;do{if(r){u=16922}else{p=c[5163]|0;if((p|0)==103){u=16922;break}else if((p|0)!=114){w=1.0;x=0;break}if((a[(c[7118]|0)+17|0]&1)==0){u=16922}else{w=1.0;x=0}}}while(0);if((u|0)==16922){w=+((1<<(t&65535))-1|0)/+(q-1|0);x=1}p=t&65535;y=a[(c[7118]|0)+16|0]&1;z=l|0;A=aa(aa(aa(r?3:1,b),p)+7|0,e);if(y<<24>>24==0){y=((A>>>5)*5&-1)+7|0;B=((y|0)/78&-1)+y|0}else{y=(A>>>2)+1|0;B=((y|0)/78&-1)+y|0}y=ut(B)|0;do{if((y|0)==0){gk();A=ut(B)|0;if((A|0)!=0){C=A;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=211936,v)|0)}else{C=y}}while(0);y=aa(e,b);if(r){D=y*3&-1;E=b*3&-1}else{D=y;E=b}L22728:do{if((D|0)==0){F=C}else{G=+(q|0);A=q-1|0;H=A&65535;I=l+1|0;J=l+2|0;K=l+3|0;L=l+4|0;M=32;N=0;O=0;P=0;Q=C;R=78;S=f;T=D;while(1){U=S+8|0;V=~~(G*+h[S>>3]);W=~~(w*+((((V&65535|0)>(A|0)?H:V)&65535)>>>0));V=M&65535;if((M&65535)<(t&65535)){X=p-V|0;Y=(W&65535)>>>((X&65535)>>>0)|O<<V;Z=X&65535;_=0}else{Y=W&65535|O<<p;Z=N;_=M-t&65535}X=P+1|0;if((X|0)==(E|0)){V=_&7;$=0;ab=Y<<(V&65535);ac=_-V&65535}else{$=X;ab=Y;ac=_}if(ac<<16>>16==0){do{if((a[(c[7118]|0)+16|0]&1)==0){if((ab|0)!=0){X=(ab>>>0)/52200625>>>0;V=X&255;a[z]=V;ad=aa(X,-52200625)+ab|0;X=(ad>>>0)/614125>>>0;a[I]=X&255;ae=((X&255)*-614125&-1)+ad|0;ad=(ae>>>0)/7225>>>0;a[J]=ad&255;X=ae+((ad&255)*-7225&-1)|0;ad=(X>>>0)/85>>>0;a[K]=ad&255;a[L]=X+((ad&255)*-85&-1)&255;ad=Q+1|0;a[Q]=V+33&255;V=R<<16>>16==1;X=V?Q+2|0:ad;a[ad]=V?10:0;ad=X+1|0;a[X]=(a[I]|0)+33&255;ae=V?77:R-2&65535;V=ae<<16>>16==0;af=V?X+2|0:ad;a[ad]=V?10:0;ad=af+1|0;a[af]=(a[J]|0)+33&255;X=V?77:ae-1&65535;ae=X<<16>>16==0;V=ae?af+2|0:ad;a[ad]=ae?10:0;ad=V+1|0;a[V]=(a[K]|0)+33&255;af=ae?77:X-1&65535;X=af<<16>>16==0;ae=X?V+2|0:ad;a[ad]=X?10:0;ad=ae+1|0;a[ae]=(a[L]|0)+33&255;V=X?77:af-1&65535;af=V<<16>>16==0;a[ad]=af?10:0;ag=af?78:V;ah=af?ae+2|0:ad;break}ad=Q+1|0;a[Q]=122;ae=R-1&65535;if(ae<<16>>16!=0){ag=ae;ah=ad;break}a[ad]=10;ag=78;ah=Q+2|0}else{ad=ab>>>4;ae=ab>>>8;af=ab>>>12;V=ab>>>16;X=ab>>>20;ai=ab>>>24;aj=ab>>>28;ak=Q+1|0;be(Q|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=R-1&65535;if(aj<<16>>16==0){a[ak]=10;al=78;am=Q+2|0}else{al=aj;am=ak}ak=am+1|0;aj=ai&15;be(am|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=al-1&65535;if(aj<<16>>16==0){a[ak]=10;an=78;ao=am+2|0}else{an=aj;ao=ak}ak=ao+1|0;aj=X&15;be(ao|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=an-1&65535;if(aj<<16>>16==0){a[ak]=10;ap=78;aq=ao+2|0}else{ap=aj;aq=ak}ak=aq+1|0;aj=V&15;be(aq|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=ap-1&65535;if(aj<<16>>16==0){a[ak]=10;ar=78;as=aq+2|0}else{ar=aj;as=ak}ak=as+1|0;aj=af&15;be(as|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=ar-1&65535;if(aj<<16>>16==0){a[ak]=10;at=78;au=as+2|0}else{at=aj;au=ak}ak=au+1|0;aj=ae&15;be(au|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=at-1&65535;if(aj<<16>>16==0){a[ak]=10;av=78;aw=au+2|0}else{av=aj;aw=ak}ak=aw+1|0;aj=ad&15;be(aw|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=av-1&65535;if(aj<<16>>16==0){a[ak]=10;ax=78;ay=aw+2|0}else{ax=aj;ay=ak}ak=ay+1|0;aj=ab&15;be(ay|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=ax-1&65535;if(aj<<16>>16!=0){ag=aj;ah=ak;break}a[ak]=10;ag=78;ah=ay+2|0}}while(0);if(Z<<16>>16==0){az=0}else{ak=W&65535;aj=Z&65535;az=ak-(ak>>>(aj>>>0)<<aj)|0}aA=ag;aB=ah;aC=az;aD=0;aE=32-Z&65535}else{aA=R;aB=Q;aC=ab;aD=Z;aE=ac}aj=T-1|0;if((aj|0)==0){break}else{M=aE;N=aD;O=aC;P=$;Q=aB;R=aA;S=U;T=aj}}T=aE&65535;if((aE&65535)>=32){F=aB;break}S=4-(T>>>3)|0;if((a[(c[7118]|0)+16|0]&1)==0){R=aC<<T;T=(R>>>0)/52200625>>>0;Q=T&255;a[z]=Q;P=aa(T,-52200625)+R|0;R=(P>>>0)/614125>>>0;a[I]=R&255;T=((R&255)*-614125&-1)+P|0;P=(T>>>0)/7225>>>0;a[J]=P&255;R=T+((P&255)*-7225&-1)|0;P=(R>>>0)/85>>>0;a[K]=P&255;a[L]=R+((P&255)*-85&-1)&255;if((S|0)<0){F=aB;break}P=aB+1|0;a[aB]=Q+33&255;Q=aA-1&65535;R=Q<<16>>16==0;T=R?aB+2|0:P;a[P]=R?10:0;if((S|0)<1){F=T;break}else{aG=1;aH=Q;aJ=R;aK=T}while(1){T=aG+1|0;R=aK+1|0;a[aK]=(a[l+aG|0]|0)+33&255;Q=aJ?77:aH-1&65535;P=Q<<16>>16==0;O=P?aK+2|0:R;a[R]=P?10:0;if((T|0)>(S|0)){F=O;break L22728}else{aG=T;aH=Q;aJ=P;aK=O}}}L=S<<1;if((L|0)>0){aL=aC;aM=L}else{F=aB;break}while(1){K=aM-1|0;a[n+K|0]=aL&15;if((K|0)>0){aL=aL>>>4;aM=K}else{aN=aB;aO=aA;aP=0;break}}while(1){S=aN+1|0;be(aN|0,211896,(v=i,i=i+8|0,c[v>>2]=d[n+aP|0]|0,v)|0);K=aO-1&65535;if(K<<16>>16==0){a[S]=10;aQ=78;aR=aN+2|0}else{aQ=K;aR=S}S=aP+1|0;if((S|0)<(L|0)){aN=aR;aO=aQ;aP=S}else{F=aR;break}}}}while(0);if((a[(c[7118]|0)+16|0]&1)==0){a[F]=a[211872]|0;a[F+1|0]=a[211873|0]|0;a[F+2|0]=a[211874|0]|0;aS=F+2|0}else{aS=F}z=aS-C|0;if((z|0)>(B|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=211696,v)|0)}aI(214464,15,1,c[10028]|0);r=c[g+24>>2]|0;L=c[g+28>>2]|0;S=c[g+40>>2]|0;K=c[g+36>>2]|0;cf(c[10028]|0,214416,(v=i,i=i+64|0,c[v>>2]=r,c[v+8>>2]=L,c[v+16>>2]=r,c[v+24>>2]=S,c[v+32>>2]=K,c[v+40>>2]=S,c[v+48>>2]=K,c[v+56>>2]=L,v)|0);do{if(x){if((a[(c[7118]|0)+16|0]&1)==0){L=c[10028]|0;aI(214344,62,1,L|0);L=c[10028]|0;K=g|0;S=c[K>>2]|0;r=g+4|0;J=c[r>>2]|0;cf(L|0,214312,(v=i,i=i+16|0,c[v>>2]=S,c[v+8>>2]=J,v)|0);J=c[10028]|0;S=g+12|0;L=(c[S>>2]|0)-(c[K>>2]|0)|0;cf(J|0,214296,(v=i,i=i+8|0,c[v>>2]=L,v)|0);L=c[10028]|0;J=(c[g+16>>2]|0)-(c[r>>2]|0)|0;cf(L|0,214272,(v=i,i=i+8|0,c[v>>2]=J,v)|0);J=c[10028]|0;L=(c[K>>2]|0)-(c[S>>2]|0)|0;cf(J|0,214296,(v=i,i=i+8|0,c[v>>2]=L,v)|0);L=c[10028]|0;J=c[K>>2]|0;K=c[r>>2]|0;cf(L|0,214256,(v=i,i=i+16|0,c[v>>2]=J,c[v+8>>2]=K,v)|0);K=c[10028]|0;aI(214128,67,1,K|0);K=c[10028]|0;cf(K|0,213920,(v=i,i=i+8|0,c[v>>2]=z,v)|0);K=c[10028]|0;aI(213848,38,1,K|0);tx(b,e,g,j,t);K=c[10028]|0;aI(213784,9,1,K|0);break}else{tx(b,e,g,j,t);break}}else{K=q-1|0;G=1.0/+(K|0);if((a[(c[7118]|0)+16|0]&1)==0){J=c[10028]|0;aI(214344,62,1,J|0);J=c[10028]|0;L=g|0;r=c[L>>2]|0;S=g+4|0;I=c[S>>2]|0;cf(J|0,214312,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=I,v)|0);I=c[10028]|0;r=g+12|0;J=(c[r>>2]|0)-(c[L>>2]|0)|0;cf(I|0,214296,(v=i,i=i+8|0,c[v>>2]=J,v)|0);J=c[10028]|0;I=g+16|0;O=(c[I>>2]|0)-(c[S>>2]|0)|0;cf(J|0,214272,(v=i,i=i+8|0,c[v>>2]=O,v)|0);O=c[10028]|0;J=(c[L>>2]|0)-(c[r>>2]|0)|0;cf(O|0,214296,(v=i,i=i+8|0,c[v>>2]=J,v)|0);J=c[10028]|0;O=c[L>>2]|0;P=c[S>>2]|0;cf(J|0,214256,(v=i,i=i+16|0,c[v>>2]=O,c[v+8>>2]=P,v)|0);P=c[10028]|0;cf(P|0,213648,(v=i,i=i+8|0,c[v>>2]=z,v)|0);P=c[10028]|0;aI(213608,4,1,P|0);aT=L;aU=S;aV=r;aW=I}else{aT=g|0;aU=g+4|0;aV=g+12|0;aW=g+16|0}I=c[10028]|0;aI(213600,6,1,I|0);I=c[10028]|0;r=c[aT>>2]|0;S=c[aU>>2]|0;cf(I|0,213576,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=S,v)|0);S=c[10028]|0;r=(c[aV>>2]|0)-(c[aT>>2]|0)|0;I=(c[aW>>2]|0)-(c[aU>>2]|0)|0;cf(S|0,213528,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=I,v)|0);I=c[10028]|0;aI(213504,17,1,I|0);I=c[10028]|0;cf(I|0,213456,(v=i,i=i+8|0,c[v>>2]=K,v)|0);K=o|0;I=o+1|0;r=o+2|0;S=0;L=0;while(1){fr(G*+(S|0),o);if(L<<16>>16==0){P=c[10028]|0;aI(152656,3,1,P|0);aX=8}else{aX=L}P=d[I]|0;O=d[r]|0;cf(c[10028]|0,213376,(v=i,i=i+24|0,c[v>>2]=d[K]|0,c[v+8>>2]=P,c[v+16>>2]=O,v)|0);O=S+1|0;if((O|0)<(q|0)){S=O;L=aX-1&65535}else{break}}aI(213312,21,1,c[10028]|0);aI(213272,15,1,c[10028]|0);cf(c[10028]|0,213216,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=e,v)|0);cf(c[10028]|0,213144,(v=i,i=i+24|0,c[v>>2]=p,c[v+8>>2]=b,c[v+16>>2]=e,v)|0);cf(c[10028]|0,213120,(v=i,i=i+8|0,c[v>>2]=(1<<p)-1,v)|0);L=c[10028]|0;if((a[(c[7118]|0)+16|0]&1)==0){aI(212968,48,1,L|0)}else{S=(aa(p,y)+7|0)>>>3;cf(L|0,213920,(v=i,i=i+8|0,c[v>>2]=S,v)|0);S=c[10028]|0;aI(213056,55,1,S|0)}aI(212936,29,1,c[10028]|0);aI(212896,30,1,c[10028]|0);if((a[(c[7118]|0)+16|0]&1)!=0){break}aI(213784,9,1,c[10028]|0)}}while(0);if((z|0)>0){y=0;p=C;while(1){aF(a[p]|0|0,c[10028]|0);S=y+1|0;if((S|0)<(z|0)){y=S;p=p+1|0}else{break}}}p=c[10028]|0;if((a[(c[7118]|0)+16|0]&1)==0){aI(212776,39,1,p|0)}else{aI(212832,10,1,p|0)}aI(212688,9,1,c[10028]|0);aI(212656,13,1,c[10028]|0);uu(C);i=k;return}else{s=0}}while(0);cf(c[m>>2]|0,214504,(v=i,i=i+8|0,c[v>>2]=s&65535,v)|0);i=k;return}function pW(b,d,e,f,g,j){b=b|0;d=+d;e=+e;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;if((j|0)==4){l=c[10028]|0;aI(215544,10,1,l|0);i=k;return}else if((j|0)==3){aI(215600,7,1,c[10028]|0);i=k;return}else{if(a[237912]|0){i=k;return}l=(uA(b|0)|0)+40|0;uu(c[59476]|0);m=ut(l)|0;do{if((m|0)==0){gk();n=ut(l)|0;if((n|0)!=0){o=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215504,v)|0)}else{o=m}}while(0);c[59476]=o;tz(b);a0(c[59476]|0,l|0,215400,(v=i,i=i+48|0,c[v>>2]=b,h[v+8>>3]=d,h[v+16>>3]=e,c[v+24>>2]=f?225e3:224992,c[v+32>>2]=g?225e3:224992,c[v+40>>2]=j,v)|0);cf(c[10028]|0,215368,(v=i,i=i+8|0,c[v>>2]=c[59476],v)|0);a[237912]=1;i=k;return}}function pX(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=c[11252]|0;if((g|0)!=15){h=(g|0)==14;g=c[10028]|0;aF(b|0,g|0);if(!h){i=d;return}if(a[238472]|0){a[238472]=0;if((b|0)!=92){i=d;return}h=c[10028]|0;aF(92,h|0);i=d;return}else{if((b&128|0)==0){i=d;return}a[238472]=1;i=d;return}}if((b&128|0)==0){h=c[10028]|0;aF(b|0,h|0);i=d;return}h=c[59616]|0;if((h|0)==0){do{if((b&224|0)==192){j=2;k=17022}else{if((b&240|0)==224){j=3;k=17022;break}g=(b&248|0)==240;c[59614]=g?4:0;if(g){break}g=c[10028]|0;aF(b|0,g|0);i=d;return}}while(0);if((k|0)==17022){c[59614]=j}c[59616]=1;a[238448]=b&255;i=d;return}j=h+1|0;c[59616]=j;a[h+238448|0]=b&255;b=c[59614]|0;if((j|0)<(b|0)){i=d;return}c[e>>2]=0;c[f>>2]=238448;a[b+238448|0]=0;c[59616]=0;ug(e,f);f=c[e>>2]|0;if(f>>>0<256){b=c[10028]|0;aF(f|0,b|0);i=d;return}if(a[237912]|0){b=c[10028]|0;aI(215624,3,1,b|0);a[237912]=0}cf(c[10028]|0,215784,(v=i,i=i+8|0,c[v>>2]=c[59476],v)|0);b=c[7114]|0;f=c[18090]|0;j=c[e>>2]|0;h=0;while(1){if((h|0)>=(b|0)){l=b;break}if((c[f+(h<<3)>>2]|0)==(j|0)){k=17034;break}else{h=h+1|0}}if((k|0)==17034){k=c[f+(h<<3)+4>>2]|0;f=c[10028]|0;aK(k|0,f|0);l=c[7114]|0}if((h|0)>=(l|0)){l=c[10028]|0;h=c[e>>2]|0;e=h>>>0>65535?215776:215728;cf(l|0,e|0,(v=i,i=i+8|0,c[v>>2]=h,v)|0)}aI(89968,2,1,c[10028]|0);a[237912]=0;i=d;return}function pY(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==13){d=c[10028]|0;cf(d|0,93784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=b;return}else if((a|0)==7){cf(c[10028]|0,215840,(v=i,i=i+8|0,c[v>>2]=c[57434],v)|0);i=b;return}else if((a|0)==0){c[57434]=0;i=b;return}else if((a|0)==6){d=c[10028]|0;e=(c[57434]|0)+1|0;c[57434]=e;cf(d|0,215920,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=b;return}else if((a|0)==12){cf(c[10028]|0,93800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=b;return}else{i=b;return}}function pZ(b){b=b|0;var d=0;if((b|0)==0){if((c[7116]|0)!=0){d=c[10028]|0;aI(215952,7,1,d|0);c[7116]=0;a[228944]=0}a[229704]=1;return}else if((b|0)==1){aI(78256,2,1,c[10028]|0);if((c[7116]|0)==0){return}aI(215952,7,1,c[10028]|0);c[7116]=0;a[228944]=0;return}else{return}}function p_(){aI(215984,51,1,c[10030]|0);return}function p$(){aI(216040,6,1,c[10030]|0);return}function p0(){aI(216080,9,1,c[10030]|0);return}function p1(){aI(216176,5,1,c[10030]|0);return}function p2(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,216272,(v=i,i=i+16|0,c[v>>2]=a+1e3,c[v+8>>2]=6999-b,v)|0);i=d;return}function p3(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,216304,(v=i,i=i+16|0,c[v>>2]=a+1e3,c[v+8>>2]=6999-b,v)|0);i=d;return}function p4(a){a=a|0;var b=0,d=0;b=i;c[6954]=a;if((a|0)>8){d=(a|0)%9&-1}else{d=a}a=d+2|0;cf(c[10030]|0,216464,(v=i,i=i+8|0,c[v>>2]=c[228840+(a<<2)>>2],v)|0);d=c[228888+(a<<2)>>2]|0;if((d|0)==1){a=c[10030]|0;aI(216400,16,1,a|0);i=b;return}else if((d|0)==3){aI(216352,16,1,c[10030]|0);i=b;return}else if((d|0)==2){aI(216376,16,1,c[10030]|0);i=b;return}else{aI(216344,4,1,c[10030]|0);i=b;return}}function p5(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;cf(c[10030]|0,216272,(v=i,i=i+16|0,c[v>>2]=b+1e3,c[v+8>>2]=6959-d,v)|0);aI(216552,5,1,c[10030]|0);d=e;while(1){e=a[d]|0;b=d+1|0;g=e<<24>>24;if((e<<24>>24|0)==94){h=c[10030]|0;aF(94,h|0)}else if((e<<24>>24|0)==0){break}aF(g|0,c[10030]|0);d=b}aI(216504,6,1,c[10030]|0);p4(c[6954]|0);i=f;return}function p6(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0.0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0.0,aM=0,aN=0;b=i;i=i+200|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=b+96|0;k=b+120|0;l=b+144|0;m=b+168|0;n=b+192|0;if((c[13898]|0)==2){o=2}else{c[56738]=6e3;c[56734]=4800;a[228464]=0;uu(c[57106]|0);c[57106]=bP(216600)|0;h[28551]=12.0;p=c[57122]|0;if((p|0)!=0){uu(p)}c[57122]=0;a[228312]=0;a[226968]=0;uu(c[57076]|0);c[57076]=0;uu(c[56744]|0);c[56744]=0;a[228360]=0;a[228336]=0;o=c[13898]|0}p=c[8272]|0;L22958:do{if((o|0)<(p|0)){q=k|0;r=k+8|0;s=j|0;t=j+8|0;u=g|0;w=g+8|0;x=d|0;y=d+8|0;z=e|0;A=e+8|0;B=f|0;C=f+8|0;D=m|0;E=m+8|0;F=l|0;G=l+8|0;H=o;I=p;L22960:while(1){J=c[1054]|0;K=(a[J+(H*40&-1)|0]&1)==0;L=c[J+(H*40&-1)+36>>2]|0;M=J+(H*40&-1)+32|0;L22962:do{if(K){N=c[M>>2]|0;O=17164}else{P=c[10036]|0;Q=0;while(1){if((Q|0)>=(L|0)){O=17114;break}if((a[P+((c[M>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break}}if((O|0)==17114){O=0;if((Q|0)==1){break L22958}}P=c[M>>2]|0;if(!((L|0)>0&(K^1))){N=P;O=17164;break}R=c[10036]|0;S=0;T=0;U=P;while(1){if((a[S+218680|0]|0)==(a[R+(S+U|0)|0]|0)){V=U;W=T}else{if((S|0)!=1){N=P;O=17164;break L22962}V=U-1|0;W=1}X=S+1|0;if((X|0)<(W+L|0)){S=X;T=W;U=V}else{break}}if((W|0)==0){if(!((S|0)==4|(S|0)==0)){N=P;O=17164;break}}Y=H+1|0;c[13898]=Y;if((Y|0)>=(I|0)){O=17424;break L22960}L22982:do{if((a[J+(Y*40&-1)|0]&1)!=0){U=c[J+(Y*40&-1)+36>>2]|0;T=J+(Y*40&-1)+32|0;R=c[10036]|0;Q=0;while(1){if((Q|0)>=(U|0)){break}if((a[R+((c[T>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L22982}}if((Q|0)==1){O=17425;break L22960}}}while(0);P=is(m)|0;S=c[P>>2]|0;if((S|0)==1){Z=+(c[P+8>>2]|0)}else if((S|0)==3){Z=+uz(c[P+8>>2]|0,0)}else if((S|0)==2){Z=+h[P+8>>3]}else{O=17134;break L22960}if((c[D>>2]|0)==3){uu(c[E>>2]|0);c[D>>2]=1}if(Z<2.0){O=17138;break L22960}c[56738]=~~(Z*10.0);P=c[13898]|0;S=c[8272]|0;L22998:do{if((S|0)>(P|0)){T=c[1054]|0;if((a[T+(P*40&-1)|0]&1)==0){_=P;break}R=c[T+(P*40&-1)+36>>2]|0;U=T+(P*40&-1)+32|0;T=c[10036]|0;X=0;while(1){if((X|0)>=(R|0)){break}if((a[T+((c[U>>2]|0)+X|0)|0]|0)==(a[X+148464|0]|0)){X=X+1|0}else{_=P;break L22998}}if((X|0)!=1){_=P;break}U=P+1|0;c[13898]=U;_=U}else{_=P}}while(0);if((_|0)>=(S|0)){O=17439;break L22960}P=c[1054]|0;L23008:do{if((a[P+(_*40&-1)|0]&1)!=0){U=c[P+(_*40&-1)+36>>2]|0;T=P+(_*40&-1)+32|0;R=c[10036]|0;Q=0;while(1){if((Q|0)>=(U|0)){break}if((a[R+((c[T>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L23008}}if((Q|0)==1){O=17440;break L22960}}}while(0);P=is(l)|0;S=c[P>>2]|0;if((S|0)==2){$=+h[P+8>>3]}else if((S|0)==1){$=+(c[P+8>>2]|0)}else if((S|0)==3){$=+uz(c[P+8>>2]|0,0)}else{O=17157;break L22960}if((c[F>>2]|0)==3){uu(c[G>>2]|0);c[F>>2]=1}if($<2.0){O=17161;break L22960}c[56734]=~~($*10.0)}}while(0);L23025:do{if((O|0)==17164){O=0;M=(I|0)>(H|0);L23027:do{if(M){if(K){O=17427;break L22960}P=c[10036]|0;S=0;while(1){if((S|0)>=(L|0)){break}if((a[P+(N+S|0)|0]|0)==(a[S+218536|0]|0)){S=S+1|0}else{O=17170;break L23027}}if((S|0)!=5){O=17170}}else{O=17170}}while(0);L23034:do{if((O|0)==17170){O=0;L23036:do{if((L|0)>0&(K^1)){P=c[10036]|0;Q=0;T=0;R=N;while(1){if((a[Q+218504|0]|0)==(a[P+(Q+R|0)|0]|0)){aa=R;ab=T}else{if((Q|0)!=4){break}aa=R-1|0;ab=1}U=Q+1|0;if((U|0)<(ab+L|0)){Q=U;T=ab;R=aa}else{O=17176;break}}if((O|0)==17176){O=0;if((ab|0)!=0){break L23034}if((Q|0)==3|(Q|0)==7){break L23034}}if(!((L|0)>0&(K^1))){break}R=c[10036]|0;T=0;P=0;U=N;while(1){if((a[T+130272|0]|0)==(a[R+(T+U|0)|0]|0)){ac=U;ad=P}else{if((T|0)!=5){break L23036}ac=U-1|0;ad=1}X=T+1|0;if((X|0)<(ad+L|0)){T=X;P=ad;U=ac}else{break}}if((ad|0)==0){if(!((T|0)==10|(T|0)==4)){break}}c[13898]=H+1;a[226968]=1;break L23025}}while(0);L23060:do{if(M){if(K){O=17431;break L22960}S=c[10036]|0;U=0;while(1){if((U|0)>=(L|0)){O=17193;break}if((a[S+(N+U|0)|0]|0)==(a[U+218432|0]|0)){U=U+1|0}else{break}}do{if((O|0)==17193){O=0;if((U|0)!=4){break}ae=H+1|0;c[13898]=ae;if((ae|0)>=(I|0)){O=17202;break L22960}L23070:do{if((a[J+(ae*40&-1)|0]&1)!=0){T=c[J+(ae*40&-1)+36>>2]|0;P=J+(ae*40&-1)+32|0;R=0;while(1){if((R|0)>=(T|0)){break}if((a[S+((c[P>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L23070}}if((R|0)==1){O=17202;break L22960}}}while(0);a[14176]=1;is(k);a[14176]=0;if((c[q>>2]|0)!=3){O=17201;break L22960}P=c[r>>2]|0;c[57076]=P;if((P|0)==0){O=17204;break L22960}if((a[P+(b4(P|0,218288)|0)|0]|0)==0){break L23025}else{O=17207;break L22960}}}while(0);if(!M){break}if(K){O=17430;break L22960}S=c[10036]|0;U=0;while(1){if((U|0)>=(L|0)){break}if((a[S+(N+U|0)|0]|0)==(a[U+221440|0]|0)){U=U+1|0}else{break L23060}}if((U|0)!=5){break}P=H+1|0;c[13898]=P;L23087:do{if((P|0)<(I|0)){L23089:do{if((a[J+(P*40&-1)|0]&1)!=0){T=c[J+(P*40&-1)+36>>2]|0;Q=J+(P*40&-1)+32|0;X=0;while(1){if((X|0)>=(T|0)){break}if((a[S+((c[Q>>2]|0)+X|0)|0]|0)==(a[X+103664|0]|0)){X=X+1|0}else{break L23089}}if((X|0)==1){af=0;break L23087}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[s>>2]|0)==3){af=c[t>>2]|0;break}else{c[13898]=P;af=0;break}}else{af=0}}while(0);c[56744]=af;break L23025}}while(0);L23101:do{if((L|0)>0&(K^1)){P=c[10036]|0;S=0;U=0;Q=N;while(1){if((a[S+218224|0]|0)==(a[P+(S+Q|0)|0]|0)){ag=Q;ah=U}else{if((S|0)!=1){break}ag=Q-1|0;ah=1}T=S+1|0;if((T|0)<(ah+L|0)){S=T;U=ah;Q=ag}else{O=17230;break}}do{if((O|0)==17230){O=0;if((ah|0)==0){if(!((S|0)==7|(S|0)==0)){break}}c[13898]=H+1;a[228464]=1;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}S=c[10036]|0;Q=0;U=0;P=N;while(1){if((a[Q+218152|0]|0)==(a[S+(Q+P|0)|0]|0)){ai=P;aj=U}else{if((Q|0)!=2){break}ai=P-1|0;aj=1}T=Q+1|0;if((T|0)<(aj+L|0)){Q=T;U=aj;P=ai}else{O=17239;break}}do{if((O|0)==17239){O=0;if((aj|0)==0){if(!((Q|0)==5|(Q|0)==1)){break}}c[13898]=H+1;a[228464]=0;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}Q=c[10036]|0;P=0;U=0;S=N;while(1){if((a[P+122880|0]|0)==(a[Q+(P+S|0)|0]|0)){ak=S;al=U}else{if((P|0)!=3){break}ak=S-1|0;al=1}T=P+1|0;if((T|0)<(al+L|0)){P=T;U=al;S=ak}else{O=17248;break}}do{if((O|0)==17248){O=0;if((al|0)==0){if(!((P|0)==8|(P|0)==2)){break}}c[13898]=H+1;c[(c[3524]|0)+68>>2]=2;S=(c[3524]|0)+96|0;c[S>>2]=c[S>>2]|32;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}P=c[10036]|0;S=0;U=0;Q=N;while(1){if((a[S+121536|0]|0)==(a[P+(S+Q|0)|0]|0)){am=Q;an=U}else{if((S|0)!=5){break}am=Q-1|0;an=1}T=S+1|0;if((T|0)<(an+L|0)){S=T;U=an;Q=am}else{O=17257;break}}do{if((O|0)==17257){O=0;if((an|0)==0){if(!((S|0)==10|(S|0)==4)){break}}c[13898]=H+1;c[(c[3524]|0)+68>>2]=68;Q=(c[3524]|0)+96|0;c[Q>>2]=c[Q>>2]&-33;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}S=c[10036]|0;Q=0;U=0;P=N;while(1){if((a[Q+218144|0]|0)==(a[S+(Q+P|0)|0]|0)){ao=P;ap=U}else{if((Q|0)!=2){O=17268;break}ao=P-1|0;ap=1}T=Q+1|0;if((T|0)<(ap+L|0)){Q=T;U=ap;P=ao}else{O=17266;break}}do{if((O|0)==17266){O=0;if((ap|0)!=0){break}if(!((Q|0)==1|(Q|0)==5)){O=17268}}}while(0);L23164:do{if((O|0)==17268){O=0;if(K){O=17352;break L23101}L23167:do{if((L|0)>0){Q=c[10036]|0;P=0;do{if((a[P+124352|0]|0)!=(a[Q+(P+N|0)|0]|0)){break L23167}P=P+1|0;}while((P|0)<(L|0));if((P|0)==4){break L23164}}}while(0);if(!((L|0)>0&(K^1))){O=17352;break L23101}Q=c[10036]|0;X=0;U=0;S=N;while(1){if((a[X+218024|0]|0)==(a[Q+(X+S|0)|0]|0)){aq=S;ar=U}else{if((X|0)!=2){break}aq=S-1|0;ar=1}T=X+1|0;if((T|0)<(ar+L|0)){X=T;U=ar;S=aq}else{O=17306;break}}do{if((O|0)==17306){O=0;if((ar|0)==0){if(!((X|0)==5|(X|0)==1)){break}}as=H+1|0;c[13898]=as;if((as|0)>=(I|0)){O=17438;break L22960}L23187:do{if((a[J+(as*40&-1)|0]&1)!=0){S=c[J+(as*40&-1)+36>>2]|0;U=J+(as*40&-1)+32|0;Q=c[10036]|0;T=0;while(1){if((T|0)>=(S|0)){break}if((a[Q+((c[U>>2]|0)+T|0)|0]|0)==(a[T+103664|0]|0)){T=T+1|0}else{break L23187}}if((T|0)==1){O=17437;break L22960}}}while(0);P=is(e)|0;U=c[P>>2]|0;if((U|0)==1){at=+(c[P+8>>2]|0)}else if((U|0)==2){at=+h[P+8>>3]}else if((U|0)==3){at=+uz(c[P+8>>2]|0,0)}else{O=17319;break L22960}if((c[z>>2]|0)==3){uu(c[A>>2]|0);c[z>>2]=1}h[28551]=at;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break L23101}X=c[10036]|0;P=0;while(1){if((a[P+217952|0]|0)!=(a[X+(P+N|0)|0]|0)){break}au=P+1|0;if((au|0)<(L|0)){P=au}else{O=17327;break}}do{if((O|0)==17327){O=0;if((au|0)!=8){break}av=H+1|0;c[13898]=av;if((av|0)>=(I|0)){O=17336;break L22960}L23211:do{if((a[J+(av*40&-1)|0]&1)!=0){P=c[J+(av*40&-1)+36>>2]|0;X=J+(av*40&-1)+32|0;U=c[10036]|0;Q=0;while(1){if((Q|0)>=(P|0)){break}if((a[U+((c[X>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L23211}}if((Q|0)==1){O=17336;break L22960}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[x>>2]|0)!=3){O=17335;break L22960}X=c[y>>2]|0;c[n>>2]=X;if((X|0)==0){O=17338;break L22960}iQ(n);aw=c[n>>2]|0;if((a[aw]|0)==60){ax=aw}else{ax=hB(aw)|0}c[57122]=ax;if((ax|0)==0){O=17343;break L22960}else{break L23025}}}while(0);if(!((L|0)>0&(K^1))){O=17352;break L23101}X=c[10036]|0;U=0;P=0;T=N;while(1){if((a[U+128400|0]|0)==(a[X+(U+T|0)|0]|0)){ay=T;az=P}else{if((U|0)!=5){O=17352;break L23101}ay=T-1|0;az=1}S=U+1|0;if((S|0)<(az+L|0)){U=S;P=az;T=ay}else{break}}if((az|0)!=0){break L23101}if((U|0)==4|(U|0)==9){break L23101}else{O=17352;break L23101}}}while(0);aA=H+1|0;c[13898]=aA;if((aA|0)>=(I|0)){aB=aA;O=17445;break L22960}L23235:do{if((a[J+(aA*40&-1)|0]&1)!=0){T=c[J+(aA*40&-1)+36>>2]|0;P=J+(aA*40&-1)+32|0;X=c[10036]|0;S=0;while(1){if((S|0)>=(T|0)){break}if((a[X+((c[P>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L23235}}if((S|0)==1){aB=aA;O=17446;break L22960}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[B>>2]|0)!=3){O=17281;break L22960}P=c[C>>2]|0;if((P|0)==0){O=17283;break L22960}X=bh(P|0,44)|0;do{if((X|0)!=0){if((ca(X+1|0,148448,(v=i,i=i+8|0,c[v>>2]=228408,v)|0)|0)!=1){break}a[X]=0}}while(0);if((a[P]|0)==0){uu(P);break L23025}X=aQ(P|0,75096)|0;if((X|0)==0){aC=aQ(P|0,75048)|0}else{aC=X}X=aQ(P|0,74992)|0;if((X|0)==0){aD=aQ(P|0,74976)|0}else{aD=X}uu(c[57106]|0);c[57106]=P;if((aD|0)==0){c[57098]=77432}else{c[57098]=74936;X=uA(P|0)|0;a[P+(X-(uA(aD|0)|0)|0)|0]=0}if((aC|0)==0){c[57094]=77432;break L23025}else{c[57094]=74928;X=uA(P|0)|0;T=X-(uA(aC|0)|0)|0;a[(c[57106]|0)+T|0]=0;break L23025}}else{O=17352}}while(0);L23264:do{if((O|0)==17352){O=0;L23266:do{if(M){if(K){O=17429;break L22960}T=c[10036]|0;X=0;while(1){if((X|0)>=(L|0)){break}if((a[T+(N+X|0)|0]|0)==(a[X+128296|0]|0)){X=X+1|0}else{break L23266}}if((X|0)==2){break L23264}}}while(0);L23274:do{if((L|0)>0&(K^1)){P=c[10036]|0;T=0;S=0;U=N;while(1){if((a[T+217776|0]|0)==(a[P+(T+U|0)|0]|0)){aE=U;aF=S}else{if((T|0)!=5){break L23274}aE=U-1|0;aF=1}R=T+1|0;if((R|0)<(aF+L|0)){T=R;S=aF;U=aE}else{break}}if((aF|0)==0){if(!((T|0)==7|(T|0)==4)){break}}c[13898]=H+1;a[226984]=1;break L23025}}while(0);L23287:do{if(M){L23289:do{if(!K){U=c[10036]|0;S=0;while(1){if((S|0)>=(L|0)){break}if((a[U+(N+S|0)|0]|0)==(a[S+137232|0]|0)){S=S+1|0}else{break L23289}}if((S|0)!=4){break}c[13898]=H+1;a[226984]=0;break L23025}}while(0);if(!M){break}if(K){O=17428;break L22960}T=c[10036]|0;U=0;while(1){if((U|0)>=(L|0)){break}if((a[T+(N+U|0)|0]|0)==(a[U+131504|0]|0)){U=U+1|0}else{break L23287}}if((U|0)!=5){break}c[13898]=H+1;a[228520]=0;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17434;break L22960}T=c[10036]|0;P=0;X=0;R=N;while(1){if((a[P+217752|0]|0)==(a[T+(P+R|0)|0]|0)){aG=R;aH=X}else{if((P|0)!=4){break}aG=R-1|0;aH=1}aI=P+1|0;if((aI|0)<(aH+L|0)){P=aI;X=aH;R=aG}else{O=17396;break}}do{if((O|0)==17396){O=0;if((aH|0)==0){if(!((P|0)==6|(P|0)==3)){break}}c[13898]=H+1;a[228520]=1;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17432;break L22960}P=c[10036]|0;R=0;X=0;T=N;while(1){if((a[R+217736|0]|0)==(a[P+(R+T|0)|0]|0)){aJ=T;aK=X}else{if((R|0)!=5){O=17426;break L22960}aJ=T-1|0;aK=1}aI=R+1|0;if((aI|0)<(aK+L|0)){R=aI;X=aK;T=aJ}else{break}}if((aK|0)==0){if(!((R|0)==10|(R|0)==4)){O=17433;break L22960}}c[13898]=H+1;c[57136]=hK()|0;break L23025}}while(0);c[13898]=H+1;T=is(g)|0;X=c[T>>2]|0;if((X|0)==3){aL=+uz(c[T+8>>2]|0,0)}else if((X|0)==1){aL=+(c[T+8>>2]|0)}else if((X|0)==2){aL=+h[T+8>>3]}else{O=17362;break L22960}if((c[u>>2]|0)==3){uu(c[w>>2]|0);c[u>>2]=1}h[28540]=aL;if(aL>0.0){break L23025}h[28540]=1.0;break L23025}}while(0);c[13898]=H+1;a[228312]=1}}while(0);L=c[13898]|0;K=c[8272]|0;if((L|0)<(K|0)){H=L;I=K}else{break L22958}}if((O|0)==17343){uf(c[13898]|0,219072,(v=i,i=i+8|0,c[v>>2]=aw,v)|0)}else if((O|0)==17134){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17434){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17437){uf(as,217992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17438){uf(as,217992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17440){uf(_,218600,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17445){uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17362){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17161){uf(c[13898]|0,218544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17424){uf(Y,218656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17425){uf(Y,218656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17426){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17427){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17428){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17439){uf(_,218600,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17335){c[13898]=av;O=17336}else if((O|0)==17446){uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17281){c[13898]=aA;aB=aA;uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17283){aB=c[13898]|0;uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17338){aM=c[13898]|0;uf(aM,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17429){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17430){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17431){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17432){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17433){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17319){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17157){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17207){uf((c[13898]|0)-1|0,218240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17138){uf(c[13898]|0,218632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17201){c[13898]=ae;O=17202}else if((O|0)==17204){aN=c[13898]|0;uf(aN,218392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((O|0)==17336){c[n>>2]=0;aM=av;uf(aM,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17202){c[57076]=0;aN=ae;uf(aN,218392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);qj(179864);aN=~~(+((c[56734]|0)>>>0>>>0)/10.0);ae=a[228464]|0?217584:217656;O=(c[(c[3524]|0)+68>>2]|0)==2?217456:179864;aM=c[57108]|0;aL=+h[28552];be(13048,217664,(v=i,i=i+48|0,c[v>>2]=~~(+((c[56738]|0)>>>0>>>0)/10.0),c[v+8>>2]=aN,c[v+16>>2]=ae,c[v+24>>2]=O,c[v+32>>2]=aM,h[v+40>>3]=aL,v)|0);if(a[228312]|0){uD(13048+(uA(13048)|0)|0,217392,9)}if(a[226968]|0){uD(13048+(uA(13048)|0)|0,217272,12)}aM=c[57076]|0;if((aM|0)!=0){O=13048+(uA(13048)|0)|0;be(O|0,217200,(v=i,i=i+8|0,c[v>>2]=aM,v)|0)}aM=c[57122]|0;if((aM|0)!=0){O=13048+(uA(13048)|0)|0;be(O|0,217096,(v=i,i=i+8|0,c[v>>2]=aM,v)|0)}aM=13048+(uA(13048)|0)|0;be(aM|0,(a[226984]|0?132112:217056)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aM=13048+(uA(13048)|0)|0;be(aM|0,(a[228520]|0?217032:217e3)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aL=+h[28540];if(aL!=1.0){aM=13048+(uA(13048)|0)|0;be(aM|0,216912,(v=i,i=i+8|0,h[v>>3]=aL,v)|0)}aM=c[57136]|0;if((aM|0)<=-1){i=b;return}be(13048+(uA(13048)|0)|0,216792,(v=i,i=i+8|0,c[v>>2]=aM,v)|0);i=b;return}function p7(){aI(222944,8,1,c[10030]|0);return}function p8(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0;b=i;i=i+512|0;d=b|0;e=b+256|0;f=+h[28571];h[28376]=f;a[227016]=a[84376]|0;a[227017|0]=a[84377|0]|0;a[227018|0]=a[84378|0]|0;a[227019|0]=a[84379|0]|0;a[227020|0]=a[84380|0]|0;a[227021|0]=a[84381|0]|0;h[28378]=f;a[227032]=a[89416]|0;a[227033|0]=a[89417|0]|0;a[227034|0]=a[89418|0]|0;a[227035|0]=a[89419|0]|0;a[227036|0]=a[89420|0]|0;a[227037|0]=a[89421|0]|0;h[28380]=f;a[227048]=a[89352]|0;a[227049|0]=a[89353|0]|0;a[227050|0]=a[89354|0]|0;a[227051|0]=a[89355|0]|0;a[227052|0]=a[89356|0]|0;h[28382]=f;c[56766]=6579570;h[28384]=f;a[227080]=a[89296]|0;a[227081|0]=a[89297|0]|0;a[227082|0]=a[89298|0]|0;a[227083|0]=a[89299|0]|0;a[227084|0]=a[89300|0]|0;a[227085|0]=a[89301|0]|0;h[28386]=f;a[227096]=a[89328]|0;a[227097|0]=a[89329|0]|0;a[227098|0]=a[89330|0]|0;a[227099|0]=a[89331|0]|0;a[227100|0]=a[89332|0]|0;h[28388]=f;a[227112]=a[89248]|0;a[227113|0]=a[89249|0]|0;a[227114|0]=a[89250|0]|0;a[227115|0]=a[89251|0]|0;a[227116|0]=a[89252|0]|0;h[28390]=f;be(227128,222904,(v=i,i=i+24|0,c[v>>2]=21,c[v+8>>2]=117,c[v+16>>2]=69,v)|0);h[28392]=+h[28571];be(227144,222904,(v=i,i=i+24|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=148,v)|0);h[28394]=+h[28571];be(227160,222904,(v=i,i=i+24|0,c[v>>2]=255,c[v+8>>2]=153,c[v+16>>2]=0,v)|0);h[28396]=+h[28571];be(227176,222904,(v=i,i=i+24|0,c[v>>2]=0,c[v+8>>2]=153,c[v+16>>2]=161,v)|0);h[28398]=+h[28571];be(227192,222904,(v=i,i=i+24|0,c[v>>2]=214,c[v+8>>2]=214,c[v+16>>2]=69,v)|0);h[28400]=+h[28571];be(227208,222904,(v=i,i=i+24|0,c[v>>2]=163,c[v+8>>2]=145,c[v+16>>2]=255,v)|0);h[28402]=+h[28571];be(227224,222904,(v=i,i=i+24|0,c[v>>2]=255,c[v+8>>2]=204,c[v+16>>2]=0,v)|0);h[28404]=+h[28571];be(227240,222904,(v=i,i=i+24|0,c[v>>2]=214,c[v+8>>2]=0,c[v+16>>2]=120,v)|0);h[28406]=+h[28571];be(227256,222904,(v=i,i=i+24|0,c[v>>2]=171,c[v+8>>2]=214,c[v+16>>2]=0,v)|0);g=c[57136]|0;if((g|0)>-1){j=g>>>16&255;k=g>>>8&255;l=g&255;be(227016,222904,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=l,v)|0)}c[57144]=-3;c[(c[3524]|0)+8>>2]=c[56738];c[(c[3524]|0)+12>>2]=c[56734];f=+h[28552];c[57114]=~~(f*10.0);l=~~(f*.25*10.0);c[57112]=l;c[57110]=l;c[(c[3524]|0)+20>>2]=~~(f*.7*10.0);c[(c[3524]|0)+16>>2]=((c[57112]|0)+(c[57114]|0)|0)+(c[57110]|0);l=c[3524]|0;c[l+28>>2]=(c[l+16>>2]|0)>>>1;l=c[3524]|0;c[l+24>>2]=(c[l+16>>2]|0)>>>1;l=c[11252]|0;if((l|0)==6){n=222720}else if((l|0)==14){n=222200}else if((l|0)==13){n=222296}else if((l|0)==1){n=222880}else if((l|0)==9){n=222584}else if((l|0)==12){n=222392}else if((l|0)==2){n=222832}else if((l|0)==4){n=222768}else if((l|0)==10){n=222496}else if((l|0)==8){n=222656}else if((l|0)==7){n=222696}else if((l|0)==3){n=222800}else if((l|0)==5){n=179864}else{n=222152}cf(c[10030]|0,222e3,(v=i,i=i+8|0,c[v>>2]=n,v)|0);if(a[228312]|0){n=c[10030]|0;aI(221896,69,1,n|0)}if(!(a[228464]|0)){n=c[10030]|0;l=c[3524]|0;k=~~(+((c[l+8>>2]|0)>>>0>>>0)/10.0);j=~~(+((c[l+12>>2]|0)>>>0>>>0)/10.0);cf(n|0,221864,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=j,v)|0)}j=c[3524]|0;k=~~(+((c[j+12>>2]|0)>>>0>>>0)/10.0);cf(c[10030]|0,221816,(v=i,i=i+16|0,c[v>>2]=~~(+((c[j+8>>2]|0)>>>0>>>0)/10.0),c[v+8>>2]=k,v)|0);aI(221760,36,1,c[10030]|0);aI(221680,44,1,c[10030]|0);aI(221632,3,1,c[10030]|0);k=c[57076]|0;cf(c[10030]|0,221608,(v=i,i=i+8|0,c[v>>2]=(k|0)!=0?k:221552,v)|0);cf(c[10030]|0,221496,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);k=c[56744]|0;if((k|0)==0){j=bP(221464)|0;c[56744]=j;o=j}else{o=k}k=uA(o|0)|0;do{if((a[o]|0)!=0){if((a[o+(k-1|0)|0]|0)==47){break}j=db(o,k+2|0,221440)|0;c[56744]=j;n=j+(uA(j|0)|0)|0;w=47;a[n]=w&255;w=w>>8;a[n+1|0]=w&255}}while(0);do{if(a[228312]|0){if(a[226968]|0){k=(uA(c[56744]|0)|0)+18|0;o=ut(k)|0;do{if((o|0)==0){gk();n=ut(k)|0;if((n|0)!=0){p=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=221224,v)|0)}else{p=o}}while(0);o=c[56744]|0;uB(p|0,o|0);o=uA(p|0)|0;k=(o|0)==0?0:o-1|0;o=a[p+k|0]|0;if(!((o<<24>>24|0)==47|(o<<24>>24|0)==0)){a[p+(k+1|0)|0]=47;a[p+(k+2|0)|0]=0}uD(p+(uA(p|0)|0)|0,221256,15);k=bF(p|0,193632)|0;if((k|0)==0){uh(-1,221176,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}else{o=c[10030]|0;aI(221096,65,1,o|0);o=e|0;n=(a6(o|0,256,k|0)|0)==0;j=c[10030]|0;if(n){q=j}else{n=j;while(1){aK(o|0,n|0);j=(a6(o|0,256,k|0)|0)==0;l=c[10030]|0;if(j){q=l;break}else{n=l}}}aI(223416,14,1,q|0);az(k|0)}uu(p)}else{n=c[10030]|0;o=c[56744]|0;cf(n|0,221312,(v=i,i=i+8|0,c[v>>2]=o,v)|0)}o=c[10030]|0;if(!(a[228312]|0)){r=o;s=17490;break}aI(221032,57,1,o|0);o=c[10030]|0;n=c[3524]|0;l=~~(+((c[n+8>>2]|0)>>>0>>>0)/10.0);j=~~(+((c[n+12>>2]|0)>>>0>>>0)/10.0);cf(o|0,220984,(v=i,i=i+32|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=l,c[v+24>>2]=j,v)|0);j=c[10030]|0;l=c[57136]|0;o=(l|0)>0?l:16777215;cf(j|0,220920,(v=i,i=i+8|0,c[v>>2]=o,v)|0);o=c[10030]|0;aI(220824,89,1,o|0);o=c[10030]|0;aI(220712,56,1,o|0);o=c[10030]|0;aI(220560,111,1,o|0)}else{r=c[10030]|0;s=17490}}while(0);if((s|0)==17490){aI(220520,25,1,r|0);r=c[10030]|0;s=c[3524]|0;p=~~(+((c[s+8>>2]|0)>>>0>>>0)/10.0);q=~~(+((c[s+12>>2]|0)>>>0>>>0)/10.0);cf(r|0,220984,(v=i,i=i+32|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=p,c[v+24>>2]=q,v)|0);q=c[57136]|0;p=c[10030]|0;if((q|0)>-1){cf(p|0,220448,(v=i,i=i+8|0,c[v>>2]=q,v)|0)}else{aI(77208,12,1,p|0)}p=c[10030]|0;aI(220440,3,1,p|0)}aI(220400,7,1,c[10030]|0);p=c[57122]|0;if((p|0)==0){t=c[3524]|0;u=t+28|0;x=c[u>>2]|0;y=+(x>>>0>>>0);z=20.0/y;A=c[10030]|0;B=cf(A|0,219192,(v=i,i=i+56|0,h[v>>3]=z,h[v+8>>3]=z,h[v+16>>3]=z,h[v+24>>3]=z,h[v+32>>3]=z,h[v+40>>3]=z,h[v+48>>3]=z,v)|0)|0;i=b;return}q=d|0;do{if((a[p]|0)==60){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=p+1|0;r=bt(d|0,193632)|0;if((r|0)!=0){C=1;D=r;break}uf(-1,219160,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}else{d=bF(p|0,193632)|0;if((d|0)!=0){C=0;D=d;break}uf(-1,219072,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}}while(0);if((a6(q|0,255,D|0)|0)==0){E=0}else{d=0;while(1){r=aQ(q|0,219056)|0;if((r|0)!=0){s=c[m>>2]|0;cf(s|0,218992,(v=i,i=i+16|0,c[v>>2]=p,c[v+8>>2]=r,v)|0)}aK(q|0,c[10030]|0);r=d+1|0;if((a6(q|0,255,D|0)|0)==0){E=r;break}else{d=r}}}do{if(C){d=a2(D|0)|0;if((d|0)==0){break}uf(-1,218832,(v=i,i=i+16|0,c[v>>2]=p+1,c[v+8>>2]=d,v)|0)}else{az(D|0)}}while(0);if((E|0)!=0){t=c[3524]|0;u=t+28|0;x=c[u>>2]|0;y=+(x>>>0>>>0);z=20.0/y;A=c[10030]|0;B=cf(A|0,219192,(v=i,i=i+56|0,h[v>>3]=z,h[v+8>>3]=z,h[v+16>>3]=z,h[v+24>>3]=z,h[v+32>>3]=z,h[v+40>>3]=z,h[v+48>>3]=z,v)|0)|0;i=b;return}if(C){uf(-1,218792,(v=i,i=i+8|0,c[v>>2]=p+1,v)|0)}else{uf(-1,218744,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}}function p9(a){a=a|0;c[57140]=a;return 1}function qa(a){a=a|0;c[57138]=a;return 1}function qb(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0;b=i;if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}if(a[228344]|0){d=c[10030]|0;aI(77776,5,1,d|0);a[228344]=0;c[57120]=-1}if(a[228312]|0){d=c[10030]|0;aI(73376,42,1,d|0);d=c[10030]|0;aI(73296,61,1,d|0);d=c[10030]|0;e=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/10.0);cf(d|0,73248,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[10030]|0;d=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/10.0);cf(e|0,73192,(v=i,i=i+8|0,c[v>>2]=d,v)|0);d=c[10030]|0;f=+(c[7938]|0)/10.0;cf(d|0,73160,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+(c[7939]|0)/10.0;cf(d|0,73120,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+(((c[(c[3524]|0)+12>>2]|0)-(c[7940]|0)|0)>>>0>>>0)/10.0;cf(d|0,73088,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+(((c[(c[3524]|0)+12>>2]|0)-(c[7941]|0)|0)>>>0>>>0)/10.0;cf(d|0,73056,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+((c[7939]|0)-(c[7938]|0)|0)/10.0;cf(d|0,72960,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+((c[7941]|0)-(c[7940]|0)|0)/10.0;cf(d|0,72872,(v=i,i=i+8|0,h[v>>3]=f,v)|0);e7(1);do{if((c[16546]|0)!=1){d=e6(72800)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==2){g=c[10030]|0;f=+h[d+24>>3];cf(g|0,72560,(v=i,i=i+16|0,c[v>>2]=72688,h[v+8>>3]=f,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=72688,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);d=e6(72544)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;j=c[d+24>>2]|0;cf(g|0,72752,(v=i,i=i+16|0,c[v>>2]=72528,c[v+8>>2]=j,v)|0);break}else if((e|0)==2){f=+h[d+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=72528,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);d=e6(225256)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==2){j=c[10030]|0;f=+h[d+24>>3];cf(j|0,72560,(v=i,i=i+16|0,c[v>>2]=225240,h[v+8>>3]=f,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=225240,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);d=e6(225200)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==2){j=c[10030]|0;f=+h[d+24>>3];cf(j|0,72560,(v=i,i=i+16|0,c[v>>2]=225128,h[v+8>>3]=f,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=225128,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);d=c[10030]|0;e=(a[30528]&1)!=0?225e3:224992;cf(d|0,225024,(v=i,i=i+8|0,c[v>>2]=e,v)|0);if((a[30528]&1)!=0){e=c[10030]|0;f=(c[17366]&1|0)==0?+h[8687]:0.0;cf(e|0,224952,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}do{if((c[17261]&3|0)==0){e=c[10030]|0;aI(224720,37,1,e|0)}else{e=e6(224936)|0;do{if((e|0)!=0){d=c[e+16>>2]|0;if((d|0)==1){j=c[10030]|0;g=c[e+24>>2]|0;cf(j|0,72752,(v=i,i=i+16|0,c[v>>2]=224920,c[v+8>>2]=g,v)|0);break}else if((d|0)==2){f=+h[e+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=224920,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);e=e6(224872)|0;if((e|0)==0){break}d=c[e+16>>2]|0;if((d|0)==2){g=c[10030]|0;f=+h[e+24>>3];cf(g|0,72560,(v=i,i=i+16|0,c[v>>2]=224832,h[v+8>>3]=f,v)|0);break}else if((d|0)==1){d=c[e+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=224832,c[v+8>>2]=d,v)|0);break}else{break}}}while(0);do{if((c[17089]&3|0)==0){d=c[10030]|0;aI(224096,37,1,d|0)}else{d=e6(224640)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;j=c[d+24>>2]|0;cf(g|0,72752,(v=i,i=i+16|0,c[v>>2]=224528,c[v+8>>2]=j,v)|0);break}else if((e|0)==2){f=+h[d+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=224528,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);d=e6(224432)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){j=c[10030]|0;g=c[d+24>>2]|0;cf(j|0,72752,(v=i,i=i+16|0,c[v>>2]=224320,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){f=+h[d+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=224320,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);d=c[10030]|0;e=a[66164]&1;cf(d|0,224040,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[10030]|0;d=a[65476]&1;cf(e|0,223976,(v=i,i=i+8|0,c[v>>2]=d,v)|0);if((a[30528]&1)!=0){d=c[10030]|0;e=a[69604]&1;cf(d|0,223896,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}e=c[10030]|0;if((c[16546]|0)==1){f=+h[8255];cf(e|0,223808,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+h[8256];cf(d|0,223728,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;g=c[8510]|0;do{if((g|0)==0){j=c[8506]|0;if((j|0)==4){k=223560;break}k=(j|0)==5?223536:223520}else{k=g}}while(0);cf(d|0,223648,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}else{aI(223432,34,1,e|0)}e=c[10030]|0;aI(223416,14,1,e|0)}aI(77776,5,1,c[10030]|0);if(!(a[228312]|0)){i=b;return}aI(223344,67,1,c[10030]|0);aI(223288,37,1,c[10030]|0);aI(223240,31,1,c[10030]|0);if(!(a[228312]|0)){i=b;return}if(!(a[228336]|0)){i=b;return}cf(c[10030]|0,223112,(v=i,i=i+8|0,c[v>>2]=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/10.0)-26,v)|0);aI(222992,42,1,c[10030]|0);i=b;return}function qc(){tu();c[57120]=-1;c[57118]=0;a[228352]=0;a[228528]=0;a[227272]=0;c[56736]=-1;c[56740]=-1;return}function qd(a,b){a=a|0;b=b|0;if((c[56740]|0)==(a|0)&(c[56736]|0)==(b|0)){return}tv(a,b);return}function qe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0.0;e=i;f=c[56740]|0;g=c[56736]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}if(!(a[227272]|0)){tv(f,g)}j=+((c[(c[3524]|0)+12>>2]|0)-d|0)/10.0;cf(c[10030]|0,73912,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=j,v)|0);g=(c[56816]|0)+1|0;c[56816]=g;if((g&7|0)==0){g=c[10030]|0;aI(73904,3,1,g|0)}c[56740]=b;c[56736]=d;i=e;return}function qf(b){b=b|0;var d=0;a[228528]=0;if((c[57144]|0)==(b|0)){return}if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}if(a[228344]|0){d=c[10030]|0;aI(77776,5,1,d|0);a[228344]=0;c[57120]=-1}c[57144]=b;tu();return}function qg(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0.0,n=0,o=0;g=i;if(a[227272]|0){if(a[228352]|0){j=c[10030]|0;aI(78232,6,1,j|0);a[228352]=0}j=c[10030]|0;aI(78240,9,1,j|0);c[56816]=0;a[227272]=0}j=c[57138]|0;if((j|0)==1){k=74560}else if((j|0)==0){k=74592}else{k=74552}j=((c[57140]|0)%180&-1|0)==0;l=((c[57114]|0)-(c[57112]|0)|0)/2&-1;m=+(((j?l:0)-e|0)+(c[(c[3524]|0)+12>>2]|0)|0)/10.0;cf(c[10030]|0,74504,(v=i,i=i+16|0,h[v>>3]=+((j?0:l)+b|0)/10.0,h[v+8>>3]=m,v)|0);b=c[57140]|0;if((b|0)!=0){l=c[10030]|0;j=-b|0;cf(l|0,74488,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}aI(74456,27,1,c[10030]|0);j=a[228528]|0;do{if(j<<24>>24==3){l=c[10030]|0;b=d[226992]|0;e=d[228368]|0;n=d[228536]|0;cf(l|0,74424,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=e,c[v+16>>2]=n,v)|0)}else{n=c[10030]|0;if(j<<24>>24==1){e=c[57082]|0;aK(e|0,n|0);break}e=c[57144]|0;if((e|0)>12){o=(e|0)%13&-1}else{o=e}e=o+3|0;b=227016+(((e|0)<0?0:e<<16>>16)<<4)|0;aK(b|0,n|0)}}while(0);m=+h[28552];cf(c[10030]|0,74384,(v=i,i=i+16|0,c[v>>2]=c[57108],h[v+8>>3]=m,v)|0);o=c[57096]|0;do{if((o|0)!=0){if((aY(o|0,77432)|0)==0){break}j=c[10030]|0;cf(j|0,74280,(v=i,i=i+8|0,c[v>>2]=o,v)|0)}}while(0);o=c[57100]|0;do{if((o|0)!=0){if((aY(o|0,77432)|0)==0){break}j=c[10030]|0;cf(j|0,74256,(v=i,i=i+8|0,c[v>>2]=o,v)|0)}}while(0);cf(c[10030]|0,74160,(v=i,i=i+8|0,c[v>>2]=k,v)|0);k=(aQ(f|0,74128)|0)==0;o=c[10030]|0;if(k){aI(74024,8,1,o|0)}else{aI(74096,29,1,o|0)}if(a[237856]|0){i=g;return}o=a[f]|0;if(o<<24>>24!=0){k=f;f=o;do{o=f<<24>>24;L23666:do{if((o|0)==60){j=c[10030]|0;aI(74016,4,1,j|0)}else if((o|0)==38){do{if((a[k+1|0]|0)==35){if((a[k+2|0]|0)!=120){break}j=c[10030]|0;aF(38,j|0);break L23666}}while(0);aI(74008,5,1,c[10030]|0)}else{aF(o|0,c[10030]|0)}}while(0);k=k+1|0;f=a[k]|0;}while(f<<24>>24!=0)}aI(73992,14,1,c[10030]|0);i=g;return}function qh(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;g=i;i=i+64|0;j=g|0;k=a[228528]|0;do{if(k<<24>>24==3){l=j|0;m=d[226992]|0;n=d[228368]|0;o=d[228536]|0;be(l|0,74880,(v=i,i=i+24|0,c[v>>2]=m,c[v+8>>2]=n,c[v+16>>2]=o,v)|0)}else{o=j|0;if(k<<24>>24==1){n=c[57082]|0;be(o|0,74864,(v=i,i=i+8|0,c[v>>2]=n,v)|0);break}else{a[o]=0;break}}}while(0);if(a[227272]|0){if(a[228352]|0){k=c[10030]|0;aI(78232,6,1,k|0);a[228352]=0}k=c[10030]|0;aI(78240,9,1,k|0);c[56816]=0;a[227272]=0}k=c[10030]|0;if((f|0)<0){p=+(b>>>0>>>0)/10.0;q=+((c[(c[3524]|0)+12>>2]|0)-e|0)/10.0;o=j|0;cf(k|0,74760,(v=i,i=i+24|0,h[v>>3]=p,h[v+8>>3]=q,c[v+16>>2]=o,v)|0);c[56740]=b;c[56736]=e;i=g;return}else{o=(f|0)%13&-1;q=+(b>>>0>>>0)/10.0;f=c[3524]|0;p=+((c[f+12>>2]|0)-e|0)/10.0;r=+h[1630]*+((c[f+28>>2]|0)>>>0>>>0)/20.0;f=j|0;cf(k|0,74656,(v=i,i=i+40|0,c[v>>2]=o,h[v+8>>3]=q,h[v+16>>3]=p,h[v+24>>3]=r,c[v+32>>2]=f,v)|0);c[56740]=b;c[56736]=e;i=g;return}}function qi(b){b=b|0;var d=0;c[59472]=(c[59472]|0)+1;do{if((b|0)==38){d=c[11232]|0;c[11232]=d+1;a[d]=38;d=c[11232]|0;c[11232]=d+1;a[d]=97;d=c[11232]|0;c[11232]=d+1;a[d]=109;d=c[11232]|0;c[11232]=d+1;a[d]=112;d=c[11232]|0;c[11232]=d+1;a[d]=59;return}else if((b|0)==60){d=c[11232]|0;c[11232]=d+1;a[d]=38;d=c[11232]|0;c[11232]=d+1;a[d]=108;d=c[11232]|0;c[11232]=d+1;a[d]=116;d=c[11232]|0;c[11232]=d+1;a[d]=59;return}else if((b|0)==(-2|0)){if((c[11252]|0)!=0){break}d=c[11232]|0;c[11232]=d+1;a[d]=38;return}}while(0);d=c[11232]|0;c[11232]=d+1;a[d]=b&255;return}function qj(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0;d=i;do{if((b|0)==0){e=17680}else{if((a[b]|0)==0){e=17680;break}f=aQ(b|0,75096)|0;if((f|0)==0){g=aQ(b|0,75048)|0}else{g=f}f=aQ(b|0,74992)|0;if((f|0)==0){j=aQ(b|0,74976)|0}else{j=f}f=bk(b|0,148464)|0;if((f|0)>0){uu(c[57108]|0);k=bP(b|0)|0;c[57108]=k;if((j|0)==0){c[57100]=77432}else{c[57100]=74936;l=uA(b|0)|0;a[k+(l-(uA(j|0)|0)|0)|0]=0}if((g|0)==0){c[57096]=77432}else{c[57096]=74928;l=uA(b|0)|0;k=l-(uA(g|0)|0)|0;a[(c[57108]|0)+k|0]=0}a[(c[57108]|0)+f|0]=0}if((a[b+f|0]|0)!=44){break}k=b+(f+1|0)|0;ca(k|0,148448,(v=i,i=i+8|0,c[v>>2]=228416,v)|0)}}while(0);if((e|0)==17680){uu(c[57108]|0);e=c[57106]|0;if((e|0)==0){m=0}else{m=bP(e|0)|0}c[57108]=m;h[28552]=+h[28551];c[57100]=c[57098];c[57096]=c[57094]}n=+h[28552];c[57114]=~~(n*10.0);m=~~(n*.25*10.0);c[57112]=m;c[57110]=m;c[(c[3524]|0)+20>>2]=~~(n*.7*10.0);c[(c[3524]|0)+16>>2]=((c[57112]|0)+(c[57114]|0)|0)+(c[57110]|0);i=d;return 1}function qk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+48|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+8>>2]=a;qp(4,h|0);i=g;return}function ql(b){b=+b;var d=0;if(+h[28571]==b){return}h[28571]=b;h[28376]=b;h[28378]=b;h[28380]=b;h[28382]=b;h[28384]=b;h[28386]=b;h[28388]=b;h[28390]=b;h[28392]=b;h[28394]=b;h[28396]=b;h[28398]=b;h[28400]=b;h[28402]=b;h[28404]=b;h[28406]=b;if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232|0,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240|0,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232|0,6,1,d|0);a[228352]=0}if(a[228344]|0){d=c[10030]|0;aI(77776|0,5,1,d|0);a[228344]=0;c[57120]=-1}tu();return}function qm(b){b=b|0;var d=0;if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}if((b|0)==0){return 0}c[56821]=c[b+4>>2];c[56822]=c[b+8>>2];c[56823]=c[b+12>>2];c[56824]=c[b+16>>2];a[227300]=a[b+20|0]|0;return 0}function qn(){if(!(a[228352]|0)){return}aI(78232,6,1,c[10030]|0);a[228352]=0;return}function qo(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d|0;f=c[b>>2]|0;if((f|0)==3){g=c[b+4>>2]|0;j=g>>>16&255;a[e|0]=j;a[e+1|0]=g>>>8&255;a[e+2|0]=g&255;k=j}else if((f|0)==1){j=c[b+4>>2]|0;if((j|0)>12){l=(j|0)%13&-1}else{l=j}j=l+3|0;c[57082]=227016+(((j|0)<0?0:j<<16>>16)<<4);a[228528]=1;i=d;return}else if((f|0)==5){fr(+h[b+8>>3],e);k=a[e|0]|0}else{i=d;return}a[228528]=3;b=e|0;do{if(k<<24>>24==(a[226992]|0)){if((a[e+1|0]|0)!=(a[228368]|0)){break}if((a[e+2|0]|0)!=(a[228536]|0)){break}i=d;return}}while(0);if(a[227272]|0){if(a[228352]|0){k=c[10030]|0;aI(78232,6,1,k|0);a[228352]=0}k=c[10030]|0;aI(78240,9,1,k|0);c[56816]=0;a[227272]=0}a[226992]=a[b]|0;a[228368]=a[e+1|0]|0;a[228536]=a[e+2|0]|0;i=d;return}function qp(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0.0;f=i;g=e+8|0;j=c[g>>2]|0;k=j>>4;l=j&15;c[g>>2]=l;do{if((l|0)==5|(l|0)==2){g=(k|0)%8&-1;if((g|0)==(c[57120]|0)){break}c[57120]=g;if(a[227272]|0){if(a[228352]|0){j=c[10030]|0;aI(78232,6,1,j|0);a[228352]=0}j=c[10030]|0;aI(78240,9,1,j|0);c[56816]=0;a[227272]=0}j=(c[57118]|0)+1|0;c[57118]=j;m=c[10030]|0;cf(m|0,76176,(v=i,i=i+8|0,c[v>>2]=j,v)|0);if((g|0)==7){n=76328;o=75816}else if((g|0)==5){n=76328;o=75896}else if((g|0)==3){n=76584;o=76e3}else if((g|0)==2){n=76328;o=76032}else if((g|0)==6){n=76328;o=75856}else if((g|0)==4){n=76328;o=75920}else if((g|0)==1){n=76328;o=76104}else{n=76328;o=179864}do{if((a[o]|0)!=0){g=(aY(n|0,76584)|0)==0?75712:75792;j=a[228528]|0;if(j<<24>>24==3){m=c[10030]|0;p=d[226992]|0;q=d[228368]|0;r=d[228536]|0;cf(m|0,75592,(v=i,i=i+48|0,c[v>>2]=g,c[v+8>>2]=n,c[v+16>>2]=p,c[v+24>>2]=q,c[v+32>>2]=r,c[v+40>>2]=o,v)|0);break}r=c[10030]|0;if(j<<24>>24==1){j=c[57082]|0;cf(r|0,75504,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=n,c[v+16>>2]=j,c[v+24>>2]=o,v)|0);break}else{cf(r|0,75424,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=n,c[v+16>>2]=o,v)|0);break}}}while(0);g=c[10030]|0;aI(75400,22,1,g|0)}}while(0);if(!(a[228352]|0)){if(a[227272]|0){o=c[10030]|0;aI(78240,9,1,o|0);c[56816]=0;a[227272]=0}o=c[10030]|0;aI(76352,55,1,o|0);a[228352]=1}aI(77136,11,1,c[10030]|0);do{if((l|0)==0){o=c[10030]|0;cf(o|0,77072,(v=i,i=i+8|0,c[v>>2]=227016,v)|0)}else if((l|0)==2|(l|0)==5){cf(c[10030]|0,76808,(v=i,i=i+8|0,c[v>>2]=c[57118],v)|0)}else if((l|0)==1|(l|0)==4){o=a[228528]|0;do{if(o<<24>>24==3){n=c[10030]|0;g=d[226992]|0;r=d[228368]|0;j=d[228536]|0;cf(n|0,76552,(v=i,i=i+32|0,c[v>>2]=76584,c[v+8>>2]=g,c[v+16>>2]=r,c[v+24>>2]=j,v)|0)}else{j=c[10030]|0;if(o<<24>>24==1){r=c[57082]|0;cf(j|0,76480,(v=i,i=i+16|0,c[v>>2]=76584,c[v+8>>2]=r,v)|0);break}else{cf(j|0,76448,(v=i,i=i+8|0,c[v>>2]=76584,v)|0);break}}}while(0);if(k>>>0>=100){break}cf(c[10030]|0,76904,(v=i,i=i+8|0,h[v>>3]=+(k|0)*.01,v)|0)}else{o=a[228528]|0;if(o<<24>>24==3){j=c[10030]|0;r=d[226992]|0;g=d[228368]|0;n=d[228536]|0;cf(j|0,76552,(v=i,i=i+32|0,c[v>>2]=76584,c[v+8>>2]=r,c[v+16>>2]=g,c[v+24>>2]=n,v)|0);break}n=c[10030]|0;if(o<<24>>24==1){o=c[57082]|0;cf(n|0,76480,(v=i,i=i+16|0,c[v>>2]=76584,c[v+8>>2]=o,v)|0);break}else{cf(n|0,76448,(v=i,i=i+8|0,c[v>>2]=76584,v)|0);break}}}while(0);aI(76704,11,1,c[10030]|0);k=c[10030]|0;if((b|0)>0){s=0;t=k}else{u=k;w=aI(76624,4,1,u|0)|0;i=f;return}while(1){x=+((c[(c[3524]|0)+12>>2]|0)-(c[e+(s*12&-1)+4>>2]|0)|0)/10.0;cf(t|0,76648,(v=i,i=i+24|0,h[v>>3]=+(c[e+(s*12&-1)>>2]|0)/10.0,h[v+8>>3]=x,c[v+16>>2]=((s|0)%16&-1|0)==15?140136:73808,v)|0);k=s+1|0;l=c[10030]|0;if((k|0)<(b|0)){s=k;t=l}else{u=l;break}}w=aI(76624,4,1,u|0)|0;i=f;return}function qq(b,d,e,f,g,j){b=b|0;d=+d;e=+e;f=f|0;g=g|0;j=j|0;var k=0,l=0.0,m=0.0,n=0;f=i;if((j|0)==2){if(a[237880]|0){a[237880]=0;a[c[11232]|0]=0;k=c[10030]|0;cf(k|0,77712,(v=i,i=i+8|0,c[v>>2]=43856,v)|0)}k=c[10030]|0;l=+(c[59472]|0)*.5;m=+h[29737]-e;cf(k|0,77608,(v=i,i=i+16|0,h[v>>3]=l,h[v+8>>3]=m,v)|0);h[29737]=e;h[29731]=0.0;c[11232]=43856;c[59472]=0;a[237880]=1;i=f;return}else if((j|0)==4){h[29731]=+(c[59472]|0)*-.5;h[29737]=+h[29737]-e;c[59472]=0;i=f;return}else if((j|0)==3){c[59472]=0;i=f;return}else{if(a[237880]|0){i=f;return}a[237880]=1;c[11232]=43856;aI(77600,6,1,c[10030]|0);j=c[57108]|0;if((aY(j|0,b|0)|0)!=0){uu(j);if((b|0)==0){n=0}else{n=bP(b|0)|0}c[57108]=n;b=c[10030]|0;cf(b|0,77568,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}if(+h[28552]!=d){h[28552]=d;n=c[10030]|0;cf(n|0,77544,(v=i,i=i+8|0,h[v>>3]=d,v)|0)}n=c[57096]|0;do{if((n|0)!=0){if((aY(n|0,77432)|0)==0){break}b=c[10030]|0;cf(b|0,77368,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}}while(0);n=c[57100]|0;do{if((n|0)!=0){if((aY(n|0,77432)|0)==0){break}b=c[10030]|0;cf(b|0,77288,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}}while(0);d=+h[29731];if(d!=0.0){n=c[10030]|0;cf(n|0,77256,(v=i,i=i+8|0,h[v>>3]=d,v)|0);h[29731]=0.0}d=+h[29737];if(d!=e){n=c[10030]|0;m=d-e;cf(n|0,77240,(v=i,i=i+8|0,h[v>>3]=m,v)|0);h[29737]=e}if(!g){g=c[10030]|0;aI(77208,12,1,g|0)}if(a[237872]|0){g=c[10030]|0;aI(77184,21,1,g|0)}aF(62,c[10030]|0);i=f;return}}function qr(){var b=0;b=i;if(!(a[237880]|0)){i=b;return}a[237880]=0;a[c[11232]|0]=0;cf(c[10030]|0,77712,(v=i,i=i+8|0,c[v>>2]=43856,v)|0);i=b;return}function qs(d){d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;b[f>>1]=0;if((d|0)==0|(d|0)==10){c[56750]=0;i=e;return}else if((d|0)==6){if(a[227272]|0){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(78240,9,1,g|0);c[56816]=0;a[227272]=0}if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}if(a[228344]|0){g=c[10030]|0;aI(77776,5,1,g|0);a[228344]=0;c[57120]=-1}g=(c[56750]|0)+1|0;c[56750]=g;h=c[57076]|0;j=(h|0)!=0?h:78208;do{if((a[33512]&1)!=0){h=c[8415]|0;if((h|0)>=26){break}a[f]=h+97&255}}while(0);cf(c[10030]|0,78184,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=g,c[v+16>>2]=f,v)|0);g=c[56750]|0;cf(c[10030]|0,78072,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=g,c[v+16>>2]=f,v)|0);c[57144]=-5;i=e;return}else if((d|0)==9){if(!(a[228312]|0)){i=e;return}if(a[227272]|0){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(78240,9,1,g|0);c[56816]=0;a[227272]=0}if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}aI(78232,6,1,c[10030]|0);c[57144]=-5;i=e;return}else if((d|0)==7){if(a[227272]|0){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(78240,9,1,g|0);c[56816]=0;a[227272]=0}if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}if(a[228344]|0){g=c[10030]|0;aI(77776,5,1,g|0);a[228344]=0;c[57120]=-1}aI(78232,6,1,c[10030]|0);c[57144]=-5;i=e;return}else if((d|0)==3){a[228360]=1;a[228336]=1;i=e;return}else if((d|0)==4){a[228360]=0;i=e;return}else if((d|0)==8){if(!(a[228312]|0)){i=e;return}if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[57076]|0;g=(d|0)!=0?d:78208;do{if((a[33512]&1)!=0){d=c[8415]|0;if((d|0)>=26){break}a[f]=d+97&255}}while(0);aI(77992,25,1,c[10030]|0);d=c[56750]|0;cf(c[10030]|0,77856,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=d,c[v+16>>2]=f,v)|0);aI(77816,2,1,c[10030]|0);i=e;return}else{i=e;return}}function qt(b){b=b|0;if((b|0)!=1){return}aI(78256,2,1,c[10030]|0);if(!(a[227272]|0)){return}if(a[228352]|0){b=c[10030]|0;aI(78232,6,1,b|0);a[228352]=0}aI(78240,9,1,c[10030]|0);c[56816]=0;a[227272]=0;return}function qu(){var b=0,d=0,e=0,f=0;b=i;if((a[33512]&1)==0){d=c[766]|0}else{c[772]=100;if((c[520]|0)>>>0>1){e=c[m>>2]|0;aI(79400,34,1,e|0);c[520]=1}c[766]=1;d=1}e=c[772]|0;f=c[778]|0;cf(c[10030]|0,79224,(v=i,i=i+56|0,c[v>>2]=a[225808]&1,c[v+8>>2]=e,c[v+16>>2]=d,c[v+24>>2]=25680,c[v+32>>2]=f,c[v+40>>2]=40152,c[v+48>>2]=40160,v)|0);a[46624]=0;c[9372]=0;c[524]=0;i=b;return}function qv(){var a=0;tt();c[9372]=0;c[524]=0;c[522]=1;c[526]=1;a=c[10030]|0;if((a|0)==0){return}aD(a|0);return}function qw(){tt();return}function qx(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0.0,S=0,T=0,U=0.0,V=0.0,W=0;b=i;i=i+80|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=c[13898]|0;l=c[8272]|0;L23998:do{if((k|0)<(l|0)){m=d|0;n=d+8|0;o=k;p=l;L24000:while(1){q=c[1054]|0;r=(a[q+(o*40&-1)|0]&1)==0;L24002:do{if(!r){s=c[q+(o*40&-1)+36>>2]|0;t=q+(o*40&-1)+32|0;u=c[10036]|0;w=0;while(1){if((w|0)>=(s|0)){break}if((a[u+((c[t>>2]|0)+w|0)|0]|0)==(a[w+103664|0]|0)){w=w+1|0}else{break L24002}}if((w|0)==1){break L23998}}}while(0);t=c[56580]|0;L24009:do{if((t|0)==0){x=226320}else{u=c[q+(o*40&-1)+36>>2]|0;s=c[q+(o*40&-1)+32>>2]|0;y=(u|0)>0;z=c[10036]|0;A=226320;B=t;while(1){L24013:do{if(!r){if(y){C=0;D=0;E=s;while(1){F=a[B+C|0]|0;if(F<<24>>24==(a[z+(C+E|0)|0]|0)){G=E;H=D}else{if(F<<24>>24!=36){break L24013}G=E-1|0;H=1}I=C+1|0;if((I|0)<(H+u|0)){C=I;D=H;E=G}else{break}}if((H|0)==0){J=I}else{x=A;break L24009}}else{J=0}E=a[B+J|0]|0;if((E<<24>>24|0)==36|(E<<24>>24|0)==0){x=A;break L24009}}}while(0);E=A+8|0;D=c[E>>2]|0;if((D|0)==0){x=E;break}else{A=E;B=D}}}}while(0);r=c[x+4>>2]|0;if((r|0)==4){a[225808]=1;c[13898]=o+1}else if((r|0)==5){K=o+1|0;c[13898]=K;if((K|0)>=(p|0)){L=18029;break}t=(a[q+(K*40&-1)|0]&1)==0;L24030:do{if(t){L=17953}else{B=c[q+(K*40&-1)+36>>2]|0;A=q+(K*40&-1)+32|0;u=c[10036]|0;z=0;while(1){if((z|0)>=(B|0)){L=17946;break}if((a[u+((c[A>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break}}if((L|0)==17946){L=0;if((z|0)==1){L=18030;break L24000}}if(t){L=17953;break}A=c[q+(K*40&-1)+36>>2]|0;u=q+(K*40&-1)+32|0;B=c[10036]|0;s=0;while(1){if((s|0)>=(A|0)){break}if((a[B+((c[u>>2]|0)+s|0)|0]|0)==(a[s+148464|0]|0)){s=s+1|0}else{L=17953;break L24030}}if((s|0)==1){M=K;N=p}else{L=17953}}}while(0);if((L|0)==17953){L=0;t=is(e)|0;u=c[t>>2]|0;if((u|0)==1){O=+(c[t+8>>2]|0)}else if((u|0)==3){O=+uz(c[t+8>>2]|0,0)}else if((u|0)==2){O=+h[t+8>>3]}else{L=17957;break}c[518]=~~O;M=c[13898]|0;N=c[8272]|0}if((N|0)<=(M|0)){L=18025;break}t=c[1054]|0;if((a[t+(M*40&-1)|0]&1)==0){L=18028;break}u=c[t+(M*40&-1)+36>>2]|0;B=t+(M*40&-1)+32|0;A=c[10036]|0;z=0;while(1){if((z|0)>=(u|0)){break}if((a[A+((c[B>>2]|0)+z|0)|0]|0)==(a[z+148464|0]|0)){z=z+1|0}else{L=18026;break L24000}}if((z|0)!=1){L=18027;break}B=M+1|0;c[13898]=B;L24058:do{if((N|0)>(B|0)){if((a[t+(B*40&-1)|0]&1)==0){L=17972;break}u=c[t+(B*40&-1)+36>>2]|0;y=t+(B*40&-1)+32|0;w=0;while(1){if((w|0)>=(u|0)){break}if((a[A+((c[y>>2]|0)+w|0)|0]|0)==(a[w+78864|0]|0)){w=w+1|0}else{L=17972;break L24058}}if((w|0)==1){P=B;Q=N}else{L=17972}}else{L=17972}}while(0);if((L|0)==17972){L=0;B=is(e)|0;A=c[B>>2]|0;if((A|0)==1){R=+(c[B+8>>2]|0)}else if((A|0)==2){R=+h[B+8>>3]}else if((A|0)==3){R=+uz(c[B+8>>2]|0,0)}else{L=17976;break}c[516]=~~R;P=c[13898]|0;Q=c[8272]|0}if((Q|0)<=(P|0)){L=18031;break}B=c[1054]|0;if((a[B+(P*40&-1)|0]&1)==0){L=18032;break}A=c[B+(P*40&-1)+36>>2]|0;t=B+(P*40&-1)+32|0;B=c[10036]|0;z=0;while(1){if((z|0)>=(A|0)){break}if((a[B+((c[t>>2]|0)+z|0)|0]|0)==(a[z+78864|0]|0)){z=z+1|0}else{L=18033;break L24000}}if((z|0)!=1){L=18034;break}c[13898]=P+1;c[520]=aa(c[518]|0,c[516]|0)}else if((r|0)==10){uD(25680,90584,10);uD(25424,90584,10);c[778]=18;c[(c[3524]|0)+16>>2]=18;c[(c[3524]|0)+20>>2]=(((c[778]|0)*6&-1)>>>0)/10>>>0;a[225808]=0;a[225792]=0;t=(c[3524]|0)+96|0;c[t>>2]=c[t>>2]&-1025;a[225800]=0;c[520]=1;c[522]=1;c[526]=1;c[518]=1;c[516]=1;c[772]=100;h[6448]=1.0;h[6449]=1.0;c[13898]=(c[13898]|0)+1}else if((r|0)==0){a[225792]=1;t=(c[3524]|0)+96|0;c[t>>2]=c[t>>2]|1024;c[13898]=(c[13898]|0)+1}else if((r|0)==1){a[225792]=0;t=(c[3524]|0)+96|0;c[t>>2]=c[t>>2]&-1025;c[13898]=(c[13898]|0)+1}else if((r|0)==8){t=o+1|0;c[13898]=t;S=t;L=17989}else if((r|0)==3){a[225808]=0;c[13898]=o+1}else if((r|0)==6){a[225800]=1;c[13898]=o+1}else if((r|0)==7){a[225800]=0;c[13898]=o+1}else if((r|0)==2){T=o+1|0;c[13898]=T;if((T|0)>=(p|0)){L=18024;break}L24089:do{if((a[q+(T*40&-1)|0]&1)!=0){t=c[q+(T*40&-1)+36>>2]|0;B=q+(T*40&-1)+32|0;A=c[10036]|0;y=0;while(1){if((y|0)>=(t|0)){break}if((a[A+((c[B>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L24089}}if((y|0)==1){L=18023;break L24000}}}while(0);z=is(e)|0;B=c[z>>2]|0;if((B|0)==1){U=+(c[z+8>>2]|0)}else if((B|0)==2){U=+h[z+8>>3]}else if((B|0)==3){U=+uz(c[z+8>>2]|0,0)}else{L=17936;break}h[6449]=U;if(U<=0.0){L=17938;break}}else{S=o;L=17989}L24101:do{if((L|0)==17989){L=0;L24103:do{if((S|0)<(p|0)){L24105:do{if((a[q+(S*40&-1)|0]&1)!=0){z=c[q+(S*40&-1)+36>>2]|0;B=q+(S*40&-1)+32|0;A=c[10036]|0;t=0;while(1){if((t|0)>=(z|0)){break}if((a[A+((c[B>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L24105}}if((t|0)==1){break L24103}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[m>>2]|0)!=3){c[13898]=S;break}B=c[n>>2]|0;if((B|0)==0){break}A=bk(B|0,148464)|0;do{if((a[B+A|0]|0)==44){if((ca(B+(A+1|0)|0,148448,(v=i,i=i+8|0,c[v>>2]=j,v)|0)|0)!=1){break}c[778]=~~(+h[j>>3]+.5)}}while(0);if((A|0)>0){uF(25680,B|0,255);a[A+25680|0]=0}uB(25424,25680);uu(B);break L24101}}while(0);if((r|0)==8){L=18006;break L24000}y=is(f)|0;z=c[y>>2]|0;if((z|0)==2){V=+h[y+8>>3]}else if((z|0)==3){V=+uz(c[y+8>>2]|0,0)}else if((z|0)==1){V=+(c[y+8>>2]|0)}else{L=18011;break L24000}y=~~V;c[778]=y;c[(c[3524]|0)+16>>2]=y;c[(c[3524]|0)+20>>2]=(((c[778]|0)*6&-1)>>>0)/10>>>0}}while(0);o=c[13898]|0;p=c[8272]|0;if((o|0)>=(p|0)){break L23998}}if((L|0)==18023){uf(T,79152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18033){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18024){uf(T,79152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18025){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18028){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17976){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18030){uf(K,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18034){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18029){uf(K,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18031){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18006){uf(c[13898]|0,78800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18027){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17938){uf((c[13898]|0)-1|0,79096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18026){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18032){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17936){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18011){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17957){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);L=a[225808]|0;P=c[518]|0;V=+g[178]*+(((P*1030&-1)-80|0)>>>0>>>0);do{if(L){U=14.0e4/V;M=c[516]|0;R=95.0e3/(+g[38]*+(((M*714&-1)-80|0)>>>0>>>0));c[772]=~~(U<R?U:R);if((M|0)==1){c[766]=0;W=1;break}else if((M|0)==2){c[766]=1;W=2;break}else{c[766]=2;W=M;break}}else{R=95.0e3/V;M=c[516]|0;U=14.0e4/(+g[38]*+(((M*714&-1)-80|0)>>>0>>>0));c[772]=~~(R<U?R:U);if((M|0)==1){c[766]=0;W=1;break}else if((M|0)==2){c[766]=1;W=2;break}else{c[766]=2;W=M;break}}}while(0);be(13048+(uA(13048)|0)|0,78736,(v=i,i=i+24|0,c[v>>2]=L?78704:78720,c[v+8>>2]=P,c[v+16>>2]=W,v)|0);uC(13048,(a[225792]|0?78656:95304)|0);W=13048+(uA(13048)|0)|0;be(W|0,78504,(v=i,i=i+8|0,h[v>>3]=+h[6449],v)|0);W=13048+(uA(13048)|0)|0;P=c[778]|0;be(W|0,78416,(v=i,i=i+24|0,c[v>>2]=a[225800]|0?131504:131584,c[v+8>>2]=25680,c[v+16>>2]=P,v)|0);i=b;return}function qy(a){a=a|0;if((a|0)==180|(a|0)==(-180|0)){c[780]=2}else if((a|0)==(-270|0)|(a|0)==90){c[780]=3}else if((a|0)==(-90|0)|(a|0)==270){c[780]=1}else{c[780]=0}return 1}function qz(a){a=a|0;c[776]=a;return 1}function qA(){var b=0,d=0,e=0.0,f=0,h=0,i=0;tt();if((a[33512]&1)==0){b=c[524]|0;if(b>>>0>=(c[520]|0)>>>0){d=c[m>>2]|0;aI(79440,40,1,d|0);return}d=b+1|0;c[524]=d;e=+(5e3/((c[772]|0)>>>0)>>>0>>>0>>>0);b=c[526]|0;f=~~(e+ +g[178]*+((b-1|0)>>>0>>>0)*1030.0);c[514]=f;h=c[522]|0;i=~~(e+ +g[38]*+(((h*714&-1)-80|0)>>>0>>>0));c[512]=i;if(((d>>>0)%((c[518]|0)>>>0)>>>0|0)==0){c[526]=1;c[522]=h+1}else{c[526]=b+1}c[554]=f;c[552]=i}else{i=a[225808]|0;c[(c[3524]|0)+8>>2]=i?1400:950;c[(c[3524]|0)+12>>2]=i?950:1400;c[554]=50;f=i?1e3:1450;c[552]=f;c[512]=f;c[514]=50}c[9372]=0;c[774]=0;c[780]=0;c[768]=1;c[770]=0;c[776]=0;a[25936]=a[89416]|0;a[25937|0]=a[89417|0]|0;a[25938|0]=a[89418|0]|0;a[25939|0]=a[89419|0]|0;a[25940|0]=a[89420|0]|0;a[25941|0]=a[89421|0]|0;a[26448]=a[28976]|0;a[26449|0]=a[28977|0]|0;a[26450|0]=a[28978|0]|0;return}function qB(b,d){b=b|0;d=d|0;c[554]=(c[514]|0)+b;c[552]=(c[512]|0)-d;if(!(a[46624]|0)){return}tt();return}function qC(b,d){b=b|0;d=d|0;var e=0,f=0;e=(c[514]|0)+b|0;b=(c[512]|0)-d|0;if(a[46624]|0){f=c[9372]|0}else{c[666]=c[554];c[566]=c[552];c[9372]=1;a[46624]=1;f=1}c[2664+(f<<2)>>2]=e;c[2264+(f<<2)>>2]=b;c[554]=e;c[552]=b;b=f+1|0;c[9372]=b;a[46624]=1;if((b|0)!=100){return}tt();return}function qD(b){b=b|0;var d=0;tt();if((b|0)>-1){d=((b|0)%10&-1)+2|0}else{d=(b|0)<-2?0:b+2|0}if(a[225792]|0){a[25936]=a[89416]|0;a[25937|0]=a[89417|0]|0;a[25938|0]=a[89418|0]|0;a[25939|0]=a[89419|0]|0;a[25940|0]=a[89420|0]|0;a[25941|0]=a[89421|0]|0;a[26448]=a[28976]|0;a[26449|0]=a[28977|0]|0;a[26450|0]=a[28978|0]|0}else{b=c[28928+(d<<2)>>2]|0;uB(25936,b|0);b=28976+(d*3&-1)|0;a[26448]=a[b]|0;a[26449|0]=a[b+1|0]|0;a[26450|0]=a[b+2|0]|0}c[768]=~~(+h[6448]*+h[6449]*+((c[2112+(d<<2)>>2]|0)>>>0>>>0)+.5);if(!(a[225800]|0)){c[770]=c[2160+(d<<2)>>2];return}if((d|0)==1){c[770]=5;return}else{c[770]=0;return}}function qE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=c[3524]|0;tt();if((a[e]|0)==0){i=f;return}h=((c[512]|0)-d|0)-((c[g+16>>2]|0)>>>1)|0;g=(c[514]|0)+b|0;b=c[778]|0;d=c[780]|0;j=(d|0)!=0?1:c[776]|0;k=c[774]|0;cf(c[10030]|0,79720,(v=i,i=i+72|0,c[v>>2]=25936,c[v+8>>2]=g,c[v+16>>2]=h,c[v+24>>2]=25680,c[v+32>>2]=b,c[v+40>>2]=j,c[v+48>>2]=d,c[v+56>>2]=k,c[v+64>>2]=e,v)|0);c[774]=(c[774]|0)+2;i=f;return}function qF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0;e=i;f=+(((c[514]|0)+a|0)>>>0>>>0);g=+(((c[512]|0)-b|0)>>>0>>>0);j=+h[3817]*8.0;k=j==0.0?.1:j;tt();do{if((d|0)!=-1){b=(d|0)%63&-1;if((b|0)==27){a=c[10030]|0;aI(83312,8,1,a|0);a=c[10030]|0;j=f-k;l=g-k;m=f+k;n=g+k;o=c[774]|0;c[774]=o+1;cf(a|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=l,h[v+24>>3]=m,h[v+32>>3]=n,c[v+40>>2]=o,v)|0);o=c[10030]|0;n=k*2.0;a=c[774]|0;c[774]=a+1;cf(o|0,80304,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=l,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=j,h[v+48>>3]=g,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=a,v)|0);a=c[774]|0;o=a+2|0;p=c[10030]|0;c[774]=a+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o,v)|0);i=e;return}else if((b|0)==50){aI(83312,8,1,c[10030]|0);n=g+k;m=g-k;j=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=n,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);n=k*.5;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=m,h[v+40>>3]=f+n,h[v+48>>3]=g-n,h[v+56>>3]=f-n,h[v+64>>3]=g+n,h[v+72>>3]=j,h[v+80>>3]=g,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==10){j=g+k;n=g-k*.75;o=c[774]|0;cf(c[10030]|0,82472,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f-k,h[v+32>>3]=n,h[v+40>>3]=f+k,h[v+48>>3]=n,h[v+56>>3]=f,h[v+64>>3]=j,c[v+72>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==39){aI(83312,8,1,c[10030]|0);o=c[10030]|0;j=f+k;n=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=j,h[v+32>>3]=n,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=j,h[v+32>>3]=n,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==26){aI(83312,8,1,c[10030]|0);o=c[10030]|0;n=f-k;j=g-k;m=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=m,c[v+40>>2]=p,v)|0);p=c[10030]|0;l=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,80448,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=n,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==1){l=f-k;n=g-k;m=f+k;j=g+k;o=c[774]|0;cf(c[10030]|0,83432,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=n,h[v+24>>3]=m,h[v+32>>3]=j,c[v+40>>2]=o+1,c[v+48>>2]=25936,h[v+56>>3]=l,h[v+64>>3]=j,h[v+72>>3]=m,h[v+80>>3]=n,c[v+88>>2]=o+2,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+5;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+4,v)|0);i=e;return}else if((b|0)==41){aI(83312,8,1,c[10030]|0);o=c[10030]|0;n=f-k;m=g-k;j=f+k;l=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=m,h[v+24>>3]=j,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=m,h[v+24>>3]=f,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=j,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==31){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=g-k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;j=k*.25;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-j,h[v+16>>3]=l,h[v+24>>3]=f+j,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==57){aI(83312,8,1,c[10030]|0);j=g+k;l=f+k;m=f-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);j=k*.5;n=f-j;q=g-j;r=g+j;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=n,h[v+32>>3]=q,h[v+40>>3]=f,h[v+48>>3]=g,h[v+56>>3]=n,h[v+64>>3]=r,h[v+72>>3]=m,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);m=f+j;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=m,h[v+32>>3]=q,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=m,h[v+64>>3]=r,h[v+72>>3]=f,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==43){aI(83312,8,1,c[10030]|0);p=c[10030]|0;r=f-k;m=f+k;l=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=g-k,h[v+24>>3]=m,h[v+32>>3]=l,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=g,h[v+24>>3]=m,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==12){l=g+k;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==52){aI(83312,8,1,c[10030]|0);l=g+k;m=g-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);r=k*.5;q=f-r;j=g-r;n=f+r;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=m,h[v+40>>3]=n,h[v+48>>3]=j,h[v+56>>3]=f,h[v+64>>3]=g,h[v+72>>3]=q,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);j=g+r;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=n,h[v+48>>3]=j,h[v+56>>3]=f,h[v+64>>3]=l,h[v+72>>3]=q,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==8){j=g-k;q=g+k*.75;p=c[774]|0;cf(c[10030]|0,82472,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=q,h[v+40>>3]=f-k,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=j,c[v+72>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==29){aI(83312,8,1,c[10030]|0);p=c[10030]|0;j=f-k;q=g-k;l=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;n=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80048,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=l,h[v+64>>3]=g,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==45){aI(83312,8,1,c[10030]|0);p=c[10030]|0;n=f-k;l=g-k;q=f+k;j=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=l,h[v+24>>3]=q,h[v+32>>3]=j,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=l,h[v+24>>3]=f,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=j,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==49){aI(83312,8,1,c[10030]|0);j=g+k;q=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=q,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=o,v)|0);j=k*.5;n=f-j;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=g,h[v+24>>3]=n,h[v+32>>3]=g-j,h[v+40>>3]=f,h[v+48>>3]=g,h[v+56>>3]=n,h[v+64>>3]=g+j,h[v+72>>3]=q,h[v+80>>3]=g,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==14){q=g-k;j=g-k*.25;n=k*.625;l=g+k;o=c[774]|0;cf(c[10030]|0,81840,(v=i,i=i+112|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=j,h[v+40>>3]=f+n,h[v+48>>3]=l,h[v+56>>3]=f-n,h[v+64>>3]=l,h[v+72>>3]=f-k,h[v+80>>3]=j,h[v+88>>3]=f,h[v+96>>3]=q,c[v+104>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==47){aI(83312,8,1,c[10030]|0);q=g+k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);q=k*.625;j=f-q;l=k*.375;n=g-l;r=k*.125;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=n,h[v+24>>3]=f-l,h[v+32>>3]=g-q,h[v+40>>3]=f+r,h[v+48>>3]=g-r,h[v+56>>3]=f-r,h[v+64>>3]=g+r,h[v+72>>3]=j,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p,v)|0);c[774]=(c[774]|0)+2;i=e;return}else if((b|0)==30){p=c[774]|0;cf(c[10030]|0,82736,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==4){p=c[774]|0;cf(c[10030]|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==23){aI(83312,8,1,c[10030]|0);p=c[10030]|0;n=f-k;j=g-k;r=f+k;q=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=r,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[10030]|0;l=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80720,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=r,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==11){l=g+k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==56){aI(83312,8,1,c[10030]|0);l=g+k;r=f+k;q=g-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=r,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);l=k*.5;j=f-l;n=g-l;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=n,h[v+24>>3]=f,h[v+32>>3]=q,h[v+40>>3]=r,h[v+48>>3]=g,h[v+56>>3]=f+l,h[v+64>>3]=g+l,h[v+72>>3]=j,h[v+80>>3]=n,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==20){aI(83312,8,1,c[10030]|0);p=c[10030]|0;n=f-k;j=g-k;l=f+k;r=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=r,c[v+40>>2]=o,v)|0);o=c[10030]|0;q=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,81608,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=j,h[v+72>>3]=q,h[v+80>>3]=q,c[v+88>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,81160,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=n,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=q,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==28){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=f-k;r=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;n=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,80200,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=q,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==19){aI(83312,8,1,c[10030]|0);o=c[10030]|0;n=f-k;r=g-k;q=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=q,c[v+40>>2]=p,v)|0);p=c[10030]|0;j=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81160,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=n,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=q,h[v+72>>3]=j,h[v+80>>3]=j,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==17){aI(83312,8,1,c[10030]|0);o=c[10030]|0;j=f-k;q=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;n=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81472,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==59){aI(83312,8,1,c[10030]|0);n=g+k;j=f+k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=n,h[v+24>>3]=j,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);q=k*.5;r=f-q;l=g+q;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=l,h[v+24>>3]=f+q,h[v+32>>3]=g-q,h[v+40>>3]=j,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=n,h[v+72>>3]=r,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==7){l=g-k;r=g+k*.75;o=c[774]|0;cf(c[10030]|0,82600,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=r,h[v+40>>3]=f-k,h[v+48>>3]=r,h[v+56>>3]=f,h[v+64>>3]=l,c[v+72>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==60){aI(83312,8,1,c[10030]|0);l=g+k;r=f+k;n=g-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=r,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=n,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);j=k*.5;q=f-j;m=g-j;o=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=m,h[v+24>>3]=f,h[v+32>>3]=n,h[v+40>>3]=r,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=l,h[v+72>>3]=q,h[v+80>>3]=g+j,h[v+88>>3]=f,h[v+96>>3]=g,h[v+104>>3]=q,h[v+112>>3]=m,c[v+120>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==35){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=f-k;q=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=q,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==61){aI(83312,8,1,c[10030]|0);q=g+k;m=f+k;j=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q,h[v+24>>3]=m,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);l=k*.5;r=g-l;o=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=g,h[v+24>>3]=f-l,h[v+32>>3]=r,h[v+40>>3]=f,h[v+48>>3]=g,h[v+56>>3]=f+l,h[v+64>>3]=r,h[v+72>>3]=m,h[v+80>>3]=g,h[v+88>>3]=f,h[v+96>>3]=q,h[v+104>>3]=j,h[v+112>>3]=g,c[v+120>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==54){aI(83312,8,1,c[10030]|0);j=g+k;q=g-k;m=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=o,v)|0);r=k*.5;l=f+r;o=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=q,h[v+40>>3]=l,h[v+48>>3]=g-r,h[v+56>>3]=f,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=g+r,h[v+88>>3]=f,h[v+96>>3]=j,h[v+104>>3]=m,h[v+112>>3]=g,c[v+120>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==6){o=c[774]|0;cf(c[10030]|0,82736,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==40){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=g-k;j=f+k;r=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=m,h[v+24>>3]=j,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=m,h[v+24>>3]=j,h[v+32>>3]=r,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==15){aI(83312,8,1,c[10030]|0);o=c[10030]|0;r=f-k;j=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=k*.342;l=g-k*.94;q=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81704,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f+m,h[v+48>>3]=l,h[v+56>>3]=f-m,h[v+64>>3]=l,h[v+72>>3]=q,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==2){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=g-k;l=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,83184,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q+-1.0,h[v+24>>3]=f,h[v+32>>3]=l+1.0,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=f-k;j=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,83112,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m+-1.0,h[v+16>>3]=g,h[v+24>>3]=j+1.0,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,83024,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=j,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,83024,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=l,h[v+24>>3]=j,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+5;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+4,v)|0);i=e;return}else if((b|0)==18){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=f-k;j=g-k;l=f+k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81368,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=q,h[v+64>>3]=g,h[v+72>>3]=m,h[v+80>>3]=m,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==38){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=f-k;q=g-k;l=f+k;j=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=j,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=j,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==51){aI(83312,8,1,c[10030]|0);j=g+k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);m=k*.5;l=f-m;q=g+m;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f+m,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=j,h[v+72>>3]=l,h[v+80>>3]=q,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==34){aI(83312,8,1,c[10030]|0);p=c[10030]|0;q=f-k;l=g-k;j=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=l,h[v+24>>3]=j,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=l,h[v+24>>3]=j,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==0){p=c[774]|0;cf(c[10030]|0,83736,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g-k+-1.0,h[v+24>>3]=f,h[v+32>>3]=g+k+1.0,c[v+40>>2]=p+1,c[v+48>>2]=25936,h[v+56>>3]=f-k+-1.0,h[v+64>>3]=g,h[v+72>>3]=f+k+1.0,h[v+80>>3]=g,c[v+88>>2]=p+2,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+5;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+4,v)|0);i=e;return}else if((b|0)==9){j=g+k;l=g-k*.75;p=c[774]|0;cf(c[10030]|0,82600,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f-k,h[v+32>>3]=l,h[v+40>>3]=f+k,h[v+48>>3]=l,h[v+56>>3]=f,h[v+64>>3]=j,c[v+72>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==3){p=c[774]|0;cf(c[10030]|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==46){p=c[774]|0;cf(c[10030]|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==55){aI(83312,8,1,c[10030]|0);j=g+k;l=f+k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);j=k*.5;q=f+j;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=g-j,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=q,h[v+64>>3]=g+j,h[v+72>>3]=f,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==37){aI(83312,8,1,c[10030]|0);p=c[10030]|0;j=f-k;q=g-k;l=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=l,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==22){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=f-k;q=g-k;j=f+k;m=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=q,h[v+24>>3]=j,h[v+32>>3]=m,c[v+40>>2]=o,v)|0);o=c[10030]|0;r=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80872,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=j,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=m,h[v+72>>3]=r,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==48){aI(83312,8,1,c[10030]|0);r=g+k;m=g-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);r=k*.5;j=f-r;q=g-r;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=m,h[v+40>>3]=f+r,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=g,h[v+72>>3]=j,h[v+80>>3]=q,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==21){aI(83312,8,1,c[10030]|0);p=c[10030]|0;q=f-k;j=g-k;r=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=r,c[v+40>>2]=o,v)|0);o=c[10030]|0;m=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,81040,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=j,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=m,h[v+80>>3]=m,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==5){p=c[774]|0;cf(c[10030]|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==25){aI(83312,8,1,c[10030]|0);p=c[10030]|0;m=f-k;r=g-k;j=f+k;q=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=r,h[v+24>>3]=j,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[10030]|0;l=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,81472,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=r,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,80720,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==42){aI(83312,8,1,c[10030]|0);o=c[10030]|0;l=f-k;j=g-k;q=f+k;r=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=j,h[v+24>>3]=q,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=j,h[v+24>>3]=q,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==58){aI(83312,8,1,c[10030]|0);r=g+k;q=f+k;j=g-k;l=f-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=q,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=j,h[v+56>>3]=l,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);r=k*.5;m=g+r;p=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=j,h[v+40>>3]=q,h[v+48>>3]=g,h[v+56>>3]=f+r,h[v+64>>3]=m,h[v+72>>3]=f,h[v+80>>3]=g,h[v+88>>3]=f-r,h[v+96>>3]=m,h[v+104>>3]=l,h[v+112>>3]=g,c[v+120>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==32){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=g-k;m=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=l,h[v+24>>3]=m,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=m,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==(-1|0)){break}else if((b|0)==13){m=g-k;l=g-k*.25;r=k*.625;q=g+k;p=c[774]|0;cf(c[10030]|0,82080,(v=i,i=i+112|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=m,h[v+24>>3]=f+k,h[v+32>>3]=l,h[v+40>>3]=f+r,h[v+48>>3]=q,h[v+56>>3]=f-r,h[v+64>>3]=q,h[v+72>>3]=f-k,h[v+80>>3]=l,h[v+88>>3]=f,h[v+96>>3]=m,c[v+104>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==24){aI(83312,8,1,c[10030]|0);p=c[10030]|0;m=f-k;l=g-k;q=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[10030]|0;r=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80616,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=l,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=l,h[v+72>>3]=r,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==62){r=g+k;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==53){aI(83312,8,1,c[10030]|0);r=g+k;l=f-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=l,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);q=k*.5;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=g,h[v+24>>3]=f-q,h[v+32>>3]=g-q,h[v+40>>3]=f+q,h[v+48>>3]=g+q,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=l,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==44){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=f-k;r=g-k;q=f+k;m=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=r,h[v+24>>3]=q,h[v+32>>3]=m,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=q,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=m,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==33){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=f-k;q=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==36){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=f-k;m=g-k;l=f+k;r=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=m,h[v+24>>3]=l,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=m,h[v+24>>3]=l,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==16){aI(83312,8,1,c[10030]|0);b=c[10030]|0;r=f-k;q=g-k;l=f+k;p=c[774]|0;c[774]=p+1;cf(b|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=k*2.0;b=c[774]|0;c[774]=b+1;cf(p|0,81608,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=q,h[v+72>>3]=m,h[v+80>>3]=m,c[v+88>>2]=b,v)|0);b=c[774]|0;p=c[10030]|0;c[774]=b+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=b+2,v)|0);i=e;return}else{i=e;return}}}while(0);d=c[10030]|0;b=c[774]|0;c[774]=b+1;cf(d|0,83880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=f+1.0,h[v+32>>3]=g+1.0,c[v+40>>2]=b,v)|0);i=e;return}function qG(a){a=+a;return}function qH(a){a=a|0;return 0}function qI(){return}function qJ(){return}function qK(){return}function qL(a){a=+a;h[6448]=a<0.0?1.0:a;return}function qM(a,b){a=a|0;b=b|0;c[1082]=a;c[1080]=1e3-b;return}function qN(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;f=i;tt();g=c[514]|0;h=g+d|0;d=c[512]|0;j=d-e|0;e=c[768]|0;k=c[774]|0;l=c[770]|0;cf(c[10030]|0,83952,(v=i,i=i+72|0,c[v>>2]=25936,c[v+8>>2]=2,c[v+16>>2]=g+a,c[v+24>>2]=d-b,c[v+32>>2]=h,c[v+40>>2]=j,c[v+48>>2]=e,c[v+56>>2]=k,c[v+64>>2]=l,v)|0);c[774]=(c[774]|0)+1;c[554]=h;c[552]=j;i=f;return}function qO(b){b=b|0;var d=0,e=0,f=0;d=i;if((b|0)==0){e=18229}else{if((a[b]|0)==0){e=18229}else{f=b}}if((e|0)==18229){f=25424}e=bk(f|0,148464)|0;if((e|0)>0){uF(25680,f|0,e|0);a[e+25680|0]=0}ca(f+(e+1|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=3112,v)|0);i=d;return 1}function qP(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+48|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+8>>2]=a;qR(4,h|0);i=g;return}function qQ(b){b=b|0;var e=0,f=0,g=0,j=0;e=i;f=c[b>>2]|0;if((f|0)==1){g=c[b+4>>2]|0;tt();if((g|0)>-1){j=((g|0)%10&-1)+2|0}else{j=(g|0)<-2?0:g+2|0}if(a[225792]|0){a[25936]=a[89416]|0;a[25937|0]=a[89417|0]|0;a[25938|0]=a[89418|0]|0;a[25939|0]=a[89419|0]|0;a[25940|0]=a[89420|0]|0;a[25941|0]=a[89421|0]|0;a[26448]=a[28976]|0;a[26449|0]=a[28977|0]|0;a[26450|0]=a[28978|0]|0}else{g=c[28928+(j<<2)>>2]|0;uB(25936,g|0);g=28976+(j*3&-1)|0;a[26448]=a[g]|0;a[26449|0]=a[g+1|0]|0;a[26450|0]=a[g+2|0]|0}c[768]=~~(+h[6448]*+h[6449]*+((c[2112+(j<<2)>>2]|0)>>>0>>>0)+.5);if(!(a[225800]|0)){c[770]=c[2160+(j<<2)>>2];i=e;return}if((j|0)==1){c[770]=5;i=e;return}else{c[770]=0;i=e;return}}else if((f|0)==5){fr(+h[b+8>>3],26448);j=d[26449]|0;g=d[26450]|0;be(25936,84104,(v=i,i=i+24|0,c[v>>2]=d[26448]|0,c[v+8>>2]=j,c[v+16>>2]=g,v)|0);i=e;return}else if((f|0)==3){f=c[b+4>>2]|0;b=f>>>16;a[26448]=b&255;g=f>>>8;a[26449]=g&255;a[26450]=f&255;be(25936,84104,(v=i,i=i+24|0,c[v>>2]=b&255,c[v+8>>2]=g&255,c[v+16>>2]=f&255,v)|0);i=e;return}else{i=e;return}}function qR(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;i=i+256|0;g=f|0;h=c[e+8>>2]|0;j=h>>4;k=h&15;if(a[46624]|0){tt()}if((k|0)==4|(k|0)==1){h=g|0;l=+(100-j|0)*.01;do{if(l<0.0){m=0.0}else{if(l<=1.0){m=l;break}m=1.0}}while(0);n=d[26448]|0;o=~~(+(n|0)+m*+(n^255|0));n=d[26449]|0;p=~~(+(n|0)+m*+(n^255|0));n=d[26450]|0;q=~~(+(n|0)+m*+(n^255|0));be(h|0,84104,(v=i,i=i+24|0,c[v>>2]=o,c[v+8>>2]=p,c[v+16>>2]=q,v)|0);r=1}else if((k|0)==0){q=g|0;a[q]=a[84376]|0;a[q+1|0]=a[84377|0]|0;a[q+2|0]=a[84378|0]|0;a[q+3|0]=a[84379|0]|0;a[q+4|0]=a[84380|0]|0;a[q+5|0]=a[84381|0]|0;r=2}else if((k|0)==5|(k|0)==2){k=c[2224+(((j|0)%10&-1)<<2)>>2]|0;uB(g|0,25936);r=k}else{uB(g|0,25936);r=1}cf(c[10030]|0,84328,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=b+1,v)|0);g=e|0;k=e+4|0;j=(c[512]|0)-(c[k>>2]|0)|0;cf(c[10030]|0,84280,(v=i,i=i+16|0,c[v>>2]=(c[514]|0)+(c[g>>2]|0),c[v+8>>2]=j,v)|0);j=c[10030]|0;if((b|0)>1){s=1;t=j}else{u=j;w=c[g>>2]|0;x=c[514]|0;y=x+w|0;z=c[512]|0;A=c[k>>2]|0;B=z-A|0;C=cf(u|0,84160,(v=i,i=i+16|0,c[v>>2]=y,c[v+8>>2]=B,v)|0)|0;D=c[10030]|0;E=c[774]|0;F=cf(D|0,84120,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=E,v)|0)|0;G=c[774]|0;H=G+1|0;c[774]=H;i=f;return}while(1){j=(c[512]|0)-(c[e+(s*12&-1)+4>>2]|0)|0;cf(t|0,84280,(v=i,i=i+16|0,c[v>>2]=(c[514]|0)+(c[e+(s*12&-1)>>2]|0),c[v+8>>2]=j,v)|0);j=s+1|0;if((j&7|0)==0){q=c[10030]|0;aI(84248,2,1,q|0)}q=c[10030]|0;if((j|0)<(b|0)){s=j;t=q}else{u=q;break}}w=c[g>>2]|0;x=c[514]|0;y=x+w|0;z=c[512]|0;A=c[k>>2]|0;B=z-A|0;C=cf(u|0,84160,(v=i,i=i+16|0,c[v>>2]=y,c[v+8>>2]=B,v)|0)|0;D=c[10030]|0;E=c[774]|0;F=cf(D|0,84120,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=E,v)|0)|0;G=c[774]|0;H=G+1|0;c[774]=H;i=f;return}function qS(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;b=i;a[4304]=0;a[4336]=0;d=c[13898]|0;e=c[8272]|0;L24421:do{if((d|0)<(e|0)){f=c[1054]|0;g=d;h=0;j=0;while(1){k=(a[f+(g*40&-1)|0]&1)==0;L24425:do{if(!k){l=c[f+(g*40&-1)+36>>2]|0;m=f+(g*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break L24425}}if((o|0)==1){p=h;q=j;break L24421}}}while(0);m=c[56574]|0;L24432:do{if((m|0)==0){r=226296}else{n=c[f+(g*40&-1)+36>>2]|0;l=c[f+(g*40&-1)+32>>2]|0;s=(n|0)>0;t=c[10036]|0;u=226296;w=m;while(1){L24436:do{if(!k){if(s){x=0;y=0;z=l;while(1){A=a[w+x|0]|0;if(A<<24>>24==(a[t+(x+z|0)|0]|0)){B=z;C=y}else{if(A<<24>>24!=36){break L24436}B=z-1|0;C=1}D=x+1|0;if((D|0)<(C+n|0)){x=D;y=C;z=B}else{break}}if((C|0)==0){E=D}else{r=u;break L24432}}else{E=0}z=a[w+E|0]|0;if((z<<24>>24|0)==36|(z<<24>>24|0)==0){r=u;break L24432}}}while(0);z=u+8|0;y=c[z>>2]|0;if((y|0)==0){r=z;break}else{u=z;w=y}}}}while(0);k=c[r+4>>2]|0;if((k|0)==0){a[4304]=1;m=g+1|0;c[13898]=m;F=1;G=j;H=m}else if((k|0)==1){a[4336]=1;k=g+1|0;c[13898]=k;F=h;G=1;H=k}else{k=g+1|0;c[13898]=k;F=h;G=j;H=k}if((H|0)<(e|0)){g=H;h=F;j=G}else{p=F;q=G;break}}}else{p=0;q=0}}while(0);be(13048,84616,(v=i,i=i+16|0,c[v>>2]=p?84608:179864,c[v+8>>2]=q?84576:179864,v)|0);i=b;return}function qT(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;b=i;d=c[10030]|0;if(a[4304]|0){aI(87648,3,1,d|0);if((a[37384]&1)!=0){e=c[10030]|0;f=aD(e|0)|0;i=b;return}g=c[10030]|0;aI(87560,23,1,g|0);g=c[10030]|0;j=c[7938]|0;k=c[7939]|0;l=1e3-(c[7941]|0)|0;m=1e3-(c[7940]|0)|0;cf(g|0,87528,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=l,c[v+24>>2]=m,v)|0);m=c[10030]|0;aI(87648,3,1,m|0);m=c[10030]|0;aI(87440,25,1,m|0);m=c[10030]|0;n=+h[8255];o=+h[8256];p=+h[8169];q=+h[8170];r=+h[8599];s=+h[8600];t=+h[8513];u=+h[8514];cf(m|0,87360,(v=i,i=i+64|0,h[v>>3]=n,h[v+8>>3]=o,h[v+16>>3]=p,h[v+24>>3]=q,h[v+32>>3]=r,h[v+40>>3]=s,h[v+48>>3]=t,h[v+56>>3]=u,v)|0);m=c[10030]|0;aI(87648,3,1,m|0);if(!(a[4336]|0)){e=c[10030]|0;f=aD(e|0)|0;i=b;return}m=c[10030]|0;aI(87336,17,1,m|0);m=c[10030]|0;aI(87136,88,1,m|0);m=c[10030]|0;aI(87072,41,1,m|0);m=c[10030]|0;aI(86960,43,1,m|0);m=c[10030]|0;aI(86840,107,1,m|0);m=c[10030]|0;aI(86816,9,1,m|0);m=c[10030]|0;aI(86600,72,1,m|0);m=c[10030]|0;aI(86520,72,1,m|0);m=c[10030]|0;aI(86384,72,1,m|0);m=c[10030]|0;aI(86248,72,1,m|0);m=c[10030]|0;aI(86232,11,1,m|0);m=c[10030]|0;aI(86144,2,1,m|0);m=c[10030]|0;aI(87648,3,1,m|0);e=c[10030]|0;f=aD(e|0)|0;i=b;return}else{aI(86144,2,1,d|0);if((a[37384]&1)!=0){e=c[10030]|0;f=aD(e|0)|0;i=b;return}d=c[10030]|0;aI(86024,27,1,d|0);d=c[10030]|0;m=c[7938]|0;l=c[7939]|0;k=1e3-(c[7941]|0)|0;j=1e3-(c[7940]|0)|0;cf(d|0,85936,(v=i,i=i+32|0,c[v>>2]=m,c[v+8>>2]=l,c[v+16>>2]=k,c[v+24>>2]=j,v)|0);j=c[10030]|0;aI(86144,2,1,j|0);j=c[10030]|0;aI(85896,29,1,j|0);j=c[10030]|0;u=+h[8255];t=+h[8256];s=+h[8169];r=+h[8170];q=+h[8599];p=+h[8600];o=+h[8513];n=+h[8514];cf(j|0,85856,(v=i,i=i+64|0,h[v>>3]=u,h[v+8>>3]=t,h[v+16>>3]=s,h[v+24>>3]=r,h[v+32>>3]=q,h[v+40>>3]=p,h[v+48>>3]=o,h[v+56>>3]=n,v)|0);j=c[10030]|0;aI(86144,2,1,j|0);if(!(a[4336]|0)){e=c[10030]|0;f=aD(e|0)|0;i=b;return}j=c[10030]|0;aI(85712,72,1,j|0);j=c[10030]|0;aI(85648,60,1,j|0);j=c[10030]|0;aI(85552,35,1,j|0);j=c[10030]|0;aI(85408,94,1,j|0);j=c[10030]|0;aI(86816,9,1,j|0);j=c[10030]|0;aI(85232,103,1,j|0);j=c[10030]|0;aI(84968,103,1,j|0);j=c[10030]|0;aI(84840,103,1,j|0);j=c[10030]|0;aI(84632,81,1,j|0);j=c[10030]|0;aI(86144,2,1,j|0);j=c[10030]|0;aI(86144,2,1,j|0);e=c[10030]|0;f=aD(e|0)|0;i=b;return}}function qU(){var b=0;b=c[10030]|0;if(a[4304]|0){aI(87976|0,314,1,b|0)}else{aI(87656|0,305,1,b|0)}c[1094]=0;c[1080]=0;c[1082]=0;return}function qV(a){a=a|0;c[1094]=(a|0)<-2?0:a+2&7;return}function qW(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0;e=i;do{if(a[4336]|0){if((a[37384]&1)!=0){break}f=c[10030]|0;if(a[4304]|0){aI(89232,11,1,f|0);break}else{aI(89104,12,1,f|0);break}}}while(0);f=1e3-d|0;g=c[10030]|0;j=c[1082]|0;k=c[1080]|0;l=c[4344+(c[1094]<<2)>>2]|0;m=+h[539];if(a[4304]|0){cf(g|0,88928,(v=i,i=i+48|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=b,c[v+24>>2]=f,c[v+32>>2]=l,h[v+40>>3]=m,v)|0)}else{cf(g|0,88712,(v=i,i=i+48|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=b,c[v+24>>2]=f,c[v+32>>2]=l,h[v+40>>3]=m,v)|0)}do{if(a[4336]|0){if((a[37384]&1)!=0){break}l=c[10030]|0;k=a[66164]&1;j=k<<24>>24!=0;if(a[4304]|0){if(j){m=+h[8255];g=c[1082]|0;n=c[7938]|0;o=c[7939]|0;p=+h[8256];q=+R(+(+h[8271]),+(m+ +(g-n|0)/+(o-n|0)*(p-m)));r=g;s=n;t=o;u=m;w=p}else{p=+h[8255];o=c[1082]|0;n=c[7938]|0;g=c[7939]|0;m=+h[8256];q=p+ +(o-n|0)/+(g-n|0)*(m-p);r=o;s=n;t=g;u=p;w=m}g=(a[65476]&1)==0;if(g){m=+h[8169];n=c[1080]|0;o=c[7940]|0;x=c[7941]|0;p=+h[8170];y=m+ +((1e3-n|0)-o|0)/+(x-o|0)*(p-m);z=n;A=o;B=x;C=m;D=p}else{p=+h[8169];x=c[1080]|0;o=c[7940]|0;n=c[7941]|0;m=+h[8170];y=+R(+(+h[8185]),+(p+ +((1e3-x|0)-o|0)/+(n-o|0)*(m-p)));z=x;A=o;B=n;C=p;D=m}n=(a[68916]&1)==0;if(n){m=+h[8599];p=+h[8600];E=m+ +(r-s|0)/+(t-s|0)*(p-m);F=m;G=p}else{p=+h[8599];m=+h[8600];E=+R(+(+h[8615]),+(p+ +(r-s|0)/+(t-s|0)*(m-p)));F=p;G=m}o=(a[68228]&1)==0;if(o){m=+h[8513];p=+h[8514];H=m+ +((1e3-z|0)-A|0)/+(B-A|0)*(p-m);I=m;J=p}else{p=+h[8513];m=+h[8514];H=+R(+(+h[8529]),+(p+ +((1e3-z|0)-A|0)/+(B-A|0)*(m-p)));I=p;J=m}if(k<<24>>24==0){K=u+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(w-u)}else{K=+R(+(+h[8271]),+(u+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(w-u)))}if(g){L=C+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(D-C)}else{L=+R(+(+h[8185]),+(C+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(D-C)))}if(n){M=F+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(G-F)}else{M=+R(+(+h[8615]),+(F+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(G-F)))}if(o){N=I+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(J-I)}else{N=+R(+(+h[8529]),+(I+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(J-I)))}cf(l|0,88632,(v=i,i=i+64|0,h[v>>3]=q,h[v+8>>3]=y,h[v+16>>3]=E,h[v+24>>3]=H,h[v+32>>3]=K,h[v+40>>3]=L,h[v+48>>3]=M,h[v+56>>3]=N,v)|0);o=c[10030]|0;if((a[66164]&1)==0){aI(88544,4,1,o|0)}else{m=+h[8255];n=c[7938]|0;p=+R(+(+h[8271]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8256]-m)));cf(o|0,88624,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}o=c[10030]|0;if((a[65476]&1)==0){aI(88544,4,1,o|0)}else{p=+h[8169];n=c[7940]|0;m=+R(+(+h[8185]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8170]-p)));cf(o|0,88624,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}o=c[10030]|0;if((a[68916]&1)==0){aI(88544,4,1,o|0)}else{m=+h[8599];n=c[7938]|0;p=+R(+(+h[8615]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8600]-m)));cf(o|0,88624,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}o=c[10030]|0;if((a[68228]&1)==0){aI(88528,3,1,o|0)}else{p=+h[8513];n=c[7940]|0;m=+R(+(+h[8529]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8514]-p)));cf(o|0,88536,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}o=c[10030]|0;aI(88480,4,1,o|0);c[1082]=b;c[1080]=f;i=e;return}else{if(j){m=+h[8255];j=c[1082]|0;o=c[7938]|0;n=c[7939]|0;p=+h[8256];O=+R(+(+h[8271]),+(m+ +(j-o|0)/+(n-o|0)*(p-m)));P=j;Q=o;S=n;T=m;U=p}else{p=+h[8255];n=c[1082]|0;o=c[7938]|0;j=c[7939]|0;m=+h[8256];O=p+ +(n-o|0)/+(j-o|0)*(m-p);P=n;Q=o;S=j;T=p;U=m}j=(a[65476]&1)==0;if(j){m=+h[8169];o=c[1080]|0;n=c[7940]|0;g=c[7941]|0;p=+h[8170];V=m+ +((1e3-o|0)-n|0)/+(g-n|0)*(p-m);W=o;X=n;Y=g;Z=m;_=p}else{p=+h[8169];g=c[1080]|0;n=c[7940]|0;o=c[7941]|0;m=+h[8170];V=+R(+(+h[8185]),+(p+ +((1e3-g|0)-n|0)/+(o-n|0)*(m-p)));W=g;X=n;Y=o;Z=p;_=m}o=(a[68916]&1)==0;if(o){m=+h[8599];p=+h[8600];$=m+ +(P-Q|0)/+(S-Q|0)*(p-m);aa=m;ab=p}else{p=+h[8599];m=+h[8600];$=+R(+(+h[8615]),+(p+ +(P-Q|0)/+(S-Q|0)*(m-p)));aa=p;ab=m}n=(a[68228]&1)==0;if(n){m=+h[8513];p=+h[8514];ac=m+ +((1e3-W|0)-X|0)/+(Y-X|0)*(p-m);ad=m;ae=p}else{p=+h[8513];m=+h[8514];ac=+R(+(+h[8529]),+(p+ +((1e3-W|0)-X|0)/+(Y-X|0)*(m-p)));ad=p;ae=m}if(k<<24>>24==0){af=T+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(U-T)}else{af=+R(+(+h[8271]),+(T+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(U-T)))}if(j){ag=Z+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(_-Z)}else{ag=+R(+(+h[8185]),+(Z+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(_-Z)))}if(o){ah=aa+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(ab-aa)}else{ah=+R(+(+h[8615]),+(aa+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(ab-aa)))}if(n){ai=ad+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(ae-ad)}else{ai=+R(+(+h[8529]),+(ad+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(ae-ad)))}cf(l|0,88424,(v=i,i=i+64|0,h[v>>3]=O,h[v+8>>3]=V,h[v+16>>3]=$,h[v+24>>3]=ac,h[v+32>>3]=af,h[v+40>>3]=ag,h[v+48>>3]=ah,h[v+56>>3]=ai,v)|0);l=c[10030]|0;if((a[66164]&1)==0){aI(88384,3,1,l|0)}else{m=+h[8255];n=c[7938]|0;p=+R(+(+h[8271]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8256]-m)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}l=c[10030]|0;if((a[65476]&1)==0){aI(88384,3,1,l|0)}else{p=+h[8169];n=c[7940]|0;m=+R(+(+h[8185]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8170]-p)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}l=c[10030]|0;if((a[68916]&1)==0){aI(88384,3,1,l|0)}else{m=+h[8599];n=c[7938]|0;p=+R(+(+h[8615]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8600]-m)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}l=c[10030]|0;if((a[68228]&1)==0){aI(88384,3,1,l|0)}else{p=+h[8513];n=c[7940]|0;m=+R(+(+h[8529]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8514]-p)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}l=c[10030]|0;aI(88360,2,1,l|0);c[1082]=b;c[1080]=f;i=e;return}}}while(0);if(!(a[4304]|0)){c[1082]=b;c[1080]=f;i=e;return}aI(125976,2,1,c[10030]|0);c[1082]=b;c[1080]=f;i=e;return}function qX(a){a=+a;h[539]=a;return}function qY(){c[58300]=0;c[58302]=0;a[233344]=0;return}function qZ(c){c=c|0;var d=0;if((c|0)==1){a[4384]=a[89896]|0;a[4385|0]=a[89897|0]|0;a[4386|0]=a[89898|0]|0;a[4387|0]=a[89899|0]|0;a[4388|0]=a[89900|0]|0;a[4389|0]=a[89901|0]|0;a[4390|0]=a[89902|0]|0;d=1;return d|0}else if((c|0)==0){b[2192]=119;d=1;return d|0}else if((c|0)==2){b[2192]=101;d=1;return d|0}else{b[2192]=119;d=0;return d|0}return 0}function q_(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+8|0;e=d|0;do{if((b|0)!=0){if((a[b]|0)==0){break}c[e>>2]=0;f=bk(b|0,148464)|0;g=f+1|0;h=ut(g)|0;if((h|0)==0){j=0;i=d;return j|0}uF(h|0,b|0,f|0);a[h+f|0]=0;if(f>>>0<(uA(b|0)|0)>>>0){f=b+g|0;ca(f|0,21e4,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}f=c[10030]|0;if(a[4304]|0){cf(f|0,90232,(v=i,i=i+8|0,c[v>>2]=h,v)|0);g=c[e>>2]|0;if((g|0)!=0){k=c[10030]|0;cf(k|0,90144,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}g=c[10030]|0;aI(90072,5,1,g|0)}else{cf(f|0,90024,(v=i,i=i+8|0,c[v>>2]=h,v)|0);f=c[e>>2]|0;if((f|0)!=0){g=c[10030]|0;cf(g|0,90008,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}f=c[10030]|0;aI(89968,2,1,f|0)}uu(h);j=1;i=d;return j|0}}while(0);e=c[10030]|0;if(a[4304]|0){aI(90408,13,1,e|0);j=1;i=d;return j|0}else{aI(90384,20,1,e|0);j=1;i=d;return j|0}return 0}function q$(){var b=0;b=i;a[45024]=0;c[58300]=0;c[58302]=0;cf(c[10030]|0,90952,(v=i,i=i+8|0,h[v>>3]=.24089999999999998,v)|0);q9(-1);g[58284]=0.0;i=b;return}function q0(){var b=0,d=0,e=0,f=0;b=i;s7(2,0.0,0.0,0.0,0.0);if((a[233336]&1)!=0){d=c[10030]|0;e=c[58302]|0;f=c[58300]|0;cf(d|0,99e3,(v=i,i=i+24|0,c[v>>2]=e,c[v+8>>2]=f,c[v+16>>2]=100896,v)|0)}a[233336]=0;aI(99040,14,1,c[10030]|0);c[58300]=0;c[58302]=0;a[233344]=0;i=b;return}function q1(){var b=0,d=0,e=0;b=i;if(!(a[35312]|0)){c[(c[3524]|0)+8>>2]=1500;c[(c[3524]|0)+12>>2]=900}d=c[3524]|0;e=~~(+g[38]*+((c[d+12>>2]|0)>>>0>>>0));cf(c[10030]|0,91320,(v=i,i=i+16|0,c[v>>2]=~~(+g[178]*+((c[d+8>>2]|0)>>>0>>>0)),c[v+8>>2]=e,v)|0);if((aY(233408,91216)|0)==0){i=b;return}e=c[58350]|0;cf(c[10030]|0,91112,(v=i,i=i+16|0,c[v>>2]=233408,c[v+8>>2]=e,v)|0);i=b;return}function q2(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((a[233336]&1)!=0){f=c[10030]|0;g=c[58302]|0;h=c[58300]|0;cf(f|0,99e3,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=h,c[v+16>>2]=100896,v)|0)}a[233336]=0;c[58302]=b;c[58300]=d;a[233344]=0;i=e;return}function q3(b,d){b=b|0;d=d|0;var e=0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0;e=i;f=+g[58366];if(f==0.0){j=c[58302]|0;k=c[58300]|0;if(!(a[45024]|0)){s6(j,b,k,d);c[58302]=b;c[58300]=d;i=e;return}if(!(a[233344]|0)){l=c[10030]|0;cf(l|0,100208,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=k,v)|0)}if(!((j|0)==(b|0)&(k|0)==(d|0))){k=c[10030]|0;cf(k|0,100168,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0)}c[58302]=b;c[58300]=d;a[233344]=1;c[58302]=b;c[58300]=d;i=e;return}k=c[58302]|0;j=c[58300]|0;l=a[233344]|0;if(!l){g[58370]=1.0}m=(k|0)==(b|0);do{if(m&(j|0)==(d|0)){if(l){break}n=c[10030]|0;cf(n|0,100920,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=100896,v)|0)}else{o=f/.24089999999999998;do{if(m){if((d-j|0)>0){p=o;q=0.0;break}p=-0.0-o;q=0.0}else{r=(+(d|0)- +(j|0))/(+(b|0)- +(k|0));s=+(b-k>>31|1|0)*(o/+Q(+(r*r+1.0)));p=r*s;q=s}}while(0);o=1.0- +g[58370];s=+(k|0)+q*o;r=+(d|0);t=+(b|0);do{if(q*(t-s)<0.0){u=-1.0;w=-1.0}else{x=+(j|0)+p*o;y=s;z=-1.0;A=-1.0;n=0;while(1){if(p*(r-x)<0.0){B=z;C=A;D=n;break}E=n+1|0;F=q+y;if(q*(t-F)<0.0){B=y;C=x;D=E;break}else{A=x;x=p+x;z=y;y=F;n=E}}if((D|0)==1){n=c[10030]|0;y=B;z=C;cf(n|0,91472,(v=i,i=i+24|0,h[v>>3]=y,h[v+8>>3]=z,c[v+16>>2]=100896,v)|0);u=C;w=B;break}if((D|0)<=0){u=C;w=B;break}cf(c[10030]|0,91432,(v=i,i=i+48|0,c[v>>2]=k,c[v+8>>2]=j,h[v+16>>3]=q,h[v+24>>3]=p,c[v+32>>2]=D,c[v+40>>2]=100896,v)|0);u=C;w=B}}while(0);if(q!=0.0){if(w<0.0){n=b-k|0;if(q<0.0){G=-0.0-q}else{G=q}g[58370]=+(((n|0)>-1?n:-n|0)|0)/G+ +g[58370];break}s=t-w;if(s<0.0){H=-0.0-s}else{H=s}if(q<0.0){I=-0.0-q}else{I=q}g[58370]=H/I;break}else{if(u<0.0){n=d-j|0;if(p<0.0){J=-0.0-p}else{J=p}g[58370]=+(((n|0)>-1?n:-n|0)|0)/J+ +g[58370];break}s=r-u;if(s<0.0){K=-0.0-s}else{K=s}if(p<0.0){L=-0.0-p}else{L=p}g[58370]=K/L;break}}}while(0);a[233336]=+g[58370]>0.0&1;a[233344]=1;c[58302]=b;c[58300]=d;i=e;return}function q4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=1e3-d|0;if(a[4304]|0){d=c[10030]|0;h=c[4344+(c[1094]<<2)>>2]|0;cf(d|0,89728,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=g,c[v+16>>2]=e,c[v+24>>2]=h,c[v+32>>2]=4384,v)|0);i=f;return}else{j=0;k=0}while(1){h=a[e+k|0]|0;if((h<<24>>24|0)==0){break}else if((h<<24>>24|0)==91|(h<<24>>24|0)==93){l=j+1|0}else{l=j}j=l+1|0;k=k+1|0}k=j+1|0;j=ut(k)|0;do{if((j|0)==0){gk();l=ut(k)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=89696,v)|0)}else{m=j}}while(0);j=0;k=0;while(1){l=e+k|0;h=a[l]|0;if((h<<24>>24|0)==0){break}else if((h<<24>>24|0)==91|(h<<24>>24|0)==93){a[m+j|0]=92;n=j+1|0;o=a[l]|0}else{n=j;o=h}a[m+n|0]=o;j=n+1|0;k=k+1|0}a[m+j|0]=0;j=c[4344+(c[1094]<<2)>>2]|0;cf(c[10030]|0,89472,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=g,c[v+16>>2]=m,c[v+24>>2]=j,c[v+32>>2]=4384,v)|0);uu(m);i=f;return}function q5(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0;b=i;i=i+40|0;d=b|0;e=b+24|0;f=b+32|0;a[35312]=0;j=c[13898]|0;L24745:do{if((j|0)<(c[8272]|0)){k=d|0;l=d+8|0;m=j;while(1){n=c[1054]|0;o=(a[n+(m*40&-1)|0]&1)==0;L24749:do{if(!o){p=c[n+(m*40&-1)+36>>2]|0;q=n+(m*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break L24749}}if((s|0)==1){break L24745}}}while(0);q=c[58320]|0;L24756:do{if((q|0)==0){t=233280}else{r=c[n+(m*40&-1)+36>>2]|0;p=c[n+(m*40&-1)+32>>2]|0;u=(r|0)>0;x=c[10036]|0;y=233280;z=q;while(1){L24760:do{if(!o){if(u){A=0;B=0;C=p;while(1){D=a[z+A|0]|0;if(D<<24>>24==(a[x+(A+C|0)|0]|0)){E=C;F=B}else{if(D<<24>>24!=36){break L24760}E=C-1|0;F=1}G=A+1|0;if((G|0)<(F+r|0)){A=G;B=F;C=E}else{break}}if((F|0)==0){H=G}else{t=y;break L24756}}else{H=0}C=a[z+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){t=y;break L24756}}}while(0);C=y+8|0;B=c[C>>2]|0;if((B|0)==0){t=C;break}else{y=C;z=B}}}}while(0);o=c[t+4>>2]|0;if((o|0)==5){a[35288]=0;c[13898]=m+1}else if((o|0)==2){c[58352]=6516580;c[13898]=m+1}else if((o|0)==4){a[35288]=1;c[13898]=m+1}else if((o|0)==1){c[58352]=7499107;c[13898]=m+1}else if((o|0)==0){a[233408]=a[90944]|0;a[233409|0]=a[90945|0]|0;a[233410|0]=a[90946|0]|0;a[233411|0]=a[90947|0]|0;a[233412|0]=a[90948|0]|0;c[13898]=m+1}else if((o|0)==3){g[e>>2]=5.0;g[f>>2]=3.0;c[13898]=m+1;a[35312]=1;c[8826]=s4(e,f,1)|0;c[(c[3524]|0)+8>>2]=~~(+g[e>>2]*300.0/72.0);c[(c[3524]|0)+12>>2]=~~(+g[f>>2]*300.0/72.0)}else{o=is(d)|0;q=c[o>>2]|0;if((q|0)==3){I=+uz(c[o+8>>2]|0,0)}else if((q|0)==1){I=+(c[o+8>>2]|0)}else if((q|0)==2){I=+h[o+8>>3]}else{break}if((c[k>>2]|0)==3){uu(c[l>>2]|0);c[k>>2]=1}c[58350]=~~I}m=c[13898]|0;if((m|0)>=(c[8272]|0)){break L24745}}uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[(c[3524]|0)+16>>2]=((c[58350]|0)*300&-1|0)/72&-1;c[(c[3524]|0)+20>>2]=((c[58350]|0)*300&-1|0)/144&-1;if((aY(233408,91216)|0)==0){uF(13048,90848,1024)}else{d=(a[233410]|0)==116?90800:90792;f=c[58350]|0;be(13048,90816,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=f,v)|0)}do{if(a[35312]|0){f=(c[8826]|0)==2;d=13048+(uA(13048)|0)|0;e=c[3524]|0;I=+((c[e+8>>2]|0)>>>0>>>0);if(f){J=I*2.54/300.0;K=+((c[e+12>>2]|0)>>>0>>>0)*2.54/300.0;be(d|0,90672,(v=i,i=i+16|0,h[v>>3]=J,h[v+8>>3]=K,v)|0);break}else{K=I/300.0;I=+((c[e+12>>2]|0)>>>0>>>0)/300.0;be(d|0,90632,(v=i,i=i+16|0,h[v>>3]=K,h[v+8>>3]=I,v)|0);break}}}while(0);d=a[35288]|0;e=13048+(uA(13048)|0)|0;if(d){d=e;f=d|0;w=1953460768;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;f=d+4|0;w=6648929;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;i=b;return}else{uD(e|0,90568,10);i=b;return}}function q6(a){a=a|0;c[8830]=a;return 1}function q7(a){a=a|0;c[8824]=a;return 1}function q8(){a[45024]=0;c[58300]=0;c[58302]=0;return}function q9(b){b=b|0;var d=0,e=0,f=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;d=i;if((b|0)>5){e=(b|0)%6&-1}else{e=b}if(!(a[45024]|0)){s7(2,0.0,0.0,0.0,0.0)}if((a[233336]&1)!=0){b=c[10030]|0;f=c[58302]|0;j=c[58300]|0;cf(b|0,99e3,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=j,c[v+16>>2]=100896,v)|0)}a[233336]=0;j=(e|0)>-1;if(j){k=+g[233352+(e<<3)>>2]}else{k=.4000000059604645}do{if(k!=+g[58284]){f=c[10030]|0;l=k*-.5;m=k;cf(f|0,91544,(v=i,i=i+24|0,h[v>>3]=l,h[v+8>>3]=m,h[v+16>>3]=m,v)|0);if(!(a[45024]|0)){n=m;break}f=c[10030]|0;cf(f|0,91496,(v=i,i=i+8|0,h[v>>3]=m,v)|0);n=m}else{n=k}}while(0);g[58284]=k;g[58368]=n/.24089999999999998;if(!j){o=0.0;g[58366]=o;a[233344]=0;i=d;return}o=+g[233356+(e<<3)>>2];g[58366]=o;a[233344]=0;i=d;return}function ra(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=a[e]|0;if(g<<24>>24==0){i=f;return}if(a[35288]|0){h=0}else{j=0;k=g;while(1){g=j+1|0;if(k<<24>>24==92){l=j+2|0;m=(a[e+g|0]|0)==92}else{l=g;m=0}g=a[e+l|0]|0;if(g<<24>>24==0|m){h=m;break}else{j=l;k=g}}}cf(c[10030]|0,99752,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=c[8830]|0;if(a[35288]&(d|0)!=0){b=c[10030]|0;cf(b|0,91600,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}d=a[e]|0;do{if((d<<24>>24|0)==123|(d<<24>>24|0)==91){b=c[10030]|0;cf(b|0,99720,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}else{b=c[10030]|0;k=c[233184+(c[8824]<<2)>>2]|0;if(h){cf(b|0,99536,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=e,v)|0);break}else{cf(b|0,99696,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=e,v)|0);break}}}while(0);if(!(a[35288]&(c[8830]|0)!=0)){i=f;return}aF(125,c[10030]|0);i=f;return}function rb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if((a[233336]&1)!=0){g=c[10030]|0;h=c[58302]|0;j=c[58300]|0;cf(g|0,99e3,(v=i,i=i+24|0,c[v>>2]=h,c[v+8>>2]=j,c[v+16>>2]=100896,v)|0)}a[233336]=0;c[58302]=b;c[58300]=d;a[233344]=0;if((e|0)<0){k=92632}else{k=c[233216+(((e|0)%15&-1)<<2)>>2]|0}cf(c[10030]|0,99e3,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=k,v)|0);i=f;return}function rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;s5(a,b,d,e,1,f);c[58302]=d;c[58300]=e;return}function rd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0;g=i;j=a&15;do{if((j|0)==1){if((a>>4|0)>=50){break}i=g;return}else if((j|0)==0){i=g;return}else if((j|0)==2){if((a&16|0)!=0){break}i=g;return}}while(0);cf(c[10030]|0,92704,(v=i,i=i+32|0,c[v>>2]=b,c[v+8>>2]=d,h[v+16>>3]=+(e>>>0>>>0)*.24089999999999998,h[v+24>>3]=+(f>>>0>>>0)*.24089999999999998,v)|0);i=g;return}function re(){var b=0;b=i;a[45024]=1;c[58300]=0;c[58302]=0;cf(c[10030]|0,92776,(v=i,i=i+8|0,h[v>>3]=.24089999999999998,v)|0);q9(-1);i=b;return}function rf(){aI(99040,14,1,c[10030]|0);return}function rg(){var b=0,d=0,e=0;b=i;d=c[c[7118]>>2]|0;do{if((d|0)==1){e=c[10030]|0;aI(93200,35,1,e|0)}else if((d|0)==0){aI(93096,39,1,c[10030]|0)}else if((d|0)==2){pD();e=c[10030]|0;if((e|0)==0){break}cf(e|0,93272,(v=i,i=i+8|0,c[v>>2]=c[7112],v)|0);if((a[(c[7118]|0)+113|0]&1)==0){break}aI(93240,15,1,c[10030]|0)}}while(0);d=c[7112]|0;if((d|0)!=0){uu(d);c[7112]=0}d=c[10028]|0;if((d|0)==0|(d|0)==(c[10030]|0)){i=b;return}az(d|0);c[10028]=0;i=b;return}function rh(b){b=b|0;var d=0,e=0,f=0,g=0,j=0;d=i;i=i+16|0;e=d|0;f=e;c[f>>2]=c[59458];c[f+4>>2]=c[59459];c[f+8>>2]=c[59460];c[f+12>>2]=c[59461];c[e+4>>2]=b;f=c[7118]|0;do{if((c[f>>2]|0)==2){if((a[f+112|0]&1)==0){g=18637;break}j=(b|0)%4&-1}else{g=18637}}while(0);if((g|0)==18637){j=(b|0)%9&-1}b=j+3|0;j=(b|0)<0?0:b;if((c[57432]|0)==(j|0)){rj(e);i=d;return}a[228944]=0;if((c[7116]|0)!=0){b=c[10028]|0;aI(215952,7,1,b|0);c[7116]=0;a[228944]=0}c[57432]=j;h[28714]=+h[28715];cf(c[10028]|0,202624,(v=i,i=i+8|0,c[v>>2]=a[j+93672|0]|0,v)|0);c[7116]=0;rj(e);i=d;return}function ri(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[10030]|0;if((g|0)==0){i=f;return}if(a[5688]|0){h=g}else{aK(5624,g|0);a[5688]=1;h=c[10030]|0}cf(h|0,93440,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=c[7230]|0;if((d|0)!=0){b=c[10030]|0;cf(b|0,93424,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}d=a[e]|0;do{if((d<<24>>24|0)==123|(d<<24>>24|0)==91){b=c[10030]|0;cf(b|0,94528,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}else{b=c[7198]|0;if((b|0)==2){h=c[10030]|0;cf(h|0,94296,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else if((b|0)==0){cf(c[10030]|0,94496,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else if((b|0)==1){cf(c[10030]|0,94392,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else{break}}}while(0);if((c[7230]|0)!=0){e=c[10030]|0;aF(125,e|0)}aI(94160,3,1,c[10030]|0);i=f;return}function rj(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0;d=i;i=i+24|0;e=d|0;f=b;if((uG(5608,f|0,16)|0)==0){i=d;return}c[1402]=c[f>>2];c[1403]=c[f+4>>2];c[1404]=c[f+8>>2];c[1405]=c[f+12>>2];f=b|0;do{if((c[f>>2]|0)==1){g=c[7118]|0;if((a[g+17|0]&1)!=0){j=18673;break}k=c[b+4>>2]|0;do{if((c[g>>2]|0)==2){if((a[g+112|0]&1)==0){j=18668;break}l=(k|0)%4&-1}else{j=18668}}while(0);if((j|0)==18668){l=(k|0)%9&-1}g=l+3|0;m=(g|0)<0?0:g;if((c[57432]|0)==(m|0)){break}a[228944]=0;if((c[7116]|0)!=0){g=c[10028]|0;aI(215952,7,1,g|0);c[7116]=0;a[228944]=0}c[57432]=m;h[28714]=+h[28715];g=c[10028]|0;n=a[m+93672|0]|0;cf(g|0,202624,(v=i,i=i+8|0,c[v>>2]=n,v)|0);c[7116]=0}else{j=18673}}while(0);if((j|0)==18673){pS(b)}a[5688]=0;j=c[f>>2]|0;if((j|0)==3){l=c[b+4>>2]|0;o=+(l>>>16&255|0)/255.0;p=+(l>>>8&255|0)/255.0;q=+(l&255|0)/255.0;be(5624,93720,(v=i,i=i+24|0,h[v>>3]=o,h[v+8>>3]=p,h[v+16>>3]=q,v)|0);r=c[f>>2]|0}else{r=j}if((r|0)==1){j=c[b+4>>2]|0;if((a[(c[7118]|0)+112|0]&1)==0){s=(j|0)%9&-1}else{s=(j|0)%4&-1}j=a[93672+(s+3|0)|0]|0;be(5624,93688,(v=i,i=i+8|0,c[v>>2]=j,v)|0);t=c[f>>2]|0}else{t=r}if((t|0)!=5){i=d;return}q=+h[b+8>>3];if((a[(c[7118]|0)+18|0]&1)==0){fq(q,e);p=+h[e>>3];o=+h[e+8>>3];u=+h[e+16>>3];be(5624,93720,(v=i,i=i+24|0,h[v>>3]=p,h[v+8>>3]=o,h[v+16>>3]=u,v)|0);i=d;return}if(q<=0.0){be(5624,93592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}if(q<1.0){u=+(~~(q*1.0e4+.5)|0)*1.0e-4;be(25336,141840,(v=i,i=i+8|0,h[v>>3]=u,v)|0);e=(a[25336]|0)==48&(a[25337]|0)==46?25337:25336;be(5624,93464,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=d;return}else{be(5624,93528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}}function rk(b){b=b|0;var d=0,e=0;d=i;do{if((b|0)==0){c[10882]=0}else if((b|0)==2){e=c[10882]|0;if((e|0)==2){break}else if((e|0)==1){aI(94096,7,1,c[10030]|0)}c[10882]=2;aI(93984,35,1,c[10030]|0);a[5688]=0}else if((b|0)==12){e=c[10028]|0;if((e|0)==0|(e|0)==(c[10030]|0)){break}cf(e|0,93800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b|0)==1){e=c[10882]|0;if((e|0)==1){break}else if((e|0)==2){aI(94096,7,1,c[10030]|0)}c[10882]=1;aI(94024,34,1,c[10030]|0);a[5688]=0}else if((b|0)==5){if(((c[10882]|0)-1|0)>>>0<2){e=c[10030]|0;aI(94096,7,1,e|0)}c[10882]=0}else if((b|0)==13){e=c[10028]|0;if((e|0)==0|(e|0)==(c[10030]|0)){break}cf(e|0,93784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);i=d;return}function rl(){var b=0,d=0,e=0.0,f=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;c[7116]=0;aI(199208,29,1,c[10028]|0);d=c[10028]|0;if((d|0)==(c[10030]|0)){aI(94992,6,1,d|0)}d=c[7118]|0;e=+g[d+88>>2];do{if(e!=0.0){if((c[d>>2]|0)!=1){break}f=c[10030]|0;j=e;cf(f|0,94888,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}}while(0);d=c[7036]|0;if((d|0)==0){i=b;return}else{k=d}do{d=c[k+4>>2]|0;cf(c[10030]|0,94840,(v=i,i=i+16|0,c[v>>2]=c[k>>2],c[v+8>>2]=d,v)|0);d=c[7118]|0;do{if((a[d+97|0]&1)==0){l=d}else{f=c[k+8>>2]|0;if((f|0)==0){l=d;break}m=c[10030]|0;n=360-f|0;cf(m|0,94696,(v=i,i=i+8|0,c[v>>2]=n,v)|0);l=c[7118]|0}}while(0);d=(c[l>>2]|0)==1;do{if(d){n=c[k+16>>2]|0;m=a[n]|0;if(!((m<<24>>24|0)==123|(m<<24>>24|0)==91)){o=18724;break}m=c[10030]|0;cf(m|0,94528,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}else{o=18724}}while(0);do{if((o|0)==18724){o=0;n=c[k+12>>2]|0;if((n|0)==0){m=c[10030]|0;f=d?94496:94424;p=c[k+16>>2]|0;cf(m|0,f|0,(v=i,i=i+8|0,c[v>>2]=p,v)|0);break}else if((n|0)==2){cf(c[10030]|0,(d?94296:94272)|0,(v=i,i=i+8|0,c[v>>2]=c[k+16>>2],v)|0);break}else if((n|0)==1){cf(c[10030]|0,(d?94392:94328)|0,(v=i,i=i+8|0,c[v>>2]=c[k+16>>2],v)|0);break}else{break}}}while(0);do{if((a[(c[7118]|0)+97|0]&1)!=0){if((c[k+8>>2]|0)==0){break}d=c[10030]|0;aI(94208,50,1,d|0)}}while(0);aI(94160,3,1,c[10030]|0);k=c[k+20>>2]|0;}while((k|0)!=0);k=c[7036]|0;if((k|0)==0){i=b;return}else{q=k}while(1){k=c[q+20>>2]|0;uu(c[q+16>>2]|0);uu(c[7036]|0);c[7036]=k;if((k|0)==0){break}else{q=k}}i=b;return}function rm(){var b=0;b=i;c[59762]=0;c[59764]=0;c[59760]=0;c[59828]=0;a[239320]=0;c[11600]=0;cf(c[10030]|0,95608,(v=i,i=i+8|0,h[v>>3]=.12,v)|0);i=b;return}function rn(){var b=0;if(a[239320]|0){b=c[10030]|0;aF(10,b|0);a[239320]=0}c[59762]=0;c[59764]=0;return}function ro(){var b=0;if(a[239320]|0){b=c[10030]|0;aF(10,b|0);a[239320]=0}aI(99040,14,1,c[10030]|0);return}function rp(){var b=0,d=0,e=0.0,f=0.0,j=0,k=0.0;b=i;d=c[3524]|0;e=+((c[d+8>>2]|0)>>>0>>>0);f=+((c[d+12>>2]|0)>>>0>>>0);j=~~(f*+g[38]);k=+g[184];cf(c[10030]|0,95784,(v=i,i=i+32|0,c[v>>2]=~~(e*+g[178]),c[v+8>>2]=j,c[v+16>>2]=~~(e*k),c[v+24>>2]=~~(f*k),v)|0);if(a[46352]|0){k=+((c[d+16>>2]|0)>>>0>>>0)*.12+.5;d=c[10030]|0;j=~~k;f=k*1.2;cf(d|0,95712,(v=i,i=i+16|0,c[v>>2]=j,h[v+8>>3]=f,v)|0);i=b;return}else{j=c[10030]|0;aI(95688,14,1,j|0);i=b;return}}function rq(b,d){b=b|0;d=d|0;var e=0;if(a[239320]|0){e=c[10030]|0;aF(10,e|0);a[239320]=0}c[59764]=b;c[59762]=d;return}function rr(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if(a[239320]|0){f=c[59828]|0;c[59828]=f+1;if((f|0)<=49){break}f=c[10030]|0;g=c[239216+(c[11584]<<5)+((c[59760]|0)+2<<2)>>2]|0;h=c[59764]|0;j=c[59762]|0;cf(f|0,96248,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=h,c[v+16>>2]=j,v)|0);c[59828]=1}else{a[239320]=1;j=c[10030]|0;h=c[239216+(c[11584]<<5)+((c[59760]|0)+2<<2)>>2]|0;g=c[59764]|0;f=c[59762]|0;cf(j|0,96272,(v=i,i=i+24|0,c[v>>2]=h,c[v+8>>2]=g,c[v+16>>2]=f,v)|0);c[59828]=1}}while(0);cf(c[10030]|0,96200,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);c[59764]=b;c[59762]=d;i=e;return}function rs(b){b=b|0;var d=0,e=0;if(a[239320]|0){d=c[10030]|0;aF(10,d|0);a[239320]=0}c[59760]=(b|0)%((c[46304+(c[11584]<<2)>>2]|0)-2|0)&-1;if(!(a[46392]|0)){return}c[11600]=b;if((b|0)<0){e=0}else{e=((b|0)%6&-1)+1|0}c[11600]=e;aK(c[46360+(e<<2)>>2]|0,c[10030]|0);return}function rt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((a[e]|0)==0){i=f;return}g=c[c[3524]>>2]|0;h=ut(24)|0;do{if((h|0)==0){gk();j=ut(24)|0;if((j|0)!=0|(g|0)==0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}else{k=h}}while(0);h=k;c[k>>2]=b;c[k+4>>2]=d;d=(uA(e|0)|0)+1|0;b=c[c[3524]>>2]|0;g=ut(d)|0;do{if((g|0)==0){gk();j=ut(d)|0;if((j|0)!=0|(b|0)==0){l=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=b,v)|0)}else{l=g}}while(0);c[k+16>>2]=l;uB(l|0,e|0);c[k+12>>2]=c[7198];c[k+8>>2]=c[7230];c[k+20>>2]=c[7036];c[7036]=h;i=f;return}function ru(){var b=0,e=0,f=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0;b=i;i=i+24|0;e=b|0;a[46288]=0;a[46392]=0;c[11584]=0;c[11574]=0;f=c[13898]|0;j=c[8272]|0;L25079:do{if((f|0)<(j|0)){k=0.0;l=1;m=f;n=j;L25080:while(1){o=c[1054]|0;p=(a[o+(m*40&-1)|0]&1)==0;q=c[o+(m*40&-1)+36>>2]|0;r=o+(m*40&-1)+32|0;L25082:do{if(p){s=c[r>>2]|0;t=18835}else{o=c[10036]|0;u=0;while(1){if((u|0)>=(q|0)){t=18785;break}if((a[o+((c[r>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break}}if((t|0)==18785){t=0;if((u|0)==1){w=k;x=l;break L25079}}o=c[r>>2]|0;if(!((q|0)>0&(p^1))){s=o;t=18835;break}y=c[10036]|0;z=0;A=0;B=o;while(1){if((a[z+184456|0]|0)==(a[y+(z+B|0)|0]|0)){C=B;D=A}else{if((z|0)!=3){break}C=B-1|0;D=1}E=z+1|0;if((E|0)<(D+q|0)){z=E;A=D;B=C}else{t=18792;break}}do{if((t|0)==18792){t=0;if((D|0)==0){if(!((z|0)==2|(z|0)==7)){break}}a[46352]=0;a[46392]=0;a[46288]=0;c[11584]=0;c[11574]=0;c[(c[3524]|0)+8>>2]=3e3;c[(c[3524]|0)+12>>2]=1800;a[239208]=0;c[13898]=(c[13898]|0)+1;F=1;G=k;break L25082}}while(0);if(p){s=o;t=18835;break}L25105:do{if((q|0)>0){z=c[10036]|0;B=0;A=0;y=o;while(1){if((a[B+115600|0]|0)==(a[z+(B+y|0)|0]|0)){H=y;I=A}else{if((B|0)!=1){t=18804;break L25105}H=y-1|0;I=1}u=B+1|0;if((u|0)<(I+q|0)){B=u;A=I;y=H}else{break}}if((I|0)!=0){break}if(!((B|0)==0|(B|0)==5)){t=18804}}else{t=18804}}while(0);do{if((t|0)==18804){t=0;if(!((q|0)>0&(p^1))){s=o;t=18835;break L25082}y=c[10036]|0;A=0;z=0;u=o;while(1){if((a[A+115536|0]|0)==(a[y+(A+u|0)|0]|0)){J=u;K=z}else{if((A|0)!=1){break}J=u-1|0;K=1}E=A+1|0;if((E|0)<(K+q|0)){A=E;z=K;u=J}else{t=18810;break}}if((t|0)==18810){t=0;if((K|0)!=0){break}if((A|0)==0|(A|0)==6){break}}if(p){s=o;t=18835;break L25082}L25129:do{if((q|0)>0){u=c[10036]|0;z=0;y=0;B=o;while(1){if((a[z+95544|0]|0)==(a[u+(z+B|0)|0]|0)){L=B;M=y}else{if((z|0)!=1){break L25129}L=B-1|0;M=1}E=z+1|0;if((E|0)<(M+q|0)){z=E;y=M;B=L}else{break}}if((M|0)==0){if(!((z|0)==0|(z|0)==6)){break}}a[46288]=1;c[13898]=m+1;F=l;G=k;break L25082}}while(0);if(!((q|0)>0&(p^1))){s=o;t=18835;break L25082}A=c[10036]|0;B=0;y=0;u=o;while(1){if((a[B+129104|0]|0)==(a[A+(B+u|0)|0]|0)){N=u;O=y}else{if((B|0)!=2){s=o;t=18835;break L25082}N=u-1|0;O=1}E=B+1|0;if((E|0)<(O+q|0)){B=E;y=O;u=N}else{break}}if((O|0)==0){if(!((B|0)==1|(B|0)==6)){s=o;t=18835;break L25082}}if(!(a[46392]|0)){c[11584]=1}c[13898]=m+1;F=l;G=k;break L25082}}while(0);a[46392]=1;c[11584]=2;c[13898]=m+1;F=l;G=k}}while(0);L25157:do{if((t|0)==18835){t=0;L25159:do{if((n|0)>(m|0)){if(p){break}r=c[10036]|0;o=0;while(1){if((o|0)>=(q|0)){break}if((a[r+(s+o|0)|0]|0)==(a[o+130496|0]|0)){o=o+1|0}else{t=18842;break L25159}}if((o|0)!=4){t=18842;break}c[13898]=m+1;r=s4(46280,46272,1)|0;c[(c[3524]|0)+8>>2]=~~(+g[11570]/.12);c[(c[3524]|0)+12>>2]=~~(+g[11568]/.12);a[239208]=1;F=r;G=k;break L25157}else{t=18842}}while(0);L25167:do{if((t|0)==18842){t=0;if(!((q|0)>0&(p^1))){break}r=c[10036]|0;B=0;u=0;y=s;while(1){if((a[B+95520|0]|0)==(a[r+(B+y|0)|0]|0)){P=y;Q=u}else{if((B|0)!=1){break}P=y-1|0;Q=1}A=B+1|0;if((A|0)<(Q+q|0)){B=A;u=Q;y=P}else{t=18848;break}}do{if((t|0)==18848){t=0;if((Q|0)==0){if(!((B|0)==0|(B|0)==5)){break}}c[11574]=1;c[13898]=m+1;F=l;G=k;break L25157}}while(0);if(!((q|0)>0&(p^1))){break}B=c[10036]|0;y=0;u=0;r=s;while(1){if((a[y+95512|0]|0)==(a[B+(y+r|0)|0]|0)){R=r;S=u}else{if((y|0)!=1){break L25167}R=r-1|0;S=1}o=y+1|0;if((o|0)<(S+q|0)){y=o;u=S;r=R}else{break}}if((S|0)==0){if(!((y|0)==0|(y|0)==4)){break}}c[11574]=2;c[13898]=m+1;F=l;G=k;break L25157}}while(0);if(((d[(c[10036]|0)+s|0]|0)-48|0)>>>0>=10){t=18869;break L25080}r=is(e)|0;u=c[r>>2]|0;if((u|0)==3){T=+uz(c[r+8>>2]|0,0)}else if((u|0)==1){T=+(c[r+8>>2]|0)}else if((u|0)==2){T=+h[r+8>>3]}else{t=18865;break L25080}U=T;if(U<1.0|U>100.0){t=18867;break L25080}a[46352]=1;V=U/.12;c[(c[3524]|0)+16>>2]=~~V;c[(c[3524]|0)+20>>2]=~~(V*.5);F=l;G=U}}while(0);q=c[13898]|0;p=c[8272]|0;if((q|0)<(p|0)){k=G;l=F;m=q;n=p}else{w=G;x=F;break L25079}}if((t|0)==18869){uf(m,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==18865){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==18867){uf(c[13898]|0,95472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{w=0.0;x=1}}while(0);t=(c[11584]|0)==1?95248:179864;F=a[46288]|0?95224:179864;e=c[11574]|0;if((e|0)==1){W=95216}else{W=(e|0)==2?95152:179864}be(13048,95392,(v=i,i=i+32|0,c[v>>2]=a[46392]|0?95304:179864,c[v+8>>2]=t,c[v+16>>2]=F,c[v+24>>2]=W,v)|0);if(a[46352]|0){W=13048+(uA(13048)|0)|0;F=~~w;be(W|0,95144,(v=i,i=i+8|0,c[v>>2]=F,v)|0)}if(!(a[239208]|0)){i=b;return}F=13048+(uA(13048)|0)|0;W=c[3524]|0;w=+((c[W+8>>2]|0)>>>0>>>0);if((x|0)==2){G=w*2.54/600.0;T=+((c[W+12>>2]|0)>>>0>>>0)*2.54/600.0;be(F|0,95024,(v=i,i=i+16|0,h[v>>3]=G,h[v+8>>3]=T,v)|0);i=b;return}else{T=w/600.0;w=+((c[W+12>>2]|0)>>>0>>>0)/600.0;be(F|0,95e3,(v=i,i=i+16|0,h[v>>3]=T,h[v+8>>3]=w,v)|0);i=b;return}}function rv(a){a=a|0;c[11586]=a;return 1}function rw(a){a=a|0;c[1044]=a;return 1}function rx(a){a=a|0;c[11602]=(a|0)!=0&1;return 1}function ry(a){a=a|0;c[1050]=(a|0)!=0&1;return 1}function rz(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=c[13898]|0;if((b|0)>=(c[8272]|0)){return}d=c[1054]|0;e=(a[d+(b*40&-1)|0]&1)==0;if(e){return}f=c[d+(b*40&-1)+36>>2]|0;g=d+(b*40&-1)+32|0;d=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){i=18891;break}if((a[d+((c[g>>2]|0)+h|0)|0]|0)==(a[h+103664|0]|0)){h=h+1|0}else{break}}do{if((i|0)==18891){if((h|0)!=1){break}return}}while(0);h=c[g>>2]|0;if(!((f|0)>0&(e^1))){return}g=c[10036]|0;d=0;j=0;k=h;while(1){if((a[d+101280|0]|0)==(a[g+(d+k|0)|0]|0)){l=k;m=j}else{if((d|0)!=2){break}l=k-1|0;m=1}n=d+1|0;if((n|0)<(m+f|0)){d=n;j=m;k=l}else{i=18898;break}}do{if((i|0)==18898){if((m|0)==0){if(!((d|0)==1|(d|0)==10)){break}}a[231056]=1;c[13898]=b+1;return}}while(0);if(!((f|0)>0&(e^1))){return}e=c[10036]|0;d=0;m=0;l=h;while(1){if((a[d+101232|0]|0)==(a[e+(d+l|0)|0]|0)){o=l;p=m}else{if((d|0)!=1){i=18918;break}o=l-1|0;p=1}h=d+1|0;if((h|0)<(p+f|0)){d=h;m=p;l=o}else{break}}if((i|0)==18918){return}do{if((p|0)==0){if((d|0)==0|(d|0)==4){break}return}}while(0);a[231048]=1;c[13898]=b+1;return}function rA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if(a[239320]|0){g=c[10030]|0;aF(10,g|0);a[239320]=0}cf(c[10030]|0,99752,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=a[e]|0;if((d<<24>>24|0)==123|(d<<24>>24|0)==91){d=c[10030]|0;cf(d|0,99720,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}d=c[11602]|0;if((d|0)==0){b=c[11586]|0;if((b|0)==0){g=c[10030]|0;aI(97304,18,1,g|0)}else if((b|0)==2){aI(97152,18,1,c[10030]|0)}else if((b|0)==1){aI(97240,15,1,c[10030]|0)}b=c[10030]|0;cf(b|0,97128,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}else if((d|0)==1){d=c[11586]|0;if(a[46288]|0){if((d|0)==1){b=c[10030]|0;aI(97024,43,1,b|0)}else if((d|0)==0){aI(97080,44,1,c[10030]|0)}else if((d|0)==2){aI(96952,44,1,c[10030]|0)}b=c[10030]|0;cf(b|0,96920,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}if((d|0)==1){b=c[10030]|0;aI(96824,30,1,b|0)}else if((d|0)==0){aI(96856,31,1,c[10030]|0)}else if((d|0)==2){aI(96720,31,1,c[10030]|0)}d=(uA(e|0)|0)-1|0;if((d|0)>0){b=0;do{cf(c[10030]|0,96672,(v=i,i=i+8|0,c[v>>2]=a[e+b|0]|0,v)|0);b=b+1|0;}while((b|0)<(d|0))}aF(a[e+d|0]|0|0,c[10030]|0);aI(96616,4,1,c[10030]|0);i=f;return}else{i=f;return}}function rB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(a[239320]|0){g=c[10030]|0;aF(10,g|0);a[239320]=0}c[59764]=b;c[59762]=d;if((e|0)<0){h=100128}else{g=c[11574]|0;h=c[239064+(g*48&-1)+(((e|0)%(c[46320+(g<<2)>>2]|0)&-1)<<2)>>2]|0}cf(c[10030]|0,99e3,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=h,v)|0);i=f;return}function rC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;s5(a,b,d,e,2,f);c[59764]=d;c[59762]=e;return}function rD(){var b=0,d=0,e=0,f=0,g=0.0;b=i;a[3280]=1;a[3648]=1;c[814]=0;c[816]=0;ts();c[916]=-1;d=a[3648]|0?39:-2;e=c[818]|0;f=c[914]|0;g=+h[523];cf(c[10030]|0,225816,(v=i,i=i+48|0,c[v>>2]=a[3280]|0?30:0,c[v+8>>2]=d,c[v+16>>2]=e,c[v+24>>2]=f,h[v+32>>3]=g,h[v+40>>3]=.001,v)|0);i=b;return}function rE(){ts();c[814]=0;c[816]=0;return}function rF(){ts();aI(99040,14,1,c[10030]|0);return}function rG(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[3524]|0;d=b+8|0;e=c[d>>2]|0;f=b+12|0;b=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=179864,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=0,c[v+32>>2]=0,c[v+40>>2]=179864,v)|0);b=(c[d>>2]|0)-876|0;e=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=b,c[v+16>>2]=e,c[v+24>>2]=876,c[v+32>>2]=0,c[v+40>>2]=99360,v)|0);e=(c[d>>2]|0)-215|0;b=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=0,c[v+32>>2]=0,c[v+40>>2]=99336,v)|0);b=(c[d>>2]|0)-1091|0;e=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=b,c[v+16>>2]=e,c[v+24>>2]=876,c[v+32>>2]=0,c[v+40>>2]=99288,v)|0);e=c[d>>2]|0;b=(c[f>>2]|0)-379|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=0,c[v+32>>2]=0,c[v+40>>2]=99272,v)|0);b=c[d>>2]|0;e=(c[f>>2]|0)-533|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=b,c[v+16>>2]=e,c[v+24>>2]=0,c[v+32>>2]=533,c[v+40>>2]=99176,v)|0);e=c[d>>2]|0;d=(c[f>>2]|0)-912|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=e,c[v+16>>2]=d,c[v+24>>2]=0,c[v+32>>2]=533,c[v+40>>2]=99120,v)|0);aI(99064,15,1,c[10030]|0);i=a;return}function rH(a,b){a=a|0;b=b|0;ts();c[816]=a;c[814]=b;return}function rI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if(a[4192]|0){f=c[918]|0;if((f|0)<=99){g=f;break}ts();a[4192]=1;f=c[3680+(((c[916]|0)+2|0)*12&-1)>>2]|0;if((f|0)==2){h=(c[914]|0)*3&-1}else if((f|0)==3){h=(c[914]|0)*5&-1}else if((f|0)==1){h=c[914]|0}else{h=1}f=c[10030]|0;cf(f|0,99928,(v=i,i=i+8|0,c[v>>2]=h,v)|0);f=c[814]|0;c[8030]=c[816];c[8031]=f;c[918]=1;g=1}else{a[4192]=1;f=c[3680+(((c[916]|0)+2|0)*12&-1)>>2]|0;if((f|0)==1){j=c[914]|0}else if((f|0)==3){j=(c[914]|0)*5&-1}else if((f|0)==2){j=(c[914]|0)*3&-1}else{j=1}f=c[10030]|0;cf(f|0,99928,(v=i,i=i+8|0,c[v>>2]=j,v)|0);f=c[814]|0;c[8030]=c[816];c[8031]=f;c[918]=1;g=1}}while(0);c[32120+(g<<3)>>2]=b;c[32124+(g<<3)>>2]=d;c[918]=g+1;c[816]=b;c[814]=d;i=e;return}function rJ(b){b=b|0;var d=0,e=0;ts();d=(b|0)<-2?-2:b;b=a[3648]|0?39:-2;if((d|0)<(b|0)){e=d;c[916]=e;return}e=(d|0)%(b|0)&-1;c[916]=e;return}function rK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;ts();cf(c[10030]|0,99752,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=a[e]|0;if((d<<24>>24|0)==123|(d<<24>>24|0)==91){d=c[10030]|0;cf(d|0,99720,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}d=c[1050]|0;if((d|0)==1){b=c[1044]|0;if((b|0)==0){g=99688}else if((b|0)==2){g=99616}else if((b|0)==1){g=104096}else{g=0}b=c[10030]|0;cf(b|0,99536,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=e,v)|0);i=f;return}else if((d|0)==0){d=c[1044]|0;if((d|0)==0){h=104096}else if((d|0)==1){h=179864}else if((d|0)==2){h=104088}else{h=0}cf(c[10030]|0,99696,(v=i,i=i+16|0,c[v>>2]=h,c[v+8>>2]=e,v)|0);i=f;return}else{i=f;return}}function rL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0;e=i;ts();c[816]=a;c[814]=b;cf(c[10030]|0,100152,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);if((d|0)<0){b=c[10030]|0;aI(100128,17,1,b|0);f=c[10030]|0;g=aI(100056,4,1,f|0)|0;i=e;return}b=(d|0)%30&-1;d=c[3288+(b*12&-1)>>2]|0;if((d|0)==3){a=c[914]|0;j=c[10030]|0;cf(j|0,99928,(v=i,i=i+8|0,c[v>>2]=a,v)|0);a=c[10030]|0;cf(a|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0)}else if((d|0)==2){cf(c[10030]|0,99928,(v=i,i=i+8|0,c[v>>2]=c[914],v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=.5,v)|0)}else if((d|0)==1){cf(c[10030]|0,99928,(v=i,i=i+8|0,c[v>>2]=c[914],v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else if((d|0)==0){cf(c[10030]|0,99928,(v=i,i=i+8|0,c[v>>2]=(c[914]|0)*3&-1,v)|0)}d=c[3292+(b*12&-1)>>2]|0;if((d|0)==3){k=~~(+(c[818]|0)*2.0)}else if((d|0)==2){k=~~(+(c[818]|0)*1.4142)}else if((d|0)==1){k=c[818]|0}else{k=0}cM[c[3296+(b*12&-1)>>2]&511](k);f=c[10030]|0;g=aI(100056,4,1,f|0)|0;i=e;return}function rM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;s5(a,b,d,e,1,f);c[816]=d;c[814]=e;return}function rN(){var b=0;g[57768]=0.0;g[57770]=0.0;if(a[231184]|0){b=c[10030]|0;aF(10,b|0);a[231184]=0}c[57766]=-1;cp(c[10030]|0,0,0);aI(101352,47,1,c[10030]|0);a[231136]=0;return}function rO(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;L25387:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L25389:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;j=f+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(g|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L25389}}if((l|0)==1){break L25387}}}while(0);f=is(d)|0;j=c[f>>2]|0;if((j|0)==1){m=+(c[f+8>>2]|0)}else if((j|0)==2){m=+h[f+8>>3]}else if((j|0)==3){m=+uz(c[f+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=~~m;if((f|0)<=0){break}c[818]=f}}while(0);e=c[13898]|0;L25404:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L25406:do{if((a[f+(e*40&-1)|0]&1)!=0){j=c[f+(e*40&-1)+36>>2]|0;k=f+(e*40&-1)+32|0;g=c[10036]|0;n=0;while(1){if((n|0)>=(j|0)){break}if((a[g+((c[k>>2]|0)+n|0)|0]|0)==(a[n+103664|0]|0)){n=n+1|0}else{break L25406}}if((n|0)==1){break L25404}}}while(0);f=is(d)|0;k=c[f>>2]|0;if((k|0)==2){o=+h[f+8>>3]}else if((k|0)==3){o=+uz(c[f+8>>2]|0,0)}else if((k|0)==1){o=+(c[f+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=~~o;if((f|0)<=0){break}c[914]=f}}while(0);e=c[13898]|0;L25421:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L25423:do{if((a[f+(e*40&-1)|0]&1)!=0){k=c[f+(e*40&-1)+36>>2]|0;g=f+(e*40&-1)+32|0;j=c[10036]|0;l=0;while(1){if((l|0)>=(k|0)){break}if((a[j+((c[g>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L25423}}if((l|0)==1){break L25421}}}while(0);f=is(d)|0;g=c[f>>2]|0;if((g|0)==3){p=+uz(c[f+8>>2]|0,0)}else if((g|0)==1){p=+(c[f+8>>2]|0)}else if((g|0)==2){p=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(p<=0.0){break}h[523]=p}}while(0);d=c[914]|0;p=+h[523];be(13048,99024,(v=i,i=i+24|0,c[v>>2]=c[818],c[v+8>>2]=d,h[v+16>>3]=p,v)|0);i=b;return}function rP(a){a=a|0;c[57794]=a;return 1}function rQ(a){a=a|0;c[56722]=a;return 1}function rR(a){a=a|0;c[56636]=a;return 1}function rS(a){a=a|0;c[58056]=(a|0)!=0&1;return 1}function rT(a,b){a=a|0;b=b|0;c[58246]=a;c[58244]=b;c[58254]=0;h[29126]=+(c[232736+((c[58242]|0)*24&-1)>>2]|0);return}function rU(){var b=0;if(a[231184]|0){b=c[10030]|0;aF(10,b|0);a[231184]=0}g[57768]=0.0;g[57770]=0.0;return}function rV(){var b=0;if(a[231184]|0){b=c[10030]|0;aF(10,b|0);a[231184]=0}aI(101400,32,1,c[10030]|0);return}function rW(){var b=0,d=0,e=0.0,f=0.0,j=0.0,k=0.0;b=i;aI(103264,160,1,c[10030]|0);aI(102784,449,1,c[10030]|0);aI(102488,280,1,c[10030]|0);aI(101736,747,1,c[10030]|0);aI(101616,83,1,c[10030]|0);if(!(a[231048]|0)){d=c[10030]|0;aI(101512,43,1,d|0)}e=+g[184];f=+g[44];j=e+ +g[178];k=f+ +g[38];cf(c[10030]|0,101448,(v=i,i=i+32|0,h[v>>3]=e,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=k,v)|0);i=b;return}function rX(b,d){b=b|0;d=d|0;var e=0;if(a[231184]|0){e=c[10030]|0;aF(10,e|0);a[231184]=0}g[57770]=+(b>>>0>>>0)/1.0e4;g[57768]=+(d>>>0>>>0)/1.0e4;return}function rY(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0.0,l=0.0;e=i;do{if(a[231184]|0){f=c[57792]|0;c[57792]=f+1;if((f|0)<=99){break}f=c[10030]|0;j=c[231144+((c[57766]|0)+2<<2)>>2]|0;k=+g[57770];l=+g[57768];cf(f|0,104992,(v=i,i=i+24|0,c[v>>2]=j,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);c[57792]=1}else{a[231184]=1;j=c[10030]|0;f=c[231144+((c[57766]|0)+2<<2)>>2]|0;l=+g[57770];k=+g[57768];cf(j|0,104992,(v=i,i=i+24|0,c[v>>2]=f,h[v+8>>3]=l,h[v+16>>3]=k,v)|0);c[57792]=1}}while(0);k=+(b>>>0>>>0)/1.0e4;g[57770]=k;l=+(d>>>0>>>0)/1.0e4;g[57768]=l;cf(c[10030]|0,103688,(v=i,i=i+16|0,h[v>>3]=k,h[v+8>>3]=l,v)|0);i=e;return}function rZ(b){b=b|0;var d=0,e=0;if(a[231184]|0){d=c[10030]|0;aF(10,d|0);a[231184]=0}if((b|0)>3){e=(b|0)%4&-1}else{e=b}c[57766]=(e|0)<-2?-2:e;return}function r_(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;g=i;i=i+8|0;j=g|0;if(a[231184]|0){k=c[10030]|0;aF(10,k|0);a[231184]=0}if((a[f]|0)==0){i=g;return}aI(104112,5,1,c[10030]|0);k=c[57794]|0;if((k|0)==0){l=c[10030]|0;aI(104096,3,1,l|0)}else if((k|0)==2){aI(104088,3,1,c[10030]|0)}if((c[58056]|0)==1){k=c[10030]|0;aI(104040,3,1,k|0)}cf(c[10030]|0,104e3,(v=i,i=i+16|0,h[v>>3]=+(d>>>0>>>0)/1.0e4,h[v+8>>3]=+(e>>>0>>>0)/1.0e4,v)|0);if(a[231056]|0){e=c[10030]|0;cf(e|0,103976,(v=i,i=i+8|0,c[v>>2]=f,v)|0);i=g;return}uz(f,j);e=c[j>>2]|0;if((e|0)==(f|0)){uB(231192,f|0)}else{d=e-f|0;e=d+1|0;uF(231192,f|0,e|0);if((uA(f|0)|0)>>>0>=e>>>0){a[231192+((e|0)==0?0:d)|0]=0}d=a8(231192,101)|0;if((d|0)==0){e=a8(231192,69)|0;if((e|0)!=0){m=e;n=19097}}else{m=d;n=19097}do{if((n|0)==19097){a[m]=0;o=+uz(231192,0);d=bW(m+1|0)|0;if(o==0.0){b[115596]=48;break}if(o==1.0){be(231192,103944,(v=i,i=i+8|0,c[v>>2]=d,v)|0);break}e=~~o;f=(d|0)==1;if(o==+(e|0)){if(f){be(231192,103848,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else{be(231192,103800,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=d,v)|0);break}}else{if(f){be(231192,103760,(v=i,i=i+8|0,h[v>>3]=o,v)|0);break}else{be(231192,103728,(v=i,i=i+16|0,h[v>>3]=o,c[v+8>>2]=d,v)|0);break}}}}while(0);m=c[j>>2]|0;uC(231192,m|0)}cf(c[10030]|0,103976,(v=i,i=i+8|0,c[v>>2]=231192,v)|0);i=g;return}function r$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0.0,l=0.0;f=i;if(a[231184]|0){j=c[10030]|0;aF(10,j|0);a[231184]=0}k=+(b>>>0>>>0)/1.0e4;g[57770]=k;l=+(d>>>0>>>0)/1.0e4;g[57768]=l;d=c[10030]|0;if((e|0)<0){cf(d|0,105032,(v=i,i=i+24|0,h[v>>3]=k,h[v+8>>3]=l,h[v+16>>3]=25.0e-5,v)|0);i=f;return}else{b=c[231088+(((e|0)%12&-1)<<2)>>2]|0;cf(d|0,104992,(v=i,i=i+24|0,c[v>>2]=b,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);i=f;return}}function r0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0.0,l=0.0;j=i;k=+(d>>>0>>>0)/1.0e4;l=+(e>>>0>>>0)/1.0e4;cf(c[10030]|0,105176,(v=i,i=i+40|0,c[v>>2]=(f|0)!=0?105128:179864,h[v+8>>3]=+(a>>>0>>>0)/1.0e4,h[v+16>>3]=+(b>>>0>>>0)/1.0e4,h[v+24>>3]=k,h[v+32>>3]=l,v)|0);g[57770]=k;g[57768]=l;i=j;return}function r1(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0;d=i;if((b|0)==0){e=128;i=d;return e|0}L25532:do{if(!(a[231136]|0)){a[231136]=1;f=c[5163]|0;if((f|0)==103){g=c[5169]|0;if((g|0)>0){j=0;k=g}else{break}while(1){cf(c[10030]|0,105632,(v=i,i=i+16|0,c[v>>2]=j,h[v+8>>3]=+(~~(+(j|0)/+(k-1|0)*1.0e3)|0)*.001,v)|0);j=j+1|0;k=c[5169]|0;if((j|0)>=(k|0)){break L25532}}}else if((f|0)!=114){break}if((c[5169]|0)<=0){break}g=b+32|0;l=0;do{m=c[g>>2]|0;n=+(~~(+h[m+(l*24&-1)>>3]*1.0e3)|0)*.001;o=+(~~(+h[m+(l*24&-1)+8>>3]*1.0e3)|0)*.001;p=+(~~(+h[m+(l*24&-1)+16>>3]*1.0e3)|0)*.001;cf(c[10030]|0,105552,(v=i,i=i+32|0,c[v>>2]=l,h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=p,v)|0);l=l+1|0;}while((l|0)<(c[5169]|0))}}while(0);aI(105272,85,1,c[10030]|0);e=0;i=d;return e|0}function r2(b){b=b|0;var d=0.0,e=0;d=+h[b+8>>3];if((c[b>>2]|0)!=5){return}if(d>0.0){e=~~(d*+(c[5169]|0))}else{e=0}if(!(a[231136]|0)){b=c[m>>2]|0;aI(105680,35,1,b|0)}c[58054]=(e|0)>127?127:e;return}function r3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0;d=i;cf(c[10030]|0,105856,(v=i,i=i+8|0,c[v>>2]=c[58054],v)|0);if((a|0)>0){e=0}else{f=c[10030]|0;g=aF(10,f|0)|0;i=d;return}do{if(((e|0)%8&-1|0)==7){j=c[10030]|0;aF(10,j|0)}k=+(c[b+(e*12&-1)+4>>2]|0)/1.0e4;cf(c[10030]|0,105760,(v=i,i=i+16|0,h[v>>3]=+(c[b+(e*12&-1)>>2]|0)/1.0e4,h[v+8>>3]=k,v)|0);e=e+1|0;}while((e|0)<(a|0));f=c[10030]|0;g=aF(10,f|0)|0;i=d;return}function r4(){var b=0;c[56608]=0;c[56610]=0;if(a[226552]|0){b=c[10030]|0;aF(10,b|0);a[226552]=0}c[56606]=-1;aI(106128,39,1,c[10030]|0);return}function r5(){var b=0;if(a[226552]|0){b=c[10030]|0;aF(10,b|0);a[226552]=0}c[56608]=0;c[56610]=0;return}function r6(){var b=0;if(a[226552]|0){b=c[10030]|0;aF(10,b|0);a[226552]=0}aI(106248,14,1,c[10030]|0);return}function r7(){var a=0;a=i;cf(c[10030]|0,226560,(v=i,i=i+16|0,h[v>>3]=.24089999496936798,c[v+8>>2]=3,v)|0);c[56632]=0;c[56606]=0;i=a;return}function r8(b,d){b=b|0;d=d|0;var e=0;if(a[226552]|0){e=c[10030]|0;aF(10,e|0);a[226552]=0}c[56610]=b;c[56608]=d;return}function r9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if(a[226552]|0){f=c[56630]|0;c[56630]=f+1;if((f|0)<=4){break}f=c[10030]|0;aI(106424,8,1,f|0);c[56630]=1}else{a[226552]=1;f=c[56606]|0;g=c[56632]|0;if((f|0)!=(g|0)){h=c[226496+(f+2<<2)>>2]|0;if((h|0)==(c[226496+(g+2<<2)>>2]|0)){j=f}else{f=c[10030]|0;cf(f|0,106544,(v=i,i=i+8|0,c[v>>2]=h,v)|0);j=c[56606]|0}c[56632]=j}h=c[10030]|0;f=c[56610]|0;g=c[56608]|0;cf(h|0,106504,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=g,v)|0);c[56630]=1}}while(0);cf(c[10030]|0,106360,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);c[56610]=b;c[56608]=d;i=e;return}function sa(b){b=b|0;var d=0,e=0;if(a[226552]|0){d=c[10030]|0;aF(10,d|0);a[226552]=0}if((b|0)>2){e=(b|0)%3&-1}else{e=b}c[56606]=(e|0)>-2?e:-2;return}function sb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if(a[226552]|0){g=c[10030]|0;aF(10,g|0);a[226552]=0}cf(c[10030]|0,106848,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=(c[56722]|0)==0?104:118;b=c[56636]|0;do{if((c[56634]|0)!=(b|0)){c[56634]=b;if((b|0)==1){g=c[10030]|0;aI(108272,17,1,g|0);break}else if((b|0)==2){aI(106656,17,1,c[10030]|0);break}else if((b|0)==0){aI(106736,17,1,c[10030]|0);break}else{break}}}while(0);cf(c[10030]|0,106624,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=e,v)|0);i=f;return}function sc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(a[226552]|0){g=c[10030]|0;aF(10,g|0);a[226552]=0}c[56610]=b;c[56608]=d;cf(c[10030]|0,108368,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);if((c[56634]|0)!=1){d=c[10030]|0;aI(108272,17,1,d|0);c[56634]=1}if((e|0)<0){h=108192}else{h=c[226448+(((e|0)%12&-1)<<2)>>2]|0}cf(c[10030]|0,154696,(v=i,i=i+8|0,c[v>>2]=h,v)|0);i=f;return}function sd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;cf(c[10030]|0,108416,(v=i,i=i+40|0,c[v>>2]=a,c[v+8>>2]=b,c[v+16>>2]=(f|0)==0?108:97,c[v+24>>2]=d,c[v+32>>2]=e,v)|0);c[56610]=d;c[56608]=e;i=g;return}function se(){c[58256]=0;a[233032]=0;aI(113088,165,1,c[10030]|0);aI(112768,208,1,c[10030]|0);aI(111168,1548,1,c[10030]|0);aI(110792,238,1,c[10030]|0);aI(109768,808,1,c[10030]|0);aI(109360,328,1,c[10030]|0);aI(108752,519,1,c[10030]|0);aI(108504,212,1,c[10030]|0);return}function sf(){aI(122176,5,1,c[10030]|0);return}function sg(){aI(113352,9,1,c[10030]|0);return}function sh(){var b=0,d=0,e=0;b=i;d=c[3524]|0;cf(c[10030]|0,113672,(v=i,i=i+24|0,c[v>>2]=c[58256],h[v+8>>3]=5.0,h[v+16>>3]=3.0,v)|0);c[58256]=(c[58256]|0)+1;e=c[d+12>>2]|0;cf(c[10030]|0,113504,(v=i,i=i+16|0,c[v>>2]=c[d+8>>2],c[v+8>>2]=e,v)|0);a[232720]=0;i=b;return}function si(a){a=a|0;c[58248]=a;return 1}function sj(b){b=b|0;a[233032]=(b|0)>0;return 1}function sk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0;d=i;e=c[58246]|0;f=c[58244]|0;g=(e|0)==(a|0)&(f|0)==(b|0);if((c[58250]|0)!=0){j=c[10030]|0;if(g){cf(j|0,113832,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}else{cf(j|0,113728,(v=i,i=i+32|0,c[v>>2]=e,c[v+8>>2]=f,c[v+16>>2]=a,c[v+24>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}}if(g){if((c[58254]&1|0)!=0){c[58246]=a;c[58244]=b;i=d;return}g=c[10030]|0;cf(g|0,113832,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}k=+(e>>>0>>>0);l=+(f>>>0>>>0);m=+(a>>>0>>>0);n=m-k;o=+(b>>>0>>>0);p=o-l;q=+Q(+(n*n+p*p));r=n/q;n=p/q;p=+h[29126];g=c[58254]|0;if(p<q){s=l;t=k;u=q;q=p;j=g;w=e;x=f;while(1){y=t+r*q;z=s+n*q;A=~~+O(+(y+.5));B=~~+O(+(z+.5));if((j&1|0)==0){C=c[10030]|0;cf(C|0,113728,(v=i,i=i+32|0,c[v>>2]=w,c[v+8>>2]=x,c[v+16>>2]=A,c[v+24>>2]=B,v)|0);D=+h[29126];E=c[58254]|0}else{D=q;E=j}c[58246]=A;c[58244]=B;F=u-D;C=E+1&3;c[58254]=C;G=+(c[232736+((c[58242]|0)*24&-1)+(C<<2)>>2]|0);h[29126]=G;if(G<F){s=z;t=y;u=F;q=G;j=C;w=A;x=B}else{H=z;I=y;J=G;K=A;L=B;M=C;break}}}else{H=l;I=k;J=p;K=e;L=f;M=g}p=m-I;I=o-H;h[29126]=J- +Q(+(I*I+p*p));if((M&1|0)!=0){c[58246]=a;c[58244]=b;i=d;return}M=c[10030]|0;if((K|0)==(a|0)&(L|0)==(b|0)){cf(M|0,113832,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}else{cf(M|0,113728,(v=i,i=i+32|0,c[v>>2]=K,c[v+8>>2]=L,c[v+16>>2]=a,c[v+24>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}}function sl(b){b=b|0;var d=0,e=0,f=0.0,j=0.0;d=i;if((b|0)>7){e=(b|0)%8&-1}else{e=b}b=e+2|0;e=(b|0)<0?0:b;f=+g[232732+(e*24&-1)>>2];if(!(f==+g[232732+((c[58242]|0)*24&-1)>>2]&a[232720])){b=c[10030]|0;j=f;cf(b|0,113976,(v=i,i=i+8|0,h[v>>3]=j,v)|0);a[232720]=1}c[58242]=e;c[58254]=0;h[29126]=+(c[232736+(e*24&-1)>>2]|0);c[58250]=c[232728+(e*24&-1)>>2];i=d;return}function sm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}g=bP(e|0)|0;e=a[g]|0;L25673:do{if(e<<24>>24!=0){h=0;j=e;while(1){if(j<<24>>24==34){a[g+h|0]=39}k=h+1|0;if(k>>>0>=(uA(g|0)|0)>>>0){break L25673}h=k;j=a[g+k|0]|0}}}while(0);e=c[58248]|0;if((e|0)==2){l=3}else if((e|0)==0){l=1}else if((e|0)==1){l=2}else{l=0}e=a[233032]|0?90:0;cf(c[10030]|0,114256,(v=i,i=i+40|0,c[v>>2]=g,c[v+8>>2]=b,c[v+16>>2]=d,c[v+24>>2]=e,c[v+32>>2]=l,v)|0);uu(g);i=f;return}function sn(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;c[58246]=a;c[58244]=b;c[58254]=0;h[29126]=+(c[232736+((c[58242]|0)*24&-1)>>2]|0);sk(d,e);if((f|0)==0){i=g;return}cf(c[10030]|0,114408,(v=i,i=i+32|0,c[v>>2]=d-a,c[v+8>>2]=e-b,c[v+16>>2]=d,c[v+24>>2]=e,v)|0);i=g;return}function so(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0;b=i;i=i+56|0;d=b|0;e=b+24|0;f=b+48|0;g=c[13898]|0;if((g|0)!=2){a[232616]=0;a[232304]=0;c[58074]=1;a[232648]=0;a[232640]=0;c[58078]=0;h[29067]=10.0;h[29036]=1.0;c[58080]=-1;a[232544]=a[116880]|0;a[232545|0]=a[116881|0]|0;a[232546|0]=a[116882|0]|0;a[232547|0]=a[116883|0]|0;a[232548|0]=a[116884|0]|0;a[232549|0]=a[116885|0]|0}j=c[8272]|0;L25696:do{if((g|0)<(j|0)){k=d|0;l=d+8|0;m=g;n=j;L25698:while(1){o=c[1054]|0;p=(a[o+(m*40&-1)|0]&1)==0;L25700:do{if(!p){q=c[o+(m*40&-1)+36>>2]|0;r=o+(m*40&-1)+32|0;s=c[10036]|0;t=0;while(1){if((t|0)>=(q|0)){break}if((a[s+((c[r>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L25700}}if((t|0)==1){break L25696}}}while(0);r=c[58086]|0;L25707:do{if((r|0)==0){u=232344}else{s=c[o+(m*40&-1)+36>>2]|0;q=c[o+(m*40&-1)+32>>2]|0;w=(s|0)>0;x=c[10036]|0;y=232344;z=r;while(1){L25711:do{if(!p){if(w){A=0;B=0;C=q;while(1){D=a[z+A|0]|0;if(D<<24>>24==(a[x+(A+C|0)|0]|0)){E=C;F=B}else{if(D<<24>>24!=36){break L25711}E=C-1|0;F=1}G=A+1|0;if((G|0)<(F+s|0)){A=G;B=F;C=E}else{break}}if((F|0)==0){H=G}else{u=y;break L25707}}else{H=0}C=a[z+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){u=y;break L25707}}}while(0);C=y+8|0;B=c[C>>2]|0;if((B|0)==0){u=C;break}else{y=C;z=B}}}}while(0);p=c[u+4>>2]|0;L25724:do{if((p|0)==14){r=m+1|0;c[13898]=r;if((r|0)>=(n|0)){break}L25727:do{if((a[o+(r*40&-1)|0]&1)==0){I=c[10036]|0;J=o+(r*40&-1)+32|0}else{z=c[o+(r*40&-1)+36>>2]|0;y=o+(r*40&-1)+32|0;s=c[10036]|0;x=0;while(1){if((x|0)>=(z|0)){break}if((a[s+((c[y>>2]|0)+x|0)|0]|0)==(a[x+103664|0]|0)){x=x+1|0}else{I=s;J=y;break L25727}}if((x|0)==1){break L25724}else{I=s;J=y}}}while(0);if((ca(I+(c[J>>2]|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=f,v)|0)|0)==1){c[58080]=c[f>>2]}c[13898]=(c[13898]|0)+1}else if((p|0)==4){c[58074]=0;a[232544]=a[116696]|0;a[232545|0]=a[116697|0]|0;a[232546|0]=a[116698|0]|0;a[232547|0]=a[116699|0]|0;a[232548|0]=a[116700|0]|0;a[232549|0]=a[116701|0]|0;a[232550|0]=a[116702|0]|0;c[13898]=m+1}else if((p|0)==0){a[232616]=0;c[13898]=m+1}else if((p|0)==9){c[58074]=2;c[58078]=1;c[13898]=m+1}else if((p|0)==3){a[232304]=0;c[13898]=m+1}else if((p|0)==1){a[232616]=1;c[13898]=m+1}else if((p|0)==8){c[58074]=2;c[58078]=2;c[13898]=m+1}else if((p|0)==7){c[58074]=2;a[232648]=1;c[13898]=m+1}else if((p|0)==15){c[58080]=-1;c[13898]=m+1}else if((p|0)==2){a[232304]=1;c[13898]=m+1}else if((p|0)==5){c[58074]=1;c[13898]=m+1}else if((p|0)==6){c[58074]=2;c[13898]=m+1}else if((p|0)==16){r=m+1|0;c[13898]=r;if((r|0)>=(n|0)){break}L25751:do{if((a[o+(r*40&-1)|0]&1)!=0){z=c[o+(r*40&-1)+36>>2]|0;q=o+(r*40&-1)+32|0;w=c[10036]|0;t=0;while(1){if((t|0)>=(z|0)){break}if((a[w+((c[q>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L25751}}if((t|0)==1){break L25724}}}while(0);r=is(e)|0;q=c[r>>2]|0;if((q|0)==3){K=+uz(c[r+8>>2]|0,0)}else if((q|0)==1){K=+(c[r+8>>2]|0)}else if((q|0)==2){K=+h[r+8>>3]}else{L=19304;break L25698}h[29036]=K}else if((p|0)==10){c[58078]=0;c[13898]=m+1}else if((p|0)==11){c[58074]=2;a[232640]=1;c[13898]=m+1}else if((p|0)==12){r=m+1|0;c[13898]=r;M=r;L=19307}else{M=m;L=19307}}while(0);L25766:do{if((L|0)==19307){L=0;L25768:do{if((M|0)<(n|0)){L25770:do{if((a[o+(M*40&-1)|0]&1)!=0){r=c[o+(M*40&-1)+36>>2]|0;q=o+(M*40&-1)+32|0;w=c[10036]|0;z=0;while(1){if((z|0)>=(r|0)){break}if((a[w+((c[q>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L25770}}if((z|0)==1){N=M;break L25768}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[k>>2]|0)!=3){c[13898]=M;N=M;break}t=c[l>>2]|0;if((t|0)==0){N=c[13898]|0;break}q=bk(t|0,148464)|0;if((q|0)>0){uF(232544,t|0,51);a[q+232544|0]=0}if((a[t+q|0]|0)==44){w=t+(q+1|0)|0;ca(w|0,148448,(v=i,i=i+8|0,c[v>>2]=232536,v)|0)}uu(t);break L25766}else{N=M}}while(0);if((p|0)==12){L=19324;break L25698}if((N|0)>=(c[8272]|0)){break}t=c[1054]|0;L25792:do{if((a[t+(N*40&-1)|0]&1)!=0){w=c[t+(N*40&-1)+36>>2]|0;q=t+(N*40&-1)+32|0;r=c[10036]|0;y=0;while(1){if((y|0)>=(w|0)){break}if((a[r+((c[q>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L25792}}if((y|0)==1){break L25766}}}while(0);t=is(e)|0;q=c[t>>2]|0;if((q|0)==1){O=+(c[t+8>>2]|0)}else if((q|0)==2){O=+h[t+8>>3]}else if((q|0)==3){O=+uz(c[t+8>>2]|0,0)}else{L=19335;break L25698}h[29067]=O;c[13898]=(c[13898]|0)+1}}while(0);m=c[13898]|0;n=c[8272]|0;if((m|0)>=(n|0)){break L25696}}if((L|0)==19304){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==19324){uf(N,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==19335){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);O=+h[29067];do{if(O<5.0){h[29067]=5.0;P=12.0e3}else{if(O>99.99){h[29067]=99.99;P=239976.0;break}else{P=O*2400.0;break}}}while(0);c[(c[3524]|0)+16>>2]=~~(P*+h[29036]*11.0/720.0);P=+h[29067]*2400.0*+h[29036];if((c[58074]|0)==0){c[(c[3524]|0)+20>>2]=~~(P*6.0/720.0+.5)}else{c[(c[3524]|0)+20>>2]=~~(P*5.3/720.0+.5)}L=c[58078]|0;N=a[232616]|0?116440:116408;e=a[232304]|0?131504:131584;M=c[58074]|0;d=(M|0)==0;if((L|0)==0){if(d){Q=136208}else{Q=(M|0)==2?116352:179864}f=a[232648]|0?116296:179864;J=a[232640]|0?116192:179864;P=+h[29036];O=+h[29067];I=c[58080]|0;u=(I|0)>-1?179864:136208;be(13048,116512,(v=i,i=i+80|0,c[v>>2]=N,c[v+8>>2]=e,c[v+16>>2]=Q,c[v+24>>2]=f,c[v+32>>2]=J,h[v+40>>3]=P,c[v+48>>2]=232544,h[v+56>>3]=O,c[v+64>>2]=u,c[v+72>>2]=I,v)|0);i=b;return}else{if(d){R=136208}else{R=(M|0)==2?116352:179864}M=a[232648]|0?116296:179864;d=a[232640]|0?116192:179864;O=+h[29036];I=(L|0)==1?115960:115816;L=c[58080]|0;u=(L|0)>-1?179864:136208;be(13048,116072,(v=i,i=i+72|0,c[v>>2]=N,c[v+8>>2]=e,c[v+16>>2]=R,c[v+24>>2]=M,c[v+32>>2]=d,h[v+40>>3]=O,c[v+48>>2]=I,c[v+56>>2]=u,c[v+64>>2]=L,v)|0);i=b;return}}function sp(a){a=a|0;c[58158]=a;return 1}function sq(a){a=a|0;c[58130]=a;return 1}function sr(a){a=a|0;return 0}function ss(){return}function st(){var b=0,d=0,e=0,f=0,g=0.0,j=0,k=0;b=i;i=i+8|0;d=b|0;cG(d|0);c[58082]=0;c[58084]=0;e=c[10030]|0;f=bg(aN(d|0)|0)|0;cf(e|0,122032,(v=i,i=i+8|0,c[v>>2]=f,v)|0);f=c[58080]|0;if((f|0)>-1){e=c[10030]|0;cf(e|0,121880,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}if((c[58074]|0)==2){f=c[10030]|0;aI(121552,247,1,f|0);f=c[10030]|0;if(a[232648]|0){aI(121472,33,1,f|0)}else{aI(121408,24,1,f|0)}f=c[58078]|0;if((f|0)==2){e=c[10030]|0;aI(120992,174,1,e|0)}else if((f|0)==1){aI(121240,124,1,c[10030]|0)}if(a[232640]|0){f=c[10030]|0;aI(120888,54,1,f|0)}f=c[10030]|0;aI(120824,31,1,f|0)}aI(120464,227,1,c[10030]|0);cf(c[10030]|0,120328,(v=i,i=i+8|0,h[v>>3]=+h[29036],v)|0);aI(119968,246,1,c[10030]|0);f=c[58074]|0;if((f|0)==0){e=c[10030]|0;g=+h[29067];cf(e|0,119792,(v=i,i=i+16|0,c[v>>2]=232544,h[v+8>>3]=g,v)|0)}else if((f|0)!=2){aI(119656,82,1,c[10030]|0);g=+h[29067];cf(c[10030]|0,119576,(v=i,i=i+16|0,c[v>>2]=232544,h[v+8>>3]=g,v)|0)}aI(119448,91,1,c[10030]|0);f=c[10030]|0;if(a[232616]|0){aI(119328,18,1,f|0)}else{aI(119248,19,1,f|0)}f=c[10030]|0;if(a[232304]|0){aI(119168,20,1,f|0);j=c[10030]|0;k=aI(117096,1968,1,j|0)|0;i=b;return}else{aI(119128,19,1,f|0);j=c[10030]|0;k=aI(117096,1968,1,j|0)|0;i=b;return}}function su(){var a=0,b=0;if((c[58074]|0)!=2){a=c[10030]|0;b=aI(122176,5,1,a|0)|0;return}aI(122728,10,1,c[10030]|0);aI(122648,12,1,c[10030]|0);aI(122520,16,1,c[10030]|0);aI(122424,5,1,c[10030]|0);aI(122312,10,1,c[10030]|0);a=c[10030]|0;b=aI(122176,5,1,a|0)|0;return}function sv(){var b=0;if(a[232528]|0){a[232528]=0;b=c[10030]|0;aI(125976,2,1,b|0)}aI(122792,8,1,c[10030]|0);return}function sw(){var b=0,d=0,e=0.0;b=i;c[58126]=-2;h[29062]=1.0;h[29061]=+h[3817];cf(c[10030]|0,123376,(v=i,i=i+24|0,c[v>>2]=c[58156],h[v+8>>3]=5.0,h[v+16>>3]=3.0,v)|0);d=c[3524]|0;e=+((c[d+12>>2]|0)>>>0>>>0)/10.0;cf(c[10030]|0,123080,(v=i,i=i+16|0,h[v>>3]=+((c[d+8>>2]|0)>>>0>>>0)/10.0,h[v+8>>3]=e,v)|0);cf(c[10030]|0,122896,(v=i,i=i+8|0,h[v>>3]=+h[3817],v)|0);c[58156]=(c[58156]|0)+1;a[232608]=0;i=b;return}function sx(b,d){b=b|0;d=d|0;var e=0;if((c[58084]|0)==(b|0)&(c[58082]|0)==(d|0)){return}if(a[232528]|0){a[232528]=0;e=c[10030]|0;aI(125976,2,1,e|0)}c[58084]=b;c[58082]=d;return}function sy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0;e=i;f=c[58084]|0;g=c[58082]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}do{if(a[232528]|0){j=c[58128]|0;c[58128]=j+1;if((j|0)<=4){break}j=c[10030]|0;aF(10,j|0);c[58128]=1}else{a[232528]=1;j=c[10030]|0;k=+(f|0)/10.0;l=+(g|0)/10.0;cf(j|0,123728,(v=i,i=i+16|0,h[v>>3]=k,h[v+8>>3]=l,v)|0);c[58128]=2}}while(0);c[58084]=b;c[58082]=d;cf(c[10030]|0,123552,(v=i,i=i+16|0,h[v>>3]=+(b|0)/10.0,h[v+8>>3]=+(d|0)/10.0,v)|0);i=e;return}function sz(b){b=b|0;var d=0,e=0;d=i;if((b|0)>7){e=(b|0)%8&-1}else{e=b}if(a[232528]|0){a[232528]=0;b=c[10030]|0;aI(125976,2,1,b|0)}do{if(a[232608]|0){c[58126]=e+1;a[232608]=0}else{if((c[58126]|0)!=(e|0)){break}i=d;return}}while(0);cf(c[10030]|0,123808,(v=i,i=i+8|0,c[v>>2]=e,v)|0);c[58126]=e;i=d;return}function sA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0;f=i;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}g=bP(e|0)|0;if(a[232528]|0){a[232528]=0;e=c[10030]|0;aI(125976,2,1,e|0)}e=c[58130]|0;if((e|0)==0){j=1}else if((e|0)==1){j=2}else if((e|0)==2){j=3}else{j=0}e=c[58074]|0;do{if((e|0)==0){k=a[g]|0;L25932:do{if(k<<24>>24!=0){l=0;m=k;while(1){if(m<<24>>24==34){a[g+l|0]=39}n=l+1|0;if(n>>>0>=(uA(g|0)|0)>>>0){break L25932}l=n;m=a[g+n|0]|0}}}while(0);k=c[10030]|0;if(a[232600]|0){o=+h[29067];p=+(b>>>0>>>0)/10.0;q=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,124232,(v=i,i=i+56|0,c[v>>2]=g,c[v+8>>2]=232544,h[v+16>>3]=o,h[v+24>>3]=p,h[v+32>>3]=q,c[v+40>>2]=m,c[v+48>>2]=j,v)|0);break}else{q=+(b>>>0>>>0)/10.0;p=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,124152,(v=i,i=i+40|0,c[v>>2]=g,h[v+8>>3]=q,h[v+16>>3]=p,c[v+24>>2]=m,c[v+32>>2]=j,v)|0);break}}else{if(!(a[232600]|0)){m=c[10030]|0;p=+(b>>>0>>>0)/10.0;q=+(d>>>0>>>0)/10.0;k=c[58158]|0;cf(m|0,123912,(v=i,i=i+40|0,c[v>>2]=g,h[v+8>>3]=p,h[v+16>>3]=q,c[v+24>>2]=k,c[v+32>>2]=j,v)|0);break}k=c[10030]|0;if((e|0)==2){q=+(b>>>0>>>0)/10.0;p=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,123912,(v=i,i=i+40|0,c[v>>2]=g,h[v+8>>3]=q,h[v+16>>3]=p,c[v+24>>2]=m,c[v+32>>2]=j,v)|0);break}else{p=+h[29067];q=+(b>>>0>>>0)/10.0;o=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,123992,(v=i,i=i+56|0,c[v>>2]=232544,h[v+8>>3]=p,c[v+16>>2]=g,h[v+24>>3]=q,h[v+32>>3]=o,c[v+40>>2]=m,c[v+48>>2]=j,v)|0);break}}}while(0);uu(g);i=f;return}function sB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0;f=i;if(a[232528]|0){a[232528]=0;g=c[10030]|0;aI(125976,2,1,g|0)}if((e|0)>9){j=(e|0)%10&-1}else{j=e}cf(c[10030]|0,124360,(v=i,i=i+24|0,c[v>>2]=j,h[v+8>>3]=+(b>>>0>>>0)/10.0,h[v+16>>3]=+(d>>>0>>>0)/10.0,v)|0);i=f;return}function sC(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0;j=i;if(!((c[58084]|0)==(b|0)&(c[58082]|0)==(d|0))){if(a[232528]|0){a[232528]=0;k=c[10030]|0;aI(125976,2,1,k|0)}c[58084]=b;c[58082]=d}if((g|0)!=0){k=c[10030]|0;l=(g|0)==1?124720:124632;m=+(b>>>0>>>0)/10.0;n=+(d>>>0>>>0)/10.0;o=+(e>>>0>>>0)/10.0;p=+(f>>>0>>>0)/10.0;cf(k|0,124776,(v=i,i=i+40|0,c[v>>2]=l,h[v+8>>3]=m,h[v+16>>3]=n,h[v+24>>3]=o,h[v+32>>3]=p,v)|0);c[58084]=e;c[58082]=f;i=j;return}if((b|0)==(e|0)&(d|0)==(f|0)){c[58084]=e;c[58082]=f;i=j;return}cf(c[10030]|0,124504,(v=i,i=i+32|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=+(d>>>0>>>0)/10.0,h[v+16>>3]=+(e>>>0>>>0)/10.0,h[v+24>>3]=+(f>>>0>>>0)/10.0,v)|0);c[58084]=e;c[58082]=f;i=j;return}function sD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0;d=i;do{if((a[b]|0)==0){e=0}else{f=bk(b|0,148464)|0;if(f>>>0<51){uF(232544,b|0,51)}g=b+(f+1|0)|0;ca(g|0,148448,(v=i,i=i+8|0,c[v>>2]=232536,v)|0);j=+h[29067];if(j<5.0){h[29067]=5.0;e=1;break}if(j<100.0){e=1;break}h[29067]=99.99;e=1}}while(0);a[232600]=e;i=d;return 1}function sE(b){b=+b;var d=0,e=0.0,f=0;d=i;e=b<0.0?1.0:b;if(+h[29061]==e){i=d;return}if(a[232528]|0){a[232528]=0;f=c[10030]|0;aI(125976,2,1,f|0)}cf(c[10030]|0,124896,(v=i,i=i+8|0,h[v>>3]=e,v)|0);h[29061]=e;i=d;return}function sF(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;j=i;k=b>>4;l=b&15;if(a[232528]|0){a[232528]=0;b=c[10030]|0;aI(125976,2,1,b|0)}if((l|0)==0){b=c[10030]|0;m=+(d>>>0>>>0)/10.0;n=+(e>>>0>>>0)/10.0;o=+((f+d|0)>>>0>>>0)/10.0;p=+((g+e|0)>>>0>>>0)/10.0;cf(b|0,125216,(v=i,i=i+64|0,h[v>>3]=m,h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=n,h[v+32>>3]=o,h[v+40>>3]=p,h[v+48>>3]=m,h[v+56>>3]=p,v)|0);i=j;return}else if((l|0)==2|(l|0)==5){q=k*12&-1}else{q=k}if((q|0)<100){p=+(100-q|0)*.01;q=c[10030]|0;m=1.0-p;cf(q|0,126664,(v=i,i=i+16|0,h[v>>3]=m,h[v+8>>3]=p,v)|0);a[232608]=1}else{q=c[10030]|0;aI(126536,25,1,q|0)}p=+(d>>>0>>>0)/10.0;m=+(e>>>0>>>0)/10.0;o=+((f+d|0)>>>0>>>0)/10.0;n=+((g+e|0)>>>0>>>0)/10.0;cf(c[10030]|0,124968,(v=i,i=i+64|0,h[v>>3]=p,h[v+8>>3]=m,h[v+16>>3]=o,h[v+24>>3]=m,h[v+32>>3]=o,h[v+40>>3]=n,h[v+48>>3]=p,h[v+56>>3]=n,v)|0);i=j;return}function sG(b){b=+b;var d=0,e=0;d=i;if(+h[29062]==b){i=d;return}if(a[232528]|0){a[232528]=0;e=c[10030]|0;aI(125976,2,1,e|0)}cf(c[10030]|0,125384,(v=i,i=i+8|0,h[v>>3]=b,v)|0);h[29062]=b;i=d;return}function sH(b){b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;d=i;i=i+24|0;e=d|0;f=+h[b+8>>3];a[232608]=1;if(a[232528]|0){a[232528]=0;g=c[10030]|0;aI(125976,2,1,g|0)}if(!(a[232616]|0)){j=f<.001?0.0:f;g=c[10030]|0;cf(g|0,125848,(v=i,i=i+8|0,h[v>>3]=j,v)|0);i=d;return}g=b|0;k=c[g>>2]|0;if((k|0)==1){l=c[b+4>>2]|0;if((l|0)>7){m=(l|0)%8&-1}else{m=l}do{if((m|0)==-1){l=c[10030]|0;aI(125736,21,1,l|0)}else{if((m|0)<=-1){break}l=c[10030]|0;cf(l|0,125576,(v=i,i=i+8|0,c[v>>2]=m,v)|0)}}while(0);n=c[g>>2]|0}else{n=k}if((n|0)==5){k=c[5169]|0;do{if((k|0)==0){o=f}else{j=+(k|0);if(f>=+(k-1|0)/j){o=1.0;break}o=+O(+(f*j))/j}}while(0);fq(o,e);p=+h[e>>3]}else if((n|0)==3){n=c[b+4>>2]|0;o=+(n>>>16&255|0)/255.0;h[e>>3]=o;h[e+8>>3]=+(n>>>8&255|0)/255.0;h[e+16>>3]=+(n&255|0)/255.0;p=o}else{i=d;return}n=e|0;if(p<1.0e-4){h[n>>3]=0.0}b=e+8|0;p=+h[b>>3];if(p<1.0e-4){h[b>>3]=0.0;q=0.0}else{q=p}b=e+16|0;p=+h[b>>3];if(p<1.0e-4){h[b>>3]=0.0;r=0.0}else{r=p}cf(c[10030]|0,125464,(v=i,i=i+24|0,h[v>>3]=+h[n>>3],h[v+8>>3]=q,h[v+16>>3]=r,v)|0);i=d;return}function sI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0;e=i;f=c[d+8>>2]|0;g=f>>4;j=f&15;if(a[232528]|0){a[232528]=0;f=c[10030]|0;aI(125976,2,1,f|0)}if((j|0)==0){f=c[10030]|0;aI(126768,23,1,f|0)}else if((j|0)==1|(j|0)==4){k=g;l=19531}else if((j|0)==2|(j|0)==5){k=g*12&-1;l=19531}do{if((l|0)==19531){if((k|0)<100){m=+(100-k|0)*.01;g=c[10030]|0;n=1.0-m;cf(g|0,126664,(v=i,i=i+16|0,h[v>>3]=n,h[v+8>>3]=m,v)|0);break}else{g=c[10030]|0;aI(126536,25,1,g|0);break}}}while(0);aI(126432,5,1,c[10030]|0);k=c[10030]|0;if((b|0)<=0){o=k;p=aI(126072,27,1,o|0)|0;i=e;return}l=b-1|0;g=0;j=k;while(1){m=+(c[d+(g*12&-1)+4>>2]|0)/10.0;k=g+1|0;if((g|0)<(l|0)){q=((k|0)%5&-1|0)==0?126232:126152}else{q=126152}cf(j|0,126296,(v=i,i=i+24|0,h[v>>3]=+(c[d+(g*12&-1)>>2]|0)/10.0,h[v+8>>3]=m,c[v+16>>2]=q,v)|0);f=c[10030]|0;if((k|0)<(b|0)){g=k;j=f}else{o=f;break}}p=aI(126072,27,1,o|0)|0;i=e;return}function sJ(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0,ad=0,ae=0,af=0;b=i;i=i+1184|0;d=b|0;e=b+8|0;f=b+32|0;j=b+56|0;k=b+1112|0;l=b+1120|0;m=b+1128|0;n=b+80|0;uE(n|0,0,1025);o=c[13898]|0;p=c[8272]|0;L26069:do{if((o|0)<(p|0)){q=f|0;r=f+8|0;s=m|0;t=e|0;u=e+8|0;w=m+50|0;x=o;y=p;L26071:while(1){z=c[1054]|0;A=(a[z+(x*40&-1)|0]&1)==0;L26073:do{if(!A){B=c[z+(x*40&-1)+36>>2]|0;C=z+(x*40&-1)+32|0;D=c[10036]|0;E=0;while(1){if((E|0)>=(B|0)){break}if((a[D+((c[C>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L26073}}if((E|0)==1){break L26069}}}while(0);C=c[60336]|0;L26080:do{if((C|0)==0){F=241344}else{D=c[z+(x*40&-1)+36>>2]|0;B=c[z+(x*40&-1)+32>>2]|0;G=(D|0)>0;H=c[10036]|0;I=241344;J=C;while(1){L26084:do{if(!A){if(G){K=0;L=0;M=B;while(1){N=a[J+K|0]|0;if(N<<24>>24==(a[H+(K+M|0)|0]|0)){O=M;P=L}else{if(N<<24>>24!=36){break L26084}O=M-1|0;P=1}Q=K+1|0;if((Q|0)<(P+D|0)){K=Q;L=P;M=O}else{break}}if((P|0)==0){R=Q}else{F=I;break L26080}}else{R=0}M=a[J+R|0]|0;if((M<<24>>24|0)==36|(M<<24>>24|0)==0){F=I;break L26080}}}while(0);M=I+8|0;L=c[M>>2]|0;if((L|0)==0){F=M;break}else{I=M;J=L}}}}while(0);A=c[F+4>>2]|0;L26097:do{if((A|0)==21){c[13898]=x+1;C=is(j)|0;J=c[C>>2]|0;if((J|0)==2){S=+h[C+8>>3]}else if((J|0)==3){S=+uz(c[C+8>>2]|0,0)}else if((J|0)==1){S=+(c[C+8>>2]|0)}else{T=19615;break L26071}h[30158]=S}else if((A|0)==7){U=x+1|0;c[13898]=U;if((U|0)>=(y|0)){V=U;T=19660;break L26071}L26106:do{if((a[z+(U*40&-1)|0]&1)!=0){C=c[z+(U*40&-1)+36>>2]|0;J=z+(U*40&-1)+32|0;I=c[10036]|0;D=0;while(1){if((D|0)>=(C|0)){break}if((a[I+((c[J>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L26106}}if((D|0)==1){V=U;T=19662;break L26071}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[q>>2]|0)!=3){T=19578;break L26071}J=c[r>>2]|0;if((J|0)==0){T=19580;break L26071}I=c[60308]|0;if((I|0)!=0){uu(I);c[60308]=0}if((a[J]|0)==0){uu(J);break}else{c[60308]=J;break}}else if((A|0)==4){c[13898]=x+1;a[241228]=1}else if((A|0)==27){uE(s|0,0,51);J=x+1|0;c[13898]=J;if((J|0)>=(y|0)){break}L26124:do{if((a[z+(J*40&-1)|0]&1)!=0){I=c[z+(J*40&-1)+36>>2]|0;C=z+(J*40&-1)+32|0;H=c[10036]|0;B=0;while(1){if((B|0)>=(I|0)){break}if((a[H+((c[C>>2]|0)+B|0)|0]|0)==(a[B+103664|0]|0)){B=B+1|0}else{break L26124}}if((B|0)==1){break L26097}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[t>>2]|0)!=3){c[13898]=J;break}C=c[u>>2]|0;if((C|0)==0){break}h[d>>3]=0.0;H=bh(C|0,44)|0;if((H|0)==0){W=uA(C|0)|0;X=0.0}else{I=H+1|0;ca(I|0,148448,(v=i,i=i+8|0,c[v>>2]=d,v)|0);W=H-C|0;X=+h[d>>3]}H=W>>>0>50?50:W;uD(s|0,C|0,H);a[m+H|0]=0;uF(241280,s|0,51);a[w]=0;uu(C);if(X>0.0){h[30167]=X;break}if(X>=0.0){break}h[30167]=12.0}else if((A|0)==11){c[13898]=x+1;a[241237]=1}else if((A|0)==16){c[13898]=x+1;c[60311]=0}else if((A|0)==18){c[13898]=x+1;c[60311]=2}else if((A|0)==1){c[13898]=x+1;C=s4(k,l,2)|0;Y=+(c[10032]|0);Z=+g[k>>2]/Y;h[30151]=Z;_=+g[l>>2]/Y;h[30152]=_;c[60306]=C;if((C|0)!=2){break}h[30151]=Z*2.54;h[30152]=_*2.54}else if((A|0)==19){c[13898]=x+1;C=is(j)|0;H=c[C>>2]|0;if((H|0)==3){$=+uz(c[C+8>>2]|0,0)}else if((H|0)==1){$=+(c[C+8>>2]|0)}else if((H|0)==2){$=+h[C+8>>3]}else{T=19603;break L26071}h[30156]=$}else if((A|0)==0){c[13898]=x+1;C=c[60308]|0;if((C|0)!=0){uu(C);c[60308]=0}uD(241208,241072,136)}else if((A|0)==25){uh(x,134168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((A|0)==10){c[13898]=x+1;a[241236]=0;C=(c[3524]|0)+96|0;c[C>>2]=c[C>>2]|1024}else if((A|0)==22){c[13898]=x+1;c[60318]=0}else if((A|0)==17){c[13898]=x+1;c[60311]=1}else if((A|0)==2){c[13898]=x+1;h[30151]=5.0;h[30152]=3.0;c[60306]=1}else if((A|0)==3){c[13898]=x+1;a[241228]=0}else if((A|0)==26){c[13898]=x+1;a[241280]=0;h[30167]=12.0}else if((A|0)==8){c[13898]=x+1;C=c[60308]|0;if((C|0)==0){break}uu(C);c[60308]=0}else if((A|0)==14){c[13898]=x+1;c[60310]=1}else if((A|0)==13){c[13898]=x+1;c[60310]=0}else if((A|0)==6){c[13898]=x+1;a[241229]=0}else if((A|0)==20){c[13898]=x+1;C=is(j)|0;H=c[C>>2]|0;if((H|0)==1){aa=+(c[C+8>>2]|0)}else if((H|0)==3){aa=+uz(c[C+8>>2]|0,0)}else if((H|0)==2){aa=+h[C+8>>3]}else{T=19609;break L26071}h[30157]=aa}else if((A|0)==12){c[13898]=x+1;a[241237]=0}else if((A|0)==23){c[13898]=x+1;c[60318]=1}else if((A|0)==5){c[13898]=x+1;a[241229]=1}else if((A|0)==24){c[13898]=x+1;c[60319]=0}else if((A|0)==9){c[13898]=x+1;a[241236]=1;C=(c[3524]|0)+96|0;c[C>>2]=c[C>>2]&-1025}else if((A|0)==15){c[13898]=x+1;c[60310]=2}else{T=19639;break L26071}}while(0);A=c[13898]|0;z=c[8272]|0;if((A|0)<(z|0)){x=A;y=z}else{break L26069}}if((T|0)==19578){c[13898]=U;V=U;uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19639){uf(x,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((T|0)==19603){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19660){uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19662){uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19615){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19580){V=c[13898]|0;uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19609){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);aa=+h[30167];h[30211]=aa;c[(c[3524]|0)+16>>2]=~~(aa*2540.0/72.27*+h[30158]+.5);T=c[3524]|0;c[T+20>>2]=~~(+((c[T+16>>2]|0)>>>0>>>0)*.4895+.5);aa=+h[30151];if((c[60306]|0)==1){c[(c[3524]|0)+8>>2]=~~(aa*2540.0+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*2540.0+.5)}else{c[(c[3524]|0)+8>>2]=~~(aa*1.0e3+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*1.0e3+.5)}T=(c[60306]|0)==1?145600:145440;aa=+h[30152];V=(a[241228]&1)!=0?133784:133640;U=(a[241229]&1)!=0?133504:133320;j=(c[60308]|0)==0?133016:132832;a0(13048,1025,133912,(v=i,i=i+56|0,h[v>>3]=+h[30151],c[v+8>>2]=T,h[v+16>>3]=aa,c[v+24>>2]=T,c[v+32>>2]=V,c[v+40>>2]=U,c[v+48>>2]=j,v)|0);if((c[60308]|0)!=0){j=1025-(uA(13048)|0)|0;ck(13048,132696,j|0);j=c[60308]|0;U=1025-(uA(13048)|0)|0;ck(13048,j|0,U|0);U=1025-(uA(13048)|0)|0;ck(13048,132584,U|0)}U=(a[241236]&1)!=0?132472:132384;ck(13048,U|0,1025-(uA(13048)|0)|0);U=c[60310]|0;if((U|0)==1){j=1025-(uA(13048)|0)|0;ck(13048,132112,j|0)}else if((U|0)==0){ck(13048,132272,1025-(uA(13048)|0)|0)}else if((U|0)==2){ck(13048,132032,1025-(uA(13048)|0)|0)}U=c[60311]|0;if((U|0)==0){j=1025-(uA(13048)|0)|0;ck(13048,137232,j|0)}else if((U|0)==2){ck(13048,137168,1025-(uA(13048)|0)|0)}else if((U|0)==1){ck(13048,131936,1025-(uA(13048)|0)|0)}aa=+h[30156];$=+h[30157];X=+h[30158];a0(n|0,1025,131664,(v=i,i=i+32|0,c[v>>2]=(a[241237]&1)!=0?131584:131504,h[v+8>>3]=aa,h[v+16>>3]=$,h[v+24>>3]=X,v)|0);ck(13048,n|0,1025-(uA(13048)|0)|0);U=c[60318]|0;if((U|0)==1){j=1025-(uA(13048)|0)|0;ck(13048,131408,j|0);ab=+h[30167];ac=a0(n|0,1025,131176,(v=i,i=i+16|0,c[v>>2]=241280,h[v+8>>3]=ab,v)|0)|0;ad=uA(13048)|0;ae=1025-ad|0;af=ck(13048,n|0,ae|0)|0;i=b;return}else if((U|0)==0){ck(13048,131240,1025-(uA(13048)|0)|0);ab=+h[30167];ac=a0(n|0,1025,131176,(v=i,i=i+16|0,c[v>>2]=241280,h[v+8>>3]=ab,v)|0)|0;ad=uA(13048)|0;ae=1025-ad|0;af=ck(13048,n|0,ae|0)|0;i=b;return}else{ab=+h[30167];ac=a0(n|0,1025,131176,(v=i,i=i+16|0,c[v>>2]=241280,h[v+8>>3]=ab,v)|0)|0;ad=uA(13048)|0;ae=1025-ad|0;af=ck(13048,n|0,ae|0)|0;i=b;return}}function sK(a){a=a|0;c[60468]=a;return 1}function sL(a){a=a|0;c[60416]=a;return 1}function sM(a){a=a|0;if((a|0)!=0){c[60410]=a}return 0}function sN(){var b=0,d=0,e=0,f=0,g=0.0,j=0.0;b=i;i=i+112|0;d=b|0;cG(d|0);c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;c[60464]=0;c[60418]=0;cf(c[10030]|0,140680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);do{if((a[241229]&1)!=0){e=b+8|0;if((bw(e|0,100,140512,aN(d|0)|0)|0)==0){break}f=c[10030]|0;cf(f|0,140320,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}}while(0);aF(10,c[10030]|0);cf(c[10030]|0,139952,(v=i,i=i+40|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=240968,c[v+24>>2]=103960,c[v+32>>2]=240976,v)|0);cf(c[10030]|0,139760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((a[241228]&1)==0){i=b;return}if((c[11252]|0)==15){d=c[10030]|0;aI(139560,25,1,d|0)}aI(139312,24,1,c[10030]|0);if((a[241236]&1)!=0){d=c[10030]|0;aI(139136,30,1,d|0)}d=c[60308]|0;if((d|0)!=0){e=c[10030]|0;cf(e|0,154696,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}g=+h[30167];if(g==12.0){j=g}else{d=c[10030]|0;cf(d|0,138800,(v=i,i=i+8|0,h[v>>3]=g,v)|0);j=+h[30167]}d=(a[241280]|0)!=0?148464:179864;cf(c[10030]|0,138568,(v=i,i=i+24|0,c[v>>2]=241280,c[v+8>>2]=d,h[v+16>>3]=j,v)|0);aI(138336,39,1,c[10030]|0);aI(138080,9,1,c[10030]|0);d=c[60310]|0;if((d|0)==1){e=c[10030]|0;aI(137776,7,1,e|0)}else if((d|0)==2){aI(137632,7,1,c[10030]|0)}else if((d|0)==0){aI(137912,7,1,c[10030]|0)}cf(c[10030]|0,137496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aI(137328,12,1,c[10030]|0);d=c[60311]|0;if((d|0)==1){e=c[10030]|0;aI(137776,7,1,e|0)}else if((d|0)==2){aI(137168,7,1,c[10030]|0)}else if((d|0)==0){aI(137232,4,1,c[10030]|0)}cf(c[10030]|0,137008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,136744,(v=i,i=i+8|0,c[v>>2]=(a[241237]&1)!=0?136424:136208,v)|0);cf(c[10030]|0,136008,(v=i,i=i+8|0,h[v>>3]=+h[30156],v)|0);cf(c[10030]|0,135744,(v=i,i=i+8|0,h[v>>3]=+h[30157],v)|0);cf(c[10030]|0,135608,(v=i,i=i+8|0,h[v>>3]=+h[30158],v)|0);cf(c[10030]|0,135456,(v=i,i=i+8|0,c[v>>2]=(c[60318]|0)==0?135312:135192,v)|0);cf(c[10030]|0,134944,(v=i,i=i+8|0,c[v>>2]=(c[60418]|0)==0?134816:134640,v)|0);aI(134536,13,1,c[10030]|0);i=b;return}function sO(){var b=0;b=c[10030]|0;if((a[241228]&1)==0){aI(140840,10,1,b|0);return}else{aI(140968,10,1,b|0);return}}function sP(){var b=0;if((c[60266]|0)!=0){s2()}aI(141472,55,1,c[10030]|0);b=c[10030]|0;if((a[241228]&1)==0){aI(141112,20,1,b|0);return}else{aI(141320,17,1,b|0);return}}function sQ(){var b=0,d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0,m=0;b=i;d=(a[241228]&1)==0;e=c[10030]|0;f=(c[60464]|0)+1|0;c[60464]=f;if(d){cf(e|0,146344,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}else{cf(e|0,146528,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}cf(c[10030]|0,146160,(v=i,i=i+8|0,c[v>>2]=40152,v)|0);cf(c[10030]|0,145992,(v=i,i=i+8|0,c[v>>2]=240968,v)|0);g=+h[30151];f=(c[60306]|0)==1;j=f?2.54:1.0;k=+h[30152];e=f?145600:145440;cf(c[10030]|0,145792,(v=i,i=i+48|0,h[v>>3]=g*j,h[v+8>>3]=k*j,h[v+16>>3]=g,c[v+24>>2]=e,h[v+32>>3]=k,c[v+40>>2]=e,v)|0);e=c[10030]|0;if((c[60418]|0)==0){cf(e|0,145080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{cf(e|0,144816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}cf(c[10030]|0,144624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,143912,(v=i,i=i+8|0,h[v>>3]=+h[30158],v)|0);cf(c[10030]|0,143832,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,143688,(v=i,i=i+8|0,h[v>>3]=+h[30204],v)|0);cf(c[10030]|0,143472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,143328,(v=i,i=i+8|0,h[v>>3]=+h[30206],v)|0);cf(c[10030]|0,143184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if(!(a[31104]|0)){c[60414]=-3;c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;i=b;return}e=c[60410]|0;if((e|0)==0){c[60414]=-3;c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;i=b;return}aI(143016,16,1,c[10030]|0);f=c[5163]|0;if((f|0)==103){d=c[10030]|0;aI(142832,16,1,d|0)}else if((f|0)==114){d=c[5165]|0;l=c[5166]|0;cf(c[10030]|0,142624,(v=i,i=i+24|0,c[v>>2]=c[5164],c[v+8>>2]=d,c[v+16>>2]=l,v)|0)}else if((f|0)==100){aI(142352,21,1,c[10030]|0);l=c[e+44>>2]|0;d=c[e+40>>2]|0;aI(142248,7,1,c[10030]|0);if((d|0)>0){e=0;do{if((e|0)>0){m=c[10030]|0;aF(44,m|0)}k=+h[l+(e<<5)+16>>3];g=+h[l+(e<<5)+24>>3];cf(c[10030]|0,142144,(v=i,i=i+24|0,h[v>>3]=+h[l+(e<<5)+8>>3],h[v+8>>3]=k,h[v+16>>3]=g,v)|0);e=e+1|0;}while((e|0)<(d|0));aI(142e3,12,1,c[10030]|0);e=0;do{if((e|0)>0){m=c[10030]|0;aF(44,m|0)}cf(c[10030]|0,141840,(v=i,i=i+8|0,h[v>>3]=+h[l+(e<<5)>>3],v)|0);e=e+1|0;}while((e|0)<(d|0))}else{aI(142e3,12,1,c[10030]|0)}aF(41,c[10030]|0)}else if((f|0)==102){aI(142512,21,1,c[10030]|0)}aI(150696,3,1,c[10030]|0);c[60414]=-3;c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;i=b;return}function sR(a,b){a=a|0;b=b|0;if((c[60258]|0)==(a|0)&(c[60256]|0)==(b|0)){return}if((c[60266]|0)!=0){s2()}c[60258]=a;c[60256]=b;return}function sS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0;e=i;f=c[60258]|0;g=c[60256]|0;j=c[60266]|0;k=(j|0)==0;if((f|0)==(b|0)&(g|0)==(d|0)){if(!k){i=e;return}a[241056]=1;i=e;return}if(k){a[241056]=0;c[60262]=f;c[60260]=g;c[60266]=2;k=c[10030]|0;l=+(f|0)*.001;m=+(g|0)*.001;cf(k|0,146712,(v=i,i=i+16|0,h[v>>3]=l,h[v+8>>3]=m,v)|0)}else{if((j&3|0)==2){j=c[10030]|0;aI(152656,3,1,j|0);c[60266]=2;n=c[60258]|0;o=c[60256]|0}else{n=f;o=g}g=c[10030]|0;m=+(n|0)*.001;l=+(o|0)*.001;cf(g|0,152248,(v=i,i=i+16|0,h[v>>3]=m,h[v+8>>3]=l,v)|0)}c[60258]=b;c[60256]=d;c[60266]=(c[60266]|0)+1;i=e;return}function sT(b){b=b|0;var d=0;d=i;do{if((c[60414]|0)==(b|0)){if(a[241864]|0){break}i=d;return}}while(0);if((c[60266]|0)!=0){s2()}cf(c[10030]|0,146984,(v=i,i=i+8|0,c[v>>2]=b,v)|0);c[60414]=b;a[241864]=0;i=d;return}function sU(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0;f=i;i=i+32|0;g=f|0;uD(g|0,240992,30);if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}if((c[60266]|0)!=0){s2()}j=c[60416]|0;if((j|0)==2){k=2}else if((j|0)==0){k=1}else{k=0}j=e;while(1){if((a[j]|0)!=32){break}j=j+1|0}cf(c[10030]|0,148128,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)*.001,h[v+8>>3]=+(d>>>0>>>0)*.001,v)|0);d=c[60468]|0;if((d|0)!=0){b=c[10030]|0;cf(b|0,147984,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}cf(c[10030]|0,147776,(v=i,i=i+8|0,c[v>>2]=g+(k*10&-1),v)|0);if((a[241696]|0)!=0){k=c[10030]|0;cf(k|0,147528,(v=i,i=i+8|0,c[v>>2]=241696,v)|0)}cf(c[10030]|0,147256,(v=i,i=i+8|0,c[v>>2]=j,v)|0);i=f;return}function sV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((c[60266]|0)!=0){s2()}cf(c[10030]|0,148360,(v=i,i=i+24|0,h[v>>3]=+(a>>>0>>>0)*.001,h[v+8>>3]=+(b>>>0>>>0)*.001,c[v+16>>2]=d,v)|0);i=e;return}function sW(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;lD(a,b,c,d,e);return}function sX(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0;d=i;i=i+64|0;e=d|0;f=d+8|0;g=f|0;uE(g|0,0,51);h[e>>3]=0.0;j=bh(b|0,44)|0;if((j|0)==0){k=uA(b|0)|0;l=0.0}else{m=j+1|0;ca(m|0,148448,(v=i,i=i+8|0,c[v>>2]=e,v)|0);k=j-b|0;l=+h[e>>3]}h[30210]=l;e=k>>>0>50?50:k;uD(241800,b|0,e);a[e+241800|0]=0;uF(241696,241800,101);l=+h[30210];do{if(l>0.0){h[30211]=l;a0(g|0,51,148688,(v=i,i=i+8|0,h[v>>3]=l,v)|0);e=101-(uA(241696)|0)|0;ck(241696,g|0,e|0);a[f+50|0]=0}else{if(l!=0.0){break}h[30211]=+h[30167]}}while(0);c[(c[3524]|0)+16>>2]=~~(+h[30211]*2540.0/72.27*+h[30158]+.5);f=c[3524]|0;c[f+20>>2]=~~(+((c[f+16>>2]|0)>>>0>>>0)*.4895+.5);l=+h[30151];if((c[60306]|0)==1){c[(c[3524]|0)+8>>2]=~~(l*2540.0+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*2540.0+.5);i=d;return 1}else{c[(c[3524]|0)+8>>2]=~~(l*1.0e3+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*1.0e3+.5);i=d;return 1}return 0}function sY(a){a=+a;var b=0;b=i;if(+h[30204]==a){i=b;return}if((c[60266]|0)!=0){s2()}cf(c[10030]|0,148808,(v=i,i=i+8|0,h[v>>3]=a,v)|0);h[30204]=a;i=b;return}function sZ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;if((c[60266]|0)!=0){s2()}cf(c[10030]|0,148936,(v=i,i=i+32|0,h[v>>3]=+(e>>>0>>>0)*.001,h[v+8>>3]=+(f>>>0>>>0)*.001,h[v+16>>3]=+(b>>>0>>>0)*.001,h[v+24>>3]=+(d>>>0>>>0)*.001,v)|0);s3(a);i=g;return}function s_(a){a=+a;var b=0,d=0.0;b=i;d=a<0.0?1.0:a;if(+h[30206]==d){i=b;return}if((c[60266]|0)!=0){s2()}cf(c[10030]|0,149264,(v=i,i=i+8|0,h[v>>3]=d,v)|0);h[30206]=d;i=b;return}function s$(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0;d=i;i=i+24|0;e=d|0;if((c[60266]|0)!=0){s2()}f=c[b>>2]|0;if((f|0)==3){g=c[b+4>>2]|0;j=+(g>>>16&255|0)/255.0;k=+(g>>>8&255|0)/255.0;l=+(g&255|0)/255.0;g=c[10030]|0;cf(g|0,149808,(v=i,i=i+24|0,h[v>>3]=j,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);a[241864]=1;i=d;return}else if((f|0)==5){l=+h[b+8>>3];k=l<0.0?0.0:l;l=k>1.0?1.0:k;cf(c[10030]|0,149664,(v=i,i=i+8|0,h[v>>3]=l,v)|0);g=c[5168]|0;L26414:do{if((g|0)==0){m=l}else{k=+O(+(+(g|0)*l))/+(g-1|0);if((c[5163]|0)!=100){m=k;break}n=c[5172]|0;if((n|0)<3&k==0.0){m=k;break}o=c[5173]|0;p=0;j=k;while(1){if((p|0)>=(n|0)){m=j;break L26414}k=+h[o+(p<<5)>>3];q=p+1|0;r=+h[o+(q<<5)>>3];s=r>l;do{if(k<=l&s){if(!(j<k|j>r)){t=j;break}t=(k+r)*.5}else{t=j}}while(0);if(s){m=t;break}else{p=q;j=t}}}}while(0);fq(m,e);m=+h[e+8>>3];t=+h[e+16>>3];cf(c[10030]|0,149808,(v=i,i=i+24|0,h[v>>3]=+h[e>>3],h[v+8>>3]=m,h[v+16>>3]=t,v)|0);a[241864]=1;i=d;return}else if((f|0)==1){cf(c[10030]|0,150024,(v=i,i=i+8|0,c[v>>2]=c[b+4>>2],v)|0);a[241864]=1;i=d;return}else{uh(-1,149512,(v=i,i=i+8|0,c[v>>2]=f,v)|0);i=d;return}}function s0(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0;d=i;if((a|0)<3){i=d;return}if((c[60266]|0)!=0){s2()}e=b|0;f=a-1|0;g=b+4|0;if((c[e>>2]|0)==(c[b+(f*12&-1)>>2]|0)){j=(c[g>>2]|0)==(c[b+(f*12&-1)+4>>2]|0)?f:a}else{j=a}aI(153544,5,1,c[10030]|0);k=+(c[g>>2]|0)*.001;cf(c[10030]|0,153096,(v=i,i=i+16|0,h[v>>3]=+(c[e>>2]|0)*.001,h[v+8>>3]=k,v)|0);if((j|0)>1){e=1;do{if((e&3|0)==0){g=c[10030]|0;aI(152656,3,1,g|0)}k=+(c[b+(e*12&-1)+4>>2]|0)*.001;cf(c[10030]|0,152248,(v=i,i=i+16|0,h[v>>3]=+(c[b+(e*12&-1)>>2]|0)*.001,h[v+8>>3]=k,v)|0);e=e+1|0;}while((e|0)<(j|0))}aI(151984,9,1,c[10030]|0);s3(c[b+8>>2]|0);i=d;return}function s1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0.0,D=0,E=0.0,F=0,G=0.0,H=0,I=0;g=i;i=i+24|0;j=g|0;k=e+24|0;l=e|0;do{if((c[k>>2]|0)>(c[l>>2]|0)){m=19853}else{if((c[e+4>>2]|0)>(c[e+28>>2]|0)){m=19853;break}if((c[e+12>>2]|0)>(c[e+36>>2]|0)){m=19853;break}if((c[e+40>>2]|0)>(c[e+16>>2]|0)){m=19853}else{n=0}}}while(0);if((m|0)==19853){n=1}if((c[60418]|0)==1){i=g;return}do{if((f|0)==0){m=c[10030]|0;cf(m|0,159568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);m=aa(b,a);if((m|0)!=0){o=j|0;p=j+8|0;q=j+16|0;r=0;s=0;while(1){if((s|0)>15){t=c[10030]|0;cf(t|0,158976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);u=1}else{u=s+1|0}w=+h[d+(r<<3)>>3];t=c[5168]|0;L26467:do{if((t|0)==0){x=w}else{y=+O(+(w*+(t|0)))/+(t-1|0);if((c[5163]|0)!=100){x=y;break}z=c[5172]|0;if((z|0)<3&y==0.0){x=y;break}A=c[5173]|0;B=0;C=y;while(1){if((B|0)>=(z|0)){x=C;break L26467}y=+h[A+(B<<5)>>3];D=B+1|0;E=+h[A+(D<<5)>>3];F=E>w;do{if(y<=w&F){if(!(C<y|C>E)){G=C;break}G=(y+E)*.5}else{G=C}}while(0);if(F){x=G;break}else{B=D;C=G}}}}while(0);fq(x,j);t=~~(+h[p>>3]*255.0)&255;B=~~(+h[q>>3]*255.0)&255;cf(c[10030]|0,158504,(v=i,i=i+24|0,c[v>>2]=~~(+h[o>>3]*255.0)&255,c[v+8>>2]=t,c[v+16>>2]=B,v)|0);B=r+1|0;if(B>>>0<m>>>0){r=B;s=u}else{break}}}s=c[10030]|0;aI(157888,3,1,s|0)}else{s=(f|0)==2;r=s?4:3;m=c[10030]|0;cf(m|0,159568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);m=aa(b,a);o=(m|0)==0;if(!o){q=0;p=0;while(1){if((p|0)>15){B=c[10030]|0;cf(B|0,158976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);H=1}else{H=p+1|0}B=aa(q,r);cf(c[10030]|0,155792,(v=i,i=i+8|0,c[v>>2]=~~(+h[d+(B<<3)>>3]*255.0)&255,v)|0);cf(c[10030]|0,155792,(v=i,i=i+8|0,c[v>>2]=~~(+h[d+(B+1<<3)>>3]*255.0)&255,v)|0);cf(c[10030]|0,155792,(v=i,i=i+8|0,c[v>>2]=~~(+h[d+(B+2<<3)>>3]*255.0)&255,v)|0);B=q+1|0;if(B>>>0<m>>>0){q=B;p=H}else{break}}}p=c[10030]|0;aI(157888,3,1,p|0);if(!s){break}p=c[10030]|0;cf(p|0,154920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if(!o){p=0;q=0;while(1){if((q|0)>47){B=c[10030]|0;cf(B|0,158976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);I=1}else{I=q+1|0}B=c[10030]|0;t=~~(+h[d+(aa(p,r)+3<<3)>>3]*255.0)&255;cf(B|0,155792,(v=i,i=i+8|0,c[v>>2]=t,v)|0);t=p+1|0;if(t>>>0<m>>>0){p=t;q=I}else{break}}}q=c[10030]|0;aI(157888,3,1,q|0)}}while(0);if(n){I=c[10030]|0;aI(154584,14,1,I|0)}I=c[l>>2]|0;x=+((c[e+12>>2]|0)-I|0)*.001;l=c[e+16>>2]|0;G=+((c[e+4>>2]|0)-l|0)*.001;cf(c[10030]|0,154224,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=a,h[v+16>>3]=x,h[v+24>>3]=G,h[v+32>>3]=+(I|0)*.001,h[v+40>>3]=+(l|0)*.001,v)|0);if(!n){i=g;return}n=c[k>>2]|0;k=c[e+40>>2]|0;G=+((c[e+28>>2]|0)-k|0)*.001;cf(c[10030]|0,153832,(v=i,i=i+32|0,h[v>>3]=+((c[e+36>>2]|0)-n|0)*.001,h[v+8>>3]=G,h[v+16>>3]=+(n|0)*.001,h[v+24>>3]=+(k|0)*.001,v)|0);i=g;return}function s2(){var b=0,d=0,e=0.0,f=0.0,g=0,j=0;b=i;if(a[241056]|0){d=c[10030]|0;e=+(c[60258]|0)*.001;f=+(c[60256]|0)*.001;cf(d|0,150512,(v=i,i=i+16|0,h[v>>3]=e,h[v+8>>3]=f,v)|0);a[241056]=0;c[60266]=0;i=b;return}d=c[60258]|0;g=c[60256]|0;j=c[10030]|0;if((d|0)==(c[60262]|0)&(g|0)==(c[60260]|0)){aI(150352,21,1,j|0);c[60266]=0;i=b;return}else{f=+(d|0)*.001;e=+(g|0)*.001;cf(j|0,150176,(v=i,i=i+16|0,h[v>>3]=f,h[v+8>>3]=e,v)|0);c[60266]=0;i=b;return}}function s3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;b=i;d=a>>4;e=(d|0)<0?0:d;f=(e|0)>100?100:e;aI(151736,9,1,c[10030]|0);e=a&15;if((e|0)==1){g=19900}else if((e|0)==5){aI(151568,12,1,c[10030]|0);g=19903}else if((e|0)==2){g=19903}else if((e|0)==4){aI(151568,12,1,c[10030]|0);g=19900}else if((e|0)!=3){aI(150840,11,1,c[10030]|0)}do{if((g|0)==19900){if((f|0)>=100){break}e=c[10030]|0;j=+(f|0)*.01;cf(e|0,151328,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}else if((g|0)==19903){cf(c[10030]|0,151024,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}}while(0);aI(150696,3,1,c[10030]|0);i=b;return}function s4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0,J=0.0;f=i;i=i+48|0;j=f|0;k=f+24|0;l=c[13898]|0;if((l|0)>=(c[8272]|0)){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}m=c[1054]|0;L26528:do{if((a[m+(l*40&-1)|0]&1)!=0){n=c[m+(l*40&-1)+36>>2]|0;o=m+(l*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L26528}}if((q|0)!=1){break}uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);l=is(k)|0;m=c[l>>2]|0;if((m|0)==1){r=+(c[l+8>>2]|0)}else if((m|0)==3){r=+uz(c[l+8>>2]|0,0)}else if((m|0)==2){r=+h[l+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}l=k|0;if((c[l>>2]|0)==3){uu(c[k+8>>2]|0);c[l>>2]=1}s=r;g[b>>2]=s;l=c[13898]|0;k=c[1054]|0;m=c[k+(l*40&-1)+36>>2]|0;o=c[k+(l*40&-1)+32>>2]|0;p=(a[k+(l*40&-1)|0]&1)==0;L26545:do{if((m|0)>0&(p^1)){k=c[10036]|0;n=0;t=0;u=o;while(1){if((a[n+130912|0]|0)==(a[k+(n+u|0)|0]|0)){w=u;x=t}else{if((n|0)!=2){y=19929;break L26545}w=u-1|0;x=1}z=n+1|0;if((z|0)<(x+m|0)){n=z;t=x;u=w}else{break}}if((x|0)==0){if(!((n|0)==6|(n|0)==1)){y=19929;break}}c[13898]=l+1;A=+g[b>>2];y=19936}else{y=19929}}while(0);do{if((y|0)==19929){L26559:do{if((c[8272]|0)<=(l|0)|p){y=19935}else{x=c[10036]|0;w=0;while(1){if((w|0)>=(m|0)){break}if((a[x+(o+w|0)|0]|0)==(a[w+145440|0]|0)){w=w+1|0}else{y=19935;break L26559}}if((w|0)!=2){y=19935;break}c[13898]=l+1;B=+g[b>>2]}}while(0);if((y|0)==19935){if((e|0)==1){A=s;y=19936;break}else if((e|0)==2){B=s}else{C=e;break}}g[b>>2]=+(c[10032]|0)/2.54*B;C=2}}while(0);if((y|0)==19936){g[b>>2]=A*+(c[10032]|0);C=1}e=c[13898]|0;l=e+1|0;c[13898]=l;if((c[8272]|0)<=(e|0)){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}o=c[1054]|0;if((a[o+(e*40&-1)|0]&1)==0){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}m=c[o+(e*40&-1)+36>>2]|0;p=o+(e*40&-1)+32|0;e=c[10036]|0;o=0;while(1){if((o|0)>=(m|0)){break}if((a[e+((c[p>>2]|0)+o|0)|0]|0)==(a[o+148464|0]|0)){o=o+1|0}else{y=19976;break}}if((y|0)==19976){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((o|0)!=1){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}l=is(j)|0;o=c[l>>2]|0;if((o|0)==2){D=+h[l+8>>3]}else if((o|0)==3){D=+uz(c[l+8>>2]|0,0)}else if((o|0)==1){D=+(c[l+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}l=j|0;if((c[l>>2]|0)==3){uu(c[j+8>>2]|0);c[l>>2]=1}A=D;g[d>>2]=A;l=c[13898]|0;j=c[1054]|0;o=c[j+(l*40&-1)+36>>2]|0;p=c[j+(l*40&-1)+32>>2]|0;e=(a[j+(l*40&-1)|0]&1)==0;L26596:do{if((o|0)>0&(e^1)){j=c[10036]|0;m=0;n=0;x=p;while(1){if((a[m+130912|0]|0)==(a[j+(m+x|0)|0]|0)){E=x;F=n}else{if((m|0)!=2){y=19961;break L26596}E=x-1|0;F=1}u=m+1|0;if((u|0)<(F+o|0)){m=u;n=F;x=E}else{break}}if((F|0)==0){if(!((m|0)==6|(m|0)==1)){y=19961;break}}c[13898]=l+1;G=+g[d>>2];y=19968}else{y=19961}}while(0);do{if((y|0)==19961){L26610:do{if((c[8272]|0)<=(l|0)|e){y=19967}else{F=c[10036]|0;E=0;while(1){if((E|0)>=(o|0)){break}if((a[F+(p+E|0)|0]|0)==(a[E+145440|0]|0)){E=E+1|0}else{y=19967;break L26610}}if((E|0)!=2){y=19967;break}c[13898]=l+1;H=+g[d>>2]}}while(0);if((y|0)==19967){if((C|0)==1){G=A;y=19968;break}else if((C|0)==2){H=A}else{I=C;J=A;break}}D=+(c[10032]|0)/2.54*H;g[d>>2]=D;I=2;J=D}}while(0);if((y|0)==19968){H=G*+(c[10032]|0);g[d>>2]=H;I=1;J=H}if(+g[b>>2]<1.0|J<1.0){uf(c[13898]|0,130744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{i=f;return I|0}return 0}function s5(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0;j=i;k=e-b|0;l=f-d|0;if((e|0)==(b|0)){m=c[10030]|0;n=(h|0)!=0?101096:101088;o=l>>31|1;p=(l|0)>-1?l:-l|0;cf(m|0,101128,(v=i,i=i+40|0,c[v>>2]=e,c[v+8>>2]=d,c[v+16>>2]=n,c[v+24>>2]=o,c[v+32>>2]=p,v)|0);i=j;return}if((f|0)==(d|0)){p=c[10030]|0;o=(h|0)!=0?101096:101088;n=k>>31|1;m=(k|0)>-1?k:-k|0;cf(p|0,101032,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=f,c[v+16>>2]=o,c[v+24>>2]=n,c[v+32>>2]=m,v)|0);i=j;return}q=+(l|0)/+(k|0);if(q<0.0){r=-0.0-q}else{r=q}q=0.0;m=233040;n=0;o=1;while(1){s=r- +(c[m+4>>2]|0)/+(o|0);if((n|0)==0){t=19990}else{if(s<0.0){u=-0.0-s}else{u=s}if(u<q){t=19990}else{w=n;x=q}}do{if((t|0)==19990){t=0;if(s>=0.0){w=m;x=s;break}w=m;x=-0.0-s}}while(0);p=m+8|0;y=c[p>>2]|0;if((y|0)==0){break}else{q=x;m=p;n=w;o=y}}if(x==0.0){o=c[10030]|0;n=(h|0)!=0?101096:101088;m=aa(c[w>>2]|0,k>>31|1);t=aa(c[w+4>>2]|0,l>>31|1);y=(k|0)>-1?k:-k|0;cf(o|0,100984,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=n,c[v+24>>2]=m,c[v+32>>2]=t,c[v+40>>2]=y,v)|0);i=j;return}do{if(a[45024]|0){q9(0);if(!(a[233344]|0)){y=c[10030]|0;cf(y|0,100208,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0)}y=c[10030]|0;cf(y|0,100168,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=f,v)|0);c[58302]=e;c[58300]=f;a[233344]=1}else{if((g|0)==1){q9(0);s6(b,e,d,f);break}if(a[239320]|0){y=c[10030]|0;aF(10,y|0);a[239320]=0}c[59764]=b;c[59762]=d;rr(e,f)}}while(0);if((h|0)==0){i=j;return}h=c[10030]|0;d=aa(c[w>>2]|0,k>>31|1);k=aa(c[w+4>>2]|0,l>>31|1);cf(h|0,100952,(v=i,i=i+32|0,c[v>>2]=e,c[v+8>>2]=f,c[v+16>>2]=d,c[v+24>>2]=k,v)|0);i=j;return}function s6(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0;j=i;k=(b|0)==(d|0);l=(e|0)==(f|0);m=a[233344]|0;if(k&l){if(m){i=j;return}s7(2,0.0,0.0,0.0,0.0);n=c[10030]|0;cf(n|0,100920,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=e,c[v+16>>2]=100896,v)|0);i=j;return}n=m&1;a[233344]=1;if(k){o=+(e|0);s7(n,+(b|0),o,+g[58368],+(f|0)-o);i=j;return}if(l){o=+(b|0);s7(n,o,+(e|0),+(d|0)-o,+g[58368]);i=j;return}o=+(d|0);p=+(b|0);q=o-p;r=+(f|0);s=+(e|0);t=r-s;u=t/q;n=u>=0.0;if(n){w=u}else{w=-0.0-u}if(w<=1.0){l=q>=0.0;if(l){x=q}else{x=-0.0-q}if(n){y=u}else{y=-0.0-u}w=+g[58368];z=w;if(x<(1.0/y+.25)*z){if(l){A=q}else{A=-0.0-q}B=A}else{if(n){C=u}else{C=-0.0-u}B=(1.0/C+.25)*z}C=B;k=t>=0.0;if(k){D=t}else{D=-0.0-t}m=w<D;if(m|k){E=m?w:t}else{E=-0.0-t}D=(k?1.0:-1.0)*E;E=t-D;B=C*.24089999999999998;if(l){F=q}else{F=-0.0-q}do{if(C==F){G=20046}else{k=E>=0.0;if(k){H=E}else{H=-0.0-E}if(H*2.0+.5<1.0){G=20046;break}if(k){I=E}else{I=-0.0-E}k=~~(I*2.0+.5);if((k|0)==1){G=20046;break}A=E/+(k|0);y=(q-(l?1.0:-1.0)*C)/+(k-1|0);m=c[10030]|0;x=y;if(y<0.0){J=p-C}else{J=p}K=J;if(A<0.0){L=-0.0-A}else{L=A}M=s-(L-D)*.5;N=A;A=B;O=L*.24089999999999998;cf(m|0,100624,(v=i,i=i+56|0,h[v>>3]=K,h[v+8>>3]=M,h[v+16>>3]=x,h[v+24>>3]=N,c[v+32>>2]=k,h[v+40>>3]=A,h[v+48>>3]=O,v)|0);P=y}}while(0);if((G|0)==20046){l=c[10030]|0;k=(d|0)>=(b|0)?b:d;L=(s+r-w)*.5;w=B;B=z*.24089999999999998;cf(l|0,100728,(v=i,i=i+32|0,c[v>>2]=k,h[v+8>>3]=L,h[v+16>>3]=w,h[v+24>>3]=B,v)|0);P=q}B=C*.5;C=q-B*(P>=0.0?1.0:-1.0);k=c[10030]|0;P=C;if(C<0.0){Q=p-B}else{Q=p}C=Q;Q=+g[58368];w=s-Q*.5;L=t;z=B*.24089999999999998;B=Q*.24089999999999998;cf(k|0,100464,(v=i,i=i+48|0,h[v>>3]=C,h[v+8>>3]=w,h[v+16>>3]=P,h[v+24>>3]=L,h[v+32>>3]=z,h[v+40>>3]=B,v)|0);a[233344]=0;i=j;return}k=t>=0.0;if(k){R=t}else{R=-0.0-t}if(n){S=u}else{S=-0.0-u}B=+g[58368];z=B;if(R<(S+.25)*z){if(k){T=t}else{T=-0.0-t}U=T}else{if(n){V=u}else{V=-0.0-u}U=(V+.25)*z}V=U;n=q>=0.0;if(n){W=q}else{W=-0.0-q}l=B<W;if(l|n){X=l?B:q}else{X=-0.0-q}W=(n?1.0:-1.0)*X;X=q-W;U=V*.24089999999999998;if(k){Y=t}else{Y=-0.0-t}do{if(V==Y){G=20079}else{n=X>=0.0;if(n){Z=X}else{Z=-0.0-X}if(Z*2.0+.5<1.0){G=20079;break}if(n){_=X}else{_=-0.0-X}n=~~(_*2.0+.5);if((n|0)==1){G=20079;break}u=X/+(n|0);T=(t-(k?1.0:-1.0)*V)/+(n-1|0);l=c[10030]|0;d=u>=0.0;if(d){$=u}else{$=-0.0-u}S=p-($-W)*.5;if(T<0.0){aa=s-V}else{aa=s}R=aa;L=u;P=T;if(d){ab=u}else{ab=-0.0-u}u=ab*.24089999999999998;w=U;cf(l|0,100624,(v=i,i=i+56|0,h[v>>3]=S,h[v+8>>3]=R,h[v+16>>3]=L,h[v+24>>3]=P,c[v+32>>2]=n,h[v+40>>3]=u,h[v+48>>3]=w,v)|0);ac=T}}while(0);if((G|0)==20079){G=c[10030]|0;ab=(p+o-B)*.5;k=(f|0)>=(e|0)?e:f;B=z*.24089999999999998;z=U;cf(G|0,100408,(v=i,i=i+32|0,h[v>>3]=ab,c[v+8>>2]=k,h[v+16>>3]=B,h[v+24>>3]=z,v)|0);ac=t}z=V*.5;V=t-z*(ac>=0.0?1.0:-1.0);ac=+g[58368];if(V<0.0){ad=s-z}else{ad=s}cf(c[10030]|0,100464,(v=i,i=i+48|0,h[v>>3]=p-ac*.5,h[v+8>>3]=ad,h[v+16>>3]=q,h[v+24>>3]=V,h[v+32>>3]=ac*.24089999999999998,h[v+40>>3]=z*.24089999999999998,v)|0);a[233344]=0;i=j;return}function s7(b,d,e,f,j){b=b|0;d=+d;e=+e;f=+f;j=+j;var k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;k=i;l=(b|0)==2;do{if(l){if(a[233176]|0){m=20111}}else{if(f==0.0|j==0.0){i=k;return}n=a[233176]|0;if((b|0)!=1|n^1){if(n){m=20111;break}else{m=20118;break}}do{if((~~+g[58288]|0)==(~~d|0)){if(+g[58290]!=f){m=20105;break}o=+g[58292];if(o*j<0.0){break}g[58292]=o+j;i=k;return}else{m=20105}}while(0);do{if((m|0)==20105){if((~~+g[58286]|0)!=(~~e|0)){break}if(+g[58292]!=j){break}o=+g[58290];if(o*f<0.0){break}g[58290]=o+f;i=k;return}}while(0);if(n){m=20111}else{m=20118}}}while(0);do{if((m|0)==20111){o=+g[58290];if(o<0.0){g[58288]=o+ +g[58288];p=-0.0-o;g[58290]=p;q=p}else{q=o}o=+g[58292];if(o<0.0){g[58286]=o+ +g[58286];p=-0.0-o;g[58292]=p;r=p}else{r=o}o=+g[58368];b=c[10030]|0;p=+g[58288];s=+g[58286];if(q<o|r<o){cf(b|0,100384|0,(v=i,i=i+24|0,h[v>>3]=p,h[v+8>>3]=s,c[v+16>>2]=100896,v)|0);m=20118;break}else{t=(-0.0-o)*.24089999999999998*.5;o=q*.24089999999999998;u=r*.24089999999999998;cf(b|0,100288|0,(v=i,i=i+40|0,h[v>>3]=p,h[v+8>>3]=s,h[v+16>>3]=t,h[v+24>>3]=o,h[v+32>>3]=u,v)|0);m=20118;break}}}while(0);do{if((m|0)==20118){if(l){break}g[58288]=d;g[58286]=e;g[58290]=f;g[58292]=j;a[233176]=1;i=k;return}}while(0);a[233176]=0;i=k;return}function s8(a){a=a|0;var b=0,d=0;b=i;d=~~(+(a|0)*1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function s9(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function ta(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tb(a){a=a|0;var b=0,d=0;b=i;d=~~(+(a|0)/1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tc(a){a=a|0;var b=0,d=0,e=0;b=i;d=~~(+(a|0)/1.6119);a=~~(+(d|0)*1.7321);e=-d<<1;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=-a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function td(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=(a|0)/2&-1;a=~~(+(d|0)*1.7321);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d<<1,v)|0);e=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e<<1,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);f=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=e,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function te(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);i=b;return}function tf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=(a|0)/2&-1;a=~~(+(d|0)*1.7321);e=d<<1;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);f=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=d,v)|0);g=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=g,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=g<<1,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=g,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tg(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0);d=(a|0)/2&-1;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);i=b;return}function th(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=-a,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function ti(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=-a,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tj(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tk(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);d=~~(+(a|0)/1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tl(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);td(a);i=b;return}function tm(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=(a|0)/2&-1;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);i=b;return}function tn(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=~~(+(~~(+(a|0)/1.5)|0)*1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function to(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=~~(+(a|0)/1.5);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tp(a){a=a|0;var b=0,d=0,e=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=~~(+(~~(+(a|0)/1.5)|0)/1.6119);a=~~(+(d|0)*1.7321);e=-d<<1;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=-a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tq(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);tf(~~(+(a|0)/1.2));i=b;return}function tr(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);d=~~(+(a|0)/1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function ts(){var b=0,d=0,e=0,f=0.0,g=0;b=i;if(!(a[4192]|0)){i=b;return}if((c[918]|0)>0){d=0;do{e=-(c[32124+(d<<3)>>2]|0)|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=c[32120+(d<<3)>>2],c[v+8>>2]=e,v)|0);aI(99440,2,1,c[10030]|0);d=d+1|0;}while((d|0)<(c[918]|0))}d=(c[916]|0)+2|0;e=c[3684+(d*12&-1)>>2]|0;if((e|0)==1){f=+h[523]}else if((e|0)==3){f=+h[523]*3.0}else if((e|0)==2){f=+h[523]*2.0}else{f=1.0}e=c[3688+(d*12&-1)>>2]|0;if((e|0)==1){d=c[10030]|0;cf(d|0,99448,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}else if((e|0)==3){cf(c[10030]|0,99480,(v=i,i=i+8|0,h[v>>3]=f,v)|0);if((c[918]|0)>0){d=0;do{g=-(c[32124+(d<<3)>>2]|0)|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=c[32120+(d<<3)>>2],c[v+8>>2]=g,v)|0);aI(99440,2,1,c[10030]|0);d=d+1|0;}while((d|0)<(c[918]|0))}cf(c[10030]|0,99448,(v=i,i=i+8|0,h[v>>3]=f*.5,v)|0)}else if((e|0)==0){aI(99872,14,1,c[10030]|0)}else if((e|0)==4){cf(c[10030]|0,99480,(v=i,i=i+8|0,h[v>>3]=f,v)|0);if((c[918]|0)>0){d=0;do{g=-(c[32124+(d<<3)>>2]|0)|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=c[32120+(d<<3)>>2],c[v+8>>2]=g,v)|0);aI(99440,2,1,c[10030]|0);d=d+1|0;}while((d|0)<(c[918]|0))}cf(c[10030]|0,99448,(v=i,i=i+8|0,h[v>>3]=f/3.0,v)|0)}else if((e|0)==2){cf(c[10030]|0,99480,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}a[4192]=0;i=b;return}function tt(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if(!(a[46624]|0)){i=b;return}d=c[9372]|0;cf(c[10030]|0,84056,(v=i,i=i+16|0,c[v>>2]=25936,c[v+8>>2]=d,v)|0);d=(c[9372]|0)-1|0;e=c[10030]|0;if((d|0)>0){f=0;g=e;while(1){h=c[2264+(f<<2)>>2]|0;cf(g|0,84280,(v=i,i=i+16|0,c[v>>2]=c[2664+(f<<2)>>2],c[v+8>>2]=h,v)|0);h=f+1|0;if((h&7|0)==0){j=c[10030]|0;aI(84248,2,1,j|0)}j=(c[9372]|0)-1|0;k=c[10030]|0;if((h|0)<(j|0)){f=h;g=k}else{l=j;m=k;break}}}else{l=d;m=e}e=c[2264+(l<<2)>>2]|0;d=c[768]|0;g=c[774]|0;f=c[770]|0;cf(m|0,84016,(v=i,i=i+40|0,c[v>>2]=c[2664+(l<<2)>>2],c[v+8>>2]=e,c[v+16>>2]=d,c[v+24>>2]=g,c[v+32>>2]=f,v)|0);c[774]=(c[774]|0)+1;a[46624]=0;c[9372]=0;f=c[10030]|0;if((f|0)==0){i=b;return}aD(f|0);i=b;return}function tu(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0;b=i;if(a[228352]|0){e=c[10030]|0;aI(78232,6,1,e|0);a[228352]=0}if(a[228344]|0){i=b;return}e=c[57144]|0;if((e|0)>12){f=(e|0)%13&-1}else{f=e}e=f+3|0;cf(c[10030]|0,75352,(v=i,i=i+8|0,c[v>>2]=227016+(((e|0)<0?0:e<<16>>16)<<4),v)|0);e=a[228528]|0;do{if(e<<24>>24==3){f=c[10030]|0;g=d[226992]|0;j=d[228368]|0;k=d[228536]|0;cf(f|0,75328,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=j,c[v+16>>2]=k,v)|0)}else{k=c[10030]|0;if(e<<24>>24==1){j=c[57082]|0;aK(j|0,k|0);break}else{aI(75272,12,1,k|0);break}}}while(0);e=c[57144]|0;if((e|0)>12){l=(e|0)%13&-1}else{l=e}e=l+3|0;l=a[226984]|0;cf(c[10030]|0,75208,(v=i,i=i+24|0,h[v>>3]=+h[227008+(((e|0)<0?0:e<<16>>16)<<4)>>3]*+h[28540],c[v+8>>2]=l?131936:137232,c[v+16>>2]=l?131936:75184,v)|0);aI(75104,3,1,c[10030]|0);a[228344]=1;i=b;return}function tv(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;f=i;g=a[227272]|0;do{if((c[56816]|0)>>>0>512){if(!g){j=20201;break}if(a[228352]|0){k=c[10030]|0;aI(78232,6,1,k|0);a[228352]=0}k=c[10030]|0;aI(78240,9,1,k|0);c[56816]=0;a[227272]=0;j=20201}else{if(!g){j=20201}}}while(0);if((j|0)==20201){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(73816,7,1,g|0);g=a[228528]|0;if((g<<24>>24|0)==3){k=c[10030]|0;l=d[226992]|0;m=d[228368]|0;n=d[228536]|0;cf(k|0,73768,(v=i,i=i+24|0,c[v>>2]=l,c[v+8>>2]=m,c[v+16>>2]=n,v)|0)}else if((g<<24>>24|0)==1){cf(c[10030]|0,73752,(v=i,i=i+8|0,c[v>>2]=c[57082],v)|0)}g=c[57144]|0;do{if(a[228520]|0){n=(g|0)%5&-1;if((n|0)<=0){j=20209;break}m=c[10030]|0;l=c[228496+(n<<2)>>2]|0;cf(m|0,73720,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}else{j=20209}}while(0);do{if((j|0)==20209){if((g|0)!=-1){break}l=c[10030]|0;cf(l|0,73720,(v=i,i=i+8|0,c[v>>2]=73656,v)|0)}}while(0);if(a[228360]|0){g=c[10030]|0;aI(73696,17,1,g|0)}g=c[10030]|0;aI(73688,4,1,g|0);a[227272]=1}o=+((c[(c[3524]|0)+12>>2]|0)-e|0)/10.0;cf(c[10030]|0,73840,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=o,v)|0);g=(c[56816]|0)+1|0;c[56816]=g;if((g&7|0)!=0){c[56740]=b;c[56736]=e;i=f;return}aI(73904,3,1,c[10030]|0);c[56740]=b;c[56736]=e;i=f;return}function tw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0,k=0,l=0.0;f=i;g=+h[28552];uu(c[59466]|0);j=c[57108]|0;if((j|0)==0){k=0}else{k=bP(j|0)|0}c[59466]=k;if((a[37456]&1)!=0){a[237856]=0;qg(b,d,e);i=f;return}a[237856]=1;qg(b,d,e);a[237856]=0;if((aQ(e|0,74128)|0)!=0){a[237872]=1}c[59472]=0;h[5613]=1.0;uF(44912,216760,16);d=e;do{e=lJ(d,1,c[59466]|0,g,0.0,1,1,0)|0;if((a[e]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[e]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=e+1|0;}while((a[d]|0)!=0);uu(c[57108]|0);c[57108]=c[59466];c[59466]=0;l=+h[29737];if(+h[28552]!=g|l!=0.0){d=c[10030]|0;cf(d|0,216688,(v=i,i=i+16|0,h[v>>3]=g,h[v+8>>3]=l,v)|0);h[28552]=g;h[29737]=0.0}a[237872]=0;aI(73992,14,1,c[10030]|0);i=f;return}function tx(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;j=(a[(c[7118]|0)+16|0]&1)!=0?179864:74128;cf(c[10028]|0,212640,(v=i,i=i+8|0,c[v>>2]=j,v)|0);if((c[5163]|0)==103){k=c[10028]|0;cf(k|0,212480,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}k=e|0;l=c[k>>2]|0;m=e+4|0;n=c[m>>2]|0;cf(c[10028]|0,212456,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=l,c[v+16>>2]=n,v)|0);n=(c[e+12>>2]|0)-(c[k>>2]|0)|0;k=(c[e+16>>2]|0)-(c[m>>2]|0)|0;cf(c[10028]|0,212400,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=n,c[v+16>>2]=k,v)|0);k=g&65535;cf(c[10028]|0,212384,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=b,c[v+16>>2]=d,c[v+24>>2]=k,v)|0);cf(c[10028]|0,212328,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=b,c[v+16>>2]=d,v)|0);g=c[10028]|0;if((a[(c[7118]|0)+16|0]&1)==0){aI(211992,36,1,g|0)}else{n=(aa(aa(aa(d,b),k),(f|0)==1?3:1)+7|0)>>>3;cf(g|0,212216,(v=i,i=i+8|0,c[v>>2]=n,v)|0);n=c[10028]|0;aI(212128,41,1,n|0)}n=c[10028]|0;if((f|0)==1){cf(n|0,211968,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=j,v)|0);i=h;return}else{cf(n|0,211952,(v=i,i=i+8|0,c[v>>2]=j,v)|0);i=h;return}}function ty(){aK(208808,c[10028]|0);aK(208736,c[10028]|0);aK(208680,c[10028]|0);aK(208648,c[10028]|0);aK(208592,c[10028]|0);aK(208408,c[10028]|0);aK(208344,c[10028]|0);aK(208256,c[10028]|0);aK(208200,c[10028]|0);aK(208152,c[10028]|0);aK(208136,c[10028]|0);aK(208080,c[10028]|0);aK(208024,c[10028]|0);aK(207952,c[10028]|0);return}function tz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=(aY(b|0,215352)|0)==0?77280:b;b=231040;while(1){f=c[b>>2]|0;if((f|0)==0){break}if((aY(c[f>>2]|0,e|0)|0)==0){g=20276;break}else{b=f+4|0}}if((g|0)==20276){i=d;return}if((cy(e|0,215312)|0)!=0){i=d;return}g=ut(8)|0;do{if((g|0)==0){gk();b=ut(8)|0;if((b|0)!=0){h=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215288,v)|0)}else{h=g}}while(0);if((e|0)==0){j=0}else{j=bP(e|0)|0}e=h;c[e>>2]=j;c[h+4>>2]=c[57760];c[57760]=h;h=c[11252]|0;if((h|0)==5){k=214984}else if((h|0)==13){k=214760}else if((h|0)==9){k=214840}else if((h|0)==1|(h|0)==15){k=215232}else if((h|0)==10){k=214816}else if((h|0)==4){k=215016}else if((h|0)==2){k=215152}else if((h|0)==7){k=214920}else if((h|0)==6){k=214944}else if((h|0)==3|(h|0)==11){k=215072}else if((h|0)==12){k=214864}else{i=d;return}if(a[237912]|0){h=c[10028]|0;aI(215624,3,1,h|0);a[237912]=0}cf(c[10028]|0,214648,(v=i,i=i+16|0,c[v>>2]=c[e>>2],c[v+8>>2]=k,v)|0);i=d;return}function tA(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;cf(c[10028]|0,208848,(v=i,i=i+8|0,c[v>>2]=b,v)|0);if((e|0)<=0){j=c[10028]|0;k=aI(208840,6,1,j|0)|0;i=g;return}l=(uA(b|0)|0)+4|0;b=0;while(1){be(25336,141840,(v=i,i=i+8|0,h[v>>3]=+(~~(+h[(d+(b<<5)|0)+f>>3]*1.0e4+.5)|0)*1.0e-4,v)|0);m=(a[25336]|0)==48&(a[25337]|0)==46?25337:25336;n=(l+1|0)+(uA(m|0)|0)|0;if((n|0)>77){o=c[10028]|0;aI(152656,3,1,o|0);p=(uA(m|0)|0)+3|0}else{p=n}cf(c[10028]|0,73368,(v=i,i=i+8|0,c[v>>2]=m,v)|0);m=b+1|0;if((m|0)<(e|0)){l=p;b=m}else{break}}j=c[10028]|0;k=aI(208840,6,1,j|0)|0;i=g;return}function tB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0.0;f=i;if((a[37456]&1)!=0){pO(b,d,e);i=f;return}if((a[e]|0)==0){i=f;return}if((c[7116]|0)!=0){j=c[10028]|0;aI(215952,7,1,j|0);c[7116]=0;a[228944]=0}pG(b,d);d=c[7230]|0;if((d|0)!=0){b=c[10028]|0;cf(b|0,199456,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}aI(199448,2,1,c[10028]|0);h[5612]=-1.0e3;h[5611]=1.0e3;h[5613]=+g[(c[7118]|0)+92>>2]*10.0;uF(44912,199440,16);a[237912]=0;d=e;do{e=lJ(d,1,28840,+g[7208]*+g[(c[7118]|0)+92>>2]*10.0,0.0,1,1,0)|0;b=a[e]|0;if(b<<24>>24==0){break}if(a[237912]|0){j=c[10028]|0;aI(215624,3,1,j|0);a[237912]=0;k=a[e]|0}else{k=b}if(k<<24>>24==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=e+1|0;}while((a[d]|0)!=0);l=+h[5611]+ +h[5612];h[5612]=l;cf(c[10028]|0,199384,(v=i,i=i+8|0,h[v>>3]=(-0.0-l)/3.0,v)|0);d=c[7198]|0;if((d|0)==1){k=c[10028]|0;aI(199288,7,1,k|0)}else if((d|0)==0){aI(199360,7,1,c[10028]|0)}else if((d|0)==2){aI(199240,7,1,c[10028]|0)}if((c[7230]|0)!=0){d=c[10028]|0;aI(212688,9,1,d|0)}c[7116]=0;a[228944]=0;i=f;return}function tC(b){b=b|0;var d=0,e=0,f=0.0,h=0.0,j=0,k=0.0;d=i;if((a[37456]&1)!=0){pL(b);i=d;return 1}if((a[b]|0)==0){e=(c[7118]|0)+36|0;uB(28840,e|0);f=+g[7202];g[7208]=f;h=f}else{e=bk(b|0,148464)|0;if((e|0)!=0&e>>>0<51){uF(28840,b|0,e|0);a[e+28840|0]=0;tz(28840)}g[7208]=+g[7202];j=b+(e+1|0)|0;ca(j|0,205104,(v=i,i=i+8|0,c[v>>2]=28832,v)|0);h=+g[7208]}f=+g[(c[7118]|0)+92>>2];k=h*f;c[(c[3524]|0)+16>>2]=~~(k*f*10.0);c[(c[3524]|0)+20>>2]=~~(k*+g[(c[7118]|0)+92>>2]*10.0*6.0/10.0);i=d;return 1}function tD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=i;i=i+520|0;f=e|0;g=e+256|0;if((b|0)==0){i=e;return}h=g|0;a[h]=0;j=e+264|0;a[j]=0;if(d){k=c[10028]|0;l=b+4|0;n=c[l>>2]|0;cf(k|0,197960,(v=i,i=i+8|0,c[v>>2]=n,v)|0);o=l}else{o=b+4|0}l=c[o>>2]|0;do{if((a[l]|0)!=60){n=uA(l|0)|0;if(n>>>0>3){k=l+(n-3|0)|0;uB(h|0,k|0)}else{uB(h|0,l|0)}a[h]=uI(a[h]|0|0)&255;k=g+1|0;a[k]=uI(a[k]|0|0)&255;k=g+2|0;a[k]=uI(a[k]|0|0)&255;if((c[b+8>>2]|0)!=0){break}uf(-1,219072,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}}while(0);L27092:do{if((a[h]|0)==0){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=(c[o>>2]|0)+1|0;uB(j|0,g|0);g=bt(j|0,193632)|0;if((g|0)!=0){p=g;q=1;break}uf(-1,219160,(v=i,i=i+8|0,c[v>>2]=(c[o>>2]|0)+1,v)|0)}else{do{if((aY(h|0,197944)|0)!=0){if((aY(h|0,197896)|0)==0){break}if((aY(h|0,197648)|0)!=0){if((aY(h|0,197488)|0)!=0){uh(-1,197360,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}g=bF(c[b+8>>2]|0,193632)|0;if((g|0)!=0){p=g;q=0;break L27092}uf(-1,219072,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=bU(197624)|0;l=c[b+8>>2]|0;if((g|0)==0){be(j|0,197560,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}else{be(j|0,g|0,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}if((a[j]|0)==0){uf(-1,197496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=bt(j|0,193632)|0;if((l|0)!=0){p=l;q=1;break L27092}uf(-1,197672,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}}while(0);if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=bU(197856)|0;g=c[b+8>>2]|0;if((l|0)==0){be(j|0,197784,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}else{be(j|0,l|0,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}if((a[j]|0)==0){uf(-1,197704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=bt(j|0,193632)|0;if((g|0)!=0){p=g;q=1;break}uf(-1,197672,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}}while(0);h=f|0;L27133:do{if((a6(h|0,255,p|0)|0)==0){r=0;s=0;t=20384}else{g=f+1|0;l=b+12|0;k=b+8|0;n=0;u=0;L27135:while(1){do{if((u|0)==0){if((a_(h|0,197328,14)|0)==0){break}if((a_(h|0,197304,11)|0)==0){break}if(q){uh(-1,197240,(v=i,i=i+8|0,c[v>>2]=j,v)|0);break}else{uh(-1,197192,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0);break}}}while(0);do{if((a_(h|0,197176,9)|0)==0){w=(uA(h|0)|0)-9|0;x=ut(w)|0;if((x|0)==0){gk();y=ut(w)|0;if((y|0)==0){break L27135}else{z=y}}else{z=x}x=(a8(g|0,47)|0)+1|0;uB(z|0,x|0);a[a8(z|0,32)|0]=0;if((z|0)==0){A=0}else{A=bP(z|0)|0}c[l>>2]=A;if(d){B=z;t=20382;break}x=c[k>>2]|0;y=c[m>>2]|0;w=c[o>>2]|0;if((x|0)==0){cf(y|0,197016,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=z,v)|0)}else{cf(y|0,197104,(v=i,i=i+24|0,c[v>>2]=w,c[v+8>>2]=z,c[v+16>>2]=x,v)|0)}if(q){C=z;t=20381}else{D=z;E=u;t=20387;break L27133}}else{C=n;t=20381}}while(0);if((t|0)==20381){t=0;if(d){B=C;t=20382}else{F=C}}if((t|0)==20382){t=0;x=c[10028]|0;aK(h|0,x|0);F=B}x=u+1|0;if((a6(h|0,255,p|0)|0)==0){r=F;s=x;t=20384;break L27133}else{n=F;u=x}}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197160,v)|0)}}while(0);do{if((t|0)==20384){if(!q){D=r;E=s;t=20387;break}F=a2(p|0)|0;if((F|0)==0){G=r;H=s;break}uf(-1,196840,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=F,v)|0)}}while(0);if((t|0)==20387){az(p|0);G=D;H=E}if((H|0)==0){if(q){uf(-1,218792,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}else{uf(-1,218744,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}}do{if(d){o=c[10028]|0;aI(196784,13,1,o|0);if((G|0)==0){i=e;return}if((aY(G|0,196752)|0)!=0){break}o=c[10028]|0;aI(196648,32,1,o|0);o=c[10028]|0;aI(196568,57,1,o|0);o=c[10028]|0;aI(196488,70,1,o|0);o=c[10028]|0;aI(196456,31,1,o|0);o=c[10028]|0;aI(196784,13,1,o|0);t=20396}else{t=20396}}while(0);do{if((t|0)==20396){if((G|0)!=0){break}i=e;return}}while(0);uu(G);i=e;return}function tE(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;d=i;e=bP(195896|0)|0;f=c[57238]|0;if((f|0)==0){g=20410}else{h=uA(f|0)|0;f=(h+4|0)+(uA(b|0)|0)|0;h=ut(f)|0;do{if((h|0)==0){gk();j=ut(f)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=195784,v)|0);return 0}else{k=h}}while(0);h=c[57238]|0;uB(k|0,h|0);h=uA(k|0)|0;f=(h|0)==0?0:h-1|0;h=a[k+f|0]|0;if(!((h<<24>>24|0)==47|(h<<24>>24|0)==0)){a[k+(f+1|0)|0]=47;a[k+(f+2|0)|0]=0}uC(k|0,b|0);f=bF(k|0,193632|0)|0;uu(k);if((f|0)==0){g=20410}else{l=f}}do{if((g|0)==20410){f=bU(195768|0)|0;if((f|0)!=0){k=uA(f|0)|0;h=(k+4|0)+(uA(b|0)|0)|0;k=ut(h)|0;do{if((k|0)==0){gk();j=ut(h)|0;if((j|0)!=0){n=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=195784,v)|0);return 0}else{n=k}}while(0);uB(n|0,f|0);k=uA(n|0)|0;h=(k|0)==0?0:k-1|0;k=a[n+h|0]|0;if(!((k<<24>>24|0)==47|(k<<24>>24|0)==0)){a[n+(h+1|0)|0]=47;a[n+(h+2|0)|0]=0}uC(n|0,b|0);h=bF(n|0,193632|0)|0;uu(n);if((h|0)!=0){l=h;break}}h=uA(e|0)|0;k=(h+4|0)+(uA(b|0)|0)|0;h=ut(k)|0;do{if((h|0)==0){gk();j=ut(k)|0;if((j|0)!=0){o=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=195784,v)|0);return 0}else{o=h}}while(0);uB(o|0,e|0);h=uA(o|0)|0;k=(h|0)==0?0:h-1|0;h=a[o+k|0]|0;if(!((h<<24>>24|0)==47|(h<<24>>24|0)==0)){a[o+(k+1|0)|0]=47;a[o+(k+2|0)|0]=0}uC(o|0,b|0);k=bF(o|0,193632|0)|0;uu(o);uu(e);if((k|0)!=0){p=k;i=d;return p|0}k=hA(b,193632)|0;if((k|0)==0){h=c[m>>2]|0;cf(h|0,195704|0,(v=i,i=i+8|0,c[v>>2]=b,v)|0);uq(2,0);h=c[m>>2]|0;cf(h|0,195600|0,(v=i,i=i+8|0,c[v>>2]=b,v)|0);h=c[m>>2]|0;aI(195528|0,49,1,h|0);h=c[m>>2]|0;aI(195448|0,34,1,h|0);uf(-1,195432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{p=k;i=d;return p|0}}}while(0);uu(e);p=l;i=d;return p|0}function tF(){var b=0,d=0,e=0,f=0,j=0,k=0.0,l=0,m=0,n=0;b=i;if(!(a[34544]&a[34552])){i=b;return}d=c[8618]|0;if((d|0)==34464){i=b;return}else{e=1;f=d}while(1){j=e+1|0;d=c[f+8>>2]|0;if((d|0)==34464){break}else{e=j;f=d}}if((e|0)<=0){i=b;return}cf(c[10030]|0,183280,(v=i,i=i+32|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34336,c[v+16>>2]=34272,c[v+24>>2]=34192,v)|0);cf(c[10030]|0,183648,(v=i,i=i+8|0,c[v>>2]=j,v)|0);e=0;f=34464;while(1){if((e&3|0)==0){d=c[10030]|0;aI(73904,3,1,d|0)}k=+g[f+4>>2];cf(c[10030]|0,183624,(v=i,i=i+16|0,h[v>>3]=+g[f>>2],h[v+8>>3]=k,v)|0);d=e+1|0;if((d|0)<(j|0)){e=d;f=c[f+8>>2]|0}else{break}}aI(183600,4,1,c[10030]|0);f=(c[8566]|0)+1|0;L27243:do{if(a[34544]&a[34552]){e=0;while(1){if((e|0)>=20){break L27243}l=34564+(e<<3)|0;j=c[l>>2]|0;m=(j|0)==0;n=(j|0)==(f|0);if(m|n){break}else{e=e+1|0}}j=34560+(e<<3)|0;if(m){c[l>>2]=f;c[j>>2]=0;break}if(!n){break}c[j>>2]=1}}while(0);a[34336]=0;a[34272]=0;a[34192]=0;n=c[8619]|0;g[8616]=+g[n>>2];g[8617]=+g[n+4>>2];if((n|0)!=34464){f=n;do{n=c[f+12>>2]|0;c[8619]=n;c[n+8>>2]=34464;uu(f);f=c[8619]|0;}while((f|0)!=34464)}c[8619]=34464;c[8618]=34464;i=b;return}function tG(){var a=0,b=0,d=0,e=0,f=0,g=0;aF(230,c[10030]|0);a=c[58576]|0;aF(a>>>8|0,c[10030]|0);aF(a|0,c[10030]|0);if((c[58576]|0)==0){c[58576]=0;b=c[10030]|0;d=aF(234,b|0)|0;e=c[10030]|0;f=aF(15,e|0)|0;return}else{g=0}do{a=c[233888+(g<<2)>>2]|0;aF(a>>>8|0,c[10030]|0);aF(a|0,c[10030]|0);a=c[233488+(g<<2)>>2]|0;aF(a>>>8|0,c[10030]|0);aF(a|0,c[10030]|0);g=g+1|0;}while(g>>>0<(c[58576]|0)>>>0);c[58576]=0;b=c[10030]|0;d=aF(234,b|0)|0;e=c[10030]|0;f=aF(15,e|0)|0;return}function tH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0;f=i;g=~~(+h[29420]*106.0*.5);if((e|0)==(-3|0)){o1(b,d);j=c[10030]|0;aI(125976,2,1,j|0);a[235520]=0;j=c[10030]|0;k=+(g|0)*3.0*.25;cf(j|0,179248,(v=i,i=i+8|0,h[v>>3]=k,v)|0);i=f;return}else if((e|0)==(-15|0)){j=b-g|0;l=d-g|0;o1(j,l);k=+(b>>>0>>>0);m=+(g|0);n=m*4.242640687119286*.125;o=~~(k-n);p=+(d>>>0>>>0);q=~~(p-n);o2(o,q);r=m*1.4142135623730951*.5;o1(~~(k+r),~~(p-r));s=~~(k+n);o2(s,q);q=g+b|0;t=g+d|0;o1(q,t);u=~~(p+n);o2(s,u);o1(~~(k-r),~~(p+r));o2(o,u);o1(j,d);j=(g*3&-1|0)/4&-1;o2(b-j|0,d);o1(j+b|0,d);o2(q,d);o1(b,l);o2(b,d-j|0);o1(b,j+d|0);o2(b,t);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=m*3.0*.25,v)|0);i=f;return}else if((e|0)==(-7|0)){m=+(b>>>0>>>0);r=+(g|0);p=r*1.4142135623730951*.5;t=~~(m-p);k=+(d>>>0>>>0);j=~~(k-p);o1(t,j);n=r*4.242640687119286*.125;l=~~(m-n);q=~~(k-n);o2(l,q);u=~~(m+p);o1(u,j);j=~~(m+n);o2(j,q);q=~~(k+p);o1(u,q);u=~~(k+n);o2(j,u);o1(t,q);o2(l,u);o1(b-g|0,d);u=(g*3&-1|0)/4&-1;o2(b-u|0,d);o1(u+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-u|0);o1(b,u+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=r*3.0*.25,v)|0);i=f;return}else if((e|0)==(-12|0)){r=+(b>>>0>>>0);n=+(g|0);k=n*1.4142135623730951*.5;p=+(d>>>0>>>0);u=~~(p+k);o1(~~(r+k),u);m=n*4.242640687119286*.125;l=~~(p+m);o2(~~(r+m),l);o1(~~(r-k),u);o2(~~(r-m),l);o1(b-g|0,d);l=(g*3&-1|0)/4&-1;o2(b-l|0,d);o1(l+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-l|0);o1(b,l+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;m=n*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=m,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=m,v)|0);i=f;return}else if((e|0)==(-19|0)){l=d-g|0;o1(b,l);u=(g|0)/2&-1;o2(b,d-u|0);o1(b,u+d|0);o2(b,g+d|0);o1(b,l);u=(g|0)/4&-1;q=d-((g*3&-1|0)/4&-1)|0;o2(b-u|0,q);o1(b,l);o2(u+b|0,q);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*.5,v)|0);i=f;return}else if((e|0)==(-16|0)){q=b-g|0;o1(q,d-g|0);m=+(b>>>0>>>0);n=+(g|0);r=n*4.242640687119286*.125;u=~~(m-r);k=+(d>>>0>>>0);o2(u,~~(k-r));l=g+b|0;t=g+d|0;o1(l,t);j=~~(k+r);o2(~~(m+r),j);r=n*1.4142135623730951*.5;o1(~~(m-r),~~(k+r));o2(u,j);o1(q,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(l,d);o1(b,q+d|0);o2(b,t);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=n*3.0*.25,v)|0);i=f;return}else if((e|0)==(-10|0)){o1(b-g|0,d);t=(g*3&-1|0)/4&-1;o2(b-t|0,d);o1(t+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-t|0);o1(b,t+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;n=+(g|0)*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=n,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=n,v)|0);i=f;return}else if((e|0)==(-2|0)){o1(b-g|0,d);t=(g*3&-1|0)/4&-1;q=b-t|0;o2(q,d);l=t+b|0;o1(l,d);o2(g+b|0,d);o1(b,d-g|0);j=d-t|0;o2(b,j);u=t+d|0;o1(b,u);o2(b,g+d|0);o1(q,j);o2(l,j);o2(l,u);o2(q,u);o2(q,j);j=(g|0)/2&-1;q=j+d|0;o1(b-j|0,q);o2(b,d-j|0);o2(j+b|0,q);i=f;return}else if((e|0)==(-20|0)){o1(b-g|0,d-g|0);o2(g+b|0,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-13|0)){o1(b-g|0,d-g|0);n=+(b>>>0>>>0);r=+(g|0);k=r*4.242640687119286*.125;m=+(d>>>0>>>0);o2(~~(n-k),~~(m-k));o1(g+b|0,g+d|0);o2(~~(n+k),~~(m+k));o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=r*3.0*.25,v)|0);i=f;return}else if((e|0)==(-14|0)){q=b-g|0;j=d-g|0;o1(q,j);r=+(b>>>0>>>0);k=+(g|0);m=k*4.242640687119286*.125;u=~~(r-m);n=+(d>>>0>>>0);l=~~(n-m);o2(u,l);p=k*1.4142135623730951*.5;o1(~~(r+p),~~(n-p));t=~~(r+m);o2(t,l);l=g+b|0;o=g+d|0;o1(l,o);s=~~(n+m);o2(t,s);o1(~~(r-p),~~(n+p));o2(u,s);o1(q,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(l,d);o1(b,j);o2(b,d-q|0);o1(b,q+d|0);o2(b,o);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=k*3.0*.25,v)|0);i=f;return}else if((e|0)==(-4|0)){o1(b-g|0,d);o=(g*3&-1|0)/4&-1;o2(b-o|0,d);o1(o+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-o|0);o1(b,o+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-6|0)){k=+(b>>>0>>>0);p=+(g|0);n=p*1.4142135623730951*.5;o=~~(k-n);r=+(d>>>0>>>0);q=~~(r-n);o1(o,q);m=p*4.242640687119286*.125;j=~~(k-m);l=~~(r-m);o2(j,l);s=~~(k+n);o1(s,q);q=~~(k+m);o2(q,l);l=~~(r+n);o1(s,l);s=~~(r+m);o2(q,s);o1(o,l);o2(j,s);o1(b-g|0,d);s=(g*3&-1|0)/4&-1;o2(b-s|0,d);o1(s+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-s|0);o1(b,s+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=p*3.0*.25,v)|0);i=f;return}else if((e|0)==(-5|0)){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-9|0)){p=+(b>>>0>>>0);m=+(g|0);r=m*1.4142135623730951*.5;s=~~(p-r);n=+(d>>>0>>>0);j=~~(n-r);o1(s,j);k=m*4.242640687119286*.125;l=~~(p-k);o=~~(n-k);o2(l,o);q=~~(p+r);o1(q,j);j=~~(p+k);o2(j,o);o=~~(n+r);o1(q,o);q=~~(n+k);o2(j,q);o1(s,o);o2(l,q);o1(b-g|0,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-q|0);o1(b,q+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;k=m*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=k,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=k,v)|0);i=f;return}else if((e|0)==(-18|0)){o1(b-g|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-17|0)){q=b-g|0;l=d-g|0;o1(q,l);k=+(b>>>0>>>0);m=+(g|0);n=m*4.242640687119286*.125;o=~~(k-n);r=+(d>>>0>>>0);s=~~(r-n);o2(o,s);p=m*1.4142135623730951*.5;o1(~~(k+p),~~(r-p));j=~~(k+n);o2(j,s);s=g+b|0;u=g+d|0;o1(s,u);t=~~(r+n);o2(j,t);o1(~~(k-p),~~(r+p));o2(o,t);o1(q,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(s,d);o1(b,l);o2(b,d-q|0);o1(b,q+d|0);o2(b,u);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;p=m*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=p,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=p,v)|0);i=f;return}else if((e|0)==(-8|0)){p=+(b>>>0>>>0);m=+(g|0);r=m*1.4142135623730951*.5;k=+(d>>>0>>>0);u=~~(k+r);o1(~~(p+r),u);n=m*4.242640687119286*.125;q=~~(k+n);o2(~~(p+n),q);o1(~~(p-r),u);o2(~~(p-n),q);o1(b-g|0,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(g+b|0,d);o1(b,q+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=m*3.0*.25,v)|0);i=f;return}else if((e|0)==(-11|0)){m=+(b>>>0>>>0);n=+(g|0);p=n*1.4142135623730951*.5;r=+(d>>>0>>>0);e=~~(r+p);o1(~~(m+p),e);k=n*4.242640687119286*.125;q=~~(r+k);o2(~~(m+k),q);o1(~~(m-p),e);o2(~~(m-k),q);o1(b-g|0,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-q|0);o1(b,q+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=n*3.0*.25,v)|0);i=f;return}else{o1(b,d);o2(b,d);i=f;return}}function tI(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;d=c[59128]|0;e=(c[d+8>>2]|0)-1|0;f=c[(c[d+16>>2]|0)+(e<<2)>>2]|0;g=c[(c[d+20>>2]|0)+(e<<2)>>2]|0;tJ(d);d=c[59128]|0;e=c[d>>2]|0;h=c[d+4>>2]|0;j=h<<1;k=c[d+12>>2]|0;d=ut(28)|0;do{if((d|0)==0){gk();l=ut(28)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{m=d}}while(0);d=m;l=m;c[l>>2]=e;c[m+12>>2]=k;c[m+4>>2]=j;c[m+8>>2]=0;k=h<<3;h=ut(k)|0;do{if((h|0)==0){gk();e=ut(k)|0;if((e|0)!=0){n=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{n=h}}while(0);h=m+16|0;c[h>>2]=n;n=ut(k)|0;do{if((n|0)==0){gk();e=ut(k)|0;if((e|0)!=0){o=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{o=n}}while(0);n=m+20|0;c[n>>2]=o;o=ut(j)|0;do{if((o|0)==0){gk();k=ut(j)|0;if((k|0)!=0){p=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{p=o}}while(0);c[m+24>>2]=p;do{if((c[h>>2]|0)!=0){if((c[n>>2]|0)==0){break}uE(p|0,0,j|0);if((m|0)==0){break}o=c[59128]|0;c[236448+(c[l>>2]<<2)>>2]=d;if((c[l>>2]|0)==0){c[59113]=d;c[59115]=d}c[59128]=d;uu(c[o+16>>2]|0);uu(c[o+20>>2]|0);uu(c[o+24>>2]|0);uu(o)}}while(0);c[c[(c[59128]|0)+16>>2]>>2]=f;c[c[(c[59128]|0)+20>>2]>>2]=g;a[c[(c[59128]|0)+24>>2]|0]=1;c[(c[59128]|0)+8>>2]=1;c[59100]=(c[59100]|0)+1;i=b;return}function tJ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=i;e=b+8|0;if((c[e>>2]|0)==0){i=d;return}f=c[b+16>>2]|0;g=c[b+20>>2]|0;h=c[b+24>>2]|0;if(a[236440]|0){j=c[10030]|0;aI(174600,4,1,j|0);a[236440]=0}j=b+12|0;b=c[j>>2]|0;do{if((c[59108]|0)!=(b|0)){if((c[e>>2]|0)<=1){if((a[h]&1)!=0){break}}k=c[10030]|0;cf(k|0,174584,(v=i,i=i+8|0,c[v>>2]=b,v)|0);c[59108]=c[j>>2]}}while(0);aI(174520,3,1,c[10030]|0);j=(c[f>>2]|0)-(c[59098]|0)|0;b=(c[g>>2]|0)-(c[59096]|0)|0;k=c[10030]|0;if((j|0)>-17&(b|0)>-17&(j|0)<16&(b|0)<16){aF(106,k|0);l=1}else{aF(105,k|0);l=0}k=c[e>>2]|0;if((k|0)>0){m=b;b=j;j=0;n=l;l=k;while(1){k=(j|0)>0;if(k){o=j-1|0;p=(c[f+(j<<2)>>2]|0)-(c[f+(o<<2)>>2]|0)|0;q=(c[g+(j<<2)>>2]|0)-(c[g+(o<<2)>>2]|0)|0}else{p=b;q=m}L27354:do{if((p|q|0)==0){do{if(k){if((a[h+(j-1|0)|0]&1)!=0){break}if((a[h+j|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;r=n;s=p;t=q;break L27354}}while(0);if((a[h+j|0]&1)==0){u=p;w=q;x=20552;break}c[59104]=(c[59104]|0)+1;r=n;s=p;t=q}else{do{if(k){o=j+1|0;if((o|0)>=(l|0)){break}if((a[h+j|0]&1)==0){break}if((a[h+o|0]&1)==0){break}c[59104]=(c[59104]|0)+1;r=n;s=p;t=q;break L27354}}while(0);if((p|0)>-17&(q|0)>-17&(p|0)<16&(q|0)<16|k^1){u=p;w=q;x=20552;break}o=j+2|0;if((o|0)>=(l|0)){u=p;w=q;x=20552;break}if((a[h+j|0]&1)==0){u=p;w=q;x=20552;break}y=j+1|0;if((a[h+y|0]&1)!=0){u=p;w=q;x=20552;break}if((a[h+o|0]&1)==0){u=p;w=q;x=20552;break}o=f+(y<<2)|0;z=c[o>>2]|0;A=j-1|0;B=f+(A<<2)|0;C=z-(c[B>>2]|0)|0;if((C|0)<=-17){u=p;w=q;x=20552;break}D=g+(y<<2)|0;y=g+(A<<2)|0;A=(c[D>>2]|0)-(c[y>>2]|0)|0;if(!((A|0)>-17&(C|0)<16&(A|0)<16)){u=p;w=q;x=20552;break}A=f+(j<<2)|0;c[o>>2]=c[A>>2];c[A>>2]=z;z=c[D>>2]|0;o=g+(j<<2)|0;c[D>>2]=c[o>>2];c[o>>2]=z;u=(c[A>>2]|0)-(c[B>>2]|0)|0;w=z-(c[y>>2]|0)|0;x=20552}}while(0);do{if((x|0)==20552){x=0;if((u|0)>-17&(w|0)>-17&(u|0)<16&(w|0)<16){if(!n){k=c[10030]|0;aF(106,k|0)}if((a[h+j|0]&1)!=0){k=c[10030]|0;aF(97,k|0)}k=a[236552+(u+16|0)|0]|0;y=c[10030]|0;aF(k|0,y|0);y=a[236552+(w+16|0)|0]|0;k=c[10030]|0;aF(y|0,k|0);r=1;s=u;t=w;break}k=((u|0)>0?1:-1)+u|0;y=(k|0)/2&-1;z=((w|0)>0?1:-1)+w|0;B=(z|0)/2&-1;if(n&(k|0)>-34&(z|0)>-34&(k|0)<32&(z|0)<32){z=h+j|0;if((a[z]&1)!=0){k=c[10030]|0;aF(97,k|0)}k=a[236552+(y+16|0)|0]|0;A=c[10030]|0;aF(k|0,A|0);A=a[236552+(B+16|0)|0]|0;k=c[10030]|0;aF(A|0,k|0);if((a[z]&1)!=0){z=c[10030]|0;aF(97,z|0)}z=a[236552+((u+16|0)-y|0)|0]|0;y=c[10030]|0;aF(z|0,y|0);y=a[236552+((w+16|0)-B|0)|0]|0;B=c[10030]|0;aF(y|0,B|0);r=1;s=u;t=w;break}else{if(n){B=c[10030]|0;aF(105,B|0)}if((a[h+j|0]&1)!=0){B=c[10030]|0;aF(97,B|0)}B=f+(j<<2)|0;y=a[236520+(c[B>>2]>>5)|0]|0;z=c[10030]|0;aF(y|0,z|0);z=a[236520+(c[B>>2]&31)|0]|0;B=c[10030]|0;aF(z|0,B|0);B=g+(j<<2)|0;z=a[236520+(c[B>>2]>>5)|0]|0;y=c[10030]|0;aF(z|0,y|0);y=a[236520+(c[B>>2]&31)|0]|0;B=c[10030]|0;aF(y|0,B|0);r=0;s=u;t=w;break}}}while(0);B=j+1|0;y=c[e>>2]|0;if((B|0)<(y|0)){m=t;b=s;j=B;n=r;l=y}else{break}}}aF(90,c[10030]|0);c[59098]=c[f+((c[e>>2]|0)-1<<2)>>2];c[59096]=c[g+((c[e>>2]|0)-1<<2)>>2];c[e>>2]=0;i=d;return}function tK(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;d=i;if((b|0)!=1){a[237104]=0;i=d;return}b=c[59356]|0;e=a[237432]&1;f=c[59354]|0;j=c[59352]|0;k=c[59350]|0;l=c[59346]|0;m=a[237392]<<31>>31;n=+g[59360];o=c[59280]|0;cf(c[10030]|0,174184,(v=i,i=i+128|0,c[v>>2]=2,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=f,c[v+32>>2]=j,c[v+40>>2]=k,c[v+48>>2]=l,c[v+56>>2]=0,c[v+64>>2]=m,h[v+72>>3]=n,c[v+80>>2]=0,c[v+88>>2]=(b|0)==2&1,c[v+96>>2]=0,c[v+104>>2]=0,c[v+112>>2]=0,c[v+120>>2]=o,v)|0);do{if((c[59280]|0)>0){o=0;b=0;while(1){m=c[59282]|0;l=c[m+(b<<3)+4>>2]|0;cf(c[10030]|0,174136,(v=i,i=i+16|0,c[v>>2]=c[m+(b<<3)>>2],c[v+8>>2]=l,v)|0);l=o+1|0;do{if((o|0)>4){if((b|0)==((c[59280]|0)-1|0)){p=l;break}m=c[10030]|0;aI(84248,2,1,m|0);p=0}else{p=l}}while(0);l=b+1|0;if((l|0)<(c[59280]|0)){o=p;b=l}else{break}}if((p|0)==0){break}aF(10,c[10030]|0)}}while(0);uu(c[59282]|0);c[59282]=0;a[237104]=0;i=d;return}function tL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0;d=i;i=i+8|0;e=d|0;f=e;c[11554]=b;if((b|0)>-1){g=(b|0)%5&-1}else{g=b}b=(g|0)==-1?2:g;g=(b|0)>0&a[46232];j=e;k=f+3|0;a[k]=0;l=f+2|0;a[l]=0;m=f+1|0;a[m]=0;a[j]=37;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=12;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=-128;a[l]=0;a[m]=0;a[j]=7;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=40;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=12;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=0;a[l]=0;a[m]=0;a[j]=1;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=38;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=28;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=0;a[l]=0;a[m]=0;a[j]=1;aI(j|0,1,4,c[10030]|0);f=a[45616]|0;a[k]=0;a[l]=0;a[m]=f?0:34;a[j]=0;aI(j|0,1,4,c[10030]|0);f=~~(+h[5705]*26.37);a[k]=f>>>24&255;a[l]=f>>>16&255;a[m]=f>>>8&255;a[j]=f&255;aI(j|0,1,4,c[10030]|0);c[e>>2]=0;aI(j|0,1,4,c[10030]|0);e=c[11562]|0;a[k]=e>>>24&255;a[l]=e>>>16&255;a[m]=e>>>8&255;a[j]=e&255;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=37;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=12;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=0;a[l]=0;a[m]=0;a[j]=1;aI(j|0,1,4,c[10030]|0);j=(c[3524]|0)+60|0;if(g){c[j>>2]=78;g=b<<3;n=+h[5778];c[11282]=~~(+(c[238880+(g-8<<2)>>2]|0)*n*26.37);b=~~(+(c[238880+(g-7<<2)>>2]|0)*n*26.37);c[11283]=b;c[11284]=~~(+(c[238880+(g-6<<2)>>2]|0)*n*26.37);c[11285]=~~(+(c[238880+(g-5<<2)>>2]|0)*n*26.37);c[11286]=~~(+(c[238880+(g-4<<2)>>2]|0)*n*26.37);c[11287]=~~(+(c[238880+(g-3<<2)>>2]|0)*n*26.37);c[11288]=~~(+(c[238880+(g-2<<2)>>2]|0)*n*26.37);c[11289]=~~(+(c[238880+(g-1<<2)>>2]|0)*n*26.37);c[11292]=b;c[11290]=1;c[11552]=0;i=d;return}else{c[j>>2]=48;c[11552]=0;i=d;return}}function tM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0;d=i;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>a>>>0){if((c[e+12>>2]|0)>>>0<=b>>>0){f=20596}}else{f=20596}if((f|0)==20596){uh(-1,171568,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0)}e=c[11298]|0;g=a-e|0;h=c[11296]|0;j=b-h|0;k=(g|0)>-1?g:-g|0;l=j*10&-1;m=(l|0)>-1?l:-l|0;l=k*10&-1;do{if((l|0)<(m|0)){n=((((aa((k*25&-1|0)/(m|0)&-1,k)|0)/6&-1)*5&-1)+((m|0)/2&-1)|0)/5&-1}else{if((k|0)==0){i=d;return}else{n=(aa((m|0)/(k|0)&-1,(m|0)/24&-1)+l|0)/10&-1;break}}}while(0);l=c[11292]|0;m=c[11290]|0;if((n|0)>(l|0)){k=n;o=l;l=m;p=e;q=h;r=e;s=h;while(1){t=k-o|0;u=a-((aa(t,g)|0)/(n|0)&-1)|0;w=b-((aa(t,j)|0)/(n|0)&-1)|0;x=c[3524]|0;y=(c[x+8>>2]|0)>>>0>u>>>0;do{if((l&1|0)==0){if(y){if((c[x+12>>2]|0)>>>0>w>>>0){z=w;A=u;B=p;C=q;D=r;E=s}else{f=20614}}else{f=20614}if((f|0)==20614){f=0;uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=u,c[v+8>>2]=w,v)|0);F=c[3524]|0;G=c[F+8>>2]|0;H=c[F+12>>2]|0;F=c[11298]|0;I=c[11296]|0;z=H>>>0>w>>>0?w:H;A=G>>>0>u>>>0?u:G;B=F;C=I;D=F;E=I}if((A|0)==(B|0)&(z|0)==(C|0)){J=B;K=C;L=D;M=E;break}tN();c[11298]=A;c[11296]=z;J=A;K=z;L=A;M=z}else{if(y){if((c[x+12>>2]|0)>>>0>w>>>0){N=r;O=s}else{f=20605}}else{f=20605}if((f|0)==20605){f=0;uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=u,c[v+8>>2]=w,v)|0);N=c[11298]|0;O=c[11296]|0}if((N|0)==(u|0)&(O|0)==(w|0)){J=u;K=w;L=u;M=w;break}I=c[11560]|0;if((I<<1|0)>102){tN();P=c[11560]|0}else{P=I}if((P|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;Q=1}else{Q=P}I=Q<<1;c[45200+(I<<2)>>2]=u;c[11298]=u;c[45200+((I|1)<<2)>>2]=w;c[11296]=w;c[11560]=Q+1;J=u;K=w;L=u;M=w}}while(0);w=(c[11290]|0)+1|0;u=(w|0)>7?0:w;c[11290]=u;w=c[45128+(u<<2)>>2]|0;c[11292]=w;if((t|0)>(w|0)){k=t;o=w;l=u;p=J;q=K;r=L;s=M}else{R=t;S=J;T=K;U=u;break}}}else{R=n;S=e;T=h;U=m}m=c[3524]|0;h=(c[m+8>>2]|0)>>>0>a>>>0;do{if((U&1|0)==0){if(h){if((c[m+12>>2]|0)>>>0>b>>>0){V=b;W=a;X=S;Y=T}else{f=20630}}else{f=20630}if((f|0)==20630){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);e=c[3524]|0;n=c[e+8>>2]|0;K=c[e+12>>2]|0;V=K>>>0>b>>>0?b:K;W=n>>>0>a>>>0?a:n;X=c[11298]|0;Y=c[11296]|0}if((W|0)==(X|0)&(V|0)==(Y|0)){break}tN();c[11298]=W;c[11296]=V}else{if(h){if((c[m+12>>2]|0)>>>0>b>>>0){Z=S;_=T}else{f=20621}}else{f=20621}if((f|0)==20621){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);Z=c[11298]|0;_=c[11296]|0}if((Z|0)==(a|0)&(_|0)==(b|0)){break}n=c[11560]|0;if((n<<1|0)>102){tN();$=c[11560]|0}else{$=n}if(($|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ab=1}else{ab=$}n=ab<<1;c[45200+(n<<2)>>2]=a;c[11298]=a;c[45200+((n|1)<<2)>>2]=b;c[11296]=b;c[11560]=ab+1}}while(0);c[11292]=(c[11292]|0)-R;i=d;return}function tN(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+8|0;d=b|0;e=c[11560]|0;if((e|0)==0){i=b;return}if((c[11552]|0)>0){tL(c[11554]|0);c[11552]=0;f=c[11560]|0}else{f=e}e=d|0;g=d+3|0;a[g]=0;h=d+2|0;a[h]=0;j=d+1|0;a[j]=0;a[e]=27;aI(e|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;d=c[11300]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);do{if((f|0)<3){a[g]=0;a[h]=0;a[j]=0;a[e]=54;d=c[10030]|0;aI(e|0,1,4,d|0);a[g]=0;a[h]=0;a[j]=0;a[e]=16;d=c[10030]|0;aI(e|0,1,4,d|0);c[11294]=(c[11294]|0)+1;d=c[11302]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;d=c[10030]|0;aI(e|0,1,4,d|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11303]|0)|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;d=c[10030]|0;aI(e|0,1,4,d|0)}else{if((c[11560]<<1|0)>2){k=2}else{break}while(1){a[g]=0;a[h]=0;a[j]=0;a[e]=54;aI(e|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;d=c[45200+(k<<2)>>2]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=k+2|0;l=(c[(c[3524]|0)+12>>2]|0)-(c[45200+((k|1)<<2)>>2]|0)|0;a[g]=l>>>24&255;a[h]=l>>>16&255;a[j]=l>>>8&255;a[e]=l&255;aI(e|0,1,4,c[10030]|0);if((d|0)<(c[11560]<<1|0)){k=d}else{break}}}}while(0);c[11560]=0;i=b;return}function tO(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=i;i=i+8|0;d=b|0;e=d;f=i;i=i+32|0;if(!(a[45664]|0)){i=b;return}j=uA(45688)|0;k=j>>>0<31?j:31;j=aQ(45688,75096)|0;if((j|0)==0){l=aQ(45688,75048)|0;if((l|0)==0){m=1;n=-112;o=k}else{p=l;q=20651}}else{p=j;q=20651}if((q|0)==20651){j=p-45688|0;m=2;n=-68;o=(j|0)<(k|0)?j:k}k=aQ(45688,74992)|0;if((k|0)==0){j=aQ(45688,74976)|0;if((j|0)==0){r=0;s=o}else{t=j;q=20654}}else{t=k;q=20654}if((q|0)==20654){k=t-45688|0;r=1;s=(k|0)<(o|0)?k:o}o=aQ(45688,171536)|0;if((o|0)==0){k=aQ(45688,171480)|0;if((k|0)==0){u=0;v=s}else{w=k;q=20657}}else{w=o;q=20657}if((q|0)==20657){o=w-45688|0;u=1;v=(o|0)<(s|0)?o:s}s=aQ(45688,171448)|0;do{if((s|0)==0){o=aQ(45688,171424)|0;if((o|0)!=0){x=o;q=20661;break}o=aQ(45688,171408)|0;if((o|0)==0){y=0;z=v}else{x=o;q=20661}}else{x=s;q=20661}}while(0);if((q|0)==20661){q=x-45688|0;y=1;z=(q|0)<(v|0)?q:v}v=f|0;q=z+1|0;uF(v|0,45688,q|0);if((uA(45688)|0)>>>0>=q>>>0){a[f+((q|0)==0?0:z)|0]=0}z=d;q=e+3|0;a[q]=0;x=e+2|0;a[x]=0;s=e+1|0;a[s]=0;a[z]=37;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=12;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=-128;a[x]=0;a[s]=0;a[z]=10;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=40;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=12;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=0;a[x]=0;a[s]=0;a[z]=2;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=82;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=1;a[z]=76;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=0;a[x]=0;a[s]=0;a[z]=2;aI(z|0,1,4,c[10030]|0);e=~~(+h[5710]*(-0.0- +g[11418])*35.28);a[q]=e>>>24&255;a[x]=e>>>16&255;a[s]=e>>>8&255;a[z]=e&255;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);e=c[11262]|0;a[q]=e>>>24&255;a[x]=e>>>16&255;a[s]=e>>>8&255;a[z]=e&255;aI(z|0,1,4,c[10030]|0);e=c[11262]|0;a[q]=e>>>24&255;a[x]=e>>>16&255;a[s]=e>>>8&255;a[z]=e&255;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=m;a[z]=n;aI(z|0,1,4,c[10030]|0);aF(r|0,c[10030]|0);aF(u|0,c[10030]|0);aF(y|0,c[10030]|0);y=c[11252]|0;if((y|0)==9|(y|0)==2){u=c[10030]|0;aF(-18|0,u|0)}else if((y|0)==8){aF(-120|0,c[10030]|0)}else if((y|0)==11|(y|0)==3){aF(-94|0,c[10030]|0)}else if((y|0)==12|(y|0)==13){aF(-14|0,c[10030]|0)}else{aF(1,c[10030]|0)}aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);y=0;while(1){if(y>>>0<(uA(v|0)|0)>>>0){A=a[f+y|0]|0}else{A=0}aF(A|0,c[10030]|0);aF(0,c[10030]|0);u=y+1|0;if((u|0)<32){y=u}else{B=0;break}}while(1){if(B>>>0<(uA(v|0)|0)>>>0){C=a[f+B|0]|0}else{C=0}aF(C|0,c[10030]|0);aF(0,c[10030]|0);y=B+1|0;if((y|0)<64){B=y}else{D=0;break}}do{aF(0,c[10030]|0);aF(0,c[10030]|0);D=D+1|0;}while((D|0)<32);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=37;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=12;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=0;a[x]=0;a[s]=0;a[z]=2;aI(z|0,1,4,c[10030]|0);i=b;return}function tP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+8|0;d=b|0;if((c[11560]|0)==0){i=b;return}if((c[11552]|0)>0){tL(c[11554]|0);c[11552]=0}e=d|0;f=d+3|0;a[f]=0;g=d+2|0;a[g]=0;h=d+1|0;a[h]=0;a[e]=27;aI(e|0,1,4,c[10030]|0);a[f]=0;a[g]=0;a[h]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;d=c[11300]|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=2;while(1){j=(d|0)<(c[11560]<<1|0);a[f]=0;a[g]=0;a[h]=0;a[e]=54;aI(e|0,1,4,c[10030]|0);a[f]=0;a[g]=0;a[h]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;if(!j){break}j=c[45200+(d<<2)>>2]|0;a[f]=j>>>24&255;a[g]=j>>>16&255;a[h]=j>>>8&255;a[e]=j&255;aI(e|0,1,4,c[10030]|0);j=(c[(c[3524]|0)+12>>2]|0)-(c[45200+((d|1)<<2)>>2]|0)|0;a[f]=j>>>24&255;a[g]=j>>>16&255;a[h]=j>>>8&255;a[e]=j&255;aI(e|0,1,4,c[10030]|0);d=d+2|0}d=c[11300]|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);c[11560]=0;i=b;return}function tQ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+8|0;j=f|0;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}do{if((a[37456]&1)==0){if((cy(e|0,170608)|0)==0){break}k=c[3524]|0;if((c[k+8>>2]|0)>>>0>b>>>0){if((c[k+12>>2]|0)>>>0>d>>>0){l=d;m=b}else{n=20699}}else{n=20699}if((n|0)==20699){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);k=c[3524]|0;o=c[k+8>>2]|0;p=c[k+12>>2]|0;l=p>>>0>d>>>0?d:p;m=o>>>0>b>>>0?b:o}if(!((m|0)==(c[11298]|0)&(l|0)==(c[11296]|0))){tN();c[11298]=m;c[11296]=l}if((c[11280]|0)!=(c[11562]|0)){o=j|0;p=j+3|0;a[p]=0;k=j+2|0;a[k]=0;q=j+1|0;a[q]=0;a[o]=24;r=c[10030]|0;aI(o|0,1,4,r|0);a[p]=0;a[k]=0;a[q]=0;a[o]=12;r=c[10030]|0;aI(o|0,1,4,r|0);c[11294]=(c[11294]|0)+1;r=c[11562]|0;a[p]=r>>>24&255;a[k]=r>>>16&255;a[q]=r>>>8&255;a[o]=r&255;r=c[10030]|0;aI(o|0,1,4,r|0);c[11280]=c[11562]}h[5613]=1.0;uF(44912,170592,16);a[238232]=0;c[59556]=0;c[59562]=45688;g[59560]=+g[11418];if(((c[11414]|0)-1|0)>>>0<2){a[238208]=1}r=j|0;o=j+3|0;a[o]=0;q=j+2|0;a[q]=0;k=j+1|0;a[k]=0;a[r]=22;p=c[10030]|0;aI(r|0,1,4,p|0);a[o]=0;a[q]=0;a[k]=0;a[r]=12;p=c[10030]|0;aI(r|0,1,4,p|0);c[11294]=(c[11294]|0)+1;a[o]=0;a[q]=0;a[k]=0;a[r]=24;k=c[10030]|0;aI(r|0,1,4,k|0);k=e;do{r=lJ(k,1,c[59562]|0,+g[59560],0.0,1,1,0)|0;if((a[r]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[r]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=r+1|0;}while((a[k]|0)!=0);k=c[11414]|0;if((k-1|0)>>>0<2){r=(c[11298]|0)-b|0;if((c[11262]|0)==0){s=0}else{s=(c[11296]|0)-d|0}c[11414]=0;a[238208]=0;if((k|0)==2){tQ(b-r|0,d-s|0,e)}else if((k|0)==1){tQ(b-((r|0)/2&-1)|0,d-((s|0)/2&-1)|0,e)}c[11414]=k}tO();g[59564]=0.0;i=f;return}}while(0);n$(b,d,e);i=f;return}function tR(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;do{if((a[37456]&1)==0){if((cy(e|0,170608)|0)==0){break}h[5613]=1.0;a[238320]=0;uF(44912,216760,16);c[11678]=b;c[11674]=d;g=e;while(1){j=lJ(g,1,179864,1.0,0.0,1,1,0)|0;if((a[j]|0)==0){k=20745;break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[j]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=j+1|0;if((a[l]|0)==0){k=20743;break}else{g=l}}if((k|0)==20745){i=f;return}else if((k|0)==20743){i=f;return}}}while(0);g=uA(e|0)|0;l=c[11676]|0;if((g+b|0)>>>0>l>>>0){j=l-g|0;m=(j|0)<0?0:j}else{m=b}if(m>>>0<l>>>0){n=e;o=m;p=l}else{i=f;return}while(1){l=a[n]|0;if(l<<24>>24==0){k=20742;break}do{if(p>>>0<o>>>0|(c[11672]|0)>>>0<d>>>0){q=p}else{m=aa(p,d)+o|0;if((a[(c[11680]|0)+m|0]|0)>=5){q=p;break}a[(c[11684]|0)+m|0]=l;m=aa(c[11676]|0,d)+o|0;a[(c[11680]|0)+m|0]=5;q=c[11676]|0}}while(0);l=o+1|0;if(l>>>0<q>>>0){n=n+1|0;o=l;p=q}else{k=20744;break}}if((k|0)==20742){i=f;return}else if((k|0)==20744){i=f;return}}function tS(){var a=0,b=0,d=0;a=c[13656]|0;if((a|0)==0){return}b=c[13602]|0;tY(4,1,a<<1);if((a|0)>0){d=0;do{tZ(c[b+(d<<2)>>2]|0);d=d+1|0;}while((d|0)<(a|0))}c[13656]=0;return}function tT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((c[13642]|0)==(a|0)){return}c[13642]=a;tS();if((a|0)>8){b=(a|0)%9&-1}else{b=a}a=(c[3524]|0)+60|0;if((b|0)<1){c[a>>2]=106;return}c[a>>2]=80;a=b<<3;b=c[13624]|0;d=c[242808+(a-8<<2)>>2]|0;if((d|0)==0){e=0}else{e=(aa(d<<1,b)>>>0)/3>>>0}c[13570]=e;e=c[242808+(a-7<<2)>>2]|0;if((e|0)==0){f=0}else{f=(aa(e<<1,b)>>>0)/3>>>0}c[13571]=f;e=c[242808+(a-6<<2)>>2]|0;if((e|0)==0){g=0}else{g=(aa(e<<1,b)>>>0)/3>>>0}c[13572]=g;g=c[242808+(a-5<<2)>>2]|0;if((g|0)==0){h=0}else{h=(aa(g<<1,b)>>>0)/3>>>0}c[13573]=h;h=c[242808+(a-4<<2)>>2]|0;if((h|0)==0){i=0}else{i=(aa(h<<1,b)>>>0)/3>>>0}c[13574]=i;i=c[242808+(a-3<<2)>>2]|0;if((i|0)==0){j=0}else{j=(aa(i<<1,b)>>>0)/3>>>0}c[13575]=j;j=c[242808+(a-2<<2)>>2]|0;if((j|0)==0){k=0}else{k=(aa(j<<1,b)>>>0)/3>>>0}c[13576]=k;k=c[242808+(a-1<<2)>>2]|0;if((k|0)==0){l=0}else{l=(aa(k<<1,b)>>>0)/3>>>0}c[13577]=l;c[13580]=f;c[13578]=1;return}function tU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=c[3524]|0;e=c[d+8>>2]|0;f=e>>>0>a>>>0?a:e;e=c[d+12>>2]|0;d=e>>>0>b>>>0?b:e;e=f-(c[13598]|0)|0;b=d-(c[13596]|0)|0;a=(e|0)>-1?e:-e|0;g=b*10&-1;h=(g|0)>-1?g:-g|0;g=a*10&-1;do{if((g|0)<(h|0)){i=((((aa((a*25&-1|0)/(h|0)&-1,a)|0)/6&-1)*5&-1)+((h|0)/2&-1)|0)/5&-1}else{if((a|0)==0){return}else{i=(aa((h|0)/(a|0)&-1,(h|0)/24&-1)+g|0)/10&-1;break}}}while(0);g=c[13580]|0;h=c[13578]|0;if((i|0)>(g|0)){a=i;j=g;g=h;while(1){k=a-j|0;l=f-((aa(k,e)|0)/(i|0)&-1)|0;m=d-((aa(k,b)|0)/(i|0)&-1)|0;if((g&1|0)==0){m5(l,m)}else{m6(l,m)}m=(c[13578]|0)+1|0;l=(m|0)>7?0:m;c[13578]=l;m=c[54280+(l<<2)>>2]|0;c[13580]=m;if((k|0)>(m|0)){a=k;j=m;g=l}else{n=k;o=l;break}}}else{n=i;o=h}if((o&1|0)==0){m5(f,d)}else{m6(f,d)}c[13580]=(c[13580]|0)-n;return}function tV(){var b=0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0;uD(54528,89360,15);b=uA(54528)|0;d=c[13630]|0;e=c[d>>2]|0;L27708:do{if((e|0)==0){f=1.0}else{g=0;i=e;while(1){if((uA(i|0)|0)==(b|0)){if((uJ(54528,i|0,b|0)|0)==0){break}}j=g+1|0;k=c[d+(j<<4)>>2]|0;if((k|0)==0){f=1.0;break L27708}else{g=j;i=k}}f=+h[d+(g<<4)+8>>3]}}while(0);c[13628]=12;d=c[3524]|0;c[d+16>>2]=((((c[d+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0)*12&-1;d=c[3524]|0;c[d+20>>2]=~~(f*+(aa((((c[d+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13628]|0)>>>0>>>0)*.527);c[13622]=1;a[54472]=0;c[13604]=432;a[54400]=0;a[54336]=0;a[54576]=0;a[54424]=0;c[13646]=c[13586];c[13647]=c[13587];c[13648]=c[13588];c[13649]=c[13589];c[13650]=c[13590];c[13651]=c[13591];c[13652]=c[13592];c[13653]=c[13593];c[13654]=c[13594];c[13655]=c[13595];c[13554]=0;return}function tW(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0.0,j=0;b=i;d=a>>4;e=+(d|0)/100.0;f=a&15;do{if((f|0)==0){uD(243392,164560,23);i=b;return}else if((f|0)==2|(f|0)==5){a=(d|0)%5&-1;if((a|0)==4){g=.5;j=20811;break}else if((a|0)==2){g=.25;j=20811;break}else if((a|0)==1){j=20810;break}else if((a|0)==0){g=0.0;j=20811;break}else if((a|0)==3){g=.75;j=20811;break}else{j=20809;break}}else if((f|0)==4){be(243392,164584,(v=i,i=i+24|0,c[v>>2]=55376,h[v+8>>3]=e,c[v+16>>2]=0,v)|0);i=b;return}else if((f|0)==1){j=20809}else{be(243392,164424,(v=i,i=i+16|0,c[v>>2]=55372,c[v+8>>2]=0,v)|0);i=b;return}}while(0);if((j|0)==20809){if(e==1.0){j=20810}else{g=e;j=20811}}if((j|0)==20810){uB(243392,55372);i=b;return}else if((j|0)==20811){j=bW(55376)|0;f=bW(55380)|0;e=(1.0-g)*255.0;d=~~(e+g*+(bW(55384)|0));be(243392,164536,(v=i,i=i+32|0,c[v>>2]=~~(e+g*+(j|0)),c[v+8>>2]=~~(e+g*+(f|0)),c[v+16>>2]=d,c[v+24>>2]=0,v)|0);i=b;return}}function tX(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0,k=0,l=0,m=0,n=0;f=i;g=+h[6936];if((a[e]|0)==0){i=f;return}do{if((a[37456]&1)==0){if((cy(e|0,170608)|0)==0){break}j=a[55472]|0;if(!(j&(c[13838]|0)==(b|0)&(c[13834]|0)==(d|0))){if(!j){j=c[10030]|0;aI(162736,17,1,j|0);a[55472]=1;a[72328]=0}j=c[10030]|0;k=(c[13832]|0)-d|0;cf(j|0,162768,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=k,v)|0);c[13838]=b;c[13834]=d}h[5613]=1.0;uF(44912,216760,16);a[238512]=0;h[29815]=+h[6936];k=c[13866]|0;if((aY(k|0,164216)|0)==0){l=20829}else{if((aY(k|0,173184)|0)==0){l=20829}else{m=e}}if((l|0)==20829){a[238488]=1;m=e}do{k=lJ(m,1,179864,g,0.0,1,1,0)|0;if((a[k]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[k]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=k+1|0;}while((a[m]|0)!=0);k=c[13866]|0;if((aY(k|0,164216)|0)==0){l=20837}else{if((aY(k|0,173184)|0)==0){l=20837}}if((l|0)==20837){j=(c[13838]|0)-b|0;if((c[13840]|0)==0){n=0}else{n=(c[13834]|0)-d|0}c[13866]=179864;a[238488]=0;do{if((aY(k|0,164216)|0)==0){tX(b-j|0,d-n|0,e)}else{if((aY(k|0,173184)|0)!=0){break}tX(b-((j|0)/2&-1)|0,d-((n|0)/2&-1)|0,e)}}while(0);c[13866]=k}h[6936]=g;h[29816]=0.0;i=f;return}}while(0);mO(b,d,e);i=f;return}function tY(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+24|0;g=f|0;h=f+8|0;j=f+16|0;if(b>>>0>=16){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167440,v)|0)}if(d>>>0>=128){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167408,v)|0)}if((e|0)<=-1){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167384,v)|0)}k=d<<5&4064|b<<12&61440;if((e|0)<31){b=k|e&31;d=j;if(b>>>0>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[d]=k>>>8&255;a[j+1|0]=b&255;b=c[10030]|0;aI(d|0,1,2,b|0);i=f;return}b=k|31;d=h;if(b>>>0>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[d]=k>>>8&255;a[h+1|0]=b&255;aI(d|0,1,2,c[10030]|0);d=g;if((e|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((e|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[d]=e>>>8&255;a[g+1|0]=e&255;aI(d|0,1,2,c[10030]|0);i=f;return}function tZ(b){b=b|0;var d=0,e=0,f=0;d=i;i=i+8|0;e=d|0;if((b|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((b|0)<32768){f=e;a[f]=b>>>8&255;a[e+1|0]=b&255;b=c[10030]|0;aI(f|0,1,2,b|0);i=d;return}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}function t_(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g|0;j=((e|0)>254?3:1)+e|0;k=j&1;l=(k|0)==0;tY(b,d,j);j=c[10030]|0;do{if((e|0)<255){d=e<<24>>24;aF(d|0,j|0)}else{d=a[241904]|0;aF(d|0,j|0);d=h;if((e|0)<32768){a[d]=e>>>8&255;a[h+1|0]=e&255;b=c[10030]|0;aI(d|0,1,2,b|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);do{if((f|0)==0){h=k+e|0;if((h|0)>0){m=0}else{break}do{aF(0,c[10030]|0);m=m+1|0;}while((m|0)<(h|0))}else{aI(f|0,1,e|0,c[10030]|0)}}while(0);if(l){i=g;return}aF(a[241896]|0|0,c[10030]|0);i=g;return}function t$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=c[60208]|0;g=c[f>>2]|0;h=a[240824]|0;if((g&1|0)==0){if(h){i=c[60230]|0;j=c[60226]|0;k=c[10030]|0;aF(29,k|0);k=j>>>5&31|32;l=c[10030]|0;aF(k|0,l|0);l=j&31|96;j=c[10030]|0;aF(l|0,j|0);j=i>>>5&31|32;l=c[10030]|0;aF(j|0,l|0);l=i&31|64;i=c[10030]|0;aF(l|0,i|0);i=c[60228]|0;l=c[60224]|0;j=l>>>5&31|32;k=c[10030]|0;aF(j|0,k|0);k=l&31|96;l=c[10030]|0;aF(k|0,l|0);l=i>>>5&31|32;k=c[10030]|0;aF(l|0,k|0);k=i&31|64;i=c[10030]|0;aF(k|0,i|0);a[240824]=0;i=c[60208]|0;m=i;n=c[i>>2]|0}else{m=f;n=g}c[m>>2]=n>>>1;return}c[60228]=b;if(h){c[60224]=d}else{c[60230]=b;c[60224]=d;c[60226]=d;a[240824]=1}c[f>>2]=(c[f>>2]|0)>>>1|-2147483648;if((e|0)==0){return}e=c[60230]|0;f=c[60226]|0;aF(29,c[10030]|0);aF(f>>>5&31|32|0,c[10030]|0);aF(f&31|96|0,c[10030]|0);aF(e>>>5&31|32|0,c[10030]|0);aF(e&31|64|0,c[10030]|0);e=c[60228]|0;f=c[60224]|0;aF(f>>>5&31|32|0,c[10030]|0);aF(f&31|96|0,c[10030]|0);aF(e>>>5&31|32|0,c[10030]|0);aF(e&31|64|0,c[10030]|0);a[240824]=0;return}function t0(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=b>>>0>4095?4095:b;b=d>>>0>3131?3131:d;d=(e>>>7)+32|0;f=e>>>2&31|64;g=(b>>>7)+32|0;h=b>>>2&31|96;i=e&3|b<<2&12|96;if((a[226904]|0|0)!=(g|0)){b=c[10030]|0;aF(g|0,b|0)}if((a[226920]|0|0)!=(i|0)){b=c[10030]|0;aF(i|0,b|0)}do{if((a[226896]|0|0)==(h|0)){if((a[226920]|0|0)!=(i|0)){j=20908;break}b=a[226912]|0;if((b<<24>>24|0)==(d|0)){k=b}else{j=20908}}else{j=20908}}while(0);if((j|0)==20908){j=c[10030]|0;aF(h|0,j|0);k=a[226912]|0}if((k<<24>>24|0)==(d|0)){l=c[10030]|0;m=aF(f|0,l|0)|0;n=d&255;a[226912]=n;o=g&255;a[226904]=o;p=h&255;a[226896]=p;q=i&255;a[226920]=q;return}aF(d|0,c[10030]|0);l=c[10030]|0;m=aF(f|0,l|0)|0;n=d&255;a[226912]=n;o=g&255;a[226904]=o;p=h&255;a[226896]=p;q=i&255;a[226920]=q;return}function t1(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0;g=i;i=i+8|0;j=g|0;c[j>>2]=b;b=e+12|0;c[b>>2]=1;k=e|0;c[k>>2]=0;l=e+4|0;c[l>>2]=0;m=e+8|0;c[m>>2]=0;n=e+16|0;c[n>>2]=0;o=e+20|0;c[o>>2]=2e3;h[f>>3]=0.0;c[e+24>>2]=-1;p=e+28|0;c[p>>2]=-1;q=d;d=0;r=0;L27863:while(1){s=q;L27865:while(1){t=a[s]|0;do{if((t<<24>>24|0)==37){break L27865}else if((t<<24>>24|0)==0){break L27863}else if((t<<24>>24|0)==32){u=c[j>>2]|0;if((a[u]|0)==32){w=u}else{break}do{w=w+1|0;c[j>>2]=w;}while((a[w]|0)==32)}else{u=c[j>>2]|0;if(t<<24>>24!=(a[u]|0)){break L27863}c[j>>2]=u+1}}while(0);s=s+1|0}t=a[s+1|0]|0;do{if((t|0)==109){u=c[j>>2]|0;x=a[u]|0;do{if((x-48&255)<10){y=u+1|0;z=(x<<24>>24)-48|0;A=a[y]|0;if((A-48&255)>=10){B=y;C=z;break}B=u+2|0;C=((z*10&-1)-48|0)+(A<<24>>24)|0}else{B=u;C=0}}while(0);c[j>>2]=B;c[n>>2]=C-1;D=d;E=r+1|0}else if((t|0)==66){u=c[j>>2]|0;x=0;while(1){if((x|0)>=12){F=20933;break}A=40552+(x<<5)|0;G=uA(A|0)|0;if((uJ(u|0,A|0,G|0)|0)==0){F=20932;break}else{x=x+1|0}}if((F|0)==20932){F=0;c[j>>2]=u+G;H=x}else if((F|0)==20933){F=0;uh(-2,199248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);H=0}c[n>>2]=H;D=d;E=r}else if((t|0)==106){A=c[j>>2]|0;z=a[A]|0;do{if((z-48&255)<10){y=A+1|0;I=(z<<24>>24)-48|0;J=a[y]|0;if((J-48&255)>=10){K=y;L=I;break}y=A+2|0;M=((I*10&-1)-48|0)+(J<<24>>24)|0;J=a[y]|0;if((J-48&255)>=10){K=y;L=M;break}K=A+3|0;L=((M*10&-1)-48|0)+(J<<24>>24)|0}else{K=A;L=0}}while(0);c[j>>2]=K;c[p>>2]=L-1;D=d+1|0;E=r+1|0}else if((t|0)==100){A=c[j>>2]|0;z=a[A]|0;do{if((z-48&255)<10){x=A+1|0;u=(z<<24>>24)-48|0;J=a[x]|0;if((J-48&255)>=10){N=x;O=u;break}N=A+2|0;O=((u*10&-1)-48|0)+(J<<24>>24)|0}else{N=A;O=0}}while(0);c[b>>2]=O;c[j>>2]=N;D=d;E=r+1|0}else if((t|0)==115){t3(e,+uz(c[j>>2]|0,j)+-946684800.0);D=d;E=r}else if((t|0)==98){A=c[j>>2]|0;z=0;while(1){if((z|0)>=12){F=20928;break}J=72368+(z<<3)|0;P=uA(J|0)|0;if((uJ(A|0,J|0,P|0)|0)==0){F=20927;break}else{z=z+1|0}}if((F|0)==20928){F=0;uh(-2,115608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);Q=0}else if((F|0)==20927){F=0;c[j>>2]=A+P;Q=z}c[n>>2]=Q;D=d;E=r}else if((t|0)==77){J=c[j>>2]|0;u=a[J]|0;do{if((u-48&255)<10){x=J+1|0;M=(u<<24>>24)-48|0;y=a[x]|0;if((y-48&255)>=10){R=x;S=M;break}R=J+2|0;S=((M*10&-1)-48|0)+(y<<24>>24)|0}else{R=J;S=0}}while(0);c[l>>2]=S;c[j>>2]=R;D=d;E=r}else if((t|0)==89){J=c[j>>2]|0;u=a[J]|0;do{if((u-48&255)<10){z=J+1|0;A=(u<<24>>24)-48|0;y=a[z]|0;if((y-48&255)>=10){T=z;U=A;break}z=J+2|0;M=((A*10&-1)-48|0)+(y<<24>>24)|0;y=a[z]|0;if((y-48&255)>=10){T=z;U=M;break}z=J+3|0;A=((M*10&-1)-48|0)+(y<<24>>24)|0;y=a[z]|0;if((y-48&255)>=10){T=z;U=A;break}T=J+4|0;U=((A*10&-1)-48|0)+(y<<24>>24)|0}else{T=J;U=0}}while(0);c[o>>2]=U;c[j>>2]=T;D=d;E=r+1|0}else if((t|0)==83){J=c[j>>2]|0;u=a[J]|0;do{if((u-48&255)<10){y=J+1|0;A=(u<<24>>24)-48|0;z=a[y]|0;if((z-48&255)>=10){V=y;W=A;break}V=J+2|0;W=((A*10&-1)-48|0)+(z<<24>>24)|0}else{V=J;W=0}}while(0);c[k>>2]=W;c[j>>2]=V;J=a[V]|0;if(J<<24>>24!=46){u=c[12886]|0;if((u|0)==0){D=d;E=r;break}if(J<<24>>24!=(a[u]|0)){D=d;E=r;break}}h[f>>3]=+uz(V,0);D=d;E=r}else if((t|0)==72){u=c[j>>2]|0;J=a[u]|0;do{if((J-48&255)<10){z=u+1|0;A=(J<<24>>24)-48|0;y=a[z]|0;if((y-48&255)>=10){X=z;Y=A;break}X=u+2|0;Y=((A*10&-1)-48|0)+(y<<24>>24)|0}else{X=u;Y=0}}while(0);c[m>>2]=Y;c[j>>2]=X;D=d;E=r}else if((t|0)==121){u=c[j>>2]|0;J=a[u]|0;if((J-48&255)<10){y=u+1|0;A=(J<<24>>24)-48|0;J=a[y]|0;if((J-48&255)<10){Z=u+2|0;_=((A*10&-1)-48|0)+(J<<24>>24)|0}else{Z=y;_=A}c[o>>2]=_;c[j>>2]=Z;if((_|0)<69){$=_;F=20945}else{aa=_}}else{c[o>>2]=0;c[j>>2]=u;$=0;F=20945}if((F|0)==20945){F=0;u=$+100|0;c[o>>2]=u;aa=u}c[o>>2]=aa+1900;D=d;E=r+1|0}else{uh(-2,148656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);D=d;E=r}}while(0);q=s+2|0;d=D;r=E}E=c[k>>2]|0;if((E|0)>59){c[l>>2]=(c[l>>2]|0)+((E|0)/60&-1);c[k>>2]=(E|0)%60&-1}E=c[l>>2]|0;if((E|0)>59){c[m>>2]=(c[m>>2]|0)+((E|0)/60&-1);c[l>>2]=(E|0)%60&-1}E=c[m>>2]|0;if((E|0)>23){l=(E|0)/24&-1;if((d|0)!=0){c[p>>2]=(c[p>>2]|0)+l}c[b>>2]=(c[b>>2]|0)+l;c[m>>2]=(E|0)%24&-1}if((r|0)==0){ab=c[j>>2]|0;i=g;return ab|0}do{if((d|0)==0){r=c[n>>2]|0;if((r|0)<0){uf(-2,116496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{ac=r;ad=c[b>>2]|0;break}}else{r=c[p>>2]|0;if((r|0)<0){uf(-2,131384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[n>>2]=0;E=r+1|0;c[b>>2]=E;ac=0;ad=E;break}}}while(0);if((ad|0)<1){uf(-2,103704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((ac|0)>11){c[o>>2]=(c[o>>2]|0)+((ac|0)/12&-1);p=(ac|0)%12&-1;c[n>>2]=p;ae=p;af=ad}else{ae=ac;af=ad}while(1){ad=c[34056+(ae<<2)>>2]|0;do{if((ae|0)==1){ac=c[o>>2]|0;if((ac&3|0)!=0){ag=0;break}ag=(((ac|0)%100&-1|0)!=0|((ac|0)%400&-1|0)==0)&1}else{ag=0}}while(0);s=ag+ad|0;if((af|0)<=(s|0)){break}ac=ae+1|0;c[n>>2]=ac;if((ac|0)==12){c[o>>2]=(c[o>>2]|0)+1;c[n>>2]=0;ah=0}else{ah=ac}ac=af-s|0;c[b>>2]=ac;ae=ah;af=ac}ab=c[j>>2]|0;i=g;return ab|0}function t2(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;b=c[a+20>>2]|0;do{if((b|0)<2e3){d=b;e=0.0;while(1){if((d&3|0)==0){f=((d|0)%100&-1|0)!=0|((d|0)%400&-1|0)==0?366.0:365.0}else{f=365.0}g=e-f;h=d+1|0;if((h|0)<2e3){d=h;e=g}else{i=g;break}}}else{if((b|0)>2e3){j=2e3;k=0.0}else{i=0.0;break}while(1){if((j&3|0)==0){l=((j|0)%100&-1|0)!=0|((j|0)%400&-1|0)==0?366.0:365.0}else{l=365.0}e=k+l;d=j+1|0;if((d|0)<(b|0)){j=d;k=e}else{i=e;break}}}}while(0);j=c[a+12>>2]|0;if((j|0)>0){d=c[a+16>>2]|0;if((d|0)>0){h=0;k=i;while(1){l=+(c[34056+(h<<2)>>2]|0);do{if((h|0)==1){if((b&3|0)!=0){m=0.0;break}m=+((((b|0)%100&-1|0)!=0|((b|0)%400&-1|0)==0)&1|0)}else{m=0.0}}while(0);f=k+(l+m);n=h+1|0;if((n|0)<(d|0)){h=n;k=f}else{o=f;break}}}else{o=i}p=o+(+(j|0)+-1.0)}else{p=i+ +(c[a+28>>2]|0)}return+(+(c[a>>2]|0)+(+(c[a+4>>2]|0)+(p*24.0+ +(c[a+8>>2]|0))*60.0)*60.0)}function t3(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0;d=i;if(+P(+b)>1.0e12){uh(-1,96560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);e=-1;i=d;return e|0}f=a+20|0;c[f>>2]=2e3;g=a|0;h=a+4|0;j=a+8|0;k=a+16|0;l=a+28|0;c[l>>2]=0;m=a+12|0;uE(a|0,0,20);L28020:do{if(b<0.0){n=6;o=b;p=2e3;do{p=p-1|0;if((p&3|0)==0){q=((p|0)%100&-1|0)!=0|((p|0)%400&-1|0)==0?366:365}else{q=365}o=o+ +(q|0)*86400.0;n=(n+371|0)-q|0;}while(o<0.0);c[f>>2]=p;r=o;s=n;t=p}else{u=b;w=6;x=2e3;while(1){if((x&3|0)==0){y=((x|0)%100&-1|0)!=0|((x|0)%400&-1|0)==0?366:365}else{y=365}z=+(y|0)*86400.0;if(u<z){r=u;s=w;t=x;break L28020}A=x+1|0;c[f>>2]=A;u=u-z;w=(w-364|0)+y|0;x=A}}}while(0);y=~~(r/86400.0);c[l>>2]=y;b=r- +(y|0)*86400.0;l=(~~b|0)/3600&-1;c[j>>2]=l;r=b- +(l*3600&-1|0);l=(~~r|0)/60&-1;c[h>>2]=l;c[g>>2]=~~(r- +(l*60&-1|0));c[a+24>>2]=(y+s|0)%7&-1;s=y;y=0;while(1){a=c[34056+(y<<2)>>2]|0;do{if((y|0)==1){if((t&3|0)!=0){B=0;break}B=(((t|0)%100&-1|0)!=0|((t|0)%400&-1|0)==0)&1}else{B=0}}while(0);l=B+a|0;if((s|0)<(l|0)){break}g=y+1|0;c[k>>2]=g;s=s-l|0;y=g}c[m>>2]=s+1;e=0;i=d;return e|0}function t4(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0;j=i;uE(b|0,0,d|0);k=f+16|0;l=f+24|0;m=f+12|0;n=f+8|0;o=f+28|0;p=f+4|0;q=f|0;r=f+20|0;s=e;e=0;t=b;L28044:while(1){b=a[s]|0;do{if((b<<24>>24|0)==0){u=e;w=21166;break L28044}else if((b<<24>>24|0)==37){x=s+1|0;y=(a[x]|0)==48;z=y&1;A=y?s+2|0:x;x=a[A]|0;if((x-48&255)<10){B=0;C=A;D=x;while(1){E=((B*10&-1)-48|0)+(D<<24>>24)|0;F=C+1|0;G=a[F]|0;if((G-48&255)<10){B=E;C=F;D=G}else{H=E;I=F;J=G;break}}}else{H=0;I=A;J=x}if(J<<24>>24==46){D=I+1|0;C=a[D]|0;if((C-48&255)<10){B=0;G=D;F=C;while(1){E=((B*10&-1)-48|0)+(F<<24>>24)|0;K=G+1|0;L=a[K]|0;if((L-48&255)<10){B=E;G=K;F=L}else{M=E;N=K;P=L;break}}}else{M=0;N=D;P=C}Q=N;S=(M|0)>6?6:M;T=P}else{Q=I;S=0;T=J}F=T<<24>>24;do{if((F|0)==77){if((H|0)==0){U=y?z:1;V=2}else{U=z;V=H}if((V+e|0)>>>0>d>>>0){u=0;w=21167;break L28044}G=(U|0)!=0?90536:82208;B=c[p>>2]|0;be(t|0,G|0,(v=i,i=i+16|0,c[v>>2]=V,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==84){if((t4(t,d-e|0,179088,f,0.0)|0)==0){u=0;w=21143;break L28044}else{w=21140}}else if((F|0)==72){if((H|0)==0){W=y?z:1;X=2}else{W=z;X=H}if((X+e|0)>>>0>d>>>0){u=0;w=21171;break L28044}B=c[n>>2]|0;be(t|0,((W|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=X,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==37){if((e+1|0)>>>0>d>>>0){u=0;w=21144;break L28044}a[t]=37;Y=t;Z=e}else if((F|0)==87){B=c[o>>2]|0;G=c[l>>2]|0;do{if((B|0)>(G|0)){x=B-G|0;A=(G|0)>0?x+7|0:x;x=(A|0)/7&-1;if(((A|0)%7&-1|0)<=2){_=x;break}_=x+1|0}else{_=(B|0)==(G|0)&(G|0)==0?52:((c[m>>2]|0)-B|0)>4?52:1}}while(0);if((H|0)==0){$=y?z:1;aa=2}else{$=z;aa=H}if((aa+e|0)>>>0>d>>>0){u=0;w=21154;break L28044}be(t|0,(($|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=aa,c[v+8>>2]=_,v)|0);w=21140}else if((F|0)==108){B=(H|0)==0?2:H;if((B+e|0)>>>0>d>>>0){u=0;w=21147;break L28044}G=(((c[n>>2]|0)+11|0)%12&-1)+1|0;be(t|0,(y?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=B,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==121){if((H|0)==0){ab=y?z:1;ac=2}else{ab=z;ac=H}if((ac+e|0)>>>0>d>>>0){u=0;w=21148;break L28044}G=(c[r>>2]|0)%100&-1;be(t|0,((ab|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ac,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==98|(F|0)==104){G=72368+(c[k>>2]<<3)|0;if(((uA(G|0)|0)+e|0)>>>0>d>>>0){u=0;w=21149;break L28044}uB(t|0,G|0);w=21140}else if((F|0)==73){if((H|0)==0){ad=y?z:1;ae=2}else{ad=z;ae=H}if((ae+e|0)>>>0>d>>>0){u=0;w=21155;break L28044}G=(((c[n>>2]|0)+11|0)%12&-1)+1|0;be(t|0,((ad|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ae,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==65){G=40936+(c[l>>2]<<5)|0;if(((uA(G|0)|0)+e|0)>>>0>d>>>0){u=0;w=21150;break L28044}uB(t|0,G|0);w=21140}else if((F|0)==112){if((e+2|0)>>>0>d>>>0){u=0;w=21151;break L28044}G=(c[n>>2]|0)<12?215536:209856;a[t]=a[G]|0;a[t+1|0]=a[G+1|0]|0;a[t+2|0]=a[G+2|0]|0;w=21140}else if((F|0)==100){if((H|0)==0){af=y?z:1;ag=2}else{af=z;ag=H}if((ag+e|0)>>>0>d>>>0){u=0;w=21168;break L28044}G=c[m>>2]|0;be(t|0,((af|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ag,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==89){if((H|0)==0){ah=y?z:1;ai=4}else{ah=z;ai=H}if((ai+e|0)>>>0>d>>>0){u=0;w=21169;break L28044}G=c[r>>2]|0;be(t|0,((ah|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ai,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==107){G=(H|0)==0?2:H;if((G+e|0)>>>0>d>>>0){u=0;w=21152;break L28044}B=c[n>>2]|0;be(t|0,(y?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=G,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==109){if((H|0)==0){aj=y?z:1;ak=2}else{aj=z;ak=H}if((ak+e|0)>>>0>d>>>0){u=0;w=21161;break L28044}B=(c[k>>2]|0)+1|0;be(t|0,((aj|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ak,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==114){if((t4(t,d-e|0,204248,f,0.0)|0)==0){u=0;w=21156;break L28044}else{w=21140}}else if((F|0)==66){B=40552+(c[k>>2]<<5)|0;if(((uA(B|0)|0)+e|0)>>>0>d>>>0){u=0;w=21157;break L28044}uB(t|0,B|0);w=21140}else if((F|0)==68){if((t4(t,d-e|0,75032,f,0.0)|0)==0){u=0;w=21158;break L28044}else{w=21140}}else if((F|0)==82){if((t4(t,d-e|0,199880,f,0.0)|0)==0){u=0;w=21159;break L28044}else{w=21140}}else if((F|0)==115){if((e+12|0)>>>0>d>>>0){u=0;w=21160;break L28044}al=+t2(f);be(t|0,74984,(v=i,i=i+8|0,h[v>>3]=al,v)|0);w=21140}else if((F|0)==106){if((H|0)==0){am=y?z:1;an=3}else{am=z;an=H}if((an+e|0)>>>0>d>>>0){u=0;w=21146;break L28044}B=(c[o>>2]|0)+1|0;be(t|0,((am|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=an,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==119){if((H|0)==0){ao=y?z:1;ap=2}else{ao=z;ap=H}if((ap+e|0)>>>0>d>>>0){u=0;w=21165;break L28044}B=c[l>>2]|0;be(t|0,((ao|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ap,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==97){B=72464+(c[l>>2]<<3)|0;if(((uA(B|0)|0)+e|0)>>>0>d>>>0){u=0;w=21164;break L28044}uB(t|0,B|0);w=21140}else if((F|0)==85){B=c[o>>2]|0;G=c[l>>2]|0;do{if((B|0)>(G|0)){x=(G>>31|6)+(B-G|0)|0;A=(x|0)/7&-1;if(((x|0)%7&-1|0)<=1){aq=A;break}aq=A+1|0}else{aq=((c[m>>2]|0)-B|0)>4?52:1}}while(0);if((H|0)==0){ar=y?z:1;as=2}else{ar=z;as=H}if((as+e|0)>>>0>d>>>0){u=0;w=21153;break L28044}be(t|0,((ar|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=as,c[v+8>>2]=aq,v)|0);w=21140}else if((F|0)==83){if((H|0)==0){at=y?z:1;au=2}else{at=z;au=H}if((au+e|0)>>>0>d>>>0){u=0;w=21163;break L28044}B=c[q>>2]|0;be(t|0,((at|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=au,c[v+8>>2]=B,v)|0);if((S|0)<=0){w=21140;break}al=+R(10.0,+(+(S|0)));B=~~+O(+(al*g+.5));if(((e+1|0)+S|0)>>>0>d>>>0){u=0;w=21162;break L28044}G=~~al;be(t+(uA(t|0)|0)|0,184248,(v=i,i=i+16|0,c[v>>2]=S,c[v+8>>2]=(B|0)<(G|0)?B:G-1|0,v)|0);w=21140}else if((F|0)==70){if((t4(t,d-e|0,222376,f,0.0)|0)==0){u=0;w=21170;break L28044}else{w=21140}}else{w=21140}}while(0);if((w|0)==21140){w=0;if((a[t]|0)==0){av=Q;aw=e;ax=t;break}else{Y=t;Z=e}}while(1){F=Y+1|0;z=Z+1|0;if((a[F]|0)==0){av=Q;aw=z;ax=F;break}else{Y=F;Z=z}}}else{if(e>>>0>=d>>>0){u=0;w=21145;break L28044}a[t]=b;av=s;aw=e+1|0;ax=t+1|0}}while(0);s=av+1|0;e=aw;t=ax}if((w|0)==21169){i=j;return u|0}else if((w|0)==21170){i=j;return u|0}else if((w|0)==21154){i=j;return u|0}else if((w|0)==21155){i=j;return u|0}else if((w|0)==21156){i=j;return u|0}else if((w|0)==21171){i=j;return u|0}else if((w|0)==21166){i=j;return u|0}else if((w|0)==21167){i=j;return u|0}else if((w|0)==21168){i=j;return u|0}else if((w|0)==21147){i=j;return u|0}else if((w|0)==21148){i=j;return u|0}else if((w|0)==21157){i=j;return u|0}else if((w|0)==21158){i=j;return u|0}else if((w|0)==21149){i=j;return u|0}else if((w|0)==21150){i=j;return u|0}else if((w|0)==21151){i=j;return u|0}else if((w|0)==21143){i=j;return u|0}else if((w|0)==21152){i=j;return u|0}else if((w|0)==21153){i=j;return u|0}else if((w|0)==21162){i=j;return u|0}else if((w|0)==21163){i=j;return u|0}else if((w|0)==21159){i=j;return u|0}else if((w|0)==21160){i=j;return u|0}else if((w|0)==21161){i=j;return u|0}else if((w|0)==21144){i=j;return u|0}else if((w|0)==21145){i=j;return u|0}else if((w|0)==21146){i=j;return u|0}else if((w|0)==21164){i=j;return u|0}else if((w|0)==21165){i=j;return u|0}return 0}function t5(){var d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0.0,aR=0,aS=0,aT=0.0,aU=0,aV=0,aW=0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0.0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0.0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0.0,bC=0,bD=0,bE=0,bF=0,bG=0;d=i;i=i+176|0;e=d|0;f=d+32|0;j=d+56|0;k=d+64|0;l=d+88|0;n=d+112|0;o=d+136|0;p=d+152|0;c[13898]=(c[13898]|0)+1;c[6074]=iw()|0;q=c[13898]|0;r=c[1054]|0;s=c[r+(q*40&-1)+36>>2]|0;t=c[r+(q*40&-1)+32>>2]|0;u=(a[r+(q*40&-1)|0]&1)==0;r=(s|0)>0;x=c[10036]|0;y=21960;z=96232;L28193:while(1){L28195:do{if(!u){if(r){A=0;B=0;C=t;while(1){D=a[z+A|0]|0;if(D<<24>>24==(a[x+(A+C|0)|0]|0)){E=C;F=B}else{if(D<<24>>24!=36){break L28195}E=C-1|0;F=1}G=A+1|0;if((G|0)<(F+s|0)){A=G;B=F;C=E}else{break}}if((F|0)==0){H=G}else{I=y;break L28193}}else{H=0}C=a[z+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){I=y;break L28193}}}while(0);C=y+8|0;B=c[C>>2]|0;if((B|0)==0){I=C;break}else{y=C;z=B}}z=c[I+4>>2]|0;if((z|0)==0){J=q}else{I=q+1|0;c[13898]=I;J=I}I=p|0;q=p+8|0;y=o|0;H=o+2|0;G=o+1|0;F=o+6|0;E=o+5|0;s=o+3|0;x=o+7|0;t=n|0;r=n+8|0;u=l|0;B=l+8|0;C=k|0;A=k+8|0;D=f|0;K=f+8|0;L=j|0;j=e|0;L28211:while(1){L28213:do{if((z|0)==11){L28215:do{if((J|0)<(c[8272]|0)){e=c[1054]|0;if((a[e+(J*40&-1)|0]&1)==0){M=21687;break L28211}N=c[e+(J*40&-1)+36>>2]|0;O=e+(J*40&-1)+32|0;e=c[10036]|0;P=0;while(1){if((P|0)>=(N|0)){M=21252;break}Q=c[O>>2]|0;if((a[e+(Q+P|0)|0]|0)==(a[P+103664|0]|0)){P=P+1|0}else{R=Q;break}}if((M|0)==21252){M=0;if((P|0)==1){M=21254;break}R=c[O>>2]|0}if((N|0)>0){S=0;T=0;U=R}else{M=21686;break L28211}while(1){if((a[S+144616|0]|0)==(a[e+(S+U|0)|0]|0)){V=U;W=T}else{if((S|0)!=1){X=0;Y=0;Z=R;break}V=U-1|0;W=1}Q=S+1|0;if((Q|0)<(W+N|0)){S=Q;T=W;U=V}else{M=21260;break}}do{if((M|0)==21260){M=0;if((W|0)==0){if(!((S|0)==0|(S|0)==6)){X=0;Y=0;Z=R;break}}a[54144]=0;break L28215}}while(0);while(1){if((a[X+143008|0]|0)==(a[e+(X+Z|0)|0]|0)){_=Z;$=Y}else{if((X|0)!=1){aa=0;ab=0;ac=R;break}_=Z-1|0;$=1}O=X+1|0;if((O|0)<($+N|0)){X=O;Y=$;Z=_}else{M=21267;break}}do{if((M|0)==21267){M=0;if(($|0)==0){if(!((X|0)==0|(X|0)==3)){aa=0;ab=0;ac=R;break}}a[54160]=0;break L28215}}while(0);while(1){if((a[aa+141464|0]|0)==(a[e+(aa+ac|0)|0]|0)){ad=ac;ae=ab}else{if((aa|0)!=1){M=21685;break L28211}ad=ac-1|0;ae=1}O=aa+1|0;if((O|0)<(ae+N|0)){aa=O;ab=ae;ac=ad}else{break}}if((ae|0)==0){if(!((aa|0)==0|(aa|0)==3)){M=21684;break L28211}}a[54152]=0}else{M=21254}}while(0);if((M|0)==21254){M=0;a[54144]=0;a[54160]=0;a[54152]=0}c[13898]=J+1}else if((z|0)==36){a[43472]=0}else if((z|0)==37){c[8732]=0}else if((z|0)==42){c[14100]=4;h[7052]=-1.0}else if((z|0)==39){c[8786]=4;h[4395]=-1.0}else if((z|0)==40){c[6598]=4;h[3301]=-1.0}else if((z|0)==59){if((a[32936]&1)==0){break}a[32936]=0;if((a[30528]&1)!=0){break}b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;if((a[37400]&1)==0){break}aI(184192,51,1,c[m>>2]|0)}else if((z|0)==89){t6(11)}else if((z|0)==90){uh(J,222320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);h[8132]=1.0;h[8133]=.5;h[8218]=1.0;h[8219]=.5;h[8304]=1.0;h[8305]=.5;h[8390]=1.0;h[8391]=.5;h[8476]=1.0;h[8477]=.5;h[8562]=1.0;h[8563]=.5;h[8648]=1.0;h[8649]=.5;h[8734]=1.0;h[8735]=.5;h[8820]=1.0;h[8821]=.5;h[8906]=1.0;h[8907]=.5;h[8992]=1.0;h[8993]=.5}else if((z|0)==91|(z|0)==119){h[77]=.5;a[624]=0}else if((z|0)==92){L28273:do{if((J|0)<(c[8272]|0)){N=c[1054]|0;e=(a[N+(J*40&-1)|0]&1)==0;O=c[N+(J*40&-1)+36>>2]|0;L28275:do{if(e){af=c[10036]|0;ag=N+(J*40&-1)+32|0}else{P=N+(J*40&-1)+32|0;Q=c[10036]|0;ah=0;while(1){if((ah|0)>=(O|0)){break}if((a[Q+((c[P>>2]|0)+ah|0)|0]|0)==(a[ah+103664|0]|0)){ah=ah+1|0}else{af=Q;ag=P;break L28275}}if((ah|0)==1){break L28273}else{af=Q;ag=P}}}while(0);N=c[ag>>2]|0;ai=(O|0)>0;aj=56720;ak=77416;L28283:while(1){L28285:do{if(!e){if(ai){al=0;am=0;an=N;while(1){ao=a[ak+al|0]|0;if(ao<<24>>24==(a[af+(al+an|0)|0]|0)){ap=an;aq=am}else{if(ao<<24>>24!=36){break L28285}ap=an-1|0;aq=1}ar=al+1|0;if((ar|0)<(aq+O|0)){al=ar;am=aq;an=ap}else{break}}if((aq|0)==0){as=ar}else{at=aj;break L28283}}else{as=0}an=a[ak+as|0]|0;if((an<<24>>24|0)==36|(an<<24>>24|0)==0){at=aj;break L28283}}}while(0);P=aj+8|0;Q=c[P>>2]|0;if((Q|0)==0){at=P;break}else{aj=P;ak=Q}}ak=c[at+4>>2]|0;if((ak|0)>-1){uD(64813+(ak*688&-1)|0,82192,15);c[13898]=J+1;break L28213}else{uh(J,75e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break L28213}}}while(0);uD(64813,82192,15);uD(65501,82192,15);uD(66189,82192,15);uD(66877,82192,15);uD(67565,82192,15);uD(68253,82192,15);uD(68941,82192,15);uD(69629,82192,15);uD(70317,82192,15);uD(71005,82192,15);uD(71693,82192,15)}else if((z|0)==61){c[7662]=0;if((c[12890]|0)==352){c[12890]=18}if((c[10058]|0)!=352){break}c[10058]=1}else if((z|0)==21){ak=c[10568]|0;if((ak|0)!=0){uu(ak)}c[10568]=0;a[42568]=0}else if((z|0)==102|(z|0)==105){c[16574]=1}else if((z|0)==50){c[17120]=0;h[8561]=10.0}else if((z|0)==127){t6(5)}else if((z|0)==121|(z|0)==124){c[16574]=1}else if((z|0)==54){c[16260]=0;h[8131]=10.0}else if((z|0)==145){t6(0)}else if((z|0)==139|(z|0)==142){c[16574]=1}else if((z|0)==68){c[16776]=0;h[8389]=10.0}else if((z|0)==66){t6(3)}else if((z|0)==71|(z|0)==73){c[16574]=1}else if((z|0)==110){c[16546]=0}else if((z|0)==129){c[16374]=0}else if((z|0)==93){uE(j|0,0,28);uu(c[1183]|0);c[1183]=0;uu(c[1184]|0);c[1184]=0;c[1204]=4;c[1205]=4;c[1206]=4;c[1207]=c[j>>2];c[4832>>2]=c[j+4>>2];c[4836>>2]=c[j+8>>2];c[4840>>2]=c[j+12>>2];c[4844>>2]=c[j+16>>2];c[4848>>2]=c[j+20>>2];c[4852>>2]=c[j+24>>2];c[1186]=0;c[1164]=0;c[1166]=1}else if((z|0)==94){uE(j|0,0,28);uu(c[1119]|0);c[1119]=0;uu(c[1120]|0);c[1120]=0;c[1140]=4;c[1141]=4;c[1142]=4;c[1143]=c[j>>2];c[4576>>2]=c[j+4>>2];c[4580>>2]=c[j+8>>2];c[4584>>2]=c[j+12>>2];c[4588>>2]=c[j+16>>2];c[4592>>2]=c[j+20>>2];c[4596>>2]=c[j+24>>2];c[1122]=0;}else if((z|0)==99){if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}c[5094]=0;c[18072]=0;g[3536]=30.0;g[3538]=60.0;g[3534]=1.0;g[3540]=0.0;g[3532]=1.0}else if((z|0)==151){h[11]=1.0e-8}else if((z|0)==138){c[16202]=0}else if((z|0)==70){c[16718]=0}else if((z|0)==101){c[17234]=0}else if((z|0)==120){c[17062]=0}else if((z|0)==113){uu(c[16629]|0);c[16629]=0;uu(c[16630]|0);uD(66456,51296,192)}else if((z|0)==132){uu(c[16457]|0);c[16457]=0;uu(c[16458]|0);uD(65768,51296,192);c[16455]=-270}else if((z|0)==141){uu(c[16285]|0);c[16285]=0;uu(c[16286]|0);uD(65080,51296,192)}else if((z|0)==147){t6(7)}else if((z|0)==65){c[16680]=0}else if((z|0)==149){c[17368]=0}else if((z|0)==95){c[17540]=0}else if((z|0)==96){c[17712]=0}else if((z|0)==100){c[17884]=0}else if((z|0)==150){a[27776]=0;c[13898]=J+1}else if((z|0)==153){c[16664]=c[12782];c[66660>>2]=c[12783];c[66664>>2]=c[12784];c[66668>>2]=c[12785];c[66672>>2]=c[12786];c[66676>>2]=c[12787];c[66680>>2]=c[12788];c[66684>>2]=c[12789];c[66688>>2]=c[12790];c[66692>>2]=c[12791];c[66696>>2]=c[12792];c[66700>>2]=c[12793];c[66704>>2]=c[12794];c[66708>>2]=c[12795]}else if((z|0)==155){c[16492]=c[12782];c[65972>>2]=c[12783];c[65976>>2]=c[12784];c[65980>>2]=c[12785];c[65984>>2]=c[12786];c[65988>>2]=c[12787];c[65992>>2]=c[12788];c[65996>>2]=c[12789];c[66e3>>2]=c[12790];c[66004>>2]=c[12791];c[66008>>2]=c[12792];c[66012>>2]=c[12793];c[66016>>2]=c[12794];c[66020>>2]=c[12795]}else if((z|0)==157){c[16320]=c[12782];c[65284>>2]=c[12783];c[65288>>2]=c[12784];c[65292>>2]=c[12785];c[65296>>2]=c[12786];c[65300>>2]=c[12787];c[65304>>2]=c[12788];c[65308>>2]=c[12789];c[65312>>2]=c[12790];c[65316>>2]=c[12791];c[65320>>2]=c[12792];c[65324>>2]=c[12793];c[65328>>2]=c[12794];c[65332>>2]=c[12795]}else if((z|0)==154){c[17352]=c[12782];c[69412>>2]=c[12783];c[69416>>2]=c[12784];c[69420>>2]=c[12785];c[69424>>2]=c[12786];c[69428>>2]=c[12787];c[69432>>2]=c[12788];c[69436>>2]=c[12789];c[69440>>2]=c[12790];c[69444>>2]=c[12791];c[69448>>2]=c[12792];c[69452>>2]=c[12793];c[69456>>2]=c[12794];c[69460>>2]=c[12795]}else if((z|0)==156){c[17180]=c[12782];c[68724>>2]=c[12783];c[68728>>2]=c[12784];c[68732>>2]=c[12785];c[68736>>2]=c[12786];c[68740>>2]=c[12787];c[68744>>2]=c[12788];c[68748>>2]=c[12789];c[68752>>2]=c[12790];c[68756>>2]=c[12791];c[68760>>2]=c[12792];c[68764>>2]=c[12793];c[68768>>2]=c[12794];c[68772>>2]=c[12795]}else if((z|0)==152){c[16320]=c[12782];c[65284>>2]=c[12783];c[65288>>2]=c[12784];c[65292>>2]=c[12785];c[65296>>2]=c[12786];c[65300>>2]=c[12787];c[65304>>2]=c[12788];c[65308>>2]=c[12789];c[65312>>2]=c[12790];c[65316>>2]=c[12791];c[65320>>2]=c[12792];c[65324>>2]=c[12793];c[65328>>2]=c[12794];c[65332>>2]=c[12795];c[16492]=c[12782];c[65972>>2]=c[12783];c[65976>>2]=c[12784];c[65980>>2]=c[12785];c[65984>>2]=c[12786];c[65988>>2]=c[12787];c[65992>>2]=c[12788];c[65996>>2]=c[12789];c[66e3>>2]=c[12790];c[66004>>2]=c[12791];c[66008>>2]=c[12792];c[66012>>2]=c[12793];c[66016>>2]=c[12794];c[66020>>2]=c[12795];c[16664]=c[12782];c[66660>>2]=c[12783];c[66664>>2]=c[12784];c[66668>>2]=c[12785];c[66672>>2]=c[12786];c[66676>>2]=c[12787];c[66680>>2]=c[12788];c[66684>>2]=c[12789];c[66688>>2]=c[12790];c[66692>>2]=c[12791];c[66696>>2]=c[12792];c[66700>>2]=c[12793];c[66704>>2]=c[12794];c[66708>>2]=c[12795];c[16836]=c[12782];c[67348>>2]=c[12783];c[67352>>2]=c[12784];c[67356>>2]=c[12785];c[67360>>2]=c[12786];c[67364>>2]=c[12787];c[67368>>2]=c[12788];c[67372>>2]=c[12789];c[67376>>2]=c[12790];c[67380>>2]=c[12791];c[67384>>2]=c[12792];c[67388>>2]=c[12793];c[67392>>2]=c[12794];c[67396>>2]=c[12795];c[17008]=c[12782];c[68036>>2]=c[12783];c[68040>>2]=c[12784];c[68044>>2]=c[12785];c[68048>>2]=c[12786];c[68052>>2]=c[12787];c[68056>>2]=c[12788];c[68060>>2]=c[12789];c[68064>>2]=c[12790];c[68068>>2]=c[12791];c[68072>>2]=c[12792];c[68076>>2]=c[12793];c[68080>>2]=c[12794];c[68084>>2]=c[12795];c[17180]=c[12782];c[68724>>2]=c[12783];c[68728>>2]=c[12784];c[68732>>2]=c[12785];c[68736>>2]=c[12786];c[68740>>2]=c[12787];c[68744>>2]=c[12788];c[68748>>2]=c[12789];c[68752>>2]=c[12790];c[68756>>2]=c[12791];c[68760>>2]=c[12792];c[68764>>2]=c[12793];c[68768>>2]=c[12794];c[68772>>2]=c[12795];c[17352]=c[12782];c[69412>>2]=c[12783];c[69416>>2]=c[12784];c[69420>>2]=c[12785];c[69424>>2]=c[12786];c[69428>>2]=c[12787];c[69432>>2]=c[12788];c[69436>>2]=c[12789];c[69440>>2]=c[12790];c[69444>>2]=c[12791];c[69448>>2]=c[12792];c[69452>>2]=c[12793];c[69456>>2]=c[12794];c[69460>>2]=c[12795];c[17524]=c[12782];c[70100>>2]=c[12783];c[70104>>2]=c[12784];c[70108>>2]=c[12785];c[70112>>2]=c[12786];c[70116>>2]=c[12787];c[70120>>2]=c[12788];c[70124>>2]=c[12789];c[70128>>2]=c[12790];c[70132>>2]=c[12791];c[70136>>2]=c[12792];c[70140>>2]=c[12793];c[70144>>2]=c[12794];c[70148>>2]=c[12795];c[17696]=c[12782];c[70788>>2]=c[12783];c[70792>>2]=c[12784];c[70796>>2]=c[12785];c[70800>>2]=c[12786];c[70804>>2]=c[12787];c[70808>>2]=c[12788];c[70812>>2]=c[12789];c[70816>>2]=c[12790];c[70820>>2]=c[12791];c[70824>>2]=c[12792];c[70828>>2]=c[12793];c[70832>>2]=c[12794];c[70836>>2]=c[12795];c[17868]=c[12782];c[71476>>2]=c[12783];c[71480>>2]=c[12784];c[71484>>2]=c[12785];c[71488>>2]=c[12786];c[71492>>2]=c[12787];c[71496>>2]=c[12788];c[71500>>2]=c[12789];c[71504>>2]=c[12790];c[71508>>2]=c[12791];c[71512>>2]=c[12792];c[71516>>2]=c[12793];c[71520>>2]=c[12794];c[71524>>2]=c[12795];c[18040]=c[12782];c[72164>>2]=c[12783];c[72168>>2]=c[12784];c[72172>>2]=c[12785];c[72176>>2]=c[12786];c[72180>>2]=c[12787];c[72184>>2]=c[12788];c[72188>>2]=c[12789];c[72192>>2]=c[12790];c[72196>>2]=c[12791];c[72200>>2]=c[12792];c[72204>>2]=c[12793];c[72208>>2]=c[12794];c[72212>>2]=c[12795]}else if((z|0)==5){L28351:do{if((J|0)<(c[8272]|0)){ak=c[1054]|0;aj=(a[ak+(J*40&-1)|0]&1)==0;O=c[ak+(J*40&-1)+36>>2]|0;L28353:do{if(aj){au=c[10036]|0;av=ak+(J*40&-1)+32|0}else{N=ak+(J*40&-1)+32|0;ai=c[10036]|0;e=0;while(1){if((e|0)>=(O|0)){M=21222;break}if((a[ai+((c[N>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{aw=0;break}}if((M|0)==21222){M=0;if((e|0)==1){break L28351}else{aw=0}}while(1){if((aw|0)>=(O|0)){M=21226;break}if((a[ai+((c[N>>2]|0)+aw|0)|0]|0)==(a[aw+150688|0]|0)){aw=aw+1|0}else{ax=0;M=21227;break}}if((M|0)==21226){M=0;if((aw|0)!=2){ax=0;M=21227}}if((M|0)==21227){while(1){M=0;if((ax|0)>=(O|0)){break}if((a[ai+((c[N>>2]|0)+ax|0)|0]|0)==(a[ax+137768|0]|0)){ax=ax+1|0;M=21227}else{au=ai;av=N;break L28353}}if((ax|0)!=3){au=ai;av=N;break}}c[16335]=0;c[16507]=0;c[13898]=J+1;break L28213}}while(0);ak=c[av>>2]|0;e=(O|0)>0;Q=56720;P=77416;L28373:while(1){L28375:do{if(!aj){if(e){ah=0;an=0;am=ak;while(1){al=a[P+ah|0]|0;if(al<<24>>24==(a[au+(ah+am|0)|0]|0)){ay=am;aA=an}else{if(al<<24>>24!=36){break L28375}ay=am-1|0;aA=1}aB=ah+1|0;if((aB|0)<(aA+O|0)){ah=aB;an=aA;am=ay}else{break}}if((aA|0)==0){aC=aB}else{aD=Q;break L28373}}else{aC=0}am=a[P+aC|0]|0;if((am<<24>>24|0)==36|(am<<24>>24|0)==0){aD=Q;break L28373}}}while(0);N=Q+8|0;ai=c[N>>2]|0;if((ai|0)==0){aD=N;break}else{Q=N;P=ai}}P=c[aD+4>>2]|0;if((P|0)<=-1){break L28213}c[64652+(P*688&-1)>>2]=0;c[13898]=J+1;break L28213}}while(0);c[16163]=0;c[16335]=0;c[16507]=0;c[16679]=0;c[16851]=0;c[17023]=0;c[17195]=0;c[17367]=0;c[17539]=0;c[17711]=0;c[17883]=0}else if((z|0)==62){uD(54016,50688,112);a[54016]=110}else if((z|0)==77){h[3818]=1.0}else if((z|0)==78){h[3817]=1.0}else if((z|0)==79){if((a[30528]&1)==0){break}a[30528]=0;P=(a[32936]&1)==0;if(!(P|(c[17539]|0)==0)){h[8773]=-5.0;h[8774]=-5.0}if(!P){break}b[12272]=120;if((a[37400]&1)==0){break}aI(199840,33,1,c[m>>2]|0)}else if((z|0)==87){P=43240;while(1){Q=c[P>>2]|0;if((Q|0)==0){aE=0;break}if((aY(215528,c[Q+4>>2]|0)|0)==0){aE=Q;break}else{P=Q|0}}if((a[33512]&1)!=0){lm()}c[8026]=0;do{if((a[14080]&1)!=0){if(a[13032]|0){P=c[(c[3524]|0)+104>>2]|0;if((P|0)!=0){cS[P&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){break}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);if((aE|0)!=0){P=c[aE+24>>2]|0;c[3524]=lx(P,uA(P|0)|0)|0}a[25280]=0}else if((z|0)==12){c[13366]=5;c[13378]=0;c[13368]=4;c[13374]=5;c[13372]=0}else if((z|0)==60){c[13898]=J+1;aI(193712,29,1,c[m>>2]|0)}else if((z|0)==23){uE(y|0,0,11);P=c[1054]|0;Q=c[P+(J*40&-1)+36>>2]|0;O=c[P+(J*40&-1)+32>>2]|0;ak=(a[P+(J*40&-1)|0]&1)==0;e=(Q|0)>0;aj=c[10036]|0;ai=56720;N=77416;L28426:while(1){L28428:do{if(!ak){if(e){am=0;an=0;ah=O;while(1){al=a[N+am|0]|0;if(al<<24>>24==(a[aj+(am+ah|0)|0]|0)){aF=ah;aG=an}else{if(al<<24>>24!=36){break L28428}aF=ah-1|0;aG=1}aH=am+1|0;if((aH|0)<(aG+Q|0)){am=aH;an=aG;ah=aF}else{break}}if((aG|0)==0){aJ=aH}else{aK=ai;break L28426}}else{aJ=0}ah=a[N+aJ|0]|0;if((ah<<24>>24|0)==36|(ah<<24>>24|0)==0){aK=ai;break L28426}}}while(0);ah=ai+8|0;an=c[ah>>2]|0;if((an|0)==0){aK=ah;break}else{ai=ah;N=an}}N=c[aK+4>>2]|0;L28441:do{if((N|0)>-1){a[o+N|0]=1;aL=J;aM=c[8272]|0}else{ai=c[8272]|0;e=(ai|0)>(J|0);L28443:do{if(e){if(ak){aL=J;aM=ai;break L28441}else{aN=0}while(1){if((aN|0)>=(Q|0)){M=21306;break}if((a[aj+(aN+O|0)|0]|0)==(a[aN+150688|0]|0)){aN=aN+1|0}else{aO=0;M=21307;break}}if((M|0)==21306){M=0;if((aN|0)!=2){aO=0;M=21307}}if((M|0)==21307){while(1){M=0;if((aO|0)>=(Q|0)){break}if((a[aj+(aO+O|0)|0]|0)==(a[aO+148800|0]|0)){aO=aO+1|0;M=21307}else{break L28443}}if((aO|0)!=2){break}}a[G]=1;a[H]=1;an=J+1|0;c[13898]=an;aL=an;aM=ai;break L28441}}while(0);if(ak){M=21313}else{an=a[aj+O|0]|0;if(!((an<<24>>24|0)==39|(an<<24>>24|0)==34)){M=21313}}do{if((M|0)==21313){M=0;if(!e){break}if(ak){aL=J;aM=ai;break L28441}else{aP=0}while(1){if((aP|0)>=(Q|0)){break}if((a[aj+(aP+O|0)|0]|0)==(a[aP+103664|0]|0)){aP=aP+1|0}else{aL=J;aM=ai;break L28441}}if((aP|0)!=1){aL=J;aM=ai;break L28441}}}while(0);uE(y|0,1,11);aL=J;aM=ai}}while(0);if((aL|0)<(aM|0)){if((a[P+(aL*40&-1)|0]&1)==0){break}O=c[P+(aL*40&-1)+36>>2]|0;Q=P+(aL*40&-1)+32|0;ak=0;while(1){if((ak|0)>=(O|0)){break}if((a[aj+((c[Q>>2]|0)+ak|0)|0]|0)==(a[ak+103664|0]|0)){ak=ak+1|0}else{break L28213}}if((ak|0)!=1){break}}if((a[H]&1)!=0){c[16560]=6758437;a[66188]=1}if((a[G]&1)!=0){c[16388]=6758437;a[65500]=1}if((a[y]&1)!=0){c[16216]=6758437;a[64812]=1}if((a[F]&1)!=0){c[17248]=6758437;a[68940]=1}if((a[E]&1)!=0){c[17076]=6758437;a[68252]=1}if((a[s]&1)!=0){c[16732]=6758437;a[66876]=1}if((a[x]&1)==0){break}c[17420]=6758437;a[69628]=1}else if((z|0)==3){h[9040]=1.0}else if((z|0)==48){c[16604]=0;h[8303]=10.0}else if((z|0)==6){h[7077]=0.0}else if((z|0)==8){c[11692]=0}else if((z|0)==32){if((c[8272]|0)<=(J|0)){break}Q=c[1054]|0;aj=(a[Q+(J*40&-1)|0]&1)==0;L28502:do{if(!aj){O=c[Q+(J*40&-1)+36>>2]|0;P=Q+(J*40&-1)+32|0;N=c[10036]|0;e=0;while(1){if((e|0)>=(O|0)){M=21386;break}if((a[N+((c[P>>2]|0)+e|0)|0]|0)==(a[e+166752|0]|0)){e=e+1|0}else{break}}do{if((M|0)==21386){M=0;if((e|0)!=5){break}c[8798]=0;c[13898]=J+1;break L28213}}while(0);if(aj){break}e=c[Q+(J*40&-1)+36>>2]|0;P=Q+(J*40&-1)+32|0;N=c[10036]|0;O=0;while(1){if((O|0)>=(e|0)){break}if((a[N+((c[P>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L28502}}if((O|0)==1){break L28213}}}while(0);Q=is(l)|0;aj=c[Q>>2]|0;if((aj|0)==1){aQ=+(c[Q+8>>2]|0)}else if((aj|0)==2){aQ=+h[Q+8>>3]}else if((aj|0)==3){aQ=+uz(c[Q+8>>2]|0,0)}else{M=21397;break L28211}if((c[u>>2]|0)==3){uu(c[B>>2]|0);c[u>>2]=1}Q=~~aQ;aj=0;ak=43264;while(1){aR=c[ak>>2]|0;if((aR|0)==0){break L28213}aS=aR|0;if((c[aR+4>>2]|0)==(Q|0)){break}else{aj=aR;ak=aS}}ak=c[aS>>2]|0;if((c[10816]|0)==(aR|0)){c[10816]=ak}else{c[aj>>2]=ak}uu(aR)}else if((z|0)==20){ak=c[12886]|0;if((ak|0)!=0){uu(ak)}c[12886]=0;uu(c[8270]|0);c[8270]=0}else if((z|0)==27){iY(c[10828]|0);c[10828]=0;c[9344]=10;c[9342]=10}else if((z|0)==30){L28539:do{if((J|0)<(c[8272]|0)){ak=c[1054]|0;L28541:do{if((a[ak+(J*40&-1)|0]&1)!=0){Q=c[ak+(J*40&-1)+36>>2]|0;P=ak+(J*40&-1)+32|0;N=c[10036]|0;e=0;while(1){if((e|0)>=(Q|0)){break}if((a[N+((c[P>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{break L28541}}if((e|0)==1){break L28539}}}while(0);ak=is(n)|0;O=c[ak>>2]|0;if((O|0)==1){aT=+(c[ak+8>>2]|0)}else if((O|0)==2){aT=+h[ak+8>>3]}else if((O|0)==3){aT=+uz(c[ak+8>>2]|0,0)}else{M=21361;break L28211}if((c[t>>2]|0)==3){uu(c[r>>2]|0);c[t>>2]=1}ak=~~aT;aU=c[13898]|0;if((aU|0)<(c[8272]|0)){O=c[1054]|0;if((a[O+(aU*40&-1)|0]&1)==0){M=21683;break L28211}P=c[O+(aU*40&-1)+36>>2]|0;N=O+(aU*40&-1)+32|0;O=c[10036]|0;Q=0;while(1){if((Q|0)>=(P|0)){break}if((a[O+((c[N>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{M=21681;break L28211}}if((Q|0)==1){aV=43288;aW=0}else{M=21682;break L28211}}else{aV=43288;aW=0}while(1){aX=c[aV>>2]|0;if((aX|0)==0){break L28213}aZ=aX|0;if((c[aX+4>>2]|0)==(ak|0)){break}else{aV=aZ;aW=aX}}ak=c[aZ>>2]|0;if((aW|0)==0){c[10822]=ak}else{c[aW>>2]=ak}ak=c[aX+60>>2]|0;if((ak|0)!=0){uu(ak)}ak=c[aX+64>>2]|0;if((ak|0)!=0){uu(ak)}uu(aX);break L28213}}while(0);aj=c[10822]|0;if((aj|0)==0){break}else{a$=aj}do{c[10822]=c[a$>>2];aj=c[a$+60>>2]|0;if((aj|0)!=0){uu(aj)}aj=c[a$+64>>2]|0;if((aj|0)!=0){uu(aj)}uu(a$);a$=c[10822]|0;}while((a$|0)!=0)}else if((z|0)==33){uq(32,0)}else if((z|0)==34){uu(c[12908]|0);bA(5,179864);bA(2,179864);aj=bA(5,0)|0;if((aj|0)==0){a0=0}else{a0=bP(aj|0)|0}c[12908]=a0}else if((z|0)==35){L28592:do{if((J|0)<(c[8272]|0)){aj=c[1054]|0;ak=c[aj+(J*40&-1)+36>>2]|0;L28594:do{if((a[aj+(J*40&-1)|0]&1)!=0){Q=aj+(J*40&-1)+32|0;N=c[10036]|0;O=0;while(1){if((O|0)>=(ak|0)){break}if((a[N+((c[Q>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L28594}}if((O|0)==1){a1=0;M=21418;break L28592}}}while(0);if((ak|0)>0){Q=0;N=J;e=aj;while(1){a2=e+(N*40&-1)+32|0;a3=(c[a2>>2]|0)+Q|0;P=(c[10036]|0)+a3|0;ai=a[P]|0;do{if(ai<<24>>24==114){an=(a[69604]&1)==0;a[69604]=0;h[8701]=0.0;if(an){a4=N;a5=e;a6=7;break}ju();a4=c[13898]|0;a5=c[1054]|0;a6=7}else{do{if((a_(P|0,108208,2)|0)==0){a7=6}else{if((a_(P|0,108120,2)|0)==0){a7=5;break}if((a_(P|0,124768,2)|0)==0){a7=4;break}if((a_(P|0,88416,2)|0)==0){a7=3;break}if(ai<<24>>24==120){a7=2;break}if(ai<<24>>24==121){a7=1;break}if(ai<<24>>24==122){a7=0}else{M=21423;break L28211}}}while(0);an=c[56724+(a7<<3)>>2]|0;a[64788+(an*688&-1)|0]=0;h[64792+(an*688&-1)>>3]=0.0;a4=N;a5=e;a6=a7}}while(0);ai=(uA(c[56720+(a6<<3)>>2]|0)|0)+Q|0;if((ai|0)<(c[a5+(a4*40&-1)+36>>2]|0)){Q=ai;N=a4;e=a5}else{a8=a4;break}}}else{a8=J}c[13898]=a8+1}else{a1=0;M=21418}}while(0);if((M|0)==21418){while(1){M=0;if((a1|0)!=7){a[64788+(a1*688&-1)|0]=0;h[64792+(a1*688&-1)>>3]=0.0;e=a1+1|0;if((e|0)<11){a1=e;M=21418;continue}else{break}}e=(a[69604]&1)==0;a[69604]=0;h[8701]=0.0;if(e){a1=8;M=21418;continue}ju();a1=8;M=21418}}c[6928]=0}else if((z|0)==17){c[11732]=10;c[11756]=10;c[11734]=1;c[11752]=1;h[5865]=1.0;h[5864]=1.0;a[47032]=0}else if((z|0)==18){b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255}else if((z|0)==19){c[11252]=0}else if((z|0)==84){a[46752]=0}else if((z|0)==86){e=c[3526]|0;if((e|0)!=0){az(e|0)}c[3526]=0;a[14112]=0}else if((z|0)==24){a[65036]=0;a[65037]=0;a[65724]=0;a[65725]=0;a[66412]=0;a[66413]=0;a[67100]=0;a[67101]=0;a[67788]=0;a[67789]=0;a[68476]=0;a[68477]=0;a[69164]=0;a[69165]=0;a[69852]=0;a[69853]=0;a[70540]=0;a[70541]=0;a[71228]=0;a[71229]=0;a[71916]=0;a[71917]=0}else if((z|0)==25){a[38984]=0}else if((z|0)==26){M=21341;break L28211}else if((z|0)==13){c[11690]=0}else if((z|0)==28){a[36120]=0}else if((z|0)==29){a[36288]=0}else if((z|0)==44){c[8496]=0;hM()}else if((z|0)==45){lm()}else if((z|0)==41){c[1066]=4;h[535]=-1.0}else if((z|0)==15){e=c[1054]|0;N=c[e+(J*40&-1)+36>>2]|0;Q=c[e+(J*40&-1)+32>>2]|0;L28643:do{if((a[e+(J*40&-1)|0]&1)==0){M=21452}else{if((N|0)<=0){a[47712]=0;break}aj=c[10036]|0;ak=0;ai=0;P=Q;while(1){if((a[ak+115448|0]|0)==(a[aj+(ak+P|0)|0]|0)){a9=P;ba=ai}else{if((ak|0)!=4){M=21452;break L28643}a9=P-1|0;ba=1}bb=ak+1|0;if((bb|0)<(ba+N|0)){ak=bb;ai=ba;P=a9}else{break}}if((ba|0)!=0|(bb|0)==4){a[47712]=0}else{a[47712]=0;if((bb|0)!=8){break}}c[13898]=J+1;break L28213}}while(0);if((M|0)==21452){M=0;a[47712]=0}uu(c[8528]|0);c[8528]=0;a[47120]=0;uu(c[11948]|0);c[11948]=bP(199184)|0;N=c[12168]|0;Q=c[11862]|0;if((Q|0)>0){e=0;P=Q;while(1){Q=N+(e*232&-1)+224|0;ai=c[Q>>2]|0;if((ai|0)==0){bc=P}else{uu(ai);c[Q>>2]=0;bc=c[11862]|0}Q=e+1|0;if((Q|0)<(bc|0)){e=Q;P=bc}else{break}}}c[11862]=0;c[12202]=c[12200];c[12206]=0}else if((z|0)==9){h[7030]=-1.0;a[56232]=1}else if((z|0)==10){a[35888]=0}else if((z|0)==4){L28672:do{if((J|0)<(c[8272]|0)){P=c[1054]|0;L28674:do{if((a[P+(J*40&-1)|0]&1)!=0){e=c[P+(J*40&-1)+36>>2]|0;N=P+(J*40&-1)+32|0;Q=c[10036]|0;ai=0;while(1){if((ai|0)>=(e|0)){break}if((a[Q+((c[N>>2]|0)+ai|0)|0]|0)==(a[ai+103664|0]|0)){ai=ai+1|0}else{break L28674}}if((ai|0)==1){break L28672}}}while(0);P=is(p)|0;N=c[P>>2]|0;if((N|0)==2){bd=+h[P+8>>3]}else if((N|0)==3){bd=+uz(c[P+8>>2]|0,0)}else if((N|0)==1){bd=+(c[P+8>>2]|0)}else{M=21199;break L28211}if((c[I>>2]|0)==3){uu(c[q>>2]|0);c[I>>2]=1}P=~~bd;be=c[13898]|0;if((be|0)<(c[8272]|0)){N=c[1054]|0;if((a[N+(be*40&-1)|0]&1)==0){M=21690;break L28211}Q=c[N+(be*40&-1)+36>>2]|0;e=N+(be*40&-1)+32|0;N=c[10036]|0;ak=0;while(1){if((ak|0)>=(Q|0)){break}if((a[N+((c[e>>2]|0)+ak|0)|0]|0)==(a[ak+103664|0]|0)){ak=ak+1|0}else{M=21691;break L28211}}if((ak|0)==1){bf=43304;bg=0}else{M=21692;break L28211}}else{bf=43304;bg=0}while(1){bh=c[bf>>2]|0;if((bh|0)==0){M=21215;break L28211}bi=bh|0;if((c[bh+4>>2]|0)==(P|0)){break}else{bf=bi;bg=bh}}P=c[bi>>2]|0;if((bg|0)==0){c[10826]=P}else{c[bg>>2]=P}uu(bh);break L28213}}while(0);P=c[10826]|0;if((P|0)==0){break}else{bj=P}do{c[10826]=c[bj>>2];uu(bj);bj=c[10826]|0;}while((bj|0)!=0)}else if((z|0)==64){uu(c[16801]|0);c[16801]=0;uu(c[16802]|0);uD(67144,51296,192);c[16799]=-270}else if((z|0)==104){uu(c[17317]|0);c[17317]=0;uu(c[17318]|0);uD(69208,51296,192)}else if((z|0)==123){uu(c[17145]|0);c[17145]=0;uu(c[17146]|0);uD(68520,51296,192);c[17143]=-270}else if((z|0)==116){c[16508]=0}else if((z|0)==107){c[17196]=0}else if((z|0)==135){c[16336]=0}else if((z|0)==126){c[17024]=0}else if((z|0)==144){c[16164]=0}else if((z|0)==80){ea(0,0)}else if((z|0)==81){uu(c[57238]|0);c[57238]=0}else if((z|0)==75){L28718:do{if((J|0)<(c[8272]|0)){P=c[1054]|0;L28720:do{if((a[P+(J*40&-1)|0]&1)!=0){ak=c[P+(J*40&-1)+36>>2]|0;e=P+(J*40&-1)+32|0;N=c[10036]|0;Q=0;while(1){if((Q|0)>=(ak|0)){break}if((a[N+((c[e>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L28720}}if((Q|0)==1){break L28718}}}while(0);P=is(k)|0;e=c[P>>2]|0;if((e|0)==1){bk=+(c[P+8>>2]|0)}else if((e|0)==2){bk=+h[P+8>>3]}else if((e|0)==3){bk=+uz(c[P+8>>2]|0,0)}else{M=21503;break L28211}if((c[C>>2]|0)==3){uu(c[A>>2]|0);c[C>>2]=1}P=~~bk;bl=c[13898]|0;if((bl|0)<(c[8272]|0)){e=c[1054]|0;if((a[e+(bl*40&-1)|0]&1)==0){M=21694;break L28211}N=c[e+(bl*40&-1)+36>>2]|0;ak=e+(bl*40&-1)+32|0;e=c[10036]|0;ai=0;while(1){if((ai|0)>=(N|0)){break}if((a[e+((c[ak>>2]|0)+ai|0)|0]|0)==(a[ai+103664|0]|0)){ai=ai+1|0}else{M=21693;break L28211}}if((ai|0)==1){bm=43272;bn=0}else{M=21695;break L28211}}else{bm=43272;bn=0}while(1){bo=c[bm>>2]|0;if((bo|0)==0){break L28213}bp=bo|0;if((c[bo+4>>2]|0)==(P|0)){break}else{bm=bp;bn=bo}}P=c[bp>>2]|0;if((bn|0)==0){c[10818]=P}else{c[bn>>2]=P}if((c[bo+12>>2]|0)==4){uu(c[(bo+104|0)+4>>2]|0)}uu(bo);break L28213}}while(0);P=c[10818]|0;if((P|0)==0){break}else{bq=P}do{c[10818]=c[bq>>2];if((c[bq+12>>2]|0)==4){uu(c[(bq+104|0)+4>>2]|0)}uu(bq);bq=c[10818]|0;}while((bq|0)!=0)}else if((z|0)==117){t6(2)}else if((z|0)==111|(z|0)==114){c[16574]=1}else if((z|0)==52){c[16432]=0;h[8217]=10.0}else if((z|0)==136){t6(1)}else if((z|0)==130|(z|0)==133){c[16574]=1}else if((z|0)==46){c[17292]=0;h[8647]=10.0}else if((z|0)==108){t6(6)}else if((z|0)==56){h[3296]=0.0;h[4384]=0.0;h[7048]=0.0;h[531]=0.0}else if((z|0)==57){g[184]=0.0;g[44]=0.0}else if((z|0)==58){if((a[33512]&1)!=0){M=21466;break L28211}lj(0);P=c[8244]|0;if((P|0)==0){break}uu(P);c[8244]=0}else if((z|0)==82){iO(c[10814]|0);c[10814]=0;iY(c[10828]|0);c[10828]=0;c[6352]=100;c[6350]=100}else if((z|0)==83){g[178]=1.0;g[38]=1.0;g[2]=1.0}else if((z|0)==85){P=c[8272]|0;L28774:do{if((J|0)<(P|0)){ai=c[1054]|0;ak=(a[ai+(J*40&-1)|0]&1)==0;e=c[ai+(J*40&-1)+36>>2]|0;L28776:do{if(ak){br=c[10036]|0;bs=ai+(J*40&-1)+32|0}else{N=ai+(J*40&-1)+32|0;aj=c[10036]|0;O=0;while(1){if((O|0)>=(e|0)){break}if((a[aj+((c[N>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{br=aj;bs=N;break L28776}}if((O|0)==1){break L28774}else{br=aj;bs=N}}}while(0);Q=c[bs>>2]|0;an=(e|0)>0;ah=21680;am=116616;L28784:while(1){L28786:do{if(!ak){if(an){al=0;ao=0;bt=Q;while(1){bu=a[am+al|0]|0;if(bu<<24>>24==(a[br+(al+bt|0)|0]|0)){bv=bt;bw=ao}else{if(bu<<24>>24!=36){break L28786}bv=bt-1|0;bw=1}bx=al+1|0;if((bx|0)<(bw+e|0)){al=bx;ao=bw;bt=bv}else{break}}if((bw|0)==0){by=bx}else{bz=ah;break L28784}}else{by=0}bt=a[am+by|0]|0;if((bt<<24>>24|0)==36|(bt<<24>>24|0)==0){bz=ah;break L28784}}}while(0);N=ah+8|0;aj=c[N>>2]|0;if((aj|0)==0){bz=N;break}else{ah=N;am=aj}}am=c[bz+4>>2]|0;if((am|0)==4){c[12372]=0;c[12373]=100;c[12374]=0;c[12376]=0;c[13898]=J+1;break L28213}else if((am|0)==10){c[9670]=3;c[9671]=2;c[13898]=J+1;break L28213}else if((am|0)==5){t8(c[10824]|0);c[10824]=0;c[13898]=(c[13898]|0)+1;break L28213}else if((am|0)==8){uD(49160,1144,272);c[13898]=J+1;break L28213}else if((am|0)==1){c[12890]=18;c[13898]=J+1;break L28213}else if((am|0)==2){c[10058]=1;c[13898]=J+1;break L28213}else if((am|0)==3){ah=J+1|0;c[13898]=ah;L28807:do{if((ah|0)<(P|0)){L28809:do{if((a[ai+(ah*40&-1)|0]&1)!=0){e=c[ai+(ah*40&-1)+36>>2]|0;Q=ai+(ah*40&-1)+32|0;an=0;while(1){if((an|0)>=(e|0)){break}if((a[br+((c[Q>>2]|0)+an|0)|0]|0)==(a[an+103664|0]|0)){an=an+1|0}else{break L28809}}if((an|0)==1){break L28807}}}while(0);Q=is(f)|0;e=c[Q>>2]|0;if((e|0)==2){bB=+h[Q+8>>3]}else if((e|0)==3){bB=+uz(c[Q+8>>2]|0,0)}else if((e|0)==1){bB=+(c[Q+8>>2]|0)}else{M=21560;break L28211}if((c[D>>2]|0)==3){uu(c[K>>2]|0);c[D>>2]=1}Q=~~bB;e=0;ak=43280;while(1){bC=c[ak>>2]|0;if((bC|0)==0){break L28213}bD=bC|0;if((c[bC+4>>2]|0)==(Q|0)){break}else{e=bC;ak=bD}}ak=c[bD>>2]|0;if((c[10820]|0)==(bC|0)){c[10820]=ak}else{c[e>>2]=ak}uu(bC);break L28213}}while(0);ah=c[10820]|0;if((ah|0)==0){break L28213}else{bE=ah}while(1){c[10820]=c[bE>>2];uu(bE);bE=c[10820]|0;if((bE|0)==0){break L28213}}}else if((am|0)==6){uD(50800,1688,272);c[13898]=J+1;break L28213}else if((am|0)==7){uD(49520,1416,272);c[13898]=J+1;break L28213}else if((am|0)==11){uE(L|0,0,3);ah=56248;c[ah>>2]=0;c[ah+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[L]|0;a[56266|0]=a[L+1|0]|0;a[56267|0]=a[L+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;c[13898]=J+1;break L28213}else{M=21577;break L28211}}}while(0);c[12890]=18;c[10058]=1;P=c[10820]|0;if((P|0)==0){bF=J}else{ah=P;do{c[10820]=c[ah>>2];uu(ah);ah=c[10820]|0;}while((ah|0)!=0);bF=c[13898]|0}c[12372]=0;c[12373]=100;c[12374]=0;c[12376]=0;uD(49160,1144,272);uD(50800,1688,272);uD(49520,1416,272);c[9670]=3;c[9671]=2;uE(L|0,0,3);ah=56248;c[ah>>2]=0;c[ah+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[L]|0;a[56266|0]=a[L+1|0]|0;a[56267|0]=a[L+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;c[13898]=bF+1}else{M=21675;break L28211}}while(0);if(!(ix(c[6074]|0)|0)){M=21678;break}c[13898]=J}if((M|0)==21692){uf(be,135968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21693){uf(bl,170992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21694){uf(bl,170992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21695){uf(bl,170992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21215){uf(be,134376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21675){uf(J,148616,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21678){e7(0);bl=c[6074]|0;if((bl|0)==0){c[6074]=0;i=d;return}else{bG=bl}while(1){bl=c[bG>>2]|0;uu(c[bG+12>>2]|0);uu(bG);if((bl|0)==0){break}else{bG=bl}}c[6074]=0;i=d;return}else if((M|0)==21503){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21560){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21577){uf(J,209800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21423){c[a2>>2]=a3;uf(c[13898]|0,174808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21341){uf(J,153432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21361){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21466){uf(J,179040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21199){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21397){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21681){uf(aU,161624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21682){uf(aU,161624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21683){uf(aU,161624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21684){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21685){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21686){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21687){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21690){uf(be,135968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21691){uf(be,135968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function t6(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d|0;uE(e|0,0,28);f=b>>>0<11;g=f?b:0;j=f?b+1|0:11;if(g>>>0<j>>>0){k=g}else{i=d;return}do{c[64916+(k*688&-1)>>2]=0;g=64924+(k*688&-1)|0;b=c[g>>2]|0;if((b|0)!=0){uu(b);c[g>>2]=0}uE(64928+(k*688&-1)|0,0,16);c[64984+(k*688&-1)>>2]=4;c[64988+(k*688&-1)>>2]=4;c[64992+(k*688&-1)>>2]=4;g=(64648+(k*688&-1)|0)+348|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[g+16>>2]=c[e+16>>2];c[g+20>>2]=c[e+20>>2];c[g+24>>2]=c[e+24>>2];a[65024+(k*688&-1)|0]=0;c[65032+(k*688&-1)>>2]=0;h[65056+(k*688&-1)>>3]=1.0;h[65064+(k*688&-1)>>3]=.5;a[65072+(k*688&-1)|0]=1;a[65272+(k*688&-1)|0]=0;g=64944+(k*688&-1)|0;b=c[g>>2]|0;if((b|0)!=0){f=b;while(1){b=c[f+16>>2]|0;l=c[f+8>>2]|0;if((l|0)!=0){uu(l)}uu(f);if((b|0)==0){break}else{f=b}}}c[g>>2]=0;k=k+1|0;}while(k>>>0<j>>>0);i=d;return}function t7(){var d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0;d=i;i=i+40|0;e=d|0;f=d+8|0;j=a[37400]&1;c[13898]=(c[13898]|0)+1;e7(4);k=c[13898]|0;l=c[1054]|0;n=c[l+(k*40&-1)+36>>2]|0;o=c[l+(k*40&-1)+32>>2]|0;p=(a[l+(k*40&-1)|0]&1)==0;L28894:do{if((n|0)>0&(p^1)){l=c[10036]|0;q=0;r=0;s=o;while(1){if((a[q+131368|0]|0)==(a[l+(q+s|0)|0]|0)){t=s;u=r}else{if((q|0)!=3){break L28894}t=s-1|0;u=1}x=q+1|0;if((x|0)<(u+n|0)){q=x;r=u;s=t}else{break}}if((u|0)==0){if(!((q|0)==10|(q|0)==2)){break}}c[13898]=k+1;i=d;return}}while(0);L28908:do{if(!((c[8272]|0)<=(k|0)|p)){u=c[10036]|0;t=0;while(1){if((t|0)>=(n|0)){break}if((a[u+(o+t|0)|0]|0)==(a[t+116488|0]|0)){t=t+1|0}else{break L28908}}if((t|0)!=4){break}u=c[14128]|0;if((u|0)==0){y=k}else{q=u;while(1){u=q+12|0;s=c[u>>2]|0;if((s|0)!=0){uu(s);c[u>>2]=0}u=c[q+24>>2]|0;uu(q);if((u|0)==0){break}else{q=u}}y=c[13898]|0}c[14128]=0;c[13898]=y+1;i=d;return}}while(0);a[37400]=0;iO(c[10814]|0);c[10814]=0;iY(c[10828]|0);c[10828]=0;c[6352]=100;c[6350]=100;iY(0);c[10828]=0;c[9344]=10;c[9342]=10;y=c[10826]|0;if((y|0)!=0){k=y;do{c[10826]=c[k>>2];uu(k);k=c[10826]|0;}while((k|0)!=0)}t8(c[10824]|0);c[10824]=0;k=c[10822]|0;if((k|0)!=0){y=k;do{c[10822]=c[y>>2];k=c[y+60>>2]|0;if((k|0)!=0){uu(k)}k=c[y+64>>2]|0;if((k|0)!=0){uu(k)}uu(y);y=c[10822]|0;}while((y|0)!=0)}y=c[10820]|0;if((y|0)!=0){k=y;do{c[10820]=c[k>>2];uu(k);k=c[10820]|0;}while((k|0)!=0)}k=c[10818]|0;if((k|0)!=0){y=k;do{c[10818]=c[y>>2];if((c[y+12>>2]|0)==4){uu(c[(y+104|0)+4>>2]|0)}uu(y);y=c[10818]|0;}while((y|0)!=0)}uD(49160,1144,272);uD(50800,1688,272);uD(49520,1416,272);do{if((a[30528]&1)!=0){a[30528]=0;y=(a[32936]&1)==0;if(!(y|(c[17539]|0)==0)){h[8773]=-5.0;h[8774]=-5.0}if(!y){break}b[12272]=120;if((a[37400]&1)==0){break}y=c[m>>2]|0;aI(199840,33,1,y|0)}}while(0);do{if((a[32936]&1)!=0){a[32936]=0;if((a[30528]&1)!=0){break}b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;if((a[37400]&1)==0){break}y=c[m>>2]|0;aI(184192,51,1,y|0)}}while(0);b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;y=f|0;uE(y|0,0,28);uu(c[1119]|0);c[1119]=0;uu(c[1120]|0);c[1120]=0;c[1140]=4;c[1141]=4;c[1142]=4;c[1143]=c[y>>2];c[4576>>2]=c[y+4>>2];c[4580>>2]=c[y+8>>2];c[4584>>2]=c[y+12>>2];c[4588>>2]=c[y+16>>2];c[4592>>2]=c[y+20>>2];c[4596>>2]=c[y+24>>2];c[1122]=0;uD(36120,26456,1240);a[36288]=0;f=c[13898]|0;L28963:do{if((f|0)<(c[8272]|0)){k=c[1054]|0;o=(a[k+(f*40&-1)|0]&1)==0;n=c[k+(f*40&-1)+36>>2]|0;L28965:do{if(o){z=c[10036]|0;A=k+(f*40&-1)+32|0}else{p=k+(f*40&-1)+32|0;q=c[10036]|0;t=0;while(1){if((t|0)>=(n|0)){break}if((a[q+((c[p>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{z=q;A=p;break L28965}}if((t|0)==1){B=21758;break L28963}else{z=q;A=p}}}while(0);k=c[A>>2]|0;u=(n|0)>0;s=56720;r=77416;L28973:while(1){L28975:do{if(!o){if(u){l=0;x=0;C=k;while(1){D=a[r+l|0]|0;if(D<<24>>24==(a[z+(l+C|0)|0]|0)){E=C;F=x}else{if(D<<24>>24!=36){break L28975}E=C-1|0;F=1}G=l+1|0;if((G|0)<(F+n|0)){l=G;x=F;C=E}else{break}}if((F|0)==0){H=G}else{I=s;break L28973}}else{H=0}C=a[r+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){I=s;break L28973}}}while(0);p=s+8|0;q=c[p>>2]|0;if((q|0)==0){I=p;break}else{s=p;r=q}}r=c[I+4>>2]|0;if((r|0)>-1){uD(64813+(r*688&-1)|0,82192,15);c[13898]=f+1;break}else{uh(f,75e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}}else{B=21758}}while(0);if((B|0)==21758){uD(64813,82192,15);uD(65501,82192,15);uD(66189,82192,15);uD(66877,82192,15);uD(67565,82192,15);uD(68253,82192,15);uD(68941,82192,15);uD(69629,82192,15);uD(70317,82192,15);uD(71005,82192,15);uD(71693,82192,15)}if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}c[5094]=0;c[18072]=0;g[3536]=30.0;g[3538]=60.0;g[3534]=1.0;g[3540]=0.0;g[3532]=1.0;B=0;L28997:do{c[64864+(B*688&-1)>>2]=6758437;a[64812+(B*688&-1)|0]=1;c[64808+(B*688&-1)>>2]=0;f=65280+(B*688&-1)|0;c[f>>2]=c[12782];c[f+4>>2]=c[12783];c[f+8>>2]=c[12784];c[f+12>>2]=c[12785];c[f+16>>2]=c[12786];c[f+20>>2]=c[12787];c[f+24>>2]=c[12788];c[f+28>>2]=c[12789];c[f+32>>2]=c[12790];c[f+36>>2]=c[12791];c[f+40>>2]=c[12792];c[f+44>>2]=c[12793];c[f+48>>2]=c[12794];c[f+52>>2]=c[12795];c[64656+(B*688&-1)>>2]=0;f=65140+(B*688&-1)|0;uu(c[f>>2]|0);c[f>>2]=0;f=65144+(B*688&-1)|0;uu(c[f>>2]|0);c[f>>2]=0;c[65224+(B*688&-1)>>2]=4;c[65228+(B*688&-1)>>2]=4;c[65232+(B*688&-1)>>2]=4;c[65152+(B*688&-1)>>2]=0;uD(65080+(B*688&-1)|0,51296,192);if((B|0)==5|(B|0)==3|(B|0)==1){c[65132+(B*688&-1)>>2]=-270}c[64652+(B*688&-1)>>2]=3;J=+h[56816+(B*24&-1)>>3];h[64680+(B*688&-1)>>3]=J;h[64696+(B*688&-1)>>3]=J;J=+h[56824+(B*24&-1)>>3];h[64688+(B*688&-1)>>3]=J;h[64704+(B*688&-1)>>3]=J;c[64728+(B*688&-1)>>2]=0;c[64732+(B*688&-1)>>2]=0;t6(B);c[64916+(B*688&-1)>>2]=c[56836+(B*24&-1)>>2];h[65048+(B*688&-1)>>3]=10.0;uD(64920+(B*688&-1)|0,51184,112);c[65040+(B*688&-1)>>2]=1;do{if((B|0)==7){f=(a[69604]&1)==0;a[69604]=0;h[8701]=0.0;if(f){B=B+1|0;continue L28997}else{ju();break}}else{a[64788+(B*688&-1)|0]=0;h[64792+(B*688&-1)>>3]=0.0}}while(0);B=B+1|0;}while(B>>>0<11);a[27776]=1;B=e|0;uE(B|0,0,3);e=56248;c[e>>2]=0;c[e+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[B]|0;a[56266|0]=a[B+1|0]|0;a[56267|0]=a[B+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;h[7030]=-1.0;a[56232]=1;a[54144]=0;a[54160]=1;a[54152]=0;c[14074]=c[12768];c[14075]=c[12769];c[14076]=c[12770];c[14077]=c[12771];c[14078]=c[12772];c[14079]=c[12773];c[14080]=c[12774];c[14081]=c[12775];c[14082]=c[12776];c[14083]=c[12777];c[14084]=c[12778];c[14085]=c[12779];c[14086]=c[12780];c[14087]=c[12781];c[11692]=31;a[46752]=1;c[12890]=18;c[10058]=1;c[10859]=0;c[10851]=0;h[7077]=1.0;c[14156]=1;a[65036]=0;a[65037]=0;a[65724]=0;a[65725]=0;a[66412]=0;a[66413]=0;a[67100]=0;a[67101]=0;a[67788]=0;a[67789]=0;a[68476]=0;a[68477]=0;a[69164]=0;a[69165]=0;a[69852]=0;a[69853]=0;a[70540]=0;a[70541]=0;a[71228]=0;a[71229]=0;a[71916]=0;a[71917]=0;c[10012]=c[12358];c[10013]=c[12359];c[10014]=c[12360];c[10015]=c[12361];c[10016]=c[12362];c[10017]=c[12363];c[10018]=c[12364];c[10019]=c[12365];c[10020]=c[12366];c[10021]=c[12367];c[10022]=c[12368];c[10023]=c[12369];c[10024]=c[12370];c[10025]=c[12371];c[8694]=c[12358];c[8695]=c[12359];c[8696]=c[12360];c[8697]=c[12361];c[8698]=c[12362];c[8699]=c[12363];c[8700]=c[12364];c[8701]=c[12365];c[8702]=c[12366];c[8703]=c[12367];c[8704]=c[12368];c[8705]=c[12369];c[8706]=c[12370];c[8707]=c[12371];h[3815]=0.0;c[10026]=-1;c[6928]=0;c[9742]=1;c[9734]=3;c[9738]=1;a[38944]=0;a[38960]=0;c[9744]=0;a[38984]=0;a[35888]=1;a[53520]=a[96552]|0;a[53521|0]=a[96553|0]|0;a[53522|0]=a[96554|0]|0;a[53523|0]=a[96555|0]|0;a[53524|0]=a[96556|0]|0;a[53525|0]=a[96557|0]|0;h[9040]=1.0;c[8732]=0;g[178]=1.0;g[38]=1.0;g[2]=1.0;g[18074]=0.0;g[184]=0.0;g[44]=0.0;uE(y|0,0,28);uu(c[1183]|0);c[1183]=0;uu(c[1184]|0);c[1184]=0;c[1204]=4;c[1205]=4;c[1206]=4;c[1207]=c[y>>2];c[4832>>2]=c[y+4>>2];c[4836>>2]=c[y+8>>2];c[4840>>2]=c[y+12>>2];c[4844>>2]=c[y+16>>2];c[4848>>2]=c[y+20>>2];c[4852>>2]=c[y+24>>2];c[1186]=0;c[1164]=0;c[1166]=1;h[3296]=0.0;h[4384]=0.0;h[7048]=0.0;h[531]=0.0;c[11690]=0;c[13366]=5;c[13378]=0;c[13368]=4;c[13374]=5;c[13372]=0;h[11]=1.0e-8;c[11732]=10;c[11756]=10;c[11734]=1;c[11752]=1;h[5865]=1.0;h[5864]=1.0;a[47032]=0;h[77]=.5;a[624]=0;c[14100]=4;h[7052]=-1.0;c[8786]=4;h[4395]=-1.0;c[6598]=4;h[3301]=-1.0;c[1066]=4;h[535]=-1.0;h[3817]=1.0;h[3818]=1.0;b[15316]=115;a[30639]=98;a[30640]=0;a[30641]=97;a[30642]=52;c[7661]=0;c[7662]=0;c[7663]=4;c[7664]=1;c[7665]=1;uD(54016,50688,112);if((c[11254]|0)!=0){c[5163]=114;c[5164]=7;c[5165]=5;c[5166]=15;a[20668]=112;a[20684]=0;c[5168]=0;c[5172]=0;uu(c[5173]|0);c[5173]=0;uu(c[5170]|0);c[5170]=0;c[5174]=114;h[2705]=1.5;c[7640]=48}y=c[12168]|0;B=c[11862]|0;if((B|0)>0){e=0;f=B;while(1){B=y+(e*232&-1)+224|0;I=c[B>>2]|0;if((I|0)==0){K=f}else{uu(I);c[B>>2]=0;K=c[11862]|0}B=e+1|0;if((B|0)<(K|0)){e=B;f=K}else{break}}}c[11862]=0;c[12202]=c[12200];c[12206]=0;c[12372]=0;c[12373]=100;c[12374]=0;c[12376]=0;c[9670]=3;c[9671]=2;uu(c[8528]|0);c[8528]=0;a[47120]=0;uu(c[11948]|0);c[11948]=bP(199184)|0;K=c[10568]|0;if((K|0)!=0){uu(K)}c[10568]=0;a[42568]=0;e7(0);a[37400]=j;i=d;return}function t8(a){a=a|0;if((a|0)==0){return}else{t8(c[a>>2]|0);uu(a);return}}function t9(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=c[1054]|0;L29029:do{if((a[e+(b*40&-1)|0]&1)==0){f=e}else{if((bO(d[(c[10036]|0)+(c[e+(b*40&-1)+32>>2]|0)|0]|0|0)|0)==0){g=c[1054]|0;if((a[(c[10036]|0)+(c[g+(b*40&-1)+32>>2]|0)|0]|0)!=95){f=g;break}}g=b+1|0;h=c[1054]|0;if((c[8272]|0)<=(g|0)){f=h;break}if((a[h+(g*40&-1)|0]&1)==0){f=h;break}i=c[h+(g*40&-1)+36>>2]|0;j=h+(g*40&-1)+32|0;g=c[10036]|0;k=0;while(1){if((k|0)>=(i|0)){break}if((a[g+((c[j>>2]|0)+k|0)|0]|0)==(a[k+115e3|0]|0)){k=k+1|0}else{f=h;break L29029}}if((k|0)==1){l=1}else{f=h;break}return l|0}}while(0);if((a[f+(b*40&-1)|0]&1)==0){l=0;return l|0}do{if((bO(d[(c[10036]|0)+(c[f+(b*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(b*40&-1)+32>>2]|0)|0]|0)==95){break}else{l=0}return l|0}}while(0);f=b+1|0;if((c[8272]|0)<=(f|0)){l=0;return l|0}e=c[1054]|0;if((a[e+(f*40&-1)|0]&1)==0){l=0;return l|0}j=c[e+(f*40&-1)+36>>2]|0;g=e+(f*40&-1)+32|0;f=c[10036]|0;i=0;while(1){if((i|0)>=(j|0)){break}if((a[f+((c[g>>2]|0)+i|0)|0]|0)==(a[i+199040|0]|0)){i=i+1|0}else{l=0;m=21849;break}}if((m|0)==21849){return l|0}if((i|0)!=1){l=0;return l|0}i=b+2|0;if((a[e+(i*40&-1)|0]&1)==0){l=0;return l|0}do{if((bO(d[f+(c[e+(i*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(i*40&-1)+32>>2]|0)|0]|0)==95){break}else{l=0}return l|0}}while(0);i=b+3|0;b=c[8272]|0;L29071:do{if((b|0)>(i|0)){e=i;f=b;while(1){g=c[1054]|0;if((a[g+(e*40&-1)|0]&1)==0){n=e;o=f;break L29071}j=c[g+(e*40&-1)+36>>2]|0;p=g+(e*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(j|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+148464|0]|0)){r=r+1|0}else{n=e;o=f;break L29071}}if((r|0)!=1){n=e;o=f;break L29071}p=e+1|0;if((a[g+(p*40&-1)|0]&1)==0){l=0;m=21856;break}if((bO(d[q+(c[g+(p*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(p*40&-1)+32>>2]|0)|0]|0)!=95){l=0;m=21859;break}}p=e+2|0;j=c[8272]|0;if((j|0)>(p|0)){e=p;f=j}else{n=p;o=j;break L29071}}if((m|0)==21859){return l|0}else if((m|0)==21856){return l|0}}else{n=i;o=b}}while(0);if((o|0)<=(n|0)){l=0;return l|0}b=c[1054]|0;if((a[b+(n*40&-1)|0]&1)==0){l=0;return l|0}i=c[b+(n*40&-1)+36>>2]|0;f=b+(n*40&-1)+32|0;e=c[10036]|0;h=0;while(1){if((h|0)>=(i|0)){break}if((a[e+((c[f>>2]|0)+h|0)|0]|0)==(a[h+131272|0]|0)){h=h+1|0}else{l=0;m=21858;break}}if((m|0)==21858){return l|0}if((h|0)!=1){l=0;return l|0}h=n+1|0;if((o|0)<=(h|0)){l=0;return l|0}if((a[b+(h*40&-1)|0]&1)==0){l=0;return l|0}o=c[b+(h*40&-1)+36>>2]|0;n=b+(h*40&-1)+32|0;h=0;while(1){if((h|0)>=(o|0)){break}if((a[e+((c[n>>2]|0)+h|0)|0]|0)==(a[h+115e3|0]|0)){h=h+1|0}else{l=0;m=21851;break}}if((m|0)==21851){return l|0}l=(h|0)==1&1;return l|0}function ua(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=b;h=b;L29117:while(1){b=a[g]|0;if((b<<24>>24|0)==0){break}else if((b<<24>>24|0)!=92){j=g+1|0;do{if((a[47120]|0)!=0&b<<24>>24==34){if((a[j]|0)!=34){break}a[h]=34;g=g+2|0;h=h+1|0;continue L29117}}while(0);a[h]=b;g=j;h=h+1|0;continue}k=g+1|0;l=a[k]|0;if((l<<24>>24|0)==34){a[h]=34;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==114){a[h]=13;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==92){a[h]=92;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==116){a[h]=9;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==110){a[h]=10;g=g+2|0;h=h+1|0;continue}else{if((l-48&255)>=8){g=k;h=h;continue}if((ca(k|0,(l<<24>>24==48?134368:132688)|0,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=f,v)|0)|0)>0){a[h]=c[e>>2]&255;g=g+((c[f>>2]|0)+1|0)|0;h=h+1|0;continue}else{a[h]=92;a[h+1|0]=a[k]|0;g=g+2|0;h=h+2|0;continue}}}a[h]=0;i=d;return}function ub(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=c[1054]|0;g=c[f+(e*40&-1)+32>>2]|0;h=c[f+(e*40&-1)+36>>2]|0;e=(g-1|0)+h|0;i=db(c[b>>2]|0,(g+h|0)-(c[f+(d*40&-1)+32>>2]|0)|0,116456)|0;c[b>>2]=i;f=(c[(c[1054]|0)+(d*40&-1)+32>>2]|0)+1|0;L29139:do{if((f|0)<(e|0)){h=i;g=f;while(1){j=a[(c[10036]|0)+g|0]|0;if(j<<24>>24==0){k=h;break L29139}l=h+1|0;a[h]=j;j=g+1|0;if((j|0)<(e|0)){h=l;g=j}else{k=l;break}}}else{k=i}}while(0);a[k]=0;k=c[b>>2]|0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(d*40&-1)+32>>2]|0)|0]|0)==34){ua(k);return}else{m=k;n=k}while(1){k=a[n]|0;if((k<<24>>24|0)==39){d=n+1|0;b=(a[d]|0)==39?d:n;o=b;p=a[b]|0}else if((k<<24>>24|0)==0){break}else{o=n;p=k}a[m]=p;m=m+1|0;n=o+1|0}a[m]=0;return}function uc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=uA(a|0)|0;f=(e+1|0)+(uA(b|0)|0)|0;e=ut(f)|0;do{if((e|0)==0){gk();g=ut(f)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=96488,v)|0);return 0}else{h=e}}while(0);uB(h|0,a|0);uC(h|0,b|0);i=d;return h|0}function ud(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=+f;g=+g;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0,_=0.0,$=0,aa=0,ab=0.0,ac=0,ad=0,ae=0,af=0,ag=0,ai=0;j=i;i=i+2144|0;k=j|0;l=j+1032|0;m=j+2064|0;n=j+2072|0;o=j+2080|0;p=j+2088|0;q=j+2096|0;r=j+2104|0;s=j+2112|0;t=j+2120|0;u=j+2128|0;w=j+2136|0;c[m>>2]=0;x=k|0;y=k+1024|0;a[x]=0;k=c[8270]|0;do{if((k|0)!=0){if((aY(k|0,139696)|0)==0){break}bA(4,k|0)}}while(0);k=l|0;z=l+1|0;A=l+2|0;l=y;B=~~g;C=~~g>>>0;D=ah(O(g/4294967296.0),4294967295.0)>>>0;E=g/3.141592653589793;F=e;e=0;G=0.0;H=x;I=0;L29164:while(1){J=F;K=H;while(1){L=a[J]|0;M=J+1|0;if(L<<24>>24!=37){N=K+1|0;a[K]=L;if(L<<24>>24==0|(y|0)==(N|0)){Q=21902;break L29164}else{J=M;K=N;continue}}if((a[M]|0)!=37){break}a[K]=37;J=J+2|0;K=K+1|0}a[k]=37;if((a[M]|0)==35){a[z]=35;R=M;S=A;T=1}else{R=J;S=z;T=I}N=R;L=S;L29176:while(1){U=N+1|0;V=a[U]|0;do{if(V<<24>>24==46){W=46}else{if(((V&255)-48|0)>>>0<10){W=V;break}if((V<<24>>24|0)==45|(V<<24>>24|0)==43|(V<<24>>24|0)==32|(V<<24>>24|0)==39){W=V}else{break L29176}}}while(0);a[L]=W;N=U;L=L+1|0}J=V<<24>>24;do{if((J|0)==108){a[L]=102;a[L+1|0]=0;ue(f,g,0,n,m,k);X=l-K|0;Y=+h[n>>3];a0(K|0,X|0,k|0,(v=i,i=i+8|0,h[v>>3]=Y,v)|0);Z=1;_=f}else if((J|0)==115){a[L]=102;a[L+1|0]=0;ue(1.0,g,1,p,m,k);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=+h[p>>3],v)|0);Z=1;_=1.0}else if((J|0)==84){a[L]=100;a[L+1|0]=0;if(e){if(G!=1.0){Q=21934;break L29164}X=c[m>>2]|0;c[s>>2]=X;$=X}else{ue(1.0,g,0,0,s,74984);$=c[s>>2]|0}a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,c[v>>2]=$,v)|0);Z=e;_=G}else if((J|0)==83){a[L]=100;a[L+1|0]=0;if(e){if(G!=1.0){Q=21940;break L29164}X=c[m>>2]|0;c[t>>2]=X;aa=X}else{ue(1.0,g,1,0,t,74984);aa=c[t>>2]|0}a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,c[v>>2]=aa,v)|0);Z=e;_=G}else if((J|0)==98){a[L]=102;a[L+1|0]=0;ue(3.010299956639812,g,0,q,m,k);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=+h[q>>3],v)|0);Z=1;_=3.010299956639812}else if((J|0)==76){a[L]=100;a[L+1|0]=0;if(e){if(G!=f){Q=21929;break L29164}c[r>>2]=c[m>>2];ab=G}else{ab=f}ue(f,g,0,0,r,74984);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,c[v>>2]=c[r>>2],v)|0);Z=e;_=ab}else if((J|0)==101|(J|0)==69|(J|0)==102|(J|0)==70|(J|0)==103|(J|0)==71){a[L]=V;a[L+1|0]=0;a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=g,v)|0);Z=e;_=G}else if((J|0)==99){a[L]=99;a[L+1|0]=0;if(e){if(G!=1.0){Q=21946;break L29164}X=c[m>>2]|0;c[u>>2]=X;ac=X}else{ue(1.0,g,1,0,u,74984);ac=c[u>>2]|0}X=ac+24|0;if(X>>>0<49){ad=(X|0)/3&-1;c[u>>2]=ad;X=l-K|0;ae=a[ad+204216|0]|0;a0(K|0,X|0,k|0,(v=i,i=i+8|0,c[v>>2]=ae,v)|0);Z=e;_=G;break}else{ae=l-K|0;a0(K|0,ae|0,199792,(v=i,i=i+8|0,c[v>>2]=ac,v)|0);Z=e;_=G;break}}else if((J|0)==116){a[L]=102;a[L+1|0]=0;ue(1.0,g,0,o,m,k);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=+h[o>>3],v)|0);Z=1;_=1.0}else if((J|0)==120|(J|0)==88|(J|0)==111|(J|0)==79){if(+P(+g)<2147483647.0){a[L]=V;a[L+1|0]=0;ae=l-K|0;a0(K|0,ae|0,k|0,(v=i,i=i+8|0,c[v>>2]=B,v)|0);Z=e;_=G;break}else{a[L]=108;a[L+1|0]=108;a[L+2|0]=a[U]|0;a[L+3|0]=0;ae=l-K|0;a0(K|0,ae|0,k|0,(v=i,i=i+16|0,c[v>>2]=C,c[v+8>>2]=D,v)|0);Z=e;_=G;break}}else if((J|0)==80){a[L]=102;a[L+1|0]=0;a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=E,v)|0);Z=e;_=G}else if((J|0)==66){a[L]=99;a[L+1|0]=105;a[L+2|0]=0;if(e){if(G!=3.010299956639812){Q=21954;break L29164}ae=c[m>>2]|0;c[w>>2]=ae;af=ae}else{ue(3.010299956639812,g,0,0,w,74984);af=c[w>>2]|0}if((af-1|0)>>>0<8){ae=l-K|0;X=a[af+184160|0]|0;a0(K|0,ae|0,k|0,(v=i,i=i+8|0,c[v>>2]=X,v)|0);Z=e;_=G;break}if((af|0)>8){X=l-K|0;ae=af-8|0;a0(K|0,X|0,178992,(v=i,i=i+8|0,c[v>>2]=ae,v)|0);Z=e;_=G;break}if((af|0)>=0){Z=e;_=G;break}a0(K|0,l-K|0,174792,(v=i,i=i+8|0,c[v>>2]=af*10&-1,v)|0);Z=e;_=G}else{Q=21963;break L29164}}while(0);if(T){if((U|0)!=(cy(U|0,166744)|0)){Q=21969;break}}L=c[12886]|0;do{if((L|0)!=0){J=uA(L|0)|0;ae=a[c[b$()>>2]|0]|0;X=a8(K|0,ae|0)|0;if((X|0)==0){break}ad=K;ag=X;do{X=uA(ag|0)|0;ai=ag+J|0;if(((ai-ad|0)+X|0)>>>0>d>>>0){Q=21977;break L29164}uH(ai|0,ag+1|0,X|0);uD(ag|0,c[12886]|0,J);ag=a8(ai|0,ae|0)|0;}while((ag|0)!=0)}}while(0);F=N+2|0;e=Z;G=_;H=K+(uA(K|0)|0)|0;I=T}if((Q|0)==21902){uF(b|0,x|0,d|0);if((uA(x|0)|0)>>>0>=d>>>0){a[b+((d|0)==0?0:d-1|0)|0]=0}d=c[8270]|0;if((d|0)==0){i=j;return}if((aY(d|0,139696)|0)==0){i=j;return}bA(4,139696);i=j;return}else if((Q|0)==21940){uf(-1,215448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21946){uf(-1,209728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21929){uf(-1,82024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21954){uf(-1,193648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21969){j=c[8270]|0;if((j|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aY(j|0,139696)|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}bA(4,139696);uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21977){uf(-1,161576,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21963){j=c[8270]|0;if((j|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aY(j|0,139696)|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}bA(4,139696);uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21934){uf(-1,222240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function ue(a,b,d,e,f,g){a=+a;b=+b;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,w=0.0,x=0,y=0.0,z=0;j=i;if(b==0.0){if((e|0)!=0){h[e>>3]=0.0}if((f|0)==0){i=j;return}c[f>>2]=0;i=j;return}if(b<0.0){k=-0.0-b;l=-1.0}else{k=b;l=1.0}b=+bQ(+k)/a;m=~~+O(+b);k=+R(10.0,+((b- +(m|0))*a));if(d){if(a!=1.0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=127848,v)|0)}n=(m|0)%3&-1;if((n|0)==2){o=m;p=22001}else if((n|0)==(-1|0)){o=m-3|0;p=22001}else if((n|0)==0){q=k;r=m}else if((n|0)==1){s=m;p=22003}else if((n|0)==(-2|0)){s=m-3|0;p=22003}else{uf(-1,126488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==22001){q=k*100.0;r=o}else if((p|0)==22003){q=k*10.0;r=s}t=q;u=r-((r|0)%3&-1)|0}else{t=k;u=m}do{if((g|0)==0){w=t;x=u}else{if(d){y=1.0e3}else{y=+R(10.0,+a)}m=a8(g|0,46)|0;if((m|0)==0){z=0}else{z=aE(m+1|0,0,10)|0}if(t+ +R(10.0,+(+(-z|0)))*.5<y){w=t;x=u;break}w=t/y;x=u+(d?3:1)|0}}while(0);if((e|0)!=0){h[e>>3]=l*w}if((f|0)==0){i=j;return}c[f>>2]=x;i=j;return}function uf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0;f=i;i=i+144|0;g=f|0;h=f+16|0;uE(h|0,0,128);do{if((b|0)==(-2|0)){f=c[11932]|0;j=c[8802]|0;if(!((c[12892]|0)!=0&(f|0)!=0&(j|0)!=0)){break}k=c[m>>2]|0;l=(uA(j|0)|0)>>>0>77?76168:179864;n=c[11900]|0;cf(k|0,76792,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=l,c[v+16>>2]=f,c[v+24>>2]=n,v)|0)}else if((b|0)!=(-1|0)){if((a[25280]&1)==0){n=c[m>>2]|0;f=c[12906]|0;l=(f|0)!=0?f:179864;f=c[10036]|0;cf(n|0,153408,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=f,v)|0)}f=c[12906]|0;do{if((f|0)!=0){if((a[f]|0)==0){break}else{o=f}do{aF(32,c[m>>2]|0);o=o+1|0;}while((a[o]|0)!=0)}}while(0);if((c[(c[1054]|0)+(b*40&-1)+32>>2]|0)>0){f=0;do{aF(((a[(c[10036]|0)+f|0]|0)==9?9:32)|0,c[m>>2]|0);f=f+1|0;}while((f|0)<(c[(c[1054]|0)+(b*40&-1)+32>>2]|0))}aI(148792,2,1,c[m>>2]|0)}}while(0);b=c[12906]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}else{p=b}do{aF(32,c[m>>2]|0);p=p+1|0;}while((a[p]|0)!=0)}}while(0);L29346:do{if((a[37400]&1)==0){p=c[8804]|0;do{if((p|0)!=0){b=c[p+4>>2]|0;if((b|0)==0){break}o=c[m>>2]|0;f=c[9354]|0;cf(o|0,146696,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=f,v)|0);break L29346}}while(0);p=c[m>>2]|0;f=c[9354]|0;cf(p|0,144600,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}}while(0);f=g;c[f>>2]=e;c[f+4>>2]=0;b9(h|0,128,d|0,g|0);cf(c[m>>2]|0,141456,(v=i,i=i+8|0,c[v>>2]=h,v)|0);aI(139704,2,1,c[m>>2]|0);g=c[8270]|0;do{if((g|0)!=0){if((aY(g|0,139696)|0)==0){break}bA(4,139696)}}while(0);a[43504]=0;c[6932]=0;c[13544]=0;a[14176]=0;a[25288]=0;a[37408]=0;e7(2);g=e6(137752)|0;if((g|0)==0){iL()}d=g+8|0;do{if((a[d]&1)==0){if((aY(c[g+24>>2]|0,h|0)|0)==0){iL()}f=g+16|0;if((c[f>>2]|0)!=3){q=f;break}uu(c[g+24>>2]|0);c[f>>2]=1;q=f}else{a[d]=0;q=g+16|0}}while(0);d=bP(h|0)|0;c[q>>2]=3;c[g+24>>2]=d;iL()}function ug(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b>>2]|0;c[b>>2]=e+1;f=d[e]|0;if((f&128|0)==0){c[a>>2]=f;g=1;return g|0}if((f&224|0)==192){e=f&31;c[a>>2]=e;h=d[c[b>>2]|0]|0;if((h&192|0)!=128){c[a>>2]=65535;g=0;return g|0}c[a>>2]=e<<6|h&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=128){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}if((f&240|0)==224){h=f&15;c[a>>2]=h;e=d[c[b>>2]|0]|0;do{if((e&192|0)==128){c[a>>2]=h<<6|e&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;j=d[i]|0;if((j&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|j&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=2048){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}if((f&248|0)==240){e=f&7;c[a>>2]=e;h=d[c[b>>2]|0]|0;do{if((h&192|0)==128){c[a>>2]=e<<6|h&63;j=(c[b>>2]|0)+1|0;c[b>>2]=j;i=d[j]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;j=d[i]|0;if((j&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|j&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=65536){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}if((f&252|0)==248){h=f&3;c[a>>2]=h;e=d[c[b>>2]|0]|0;do{if((e&192|0)==128){c[a>>2]=h<<6|e&63;j=(c[b>>2]|0)+1|0;c[b>>2]=j;i=d[j]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;j=d[i]|0;if((j&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|j&63;j=(c[b>>2]|0)+1|0;c[b>>2]=j;i=d[j]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=2097152){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}if((f&254|0)!=252){c[a>>2]=65535;g=0;return g|0}e=f&1;c[a>>2]=e;f=d[c[b>>2]|0]|0;do{if((f&192|0)==128){c[a>>2]=e<<6|f&63;h=(c[b>>2]|0)+1|0;c[b>>2]=h;i=d[h]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;h=d[i]|0;if((h&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|h&63;h=(c[b>>2]|0)+1|0;c[b>>2]=h;i=d[h]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;h=d[i]|0;if((h&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|h&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=67108864){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}function uh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;f=i;i=i+16|0;g=f|0;do{if((b|0)==(-2|0)){h=c[11932]|0;j=c[8802]|0;if(!((c[12892]|0)!=0&(h|0)!=0&(j|0)!=0)){break}k=c[m>>2]|0;l=(uA(j|0)|0)>>>0>77?76168:179864;n=c[11900]|0;cf(k|0,76792,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=l,c[v+16>>2]=h,c[v+24>>2]=n,v)|0)}else if((b|0)!=(-1|0)){if((a[25280]&1)==0){n=c[m>>2]|0;h=c[12906]|0;l=(h|0)!=0?h:179864;h=c[10036]|0;cf(n|0,153408,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=h,v)|0)}h=c[12906]|0;do{if((h|0)!=0){if((a[h]|0)==0){break}else{o=h}do{aF(32,c[m>>2]|0);o=o+1|0;}while((a[o]|0)!=0)}}while(0);if((c[(c[1054]|0)+(b*40&-1)+32>>2]|0)>0){h=0;do{aF(((a[(c[10036]|0)+h|0]|0)==9?9:32)|0,c[m>>2]|0);h=h+1|0;}while((h|0)<(c[(c[1054]|0)+(b*40&-1)+32>>2]|0))}aI(148792,2,1,c[m>>2]|0)}}while(0);b=c[12906]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}else{p=b}do{aF(32,c[m>>2]|0);p=p+1|0;}while((a[p]|0)!=0)}}while(0);L29463:do{if((a[37400]&1)==0){p=c[8804]|0;do{if((p|0)!=0){b=c[p+4>>2]|0;if((b|0)==0){break}o=c[m>>2]|0;h=c[9354]|0;cf(o|0,146696,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=h,v)|0);break L29463}}while(0);p=c[m>>2]|0;h=c[9354]|0;cf(p|0,144600,(v=i,i=i+8|0,c[v>>2]=h,v)|0)}}while(0);aI(135952,9,1,c[m>>2]|0);h=g;c[h>>2]=e;c[h+4>>2]=0;bX(c[m>>2]|0,d|0,g|0);aF(10,c[m>>2]|0);i=f;return}function ui(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=b;while(1){if((aM(a[d]|0|0)|0)==0){e=c;break}else{d=d+1|0}}while(1){if((aM(a[e]|0|0)|0)==0){break}else{e=e+1|0}}c=uA(d|0)|0;b=uA(e|0)|0;f=c;while(1){g=f-1|0;if((aM(a[d+g|0]|0|0)|0)==0){h=b;break}else{f=g}}do{h=h-1|0;}while((aM(a[e+h|0]|0|0)|0)!=0);if((g|0)!=(h|0)){i=0;return i|0}i=(a_(d|0,e|0,f|0)|0)==0;return i|0}function uj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+16|0;g=f|0;do{if((b|0)==(-2|0)){f=c[11932]|0;h=c[8802]|0;if(!((c[12892]|0)!=0&(f|0)!=0&(h|0)!=0)){break}j=c[m>>2]|0;k=(uA(h|0)|0)>>>0>77?76168:179864;l=c[11900]|0;cf(j|0,76792,(v=i,i=i+32|0,c[v>>2]=h,c[v+8>>2]=k,c[v+16>>2]=f,c[v+24>>2]=l,v)|0)}else if((b|0)!=(-1|0)){if((a[25280]&1)==0){l=c[m>>2]|0;f=c[12906]|0;k=(f|0)!=0?f:179864;f=c[10036]|0;cf(l|0,153408,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=f,v)|0)}f=c[12906]|0;do{if((f|0)!=0){if((a[f]|0)==0){break}else{n=f}do{aF(32,c[m>>2]|0);n=n+1|0;}while((a[n]|0)!=0)}}while(0);if((c[(c[1054]|0)+(b*40&-1)+32>>2]|0)>0){f=0;do{aF(((a[(c[10036]|0)+f|0]|0)==9?9:32)|0,c[m>>2]|0);f=f+1|0;}while((f|0)<(c[(c[1054]|0)+(b*40&-1)+32>>2]|0))}aI(148792,2,1,c[m>>2]|0)}}while(0);b=c[12906]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}else{o=b}do{aF(32,c[m>>2]|0);o=o+1|0;}while((a[o]|0)!=0)}}while(0);o=g;c[o>>2]=e;c[o+4>>2]=0;bX(c[m>>2]|0,d|0,g|0);aF(10,c[m>>2]|0);g=c[12906]|0;do{if((g|0)!=0){if((a[g]|0)==0){break}else{p=g}do{aF(32,c[m>>2]|0);p=p+1|0;}while((a[p]|0)!=0)}}while(0);if((a[37400]&1)!=0){aS(143e3);q=c[m>>2]|0;r=aF(10,q|0)|0;a[25288]=0;iL()}p=c[8804]|0;do{if((p|0)!=0){g=c[p+4>>2]|0;if((g|0)==0){break}d=c[m>>2]|0;o=c[9354]|0;cf(d|0,146696,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=o,v)|0);aS(143e3);q=c[m>>2]|0;r=aF(10,q|0)|0;a[25288]=0;iL()}}while(0);cf(c[m>>2]|0,144600,(v=i,i=i+8|0,c[v>>2]=c[9354],v)|0);aS(143e3);q=c[m>>2]|0;r=aF(10,q|0)|0;a[25288]=0;iL()}function uk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e|0;a[33512]=0;lh();e=f|0;g=f;c[g>>2]=d;c[g+4>>2]=0;g=c[12906]|0;do{if((g|0)!=0){if((a[g]|0)==0){break}else{h=g}do{aF(32,c[m>>2]|0);h=h+1|0;}while((a[h]|0)!=0)}}while(0);L29528:do{if((a[37400]&1)==0){h=c[8804]|0;do{if((h|0)!=0){g=c[h+4>>2]|0;if((g|0)==0){break}d=c[m>>2]|0;f=c[9354]|0;cf(d|0,146696,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=f,v)|0);break L29528}}while(0);h=c[m>>2]|0;f=c[9354]|0;cf(h|0,144600,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}}while(0);bX(c[m>>2]|0,b|0,e|0);aI(139704,2,1,c[m>>2]|0);iL()}function ul(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0;j=i;k=+h[a+(b<<6)+8>>3];l=+h[a+(b<<6)+16>>3];m=+h[a+(b<<6)+24>>3];n=+h[a+(d<<6)+8>>3];o=+h[a+(d<<6)+16>>3];p=+h[a+(d<<6)+24>>3];d=(c[a+(b<<6)>>2]|0)==0;q=d?n:k;r=d?o:l;s=d?p:m;t=d?k:n;n=d?l:o;o=d?m:p;d=t==-8.988465674311579e+307;b=n==-8.988465674311579e+307;a=(b?d?2:1:d&1)+(o==-8.988465674311579e+307&1)|0;if((a|0)>1){h[e>>3]=q;h[f>>3]=r;h[g>>3]=s;i=j;return}if((a|0)==1){h[e>>3]=q;h[f>>3]=r;h[g>>3]=s;if(d){h[e>>3]=(c[16508]&2|0)==0?+h[8255]:+h[8256];i=j;return}if(b){h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];i=j;return}else{h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}do{if(q==t){if(r==n){h[e>>3]=q;h[f>>3]=r;b=s<o;d=c[16164]&2;a=(d|0)!=0;p=+h[8083];m=+h[8084];l=a?p:m;do{if(b){if(l<s){u=a?m:p;w=20;break}else{if(((d|0)==0?m:p)>o){w=19;break}else{w=18;break}}}else{if(l<o){x=a?m:p;w=22;break}else{if(((d|0)==0?m:p)>s){w=19;break}else{w=18;break}}}}while(0);if((w|0)==18){h[g>>3]=(d|0)==0?m:p;i=j;return}else if((w|0)==19){l=a?m:p;if(b){u=l;w=20}else{x=l;w=22}}do{if((w|0)==20){if(u<s){uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(((d|0)==0?p:m)<=o){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==22){if(x<o){uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(((d|0)==0?p:m)<=s){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h[g>>3]=(d|0)==0?p:m;i=j;return}if(s==o){h[e>>3]=q;h[g>>3]=s;b=r<n;a=c[16336]&2;y=(a|0)!=0;l=+h[8169];k=+h[8170];z=y?l:k;do{if(b){if(z<r){A=y?k:l;w=36;break}else{if(((a|0)==0?k:l)>n){w=35;break}else{w=34;break}}}else{if(z<n){B=y?k:l;w=38;break}else{if(((a|0)==0?k:l)>r){w=35;break}else{w=34;break}}}}while(0);if((w|0)==34){h[f>>3]=(a|0)==0?k:l;i=j;return}else if((w|0)==35){z=y?k:l;if(b){A=z;w=36}else{B=z;w=38}}do{if((w|0)==36){if(A<r){uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(((a|0)==0?l:k)<=n){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==38){if(B<n){uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(((a|0)==0?l:k)<=r){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h[f>>3]=(a|0)==0?l:k;i=j;return}b=r<n;y=c[16336]&2;d=(y|0)!=0;z=+h[8170];m=+h[8169];p=d?z:m;do{if(b){if(p<r){C=d?m:z;w=55;break}else{if(((y|0)==0?m:z)>n){w=54;break}else{w=49;break}}}else{if(p<n){D=d?m:z;w=57;break}else{if(((y|0)==0?m:z)>r){w=54;break}else{w=49;break}}}}while(0);do{if((w|0)==49){p=(y|0)==0?m:z;if(!(p!=r&p!=n)){w=54;break}k=s+(p-r)*((o-s)/(n-r));p=+h[8083];l=+h[8084];if(p<l){if(k<p|k>l){w=54;break}}else{if(k<l|k>p){w=54;break}}h[e>>3]=q;h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];h[g>>3]=k;i=j;return}}while(0);if((w|0)==54){k=d?m:z;if(b){C=k;w=55}else{D=k;w=57}}do{if((w|0)==55){if(C<r){break}if(((y|0)==0?z:m)<=n){w=59}}else if((w|0)==57){if(D<n){break}if(((y|0)==0?z:m)<=r){w=59}}}while(0);do{if((w|0)==59){k=(y|0)==0?z:m;if(!(k!=r&k!=n)){break}p=s+(k-r)*((o-s)/(n-r));k=+h[8083];l=+h[8084];if(k<l){if(p<k|p>l){break}}else{if(p<l|p>k){break}}h[e>>3]=q;h[f>>3]=(c[16336]&2|0)==0?+h[8170]:+h[8169];h[g>>3]=p;i=j;return}}while(0);y=s<o;b=c[16164]&2;d=(b|0)!=0;p=+h[8084];k=+h[8083];l=d?p:k;do{if(y){if(l<s){E=d?k:p;w=77;break}else{if(((b|0)==0?k:p)>o){w=76;break}else{w=71;break}}}else{if(l<o){F=d?k:p;w=79;break}else{if(((b|0)==0?k:p)>s){w=76;break}else{w=71;break}}}}while(0);do{if((w|0)==71){l=(b|0)==0?k:p;if(!(l!=s&l!=o)){w=76;break}G=r+(l-s)*((n-r)/(o-s));if(m<z){if(G<m|G>z){w=76;break}}else{if(G<z|G>m){w=76;break}}h[e>>3]=q;h[f>>3]=G;h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}while(0);if((w|0)==76){G=d?k:p;if(y){E=G;w=77}else{F=G;w=79}}if((w|0)==77){if(E<s){break}if(((b|0)==0?p:k)>o){break}}else if((w|0)==79){if(F<o){break}if(((b|0)==0?p:k)>s){break}}G=(b|0)==0?p:k;if(!(G!=s&G!=o)){break}l=r+(G-s)*((n-r)/(o-s));if(m<z){if(l<m|l>z){break}}else{if(l<z|l>m){break}}h[e>>3]=q;h[f>>3]=l;h[g>>3]=(c[16164]&2|0)==0?+h[8084]:+h[8083];i=j;return}}while(0);do{if(r==n){if(o==s){h[f>>3]=r;h[g>>3]=s;a=q<t;H=c[16508]&2;I=(H|0)!=0;F=+h[8255];E=+h[8256];D=I?F:E;do{if(a){if(D<q){J=I?E:F;w=97;break}else{if(((H|0)==0?E:F)>t){w=96;break}else{w=95;break}}}else{if(D<t){K=I?E:F;w=99;break}else{if(((H|0)==0?E:F)>q){w=96;break}else{w=95;break}}}}while(0);if((w|0)==95){h[e>>3]=(H|0)==0?E:F;i=j;return}else if((w|0)==96){D=I?E:F;if(a){J=D;w=97}else{K=D;w=99}}do{if((w|0)==97){if(J<q){uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(((H|0)==0?F:E)<=t){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==99){if(K<t){uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(((H|0)==0?F:E)<=q){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h[e>>3]=(H|0)==0?F:E;i=j;return}a=q<t;I=c[16508]&2;b=(I|0)!=0;D=+h[8256];m=+h[8255];z=b?D:m;do{if(a){if(z<q){L=b?m:D;w=116;break}else{if(((I|0)==0?m:D)>t){w=115;break}else{w=110;break}}}else{if(z<t){M=b?m:D;w=118;break}else{if(((I|0)==0?m:D)>q){w=115;break}else{w=110;break}}}}while(0);do{if((w|0)==110){z=(I|0)==0?m:D;if(!(z!=q&z!=t)){w=115;break}E=s+(z-q)*((o-s)/(t-q));F=+h[8083];k=+h[8084];if(F<k){if(E<F|E>k){w=115;break}}else{if(E<k|E>F){w=115;break}}h[e>>3]=z;h[f>>3]=r;h[g>>3]=E;i=j;return}}while(0);if((w|0)==115){E=b?m:D;if(a){L=E;w=116}else{M=E;w=118}}do{if((w|0)==116){if(L<q){break}if(((I|0)==0?D:m)<=t){w=120}}else if((w|0)==118){if(M<t){break}if(((I|0)==0?D:m)<=q){w=120}}}while(0);do{if((w|0)==120){E=(I|0)==0?D:m;if(!(E!=q&E!=t)){break}z=s+(E-q)*((o-s)/(t-q));F=+h[8083];k=+h[8084];if(F<k){if(z<F|z>k){break}}else{if(z<k|z>F){break}}h[e>>3]=E;h[f>>3]=r;h[g>>3]=z;i=j;return}}while(0);I=s<o;a=c[16164]&2;b=(a|0)!=0;z=+h[8084];E=+h[8083];F=b?z:E;do{if(I){if(F<s){N=b?E:z;w=138;break}else{if(((a|0)==0?E:z)>o){w=137;break}else{w=132;break}}}else{if(F<o){O=b?E:z;w=140;break}else{if(((a|0)==0?E:z)>s){w=137;break}else{w=132;break}}}}while(0);do{if((w|0)==132){F=(a|0)==0?E:z;if(!(F!=s&F!=o)){w=137;break}k=q+(F-s)*((t-q)/(o-s));if(m<D){if(k<m|k>D){w=137;break}}else{if(k<D|k>m){w=137;break}}h[e>>3]=k;h[f>>3]=r;h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}while(0);if((w|0)==137){k=b?E:z;if(I){N=k;w=138}else{O=k;w=140}}if((w|0)==138){if(N<s){break}if(((a|0)==0?z:E)>o){break}}else if((w|0)==140){if(O<o){break}if(((a|0)==0?z:E)>s){break}}k=(a|0)==0?z:E;if(!(k!=s&k!=o)){break}F=q+(k-s)*((t-q)/(o-s));if(m<D){if(F<m|F>D){break}}else{if(F<D|F>m){break}}h[e>>3]=F;h[f>>3]=r;h[g>>3]=(c[16164]&2|0)==0?+h[8084]:+h[8083];i=j;return}}while(0);do{if(s==o){H=q<t;y=c[16508]|0;d=y&2;P=(d|0)!=0;O=+h[8256];N=+h[8255];M=P?O:N;do{if(H){if(M<q){Q=P?N:O;w=162;break}else{if(((d|0)==0?N:O)>t){w=161;break}else{w=156;break}}}else{if(M<t){R=P?N:O;w=164;break}else{if(((d|0)==0?N:O)>q){w=161;break}else{w=156;break}}}}while(0);do{if((w|0)==156){M=(d|0)==0?N:O;if(!(M!=q&M!=t)){w=161;break}m=r+(M-q)*((n-r)/(t-q));D=+h[8169];E=+h[8170];if(D<E){if(m<D|m>E){w=161;break}}else{if(m<E|m>D){w=161;break}}h[e>>3]=M;h[f>>3]=m;h[g>>3]=s;i=j;return}}while(0);if((w|0)==161){m=P?N:O;if(H){Q=m;w=162}else{R=m;w=164}}do{if((w|0)==162){if(Q<q){break}if(((d|0)==0?O:N)<=t){w=166}}else if((w|0)==164){if(R<t){break}if(((d|0)==0?O:N)<=q){w=166}}}while(0);do{if((w|0)==166){m=(d|0)==0?O:N;if(!(m!=q&m!=t)){break}M=r+(m-q)*((n-r)/(t-q));D=+h[8169];E=+h[8170];if(D<E){if(M<D|M>E){break}}else{if(M<E|M>D){break}}h[e>>3]=m;h[f>>3]=M;h[g>>3]=s;i=j;return}}while(0);d=r<n;H=c[16336]&2;P=(H|0)!=0;M=+h[8170];m=+h[8169];D=P?M:m;do{if(d){if(D<r){S=P?m:M;w=184;break}else{if(((H|0)==0?m:M)>n){w=183;break}else{w=178;break}}}else{if(D<n){T=P?m:M;w=186;break}else{if(((H|0)==0?m:M)>r){w=183;break}else{w=178;break}}}}while(0);do{if((w|0)==178){D=(H|0)==0?m:M;if(!(D!=r&D!=n)){w=183;break}E=q+(D-r)*((t-q)/(n-r));if(N<O){if(E<N|E>O){w=183;break}}else{if(E<O|E>N){w=183;break}}h[e>>3]=E;h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];h[g>>3]=s;i=j;return}}while(0);if((w|0)==183){E=P?m:M;if(d){S=E;w=184}else{T=E;w=186}}if((w|0)==184){if(S<r){U=y;V=O;W=N;break}if(((H|0)==0?M:m)>n){U=y;V=O;W=N;break}}else if((w|0)==186){if(T<n){U=y;V=O;W=N;break}if(((H|0)==0?M:m)>r){U=y;V=O;W=N;break}}E=(H|0)==0?M:m;if(!(E!=r&E!=n)){U=y;V=O;W=N;break}D=q+(E-r)*((t-q)/(n-r));if(N<O){if(D<N|D>O){U=y;V=O;W=N;break}}else{if(D<O|D>N){U=y;V=O;W=N;break}}h[e>>3]=D;h[f>>3]=(c[16336]&2|0)==0?+h[8170]:+h[8169];h[g>>3]=s;i=j;return}else{U=c[16508]|0;V=+h[8256];W=+h[8255]}}while(0);a=q<t;I=U&2;U=(I|0)!=0;T=U?V:W;do{if(a){if(T<q){X=U?W:V;w=209;break}else{if(((I|0)==0?W:V)>t){w=208;break}else{w=200;break}}}else{if(T<t){Y=U?W:V;w=211;break}else{if(((I|0)==0?W:V)>q){w=208;break}else{w=200;break}}}}while(0);do{if((w|0)==200){T=(I|0)==0?W:V;if(!(T!=q&T!=t)){w=208;break}S=T-q;R=t-q;Q=r+S*((n-r)/R);D=s+S*((o-s)/R);R=+h[8169];S=+h[8170];if(R<S){if(Q<R|Q>S){w=208;break}}else{if(Q<S|Q>R){w=208;break}}R=+h[8083];S=+h[8084];if(R<S){if(D<R|D>S){w=208;break}}else{if(D<S|D>R){w=208;break}}h[e>>3]=T;h[f>>3]=Q;h[g>>3]=D;i=j;return}}while(0);if((w|0)==208){D=U?W:V;if(a){X=D;w=209}else{Y=D;w=211}}do{if((w|0)==209){if(X<q){break}if(((I|0)==0?V:W)<=t){w=213}}else if((w|0)==211){if(Y<t){break}if(((I|0)==0?V:W)<=q){w=213}}}while(0);do{if((w|0)==213){Y=(I|0)==0?V:W;if(!(Y!=q&Y!=t)){break}X=Y-q;D=t-q;Q=r+X*((n-r)/D);T=s+X*((o-s)/D);D=+h[8169];X=+h[8170];if(D<X){if(Q<D|Q>X){break}}else{if(Q<X|Q>D){break}}D=+h[8083];X=+h[8084];if(D<X){if(T<D|T>X){break}}else{if(T<X|T>D){break}}h[e>>3]=Y;h[f>>3]=Q;h[g>>3]=T;i=j;return}}while(0);I=r<n;a=c[16336]&2;U=(a|0)!=0;T=+h[8170];Q=+h[8169];Y=U?T:Q;do{if(I){if(Y<r){Z=U?Q:T;w=237;break}else{if(((a|0)==0?Q:T)>n){w=236;break}else{w=228;break}}}else{if(Y<n){_=U?Q:T;w=239;break}else{if(((a|0)==0?Q:T)>r){w=236;break}else{w=228;break}}}}while(0);do{if((w|0)==228){Y=(a|0)==0?Q:T;if(!(Y!=r&Y!=n)){w=236;break}D=Y-r;Y=n-r;X=q+D*((t-q)/Y);R=s+D*((o-s)/Y);if(W<V){if(X<W|X>V){w=236;break}}else{if(X<V|X>W){w=236;break}}Y=+h[8083];D=+h[8084];if(Y<D){if(R<Y|R>D){w=236;break}}else{if(R<D|R>Y){w=236;break}}h[e>>3]=X;h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];h[g>>3]=R;i=j;return}}while(0);if((w|0)==236){R=U?Q:T;if(I){Z=R;w=237}else{_=R;w=239}}do{if((w|0)==237){if(Z<r){break}if(((a|0)==0?T:Q)<=n){w=241}}else if((w|0)==239){if(_<n){break}if(((a|0)==0?T:Q)<=r){w=241}}}while(0);do{if((w|0)==241){_=(a|0)==0?T:Q;if(!(_!=r&_!=n)){break}Z=_-r;_=n-r;R=q+Z*((t-q)/_);X=s+Z*((o-s)/_);if(W<V){if(R<W|R>V){break}}else{if(R<V|R>W){break}}_=+h[8083];Z=+h[8084];if(_<Z){if(X<_|X>Z){break}}else{if(X<Z|X>_){break}}h[e>>3]=R;h[f>>3]=(c[16336]&2|0)==0?+h[8170]:+h[8169];h[g>>3]=X;i=j;return}}while(0);a=s<o;I=c[16164]&2;U=(I|0)!=0;X=+h[8084];R=+h[8083];_=U?X:R;do{if(a){if(_<s){$=U?R:X;w=265;break}else{if(((I|0)==0?R:X)>o){w=264;break}else{w=256;break}}}else{if(_<o){aa=U?R:X;w=267;break}else{if(((I|0)==0?R:X)>s){w=264;break}else{w=256;break}}}}while(0);do{if((w|0)==256){_=(I|0)==0?R:X;if(!(_!=s&_!=o)){w=264;break}Z=_-s;_=o-s;Y=q+Z*((t-q)/_);D=r+Z*((n-r)/_);if(W<V){if(Y<W|Y>V){w=264;break}}else{if(Y<V|Y>W){w=264;break}}if(Q<T){if(D<Q|D>T){w=264;break}}else{if(D<T|D>Q){w=264;break}}h[e>>3]=Y;h[f>>3]=D;h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}while(0);if((w|0)==264){D=U?R:X;if(a){$=D;w=265}else{aa=D;w=267}}do{if((w|0)==265){if($<s){break}if(((I|0)==0?X:R)<=o){w=269}}else if((w|0)==267){if(aa<o){break}if(((I|0)==0?X:R)<=s){w=269}}}while(0);do{if((w|0)==269){aa=(I|0)==0?X:R;if(!(aa!=s&aa!=o)){break}$=aa-s;aa=o-s;D=q+$*((t-q)/aa);Y=r+$*((n-r)/aa);if(W<V){if(D<W|D>V){break}}else{if(D<V|D>W){break}}if(Q<T){if(Y<Q|Y>T){break}}else{if(Y<T|Y>Q){break}}h[e>>3]=D;h[f>>3]=Y;h[g>>3]=(c[16164]&2|0)==0?+h[8084]:+h[8083];i=j;return}}while(0);h[e>>3]=q;h[f>>3]=r;h[g>>3]=s;i=j;return}function um(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0.0;g=+h[a+(b<<6)+8>>3];i=+h[a+(b<<6)+16>>3];j=+h[a+(b<<6)+24>>3];k=+h[a+(c<<6)+8>>3];l=+h[a+(c<<6)+16>>3];m=+h[a+(c<<6)+24>>3];c=g==-8.988465674311579e+307;a=k==-8.988465674311579e+307;b=i==-8.988465674311579e+307;n=l==-8.988465674311579e+307;o=j==-8.988465674311579e+307;p=m==-8.988465674311579e+307;if((((((o&1)+(b&1)|0)+(a?c?2:1:c&1)|0)+(n&1)|0)+(p&1)|0)>1){q=0;return q|0}if(a|c){r=c?l:i;s=c?m:j;if((c?k:g)<=+h[8256]){q=0;return q|0}t=+h[8169];u=+h[8170];do{if(t<u){if(r<t|r>u){q=0}else{break}return q|0}else{if(r<u|r>t){q=0}else{break}return q|0}}while(0);t=+h[8083];u=+h[8084];do{if(t<u){if(s<t|s>u){q=0}else{break}return q|0}else{if(s<u|s>t){q=0}else{break}return q|0}}while(0);h[d>>3]=+h[8255];h[e>>3]=r;h[f>>3]=s;h[d+8>>3]=+h[8256];h[e+8>>3]=r;h[f+8>>3]=s;q=1;return q|0}if(n|b){s=b?k:g;r=b?m:j;if((b?l:i)<=+h[8170]){q=0;return q|0}t=+h[8255];u=+h[8256];do{if(t<u){if(s<t|s>u){q=0}else{break}return q|0}else{if(s<u|s>t){q=0}else{break}return q|0}}while(0);t=+h[8083];u=+h[8084];do{if(t<u){if(r<t|r>u){q=0}else{break}return q|0}else{if(r<u|r>t){q=0}else{break}return q|0}}while(0);h[d>>3]=s;h[e>>3]=+h[8169];h[f>>3]=r;h[d+8>>3]=s;h[e+8>>3]=+h[8170];h[f+8>>3]=r;q=1;return q|0}if(p|o){r=o?k:g;s=o?l:i;if((o?m:j)<=+h[8084]){q=0;return q|0}t=+h[8255];u=+h[8256];do{if(t<u){if(r<t|r>u){q=0}else{break}return q|0}else{if(r<u|r>t){q=0}else{break}return q|0}}while(0);t=+h[8169];u=+h[8170];do{if(t<u){if(s<t|s>u){q=0}else{break}return q|0}else{if(s<u|s>t){q=0}else{break}return q|0}}while(0);h[d>>3]=r;h[e>>3]=s;h[f>>3]=+h[8083];h[d+8>>3]=r;h[e+8>>3]=s;h[f+8>>3]=+h[8084];q=1;return q|0}s=+h[8083];if((j>m?j:m)<s){q=0;return q|0}o=j<m;r=+h[8084];if((o?j:m)>r){q=0;return q|0}t=+h[8255];if((g>k?g:k)<t){q=0;return q|0}p=g<k;u=+h[8256];if((p?g:k)>u){q=0;return q|0}v=+h[8169];if((i>l?i:l)<v){q=0;return q|0}b=i<l;w=+h[8170];if((b?i:l)>w){q=0;return q|0}n=g==k;c=i==l;a=j==m;if(n&c&a){q=0;return q|0}if(n){n=t<u;if(c){do{if(n){if(g<t|g>u){q=0}else{break}return q|0}else{if(g<u|g>t){q=0}else{break}return q|0}}while(0);do{if(v<w){if(i<v|i>w){q=0}else{break}return q|0}else{if(i<w|i>v){q=0}else{break}return q|0}}while(0);do{if(o){if(s<j|s>m){q=0}else{break}return q|0}else{if(s<m|s>j){q=0}else{break}return q|0}}while(0);h[d>>3]=g;h[e>>3]=i;h[f>>3]=+h[8083];h[d+8>>3]=g;h[e+8>>3]=i;h[f+8>>3]=+h[8084];q=1;return q|0}if(a){do{if(n){if(g<t|g>u){q=0}else{break}return q|0}else{if(g<u|g>t){q=0}else{break}return q|0}}while(0);do{if(s<r){if(j<s|j>r){q=0}else{break}return q|0}else{if(j<r|j>s){q=0}else{break}return q|0}}while(0);do{if(b){if(v<i|v>l){q=0}else{break}return q|0}else{if(v<l|v>i){q=0}else{break}return q|0}}while(0);h[d>>3]=g;h[e>>3]=+h[8169];h[f>>3]=j;h[d+8>>3]=g;h[e+8>>3]=+h[8170];h[f+8>>3]=j;q=1;return q|0}else{do{if(n){if(k<t|k>u){q=0}else{break}return q|0}else{if(k<u|k>t){q=0}else{break}return q|0}}while(0);x=l-i;y=(v-i)/x;z=(w-i)/x;n=y>z;A=n?y:z;B=n?z:y;y=m-j;z=(s-j)/y;C=(r-j)/y;n=z>C;D=n?z:C;E=n?C:z;z=B>E?B:E;E=z>0.0?z:0.0;z=A<D?A:D;D=z<1.0?z:1.0;if(E>D){q=0;return q|0}h[d>>3]=g;h[e>>3]=i+x*E;h[f>>3]=j+y*E;h[d+8>>3]=g;h[e+8>>3]=i+x*D;h[f+8>>3]=j+y*D;D=+h[8169];y=+h[8170];x=+h[e>>3];if(D<y){if(!(x<D|x>y)){F=385}}else{if(!(x<y|x>D)){F=385}}do{if((F|0)==385){D=+h[8083];x=+h[8084];y=+h[f>>3];if(D<x){if(y<D|y>x){break}else{q=1}return q|0}else{if(y<x|y>D){break}else{q=1}return q|0}}}while(0);q=0;return q|0}}if(!c){if(!a){D=k-g;y=(t-g)/D;x=(u-g)/D;c=y>x;E=c?y:x;z=c?x:y;y=l-i;x=(v-i)/y;A=(w-i)/y;c=x>A;B=c?x:A;C=c?A:x;x=m-j;A=(s-j)/x;G=(r-j)/x;c=A>G;H=c?A:G;I=c?G:A;A=z>C?z:C;c=I>0.0;n=A>(c?I:0.0);C=n|c^1?n?A:0.0:I;I=E<B?E:B;n=H<1.0;c=I<(n?H:1.0);B=c|n^1?c?I:1.0:H;if(C>B){q=0;return q|0}h[d>>3]=g+D*C;h[e>>3]=i+y*C;h[f>>3]=j+x*C;h[d+8>>3]=g+D*B;h[e+8>>3]=i+y*B;h[f+8>>3]=j+x*B;B=+h[8255];x=+h[8256];y=+h[d>>3];if(B<x){if(!(y<B|y>x)){F=428}}else{if(!(y<x|y>B)){F=428}}do{if((F|0)==428){B=+h[8169];y=+h[8170];x=+h[e>>3];if(B<y){if(x<B|x>y){break}}else{if(x<y|x>B){break}}B=+h[8083];x=+h[8084];y=+h[f>>3];if(B<x){if(y<B|y>x){break}else{q=1}return q|0}else{if(y<x|y>B){break}else{q=1}return q|0}}}while(0);q=0;return q|0}do{if(s<r){if(m<s|m>r){q=0}else{break}return q|0}else{if(m<r|m>s){q=0}else{break}return q|0}}while(0);B=k-g;y=(t-g)/B;x=(u-g)/B;c=y>x;D=c?y:x;C=c?x:y;y=l-i;x=(v-i)/y;H=(w-i)/y;c=x>H;I=c?x:H;E=c?H:x;x=C>E?C:E;E=x>0.0?x:0.0;x=D<I?D:I;I=x<1.0?x:1.0;if(E>I){q=0;return q|0}h[d>>3]=g+B*E;h[e>>3]=i+y*E;h[f>>3]=j;h[d+8>>3]=g+B*I;h[e+8>>3]=i+y*I;h[f+8>>3]=j;I=+h[8255];y=+h[8256];B=+h[d>>3];if(I<y){if(!(B<I|B>y)){F=420}}else{if(!(B<y|B>I)){F=420}}do{if((F|0)==420){I=+h[8169];B=+h[8170];y=+h[e>>3];if(I<B){if(y<I|y>B){break}else{q=1}return q|0}else{if(y<B|y>I){break}else{q=1}return q|0}}}while(0);q=0;return q|0}c=v<w;if(a){do{if(c){if(i<v|i>w){q=0}else{break}return q|0}else{if(i<w|i>v){q=0}else{break}return q|0}}while(0);do{if(s<r){if(j<s|j>r){q=0}else{break}return q|0}else{if(j<r|j>s){q=0}else{break}return q|0}}while(0);do{if(p){if(t<g|t>k){q=0}else{break}return q|0}else{if(t<k|t>g){q=0}else{break}return q|0}}while(0);h[d>>3]=t;h[e>>3]=i;h[f>>3]=j;h[d+8>>3]=+h[8256];h[e+8>>3]=i;h[f+8>>3]=j;q=1;return q|0}else{do{if(c){if(l<v|l>w){q=0}else{break}return q|0}else{if(l<w|l>v){q=0}else{break}return q|0}}while(0);v=k-g;k=(t-g)/v;t=(u-g)/v;c=k>t;u=c?k:t;l=c?t:k;k=m-j;m=(s-j)/k;s=(r-j)/k;c=m>s;r=c?m:s;t=c?s:m;m=l>t?l:t;t=m>0.0?m:0.0;m=u<r?u:r;r=m<1.0?m:1.0;if(t>r){q=0;return q|0}h[d>>3]=g+v*t;h[e>>3]=i;h[f>>3]=j+k*t;h[d+8>>3]=g+v*r;h[e+8>>3]=i;h[f+8>>3]=j+k*r;r=+h[8255];k=+h[8256];j=+h[d>>3];if(r<k){if(!(j<r|j>k)){F=408}}else{if(!(j<k|j>r)){F=408}}do{if((F|0)==408){r=+h[8083];j=+h[8084];k=+h[f>>3];if(r<j){if(k<r|k>j){break}else{q=1}return q|0}else{if(k<j|k>r){break}else{q=1}return q|0}}}while(0);q=0;return q|0}return 0}function un(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0;g=i;i=i+64|0;j=f;f=i;i=i+16|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];j=g|0;k=g+16|0;l=g+24|0;m=g+32|0;n=g+40|0;o=g+48|0;p=c[e>>2]|0;q=c[e+4>>2]|0;r=e+8|0;s=e+16|0;t=+h[s>>3];u=+h[e+24>>3];v=e+32|0;w=a[v]|0;if((d|0)==0){x=~~(+h[b>>3]*+(c[180]|0))+(c[186]|0)|0;y=~~(+h[b+8>>3]*+(c[40]|0))+(c[46]|0)|0;h[e+48>>3]=+h[b+32>>3];z=j;A=e+40|0;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];do{if((p|0)!=0){A=c[(c[3524]|0)+92>>2]|0;if(u<0.0){cK[A&63](+h[3817]);break}else{cK[A&63](u);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[s>>3]);s=c[(c[3524]|0)+64>>2]|0;if((q|0)<-5){cM[s&511](-2)}else{cM[s&511](q)}s=c[3524]|0;do{if((a[v]&1)==0){if((c[s+96>>2]&1024|0)!=0){break}c[j>>2]=1;c[j+4>>2]=q;B=516}else{B=516}}while(0);if((B|0)==516){fn(j,s)}s=c[13542]|0;do{if((s|0)!=0){j=(c[s>>2]|0)>(x|0)&1;v=(c[s+4>>2]|0)<(x|0)?j|2:j;j=(c[s+8>>2]|0)>(y|0)?v|4:v;if((((c[s+12>>2]|0)<(y|0)?j|8:j)|0)==0){break}i=g;return}}while(0);cR[c[(c[3524]|0)+80>>2]&127](x,y,c[r>>2]|0);i=g;return}C=+(c[180]|0);y=c[186]|0;x=~~(+h[b>>3]*C)+y|0;D=+(c[40]|0);s=c[46]|0;j=~~(+h[b+8>>3]*D)+s|0;v=~~(C*+h[d>>3])+y|0;y=~~(D*+h[d+8>>3])+s|0;s=c[f>>2]|0;A=c[f+4>>2]|0;if((s|0)==6){E=(+h[b+32>>3]+ +h[d+32>>3])*.5}else{E=+h[f+8>>3]}f=o|0;c[f>>2]=s;s=o+4|0;c[s>>2]=A;h[o+8>>3]=E;do{if((p|0)!=0){A=c[(c[3524]|0)+92>>2]|0;if(u<0.0){cK[A&63](+h[3817]);break}else{cK[A&63](u);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](t);p=c[(c[3524]|0)+64>>2]|0;if((q|0)<-5){cM[p&511](-2)}else{cM[p&511](q)}p=c[3524]|0;do{if((w&1)==0){if((c[p+96>>2]&1024|0)!=0){break}c[f>>2]=1;c[s>>2]=q;B=532}else{B=532}}while(0);if((B|0)==532){fn(o,p)}p=c[r>>2]|0;if((p|0)==(-10|0)){fm(x,j,v,y,1);i=g;return}else if((p|0)==(-11|0)){fm(x,j,v,y,2);i=g;return}else{c[k>>2]=x;c[l>>2]=j;c[m>>2]=v;c[n>>2]=y;y=c[3524]|0;if((fl(k,l,m,n)|0)==0){i=g;return}cN[c[y+56>>2]&255](c[k>>2]|0,c[l>>2]|0);cN[c[y+60>>2]&255](c[m>>2]|0,c[n>>2]|0);i=g;return}}function uo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0;e=i;i=i+16|0;f=e|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(b,0,d);i=e;return}}while(0);g=~~(+h[b>>3]*+(c[180]|0))+(c[186]|0)|0;j=~~(+h[b+8>>3]*+(c[40]|0))+(c[46]|0)|0;h[d+48>>3]=+h[b+32>>3];b=f;k=d+40|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=c[d+4>>2]|0;do{if((c[d>>2]|0)!=0){l=+h[d+24>>3];b=c[(c[3524]|0)+92>>2]|0;if(l<0.0){cK[b&63](+h[3817]);break}else{cK[b&63](l);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[d+16>>3]);b=c[(c[3524]|0)+64>>2]|0;if((k|0)<-5){cM[b&511](-2)}else{cM[b&511](k)}b=c[3524]|0;do{if((a[d+32|0]&1)==0){if((c[b+96>>2]&1024|0)!=0){break}c[f>>2]=1;c[f+4>>2]=k;m=558}else{m=558}}while(0);if((m|0)==558){fn(f,b)}b=c[13542]|0;do{if((b|0)!=0){f=(c[b>>2]|0)>(g|0)&1;m=(c[b+4>>2]|0)<(g|0)?f|2:f;f=(c[b+8>>2]|0)>(j|0)?m|4:m;if((((c[b+12>>2]|0)<(j|0)?f|8:f)|0)==0){break}i=e;return}}while(0);cR[c[(c[3524]|0)+80>>2]&127](g,j,c[d+8>>2]|0);i=e;return}function up(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0;e=i;i=i+32|0;f=e|0;g=e+8|0;j=e+16|0;k=e+24|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(30448,b,d);l=b;c[7612]=c[l>>2];c[7613]=c[l+4>>2];c[7614]=c[l+8>>2];c[7615]=c[l+12>>2];c[7616]=c[l+16>>2];c[7617]=c[l+20>>2];c[7618]=c[l+24>>2];c[7619]=c[l+28>>2];c[7620]=c[l+32>>2];c[7621]=c[l+36>>2];c[7622]=c[l+40>>2];c[7623]=c[l+44>>2];i=e;return}}while(0);if((a[d+32|0]&1)!=0){un(30448,b,d,d+40|0);d=b;c[7612]=c[d>>2];c[7613]=c[d+4>>2];c[7614]=c[d+8>>2];c[7615]=c[d+12>>2];c[7616]=c[d+16>>2];c[7617]=c[d+20>>2];c[7618]=c[d+24>>2];c[7619]=c[d+28>>2];c[7620]=c[d+32>>2];c[7621]=c[d+36>>2];c[7622]=c[d+40>>2];c[7623]=c[d+44>>2];i=e;return}m=+(c[180]|0);d=c[186]|0;n=+(c[40]|0);l=c[46]|0;o=~~(+h[3807]*n)+l|0;p=~~(m*+h[b>>3])+d|0;q=~~(n*+h[b+8>>3])+l|0;c[f>>2]=~~(+h[3806]*m)+d;c[g>>2]=o;c[j>>2]=p;c[k>>2]=q;q=c[3524]|0;if((fl(f,g,j,k)|0)!=0){cN[c[q+56>>2]&255](c[f>>2]|0,c[g>>2]|0);cN[c[q+60>>2]&255](c[j>>2]|0,c[k>>2]|0)}k=b;c[7612]=c[k>>2];c[7613]=c[k+4>>2];c[7614]=c[k+8>>2];c[7615]=c[k+12>>2];c[7616]=c[k+16>>2];c[7617]=c[k+20>>2];c[7618]=c[k+24>>2];c[7619]=c[k+28>>2];c[7620]=c[k+32>>2];c[7621]=c[k+36>>2];c[7622]=c[k+40>>2];c[7623]=c[k+44>>2];i=e;return}function uq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;e=i;do{if((b|0)==32){uu(c[8776]|0);c[8780]=0;c[8774]=0;c[8776]=0;c[8778]=0;f=582}else if((b|0)==1){if((c[8776]|0)==0){f=582;break}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=198504,v)|0);return 0}else if((b|0)==4){if((d|0)==0){break}if((a[d]|0)==0){break}g=c[8782]|0;h=(c[8780]|0)-g|0;j=uA(d|0)|0;k=c[8776]|0;l=h+1|0;if((k|0)!=0&(g|0)!=0){uH(k|0,g|0,l|0);n=c[8776]|0}else{n=k}k=j+1|0;g=db(n,k+l|0,131160)|0;c[8776]=g;uH(g+k|0,g|0,l|0);uB(c[8776]|0,d|0);a[(c[8776]|0)+j|0]=58;j=c[8776]|0;c[8782]=j+k;c[8780]=j+(k+h|0);h=a8(j|0,58)|0;if((h|0)==0){break}else{o=h}do{a[o]=0;o=a8(o+1|0,58)|0;}while((o|0)!=0)}else if((b|0)==2){h=c[m>>2]|0;do{if((c[8776]|0)==0){aI(90464,19,1,h|0)}else{aI(116392,13,1,h|0);j=c[8776]|0;k=c[m>>2]|0;if(j>>>0<(c[8782]|0)>>>0){l=j;j=k;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=l,v)|0);g=l+((uA(l|0)|0)+1|0)|0;p=c[m>>2]|0;if(g>>>0<(c[8782]|0)>>>0){l=g;j=p}else{q=p;break}}}else{q=k}aF(10,q|0);if((c[8782]|0)==0){break}j=c[m>>2]|0;aI(96440,30,1,j|0);j=c[8782]|0;l=c[m>>2]|0;if(j>>>0<(c[8780]|0)>>>0){p=j;j=l;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=p,v)|0);g=p+((uA(p|0)|0)+1|0)|0;r=c[m>>2]|0;if(g>>>0<(c[8780]|0)>>>0){p=g;j=r}else{s=r;break}}}else{s=l}aF(10,s|0)}}while(0);cf(c[m>>2]|0,81808,(v=i,i=i+8|0,c[v>>2]=74944,v)|0)}else if((b|0)==16){c[8778]=c[8782];f=603}else if((b|0)==8){f=603}}while(0);if((f|0)==582){b=bU(148328)|0;do{if((b|0)==0){t=0}else{s=uA(b|0)|0;q=bP(b|0)|0;c[8776]=q;c[8780]=q+s;s=a8(q|0,58)|0;if((s|0)==0){t=q;break}else{u=s}do{a[u]=0;u=a8(u+1|0,58)|0;}while((u|0)!=0);t=c[8776]|0}}while(0);c[8782]=t}else if((f|0)==603){f=c[8776]|0;if((f|0)==0){w=0;i=e;return w|0}t=c[8774]|0;do{if((t|0)==0){c[8774]=f;u=c[8778]|0;if((u|0)!=0){x=f;y=u;break}u=c[8780]|0;c[8778]=u;x=f;y=u}else{u=t+((uA(t|0)|0)+1|0)|0;c[8774]=u;x=u;y=c[8778]|0}}while(0);if(x>>>0<y>>>0){w=x;i=e;return w|0}c[8774]=0;c[8778]=0;w=0;i=e;return w|0}w=c[8776]|0;i=e;return w|0}function ur(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=i;i=i+256|0;f=e|0;if(!(a[42184]|0)){a[42184]=1;ur(1,0)}do{if((b|0)==32){uu(c[10554]|0);c[10552]=0;c[10548]=0;c[10554]=0;c[10550]=0;g=622}else if((b|0)==1){if((c[10554]|0)==0){g=622;break}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=222176,v)|0);return 0}else if((b|0)==4){if((d|0)==0){break}if((a[d]|0)==0){break}h=c[10556]|0;j=(c[10552]|0)-h|0;k=uA(d|0)|0;l=c[10554]|0;n=j+1|0;if((l|0)!=0&(h|0)!=0){uH(l|0,h|0,n|0);o=c[10554]|0}else{o=l}l=k+1|0;h=db(o,l+n|0,199664)|0;c[10554]=h;uH(h+l|0,h|0,n|0);uB(c[10554]|0,d|0);a[(c[10554]|0)+k|0]=58;k=c[10554]|0;c[10556]=k+l;c[10552]=k+(l+j|0);j=a8(k|0,58)|0;if((j|0)==0){break}else{p=j}do{a[p]=0;p=a8(p+1|0,58)|0;}while((p|0)!=0)}else if((b|0)==2){j=c[m>>2]|0;if((c[10554]|0)==0){aI(174752,19,1,j|0);break}aI(184128,13,1,j|0);j=c[10554]|0;k=c[m>>2]|0;if(j>>>0<(c[10556]|0)>>>0){l=j;j=k;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=l,v)|0);n=l+((uA(l|0)|0)+1|0)|0;h=c[m>>2]|0;if(n>>>0<(c[10556]|0)>>>0){l=n;j=h}else{q=h;break}}}else{q=k}aF(10,q|0);if((c[10556]|0)==0){break}aI(178936,20,1,c[m>>2]|0);j=c[10556]|0;l=c[m>>2]|0;if(j>>>0<(c[10552]|0)>>>0){h=j;j=l;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=h,v)|0);n=h+((uA(h|0)|0)+1|0)|0;r=c[m>>2]|0;if(n>>>0<(c[10552]|0)>>>0){h=n;j=r}else{s=r;break}}}else{s=l}aF(10,s|0)}else if((b|0)==16){c[10550]=c[10556];g=683}else if((b|0)==8){g=683}}while(0);if((g|0)==683){b=c[10554]|0;if((b|0)==0){t=0;i=e;return t|0}s=c[10548]|0;do{if((s|0)==0){c[10548]=b;q=c[10550]|0;if((q|0)!=0){u=b;w=q;break}q=c[10552]|0;c[10550]=q;u=b;w=q}else{q=s+((uA(s|0)|0)+1|0)|0;c[10548]=q;u=q;w=c[10550]|0}}while(0);if(u>>>0<w>>>0){t=u;i=e;return t|0}c[10548]=0;c[10550]=0;t=0;i=e;return t|0}if((g|0)==622){u=bU(215376)|0;do{if((u|0)==0){w=f|0;s=42160;b=137720;L863:while(1){q=bP(b|0)|0;while(1){p=aQ(q|0,209688)|0;if((p|0)!=0){d=p+2|0;o=a8(d|0,41)|0;a[o]=0;j=bU(d|0)|0;a[o]=41;d=(j|0)!=0;if(d){x=uA(j|0)|0}else{x=0}h=((p+((uA(q|0)|0)+x|0)|0)-o|0)+1|0;k=ut(h)|0;if((k|0)==0){gk();r=ut(h)|0;if((r|0)==0){g=633;break L863}else{y=r}}else{y=k}k=p-q|0;uF(y|0,q|0,k|0);if(d){d=y+k|0;uB(d|0,j|0)}j=y+(x+k|0)|0;k=o+1|0;uB(j|0,k|0);uu(q);q=y;continue}k=aQ(q|0,204200)|0;if((k|0)==0){break}j=k+2|0;o=a8(j|0,96)|0;a[o]=0;if(!(a[14168]|0)){g=638;break L863}d=bt(j|0,193632)|0;if((d|0)!=0){a6(w|0,255,d|0);j=f+((uA(w|0)|0)-1|0)|0;if((a[j]|0)==10){a[j]=0}a2(d|0)}a[o]=96;d=uA(w|0)|0;j=((k+((uA(q|0)|0)+d|0)|0)-o|0)+1|0;p=ut(j)|0;if((p|0)==0){gk();r=ut(j)|0;if((r|0)==0){g=645;break L863}else{z=r}}else{z=p}p=k-q|0;uF(z|0,q|0,p|0);if((a[w]|0)!=0){k=z+p|0;uB(k|0,w|0)}uB(z+(d+p|0)|0,o+1|0);uu(q);q=z}o=q+((uA(q|0)|0)-1|0)|0;if((a[o]|0)==33){a[o]=0;A=1}else{A=0}o=aW(q|0)|0;if((o|0)!=0){bR(o|0);if(A){a[q+(uA(q|0)|0)|0]=33}o=uA(q|0)|0;p=c[10554]|0;if((p|0)==0){d=o+1|0;k=ut(d)|0;if((k|0)==0){gk();r=ut(d)|0;if((r|0)==0){g=658;break}else{B=r}}else{B=k}c[10554]=B;c[10552]=B;C=B}else{k=uA(p|0)|0;r=db(p,(o+2|0)+k|0,199664)|0;c[10554]=r;p=r+k|0;c[10552]=p;a[p]=58;p=(c[10552]|0)+1|0;c[10552]=p;a[p]=0;C=c[10552]|0}uB(C|0,q|0);c[10552]=(c[10552]|0)+o}o=s+4|0;if((q|0)!=0){uu(q)}p=c[o>>2]|0;if((p|0)==0){g=664;break}else{s=o;b=p}}if((g|0)==633){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=199664,v)|0);return 0}else if((g|0)==638){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((g|0)==645){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=199664,v)|0);return 0}else if((g|0)==658){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=199664,v)|0);return 0}else if((g|0)==664){b=c[10554]|0;if((b|0)==0){break}s=a8(b|0,58)|0;if((s|0)==0){break}else{D=s}do{a[D]=0;D=a8(D+1|0,58)|0;}while((D|0)!=0)}}else{s=uA(u|0)|0;b=bP(u|0)|0;c[10554]=b;c[10552]=b+s;s=a8(b|0,58)|0;if((s|0)==0){break}else{E=s}do{a[E]=0;E=a8(E+1|0,58)|0;}while((E|0)!=0)}}while(0);c[10556]=c[10554]}t=c[10554]|0;i=e;return t|0}function us(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+48|0;e=d|0;if((a|0)==32|(a|0)==1){uu(c[12908]|0);bA(5,179864);bA(2,179864);f=bA(5,0)|0;if((f|0)==0){g=0}else{g=bP(f|0)|0}c[12908]=g;h=c[12908]|0;i=d;return h|0}else if((a|0)==4){if((bA(5,b|0)|0)==0){uf(c[13898]|0,166696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}uu(c[12908]|0);b=bA(5,0)|0;if((b|0)==0){j=0}else{j=bP(b|0)|0}c[12908]=j;j=e+24|0;uE(e|0,0,44);bw(40936,32,161480,e|0);bw(72464,8,153384,e|0);c[j>>2]=1;bw(40968,32,161480,e|0);bw(72472,8,153384,e|0);c[j>>2]=2;bw(41e3,32,161480,e|0);bw(72480,8,153384,e|0);c[j>>2]=3;bw(41032,32,161480,e|0);bw(72488,8,153384,e|0);c[j>>2]=4;bw(41064,32,161480,e|0);bw(72496,8,153384,e|0);c[j>>2]=5;bw(41096,32,161480,e|0);bw(72504,8,153384,e|0);c[j>>2]=6;bw(41128,32,161480,e|0);bw(72512,8,153384,e|0);j=e+16|0;b=0;do{c[j>>2]=b;bw(40552+(b<<5)|0,32,150680,e|0);bw(72368+(b<<3)|0,8,148784,e|0);b=b+1|0;}while((b|0)<12);h=c[12908]|0;i=d;return h|0}else if((a|0)==2){a=c[m>>2]|0;b=bA(2,0)|0;cf(a|0,146672,(v=i,i=i+8|0,c[v>>2]=b,v)|0);cf(c[m>>2]|0,144576,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);b=c[m>>2]|0;a=bA(5,0)|0;cf(b|0,142976,(v=i,i=i+8|0,c[v>>2]=a,v)|0);a=c[8270]|0;cf(c[m>>2]|0,141432,(v=i,i=i+8|0,c[v>>2]=(a|0)!=0?a:139696,v)|0);h=c[12908]|0;i=d;return h|0}else{h=c[12908]|0;i=d;return h|0}return 0}
-function ut(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0;do{if(a>>>0<245){if(a>>>0<11){b=16}else{b=a+11&-8}d=b>>>3;e=c[56330]|0;f=e>>>(d>>>0);if((f&3|0)!=0){g=(f&1^1)+d|0;h=g<<1;i=225360+(h<<2)|0;j=225360+(h+2<<2)|0;h=c[j>>2]|0;k=h+8|0;l=c[k>>2]|0;do{if((i|0)==(l|0)){c[56330]=e&(1<<g^-1)}else{if(l>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}m=l+12|0;if((c[m>>2]|0)==(h|0)){c[m>>2]=i;c[j>>2]=l;break}else{ce();return 0;return 0}}}while(0);l=g<<3;c[h+4>>2]=l|3;j=h+(l|4)|0;c[j>>2]=c[j>>2]|1;n=k;return n|0}if(b>>>0<=(c[56332]|0)>>>0){o=b;break}if((f|0)!=0){j=2<<d;l=f<<d&(j|-j);j=(l&-l)-1|0;l=j>>>12&16;i=j>>>(l>>>0);j=i>>>5&8;m=i>>>(j>>>0);i=m>>>2&4;p=m>>>(i>>>0);m=p>>>1&2;q=p>>>(m>>>0);p=q>>>1&1;r=(j|l|i|m|p)+(q>>>(p>>>0))|0;p=r<<1;q=225360+(p<<2)|0;m=225360+(p+2<<2)|0;p=c[m>>2]|0;i=p+8|0;l=c[i>>2]|0;do{if((q|0)==(l|0)){c[56330]=e&(1<<r^-1)}else{if(l>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}j=l+12|0;if((c[j>>2]|0)==(p|0)){c[j>>2]=q;c[m>>2]=l;break}else{ce();return 0;return 0}}}while(0);l=r<<3;m=l-b|0;c[p+4>>2]=b|3;q=p;e=q+b|0;c[q+(b|4)>>2]=m|1;c[q+l>>2]=m;l=c[56332]|0;if((l|0)!=0){q=c[56335]|0;d=l>>>3;l=d<<1;f=225360+(l<<2)|0;k=c[56330]|0;h=1<<d;do{if((k&h|0)==0){c[56330]=k|h;s=f;t=225360+(l+2<<2)|0}else{d=225360+(l+2<<2)|0;g=c[d>>2]|0;if(g>>>0>=(c[56334]|0)>>>0){s=g;t=d;break}ce();return 0;return 0}}while(0);c[t>>2]=q;c[s+12>>2]=q;c[q+8>>2]=s;c[q+12>>2]=f}c[56332]=m;c[56335]=e;n=i;return n|0}l=c[56331]|0;if((l|0)==0){o=b;break}h=(l&-l)-1|0;l=h>>>12&16;k=h>>>(l>>>0);h=k>>>5&8;p=k>>>(h>>>0);k=p>>>2&4;r=p>>>(k>>>0);p=r>>>1&2;d=r>>>(p>>>0);r=d>>>1&1;g=c[225624+((h|l|k|p|r)+(d>>>(r>>>0))<<2)>>2]|0;r=g;d=g;p=(c[g+4>>2]&-8)-b|0;while(1){g=c[r+16>>2]|0;if((g|0)==0){k=c[r+20>>2]|0;if((k|0)==0){break}else{u=k}}else{u=g}g=(c[u+4>>2]&-8)-b|0;k=g>>>0<p>>>0;r=u;d=k?u:d;p=k?g:p}r=d;i=c[56334]|0;if(r>>>0<i>>>0){ce();return 0;return 0}e=r+b|0;m=e;if(r>>>0>=e>>>0){ce();return 0;return 0}e=c[d+24>>2]|0;f=c[d+12>>2]|0;do{if((f|0)==(d|0)){q=d+20|0;g=c[q>>2]|0;if((g|0)==0){k=d+16|0;l=c[k>>2]|0;if((l|0)==0){v=0;break}else{w=l;x=k}}else{w=g;x=q}while(1){q=w+20|0;g=c[q>>2]|0;if((g|0)!=0){w=g;x=q;continue}q=w+16|0;g=c[q>>2]|0;if((g|0)==0){break}else{w=g;x=q}}if(x>>>0<i>>>0){ce();return 0;return 0}else{c[x>>2]=0;v=w;break}}else{q=c[d+8>>2]|0;if(q>>>0<i>>>0){ce();return 0;return 0}g=q+12|0;if((c[g>>2]|0)!=(d|0)){ce();return 0;return 0}k=f+8|0;if((c[k>>2]|0)==(d|0)){c[g>>2]=f;c[k>>2]=q;v=f;break}else{ce();return 0;return 0}}}while(0);L1026:do{if((e|0)!=0){f=d+28|0;i=225624+(c[f>>2]<<2)|0;do{if((d|0)==(c[i>>2]|0)){c[i>>2]=v;if((v|0)!=0){break}c[56331]=c[56331]&(1<<c[f>>2]^-1);break L1026}else{if(e>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}q=e+16|0;if((c[q>>2]|0)==(d|0)){c[q>>2]=v}else{c[e+20>>2]=v}if((v|0)==0){break L1026}}}while(0);if(v>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[v+24>>2]=e;f=c[d+16>>2]|0;do{if((f|0)!=0){if(f>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[v+16>>2]=f;c[f+24>>2]=v;break}}}while(0);f=c[d+20>>2]|0;if((f|0)==0){break}if(f>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[v+20>>2]=f;c[f+24>>2]=v;break}}}while(0);if(p>>>0<16){e=p+b|0;c[d+4>>2]=e|3;f=r+(e+4|0)|0;c[f>>2]=c[f>>2]|1}else{c[d+4>>2]=b|3;c[r+(b|4)>>2]=p|1;c[r+(p+b|0)>>2]=p;f=c[56332]|0;if((f|0)!=0){e=c[56335]|0;i=f>>>3;f=i<<1;q=225360+(f<<2)|0;k=c[56330]|0;g=1<<i;do{if((k&g|0)==0){c[56330]=k|g;y=q;z=225360+(f+2<<2)|0}else{i=225360+(f+2<<2)|0;l=c[i>>2]|0;if(l>>>0>=(c[56334]|0)>>>0){y=l;z=i;break}ce();return 0;return 0}}while(0);c[z>>2]=e;c[y+12>>2]=e;c[e+8>>2]=y;c[e+12>>2]=q}c[56332]=p;c[56335]=m}f=d+8|0;if((f|0)==0){o=b;break}else{n=f}return n|0}else{if(a>>>0>4294967231){o=-1;break}f=a+11|0;g=f&-8;k=c[56331]|0;if((k|0)==0){o=g;break}r=-g|0;i=f>>>8;do{if((i|0)==0){A=0}else{if(g>>>0>16777215){A=31;break}f=(i+1048320|0)>>>16&8;l=i<<f;h=(l+520192|0)>>>16&4;j=l<<h;l=(j+245760|0)>>>16&2;B=(14-(h|f|l)|0)+(j<<l>>>15)|0;A=g>>>((B+7|0)>>>0)&1|B<<1}}while(0);i=c[225624+(A<<2)>>2]|0;L1074:do{if((i|0)==0){C=0;D=r;E=0}else{if((A|0)==31){F=0}else{F=25-(A>>>1)|0}d=0;m=r;p=i;q=g<<F;e=0;while(1){B=c[p+4>>2]&-8;l=B-g|0;if(l>>>0<m>>>0){if((B|0)==(g|0)){C=p;D=l;E=p;break L1074}else{G=p;H=l}}else{G=d;H=m}l=c[p+20>>2]|0;B=c[p+16+(q>>>31<<2)>>2]|0;j=(l|0)==0|(l|0)==(B|0)?e:l;if((B|0)==0){C=G;D=H;E=j;break}else{d=G;m=H;p=B;q=q<<1;e=j}}}}while(0);if((E|0)==0&(C|0)==0){i=2<<A;r=k&(i|-i);if((r|0)==0){o=g;break}i=(r&-r)-1|0;r=i>>>12&16;e=i>>>(r>>>0);i=e>>>5&8;q=e>>>(i>>>0);e=q>>>2&4;p=q>>>(e>>>0);q=p>>>1&2;m=p>>>(q>>>0);p=m>>>1&1;I=c[225624+((i|r|e|q|p)+(m>>>(p>>>0))<<2)>>2]|0}else{I=E}if((I|0)==0){J=D;K=C}else{p=I;m=D;q=C;while(1){e=(c[p+4>>2]&-8)-g|0;r=e>>>0<m>>>0;i=r?e:m;e=r?p:q;r=c[p+16>>2]|0;if((r|0)!=0){p=r;m=i;q=e;continue}r=c[p+20>>2]|0;if((r|0)==0){J=i;K=e;break}else{p=r;m=i;q=e}}}if((K|0)==0){o=g;break}if(J>>>0>=((c[56332]|0)-g|0)>>>0){o=g;break}q=K;m=c[56334]|0;if(q>>>0<m>>>0){ce();return 0;return 0}p=q+g|0;k=p;if(q>>>0>=p>>>0){ce();return 0;return 0}e=c[K+24>>2]|0;i=c[K+12>>2]|0;do{if((i|0)==(K|0)){r=K+20|0;d=c[r>>2]|0;if((d|0)==0){j=K+16|0;B=c[j>>2]|0;if((B|0)==0){L=0;break}else{M=B;N=j}}else{M=d;N=r}while(1){r=M+20|0;d=c[r>>2]|0;if((d|0)!=0){M=d;N=r;continue}r=M+16|0;d=c[r>>2]|0;if((d|0)==0){break}else{M=d;N=r}}if(N>>>0<m>>>0){ce();return 0;return 0}else{c[N>>2]=0;L=M;break}}else{r=c[K+8>>2]|0;if(r>>>0<m>>>0){ce();return 0;return 0}d=r+12|0;if((c[d>>2]|0)!=(K|0)){ce();return 0;return 0}j=i+8|0;if((c[j>>2]|0)==(K|0)){c[d>>2]=i;c[j>>2]=r;L=i;break}else{ce();return 0;return 0}}}while(0);L1124:do{if((e|0)!=0){i=K+28|0;m=225624+(c[i>>2]<<2)|0;do{if((K|0)==(c[m>>2]|0)){c[m>>2]=L;if((L|0)!=0){break}c[56331]=c[56331]&(1<<c[i>>2]^-1);break L1124}else{if(e>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}r=e+16|0;if((c[r>>2]|0)==(K|0)){c[r>>2]=L}else{c[e+20>>2]=L}if((L|0)==0){break L1124}}}while(0);if(L>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[L+24>>2]=e;i=c[K+16>>2]|0;do{if((i|0)!=0){if(i>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[L+16>>2]=i;c[i+24>>2]=L;break}}}while(0);i=c[K+20>>2]|0;if((i|0)==0){break}if(i>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[L+20>>2]=i;c[i+24>>2]=L;break}}}while(0);do{if(J>>>0<16){e=J+g|0;c[K+4>>2]=e|3;i=q+(e+4|0)|0;c[i>>2]=c[i>>2]|1}else{c[K+4>>2]=g|3;c[q+(g|4)>>2]=J|1;c[q+(J+g|0)>>2]=J;i=J>>>3;if(J>>>0<256){e=i<<1;m=225360+(e<<2)|0;r=c[56330]|0;j=1<<i;do{if((r&j|0)==0){c[56330]=r|j;O=m;P=225360+(e+2<<2)|0}else{i=225360+(e+2<<2)|0;d=c[i>>2]|0;if(d>>>0>=(c[56334]|0)>>>0){O=d;P=i;break}ce();return 0;return 0}}while(0);c[P>>2]=k;c[O+12>>2]=k;c[q+(g+8|0)>>2]=O;c[q+(g+12|0)>>2]=m;break}e=p;j=J>>>8;do{if((j|0)==0){Q=0}else{if(J>>>0>16777215){Q=31;break}r=(j+1048320|0)>>>16&8;i=j<<r;d=(i+520192|0)>>>16&4;B=i<<d;i=(B+245760|0)>>>16&2;l=(14-(d|r|i)|0)+(B<<i>>>15)|0;Q=J>>>((l+7|0)>>>0)&1|l<<1}}while(0);j=225624+(Q<<2)|0;c[q+(g+28|0)>>2]=Q;c[q+(g+20|0)>>2]=0;c[q+(g+16|0)>>2]=0;m=c[56331]|0;l=1<<Q;if((m&l|0)==0){c[56331]=m|l;c[j>>2]=e;c[q+(g+24|0)>>2]=j;c[q+(g+12|0)>>2]=e;c[q+(g+8|0)>>2]=e;break}if((Q|0)==31){R=0}else{R=25-(Q>>>1)|0}l=J<<R;m=c[j>>2]|0;while(1){if((c[m+4>>2]&-8|0)==(J|0)){break}S=m+16+(l>>>31<<2)|0;j=c[S>>2]|0;if((j|0)==0){T=862;break}else{l=l<<1;m=j}}if((T|0)==862){if(S>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[S>>2]=e;c[q+(g+24|0)>>2]=m;c[q+(g+12|0)>>2]=e;c[q+(g+8|0)>>2]=e;break}}l=m+8|0;j=c[l>>2]|0;i=c[56334]|0;if(m>>>0<i>>>0){ce();return 0;return 0}if(j>>>0<i>>>0){ce();return 0;return 0}else{c[j+12>>2]=e;c[l>>2]=e;c[q+(g+8|0)>>2]=j;c[q+(g+12|0)>>2]=m;c[q+(g+24|0)>>2]=0;break}}}while(0);q=K+8|0;if((q|0)==0){o=g;break}else{n=q}return n|0}}while(0);K=c[56332]|0;if(o>>>0<=K>>>0){S=K-o|0;J=c[56335]|0;if(S>>>0>15){R=J;c[56335]=R+o;c[56332]=S;c[R+(o+4|0)>>2]=S|1;c[R+K>>2]=S;c[J+4>>2]=o|3}else{c[56332]=0;c[56335]=0;c[J+4>>2]=K|3;S=J+(K+4|0)|0;c[S>>2]=c[S>>2]|1}n=J+8|0;return n|0}J=c[56333]|0;if(o>>>0<J>>>0){S=J-o|0;c[56333]=S;J=c[56336]|0;K=J;c[56336]=K+o;c[K+(o+4|0)>>2]=S|1;c[J+4>>2]=o|3;n=J+8|0;return n|0}do{if((c[8408]|0)==0){J=cb(8)|0;if((J-1&J|0)==0){c[8410]=J;c[8409]=J;c[8411]=-1;c[8412]=2097152;c[8413]=0;c[56441]=0;c[8408]=cG(0)&-16^1431655768;break}else{ce();return 0;return 0}}}while(0);J=o+48|0;S=c[8410]|0;K=o+47|0;R=S+K|0;Q=-S|0;S=R&Q;if(S>>>0<=o>>>0){n=0;return n|0}O=c[56440]|0;do{if((O|0)!=0){P=c[56438]|0;L=P+S|0;if(L>>>0<=P>>>0|L>>>0>O>>>0){n=0}else{break}return n|0}}while(0);L1216:do{if((c[56441]&4|0)==0){O=c[56336]|0;L1218:do{if((O|0)==0){T=892}else{L=O;P=225768;while(1){U=P|0;M=c[U>>2]|0;if(M>>>0<=L>>>0){V=P+4|0;if((M+(c[V>>2]|0)|0)>>>0>L>>>0){break}}M=c[P+8>>2]|0;if((M|0)==0){T=892;break L1218}else{P=M}}if((P|0)==0){T=892;break}L=R-(c[56333]|0)&Q;if(L>>>0>=2147483647){W=0;break}m=b_(L|0)|0;e=(m|0)==((c[U>>2]|0)+(c[V>>2]|0)|0);X=e?m:-1;Y=e?L:0;Z=m;_=L;T=901}}while(0);do{if((T|0)==892){O=b_(0)|0;if((O|0)==-1){W=0;break}g=O;L=c[8409]|0;m=L-1|0;if((m&g|0)==0){$=S}else{$=(S-g|0)+(m+g&-L)|0}L=c[56438]|0;g=L+$|0;if(!($>>>0>o>>>0&$>>>0<2147483647)){W=0;break}m=c[56440]|0;if((m|0)!=0){if(g>>>0<=L>>>0|g>>>0>m>>>0){W=0;break}}m=b_($|0)|0;g=(m|0)==(O|0);X=g?O:-1;Y=g?$:0;Z=m;_=$;T=901}}while(0);L1238:do{if((T|0)==901){m=-_|0;if((X|0)!=-1){aa=Y;ab=X;T=912;break L1216}do{if((Z|0)!=-1&_>>>0<2147483647&_>>>0<J>>>0){g=c[8410]|0;O=(K-_|0)+g&-g;if(O>>>0>=2147483647){ac=_;break}if((b_(O|0)|0)==-1){b_(m|0);W=Y;break L1238}else{ac=O+_|0;break}}else{ac=_}}while(0);if((Z|0)==-1){W=Y}else{aa=ac;ab=Z;T=912;break L1216}}}while(0);c[56441]=c[56441]|4;ad=W;T=909}else{ad=0;T=909}}while(0);do{if((T|0)==909){if(S>>>0>=2147483647){break}W=b_(S|0)|0;Z=b_(0)|0;if(!((Z|0)!=-1&(W|0)!=-1&W>>>0<Z>>>0)){break}ac=Z-W|0;Z=ac>>>0>(o+40|0)>>>0;Y=Z?W:-1;if((Y|0)!=-1){aa=Z?ac:ad;ab=Y;T=912}}}while(0);do{if((T|0)==912){ad=(c[56438]|0)+aa|0;c[56438]=ad;if(ad>>>0>(c[56439]|0)>>>0){c[56439]=ad}ad=c[56336]|0;L1258:do{if((ad|0)==0){S=c[56334]|0;if((S|0)==0|ab>>>0<S>>>0){c[56334]=ab}c[56442]=ab;c[56443]=aa;c[56445]=0;c[56339]=c[8408];c[56338]=-1;S=0;do{Y=S<<1;ac=225360+(Y<<2)|0;c[225360+(Y+3<<2)>>2]=ac;c[225360+(Y+2<<2)>>2]=ac;S=S+1|0;}while(S>>>0<32);S=ab+8|0;if((S&7|0)==0){ae=0}else{ae=-S&7}S=(aa-40|0)-ae|0;c[56336]=ab+ae;c[56333]=S;c[ab+(ae+4|0)>>2]=S|1;c[ab+(aa-36|0)>>2]=40;c[56337]=c[8412]}else{S=225768;while(1){af=c[S>>2]|0;ag=S+4|0;ah=c[ag>>2]|0;if((ab|0)==(af+ah|0)){T=924;break}ac=c[S+8>>2]|0;if((ac|0)==0){break}else{S=ac}}do{if((T|0)==924){if((c[S+12>>2]&8|0)!=0){break}ac=ad;if(!(ac>>>0>=af>>>0&ac>>>0<ab>>>0)){break}c[ag>>2]=ah+aa;ac=c[56336]|0;Y=(c[56333]|0)+aa|0;Z=ac;W=ac+8|0;if((W&7|0)==0){ai=0}else{ai=-W&7}W=Y-ai|0;c[56336]=Z+ai;c[56333]=W;c[Z+(ai+4|0)>>2]=W|1;c[Z+(Y+4|0)>>2]=40;c[56337]=c[8412];break L1258}}while(0);if(ab>>>0<(c[56334]|0)>>>0){c[56334]=ab}S=ab+aa|0;Y=225768;while(1){aj=Y|0;if((c[aj>>2]|0)==(S|0)){T=934;break}Z=c[Y+8>>2]|0;if((Z|0)==0){break}else{Y=Z}}do{if((T|0)==934){if((c[Y+12>>2]&8|0)!=0){break}c[aj>>2]=ab;S=Y+4|0;c[S>>2]=(c[S>>2]|0)+aa;S=ab+8|0;if((S&7|0)==0){ak=0}else{ak=-S&7}S=ab+(aa+8|0)|0;if((S&7|0)==0){al=0}else{al=-S&7}S=ab+(al+aa|0)|0;Z=S;W=ak+o|0;ac=ab+W|0;_=ac;K=(S-(ab+ak|0)|0)-o|0;c[ab+(ak+4|0)>>2]=o|3;do{if((Z|0)==(c[56336]|0)){J=(c[56333]|0)+K|0;c[56333]=J;c[56336]=_;c[ab+(W+4|0)>>2]=J|1}else{if((Z|0)==(c[56335]|0)){J=(c[56332]|0)+K|0;c[56332]=J;c[56335]=_;c[ab+(W+4|0)>>2]=J|1;c[ab+(J+W|0)>>2]=J;break}J=aa+4|0;X=c[ab+(J+al|0)>>2]|0;if((X&3|0)==1){$=X&-8;V=X>>>3;L1293:do{if(X>>>0<256){U=c[ab+((al|8)+aa|0)>>2]|0;Q=c[ab+((aa+12|0)+al|0)>>2]|0;R=225360+(V<<1<<2)|0;do{if((U|0)!=(R|0)){if(U>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}if((c[U+12>>2]|0)==(Z|0)){break}ce();return 0;return 0}}while(0);if((Q|0)==(U|0)){c[56330]=c[56330]&(1<<V^-1);break}do{if((Q|0)==(R|0)){am=Q+8|0}else{if(Q>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}m=Q+8|0;if((c[m>>2]|0)==(Z|0)){am=m;break}ce();return 0;return 0}}while(0);c[U+12>>2]=Q;c[am>>2]=U}else{R=S;m=c[ab+((al|24)+aa|0)>>2]|0;P=c[ab+((aa+12|0)+al|0)>>2]|0;do{if((P|0)==(R|0)){O=al|16;g=ab+(J+O|0)|0;L=c[g>>2]|0;if((L|0)==0){e=ab+(O+aa|0)|0;O=c[e>>2]|0;if((O|0)==0){an=0;break}else{ao=O;ap=e}}else{ao=L;ap=g}while(1){g=ao+20|0;L=c[g>>2]|0;if((L|0)!=0){ao=L;ap=g;continue}g=ao+16|0;L=c[g>>2]|0;if((L|0)==0){break}else{ao=L;ap=g}}if(ap>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[ap>>2]=0;an=ao;break}}else{g=c[ab+((al|8)+aa|0)>>2]|0;if(g>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}L=g+12|0;if((c[L>>2]|0)!=(R|0)){ce();return 0;return 0}e=P+8|0;if((c[e>>2]|0)==(R|0)){c[L>>2]=P;c[e>>2]=g;an=P;break}else{ce();return 0;return 0}}}while(0);if((m|0)==0){break}P=ab+((aa+28|0)+al|0)|0;U=225624+(c[P>>2]<<2)|0;do{if((R|0)==(c[U>>2]|0)){c[U>>2]=an;if((an|0)!=0){break}c[56331]=c[56331]&(1<<c[P>>2]^-1);break L1293}else{if(m>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}Q=m+16|0;if((c[Q>>2]|0)==(R|0)){c[Q>>2]=an}else{c[m+20>>2]=an}if((an|0)==0){break L1293}}}while(0);if(an>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[an+24>>2]=m;R=al|16;P=c[ab+(R+aa|0)>>2]|0;do{if((P|0)!=0){if(P>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[an+16>>2]=P;c[P+24>>2]=an;break}}}while(0);P=c[ab+(J+R|0)>>2]|0;if((P|0)==0){break}if(P>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[an+20>>2]=P;c[P+24>>2]=an;break}}}while(0);aq=ab+(($|al)+aa|0)|0;ar=$+K|0}else{aq=Z;ar=K}J=aq+4|0;c[J>>2]=c[J>>2]&-2;c[ab+(W+4|0)>>2]=ar|1;c[ab+(ar+W|0)>>2]=ar;J=ar>>>3;if(ar>>>0<256){V=J<<1;X=225360+(V<<2)|0;P=c[56330]|0;m=1<<J;do{if((P&m|0)==0){c[56330]=P|m;as=X;at=225360+(V+2<<2)|0}else{J=225360+(V+2<<2)|0;U=c[J>>2]|0;if(U>>>0>=(c[56334]|0)>>>0){as=U;at=J;break}ce();return 0;return 0}}while(0);c[at>>2]=_;c[as+12>>2]=_;c[ab+(W+8|0)>>2]=as;c[ab+(W+12|0)>>2]=X;break}V=ac;m=ar>>>8;do{if((m|0)==0){au=0}else{if(ar>>>0>16777215){au=31;break}P=(m+1048320|0)>>>16&8;$=m<<P;J=($+520192|0)>>>16&4;U=$<<J;$=(U+245760|0)>>>16&2;Q=(14-(J|P|$)|0)+(U<<$>>>15)|0;au=ar>>>((Q+7|0)>>>0)&1|Q<<1}}while(0);m=225624+(au<<2)|0;c[ab+(W+28|0)>>2]=au;c[ab+(W+20|0)>>2]=0;c[ab+(W+16|0)>>2]=0;X=c[56331]|0;Q=1<<au;if((X&Q|0)==0){c[56331]=X|Q;c[m>>2]=V;c[ab+(W+24|0)>>2]=m;c[ab+(W+12|0)>>2]=V;c[ab+(W+8|0)>>2]=V;break}if((au|0)==31){av=0}else{av=25-(au>>>1)|0}Q=ar<<av;X=c[m>>2]|0;while(1){if((c[X+4>>2]&-8|0)==(ar|0)){break}aw=X+16+(Q>>>31<<2)|0;m=c[aw>>2]|0;if((m|0)==0){T=1007;break}else{Q=Q<<1;X=m}}if((T|0)==1007){if(aw>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[aw>>2]=V;c[ab+(W+24|0)>>2]=X;c[ab+(W+12|0)>>2]=V;c[ab+(W+8|0)>>2]=V;break}}Q=X+8|0;m=c[Q>>2]|0;$=c[56334]|0;if(X>>>0<$>>>0){ce();return 0;return 0}if(m>>>0<$>>>0){ce();return 0;return 0}else{c[m+12>>2]=V;c[Q>>2]=V;c[ab+(W+8|0)>>2]=m;c[ab+(W+12|0)>>2]=X;c[ab+(W+24|0)>>2]=0;break}}}while(0);n=ab+(ak|8)|0;return n|0}}while(0);Y=ad;W=225768;while(1){ax=c[W>>2]|0;if(ax>>>0<=Y>>>0){ay=c[W+4>>2]|0;az=ax+ay|0;if(az>>>0>Y>>>0){break}}W=c[W+8>>2]|0}W=ax+(ay-39|0)|0;if((W&7|0)==0){aA=0}else{aA=-W&7}W=ax+((ay-47|0)+aA|0)|0;ac=W>>>0<(ad+16|0)>>>0?Y:W;W=ac+8|0;_=ab+8|0;if((_&7|0)==0){aB=0}else{aB=-_&7}_=(aa-40|0)-aB|0;c[56336]=ab+aB;c[56333]=_;c[ab+(aB+4|0)>>2]=_|1;c[ab+(aa-36|0)>>2]=40;c[56337]=c[8412];c[ac+4>>2]=27;c[W>>2]=c[56442];c[W+4>>2]=c[225772>>2];c[W+8>>2]=c[225776>>2];c[W+12>>2]=c[225780>>2];c[56442]=ab;c[56443]=aa;c[56445]=0;c[56444]=W;W=ac+28|0;c[W>>2]=7;if((ac+32|0)>>>0<az>>>0){_=W;while(1){W=_+4|0;c[W>>2]=7;if((_+8|0)>>>0<az>>>0){_=W}else{break}}}if((ac|0)==(Y|0)){break}_=ac-ad|0;W=Y+(_+4|0)|0;c[W>>2]=c[W>>2]&-2;c[ad+4>>2]=_|1;c[Y+_>>2]=_;W=_>>>3;if(_>>>0<256){K=W<<1;Z=225360+(K<<2)|0;S=c[56330]|0;m=1<<W;do{if((S&m|0)==0){c[56330]=S|m;aC=Z;aD=225360+(K+2<<2)|0}else{W=225360+(K+2<<2)|0;Q=c[W>>2]|0;if(Q>>>0>=(c[56334]|0)>>>0){aC=Q;aD=W;break}ce();return 0;return 0}}while(0);c[aD>>2]=ad;c[aC+12>>2]=ad;c[ad+8>>2]=aC;c[ad+12>>2]=Z;break}K=ad;m=_>>>8;do{if((m|0)==0){aE=0}else{if(_>>>0>16777215){aE=31;break}S=(m+1048320|0)>>>16&8;Y=m<<S;ac=(Y+520192|0)>>>16&4;W=Y<<ac;Y=(W+245760|0)>>>16&2;Q=(14-(ac|S|Y)|0)+(W<<Y>>>15)|0;aE=_>>>((Q+7|0)>>>0)&1|Q<<1}}while(0);m=225624+(aE<<2)|0;c[ad+28>>2]=aE;c[ad+20>>2]=0;c[ad+16>>2]=0;Z=c[56331]|0;Q=1<<aE;if((Z&Q|0)==0){c[56331]=Z|Q;c[m>>2]=K;c[ad+24>>2]=m;c[ad+12>>2]=ad;c[ad+8>>2]=ad;break}if((aE|0)==31){aF=0}else{aF=25-(aE>>>1)|0}Q=_<<aF;Z=c[m>>2]|0;while(1){if((c[Z+4>>2]&-8|0)==(_|0)){break}aG=Z+16+(Q>>>31<<2)|0;m=c[aG>>2]|0;if((m|0)==0){T=1042;break}else{Q=Q<<1;Z=m}}if((T|0)==1042){if(aG>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[aG>>2]=K;c[ad+24>>2]=Z;c[ad+12>>2]=ad;c[ad+8>>2]=ad;break}}Q=Z+8|0;_=c[Q>>2]|0;m=c[56334]|0;if(Z>>>0<m>>>0){ce();return 0;return 0}if(_>>>0<m>>>0){ce();return 0;return 0}else{c[_+12>>2]=K;c[Q>>2]=K;c[ad+8>>2]=_;c[ad+12>>2]=Z;c[ad+24>>2]=0;break}}}while(0);ad=c[56333]|0;if(ad>>>0<=o>>>0){break}_=ad-o|0;c[56333]=_;ad=c[56336]|0;Q=ad;c[56336]=Q+o;c[Q+(o+4|0)>>2]=_|1;c[ad+4>>2]=o|3;n=ad+8|0;return n|0}}while(0);c[b0()>>2]=12;n=0;return n|0}function uu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;if((a|0)==0){return}b=a-8|0;d=b;e=c[56334]|0;if(b>>>0<e>>>0){ce()}f=c[a-4>>2]|0;g=f&3;if((g|0)==1){ce()}h=f&-8;i=a+(h-8|0)|0;j=i;L1475:do{if((f&1|0)==0){k=c[b>>2]|0;if((g|0)==0){return}l=-8-k|0;m=a+l|0;n=m;o=k+h|0;if(m>>>0<e>>>0){ce()}if((n|0)==(c[56335]|0)){p=a+(h-4|0)|0;if((c[p>>2]&3|0)!=3){q=n;r=o;break}c[56332]=o;c[p>>2]=c[p>>2]&-2;c[a+(l+4|0)>>2]=o|1;c[i>>2]=o;return}p=k>>>3;if(k>>>0<256){k=c[a+(l+8|0)>>2]|0;s=c[a+(l+12|0)>>2]|0;t=225360+(p<<1<<2)|0;do{if((k|0)!=(t|0)){if(k>>>0<e>>>0){ce()}if((c[k+12>>2]|0)==(n|0)){break}ce()}}while(0);if((s|0)==(k|0)){c[56330]=c[56330]&(1<<p^-1);q=n;r=o;break}do{if((s|0)==(t|0)){u=s+8|0}else{if(s>>>0<e>>>0){ce()}v=s+8|0;if((c[v>>2]|0)==(n|0)){u=v;break}ce()}}while(0);c[k+12>>2]=s;c[u>>2]=k;q=n;r=o;break}t=m;p=c[a+(l+24|0)>>2]|0;v=c[a+(l+12|0)>>2]|0;do{if((v|0)==(t|0)){w=a+(l+20|0)|0;x=c[w>>2]|0;if((x|0)==0){y=a+(l+16|0)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){B=x;C=w;continue}w=B+16|0;x=c[w>>2]|0;if((x|0)==0){break}else{B=x;C=w}}if(C>>>0<e>>>0){ce()}else{c[C>>2]=0;A=B;break}}else{w=c[a+(l+8|0)>>2]|0;if(w>>>0<e>>>0){ce()}x=w+12|0;if((c[x>>2]|0)!=(t|0)){ce()}y=v+8|0;if((c[y>>2]|0)==(t|0)){c[x>>2]=v;c[y>>2]=w;A=v;break}else{ce()}}}while(0);if((p|0)==0){q=n;r=o;break}v=a+(l+28|0)|0;m=225624+(c[v>>2]<<2)|0;do{if((t|0)==(c[m>>2]|0)){c[m>>2]=A;if((A|0)!=0){break}c[56331]=c[56331]&(1<<c[v>>2]^-1);q=n;r=o;break L1475}else{if(p>>>0<(c[56334]|0)>>>0){ce()}k=p+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[p+20>>2]=A}if((A|0)==0){q=n;r=o;break L1475}}}while(0);if(A>>>0<(c[56334]|0)>>>0){ce()}c[A+24>>2]=p;t=c[a+(l+16|0)>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[A+16>>2]=t;c[t+24>>2]=A;break}}}while(0);t=c[a+(l+20|0)>>2]|0;if((t|0)==0){q=n;r=o;break}if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[A+20>>2]=t;c[t+24>>2]=A;q=n;r=o;break}}else{q=d;r=h}}while(0);d=q;if(d>>>0>=i>>>0){ce()}A=a+(h-4|0)|0;e=c[A>>2]|0;if((e&1|0)==0){ce()}do{if((e&2|0)==0){if((j|0)==(c[56336]|0)){B=(c[56333]|0)+r|0;c[56333]=B;c[56336]=q;c[q+4>>2]=B|1;if((q|0)==(c[56335]|0)){c[56335]=0;c[56332]=0}if(B>>>0<=(c[56337]|0)>>>0){return}uw(0);return}if((j|0)==(c[56335]|0)){B=(c[56332]|0)+r|0;c[56332]=B;c[56335]=q;c[q+4>>2]=B|1;c[d+B>>2]=B;return}B=(e&-8)+r|0;C=e>>>3;L1581:do{if(e>>>0<256){u=c[a+h>>2]|0;g=c[a+(h|4)>>2]|0;b=225360+(C<<1<<2)|0;do{if((u|0)!=(b|0)){if(u>>>0<(c[56334]|0)>>>0){ce()}if((c[u+12>>2]|0)==(j|0)){break}ce()}}while(0);if((g|0)==(u|0)){c[56330]=c[56330]&(1<<C^-1);break}do{if((g|0)==(b|0)){D=g+8|0}else{if(g>>>0<(c[56334]|0)>>>0){ce()}f=g+8|0;if((c[f>>2]|0)==(j|0)){D=f;break}ce()}}while(0);c[u+12>>2]=g;c[D>>2]=u}else{b=i;f=c[a+(h+16|0)>>2]|0;t=c[a+(h|4)>>2]|0;do{if((t|0)==(b|0)){p=a+(h+12|0)|0;v=c[p>>2]|0;if((v|0)==0){m=a+(h+8|0)|0;k=c[m>>2]|0;if((k|0)==0){E=0;break}else{F=k;G=m}}else{F=v;G=p}while(1){p=F+20|0;v=c[p>>2]|0;if((v|0)!=0){F=v;G=p;continue}p=F+16|0;v=c[p>>2]|0;if((v|0)==0){break}else{F=v;G=p}}if(G>>>0<(c[56334]|0)>>>0){ce()}else{c[G>>2]=0;E=F;break}}else{p=c[a+h>>2]|0;if(p>>>0<(c[56334]|0)>>>0){ce()}v=p+12|0;if((c[v>>2]|0)!=(b|0)){ce()}m=t+8|0;if((c[m>>2]|0)==(b|0)){c[v>>2]=t;c[m>>2]=p;E=t;break}else{ce()}}}while(0);if((f|0)==0){break}t=a+(h+20|0)|0;u=225624+(c[t>>2]<<2)|0;do{if((b|0)==(c[u>>2]|0)){c[u>>2]=E;if((E|0)!=0){break}c[56331]=c[56331]&(1<<c[t>>2]^-1);break L1581}else{if(f>>>0<(c[56334]|0)>>>0){ce()}g=f+16|0;if((c[g>>2]|0)==(b|0)){c[g>>2]=E}else{c[f+20>>2]=E}if((E|0)==0){break L1581}}}while(0);if(E>>>0<(c[56334]|0)>>>0){ce()}c[E+24>>2]=f;b=c[a+(h+8|0)>>2]|0;do{if((b|0)!=0){if(b>>>0<(c[56334]|0)>>>0){ce()}else{c[E+16>>2]=b;c[b+24>>2]=E;break}}}while(0);b=c[a+(h+12|0)>>2]|0;if((b|0)==0){break}if(b>>>0<(c[56334]|0)>>>0){ce()}else{c[E+20>>2]=b;c[b+24>>2]=E;break}}}while(0);c[q+4>>2]=B|1;c[d+B>>2]=B;if((q|0)!=(c[56335]|0)){H=B;break}c[56332]=B;return}else{c[A>>2]=e&-2;c[q+4>>2]=r|1;c[d+r>>2]=r;H=r}}while(0);r=H>>>3;if(H>>>0<256){d=r<<1;e=225360+(d<<2)|0;A=c[56330]|0;E=1<<r;do{if((A&E|0)==0){c[56330]=A|E;I=e;J=225360+(d+2<<2)|0}else{r=225360+(d+2<<2)|0;h=c[r>>2]|0;if(h>>>0>=(c[56334]|0)>>>0){I=h;J=r;break}ce()}}while(0);c[J>>2]=q;c[I+12>>2]=q;c[q+8>>2]=I;c[q+12>>2]=e;return}e=q;I=H>>>8;do{if((I|0)==0){K=0}else{if(H>>>0>16777215){K=31;break}J=(I+1048320|0)>>>16&8;d=I<<J;E=(d+520192|0)>>>16&4;A=d<<E;d=(A+245760|0)>>>16&2;r=(14-(E|J|d)|0)+(A<<d>>>15)|0;K=H>>>((r+7|0)>>>0)&1|r<<1}}while(0);I=225624+(K<<2)|0;c[q+28>>2]=K;c[q+20>>2]=0;c[q+16>>2]=0;r=c[56331]|0;d=1<<K;do{if((r&d|0)==0){c[56331]=r|d;c[I>>2]=e;c[q+24>>2]=I;c[q+12>>2]=q;c[q+8>>2]=q}else{if((K|0)==31){L=0}else{L=25-(K>>>1)|0}A=H<<L;J=c[I>>2]|0;while(1){if((c[J+4>>2]&-8|0)==(H|0)){break}M=J+16+(A>>>31<<2)|0;E=c[M>>2]|0;if((E|0)==0){N=1221;break}else{A=A<<1;J=E}}if((N|0)==1221){if(M>>>0<(c[56334]|0)>>>0){ce()}else{c[M>>2]=e;c[q+24>>2]=J;c[q+12>>2]=q;c[q+8>>2]=q;break}}A=J+8|0;B=c[A>>2]|0;E=c[56334]|0;if(J>>>0<E>>>0){ce()}if(B>>>0<E>>>0){ce()}else{c[B+12>>2]=e;c[A>>2]=e;c[q+8>>2]=B;c[q+12>>2]=J;c[q+24>>2]=0;break}}}while(0);q=(c[56338]|0)-1|0;c[56338]=q;if((q|0)==0){O=225776}else{return}while(1){q=c[O>>2]|0;if((q|0)==0){break}else{O=q+8|0}}c[56338]=-1;return}function uv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((a|0)==0){d=ut(b)|0;return d|0}if(b>>>0>4294967231){c[b0()>>2]=12;d=0;return d|0}if(b>>>0<11){e=16}else{e=b+11&-8}f=ux(a-8|0,e)|0;if((f|0)!=0){d=f+8|0;return d|0}f=ut(b)|0;if((f|0)==0){d=0;return d|0}e=c[a-4>>2]|0;g=(e&-8)-((e&3|0)==0?8:4)|0;uD(f|0,a|0,g>>>0<b>>>0?g:b);uu(a);d=f;return d|0}function uw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do{if((c[8408]|0)==0){b=cb(8)|0;if((b-1&b|0)==0){c[8410]=b;c[8409]=b;c[8411]=-1;c[8412]=2097152;c[8413]=0;c[56441]=0;c[8408]=cG(0)&-16^1431655768;break}else{ce();return 0;return 0}}}while(0);if(a>>>0>=4294967232){d=0;return d|0}b=c[56336]|0;if((b|0)==0){d=0;return d|0}e=c[56333]|0;do{if(e>>>0>(a+40|0)>>>0){f=c[8410]|0;g=aa(((((((-40-a|0)-1|0)+e|0)+f|0)>>>0)/(f>>>0)>>>0)-1|0,f);h=b;i=225768;while(1){j=c[i>>2]|0;if(j>>>0<=h>>>0){if((j+(c[i+4>>2]|0)|0)>>>0>h>>>0){k=i;break}}j=c[i+8>>2]|0;if((j|0)==0){k=0;break}else{i=j}}if((c[k+12>>2]&8|0)!=0){break}i=b_(0)|0;h=k+4|0;if((i|0)!=((c[k>>2]|0)+(c[h>>2]|0)|0)){break}j=b_(-(g>>>0>2147483646?-2147483648-f|0:g)|0)|0;l=b_(0)|0;if(!((j|0)!=-1&l>>>0<i>>>0)){break}j=i-l|0;if((i|0)==(l|0)){break}c[h>>2]=(c[h>>2]|0)-j;c[56438]=(c[56438]|0)-j;h=c[56336]|0;m=(c[56333]|0)-j|0;j=h;n=h+8|0;if((n&7|0)==0){o=0}else{o=-n&7}n=m-o|0;c[56336]=j+o;c[56333]=n;c[j+(o+4|0)>>2]=n|1;c[j+(m+4|0)>>2]=40;c[56337]=c[8412];d=(i|0)!=(l|0)&1;return d|0}}while(0);if((c[56333]|0)>>>0<=(c[56337]|0)>>>0){d=0;return d|0}c[56337]=-1;d=0;return d|0}function ux(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a;h=g+f|0;i=h;j=c[56334]|0;if(g>>>0<j>>>0){ce();return 0;return 0}k=e&3;if(!((k|0)!=1&g>>>0<h>>>0)){ce();return 0;return 0}l=g+(f|4)|0;m=c[l>>2]|0;if((m&1|0)==0){ce();return 0;return 0}if((k|0)==0){if(b>>>0<256){n=0;return n|0}do{if(f>>>0>=(b+4|0)>>>0){if((f-b|0)>>>0>c[8410]<<1>>>0){break}else{n=a}return n|0}}while(0);n=0;return n|0}if(f>>>0>=b>>>0){k=f-b|0;if(k>>>0<=15){n=a;return n|0}c[d>>2]=e&1|b|2;c[g+(b+4|0)>>2]=k|3;c[l>>2]=c[l>>2]|1;uy(g+b|0,k);n=a;return n|0}if((i|0)==(c[56336]|0)){k=(c[56333]|0)+f|0;if(k>>>0<=b>>>0){n=0;return n|0}l=k-b|0;c[d>>2]=e&1|b|2;c[g+(b+4|0)>>2]=l|1;c[56336]=g+b;c[56333]=l;n=a;return n|0}if((i|0)==(c[56335]|0)){l=(c[56332]|0)+f|0;if(l>>>0<b>>>0){n=0;return n|0}k=l-b|0;if(k>>>0>15){c[d>>2]=e&1|b|2;c[g+(b+4|0)>>2]=k|1;c[g+l>>2]=k;o=g+(l+4|0)|0;c[o>>2]=c[o>>2]&-2;p=g+b|0;q=k}else{c[d>>2]=e&1|l|2;e=g+(l+4|0)|0;c[e>>2]=c[e>>2]|1;p=0;q=0}c[56332]=q;c[56335]=p;n=a;return n|0}if((m&2|0)!=0){n=0;return n|0}p=(m&-8)+f|0;if(p>>>0<b>>>0){n=0;return n|0}q=p-b|0;e=m>>>3;L1801:do{if(m>>>0<256){l=c[g+(f+8|0)>>2]|0;k=c[g+(f+12|0)>>2]|0;o=225360+(e<<1<<2)|0;do{if((l|0)!=(o|0)){if(l>>>0<j>>>0){ce();return 0;return 0}if((c[l+12>>2]|0)==(i|0)){break}ce();return 0;return 0}}while(0);if((k|0)==(l|0)){c[56330]=c[56330]&(1<<e^-1);break}do{if((k|0)==(o|0)){r=k+8|0}else{if(k>>>0<j>>>0){ce();return 0;return 0}s=k+8|0;if((c[s>>2]|0)==(i|0)){r=s;break}ce();return 0;return 0}}while(0);c[l+12>>2]=k;c[r>>2]=l}else{o=h;s=c[g+(f+24|0)>>2]|0;t=c[g+(f+12|0)>>2]|0;do{if((t|0)==(o|0)){u=g+(f+20|0)|0;v=c[u>>2]|0;if((v|0)==0){w=g+(f+16|0)|0;x=c[w>>2]|0;if((x|0)==0){y=0;break}else{z=x;A=w}}else{z=v;A=u}while(1){u=z+20|0;v=c[u>>2]|0;if((v|0)!=0){z=v;A=u;continue}u=z+16|0;v=c[u>>2]|0;if((v|0)==0){break}else{z=v;A=u}}if(A>>>0<j>>>0){ce();return 0;return 0}else{c[A>>2]=0;y=z;break}}else{u=c[g+(f+8|0)>>2]|0;if(u>>>0<j>>>0){ce();return 0;return 0}v=u+12|0;if((c[v>>2]|0)!=(o|0)){ce();return 0;return 0}w=t+8|0;if((c[w>>2]|0)==(o|0)){c[v>>2]=t;c[w>>2]=u;y=t;break}else{ce();return 0;return 0}}}while(0);if((s|0)==0){break}t=g+(f+28|0)|0;l=225624+(c[t>>2]<<2)|0;do{if((o|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[56331]=c[56331]&(1<<c[t>>2]^-1);break L1801}else{if(s>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}k=s+16|0;if((c[k>>2]|0)==(o|0)){c[k>>2]=y}else{c[s+20>>2]=y}if((y|0)==0){break L1801}}}while(0);if(y>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[y+24>>2]=s;o=c[g+(f+16|0)>>2]|0;do{if((o|0)!=0){if(o>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[y+16>>2]=o;c[o+24>>2]=y;break}}}while(0);o=c[g+(f+20|0)>>2]|0;if((o|0)==0){break}if(o>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[y+20>>2]=o;c[o+24>>2]=y;break}}}while(0);if(q>>>0<16){c[d>>2]=p|c[d>>2]&1|2;y=g+(p|4)|0;c[y>>2]=c[y>>2]|1;n=a;return n|0}else{c[d>>2]=c[d>>2]&1|b|2;c[g+(b+4|0)>>2]=q|3;d=g+(p|4)|0;c[d>>2]=c[d>>2]|1;uy(g+b|0,q);n=a;return n|0}return 0}function uy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=a;e=d+b|0;f=e;g=c[a+4>>2]|0;L1877:do{if((g&1|0)==0){h=c[a>>2]|0;if((g&3|0)==0){return}i=d+(-h|0)|0;j=i;k=h+b|0;l=c[56334]|0;if(i>>>0<l>>>0){ce()}if((j|0)==(c[56335]|0)){m=d+(b+4|0)|0;if((c[m>>2]&3|0)!=3){n=j;o=k;break}c[56332]=k;c[m>>2]=c[m>>2]&-2;c[d+(4-h|0)>>2]=k|1;c[e>>2]=k;return}m=h>>>3;if(h>>>0<256){p=c[d+(8-h|0)>>2]|0;q=c[d+(12-h|0)>>2]|0;r=225360+(m<<1<<2)|0;do{if((p|0)!=(r|0)){if(p>>>0<l>>>0){ce()}if((c[p+12>>2]|0)==(j|0)){break}ce()}}while(0);if((q|0)==(p|0)){c[56330]=c[56330]&(1<<m^-1);n=j;o=k;break}do{if((q|0)==(r|0)){s=q+8|0}else{if(q>>>0<l>>>0){ce()}t=q+8|0;if((c[t>>2]|0)==(j|0)){s=t;break}ce()}}while(0);c[p+12>>2]=q;c[s>>2]=p;n=j;o=k;break}r=i;m=c[d+(24-h|0)>>2]|0;t=c[d+(12-h|0)>>2]|0;do{if((t|0)==(r|0)){u=16-h|0;v=d+(u+4|0)|0;w=c[v>>2]|0;if((w|0)==0){x=d+u|0;u=c[x>>2]|0;if((u|0)==0){y=0;break}else{z=u;A=x}}else{z=w;A=v}while(1){v=z+20|0;w=c[v>>2]|0;if((w|0)!=0){z=w;A=v;continue}v=z+16|0;w=c[v>>2]|0;if((w|0)==0){break}else{z=w;A=v}}if(A>>>0<l>>>0){ce()}else{c[A>>2]=0;y=z;break}}else{v=c[d+(8-h|0)>>2]|0;if(v>>>0<l>>>0){ce()}w=v+12|0;if((c[w>>2]|0)!=(r|0)){ce()}x=t+8|0;if((c[x>>2]|0)==(r|0)){c[w>>2]=t;c[x>>2]=v;y=t;break}else{ce()}}}while(0);if((m|0)==0){n=j;o=k;break}t=d+(28-h|0)|0;l=225624+(c[t>>2]<<2)|0;do{if((r|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[56331]=c[56331]&(1<<c[t>>2]^-1);n=j;o=k;break L1877}else{if(m>>>0<(c[56334]|0)>>>0){ce()}i=m+16|0;if((c[i>>2]|0)==(r|0)){c[i>>2]=y}else{c[m+20>>2]=y}if((y|0)==0){n=j;o=k;break L1877}}}while(0);if(y>>>0<(c[56334]|0)>>>0){ce()}c[y+24>>2]=m;r=16-h|0;t=c[d+r>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[y+16>>2]=t;c[t+24>>2]=y;break}}}while(0);t=c[d+(r+4|0)>>2]|0;if((t|0)==0){n=j;o=k;break}if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[y+20>>2]=t;c[t+24>>2]=y;n=j;o=k;break}}else{n=a;o=b}}while(0);a=c[56334]|0;if(e>>>0<a>>>0){ce()}y=d+(b+4|0)|0;z=c[y>>2]|0;do{if((z&2|0)==0){if((f|0)==(c[56336]|0)){A=(c[56333]|0)+o|0;c[56333]=A;c[56336]=n;c[n+4>>2]=A|1;if((n|0)!=(c[56335]|0)){return}c[56335]=0;c[56332]=0;return}if((f|0)==(c[56335]|0)){A=(c[56332]|0)+o|0;c[56332]=A;c[56335]=n;c[n+4>>2]=A|1;c[n+A>>2]=A;return}A=(z&-8)+o|0;s=z>>>3;L1976:do{if(z>>>0<256){g=c[d+(b+8|0)>>2]|0;t=c[d+(b+12|0)>>2]|0;h=225360+(s<<1<<2)|0;do{if((g|0)!=(h|0)){if(g>>>0<a>>>0){ce()}if((c[g+12>>2]|0)==(f|0)){break}ce()}}while(0);if((t|0)==(g|0)){c[56330]=c[56330]&(1<<s^-1);break}do{if((t|0)==(h|0)){B=t+8|0}else{if(t>>>0<a>>>0){ce()}m=t+8|0;if((c[m>>2]|0)==(f|0)){B=m;break}ce()}}while(0);c[g+12>>2]=t;c[B>>2]=g}else{h=e;m=c[d+(b+24|0)>>2]|0;l=c[d+(b+12|0)>>2]|0;do{if((l|0)==(h|0)){i=d+(b+20|0)|0;p=c[i>>2]|0;if((p|0)==0){q=d+(b+16|0)|0;v=c[q>>2]|0;if((v|0)==0){C=0;break}else{D=v;E=q}}else{D=p;E=i}while(1){i=D+20|0;p=c[i>>2]|0;if((p|0)!=0){D=p;E=i;continue}i=D+16|0;p=c[i>>2]|0;if((p|0)==0){break}else{D=p;E=i}}if(E>>>0<a>>>0){ce()}else{c[E>>2]=0;C=D;break}}else{i=c[d+(b+8|0)>>2]|0;if(i>>>0<a>>>0){ce()}p=i+12|0;if((c[p>>2]|0)!=(h|0)){ce()}q=l+8|0;if((c[q>>2]|0)==(h|0)){c[p>>2]=l;c[q>>2]=i;C=l;break}else{ce()}}}while(0);if((m|0)==0){break}l=d+(b+28|0)|0;g=225624+(c[l>>2]<<2)|0;do{if((h|0)==(c[g>>2]|0)){c[g>>2]=C;if((C|0)!=0){break}c[56331]=c[56331]&(1<<c[l>>2]^-1);break L1976}else{if(m>>>0<(c[56334]|0)>>>0){ce()}t=m+16|0;if((c[t>>2]|0)==(h|0)){c[t>>2]=C}else{c[m+20>>2]=C}if((C|0)==0){break L1976}}}while(0);if(C>>>0<(c[56334]|0)>>>0){ce()}c[C+24>>2]=m;h=c[d+(b+16|0)>>2]|0;do{if((h|0)!=0){if(h>>>0<(c[56334]|0)>>>0){ce()}else{c[C+16>>2]=h;c[h+24>>2]=C;break}}}while(0);h=c[d+(b+20|0)>>2]|0;if((h|0)==0){break}if(h>>>0<(c[56334]|0)>>>0){ce()}else{c[C+20>>2]=h;c[h+24>>2]=C;break}}}while(0);c[n+4>>2]=A|1;c[n+A>>2]=A;if((n|0)!=(c[56335]|0)){F=A;break}c[56332]=A;return}else{c[y>>2]=z&-2;c[n+4>>2]=o|1;c[n+o>>2]=o;F=o}}while(0);o=F>>>3;if(F>>>0<256){z=o<<1;y=225360+(z<<2)|0;C=c[56330]|0;b=1<<o;do{if((C&b|0)==0){c[56330]=C|b;G=y;H=225360+(z+2<<2)|0}else{o=225360+(z+2<<2)|0;d=c[o>>2]|0;if(d>>>0>=(c[56334]|0)>>>0){G=d;H=o;break}ce()}}while(0);c[H>>2]=n;c[G+12>>2]=n;c[n+8>>2]=G;c[n+12>>2]=y;return}y=n;G=F>>>8;do{if((G|0)==0){I=0}else{if(F>>>0>16777215){I=31;break}H=(G+1048320|0)>>>16&8;z=G<<H;b=(z+520192|0)>>>16&4;C=z<<b;z=(C+245760|0)>>>16&2;o=(14-(b|H|z)|0)+(C<<z>>>15)|0;I=F>>>((o+7|0)>>>0)&1|o<<1}}while(0);G=225624+(I<<2)|0;c[n+28>>2]=I;c[n+20>>2]=0;c[n+16>>2]=0;o=c[56331]|0;z=1<<I;if((o&z|0)==0){c[56331]=o|z;c[G>>2]=y;c[n+24>>2]=G;c[n+12>>2]=n;c[n+8>>2]=n;return}if((I|0)==31){J=0}else{J=25-(I>>>1)|0}I=F<<J;J=c[G>>2]|0;while(1){if((c[J+4>>2]&-8|0)==(F|0)){break}K=J+16+(I>>>31<<2)|0;G=c[K>>2]|0;if((G|0)==0){L=1527;break}else{I=I<<1;J=G}}if((L|0)==1527){if(K>>>0<(c[56334]|0)>>>0){ce()}c[K>>2]=y;c[n+24>>2]=J;c[n+12>>2]=n;c[n+8>>2]=n;return}K=J+8|0;L=c[K>>2]|0;I=c[56334]|0;if(J>>>0<I>>>0){ce()}if(L>>>0<I>>>0){ce()}c[L+12>>2]=y;c[K>>2]=y;c[n+8>>2]=L;c[n+12>>2]=J;c[n+24>>2]=0;return}function uz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0.0,R=0.0,S=0.0;e=b;while(1){f=e+1|0;if((aM(a[e]|0|0)|0)==0){break}else{e=f}}g=a[e]|0;if((g<<24>>24|0)==45){i=f;j=1}else if((g<<24>>24|0)==43){i=f;j=0}else{i=e;j=0}e=-1;f=0;g=i;while(1){k=a[g]|0;if(((k<<24>>24)-48|0)>>>0<10){l=e}else{if(k<<24>>24!=46|(e|0)>-1){break}else{l=f}}e=l;f=f+1|0;g=g+1|0}l=g+(-f|0)|0;i=(e|0)<0;m=((i^1)<<31>>31)+f|0;n=(m|0)>18;o=(n?-18:-m|0)+(i?f:e)|0;e=n?18:m;do{if((e|0)==0){p=b;q=0.0}else{if((e|0)>9){m=l;n=e;f=0;while(1){i=a[m]|0;r=m+1|0;if(i<<24>>24==46){s=a[r]|0;t=m+2|0}else{s=i;t=r}u=((f*10&-1)-48|0)+(s<<24>>24)|0;r=n-1|0;if((r|0)>9){m=t;n=r;f=u}else{break}}v=+(u|0)*1.0e9;w=9;x=t;y=1575}else{if((e|0)>0){v=0.0;w=e;x=l;y=1575}else{z=0.0;A=0.0}}if((y|0)==1575){f=x;n=w;m=0;while(1){r=a[f]|0;i=f+1|0;if(r<<24>>24==46){B=a[i]|0;C=f+2|0}else{B=r;C=i}D=((m*10&-1)-48|0)+(B<<24>>24)|0;i=n-1|0;if((i|0)>0){f=C;n=i;m=D}else{break}}z=+(D|0);A=v}E=A+z;do{if((k<<24>>24|0)==69|(k<<24>>24|0)==101){m=g+1|0;n=a[m]|0;if((n<<24>>24|0)==45){F=g+2|0;G=1}else if((n<<24>>24|0)==43){F=g+2|0;G=0}else{F=m;G=0}m=a[F]|0;if(((m<<24>>24)-48|0)>>>0<10){H=F;I=0;J=m}else{K=0;L=F;M=G;break}while(1){m=((I*10&-1)-48|0)+(J<<24>>24)|0;n=H+1|0;f=a[n]|0;if(((f<<24>>24)-48|0)>>>0<10){H=n;I=m;J=f}else{K=m;L=n;M=G;break}}}else{K=0;L=g;M=0}}while(0);n=o+((M|0)==0?K:-K|0)|0;m=(n|0)<0?-n|0:n;if((m|0)>511){c[b0()>>2]=34;N=1.0;O=30088;P=511;y=1592}else{if((m|0)==0){Q=1.0}else{N=1.0;O=30088;P=m;y=1592}}if((y|0)==1592){while(1){y=0;if((P&1|0)==0){R=N}else{R=N*+h[O>>3]}m=P>>1;if((m|0)==0){Q=R;break}else{N=R;O=O+8|0;P=m;y=1592}}}if((n|0)>-1){p=L;q=E*Q;break}else{p=L;q=E/Q;break}}}while(0);if((d|0)!=0){c[d>>2]=p}if((j|0)==0){S=q;return+S}S=-0.0-q;return+S}function uA(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function uB(b,c){b=b|0;c=c|0;var d=0;do{a[b+d|0]=a[c+d|0];d=d+1|0}while(a[c+(d-1)|0]|0);return b|0}function uC(b,c){b=b|0;c=c|0;var d=0,e=0;d=b+(uA(b)|0)|0;do{a[d+e|0]=a[c+e|0];e=e+1|0}while(a[c+(e-1)|0]|0);return b|0}function uD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function uE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=b+e|0;if((e|0)>=20){d=d&255;e=b&3;g=d|d<<8|d<<16|d<<24;h=f&~3;if(e){e=b+4-e|0;while((b|0)<(e|0)){a[b]=d;b=b+1|0}}while((b|0)<(h|0)){c[b>>2]=g;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}}function uF(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){a[b+e|0]=f?0:a[c+e|0]|0;f=f?1:(a[c+e|0]|0)==0;e=e+1|0}return b|0}function uG(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0;while((e|0)<(c|0)){f=d[a+e|0]|0;g=d[b+e|0]|0;if((f|0)!=(g|0))return((f|0)>(g|0)?1:-1)|0;e=e+1|0}return 0}function uH(b,c,d){b=b|0;c=c|0;d=d|0;if((c|0)<(b|0)&(b|0)<(c+d|0)){c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b]=a[c]|0}}else{uD(b,c,d)}}function uI(a){a=a|0;if((a|0)<65)return a|0;if((a|0)>90)return a|0;return a-65+97|0}function uJ(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;while(e>>>0<d>>>0){f=uI(a[b+e|0]|0)|0;g=uI(a[c+e|0]|0)|0;if((f|0)==(g|0)&(f|0)==0)return 0;if((f|0)==0)return-1;if((g|0)==0)return 1;if((f|0)==(g|0)){e=e+1|0;continue}else{return(f>>>0>g>>>0?1:-1)|0}}return 0}function uK(a,b){a=a|0;b=b|0;return uJ(a,b,-1)|0}function uL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;t=t+1|0;c[a>>2]=t;while((e|0)<40){if((c[d+(e<<2)>>2]|0)==0){c[d+(e<<2)>>2]=t;c[d+((e<<2)+4)>>2]=b;c[d+((e<<2)+8)>>2]=0;return 0}e=e+2|0}br(116);br(111);br(111);br(32);br(109);br(97);br(110);br(121);br(32);br(115);br(101);br(116);br(106);br(109);br(112);br(115);br(32);br(105);br(110);br(32);br(97);br(32);br(102);br(117);br(110);br(99);br(116);br(105);br(111);br(110);br(32);br(99);br(97);br(108);br(108);br(44);br(32);br(98);br(117);br(105);br(108);br(100);br(32);br(119);br(105);br(116);br(104);br(32);br(97);br(32);br(104);br(105);br(103);br(104);br(101);br(114);br(32);br(118);br(97);br(108);br(117);br(101);br(32);br(102);br(111);br(114);br(32);br(77);br(65);br(88);br(95);br(83);br(69);br(84);br(74);br(77);br(80);br(83);br(10);ab(0);return 0}function uM(a,b){a=a|0;b=b|0;var d=0,e=0;while((d|0)<20){e=c[b+(d<<2)>>2]|0;if((e|0)==0)break;if((e|0)==(a|0)){return c[b+((d<<2)+4)>>2]|0}d=d+2|0}return 0}function uN(){return b0()|0}function uO(a){a=a|0;bd(a|0)}function uP(a,b){a=a|0;b=b|0;cA(a|0,b|0)}function uQ(a){a=a|0;return bS(a|0)|0}function uR(a){a=a|0;return aR(a|0)|0}function uS(a){a=a|0;return a5(a|0)|0}function uT(a){a=a|0;return aA(a|0)|0}function uU(a){a=a|0;return bP(a|0)|0}function uV(a,b){a=a|0;b=b|0;return aY(a|0,b|0)|0}function uW(a,b){a=a|0;b=b|0;return bA(a|0,b|0)|0}function uX(a,b){a=a|0;b=b|0;return bD(a|0,b|0)|0}function uY(a,b,c){a=a|0;b=b|0;c=c|0;return a_(a|0,b|0,c|0)|0}function uZ(a,b,c){a=a|0;b=b|0;c=c|0;return cf(a|0,b|0,c|0)|0}function u_(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return cH(a|0,b|0,c|0,d|0)|0}function u$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return aI(a|0,b|0,c|0,d|0)|0}function u0(a,b){a=a|0;b=b|0;return+aV(a|0,b|0)}function u1(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;cI[a&63](b|0,c|0,d|0,e|0,f|0)}function u2(a,b,c,d,e,f,g){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;g=g|0;cJ[a&15](b|0,+c,+d,e|0,f|0,g|0)}function u3(a,b){a=a|0;b=+b;cK[a&63](+b)}function u4(a){a=a|0;return cL[a&7]()|0}function u5(a,b){a=a|0;b=b|0;cM[a&511](b|0)}function u6(a,b,c){a=a|0;b=b|0;c=c|0;cN[a&255](b|0,c|0)}function u7(a,b){a=a|0;b=b|0;return cO[a&255](b|0)|0}function u8(a,b,c){a=a|0;b=+b;c=+c;return cP[a&3](+b,+c)|0}function u9(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return cQ[a&7](b|0,c|0,d|0)|0}function va(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;cR[a&127](b|0,c|0,d|0)}function vb(a){a=a|0;cS[a&511]()}function vc(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;f=f|0;cT[a&15](b|0,+c,d|0,e|0,f|0)}function vd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return cU[a&7](b|0,c|0,d|0,e|0)|0}function ve(a,b,c){a=a|0;b=b|0;c=c|0;return+cV[a&7](b|0,c|0)}function vf(a,b,c){a=a|0;b=b|0;c=c|0;return cW[a&63](b|0,c|0)|0}function vg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ab(0)}function vh(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;ab(1)}function vi(a){a=+a;ab(2)}function vj(){ab(3);return 0}function vk(a){a=a|0;ab(4)}function vl(a,b){a=a|0;b=b|0;ab(5)}function vm(a){a=a|0;ab(6);return 0}function vn(a,b){a=+a;b=+b;ab(7);return 0}function vo(a,b,c){a=a|0;b=b|0;c=c|0;ab(8);return 0}function vp(a,b,c){a=a|0;b=b|0;c=c|0;ab(9)}function vq(){ab(10)}function vr(a,b,c,d,e){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;ab(11)}function vs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ab(12);return 0}function vt(a,b){a=a|0;b=b|0;ab(13);return 0.0}function vu(a,b){a=a|0;b=b|0;ab(14);return 0}
-// EMSCRIPTEN_END_FUNCS
-var cI=[vg,vg,sZ,vg,rC,vg,pN,vg,rM,vg,qN,vg,s1,vg,l2,vg,rd,vg,sn,vg,rc,vg,sC,vg,qP,vg,sF,vg,qk,vg,sW,vg,n6,vg,pV,vg,sd,vg,oq,vg,r0,vg,nK,vg,pw,vg,on,vg,lD,vg,nd,vg,mV,vg,pK,vg,vg,vg,vg,vg,vg,vg,vg,vg];var cJ=[vh,vh,nD,vh,mS,vh,qq,vh,n3,vh,pW,vh,lH,vh,vh,vh];var cK=[vi,vi,qG,vi,s_,vi,pM,vi,n7,vi,lC,vi,sE,vi,ql,vi,o8,vi,sG,vi,n5,vi,qX,vi,of,vi,nf,vi,sY,vi,mR,vi,mW,vi,lA,vi,op,vi,pP,vi,nb,vi,qL,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi];var cL=[vj,vj,hy,vj,uN,vj,dI,vj];var cM=[vk,vk,g5,vk,iP,vk,kT,vk,th,vk,hg,vk,ku,vk,tm,vk,tn,vk,p4,vk,qf,vk,rk,vk,m_,vk,tb,vk,nu,vk,e0,vk,rj,vk,rZ,vk,kP,vk,mi,vk,mz,vk,hd,vk,kh,vk,sT,vk,rJ,vk,k7,vk,ff,vk,n8,vk,mX,vk,tc,vk,kE,vk,rs,vk,ks,vk,kF,vk,gX,vk,kG,vk,g1,vk,gY,vk,kM,vk,kn,vk,ou,vk,ke,vk,g6,vk,pZ,vk,ta,vk,lP,vk,iN,vk,tk,vk,te,vk,uu,vk,gL,vk,lF,vk,eW,vk,kS,vk,tr,vk,kx,vk,kU,vk,hj,vk,eI,vk,kI,vk,o3,vk,kR,vk,gZ,vk,kB,vk,gK,vk,m$,vk,tp,vk,kC,vk,e5,vk,qQ,vk,mN,vk,sa,vk,lB,vk,nH,vk,r2,vk,dL,vk,kv,vk,ki,vk,oN,vk,l9,vk,q9,vk,kY,vk,kj,vk,g0,vk,ph,vk,gM,vk,gW,vk,lU,vk,eJ,vk,s$,vk,qD,vk,tl,vk,kz,vk,kg,vk,gJ,vk,k5,vk,g$,vk,qi,vk,kQ,vk,g9,vk,e7,vk,kf,vk,sz,vk,g_,vk,g7,vk,gN,vk,sH,vk,eZ,vk,g4,vk,kl,vk,nY,vk,gP,vk,kZ,vk,k_,vk,qs,vk,m7,vk,gS,vk,e_,vk,qV,vk,hb,vk,eG,vk,pI,vk,kq,vk,g2,vk,he,vk,ky,vk,gV,vk,k3,vk,pY,vk,eK,vk,qo,vk,e$,vk,kX,vk,gG,vk,kk,vk,k1,vk,jI,vk,ps,vk,kD,vk,hf,vk,to,vk,s8,vk,gR,vk,pS,vk,gE,vk,rh,vk,gI,vk,ti,vk,g8,vk,nh,vk,k0,vk,k$,vk,td,vk,k6,vk,kJ,vk,tj,vk,gU,vk,km,vk,hc,vk,gH,vk,gF,vk,kH,vk,kO,vk,nE,vk,gO,vk,eF,vk,kL,vk,gQ,vk,gT,vk,hi,vk,oU,vk,k8,vk,k2,vk,kK,vk,hh,vk,s9,vk,g3,vk,kt,vk,uO,vk,qt,vk,eH,vk,mo,vk,os,vk,kN,vk,kw,vk,ha,vk,gD,vk,tq,vk,sl,vk,ko,vk,k4,vk,kp,vk,ol,vk,kA,vk,ow,vk,tf,vk,pX,vk,lT,vk,tg,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk];var cN=[vl,vl,sS,vl,oT,vl,rH,vl,pT,vl,ok,vl,pr,vl,qp,vl,oB,vl,nG,vl,pG,vl,oA,vl,px,vl,oS,vl,nW,vl,p2,vl,qM,vl,l_,vl,r3,vl,oL,vl,m5,vl,my,vl,rr,vl,oM,vl,nX,vl,l7,vl,pf,vl,nn,vl,p3,vl,sy,vl,mt,vl,qe,vl,n9,vl,rY,vl,pg,vl,sR,vl,rI,vl,qd,vl,qR,vl,tM,vl,tU,vl,lZ,vl,py,vl,mh,vl,uP,vl,rX,vl,o2,vl,qB,vl,l8,vl,mY,vl,mL,vl,mg,vl,nO,vl,m6,vl,ns,vl,r9,vl,sx,vl,s0,vl,rq,vl,pH,vl,sI,vl,oj,vl,nP,vl,lO,vl,ms,vl,mM,vl,q3,vl,q2,vl,mx,vl,rT,vl,sk,vl,qC,vl,nm,vl,r8,vl,ot,vl,no,vl,o1,vl,qW,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl];var cO=[vm,vm,o5,vm,e6,vm,qZ,vm,nF,vm,pQ,vm,lv,vm,h2,vm,pm,vm,uQ,vm,mP,vm,oW,vm,im,vm,pB,vm,oP,vm,q7,vm,ia,vm,mI,vm,nZ,vm,sX,vm,h4,vm,qm,vm,id,vm,ij,vm,r1,vm,m8,vm,q_,vm,n1,vm,ut,vm,uR,vm,mU,vm,l0,vm,rx,vm,h8,vm,sD,vm,sj,vm,sp,vm,hP,vm,pi,vm,ie,vm,pu,vm,oe,vm,o6,vm,h5,vm,ry,vm,pL,vm,ic,vm,od,vm,m9,vm,or,vm,h9,vm,uS,vm,h6,vm,nc,vm,uT,vm,qa,vm,sL,vm,q6,vm,rS,vm,oD,vm,h3,vm,hX,vm,lw,vm,tC,vm,rv,vm,rQ,vm,p9,vm,ik,vm,mQ,vm,nq,vm,sM,vm,o9,vm,qj,vm,nr,vm,qz,vm,ii,vm,mD,vm,pC,vm,h7,vm,lR,vm,lS,vm,uU,vm,mb,vm,qH,vm,pj,vm,rR,vm,h1,vm,il,vm,qy,vm,sr,vm,n4,vm,h0,vm,n_,vm,rP,vm,sK,vm,rw,vm,ng,vm,nC,vm,ig,vm,si,vm,sq,vm,ib,vm,qO,vm,ih,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm];var cP=[vn,vn,lu,vn];var cQ=[vo,vo,uY,vo,uZ,vo,vo,vo];var cR=[vp,vp,tw,vp,pt,vp,uf,vp,lL,vp,sA,vp,rt,vp,r$,vp,ri,vp,o4,vp,rA,vp,pl,vp,p5,vp,qF,vp,na,vp,qE,vp,o7,vp,sB,vp,rB,vp,nv,vp,l$,vp,ma,vp,oE,vp,tX,vp,sU,vp,n0,vp,oO,vp,l1,vp,rb,vp,ne,vp,ly,vp,mA,vp,nQ,vp,r_,vp,qg,vp,mT,vp,mp,vp,tR,vp,hw,vp,mu,vp,mj,vp,rL,vp,sc,vp,tB,vp,lQ,vp,ra,vp,sV,vp,oo,vp,q4,vp,oC,vp,rK,vp,n$,vp,nJ,vp,sm,vp,oV,vp,nI,vp,om,vp,pJ,vp,pO,vp,mO,vp,pv,vp,qh,vp,tQ,vp,sb,vp];var cS=[vq,vq,m3,vq,p7,vq,mC,vq,mc,vq,dR,vq,pb,vq,rl,vq,pR,vq,qv,vq,mk,vq,ee,vq,np,vq,ei,vq,nL,vq,dX,vq,nU,vq,p8,vq,d9,vq,jy,vq,nz,vq,pA,vq,dH,vq,ru,vq,l3,vq,mw,vq,mf,vq,sQ,vq,oc,vq,o_,vq,d3,vq,nk,vq,es,vq,mB,vq,pa,vq,pe,vq,ox,vq,sN,vq,qT,vq,ob,vq,mE,vq,qr,vq,rm,vq,nt,vq,pd,vq,nN,vq,lo,vq,sh,vq,dV,vq,l5,vq,me,vq,ml,vq,oX,vq,m0,vq,lE,vq,sP,vq,eb,vq,se,vq,sJ,vq,d1,vq,lY,vq,r6,vq,er,vq,su,vq,eh,vq,qU,vq,pU,vq,oK,vq,n2,vq,t7,vq,fd,vq,dv,vq,dt,vq,pE,vq,mG,vq,m2,vq,qA,vq,rG,vq,qb,vq,q8,vq,rE,vq,pF,vq,rn,vq,d0,vq,m1,vq,mq,vq,mr,vq,eq,vq,r7,vq,oR,vq,qn,vq,nM,vq,en,vq,rg,vq,q5,vq,lN,vq,ov,vq,t5,vq,ny,vq,pq,vq,qx,vq,ex,vq,oY,vq,mF,vq,eg,vq,pn,vq,qc,vq,d_,vq,oF,vq,l4,vq,oz,vq,mH,vq,rF,vq,r4,vq,p_,vq,qS,vq,dQ,vq,mv,vq,dZ,vq,oa,vq,d6,vq,nw,vq,qK,vq,nS,vq,qu,vq,oJ,vq,sw,vq,nB,vq,pp,vq,dw,vq,oI,vq,og,vq,oH,vq,rO,vq,l6,vq,re,vq,oQ,vq,lX,vq,mm,vq,ec,vq,pk,vq,q1,vq,nj,vq,o$,vq,ej,vq,nx,vq,dN,vq,jo,vq,mn,vq,pD,vq,rW,vq,ni,vq,lM,vq,nR,vq,ro,vq,r5,vq,nl,vq,sO,vq,st,vq,p1,vq,po,vq,oi,vq,rU,vq,p0,vq,dW,vq,nV,vq,dY,vq,lI,vq,pc,vq,qI,vq,ek,vq,oy,vq,oG,vq,sg,vq,rN,vq,d5,vq,dE,vq,em,vq,qJ,vq,rV,vq,md,vq,q$,vq,ef,vq,oZ,vq,el,vq,ed,vq,mJ,vq,p$,vq,mZ,vq,pz,vq,rp,vq,nA,vq,dG,vq,sf,vq,d2,vq,sv,vq,so,vq,rz,vq,qw,vq,lV,vq,d4,vq,rf,vq,nT,vq,d7,vq,rD,vq,o0,vq,ss,vq,lW,vq,dS,vq,iK,vq,ds,vq,d$,vq,gk,vq,d8,vq,p6,vq,q0,vq,m4,vq,oh,vq,mK,vq,qY,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq];var cT=[vr,vr,f6,vr,f7,vr,fJ,vr,dC,vr,fH,vr,fI,vr,di,vr];var cU=[vs,vs,u_,vs,u$,vs,vs,vs];var cV=[vt,vt,u0,vt,uz,vt,vt,vt];var cW=[vu,vu,lr,vu,la,vu,gn,vu,uV,vu,uW,vu,f5,vu,go,vu,i2,vu,hm,vu,hA,vu,iV,vu,uq,vu,uX,vu,uB,vu,f4,vu,gl,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu];return{_memcmp:uG,_saveSetjmp:uL,_strcat:uC,_free:uu,_main:iM,_testSetjmp:uM,_strncpy:uF,_memmove:uH,_tolower:uI,_memset:uE,_malloc:ut,_memcpy:uD,_strcasecmp:uK,_strlen:uA,_realloc:uv,_strncasecmp:uJ,_strcpy:uB,stackAlloc:cX,stackSave:cY,stackRestore:cZ,setThrew:c_,setTempRet0:c$,setTempRet1:c0,setTempRet2:c1,setTempRet3:c2,setTempRet4:c3,setTempRet5:c4,setTempRet6:c5,setTempRet7:c6,setTempRet8:c7,setTempRet9:c8,dynCall_viiiii:u1,dynCall_viffiii:u2,dynCall_vf:u3,dynCall_i:u4,dynCall_vi:u5,dynCall_vii:u6,dynCall_ii:u7,dynCall_iff:u8,dynCall_iiii:u9,dynCall_viii:va,dynCall_v:vb,dynCall_vifiii:vc,dynCall_iiiii:vd,dynCall_fii:ve,dynCall_iii:vf}})
-// EMSCRIPTEN_END_ASM
-({ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array }, { "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "copyTempDouble": copyTempDouble, "copyTempFloat": copyTempFloat, "min": Math_min, "invoke_viiiii": invoke_viiiii, "invoke_viffiii": invoke_viffiii, "invoke_vf": invoke_vf, "invoke_i": invoke_i, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_iff": invoke_iff, "invoke_iiii": invoke_iiii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_vifiii": invoke_vifiii, "invoke_iiiii": invoke_iiiii, "invoke_fii": invoke_fii, "invoke_iii": invoke_iii, "_lseek": _lseek, "__scanString": __scanString, "_fclose": _fclose, "_uname": _uname, "_sleep": _sleep, "__isFloat": __isFloat, "_fflush": _fflush, "_strtol": _strtol, "_fputc": _fputc, "_iconv": _iconv, "___signgam": ___signgam, "_fwrite": _fwrite, "_send": _send, "_fputs": _fputs, "_tmpnam": _tmpnam, "_isspace": _isspace, "_localtime": _localtime, "_read": _read, "_ceil": _ceil, "_strstr": _strstr, "_fileno": _fileno, "_perror": _perror, "_ctime": _ctime, "_fsync": _fsync, "_signal": _signal, "_opendir": _opendir, "_fmod": _fmod, "_strcmp": _strcmp, "_memchr": _memchr, "_strncmp": _strncmp, "_tmpfile": _tmpfile, "_snprintf": _snprintf, "_fgetc": _fgetc, "_pclose": _pclose, "_readdir": _readdir, "_cosh": _cosh, "_atexit": _atexit, "_fgets": _fgets, "_close": _close, "_strchr": _strchr, "_asin": _asin, "_llvm_lifetime_start": _llvm_lifetime_start, "___setErrNo": ___setErrNo, "_ftell": _ftell, "_exit": _exit, "_sprintf": _sprintf, "_llvm_lifetime_end": _llvm_lifetime_end, "_asctime": _asctime, "_strrchr": _strrchr, "_iconv_open": _iconv_open, "_modf": _modf, "_strcspn": _strcspn, "_getcwd": _getcwd, "_gmtime": _gmtime, "_localtime_r": _localtime_r, "_asctime_r": _asctime_r, "_recv": _recv, "_cos": _cos, "_putchar": _putchar, "_isalnum": _isalnum, "_popen": _popen, "_erfc": _erfc, "__exit": __exit, "_strftime": _strftime, "_llvm_va_end": _llvm_va_end, "_tzset": _tzset, "_sinh": _sinh, "_setlocale": _setlocale, "_isprint": _isprint, "_toupper": _toupper, "_printf": _printf, "_pread": _pread, "_fopen": _fopen, "_open": _open, "_usleep": _usleep, "_log": _log, "_puts": _puts, "_mktime": _mktime, "_fdopen": _fdopen, "_qsort": _qsort, "_system": _system, "_isalpha": _isalpha, "_strdup": _strdup, "_log10": _log10, "_closedir": _closedir, "_isatty": _isatty, "__formatString": __formatString, "_getenv": _getenv, "_gettimeofday": _gettimeofday, "_atoi": _atoi, "_vfprintf": _vfprintf, "_chdir": _chdir, "_llvm_pow_f64": _llvm_pow_f64, "_sbrk": _sbrk, "_localeconv": _localeconv, "___errno_location": ___errno_location, "_strerror": _strerror, "_lgamma": _lgamma, "_erf": _erf, "_strspn": _strspn, "__parseInt": __parseInt, "_ungetc": _ungetc, "_llvm_trap": _llvm_trap, "_rename": _rename, "_vsnprintf": _vsnprintf, "_sscanf": _sscanf, "_sysconf": _sysconf, "_acos": _acos, "_fread": _fread, "_abort": _abort, "_fprintf": _fprintf, "___fpclassifyf": ___fpclassifyf, "_tan": _tan, "___buildEnvironment": ___buildEnvironment, "_feof": _feof, "_strncat": _strncat, "_gmtime_r": _gmtime_r, "_fabs": _fabs, "_floor": _floor, "__reallyNegative": __reallyNegative, "_fseek": _fseek, "_sqrt": _sqrt, "_write": _write, "_rewind": _rewind, "_sin": _sin, "_stat": _stat, "_longjmp": _longjmp, "_atan": _atan, "_readdir_r": _readdir_r, "_strpbrk": _strpbrk, "_iconv_close": _iconv_close, "_setbuf": _setbuf, "_nl_langinfo": _nl_langinfo, "_pwrite": _pwrite, "_strerror_r": _strerror_r, "_atan2": _atan2, "_exp": _exp, "_time": _time, "_setvbuf": _setvbuf, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "_stderr": _stderr, "_stdout": _stdout, "_stdin": _stdin }, buffer);
-var _memcmp = Module["_memcmp"] = asm["_memcmp"];
-var _saveSetjmp = Module["_saveSetjmp"] = asm["_saveSetjmp"];
-var _strcat = Module["_strcat"] = asm["_strcat"];
-var _free = Module["_free"] = asm["_free"];
-var _main = Module["_main"] = asm["_main"];
-var _testSetjmp = Module["_testSetjmp"] = asm["_testSetjmp"];
-var _strncpy = Module["_strncpy"] = asm["_strncpy"];
-var _memmove = Module["_memmove"] = asm["_memmove"];
-var _tolower = Module["_tolower"] = asm["_tolower"];
-var _memset = Module["_memset"] = asm["_memset"];
-var _malloc = Module["_malloc"] = asm["_malloc"];
-var _memcpy = Module["_memcpy"] = asm["_memcpy"];
-var _strcasecmp = Module["_strcasecmp"] = asm["_strcasecmp"];
-var _strlen = Module["_strlen"] = asm["_strlen"];
-var _realloc = Module["_realloc"] = asm["_realloc"];
-var _strncasecmp = Module["_strncasecmp"] = asm["_strncasecmp"];
-var _strcpy = Module["_strcpy"] = asm["_strcpy"];
-var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"];
-var dynCall_viffiii = Module["dynCall_viffiii"] = asm["dynCall_viffiii"];
-var dynCall_vf = Module["dynCall_vf"] = asm["dynCall_vf"];
-var dynCall_i = Module["dynCall_i"] = asm["dynCall_i"];
-var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"];
-var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"];
-var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"];
-var dynCall_iff = Module["dynCall_iff"] = asm["dynCall_iff"];
-var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
-var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"];
-var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
-var dynCall_vifiii = Module["dynCall_vifiii"] = asm["dynCall_vifiii"];
-var dynCall_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"];
-var dynCall_fii = Module["dynCall_fii"] = asm["dynCall_fii"];
-var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];
-Runtime.stackAlloc = function(size) { return asm['stackAlloc'](size) };
-Runtime.stackSave = function() { return asm['stackSave']() };
-Runtime.stackRestore = function(top) { asm['stackRestore'](top) };
-// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included
-var i64Math = null;
-// === Auto-generated postamble setup entry stuff ===
-Module['callMain'] = function callMain(args) {
- assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');
- assert(!Module['preRun'] || Module['preRun'].length == 0, 'cannot call main when preRun functions remain to be called');
- args = args || [];
- ensureInitRuntime();
- var argc = args.length+1;
- function pad() {
- for (var i = 0; i < 4-1; i++) {
- argv.push(0);
- }
- }
- var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ];
- pad();
- for (var i = 0; i < argc-1; i = i + 1) {
- argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));
- pad();
- }
- argv.push(0);
- argv = allocate(argv, 'i32', ALLOC_NORMAL);
- var ret;
- var initialStackTop = STACKTOP;
- try {
- ret = Module['_main'](argc, argv, 0);
- }
- catch(e) {
- if (e.name == 'ExitStatus') {
- return e.status;
- } else if (e == 'SimulateInfiniteLoop') {
- Module['noExitRuntime'] = true;
- } else {
- throw e;
- }
- } finally {
- STACKTOP = initialStackTop;
- }
- return ret;
-}
-function run(args) {
- args = args || Module['arguments'];
- if (runDependencies > 0) {
- Module.printErr('run() called, but dependencies remain, so not running');
- return 0;
- }
- if (Module['preRun']) {
- if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
- var toRun = Module['preRun'];
- Module['preRun'] = [];
- for (var i = toRun.length-1; i >= 0; i--) {
- toRun[i]();
- }
- if (runDependencies > 0) {
- // a preRun added a dependency, run will be called later
- return 0;
- }
- }
- function doRun() {
- ensureInitRuntime();
- preMain();
- var ret = 0;
- calledRun = true;
- if (Module['_main'] && shouldRunNow) {
- ret = Module['callMain'](args);
- if (!Module['noExitRuntime']) {
- exitRuntime();
- }
- }
- if (Module['postRun']) {
- if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
- while (Module['postRun'].length > 0) {
- Module['postRun'].pop()();
- }
- }
- return ret;
- }
- if (Module['setStatus']) {
- Module['setStatus']('Running...');
- setTimeout(function() {
- setTimeout(function() {
- Module['setStatus']('');
- }, 1);
- if (!ABORT) doRun();
- }, 1);
- return 0;
- } else {
- return doRun();
- }
-}
-Module['run'] = Module.run = run;
-// {{PRE_RUN_ADDITIONS}}
-if (Module['preInit']) {
- if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
- while (Module['preInit'].length > 0) {
- Module['preInit'].pop()();
- }
-}
-// shouldRunNow refers to calling main(), not run().
-var shouldRunNow = false;
-if (Module['noInitialRun']) {
- shouldRunNow = false;
-}
-run();
-// {{POST_RUN_ADDITIONS}}
- // {{MODULE_ADDITIONS}}
- shouldRunNow = true;
- self['Runtime'] = Runtime;
- self['FS'] = FS;
-};
-gnuplot_create();
-// This is to avoid name mangling from closure compilers.
-self['FS'] = FS;
-self['FS']['root'] = FS.root;
-self['FS']['deleteFile'] = FS.deleteFile;
-self['FS']['findObject'] = FS.findObject;
-self['FS']['createDataFile'] = FS.createDataFile;
-self['FS']['getFileContents'] = function(name) {
- var file = FS.findObject(name);
- if (!file) return null;
- return file.contents;
-};
diff --git a/deps/v8/tools/profviz/profviz.css b/deps/v8/tools/profviz/profviz.css
deleted file mode 100644
index c583b8943c..0000000000
--- a/deps/v8/tools/profviz/profviz.css
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-Copyright 2013 the V8 project authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-body {
- background-color: #ddd;
-}
-
-#content {
- background-color: #fff;
- width: 1200px;
- margin-left: auto;
- margin-right: auto;
- padding: 25px;
-}
-
-textarea {
- width: 1200px;
- resize: none;
- font-family: monospace;
- font-size: 12px;
- color: #000;
- border: 1px dotted #aaa;
- padding: 10px;
- box-sizing: border-box;
-}
-
-textarea.log {
- background-color: #ffe;
-}
-
-.display {
- width: 1200px;
- height: 600px;
- background-color: #fff;
- display: block;
- box-sizing: border-box;
-}
-
-table {
- width: 1200px;
-}
-
-button {
- width: 100px;
- height: 20px;
- border: 1px solid #000;
- border-color: #aaa;
- font-family: Verdana;
- font-size: 12px;
- background-color: #ddd;
-}
-
-button:hover {
- background-color: #eee;
-}
-
-#file {
- width: 200px;
- height: 20px;
- border: none;
- font-family: Verdana;
- font-size: 12px;
-}
-
-input.range {
- width: 70px;
- height: 16px;
- text-align: right;
- padding-right: 5px;
- border: 0px;
- background-color: #eee;
- font-family: Verdana;
- font-size: 12px;
-}
-
-label {
- height: 20px;
- font-family: Verdana;
- font-size: 12px;
-}
-
-.tooltip {
- border-bottom: 1px dotted #000;
-}
-
-h1 {
- font-family: Verdana;
- font-size: 14px;
- font-weight: bold;
-}
-
-.text {
- font-family: Verdana;
- font-size: 12px;
-}
-
-.tt {
- font-family: monospace;
- font-size: 12px;
- color: #822;
-}
-
-a {
- font-family: Verdana;
- font-size: 12px;
- text-decoration: none;
- color: #282;
-}
-
-a.unroll {
- border-bottom: 1px dotted #000;
- color: #222;
-}
diff --git a/deps/v8/tools/profviz/profviz.html b/deps/v8/tools/profviz/profviz.html
deleted file mode 100644
index d7dd9cb950..0000000000
--- a/deps/v8/tools/profviz/profviz.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright 2013 the V8 project authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
-
-<html lang="en-us">
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>V8 profile log plotter</title>
- <link rel="stylesheet" type="text/css" href="profviz.css">
- <script src="profviz.js"></script>
-</head>
-
-<body onload="onload()">
- <div id="content">
-
- <img src="" id="plot" type="image/svg+xml" class="display"
- width="1200" height="600" class="float-right"/>
-
- <textarea id="prof" class="display" disabled=true></textarea>
- <br/>
-
- <table width="1200">
- <tr>
- <td width="330">
- <button id="start" onclick="start()">
- Start
- </button>
- <button id="reset" onclick="ui.reset(); worker.reset();">
- Reset
- </button>
- <button id="toggledisplay" onclick="ui.toggle();">
- Show profile
- </button>
- </td>
- <td width="220">
- <input type="file" id="file" onchange="ui.reset();"/>
- </td>
- <td width="300">
- <label title="You can manually choose the range
-to plot only part of the log file.">
- <span class="tooltip">Range</span>:
- </label>
- <input type="text" id="range_start" class="range"/>
- <label>to</label>
- <input type="text" id="range_end" class="range"/>
- </td>
- <td width="350">
- <label title="We model profiling overhead by accounting a constant
-execution delay to each log entry. Adjust to better suit
-your computer's performance.">
- <span class="tooltip">Delay per log entry</span>:
- </label>
- <input type="text" id="distortion" class="range" value="4500"/>
- <label>picoseconds</label>
- </td>
- </tr>
- </table>
-
- <br/>
- <textarea class="log" id="log" rows="8" disabled=true></textarea>
-
- <div class="text">
- <h1>
- <a href="javascript:ui.info('instructions');" class="unroll">
- Instructions
- </a>
- </h1>
- <div id="instructions">
- <ol>
- <li>
- Run V8 with
- <span class="tt">--prof --log-timer-events</span>,
- or alternatively,<br/>
- Chrome with
- <span class="tt">
- --no-sandbox --js-flags="--prof --log-timer-events"
- </span> to produce <span class="tt">v8.log</span>.
- </li>
- <li>
- Open
- <span class="tt">v8.log</span>
- on this page. Don't worry, it won't be uploaded anywhere.
- </li>
- <li>
- Click "Start" to start number crunching. This will take a while.
- </li>
- <li>
- Click "Show plot/profile" to switch between the statistical profile and
- the timeline plot.<br/>
- C++ items are missing in the statistical profile because symbol
- information is not available.<br>
- Consider using the
- <a href="https://code.google.com/p/v8/wiki/V8Profiler">
- command-line utility
- </a> instead.
- </li>
- </ol>
- If you expect multiple V8 instances to run concurrently, for example
- with several tabs in Chrome,<br/>
- add the V8 flag <span class="tt">--logfile=v8.%p.log</span>
- so that each instance writes to its own log file.
- </div>
- </div>
-
- <div class="text">
- <h1>
- <a href="javascript:ui.info('credits');" class="unroll">
- Credits
- </a>
- </h1>
- <div id="credits">
- <ul>
- <li>
- Christian Huettig for the
- <a href="http://gnuplot.respawned.com/">Javascript port</a>
- of Gnuplot 4.6.3.
- </li>
- <li>
- The
- <a href="https://github.com/kripken/emscripten">Emscripten compiler</a>
- that made the port possible.
- </li>
- <li>
- The <a href="http://www.gnuplot.info/">Gnuplot project</a>.
- </li>
- <li>
- The <a href="https://developers.google.com/v8/">V8 project</a>.
- </li>
- </ul>
- </div>
- </div>
-
-</div>
-</body>
-</html>
diff --git a/deps/v8/tools/profviz/profviz.js b/deps/v8/tools/profviz/profviz.js
deleted file mode 100644
index a7593a6f65..0000000000
--- a/deps/v8/tools/profviz/profviz.js
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-var worker_scripts = [
- "../csvparser.js",
- "../splaytree.js",
- "../codemap.js",
- "../consarray.js",
- "../profile.js",
- "../profile_view.js",
- "../logreader.js",
- "../arguments.js",
- "../tickprocessor.js",
- "composer.js",
- "gnuplot-4.6.3-emscripten.js"
-];
-
-
-function plotWorker() {
- var worker = null;
-
- function initialize() {
- ui.freeze();
- worker = new Worker("worker.js");
- running = false;
-
- worker.postMessage({ "call" : "load scripts",
- "args" : worker_scripts });
-
- worker.addEventListener("message", function(event) {
- var call = delegateList[event.data["call"]];
- call(event.data["args"]);
- });
- }
-
- function scriptLoaded() {
- ui.thaw();
- }
-
- // Public methods.
- this.run = function(filename,
- resx, resy,
- distortion,
- range_start, range_end) {
- var args = {
- 'file' : filename,
- 'resx' : resx,
- 'resy' : resy,
- 'distortion' : distortion,
- 'range_start' : range_start,
- 'range_end' : range_end
- }
- worker.postMessage({ 'call' : 'run', 'args' : args });
- }
-
- this.reset = function() {
- if (worker) worker.terminate();
- initialize();
- }
-
- var delegateList = {
- "log" : log,
- "error" : logError,
- "displayplot" : displayplot,
- "displayprof" : displayprof,
- "range" : setRange,
- "script" : scriptLoaded,
- "reset" : this.reset
- }
-}
-
-
-function UIWrapper() {
- var input_elements = ["range_start",
- "range_end",
- "distortion",
- "start",
- "file"];
-
- var other_elements = ["log",
- "plot",
- "prof",
- "instructions",
- "credits",
- "toggledisplay"];
-
- for (var i in input_elements) {
- var id = input_elements[i];
- this[id] = document.getElementById(id);
- }
-
- for (var i in other_elements) {
- var id = other_elements[i];
- this[id] = document.getElementById(id);
- }
-
- this.freeze = function() {
- this.plot.style.webkitFilter = "grayscale(1)";
- this.prof.style.color = "#bbb";
- for (var i in input_elements) {
- this[input_elements[i]].disabled = true;
- }
- }
-
- this.thaw = function() {
- this.plot.style.webkitFilter = "";
- this.prof.style.color = "#000";
- for (var i in input_elements) {
- this[input_elements[i]].disabled = false;
- }
- }
-
- this.reset = function() {
- this.thaw();
- this.log.value = "";
- this.range_start.value = "automatic";
- this.range_end.value = "automatic";
- this.toggle("plot");
- this.plot.src = "";
- this.prof.value = "";
- }
-
- this.toggle = function(mode) {
- if (mode) this.toggledisplay.next_mode = mode;
- if (this.toggledisplay.next_mode == "plot") {
- this.toggledisplay.next_mode = "prof";
- this.plot.style.display = "block";
- this.prof.style.display = "none";
- this.toggledisplay.innerHTML = "Show profile";
- } else {
- this.toggledisplay.next_mode = "plot";
- this.plot.style.display = "none";
- this.prof.style.display = "block";
- this.toggledisplay.innerHTML = "Show plot";
- }
- }
-
- this.info = function(field) {
- var down_arrow = "\u25bc";
- var right_arrow = "\u25b6";
- if (field && this[field].style.display != "none") field = null; // Toggle.
- this.credits.style.display = "none";
- this.instructions.style.display = "none";
- if (!field) return;
- this[field].style.display = "block";
- }
-}
-
-
-function log(text) {
- ui.log.value += text;
- ui.log.scrollTop = ui.log.scrollHeight;
-}
-
-
-function logError(text) {
- if (ui.log.value.length > 0 &&
- ui.log.value[ui.log.value.length-1] != "\n") {
- ui.log.value += "\n";
- }
- ui.log.value += "ERROR: " + text + "\n";
- ui.log.scrollTop = ui.log.scrollHeight;
- error_logged = true;
-}
-
-
-function displayplot(args) {
- if (error_logged) {
- log("Plot failed.\n\n");
- } else {
- log("Displaying plot. Total time: " +
- (Date.now() - timer) / 1000 + "ms.\n\n");
- var blob = new Blob([new Uint8Array(args.contents).buffer],
- { "type" : "image\/svg+xml" });
- window.URL = window.URL || window.webkitURL;
- ui.plot.src = window.URL.createObjectURL(blob);
- }
-
- ui.thaw();
- ui.toggle("plot");
-}
-
-
-function displayprof(args) {
- if (error_logged) return;
- ui.prof.value = args;
- this.prof.style.color = "";
- ui.toggle("prof");
-}
-
-
-function start(event) {
- error_logged = false;
- ui.freeze();
-
- try {
- var file = getSelectedFile();
- var distortion = getDistortion();
- var range = getRange();
- } catch (e) {
- logError(e.message);
- display();
- return;
- }
-
- timer = Date.now();
- worker.run(file, kResX, kResY, distortion, range[0], range[1]);
-}
-
-
-function getSelectedFile() {
- var file = ui.file.files[0];
- if (!file) throw Error("No valid file selected.");
- return file;
-}
-
-
-function getDistortion() {
- var input_distortion =
- parseInt(ui.distortion.value, 10);
- if (isNaN(input_distortion)) {
- input_distortion = ui.distortion.value = 4500;
- }
- return input_distortion / 1000000;
-}
-
-
-function getRange() {
- var input_start =
- parseInt(ui.range_start.value, 10);
- if (isNaN(input_start)) input_start = undefined;
- var input_end =
- parseInt(ui.range_end.value, 10);
- if (isNaN(input_end)) input_end = undefined;
- return [input_start, input_end];
-}
-
-
-function setRange(args) {
- ui.range_start.value = args.start.toFixed(1);
- ui.range_end.value = args.end.toFixed(1);
-}
-
-
-function onload() {
- kResX = 1200;
- kResY = 600;
- error_logged = false;
- ui = new UIWrapper();
- ui.reset();
- ui.info(null);
- worker = new plotWorker();
- worker.reset();
-}
-
-
-var kResX;
-var kResY;
-var error_logged;
-var ui;
-var worker;
-var timer;
diff --git a/deps/v8/tools/profviz/stdio.js b/deps/v8/tools/profviz/stdio.js
deleted file mode 100644
index 8ba12e3ce7..0000000000
--- a/deps/v8/tools/profviz/stdio.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-var processor = new ArgumentsProcessor(arguments);
-var distortion_per_entry = 0;
-var range_start_override = undefined;
-var range_end_override = undefined;
-
-if (!processor.parse()) processor.printUsageAndExit();
-var result = processor.result();
-var distortion = parseInt(result.distortion);
-if (isNaN(distortion)) processor.printUsageAndExit();
-// Convert picoseconds to milliseconds.
-distortion_per_entry = distortion / 1000000;
-var rangelimits = result.range.split(",");
-var range_start = parseInt(rangelimits[0]);
-var range_end = parseInt(rangelimits[1]);
-if (!isNaN(range_start)) range_start_override = range_start;
-if (!isNaN(range_end)) range_end_override = range_end;
-
-var kResX = 1600;
-var kResY = 600;
-function log_error(text) {
- print(text);
- quit(1);
-}
-var psc = new PlotScriptComposer(kResX, kResY, log_error);
-psc.collectData(readline, distortion_per_entry);
-psc.findPlotRange(range_start_override, range_end_override);
-print("set terminal pngcairo size " + kResX + "," + kResY +
- " enhanced font 'Helvetica,10'");
-psc.assembleOutput(print);
diff --git a/deps/v8/tools/profviz/worker.js b/deps/v8/tools/profviz/worker.js
deleted file mode 100644
index 95ed40b89b..0000000000
--- a/deps/v8/tools/profviz/worker.js
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-var delegateList = {
- "load scripts" : load_scripts,
- "run" : run,
-}
-
-self.addEventListener("message", function(event) {
- var call = delegateList[event.data["call"]];
- var result = call(event.data["args"]);
-}, false);
-
-
-function log(text) {
- self.postMessage({ "call" : "log", "args" : text });
-}
-
-
-function displayplot(content) {
- self.postMessage({ "call" : "displayplot", "args" : content});
-}
-
-
-function displayprof(content) {
- self.postMessage({ "call" : "displayprof", "args" : content});
-}
-
-
-function setRange(start, end) {
- self.postMessage({ "call" : "range",
- "args" : { "start" : start, "end" : end } });
-}
-
-
-function time(name, fun) {
- log(name + "...");
- var start = Date.now();
- fun();
- log(" took " + (Date.now() - start) / 1000 + "s.\n");
-}
-
-
-function load_scripts(scripts) {
- time("Loading scripts",
- function() { for (var i in scripts) importScripts(scripts[i]); });
- self.postMessage({ "call" : "script" });
-}
-
-
-function log_error(text) {
- self.postMessage({"call": "error", "args": text});
- self.postMessage({"call": "reset"});
-}
-
-
-function run(args) {
- var file = args["file"];
- var resx = args["resx"];
- var resy = args["resy"];
- var distortion = args["distortion"];
- var range_start_override = args["range_start"];
- var range_end_override = args["range_end"];
-
- var reader = new FileReaderSync();
- var content_lines;
-
- time("Reading log file (" + (file.size / 1024).toFixed(1) + " kB)",
- function() {
- var content = reader.readAsText(file);
- content_lines = content.split("\n");
- });
-
- time("Producing statistical profile",
- function() {
- var profile = "";
- print = function(text) { profile += text + "\n"; };
- // Dummy entries provider, as we cannot call nm.
- var entriesProvider = new UnixCppEntriesProvider("", "", "");
- var targetRootFS = "";
- var separateIc = false;
- var callGraphSize = 5;
- var ignoreUnknown = true;
- var stateFilter = null;
- var range = range_start_override + "," + range_end_override;
-
- var tickProcessor = new TickProcessor(entriesProvider,
- separateIc,
- callGraphSize,
- ignoreUnknown,
- stateFilter,
- distortion,
- range);
- for (var i = 0; i < content_lines.length; i++) {
- tickProcessor.processLogLine(content_lines[i]);
- }
- tickProcessor.printStatistics();
- displayprof(profile);
- });
-
- var input_file_name = "input_temp";
- var output_file_name = "output.svg";
-
- var psc = new PlotScriptComposer(resx, resy, log_error);
- var objects = 0;
-
- time("Collecting events (" + content_lines.length + " entries)",
- function() {
- var line_cursor = 0;
- var input = function() { return content_lines[line_cursor++]; };
- psc.collectData(input, distortion);
- psc.findPlotRange(range_start_override,
- range_end_override,
- setRange);
- });
-
- time("Assembling plot script",
- function() {
- var plot_script = "";
- var output = function(text) { plot_script += text + "\n"; };
- output("set terminal svg size " + resx + "," + resy +
- " enhanced font \"Helvetica,10\"");
- output("set output \""+ output_file_name + "\"");
- objects = psc.assembleOutput(output);
- if (FS.findObject(input_file_name)) {
- FS.deleteFile(input_file_name);
- }
- var arrc = Module["intArrayFromString"](plot_script, true);
- FS.createDataFile("/", input_file_name, arrc);
- });
-
- time("Running gnuplot (" + objects + " objects)",
- function() { Module.run([input_file_name]); });
-
- displayplot(FS.findObject(output_file_name));
-}
-
-
-var Module = {
- "noInitialRun": true,
- print: function(text) {
- self.postMessage({"call": "error", "args": text});
- },
- printErr: function(text) {
- self.postMessage({"call": "error", "args": text});
- },
-};
diff --git a/deps/v8/tools/sourcemap.mjs b/deps/v8/tools/sourcemap.mjs
new file mode 100644
index 0000000000..77af4133cf
--- /dev/null
+++ b/deps/v8/tools/sourcemap.mjs
@@ -0,0 +1,382 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This is a copy from blink dev tools, see:
+// http://src.chromium.org/viewvc/blink/trunk/Source/devtools/front_end/SourceMap.js
+// revision: 153407
+
+// Added to make the file work without dev tools
+export const WebInspector = {};
+WebInspector.ParsedURL = {};
+WebInspector.ParsedURL.completeURL = function(){};
+// start of original file content
+
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Implements Source Map V3 model. See http://code.google.com/p/closure-compiler/wiki/SourceMaps
+ * for format description.
+ * @constructor
+ * @param {string} sourceMappingURL
+ * @param {SourceMapV3} payload
+ */
+WebInspector.SourceMap = function(sourceMappingURL, payload)
+{
+ if (!WebInspector.SourceMap.prototype._base64Map) {
+ const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ WebInspector.SourceMap.prototype._base64Map = {};
+ for (var i = 0; i < base64Digits.length; ++i)
+ WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)] = i;
+ }
+
+ this._sourceMappingURL = sourceMappingURL;
+ this._reverseMappingsBySourceURL = {};
+ this._mappings = [];
+ this._sources = {};
+ this._sourceContentByURL = {};
+ this._parseMappingPayload(payload);
+}
+
+/**
+ * @param {string} sourceMapURL
+ * @param {string} compiledURL
+ * @param {function(WebInspector.SourceMap)} callback
+ */
+WebInspector.SourceMap.load = function(sourceMapURL, compiledURL, callback)
+{
+ NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id, sourceMapURL, undefined, contentLoaded.bind(this));
+
+ /**
+ * @param {?Protocol.Error} error
+ * @param {number} statusCode
+ * @param {NetworkAgent.Headers} headers
+ * @param {string} content
+ */
+ function contentLoaded(error, statusCode, headers, content)
+ {
+ if (error || !content || statusCode >= 400) {
+ console.error("Could not load content for " + sourceMapURL + " : " + (error || ("HTTP status code: " + statusCode)));
+ callback(null);
+ return;
+ }
+
+ if (content.slice(0, 3) === ")]}")
+ content = content.substring(content.indexOf('\n'));
+ try {
+ var payload = /** @type {SourceMapV3} */ (JSON.parse(content));
+ var baseURL = sourceMapURL.startsWith("data:") ? compiledURL : sourceMapURL;
+ callback(new WebInspector.SourceMap(baseURL, payload));
+ } catch(e) {
+ console.error(e.message);
+ callback(null);
+ }
+ }
+}
+
+WebInspector.SourceMap.prototype = {
+ /**
+ * @return {Array.<string>}
+ */
+ sources: function()
+ {
+ return Object.keys(this._sources);
+ },
+
+ /**
+ * @param {string} sourceURL
+ * @return {string|undefined}
+ */
+ sourceContent: function(sourceURL)
+ {
+ return this._sourceContentByURL[sourceURL];
+ },
+
+ /**
+ * @param {string} sourceURL
+ * @param {WebInspector.ResourceType} contentType
+ * @return {WebInspector.ContentProvider}
+ */
+ sourceContentProvider: function(sourceURL, contentType)
+ {
+ var lastIndexOfDot = sourceURL.lastIndexOf(".");
+ var extension = lastIndexOfDot !== -1 ? sourceURL.substr(lastIndexOfDot + 1) : "";
+ var mimeType = WebInspector.ResourceType.mimeTypesForExtensions[extension.toLowerCase()];
+ var sourceContent = this.sourceContent(sourceURL);
+ if (sourceContent)
+ return new WebInspector.StaticContentProvider(contentType, sourceContent, mimeType);
+ return new WebInspector.CompilerSourceMappingContentProvider(sourceURL, contentType, mimeType);
+ },
+
+ /**
+ * @param {SourceMapV3} mappingPayload
+ */
+ _parseMappingPayload: function(mappingPayload)
+ {
+ if (mappingPayload.sections)
+ this._parseSections(mappingPayload.sections);
+ else
+ this._parseMap(mappingPayload, 0, 0);
+ },
+
+ /**
+ * @param {Array.<SourceMapV3.Section>} sections
+ */
+ _parseSections: function(sections)
+ {
+ for (var i = 0; i < sections.length; ++i) {
+ var section = sections[i];
+ this._parseMap(section.map, section.offset.line, section.offset.column);
+ }
+ },
+
+ /**
+ * @param {number} lineNumber in compiled resource
+ * @param {number} columnNumber in compiled resource
+ * @return {?Array}
+ */
+ findEntry: function(lineNumber, columnNumber)
+ {
+ var first = 0;
+ var count = this._mappings.length;
+ while (count > 1) {
+ var step = count >> 1;
+ var middle = first + step;
+ var mapping = this._mappings[middle];
+ if (lineNumber < mapping[0] || (lineNumber === mapping[0] && columnNumber < mapping[1]))
+ count = step;
+ else {
+ first = middle;
+ count -= step;
+ }
+ }
+ var entry = this._mappings[first];
+ if (!first && entry && (lineNumber < entry[0] || (lineNumber === entry[0] && columnNumber < entry[1])))
+ return null;
+ return entry;
+ },
+
+ /**
+ * @param {string} sourceURL of the originating resource
+ * @param {number} lineNumber in the originating resource
+ * @return {Array}
+ */
+ findEntryReversed: function(sourceURL, lineNumber)
+ {
+ var mappings = this._reverseMappingsBySourceURL[sourceURL];
+ for ( ; lineNumber < mappings.length; ++lineNumber) {
+ var mapping = mappings[lineNumber];
+ if (mapping)
+ return mapping;
+ }
+ return this._mappings[0];
+ },
+
+ /**
+ * @override
+ */
+ _parseMap: function(map, lineNumber, columnNumber)
+ {
+ var sourceIndex = 0;
+ var sourceLineNumber = 0;
+ var sourceColumnNumber = 0;
+ var nameIndex = 0;
+
+ var sources = [];
+ var originalToCanonicalURLMap = {};
+ for (var i = 0; i < map.sources.length; ++i) {
+ var originalSourceURL = map.sources[i];
+ var sourceRoot = map.sourceRoot || "";
+ if (sourceRoot && !sourceRoot.endsWith("/"))
+ sourceRoot += "/";
+ var href = sourceRoot + originalSourceURL;
+ var url = WebInspector.ParsedURL.completeURL(this._sourceMappingURL, href) || href;
+ originalToCanonicalURLMap[originalSourceURL] = url;
+ sources.push(url);
+ this._sources[url] = true;
+
+ if (map.sourcesContent && map.sourcesContent[i])
+ this._sourceContentByURL[url] = map.sourcesContent[i];
+ }
+
+ var stringCharIterator = new WebInspector.SourceMap.StringCharIterator(map.mappings);
+ var sourceURL = sources[sourceIndex];
+
+ while (true) {
+ if (stringCharIterator.peek() === ",")
+ stringCharIterator.next();
+ else {
+ while (stringCharIterator.peek() === ";") {
+ lineNumber += 1;
+ columnNumber = 0;
+ stringCharIterator.next();
+ }
+ if (!stringCharIterator.hasNext())
+ break;
+ }
+
+ columnNumber += this._decodeVLQ(stringCharIterator);
+ if (this._isSeparator(stringCharIterator.peek())) {
+ this._mappings.push([lineNumber, columnNumber]);
+ continue;
+ }
+
+ var sourceIndexDelta = this._decodeVLQ(stringCharIterator);
+ if (sourceIndexDelta) {
+ sourceIndex += sourceIndexDelta;
+ sourceURL = sources[sourceIndex];
+ }
+ sourceLineNumber += this._decodeVLQ(stringCharIterator);
+ sourceColumnNumber += this._decodeVLQ(stringCharIterator);
+ if (!this._isSeparator(stringCharIterator.peek()))
+ nameIndex += this._decodeVLQ(stringCharIterator);
+
+ this._mappings.push([lineNumber, columnNumber, sourceURL, sourceLineNumber, sourceColumnNumber]);
+ }
+
+ for (var i = 0; i < this._mappings.length; ++i) {
+ var mapping = this._mappings[i];
+ var url = mapping[2];
+ if (!url)
+ continue;
+ if (!this._reverseMappingsBySourceURL[url])
+ this._reverseMappingsBySourceURL[url] = [];
+ var reverseMappings = this._reverseMappingsBySourceURL[url];
+ var sourceLine = mapping[3];
+ if (!reverseMappings[sourceLine])
+ reverseMappings[sourceLine] = [mapping[0], mapping[1]];
+ }
+ },
+
+ /**
+ * @param {string} char
+ * @return {boolean}
+ */
+ _isSeparator: function(char)
+ {
+ return char === "," || char === ";";
+ },
+
+ /**
+ * @param {WebInspector.SourceMap.StringCharIterator} stringCharIterator
+ * @return {number}
+ */
+ _decodeVLQ: function(stringCharIterator)
+ {
+ // Read unsigned value.
+ var result = 0;
+ var shift = 0;
+ do {
+ var digit = this._base64Map[stringCharIterator.next()];
+ result += (digit & this._VLQ_BASE_MASK) << shift;
+ shift += this._VLQ_BASE_SHIFT;
+ } while (digit & this._VLQ_CONTINUATION_MASK);
+
+ // Fix the sign.
+ var negative = result & 1;
+ // Use unsigned right shift, so that the 32nd bit is properly shifted
+ // to the 31st, and the 32nd becomes unset.
+ result >>>= 1;
+ if (negate) {
+ // We need to OR 0x80000000 here to ensure the 32nd bit (the sign bit
+ // in a 32bit int) is always set for negative numbers. If `result`
+ // were 1, (meaning `negate` is true and all other bits were zeros),
+ // `result` would now be 0. But -0 doesn't flip the 32nd bit as
+ // intended. All other numbers will successfully set the 32nd bit
+ // without issue, so doing this is a noop for them.
+ return -result | 0x80000000;
+ }
+ return result;
+ },
+
+ _VLQ_BASE_SHIFT: 5,
+ _VLQ_BASE_MASK: (1 << 5) - 1,
+ _VLQ_CONTINUATION_MASK: 1 << 5
+}
+
+/**
+ * @constructor
+ * @param {string} string
+ */
+WebInspector.SourceMap.StringCharIterator = function(string)
+{
+ this._string = string;
+ this._position = 0;
+}
+
+WebInspector.SourceMap.StringCharIterator.prototype = {
+ /**
+ * @return {string}
+ */
+ next: function()
+ {
+ return this._string.charAt(this._position++);
+ },
+
+ /**
+ * @return {string}
+ */
+ peek: function()
+ {
+ return this._string.charAt(this._position);
+ },
+
+ /**
+ * @return {boolean}
+ */
+ hasNext: function()
+ {
+ return this._position < this._string.length;
+ }
+}
diff --git a/deps/v8/tools/splaytree.mjs b/deps/v8/tools/splaytree.mjs
new file mode 100644
index 0000000000..867274a787
--- /dev/null
+++ b/deps/v8/tools/splaytree.mjs
@@ -0,0 +1,327 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/**
+ * Constructs a Splay tree. A splay tree is a self-balancing binary
+ * search tree with the additional property that recently accessed
+ * elements are quick to access again. It performs basic operations
+ * such as insertion, look-up and removal in O(log(n)) amortized time.
+ *
+ * @constructor
+ */
+export function SplayTree() {
+};
+
+
+/**
+ * Pointer to the root node of the tree.
+ *
+ * @type {SplayTree.Node}
+ * @private
+ */
+SplayTree.prototype.root_ = null;
+
+
+/**
+ * @return {boolean} Whether the tree is empty.
+ */
+SplayTree.prototype.isEmpty = function() {
+ return !this.root_;
+};
+
+
+
+/**
+ * Inserts a node into the tree with the specified key and value if
+ * the tree does not already contain a node with the specified key. If
+ * the value is inserted, it becomes the root of the tree.
+ *
+ * @param {number} key Key to insert into the tree.
+ * @param {*} value Value to insert into the tree.
+ */
+SplayTree.prototype.insert = function(key, value) {
+ if (this.isEmpty()) {
+ this.root_ = new SplayTree.Node(key, value);
+ return;
+ }
+ // Splay on the key to move the last node on the search path for
+ // the key to the root of the tree.
+ this.splay_(key);
+ if (this.root_.key == key) {
+ return;
+ }
+ var node = new SplayTree.Node(key, value);
+ if (key > this.root_.key) {
+ node.left = this.root_;
+ node.right = this.root_.right;
+ this.root_.right = null;
+ } else {
+ node.right = this.root_;
+ node.left = this.root_.left;
+ this.root_.left = null;
+ }
+ this.root_ = node;
+};
+
+
+/**
+ * Removes a node with the specified key from the tree if the tree
+ * contains a node with this key. The removed node is returned. If the
+ * key is not found, an exception is thrown.
+ *
+ * @param {number} key Key to find and remove from the tree.
+ * @return {SplayTree.Node} The removed node.
+ */
+SplayTree.prototype.remove = function(key) {
+ if (this.isEmpty()) {
+ throw Error('Key not found: ' + key);
+ }
+ this.splay_(key);
+ if (this.root_.key != key) {
+ throw Error('Key not found: ' + key);
+ }
+ var removed = this.root_;
+ if (!this.root_.left) {
+ this.root_ = this.root_.right;
+ } else {
+ var right = this.root_.right;
+ this.root_ = this.root_.left;
+ // Splay to make sure that the new root has an empty right child.
+ this.splay_(key);
+ // Insert the original right child as the right child of the new
+ // root.
+ this.root_.right = right;
+ }
+ return removed;
+};
+
+
+/**
+ * Returns the node having the specified key or null if the tree doesn't contain
+ * a node with the specified key.
+ *
+ * @param {number} key Key to find in the tree.
+ * @return {SplayTree.Node} Node having the specified key.
+ */
+SplayTree.prototype.find = function(key) {
+ if (this.isEmpty()) {
+ return null;
+ }
+ this.splay_(key);
+ return this.root_.key == key ? this.root_ : null;
+};
+
+
+/**
+ * @return {SplayTree.Node} Node having the minimum key value.
+ */
+SplayTree.prototype.findMin = function() {
+ if (this.isEmpty()) {
+ return null;
+ }
+ var current = this.root_;
+ while (current.left) {
+ current = current.left;
+ }
+ return current;
+};
+
+
+/**
+ * @return {SplayTree.Node} Node having the maximum key value.
+ */
+SplayTree.prototype.findMax = function(opt_startNode) {
+ if (this.isEmpty()) {
+ return null;
+ }
+ var current = opt_startNode || this.root_;
+ while (current.right) {
+ current = current.right;
+ }
+ return current;
+};
+
+
+/**
+ * @return {SplayTree.Node} Node having the maximum key value that
+ * is less or equal to the specified key value.
+ */
+SplayTree.prototype.findGreatestLessThan = function(key) {
+ if (this.isEmpty()) {
+ return null;
+ }
+ // Splay on the key to move the node with the given key or the last
+ // node on the search path to the top of the tree.
+ this.splay_(key);
+ // Now the result is either the root node or the greatest node in
+ // the left subtree.
+ if (this.root_.key <= key) {
+ return this.root_;
+ } else if (this.root_.left) {
+ return this.findMax(this.root_.left);
+ } else {
+ return null;
+ }
+};
+
+
+/**
+ * @return {Array<*>} An array containing all the values of tree's nodes paired
+ * with keys.
+ */
+SplayTree.prototype.exportKeysAndValues = function() {
+ var result = [];
+ this.traverse_(function(node) { result.push([node.key, node.value]); });
+ return result;
+};
+
+
+/**
+ * @return {Array<*>} An array containing all the values of tree's nodes.
+ */
+SplayTree.prototype.exportValues = function() {
+ var result = [];
+ this.traverse_(function(node) { result.push(node.value); });
+ return result;
+};
+
+
+/**
+ * Perform the splay operation for the given key. Moves the node with
+ * the given key to the top of the tree. If no node has the given
+ * key, the last node on the search path is moved to the top of the
+ * tree. This is the simplified top-down splaying algorithm from:
+ * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
+ *
+ * @param {number} key Key to splay the tree on.
+ * @private
+ */
+SplayTree.prototype.splay_ = function(key) {
+ if (this.isEmpty()) {
+ return;
+ }
+ // Create a dummy node. The use of the dummy node is a bit
+ // counter-intuitive: The right child of the dummy node will hold
+ // the L tree of the algorithm. The left child of the dummy node
+ // will hold the R tree of the algorithm. Using a dummy node, left
+ // and right will always be nodes and we avoid special cases.
+ var dummy, left, right;
+ dummy = left = right = new SplayTree.Node(null, null);
+ var current = this.root_;
+ while (true) {
+ if (key < current.key) {
+ if (!current.left) {
+ break;
+ }
+ if (key < current.left.key) {
+ // Rotate right.
+ var tmp = current.left;
+ current.left = tmp.right;
+ tmp.right = current;
+ current = tmp;
+ if (!current.left) {
+ break;
+ }
+ }
+ // Link right.
+ right.left = current;
+ right = current;
+ current = current.left;
+ } else if (key > current.key) {
+ if (!current.right) {
+ break;
+ }
+ if (key > current.right.key) {
+ // Rotate left.
+ var tmp = current.right;
+ current.right = tmp.left;
+ tmp.left = current;
+ current = tmp;
+ if (!current.right) {
+ break;
+ }
+ }
+ // Link left.
+ left.right = current;
+ left = current;
+ current = current.right;
+ } else {
+ break;
+ }
+ }
+ // Assemble.
+ left.right = current.left;
+ right.left = current.right;
+ current.left = dummy.right;
+ current.right = dummy.left;
+ this.root_ = current;
+};
+
+
+/**
+ * Performs a preorder traversal of the tree.
+ *
+ * @param {function(SplayTree.Node)} f Visitor function.
+ * @private
+ */
+SplayTree.prototype.traverse_ = function(f) {
+ var nodesToVisit = [this.root_];
+ while (nodesToVisit.length > 0) {
+ var node = nodesToVisit.shift();
+ if (node == null) {
+ continue;
+ }
+ f(node);
+ nodesToVisit.push(node.left);
+ nodesToVisit.push(node.right);
+ }
+};
+
+
+/**
+ * Constructs a Splay tree node.
+ *
+ * @param {number} key Key.
+ * @param {*} value Value.
+ */
+SplayTree.Node = function(key, value) {
+ this.key = key;
+ this.value = value;
+};
+
+
+/**
+ * @type {SplayTree.Node}
+ */
+SplayTree.Node.prototype.left = null;
+
+
+/**
+ * @type {SplayTree.Node}
+ */
+SplayTree.Node.prototype.right = null;
diff --git a/deps/v8/tools/system-analyzer/app-model.mjs b/deps/v8/tools/system-analyzer/app-model.mjs
index 821d3a2c17..37fa5ae2f3 100644
--- a/deps/v8/tools/system-analyzer/app-model.mjs
+++ b/deps/v8/tools/system-analyzer/app-model.mjs
@@ -8,6 +8,7 @@ class State {
#ic;
#selectedMapLogEvents;
#selectedIcLogEvents;
+ #selectedSourcePositionLogEvents;
#nofChunks;
#chunks;
#icTimeline;
@@ -81,6 +82,12 @@ class State {
if (!value) return;
this.#selectedMapLogEvents = value;
}
+ get selectedSourcePositionLogEvents() {
+ return this.#selectedSourcePositionLogEvents;
+ }
+ set selectedSourcePositionLogEvents(value) {
+ this.#selectedSourcePositionLogEvents = value;
+ }
get selectedIcLogEvents() {
return this.#selectedIcLogEvents;
}
diff --git a/deps/v8/tools/system-analyzer/events.mjs b/deps/v8/tools/system-analyzer/events.mjs
index d868b57a84..8e9a5a0b44 100644
--- a/deps/v8/tools/system-analyzer/events.mjs
+++ b/deps/v8/tools/system-analyzer/events.mjs
@@ -30,4 +30,17 @@ class SelectTimeEvent extends CustomEvent {
}
}
-export { SelectionEvent, FocusEvent, SelectTimeEvent };
+class SynchronizeSelectionEvent extends CustomEvent {
+ static name = 'syncselection';
+ constructor(start, end) {
+ super(SynchronizeSelectionEvent.name, { bubbles: true, composed: true });
+ this.start = start;
+ this.end = end;
+ }
+}
+
+
+export {
+ SelectionEvent, FocusEvent, SelectTimeEvent,
+ SynchronizeSelectionEvent
+};
diff --git a/deps/v8/tools/system-analyzer/helper.mjs b/deps/v8/tools/system-analyzer/helper.mjs
index 4570074c6d..782b3f3456 100644
--- a/deps/v8/tools/system-analyzer/helper.mjs
+++ b/deps/v8/tools/system-analyzer/helper.mjs
@@ -26,9 +26,9 @@ function defineCustomElement(path, generator) {
let name = path.substring(path.lastIndexOf("/") + 1, path.length);
path = path + '-template.html';
fetch(path)
- .then(stream => stream.text())
- .then(
- templateText => customElements.define(name, generator(templateText)));
+ .then(stream => stream.text())
+ .then(
+ templateText => customElements.define(name, generator(templateText)));
}
// DOM Helpers
@@ -104,7 +104,7 @@ class CSSColor {
}
-function transitionTypeToColor(type) {
+function typeToColor(type) {
switch (type) {
case 'new':
return CSSColor.green;
@@ -120,16 +120,20 @@ function transitionTypeToColor(type) {
return CSSColor.red;
case 'LoadGlobalIC':
return CSSColor.green;
+ case 'LoadIC':
+ return CSSColor.primaryColor;
case 'StoreInArrayLiteralIC':
return CSSColor.violet;
+ case 'StoreGlobalIC':
+ return CSSColor.blue;
case 'StoreIC':
return CSSColor.orange;
case 'KeyedLoadIC':
return CSSColor.red;
case 'KeyedStoreIC':
- return CSSColor.primaryColor;
+ return CSSColor.yellow;
}
- return CSSColor.primaryColor;
+ return CSSColor.secondaryColor;
}
@@ -149,7 +153,7 @@ function div(classes) {
class V8CustomElement extends HTMLElement {
constructor(templateText) {
super();
- const shadowRoot = this.attachShadow({mode: 'open'});
+ const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = templateText;
}
$(id) {
@@ -160,7 +164,7 @@ class V8CustomElement extends HTMLElement {
return this.shadowRoot.querySelectorAll(query);
}
- div(classes) {return div(classes)}
+ div(classes) { return div(classes) }
table(className) {
let node = document.createElement('table')
@@ -178,12 +182,14 @@ class V8CustomElement extends HTMLElement {
return node;
}
- tr(){
+ tr() {
return document.createElement('tr');
}
removeAllChildren(node) { return removeAllChildren(node); }
}
-export {defineCustomElement, V8CustomElement, removeAllChildren,
- $, div, transitionTypeToColor, CSSColor};
+export {
+ defineCustomElement, V8CustomElement, removeAllChildren,
+ $, div, typeToColor, CSSColor
+};
diff --git a/deps/v8/tools/system-analyzer/ic-model.mjs b/deps/v8/tools/system-analyzer/ic-model.mjs
index 93a3d61262..8340e9b756 100644
--- a/deps/v8/tools/system-analyzer/ic-model.mjs
+++ b/deps/v8/tools/system-analyzer/ic-model.mjs
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import CustomIcProcessor from "./ic-processor.mjs";
+import Processor from "./processor.mjs";
// For compatibility with console scripts:
print = console.log;
@@ -24,8 +24,8 @@ export class Group {
createSubGroups() {
this.groups = {};
- for (let i = 0; i < CustomIcProcessor.kProperties.length; i++) {
- let subProperty = CustomIcProcessor.kProperties[i];
+ for (let i = 0; i < Processor.kProperties.length; i++) {
+ let subProperty = Processor.kProperties[i];
if (this.property == subProperty) continue;
this.groups[subProperty] = Group.groupBy(this.entries, subProperty);
}
@@ -51,7 +51,7 @@ export class Group {
group.percentage = Math.round(group.count / length * 100 * 100) / 100;
result.push(group);
}
- result.sort((a, b) => {return b.count - a.count});
+ result.sort((a, b) => { return b.count - a.count });
return result;
}
diff --git a/deps/v8/tools/system-analyzer/ic-panel-template.html b/deps/v8/tools/system-analyzer/ic-panel-template.html
index 187e588090..53c5eb77fc 100644
--- a/deps/v8/tools/system-analyzer/ic-panel-template.html
+++ b/deps/v8/tools/system-analyzer/ic-panel-template.html
@@ -1,61 +1,60 @@
<!-- Copyright 2020 the V8 project authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
-<style>
-@import "./index.css";
-.count {
- text-align: right;
- width: 5em;
-}
+<head>
+ <link href="./index.css" rel="stylesheet">
+</head>
+<style>
+ .count {
+ text-align: right;
+ width: 5em;
+ }
-.percentage {
- text-align: right;
- width: 5em;
-}
+ .percentage {
+ text-align: right;
+ width: 5em;
+ }
-.key {
- padding-left: 1em;
-}
+ .key {
+ padding-left: 1em;
+ }
-.drilldown-group-title {
- font-weight: bold;
- padding: 0.5em 0 0.2em 0;
-}
-.entry-details {
-}
+ .drilldown-group-title {
+ font-weight: bold;
+ padding: 0.5em 0 0.2em 0;
+ }
-.entry-details TD {
-}
+ .entry-details {}
-.details {
- width: 0.1em;
-}
+ .entry-details TD {}
-.details span {
- padding: 0 0.4em 0 0.4em;
- background-color: var(--on-surface-color);
- color: var(--surface-color);
- border-radius: 25px;
- text-align: center;
- cursor: -webkit-zoom-in;
-}
+ .details {
+ width: 0.1em;
+ }
-#legend {
- padding-right: 20px;
-}
+ .details span {
+ padding: 0 0.4em 0 0.4em;
+ background-color: var(--on-surface-color);
+ color: var(--surface-color);
+ border-radius: 25px;
+ text-align: center;
+ cursor: -webkit-zoom-in;
+ }
-dl {
- float: right;
- border-style: solid;
- border-width: 1px;
- padding: 20px;
-}
+ #legend {
+ padding-right: 20px;
+ }
+ dl {
+ float: right;
+ border-style: solid;
+ border-width: 1px;
+ padding: 20px;
+ }
</style>
<div class="panel">
<h2>IC Panel</h2>
- <h3>IC Explorer</h3>
<div id="legend">
<dl>
<dt>0</dt>
@@ -74,26 +73,22 @@ dl {
<dd>generic</dd>
</dl>
</div>
-
<h3>Data</h3>
-
<p>Trace Count: <span id="count">0</span></p>
-
- <h3>Result</h3>
- <p>
+ <h3>Result</h3>
+ <p>
Group-Key:
<select id="group-key"></select>
- </p>
- <p>
+ </p>
+ <p>
Filter by Time
- <br></br>
<input type="search" id="filter-time-start" placeholder="start"></input> :
- <input type="search" id="filter-time-end" placeholder="end"></input>
+ <input type="search" id="filter-time-end" placeholder="end"></input>
<button id="filterICTimeBtn">Filter</button>
- <p>
- <table id="table" width="100%">
- <tbody id="table-body">
- </tbody>
- </table>
- </p>
+ <p>
+ <table id="table" width="100%">
+ <tbody id="table-body">
+ </tbody>
+ </table>
+ </p>
</div>
diff --git a/deps/v8/tools/system-analyzer/ic-panel.mjs b/deps/v8/tools/system-analyzer/ic-panel.mjs
index 14ea97a303..a8f68c31f5 100644
--- a/deps/v8/tools/system-analyzer/ic-panel.mjs
+++ b/deps/v8/tools/system-analyzer/ic-panel.mjs
@@ -3,27 +3,29 @@
// found in the LICENSE file.
import { Group } from './ic-model.mjs';
-import CustomIcProcessor from "./ic-processor.mjs";
-import { FocusEvent, SelectTimeEvent } from './events.mjs';
+import Processor from "./processor.mjs";
+import { MapLogEvent } from "./log/map.mjs";
+import { FocusEvent, SelectTimeEvent, SelectionEvent } from './events.mjs';
import { defineCustomElement, V8CustomElement } from './helper.mjs';
defineCustomElement('ic-panel', (templateText) =>
class ICPanel extends V8CustomElement {
- //TODO(zcankara) Entries never set
- #entries;
- #filteredEntries;
+ #selectedLogEvents;
+ #timeline;
constructor() {
super(templateText);
+ this.initGroupKeySelect();
this.groupKey.addEventListener(
'change', e => this.updateTable(e));
this.$('#filterICTimeBtn').addEventListener(
'click', e => this.handleICTimeFilter(e));
}
-
- get entries() {
- return this.#entries;
+ set timeline(value) {
+ console.assert(value !== undefined, "timeline undefined!");
+ this.#timeline = value;
+ this.selectedLogEvents = this.#timeline.all;
+ this.updateCount();
}
-
get groupKey() {
return this.$('#group-key');
}
@@ -44,13 +46,18 @@ defineCustomElement('ic-panel', (templateText) =>
return this.querySelectorAll("span");
}
- set filteredEntries(value) {
- this.#filteredEntries = value;
+ set selectedLogEvents(value) {
+ this.#selectedLogEvents = value;
+ this.updateCount();
this.updateTable();
}
- get filteredEntries() {
- return this.#filteredEntries;
+ updateCount() {
+ this.count.innerHTML = this.selectedLogEvents.length;
+ }
+
+ get selectedLogEvents() {
+ return this.#selectedLogEvents;
}
updateTable(event) {
@@ -58,7 +65,7 @@ defineCustomElement('ic-panel', (templateText) =>
let key = select.options[select.selectedIndex].text;
let tableBody = this.tableBody;
this.removeAllChildren(tableBody);
- let groups = Group.groupBy(this.filteredEntries, key, true);
+ let groups = Group.groupBy(this.selectedLogEvents, key, true);
this.render(groups, tableBody);
}
@@ -93,11 +100,28 @@ defineCustomElement('ic-panel', (templateText) =>
}
handleMapClick(e) {
- this.dispatchEvent(new FocusEvent(e.target.parentNode.entry));
+ const entry = e.target.parentNode.entry;
+ const id = entry.key;
+ const selectedMapLogEvents =
+ this.searchIcLogEventToMapLogEvent(id, entry.entries);
+ this.dispatchEvent(new SelectionEvent(selectedMapLogEvents));
+ }
+
+ searchIcLogEventToMapLogEvent(id, icLogEvents) {
+ // searches for mapLogEvents using the id, time
+ const selectedMapLogEventsSet = new Set();
+ for (const icLogEvent of icLogEvents) {
+ const time = icLogEvent.time;
+ const selectedMap = MapLogEvent.get(id, time);
+ selectedMapLogEventsSet.add(selectedMap);
+ }
+ return Array.from(selectedMapLogEventsSet);
}
+ //TODO(zcankara) Handle in the processor for events with source positions.
handleFilePositionClick(e) {
- this.dispatchEvent(new FocusEvent(e.target.parentNode.entry.key));
+ const entry = e.target.parentNode.entry;
+ this.dispatchEvent(new FocusEvent(entry.filePosition));
}
render(entries, parent) {
@@ -110,7 +134,9 @@ defineCustomElement('ic-panel', (templateText) =>
//TODO(zcankara) Create one bound method and use it everywhere
if (entry.property === "map") {
tr.addEventListener('click', e => this.handleMapClick(e));
+ tr.classList.add('clickable');
} else if (entry.property == "filePosition") {
+ tr.classList.add('clickable');
tr.addEventListener('click',
e => this.handleFilePositionClick(e));
}
@@ -182,9 +208,9 @@ defineCustomElement('ic-panel', (templateText) =>
initGroupKeySelect() {
let select = this.groupKey;
select.options.length = 0;
- for (let i in CustomIcProcessor.kProperties) {
+ for (let i in Processor.kProperties) {
let option = document.createElement("option");
- option.text = CustomIcProcessor.kProperties[i];
+ option.text = Processor.kProperties[i];
select.add(option);
}
}
diff --git a/deps/v8/tools/system-analyzer/ic-processor.mjs b/deps/v8/tools/system-analyzer/ic-processor.mjs
deleted file mode 100644
index 2d468fd266..0000000000
--- a/deps/v8/tools/system-analyzer/ic-processor.mjs
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2020 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {Event} from './event.mjs';
-import {Timeline} from './timeline.mjs';
-
-/**
- * Parser for dynamic code optimization state.
- */
-function parseState(s) {
- switch (s) {
- case '':
- return Profile.CodeState.COMPILED;
- case '~':
- return Profile.CodeState.OPTIMIZABLE;
- case '*':
- return Profile.CodeState.OPTIMIZED;
- }
- throw new Error('unknown code state: ' + s);
-}
-
-class IcProcessor extends LogReader {
- #profile;
- MAJOR_VERSION = 8;
- MINOR_VERSION = 5;
- constructor() {
- super();
- let propertyICParser = [
- parseInt, parseInt, parseInt, parseInt, parseString, parseString,
- parseInt, parseString, parseString, parseString
- ];
- LogReader.call(this, {
- 'code-creation': {
- parsers: [
- parseString, parseInt, parseInt, parseInt, parseInt, parseString,
- parseVarArgs
- ],
- processor: this.processCodeCreation
- },
- 'v8-version': {
- parsers: [
- parseInt, parseInt,
- ],
- processor: this.processV8Version
- },
- 'code-move':
- {parsers: [parseInt, parseInt], processor: this.processCodeMove},
- 'code-delete': {parsers: [parseInt], processor: this.processCodeDelete},
- 'sfi-move':
- {parsers: [parseInt, parseInt], processor: this.processFunctionMove},
- 'LoadGlobalIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'LoadGlobalIC')
- },
- 'StoreGlobalIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'StoreGlobalIC')
- },
- 'LoadIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'LoadIC')
- },
- 'StoreIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'StoreIC')
- },
- 'KeyedLoadIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'KeyedLoadIC')
- },
- 'KeyedStoreIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'KeyedStoreIC')
- },
- 'StoreInArrayLiteralIC': {
- parsers: propertyICParser,
- processor: this.processPropertyIC.bind(this, 'StoreInArrayLiteralIC')
- },
- });
- this.#profile = new Profile();
-
- this.LoadGlobalIC = 0;
- this.StoreGlobalIC = 0;
- this.LoadIC = 0;
- this.StoreIC = 0;
- this.KeyedLoadIC = 0;
- this.KeyedStoreIC = 0;
- this.StoreInArrayLiteralIC = 0;
- }
- get profile(){
- return this.#profile;
- }
- /**
- * @override
- */
- printError(str) {
- print(str);
- }
- processString(string) {
- let end = string.length;
- let current = 0;
- let next = 0;
- let line;
- let i = 0;
- let entry;
- while (current < end) {
- next = string.indexOf('\n', current);
- if (next === -1) break;
- i++;
- line = string.substring(current, next);
- current = next + 1;
- this.processLogLine(line);
- }
- }
- processV8Version(majorVersion, minorVersion){
- if(
- (majorVersion == this.MAJOR_VERSION && minorVersion <= this.MINOR_VERSION)
- || (majorVersion < this.MAJOR_VERSION)){
- window.alert(
- `Unsupported version ${majorVersion}.${minorVersion}. \n` +
- `Please use the matching tool for given the V8 version.`);
- }
- }
- processLogFile(fileName) {
- this.collectEntries = true;
- this.lastLogFileName_ = fileName;
- let line;
- while (line = readline()) {
- this.processLogLine(line);
- }
- print();
- print('=====================');
- print('LoadGlobal: ' + this.LoadGlobalIC);
- print('StoreGlobal: ' + this.StoreGlobalIC);
- print('Load: ' + this.LoadIC);
- print('Store: ' + this.StoreIC);
- print('KeyedLoad: ' + this.KeyedLoadIC);
- print('KeyedStore: ' + this.KeyedStoreIC);
- print('StoreInArrayLiteral: ' + this.StoreInArrayLiteralIC);
- }
- addEntry(entry) {
- this.entries.push(entry);
- }
- processCodeCreation(type, kind, timestamp, start, size, name, maybe_func) {
- if (maybe_func.length) {
- let funcAddr = parseInt(maybe_func[0]);
- let state = parseState(maybe_func[1]);
- this.#profile.addFuncCode(
- type, name, timestamp, start, size, funcAddr, state);
- } else {
- this.#profile.addCode(type, name, timestamp, start, size);
- }
- }
- processCodeMove(from, to) {
- this.#profile.moveCode(from, to);
- }
- processCodeDelete(start) {
- this.#profile.deleteCode(start);
- }
- processFunctionMove(from, to) {
- this.#profile.moveFunc(from, to);
- }
- formatName(entry) {
- if (!entry) return '<unknown>';
- let name = entry.func.getName();
- let re = /(.*):[0-9]+:[0-9]+$/;
- let array = re.exec(name);
- if (!array) return name;
- return entry.getState() + array[1];
- }
-
- processPropertyIC(
- type, pc, time, line, column, old_state, new_state, map, name, modifier,
- slow_reason) {
- this[type]++;
- let entry = this.#profile.findEntry(pc);
- print(
- type + ' (' + old_state + '->' + new_state + modifier + ') at ' +
- this.formatName(entry) + ':' + line + ':' + column + ' ' + name +
- ' (map 0x' + map.toString(16) + ')' +
- (slow_reason ? ' ' + slow_reason : '') + 'time: ' + time);
- }
-}
-
-// ================
-
-IcProcessor.kProperties = [
- 'type',
- 'category',
- 'functionName',
- 'filePosition',
- 'state',
- 'key',
- 'map',
- 'reason',
- 'file'
-];
-
-class CustomIcProcessor extends IcProcessor {
- #timeline = new Timeline();
-
- functionName(pc) {
- let entry = this.profile.findEntry(pc);
- return this.formatName(entry);
- }
-
- processPropertyIC(
- type, pc, time, line, column, old_state, new_state, map, key, modifier,
- slow_reason) {
- let fnName = this.functionName(pc);
- let entry = new IcLogEvent(
- type, fnName, time, line, column, key, old_state, new_state, map,
- slow_reason);
- this.#timeline.push(entry);
- }
-
-
- get timeline(){
- return this.#timeline;
- }
-
- processString(string) {
- super.processString(string);
- return this.timeline;
- }
-};
-
-class IcLogEvent extends Event {
- constructor(
- type, fn_file, time, line, column, key, oldState, newState, map, reason,
- additional) {
- super(type, time);
- this.category = 'other';
- if (this.type.indexOf('Store') !== -1) {
- this.category = 'Store';
- } else if (this.type.indexOf('Load') !== -1) {
- this.category = 'Load';
- }
- let parts = fn_file.split(' ');
- this.functionName = parts[0];
- this.file = parts[1];
- let position = line + ':' + column;
- this.filePosition = this.file + ':' + position;
- this.oldState = oldState;
- this.newState = newState;
- this.state = this.oldState + ' → ' + this.newState;
- this.key = key;
- this.map = map.toString(16);
- this.reason = reason;
- this.additional = additional;
- }
-
-
- parseMapProperties(parts, offset) {
- let next = parts[++offset];
- if (!next.startsWith('dict')) return offset;
- this.propertiesMode = next.substr(5) == '0' ? 'fast' : 'slow';
- this.numberOfOwnProperties = parts[++offset].substr(4);
- next = parts[++offset];
- this.instanceType = next.substr(5, next.length - 6);
- return offset;
- }
-
- parsePositionAndFile(parts, start) {
- // find the position of 'at' in the parts array.
- let offset = start;
- for (let i = start + 1; i < parts.length; i++) {
- offset++;
- if (parts[i] == 'at') break;
- }
- if (parts[offset] !== 'at') return -1;
- this.position = parts.slice(start, offset).join(' ');
- offset += 1;
- this.isNative = parts[offset] == 'native'
- offset += this.isNative ? 1 : 0;
- this.file = parts[offset];
- return offset;
- }
-}
-
-export { CustomIcProcessor as default, IcLogEvent};
diff --git a/deps/v8/tools/system-analyzer/index.css b/deps/v8/tools/system-analyzer/index.css
index 3eba296bac..c3defb5b8c 100644
--- a/deps/v8/tools/system-analyzer/index.css
+++ b/deps/v8/tools/system-analyzer/index.css
@@ -11,6 +11,7 @@
--error-color: #cf6679;
--map-background-color: #5e5454;
--timeline-background-color: #1f1f1f;
+ --file-reader-background-color: #ffffff80;
--red: #dc6eae;
--green: #aedc6e;
--yellow: #eeff41;
@@ -32,6 +33,7 @@
--error-color: #b00020;
--map-background-color: #5e5454;
--timeline-background-color: #fdfcfc;
+ --file-reader-background-color: #887e8b80;
--red: #b71c1c;
--green: #7db300;
--yellow: #ffff00;
@@ -132,6 +134,20 @@ button {
.failure {
background-color: var(--error-color);
}
+
+.highlight {
+ background-color: var(--primary-color);
+ color: var(--on-primary-color);
+}
+.clickable:hover,
+.mark:hover,
+.clickable:active,
+.mark:active {
+ background-color: var(--primary-color);
+ color: var(--on-primary-color);
+ cursor: pointer;
+}
+
a:link {
color: var(--secondary-color);
background-color: transparent;
diff --git a/deps/v8/tools/system-analyzer/index.html b/deps/v8/tools/system-analyzer/index.html
index 5674740606..c910446114 100644
--- a/deps/v8/tools/system-analyzer/index.html
+++ b/deps/v8/tools/system-analyzer/index.html
@@ -12,17 +12,6 @@ found in the LICENSE file. -->
<!-- <link rel="icon" type="image/png" href="/images/favicon.png"/> -->
<script type="module" src="index.mjs"></script>
<link rel="stylesheet" type="text/css" href="./index.css">
- <script type="module" src="helper.mjs"></script>
-
- <script src="../splaytree.js"></script>
- <script src="../codemap.js"></script>
- <script src="../csvparser.js"></script>
- <script src="../consarray.js"></script>
- <script src="../profile.js"></script>
- <script src="../profile_view.js"></script>
- <script src="../logreader.js"></script>
- <script src="../arguments.js"></script>
- <script src="../SourceMap.js"></script>
<style>
#instructions {
padding: 10px 10px 60px 10px;
@@ -41,9 +30,8 @@ found in the LICENSE file. -->
white-space: nowrap;
}
- /*Simple css to style it like a toggle switch*/
.theme-switch-wrapper {
- display: flex;
+ display: inline-block;
align-items: center;
}
@@ -112,22 +100,35 @@ found in the LICENSE file. -->
grid-column: span 2;
overflow: scroll;
}
+
+ a {
+ color: var(--primary-color);
+ }
+
+ a:hover {
+ color: var(--secondary-color);
+ }
</style>
<script type="module">
import { App } from './index.mjs';
- globalThis.app = new App("#log-file-reader", "#map-panel", "#timeline-panel",
- "#ic-panel", "#map-track", "#ic-track");
+ globalThis.app = new App("#log-file-reader", "#map-panel",
+ "#timeline-panel", "#ic-panel", "#map-track", "#ic-track",
+ "#source-panel");
</script>
</head>
<body>
<div id="content">
<section id="file-reader">
- <br></br>
<log-file-reader id="log-file-reader"></log-file-reader>
- <br></br>
</section>
+ <div class="theme-switch-wrapper">
+ <label class="theme-switch" for="checkbox">
+ <input type="checkbox" id="checkbox" />
+ <div class="slider round"></div>
+ </label>
+ </div>
<div id="container" class="initial">
<timeline-panel id="timeline-panel">
<timeline-track id="map-track"></timeline-track>
@@ -135,26 +136,42 @@ found in the LICENSE file. -->
</timeline-panel>
<map-panel id="map-panel"></map-panel>
<ic-panel id="ic-panel" onchange="app.handleSelectIc(event)"></ic-panel>
+ <source-panel id="source-panel"></source-panel>
</div>
</div>
- <div class="theme-switch-wrapper">
- <label class="theme-switch" for="checkbox">
- <input type="checkbox" id="checkbox" />
- <div class="slider round"></div>
- </label>
- </div>
<div id="instructions">
<h2>Instructions</h2>
<p>
- Unified web interface for analyzing the trace information of the Maps/ICs
+ Unified web interface to analyse runtime information stored in the v8 log.
</p>
+ For generating log file from
+ <a href="https://v8.dev/docs/build" target="_blank">d8</a>:
+ <p>
+ Log Options:
+ </p>
+ <dl>
+ <dt>--trace-maps:</dt>
+ <dd>Log<a href="https://v8.dev/blog/fast-properties" target="_blank">
+ Maps</a></dd>
+ <dt>--trace_ic:</dt>
+ <dd>Log
+ <a href="https://mathiasbynens.be/notes/shapes-ics" target="_blank">
+ ICs</a></dd>
+ <dt>--log-source-code:</dt>
+ <dd>Log source code</dd>
+ </dl>
+ Usage:
+ <ul>
+ <li><code>/path/do/d8 --trace-maps --trace_ic --log-source-code $FILE
+ </code></li>
+ </ul>
+ For generating a log file from Chrome:
<ul>
- <li> Visualize Map trees that have gathered</li>
- <li><code> /path/to/d8 --trace-maps $FILE</code></li>
- <li> Visualize IC events that have gathered</li>
- <li><code> /path/to/d8 --trace_ic $FILE (your_script.js) </code></li>
+ <li><code>/path/to/chrome --user-data-dir=/var/tmp/chr1 --no-sandbox
+ --js-flags='--trace-ic --trace-maps --log-source-code’
+ $WEBSITE_URL</code></li>
</ul>
- <h3>Keyboard Shortcuts</h3>
+ <h3>Keyboard Shortcuts for Navigation</h3>
<dl>
<dt><kbd>SHIFT</kbd> + <kbd>Arrow Up</kbd></dt>
<dd>Follow Map transition forward (first child)</dd>
diff --git a/deps/v8/tools/system-analyzer/index.mjs b/deps/v8/tools/system-analyzer/index.mjs
index 5913d4ddc8..80e5b79948 100644
--- a/deps/v8/tools/system-analyzer/index.mjs
+++ b/deps/v8/tools/system-analyzer/index.mjs
@@ -2,23 +2,27 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import CustomIcProcessor from "./ic-processor.mjs";
-import { SelectionEvent, FocusEvent } from "./events.mjs";
-import { IcLogEvent } from "./ic-processor.mjs";
+
+import { SelectionEvent, FocusEvent, SelectTimeEvent } from "./events.mjs";
import { State } from "./app-model.mjs";
-import { MapProcessor, MapLogEvent } from "./map-processor.mjs";
-import { SelectTimeEvent } from "./events.mjs";
+import { MapLogEvent } from "./log/map.mjs";
+import { IcLogEvent } from "./log/ic.mjs";
+import Processor from "./processor.mjs";
+import { SourcePosition } from "../profile.mjs";
import { $ } from "./helper.mjs";
import "./ic-panel.mjs";
import "./timeline-panel.mjs";
import "./map-panel.mjs";
import "./log-file-reader.mjs";
+import "./source-panel.mjs";
+
+
class App {
#state;
#view;
#navigation;
constructor(fileReaderId, mapPanelId, timelinePanelId,
- icPanelId, mapTrackId, icTrackId) {
+ icPanelId, mapTrackId, icTrackId, sourcePanelId) {
this.#view = {
logFileReader: $(fileReaderId),
icPanel: $(icPanelId),
@@ -26,6 +30,7 @@ class App {
timelinePanel: $(timelinePanelId),
mapTrack: $(mapTrackId),
icTrack: $(icTrackId),
+ sourcePanel: $(sourcePanelId)
};
this.#state = new State();
this.#navigation = new Navigation(this.#state, this.#view);
@@ -53,8 +58,10 @@ class App {
this.showMapEntries(e.entries);
} else if (e.entries[0] instanceof IcLogEvent) {
this.showIcEntries(e.entries);
+ } else if (e.entries[0] instanceof SourcePosition) {
+ this.showSourcePositionEntries(e.entries);
} else {
- console.error("Undefined selection!");
+ throw new Error("Unknown selection type!");
}
}
showMapEntries(entries) {
@@ -63,8 +70,11 @@ class App {
}
showIcEntries(entries) {
this.#state.selectedIcLogEvents = entries;
- //TODO(zcankara) use selectedLogEvents
- this.#view.icPanel.filteredEntries = this.#state.selectedIcLogEvents;
+ this.#view.icPanel.selectedLogEvents = this.#state.selectedIcLogEvents;
+ }
+ showSourcePositionEntries(entries) {
+ //TODO(zcankara) Handle multiple source position selection events
+ this.#view.sourcePanel.selectedSourcePositions = entries;
}
handleTimeRangeSelect(e) {
@@ -75,16 +85,12 @@ class App {
this.selectMapLogEvent(e.entry);
} else if (e.entry instanceof IcLogEvent) {
this.selectICLogEvent(e.entry);
- } else if (typeof e.entry === 'string') {
+ } else if (e.entry instanceof SourcePosition) {
this.selectSourcePositionEvent(e.entry);
} else {
- console.log("undefined");
+ throw new Error("Unknown selection type!");
}
}
- handleClickSourcePositions(e) {
- //TODO(zcankara) Handle source position
- console.log("Entry containing source position: ", e.entries);
- }
selectTimeRange(start, end) {
this.#state.timeSelection.start = start;
this.#state.timeSelection.end = end;
@@ -92,7 +98,7 @@ class App {
this.#state.mapTimeline.selectTimeRange(start, end);
this.#view.mapPanel.selectedMapLogEvents =
this.#state.mapTimeline.selection;
- this.#view.icPanel.filteredEntries = this.#state.icTimeline.selection;
+ this.#view.icPanel.selectedLogEvents = this.#state.icTimeline.selection;
}
selectMapLogEvent(entry) {
this.#state.map = entry;
@@ -101,34 +107,26 @@ class App {
}
selectICLogEvent(entry) {
this.#state.ic = entry;
- this.#view.icPanel.filteredEntries = [entry];
+ this.#view.icPanel.selectedLogEvents = [entry];
}
selectSourcePositionEvent(sourcePositions) {
- console.log("source positions: ", sourcePositions);
+ if (!sourcePositions.script) return;
+ this.#view.sourcePanel.selectedSourcePositions = [sourcePositions];
}
+
handleFileUpload(e) {
+ this.restartApp();
$("#container").className = "initial";
}
- // Map event log processing
- handleLoadTextMapProcessor(text) {
- let mapProcessor = new MapProcessor();
- return mapProcessor.processString(text);
+ restartApp() {
+ this.#state = new State();
+ this.#navigation = new Navigation(this.#state, this.#view);
}
- // IC event file reading and log processing
- loadICLogFile(fileData) {
- let reader = new FileReader();
- reader.onload = (evt) => {
- let icProcessor = new CustomIcProcessor();
- //TODO(zcankara) Assign timeline directly to the ic panel
- //TODO(zcankara) Exe: this.#icPanel.timeline = document.state.icTimeline
- //TODO(zcankara) Set the data of the State object first
- this.#state.icTimeline = icProcessor.processString(fileData.chunk);
- this.#view.icTrack.data = this.#state.icTimeline;
- this.#view.icPanel.filteredEntries = this.#view.icTrack.data.all;
- this.#view.icPanel.count.innerHTML = this.#view.icTrack.data.all.length;
- };
- reader.readAsText(fileData.file);
- this.#view.icPanel.initGroupKeySelect();
+ // Event log processing
+ handleLoadTextProcessor(text) {
+ let logProcessor = new Processor();
+ logProcessor.processString(text);
+ return logProcessor;
}
// call when a new file uploaded
@@ -137,18 +135,22 @@ class App {
$("#container").className = "loaded";
// instantiate the app logic
let fileData = e.detail;
- try {
- const timeline = this.handleLoadTextMapProcessor(fileData.chunk);
- // Transitions must be set before timeline for stats panel.
- this.#state.mapTimeline = timeline;
- this.#view.mapPanel.transitions = this.#state.mapTimeline.transitions;
- this.#view.mapTrack.data = this.#state.mapTimeline;
- this.#state.chunks = this.#view.mapTrack.chunks;
- this.#view.mapPanel.timeline = this.#state.mapTimeline;
- } catch (error) {
- console.log(error);
- }
- this.loadICLogFile(fileData);
+ const processor = this.handleLoadTextProcessor(fileData.chunk);
+ const mapTimeline = processor.mapTimeline;
+ const icTimeline = processor.icTimeline;
+ //TODO(zcankara) Make sure only one instance of src event map ic id match
+ // Load map log events timeline.
+ this.#state.mapTimeline = mapTimeline;
+ // Transitions must be set before timeline for stats panel.
+ this.#view.mapPanel.transitions = this.#state.mapTimeline.transitions;
+ this.#view.mapTrack.data = mapTimeline;
+ this.#state.chunks = this.#view.mapTrack.chunks;
+ this.#view.mapPanel.timeline = mapTimeline;
+ // Load ic log events timeline.
+ this.#state.icTimeline = icTimeline;
+ this.#view.icPanel.timeline = icTimeline;
+ this.#view.icTrack.data = icTimeline;
+ this.#view.sourcePanel.data = processor.scripts
this.fileLoaded = true;
}
diff --git a/deps/v8/tools/system-analyzer/log-file-reader-template.html b/deps/v8/tools/system-analyzer/log-file-reader-template.html
index d4796d5994..e20ce1ea20 100644
--- a/deps/v8/tools/system-analyzer/log-file-reader-template.html
+++ b/deps/v8/tools/system-analyzer/log-file-reader-template.html
@@ -2,9 +2,10 @@
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
+<head>
+ <link href="./index.css" rel="stylesheet">
+</head>
<style>
- @import "./index.css";
-
#fileReader {
width: 100%;
height: 100px;
@@ -18,9 +19,9 @@ found in the LICENSE file. -->
}
#fileReader.done {
- height: 20px;
- line-height: 20px;
- box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
+ height: 20px;
+ line-height: 20px;
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
}
#fileReader:hover {
@@ -32,7 +33,7 @@ found in the LICENSE file. -->
cursor: wait;
}
- #fileReader > input {
+ #fileReader>input {
display: none;
}
@@ -47,7 +48,7 @@ found in the LICENSE file. -->
left: 0px;
width: 100%;
height: 100%;
- background-color: rgba(255, 255, 255, 0.5);
+ background-color: var(--file-reader-background-color);
}
#spinner {
@@ -64,23 +65,24 @@ found in the LICENSE file. -->
}
@keyframes spin {
- 0% {
+ 0% {
transform: rotate(0deg);
- }
- 100% {
+ }
+
+ 100% {
transform: rotate(360deg);
- }
+ }
}
</style>
<section id="fileReaderSection">
- <div id="fileReader" tabindex=1 >
- <span id="label">
- Drag and drop a v8.log file into this area, or click to choose from disk.
- </span>
- <input id="file" type="file" name="file">
- </div>
- <div id="loader">
- <div id="spinner"></div>
- </div>
+ <div id="fileReader" tabindex=1>
+ <span id="label">
+ Drag and drop a v8.log file into this area, or click to choose from disk.
+ </span>
+ <input id="file" type="file" name="file">
+ </div>
+ <div id="loader">
+ <div id="spinner"></div>
+ </div>
</section>
diff --git a/deps/v8/tools/system-analyzer/log-file-reader.mjs b/deps/v8/tools/system-analyzer/log-file-reader.mjs
index 85fce9adb2..4b5238d89d 100644
--- a/deps/v8/tools/system-analyzer/log-file-reader.mjs
+++ b/deps/v8/tools/system-analyzer/log-file-reader.mjs
@@ -1,77 +1,80 @@
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {defineCustomElement, V8CustomElement} from './helper.mjs';
+import { defineCustomElement, V8CustomElement } from './helper.mjs';
defineCustomElement('log-file-reader', (templateText) =>
- class LogFileReader extends V8CustomElement {
- constructor() {
- super(templateText);
- this.addEventListener('click', e => this.handleClick(e));
- this.addEventListener('dragover', e => this.handleDragOver(e));
- this.addEventListener('drop', e => this.handleChange(e));
- this.$('#file').addEventListener('change', e => this.handleChange(e));
- this.$('#fileReader').addEventListener('keydown',
- e => this.handleKeyEvent(e));
- }
-
- get section() {
- return this.$('#fileReaderSection');
- }
+ class LogFileReader extends V8CustomElement {
+ constructor() {
+ super(templateText);
+ this.addEventListener('click', e => this.handleClick(e));
+ this.addEventListener('dragover', e => this.handleDragOver(e));
+ this.addEventListener('drop', e => this.handleChange(e));
+ this.$('#file').addEventListener('change', e => this.handleChange(e));
+ this.$('#fileReader').addEventListener('keydown',
+ e => this.handleKeyEvent(e));
+ }
- updateLabel(text) {
- this.$('#label').innerText = text;
- }
+ get section() {
+ return this.$('#fileReaderSection');
+ }
- handleKeyEvent(event) {
- if (event.key == "Enter") this.handleClick(event);
- }
+ updateLabel(text) {
+ this.$('#label').innerText = text;
+ }
- handleClick(event) {
- this.$('#file').click();
- }
+ handleKeyEvent(event) {
+ if (event.key == "Enter") this.handleClick(event);
+ }
- handleChange(event) {
- // Used for drop and file change.
- event.preventDefault();
- this.dispatchEvent(new CustomEvent(
- 'fileuploadstart', {bubbles: true, composed: true}));
- var host = event.dataTransfer ? event.dataTransfer : event.target;
- this.readFile(host.files[0]);
- }
+ handleClick(event) {
+ this.$('#file').click();
+ }
- handleDragOver(event) {
- event.preventDefault();
- }
+ handleChange(event) {
+ // Used for drop and file change.
+ event.preventDefault();
+ this.dispatchEvent(new CustomEvent(
+ 'fileuploadstart', { bubbles: true, composed: true }));
+ var host = event.dataTransfer ? event.dataTransfer : event.target;
+ this.readFile(host.files[0]);
+ }
- connectedCallback() {
- this.$('#fileReader').focus();
- }
+ handleDragOver(event) {
+ event.preventDefault();
+ }
- readFile(file) {
- if (!file) {
- this.updateLabel('Failed to load file.');
- return;
+ connectedCallback() {
+ this.$('#fileReader').focus();
}
- this.$('#fileReader').blur();
- this.section.className = 'loading';
- const reader = new FileReader();
- reader.onload = (e) => {
- try {
- let dataModel = Object.create(null);
- dataModel.file = file;
- dataModel.chunk = e.target.result;
- this.updateLabel('Finished loading \'' + file.name + '\'.');
- this.dispatchEvent(new CustomEvent(
- 'fileuploadend', {bubbles: true, composed: true, detail: dataModel}));
- this.section.className = 'success';
- this.$('#fileReader').classList.add('done');
- } catch (err) {
- console.error(err);
- this.section.className = 'failure';
+
+ readFile(file) {
+ if (!file) {
+ this.updateLabel('Failed to load file.');
+ return;
}
- };
- // Delay the loading a bit to allow for CSS animations to happen.
- setTimeout(() => reader.readAsText(file), 0);
+ this.$('#fileReader').blur();
+ this.section.className = 'loading';
+ const reader = new FileReader();
+ reader.onload = (e) => {
+ try {
+ let dataModel = Object.create(null);
+ dataModel.file = file;
+ dataModel.chunk = e.target.result;
+ this.updateLabel('Finished loading \'' + file.name + '\'.');
+ this.dispatchEvent(new CustomEvent(
+ 'fileuploadend', {
+ bubbles: true, composed: true,
+ detail: dataModel
+ }));
+ this.section.className = 'success';
+ this.$('#fileReader').classList.add('done');
+ } catch (err) {
+ console.error(err);
+ this.section.className = 'failure';
+ }
+ };
+ // Delay the loading a bit to allow for CSS animations to happen.
+ setTimeout(() => reader.readAsText(file), 0);
}
-});
+ });
diff --git a/deps/v8/tools/system-analyzer/log/ic.mjs b/deps/v8/tools/system-analyzer/log/ic.mjs
new file mode 100644
index 0000000000..5001e60c36
--- /dev/null
+++ b/deps/v8/tools/system-analyzer/log/ic.mjs
@@ -0,0 +1,60 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+import { Event } from './log.mjs';
+
+class IcLogEvent extends Event {
+ constructor(
+ type, fn_file, time, line, column, key, oldState, newState, map, reason,
+ script, additional) {
+ super(type, time);
+ this.category = 'other';
+ if (this.type.indexOf('Store') !== -1) {
+ this.category = 'Store';
+ } else if (this.type.indexOf('Load') !== -1) {
+ this.category = 'Load';
+ }
+ let parts = fn_file.split(' ');
+ this.functionName = parts[0];
+ this.file = parts[1];
+ let position = line + ':' + column;
+ this.filePosition = this.file + ':' + position;
+ this.oldState = oldState;
+ this.newState = newState;
+ this.state = this.oldState + ' → ' + this.newState;
+ this.key = key;
+ this.map = map;
+ this.reason = reason;
+ this.additional = additional;
+ this.script = script;
+ }
+
+
+ parseMapProperties(parts, offset) {
+ let next = parts[++offset];
+ if (!next.startsWith('dict')) return offset;
+ this.propertiesMode = next.substr(5) == '0' ? 'fast' : 'slow';
+ this.numberOfOwnProperties = parts[++offset].substr(4);
+ next = parts[++offset];
+ this.instanceType = next.substr(5, next.length - 6);
+ return offset;
+ }
+
+ parsePositionAndFile(parts, start) {
+ // find the position of 'at' in the parts array.
+ let offset = start;
+ for (let i = start + 1; i < parts.length; i++) {
+ offset++;
+ if (parts[i] == 'at') break;
+ }
+ if (parts[offset] !== 'at') return -1;
+ this.position = parts.slice(start, offset).join(' ');
+ offset += 1;
+ this.isNative = parts[offset] == 'native'
+ offset += this.isNative ? 1 : 0;
+ this.file = parts[offset];
+ return offset;
+ }
+}
+
+export { IcLogEvent };
diff --git a/deps/v8/tools/system-analyzer/event.mjs b/deps/v8/tools/system-analyzer/log/log.mjs
index 4ab6f34b41..2945f0e76b 100644
--- a/deps/v8/tools/system-analyzer/event.mjs
+++ b/deps/v8/tools/system-analyzer/log/log.mjs
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+
class Event {
#time;
#type;
@@ -10,12 +11,12 @@ class Event {
this.#time = time;
this.#type = type;
}
- get time(){
+ get time() {
return this.#time;
}
- get type(){
+ get type() {
return this.#type;
}
}
-export {Event};
+export { Event };
diff --git a/deps/v8/tools/system-analyzer/log/map.mjs b/deps/v8/tools/system-analyzer/log/map.mjs
new file mode 100644
index 0000000000..38c8a9a63a
--- /dev/null
+++ b/deps/v8/tools/system-analyzer/log/map.mjs
@@ -0,0 +1,296 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import { typeToColor } from '../helper.mjs';
+import { Event } from './log.mjs';
+
+// ===========================================================================
+// Map Log Events
+
+const kChunkHeight = 250;
+const kChunkWidth = 10;
+
+function define(prototype, name, fn) {
+ Object.defineProperty(prototype, name, { value: fn, enumerable: false });
+}
+
+define(Array.prototype, 'max', function (fn) {
+ if (this.length === 0) return undefined;
+ if (fn === undefined) fn = (each) => each;
+ let max = fn(this[0]);
+ for (let i = 1; i < this.length; i++) {
+ max = Math.max(max, fn(this[i]));
+ }
+ return max;
+})
+define(Array.prototype, 'first', function () {
+ return this[0]
+});
+define(Array.prototype, 'last', function () {
+ return this[this.length - 1]
+});
+
+// ===========================================================================
+// Map Log Events
+
+class MapLogEvent extends Event {
+ edge = void 0;
+ children = [];
+ depth = 0;
+ // TODO(zcankara): Change this to private class field.
+ #isDeprecated = false;
+ deprecatedTargets = null;
+ leftId = 0;
+ rightId = 0;
+ filePosition = '';
+ script = '';
+ id = -1;
+ constructor(id, time) {
+ if (!time) throw new Error('Invalid time');
+ super(id, time);
+ MapLogEvent.set(id, this);
+ this.id = id;
+ }
+
+ finalizeRootMap(id) {
+ let stack = [this];
+ while (stack.length > 0) {
+ let current = stack.pop();
+ if (current.leftId !== 0) {
+ console.error('Skipping potential parent loop between maps:', current)
+ continue;
+ }
+ current.finalize(id)
+ id += 1;
+ current.children.forEach(edge => stack.push(edge.to))
+ // TODO implement rightId
+ }
+ return id;
+ }
+
+ finalize(id) {
+ // Initialize preorder tree traversal Ids for fast subtree inclusion checks
+ if (id <= 0) throw 'invalid id';
+ let currentId = id;
+ this.leftId = currentId
+ }
+
+ parent() {
+ if (this.edge === void 0) return void 0;
+ return this.edge.from;
+ }
+
+ isDeprecated() {
+ return this.#isDeprecated;
+ }
+
+ deprecate() {
+ this.#isDeprecated = true;
+ }
+
+ isRoot() {
+ return this.edge === void 0 || this.edge.from === void 0;
+ }
+
+ contains(map) {
+ return this.leftId < map.leftId && map.rightId < this.rightId;
+ }
+
+ addEdge(edge) {
+ this.children.push(edge);
+ }
+
+ chunkIndex(chunks) {
+ // Did anybody say O(n)?
+ for (let i = 0; i < chunks.length; i++) {
+ let chunk = chunks[i];
+ if (chunk.isEmpty()) continue;
+ if (chunk.last().time < this.time) continue;
+ return i;
+ }
+ return -1;
+ }
+
+ position(chunks) {
+ let index = this.chunkIndex(chunks);
+ let xFrom = (index + 1.5) * kChunkWidth;
+ let yFrom = kChunkHeight - chunks[index].yOffset(this);
+ return [xFrom, yFrom];
+ }
+
+ transitions() {
+ let transitions = Object.create(null);
+ let current = this;
+ while (current) {
+ let edge = current.edge;
+ if (edge && edge.isTransition()) {
+ transitions[edge.name] = edge;
+ }
+ current = current.parent()
+ }
+ return transitions;
+ }
+
+ get type() {
+ return this.edge === void 0 ? 'new' : this.edge.type;
+ }
+
+ isBootstrapped() {
+ return this.edge === void 0;
+ }
+
+ getParents() {
+ let parents = [];
+ let current = this.parent();
+ while (current) {
+ parents.push(current);
+ current = current.parent();
+ }
+ return parents;
+ }
+
+ static get(id, time = undefined) {
+ let maps = this.cache.get(id);
+ if (maps) {
+ for (let i = 1; i < maps.length; i++) {
+ if (maps[i].time > time) {
+ return maps[i - 1];
+ }
+ }
+ // default return the latest
+ return (maps.length > 0) ? maps[maps.length - 1] : undefined;
+ }
+ }
+
+ static set(id, map) {
+ if (this.cache.has(id)) {
+ this.cache.get(id).push(map);
+ } else {
+ this.cache.set(id, [map]);
+ }
+ }
+}
+
+MapLogEvent.cache = new Map();
+
+// ===========================================================================
+class Edge {
+ constructor(type, name, reason, time, from, to) {
+ this.type = type;
+ this.name = name;
+ this.reason = reason;
+ this.time = time;
+ this.from = from;
+ this.to = to;
+ }
+
+ getColor() {
+ return typeToColor(this.type);
+ }
+
+ finishSetup() {
+ let from = this.from;
+ if (from) from.addEdge(this);
+ let to = this.to;
+ if (to === undefined) return;
+ to.edge = this;
+ if (from === undefined) return;
+ if (to === from) throw 'From and to must be distinct.';
+ if (to.time < from.time) {
+ console.error('invalid time order');
+ }
+ let newDepth = from.depth + 1;
+ if (to.depth > 0 && to.depth != newDepth) {
+ console.error('Depth has already been initialized');
+ }
+ to.depth = newDepth;
+ }
+
+ chunkIndex(chunks) {
+ // Did anybody say O(n)?
+ for (let i = 0; i < chunks.length; i++) {
+ let chunk = chunks[i];
+ if (chunk.isEmpty()) continue;
+ if (chunk.last().time < this.time) continue;
+ return i;
+ }
+ return -1;
+ }
+
+ parentEdge() {
+ if (!this.from) return undefined;
+ return this.from.edge;
+ }
+
+ chainLength() {
+ let length = 0;
+ let prev = this;
+ while (prev) {
+ prev = this.parent;
+ length++;
+ }
+ return length;
+ }
+
+ isTransition() {
+ return this.type === 'Transition'
+ }
+
+ isFastToSlow() {
+ return this.type === 'Normalize'
+ }
+
+ isSlowToFast() {
+ return this.type === 'SlowToFast'
+ }
+
+ isInitial() {
+ return this.type === 'InitialMap'
+ }
+
+ isBootstrapped() {
+ return this.type === 'new'
+ }
+
+ isReplaceDescriptors() {
+ return this.type === 'ReplaceDescriptors'
+ }
+
+ isCopyAsPrototype() {
+ return this.reason === 'CopyAsPrototype'
+ }
+
+ isOptimizeAsPrototype() {
+ return this.reason === 'OptimizeAsPrototype'
+ }
+
+ symbol() {
+ if (this.isTransition()) return '+';
+ if (this.isFastToSlow()) return '⊡';
+ if (this.isSlowToFast()) return '⊛';
+ if (this.isReplaceDescriptors()) {
+ if (this.name) return '+';
+ return '∥';
+ }
+ return '';
+ }
+
+ toString() {
+ let s = this.symbol();
+ if (this.isTransition()) return s + this.name;
+ if (this.isFastToSlow()) return s + this.reason;
+ if (this.isCopyAsPrototype()) return s + 'Copy as Prototype';
+ if (this.isOptimizeAsPrototype()) {
+ return s + 'Optimize as Prototype';
+ }
+ if (this.isReplaceDescriptors() && this.name) {
+ return this.type + ' ' + this.symbol() + this.name;
+ }
+ return this.type + ' ' + (this.reason ? this.reason : '') + ' ' +
+ (this.name ? this.name : '')
+ }
+}
+
+
+export { MapLogEvent, Edge, kChunkWidth, kChunkHeight };
diff --git a/deps/v8/tools/system-analyzer/map-panel-template.html b/deps/v8/tools/system-analyzer/map-panel-template.html
index 94cae0e050..6363a6d7c3 100644
--- a/deps/v8/tools/system-analyzer/map-panel-template.html
+++ b/deps/v8/tools/system-analyzer/map-panel-template.html
@@ -1,9 +1,11 @@
<!-- Copyright 2020 the V8 project authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
-<style>
- @import "./index.css";
+<head>
+ <link href="./index.css" rel="stylesheet">
+</head>
+<style>
#searchBarInput {
width: 200px;
}
@@ -14,8 +16,7 @@ found in the LICENSE file. -->
<map-transitions id="map-transitions"></map-transitions>
<h3>Search Map by Address</h3>
<section id="searchBar"></section>
- <input type="search" id="searchBarInput" placeholder="Search maps by address.."></input>
+ <input type="search" id="searchBarInput"></input>
<button id="searchBarBtn">Search</button>
-
<map-details id="map-details"></map-details>
</div>
diff --git a/deps/v8/tools/system-analyzer/map-panel.mjs b/deps/v8/tools/system-analyzer/map-panel.mjs
index c1e82555de..c78bce91a2 100644
--- a/deps/v8/tools/system-analyzer/map-panel.mjs
+++ b/deps/v8/tools/system-analyzer/map-panel.mjs
@@ -5,7 +5,7 @@ import "./stats-panel.mjs";
import "./map-panel/map-details.mjs";
import "./map-panel/map-transitions.mjs";
import { FocusEvent } from './events.mjs';
-import { MapLogEvent } from "./map-processor.mjs";
+import { MapLogEvent } from "./log/map.mjs";
import { defineCustomElement, V8CustomElement } from './helper.mjs';
defineCustomElement('map-panel', (templateText) =>
@@ -50,9 +50,6 @@ defineCustomElement('map-panel', (templateText) =>
}
// send a timeline to the stats-panel
- get timeline() {
- return this.statsPanel.timeline;
- }
set timeline(value) {
console.assert(value !== undefined, "timeline undefined!");
this.statsPanel.timeline = value;
@@ -74,7 +71,7 @@ defineCustomElement('map-panel', (templateText) =>
let searchBar = this.$('#searchBarInput');
let searchBarInput = searchBar.value;
//access the map from model cache
- let selectedMap = MapLogEvent.get(searchBarInput);
+ let selectedMap = MapLogEvent.get(parseInt(searchBarInput));
if (selectedMap) {
searchBar.className = "success";
} else {
diff --git a/deps/v8/tools/system-analyzer/map-panel/map-details-template.html b/deps/v8/tools/system-analyzer/map-panel/map-details-template.html
index b4b1541fd8..6d1b268c5d 100644
--- a/deps/v8/tools/system-analyzer/map-panel/map-details-template.html
+++ b/deps/v8/tools/system-analyzer/map-panel/map-details-template.html
@@ -6,7 +6,8 @@ found in the LICENSE file. -->
<link href="./index.css" rel="stylesheet">
</head>
<style>
- #mapDetails {
+ #mapDetails,
+ #filePositionNode {
overflow-x: scroll;
}
@@ -17,5 +18,6 @@ found in the LICENSE file. -->
</style>
<div class="panel">
<h4>Map Details</h4>
+ <section id="filePositionNode"></section>
<section id="mapDetails"></section>
</div>
diff --git a/deps/v8/tools/system-analyzer/map-panel/map-details.mjs b/deps/v8/tools/system-analyzer/map-panel/map-details.mjs
index dddccf7d8b..d471609dba 100644
--- a/deps/v8/tools/system-analyzer/map-panel/map-details.mjs
+++ b/deps/v8/tools/system-analyzer/map-panel/map-details.mjs
@@ -10,8 +10,8 @@ defineCustomElement(
class MapDetails extends V8CustomElement {
constructor() {
super(templateText);
- this.mapDetails.addEventListener("click", () =>
- this.handleClickSourcePositions()
+ this.#filePositionNode.addEventListener("click", e =>
+ this.handleFilePositionClick(e)
);
this.selectedMap = undefined;
}
@@ -19,23 +19,30 @@ defineCustomElement(
return this.$("#mapDetails");
}
+ get #filePositionNode() {
+ return this.$("#filePositionNode");
+ }
+
setSelectedMap(value) {
this.selectedMap = value;
}
set mapDetails(map) {
let details = "";
+ let clickableDetails = "";
if (map) {
- details += "ID: " + map.id;
- details += "\nSource location: " + map.filePosition;
+ clickableDetails += "ID: " + map.id;
+ clickableDetails += "\nSource location: " + map.filePosition;
details += "\n" + map.description;
this.setSelectedMap(map);
}
+ this.#filePositionNode.innerText = clickableDetails;
+ this.#filePositionNode.classList.add("clickable");
this.mapDetails.innerText = details;
}
- handleClickSourcePositions() {
- this.dispatchEvent(new FocusEvent(this.selectedMap.filePosition));
+ handleFilePositionClick() {
+ this.dispatchEvent(new FocusEvent(this.selectedMap.sourcePosition));
}
}
);
diff --git a/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs b/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs
index 578e2bb358..d508b88694 100644
--- a/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs
+++ b/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs
@@ -47,6 +47,7 @@ defineCustomElement(
selectMap(map) {
this.currentMap = map;
+ this.showMap();
this.dispatchEvent(new FocusEvent(map));
}
@@ -66,7 +67,8 @@ defineCustomElement(
// Timeline dbl click to show map transitions of selected maps
this.transitionView.style.display = "none";
this.removeAllChildren(this.transitionView);
- this.selectedMapLogEvents.forEach((map) => this.addMapAndParentTransitions(map));
+ this.selectedMapLogEvents.forEach((map) =>
+ this.addMapAndParentTransitions(map));
this.transitionView.style.display = "";
}
diff --git a/deps/v8/tools/system-analyzer/map-processor.mjs b/deps/v8/tools/system-analyzer/map-processor.mjs
deleted file mode 100644
index a1f056b474..0000000000
--- a/deps/v8/tools/system-analyzer/map-processor.mjs
+++ /dev/null
@@ -1,538 +0,0 @@
-// Copyright 2020 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {transitionTypeToColor} from './helper.mjs';
-import {Timeline} from './timeline.mjs';
-
-// ===========================================================================
-import {Event} from './event.mjs';
-const kChunkHeight = 250;
-const kChunkWidth = 10;
-
-function define(prototype, name, fn) {
- Object.defineProperty(prototype, name, {value: fn, enumerable: false});
-}
-
-define(Array.prototype, 'max', function(fn) {
- if (this.length === 0) return undefined;
- if (fn === undefined) fn = (each) => each;
- let max = fn(this[0]);
- for (let i = 1; i < this.length; i++) {
- max = Math.max(max, fn(this[i]));
- }
- return max;
-})
-define(Array.prototype, 'first', function() {
- return this[0]
-});
-define(Array.prototype, 'last', function() {
- return this[this.length - 1]
-});
-// ===========================================================================
-
-class MapProcessor extends LogReader {
- #profile = new Profile();
- #timeline = new Timeline();
- #formatPCRegexp = /(.*):[0-9]+:[0-9]+$/;
- MAJOR_VERSION = 7;
- MINOR_VERSION = 6;
- constructor() {
- super();
- this.dispatchTable_ = {
- __proto__: null,
- 'code-creation': {
- parsers: [
- parseString, parseInt, parseInt, parseInt, parseInt, parseString,
- parseVarArgs
- ],
- processor: this.processCodeCreation
- },
- 'v8-version': {
- parsers: [
- parseInt, parseInt,
- ],
- processor: this.processV8Version
- },
- 'code-move': {
- parsers: [parseInt, parseInt],
- 'sfi-move':
- {parsers: [parseInt, parseInt], processor: this.processCodeMove},
- 'code-delete': {parsers: [parseInt], processor: this.processCodeDelete},
- processor: this.processFunctionMove
- },
- 'map-create':
- {parsers: [parseInt, parseString], processor: this.processMapCreate},
- 'map': {
- parsers: [
- parseString, parseInt, parseString, parseString, parseInt, parseInt,
- parseString, parseString, parseString
- ],
- processor: this.processMap
- },
- 'map-details': {
- parsers: [parseInt, parseString, parseString],
- processor: this.processMapDetails
- }
- };
- }
-
- printError(str) {
- console.error(str);
- throw str
- }
-
- processString(string) {
- let end = string.length;
- let current = 0;
- let next = 0;
- let line;
- let i = 0;
- let entry;
- try {
- while (current < end) {
- next = string.indexOf('\n', current);
- if (next === -1) break;
- i++;
- line = string.substring(current, next);
- current = next + 1;
- this.processLogLine(line);
- }
- } catch (e) {
- console.error('Error occurred during parsing, trying to continue: ' + e);
- }
- return this.finalize();
- }
-
- processLogFile(fileName) {
- this.collectEntries = true;
- this.lastLogFileName_ = fileName;
- let i = 1;
- let line;
- try {
- while (line = readline()) {
- this.processLogLine(line);
- i++;
- }
- } catch (e) {
- console.error(
- 'Error occurred during parsing line ' + i +
- ', trying to continue: ' + e);
- }
- return this.finalize();
- }
-
- finalize() {
- // TODO(cbruni): print stats;
- this.#timeline.transitions = new Map();
- let id = 0;
- this.#timeline.forEach(map => {
- if (map.isRoot()) id = map.finalizeRootMap(id + 1);
- if (map.edge && map.edge.name) {
- let edge = map.edge;
- let list = this.#timeline.transitions.get(edge.name);
- if (list === undefined) {
- this.#timeline.transitions.set(edge.name, [edge]);
- } else {
- list.push(edge);
- }
- }
- });
- return this.#timeline;
- }
-
- addEntry(entry) {
- this.entries.push(entry);
- }
-
- /**
- * Parser for dynamic code optimization state.
- */
- parseState(s) {
- switch (s) {
- case '':
- return Profile.CodeState.COMPILED;
- case '~':
- return Profile.CodeState.OPTIMIZABLE;
- case '*':
- return Profile.CodeState.OPTIMIZED;
- }
- throw new Error('unknown code state: ' + s);
- }
-
- processCodeCreation(type, kind, timestamp, start, size, name, maybe_func) {
- if (maybe_func.length) {
- let funcAddr = parseInt(maybe_func[0]);
- let state = this.parseState(maybe_func[1]);
- this.#profile.addFuncCode(
- type, name, timestamp, start, size, funcAddr, state);
- } else {
- this.#profile.addCode(type, name, timestamp, start, size);
- }
- }
-
- processV8Version(majorVersion, minorVersion){
- if(
- (majorVersion == this.MAJOR_VERSION && minorVersion <= this.MINOR_VERSION)
- || (majorVersion < this.MAJOR_VERSION)){
- window.alert(
- `Unsupported version ${majorVersion}.${minorVersion}. \n` +
- `Please use the matching tool for given the V8 version.`);
- }
- }
-
- processCodeMove(from, to) {
- this.#profile.moveCode(from, to);
- }
-
- processCodeDelete(start) {
- this.#profile.deleteCode(start);
- }
-
- processFunctionMove(from, to) {
- this.#profile.moveFunc(from, to);
- }
-
- formatPC(pc, line, column) {
- let entry = this.#profile.findEntry(pc);
- if (!entry) return '<unknown>'
- if (entry.type === 'Builtin') {
- return entry.name;
- }
- let name = entry.func.getName();
- let array = this.#formatPCRegexp.exec(name);
- if (array === null) {
- entry = name;
- } else {
- entry = entry.getState() + array[1];
- }
- return entry + ':' + line + ':' + column;
- }
-
- processMap(type, time, from, to, pc, line, column, reason, name) {
- let time_ = parseInt(time);
- if (type === 'Deprecate') return this.deprecateMap(type, time_, from);
- let from_ = this.getExistingMap(from, time_);
- let to_ = this.getExistingMap(to, time_);
- let edge = new Edge(type, name, reason, time, from_, to_);
- to_.filePosition = this.formatPC(pc, line, column);
- edge.finishSetup();
- }
-
- deprecateMap(type, time, id) {
- this.getExistingMap(id, time).deprecate();
- }
-
- processMapCreate(time, id) {
- // map-create events might override existing maps if the addresses get
- // recycled. Hence we do not check for existing maps.
- let map = this.createMap(id, time);
- }
-
- processMapDetails(time, id, string) {
- // TODO(cbruni): fix initial map logging.
- let map = this.getExistingMap(id, time);
- map.description = string;
- }
-
- createMap(id, time) {
- let map = new MapLogEvent(id, time);
- this.#timeline.push(map);
- return map;
- }
-
- getExistingMap(id, time) {
- if (id === '0x000000000000') return undefined;
- let map = MapLogEvent.get(id, time);
- if (map === undefined) {
- console.error('No map details provided: id=' + id);
- // Manually patch in a map to continue running.
- return this.createMap(id, time);
- };
- return map;
- }
-}
-
-// ===========================================================================
-
-class MapLogEvent extends Event {
- edge = void 0;
- children = [];
- depth = 0;
- // TODO(zcankara): Change this to private class field.
- #isDeprecated = false;
- deprecatedTargets = null;
- leftId= 0;
- rightId = 0;
- filePosition = '';
- id = -1;
- constructor(id, time) {
- if (!time) throw new Error('Invalid time');
- super(id, time);
- MapLogEvent.set(id, this);
- this.id = id;
- }
-
- finalizeRootMap(id) {
- let stack = [this];
- while (stack.length > 0) {
- let current = stack.pop();
- if (current.leftId !== 0) {
- console.error('Skipping potential parent loop between maps:', current)
- continue;
- }
- current.finalize(id)
- id += 1;
- current.children.forEach(edge => stack.push(edge.to))
- // TODO implement rightId
- }
- return id;
- }
-
- finalize(id) {
- // Initialize preorder tree traversal Ids for fast subtree inclusion checks
- if (id <= 0) throw 'invalid id';
- let currentId = id;
- this.leftId = currentId
- }
-
- parent() {
- if (this.edge === void 0) return void 0;
- return this.edge.from;
- }
-
- isDeprecated() {
- return this.#isDeprecated;
- }
-
- deprecate() {
- this.#isDeprecated = true;
- }
-
- isRoot() {
- return this.edge === void 0 || this.edge.from === void 0;
- }
-
- contains(map) {
- return this.leftId < map.leftId && map.rightId < this.rightId;
- }
-
- addEdge(edge) {
- this.children.push(edge);
- }
-
- chunkIndex(chunks) {
- // Did anybody say O(n)?
- for (let i = 0; i < chunks.length; i++) {
- let chunk = chunks[i];
- if (chunk.isEmpty()) continue;
- if (chunk.last().time < this.time) continue;
- return i;
- }
- return -1;
- }
-
- position(chunks) {
- let index = this.chunkIndex(chunks);
- let xFrom = (index + 0.5) * kChunkWidth;
- let yFrom = kChunkHeight - chunks[index].yOffset(this);
- return [xFrom, yFrom];
- }
-
- transitions() {
- let transitions = Object.create(null);
- let current = this;
- while (current) {
- let edge = current.edge;
- if (edge && edge.isTransition()) {
- transitions[edge.name] = edge;
- }
- current = current.parent()
- }
- return transitions;
- }
-
- get type() {
- return this.edge === void 0 ? 'new' : this.edge.type;
- }
-
- isBootstrapped() {
- return this.edge === void 0;
- }
-
- getParents() {
- let parents = [];
- let current = this.parent();
- while (current) {
- parents.push(current);
- current = current.parent();
- }
- return parents;
- }
-
- static get(id, time = undefined) {
- let maps = this.cache.get(id);
- if (maps) {
- for (let i = 0; i < maps.length; i++) {
- // TODO: Implement time based map search
- if (maps[i].time === time) {
- return maps[i];
- }
- }
- // default return the latest
- return maps[maps.length - 1];
- }
- }
-
- static set(id, map) {
- if (this.cache.has(id)) {
- this.cache.get(id).push(map);
- } else {
- this.cache.set(id, [map]);
- }
- }
-}
-
-MapLogEvent.cache = new Map();
-
-// ===========================================================================
-class Edge {
- constructor(type, name, reason, time, from, to) {
- this.type = type;
- this.name = name;
- this.reason = reason;
- this.time = time;
- this.from = from;
- this.to = to;
- }
-
- getColor() {
- return transitionTypeToColor(this.type);
- }
-
- finishSetup() {
- let from = this.from;
- if (from) from.addEdge(this);
- let to = this.to;
- if (to === undefined) return;
- to.edge = this;
- if (from === undefined) return;
- if (to === from) throw 'From and to must be distinct.';
- if (to.time < from.time) {
- console.error('invalid time order');
- }
- let newDepth = from.depth + 1;
- if (to.depth > 0 && to.depth != newDepth) {
- console.error('Depth has already been initialized');
- }
- to.depth = newDepth;
- }
-
- chunkIndex(chunks) {
- // Did anybody say O(n)?
- for (let i = 0; i < chunks.length; i++) {
- let chunk = chunks[i];
- if (chunk.isEmpty()) continue;
- if (chunk.last().time < this.time) continue;
- return i;
- }
- return -1;
- }
-
- parentEdge() {
- if (!this.from) return undefined;
- return this.from.edge;
- }
-
- chainLength() {
- let length = 0;
- let prev = this;
- while (prev) {
- prev = this.parent;
- length++;
- }
- return length;
- }
-
- isTransition() {
- return this.type === 'Transition'
- }
-
- isFastToSlow() {
- return this.type === 'Normalize'
- }
-
- isSlowToFast() {
- return this.type === 'SlowToFast'
- }
-
- isInitial() {
- return this.type === 'InitialMap'
- }
-
- isBootstrapped() {
- return this.type === 'new'
- }
-
- isReplaceDescriptors() {
- return this.type === 'ReplaceDescriptors'
- }
-
- isCopyAsPrototype() {
- return this.reason === 'CopyAsPrototype'
- }
-
- isOptimizeAsPrototype() {
- return this.reason === 'OptimizeAsPrototype'
- }
-
- symbol() {
- if (this.isTransition()) return '+';
- if (this.isFastToSlow()) return '⊡';
- if (this.isSlowToFast()) return '⊛';
- if (this.isReplaceDescriptors()) {
- if (this.name) return '+';
- return '∥';
- }
- return '';
- }
-
- toString() {
- let s = this.symbol();
- if (this.isTransition()) return s + this.name;
- if (this.isFastToSlow()) return s + this.reason;
- if (this.isCopyAsPrototype()) return s + 'Copy as Prototype';
- if (this.isOptimizeAsPrototype()) {
- return s + 'Optimize as Prototype';
- }
- if (this.isReplaceDescriptors() && this.name) {
- return this.type + ' ' + this.symbol() + this.name;
- }
- return this.type + ' ' + (this.reason ? this.reason : '') + ' ' +
- (this.name ? this.name : '')
- }
-}
-
-
-// ===========================================================================
-class ArgumentsProcessor extends BaseArgumentsProcessor {
- getArgsDispatch() {
- return {
- '--range':
- ['range', 'auto,auto', 'Specify the range limit as [start],[end]'],
- '--source-map': [
- 'sourceMap', null,
- 'Specify the source map that should be used for output'
- ]
- };
- }
-
- getDefaultResults() {
- return {
- logFileName: 'v8.log',
- range: 'auto,auto',
- };
- }
-}
-
-export { MapProcessor, MapLogEvent, kChunkWidth, kChunkHeight};
diff --git a/deps/v8/tools/system-analyzer/processor.mjs b/deps/v8/tools/system-analyzer/processor.mjs
new file mode 100644
index 0000000000..0634174aef
--- /dev/null
+++ b/deps/v8/tools/system-analyzer/processor.mjs
@@ -0,0 +1,347 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import { MapLogEvent, Edge } from "./log/map.mjs";
+import { IcLogEvent } from "./log/ic.mjs";
+import { Timeline } from "./timeline.mjs";
+import { LogReader, parseString, parseVarArgs } from "../logreader.mjs";
+import { Profile } from "../profile.mjs";
+
+// ===========================================================================
+
+
+class Processor extends LogReader {
+ #profile = new Profile();
+ #mapTimeline = new Timeline();
+ #icTimeline = new Timeline();
+ #formatPCRegexp = /(.*):[0-9]+:[0-9]+$/;
+ MAJOR_VERSION = 7;
+ MINOR_VERSION = 6;
+ constructor() {
+ super();
+ this.propertyICParser = [
+ parseInt, parseInt, parseInt, parseInt, parseString, parseString,
+ parseString, parseString, parseString, parseString
+ ];
+ this.dispatchTable_ = {
+ __proto__: null,
+ 'code-creation': {
+ parsers: [
+ parseString, parseInt, parseInt, parseInt, parseInt, parseString,
+ parseVarArgs
+ ],
+ processor: this.processCodeCreation
+ },
+ 'v8-version': {
+ parsers: [
+ parseInt, parseInt,
+ ],
+ processor: this.processV8Version
+ },
+ 'script-source': {
+ parsers: [parseInt, parseString, parseString],
+ processor: this.processScriptSource
+ },
+ 'code-move':
+ { parsers: [parseInt, parseInt], processor: this.processCodeMove },
+ 'code-delete': { parsers: [parseInt], processor: this.processCodeDelete },
+ 'sfi-move':
+ { parsers: [parseInt, parseInt], processor: this.processFunctionMove },
+ 'map-create':
+ { parsers: [parseInt, parseString], processor: this.processMapCreate },
+ 'map': {
+ parsers: [
+ parseString, parseInt, parseString, parseString, parseInt, parseInt,
+ parseInt, parseString, parseString
+ ],
+ processor: this.processMap
+ },
+ 'map-details': {
+ parsers: [parseInt, parseString, parseString],
+ processor: this.processMapDetails
+ },
+ 'LoadGlobalIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'LoadGlobalIC')
+ },
+ 'StoreGlobalIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'StoreGlobalIC')
+ },
+ 'LoadIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'LoadIC')
+ },
+ 'StoreIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'StoreIC')
+ },
+ 'KeyedLoadIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'KeyedLoadIC')
+ },
+ 'KeyedStoreIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'KeyedStoreIC')
+ },
+ 'StoreInArrayLiteralIC': {
+ parsers: this.propertyICParser,
+ processor: this.processPropertyIC.bind(this, 'StoreInArrayLiteralIC')
+ },
+ };
+ }
+
+ printError(str) {
+ console.error(str);
+ throw str
+ }
+
+ processString(string) {
+ let end = string.length;
+ let current = 0;
+ let next = 0;
+ let line;
+ let i = 0;
+ let entry;
+ try {
+ while (current < end) {
+ next = string.indexOf('\n', current);
+ if (next === -1) break;
+ i++;
+ line = string.substring(current, next);
+ current = next + 1;
+ this.processLogLine(line);
+ }
+ } catch (e) {
+ console.error('Error occurred during parsing, trying to continue: ' + e);
+ }
+ this.finalize();
+ }
+
+ processLogFile(fileName) {
+ this.collectEntries = true;
+ this.lastLogFileName_ = fileName;
+ let i = 1;
+ let line;
+ try {
+ while (line = readline()) {
+ this.processLogLine(line);
+ i++;
+ }
+ } catch (e) {
+ console.error(
+ 'Error occurred during parsing line ' + i +
+ ', trying to continue: ' + e);
+ }
+ this.finalize();
+ }
+
+ finalize() {
+ // TODO(cbruni): print stats;
+ this.#mapTimeline.transitions = new Map();
+ let id = 0;
+ this.#mapTimeline.forEach(map => {
+ if (map.isRoot()) id = map.finalizeRootMap(id + 1);
+ if (map.edge && map.edge.name) {
+ let edge = map.edge;
+ let list = this.#mapTimeline.transitions.get(edge.name);
+ if (list === undefined) {
+ this.#mapTimeline.transitions.set(edge.name, [edge]);
+ } else {
+ list.push(edge);
+ }
+ }
+ });
+ }
+
+ /**
+ * Parser for dynamic code optimization state.
+ */
+ parseState(s) {
+ switch (s) {
+ case '':
+ return Profile.CodeState.COMPILED;
+ case '~':
+ return Profile.CodeState.OPTIMIZABLE;
+ case '*':
+ return Profile.CodeState.OPTIMIZED;
+ }
+ throw new Error('unknown code state: ' + s);
+ }
+
+ processCodeCreation(type, kind, timestamp, start, size, name, maybe_func) {
+ if (maybe_func.length) {
+ let funcAddr = parseInt(maybe_func[0]);
+ let state = this.parseState(maybe_func[1]);
+ this.#profile.addFuncCode(
+ type, name, timestamp, start, size, funcAddr, state);
+ } else {
+ this.#profile.addCode(type, name, timestamp, start, size);
+ }
+ }
+
+
+ processV8Version(majorVersion, minorVersion) {
+ if (
+ (majorVersion == this.MAJOR_VERSION && minorVersion <= this.MINOR_VERSION)
+ || (majorVersion < this.MAJOR_VERSION)) {
+ window.alert(
+ `Unsupported version ${majorVersion}.${minorVersion}. \n` +
+ `Please use the matching tool for given the V8 version.`);
+ }
+ }
+
+ processScriptSource(scriptId, url, source) {
+ this.#profile.addScriptSource(scriptId, url, source);
+ }
+
+ processCodeMove(from, to) {
+ this.#profile.moveCode(from, to);
+ }
+
+ processCodeDelete(start) {
+ this.#profile.deleteCode(start);
+ }
+
+ processFunctionMove(from, to) {
+ this.#profile.moveFunc(from, to);
+ }
+
+ formatName(entry) {
+ if (!entry) return '<unknown>';
+ let name = entry.func.getName();
+ let re = /(.*):[0-9]+:[0-9]+$/;
+ let array = re.exec(name);
+ if (!array) return name;
+ return entry.getState() + array[1];
+ }
+
+ processPropertyIC(
+ type, pc, time, line, column, old_state, new_state, map, key, modifier,
+ slow_reason) {
+ let fnName = this.functionName(pc);
+ let parts = fnName.split(' ');
+ let fileName = parts[1];
+ let script = this.getScript(fileName);
+ // TODO: Use SourcePosition here directly
+ let entry = new IcLogEvent(
+ type, fnName, time, line, column, key, old_state, new_state, map,
+ slow_reason, script);
+ if (script) {
+ entry.sourcePosition = script.addSourcePosition(line, column, entry);
+ }
+ this.#icTimeline.push(entry);
+ }
+
+ functionName(pc) {
+ let entry = this.#profile.findEntry(pc);
+ return this.formatName(entry);
+ }
+ formatPC(pc, line, column) {
+ let entry = this.#profile.findEntry(pc);
+ if (!entry) return '<unknown>'
+ if (entry.type === 'Builtin') {
+ return entry.name;
+ }
+ let name = entry.func.getName();
+ let array = this.#formatPCRegexp.exec(name);
+ if (array === null) {
+ entry = name;
+ } else {
+ entry = entry.getState() + array[1];
+ }
+ return entry + ':' + line + ':' + column;
+ }
+
+ processFileName(filePositionLine) {
+ if (!(/\s/.test(filePositionLine))) return;
+ filePositionLine = filePositionLine.split(' ');
+ let file = filePositionLine[1].split(':')[0];
+ return file;
+ }
+
+ processMap(type, time, from, to, pc, line, column, reason, name) {
+ let time_ = parseInt(time);
+ if (type === 'Deprecate') return this.deprecateMap(type, time_, from);
+ let from_ = this.getExistingMap(from, time_);
+ let to_ = this.getExistingMap(to, time_);
+ // TODO: use SourcePosition directly.
+ let edge = new Edge(type, name, reason, time, from_, to_);
+ to_.filePosition = this.formatPC(pc, line, column);
+ let fileName = this.processFileName(to_.filePosition);
+ to_.script = this.getScript(fileName);
+ if (to_.script) {
+ to_.sourcePosition = to_.script.addSourcePosition(line, column, to_)
+ }
+ edge.finishSetup();
+ }
+
+ deprecateMap(type, time, id) {
+ this.getExistingMap(id, time).deprecate();
+ }
+
+ processMapCreate(time, id) {
+ // map-create events might override existing maps if the addresses get
+ // recycled. Hence we do not check for existing maps.
+ let map = this.createMap(id, time);
+ }
+
+ processMapDetails(time, id, string) {
+ // TODO(cbruni): fix initial map logging.
+ let map = this.getExistingMap(id, time);
+ map.description = string;
+ }
+
+ createMap(id, time) {
+ let map = new MapLogEvent(id, time);
+ this.#mapTimeline.push(map);
+ return map;
+ }
+
+ getExistingMap(id, time) {
+ if (id === '0x000000000000') return undefined;
+ let map = MapLogEvent.get(id, time);
+ if (map === undefined) {
+ console.error('No map details provided: id=' + id);
+ // Manually patch in a map to continue running.
+ return this.createMap(id, time);
+ };
+ return map;
+ }
+
+ getScript(url) {
+ const script = this.#profile.getScript(url);
+ // TODO create placeholder script for empty urls.
+ if (script === undefined) {
+ console.error(`Could not find script for url: '${url}'`)
+ }
+ return script;
+ }
+
+ get icTimeline() {
+ return this.#icTimeline;
+ }
+
+ get mapTimeline() {
+ return this.#mapTimeline;
+ }
+
+ get scripts() {
+ return this.#profile.scripts_.filter(script => script !== undefined);
+ }
+}
+
+Processor.kProperties = [
+ 'type',
+ 'category',
+ 'functionName',
+ 'filePosition',
+ 'state',
+ 'key',
+ 'map',
+ 'reason',
+ 'file'
+];
+
+export { Processor as default };
diff --git a/deps/v8/tools/system-analyzer/source-panel-template.html b/deps/v8/tools/system-analyzer/source-panel-template.html
new file mode 100644
index 0000000000..102d30ea28
--- /dev/null
+++ b/deps/v8/tools/system-analyzer/source-panel-template.html
@@ -0,0 +1,52 @@
+<!-- Copyright 2020 the V8 project authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file. -->
+
+<head>
+ <link href="./index.css" rel="stylesheet">
+</head>
+<style>
+ pre.scriptNode {
+ white-space: pre-wrap;
+ }
+
+ pre.scriptNode:before {
+ counter-reset: sourceLineCounter;
+ }
+
+ pre.scriptNode span {
+ counter-increment: sourceLineCounter;
+ }
+
+ pre.scriptNode span::before {
+ content: counter(sourceLineCounter) " ";
+ display: inline-block;
+ width: 4em;
+ padding-left: auto;
+ margin-left: auto;
+ text-align: right;
+ }
+
+mark {
+ width: 1ch;
+ height: 1lh;
+ border-radius: 0.1lh;
+ border: 0.5px var(--background-color) solid;
+ cursor: pointer;
+}
+
+.marked {
+ background-color: var(--primary-color);
+ color: var(--on-primary-color);
+}
+</style>
+<div class="panel">
+ <h2>Source Panel</h2>
+ <div class="script-dropdown">
+ <label for="scripts-label">Scripts:</label>
+ <select id="script-dropdown"></select>
+ </div>
+ <div id="script">
+ <pre class="scripNode"></pre>
+ </div>
+</div>
diff --git a/deps/v8/tools/system-analyzer/source-panel.mjs b/deps/v8/tools/system-analyzer/source-panel.mjs
new file mode 100644
index 0000000000..a10f2bccd2
--- /dev/null
+++ b/deps/v8/tools/system-analyzer/source-panel.mjs
@@ -0,0 +1,189 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+import { V8CustomElement, defineCustomElement } from "./helper.mjs";
+import { SelectionEvent, FocusEvent } from "./events.mjs";
+import { MapLogEvent } from "./log/map.mjs";
+import { IcLogEvent } from "./log/ic.mjs";
+
+defineCustomElement(
+ "source-panel",
+ (templateText) =>
+ class SourcePanel extends V8CustomElement {
+ #selectedSourcePositions;
+ #scripts = [];
+ #script;
+ constructor() {
+ super(templateText);
+ this.scriptDropdown.addEventListener(
+ 'change', e => this.handleSelectScript(e));
+ }
+ get script() {
+ return this.$('#script');
+ }
+ get scriptNode() {
+ return this.$('.scriptNode');
+ }
+ set script(script) {
+ this.#script = script;
+ this.renderSourcePanel();
+ }
+ set selectedSourcePositions(sourcePositions) {
+ this.#selectedSourcePositions = sourcePositions;
+ }
+ get selectedSourcePositions() {
+ return this.#selectedSourcePositions;
+ }
+ set data(value) {
+ this.#scripts = value;
+ this.initializeScriptDropdown();
+ this.script = this.#scripts[0];
+ }
+ get scriptDropdown() {
+ return this.$("#script-dropdown");
+ }
+ initializeScriptDropdown() {
+ this.#scripts.sort((a, b) => a.name.localeCompare(b.name));
+ let select = this.scriptDropdown;
+ select.options.length = 0;
+ for (const script of this.#scripts) {
+ const option = document.createElement("option");
+ option.text = `${script.name} (id=${script.id})`;
+ option.script = script;
+ select.add(option);
+ }
+ }
+
+ renderSourcePanel() {
+ const builder = new LineBuilder(this, this.#script);
+ const scriptNode = builder.createScriptNode();
+ const oldScriptNode = this.script.childNodes[1];
+ this.script.replaceChild(scriptNode, oldScriptNode);
+ }
+
+ handleSelectScript(e) {
+ const option = this.scriptDropdown.options[this.scriptDropdown.selectedIndex];
+ this.script = option.script;
+ }
+
+ handleSourcePositionClick(e) {
+ let icLogEvents = [];
+ let mapLogEvents = [];
+ for (const entry of e.target.sourcePosition.entries) {
+ if (entry instanceof MapLogEvent) {
+ mapLogEvents.push(entry);
+ } else if (entry instanceof IcLogEvent) {
+ icLogEvents.push(entry);
+ }
+ }
+ if (icLogEvents.length > 0 ) {
+ this.dispatchEvent(new SelectionEvent(icLogEvents));
+ this.dispatchEvent(new FocusEvent(icLogEvents[0]));
+ }
+ if (mapLogEvents.length > 0) {
+ this.dispatchEvent(new SelectionEvent(mapLogEvents));
+ this.dispatchEvent(new FocusEvent(mapLogEvents[0]));
+ }
+ }
+
+ }
+);
+
+
+class SourcePositionIterator {
+ #entries;
+ #index = 0;
+ constructor(sourcePositions) {
+ this.#entries = sourcePositions;
+ }
+
+ *forLine(lineIndex) {
+ while(!this.#done() && this.#current().line === lineIndex) {
+ yield this.#current();
+ this.#next();
+ }
+ }
+
+ #current() {
+ return this.#entries[this.#index];
+ }
+
+ #done() {
+ return this.#index + 1 >= this.#entries.length;
+ }
+
+ #next() {
+ this.#index++;
+ }
+}
+
+function * lineIterator(source) {
+ let current = 0;
+ let line = 1;
+ while(current < source.length) {
+ const next = source.indexOf("\n", current);
+ if (next === -1) break;
+ yield [line, source.substring(current, next)];
+ line++;
+ current = next + 1;
+ }
+ if (current < source.length) yield [line, source.substring(current)];
+}
+
+class LineBuilder {
+ #script
+ #clickHandler
+ #sourcePositions
+
+ constructor(panel, script) {
+ this.#script = script;
+ this.#clickHandler = panel.handleSourcePositionClick.bind(panel);
+ // TODO: sort on script finalization.
+ script.sourcePositions.sort((a, b) => {
+ if (a.line === b.line) return a.column - b.column;
+ return a.line - b.line;
+ })
+ this.#sourcePositions
+ = new SourcePositionIterator(script.sourcePositions);
+
+ }
+
+ createScriptNode() {
+ const scriptNode = document.createElement("pre");
+ scriptNode.classList.add('scriptNode');
+ for (let [lineIndex, line] of lineIterator(this.#script.source)) {
+ scriptNode.appendChild(this.#createLineNode(lineIndex, line));
+ }
+ return scriptNode;
+ }
+
+ #createLineNode(lineIndex, line) {
+ const lineNode = document.createElement("span");
+ let columnIndex = 0;
+ for (const sourcePosition of this.#sourcePositions.forLine(lineIndex)) {
+ const nextColumnIndex = sourcePosition.column - 1;
+ lineNode.appendChild(
+ document.createTextNode(
+ line.substring(columnIndex, nextColumnIndex)));
+ columnIndex = nextColumnIndex;
+
+ lineNode.appendChild(
+ this.#createMarkerNode(line[columnIndex], sourcePosition));
+ columnIndex++;
+ }
+ lineNode.appendChild(
+ document.createTextNode(line.substring(columnIndex) + "\n"));
+ return lineNode;
+ }
+
+ #createMarkerNode(text, sourcePosition) {
+ const marker = document.createElement("mark");
+ marker.classList.add('marked');
+ marker.textContent = text;
+ marker.sourcePosition = sourcePosition;
+ marker.onclick = this.#clickHandler;
+ return marker;
+ }
+
+
+} \ No newline at end of file
diff --git a/deps/v8/tools/system-analyzer/stats-panel-template.html b/deps/v8/tools/system-analyzer/stats-panel-template.html
index 04094b5185..7aa149a588 100644
--- a/deps/v8/tools/system-analyzer/stats-panel-template.html
+++ b/deps/v8/tools/system-analyzer/stats-panel-template.html
@@ -1,9 +1,11 @@
<!-- Copyright 2020 the V8 project authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
-<style>
- @import "./index.css";
+<head>
+ <link href="./index.css" rel="stylesheet">
+</head>
+<style>
#stats {
display: flex;
height: 250px;
diff --git a/deps/v8/tools/system-analyzer/stats-panel.mjs b/deps/v8/tools/system-analyzer/stats-panel.mjs
index 54eac77262..9e637015bc 100644
--- a/deps/v8/tools/system-analyzer/stats-panel.mjs
+++ b/deps/v8/tools/system-analyzer/stats-panel.mjs
@@ -81,7 +81,8 @@ defineCustomElement(
let text = "";
let tableNode = this.table("transitionType");
tableNode.innerHTML =
- "<thead><tr><td>Color</td><td>Type</td><td>Count</td><td>Percent</td></tr></thead>";
+ "<thead><tr><td>Color</td><td>Type</td><td>Count</td>" +
+ "<td>Percent</td></tr></thead>";
let name, filter;
let total = this.timeline.size();
pairs.forEach(([name, color, filter]) => {
@@ -91,6 +92,7 @@ defineCustomElement(
} else {
row.appendChild(this.td(""));
}
+ row.classList.add('clickable');
row.onclick = (e) => {
// lazily compute the stats
let node = e.target.parentNode;
@@ -119,6 +121,7 @@ defineCustomElement(
.forEach(([name, maps]) => {
let row = this.tr();
row.maps = maps;
+ row.classList.add('clickable');
row.addEventListener("click", (e) =>
this.dispatchEvent(
new SelectionEvent(
diff --git a/deps/v8/tools/system-analyzer/timeline-panel-template.html b/deps/v8/tools/system-analyzer/timeline-panel-template.html
index be083c4c94..dd86994716 100644
--- a/deps/v8/tools/system-analyzer/timeline-panel-template.html
+++ b/deps/v8/tools/system-analyzer/timeline-panel-template.html
@@ -2,40 +2,46 @@
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
+<head>
+ <link href="./index.css" rel="stylesheet">
+</head>
<style>
-@import "./index.css";
-#timelineOverview {
- width: 100%;
- height: 50px;
- position: relative;
- margin-top: -50px;
- margin-bottom: 10px;
- background-size: 100% 100%;
- border: 1px var(--surface-color) solid;
- border-width: 1px 0 1px 0;
- overflow: hidden;
-}
-#timelineOverviewIndicator {
- height: 100%;
- position: absolute;
- box-shadow: 0px 2px 20px -5px var(--surface-color) inset;
- top: 0px;
- cursor: ew-resize;
-}
-#timelineOverviewIndicator .leftMask,
-#timelineOverviewIndicator .rightMask {
- background-color: rgba(200, 200, 200, 0.5);
- width: 10000px;
- height: 100%;
- position: absolute;
- top: 0px;
-}
-#timelineOverviewIndicator .leftMask {
- right: 100%;
-}
-#timelineOverviewIndicator .rightMask {
- left: 100%;
-}
+ #timelineOverview {
+ width: 100%;
+ height: 50px;
+ position: relative;
+ margin-top: -50px;
+ margin-bottom: 10px;
+ background-size: 100% 100%;
+ border: 1px var(--primary-color) solid;
+ border-width: 1px 0 1px 0;
+ overflow: hidden;
+ }
+
+ #timelineOverviewIndicator {
+ height: 100%;
+ position: absolute;
+ box-shadow: 0px 2px 20px -5px var(--primary-color) inset;
+ top: 0px;
+ cursor: ew-resize;
+ }
+
+ #timelineOverviewIndicator .leftMask,
+ #timelineOverviewIndicator .rightMask {
+ background-color: rgba(240, 230, 230, 0.3);
+ width: 10000px;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ }
+
+ #timelineOverviewIndicator .leftMask {
+ right: 100%;
+ }
+
+ #timelineOverviewIndicator .rightMask {
+ left: 100%;
+ }
</style>
<div class="panel">
<h2>Timeline Panel</h2>
diff --git a/deps/v8/tools/system-analyzer/timeline-panel.mjs b/deps/v8/tools/system-analyzer/timeline-panel.mjs
index 084dccca52..afe05c24bd 100644
--- a/deps/v8/tools/system-analyzer/timeline-panel.mjs
+++ b/deps/v8/tools/system-analyzer/timeline-panel.mjs
@@ -2,81 +2,92 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {defineCustomElement, V8CustomElement} from './helper.mjs';
+import { defineCustomElement, V8CustomElement } from './helper.mjs';
+import { SynchronizeSelectionEvent } from './events.mjs';
import './timeline/timeline-track.mjs';
defineCustomElement('timeline-panel', (templateText) =>
- class TimelinePanel extends V8CustomElement {
- constructor() {
- super(templateText);
- this.timelineOverview.addEventListener(
- 'mousemove', e => this.handleTimelineIndicatorMove(e));
- this.addEventListener(
- 'overviewupdate', e => this.handleOverviewBackgroundUpdate(e));
- this.addEventListener(
- 'scrolltrack', e => this.handleTrackScroll(e));
- this.backgroundCanvas = document.createElement('canvas');
- this.isLocked = false;
- }
+ class TimelinePanel extends V8CustomElement {
+ #timeSelection = { start: 0, end: Infinity };
+ constructor() {
+ super(templateText);
+ this.timelineOverview.addEventListener(
+ 'mousemove', e => this.handleTimelineIndicatorMove(e));
+ this.addEventListener(
+ 'scrolltrack', e => this.handleTrackScroll(e));
+ this.addEventListener(
+ SynchronizeSelectionEvent.name, e => this.handleMouseMoveSelection(e));
+ this.backgroundCanvas = document.createElement('canvas');
+ this.isLocked = false;
+ }
- get timelineOverview() {
- return this.$('#timelineOverview');
- }
+ get timelineOverview() {
+ return this.$('#timelineOverview');
+ }
- get timelineOverviewIndicator() {
- return this.$('#timelineOverviewIndicator');
- }
+ get timelineOverviewIndicator() {
+ return this.$('#timelineOverviewIndicator');
+ }
- get timelineCanvas() {
- return this.timelineTracks[0].timelineCanvas;
- }
+ //TODO(zcankara) Remove dependency to timelineCanvas here
+ get timelineCanvas() {
+ return this.timelineTracks[0].timelineCanvas;
+ }
+ //TODO(zcankara) Remove dependency to timeline here
+ get timeline() {
+ return this.timelineTracks[0].timeline;
+ }
+ set nofChunks(count) {
+ for (const track of this.timelineTracks) {
+ track.nofChunks = count;
+ }
+ }
+ get nofChunks() {
+ return this.timelineTracks[0].nofChunks;
+ }
+ get timelineTracks() {
+ return this.$("slot").assignedNodes().filter(
+ track => track.nodeType === Node.ELEMENT_NODE);
+ }
+ handleTrackScroll(event) {
+ //TODO(zcankara) add forEachTrack helper method
+ for (const track of this.timelineTracks) {
+ track.scrollLeft = event.detail;
+ }
+ }
- get timeline() {
- return this.timelineTracks[0].timeline;
- }
- set nofChunks(count){
- for (const track of this.timelineTracks) {
- track.nofChunks = count;
+ handleMouseMoveSelection(event) {
+ this.selectionMouseMove(event.start, event.end);
}
- }
- get nofChunks(){
- return this.timelineTracks[0].nofChunks;
- }
- get timelineTracks(){
- return this.$("slot").assignedNodes().filter(
- track => track.nodeType === Node.ELEMENT_NODE);
- }
- handleTrackScroll(event){
- //TODO(zcankara) add forEachTrack helper method
- for (const track of this.timelineTracks) {
- track.scrollLeft = event.detail;
+
+ selectionMouseMove(start, end) {
+ for (const track of this.timelineTracks) {
+ track.startTime = start;
+ track.endTime = end;
+ }
}
- }
- handleTimelineIndicatorMove(event) {
- if (event.buttons == 0) return;
- let timelineTotalWidth = this.timelineCanvas.offsetWidth;
- let factor = this.timelineOverview.offsetWidth / timelineTotalWidth;
- for (const track of this.timelineTracks) {
- track.timelineIndicatorMove(event.movementX / factor);
+
+ handleTimelineIndicatorMove(event) {
+ if (event.buttons == 0) return;
+ let timelineTotalWidth = this.timelineCanvas.offsetWidth;
+ let factor = this.timelineOverview.offsetWidth / timelineTotalWidth;
+ for (const track of this.timelineTracks) {
+ track.timelineIndicatorMove(event.movementX / factor);
+ }
+ this.updateOverviewWindow();
}
- }
- updateOverviewWindow() {
- let indicator = this.timelineOverviewIndicator;
- let totalIndicatorWidth =
+ updateOverviewWindow() {
+ let indicator = this.timelineOverviewIndicator;
+ let totalIndicatorWidth =
this.timelineOverview.offsetWidth;
- let div = this.timeline;
- let timelineTotalWidth = this.timelineCanvas.offsetWidth;
- let factor = totalIndicatorWidth / timelineTotalWidth;
- let width = div.offsetWidth * factor;
- let left = div.scrollLeft * factor;
- indicator.style.width = width + 'px';
- indicator.style.left = left + 'px';
- }
-
- handleOverviewBackgroundUpdate(e){
- this.timelineOverview.style.backgroundImage =
- 'url(' + e.detail + ')';
- }
+ let div = this.timeline;
+ let timelineTotalWidth = this.timelineCanvas.offsetWidth;
+ let factor = totalIndicatorWidth / timelineTotalWidth;
+ let width = div.offsetWidth * factor;
+ let left = div.scrollLeft * factor;
+ indicator.style.width = width + 'px';
+ indicator.style.left = left + 'px';
+ }
-});
+ });
diff --git a/deps/v8/tools/system-analyzer/timeline.mjs b/deps/v8/tools/system-analyzer/timeline.mjs
index e1f3432f81..16e12cc4aa 100644
--- a/deps/v8/tools/system-analyzer/timeline.mjs
+++ b/deps/v8/tools/system-analyzer/timeline.mjs
@@ -5,29 +5,30 @@
class Timeline {
#values;
#selection;
+ #uniqueTypes;
constructor() {
this.#values = [];
this.startTime = 0;
this.endTime = 0;
}
- get all(){
+ get all() {
return this.#values;
}
- get selection(){
+ get selection() {
return this.#selection;
}
- set selection(value){
+ set selection(value) {
this.#selection = value;
}
- selectTimeRange(start, end){
- this.#selection = this.filter(
+ selectTimeRange(start, end) {
+ this.#selection = this.filter(
e => e.time >= start && e.time <= end);
}
- getChunks(windowSizeMs){
+ getChunks(windowSizeMs) {
//TODO(zcankara) Fill this one
return this.chunkSizes(windowSizeMs);
}
- get values(){
+ get values() {
//TODO(zcankara) Not to break something delete later
return this.#values;
}
@@ -75,17 +76,35 @@ class Timeline {
}
first() {
- return this.#values.first();
+ return this.#values[0];
}
last() {
- return this.#values.last();
+ return this.#values[this.#values.length - 1];
}
duration() {
return this.last().time - this.first().time;
}
+ groupByTypes() {
+ this.#uniqueTypes = new Map();
+ for (const entry of this.all) {
+ if (!this.#uniqueTypes.has(entry.type)) {
+ this.#uniqueTypes.set(entry.type, [entry]);
+ } else {
+ this.#uniqueTypes.get(entry.type).push(entry);
+ }
+ }
+ }
+
+ get uniqueTypes() {
+ if (this.#uniqueTypes === undefined) {
+ this.groupByTypes();
+ }
+ return this.#uniqueTypes;
+ }
+
forEachChunkSize(count, fn) {
const increment = this.duration() / count;
let currentTime = this.first().time + increment;
@@ -216,11 +235,11 @@ class Chunk {
return chunk;
}
- getBreakdown(event_fn){
+ getBreakdown(event_fn) {
if (event_fn === void 0) {
event_fn = each => each;
}
- let breakdown = {__proto__: null};
+ let breakdown = { __proto__: null };
this.items.forEach(each => {
const type = event_fn(each);
const v = breakdown[type];
@@ -229,10 +248,10 @@ class Chunk {
return Object.entries(breakdown).sort((a, b) => a[1] - b[1]);
}
- filter(){
+ filter() {
return this.items.filter(map => !map.parent() || !this.has(map.parent()));
}
}
-export {Timeline, Chunk};
+export { Timeline, Chunk };
diff --git a/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html b/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html
index f4211750ef..93f30747be 100644
--- a/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html
+++ b/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html
@@ -15,11 +15,6 @@ found in the LICENSE file. -->
background-color: var(--timeline-background-color);
}
- #timeline::-webkit-scrollbar {
- width: 0;
- background-color: transparent;
- }
-
#timelineLabel {
transform: rotate(90deg);
transform-origin: left bottom 0;
@@ -65,29 +60,63 @@ found in the LICENSE file. -->
opacity: 0.5;
}
- #timelineLegend {
+ #legend {
position: relative;
float: right;
text-align: center;
+ width: 100%;
+ max-width: 280px;
+ padding-left: 20px;
+ padding-top: 10px;
+ }
+
+ th,
+ td {
+ width: 200px;
+ text-align: center;
+ padding: 5px;
}
.timeline {
background-color: var(--timeline-background-color);
}
- #timelineLegendContent {
- float: right;
- padding: 20px;
- width: 200px;
+ #timeline .rightHandle,
+ #timeline .leftHandle {
+ background-color: rgba(200, 200, 200, 0.5);
+ height: 100%;
+ width: 5px;
+ position: absolute;
+ z-index: 3;
+ cursor: col-resize;
+ }
+
+ #timeline .selection {
+ background-color: rgba(133, 68, 163, 0.5);
+ height: 100%;
+ position: absolute;
+ z-index: 2;
}
</style>
<div class="timeline">
- <div id="timelineLegend">
- <p>Category</p>
- <dl id="timelineLegendContent" style="float:right; padding:20px">
- </dl>
+ <div id="legend">
+ <table>
+ <thead>
+ <tr>
+ <td>Color</td>
+ <td>Type</td>
+ <td>Count</td>
+ <td>Percent</td>
+ </tr>
+ </thead>
+ <tbody id="legendContent">
+ </tbody>
+ </table>
</div>
<div id="timeline">
+ <div class="leftHandle"></div>
+ <div class="selection"></div>
+ <div class="rightHandle"></div>
<div id="timelineLabel">Frequency</div>
<div id="timelineChunks"></div>
<canvas id="timelineCanvas"></canvas>
diff --git a/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs b/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs
index cfb0175bd6..4905b782f2 100644
--- a/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs
+++ b/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs
@@ -4,31 +4,138 @@
import {
defineCustomElement, V8CustomElement,
- transitionTypeToColor, CSSColor
+ typeToColor, CSSColor
} from '../helper.mjs';
-import { kChunkWidth, kChunkHeight } from '../map-processor.mjs';
-import { SelectionEvent, FocusEvent, SelectTimeEvent } from '../events.mjs';
+import { kChunkWidth, kChunkHeight } from "../log/map.mjs";
+import {
+ SelectionEvent, FocusEvent, SelectTimeEvent,
+ SynchronizeSelectionEvent
+} from '../events.mjs';
defineCustomElement('./timeline/timeline-track', (templateText) =>
class TimelineTrack extends V8CustomElement {
+ static SELECTION_OFFSET = 20;
#timeline;
#nofChunks = 400;
#chunks;
#selectedEntry;
#timeToPixel;
#timeSelection = { start: 0, end: Infinity };
+ #isSelected = false;
+ #timeStartOffset;
+ #mouseDownTime;
constructor() {
super(templateText);
- this.timeline.addEventListener("mousedown",
- e => this.handleTimeRangeSelectionStart(e));
- this.timeline.addEventListener("mouseup",
- e => this.handleTimeRangeSelectionEnd(e));
this.timeline.addEventListener("scroll",
e => this.handleTimelineScroll(e));
+ this.timeline.addEventListener("mousedown",
+ e => this.handleTimeSelectionMouseDown(e));
+ this.timeline.addEventListener("mouseup",
+ e => this.handleTimeSelectionMouseUp(e));
+ this.timeline.addEventListener("mousemove",
+ e => this.handleTimeSelectionMouseMove(e));
this.backgroundCanvas = document.createElement('canvas');
this.isLocked = false;
}
+ handleTimeSelectionMouseDown(e) {
+ if (e.target.className === "chunk") return;
+ this.#isSelected = true;
+ this.#mouseDownTime = this.positionToTime(e.clientX);
+ }
+ handleTimeSelectionMouseMove(e) {
+ if (!this.#isSelected) return;
+ let mouseMoveTime = this.positionToTime(e.clientX);
+ let startTime = this.#mouseDownTime;
+ let endTime = mouseMoveTime;
+ if (this.isOnLeftHandle(e.clientX)) {
+ startTime = mouseMoveTime;
+ endTime = this.positionToTime(this.rightHandlePosX);
+ } else if (this.isOnRightHandle(e.clientX)) {
+ startTime = this.positionToTime(this.leftHandlePosX);
+ endTime = mouseMoveTime;
+ }
+ this.dispatchEvent(new SynchronizeSelectionEvent(
+ Math.min(startTime, endTime),
+ Math.max(startTime, endTime)));
+ }
+ handleTimeSelectionMouseUp(e) {
+ this.#isSelected = false;
+ this.dispatchEvent(new SelectTimeEvent(this.#timeSelection.start,
+ this.#timeSelection.end));
+ }
+ isOnLeftHandle(posX) {
+ return (Math.abs(this.leftHandlePosX - posX)
+ <= TimelineTrack.SELECTION_OFFSET);
+ }
+ isOnRightHandle(posX) {
+ return (Math.abs(this.rightHandlePosX - posX)
+ <= TimelineTrack.SELECTION_OFFSET);
+ }
+
+
+ set startTime(value) {
+ console.assert(
+ value <= this.#timeSelection.end,
+ "Selection start time greater than end time!");
+ this.#timeSelection.start = value;
+ this.updateSelection();
+ }
+ set endTime(value) {
+ console.assert(
+ value > this.#timeSelection.start,
+ "Selection end time smaller than start time!");
+ this.#timeSelection.end = value;
+ this.updateSelection();
+ }
+
+ updateSelection() {
+ let startTimePos = this.timeToPosition(this.#timeSelection.start);
+ let endTimePos = this.timeToPosition(this.#timeSelection.end);
+ this.leftHandle.style.left = startTimePos + "px";
+ this.selection.style.left = startTimePos + "px";
+ this.rightHandle.style.left = endTimePos + "px";
+ this.selection.style.width =
+ Math.abs(this.rightHandlePosX - this.leftHandlePosX) + "px";
+ }
+
+ get leftHandlePosX() {
+ let leftHandlePosX = this.leftHandle.getBoundingClientRect().x;
+ return leftHandlePosX;
+ }
+ get rightHandlePosX() {
+ let rightHandlePosX = this.rightHandle.getBoundingClientRect().x;
+ return rightHandlePosX;
+ }
+
+ // Maps the clicked x position to the x position on timeline canvas
+ positionOnTimeline(posX) {
+ let rect = this.timeline.getBoundingClientRect();
+ let posClickedX = posX - rect.left + this.timeline.scrollLeft;
+ return posClickedX;
+ }
+
+ positionToTime(posX) {
+ let posTimelineX = this.positionOnTimeline(posX) + this.#timeStartOffset;
+ return posTimelineX / this.#timeToPixel;
+ }
+
+ timeToPosition(time) {
+ let posX = time * this.#timeToPixel;
+ posX -= this.#timeStartOffset
+ return posX;
+ }
+
+ get leftHandle() {
+ return this.$('.leftHandle');
+ }
+ get rightHandle() {
+ return this.$('.rightHandle');
+ }
+ get selection() {
+ return this.$('.selection');
+ }
+
get timelineCanvas() {
return this.$('#timelineCanvas');
}
@@ -41,15 +148,18 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
return this.$('#timeline');
}
- get timelineLegendContent() {
- return this.$('#timelineLegendContent');
+ get timelineLegend() {
+ return this.$('#legend');
}
+ get timelineLegendContent() {
+ return this.$('#legendContent');
+ }
set data(value) {
this.#timeline = value;
this.updateChunks();
this.updateTimeline();
- this.updateStats();
+ this.renderLegend();
}
get data() {
@@ -82,65 +192,53 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
this.timeline.scrollLeft = offset;
}
- updateStats() {
- let unique = new Map();
- for (const entry of this.data.all) {
- if (!unique.has(entry.type)) {
- unique.set(entry.type, [entry]);
- } else {
- unique.get(entry.type).push(entry);
- }
- }
- this.renderStatsWindow(unique);
- }
-
- renderStatsWindow(unique) {
+ renderLegend() {
+ let timelineLegend = this.timelineLegend;
let timelineLegendContent = this.timelineLegendContent;
this.removeAllChildren(timelineLegendContent);
- let fragment = document.createDocumentFragment();
+ let row = this.tr();
+ row.entries = this.data.all;
+ row.classList.add('clickable');
+ row.addEventListener('dblclick', e => this.handleEntryTypeDblClick(e));
+ row.appendChild(this.td(""));
+ let td = this.td("All");
+ row.appendChild(td);
+ row.appendChild(this.td(this.data.all.length));
+ row.appendChild(this.td("100%"));
+ timelineLegendContent.appendChild(row);
let colorIterator = 0;
- unique.forEach((entries, type) => {
- let dt = document.createElement("dt");
- dt.innerHTML = entries.length;
- dt.style.backgroundColor = transitionTypeToColor(type);
- dt.style.color = CSSColor.surfaceColor;
- fragment.appendChild(dt);
- let dd = document.createElement("dd");
- dd.innerHTML = type;
- dd.entries = entries;
- dd.addEventListener('dblclick', e => this.handleEntryTypeDblClick(e));
- fragment.appendChild(dd);
+ this.#timeline.uniqueTypes.forEach((entries, type) => {
+ let row = this.tr();
+ row.entries = entries;
+ row.classList.add('clickable');
+ row.addEventListener('dblclick', e => this.handleEntryTypeDblClick(e));
+ let color = typeToColor(type);
+ if (color !== null) {
+ let div = this.div(["colorbox"]);
+ div.style.backgroundColor = color;
+ row.appendChild(this.td(div));
+ } else {
+ row.appendChild(this.td(""));
+ }
+ let td = this.td(type);
+ row.appendChild(td);
+ row.appendChild(this.td(entries.length));
+ let percent = (entries.length / this.data.all.length) * 100;
+ row.appendChild(this.td(percent.toFixed(1) + "%"));
+ timelineLegendContent.appendChild(row);
colorIterator += 1;
});
- timelineLegendContent.appendChild(fragment);
+ timelineLegend.appendChild(timelineLegendContent);
}
handleEntryTypeDblClick(e) {
- this.dispatchEvent(new SelectionEvent(e.target.entries));
+ this.dispatchEvent(new SelectionEvent(e.target.parentNode.entries));
}
timelineIndicatorMove(offset) {
this.timeline.scrollLeft += offset;
}
- handleTimeRangeSelectionStart(e) {
- this.#timeSelection.start = this.positionToTime(e.clientX);
- }
-
- handleTimeRangeSelectionEnd(e) {
- this.#timeSelection.end = this.positionToTime(e.clientX);
- this.dispatchEvent(new SelectTimeEvent(
- Math.min(this.#timeSelection.start, this.#timeSelection.end),
- Math.max(this.#timeSelection.start, this.#timeSelection.end)));
- }
-
- positionToTime(posX) {
- let rect = this.timeline.getBoundingClientRect();
- let posClickedX = posX - rect.left + this.timeline.scrollLeft;
- let selectedTime = posClickedX / this.#timeToPixel;
- return selectedTime;
- }
-
handleTimelineScroll(e) {
let horizontal = e.currentTarget.scrollLeft;
this.dispatchEvent(new CustomEvent(
@@ -179,14 +277,14 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
let type, count;
if (true) {
chunk.getBreakdown(map => map.type).forEach(([type, count]) => {
- ctx.fillStyle = transitionTypeToColor(type);
+ ctx.fillStyle = typeToColor(type);
let height = count / total * kHeight;
ctx.fillRect(0, y, kWidth, y + height);
y += height;
});
} else {
chunk.items.forEach(map => {
- ctx.fillStyle = transitionTypeToColor(map.type);
+ ctx.fillStyle = typeToColor(map.type);
let y = chunk.yOffset(map);
ctx.fillRect(0, y, kWidth, y + 1);
});
@@ -205,6 +303,7 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
let end = this.data.endTime;
let duration = end - start;
this.#timeToPixel = chunks.length * kChunkWidth / duration;
+ this.#timeStartOffset = start * this.#timeToPixel;
let addTimestamp = (time, name) => {
let timeNode = this.div('timestamp');
timeNode.innerText = name;
@@ -219,7 +318,8 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
if (chunk.isEmpty()) continue;
let node = this.div();
node.className = 'chunk';
- node.style.left = (chunks[i].start * this.#timeToPixel) + 'px';
+ node.style.left =
+ ((chunks[i].start - start) * this.#timeToPixel) + 'px';
node.style.height = height + 'px';
node.chunk = chunk;
node.addEventListener('mousemove', e => this.handleChunkMouseMove(e));
@@ -242,7 +342,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
addTimestamp(time, ((time - start) / 1000) + ' ms');
time += interval;
}
- this.drawOverview();
this.redraw();
}
@@ -269,35 +368,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
this.dispatchEvent(new SelectionEvent(maps));
}
- drawOverview() {
- const height = 50;
- const kFactor = 2;
- let canvas = this.backgroundCanvas;
- canvas.height = height;
- canvas.width = window.innerWidth;
- let ctx = canvas.getContext('2d');
- let chunks = this.data.chunkSizes(canvas.width * kFactor);
- let max = chunks.max();
- ctx.clearRect(0, 0, canvas.width, height);
- ctx.fillStyle = CSSColor.onBackgroundColor;
- ctx.beginPath();
- ctx.moveTo(0, height);
- for (let i = 0; i < chunks.length; i++) {
- ctx.lineTo(i / kFactor, height - chunks[i] / max * height);
- }
- ctx.lineTo(chunks.length, height);
- ctx.strokeStyle = CSSColor.onBackgroundColor;
- ctx.stroke();
- ctx.closePath();
- ctx.fill();
- let imageData = canvas.toDataURL('image/webp', 0.2);
- this.dispatchEvent(new CustomEvent(
- 'overviewupdate', {
- bubbles: true, composed: true,
- detail: imageData
- }));
- }
-
redraw() {
let canvas = this.timelineCanvas;
canvas.width = (this.chunks.length + 1) * kChunkWidth;
@@ -313,7 +383,7 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
}
setEdgeStyle(edge, ctx) {
- let color = transitionTypeToColor(edge.type);
+ let color = typeToColor(edge.type);
ctx.strokeStyle = color;
ctx.fillStyle = color;
}
@@ -397,7 +467,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
ctx.lineTo(xTo, yTo);
}
if (!showLabel) {
- ctx.strokeStyle = CSSColor.onBackgroundColor;
ctx.stroke();
} else {
let centerX, centerY;
@@ -408,12 +477,11 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
centerX = xTo;
centerY = yTo;
}
- ctx.strokeStyle = CSSColor.onBackgroundColor;
ctx.moveTo(centerX, centerY);
ctx.lineTo(centerX + offsetX, centerY - labelOffset);
ctx.stroke();
ctx.textAlign = 'left';
- ctx.fillStyle = CSSColor.onBackgroundColor;
+ ctx.fillStyle = typeToColor(edge.type);
ctx.fillText(
edge.toString(), centerX + offsetX + 2, centerY - labelOffset);
}
@@ -425,7 +493,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) =>
if (depth >= max) return;
ctx.globalAlpha = 0.5 - depth * (0.3 / max);
ctx.strokeStyle = CSSColor.timelineBackgroundColor;
-
const limit = Math.min(map.children.length, 100)
for (let i = 0; i < limit; i++) {
let edge = map.children[i];
diff --git a/deps/v8/tools/testrunner/base_runner.py b/deps/v8/tools/testrunner/base_runner.py
index 4ca911cc58..54a9e61b16 100644
--- a/deps/v8/tools/testrunner/base_runner.py
+++ b/deps/v8/tools/testrunner/base_runner.py
@@ -169,6 +169,7 @@ class BuildConfig(object):
self.asan = build_config['is_asan']
self.cfi_vptr = build_config['is_cfi']
+ self.concurrent_marking = build_config['v8_enable_concurrent_marking']
self.dcheck_always_on = build_config['dcheck_always_on']
self.gcov_coverage = build_config['is_gcov_coverage']
self.is_android = build_config['is_android']
@@ -178,6 +179,8 @@ class BuildConfig(object):
self.msan = build_config['is_msan']
self.no_i18n = not build_config['v8_enable_i18n_support']
self.predictable = build_config['v8_enable_verify_predictable']
+ self.simulator_run = (build_config['target_cpu'] !=
+ build_config['v8_target_cpu'])
self.tsan = build_config['is_tsan']
# TODO(machenbach): We only have ubsan not ubsan_vptr.
self.ubsan_vptr = build_config['is_ubsan_vptr']
@@ -348,9 +351,6 @@ class BaseTestRunner(object):
help="Path to a file for storing json results.")
parser.add_option('--slow-tests-cutoff', type="int", default=100,
help='Collect N slowest tests')
- parser.add_option("--junitout", help="File name of the JUnit output")
- parser.add_option("--junittestsuite", default="v8tests",
- help="The testsuite name in the JUnit output file")
parser.add_option("--exit-after-n-failures", type="int", default=100,
help="Exit after the first N failures instead of "
"running all tests. Pass 0 to disable this feature.")
@@ -369,6 +369,10 @@ class BaseTestRunner(object):
# Test config
parser.add_option("--command-prefix", default="",
help="Prepended to each shell command used to run a test")
+ parser.add_option('--dont-skip-slow-simulator-tests',
+ help='Don\'t skip more slow tests when using a'
+ ' simulator.', default=False, action='store_true',
+ dest='dont_skip_simulator_slow_tests')
parser.add_option("--extra-flags", action="append", default=[],
help="Additional flags to pass to each test command")
parser.add_option("--isolates", action="store_true", default=False,
@@ -627,13 +631,12 @@ class BaseTestRunner(object):
self.build_config.arch in ['mipsel', 'mips', 'mips64', 'mips64el'] and
self.build_config.mips_arch_variant)
- # TODO(machenbach): In GN we can derive simulator run from
- # target_arch != v8_target_arch in the dumped build config.
return {
"arch": self.build_config.arch,
"asan": self.build_config.asan,
"byteorder": sys.byteorder,
"cfi_vptr": self.build_config.cfi_vptr,
+ "concurrent_marking": self.build_config.concurrent_marking,
"dcheck_always_on": self.build_config.dcheck_always_on,
"deopt_fuzzer": False,
"endurance_fuzzer": False,
@@ -652,7 +655,8 @@ class BaseTestRunner(object):
"optimize_for_size": "--optimize-for-size" in options.extra_flags,
"predictable": self.build_config.predictable,
"simd_mips": simd_mips,
- "simulator_run": False,
+ "simulator_run": self.build_config.simulator_run and
+ not options.dont_skip_simulator_slow_tests,
"system": self.target_os,
"tsan": self.build_config.tsan,
"ubsan_vptr": self.build_config.ubsan_vptr,
@@ -753,9 +757,6 @@ class BaseTestRunner(object):
def _create_progress_indicators(self, test_count, options):
procs = [PROGRESS_INDICATORS[options.progress]()]
- if options.junitout:
- procs.append(progress.JUnitTestProgressIndicator(options.junitout,
- options.junittestsuite))
if options.json_test_results:
procs.append(progress.JsonTestProgressIndicator(self.framework_name))
diff --git a/deps/v8/tools/testrunner/local/junit_output.py b/deps/v8/tools/testrunner/local/junit_output.py
deleted file mode 100644
index 52f31ec422..0000000000
--- a/deps/v8/tools/testrunner/local/junit_output.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2013 the V8 project authors. All rights reserved.
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following
-# disclaimer in the documentation and/or other materials provided
-# with the distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-import xml.etree.ElementTree as xml
-
-
-class JUnitTestOutput:
- def __init__(self, test_suite_name):
- self.root = xml.Element("testsuite")
- self.root.attrib["name"] = test_suite_name
-
- def HasRunTest(self, test_name, test_cmd, test_duration, test_failure):
- testCaseElement = xml.Element("testcase")
- testCaseElement.attrib["name"] = test_name
- testCaseElement.attrib["cmd"] = test_cmd
- testCaseElement.attrib["time"] = str(round(test_duration, 3))
- if len(test_failure):
- failureElement = xml.Element("failure")
- failureElement.text = test_failure
- testCaseElement.append(failureElement)
- self.root.append(testCaseElement)
-
- def FinishAndWrite(self, f):
- xml.ElementTree(self.root).write(f, "UTF-8")
diff --git a/deps/v8/tools/testrunner/local/statusfile.py b/deps/v8/tools/testrunner/local/statusfile.py
index c8a1b307e4..854abc6655 100644
--- a/deps/v8/tools/testrunner/local/statusfile.py
+++ b/deps/v8/tools/testrunner/local/statusfile.py
@@ -76,6 +76,7 @@ class StatusFile(object):
_rules: {variant: {test name: [rule]}}
_prefix_rules: {variant: {test name prefix: [rule]}}
"""
+ self.variables = variables
with open(path) as f:
self._rules, self._prefix_rules = ReadStatusFile(f.read(), variables)
diff --git a/deps/v8/tools/testrunner/local/variants.py b/deps/v8/tools/testrunner/local/variants.py
index e78571e14f..0f8e20536c 100644
--- a/deps/v8/tools/testrunner/local/variants.py
+++ b/deps/v8/tools/testrunner/local/variants.py
@@ -16,8 +16,12 @@ ALL_VARIANT_FLAGS = {
"jitless": [["--jitless"]],
"minor_mc": [["--minor-mc"]],
"nci": [["--turbo-nci"]],
- "nci_as_highest_tier": [["--turbo-nci-as-highest-tier"]],
+ "nci_as_midtier": [["--turbo-nci-as-midtier"]],
"no_lfa": [["--no-lazy-feedback-allocation"]],
+ "no_local_heaps": [[
+ "--no-local-heaps",
+ "--no-turbo-direct-heap-access",
+ "--no-finalize-streaming-on-background"]],
# No optimization means disable all optimizations. OptimizeFunctionOnNextCall
# would not force optimization too. It turns into a Nop. Please see
# https://chromium-review.googlesource.com/c/452620/ for more discussion.
@@ -26,8 +30,8 @@ ALL_VARIANT_FLAGS = {
# independent of JS optimizations, so we can combine those configs.
"nooptimization": [["--no-opt", "--liftoff", "--no-wasm-tier-up"]],
"slow_path": [["--force-slow-path"]],
- "stress": [["--stress-opt", "--always-opt", "--no-liftoff",
- "--stress-lazy-source-positions"]],
+ "stress": [["--stress-opt", "--no-liftoff", "--stress-lazy-source-positions"]],
+ "stress_concurrent_allocation": [["--stress-concurrent-allocation"]],
"stress_js_bg_compile_wasm_code_gc": [["--stress-background-compile",
"--stress-wasm-code-gc"]],
"stress_incremental_marking": [["--stress-incremental-marking"]],
@@ -42,6 +46,54 @@ ALL_VARIANT_FLAGS = {
"top_level_await": [["--harmony-top-level-await"]],
}
+# Flags that lead to a contradiction with the flags provided by the respective
+# variant. This depends on the flags specified in ALL_VARIANT_FLAGS and on the
+# implications defined in flag-definitions.h.
+INCOMPATIBLE_FLAGS_PER_VARIANT = {
+ "assert_types": ["--no-assert-types"],
+ "jitless": ["--opt", "--liftoff", "--track-field-types", "--validate-asm"],
+ "no_wasm_traps": ["--wasm-trap-handler"],
+ "nooptimization": ["--opt", "--no-liftoff", "--predictable", "--wasm-tier-up"],
+ "slow_path": ["--no-force-slow-path"],
+ "stress_incremental_marking": ["--no-stress-incremental-marking"],
+ "stress_js_bg_compile_wasm_code_gc": ["--no-stress-background-compile"],
+ "stress": ["--no-stress-opt", "--always-opt", "--no-always-opt", "--liftoff", "--max-inlined-bytecode-size=*",
+ "--max-inlined-bytecode-size-cumulative=*", "--stress-inline"],
+ "turboprop": ["--turbo-inlining", "--interrupt-budget=*", "--no-turboprop"],
+ "code_serializer": ["--cache=after-execute", "--cache=full-code-cache", "--cache=none"],
+ "no_local_heaps": ["--concurrent-inlining", "--turboprop"],
+ "experimental_regexp": ["--no-enable-experimental-regexp-engine"],
+}
+
+# Flags that lead to a contradiction under certain build variables.
+# This corresponds to the build variables usable in status files as generated
+# in _get_statusfile_variables in base_runner.py.
+# The conflicts might be directly contradictory flags or be caused by the
+# implications defined in flag-definitions.h.
+INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE = {
+ "lite_mode": ["--no-lazy-feedback-allocation", "--max-semi-space-size=*"]
+ + INCOMPATIBLE_FLAGS_PER_VARIANT["jitless"],
+ "predictable": ["--liftoff", "--parallel-compile-tasks",
+ "--concurrent-recompilation",
+ "--wasm-num-compilation-tasks=*"],
+}
+
+# Flags that lead to a contradiction when a certain extra-flag is present.
+# Such extra-flags are defined for example in infra/testing/builders.pyl or in
+# standard_runner.py.
+# The conflicts might be directly contradictory flags or be caused by the
+# implications defined in flag-definitions.h.
+INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG = {
+ "--concurrent-recompilation": ["--no-concurrent-recompilation", "--predictable"],
+ "--enable-armv8": ["--no-enable-armv8"],
+ "--gc-interval=*": ["--gc-interval=*"],
+ "--no-enable-sse3": ["--enable-sse3"],
+ "--no-enable-sse4-1": ["--enable-sse4-1"],
+ "--optimize-for-size": ["--max-semi-space-size=*"],
+ "--stress-flush-bytecode": ["--no-stress-flush-bytecode"],
+ "--stress-incremental-marking": INCOMPATIBLE_FLAGS_PER_VARIANT["stress_incremental_marking"],
+}
+
SLOW_VARIANTS = set([
'stress',
'stress_snapshot',
diff --git a/deps/v8/tools/testrunner/num_fuzzer.py b/deps/v8/tools/testrunner/num_fuzzer.py
index 7777f4c66d..d5b243ba96 100755
--- a/deps/v8/tools/testrunner/num_fuzzer.py
+++ b/deps/v8/tools/testrunner/num_fuzzer.py
@@ -117,6 +117,10 @@ class NumFuzzer(base_runner.BaseTestRunner):
def _get_default_suite_names(self):
return DEFAULT_SUITES
+ def _runner_flags(self):
+ """Extra default flags specific to the test runner implementation."""
+ return ['--no-abort-on-contradictory-flags']
+
def _get_statusfile_variables(self, options):
variables = (
super(NumFuzzer, self)._get_statusfile_variables(options))
diff --git a/deps/v8/tools/testrunner/objects/testcase.py b/deps/v8/tools/testrunner/objects/testcase.py
index ac4defd2d7..72ca01a421 100644
--- a/deps/v8/tools/testrunner/objects/testcase.py
+++ b/deps/v8/tools/testrunner/objects/testcase.py
@@ -34,6 +34,10 @@ from ..outproc import base as outproc
from ..local import command
from ..local import statusfile
from ..local import utils
+from ..local.variants import INCOMPATIBLE_FLAGS_PER_VARIANT
+from ..local.variants import INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE
+from ..local.variants import INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG
+
FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)")
@@ -84,8 +88,10 @@ class TestCase(object):
# Outcomes
self._statusfile_outcomes = None
- self.expected_outcomes = None
+ self._expected_outcomes = None
+ self._checked_flag_contradictions = False
self._statusfile_flags = None
+ self.expected_failure_reason = None
self._prepare_outcomes()
@@ -116,7 +122,7 @@ class TestCase(object):
outcomes = self.suite.statusfile.get_outcomes(self.name, self.variant)
self._statusfile_outcomes = filter(not_flag, outcomes)
self._statusfile_flags = filter(is_flag, outcomes)
- self.expected_outcomes = (
+ self._expected_outcomes = (
self._parse_status_file_outcomes(self._statusfile_outcomes))
def _parse_status_file_outcomes(self, outcomes):
@@ -141,6 +147,60 @@ class TestCase(object):
return outproc.OUTCOMES_FAIL
return expected_outcomes or outproc.OUTCOMES_PASS
+ def allow_timeouts(self):
+ if self.expected_outcomes == outproc.OUTCOMES_PASS:
+ self._expected_outcomes = outproc.OUTCOMES_PASS_OR_TIMEOUT
+ elif self.expected_outcomes == outproc.OUTCOMES_FAIL:
+ self._expected_outcomes = outproc.OUTCOMES_FAIL_OR_TIMEOUT
+ elif statusfile.TIMEOUT not in self.expected_outcomes:
+ self._expected_outcomes = (
+ self.expected_outcomes + [statusfile.TIMEOUT])
+
+ @property
+ def expected_outcomes(self):
+ def normalize_flag(flag):
+ return flag.replace("_", "-").replace("--no-", "--no")
+
+ def has_flag(conflicting_flag, flags):
+ conflicting_flag = normalize_flag(conflicting_flag)
+ if conflicting_flag in flags:
+ return True
+ if conflicting_flag.endswith("*"):
+ return any(flag.startswith(conflicting_flag[:-1]) for flag in flags)
+ return False
+
+ def check_flags(incompatible_flags, actual_flags, rule):
+ for incompatible_flag in incompatible_flags:
+ if has_flag(incompatible_flag, actual_flags):
+ self._statusfile_outcomes = outproc.OUTCOMES_FAIL
+ self._expected_outcomes = outproc.OUTCOMES_FAIL
+ self.expected_failure_reason = ("Rule " + rule + " in " +
+ "tools/testrunner/local/variants.py expected a flag " +
+ "contradiction error with " + incompatible_flag + ".")
+
+ if not self._checked_flag_contradictions:
+ self._checked_flag_contradictions = True
+
+ file_specific_flags = (self._get_source_flags() + self._get_suite_flags()
+ + self._get_statusfile_flags())
+ file_specific_flags = [normalize_flag(flag) for flag in file_specific_flags]
+ extra_flags = [normalize_flag(flag) for flag in self._get_extra_flags()]
+
+ if self.variant in INCOMPATIBLE_FLAGS_PER_VARIANT:
+ check_flags(INCOMPATIBLE_FLAGS_PER_VARIANT[self.variant], file_specific_flags,
+ "INCOMPATIBLE_FLAGS_PER_VARIANT[\""+self.variant+"\"]")
+
+ for variable, incompatible_flags in INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE.items():
+ if self.suite.statusfile.variables[variable]:
+ check_flags(incompatible_flags, file_specific_flags,
+ "INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE[\""+variable+"\"]")
+
+ for extra_flag, incompatible_flags in INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG.items():
+ if has_flag(extra_flag, extra_flags):
+ check_flags(incompatible_flags, file_specific_flags,
+ "INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG[\""+extra_flag+"\"]")
+ return self._expected_outcomes
+
@property
def do_skip(self):
return (statusfile.SKIP in self._statusfile_outcomes and
@@ -183,9 +243,9 @@ class TestCase(object):
"""Gets command parameters and combines them in the following order:
- files [empty by default]
- random seed
+ - mode flags (based on chosen mode)
- extra flags (from command line)
- user flags (variant/fuzzer flags)
- - mode flags (based on chosen mode)
- source flags (from source code) [empty by default]
- test-suite flags
- statusfile flags
@@ -196,9 +256,9 @@ class TestCase(object):
return (
self._get_files_params() +
self._get_random_seed_flags() +
+ self._get_mode_flags() +
self._get_extra_flags() +
self._get_variant_flags() +
- self._get_mode_flags() +
self._get_source_flags() +
self._get_suite_flags() +
self._get_statusfile_flags()
diff --git a/deps/v8/tools/testrunner/standard_runner.py b/deps/v8/tools/testrunner/standard_runner.py
index 99d36bf2f8..ff58391110 100755
--- a/deps/v8/tools/testrunner/standard_runner.py
+++ b/deps/v8/tools/testrunner/standard_runner.py
@@ -28,8 +28,6 @@ from testrunner.testproc.seed import SeedProc
from testrunner.testproc.variant import VariantProc
-ARCH_GUESS = utils.DefaultArch()
-
VARIANTS = ['default']
MORE_VARIANTS = [
@@ -109,11 +107,6 @@ class StandardTestRunner(base_runner.BaseTestRunner):
help='Regard pass|fail tests (run|skip|dontcare)')
parser.add_option('--quickcheck', default=False, action='store_true',
help=('Quick check mode (skip slow tests)'))
- parser.add_option('--dont-skip-slow-simulator-tests',
- help='Don\'t skip more slow tests when using a'
- ' simulator.',
- default=False, action='store_true',
- dest='dont_skip_simulator_slow_tests')
# Stress modes
parser.add_option('--gc-stress',
@@ -282,19 +275,10 @@ class StandardTestRunner(base_runner.BaseTestRunner):
variables = (
super(StandardTestRunner, self)._get_statusfile_variables(options))
- simulator_run = (
- not options.dont_skip_simulator_slow_tests and
- self.build_config.arch in [
- 'arm64', 'arm', 'mipsel', 'mips', 'mips64', 'mips64el', 'ppc',
- 'ppc64', 's390', 's390x'] and
- bool(ARCH_GUESS) and
- self.build_config.arch != ARCH_GUESS)
-
variables.update({
'gc_stress': options.gc_stress or options.random_gc_stress,
'gc_fuzzer': options.random_gc_stress,
'novfp3': options.novfp3,
- 'simulator_run': simulator_run,
})
return variables
diff --git a/deps/v8/tools/testrunner/testproc/expectation.py b/deps/v8/tools/testrunner/testproc/expectation.py
index fdc9e3e1b0..285a599a74 100644
--- a/deps/v8/tools/testrunner/testproc/expectation.py
+++ b/deps/v8/tools/testrunner/testproc/expectation.py
@@ -14,14 +14,7 @@ class ForgiveTimeoutProc(base.TestProcProducer):
def _next_test(self, test):
subtest = self._create_subtest(test, 'no_timeout')
- if subtest.expected_outcomes == outproc.OUTCOMES_PASS:
- subtest.expected_outcomes = outproc.OUTCOMES_PASS_OR_TIMEOUT
- elif subtest.expected_outcomes == outproc.OUTCOMES_FAIL:
- subtest.expected_outcomes = outproc.OUTCOMES_FAIL_OR_TIMEOUT
- elif statusfile.TIMEOUT not in subtest.expected_outcomes:
- subtest.expected_outcomes = (
- subtest.expected_outcomes + [statusfile.TIMEOUT])
-
+ subtest.allow_timeouts()
return self._send_test(subtest)
def _result_for(self, test, subtest, result):
diff --git a/deps/v8/tools/testrunner/testproc/progress.py b/deps/v8/tools/testrunner/testproc/progress.py
index d0e62046f4..9ff943a5c2 100644
--- a/deps/v8/tools/testrunner/testproc/progress.py
+++ b/deps/v8/tools/testrunner/testproc/progress.py
@@ -15,7 +15,6 @@ import time
from . import base
from . import util
-from ..local import junit_output
def print_failure_header(test):
@@ -149,7 +148,7 @@ class VerboseProgressIndicator(SimpleProgressIndicator):
outcome = 'FAIL'
else:
outcome = 'pass'
- return 'Done running %s %s: %s' % (
+ return '%s %s: %s' % (
test, test.variant or 'default', outcome)
def _on_result_for(self, test, result):
@@ -269,6 +268,8 @@ class CompactProgressIndicator(ProgressIndicator):
else:
if test.is_fail:
self.printFormatted('failure', "--- UNEXPECTED PASS ---")
+ if test.expected_failure_reason != None:
+ self.printFormatted('failure', test.expected_failure_reason)
else:
self.printFormatted('failure', "--- FAILED ---")
@@ -347,45 +348,6 @@ class MonochromeProgressIndicator(CompactProgressIndicator):
print(("\r" + (" " * last_length) + "\r"), end='')
-class JUnitTestProgressIndicator(ProgressIndicator):
- def __init__(self, junitout, junittestsuite):
- super(JUnitTestProgressIndicator, self).__init__()
- self._requirement = base.DROP_PASS_STDOUT
-
- self.outputter = junit_output.JUnitTestOutput(junittestsuite)
- if junitout:
- self.outfile = open(junitout, "w")
- else:
- self.outfile = sys.stdout
-
- def _on_result_for(self, test, result):
- # TODO(majeski): Support for dummy/grouped results
- fail_text = ""
- output = result.output
- if result.has_unexpected_output:
- stdout = output.stdout.strip()
- if len(stdout):
- fail_text += "stdout:\n%s\n" % stdout
- stderr = output.stderr.strip()
- if len(stderr):
- fail_text += "stderr:\n%s\n" % stderr
- fail_text += "Command: %s" % result.cmd.to_string()
- if output.HasCrashed():
- fail_text += "exit code: %d\n--- CRASHED ---" % output.exit_code
- if output.HasTimedOut():
- fail_text += "--- TIMEOUT ---"
- self.outputter.HasRunTest(
- test_name=str(test),
- test_cmd=result.cmd.to_string(relative=True),
- test_duration=output.duration,
- test_failure=fail_text)
-
- def finished(self):
- self.outputter.FinishAndWrite(self.outfile)
- if self.outfile != sys.stdout:
- self.outfile.close()
-
-
class JsonTestProgressIndicator(ProgressIndicator):
def __init__(self, framework_name):
super(JsonTestProgressIndicator, self).__init__()
diff --git a/deps/v8/tools/tick-processor.html b/deps/v8/tools/tick-processor.html
index 32f8d6608e..ecb794ec94 100644
--- a/deps/v8/tools/tick-processor.html
+++ b/deps/v8/tools/tick-processor.html
@@ -42,24 +42,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
margin-top: 0px;
}
</style>
-
- <script src="splaytree.js"></script>
- <script src="codemap.js"></script>
- <script src="csvparser.js"></script>
- <script src="consarray.js"></script>
- <script src="profile.js"></script>
- <script src="profile_view.js"></script>
- <script src="logreader.js"></script>
- <script src="arguments.js"></script>
- <script src="tickprocessor.js"></script>
-
- <script>
+ <script type="module">
+ import {
+ TickProcessor, UnixCppEntriesProvider, MacCppEntriesProvider,
+ WindowsCppEntriesProvider
+ } from "./tickprocessor.mjs";
var v8log_content;
-var textout;
+globalThis.textout;
-function load_logfile(evt) {
- textout.value = "";
+globalThis.load_logfile = function(evt) {
+ globalThis.textout.value = "";
var f = evt.target.files[0];
if (f) {
var reader = new FileReader();
@@ -77,7 +70,7 @@ function load_logfile(evt) {
}
function print(arg) {
- textout.value+=arg+"\n";
+ globalThis.textout.value+=arg+"\n";
}
function start_process() {
@@ -108,11 +101,12 @@ function start_process() {
tickProcessor.processLogChunk(v8log_content);
tickProcessor.printStatistics();
}
-
+</script>
+<script>
function Load() {
document.getElementById('fileinput').addEventListener(
- 'change', load_logfile, false);
- textout = document.getElementById('textout');
+ 'change', globalThis.load_logfile, false);
+ globalThis.textout = document.getElementById('textout');
}
</script>
</head>
diff --git a/deps/v8/tools/tickprocessor-driver.mjs b/deps/v8/tools/tickprocessor-driver.mjs
new file mode 100644
index 0000000000..a8cce2f708
--- /dev/null
+++ b/deps/v8/tools/tickprocessor-driver.mjs
@@ -0,0 +1,88 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import { WebInspector} from "./sourcemap.mjs";
+import {
+ ArgumentsProcessor, TickProcessor, UnixCppEntriesProvider,
+ WindowsCppEntriesProvider, MacCppEntriesProvider, readFile,
+ } from "./tickprocessor.mjs";
+
+// Tick Processor's code flow.
+
+function processArguments(args) {
+ var processor = new ArgumentsProcessor(args);
+ if (processor.parse()) {
+ return processor.result();
+ } else {
+ processor.printUsageAndExit();
+ }
+}
+
+function initSourceMapSupport() {
+ // Pull dev tools source maps into our name space.
+ SourceMap = WebInspector.SourceMap;
+
+ // Overwrite the load function to load scripts synchronously.
+ SourceMap.load = function(sourceMapURL) {
+ var content = readFile(sourceMapURL);
+ var sourceMapObject = (JSON.parse(content));
+ return new SourceMap(sourceMapURL, sourceMapObject);
+ };
+}
+
+var entriesProviders = {
+ 'unix': UnixCppEntriesProvider,
+ 'windows': WindowsCppEntriesProvider,
+ 'mac': MacCppEntriesProvider
+};
+
+var params = processArguments(arguments);
+var sourceMap = null;
+if (params.sourceMap) {
+ initSourceMapSupport();
+ sourceMap = SourceMap.load(params.sourceMap);
+}
+var tickProcessor = new TickProcessor(
+ new (entriesProviders[params.platform])(params.nm, params.objdump, params.targetRootFS,
+ params.apkEmbeddedLibrary),
+ params.separateIc,
+ params.separateBytecodes,
+ params.separateBuiltins,
+ params.separateStubs,
+ params.callGraphSize,
+ params.ignoreUnknown,
+ params.stateFilter,
+ params.distortion,
+ params.range,
+ sourceMap,
+ params.timedRange,
+ params.pairwiseTimedRange,
+ params.onlySummary,
+ params.runtimeTimerFilter,
+ params.preprocessJson);
+tickProcessor.processLogFile(params.logFileName);
+tickProcessor.printStatistics();
diff --git a/deps/v8/tools/tickprocessor.mjs b/deps/v8/tools/tickprocessor.mjs
new file mode 100644
index 0000000000..b5aff3b23f
--- /dev/null
+++ b/deps/v8/tools/tickprocessor.mjs
@@ -0,0 +1,983 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import { LogReader, parseString, parseVarArgs } from "./logreader.mjs";
+import { BaseArgumentsProcessor, parseBool } from "./arguments.mjs";
+import { Profile, JsonProfile } from "./profile.mjs";
+import { ViewBuilder } from "./profile_view.mjs";
+
+
+export function inherits(childCtor, parentCtor) {
+ childCtor.prototype.__proto__ = parentCtor.prototype;
+};
+
+
+function V8Profile(separateIc, separateBytecodes, separateBuiltins,
+ separateStubs) {
+ Profile.call(this);
+ var regexps = [];
+ if (!separateIc) regexps.push(V8Profile.IC_RE);
+ if (!separateBytecodes) regexps.push(V8Profile.BYTECODES_RE);
+ if (!separateBuiltins) regexps.push(V8Profile.BUILTINS_RE);
+ if (!separateStubs) regexps.push(V8Profile.STUBS_RE);
+ if (regexps.length > 0) {
+ this.skipThisFunction = function(name) {
+ for (var i=0; i<regexps.length; i++) {
+ if (regexps[i].test(name)) return true;
+ }
+ return false;
+ };
+ }
+};
+inherits(V8Profile, Profile);
+
+
+V8Profile.IC_RE =
+ /^(LoadGlobalIC: )|(Handler: )|(?:CallIC|LoadIC|StoreIC)|(?:Builtin: (?:Keyed)?(?:Load|Store)IC_)/;
+V8Profile.BYTECODES_RE = /^(BytecodeHandler: )/
+V8Profile.BUILTINS_RE = /^(Builtin: )/
+V8Profile.STUBS_RE = /^(Stub: )/
+
+
+/**
+ * A thin wrapper around shell's 'read' function showing a file name on error.
+ */
+export function readFile(fileName) {
+ try {
+ return read(fileName);
+ } catch (e) {
+ printErr(fileName + ': ' + (e.message || e));
+ throw e;
+ }
+}
+
+
+/**
+ * Parser for dynamic code optimization state.
+ */
+function parseState(s) {
+ switch (s) {
+ case "": return Profile.CodeState.COMPILED;
+ case "~": return Profile.CodeState.OPTIMIZABLE;
+ case "*": return Profile.CodeState.OPTIMIZED;
+ }
+ throw new Error("unknown code state: " + s);
+}
+
+
+export function TickProcessor(
+ cppEntriesProvider,
+ separateIc,
+ separateBytecodes,
+ separateBuiltins,
+ separateStubs,
+ callGraphSize,
+ ignoreUnknown,
+ stateFilter,
+ distortion,
+ range,
+ sourceMap,
+ timedRange,
+ pairwiseTimedRange,
+ onlySummary,
+ runtimeTimerFilter,
+ preprocessJson) {
+ this.preprocessJson = preprocessJson;
+ LogReader.call(this, {
+ 'shared-library': { parsers: [parseString, parseInt, parseInt, parseInt],
+ processor: this.processSharedLibrary },
+ 'code-creation': {
+ parsers: [parseString, parseInt, parseInt, parseInt, parseInt,
+ parseString, parseVarArgs],
+ processor: this.processCodeCreation },
+ 'code-deopt': {
+ parsers: [parseInt, parseInt, parseInt, parseInt, parseInt,
+ parseString, parseString, parseString],
+ processor: this.processCodeDeopt },
+ 'code-move': { parsers: [parseInt, parseInt, ],
+ processor: this.processCodeMove },
+ 'code-delete': { parsers: [parseInt],
+ processor: this.processCodeDelete },
+ 'code-source-info': {
+ parsers: [parseInt, parseInt, parseInt, parseInt, parseString,
+ parseString, parseString],
+ processor: this.processCodeSourceInfo },
+ 'script-source': {
+ parsers: [parseInt, parseString, parseString],
+ processor: this.processScriptSource },
+ 'sfi-move': { parsers: [parseInt, parseInt],
+ processor: this.processFunctionMove },
+ 'active-runtime-timer': {
+ parsers: [parseString],
+ processor: this.processRuntimeTimerEvent },
+ 'tick': {
+ parsers: [parseInt, parseInt, parseInt,
+ parseInt, parseInt, parseVarArgs],
+ processor: this.processTick },
+ 'heap-sample-begin': { parsers: [parseString, parseString, parseInt],
+ processor: this.processHeapSampleBegin },
+ 'heap-sample-end': { parsers: [parseString, parseString],
+ processor: this.processHeapSampleEnd },
+ 'timer-event-start' : { parsers: [parseString, parseString, parseString],
+ processor: this.advanceDistortion },
+ 'timer-event-end' : { parsers: [parseString, parseString, parseString],
+ processor: this.advanceDistortion },
+ // Ignored events.
+ 'profiler': null,
+ 'function-creation': null,
+ 'function-move': null,
+ 'function-delete': null,
+ 'heap-sample-item': null,
+ 'current-time': null, // Handled specially, not parsed.
+ // Obsolete row types.
+ 'code-allocate': null,
+ 'begin-code-region': null,
+ 'end-code-region': null },
+ timedRange,
+ pairwiseTimedRange);
+
+ this.cppEntriesProvider_ = cppEntriesProvider;
+ this.callGraphSize_ = callGraphSize;
+ this.ignoreUnknown_ = ignoreUnknown;
+ this.stateFilter_ = stateFilter;
+ this.runtimeTimerFilter_ = runtimeTimerFilter;
+ this.sourceMap = sourceMap;
+ var ticks = this.ticks_ =
+ { total: 0, unaccounted: 0, excluded: 0, gc: 0 };
+
+ distortion = parseInt(distortion);
+ // Convert picoseconds to nanoseconds.
+ this.distortion_per_entry = isNaN(distortion) ? 0 : (distortion / 1000);
+ this.distortion = 0;
+ var rangelimits = range ? range.split(",") : [];
+ var range_start = parseInt(rangelimits[0]);
+ var range_end = parseInt(rangelimits[1]);
+ // Convert milliseconds to nanoseconds.
+ this.range_start = isNaN(range_start) ? -Infinity : (range_start * 1000);
+ this.range_end = isNaN(range_end) ? Infinity : (range_end * 1000)
+
+ V8Profile.prototype.handleUnknownCode = function(
+ operation, addr, opt_stackPos) {
+ var op = Profile.Operation;
+ switch (operation) {
+ case op.MOVE:
+ printErr('Code move event for unknown code: 0x' + addr.toString(16));
+ break;
+ case op.DELETE:
+ printErr('Code delete event for unknown code: 0x' + addr.toString(16));
+ break;
+ case op.TICK:
+ // Only unknown PCs (the first frame) are reported as unaccounted,
+ // otherwise tick balance will be corrupted (this behavior is compatible
+ // with the original tickprocessor.py script.)
+ if (opt_stackPos == 0) {
+ ticks.unaccounted++;
+ }
+ break;
+ }
+ };
+
+ if (preprocessJson) {
+ this.profile_ = new JsonProfile();
+ } else {
+ this.profile_ = new V8Profile(separateIc, separateBytecodes,
+ separateBuiltins, separateStubs);
+ }
+ this.codeTypes_ = {};
+ // Count each tick as a time unit.
+ this.viewBuilder_ = new ViewBuilder(1);
+ this.lastLogFileName_ = null;
+
+ this.generation_ = 1;
+ this.currentProducerProfile_ = null;
+ this.onlySummary_ = onlySummary;
+};
+inherits(TickProcessor, LogReader);
+
+
+TickProcessor.VmStates = {
+ JS: 0,
+ GC: 1,
+ PARSER: 2,
+ BYTECODE_COMPILER: 3,
+ COMPILER: 4,
+ OTHER: 5,
+ EXTERNAL: 6,
+ IDLE: 7,
+};
+
+
+TickProcessor.CodeTypes = {
+ CPP: 0,
+ SHARED_LIB: 1
+};
+// Otherwise, this is JS-related code. We are not adding it to
+// codeTypes_ map because there can be zillions of them.
+
+
+TickProcessor.CALL_PROFILE_CUTOFF_PCT = 1.0;
+
+TickProcessor.CALL_GRAPH_SIZE = 5;
+
+/**
+ * @override
+ */
+TickProcessor.prototype.printError = function(str) {
+ printErr(str);
+};
+
+
+TickProcessor.prototype.setCodeType = function(name, type) {
+ this.codeTypes_[name] = TickProcessor.CodeTypes[type];
+};
+
+
+TickProcessor.prototype.isSharedLibrary = function(name) {
+ return this.codeTypes_[name] == TickProcessor.CodeTypes.SHARED_LIB;
+};
+
+
+TickProcessor.prototype.isCppCode = function(name) {
+ return this.codeTypes_[name] == TickProcessor.CodeTypes.CPP;
+};
+
+
+TickProcessor.prototype.isJsCode = function(name) {
+ return name !== "UNKNOWN" && !(name in this.codeTypes_);
+};
+
+
+TickProcessor.prototype.processLogFile = function(fileName) {
+ this.lastLogFileName_ = fileName;
+ var line;
+ while (line = readline()) {
+ this.processLogLine(line);
+ }
+};
+
+
+TickProcessor.prototype.processLogFileInTest = function(fileName) {
+ // Hack file name to avoid dealing with platform specifics.
+ this.lastLogFileName_ = 'v8.log';
+ var contents = readFile(fileName);
+ this.processLogChunk(contents);
+};
+
+
+TickProcessor.prototype.processSharedLibrary = function(
+ name, startAddr, endAddr, aslrSlide) {
+ var entry = this.profile_.addLibrary(name, startAddr, endAddr, aslrSlide);
+ this.setCodeType(entry.getName(), 'SHARED_LIB');
+
+ var self = this;
+ var libFuncs = this.cppEntriesProvider_.parseVmSymbols(
+ name, startAddr, endAddr, aslrSlide, function(fName, fStart, fEnd) {
+ self.profile_.addStaticCode(fName, fStart, fEnd);
+ self.setCodeType(fName, 'CPP');
+ });
+};
+
+
+TickProcessor.prototype.processCodeCreation = function(
+ type, kind, timestamp, start, size, name, maybe_func) {
+ if (maybe_func.length) {
+ var funcAddr = parseInt(maybe_func[0]);
+ var state = parseState(maybe_func[1]);
+ this.profile_.addFuncCode(type, name, timestamp, start, size, funcAddr, state);
+ } else {
+ this.profile_.addCode(type, name, timestamp, start, size);
+ }
+};
+
+
+TickProcessor.prototype.processCodeDeopt = function(
+ timestamp, size, code, inliningId, scriptOffset, bailoutType,
+ sourcePositionText, deoptReasonText) {
+ this.profile_.deoptCode(timestamp, code, inliningId, scriptOffset,
+ bailoutType, sourcePositionText, deoptReasonText);
+};
+
+
+TickProcessor.prototype.processCodeMove = function(from, to) {
+ this.profile_.moveCode(from, to);
+};
+
+TickProcessor.prototype.processCodeDelete = function(start) {
+ this.profile_.deleteCode(start);
+};
+
+TickProcessor.prototype.processCodeSourceInfo = function(
+ start, script, startPos, endPos, sourcePositions, inliningPositions,
+ inlinedFunctions) {
+ this.profile_.addSourcePositions(start, script, startPos,
+ endPos, sourcePositions, inliningPositions, inlinedFunctions);
+};
+
+TickProcessor.prototype.processScriptSource = function(script, url, source) {
+ this.profile_.addScriptSource(script, url, source);
+};
+
+TickProcessor.prototype.processFunctionMove = function(from, to) {
+ this.profile_.moveFunc(from, to);
+};
+
+
+TickProcessor.prototype.includeTick = function(vmState) {
+ if (this.stateFilter_ !== null) {
+ return this.stateFilter_ == vmState;
+ } else if (this.runtimeTimerFilter_ !== null) {
+ return this.currentRuntimeTimer == this.runtimeTimerFilter_;
+ }
+ return true;
+};
+
+TickProcessor.prototype.processRuntimeTimerEvent = function(name) {
+ this.currentRuntimeTimer = name;
+}
+
+TickProcessor.prototype.processTick = function(pc,
+ ns_since_start,
+ is_external_callback,
+ tos_or_external_callback,
+ vmState,
+ stack) {
+ this.distortion += this.distortion_per_entry;
+ ns_since_start -= this.distortion;
+ if (ns_since_start < this.range_start || ns_since_start > this.range_end) {
+ return;
+ }
+ this.ticks_.total++;
+ if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++;
+ if (!this.includeTick(vmState)) {
+ this.ticks_.excluded++;
+ return;
+ }
+ if (is_external_callback) {
+ // Don't use PC when in external callback code, as it can point
+ // inside callback's code, and we will erroneously report
+ // that a callback calls itself. Instead we use tos_or_external_callback,
+ // as simply resetting PC will produce unaccounted ticks.
+ pc = tos_or_external_callback;
+ tos_or_external_callback = 0;
+ } else if (tos_or_external_callback) {
+ // Find out, if top of stack was pointing inside a JS function
+ // meaning that we have encountered a frameless invocation.
+ var funcEntry = this.profile_.findEntry(tos_or_external_callback);
+ if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction()) {
+ tos_or_external_callback = 0;
+ }
+ }
+
+ this.profile_.recordTick(
+ ns_since_start, vmState,
+ this.processStack(pc, tos_or_external_callback, stack));
+};
+
+
+TickProcessor.prototype.advanceDistortion = function() {
+ this.distortion += this.distortion_per_entry;
+}
+
+
+TickProcessor.prototype.processHeapSampleBegin = function(space, state, ticks) {
+ if (space != 'Heap') return;
+ this.currentProducerProfile_ = new CallTree();
+};
+
+
+TickProcessor.prototype.processHeapSampleEnd = function(space, state) {
+ if (space != 'Heap' || !this.currentProducerProfile_) return;
+
+ print('Generation ' + this.generation_ + ':');
+ var tree = this.currentProducerProfile_;
+ tree.computeTotalWeights();
+ var producersView = this.viewBuilder_.buildView(tree);
+ // Sort by total time, desc, then by name, desc.
+ producersView.sort(function(rec1, rec2) {
+ return rec2.totalTime - rec1.totalTime ||
+ (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); });
+ this.printHeavyProfile(producersView.head.children);
+
+ this.currentProducerProfile_ = null;
+ this.generation_++;
+};
+
+
+TickProcessor.prototype.printStatistics = function() {
+ if (this.preprocessJson) {
+ this.profile_.writeJson();
+ return;
+ }
+
+ print('Statistical profiling result from ' + this.lastLogFileName_ +
+ ', (' + this.ticks_.total +
+ ' ticks, ' + this.ticks_.unaccounted + ' unaccounted, ' +
+ this.ticks_.excluded + ' excluded).');
+
+ if (this.ticks_.total == 0) return;
+
+ var flatProfile = this.profile_.getFlatProfile();
+ var flatView = this.viewBuilder_.buildView(flatProfile);
+ // Sort by self time, desc, then by name, desc.
+ flatView.sort(function(rec1, rec2) {
+ return rec2.selfTime - rec1.selfTime ||
+ (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); });
+ var totalTicks = this.ticks_.total;
+ if (this.ignoreUnknown_) {
+ totalTicks -= this.ticks_.unaccounted;
+ }
+ var printAllTicks = !this.onlySummary_;
+
+ // Count library ticks
+ var flatViewNodes = flatView.head.children;
+ var self = this;
+
+ var libraryTicks = 0;
+ if(printAllTicks) this.printHeader('Shared libraries');
+ this.printEntries(flatViewNodes, totalTicks, null,
+ function(name) { return self.isSharedLibrary(name); },
+ function(rec) { libraryTicks += rec.selfTime; }, printAllTicks);
+ var nonLibraryTicks = totalTicks - libraryTicks;
+
+ var jsTicks = 0;
+ if(printAllTicks) this.printHeader('JavaScript');
+ this.printEntries(flatViewNodes, totalTicks, nonLibraryTicks,
+ function(name) { return self.isJsCode(name); },
+ function(rec) { jsTicks += rec.selfTime; }, printAllTicks);
+
+ var cppTicks = 0;
+ if(printAllTicks) this.printHeader('C++');
+ this.printEntries(flatViewNodes, totalTicks, nonLibraryTicks,
+ function(name) { return self.isCppCode(name); },
+ function(rec) { cppTicks += rec.selfTime; }, printAllTicks);
+
+ this.printHeader('Summary');
+ this.printLine('JavaScript', jsTicks, totalTicks, nonLibraryTicks);
+ this.printLine('C++', cppTicks, totalTicks, nonLibraryTicks);
+ this.printLine('GC', this.ticks_.gc, totalTicks, nonLibraryTicks);
+ this.printLine('Shared libraries', libraryTicks, totalTicks, null);
+ if (!this.ignoreUnknown_ && this.ticks_.unaccounted > 0) {
+ this.printLine('Unaccounted', this.ticks_.unaccounted,
+ this.ticks_.total, null);
+ }
+
+ if(printAllTicks) {
+ print('\n [C++ entry points]:');
+ print(' ticks cpp total name');
+ var c_entry_functions = this.profile_.getCEntryProfile();
+ var total_c_entry = c_entry_functions[0].ticks;
+ for (var i = 1; i < c_entry_functions.length; i++) {
+ const c = c_entry_functions[i];
+ this.printLine(c.name, c.ticks, total_c_entry, totalTicks);
+ }
+
+ this.printHeavyProfHeader();
+ var heavyProfile = this.profile_.getBottomUpProfile();
+ var heavyView = this.viewBuilder_.buildView(heavyProfile);
+ // To show the same percentages as in the flat profile.
+ heavyView.head.totalTime = totalTicks;
+ // Sort by total time, desc, then by name, desc.
+ heavyView.sort(function(rec1, rec2) {
+ return rec2.totalTime - rec1.totalTime ||
+ (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); });
+ this.printHeavyProfile(heavyView.head.children);
+ }
+};
+
+
+function padLeft(s, len) {
+ s = s.toString();
+ if (s.length < len) {
+ var padLength = len - s.length;
+ if (!(padLength in padLeft)) {
+ padLeft[padLength] = new Array(padLength + 1).join(' ');
+ }
+ s = padLeft[padLength] + s;
+ }
+ return s;
+};
+
+
+TickProcessor.prototype.printHeader = function(headerTitle) {
+ print('\n [' + headerTitle + ']:');
+ print(' ticks total nonlib name');
+};
+
+
+TickProcessor.prototype.printLine = function(
+ entry, ticks, totalTicks, nonLibTicks) {
+ var pct = ticks * 100 / totalTicks;
+ var nonLibPct = nonLibTicks != null
+ ? padLeft((ticks * 100 / nonLibTicks).toFixed(1), 5) + '% '
+ : ' ';
+ print(' ' + padLeft(ticks, 5) + ' ' +
+ padLeft(pct.toFixed(1), 5) + '% ' +
+ nonLibPct +
+ entry);
+}
+
+TickProcessor.prototype.printHeavyProfHeader = function() {
+ print('\n [Bottom up (heavy) profile]:');
+ print(' Note: percentage shows a share of a particular caller in the ' +
+ 'total\n' +
+ ' amount of its parent calls.');
+ print(' Callers occupying less than ' +
+ TickProcessor.CALL_PROFILE_CUTOFF_PCT.toFixed(1) +
+ '% are not shown.\n');
+ print(' ticks parent name');
+};
+
+
+TickProcessor.prototype.processProfile = function(
+ profile, filterP, func) {
+ for (var i = 0, n = profile.length; i < n; ++i) {
+ var rec = profile[i];
+ if (!filterP(rec.internalFuncName)) {
+ continue;
+ }
+ func(rec);
+ }
+};
+
+TickProcessor.prototype.getLineAndColumn = function(name) {
+ var re = /:([0-9]+):([0-9]+)$/;
+ var array = re.exec(name);
+ if (!array) {
+ return null;
+ }
+ return {line: array[1], column: array[2]};
+}
+
+TickProcessor.prototype.hasSourceMap = function() {
+ return this.sourceMap != null;
+};
+
+
+TickProcessor.prototype.formatFunctionName = function(funcName) {
+ if (!this.hasSourceMap()) {
+ return funcName;
+ }
+ var lc = this.getLineAndColumn(funcName);
+ if (lc == null) {
+ return funcName;
+ }
+ // in source maps lines and columns are zero based
+ var lineNumber = lc.line - 1;
+ var column = lc.column - 1;
+ var entry = this.sourceMap.findEntry(lineNumber, column);
+ var sourceFile = entry[2];
+ var sourceLine = entry[3] + 1;
+ var sourceColumn = entry[4] + 1;
+
+ return sourceFile + ':' + sourceLine + ':' + sourceColumn + ' -> ' + funcName;
+};
+
+TickProcessor.prototype.printEntries = function(
+ profile, totalTicks, nonLibTicks, filterP, callback, printAllTicks) {
+ var that = this;
+ this.processProfile(profile, filterP, function (rec) {
+ if (rec.selfTime == 0) return;
+ callback(rec);
+ var funcName = that.formatFunctionName(rec.internalFuncName);
+ if(printAllTicks) {
+ that.printLine(funcName, rec.selfTime, totalTicks, nonLibTicks);
+ }
+ });
+};
+
+
+TickProcessor.prototype.printHeavyProfile = function(profile, opt_indent) {
+ var self = this;
+ var indent = opt_indent || 0;
+ var indentStr = padLeft('', indent);
+ this.processProfile(profile, function() { return true; }, function (rec) {
+ // Cut off too infrequent callers.
+ if (rec.parentTotalPercent < TickProcessor.CALL_PROFILE_CUTOFF_PCT) return;
+ var funcName = self.formatFunctionName(rec.internalFuncName);
+ print(' ' + padLeft(rec.totalTime, 5) + ' ' +
+ padLeft(rec.parentTotalPercent.toFixed(1), 5) + '% ' +
+ indentStr + funcName);
+ // Limit backtrace depth.
+ if (indent < 2 * self.callGraphSize_) {
+ self.printHeavyProfile(rec.children, indent + 2);
+ }
+ // Delimit top-level functions.
+ if (indent == 0) {
+ print('');
+ }
+ });
+};
+
+
+function CppEntriesProvider() {
+};
+
+
+CppEntriesProvider.prototype.parseVmSymbols = function(
+ libName, libStart, libEnd, libASLRSlide, processorFunc) {
+ this.loadSymbols(libName);
+
+ var lastUnknownSize;
+ var lastAdded;
+
+ function inRange(funcInfo, start, end) {
+ return funcInfo.start >= start && funcInfo.end <= end;
+ }
+
+ function addEntry(funcInfo) {
+ // Several functions can be mapped onto the same address. To avoid
+ // creating zero-sized entries, skip such duplicates.
+ // Also double-check that function belongs to the library address space.
+
+ if (lastUnknownSize &&
+ lastUnknownSize.start < funcInfo.start) {
+ // Try to update lastUnknownSize based on new entries start position.
+ lastUnknownSize.end = funcInfo.start;
+ if ((!lastAdded || !inRange(lastUnknownSize, lastAdded.start,
+ lastAdded.end)) &&
+ inRange(lastUnknownSize, libStart, libEnd)) {
+ processorFunc(lastUnknownSize.name, lastUnknownSize.start,
+ lastUnknownSize.end);
+ lastAdded = lastUnknownSize;
+ }
+ }
+ lastUnknownSize = undefined;
+
+ if (funcInfo.end) {
+ // Skip duplicates that have the same start address as the last added.
+ if ((!lastAdded || lastAdded.start != funcInfo.start) &&
+ inRange(funcInfo, libStart, libEnd)) {
+ processorFunc(funcInfo.name, funcInfo.start, funcInfo.end);
+ lastAdded = funcInfo;
+ }
+ } else {
+ // If a funcInfo doesn't have an end, try to match it up with then next
+ // entry.
+ lastUnknownSize = funcInfo;
+ }
+ }
+
+ while (true) {
+ var funcInfo = this.parseNextLine();
+ if (funcInfo === null) {
+ continue;
+ } else if (funcInfo === false) {
+ break;
+ }
+ if (funcInfo.start < libStart - libASLRSlide &&
+ funcInfo.start < libEnd - libStart) {
+ funcInfo.start += libStart;
+ } else {
+ funcInfo.start += libASLRSlide;
+ }
+ if (funcInfo.size) {
+ funcInfo.end = funcInfo.start + funcInfo.size;
+ }
+ addEntry(funcInfo);
+ }
+ addEntry({name: '', start: libEnd});
+};
+
+
+CppEntriesProvider.prototype.loadSymbols = function(libName) {
+};
+
+
+CppEntriesProvider.prototype.parseNextLine = function() {
+ return false;
+};
+
+
+export function UnixCppEntriesProvider(nmExec, objdumpExec, targetRootFS, apkEmbeddedLibrary) {
+ this.symbols = [];
+ // File offset of a symbol minus the virtual address of a symbol found in
+ // the symbol table.
+ this.fileOffsetMinusVma = 0;
+ this.parsePos = 0;
+ this.nmExec = nmExec;
+ this.objdumpExec = objdumpExec;
+ this.targetRootFS = targetRootFS;
+ this.apkEmbeddedLibrary = apkEmbeddedLibrary;
+ this.FUNC_RE = /^([0-9a-fA-F]{8,16}) ([0-9a-fA-F]{8,16} )?[tTwW] (.*)$/;
+};
+inherits(UnixCppEntriesProvider, CppEntriesProvider);
+
+
+UnixCppEntriesProvider.prototype.loadSymbols = function(libName) {
+ this.parsePos = 0;
+ if (this.apkEmbeddedLibrary && libName.endsWith('.apk')) {
+ libName = this.apkEmbeddedLibrary;
+ }
+ if (this.targetRootFS) {
+ libName = libName.substring(libName.lastIndexOf('/') + 1);
+ libName = this.targetRootFS + libName;
+ }
+ try {
+ this.symbols = [
+ os.system(this.nmExec, ['-C', '-n', '-S', libName], -1, -1),
+ os.system(this.nmExec, ['-C', '-n', '-S', '-D', libName], -1, -1)
+ ];
+
+ const objdumpOutput = os.system(this.objdumpExec, ['-h', libName], -1, -1);
+ for (const line of objdumpOutput.split('\n')) {
+ const [,sectionName,,vma,,fileOffset] = line.trim().split(/\s+/);
+ if (sectionName === ".text") {
+ this.fileOffsetMinusVma = parseInt(fileOffset, 16) - parseInt(vma, 16);
+ }
+ }
+ } catch (e) {
+ // If the library cannot be found on this system let's not panic.
+ this.symbols = ['', ''];
+ }
+};
+
+
+UnixCppEntriesProvider.prototype.parseNextLine = function() {
+ if (this.symbols.length == 0) {
+ return false;
+ }
+ var lineEndPos = this.symbols[0].indexOf('\n', this.parsePos);
+ if (lineEndPos == -1) {
+ this.symbols.shift();
+ this.parsePos = 0;
+ return this.parseNextLine();
+ }
+
+ var line = this.symbols[0].substring(this.parsePos, lineEndPos);
+ this.parsePos = lineEndPos + 1;
+ var fields = line.match(this.FUNC_RE);
+ var funcInfo = null;
+ if (fields) {
+ funcInfo = { name: fields[3], start: parseInt(fields[1], 16) + this.fileOffsetMinusVma };
+ if (fields[2]) {
+ funcInfo.size = parseInt(fields[2], 16);
+ }
+ }
+ return funcInfo;
+};
+
+
+export function MacCppEntriesProvider(nmExec, objdumpExec, targetRootFS, apkEmbeddedLibrary) {
+ UnixCppEntriesProvider.call(this, nmExec, objdumpExec, targetRootFS, apkEmbeddedLibrary);
+ // Note an empty group. It is required, as UnixCppEntriesProvider expects 3 groups.
+ this.FUNC_RE = /^([0-9a-fA-F]{8,16})() (.*)$/;
+};
+inherits(MacCppEntriesProvider, UnixCppEntriesProvider);
+
+
+MacCppEntriesProvider.prototype.loadSymbols = function(libName) {
+ this.parsePos = 0;
+ libName = this.targetRootFS + libName;
+
+ // It seems that in OS X `nm` thinks that `-f` is a format option, not a
+ // "flat" display option flag.
+ try {
+ this.symbols = [os.system(this.nmExec, ['-n', libName], -1, -1), ''];
+ } catch (e) {
+ // If the library cannot be found on this system let's not panic.
+ this.symbols = '';
+ }
+};
+
+
+export function WindowsCppEntriesProvider(_ignored_nmExec, _ignored_objdumpExec, targetRootFS,
+ _ignored_apkEmbeddedLibrary) {
+ this.targetRootFS = targetRootFS;
+ this.symbols = '';
+ this.parsePos = 0;
+};
+inherits(WindowsCppEntriesProvider, CppEntriesProvider);
+
+
+WindowsCppEntriesProvider.FILENAME_RE = /^(.*)\.([^.]+)$/;
+
+
+WindowsCppEntriesProvider.FUNC_RE =
+ /^\s+0001:[0-9a-fA-F]{8}\s+([_\?@$0-9a-zA-Z]+)\s+([0-9a-fA-F]{8}).*$/;
+
+
+WindowsCppEntriesProvider.IMAGE_BASE_RE =
+ /^\s+0000:00000000\s+___ImageBase\s+([0-9a-fA-F]{8}).*$/;
+
+
+// This is almost a constant on Windows.
+WindowsCppEntriesProvider.EXE_IMAGE_BASE = 0x00400000;
+
+
+WindowsCppEntriesProvider.prototype.loadSymbols = function(libName) {
+ libName = this.targetRootFS + libName;
+ var fileNameFields = libName.match(WindowsCppEntriesProvider.FILENAME_RE);
+ if (!fileNameFields) return;
+ var mapFileName = fileNameFields[1] + '.map';
+ this.moduleType_ = fileNameFields[2].toLowerCase();
+ try {
+ this.symbols = read(mapFileName);
+ } catch (e) {
+ // If .map file cannot be found let's not panic.
+ this.symbols = '';
+ }
+};
+
+
+WindowsCppEntriesProvider.prototype.parseNextLine = function() {
+ var lineEndPos = this.symbols.indexOf('\r\n', this.parsePos);
+ if (lineEndPos == -1) {
+ return false;
+ }
+
+ var line = this.symbols.substring(this.parsePos, lineEndPos);
+ this.parsePos = lineEndPos + 2;
+
+ // Image base entry is above all other symbols, so we can just
+ // terminate parsing.
+ var imageBaseFields = line.match(WindowsCppEntriesProvider.IMAGE_BASE_RE);
+ if (imageBaseFields) {
+ var imageBase = parseInt(imageBaseFields[1], 16);
+ if ((this.moduleType_ == 'exe') !=
+ (imageBase == WindowsCppEntriesProvider.EXE_IMAGE_BASE)) {
+ return false;
+ }
+ }
+
+ var fields = line.match(WindowsCppEntriesProvider.FUNC_RE);
+ return fields ?
+ { name: this.unmangleName(fields[1]), start: parseInt(fields[2], 16) } :
+ null;
+};
+
+
+/**
+ * Performs very simple unmangling of C++ names.
+ *
+ * Does not handle arguments and template arguments. The mangled names have
+ * the form:
+ *
+ * ?LookupInDescriptor@JSObject@internal@v8@@...arguments info...
+ */
+WindowsCppEntriesProvider.prototype.unmangleName = function(name) {
+ // Empty or non-mangled name.
+ if (name.length < 1 || name.charAt(0) != '?') return name;
+ var nameEndPos = name.indexOf('@@');
+ var components = name.substring(1, nameEndPos).split('@');
+ components.reverse();
+ return components.join('::');
+};
+
+
+export class ArgumentsProcessor extends BaseArgumentsProcessor {
+ getArgsDispatch() {
+ let dispatch = {
+ '-j': ['stateFilter', TickProcessor.VmStates.JS,
+ 'Show only ticks from JS VM state'],
+ '-g': ['stateFilter', TickProcessor.VmStates.GC,
+ 'Show only ticks from GC VM state'],
+ '-p': ['stateFilter', TickProcessor.VmStates.PARSER,
+ 'Show only ticks from PARSER VM state'],
+ '-b': ['stateFilter', TickProcessor.VmStates.BYTECODE_COMPILER,
+ 'Show only ticks from BYTECODE_COMPILER VM state'],
+ '-c': ['stateFilter', TickProcessor.VmStates.COMPILER,
+ 'Show only ticks from COMPILER VM state'],
+ '-o': ['stateFilter', TickProcessor.VmStates.OTHER,
+ 'Show only ticks from OTHER VM state'],
+ '-e': ['stateFilter', TickProcessor.VmStates.EXTERNAL,
+ 'Show only ticks from EXTERNAL VM state'],
+ '--filter-runtime-timer': ['runtimeTimerFilter', null,
+ 'Show only ticks matching the given runtime timer scope'],
+ '--call-graph-size': ['callGraphSize', TickProcessor.CALL_GRAPH_SIZE,
+ 'Set the call graph size'],
+ '--ignore-unknown': ['ignoreUnknown', true,
+ 'Exclude ticks of unknown code entries from processing'],
+ '--separate-ic': ['separateIc', parseBool,
+ 'Separate IC entries'],
+ '--separate-bytecodes': ['separateBytecodes', parseBool,
+ 'Separate Bytecode entries'],
+ '--separate-builtins': ['separateBuiltins', parseBool,
+ 'Separate Builtin entries'],
+ '--separate-stubs': ['separateStubs', parseBool,
+ 'Separate Stub entries'],
+ '--unix': ['platform', 'unix',
+ 'Specify that we are running on *nix platform'],
+ '--windows': ['platform', 'windows',
+ 'Specify that we are running on Windows platform'],
+ '--mac': ['platform', 'mac',
+ 'Specify that we are running on Mac OS X platform'],
+ '--nm': ['nm', 'nm',
+ 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'],
+ '--objdump': ['objdump', 'objdump',
+ 'Specify the \'objdump\' executable to use (e.g. --objdump=/my_dir/objdump)'],
+ '--target': ['targetRootFS', '',
+ 'Specify the target root directory for cross environment'],
+ '--apk-embedded-library': ['apkEmbeddedLibrary', '',
+ 'Specify the path of the embedded library for Android traces'],
+ '--range': ['range', 'auto,auto',
+ 'Specify the range limit as [start],[end]'],
+ '--distortion': ['distortion', 0,
+ 'Specify the logging overhead in picoseconds'],
+ '--source-map': ['sourceMap', null,
+ 'Specify the source map that should be used for output'],
+ '--timed-range': ['timedRange', true,
+ 'Ignore ticks before first and after last Date.now() call'],
+ '--pairwise-timed-range': ['pairwiseTimedRange', true,
+ 'Ignore ticks outside pairs of Date.now() calls'],
+ '--only-summary': ['onlySummary', true,
+ 'Print only tick summary, exclude other information'],
+ '--preprocess': ['preprocessJson', true,
+ 'Preprocess for consumption with web interface']
+ };
+ dispatch['--js'] = dispatch['-j'];
+ dispatch['--gc'] = dispatch['-g'];
+ dispatch['--compiler'] = dispatch['-c'];
+ dispatch['--other'] = dispatch['-o'];
+ dispatch['--external'] = dispatch['-e'];
+ dispatch['--ptr'] = dispatch['--pairwise-timed-range'];
+ return dispatch;
+ }
+
+ getDefaultResults() {
+ return {
+ logFileName: 'v8.log',
+ platform: 'unix',
+ stateFilter: null,
+ callGraphSize: 5,
+ ignoreUnknown: false,
+ separateIc: true,
+ separateBytecodes: false,
+ separateBuiltins: true,
+ separateStubs: true,
+ preprocessJson: null,
+ targetRootFS: '',
+ nm: 'nm',
+ objdump: 'objdump',
+ range: 'auto,auto',
+ distortion: 0,
+ timedRange: false,
+ pairwiseTimedRange: false,
+ onlySummary: false,
+ runtimeTimerFilter: null,
+ };
+ }
+}
diff --git a/deps/v8/tools/trace-maps-processor.py b/deps/v8/tools/trace-maps-processor.py
deleted file mode 100755
index 4a29eab5db..0000000000
--- a/deps/v8/tools/trace-maps-processor.py
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# for py2/py3 compatibility
-from __future__ import print_function
-
-import sys
-
-
-action = sys.argv[1]
-
-if action in ["help", "-h", "--help"] or len(sys.argv) != 3:
- print("Usage: %s <action> <inputfile>, where action can be: \n"
- "help Print this message\n"
- "plain Print ASCII tree to stdout\n"
- "dot Print dot file to stdout\n"
- "count Count most frequent transition reasons\n" % sys.argv[0])
- sys.exit(0)
-
-
-filename = sys.argv[2]
-maps = {}
-root_maps = []
-transitions = {}
-annotations = {}
-
-
-class Map(object):
-
- def __init__(self, pointer, origin):
- self.pointer = pointer
- self.origin = origin
-
- def __str__(self):
- return "%s (%s)" % (self.pointer, self.origin)
-
-
-class Transition(object):
-
- def __init__(self, from_map, to_map, reason):
- self.from_map = from_map
- self.to_map = to_map
- self.reason = reason
-
-
-def RegisterNewMap(raw_map):
- if raw_map in annotations:
- annotations[raw_map] += 1
- else:
- annotations[raw_map] = 0
- return AnnotateExistingMap(raw_map)
-
-
-def AnnotateExistingMap(raw_map):
- return "%s_%d" % (raw_map, annotations[raw_map])
-
-
-def AddMap(pointer, origin):
- pointer = RegisterNewMap(pointer)
- maps[pointer] = Map(pointer, origin)
- return pointer
-
-
-def AddTransition(from_map, to_map, reason):
- from_map = AnnotateExistingMap(from_map)
- to_map = AnnotateExistingMap(to_map)
- if from_map not in transitions:
- transitions[from_map] = {}
- targets = transitions[from_map]
- if to_map in targets:
- # Some events get printed twice, that's OK. In some cases, ignore the
- # second output...
- old_reason = targets[to_map].reason
- if old_reason.startswith("ReplaceDescriptors"):
- return
- # ...and in others use it for additional detail.
- if reason in []:
- targets[to_map].reason = reason
- return
- # Unexpected duplicate events? Warn.
- print("// warning: already have a transition from %s to %s, reason: %s" %
- (from_map, to_map, targets[to_map].reason))
- return
- targets[to_map] = Transition(from_map, to_map, reason)
-
-
-with open(filename, "r") as f:
- last_to_map = ""
- for line in f:
- if not line.startswith("[TraceMaps: "): continue
- words = line.split(" ")
- event = words[1]
- if event == "InitialMap":
- assert words[2] == "map="
- assert words[4] == "SFI="
- new_map = AddMap(words[3], "SFI#%s" % words[5])
- root_maps.append(new_map)
- continue
- if words[2] == "from=" and words[4] == "to=":
- from_map = words[3]
- to_map = words[5]
- if from_map not in annotations:
- print("// warning: unknown from_map %s" % from_map)
- new_map = AddMap(from_map, "<unknown>")
- root_maps.append(new_map)
- if to_map != last_to_map:
- AddMap(to_map, "<transition> (%s)" % event)
- last_to_map = to_map
- if event in ["Transition", "NoTransition"]:
- assert words[6] == "name=", line
- reason = "%s: %s" % (event, words[7])
- elif event in ["Normalize", "ReplaceDescriptors", "SlowToFast"]:
- assert words[6] == "reason=", line
- reason = "%s: %s" % (event, words[7])
- if words[8].strip() != "]":
- reason = "%s_%s" % (reason, words[8])
- else:
- reason = event
- AddTransition(from_map, to_map, reason)
- continue
-
-
-def PlainPrint(m, indent, label):
- print("%s%s (%s)" % (indent, m, label))
- if m in transitions:
- for t in transitions[m]:
- PlainPrint(t, indent + " ", transitions[m][t].reason)
-
-
-def CountTransitions(m):
- if m not in transitions: return 0
- return len(transitions[m])
-
-
-def DotPrint(m, label):
- print("m%s [label=\"%s\"]" % (m[2:], label))
- if m in transitions:
- for t in transitions[m]:
- # GraphViz doesn't like node labels looking like numbers, so use
- # "m..." instead of "0x...".
- print("m%s -> m%s" % (m[2:], t[2:]))
- reason = transitions[m][t].reason
- reason = reason.replace("\\", "BACKSLASH")
- reason = reason.replace("\"", "\\\"")
- DotPrint(t, reason)
-
-
-if action == "plain":
- root_maps = sorted(root_maps, key=CountTransitions, reverse=True)
- for m in root_maps:
- PlainPrint(m, "", maps[m].origin)
-
-elif action == "dot":
- print("digraph g {")
- for m in root_maps:
- DotPrint(m, maps[m].origin)
- print("}")
-
-elif action == "count":
- reasons = {}
- for s in transitions:
- for t in transitions[s]:
- reason = transitions[s][t].reason
- if reason not in reasons:
- reasons[reason] = 1
- else:
- reasons[reason] += 1
- reasons_list = []
- for r in reasons:
- reasons_list.append("%8d %s" % (reasons[r], r))
- reasons_list.sort(reverse=True)
- for r in reasons_list[:20]:
- print(r)
diff --git a/deps/v8/tools/unittests/run_tests_test.py b/deps/v8/tools/unittests/run_tests_test.py
index 8b3275172d..4cd2bdefd5 100755
--- a/deps/v8/tools/unittests/run_tests_test.py
+++ b/deps/v8/tools/unittests/run_tests_test.py
@@ -177,7 +177,7 @@ class SystemTest(unittest.TestCase):
'sweet/bananas',
'sweet/raspberries',
)
- self.assertIn('Done running sweet/bananas default: pass', result.stdout, result)
+ self.assertIn('sweet/bananas default: pass', result.stdout, result)
# TODO(majeski): Implement for test processors
# self.assertIn('Total time:', result.stderr, result)
# self.assertIn('sweet/bananas', result.stderr, result)
@@ -199,10 +199,8 @@ class SystemTest(unittest.TestCase):
# One of the shards gets one variant of each test.
self.assertIn('2 tests ran', result.stdout, result)
if shard == 1:
- self.assertIn(
- 'Done running sweet/raspberries default', result.stdout, result)
- self.assertIn(
- 'Done running sweet/raspberries stress', result.stdout, result)
+ self.assertIn('sweet/raspberries default', result.stdout, result)
+ self.assertIn('sweet/raspberries stress', result.stdout, result)
self.assertEqual(0, result.returncode, result)
else:
self.assertIn(
@@ -227,8 +225,8 @@ class SystemTest(unittest.TestCase):
)
# One of the shards gets one variant of each test.
self.assertIn('Running 2 tests', result.stdout, result)
- self.assertIn('Done running sweet/bananas', result.stdout, result)
- self.assertIn('Done running sweet/raspberries', result.stdout, result)
+ self.assertIn('sweet/bananas', result.stdout, result)
+ self.assertIn('sweet/raspberries', result.stdout, result)
self.assertEqual(0, result.returncode, result)
def testFail(self):
@@ -241,7 +239,7 @@ class SystemTest(unittest.TestCase):
'sweet/strawberries',
infra_staging=False,
)
- self.assertIn('Done running sweet/strawberries default: FAIL', result.stdout, result)
+ self.assertIn('sweet/strawberries default: FAIL', result.stdout, result)
self.assertEqual(1, result.returncode, result)
def check_cleaned_json_output(
@@ -289,7 +287,7 @@ class SystemTest(unittest.TestCase):
'sweet/strawberries',
infra_staging=False,
)
- self.assertIn('Done running sweet/strawberries default: FAIL', result.stdout, result)
+ self.assertIn('sweet/strawberries default: FAIL', result.stdout, result)
# With test processors we don't count reruns as separated failures.
# TODO(majeski): fix it?
self.assertIn('1 tests failed', result.stdout, result)
@@ -317,8 +315,7 @@ class SystemTest(unittest.TestCase):
'sweet',
infra_staging=False,
)
- self.assertIn(
- 'Done running sweet/bananaflakes default: pass', result.stdout, result)
+ self.assertIn('sweet/bananaflakes default: pass', result.stdout, result)
self.assertIn('All tests succeeded', result.stdout, result)
self.assertEqual(0, result.returncode, result)
self.maxDiff = None
@@ -489,8 +486,7 @@ class SystemTest(unittest.TestCase):
infra_staging=False,
)
self.assertIn('1 tests ran', result.stdout, result)
- self.assertIn(
- 'Done running sweet/bananas default: FAIL', result.stdout, result)
+ self.assertIn('sweet/bananas default: FAIL', result.stdout, result)
self.assertIn('Test had no allocation output', result.stdout, result)
self.assertIn('--predictable --verify-predictable', result.stdout, result)
self.assertEqual(1, result.returncode, result)
@@ -624,7 +620,7 @@ class SystemTest(unittest.TestCase):
self.assertIn('sweet/strawberries default: FAIL', result.stdout, result)
self.assertIn('Too many failures, exiting...', result.stdout, result)
self.assertIn('sweet/blackberries default: FAIL', result.stdout, result)
- self.assertNotIn('Done running sweet/raspberries', result.stdout, result)
+ self.assertNotIn('sweet/raspberries', result.stdout, result)
self.assertIn('2 tests failed', result.stdout, result)
self.assertIn('3 tests ran', result.stdout, result)
self.assertEqual(1, result.returncode, result)
diff --git a/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json b/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json
index 8b294d9d52..8f8efc4f58 100644
--- a/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json
+++ b/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json
@@ -17,6 +17,7 @@
"v8_enable_i18n_support": true,
"v8_enable_verify_predictable": false,
"v8_target_cpu": "x64",
+ "v8_enable_concurrent_marking": true,
"v8_enable_verify_csa": false,
"v8_enable_lite_mode": false,
"v8_enable_pointer_compression": true
diff --git a/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json b/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json
index c375b30f79..7134998e1f 100644
--- a/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json
+++ b/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json
@@ -17,6 +17,7 @@
"v8_enable_i18n_support": true,
"v8_enable_verify_predictable": false,
"v8_target_cpu": "x64",
+ "v8_enable_concurrent_marking": true,
"v8_enable_verify_csa": false,
"v8_enable_lite_mode": false,
"v8_enable_pointer_compression": false
diff --git a/deps/v8/tools/v8heapconst.py b/deps/v8/tools/v8heapconst.py
index 31cc9d2a9a..d8e81c4909 100644
--- a/deps/v8/tools/v8heapconst.py
+++ b/deps/v8/tools/v8heapconst.py
@@ -205,97 +205,97 @@ INSTANCE_TYPES = {
# List of known V8 maps.
KNOWN_MAPS = {
- ("read_only_space", 0x02115): (167, "FreeSpaceMap"),
- ("read_only_space", 0x0213d): (170, "MetaMap"),
- ("read_only_space", 0x02181): (67, "NullMap"),
- ("read_only_space", 0x021b9): (162, "DescriptorArrayMap"),
- ("read_only_space", 0x021e9): (156, "WeakFixedArrayMap"),
- ("read_only_space", 0x02211): (166, "OnePointerFillerMap"),
- ("read_only_space", 0x02239): (166, "TwoPointerFillerMap"),
- ("read_only_space", 0x0227d): (67, "UninitializedMap"),
- ("read_only_space", 0x022c1): (8, "OneByteInternalizedStringMap"),
- ("read_only_space", 0x0231d): (67, "UndefinedMap"),
- ("read_only_space", 0x02351): (66, "HeapNumberMap"),
- ("read_only_space", 0x02395): (67, "TheHoleMap"),
- ("read_only_space", 0x023f5): (67, "BooleanMap"),
- ("read_only_space", 0x0247d): (131, "ByteArrayMap"),
- ("read_only_space", 0x024a5): (117, "FixedArrayMap"),
- ("read_only_space", 0x024cd): (117, "FixedCOWArrayMap"),
- ("read_only_space", 0x024f5): (118, "HashTableMap"),
- ("read_only_space", 0x0251d): (64, "SymbolMap"),
- ("read_only_space", 0x02545): (40, "OneByteStringMap"),
- ("read_only_space", 0x0256d): (129, "ScopeInfoMap"),
- ("read_only_space", 0x02595): (175, "SharedFunctionInfoMap"),
- ("read_only_space", 0x025bd): (159, "CodeMap"),
- ("read_only_space", 0x025e5): (158, "CellMap"),
- ("read_only_space", 0x0260d): (174, "GlobalPropertyCellMap"),
- ("read_only_space", 0x02635): (70, "ForeignMap"),
- ("read_only_space", 0x0265d): (157, "TransitionArrayMap"),
- ("read_only_space", 0x02685): (45, "ThinOneByteStringMap"),
- ("read_only_space", 0x026ad): (165, "FeedbackVectorMap"),
- ("read_only_space", 0x02701): (67, "ArgumentsMarkerMap"),
- ("read_only_space", 0x02761): (67, "ExceptionMap"),
- ("read_only_space", 0x027bd): (67, "TerminationExceptionMap"),
- ("read_only_space", 0x02825): (67, "OptimizedOutMap"),
- ("read_only_space", 0x02885): (67, "StaleRegisterMap"),
- ("read_only_space", 0x028c9): (130, "ScriptContextTableMap"),
- ("read_only_space", 0x028f1): (127, "ClosureFeedbackCellArrayMap"),
- ("read_only_space", 0x02919): (164, "FeedbackMetadataArrayMap"),
- ("read_only_space", 0x02941): (117, "ArrayListMap"),
- ("read_only_space", 0x02969): (65, "BigIntMap"),
- ("read_only_space", 0x02991): (128, "ObjectBoilerplateDescriptionMap"),
- ("read_only_space", 0x029b9): (132, "BytecodeArrayMap"),
- ("read_only_space", 0x029e1): (160, "CodeDataContainerMap"),
- ("read_only_space", 0x02a09): (161, "CoverageInfoMap"),
- ("read_only_space", 0x02a31): (133, "FixedDoubleArrayMap"),
- ("read_only_space", 0x02a59): (120, "GlobalDictionaryMap"),
- ("read_only_space", 0x02a81): (97, "ManyClosuresCellMap"),
- ("read_only_space", 0x02aa9): (117, "ModuleInfoMap"),
- ("read_only_space", 0x02ad1): (121, "NameDictionaryMap"),
- ("read_only_space", 0x02af9): (97, "NoClosuresCellMap"),
- ("read_only_space", 0x02b21): (122, "NumberDictionaryMap"),
- ("read_only_space", 0x02b49): (97, "OneClosureCellMap"),
- ("read_only_space", 0x02b71): (123, "OrderedHashMapMap"),
- ("read_only_space", 0x02b99): (124, "OrderedHashSetMap"),
- ("read_only_space", 0x02bc1): (125, "OrderedNameDictionaryMap"),
- ("read_only_space", 0x02be9): (172, "PreparseDataMap"),
- ("read_only_space", 0x02c11): (173, "PropertyArrayMap"),
- ("read_only_space", 0x02c39): (93, "SideEffectCallHandlerInfoMap"),
- ("read_only_space", 0x02c61): (93, "SideEffectFreeCallHandlerInfoMap"),
- ("read_only_space", 0x02c89): (93, "NextCallSideEffectFreeCallHandlerInfoMap"),
- ("read_only_space", 0x02cb1): (126, "SimpleNumberDictionaryMap"),
- ("read_only_space", 0x02cd9): (149, "SmallOrderedHashMapMap"),
- ("read_only_space", 0x02d01): (150, "SmallOrderedHashSetMap"),
- ("read_only_space", 0x02d29): (151, "SmallOrderedNameDictionaryMap"),
- ("read_only_space", 0x02d51): (152, "SourceTextModuleMap"),
- ("read_only_space", 0x02d79): (153, "SyntheticModuleMap"),
- ("read_only_space", 0x02da1): (155, "UncompiledDataWithoutPreparseDataMap"),
- ("read_only_space", 0x02dc9): (154, "UncompiledDataWithPreparseDataMap"),
- ("read_only_space", 0x02df1): (71, "WasmTypeInfoMap"),
- ("read_only_space", 0x02e19): (181, "WeakArrayListMap"),
- ("read_only_space", 0x02e41): (119, "EphemeronHashTableMap"),
- ("read_only_space", 0x02e69): (163, "EmbedderDataArrayMap"),
- ("read_only_space", 0x02e91): (182, "WeakCellMap"),
- ("read_only_space", 0x02eb9): (32, "StringMap"),
- ("read_only_space", 0x02ee1): (41, "ConsOneByteStringMap"),
- ("read_only_space", 0x02f09): (33, "ConsStringMap"),
- ("read_only_space", 0x02f31): (37, "ThinStringMap"),
- ("read_only_space", 0x02f59): (35, "SlicedStringMap"),
- ("read_only_space", 0x02f81): (43, "SlicedOneByteStringMap"),
- ("read_only_space", 0x02fa9): (34, "ExternalStringMap"),
- ("read_only_space", 0x02fd1): (42, "ExternalOneByteStringMap"),
- ("read_only_space", 0x02ff9): (50, "UncachedExternalStringMap"),
- ("read_only_space", 0x03021): (0, "InternalizedStringMap"),
- ("read_only_space", 0x03049): (2, "ExternalInternalizedStringMap"),
- ("read_only_space", 0x03071): (10, "ExternalOneByteInternalizedStringMap"),
- ("read_only_space", 0x03099): (18, "UncachedExternalInternalizedStringMap"),
- ("read_only_space", 0x030c1): (26, "UncachedExternalOneByteInternalizedStringMap"),
- ("read_only_space", 0x030e9): (58, "UncachedExternalOneByteStringMap"),
- ("read_only_space", 0x03111): (67, "SelfReferenceMarkerMap"),
- ("read_only_space", 0x03139): (67, "BasicBlockCountersMarkerMap"),
- ("read_only_space", 0x0316d): (96, "EnumCacheMap"),
- ("read_only_space", 0x031bd): (87, "ArrayBoilerplateDescriptionMap"),
- ("read_only_space", 0x032a9): (99, "InterceptorInfoMap"),
+ ("read_only_space", 0x02115): (170, "MetaMap"),
+ ("read_only_space", 0x0213d): (67, "NullMap"),
+ ("read_only_space", 0x02165): (162, "DescriptorArrayMap"),
+ ("read_only_space", 0x0218d): (156, "WeakFixedArrayMap"),
+ ("read_only_space", 0x021cd): (96, "EnumCacheMap"),
+ ("read_only_space", 0x02201): (117, "FixedArrayMap"),
+ ("read_only_space", 0x0224d): (8, "OneByteInternalizedStringMap"),
+ ("read_only_space", 0x02299): (167, "FreeSpaceMap"),
+ ("read_only_space", 0x022c1): (166, "OnePointerFillerMap"),
+ ("read_only_space", 0x022e9): (166, "TwoPointerFillerMap"),
+ ("read_only_space", 0x02311): (67, "UninitializedMap"),
+ ("read_only_space", 0x02389): (67, "UndefinedMap"),
+ ("read_only_space", 0x023cd): (66, "HeapNumberMap"),
+ ("read_only_space", 0x02401): (67, "TheHoleMap"),
+ ("read_only_space", 0x02461): (67, "BooleanMap"),
+ ("read_only_space", 0x02505): (131, "ByteArrayMap"),
+ ("read_only_space", 0x0252d): (117, "FixedCOWArrayMap"),
+ ("read_only_space", 0x02555): (118, "HashTableMap"),
+ ("read_only_space", 0x0257d): (64, "SymbolMap"),
+ ("read_only_space", 0x025a5): (40, "OneByteStringMap"),
+ ("read_only_space", 0x025cd): (129, "ScopeInfoMap"),
+ ("read_only_space", 0x025f5): (175, "SharedFunctionInfoMap"),
+ ("read_only_space", 0x0261d): (159, "CodeMap"),
+ ("read_only_space", 0x02645): (158, "CellMap"),
+ ("read_only_space", 0x0266d): (174, "GlobalPropertyCellMap"),
+ ("read_only_space", 0x02695): (70, "ForeignMap"),
+ ("read_only_space", 0x026bd): (157, "TransitionArrayMap"),
+ ("read_only_space", 0x026e5): (45, "ThinOneByteStringMap"),
+ ("read_only_space", 0x0270d): (165, "FeedbackVectorMap"),
+ ("read_only_space", 0x0273d): (67, "ArgumentsMarkerMap"),
+ ("read_only_space", 0x0279d): (67, "ExceptionMap"),
+ ("read_only_space", 0x027f9): (67, "TerminationExceptionMap"),
+ ("read_only_space", 0x02861): (67, "OptimizedOutMap"),
+ ("read_only_space", 0x028c1): (67, "StaleRegisterMap"),
+ ("read_only_space", 0x02921): (130, "ScriptContextTableMap"),
+ ("read_only_space", 0x02949): (127, "ClosureFeedbackCellArrayMap"),
+ ("read_only_space", 0x02971): (164, "FeedbackMetadataArrayMap"),
+ ("read_only_space", 0x02999): (117, "ArrayListMap"),
+ ("read_only_space", 0x029c1): (65, "BigIntMap"),
+ ("read_only_space", 0x029e9): (128, "ObjectBoilerplateDescriptionMap"),
+ ("read_only_space", 0x02a11): (132, "BytecodeArrayMap"),
+ ("read_only_space", 0x02a39): (160, "CodeDataContainerMap"),
+ ("read_only_space", 0x02a61): (161, "CoverageInfoMap"),
+ ("read_only_space", 0x02a89): (133, "FixedDoubleArrayMap"),
+ ("read_only_space", 0x02ab1): (120, "GlobalDictionaryMap"),
+ ("read_only_space", 0x02ad9): (97, "ManyClosuresCellMap"),
+ ("read_only_space", 0x02b01): (117, "ModuleInfoMap"),
+ ("read_only_space", 0x02b29): (121, "NameDictionaryMap"),
+ ("read_only_space", 0x02b51): (97, "NoClosuresCellMap"),
+ ("read_only_space", 0x02b79): (122, "NumberDictionaryMap"),
+ ("read_only_space", 0x02ba1): (97, "OneClosureCellMap"),
+ ("read_only_space", 0x02bc9): (123, "OrderedHashMapMap"),
+ ("read_only_space", 0x02bf1): (124, "OrderedHashSetMap"),
+ ("read_only_space", 0x02c19): (125, "OrderedNameDictionaryMap"),
+ ("read_only_space", 0x02c41): (172, "PreparseDataMap"),
+ ("read_only_space", 0x02c69): (173, "PropertyArrayMap"),
+ ("read_only_space", 0x02c91): (93, "SideEffectCallHandlerInfoMap"),
+ ("read_only_space", 0x02cb9): (93, "SideEffectFreeCallHandlerInfoMap"),
+ ("read_only_space", 0x02ce1): (93, "NextCallSideEffectFreeCallHandlerInfoMap"),
+ ("read_only_space", 0x02d09): (126, "SimpleNumberDictionaryMap"),
+ ("read_only_space", 0x02d31): (149, "SmallOrderedHashMapMap"),
+ ("read_only_space", 0x02d59): (150, "SmallOrderedHashSetMap"),
+ ("read_only_space", 0x02d81): (151, "SmallOrderedNameDictionaryMap"),
+ ("read_only_space", 0x02da9): (152, "SourceTextModuleMap"),
+ ("read_only_space", 0x02dd1): (153, "SyntheticModuleMap"),
+ ("read_only_space", 0x02df9): (155, "UncompiledDataWithoutPreparseDataMap"),
+ ("read_only_space", 0x02e21): (154, "UncompiledDataWithPreparseDataMap"),
+ ("read_only_space", 0x02e49): (71, "WasmTypeInfoMap"),
+ ("read_only_space", 0x02e71): (181, "WeakArrayListMap"),
+ ("read_only_space", 0x02e99): (119, "EphemeronHashTableMap"),
+ ("read_only_space", 0x02ec1): (163, "EmbedderDataArrayMap"),
+ ("read_only_space", 0x02ee9): (182, "WeakCellMap"),
+ ("read_only_space", 0x02f11): (32, "StringMap"),
+ ("read_only_space", 0x02f39): (41, "ConsOneByteStringMap"),
+ ("read_only_space", 0x02f61): (33, "ConsStringMap"),
+ ("read_only_space", 0x02f89): (37, "ThinStringMap"),
+ ("read_only_space", 0x02fb1): (35, "SlicedStringMap"),
+ ("read_only_space", 0x02fd9): (43, "SlicedOneByteStringMap"),
+ ("read_only_space", 0x03001): (34, "ExternalStringMap"),
+ ("read_only_space", 0x03029): (42, "ExternalOneByteStringMap"),
+ ("read_only_space", 0x03051): (50, "UncachedExternalStringMap"),
+ ("read_only_space", 0x03079): (0, "InternalizedStringMap"),
+ ("read_only_space", 0x030a1): (2, "ExternalInternalizedStringMap"),
+ ("read_only_space", 0x030c9): (10, "ExternalOneByteInternalizedStringMap"),
+ ("read_only_space", 0x030f1): (18, "UncachedExternalInternalizedStringMap"),
+ ("read_only_space", 0x03119): (26, "UncachedExternalOneByteInternalizedStringMap"),
+ ("read_only_space", 0x03141): (58, "UncachedExternalOneByteStringMap"),
+ ("read_only_space", 0x03169): (67, "SelfReferenceMarkerMap"),
+ ("read_only_space", 0x03191): (67, "BasicBlockCountersMarkerMap"),
+ ("read_only_space", 0x031d5): (87, "ArrayBoilerplateDescriptionMap"),
+ ("read_only_space", 0x032a5): (99, "InterceptorInfoMap"),
("read_only_space", 0x05399): (72, "PromiseFulfillReactionJobTaskMap"),
("read_only_space", 0x053c1): (73, "PromiseRejectReactionJobTaskMap"),
("read_only_space", 0x053e9): (74, "CallableTaskMap"),
@@ -365,50 +365,50 @@ KNOWN_MAPS = {
# List of known V8 objects.
KNOWN_OBJECTS = {
- ("read_only_space", 0x02165): "NullValue",
- ("read_only_space", 0x021a9): "EmptyDescriptorArray",
- ("read_only_space", 0x021e1): "EmptyWeakFixedArray",
- ("read_only_space", 0x02261): "UninitializedValue",
- ("read_only_space", 0x02301): "UndefinedValue",
- ("read_only_space", 0x02345): "NanValue",
- ("read_only_space", 0x02379): "TheHoleValue",
- ("read_only_space", 0x023cd): "HoleNanValue",
- ("read_only_space", 0x023d9): "TrueValue",
- ("read_only_space", 0x02441): "FalseValue",
- ("read_only_space", 0x02471): "empty_string",
- ("read_only_space", 0x026d5): "EmptyScopeInfo",
- ("read_only_space", 0x026dd): "EmptyFixedArray",
- ("read_only_space", 0x026e5): "ArgumentsMarker",
- ("read_only_space", 0x02745): "Exception",
- ("read_only_space", 0x027a1): "TerminationException",
- ("read_only_space", 0x02809): "OptimizedOut",
- ("read_only_space", 0x02869): "StaleRegister",
- ("read_only_space", 0x03161): "EmptyEnumCache",
- ("read_only_space", 0x03195): "EmptyPropertyArray",
- ("read_only_space", 0x0319d): "EmptyByteArray",
- ("read_only_space", 0x031a5): "EmptyObjectBoilerplateDescription",
- ("read_only_space", 0x031b1): "EmptyArrayBoilerplateDescription",
- ("read_only_space", 0x031e5): "EmptyClosureFeedbackCellArray",
- ("read_only_space", 0x031ed): "EmptySlowElementDictionary",
- ("read_only_space", 0x03211): "EmptyOrderedHashMap",
- ("read_only_space", 0x03225): "EmptyOrderedHashSet",
- ("read_only_space", 0x03239): "EmptyFeedbackMetadata",
- ("read_only_space", 0x03245): "EmptyPropertyCell",
- ("read_only_space", 0x03259): "EmptyPropertyDictionary",
- ("read_only_space", 0x03281): "NoOpInterceptorInfo",
- ("read_only_space", 0x032d1): "EmptyWeakArrayList",
- ("read_only_space", 0x032dd): "InfinityValue",
- ("read_only_space", 0x032e9): "MinusZeroValue",
- ("read_only_space", 0x032f5): "MinusInfinityValue",
- ("read_only_space", 0x03301): "SelfReferenceMarker",
- ("read_only_space", 0x03341): "BasicBlockCountersMarker",
- ("read_only_space", 0x03385): "OffHeapTrampolineRelocationInfo",
- ("read_only_space", 0x03391): "TrampolineTrivialCodeDataContainer",
- ("read_only_space", 0x0339d): "TrampolinePromiseRejectionCodeDataContainer",
- ("read_only_space", 0x033a9): "GlobalThisBindingScopeInfo",
- ("read_only_space", 0x033e1): "EmptyFunctionScopeInfo",
- ("read_only_space", 0x03409): "NativeScopeInfo",
- ("read_only_space", 0x03425): "HashSeed",
+ ("read_only_space", 0x021b5): "EmptyWeakFixedArray",
+ ("read_only_space", 0x021bd): "EmptyDescriptorArray",
+ ("read_only_space", 0x021f5): "EmptyEnumCache",
+ ("read_only_space", 0x02229): "EmptyFixedArray",
+ ("read_only_space", 0x02231): "NullValue",
+ ("read_only_space", 0x02339): "UninitializedValue",
+ ("read_only_space", 0x023b1): "UndefinedValue",
+ ("read_only_space", 0x023f5): "NanValue",
+ ("read_only_space", 0x02429): "TheHoleValue",
+ ("read_only_space", 0x02455): "HoleNanValue",
+ ("read_only_space", 0x02489): "TrueValue",
+ ("read_only_space", 0x024c9): "FalseValue",
+ ("read_only_space", 0x024f9): "empty_string",
+ ("read_only_space", 0x02735): "EmptyScopeInfo",
+ ("read_only_space", 0x02765): "ArgumentsMarker",
+ ("read_only_space", 0x027c5): "Exception",
+ ("read_only_space", 0x02821): "TerminationException",
+ ("read_only_space", 0x02889): "OptimizedOut",
+ ("read_only_space", 0x028e9): "StaleRegister",
+ ("read_only_space", 0x031b9): "EmptyPropertyArray",
+ ("read_only_space", 0x031c1): "EmptyByteArray",
+ ("read_only_space", 0x031c9): "EmptyObjectBoilerplateDescription",
+ ("read_only_space", 0x031fd): "EmptyArrayBoilerplateDescription",
+ ("read_only_space", 0x03209): "EmptyClosureFeedbackCellArray",
+ ("read_only_space", 0x03211): "EmptySlowElementDictionary",
+ ("read_only_space", 0x03235): "EmptyOrderedHashMap",
+ ("read_only_space", 0x03249): "EmptyOrderedHashSet",
+ ("read_only_space", 0x0325d): "EmptyFeedbackMetadata",
+ ("read_only_space", 0x03269): "EmptyPropertyCell",
+ ("read_only_space", 0x0327d): "EmptyPropertyDictionary",
+ ("read_only_space", 0x032cd): "NoOpInterceptorInfo",
+ ("read_only_space", 0x032f5): "EmptyWeakArrayList",
+ ("read_only_space", 0x03301): "InfinityValue",
+ ("read_only_space", 0x0330d): "MinusZeroValue",
+ ("read_only_space", 0x03319): "MinusInfinityValue",
+ ("read_only_space", 0x03325): "SelfReferenceMarker",
+ ("read_only_space", 0x03365): "BasicBlockCountersMarker",
+ ("read_only_space", 0x033a9): "OffHeapTrampolineRelocationInfo",
+ ("read_only_space", 0x033b5): "TrampolineTrivialCodeDataContainer",
+ ("read_only_space", 0x033c1): "TrampolinePromiseRejectionCodeDataContainer",
+ ("read_only_space", 0x033cd): "GlobalThisBindingScopeInfo",
+ ("read_only_space", 0x03405): "EmptyFunctionScopeInfo",
+ ("read_only_space", 0x0342d): "NativeScopeInfo",
+ ("read_only_space", 0x03449): "HashSeed",
("old_space", 0x02115): "ArgumentsIteratorAccessor",
("old_space", 0x02159): "ArrayLengthAccessor",
("old_space", 0x0219d): "BoundFunctionLengthAccessor",
@@ -444,27 +444,27 @@ KNOWN_OBJECTS = {
("old_space", 0x02a61): "StringSplitCache",
("old_space", 0x02e69): "RegExpMultipleCache",
("old_space", 0x03271): "BuiltinsConstantsTable",
- ("old_space", 0x03645): "AsyncFunctionAwaitRejectSharedFun",
- ("old_space", 0x0366d): "AsyncFunctionAwaitResolveSharedFun",
- ("old_space", 0x03695): "AsyncGeneratorAwaitRejectSharedFun",
- ("old_space", 0x036bd): "AsyncGeneratorAwaitResolveSharedFun",
- ("old_space", 0x036e5): "AsyncGeneratorYieldResolveSharedFun",
- ("old_space", 0x0370d): "AsyncGeneratorReturnResolveSharedFun",
- ("old_space", 0x03735): "AsyncGeneratorReturnClosedRejectSharedFun",
- ("old_space", 0x0375d): "AsyncGeneratorReturnClosedResolveSharedFun",
- ("old_space", 0x03785): "AsyncIteratorValueUnwrapSharedFun",
- ("old_space", 0x037ad): "PromiseAllResolveElementSharedFun",
- ("old_space", 0x037d5): "PromiseAllSettledResolveElementSharedFun",
- ("old_space", 0x037fd): "PromiseAllSettledRejectElementSharedFun",
- ("old_space", 0x03825): "PromiseAnyRejectElementSharedFun",
- ("old_space", 0x0384d): "PromiseCapabilityDefaultRejectSharedFun",
- ("old_space", 0x03875): "PromiseCapabilityDefaultResolveSharedFun",
- ("old_space", 0x0389d): "PromiseCatchFinallySharedFun",
- ("old_space", 0x038c5): "PromiseGetCapabilitiesExecutorSharedFun",
- ("old_space", 0x038ed): "PromiseThenFinallySharedFun",
- ("old_space", 0x03915): "PromiseThrowerFinallySharedFun",
- ("old_space", 0x0393d): "PromiseValueThunkFinallySharedFun",
- ("old_space", 0x03965): "ProxyRevokeSharedFun",
+ ("old_space", 0x0364d): "AsyncFunctionAwaitRejectSharedFun",
+ ("old_space", 0x03675): "AsyncFunctionAwaitResolveSharedFun",
+ ("old_space", 0x0369d): "AsyncGeneratorAwaitRejectSharedFun",
+ ("old_space", 0x036c5): "AsyncGeneratorAwaitResolveSharedFun",
+ ("old_space", 0x036ed): "AsyncGeneratorYieldResolveSharedFun",
+ ("old_space", 0x03715): "AsyncGeneratorReturnResolveSharedFun",
+ ("old_space", 0x0373d): "AsyncGeneratorReturnClosedRejectSharedFun",
+ ("old_space", 0x03765): "AsyncGeneratorReturnClosedResolveSharedFun",
+ ("old_space", 0x0378d): "AsyncIteratorValueUnwrapSharedFun",
+ ("old_space", 0x037b5): "PromiseAllResolveElementSharedFun",
+ ("old_space", 0x037dd): "PromiseAllSettledResolveElementSharedFun",
+ ("old_space", 0x03805): "PromiseAllSettledRejectElementSharedFun",
+ ("old_space", 0x0382d): "PromiseAnyRejectElementSharedFun",
+ ("old_space", 0x03855): "PromiseCapabilityDefaultRejectSharedFun",
+ ("old_space", 0x0387d): "PromiseCapabilityDefaultResolveSharedFun",
+ ("old_space", 0x038a5): "PromiseCatchFinallySharedFun",
+ ("old_space", 0x038cd): "PromiseGetCapabilitiesExecutorSharedFun",
+ ("old_space", 0x038f5): "PromiseThenFinallySharedFun",
+ ("old_space", 0x0391d): "PromiseThrowerFinallySharedFun",
+ ("old_space", 0x03945): "PromiseValueThunkFinallySharedFun",
+ ("old_space", 0x0396d): "ProxyRevokeSharedFun",
}
# Lower 32 bits of first page addresses for various heap spaces.
diff --git a/deps/v8/tools/v8windbg/OWNERS b/deps/v8/tools/v8windbg/OWNERS
new file mode 100644
index 0000000000..01f6b8db39
--- /dev/null
+++ b/deps/v8/tools/v8windbg/OWNERS
@@ -0,0 +1 @@
+seth.brenith@microsoft.com
diff --git a/deps/v8/tools/v8windbg/src/local-variables.cc b/deps/v8/tools/v8windbg/src/local-variables.cc
index 20814cf28a..e00d06b595 100644
--- a/deps/v8/tools/v8windbg/src/local-variables.cc
+++ b/deps/v8/tools/v8windbg/src/local-variables.cc
@@ -4,7 +4,11 @@
#include "tools/v8windbg/src/local-variables.h"
+#include <vector>
+
#include "tools/v8windbg/base/utilities.h"
+#include "tools/v8windbg/src/object-inspection.h"
+#include "tools/v8windbg/src/v8-debug-helper-interop.h"
#include "tools/v8windbg/src/v8windbg-extension.h"
V8LocalVariables::V8LocalVariables(WRL::ComPtr<IModelPropertyAccessor> original,
@@ -110,6 +114,14 @@ IFACEMETHODIMP V8LocalVariables::GetValue(PCWSTR key, IModelObject* context,
RETURN_IF_FAIL(
result->SetKey(L"memory interpreted as Objects", array.Get(), nullptr));
+ std::vector<Property> properties = GetStackFrame(host_context, frame_offset);
+ for (const auto& prop : properties) {
+ WRL::ComPtr<IModelObject> property;
+ RETURN_IF_FAIL(GetModelForProperty(prop, host_context, &property));
+ result->SetKey(reinterpret_cast<const wchar_t*>(prop.name.c_str()),
+ property.Get(), nullptr);
+ }
+
*value = result.Detach();
return S_OK;
}
diff --git a/deps/v8/tools/v8windbg/src/object-inspection.cc b/deps/v8/tools/v8windbg/src/object-inspection.cc
index 6f90614bd5..b206dfa792 100644
--- a/deps/v8/tools/v8windbg/src/object-inspection.cc
+++ b/deps/v8/tools/v8windbg/src/object-inspection.cc
@@ -330,31 +330,6 @@ HRESULT GetModelForCustomArray(const Property& prop,
context_data.Get(), result);
}
-// Creates an IModelObject representing the data in the given property.
-HRESULT GetModelForProperty(const Property& prop,
- WRL::ComPtr<IDebugHostContext>& sp_ctx,
- IModelObject** result) {
- switch (prop.type) {
- case PropertyType::kPointer:
- return GetModelForBasicField(prop.addr_value, prop.type_name,
- prop.uncompressed_type_name, sp_ctx, result);
- case PropertyType::kStruct:
- return GetModelForStruct(prop.addr_value, prop.fields, sp_ctx, result);
- case PropertyType::kArray:
- case PropertyType::kStructArray:
- if (prop.type == PropertyType::kArray &&
- prop.type_name == ConvertToU16String(prop.uncompressed_type_name)) {
- // An array of things that are not structs or compressed tagged values
- // is most cleanly represented by a native array.
- return GetModelForNativeArray(prop.addr_value, prop.type_name,
- prop.length, sp_ctx, result);
- }
- // Otherwise, we must construct a custom iterable object.
- return GetModelForCustomArray(prop, sp_ctx, result);
- default:
- return E_FAIL;
- }
-}
// Creates an IModelObject representing the data in an array at the given index.
// context_object is expected to be an object of the form created by
@@ -693,3 +668,29 @@ IFACEMETHODIMP InspectV8ObjectMethod::Call(IModelObject* p_context_object,
return CreateSyntheticObjectForV8Object(sp_ctx.Get(), cached_object.Get(),
pp_result);
}
+
+// Creates an IModelObject representing the data in the given property.
+HRESULT GetModelForProperty(const Property& prop,
+ WRL::ComPtr<IDebugHostContext>& sp_ctx,
+ IModelObject** result) {
+ switch (prop.type) {
+ case PropertyType::kPointer:
+ return GetModelForBasicField(prop.addr_value, prop.type_name,
+ prop.uncompressed_type_name, sp_ctx, result);
+ case PropertyType::kStruct:
+ return GetModelForStruct(prop.addr_value, prop.fields, sp_ctx, result);
+ case PropertyType::kArray:
+ case PropertyType::kStructArray:
+ if (prop.type == PropertyType::kArray &&
+ prop.type_name == ConvertToU16String(prop.uncompressed_type_name)) {
+ // An array of things that are not structs or compressed tagged values
+ // is most cleanly represented by a native array.
+ return GetModelForNativeArray(prop.addr_value, prop.type_name,
+ prop.length, sp_ctx, result);
+ }
+ // Otherwise, we must construct a custom iterable object.
+ return GetModelForCustomArray(prop, sp_ctx, result);
+ default:
+ return E_FAIL;
+ }
+}
diff --git a/deps/v8/tools/v8windbg/src/object-inspection.h b/deps/v8/tools/v8windbg/src/object-inspection.h
index a280b05cad..238d8610c7 100644
--- a/deps/v8/tools/v8windbg/src/object-inspection.h
+++ b/deps/v8/tools/v8windbg/src/object-inspection.h
@@ -290,4 +290,8 @@ class InspectV8ObjectMethod
IKeyStore** pp_metadata);
};
+HRESULT GetModelForProperty(const Property& prop,
+ WRL::ComPtr<IDebugHostContext>& sp_ctx,
+ IModelObject** result);
+
#endif // V8_TOOLS_V8WINDBG_SRC_OBJECT_INSPECTION_H_
diff --git a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc
index 0767ff5f09..74d0a9df26 100644
--- a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc
+++ b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc
@@ -29,7 +29,7 @@ class MemReaderScope {
private:
MemReaderScope(const MemReaderScope&) = delete;
MemReaderScope& operator=(const MemReaderScope&) = delete;
- static d::MemoryAccessResult Read(uintptr_t address, uint8_t* destination,
+ static d::MemoryAccessResult Read(uintptr_t address, void* destination,
size_t byte_count) {
ULONG64 bytes_read;
Location loc{address};
@@ -81,26 +81,12 @@ V8HeapObject::V8HeapObject(V8HeapObject&&) = default;
V8HeapObject& V8HeapObject::operator=(const V8HeapObject&) = default;
V8HeapObject& V8HeapObject::operator=(V8HeapObject&&) = default;
-V8HeapObject GetHeapObject(WRL::ComPtr<IDebugHostContext> sp_context,
- uint64_t tagged_ptr, uint64_t referring_pointer,
- const char* type_name, bool is_compressed) {
- // Read the value at the address, and see if it is a tagged pointer
-
- V8HeapObject obj;
- MemReaderScope reader_scope(sp_context);
-
- d::HeapAddresses heap_addresses = {0, 0, 0, 0};
- // TODO ideally we'd provide real heap page pointers. For now, just testing
- // decompression based on the pointer to wherever we found this value,
- // which is likely (though not guaranteed) to be a heap pointer itself.
- heap_addresses.any_heap_pointer = referring_pointer;
-
- auto props = d::GetObjectProperties(tagged_ptr, reader_scope.GetReader(),
- heap_addresses, type_name);
- obj.friendly_name = ConvertToU16String(props->brief);
- for (size_t property_index = 0; property_index < props->num_properties;
+std::vector<Property> GetPropertiesAsVector(size_t num_properties,
+ d::ObjectProperty** properties) {
+ std::vector<Property> result;
+ for (size_t property_index = 0; property_index < num_properties;
++property_index) {
- const auto& source_prop = *props->properties[property_index];
+ const auto& source_prop = *(properties)[property_index];
Property dest_prop(ConvertToU16String(source_prop.name),
ConvertToU16String(source_prop.type),
source_prop.decompressed_type, source_prop.address,
@@ -126,8 +112,30 @@ V8HeapObject GetHeapObject(WRL::ComPtr<IDebugHostContext> sp_context,
struct_field.shift_bits});
}
}
- obj.properties.push_back(dest_prop);
+ result.push_back(dest_prop);
}
+ return result;
+}
+
+V8HeapObject GetHeapObject(WRL::ComPtr<IDebugHostContext> sp_context,
+ uint64_t tagged_ptr, uint64_t referring_pointer,
+ const char* type_name, bool is_compressed) {
+ // Read the value at the address, and see if it is a tagged pointer
+
+ V8HeapObject obj;
+ MemReaderScope reader_scope(sp_context);
+
+ d::HeapAddresses heap_addresses = {0, 0, 0, 0};
+ // TODO ideally we'd provide real heap page pointers. For now, just testing
+ // decompression based on the pointer to wherever we found this value,
+ // which is likely (though not guaranteed) to be a heap pointer itself.
+ heap_addresses.any_heap_pointer = referring_pointer;
+
+ auto props = d::GetObjectProperties(tagged_ptr, reader_scope.GetReader(),
+ heap_addresses, type_name);
+ obj.friendly_name = ConvertToU16String(props->brief);
+ obj.properties =
+ GetPropertiesAsVector(props->num_properties, props->properties);
// For each guessed type, create a synthetic property that will request data
// about the same object again but with a more specific type hint.
@@ -157,3 +165,12 @@ std::vector<std::u16string> ListObjectClasses() {
}
const char* BitsetName(uint64_t payload) { return d::BitsetName(payload); }
+
+std::vector<Property> GetStackFrame(WRL::ComPtr<IDebugHostContext> sp_context,
+
+ uint64_t frame_pointer) {
+ MemReaderScope reader_scope(sp_context);
+ auto props = d::GetStackFrame(static_cast<uintptr_t>(frame_pointer),
+ reader_scope.GetReader());
+ return GetPropertiesAsVector(props->num_properties, props->properties);
+}
diff --git a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h
index 9208f09832..f7d78c5dd3 100644
--- a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h
+++ b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h
@@ -137,4 +137,7 @@ std::vector<std::u16string> ListObjectClasses();
const char* BitsetName(uint64_t payload);
+std::vector<Property> GetStackFrame(WRL::ComPtr<IDebugHostContext> sp_context,
+ uint64_t frame_pointer);
+
#endif // V8_TOOLS_V8WINDBG_SRC_V8_DEBUG_HELPER_INTEROP_H_
diff --git a/deps/v8/tools/wasm/update-wasm-spec-tests.sh b/deps/v8/tools/wasm/update-wasm-spec-tests.sh
index 2d26c2f5ae..dc9621a83b 100755
--- a/deps/v8/tools/wasm/update-wasm-spec-tests.sh
+++ b/deps/v8/tools/wasm/update-wasm-spec-tests.sh
@@ -71,7 +71,7 @@ log_and_run cp -r ${TMP_DIR}/spec/test/js-api/* ${JS_API_TEST_DIR}/tests
# Generate the proposal tests.
###############################################################################
-repos='bulk-memory-operations reference-types js-types tail-call'
+repos='bulk-memory-operations reference-types js-types tail-call simd'
for repo in ${repos}; do
echo "Process ${repo}"
@@ -86,9 +86,8 @@ for repo in ${repos}; do
# Iterate over all proposal tests. Those which differ from the spec tests are
# copied to the output directory and converted to .js tests.
- for abs_filename in ${TMP_DIR}/${repo}/test/core/*.wast; do
- rel_filename="$(basename -- $abs_filename)"
- test_name=${rel_filename%.wast}
+ for rel_filename in $(find . -name '*.wast'); do
+ abs_filename=$(realpath $rel_filename)
spec_filename=${TMP_DIR}/spec/test/core/${rel_filename}
if [ ! -f "$spec_filename" ] || ! cmp -s $abs_filename $spec_filename ; then
log_and_run cp ${rel_filename} ${SPEC_TEST_DIR}/tests/proposals/${repo}/
diff --git a/deps/v8/tools/whitespace.txt b/deps/v8/tools/whitespace.txt
index 168b574f9c..6e2bc1cf76 100644
--- a/deps/v8/tools/whitespace.txt
+++ b/deps/v8/tools/whitespace.txt
@@ -8,7 +8,7 @@ The doubles heard this and started to unbox.
The Smi looked at them when a crazy v8-autoroll account showed up...
The autoroller bought a round of Himbeerbrause. Suddenly.....
The bartender starts to shake the bottles......................
-I can't add trailing whitespaces, so I'm adding this line.....
+I can't add trailing whitespaces, so I'm adding this line......
I'm starting to think that just adding trailing whitespaces might not be bad.
Because whitespaces are not that funny.....
diff --git a/deps/v8/tools/windows-tick-processor.bat b/deps/v8/tools/windows-tick-processor.bat
index 8f8ad0153b..56637e051c 100755
--- a/deps/v8/tools/windows-tick-processor.bat
+++ b/deps/v8/tools/windows-tick-processor.bat
@@ -27,4 +27,4 @@ IF NOT %arg8:~0,2% == 8 (IF NOT %arg8:~0,2% == 8- SET log_file=%8)
SET arg9=9%9
IF NOT %arg9:~0,2% == 9 (IF NOT %arg9:~0,2% == 9- SET log_file=%9)
-type %log_file% | %D8_PATH%\d8 %tools_dir%splaytree.js %tools_dir%codemap.js %tools_dir%csvparser.js %tools_dir%consarray.js %tools_dir%profile.js %tools_dir%profile_view.js %tools_dir%logreader.js %tools_dir%SourceMap.js %tools_dir%arguments.js %tools_dir%tickprocessor.js %tools_dir%tickprocessor-driver.js -- --windows %*
+type %log_file% | %D8_PATH%\d8 --module %tools_dir%tickprocessor-driver.js -- --windows %*
diff --git a/deps/v8/tools/zone-stats/details-selection.js b/deps/v8/tools/zone-stats/details-selection.js
index 039847b0cf..1e57e0aa5a 100644
--- a/deps/v8/tools/zone-stats/details-selection.js
+++ b/deps/v8/tools/zone-stats/details-selection.js
@@ -262,14 +262,10 @@ defineCustomElement('details-selection', (templateText) =>
const zone_name = checkbox.value;
const zone_data = zones_data.get(zone_name);
const zone_allocated = zone_data === undefined ? 0 : zone_data.allocated;
- if (zone_allocated == 0) {
- checkbox.parentNode.style.display = 'none';
- } else {
- const percents = zone_allocated / total_allocated;
- const percent_div = checkbox.parentNode.querySelector('.percentBackground');
- percent_div.style.left = (percents * 100) + '%';
- checkbox.parentNode.style.display = 'block';
- }
+ const percents = zone_allocated / total_allocated;
+ const percent_div = checkbox.parentNode.querySelector('.percentBackground');
+ percent_div.style.left = (percents * 100) + '%';
+ checkbox.parentNode.style.display = 'block';
});
}
diff --git a/deps/v8/tools/zone-stats/global-timeline.js b/deps/v8/tools/zone-stats/global-timeline.js
index e9d7280508..85b5d19d7d 100644
--- a/deps/v8/tools/zone-stats/global-timeline.js
+++ b/deps/v8/tools/zone-stats/global-timeline.js
@@ -120,8 +120,9 @@ defineCustomElement('global-timeline', (templateText) =>
getZoneData() {
const isolate_data = this.data[this.selection.isolate];
- const zone_names = isolate_data.sorted_zone_names;
const selected_zones = this.selection.zones;
+ const zone_names = isolate_data.sorted_zone_names.filter(
+ zone_name => selected_zones.has(zone_name));
const data_kind = this.selection.data_kind;
const show_totals = this.selection.show_totals;
const zones_labels = this.getZoneLabels(zone_names);